]> git.donarmstrong.com Git - roundcube.git/commitdiff
Imported Upstream version 0.5
authorJérémy Bobbio <lunar@debian.org>
Sat, 18 Jun 2011 15:05:19 +0000 (17:05 +0200)
committerJérémy Bobbio <lunar@debian.org>
Sat, 18 Jun 2011 15:05:19 +0000 (17:05 +0200)
987 files changed:
.htaccess
CHANGELOG
INSTALL
INSTALL.orig
README
SQL/mssql.initial.sql
SQL/mssql.upgrade.sql [new file with mode: 0644]
SQL/mysql.initial.sql
SQL/mysql.update.sql
SQL/postgres.initial.sql
SQL/postgres.update.sql
SQL/sqlite.initial.sql
SQL/sqlite.update.sql
UPGRADING
bin/cleandb.sh [new file with mode: 0755]
bin/decrypt.php [deleted file]
bin/decrypt.sh [new file with mode: 0755]
bin/html2text.php [deleted file]
bin/jsshrink.sh [new file with mode: 0755]
bin/jsunshrink.sh [new file with mode: 0755]
bin/killcache.php [deleted file]
bin/modcss.php [deleted file]
bin/msgexport.sh
bin/msgimport.sh
bin/update.sh
config/db.inc.php.dist
config/main.inc.php.dist
config/mimetypes.php
index.php
installer/check.php
installer/config.php
installer/index.php
installer/rcube_install.php
installer/test.php
installer/utils.php
installer/welcome.html
plugins/additional_message_headers/additional_message_headers.php
plugins/additional_message_headers/config.inc.php.dist [new file with mode: 0644]
plugins/additional_message_headers/package.xml [new file with mode: 0644]
plugins/archive/archive.js
plugins/archive/archive.php
plugins/archive/localization/cs_CZ.inc
plugins/archive/localization/es_AR.inc [new file with mode: 0644]
plugins/archive/localization/es_ES.inc [new file with mode: 0644]
plugins/archive/localization/ja_JP.inc [new file with mode: 0644]
plugins/archive/localization/nl_NL.inc [new file with mode: 0644]
plugins/archive/localization/sv_SE.inc [new file with mode: 0644]
plugins/archive/localization/zh_TW.inc [new file with mode: 0644]
plugins/archive/package.xml [new file with mode: 0644]
plugins/autologon/autologon.php
plugins/database_attachments/database_attachments.php
plugins/emoticons/emoticons.php
plugins/example_addressbook/example_addressbook.php
plugins/example_addressbook/example_addressbook_backend.php
plugins/filesystem_attachments/filesystem_attachments.php
plugins/help/config.inc.php.dist
plugins/help/content/about.html
plugins/help/help.php
plugins/help/localization/cs_CZ.inc
plugins/help/localization/da_DK.inc [new file with mode: 0644]
plugins/help/localization/de_DE.inc [new file with mode: 0644]
plugins/help/localization/es_ES.inc [new file with mode: 0644]
plugins/help/localization/ja_JP.inc [new file with mode: 0644]
plugins/help/localization/ru_RU.inc [new file with mode: 0644]
plugins/help/localization/zh_TW.inc [new file with mode: 0644]
plugins/help/skins/default/help.css
plugins/help/skins/default/templates/help.html
plugins/http_authentication/http_authentication.php
plugins/managesieve/Changelog
plugins/managesieve/config.inc.php.dist
plugins/managesieve/lib/Net/Sieve.php
plugins/managesieve/lib/rcube_sieve.php
plugins/managesieve/localization/bg_BG.inc
plugins/managesieve/localization/cs_CZ.inc
plugins/managesieve/localization/de_CH.inc
plugins/managesieve/localization/de_DE.inc
plugins/managesieve/localization/en_GB.inc
plugins/managesieve/localization/en_US.inc
plugins/managesieve/localization/es_AR.inc [new file with mode: 0644]
plugins/managesieve/localization/es_ES.inc
plugins/managesieve/localization/et_EE.inc
plugins/managesieve/localization/fi_FI.inc
plugins/managesieve/localization/fr_FR.inc
plugins/managesieve/localization/hu_HU.inc
plugins/managesieve/localization/it_IT.inc
plugins/managesieve/localization/ja_JP.inc [new file with mode: 0644]
plugins/managesieve/localization/nb_NO.inc [new file with mode: 0644]
plugins/managesieve/localization/nl_NL.inc
plugins/managesieve/localization/pl_PL.inc
plugins/managesieve/localization/pt_BR.inc
plugins/managesieve/localization/pt_PT.inc [new file with mode: 0644]
plugins/managesieve/localization/ru_RU.inc
plugins/managesieve/localization/sk_SK.inc [new file with mode: 0644]
plugins/managesieve/localization/sl_SI.inc
plugins/managesieve/localization/sv_SE.inc
plugins/managesieve/localization/uk_UA.inc
plugins/managesieve/localization/zh_CN.inc
plugins/managesieve/localization/zh_TW.inc [new file with mode: 0644]
plugins/managesieve/managesieve.js
plugins/managesieve/managesieve.php
plugins/managesieve/skins/default/filter_add_act.png [deleted file]
plugins/managesieve/skins/default/filter_add_pas.png [deleted file]
plugins/managesieve/skins/default/filter_add_sel.png [deleted file]
plugins/managesieve/skins/default/filter_del_act.png [deleted file]
plugins/managesieve/skins/default/filter_del_pas.png [deleted file]
plugins/managesieve/skins/default/filter_del_sel.png [deleted file]
plugins/managesieve/skins/default/filter_down_act.png [deleted file]
plugins/managesieve/skins/default/filter_down_pas.png [deleted file]
plugins/managesieve/skins/default/filter_down_sel.png [deleted file]
plugins/managesieve/skins/default/filter_up_act.png [deleted file]
plugins/managesieve/skins/default/filter_up_pas.png [deleted file]
plugins/managesieve/skins/default/filter_up_sel.png [deleted file]
plugins/managesieve/skins/default/managesieve.css
plugins/managesieve/skins/default/managesieve_toolbar.png [new file with mode: 0644]
plugins/managesieve/skins/default/templates/filteredit.html [new file with mode: 0644]
plugins/managesieve/skins/default/templates/managesieve.html
plugins/managesieve/skins/default/templates/managesieveedit.html [deleted file]
plugins/managesieve/skins/default/templates/setedit.html [new file with mode: 0644]
plugins/markasjunk/localization/cs_CZ.inc
plugins/markasjunk/localization/da_DK.inc [new file with mode: 0644]
plugins/markasjunk/localization/de_DE.inc [new file with mode: 0644]
plugins/markasjunk/localization/es_AR.inc [new file with mode: 0644]
plugins/markasjunk/localization/es_ES.inc [new file with mode: 0644]
plugins/markasjunk/localization/ja_JP.inc [new file with mode: 0644]
plugins/markasjunk/localization/sk_SK.inc [new file with mode: 0644]
plugins/markasjunk/localization/zh_TW.inc [new file with mode: 0644]
plugins/markasjunk/markasjunk.js
plugins/markasjunk/markasjunk.php
plugins/markasjunk/package.xml [new file with mode: 0644]
plugins/new_user_dialog/localization/cs_CZ.inc [new file with mode: 0644]
plugins/new_user_dialog/localization/es_ES.inc [new file with mode: 0644]
plugins/new_user_dialog/localization/gl_ES.inc [new file with mode: 0644]
plugins/new_user_dialog/localization/it_IT.inc [new file with mode: 0644]
plugins/new_user_dialog/localization/ja_JP.inc [new file with mode: 0644]
plugins/new_user_dialog/localization/nl_NL.inc [new file with mode: 0644]
plugins/new_user_dialog/localization/pt_BR.inc [new file with mode: 0644]
plugins/new_user_dialog/localization/pt_PT.inc [new file with mode: 0644]
plugins/new_user_dialog/localization/sk_SK.inc [new file with mode: 0644]
plugins/new_user_dialog/localization/sl_SI.inc [new file with mode: 0644]
plugins/new_user_dialog/localization/zh_TW.inc [new file with mode: 0644]
plugins/new_user_dialog/new_user_dialog.php
plugins/new_user_dialog/package.xml [new file with mode: 0644]
plugins/new_user_identity/new_user_identity.php
plugins/password/README
plugins/password/config.inc.php.dist
plugins/password/drivers/chgvirtualminpasswd.c [new file with mode: 0644]
plugins/password/drivers/chpass-wrapper.py [new file with mode: 0644]
plugins/password/drivers/chpasswd.php [new file with mode: 0644]
plugins/password/drivers/hmail.php [new file with mode: 0644]
plugins/password/drivers/ldap.php
plugins/password/drivers/ldap_simple.php [new file with mode: 0644]
plugins/password/drivers/pam.php [new file with mode: 0644]
plugins/password/drivers/poppassd.php
plugins/password/drivers/sasl.php
plugins/password/drivers/sql.php
plugins/password/drivers/virtualmin.php [new file with mode: 0644]
plugins/password/drivers/vpopmaild.php
plugins/password/drivers/xmail.php [new file with mode: 0644]
plugins/password/localization/az_AZ.inc [new file with mode: 0644]
plugins/password/localization/ca_ES.inc [new file with mode: 0644]
plugins/password/localization/cs_CZ.inc
plugins/password/localization/en_US.inc
plugins/password/localization/es_AR.inc [new file with mode: 0644]
plugins/password/localization/es_ES.inc [new file with mode: 0644]
plugins/password/localization/fi_FI.inc [new file with mode: 0644]
plugins/password/localization/it_IT.inc
plugins/password/localization/ja_JP.inc [new file with mode: 0644]
plugins/password/localization/lt_LT.inc [new file with mode: 0644]
plugins/password/localization/lv_LV.inc [new file with mode: 0644]
plugins/password/localization/pl_PL.inc
plugins/password/localization/ru_RU.inc [new file with mode: 0644]
plugins/password/localization/sk_SK.inc [new file with mode: 0644]
plugins/password/localization/sv_SE.inc
plugins/password/localization/tr_TR.inc [new file with mode: 0644]
plugins/password/localization/zh_TW.inc [new file with mode: 0644]
plugins/password/package.xml [new file with mode: 0644]
plugins/password/password.js
plugins/password/password.php
plugins/show_additional_headers/show_additional_headers.php
plugins/squirrelmail_usercopy/config.inc.php.dist
plugins/squirrelmail_usercopy/squirrelmail_usercopy.php
plugins/subscriptions_option/localization/cs_CZ.inc
plugins/subscriptions_option/localization/es_ES.inc [new file with mode: 0644]
plugins/subscriptions_option/localization/ja_JP.inc [new file with mode: 0644]
plugins/subscriptions_option/localization/zh_TW.inc [new file with mode: 0644]
plugins/subscriptions_option/subscriptions_option.php
plugins/userinfo/localization/cs_CZ.inc
plugins/userinfo/localization/da_DK.inc [new file with mode: 0644]
plugins/userinfo/localization/es_ES.inc [new file with mode: 0644]
plugins/userinfo/localization/ja_JP.inc [new file with mode: 0644]
plugins/userinfo/localization/ru_RU.inc [new file with mode: 0644]
plugins/userinfo/localization/zh_TW.inc [new file with mode: 0644]
plugins/userinfo/userinfo.php
plugins/vcard_attachments/localization/cs_CZ.inc [new file with mode: 0644]
plugins/vcard_attachments/localization/de_CH.inc
plugins/vcard_attachments/localization/de_DE.inc
plugins/vcard_attachments/localization/en_US.inc
plugins/vcard_attachments/localization/es_ES.inc [new file with mode: 0644]
plugins/vcard_attachments/localization/et_EE.inc [new file with mode: 0644]
plugins/vcard_attachments/localization/it_IT.inc [new file with mode: 0644]
plugins/vcard_attachments/localization/ja_JP.inc [new file with mode: 0644]
plugins/vcard_attachments/localization/pl_PL.inc [new file with mode: 0644]
plugins/vcard_attachments/localization/ru_RU.inc
plugins/vcard_attachments/localization/sv_SE.inc [new file with mode: 0644]
plugins/vcard_attachments/localization/zh_TW.inc [new file with mode: 0644]
plugins/vcard_attachments/package.xml [new file with mode: 0644]
plugins/vcard_attachments/skins/default/vcard.png [new file with mode: 0644]
plugins/vcard_attachments/skins/default/vcard_add_contact.png [new file with mode: 0644]
plugins/vcard_attachments/vcard_add_contact.png [deleted file]
plugins/vcard_attachments/vcard_attachments.php
plugins/vcard_attachments/vcardattach.js
plugins/virtuser_file/virtuser_file.php [new file with mode: 0644]
plugins/virtuser_query/virtuser_query.php [new file with mode: 0644]
program/include/bugs.inc [deleted file]
program/include/clisetup.php [new file with mode: 0644]
program/include/html.php
program/include/iniset.php
program/include/main.inc
program/include/rcmail.php
program/include/rcmail.php.orig [new file with mode: 0644]
program/include/rcube_addressbook.php
program/include/rcube_browser.php
program/include/rcube_config.php
program/include/rcube_contacts.php
program/include/rcube_html_page.php
program/include/rcube_imap.php
program/include/rcube_imap_generic.php [new file with mode: 0644]
program/include/rcube_json_output.php
program/include/rcube_ldap.php
program/include/rcube_mail_mime.php [deleted file]
program/include/rcube_mdb2.php
program/include/rcube_message.php
program/include/rcube_mime_struct.php [new file with mode: 0644]
program/include/rcube_plugin.php
program/include/rcube_plugin_api.php
program/include/rcube_result_set.php
program/include/rcube_session.php [new file with mode: 0644]
program/include/rcube_shared.inc
program/include/rcube_smtp.php
program/include/rcube_sqlite.inc
program/include/rcube_string_replacer.php
program/include/rcube_template.php
program/include/rcube_user.php
program/include/rcube_vcard.php
program/include/session.inc [deleted file]
program/js/app.js
program/js/app.js.src
program/js/common.js
program/js/common.js.src
program/js/editor.js
program/js/googiespell.js
program/js/googiespell.js.src
program/js/jquery-1.3.min.js [deleted file]
program/js/jquery-1.4.min.js [new file with mode: 0644]
program/js/list.js
program/js/list.js.src
program/js/tiny_mce/langs/ar.js
program/js/tiny_mce/langs/az.js [new file with mode: 0644]
program/js/tiny_mce/langs/bg.js
program/js/tiny_mce/langs/bn.js [new file with mode: 0644]
program/js/tiny_mce/langs/br.js [new file with mode: 0644]
program/js/tiny_mce/langs/bs.js
program/js/tiny_mce/langs/ca.js
program/js/tiny_mce/langs/cs.js
program/js/tiny_mce/langs/cy.js [new file with mode: 0644]
program/js/tiny_mce/langs/da.js
program/js/tiny_mce/langs/de.js
program/js/tiny_mce/langs/el.js
program/js/tiny_mce/langs/en.js
program/js/tiny_mce/langs/es.js
program/js/tiny_mce/langs/et.js
program/js/tiny_mce/langs/eu.js [new file with mode: 0644]
program/js/tiny_mce/langs/fa.js
program/js/tiny_mce/langs/fi.js
program/js/tiny_mce/langs/fr.js
program/js/tiny_mce/langs/gl.js [new file with mode: 0644]
program/js/tiny_mce/langs/he.js
program/js/tiny_mce/langs/hi.js [new file with mode: 0644]
program/js/tiny_mce/langs/hr.js
program/js/tiny_mce/langs/hu.js
program/js/tiny_mce/langs/hy.js [new file with mode: 0644]
program/js/tiny_mce/langs/ia.js [new file with mode: 0644]
program/js/tiny_mce/langs/id.js [new file with mode: 0644]
program/js/tiny_mce/langs/is.js
program/js/tiny_mce/langs/it.js
program/js/tiny_mce/langs/ja.js
program/js/tiny_mce/langs/ka.js [new file with mode: 0644]
program/js/tiny_mce/langs/ko.js
program/js/tiny_mce/langs/lt.js
program/js/tiny_mce/langs/lv.js
program/js/tiny_mce/langs/mk.js
program/js/tiny_mce/langs/ms.js
program/js/tiny_mce/langs/nb.js
program/js/tiny_mce/langs/nl.js
program/js/tiny_mce/langs/nn.js
program/js/tiny_mce/langs/no.js [new file with mode: 0644]
program/js/tiny_mce/langs/pl.js
program/js/tiny_mce/langs/ps.js [new file with mode: 0644]
program/js/tiny_mce/langs/pt.js
program/js/tiny_mce/langs/ro.js
program/js/tiny_mce/langs/ru.js
program/js/tiny_mce/langs/si.js
program/js/tiny_mce/langs/sk.js
program/js/tiny_mce/langs/sl.js
program/js/tiny_mce/langs/sq.js [new file with mode: 0644]
program/js/tiny_mce/langs/sr.js
program/js/tiny_mce/langs/sv.js
program/js/tiny_mce/langs/ta.js [new file with mode: 0644]
program/js/tiny_mce/langs/te.js [new file with mode: 0644]
program/js/tiny_mce/langs/th.js [new file with mode: 0644]
program/js/tiny_mce/langs/tr.js
program/js/tiny_mce/langs/tw.js [new file with mode: 0644]
program/js/tiny_mce/langs/uk.js
program/js/tiny_mce/langs/vi.js
program/js/tiny_mce/langs/zh.js
program/js/tiny_mce/plugins/compat2x/editor_plugin.js [deleted file]
program/js/tiny_mce/plugins/compat2x/editor_plugin_src.js [deleted file]
program/js/tiny_mce/plugins/contextmenu/editor_plugin.js
program/js/tiny_mce/plugins/contextmenu/editor_plugin_src.js
program/js/tiny_mce/plugins/directionality/editor_plugin_src.js
program/js/tiny_mce/plugins/emotions/editor_plugin.js
program/js/tiny_mce/plugins/emotions/editor_plugin_src.js
program/js/tiny_mce/plugins/emotions/langs/ar_dlg.js
program/js/tiny_mce/plugins/emotions/langs/az_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/be_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/bn_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/br_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/ca_dlg.js
program/js/tiny_mce/plugins/emotions/langs/cs_dlg.js
program/js/tiny_mce/plugins/emotions/langs/cy_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/eu_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/fa_dlg.js
program/js/tiny_mce/plugins/emotions/langs/fr_dlg.js
program/js/tiny_mce/plugins/emotions/langs/gl_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/hi_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/hy_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/ia_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/id_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/ka_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/lt_dlg.js
program/js/tiny_mce/plugins/emotions/langs/nl_dlg.js
program/js/tiny_mce/plugins/emotions/langs/no_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/ps_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/pt_dlg.js
program/js/tiny_mce/plugins/emotions/langs/ro_dlg.js
program/js/tiny_mce/plugins/emotions/langs/ru_dlg.js
program/js/tiny_mce/plugins/emotions/langs/sk_dlg.js
program/js/tiny_mce/plugins/emotions/langs/sq_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/ta_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/te_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/th_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/tr_dlg.js
program/js/tiny_mce/plugins/emotions/langs/tw_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/uk_dlg.js
program/js/tiny_mce/plugins/emotions/langs/vi_dlg.js
program/js/tiny_mce/plugins/emotions/langs/zh_dlg.js
program/js/tiny_mce/plugins/media/editor_plugin.js
program/js/tiny_mce/plugins/media/editor_plugin_src.js
program/js/tiny_mce/plugins/media/langs/ar_dlg.js
program/js/tiny_mce/plugins/media/langs/az_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/be_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/bn_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/br_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/ca_dlg.js
program/js/tiny_mce/plugins/media/langs/cs_dlg.js
program/js/tiny_mce/plugins/media/langs/cy_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/da_dlg.js
program/js/tiny_mce/plugins/media/langs/de_dlg.js
program/js/tiny_mce/plugins/media/langs/et_dlg.js
program/js/tiny_mce/plugins/media/langs/eu_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/fa_dlg.js
program/js/tiny_mce/plugins/media/langs/fi_dlg.js
program/js/tiny_mce/plugins/media/langs/fr_dlg.js
program/js/tiny_mce/plugins/media/langs/gl_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/he_dlg.js
program/js/tiny_mce/plugins/media/langs/hi_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/hy_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/ia_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/id_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/ja_dlg.js
program/js/tiny_mce/plugins/media/langs/ka_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/lt_dlg.js
program/js/tiny_mce/plugins/media/langs/nl_dlg.js
program/js/tiny_mce/plugins/media/langs/no_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/pl_dlg.js
program/js/tiny_mce/plugins/media/langs/ps_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/pt_dlg.js
program/js/tiny_mce/plugins/media/langs/ru_dlg.js
program/js/tiny_mce/plugins/media/langs/sk_dlg.js
program/js/tiny_mce/plugins/media/langs/sq_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/ta_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/te_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/th_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/tr_dlg.js
program/js/tiny_mce/plugins/media/langs/tw_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/uk_dlg.js
program/js/tiny_mce/plugins/media/langs/vi_dlg.js
program/js/tiny_mce/plugins/media/langs/zh_dlg.js
program/js/tiny_mce/plugins/media/media.htm
program/js/tiny_mce/plugins/nonbreaking/editor_plugin_src.js
program/js/tiny_mce/plugins/paste/blank.htm [deleted file]
program/js/tiny_mce/plugins/paste/css/blank.css [deleted file]
program/js/tiny_mce/plugins/paste/css/pasteword.css [deleted file]
program/js/tiny_mce/plugins/paste/editor_plugin.js
program/js/tiny_mce/plugins/paste/editor_plugin_src.js
program/js/tiny_mce/plugins/paste/js/pastetext.js
program/js/tiny_mce/plugins/paste/js/pasteword.js
program/js/tiny_mce/plugins/paste/langs/ar_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/az_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/be_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/bg_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/bn_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/br_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/bs_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/ca_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/cs_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/cy_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/da_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/de_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/el_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/es_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/et_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/eu_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/fa_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/fi_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/fr_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/gl_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/he_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/hi_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/hr_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/hu_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/hy_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/ia_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/id_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/is_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/it_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/ja_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/ka_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/ko_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/lt_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/lv_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/mk_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/ms_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/nb_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/nl_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/nn_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/no_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/pl_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/ps_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/pt_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/ro_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/ru_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/si_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/sk_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/sl_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/sq_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/sr_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/sv_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/ta_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/te_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/th_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/tr_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/tw_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/uk_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/vi_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/langs/zh_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/paste/pastetext.htm
program/js/tiny_mce/plugins/paste/pasteword.htm
program/js/tiny_mce/plugins/searchreplace/editor_plugin.js
program/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js
program/js/tiny_mce/plugins/searchreplace/js/searchreplace.js
program/js/tiny_mce/plugins/searchreplace/langs/ar_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/az_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/be_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/bn_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/br_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/ca_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/cy_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/da_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/eu_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/fa_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/fr_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/gl_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/he_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/hi_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/hy_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/ia_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/id_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/ka_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/no_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/pl_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/ps_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/pt_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/ro_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/ru_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/sk_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/sq_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/ta_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/te_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/th_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/tr_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/tw_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/uk_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/vi_dlg.js
program/js/tiny_mce/plugins/searchreplace/langs/zh_dlg.js
program/js/tiny_mce/plugins/searchreplace/searchreplace.htm
program/js/tiny_mce/plugins/spellchecker/classes/EnchantSpell.php [deleted file]
program/js/tiny_mce/plugins/spellchecker/classes/GoogleSpell.php [deleted file]
program/js/tiny_mce/plugins/spellchecker/classes/PSpell.php [deleted file]
program/js/tiny_mce/plugins/spellchecker/classes/PSpellShell.php [deleted file]
program/js/tiny_mce/plugins/spellchecker/classes/SpellChecker.php [deleted file]
program/js/tiny_mce/plugins/spellchecker/classes/utils/JSON.php [deleted file]
program/js/tiny_mce/plugins/spellchecker/classes/utils/Logger.php [deleted file]
program/js/tiny_mce/plugins/spellchecker/config.php [deleted file]
program/js/tiny_mce/plugins/spellchecker/editor_plugin.js
program/js/tiny_mce/plugins/spellchecker/editor_plugin_src.js
program/js/tiny_mce/plugins/spellchecker/includes/general.php [deleted file]
program/js/tiny_mce/plugins/spellchecker/rpc.php [deleted file]
program/js/tiny_mce/plugins/tabfocus/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/tabfocus/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/cell.htm
program/js/tiny_mce/plugins/table/editor_plugin.js
program/js/tiny_mce/plugins/table/editor_plugin_src.js
program/js/tiny_mce/plugins/table/js/cell.js
program/js/tiny_mce/plugins/table/js/merge_cells.js
program/js/tiny_mce/plugins/table/js/row.js
program/js/tiny_mce/plugins/table/js/table.js
program/js/tiny_mce/plugins/table/langs/ar_dlg.js
program/js/tiny_mce/plugins/table/langs/az_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/be_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/bn_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/br_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/ca_dlg.js
program/js/tiny_mce/plugins/table/langs/cs_dlg.js
program/js/tiny_mce/plugins/table/langs/cy_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/da_dlg.js
program/js/tiny_mce/plugins/table/langs/de_dlg.js
program/js/tiny_mce/plugins/table/langs/es_dlg.js
program/js/tiny_mce/plugins/table/langs/et_dlg.js
program/js/tiny_mce/plugins/table/langs/eu_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/fa_dlg.js
program/js/tiny_mce/plugins/table/langs/fi_dlg.js
program/js/tiny_mce/plugins/table/langs/fr_dlg.js
program/js/tiny_mce/plugins/table/langs/gl_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/he_dlg.js
program/js/tiny_mce/plugins/table/langs/hi_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/hy_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/ia_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/id_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/it_dlg.js
program/js/tiny_mce/plugins/table/langs/ja_dlg.js
program/js/tiny_mce/plugins/table/langs/ka_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/lt_dlg.js
program/js/tiny_mce/plugins/table/langs/nl_dlg.js
program/js/tiny_mce/plugins/table/langs/no_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/pl_dlg.js
program/js/tiny_mce/plugins/table/langs/ps_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/pt_dlg.js
program/js/tiny_mce/plugins/table/langs/ro_dlg.js
program/js/tiny_mce/plugins/table/langs/ru_dlg.js
program/js/tiny_mce/plugins/table/langs/sk_dlg.js
program/js/tiny_mce/plugins/table/langs/sq_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/sv_dlg.js
program/js/tiny_mce/plugins/table/langs/ta_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/te_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/th_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/tr_dlg.js
program/js/tiny_mce/plugins/table/langs/tw_dlg.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/uk_dlg.js
program/js/tiny_mce/plugins/table/langs/vi_dlg.js
program/js/tiny_mce/plugins/table/langs/zh_dlg.js
program/js/tiny_mce/plugins/table/merge_cells.htm
program/js/tiny_mce/plugins/table/row.htm
program/js/tiny_mce/plugins/table/table.htm
program/js/tiny_mce/plugins/visualchars/editor_plugin_src.js
program/js/tiny_mce/plugins/xhtmlxtras/abbr.htm [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/acronym.htm [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/attributes.htm [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/cite.htm [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/css/attributes.css [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/css/popup.css [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/del.htm [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/editor_plugin.js [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/ins.htm [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/js/abbr.js [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/js/acronym.js [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/js/attributes.js [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/js/cite.js [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/js/del.js [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/js/element_common.js [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/js/ins.js [deleted file]
program/js/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js [deleted file]
program/js/tiny_mce/themes/advanced/about.htm
program/js/tiny_mce/themes/advanced/anchor.htm
program/js/tiny_mce/themes/advanced/charmap.htm
program/js/tiny_mce/themes/advanced/color_picker.htm
program/js/tiny_mce/themes/advanced/editor_template.js
program/js/tiny_mce/themes/advanced/editor_template_src.js
program/js/tiny_mce/themes/advanced/image.htm
program/js/tiny_mce/themes/advanced/img/icons.gif
program/js/tiny_mce/themes/advanced/js/anchor.js
program/js/tiny_mce/themes/advanced/js/charmap.js
program/js/tiny_mce/themes/advanced/js/image.js
program/js/tiny_mce/themes/advanced/js/link.js
program/js/tiny_mce/themes/advanced/langs/ar.js
program/js/tiny_mce/themes/advanced/langs/ar_dlg.js
program/js/tiny_mce/themes/advanced/langs/az.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/az_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/be.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/be_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/bn.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/bn_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/br.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/br_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/ca.js
program/js/tiny_mce/themes/advanced/langs/ca_dlg.js
program/js/tiny_mce/themes/advanced/langs/cs.js
program/js/tiny_mce/themes/advanced/langs/cs_dlg.js
program/js/tiny_mce/themes/advanced/langs/cy.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/cy_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/da.js
program/js/tiny_mce/themes/advanced/langs/da_dlg.js
program/js/tiny_mce/themes/advanced/langs/de.js
program/js/tiny_mce/themes/advanced/langs/de_dlg.js
program/js/tiny_mce/themes/advanced/langs/el.js
program/js/tiny_mce/themes/advanced/langs/es.js
program/js/tiny_mce/themes/advanced/langs/es_dlg.js
program/js/tiny_mce/themes/advanced/langs/et.js
program/js/tiny_mce/themes/advanced/langs/et_dlg.js
program/js/tiny_mce/themes/advanced/langs/eu.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/eu_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/fa.js
program/js/tiny_mce/themes/advanced/langs/fa_dlg.js
program/js/tiny_mce/themes/advanced/langs/fi.js
program/js/tiny_mce/themes/advanced/langs/fi_dlg.js
program/js/tiny_mce/themes/advanced/langs/fr.js
program/js/tiny_mce/themes/advanced/langs/fr_dlg.js
program/js/tiny_mce/themes/advanced/langs/gl.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/gl_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/he.js
program/js/tiny_mce/themes/advanced/langs/he_dlg.js
program/js/tiny_mce/themes/advanced/langs/hi.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/hi_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/hu.js
program/js/tiny_mce/themes/advanced/langs/hu_dlg.js
program/js/tiny_mce/themes/advanced/langs/hy.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/hy_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/ia.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/ia_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/id.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/id_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/it.js
program/js/tiny_mce/themes/advanced/langs/it_dlg.js
program/js/tiny_mce/themes/advanced/langs/ja.js
program/js/tiny_mce/themes/advanced/langs/ja_dlg.js
program/js/tiny_mce/themes/advanced/langs/ka.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/ka_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/lt.js
program/js/tiny_mce/themes/advanced/langs/lt_dlg.js
program/js/tiny_mce/themes/advanced/langs/nl.js
program/js/tiny_mce/themes/advanced/langs/no.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/no_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/pl.js
program/js/tiny_mce/themes/advanced/langs/ps.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/ps_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/pt.js
program/js/tiny_mce/themes/advanced/langs/pt_dlg.js
program/js/tiny_mce/themes/advanced/langs/ro.js
program/js/tiny_mce/themes/advanced/langs/ro_dlg.js
program/js/tiny_mce/themes/advanced/langs/ru.js
program/js/tiny_mce/themes/advanced/langs/ru_dlg.js
program/js/tiny_mce/themes/advanced/langs/si.js
program/js/tiny_mce/themes/advanced/langs/si_dlg.js
program/js/tiny_mce/themes/advanced/langs/sk.js
program/js/tiny_mce/themes/advanced/langs/sk_dlg.js
program/js/tiny_mce/themes/advanced/langs/sq.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/sq_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/sr.js
program/js/tiny_mce/themes/advanced/langs/sr_dlg.js
program/js/tiny_mce/themes/advanced/langs/sv.js
program/js/tiny_mce/themes/advanced/langs/sv_dlg.js
program/js/tiny_mce/themes/advanced/langs/ta.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/ta_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/te.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/te_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/th.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/th_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/tr.js
program/js/tiny_mce/themes/advanced/langs/tr_dlg.js
program/js/tiny_mce/themes/advanced/langs/tw.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/tw_dlg.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/uk.js
program/js/tiny_mce/themes/advanced/langs/uk_dlg.js
program/js/tiny_mce/themes/advanced/langs/vi.js
program/js/tiny_mce/themes/advanced/langs/vi_dlg.js
program/js/tiny_mce/themes/advanced/langs/zh.js
program/js/tiny_mce/themes/advanced/langs/zh_dlg.js
program/js/tiny_mce/themes/advanced/link.htm
program/js/tiny_mce/themes/advanced/skins/default/content.css
program/js/tiny_mce/themes/advanced/skins/default/dialog.css
program/js/tiny_mce/themes/advanced/skins/default/ui.css
program/js/tiny_mce/themes/advanced/skins/o2k7/content.css
program/js/tiny_mce/themes/advanced/skins/o2k7/dialog.css
program/js/tiny_mce/themes/advanced/skins/o2k7/ui.css
program/js/tiny_mce/themes/advanced/source_editor.htm
program/js/tiny_mce/themes/simple/editor_template_src.js
program/js/tiny_mce/tiny_mce.js
program/js/tiny_mce/tiny_mce_popup.js
program/js/tiny_mce/tiny_mce_src.js
program/js/tiny_mce/utils/editable_selects.js
program/js/tiny_mce/utils/form_utils.js
program/js/tiny_mce/utils/mctabs.js
program/js/tiny_mce/utils/validate.js
program/lib/html2text.php
program/lib/imap.inc [deleted file]
program/lib/mime.inc [deleted file]
program/lib/tnef_decoder.inc [deleted file]
program/lib/tnef_decoder.php [new file with mode: 0644]
program/lib/washtml.php
program/localization/ar_SA/labels.inc
program/localization/ar_SA/messages.inc
program/localization/ast/labels.inc
program/localization/ast/messages.inc
program/localization/az_AZ/labels.inc
program/localization/az_AZ/messages.inc
program/localization/bg_BG/labels.inc
program/localization/bg_BG/messages.inc
program/localization/bn_BD/labels.inc
program/localization/bn_BD/messages.inc
program/localization/br/labels.inc
program/localization/br/messages.inc
program/localization/bs_BA/labels.inc
program/localization/bs_BA/messages.inc
program/localization/ca_ES/labels.inc
program/localization/ca_ES/messages.inc
program/localization/cs_CZ/labels.inc
program/localization/cs_CZ/messages.inc
program/localization/cy_GB/labels.inc
program/localization/cy_GB/messages.inc
program/localization/da_DK/labels.inc
program/localization/da_DK/messages.inc
program/localization/de_CH/labels.inc
program/localization/de_CH/messages.inc
program/localization/de_DE/labels.inc
program/localization/de_DE/messages.inc
program/localization/el_GR/labels.inc
program/localization/el_GR/messages.inc
program/localization/en_GB/labels.inc
program/localization/en_GB/messages.inc
program/localization/en_US/labels.inc
program/localization/en_US/messages.inc
program/localization/eo/labels.inc
program/localization/eo/messages.inc
program/localization/es_AR/labels.inc
program/localization/es_AR/messages.inc
program/localization/es_ES/labels.inc
program/localization/es_ES/messages.inc
program/localization/et_EE/labels.inc
program/localization/et_EE/messages.inc
program/localization/eu_ES/labels.inc
program/localization/eu_ES/messages.inc
program/localization/fa/labels.inc
program/localization/fa/messages.inc
program/localization/fa_AF/labels.inc
program/localization/fa_AF/messages.inc
program/localization/fi_FI/labels.inc
program/localization/fi_FI/messages.inc
program/localization/fr_FR/labels.inc
program/localization/fr_FR/messages.inc
program/localization/ga_IE/labels.inc
program/localization/ga_IE/messages.inc
program/localization/gl_ES/labels.inc
program/localization/gl_ES/messages.inc
program/localization/he_IL/labels.inc
program/localization/he_IL/messages.inc
program/localization/hi_IN/labels.inc
program/localization/hi_IN/messages.inc
program/localization/hr_HR/labels.inc
program/localization/hr_HR/messages.inc
program/localization/hu_HU/labels.inc
program/localization/hu_HU/messages.inc
program/localization/hy_AM/labels.inc
program/localization/hy_AM/messages.inc
program/localization/id_ID/labels.inc
program/localization/id_ID/messages.inc
program/localization/index.inc
program/localization/is_IS/labels.inc
program/localization/is_IS/messages.inc
program/localization/it_IT/labels.inc
program/localization/it_IT/messages.inc
program/localization/ja_JP/labels.inc
program/localization/ja_JP/messages.inc
program/localization/ka_GE/labels.inc
program/localization/ka_GE/messages.inc
program/localization/kh_KH/labels.inc [new file with mode: 0644]
program/localization/kh_KH/messages.inc [new file with mode: 0644]
program/localization/ko_KR/labels.inc
program/localization/ko_KR/messages.inc
program/localization/ku/labels.inc
program/localization/ku/messages.inc
program/localization/lt_LT/labels.inc
program/localization/lt_LT/messages.inc
program/localization/lv_LV/labels.inc
program/localization/lv_LV/messages.inc
program/localization/mk_MK/labels.inc
program/localization/mk_MK/messages.inc
program/localization/mr_IN/labels.inc
program/localization/mr_IN/messages.inc
program/localization/ms_MY/labels.inc
program/localization/ms_MY/messages.inc
program/localization/nb_NO/labels.inc
program/localization/nb_NO/messages.inc
program/localization/ne_NP/labels.inc
program/localization/ne_NP/messages.inc
program/localization/nl_BE/labels.inc
program/localization/nl_BE/messages.inc
program/localization/nl_NL/labels.inc
program/localization/nl_NL/messages.inc
program/localization/nn_NO/labels.inc
program/localization/nn_NO/messages.inc
program/localization/pl_PL/labels.inc
program/localization/pl_PL/messages.inc
program/localization/ps/labels.inc
program/localization/ps/messages.inc
program/localization/pt_BR/labels.inc
program/localization/pt_BR/messages.inc
program/localization/pt_PT/labels.inc
program/localization/pt_PT/messages.inc
program/localization/ro_RO/labels.inc
program/localization/ro_RO/messages.inc
program/localization/ru_RU/labels.inc
program/localization/ru_RU/messages.inc
program/localization/si_LK/labels.inc
program/localization/si_LK/messages.inc
program/localization/sk_SK/labels.inc
program/localization/sk_SK/messages.inc
program/localization/sl_SI/labels.inc
program/localization/sl_SI/messages.inc
program/localization/sq_AL/labels.inc
program/localization/sq_AL/messages.inc
program/localization/sr_CS/labels.inc
program/localization/sr_CS/messages.inc
program/localization/sv_SE/labels.inc
program/localization/sv_SE/messages.inc
program/localization/ta_IN/labels.inc [new file with mode: 0644]
program/localization/ta_IN/messages.inc [new file with mode: 0644]
program/localization/th_TH/labels.inc
program/localization/th_TH/messages.inc
program/localization/tr_TR/labels.inc
program/localization/tr_TR/messages.inc
program/localization/uk_UA/labels.inc
program/localization/uk_UA/messages.inc
program/localization/vi_VN/labels.inc
program/localization/vi_VN/messages.inc
program/localization/zh_CN/labels.inc
program/localization/zh_CN/messages.inc
program/localization/zh_TW/labels.inc
program/localization/zh_TW/messages.inc
program/steps/addressbook/copy.inc
program/steps/addressbook/delete.inc
program/steps/addressbook/edit.inc
program/steps/addressbook/export.inc
program/steps/addressbook/func.inc
program/steps/addressbook/groups.inc [new file with mode: 0644]
program/steps/addressbook/import.inc
program/steps/addressbook/list.inc
program/steps/addressbook/mailto.inc
program/steps/addressbook/save.inc
program/steps/addressbook/search.inc
program/steps/addressbook/show.inc
program/steps/error.inc [deleted file]
program/steps/mail/addcontact.inc
program/steps/mail/attachments.inc
program/steps/mail/autocomplete.inc
program/steps/mail/check_recent.inc
program/steps/mail/compose.inc
program/steps/mail/copy.inc [new file with mode: 0644]
program/steps/mail/folders.inc
program/steps/mail/func.inc
program/steps/mail/get.inc
program/steps/mail/getunread.inc
program/steps/mail/headers.inc
program/steps/mail/list.inc
program/steps/mail/mark.inc
program/steps/mail/move_del.inc
program/steps/mail/pagenav.inc [new file with mode: 0644]
program/steps/mail/rss.inc [deleted file]
program/steps/mail/search.inc
program/steps/mail/sendmail.inc
program/steps/mail/sendmdn.inc
program/steps/mail/show.inc
program/steps/mail/spell.inc [deleted file]
program/steps/mail/spell_googie.inc [deleted file]
program/steps/mail/spell_pspell.inc [deleted file]
program/steps/mail/viewsource.inc
program/steps/settings/delete_identity.inc
program/steps/settings/edit_folder.inc [new file with mode: 0644]
program/steps/settings/edit_identity.inc
program/steps/settings/edit_prefs.inc
program/steps/settings/folders.inc [new file with mode: 0644]
program/steps/settings/func.inc
program/steps/settings/identities.inc
program/steps/settings/manage_folders.inc [deleted file]
program/steps/settings/save_folder.inc [new file with mode: 0644]
program/steps/settings/save_identity.inc
program/steps/settings/save_prefs.inc
program/steps/utils/error.inc [new file with mode: 0644]
program/steps/utils/html2text.inc [new file with mode: 0644]
program/steps/utils/killcache.inc [new file with mode: 0644]
program/steps/utils/modcss.inc [new file with mode: 0644]
program/steps/utils/save_pref.inc [new file with mode: 0644]
program/steps/utils/spell.inc [new file with mode: 0644]
program/steps/utils/spell_googie.inc [new file with mode: 0644]
program/steps/utils/spell_html_googie.inc [new file with mode: 0644]
program/steps/utils/spell_html_pspell.inc [new file with mode: 0644]
program/steps/utils/spell_pspell.inc [new file with mode: 0644]
skins/default/README [new file with mode: 0644]
skins/default/addressbook.css [new file with mode: 0644]
skins/default/addresses.css [deleted file]
skins/default/colorpicker.css [deleted file]
skins/default/common.css
skins/default/editor_content.css
skins/default/functions.js
skins/default/googiespell.css
skins/default/ie6hacks.css
skins/default/iehacks.css
skins/default/images/dbutton.png [new file with mode: 0644]
skins/default/images/icons/abcard.png [deleted file]
skins/default/images/icons/collapsed.png
skins/default/images/icons/columnpicker.gif [new file with mode: 0644]
skins/default/images/icons/expanded.png
skins/default/images/icons/folders.gif
skins/default/images/icons/folders.png
skins/default/images/icons/groupactions.gif [new file with mode: 0644]
skins/default/images/icons/groupactions.png [new file with mode: 0644]
skins/default/images/icons/unread_children.png [new file with mode: 0644]
skins/default/images/listheader.gif
skins/default/images/mail_footer.gif [new file with mode: 0644]
skins/default/images/mail_footer.png
skins/default/images/mail_toolbar.gif
skins/default/images/mail_toolbar.png
skins/default/images/messageactions.gif
skins/default/images/messageactions.png
skins/default/images/messageicons.gif [new file with mode: 0644]
skins/default/images/messageicons.png [new file with mode: 0644]
skins/default/images/quota.gif [new file with mode: 0644]
skins/default/images/tabs-left.gif [new file with mode: 0644]
skins/default/images/tabs-right.gif [new file with mode: 0644]
skins/default/images/tabs.gif [deleted file]
skins/default/images/taskbar.png [new file with mode: 0644]
skins/default/images/tree.gif [new file with mode: 0644]
skins/default/includes/header.html
skins/default/includes/links.html
skins/default/includes/messagemenu.html
skins/default/includes/replyallmenu.html [new file with mode: 0644]
skins/default/mail.css
skins/default/pngbehavior.htc
skins/default/print.css
skins/default/safari.css
skins/default/settings.css
skins/default/splitter.js
skins/default/templates/addcontact.html [deleted file]
skins/default/templates/addressbook.html
skins/default/templates/compose.html
skins/default/templates/contact.html [new file with mode: 0644]
skins/default/templates/contactadd.html [new file with mode: 0644]
skins/default/templates/contactedit.html [new file with mode: 0644]
skins/default/templates/editcontact.html [deleted file]
skins/default/templates/editidentity.html [deleted file]
skins/default/templates/error.html
skins/default/templates/folderedit.html [new file with mode: 0644]
skins/default/templates/folders.html [new file with mode: 0644]
skins/default/templates/identities.html
skins/default/templates/identityedit.html [new file with mode: 0644]
skins/default/templates/importcontacts.html
skins/default/templates/login.html
skins/default/templates/mail.html
skins/default/templates/managefolders.html [deleted file]
skins/default/templates/message.html
skins/default/templates/messageerror.html
skins/default/templates/messageprint.html [new file with mode: 0644]
skins/default/templates/plugin.html
skins/default/templates/printmessage.html [deleted file]
skins/default/templates/settings.html
skins/default/templates/showcontact.html [deleted file]

index 00e1bf2db837dbcbb54bc18c098036ec0dd03027..704779e2e9b7844bb9e39199a936a0a7b6c564fb 100644 (file)
--- a/.htaccess
+++ b/.htaccess
@@ -16,6 +16,7 @@ php_flag      magic_quotes_runtime            Off
 php_flag       zend.ze1_compatibility_mode     Off
 php_flag       suhosin.session.encrypt         Off
 
+#php_value     session.cookie_path             /
 php_value      session.auto_start      0
 php_value      session.gc_maxlifetime  21600
 php_value      session.gc_divisor      500
index 6f927981ee151b18a70c02268a6ab014690144b7..3a24db1b774abf8dca4ea45f65428c2c2b8e23ae 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
-CHANGELOG RoundCube Webmail
+CHANGELOG Roundcube Webmail
 ===========================
 
-- Specify toolbar container in compose template (#1486247)
-- Fix $_SERVER['HTTPS'] check for SSL forcing on IIS (#1486243)
-- Avoid unnecessary page loads for selected tab (#1486032)
-- Fix quota indicator issues by content generation on client-size (#1486197, #1486220)
-- Don't display disabled sections in Settings (#1486099)
-- Added server-side e-mail address validation with 'email_dns_check' option (#1485857)
-- Fix login page loading into an iframe when session expires (#1485952)
-- Allow setting port number in 'force_https' option (#1486091)
-- Option 'force_https' replaced by 'force_https' plugin
-- Fix IE issue with non-UTF-8 characters in AJAX response (#1486159)
-- Partially fixed "empty body" issue by showing raw body of malformed message (#1486166)
-- Fix importing/sending to email address with whitespace (#1486214)
-- Added XIMSS (CommuniGate) driver for Password plugin
-- Fix newly attached files are not saved in drafts w/o editing any text (#1486202)
-- Added attachment upload indicator with parallel upload (#1486058)
-- Use default_charset for bodies of messages without charset definition (#1486187)
-- Password: added cPanel driver
-- Fix return to first page from e-mail screen (#1486105)
-- Fix handling HTML comments in HTML messages (#1486189)
-- Fix folder/messagelist controls alignment - icons used (#1486072)
-- Fix LDAP addressbook shows 'Contact not found' error sometimes (#1486178)
-- Fix cache status checking + improve cache operations performance (#1486104)
-- Prevent from setting INBOX as any of special folders (#1486114)
-- Fix regular expression for e-mail address (#1486152)
-- Fix Received header format
-- Implemented sorting by message index - added 'index_sort' option (#1485936)
-- Fix dl() use in installer (#1486150)
-- Added 'ldap_debug' option
-- Fix "Empty startup greeting" bug (#1486085)
-- Fix setting user name in 'new_user_identity' plugin (#1486137)
-- Fix incorrect count of new messages in folder list when using multiple IMAP clients (#1485995)
-- Fix all folders checking for new messages with disabled caching (#1486128)
-- Support skins in 'archive' and 'markasjunk' plugins
-- Added 'html_editor' hook (#1486068)
-- Fix DB constraint violation when populating messages cache (#1486052)
-- Password: added password strength options (#1486062)
-- Fix LDAP partial result warning (#1485536)
-- Fix delete in message view deletes permanently with flag_for_deletion=true (#1486101)
-- Use faster/secure mt_rand() (#1486094)
-- Fix roundcube hangs on empty inbox with bincimapd (#1486093)
-- Fix wrong headers for IE on servers without $_SERVER['HTTPS'] (#1485926)
-- Force IE style headers for attachments in non-HTTPS session, 'use_https' option (#1485655)
-- Check 'post_max_size' for upload max filesize (#1486089) 
-- Password Plugin: Fix %d inserts username instead of domain (#1486088)
-- Fix rcube_mdb2::affected_rows() (#1486082)
+- Fix double-login/session issue (#1487104)
+- Wrap HTML parts with <html><body> and add Doctype declaration (#1487098)
+- Make rcube_autoload silently skip unknown classes (#1487109)
+- Fix charset detection in vcards with encoded values (#1485542)
+- Better CSS cursors for splitters (#1486874)
+- Show the same message only once (#1487641)
+- Fix namespaces handling (#1487649)
+- Add handling of multifolder METADATA/ANNOTATION responses
+- Fix handling of INBOX when personal namespace prefix is non-empty (#1487657)
+- Fix handling square brackets in links (#1487672)
+- Add description of 'use_https' option in main.inc.php.dist file
+
+RELEASE 0.5-RC
+--------------
+- Plugin API: Add 'pass' argument in 'authenticate' hook (#1487134)
+- Fix attachments of type message/rfc822 are not listed on attachments list
+- Add 'login_lc' config option for case-insensitive authentication (#1487113)
+- Fix window is blur'ed in IE when selecting a message (#1487316)
+- Fix cursor position on compose form in Webkit browsers (#1486674)
+- Fix setting charset of attachment filenames (#1487122)
+- Allow setting autocomplete attribute for all inputs separately (#1487313)
+- New Folder Manager UI
+- Fix invalid Request when creating a folder (#1487443)
+- Add folder size and quota indicator in folder manager (#1485780)
+- Add possibility to move a subfolder into root folder (#1486791)
+- Fix copying all messages in a folder copies only messages from current page
+- Improve performance of moving or copying of all messages in a folder
+- Fix plaintext versions of HTML messages don't contain placeholders for emotions (#1485206)
+- Improve performance of folder rename and delete actions
+- Better support for READ-ONLY and NOPERM responses handling (#1487083)
+- Add confirmation message on purge/expunge command response
+- Fix handling of untagged responses for AUTHENTICATE command (#1487450)
+- Add username and IP address to log message on unsuccessful login (#1487626)
+- Improved Mail-Followup-To and Mail-Reply-To headers handling
+- Fix charset conversion for text attachments without charset specification (#1487634)
+
+RELEASE 0.5-BETA
+----------------
+- Make session data storage more robust against garbage session data (#1487136)
+- Config option for autocomplete on login screen
+- Allow plugin templates to include local files (#1487133)
+- List groups in address detail view and allow to subscribe/unsubscribe from there (#1486753)
+- Messages caching: performance improvements, fixed syncing, fixes related with #1486748
+- Add link to identities in compose window (#1486729)
+- Add Internationalized Domain Name (IDNA) support (#1483894)
+- Add option to automatically send read notifications for known senders (#1485883)
+- Add option to "Return receipt" will be always checked (#1486352)
+- Fix HTML to plain text conversion doesn't handle citation blocks (#1486921)
+- Use custom sorting when SORT is disabled by IMAP admin (#1486959)
+- Allow setting some washtml options from plugin (#1486578)
+- Add option do bind for an individual LDAP address book (#1486997)
+- Change reply prefix to display email address only if sender name doesn't exist (#1486550)
+- Plugin API: improved 'abort' flag handling, added 'result' item in some hooks (#1486914)
+- Fix mailto optional params in plain text messages aren't handled (#1487026)
+- Add Reply-to-List feature (#1484252)
+- Add Mail-Followup-To/Mail-Reply-To support (#1485547)
+- Fix confirmation message isn't displayed after sending mail on Chrome (#1486177)
+- Fix keyboard doesn't work with autocomplete list with Chrome (#1487029)
+- Improve tabs to fixed width and add tabs in identities info (#1486974)
+- Add unique index on users.username+users.mail_host
+- Make htmleditor option more consistent and add option to use HTML on reply to HTML message (#1485840)
+- Use empty envelope sender address for message disposition notifications (RFC 2298.3)
+- Support SMTP Delivery Status Notifications - RFC 3461 (#1486142)
+- Use css sprite image for messages list
+- Add (different) attachment icon for messages of type multipart/report (#1486165)
+- Prevent from inserting empty link when composing HTML message (#1486944)
+- Add caching support in id2uid and uid2id functions (#1487019)
+- Add SASL proxy authentication for SMTP (#1486693)
+- Improve displaying of UI messages (#1486977)
+- Fix double e-mail filed in identity form (#1487054)
+- Display IMAP errors for LIST/THREAD/SEARCH commands (#1486905)
+- Add LITERAL+ (IMAP4 non-synchronizing literals) support (RFC 2088)
+- Add separate column for message status icon (#1486665)
+- Add ACL extension support into IMAP classes (RFC 4314)
+- Add ANNOTATEMORE extension support into IMAP classes (draft-daboo-imap-annotatemore)
+- Add METADATA extension support into IMAP classes (RFC 5464)
+- Fix decoding of e-mail address strings in message headers (#1487068)
+- Fix handling of attachments when Content-Disposition is not inline nor attachment (#1487051)
+- Improve performance of unseen messages counting (#1487058)
+- Improve performance of messages counting using ESEARCH extension (RFC4731)
+- Add LIST-STATUS support in rcube_imap_generic class (RFC 5819)
+- Add SASL-IR support in IMAP (RFC 4959)
+- Add LOGINDISABLED support (RFC 2595)
+- Add support for AUTH=PLAIN in IMAP authentication
+- Re-implemented SMTP proxy authentication support
+- Add support for IMAP proxy authentication (#1486690)
+- Add support for AUTH=DIGEST-MD5 in IMAP (RFC 2831)
+- Fix parent folder with unread subfolder not bold when message is open (#1487078)
+- Add basic IMAP LIST's \Noselect option support
+- Add support for selection options from LIST-EXTENDED extension (RFC 5258)
+- Don't list subscribed but non-existent folders (#1486225)
+- Fix handling of URLs with tilde (~) or semicolon (;) character (#1487087, #1487088)
+- Plugin API: added 'contact_form' hook
+- Add SORT=DISPLAY support (RFC 5957)
+- Plugin API: add possibility to disable plugin in AJAX mode, 'noajax' property
+- Plugin API: add possibility to disable plugin in framed mode, 'noframe' property
+- Improve performance of setting IMAP flags using .SILENT suffix
+- Improve performance of message cache status checking with skip_disabled=true
+- Support contact's email addresses up to 255 characters long (#1487095)
+- Add option to place replies in the folder of the message being replied to (#1485945)
+- Add missing confirmation/error messages on contact/group/message actions (#1486845)
+- Add 'loading' message on message move/copy/delete/mark actions
+- Improve responsiveness of messages displaying (#1486986)
+- Add option for minimum length of autocomplete's string (#1486428)
+- Fix operations on messages in unsubscribed folder (#1487107)
+- Add support for shared folders (#1403507)
+- Fix handling of folders with name "0" (#1487119)
+- Fix handling of folders with "<>" characters in name
+- jQuery 1.4.4
+- Fix handling of HTML entity strings in plain text messages
+- Fix focused elements aren't unfocused when clicking on the list (#1487123)
+- Fix error in MSSQL DDL scripts (#1487112)
+- Lock submit button in onsubmit event on login page (#1487036)
+- Don't set attachment's charset in Content-type header (#1487122)
+- Fix handling of message bodies (quoted-printable encoded) with NULL characters (#1486189)
+- Add workaround for MSOE's multipart/related messages with non-related attachments
 
diff --git a/INSTALL b/INSTALL
index d2b9145a07c51898f287f65c11e7802bbeb3256c..8216343a560e59c7cdf1eac5c0d6f151896d957b 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
 INTRODUCTION
 ============
 
-This file describes the basic steps to install RoundCube Webmail on your
+This file describes the basic steps to install Roundcube Webmail on your
 web server. For additional information, please also consult the project's
 wiki page at http://trac.roundcube.net/wiki
 
@@ -12,26 +12,30 @@ REQUIREMENTS
 * The Apache or Lighttpd Webserver
 * .htaccess support allowing overrides for DirectoryIndex
 * PHP Version 5.2 or greater including
-   - PCRE (perl compatible regular expression)
-   - DOM (xml document object model)
+   - PCRE, DOM, JSON, XML, Session, Sockets (required)
    - Libiconv
    - Multibyte String (mbstring)
    - Mcrypt (supporting Triple DES)
+   - Fileinfo (optional)
    - Database driver for either MySQL, Postgres or SQLite
-* php.ini options:
+* The PEAR framework with the following packages installed:
+   - MDB2 2.5.0 or newer
+   - Mail_Mime 1.8.1 or newer
+   - Net_SMTP 1.4.2 or newer
+   - Auth_SASL 1.0.3 or newer
+* php.ini options (see .htaccess file):
    - error_reporting E_ALL & ~E_NOTICE (or lower)
-   - memory_limit (increase as suitable to support large attachments)
+   - memory_limit > 16MB (increase as suitable to support large attachments)
    - file_uploads enabled (for attachment upload features)
    - session.auto_start disabled
    - zend.ze1_compatibility_mode disabled
-* The PEAR framework with the following packages installed
-   - MDB2 (2.5.0b2)
-   - Mail_Mime (1.5.2)
-   - Net_SMTP (1.3.3)
+   - suhosin.session.encrypt disabled
+   - mbstring.func_overload disabled
 * PHP compiled with OpenSSL to connect to IMAPS and to use the spell checker
-* A MySQL or PostgreSQL database engine or the SQLite extension for PHP
+* A MySQL (4.0.8 or newer), PostgreSQL, MSSQL database engine
+  or the SQLite extension for PHP
 * One of the above databases with permission to create tables
-* An SMTP server or PHP configured for mail delivery
+* An SMTP server (recommended) or PHP configured for mail delivery
 
 
 INSTALLATION
@@ -42,7 +46,7 @@ INSTALLATION
    are writable by the webserver
    - /temp
    - /logs
-3. Create a new database and a database user for RoundCube (see DATABASE SETUP)
+3. Create a new database and a database user for Roundcube (see DATABASE SETUP)
 4. Point your browser to http://url-to-roundcube/installer/
 5. Follow the instructions of the install script (or see MANUAL CONFIGURATION)
 6. After creating and testing the configuration, remove the installer directory
@@ -52,15 +56,22 @@ INSTALLATION
 CONFIGURATION HINTS
 ===================
 
-RoundCube writes internal errors to the 'errors' log file located in the logs
+Roundcube writes internal errors to the 'errors' log file located in the logs
 directory which can be configured in config/main.inc.php. If you want ordinary
 PHP errors to be logged there as well, enable the 'php_value error_log' line
 in the .htaccess file and set the path to the log file accordingly.
 
+By default the session_path settings of PHP are not modified by Roundcube.
+However if you want to limit the session cookies to the directory where
+Roundcube resides you can uncomment and configure the according line
+in the .htaccess file.
+
 
 DATABASE SETUP
 ==============
 
+Note: Database for Roundcube must use UTF-8 character set.
+
 * MySQL
 -------
 Setting up the mysql database can be done by creating an empty database,
@@ -79,9 +90,6 @@ Note 1: 'password' is the master password for the roundcube user. It is strongly
 recommended you replace this with a more secure password. Please keep in
 mind: You need to specify this password later in 'config/db.inc.php'.
 
-Note 2: For MySQL version 4.1 and up, it's recommended to create the database for
-RoundCube with utf-8 charset.
-
 
 * SQLite
 --------
@@ -102,7 +110,7 @@ webserver can write to the file and the directory containing the file.
 
 * PostgreSQL
 ------------
-To use RoundCube with PostgreSQL support you have to follow these
+To use Roundcube with PostgreSQL support you have to follow these
 simple steps, which have to be done as the postgres system user (or
 which ever is the database superuser):
 
@@ -119,6 +127,14 @@ versions don't have a -O option for the createdb, so if you are
 using that version you'll have to change ownership of the DB later.
 
 
+Database cleaning
+-----------------
+Do keep your database slick and clean we recommend to periodically execute
+bin/cleandb.sh which finally removes all records that are marked as deleted.
+Best solution is to install a cronjob running this script daily.
+
+
+
 MANUAL CONFIGURATION
 ====================
 
@@ -135,7 +151,7 @@ increase the allowed size of file attachments, for example:
 UPGRADING
 =========
 
-If you already have a previous version of RoundCube installed,
+If you already have a previous version of Roundcube installed,
 please refer to the instructions in UPGRADING guide.
 
 
@@ -143,9 +159,9 @@ OPTIMISING
 ==========
 
 There are two forms of optimisation here, compression and caching, both aimed
-at increasing an end user's experience using RoundCube Webmail. Compression
+at increasing an end user's experience using Roundcube Webmail. Compression
 allows the static web pages to be delivered with less bandwidth. The index.php
-of RoundCube Webmail already enables compression on its output. The settings
+of Roundcube Webmail already enables compression on its output. The settings
 below allow compression to occur for all static files. Caching sets HTTP 
 response headers that enable a user's web client to understand what is static
 and how to cache it.
index 67fbce98a773f41d6478d11f02dce642c699baf2..eb8399786548f0e76c5b7115ada786715b694db3 100644 (file)
@@ -1,7 +1,7 @@
 INTRODUCTION
 ============
 
-This file describes the basic steps to install RoundCube Webmail on your
+This file describes the basic steps to install Roundcube Webmail on your
 web server. For additional information, please also consult the project's
 wiki page at http://trac.roundcube.net/wiki
 
@@ -12,20 +12,27 @@ REQUIREMENTS
 * The Apache or Lighttpd Webserver
 * .htaccess support allowing overrides for DirectoryIndex
 * PHP Version 5.2 or greater including
-   - PCRE (perl compatible regular expression)
-   - DOM (xml document object model)
+   - PCRE, DOM, JSON, XML, Session, Sockets (required)
    - libiconv (recommended)
-   - mbstring (optional)
-* php.ini options:
+   - mbstring, fileinfo, mcrypt (optional)
+* PEAR packages distributed with Roundcube or external:
+   - MDB2 2.5.0 or newer
+   - Mail_Mime 1.8.1 or newer
+   - Net_SMTP 1.4.2 or newer
+   - Auth_SASL 1.0.3 or newer
+* php.ini options (see .htaccess file):
    - error_reporting E_ALL & ~E_NOTICE (or lower)
-   - memory_limit (increase as suitable to support large attachments)
+   - memory_limit > 16MB (increase as suitable to support large attachments)
    - file_uploads enabled (for attachment upload features)
    - session.auto_start disabled
    - zend.ze1_compatibility_mode disabled
+   - suhosin.session.encrypt disabled
+   - mbstring.func_overload disabled
 * PHP compiled with OpenSSL to connect to IMAPS and to use the spell checker
-* A MySQL or PostgreSQL database engine or the SQLite extension for PHP
+* A MySQL (4.0.8 or newer), PostgreSQL, MSSQL database engine
+  or the SQLite extension for PHP
 * One of the above databases with permission to create tables
-* An SMTP server or PHP configured for mail delivery
+* An SMTP server (recommended) or PHP configured for mail delivery
 
 
 INSTALLATION
@@ -36,7 +43,7 @@ INSTALLATION
    are writable by the webserver
    - /temp
    - /logs
-3. Create a new database and a database user for RoundCube (see DATABASE SETUP)
+3. Create a new database and a database user for Roundcube (see DATABASE SETUP)
 4. Point your browser to http://url-to-roundcube/installer/
 5. Follow the instructions of the install script (or see MANUAL CONFIGURATION)
 6. After creating and testing the configuration, remove the installer directory
@@ -46,15 +53,22 @@ INSTALLATION
 CONFIGURATION HINTS
 ===================
 
-RoundCube writes internal errors to the 'errors' log file located in the logs
+Roundcube writes internal errors to the 'errors' log file located in the logs
 directory which can be configured in config/main.inc.php. If you want ordinary
 PHP errors to be logged there as well, enable the 'php_value error_log' line
 in the .htaccess file and set the path to the log file accordingly.
 
+By default the session_path settings of PHP are not modified by Roundcube.
+However if you want to limit the session cookies to the directory where
+Roundcube resides you can uncomment and configure the according line
+in the .htaccess file.
+
 
 DATABASE SETUP
 ==============
 
+Note: Database for Roundcube must use UTF-8 character set.
+
 * MySQL
 -------
 Setting up the mysql database can be done by creating an empty database,
@@ -73,9 +87,6 @@ Note 1: 'password' is the master password for the roundcube user. It is strongly
 recommended you replace this with a more secure password. Please keep in
 mind: You need to specify this password later in 'config/db.inc.php'.
 
-Note 2: For MySQL version 4.1 and up, it's recommended to create the database for
-RoundCube with utf-8 charset.
-
 
 * SQLite
 --------
@@ -96,7 +107,7 @@ webserver can write to the file and the directory containing the file.
 
 * PostgreSQL
 ------------
-To use RoundCube with PostgreSQL support you have to follow these
+To use Roundcube with PostgreSQL support you have to follow these
 simple steps, which have to be done as the postgres system user (or
 which ever is the database superuser):
 
@@ -113,6 +124,14 @@ versions don't have a -O option for the createdb, so if you are
 using that version you'll have to change ownership of the DB later.
 
 
+Database cleaning
+-----------------
+Do keep your database slick and clean we recommend to periodically execute
+bin/cleandb.sh which finally removes all records that are marked as deleted.
+Best solution is to install a cronjob running this script daily.
+
+
+
 MANUAL CONFIGURATION
 ====================
 
@@ -129,7 +148,7 @@ increase the allowed size of file attachments, for example:
 UPGRADING
 =========
 
-If you already have a previous version of RoundCube installed,
+If you already have a previous version of Roundcube installed,
 please refer to the instructions in UPGRADING guide.
 
 
@@ -137,9 +156,9 @@ OPTIMISING
 ==========
 
 There are two forms of optimisation here, compression and caching, both aimed
-at increasing an end user's experience using RoundCube Webmail. Compression
+at increasing an end user's experience using Roundcube Webmail. Compression
 allows the static web pages to be delivered with less bandwidth. The index.php
-of RoundCube Webmail already enables compression on its output. The settings
+of Roundcube Webmail already enables compression on its output. The settings
 below allow compression to occur for all static files. Caching sets HTTP 
 response headers that enable a user's web client to understand what is static
 and how to cache it.
diff --git a/README b/README
index d7a13f74d2b544cc31e87c2f228dbca94940d135..3af0a1f9d9f9af8e375b38e37c15e15b4d1aa0f6 100644 (file)
--- a/README
+++ b/README
@@ -1,42 +1,50 @@
-RoundCube Webmail (http://roundcube.net)
+Roundcube Webmail (http://roundcube.net)
 
 
 Introduction:
 -------------
-RoundCube Webmail is a browser-based multilingual IMAP client with an
+Roundcube Webmail is a browser-based multilingual IMAP client with an
 application-like user interface. It provides full functionality you expect
 from an e-mail client, including MIME support, address book, folder management,
-message searching and spell checking. RoundCube Webmail is written in PHP and
-requires the MySQL, PostgreSQL or SQLite database. The user interface is fully
-skinnable using XHTML and CSS 2.
+message searching and spell checking. Roundcube Webmail is written in PHP and
+requires the MySQL, PostgreSQL or SQLite database. With its plugin API it is
+easily extendable and the user interface is fully customizable using skins
+which are pure XHTML and CSS 2.
 
-This project is meant to be a modern webmail solution which is easy to
-install/configure and that runs on a standard PHP plus MySQL, PostgreSQL or SQLite
-configuration. It includes open-source classes/libraries like PEAR
-(http://pear.php.net) and the IMAP wrapper from IlohaMail
-(http://www.ilohamail.org).
+This project includes other open-source classes/libraries from PEAR
+(http://pear.php.net), an IMAP library derived from IlohaMail
+the TinyMCE rich text editor, Googiespell library for spell checking
+or the HTML sanitizer by Frederic Motte.
 
-The current development skin uses icons designed by Stephen Horlander and Kevin 
+The current default skin uses icons designed by Stephen Horlander and Kevin 
 Gerich for Mozilla.org.
 
 
 Installation:
 -------------
-For detailed instructions on how to install RoundCube webmail on your server,
+For detailed instructions on how to install Roundcube webmail on your server,
 please refer to the INSTALL document in the same directory as this document.
 Please carefully read the REQUIREMENTS section of the INSTALL instructions.
 
+If you're updating an older version of Roundcube please follow the steps
+described in the UPGRADING file.
+
 
 Licensing:
 ----------
-This product is distributed under the GPL. Please read through the file
-LICENSE for more information about our license.
+This product is distributed under the GNU General Public License Version 2.
+Please read through the file LICENSE for more information about our license.
+
+Even if skins might contain some programming work, they are not considered
+as a linked part of the application and therefore skins DO NOT fall under
+the provisions of the GPL license. See the README file located in the skins
+folder for details on the skin license.
 
 
 Contribution:
 -------------
-Want to help make RoundCube the best webmail solution ever?
-RoundCube is open source software. Our developers and contributors all
+Want to help make Roundcube the best webmail solution ever?
+Roundcube is open source software. Our developers and contributors all
 are volunteers and we're always looking for new additions and resources.
 For more information visit http://roundcube.net/contribute
 
index e97a9a7b740a72c07138e4647feae01f7d346432..823d1b3aeead181cfa63ac92e4f72bae09e903ce 100644 (file)
@@ -13,16 +13,33 @@ CREATE TABLE [dbo].[contacts] (
        [changed] [datetime] NOT NULL ,\r
        [del] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,\r
        [name] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,\r
-       [email] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,\r
+       [email] [varchar] (255) COLLATE Latin1_General_CI_AI NOT NULL ,\r
        [firstname] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,\r
        [surname] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,\r
        [vcard] [text] COLLATE Latin1_General_CI_AI NULL \r
 ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]\r
 GO\r
 \r
+CREATE TABLE [dbo].[contactgroups] (\r
+       [contactgroup_id] [int] IDENTITY (1, 1) NOT NULL ,\r
+       [user_id] [int] NOT NULL ,\r
+       [changed] [datetime] NOT NULL ,\r
+       [del] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,\r
+       [name] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL\r
+) ON [PRIMARY] \r
+GO\r
+\r
+CREATE TABLE [dbo].[contactgroupmembers] (\r
+       [contactgroup_id] [int] NOT NULL ,\r
+       [contact_id] [int] NOT NULL ,\r
+       [created] [datetime] NOT NULL\r
+) ON [PRIMARY] \r
+GO\r
+\r
 CREATE TABLE [dbo].[identities] (\r
        [identity_id] [int] IDENTITY (1, 1) NOT NULL ,\r
        [user_id] [int] NOT NULL ,\r
+       [changed] [datetime] NOT NULL ,\r
        [del] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,\r
        [standard] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,\r
        [name] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,\r
@@ -69,7 +86,7 @@ CREATE TABLE [dbo].[users] (
        [mail_host] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,\r
        [alias] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,\r
        [created] [datetime] NOT NULL ,\r
-       [last_login] [datetime] NOT NULL ,\r
+       [last_login] [datetime] NULL ,\r
        [language] [varchar] (5) COLLATE Latin1_General_CI_AI NULL ,\r
        [preferences] [text] COLLATE Latin1_General_CI_AI NULL \r
 ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]\r
@@ -89,6 +106,20 @@ ALTER TABLE [dbo].[contacts] WITH NOCHECK ADD
        )  ON [PRIMARY] \r
 GO\r
 \r
+ALTER TABLE [dbo].[contactgroups] WITH NOCHECK ADD \r
+       CONSTRAINT [PK_contactgroups_contactgroup_id] PRIMARY KEY CLUSTERED \r
+       (\r
+               [contactgroup_id]\r
+       )  ON [PRIMARY] \r
+GO\r
+\r
+ALTER TABLE [dbo].[contactgroupmembers] WITH NOCHECK ADD \r
+       CONSTRAINT [PK_contactgroupmembers_id] PRIMARY KEY CLUSTERED \r
+       (\r
+               [contactgroup_id], [contact_id]\r
+       )  ON [PRIMARY] \r
+GO\r
+\r
 ALTER TABLE [dbo].[identities] WITH NOCHECK ADD \r
         PRIMARY KEY  CLUSTERED \r
        (\r
@@ -123,13 +154,13 @@ ALTER TABLE [dbo].[cache] ADD
        CONSTRAINT [DF_cache_created] DEFAULT (getdate()) FOR [created]\r
 GO\r
 \r
- CREATE  INDEX [IX_cache_user_id] ON [dbo].[cache]([user_id]) ON [PRIMARY]\r
+CREATE  INDEX [IX_cache_user_id] ON [dbo].[cache]([user_id]) ON [PRIMARY]\r
 GO\r
 \r
- CREATE  INDEX [IX_cache_cache_key] ON [dbo].[cache]([cache_key]) ON [PRIMARY]\r
+CREATE  INDEX [IX_cache_cache_key] ON [dbo].[cache]([cache_key]) ON [PRIMARY]\r
 GO\r
 \r
- CREATE  INDEX [IX_cache_created] ON [dbo].[cache]([created]) ON [PRIMARY]\r
+CREATE  INDEX [IX_cache_created] ON [dbo].[cache]([created]) ON [PRIMARY]\r
 GO\r
 \r
 ALTER TABLE [dbo].[contacts] ADD \r
@@ -143,9 +174,27 @@ ALTER TABLE [dbo].[contacts] ADD
        CONSTRAINT [CK_contacts_del] CHECK ([del] = '1' or [del] = '0')\r
 GO\r
 \r
- CREATE  INDEX [IX_contacts_user_id] ON [dbo].[contacts]([user_id]) ON [PRIMARY]\r
+CREATE  INDEX [IX_contacts_user_id] ON [dbo].[contacts]([user_id]) ON [PRIMARY]\r
+GO\r
+\r
+ALTER TABLE [dbo].[contactgroups] ADD \r
+       CONSTRAINT [DF_contactgroups_user_id] DEFAULT (0) FOR [user_id],\r
+       CONSTRAINT [DF_contactgroups_changed] DEFAULT (getdate()) FOR [changed],\r
+       CONSTRAINT [DF_contactgroups_del] DEFAULT ('0') FOR [del],\r
+       CONSTRAINT [DF_contactgroups_name] DEFAULT ('') FOR [name],\r
+       CONSTRAINT [CK_contactgroups_del] CHECK ([del] = '1' or [del] = '0')\r
 GO\r
 \r
+CREATE  INDEX [IX_contactgroups_user_id] ON [dbo].[contacts]([user_id]) ON [PRIMARY]\r
+GO\r
+\r
+ALTER TABLE [dbo].[contactgroupmembers] ADD \r
+       CONSTRAINT [DF_contactgroupmembers_contactgroup_id] DEFAULT (0) FOR [contactgroup_id],\r
+       CONSTRAINT [DF_contactgroupmembers_contact_id] DEFAULT (0) FOR [contact_id],\r
+       CONSTRAINT [DF_contactgroupmembers_created] DEFAULT (getdate()) FOR [created]\r
+GO\r
+\r
+\r
 ALTER TABLE [dbo].[identities] ADD \r
        CONSTRAINT [DF_identities_user] DEFAULT ('0') FOR [user_id],\r
        CONSTRAINT [DF_identities_del] DEFAULT ('0') FOR [del],\r
@@ -160,7 +209,7 @@ ALTER TABLE [dbo].[identities] ADD
         CHECK ([del] = '1' or [del] = '0')\r
 GO\r
 \r
- CREATE  INDEX [IX_identities_user_id] ON [dbo].[identities]([user_id]) ON [PRIMARY]\r
+CREATE  INDEX [IX_identities_user_id] ON [dbo].[identities]([user_id]) ON [PRIMARY]\r
 GO\r
 \r
 ALTER TABLE [dbo].[messages] ADD \r
@@ -178,16 +227,16 @@ ALTER TABLE [dbo].[messages] ADD
        CONSTRAINT [DF_messages_size] DEFAULT (0) FOR [size]\r
 GO\r
 \r
- CREATE  INDEX [IX_messages_user_id] ON [dbo].[messages]([user_id]) ON [PRIMARY]\r
+CREATE  INDEX [IX_messages_user_id] ON [dbo].[messages]([user_id]) ON [PRIMARY]\r
 GO\r
 \r
- CREATE  INDEX [IX_messages_cache_key] ON [dbo].[messages]([cache_key]) ON [PRIMARY]\r
+CREATE  INDEX [IX_messages_cache_key] ON [dbo].[messages]([cache_key]) ON [PRIMARY]\r
 GO\r
 \r
- CREATE  INDEX [IX_messages_uid] ON [dbo].[messages]([uid]) ON [PRIMARY]\r
+CREATE  INDEX [IX_messages_uid] ON [dbo].[messages]([uid]) ON [PRIMARY]\r
 GO\r
 \r
- CREATE  INDEX [IX_messages_created] ON [dbo].[messages]([created]) ON [PRIMARY]\r
+CREATE  INDEX [IX_messages_created] ON [dbo].[messages]([created]) ON [PRIMARY]\r
 GO\r
 \r
 ALTER TABLE [dbo].[session] ADD \r
@@ -196,7 +245,7 @@ ALTER TABLE [dbo].[session] ADD
        CONSTRAINT [DF_session_ip] DEFAULT ('') FOR [ip]\r
 GO\r
 \r
- CREATE  INDEX [IX_session_changed] ON [dbo].[session]([changed]) ON [PRIMARY]\r
+CREATE  INDEX [IX_session_changed] ON [dbo].[session]([changed]) ON [PRIMARY]\r
 GO\r
 \r
 ALTER TABLE [dbo].[users] ADD \r
@@ -206,9 +255,47 @@ ALTER TABLE [dbo].[users] ADD
        CONSTRAINT [DF_users_created] DEFAULT (getdate()) FOR [created]\r
 GO\r
 \r
- CREATE  INDEX [IX_users_username] ON [dbo].[users]([username]) ON [PRIMARY]\r
+CREATE  UNIQUE INDEX [IX_users_username] ON [dbo].[users]([username],[mail_host]) ON [PRIMARY]\r
+GO\r
+\r
+CREATE  INDEX [IX_users_alias] ON [dbo].[users]([alias]) ON [PRIMARY]\r
+GO\r
+\r
+ALTER TABLE [dbo].[identities] ADD CONSTRAINT [FK_identities_user_id] \r
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])\r
+    ON DELETE CASCADE ON UPDATE CASCADE\r
+GO\r
+\r
+ALTER TABLE [dbo].[contacts] ADD CONSTRAINT [FK_contacts_user_id]\r
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])\r
+    ON DELETE CASCADE ON UPDATE CASCADE\r
+GO\r
+\r
+ALTER TABLE [dbo].[contactgroups] ADD CONSTRAINT [FK_contactgroups_user_id]\r
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])\r
+    ON DELETE CASCADE ON UPDATE CASCADE\r
+GO\r
+\r
+ALTER TABLE [dbo].[cache] ADD CONSTRAINT [FK_cache_user_id]\r
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])\r
+    ON DELETE CASCADE ON UPDATE CASCADE\r
+GO\r
+\r
+ALTER TABLE [dbo].[messages] ADD CONSTRAINT [FK_messages_user_id]\r
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])\r
+    ON DELETE CASCADE ON UPDATE CASCADE\r
+GO\r
+\r
+ALTER TABLE [dbo].[contactgroupmembers] ADD CONSTRAINT [FK_contactgroupmembers_contactgroup_id]\r
+    FOREIGN KEY ([contactgroup_id]) REFERENCES [dbo].[contactgroups] ([contactgroup_id])\r
+    ON DELETE CASCADE ON UPDATE CASCADE\r
 GO\r
 \r
- CREATE  INDEX [IX_users_alias] ON [dbo].[users]([alias]) ON [PRIMARY]\r
+-- Use trigger instead of foreign key (#1487112)\r
+-- "Introducing FOREIGN KEY constraint ... may cause cycles or multiple cascade paths."\r
+CREATE TRIGGER [contact_delete_member] ON [dbo].[contacts]\r
+    AFTER DELETE AS\r
+    DELETE FROM [dbo].[contactgroupmembers]\r
+    WHERE [contact_id] IN (SELECT [contact_id] FROM deleted)\r
 GO\r
 \r
diff --git a/SQL/mssql.upgrade.sql b/SQL/mssql.upgrade.sql
new file mode 100644 (file)
index 0000000..4072c25
--- /dev/null
@@ -0,0 +1,99 @@
+-- Roundcube Webmail update script for MSSQL databases\r
+\r
+-- Updates from version 0.3.1\r
+\r
+ALTER TABLE [dbo].[messages] ADD CONSTRAINT [FK_messages_user_id]\r
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])\r
+    ON DELETE CASCADE ON UPDATE CASCADE\r
+GO\r
+\r
+ALTER TABLE [dbo].[cache] ADD CONSTRAINT [FK_cache_user_id]\r
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])\r
+    ON DELETE CASCADE ON UPDATE CASCADE\r
+GO\r
+\r
+ALTER TABLE [dbo].[contacts] ADD CONSTRAINT [FK_contacts_user_id]\r
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])\r
+    ON DELETE CASCADE ON UPDATE CASCADE\r
+GO\r
+\r
+ALTER TABLE [dbo].[identities] ADD CONSTRAINT [FK_identities_user_id] \r
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])\r
+    ON DELETE CASCADE ON UPDATE CASCADE\r
+GO\r
+\r
+ALTER TABLE [dbo].[identities] ADD [changed] [datetime] NULL \r
+GO\r
+\r
+CREATE TABLE [dbo].[contactgroups] (\r
+       [contactgroup_id] [int] IDENTITY (1, 1) NOT NULL ,\r
+       [user_id] [int] NOT NULL ,\r
+       [changed] [datetime] NOT NULL ,\r
+       [del] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,\r
+       [name] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL\r
+) ON [PRIMARY] \r
+GO\r
+\r
+CREATE TABLE [dbo].[contactgroupmembers] (\r
+       [contactgroup_id] [int] NOT NULL ,\r
+       [contact_id] [int] NOT NULL ,\r
+       [created] [datetime] NOT NULL\r
+) ON [PRIMARY] \r
+GO\r
+\r
+ALTER TABLE [dbo].[contactgroups] WITH NOCHECK ADD \r
+       CONSTRAINT [PK_contactgroups_contactgroup_id] PRIMARY KEY CLUSTERED \r
+       (\r
+               [contactgroup_id]\r
+       )  ON [PRIMARY] \r
+GO\r
+\r
+ALTER TABLE [dbo].[contactgroupmembers] WITH NOCHECK ADD \r
+       CONSTRAINT [PK_contactgroupmembers_id] PRIMARY KEY CLUSTERED \r
+       (\r
+               [contactgroup_id], [contact_id]\r
+       )  ON [PRIMARY] \r
+GO\r
+\r
+ALTER TABLE [dbo].[contactgroups] ADD \r
+       CONSTRAINT [DF_contactgroups_user_id] DEFAULT (0) FOR [user_id],\r
+       CONSTRAINT [DF_contactgroups_changed] DEFAULT (getdate()) FOR [changed],\r
+       CONSTRAINT [DF_contactgroups_del] DEFAULT ('0') FOR [del],\r
+       CONSTRAINT [DF_contactgroups_name] DEFAULT ('') FOR [name],\r
+       CONSTRAINT [CK_contactgroups_del] CHECK ([del] = '1' or [del] = '0')\r
+GO\r
+\r
+CREATE  INDEX [IX_contactgroups_user_id] ON [dbo].[contacts]([user_id]) ON [PRIMARY]\r
+GO\r
+\r
+ALTER TABLE [dbo].[contactgroupmembers] ADD \r
+       CONSTRAINT [DF_contactgroupmembers_contactgroup_id] DEFAULT (0) FOR [contactgroup_id],\r
+       CONSTRAINT [DF_contactgroupmembers_contact_id] DEFAULT (0) FOR [contact_id],\r
+       CONSTRAINT [DF_contactgroupmembers_created] DEFAULT (getdate()) FOR [created]\r
+GO\r
+\r
+ALTER TABLE [dbo].[contactgroupmembers] ADD CONSTRAINT [FK_contactgroupmembers_contactgroup_id]\r
+    FOREIGN KEY ([contactgroup_id]) REFERENCES [dbo].[contactgroups] ([contactgroup_id])\r
+    ON DELETE CASCADE ON UPDATE CASCADE\r
+GO\r
+\r
+CREATE TRIGGER [contact_delete_member] ON [dbo].[contacts]\r
+    AFTER DELETE AS\r
+    DELETE FROM [dbo].[contactgroupmembers]\r
+    WHERE [contact_id] IN (SELECT [contact_id] FROM deleted)\r
+GO\r
+\r
+ALTER TABLE [dbo].[contactgroups] ADD CONSTRAINT [FK_contactgroups_user_id]\r
+    FOREIGN KEY ([user_id]) REFERENCES [dbo].[users] ([user_id])\r
+    ON DELETE CASCADE ON UPDATE CASCADE\r
+GO\r
+\r
+-- Updates from version 0.4.2\r
+\r
+DROP INDEX [IX_users_username]\r
+GO\r
+CREATE UNIQUE INDEX [IX_users_username] ON [dbo].[users]([username],[mail_host]) ON [PRIMARY]\r
+GO\r
+ALTER TABLE [dbo].[contacts] ALTER COLUMN [email] [varchar] (255) COLLATE Latin1_General_CI_AI NOT NULL\r
+GO\r
+
index f8145471f4c3053eee40cf1b75e25ee0fb6510b0..6e2c2473104084ccdedb592414bd1943c737480a 100644 (file)
@@ -1,4 +1,4 @@
--- RoundCube Webmail initial database structure
+-- Roundcube Webmail initial database structure
 
 
 /*!40014  SET FOREIGN_KEY_CHECKS=0 */;
@@ -24,11 +24,11 @@ CREATE TABLE `users` (
  `mail_host` varchar(128) NOT NULL,
  `alias` varchar(128) NOT NULL,
  `created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
- `last_login` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+ `last_login` datetime DEFAULT NULL,
  `language` varchar(5),
  `preferences` text,
  PRIMARY KEY(`user_id`),
INDEX `username_index` (`username`),
UNIQUE `username` (`username`, `mail_host`),
  INDEX `alias_index` (`alias`)
 ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
 
@@ -52,14 +52,11 @@ CREATE TABLE `messages` (
  `headers` text NOT NULL,
  `structure` text,
  PRIMARY KEY(`message_id`),
+ CONSTRAINT `user_id_fk_messages` FOREIGN KEY (`user_id`)
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  INDEX `created_index` (`created`),
  INDEX `index_index` (`user_id`, `cache_key`, `idx`),
- UNIQUE `uniqueness` (`user_id`, `cache_key`, `uid`),
- CONSTRAINT `user_id_fk_messages` FOREIGN KEY (`user_id`)
-   REFERENCES `users`(`user_id`)
-   /*!40008
-     ON DELETE CASCADE
-     ON UPDATE CASCADE */
+ UNIQUE `uniqueness` (`user_id`, `cache_key`, `uid`)
 ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
 
 
@@ -72,13 +69,10 @@ CREATE TABLE `cache` (
  `data` longtext NOT NULL,
  `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY(`cache_id`),
- INDEX `created_index` (`created`),
- INDEX `user_cache_index` (`user_id`,`cache_key`),
  CONSTRAINT `user_id_fk_cache` FOREIGN KEY (`user_id`)
-   REFERENCES `users`(`user_id`)
-   /*!40008
-     ON DELETE CASCADE
-     ON UPDATE CASCADE */
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ INDEX `created_index` (`created`),
+ INDEX `user_cache_index` (`user_id`,`cache_key`)
 ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
 
 
@@ -88,26 +82,50 @@ CREATE TABLE `contacts` (
  `contact_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
  `del` tinyint(1) NOT NULL DEFAULT '0',
- `name` varchar(128) NOT NULL,
- `email` varchar(128) NOT NULL,
- `firstname` varchar(128) NOT NULL,
- `surname` varchar(128) NOT NULL,
+ `name` varchar(128) NOT NULL DEFAULT '',
+ `email` varchar(255) NOT NULL,
+ `firstname` varchar(128) NOT NULL DEFAULT '',
+ `surname` varchar(128) NOT NULL DEFAULT '',
  `vcard` text NULL,
  `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY(`contact_id`),
- INDEX `user_contacts_index` (`user_id`,`email`),
  CONSTRAINT `user_id_fk_contacts` FOREIGN KEY (`user_id`)
-   REFERENCES `users`(`user_id`)
-   /*!40008
-     ON DELETE CASCADE
-     ON UPDATE CASCADE */
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ INDEX `user_contacts_index` (`user_id`,`email`)
 ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
 
+-- Table structure for table `contactgroups`
+
+CREATE TABLE `contactgroups` (
+  `contactgroup_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+  `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+  `del` tinyint(1) NOT NULL DEFAULT '0',
+  `name` varchar(128) NOT NULL DEFAULT '',
+  PRIMARY KEY(`contactgroup_id`),
+  CONSTRAINT `user_id_fk_contactgroups` FOREIGN KEY (`user_id`)
+    REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  INDEX `contactgroups_user_index` (`user_id`,`del`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+CREATE TABLE `contactgroupmembers` (
+  `contactgroup_id` int(10) UNSIGNED NOT NULL,
+  `contact_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+  `created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+  PRIMARY KEY (`contactgroup_id`, `contact_id`),
+  CONSTRAINT `contactgroup_id_fk_contactgroups` FOREIGN KEY (`contactgroup_id`)
+    REFERENCES `contactgroups`(`contactgroup_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  CONSTRAINT `contact_id_fk_contacts` FOREIGN KEY (`contact_id`)
+    REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE ON UPDATE CASCADE
+) /*!40000 ENGINE=INNODB */;
+
 
 -- Table structure for table `identities`
 
 CREATE TABLE `identities` (
  `identity_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+ `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+ `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
  `del` tinyint(1) NOT NULL DEFAULT '0',
  `standard` tinyint(1) NOT NULL DEFAULT '0',
  `name` varchar(128) NOT NULL,
@@ -117,13 +135,10 @@ CREATE TABLE `identities` (
  `bcc` varchar(128) NOT NULL DEFAULT '',
  `signature` text,
  `html_signature` tinyint(1) NOT NULL DEFAULT '0',
- `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY(`identity_id`),
  CONSTRAINT `user_id_fk_identities` FOREIGN KEY (`user_id`)
-   REFERENCES `users`(`user_id`)
-   /*!40008
-     ON DELETE CASCADE
-     ON UPDATE CASCADE */
+   REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ INDEX `user_identities_index` (`user_id`, `del`)
 ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
 
 
index 77bf317e941e3df37143f3fee7a6cd6d98217028..2af0a47e6f5ca58806fb1bbed8da6f1c01344101 100644 (file)
@@ -1,5 +1,6 @@
--- RoundCube Webmail update script for MySQL databases
--- Updates from version 0.1-stable to 0.3.1
+-- Roundcube Webmail update script for MySQL databases
+
+-- Updates from version 0.1-stable
 
 TRUNCATE TABLE `messages`;
 
@@ -31,11 +32,11 @@ ALTER TABLE `identities`
 ALTER TABLE `messages`
     ADD INDEX `created_index` (`created`);
 
--- Updates from version 0.2-beta (InnoDB only)
+-- Updates from version 0.2-beta (InnoDB required)
 
 ALTER TABLE `cache`
     DROP `session_id`;
-    
+
 ALTER TABLE `session`
     ADD INDEX `changed_index` (`changed`);
 
@@ -45,15 +46,88 @@ ALTER TABLE `cache`
 ALTER TABLE `users`
     CHANGE `language` `language` varchar(5);
 
+ALTER TABLE `cache` ENGINE=InnoDB;
+ALTER TABLE `session` ENGINE=InnoDB;
+ALTER TABLE `messages` ENGINE=InnoDB;
+ALTER TABLE `users` ENGINE=InnoDB;
+ALTER TABLE `contacts` ENGINE=InnoDB;
+ALTER TABLE `identities` ENGINE=InnoDB;
+
 -- Updates from version 0.3-stable
 
+TRUNCATE `messages`;
+
 ALTER TABLE `messages`
     ADD INDEX `index_index` (`user_id`, `cache_key`, `idx`);
 
-TRUNCATE `messages`;
-
 ALTER TABLE `session` 
     CHANGE `vars` `vars` MEDIUMTEXT NOT NULL;
 
 ALTER TABLE `contacts`
     ADD INDEX `user_contacts_index` (`user_id`,`email`);
+
+-- Updates from version 0.3.1
+-- WARNING: Make sure that all tables are using InnoDB engine!!!
+--          If not, use: ALTER TABLE xxx ENGINE=InnoDB;
+
+/* MySQL bug workaround: http://bugs.mysql.com/bug.php?id=46293 */
+/*!40014 SET FOREIGN_KEY_CHECKS=0 */;
+
+ALTER TABLE `messages` DROP FOREIGN KEY `user_id_fk_messages`;
+ALTER TABLE `cache` DROP FOREIGN KEY `user_id_fk_cache`;
+ALTER TABLE `contacts` DROP FOREIGN KEY `user_id_fk_contacts`;
+ALTER TABLE `identities` DROP FOREIGN KEY `user_id_fk_identities`;
+
+ALTER TABLE `messages` ADD CONSTRAINT `user_id_fk_messages` FOREIGN KEY (`user_id`)
+ REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
+ALTER TABLE `cache` ADD CONSTRAINT `user_id_fk_cache` FOREIGN KEY (`user_id`)
+ REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
+ALTER TABLE `contacts` ADD CONSTRAINT `user_id_fk_contacts` FOREIGN KEY (`user_id`)
+ REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
+ALTER TABLE `identities` ADD CONSTRAINT `user_id_fk_identities` FOREIGN KEY (`user_id`)
+ REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+ALTER TABLE `contacts` ALTER `name` SET DEFAULT '';
+ALTER TABLE `contacts` ALTER `firstname` SET DEFAULT '';
+ALTER TABLE `contacts` ALTER `surname` SET DEFAULT '';
+
+ALTER TABLE `identities` ADD INDEX `user_identities_index` (`user_id`, `del`);
+ALTER TABLE `identities` ADD `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00' AFTER `user_id`;
+
+CREATE TABLE `contactgroups` (
+  `contactgroup_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+  `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+  `del` tinyint(1) NOT NULL DEFAULT '0',
+  `name` varchar(128) NOT NULL DEFAULT '',
+  PRIMARY KEY(`contactgroup_id`),
+  CONSTRAINT `user_id_fk_contactgroups` FOREIGN KEY (`user_id`)
+    REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  INDEX `contactgroups_user_index` (`user_id`,`del`)
+) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
+
+CREATE TABLE `contactgroupmembers` (
+  `contactgroup_id` int(10) UNSIGNED NOT NULL,
+  `contact_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
+  `created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
+  PRIMARY KEY (`contactgroup_id`, `contact_id`),
+  CONSTRAINT `contactgroup_id_fk_contactgroups` FOREIGN KEY (`contactgroup_id`)
+    REFERENCES `contactgroups`(`contactgroup_id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  CONSTRAINT `contact_id_fk_contacts` FOREIGN KEY (`contact_id`)
+    REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE ON UPDATE CASCADE
+) /*!40000 ENGINE=INNODB */;
+
+/*!40014 SET FOREIGN_KEY_CHECKS=1 */;
+
+-- Updates from version 0.4-beta
+
+ALTER TABLE `users` CHANGE `last_login` `last_login` datetime DEFAULT NULL;
+UPDATE `users` SET `last_login` = NULL WHERE `last_login` = '1000-01-01 00:00:00';
+
+-- Updates from version 0.4.2
+
+ALTER TABLE `users` DROP INDEX `username_index`;
+ALTER TABLE `users` ADD UNIQUE `username` (`username`, `mail_host`);
+
+ALTER TABLE `contacts` MODIFY `email` varchar(255) NOT NULL;
+
index a52a01f91201c0c407864d9d47376186faa58761..089cae036c584eee08caaaab8e21144e5838800b 100644 (file)
@@ -1,4 +1,4 @@
--- RoundCube Webmail initial database structure
+-- Roundcube Webmail initial database structure
 
 --
 -- Sequence "user_ids"
@@ -18,16 +18,16 @@ CREATE SEQUENCE user_ids
 
 CREATE TABLE users (
     user_id integer DEFAULT nextval('user_ids'::text) PRIMARY KEY,
-    username character varying(128) DEFAULT ''::character varying NOT NULL,
-    mail_host character varying(128) DEFAULT ''::character varying NOT NULL,
-    alias character varying(128) DEFAULT ''::character varying NOT NULL,
+    username varchar(128) DEFAULT '' NOT NULL,
+    mail_host varchar(128) DEFAULT '' NOT NULL,
+    alias varchar(128) DEFAULT '' NOT NULL,
     created timestamp with time zone DEFAULT now() NOT NULL,
-    last_login timestamp with time zone DEFAULT now() NOT NULL,
-    "language" character varying(5),
-    preferences text DEFAULT ''::text NOT NULL
+    last_login timestamp with time zone DEFAULT NULL,
+    "language" varchar(5),
+    preferences text DEFAULT ''::text NOT NULL,
+    UNIQUE (username, mail_host)
 );
 
-CREATE INDEX users_username_id_idx ON users (username);
 CREATE INDEX users_alias_id_idx ON users (alias);
 
   
@@ -37,10 +37,10 @@ CREATE INDEX users_alias_id_idx ON users (alias);
 --
 
 CREATE TABLE "session" (
-    sess_id character varying(40) DEFAULT ''::character varying PRIMARY KEY,
+    sess_id varchar(40) DEFAULT '' PRIMARY KEY,
     created timestamp with time zone DEFAULT now() NOT NULL,
     changed timestamp with time zone DEFAULT now() NOT NULL,
-    ip character varying(41) NOT NULL,
+    ip varchar(41) NOT NULL,
     vars text NOT NULL
 );
 
@@ -66,19 +66,21 @@ CREATE SEQUENCE identity_ids
 
 CREATE TABLE identities (
     identity_id integer DEFAULT nextval('identity_ids'::text) PRIMARY KEY,
-    user_id integer NOT NULL REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    user_id integer NOT NULL
+       REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    changed timestamp with time zone DEFAULT now() NOT NULL,
     del smallint DEFAULT 0 NOT NULL,
     standard smallint DEFAULT 0 NOT NULL,
-    name character varying(128) NOT NULL,
-    organization character varying(128),
-    email character varying(128) NOT NULL,
-    "reply-to" character varying(128),
-    bcc character varying(128),
+    name varchar(128) NOT NULL,
+    organization varchar(128),
+    email varchar(128) NOT NULL,
+    "reply-to" varchar(128),
+    bcc varchar(128),
     signature text,
     html_signature integer DEFAULT 0 NOT NULL
 );
 
-CREATE INDEX identities_user_id_idx ON identities (user_id);
+CREATE INDEX identities_user_id_idx ON identities (user_id, del);
 
 
 --
@@ -100,18 +102,60 @@ CREATE SEQUENCE contact_ids
 
 CREATE TABLE contacts (
     contact_id integer DEFAULT nextval('contact_ids'::text) PRIMARY KEY,
-    user_id integer NOT NULL REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    user_id integer NOT NULL
+       REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
     changed timestamp with time zone DEFAULT now() NOT NULL,
     del smallint DEFAULT 0 NOT NULL,
-    name character varying(128) DEFAULT ''::character varying NOT NULL,
-    email character varying(128) DEFAULT ''::character varying NOT NULL,
-    firstname character varying(128) DEFAULT ''::character varying NOT NULL,
-    surname character varying(128) DEFAULT ''::character varying NOT NULL,
+    name varchar(128) DEFAULT '' NOT NULL,
+    email varchar(255) DEFAULT '' NOT NULL,
+    firstname varchar(128) DEFAULT '' NOT NULL,
+    surname varchar(128) DEFAULT '' NOT NULL,
     vcard text
 );
 
 CREATE INDEX contacts_user_id_idx ON contacts (user_id, email);
 
+--
+-- Sequence "contactgroups_ids"
+-- Name: contactgroups_ids; Type: SEQUENCE; Schema: public; Owner: postgres
+--
+
+CREATE SEQUENCE contactgroups_ids
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+
+--
+-- Table "contactgroups"
+-- Name: contactgroups; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE contactgroups (
+    contactgroup_id integer DEFAULT nextval('contactgroups_ids'::text) PRIMARY KEY,
+    user_id integer NOT NULL
+        REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    changed timestamp with time zone DEFAULT now() NOT NULL,
+    del smallint NOT NULL DEFAULT 0,
+    name varchar(128) NOT NULL DEFAULT ''
+);
+
+CREATE INDEX contactgroups_user_id_idx ON contactgroups (user_id, del);
+
+--
+-- Table "contactgroupmembers"
+-- Name: contactgroupmembers; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE contactgroupmembers (
+    contactgroup_id integer NOT NULL
+        REFERENCES contactgroups(contactgroup_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    contact_id integer NOT NULL
+        REFERENCES contacts(contact_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    created timestamp with time zone DEFAULT now() NOT NULL,
+    PRIMARY KEY (contactgroup_id, contact_id)
+);
+
 --
 -- Sequence "cache_ids"
 -- Name: cache_ids; Type: SEQUENCE; Schema: public; Owner: postgres
@@ -130,8 +174,9 @@ CREATE SEQUENCE cache_ids
 
 CREATE TABLE "cache" (
     cache_id integer DEFAULT nextval('cache_ids'::text) PRIMARY KEY,
-    user_id integer NOT NULL REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
-    cache_key character varying(128) DEFAULT ''::character varying NOT NULL,
+    user_id integer NOT NULL
+       REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    cache_key varchar(128) DEFAULT '' NOT NULL,
     created timestamp with time zone DEFAULT now() NOT NULL,
     data text NOT NULL
 );
@@ -157,22 +202,23 @@ CREATE SEQUENCE message_ids
 
 CREATE TABLE messages (
     message_id integer DEFAULT nextval('message_ids'::text) PRIMARY KEY,
-    user_id integer NOT NULL REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    user_id integer NOT NULL
+       REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE,
     del smallint DEFAULT 0 NOT NULL,
-    cache_key character varying(128) DEFAULT ''::character varying NOT NULL,
+    cache_key varchar(128) DEFAULT '' NOT NULL,
     created timestamp with time zone DEFAULT now() NOT NULL,
     idx integer DEFAULT 0 NOT NULL,
     uid integer DEFAULT 0 NOT NULL,
-    subject character varying(128) DEFAULT ''::character varying NOT NULL,
-    "from" character varying(128) DEFAULT ''::character varying NOT NULL,
-    "to" character varying(128) DEFAULT ''::character varying NOT NULL,
-    cc character varying(128) DEFAULT ''::character varying NOT NULL,
+    subject varchar(128) DEFAULT '' NOT NULL,
+    "from" varchar(128) DEFAULT '' NOT NULL,
+    "to" varchar(128) DEFAULT '' NOT NULL,
+    cc varchar(128) DEFAULT '' NOT NULL,
     date timestamp with time zone NOT NULL,
     size integer DEFAULT 0 NOT NULL,
     headers text NOT NULL,
-    structure text
+    structure text,
+    UNIQUE (user_id, cache_key, uid)
 );
 
-ALTER TABLE messages ADD UNIQUE (user_id, cache_key, uid);
 CREATE INDEX messages_index_idx ON messages (user_id, cache_key, idx);
 CREATE INDEX messages_created_idx ON messages (created);
index e343dd440d34bf47c7bc76b2bea13ca2942d8845..444caf6f6ca47cf6e9948c499b9c6c2d29a6c374 100644 (file)
@@ -1,4 +1,4 @@
--- RoundCube Webmail update script for Postgres databases
+-- Roundcube Webmail update script for Postgres databases
 -- Updates from version 0.1-stable to 0.1.1
 
 CREATE INDEX cache_user_id_idx ON cache (user_id, cache_key);
@@ -39,7 +39,52 @@ ALTER TABLE messages ALTER del TYPE smallint;
 
 -- Updates from version 0.3-stable
 
-CREATE INDEX messages_index_idx ON messages (user_id, cache_key, idx);
 TRUNCATE messages;
+CREATE INDEX messages_index_idx ON messages (user_id, cache_key, idx);
 DROP INDEX contacts_user_id_idx;
 CREATE INDEX contacts_user_id_idx ON contacts (user_id, email);
+
+-- Updates from version 0.3.1
+
+DROP INDEX identities_user_id_idx;
+CREATE INDEX identities_user_id_idx ON identities (user_id, del);
+
+ALTER TABLE identities ADD changed timestamp with time zone DEFAULT now() NOT NULL;
+
+CREATE SEQUENCE contactgroups_ids
+    INCREMENT BY 1
+    NO MAXVALUE
+    NO MINVALUE
+    CACHE 1;
+
+CREATE TABLE contactgroups (
+    contactgroup_id integer DEFAULT nextval('contactgroups_ids'::text) PRIMARY KEY,
+    user_id    integer         NOT NULL
+        REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    changed    timestamp with time zone DEFAULT now() NOT NULL,
+    del        smallint        NOT NULL DEFAULT 0,
+    name       varchar(128)    NOT NULL DEFAULT ''
+);
+
+CREATE INDEX contactgroups_user_id_idx ON contactgroups (user_id, del);
+
+CREATE TABLE contactgroupmembers (
+    contactgroup_id    integer NOT NULL
+       REFERENCES contactgroups(contactgroup_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    contact_id                 integer NOT NULL
+       REFERENCES contacts(contact_id) ON DELETE CASCADE ON UPDATE CASCADE,
+    created timestamp with time zone DEFAULT now() NOT NULL,
+    PRIMARY KEY (contactgroup_id, contact_id)
+);
+
+-- Updates from version 0.4-beta
+
+ALTER TABLE users ALTER last_login DROP NOT NULL;
+ALTER TABLE users ALTER last_login SET DEFAULT NULL;
+
+-- Updates from version 0.4.2
+
+DROP INDEX users_username_id_idx;
+ALTER TABLE users ADD UNIQUE (username, mail_host);
+ALTER TABLE contacts ALTER email TYPE varchar(255);
+
index cccad7a20589b241400d0ab51d79712ccacaba86..875b3cba02a2ee7cf0786bc172bcf1a9a5240ef6 100644 (file)
@@ -1,4 +1,4 @@
--- RoundCube Webmail initial database structure
+-- Roundcube Webmail initial database structure
 
 -- 
 -- Table structure for table `cache`
@@ -19,7 +19,7 @@ CREATE INDEX ix_cache_created ON cache(created);
 -- --------------------------------------------------------
 
 -- 
--- Table structure for table contacts
+-- Table structure for table contacts and related
 -- 
 
 CREATE TABLE contacts (
@@ -28,7 +28,7 @@ CREATE TABLE contacts (
   changed datetime NOT NULL default '0000-00-00 00:00:00',
   del tinyint NOT NULL default '0',
   name varchar(128) NOT NULL default '',
-  email varchar(128) NOT NULL default '',
+  email varchar(255) NOT NULL default '',
   firstname varchar(128) NOT NULL default '',
   surname varchar(128) NOT NULL default '',
   vcard text NOT NULL default ''
@@ -36,6 +36,26 @@ CREATE TABLE contacts (
 
 CREATE INDEX ix_contacts_user_id ON contacts(user_id, email);
 
+
+CREATE TABLE contactgroups (
+  contactgroup_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL default '0',
+  changed datetime NOT NULL default '0000-00-00 00:00:00',
+  del tinyint NOT NULL default '0',
+  name varchar(128) NOT NULL default ''
+);
+
+CREATE INDEX ix_contactgroups_user_id ON contactgroups(user_id, del);
+
+
+CREATE TABLE contactgroupmembers (
+  contactgroup_id integer NOT NULL,
+  contact_id integer NOT NULL default '0',
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  PRIMARY KEY (contactgroup_id, contact_id)
+);
+
+
 -- --------------------------------------------------------
 
 -- 
@@ -45,6 +65,7 @@ CREATE INDEX ix_contacts_user_id ON contacts(user_id, email);
 CREATE TABLE identities (
   identity_id integer NOT NULL PRIMARY KEY,
   user_id integer NOT NULL default '0',
+  changed datetime NOT NULL default '0000-00-00 00:00:00',
   del tinyint NOT NULL default '0',
   standard tinyint NOT NULL default '0',
   name varchar(128) NOT NULL default '',
@@ -56,7 +77,7 @@ CREATE TABLE identities (
   html_signature tinyint NOT NULL default '0'
 );
 
-CREATE INDEX ix_identities_user_id ON identities(user_id);
+CREATE INDEX ix_identities_user_id ON identities(user_id, del);
 
 
 -- --------------------------------------------------------
@@ -71,12 +92,12 @@ CREATE TABLE users (
   mail_host varchar(128) NOT NULL default '',
   alias varchar(128) NOT NULL default '',
   created datetime NOT NULL default '0000-00-00 00:00:00',
-  last_login datetime NOT NULL default '0000-00-00 00:00:00',
+  last_login datetime DEFAULT NULL,
   language varchar(5),
   preferences text NOT NULL default ''
 );
 
-CREATE INDEX ix_users_username ON users(username);
+CREATE UNIQUE INDEX ix_users_username ON users(username, mail_host);
 CREATE INDEX ix_users_alias ON users(alias);
 
 -- --------------------------------------------------------
index 09af76fae5cda782ab39ee88b87cd8164a062513..32869394489b3b7f54c44cb26c8affdb7a4ffc67 100644 (file)
@@ -1,4 +1,4 @@
--- RoundCube Webmail update script for SQLite databases
+-- Roundcube Webmail update script for SQLite databases
 -- Updates from version 0.1-stable to 0.1.1
 
 DROP TABLE messages;
@@ -22,7 +22,6 @@ CREATE TABLE messages (
 );
 
 CREATE INDEX ix_messages_user_cache_uid ON messages(user_id,cache_key,uid);
-
 CREATE INDEX ix_users_username ON users(username);
 CREATE INDEX ix_users_alias ON users(alias);
 
@@ -37,9 +36,147 @@ CREATE INDEX ix_cache_created ON cache (created);
 
 -- Updates from version 0.3-stable
 
+DELETE FROM messages;
 DROP INDEX ix_messages_user_cache_uid;
 CREATE UNIQUE INDEX ix_messages_user_cache_uid ON messages (user_id,cache_key,uid);
 CREATE INDEX ix_messages_index ON messages (user_id,cache_key,idx);
-TRUNCATE messages;
 DROP INDEX ix_contacts_user_id;
 CREATE INDEX ix_contacts_user_id ON contacts(user_id, email);
+
+-- Updates from version 0.3.1
+
+-- ALTER TABLE identities ADD COLUMN changed datetime NOT NULL default '0000-00-00 00:00:00'; --
+
+CREATE TABLE temp_identities (
+  identity_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL default '0',
+  standard tinyint NOT NULL default '0',
+  name varchar(128) NOT NULL default '',
+  organization varchar(128) default '',
+  email varchar(128) NOT NULL default '',
+  "reply-to" varchar(128) NOT NULL default '',
+  bcc varchar(128) NOT NULL default '',
+  signature text NOT NULL default '',
+  html_signature tinyint NOT NULL default '0'
+);
+INSERT INTO temp_identities (identity_id, user_id, standard, name, organization, email, "reply-to", bcc, signature, html_signature)
+  SELECT identity_id, user_id, standard, name, organization, email, "reply-to", bcc, signature, html_signature
+  FROM identities WHERE del=0;
+
+DROP INDEX ix_identities_user_id;
+DROP TABLE identities;
+
+CREATE TABLE identities (
+  identity_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL default '0',
+  changed datetime NOT NULL default '0000-00-00 00:00:00',
+  del tinyint NOT NULL default '0',
+  standard tinyint NOT NULL default '0',
+  name varchar(128) NOT NULL default '',
+  organization varchar(128) default '',
+  email varchar(128) NOT NULL default '',
+  "reply-to" varchar(128) NOT NULL default '',
+  bcc varchar(128) NOT NULL default '',
+  signature text NOT NULL default '',
+  html_signature tinyint NOT NULL default '0'
+);
+CREATE INDEX ix_identities_user_id ON identities(user_id, del);
+
+INSERT INTO identities (identity_id, user_id, standard, name, organization, email, "reply-to", bcc, signature, html_signature)
+  SELECT identity_id, user_id, standard, name, organization, email, "reply-to", bcc, signature, html_signature
+  FROM temp_identities;
+
+DROP TABLE temp_identities;
+
+CREATE TABLE contactgroups (
+  contactgroup_id integer NOT NULL PRIMARY KEY,
+  user_id integer NOT NULL default '0',
+  changed datetime NOT NULL default '0000-00-00 00:00:00',
+  del tinyint NOT NULL default '0',
+  name varchar(128) NOT NULL default ''
+);
+
+CREATE INDEX ix_contactgroups_user_id ON contactgroups(user_id, del);
+
+CREATE TABLE contactgroupmembers (
+  contactgroup_id integer NOT NULL,
+  contact_id integer NOT NULL default '0',
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  PRIMARY KEY (contactgroup_id, contact_id)
+);
+
+-- Updates from version 0.3.1
+
+CREATE TABLE tmp_users (
+  user_id integer NOT NULL PRIMARY KEY,
+  username varchar(128) NOT NULL default '',
+  mail_host varchar(128) NOT NULL default '',
+  alias varchar(128) NOT NULL default '',
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  last_login datetime NOT NULL default '0000-00-00 00:00:00',
+  language varchar(5),
+  preferences text NOT NULL default ''
+);
+
+INSERT INTO tmp_users (user_id, username, mail_host, alias, created, last_login, language, preferences)
+    SELECT user_id, username, mail_host, alias, created, last_login, language, preferences FROM users;
+
+DROP TABLE users;
+
+CREATE TABLE users (
+  user_id integer NOT NULL PRIMARY KEY,
+  username varchar(128) NOT NULL default '',
+  mail_host varchar(128) NOT NULL default '',
+  alias varchar(128) NOT NULL default '',
+  created datetime NOT NULL default '0000-00-00 00:00:00',
+  last_login datetime DEFAULT NULL,
+  language varchar(5),
+  preferences text NOT NULL default ''
+);
+
+INSERT INTO users (user_id, username, mail_host, alias, created, last_login, language, preferences)
+    SELECT user_id, username, mail_host, alias, created, last_login, language, preferences FROM tmp_users;
+
+CREATE INDEX ix_users_username ON users(username);
+CREATE INDEX ix_users_alias ON users(alias);
+DROP TABLE tmp_users;
+
+-- Updates from version 0.4.2
+
+DROP INDEX ix_users_username;
+CREATE UNIQUE INDEX ix_users_username ON users(username, mail_host);
+
+CREATE TABLE contacts_tmp (
+    contact_id integer NOT NULL PRIMARY KEY,
+    user_id integer NOT NULL default '0',
+    changed datetime NOT NULL default '0000-00-00 00:00:00',
+    del tinyint NOT NULL default '0',
+    name varchar(128) NOT NULL default '',
+    email varchar(255) NOT NULL default '',
+    firstname varchar(128) NOT NULL default '',
+    surname varchar(128) NOT NULL default '',
+    vcard text NOT NULL default ''
+);
+
+INSERT INTO contacts_tmp (contact_id, user_id, changed, del, name, email, firstname, surname, vcard)
+    SELECT contact_id, user_id, changed, del, name, email, firstname, surname, vcard FROM contacts;
+
+DROP TABLE contacts;
+CREATE TABLE contacts (
+    contact_id integer NOT NULL PRIMARY KEY,
+    user_id integer NOT NULL default '0',
+    changed datetime NOT NULL default '0000-00-00 00:00:00',
+    del tinyint NOT NULL default '0',
+    name varchar(128) NOT NULL default '',
+    email varchar(255) NOT NULL default '',
+    firstname varchar(128) NOT NULL default '',
+    surname varchar(128) NOT NULL default '',
+    vcard text NOT NULL default ''
+);
+
+INSERT INTO contacts (contact_id, user_id, changed, del, name, email, firstname, surname, vcard)
+    SELECT contact_id, user_id, changed, del, name, email, firstname, surname, vcard FROM contacts_tmp;
+
+CREATE INDEX ix_contacts_user_id ON contacts(user_id, email);
+DROP TABLE contacts_tmp;
+
index 6362e0ca54678ad90b434f5cfc7cf6d7fe334eaf..329983d377e54aa36cef364323cf4ba0113c01a6 100644 (file)
--- a/UPGRADING
+++ b/UPGRADING
@@ -1,12 +1,9 @@
 UPGRADING instructions
 ======================
 
-First you should remove all subfolders from /program/localization/
-because most language codes have changed in 0.2-alpha. This way you
-can make sure that no old localization files remain on your disk.
-
-Then follow these instructions if upgrading from a previous version
-of RoundCube Webmail.
+Follow these instructions if upgrading from a previous version
+of Roundcube Webmail. We recommend to carefully backup the existing
+installation as well as the database before executig the following steps.
 
 1. Replace index.php and all files in
    - ./bin/
@@ -16,8 +13,8 @@ of RoundCube Webmail.
    - ./skins/default/
    - ./plugins/
 2. Run ./bin/update.sh from the commandline OR
-   open http://url-to-roundcube/installer/ in a browser. To enable
-   the latter one, you have to temporary set 'enable_installer' to true
+   open http://url-to-roundcube/installer/ in a browser and choose "3 Test config".
+   To enable the latter one, you have to temporary set 'enable_installer' to true
    in your local config/main.inc.php file.
 3. Let the update script/installer check your configuration and
    update your config files as suggested by the updater.
@@ -28,100 +25,3 @@ of RoundCube Webmail.
 6. Check .htaccess settings (some php settings could become required)
 
 
-For manually upgrading your RoundCube installation follow the instructions
-that match the currently installed version:
-
-from version 0.2-alpha
-----------------------------------------
-* replace index.php
-* replace all files in folder /bin/
-* replace all files in folder /program/
-* replace all files in folder /installer/
-* replace all files in folder /skins/default/
-* run all commands in SQL/[yourdbtype].update.sql
-  below the line "-- Updates from version 0.2-alpha"
-* check the config/main.inc.php.dist for new configuration 
-  options and add them to your config 
-  WARNING: 'skin_path' option was replaced by 'skin' option
-* WARNING: 'db_backend' option has been removed, now only
-  PEAR::MDB2 driver is supported
-
-
-from version 0.1.1
-----------------------------------------
-* replace index.php
-* replace all files in folder /bin/
-* replace all files in folder /program/
-* replace all files in folder /skins/default/
-* run all commands in SQL/[yourdbtype].update.sql
-  below the line "-- Updates from version 0.1.1"
-* check the config/main.inc.php.dist for new configuration 
-  options and add them to your config 
-
-
-from version 0.1-stable
-----------------------------------------
-* replace index.php
-* replace all files in folder /bin/
-* replace all files in folder /program/
-* replace all files in folder /skins/default/
-* run all commands in SQL/[yourdbtype].update.sql
-* check the config/main.inc.php.dist for new configuration options
-  and add them to your config 
-
-
-from version 0.1-rc2
-----------------------------------------
-* replace index.php
-* replace all files in folder /bin/
-* replace all files in folder /program/
-* replace all files in folder /skins/default/
-* run all commands in SQL/[yourdbtype].update.sql
-
-
-from version 0.1-rc1
-----------------------------------------
-* replace index.php
-* replace all files in folder /bin/
-* replace all files in folder /program/
-* replace all files in folder /skins/default/
-* If you have LDAP servers configured you should re-configure
-  the config entries using the template given in /config/main.inc.php.dist
-
-
-from version 0.1-beta2
-----------------------------------------
-* replace index.php
-* replace all files in folder /bin/
-* replace all files in folder /program/
-* replace all files in folder /skins/default/
-* run all commands in SQL/[yourdbtype].update.sql or
-  re-initalize the database with [yourdbtype].initial.sql
-* add these lines to /config/main.inc.php
-   $rcmail_config['draft_autosave'] = 300;
-   $rcmail_config['date_today'] = 'H:i';
-* If you have LDAP servers configured you should re-configure
-  the config entries using the template given in /config/main.inc.php.dist
-
-
-form version 0.1-beta
-----------------------------------------
-* replace index.php
-* replace all files in folder /bin/
-* replace all files in folder /program/
-* replace all files in folder /skins/default/
-* run all commands in SQL/[yourdbtype].update.sql or
-  re-initalize the database with [yourdbtype].initial.sql
-* add this line to /config/db.inc.php
-   $rcmail_config['db_persistent'] = false;
-* add these lines to /config/main.inc.php
-   $rcmail_config['drafts_mbox'] = 'Drafts';
-   $rcmail_config['junk_mbox'] = 'Junk';
-   $rcmail_config['product_name'] = 'RoundCube Webmail';
-   $rcmail_config['read_when_deleted'] = false;
-   $rcmail_config['enable_spellcheck'] = false;
-   $rcmail_config['protect_default_folders'] = false;
-* replace the following line from /config/main.inc.php
-   @include($_SERVER['HTTP_HOST'].'.inc.php');
-  with 
-   $rcmail_config['include_host_config'] = false;
diff --git a/bin/cleandb.sh b/bin/cleandb.sh
new file mode 100755 (executable)
index 0000000..4d699cc
--- /dev/null
@@ -0,0 +1,81 @@
+#!/usr/bin/env php
+<?php
+/*
+
+ +-----------------------------------------------------------------------+
+ | bin/cleandb.sh                                                        |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2010, Roundcube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Finally remove all db records marked as deleted some time ago       |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: cleandb.sh 4164 2010-10-31 10:38:16Z thomasb $
+
+*/
+
+if (php_sapi_name() != 'cli') {
+    die('Not on the "shell" (php-cli).');
+}
+
+define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
+require INSTALL_PATH.'program/include/iniset.php';
+
+// mapping for table name => primary key
+$primary_keys = array(
+    'contacts' => "contact_id",
+    'contactgroups' => "contactgroup_id",
+);
+
+// connect to DB
+$RCMAIL = rcmail::get_instance();
+$db = $RCMAIL->get_dbh();
+$db->db_connect('w');
+
+if (!$db->is_connected() || $db->is_error())
+    die("No DB connection\n");
+
+if (!empty($_SERVER['argv'][1]))
+    $days = intval($_SERVER['argv'][1]);
+else
+    $days = 7;
+
+// remove all deleted records older than two days
+$threshold = date('Y-m-d 00:00:00', time() - $days * 86400);
+
+foreach (array('contacts','contactgroups','identities') as $table) {
+
+    $sqltable = get_table_name($table);
+
+    // also delete linked records
+    // could be skipped for databases which respect foreign key constraints
+    if ($db->db_provider == 'sqlite'
+        && ($table == 'contacts' || $table == 'contactgroups')
+    ) {
+        $pk = $primary_keys[$table];
+        $memberstable = get_table_name('contactgroupmembers');
+
+        $db->query(
+            "DELETE FROM $memberstable".
+            " WHERE $pk IN (".
+                "SELECT $pk FROM $sqltable".
+                " WHERE del=1 AND changed < ?".
+            ")",
+            $threshold);
+
+        echo $db->affected_rows() . " records deleted from '$memberstable'\n";
+    }
+
+    // delete outdated records
+    $db->query("DELETE FROM $sqltable WHERE del=1 AND changed < ?", $threshold);
+
+    echo $db->affected_rows() . " records deleted from '$table'\n";
+}
+
+?>
diff --git a/bin/decrypt.php b/bin/decrypt.php
deleted file mode 100644 (file)
index 7ef5a47..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env php
-<?php
-/*
-
- +-----------------------------------------------------------------------+
- | bin/decrypt.php                                                       |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Decrypt the encrypted parts of the HTTP Received: headers           |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Tomas Tevesz <ice@extreme.hu>                                 |
- +-----------------------------------------------------------------------+
-
- $Id$
-*/
-
-/*-
- * If http_received_header_encrypt is configured, the IP address and the
- * host name of the added Received: header is encrypted with 3DES, to
- * protect information that some could consider sensitve, yet their
- * availability is a must in some circumstances.
- *
- * Such an encrypted Received: header might look like:
- *
- * Received: from DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ==
- *     [my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4]
- *     with HTTP/1.1 (POST); Thu, 14 May 2009 19:17:28 +0200
- *
- * In this example, the two encrypted components are the sender host name
- * (DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ==) and the IP
- * address (my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4).
- *
- * Using this tool, they can be decrypted into plain text:
- *
- * $ bin/decrypt_received.php 'my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4' \
- * > 'DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ=='
- * 84.3.187.208
- * 5403BBD0.catv.pool.telekom.hu
- * $
- *
- * Thus it is known that this particular message was sent by 84.3.187.208,
- * having, at the time of sending, the name of 5403BBD0.catv.pool.telekom.hu.
- *
- * If (most likely binary) junk is shown, then
- *  - either the encryption password has, between the time the mail was sent
- *    and `now', changed, or
- *  - you are dealing with counterfeit header data.
- */
-
-if (php_sapi_name() != 'cli') {
-       die("Not on the 'shell' (php-cli).\n");
-}
-
-define('INSTALL_PATH', realpath(dirname(__FILE__).'/..') . '/');
-require INSTALL_PATH . 'program/include/iniset.php';
-
-if ($argc < 2) {
-       die("Usage: " . basename($argv[0]) . " encrypted-hdr-part [encrypted-hdr-part ...]\n");
-}
-
-$RCMAIL = rcmail::get_instance();
-
-for ($i = 1; $i < $argc; $i++) {
-       printf("%s\n", $RCMAIL->decrypt($argv[$i]));
-};
diff --git a/bin/decrypt.sh b/bin/decrypt.sh
new file mode 100755 (executable)
index 0000000..8d6ff5e
--- /dev/null
@@ -0,0 +1,70 @@
+#!/usr/bin/env php
+<?php
+/*
+
+ +-----------------------------------------------------------------------+
+ | bin/decrypt.sh                                                        |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Decrypt the encrypted parts of the HTTP Received: headers           |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Tomas Tevesz <ice@extreme.hu>                                 |
+ +-----------------------------------------------------------------------+
+
+ $Id: decrypt.sh 3989 2010-09-25 13:03:53Z alec $
+*/
+
+/*-
+ * If http_received_header_encrypt is configured, the IP address and the
+ * host name of the added Received: header is encrypted with 3DES, to
+ * protect information that some could consider sensitve, yet their
+ * availability is a must in some circumstances.
+ *
+ * Such an encrypted Received: header might look like:
+ *
+ * Received: from DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ==
+ *     [my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4]
+ *     with HTTP/1.1 (POST); Thu, 14 May 2009 19:17:28 +0200
+ *
+ * In this example, the two encrypted components are the sender host name
+ * (DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ==) and the IP
+ * address (my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4).
+ *
+ * Using this tool, they can be decrypted into plain text:
+ *
+ * $ bin/decrypt.sh 'my0nUbjZXKtl7KVBZcsvWOxxtyVFxza4' \
+ * > 'DzgkvJBO5+bw+oje5JACeNIa/uSI4mRw2cy5YoPBba73eyBmjtyHnQ=='
+ * 84.3.187.208
+ * 5403BBD0.catv.pool.telekom.hu
+ * $
+ *
+ * Thus it is known that this particular message was sent by 84.3.187.208,
+ * having, at the time of sending, the name of 5403BBD0.catv.pool.telekom.hu.
+ *
+ * If (most likely binary) junk is shown, then
+ *  - either the encryption password has, between the time the mail was sent
+ *    and `now', changed, or
+ *  - you are dealing with counterfeit header data.
+ */
+
+if (php_sapi_name() != 'cli') {
+       die("Not on the 'shell' (php-cli).\n");
+}
+
+define('INSTALL_PATH', realpath(dirname(__FILE__).'/..') . '/');
+require INSTALL_PATH . 'program/include/iniset.php';
+
+if ($argc < 2) {
+       die("Usage: " . basename($argv[0]) . " encrypted-hdr-part [encrypted-hdr-part ...]\n");
+}
+
+$RCMAIL = rcmail::get_instance();
+
+for ($i = 1; $i < $argc; $i++) {
+       printf("%s\n", $RCMAIL->decrypt($argv[$i]));
+};
diff --git a/bin/html2text.php b/bin/html2text.php
deleted file mode 100644 (file)
index 5b5c3c0..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-/*
-
- +-----------------------------------------------------------------------+
- | bin/html2text.php                                                     |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Convert HTML message to plain text                                  |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: html2text.php 2237 2009-01-17 01:55:39Z till $
-
-*/
-
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/');
-require INSTALL_PATH . 'program/include/iniset.php';
-
-$RCMAIL = rcmail::get_instance();
-
-if (!empty($RCMAIL->user->ID)) {
-  $converter = new html2text($HTTP_RAW_POST_DATA);
-
-  header('Content-Type: text/plain; charset=UTF-8');
-  print trim($converter->get_text());
-}
-else {
-  header("HTTP/1.0 403 Forbidden");
-  echo "Requires a valid user session";
-}
-
-?>
diff --git a/bin/jsshrink.sh b/bin/jsshrink.sh
new file mode 100755 (executable)
index 0000000..b85f517
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+JS_DIR=`dirname "$0"`/../program/js
+CLOSURE_COMPILER_URL='http://closure-compiler.googlecode.com/files/compiler-latest.zip'
+
+do_shrink() {
+       rm -f "$2"
+       java -jar compiler.jar --compilation_level=SIMPLE_OPTIMIZATIONS --js="$1" --js_output_file="$2"
+}
+
+if [ ! -d "$JS_DIR" ]; then
+       echo "Directory $JS_DIR not found."
+       exit 1
+fi
+
+if java -version >/dev/null 2>&1; then
+       :
+else
+       echo "Java not found. Please ensure that the 'java' program is in your PATH."
+       exit 1
+fi
+
+if [ ! -r "compiler.jar" ]; then
+       if which wget >/dev/null 2>&1 && which unzip >/dev/null 2>&1; then
+               wget "$CLOSURE_COMPILER_URL" -O "/tmp/$$.zip"
+       elif which curl >/dev/null 2>&1 && which unzip >/dev/null 2>&1; then
+               curl "$CLOSURE_COMPILER_URL" -o "/tmp/$$.zip"
+       else
+               echo "Please download $CLOSURE_COMPILER_URL and extract compiler.jar to this directory."
+               exit 1
+       fi
+       unzip "/tmp/$$.zip" "compiler.jar"
+       rm -f "/tmp/$$.zip"
+fi
+
+for fn in app common googiespell list; do
+       if [ -r "$JS_DIR/${fn}.js.src" ]; then
+               echo "$JS_DIR/${fn}.js.src already exists, not overwriting"
+       else
+               mv "$JS_DIR/${fn}.js" "$JS_DIR/${fn}.js.src"
+       fi
+       echo "Shrinking $JS_DIR/${fn}.js"
+       do_shrink "$JS_DIR/${fn}.js.src" "$JS_DIR/${fn}.js"
+done
+
+for fn in tiny_mce/tiny_mce; do
+       echo "Shrinking $JS_DIR/${fn}.js"
+       do_shrink "$JS_DIR/${fn}_src.js" "$JS_DIR/${fn}.js"
+done
diff --git a/bin/jsunshrink.sh b/bin/jsunshrink.sh
new file mode 100755 (executable)
index 0000000..90c3ea5
--- /dev/null
@@ -0,0 +1,24 @@
+#!/bin/sh
+JS_DIR=`dirname "$0"`/../program/js
+
+if [ ! -d "$JS_DIR" ]; then
+       echo "Directory $JS_DIR not found."
+       exit 1
+fi
+
+for fn in app common googiespell list; do
+       if [ -r "$JS_DIR/${fn}.js.src" ]; then
+               mv "$JS_DIR/${fn}.js.src" "$JS_DIR/${fn}.js"
+               echo "Reverted $JS_DIR/${fn}.js"
+       fi
+done
+
+for fn in tiny_mce/tiny_mce; do
+       if [ -d "$JS_DIR/.svn" ] && which svn >/dev/null 2>&1; then
+               rm -f "$JS_DIR/${fn}.js"
+               svn revert "$JS_DIR/${fn}.js"
+       else
+               cp "$JS_DIR/${fn}_src.js" "$JS_DIR/${fn}.js"
+               echo "Reverted $JS_DIR/${fn}.js"
+       fi
+done
diff --git a/bin/killcache.php b/bin/killcache.php
deleted file mode 100644 (file)
index cf2a648..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/*
-
- +-----------------------------------------------------------------------+
- | bin/killcache.php                                                     |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Delete rows from cache and messages tables                          |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Dennis P. Nikolaenko <dennis@nikolaenko.ru>                   |
- +-----------------------------------------------------------------------+
-
- $Id: killcache.php 2238 2009-01-17 03:27:41Z till $
-
-*/
-
-define('INSTALL_PATH', realpath(dirname(__FILE__).'/..') . '/');
-require INSTALL_PATH . 'program/include/iniset.php';
-
-$config = new rcube_config();
-
-// don't allow public access if not in devel_mode
-if (!$config->get('devel_mode') && $_SERVER['REMOTE_ADDR']) {
-    header("HTTP/1.0 401 Access denied");
-    die("Access denied!");
-}
-
-$options = array(
-    'use_transactions' => false,
-    'log_line_break' => "\n",
-    'idxname_format' => '%s',
-    'debug' => false,
-    'quote_identifier' => true,
-    'force_defaults' => false,
-    'portability' => true
-);
-
-$dbh = MDB2::factory($config->get('db_dsnw'), $options);
-if (PEAR::isError($dbh)) {
-    exit($mdb2->getMessage());
-}
-
-//TODO: transaction here (if supported by DB) would be a good thing
-$res =& $dbh->exec("DELETE FROM cache");
-if (PEAR::isError($res)) {
-    $dbh->disconnect();
-    exit($res->getMessage());
-}
-
-$res =& $dbh->exec("DELETE FROM messages");
-if (PEAR::isError($res)) {
-    $dbh->disconnect();
-    exit($res->getMessage());
-}
-
-echo "Cache cleared\n";
-
-$dbh->disconnect();
-
-?>
diff --git a/bin/modcss.php b/bin/modcss.php
deleted file mode 100644 (file)
index e6fb3f6..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | bin/modcss.php                                                        |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2007-2009, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Modify CSS source from a URL                                        |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: modcss.php 2853 2009-08-12 10:44:46Z thomasb $
-
-*/
-
-define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/');
-require INSTALL_PATH . 'program/include/iniset.php';
-
-$RCMAIL = rcmail::get_instance();
-
-$source = '';
-$error  = 'Requires a valid user session and source url';
-
-if (empty($RCMAIL->user->ID)) {
-    header('HTTP/1.1 403 Forbidden');
-    echo $error;
-    exit;
-}
-
-$url = preg_replace('![^a-z0-9:./\-_?$&=%]!i', '', $_GET['u']);
-if ($url === null) {
-    header('HTTP/1.1 403 Forbidden');
-    echo $error;
-    exit;
-}
-
-$a_uri = parse_url($url);
-$port  = $a_uri['port'] ? $a_uri['port'] : 80;
-$host  = $a_uri['host'];
-$path  = $a_uri['path'] . ($a_uri['query'] ? '?'.$a_uri['query'] : '');
-
-// don't allow any other connections than http(s)
-if (strtolower(substr($a_uri['scheme'], 0, 4)) != 'http') {
-    header('HTTP/1.1 403 Forbidden');
-    echo "Invalid URL";
-    exit;
-}
-
-// try to open socket connection
-if (!($fp = fsockopen($host, $port, $errno, $error, 15))) {
-    header('HTTP/1.1 500 Internal Server Error');
-    echo $error;
-    exit;
-}
-
-// set timeout for socket
-stream_set_timeout($fp, 30);
-
-// send request
-$out  = "GET $path HTTP/1.0\r\n";
-$out .= "Host: $host\r\n";
-$out .= "Connection: Close\r\n\r\n";
-fwrite($fp, $out);
-
-// read response
-$header = true;
-$headers = array();
-while (!feof($fp)) {
-    $line = trim(fgets($fp, 4048));
-
-    if ($header) {
-        if (preg_match('/^HTTP\/1\..\s+(\d+)/', $line, $regs)
-            && intval($regs[1]) != 200) {
-            break;
-        }
-        else if (empty($line)) {
-            $header = false;
-        }
-        else {
-            list($key, $value) = explode(': ', $line);
-            $headers[strtolower($key)] = $value;
-        }
-    }
-    else {
-        $source .= "$line\n";
-    }
-}
-fclose($fp);
-
-// check content-type header and mod styles
-$mimetype = strtolower($headers['content-type']);
-if (!empty($source) && in_array($mimetype, array('text/css','text/plain'))) {
-    header('Content-Type: text/css');
-    echo rcmail_mod_css_styles($source, preg_replace('/[^a-z0-9]/i', '', $_GET['c']));
-    exit;
-}
-else
-    $error = "Invalid response returned by server";
-
-header('HTTP/1.0 404 Not Found');
-echo $error;
-exit;
index 7dd56e9ea6220e3f4d230e0c410e16507b3d35e1..0aa33b5a85482f7710bc3732f76e276fa73f804f 100755 (executable)
@@ -1,45 +1,10 @@
 #!/usr/bin/env php
 <?php
-if (php_sapi_name() != 'cli') {
-    die('Not on the "shell" (php-cli).');
-}
 
 define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
 ini_set('memory_limit', -1);
 
-require_once INSTALL_PATH.'program/include/iniset.php';
-
-/**
- * Parse commandline arguments into a hash array
- */
-function get_opt($aliases=array())
-{
-       $args = array();
-       for ($i=1; $i<count($_SERVER['argv']); $i++)
-       {
-               $arg = $_SERVER['argv'][$i];
-               if (substr($arg, 0, 2) == '--')
-               {
-                       $sp = strpos($arg, '=');
-                       $key = substr($arg, 2, $sp - 2);
-                       $value = substr($arg, $sp+1);
-               }
-               else if ($arg{0} == '-')
-               {
-                       $key = substr($arg, 1);
-                       $value = $_SERVER['argv'][++$i];
-               }
-               else
-                       continue;
-
-               $args[$key] = preg_replace(array('/^["\']/', '/["\']$/'), '', $value);
-               
-               if ($alias = $aliases[$key])
-                       $args[$alias] = $args[$key];
-       }
-
-       return $args;
-}
+require_once INSTALL_PATH.'program/include/clisetup.php';
 
 function print_usage()
 {
@@ -89,8 +54,8 @@ function export_mailbox($mbox, $filename)
                $from = current($IMAP->decode_address_list($headers->from, 1, false));
                
                fwrite($out, sprintf("From %s %s UID %d\n", $from['mailto'], $headers->date, $headers->uid));
-               fwrite($out, iil_C_FetchPartHeader($IMAP->conn, $IMAP->mailbox, $i, null));
-               fwrite($out, iil_C_HandlePartBody($IMAP->conn, $IMAP->mailbox, $i, null, 1));
+               fwrite($out, $IMAP->conn->fetchPartHeader($mbox, $i));
+               fwrite($out, $IMAP->conn->handlePartBody($mbox, $i));
                fwrite($out, "\n\n\n");
                
                progress_update($i, $count);
@@ -125,8 +90,7 @@ if (empty($args['user']))
 }
 
 // prompt for password
-vputs("Password: ");
-$args['pass'] = trim(fgets(STDIN));
+$args['pass'] = prompt_silent("Password: ");
 
 
 // parse $host URL
index a5161e026e69e3d3f22516a30c23892487a0cf9c..74dc816173c3483a1ca7f9fba96672f481824804 100755 (executable)
@@ -1,45 +1,10 @@
 #!/usr/bin/env php
 <?php
-if (php_sapi_name() != 'cli') {
-    die('Not on the "shell" (php-cli).');
-}
 
 define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
 ini_set('memory_limit', -1);
 
-require_once INSTALL_PATH.'program/include/iniset.php';
-
-/**
- * Parse commandline arguments into a hash array
- */
-function get_opt($aliases=array())
-{
-       $args = array();
-       for ($i=1; $i<count($_SERVER['argv']); $i++)
-       {
-               $arg = $_SERVER['argv'][$i];
-               if (substr($arg, 0, 2) == '--')
-               {
-                       $sp = strpos($arg, '=');
-                       $key = substr($arg, 2, $sp - 2);
-                       $value = substr($arg, $sp+1);
-               }
-               else if ($arg{0} == '-')
-               {
-                       $key = substr($arg, 1);
-                       $value = $_SERVER['argv'][++$i];
-               }
-               else
-                       continue;
-
-               $args[$key] = preg_replace(array('/^["\']/', '/["\']$/'), '', $value);
-               
-               if ($alias = $aliases[$key])
-                       $args[$alias] = $args[$key];
-       }
-
-       return $args;
-}
+require_once INSTALL_PATH.'program/include/clisetup.php';
 
 function print_usage()
 {
@@ -82,11 +47,7 @@ if (empty($args['user']))
 // prompt for password
 if (empty($args['pass']))
 {
-       echo "Password: ";
-       $args['pass'] = trim(fgets(STDIN));
-
-       // clear password input
-       echo chr(8)."\rPassword: ".str_repeat("*", strlen($args['pass']))."\n";
+       $args['pass'] = prompt_silent("Password: ");
 }
 
 // parse $host URL
index c93d92dece93b73a0a004ffc93d538f6ef064aa5..a2988879c4e6f2f5ae62c193a82d95f16d5f9918 100755 (executable)
@@ -12,7 +12,10 @@ $RCI = rcube_install::get_instance();
 $RCI->load_config();
 
 if ($RCI->configured) {
+  $success = true;
+  
   if ($messages = $RCI->check_config()) {
+    $success = false;
     $err = 0;
 
     // list missing config options
@@ -77,7 +80,7 @@ if ($RCI->configured) {
         // Success!
         if ($write1 && $write2) {
           echo "Done.\n";
-          echo "Your configuration files are now up-tp-date!\n";
+          echo "Your configuration files are now up-to-date!\n";
         }
         else {
           echo "Failed to write config files!\n";
@@ -100,15 +103,33 @@ if ($RCI->configured) {
       echo "Please fix your config files and run this script again!\n";
       echo "See ya.\n";
     }
+  }
 
+  // check database schema
+  if ($RCI->config['db_dsnw']) {
+    $DB = new rcube_mdb2($RCI->config['db_dsnw'], '', false);
+    $DB->db_connect('w');
+    if ($db_error_msg = $DB->is_error()) {
+      echo "Error connecting to database: $db_error_msg\n";
+      $success = false;
+    }
+    else if ($RCI->db_schema_check($DB, false)) {
+      $db_map = array('pgsql' => 'postgres', 'mysqli' => 'mysql', 'sqlsrv' => 'mssql');
+      $updatefile = INSTALL_PATH . 'SQL/' . (isset($db_map[$DB->db_provider]) ? $db_map[$DB->db_provider] : $DB->db_provider) . '.update.sql';
+      echo "WARNING: Database schema needs to be updated!\n";
+      echo "Open $updatefile and execute all queries that are superscribed with the currently installed version number\n";
+      $success = false;
+    }
   }
-  else {
-    echo "This instance of RoundCube is up-to-date.\n";
+  
+  
+  if ($success) {
+    echo "This instance of Roundcube is up-to-date.\n";
     echo "Have fun!\n";
   }
 }
 else {
-  echo "This instance of RoundCube is not yet configured!\n";
+  echo "This instance of Roundcube is not yet configured!\n";
   echo "Open http://url-to-roundcube/installer/ in your browser and follow the instuctions.\n";
 }
 
index a9ffe52acefd0eef19a48cf3e2d603230cb12970..e8938a17c6e24b5800ce482be3a5bc4778d1b803 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | Configuration file for database access                                |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -17,7 +17,7 @@ $rcmail_config = array();
 // PEAR database DSN for read/write operations
 // format is db_provider://user:password@host/database 
 // For examples see http://pear.php.net/manual/en/package.database.mdb2.intro-dsn.php
-// currently supported db_providers: mysql, mysqli, pgsql, sqlite, mssql
+// currently supported db_providers: mysql, mysqli, pgsql, sqlite, mssql or sqlsrv
 
 $rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';
 // postgres example: 'pgsql://roundcube:pass@localhost/roundcubemail';
@@ -44,6 +44,10 @@ $rcmail_config['db_table_identities'] = 'identities';
 
 $rcmail_config['db_table_contacts'] = 'contacts';
 
+$rcmail_config['db_table_contactgroups'] = 'contactgroups';
+
+$rcmail_config['db_table_contactgroupmembers'] = 'contactgroupmembers';
+
 $rcmail_config['db_table_session'] = 'session';
 
 $rcmail_config['db_table_cache'] = 'cache';
@@ -58,10 +62,12 @@ $rcmail_config['db_sequence_identities'] = 'identity_ids';
 
 $rcmail_config['db_sequence_contacts'] = 'contact_ids';
 
+$rcmail_config['db_sequence_contactgroups'] = 'contactgroups_ids';
+
 $rcmail_config['db_sequence_cache'] = 'cache_ids';
 
 $rcmail_config['db_sequence_messages'] = 'message_ids';
 
 
 // end db config file
-?>
+
index efa45957cb9c27ea8c163a4fe7e0d4a4b0bc83c1..144ca77b646d00264096b59a11e441c0ffebd541 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | Main configuration file                                               |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
 
 $rcmail_config = array();
 
+// ----------------------------------
+// LOGGING/DEBUGGING
+// ----------------------------------
+
 // system error reporting: 1 = log; 2 = report (not implemented yet), 4 = show, 8 = trace
 $rcmail_config['debug_level'] = 1;
 
@@ -31,84 +35,102 @@ $rcmail_config['syslog_id'] = 'roundcube';
 // For possible values see installer or http://php.net/manual/en/function.openlog.php
 $rcmail_config['syslog_facility'] = LOG_USER;
 
-// use this folder to store log files (must be writeable for apache user)
-// This is used by the 'file' log driver.
-$rcmail_config['log_dir'] = 'logs/';
+// Log sent messages to <log_dir>/sendmail or to syslog
+$rcmail_config['smtp_log'] = true;
 
-// use this folder to store temp files (must be writeable for apache user)
-$rcmail_config['temp_dir'] = 'temp/';
+// Log successful logins to <log_dir>/userlogins or to syslog
+$rcmail_config['log_logins'] = false;
 
-// List of active plugins (in plugins/ directory)
-$rcmail_config['plugins'] = array();
+// Log SQL queries to <log_dir>/sql or to syslog
+$rcmail_config['sql_debug'] = false;
 
-// enable caching of messages and mailbox data in the local database.
-// this is recommended if the IMAP server does not run on the same machine
-$rcmail_config['enable_caching'] = FALSE;
+// Log IMAP conversation to <log_dir>/imap or to syslog
+$rcmail_config['imap_debug'] = false;
 
-// lifetime of message cache
-// possible units: s, m, h, d, w
-$rcmail_config['message_cache_lifetime'] = '10d';
+// Log LDAP conversation to <log_dir>/ldap or to syslog
+$rcmail_config['ldap_debug'] = false;
 
-// enforce connections over https
-// with this option enabled, all non-secure connections will be redirected.
-// set the port for the ssl connection as value of this option if it differs from the default 443
-$rcmail_config['force_https'] = FALSE;
+// Log SMTP conversation to <log_dir>/smtp or to syslog
+$rcmail_config['smtp_debug'] = false;
 
-// automatically create a new RoundCube user when log-in the first time.
-// a new user will be created once the IMAP login succeeds.
-// set to false if only registered users can use this service
-$rcmail_config['auto_create_user'] = TRUE;
+// ----------------------------------
+// IMAP
+// ----------------------------------
 
 // the mail host chosen to perform the log-in
 // leave blank to show a textbox at login, give a list of hosts
 // to display a pulldown menu or set one host as string.
 // To use SSL/TLS connection, enter hostname with prefix ssl:// or tls://
+// Supported replacement variables:
+// %n - http hostname ($_SERVER['SERVER_NAME'])
+// %d - domain (http hostname without the first part)
+// For example %n = mail.domain.tld, %d = domain.tld
 $rcmail_config['default_host'] = '';
 
 // TCP port used for IMAP connections
 $rcmail_config['default_port'] = 143;
 
-// IMAP auth type. Can be "auth" (CRAM-MD5), "plain" (PLAIN) or "check" to auto detect.
-// Optional, defaults to "check"
+// IMAP AUTH type (DIGEST-MD5, CRAM-MD5, LOGIN, PLAIN or empty to use
+// best server supported one)
 $rcmail_config['imap_auth_type'] = null;
 
-// If you know your imap's root directory and its folder delimiter,
-// you can specify them here. Otherwise they will be determined automatically.
-$rcmail_config['imap_root'] = null;
+// If you know your imap's folder delimiter, you can specify it here.
+// Otherwise it will be determined automatically
 $rcmail_config['imap_delimiter'] = null;
 
-// Automatically add this domain to user names for login
-// Only for IMAP servers that require full e-mail addresses for login
-// Specify an array with 'host' => 'domain' values to support multiple hosts
-$rcmail_config['username_domain'] = '';
-
-// This domain will be used to form e-mail addresses of new users
-// Specify an array with 'host' => 'domain' values to support multiple hosts
-$rcmail_config['mail_domain'] = '';
-
-// Path to a virtuser table file to resolve user names and e-mail addresses
-$rcmail_config['virtuser_file'] = '';
-
-// Query to resolve user names and e-mail addresses from the database
-// %u will be replaced with the current username for login.
-// The query should select the user's e-mail address as first column
-// and optional identity name as second column
-$rcmail_config['virtuser_query'] = '';
-
-// use this host for sending mails.
-// to use SSL connection, set ssl://smtp.host.com
-// if left blank, the PHP mail() function is used
-// Use %h variable as replacement for user's IMAP hostname
+// If IMAP server doesn't support NAMESPACE extension, but you're
+// using shared folders or personal root folder is non-empty, you'll need to
+// set these options. All can be strings or arrays of strings.
+// Folders need to be ended with directory separator, e.g. "INBOX."
+// (special directory "~" is an exception to this rule)
+// These can be used also to overwrite server's namespaces
+$rcmail_config['imap_ns_personal'] = null;
+$rcmail_config['imap_ns_other']    = null;
+$rcmail_config['imap_ns_shared']   = null;
+
+// By default IMAP capabilities are readed after connection to IMAP server
+// In some cases, e.g. when using IMAP proxy, there's a need to refresh the list
+// after login. Set to True if you've got this case.
+$rcmail_config['imap_force_caps'] = false;
+
+// By default list of subscribed folders is determined using LIST-EXTENDED
+// extension if available. Some servers (dovecot 1.x) returns wrong results
+// for shared namespaces in this case. http://trac.roundcube.net/ticket/1486225
+// Enable this option to force LSUB command usage instead.
+$rcmail_config['imap_force_lsub'] = false;
+
+// IMAP connection timeout, in seconds. Default: 0 (no limit)
+$rcmail_config['imap_timeout'] = 0;
+
+// Optional IMAP authentication identifier to be used as authorization proxy
+$rcmail_config['imap_auth_cid'] = null;
+
+// Optional IMAP authentication password to be used for imap_auth_cid
+$rcmail_config['imap_auth_pw'] = null;
+
+// ----------------------------------
+// SMTP
+// ----------------------------------
+
+// SMTP server host (for sending mails).
+// To use SSL/TLS connection, enter hostname with prefix ssl:// or tls://
+// If left blank, the PHP mail() function is used
+// Supported replacement variables:
+// %h - user's IMAP hostname
+// %n - http hostname ($_SERVER['SERVER_NAME'])
+// %d - domain (http hostname without the first part)
+// %z - IMAP domain (IMAP hostname without the first part)
+// For example %n = mail.domain.tld, %d = domain.tld
 $rcmail_config['smtp_server'] = '';
 
 // SMTP port (default is 25; 465 for SSL)
 $rcmail_config['smtp_port'] = 25;
 
-// SMTP username (if required) if you use %u as the username RoundCube
+// SMTP username (if required) if you use %u as the username Roundcube
 // will use the current username for login
 $rcmail_config['smtp_user'] = '';
 
-// SMTP password (if required) if you use %p as the password RoundCube
+// SMTP password (if required) if you use %p as the password Roundcube
 // will use the current user's password for login
 $rcmail_config['smtp_pass'] = '';
 
@@ -116,36 +138,69 @@ $rcmail_config['smtp_pass'] = '';
 // best server supported one)
 $rcmail_config['smtp_auth_type'] = '';
 
+// Optional SMTP authentication identifier to be used as authorization proxy
+$rcmail_config['smtp_auth_cid'] = null;
+
+// Optional SMTP authentication password to be used for smtp_auth_cid
+$rcmail_config['smtp_auth_pw'] = null;
+
 // SMTP HELO host 
 // Hostname to give to the remote server for SMTP 'HELO' or 'EHLO' messages 
 // Leave this blank and you will get the server variable 'server_name' or 
 // localhost if that isn't defined. 
 $rcmail_config['smtp_helo_host'] = '';
 
-// Log sent messages
-$rcmail_config['smtp_log'] = TRUE;
+// SMTP connection timeout, in seconds. Default: 0 (no limit)
+$rcmail_config['smtp_timeout'] = 0;
 
-// Log SQL queries to <log_dir>/sql or to syslog
-$rcmail_config['sql_debug'] = false;
+// ----------------------------------
+// SYSTEM
+// ----------------------------------
 
-// Log IMAP conversation to <log_dir>/imap or to syslog
-$rcmail_config['imap_debug'] = false;
+// THIS OPTION WILL ALLOW THE INSTALLER TO RUN AND CAN EXPOSE SENSITIVE CONFIG DATA.
+// ONLY ENABLE IT IF YOU'RE REALLY SURE WHAT YOU'RE DOING!
+$rcmail_config['enable_installer'] = false;
 
-// Log LDAP conversation to <log_dir>/ldap or to syslog
-$rcmail_config['ldap_debug'] = false;
+// use this folder to store log files (must be writeable for apache user)
+// This is used by the 'file' log driver.
+$rcmail_config['log_dir'] = 'logs/';
 
-// Log SMTP conversation to <log_dir>/smtp or to syslog
-$rcmail_config['smtp_debug'] = false;
+// use this folder to store temp files (must be writeable for apache user)
+$rcmail_config['temp_dir'] = 'temp/';
 
-// How many seconds must pass between emails sent by a user
-$rcmail_config['sendmail_delay'] = 0;
+// enable caching of messages and mailbox data in the local database.
+// this is recommended if the IMAP server does not run on the same machine
+$rcmail_config['enable_caching'] = false;
 
-// These cols are shown in the message list. Available cols are:
-// subject, from, to, cc, replyto, date, size, flag, attachment
-$rcmail_config['list_cols'] = array('subject', 'from', 'date', 'size', 'flag', 'attachment');
+// lifetime of message cache
+// possible units: s, m, h, d, w
+$rcmail_config['message_cache_lifetime'] = '10d';
+
+// enforce connections over https
+// with this option enabled, all non-secure connections will be redirected.
+// set the port for the ssl connection as value of this option if it differs from the default 443
+$rcmail_config['force_https'] = false;
+
+// tell PHP that it should work as under secure connection
+// even if it doesn't recognize it as secure ($_SERVER['HTTPS'] is not set)
+// e.g. when you're running Roundcube behind a https proxy
+$rcmail_config['use_https'] = false;
+
+// Allow browser-autocompletion on login form.
+// 0 - disabled, 1 - username and host only, 2 - username, host, password
+$rcmail_config['login_autocomplete'] = 0;
+
+// If users authentication is not case sensitive this must be enabled.
+// You can also use it to force conversion of logins to lower case.
+$rcmail_config['login_lc'] = false;
+
+// automatically create a new Roundcube user when log-in the first time.
+// a new user will be created once the IMAP login succeeds.
+// set to false if only registered users can use this service
+$rcmail_config['auto_create_user'] = true;
 
 // Includes should be interpreted as PHP files
-$rcmail_config['skin_include_php'] = FALSE;
+$rcmail_config['skin_include_php'] = false;
 
 // Session lifetime in minutes
 // must be greater than 'keep_alive'/60
@@ -163,6 +218,121 @@ $rcmail_config['double_auth'] = false;
 // please provide a string of exactly 24 chars.
 $rcmail_config['des_key'] = 'rcmail-!24ByteDESkey*Str';
 
+// Automatically add this domain to user names for login
+// Only for IMAP servers that require full e-mail addresses for login
+// Specify an array with 'host' => 'domain' values to support multiple hosts
+// Supported replacement variables:
+// %h - user's IMAP hostname
+// %n - http hostname ($_SERVER['SERVER_NAME'])
+// %d - domain (http hostname without the first part)
+// %z - IMAP domain (IMAP hostname without the first part)
+// For example %n = mail.domain.tld, %d = domain.tld
+$rcmail_config['username_domain'] = '';
+
+// This domain will be used to form e-mail addresses of new users
+// Specify an array with 'host' => 'domain' values to support multiple hosts
+// Supported replacement variables:
+// %h - user's IMAP hostname
+// %n - http hostname ($_SERVER['SERVER_NAME'])
+// %d - domain (http hostname without the first part)
+// %z - IMAP domain (IMAP hostname without the first part)
+// For example %n = mail.domain.tld, %d = domain.tld
+$rcmail_config['mail_domain'] = '';
+
+// Password charset.
+// Use it if your authentication backend doesn't support UTF-8.
+// Defaults to ISO-8859-1 for backward compatibility
+$rcmail_config['password_charset'] = 'ISO-8859-1';
+
+// How many seconds must pass between emails sent by a user
+$rcmail_config['sendmail_delay'] = 0;
+
+// Maximum number of recipients per message. Default: 0 (no limit)
+$rcmail_config['max_recipients'] = 0; 
+
+// Maximum allowednumber of members of an address group. Default: 0 (no limit)
+// If 'max_recipients' is set this value should be less or equal
+$rcmail_config['max_group_members'] = 0; 
+
+// add this user-agent to message headers when sending
+$rcmail_config['useragent'] = 'Roundcube Webmail/'.RCMAIL_VERSION;
+
+// use this name to compose page titles
+$rcmail_config['product_name'] = 'Roundcube Webmail';
+
+// try to load host-specific configuration
+// see http://trac.roundcube.net/wiki/Howto_Config for more details
+$rcmail_config['include_host_config'] = false;
+
+// path to a text file which will be added to each sent message
+// paths are relative to the Roundcube root folder
+$rcmail_config['generic_message_footer'] = '';
+
+// path to a text file which will be added to each sent HTML message
+// paths are relative to the Roundcube root folder
+$rcmail_config['generic_message_footer_html'] = '';
+
+// add a received header to outgoing mails containing the creators IP and hostname
+$rcmail_config['http_received_header'] = false;
+
+// Whether or not to encrypt the IP address and the host name
+// these could, in some circles, be considered as sensitive information;
+// however, for the administrator, these could be invaluable help
+// when tracking down issues.
+$rcmail_config['http_received_header_encrypt'] = false;
+
+// This string is used as a delimiter for message headers when sending
+// a message via mail() function. Leave empty for auto-detection
+$rcmail_config['mail_header_delimiter'] = NULL;
+
+// number of chars allowed for line when wrapping text.
+// text wrapping is done when composing/sending messages
+$rcmail_config['line_length'] = 72;
+
+// send plaintext messages as format=flowed
+$rcmail_config['send_format_flowed'] = true;
+
+// session domain: .example.org
+$rcmail_config['session_domain'] = '';
+
+// don't allow these settings to be overriden by the user
+$rcmail_config['dont_override'] = array();
+
+// Set identities access level:
+// 0 - many identities with possibility to edit all params
+// 1 - many identities with possibility to edit all params but not email address
+// 2 - one identity with possibility to edit all params
+// 3 - one identity with possibility to edit all params but not email address
+$rcmail_config['identities_level'] = 0;
+
+// mime magic database
+$rcmail_config['mime_magic'] = '/usr/share/misc/magic';
+
+// Enable DNS checking for e-mail address validation
+$rcmail_config['email_dns_check'] = false;
+
+// ----------------------------------
+// PLUGINS
+// ----------------------------------
+
+// List of active plugins (in plugins/ directory)
+$rcmail_config['plugins'] = array();
+
+// ----------------------------------
+// USER INTERFACE
+// ----------------------------------
+
+// default messages sort column. Use empty value for default server's sorting, 
+// or 'arrival', 'date', 'subject', 'from', 'to', 'size', 'cc'
+$rcmail_config['message_sort_col'] = '';
+
+// default messages sort order
+$rcmail_config['message_sort_order'] = 'DESC';
+
+// These cols are shown in the message list. Available cols are:
+// subject, from, to, cc, replyto, date, size, status, flag, attachment
+$rcmail_config['list_cols'] = array('subject', 'status', 'from', 'date', 'size', 'flag', 'attachment');
+
 // the default locale setting (leave empty for auto-detection)
 // RFC1766 formatted language name like en_US, de_DE, de_CH, fr_FR, pt_BR
 $rcmail_config['language'] = null;
@@ -176,12 +346,6 @@ $rcmail_config['date_long'] = 'd.m.Y H:i';
 // use this format for today's date display (date or strftime format)
 $rcmail_config['date_today'] = 'H:i';
 
-// add this user-agent to message headers when sending
-$rcmail_config['useragent'] = 'RoundCube Webmail/'.RCMAIL_VERSION;
-
-// use this name to compose page titles
-$rcmail_config['product_name'] = 'RoundCube Webmail';
-
 // store draft message is this mailbox
 // leave blank if draft messages should not be stored
 $rcmail_config['drafts_mbox'] = 'Drafts';
@@ -202,25 +366,18 @@ $rcmail_config['trash_mbox'] = 'Trash';
 $rcmail_config['default_imap_folders'] = array('INBOX', 'Drafts', 'Sent', 'Junk', 'Trash');
 
 // automatically create the above listed default folders on login
-$rcmail_config['create_default_folders'] = FALSE;
+$rcmail_config['create_default_folders'] = false;
 
 // protect the default folders from renames, deletes, and subscription changes
-$rcmail_config['protect_default_folders'] = TRUE;
-
-// if in your system 0 quota means no limit set this option to TRUE 
-$rcmail_config['quota_zero_as_unlimited'] = FALSE;
-
-// Behavior if a received message requests a message delivery notification (read receipt)
-// 0 = ask the user, 1 = send automatically, 2 = ignore (never send or ask)
-$rcmail_config['mdn_requests'] = 0;
+$rcmail_config['protect_default_folders'] = true;
 
-// Use this charset as fallback for message decoding
-$rcmail_config['default_charset'] = 'ISO-8859-1';
+// if in your system 0 quota means no limit set this option to true 
+$rcmail_config['quota_zero_as_unlimited'] = false;
 
 // Make use of the built-in spell checker. It is based on GoogieSpell.
 // Since Google only accepts connections over https your PHP installatation
 // requires to be compiled with Open SSL support
-$rcmail_config['enable_spellcheck'] = TRUE;
+$rcmail_config['enable_spellcheck'] = true;
 
 // Set the spell checking engine. 'googie' is the default. 'pspell' is also available,
 // but requires the Pspell extensions. When using Nox Spell Server, also set 'googie' here.
@@ -237,25 +394,16 @@ $rcmail_config['spellcheck_uri'] = '';
 // Leave empty for default set of available language.
 $rcmail_config['spellcheck_languages'] = NULL;
 
-// path to a text file which will be added to each sent message
-// paths are relative to the RoundCube root folder
-$rcmail_config['generic_message_footer'] = '';
-
-// add a received header to outgoing mails containing the creators IP and hostname
-$rcmail_config['http_received_header'] = false;
-
-// Whether or not to encrypt the IP address and the host name
-// these could, in some circles, be considered as sensitive information;
-// however, for the administrator, these could be invaluable help
-// when tracking down issues.
-$rcmail_config['http_received_header_encrypt'] = false;
+// don't let users set pagesize to more than this value if set
+$rcmail_config['max_pagesize'] = 200;
 
-// this string is used as a delimiter for message headers when sending
-// leave empty for auto-detection
-$rcmail_config['mail_header_delimiter'] = NULL;
+// Minimal value of user's 'keep_alive' setting (in seconds)
+// Must be less than 'session_lifetime'
+$rcmail_config['min_keep_alive'] = 60;
 
-// session domain: .example.org
-$rcmail_config['session_domain'] = '';
+// ----------------------------------
+// ADDRESSBOOK SETTINGS
+// ----------------------------------
 
 // This indicates which type of address book to use. Possible choises:
 // 'sql' (default) and 'ldap'.
@@ -287,17 +435,30 @@ $rcmail_config['ldap_public'] = array();
  *
 $rcmail_config['ldap_public']['Verisign'] = array(
   'name'          => 'Verisign.com',
+  // Replacement variables supported in host names:
+  // %h - user's IMAP hostname
+  // %n - http hostname ($_SERVER['SERVER_NAME'])
+  // %d - domain (http hostname without the first part)
+  // %z - IMAP domain (IMAP hostname without the first part)
+  // For example %n = mail.domain.tld, %d = domain.tld
   'hosts'         => array('directory.verisign.com'),
   'port'          => 389,
-  'use_tls'        => false,
+  'use_tls'          => false,
   'user_specific' => false,   // If true the base_dn, bind_dn and bind_pass default to the user's IMAP login.
   // %fu - The full username provided, assumes the username is an email
   //       address, uses the username_domain value if not an email address.
   // %u  - The username prior to the '@'.
   // %d  - The domain name after the '@'.
+  // %dc - The domain name hierarchal string e.g. "dc=test,dc=domain,dc=com"
+  // %dn - DN found by ldap search when search_filter/search_base_dn are used
   'base_dn'       => '',
   'bind_dn'       => '',
   'bind_pass'     => '',
+  // It's possible to bind for an individual address book
+  // The login name is used to search for the DN to bind with
+  'search_base_dn' => '',
+  'search_filter'  => '',   // e.g. '(&(objectClass=posixAccount)(uid=%u))'
+
   'writable'      => false,   // Indicates if we can write to the LDAP directory or not.
   // If writable is true then these fields need to be populated:
   // LDAP_Object_Classes, required_fields, LDAP_rdn
@@ -313,66 +474,27 @@ $rcmail_config['ldap_public']['Verisign'] = array(
   'sort'          => 'cn',    // The field to sort the listing by.
   'scope'         => 'sub',   // search mode: sub|base|list
   'filter'        => '',      // used for basic listing (if not empty) and will be &'d with search queries. example: status=act
-  'fuzzy_search'  => true);   // server allows wildcard search
+  'fuzzy_search'  => true,    // server allows wildcard search
+  'sizelimit'     => '0',     // Enables you to limit the count of entries fetched. Setting this to 0 means no limit. 
+  'timelimit'     => '0',     // Sets the number of seconds how long is spend on the search. Setting this to 0 means no limit. 
+);
 */
 
 // An ordered array of the ids of the addressbooks that should be searched
 // when populating address autocomplete fields server-side. ex: array('sql','Verisign');
 $rcmail_config['autocomplete_addressbooks'] = array('sql');
 
-// don't allow these settings to be overriden by the user
-$rcmail_config['dont_override'] = array();
-
-// Set identities access level:
-// 0 - many identities with possibility to edit all params
-// 1 - many identities with possibility to edit all params but not email address
-// 2 - one identity with possibility to edit all params
-// 3 - one identity with possibility to edit all params but not email address
-$rcmail_config['identities_level'] = 0;
-
-// try to load host-specific configuration
-// see http://trac.roundcube.net/wiki/Howto_Config for more details
-$rcmail_config['include_host_config'] = false;
-
-// don't let users set pagesize to more than this value if set
-$rcmail_config['max_pagesize'] = 200;
+// The minimum number of characters required to be typed in an autocomplete field
+// before address books will be searched. Most useful for LDAP directories that
+// may need to do lengthy results building given overly-broad searches
+$rcmail_config['autocomplete_min_length'] = 1;
 
-// mime magic database
-$rcmail_config['mime_magic'] = '/usr/share/misc/magic';
-
-// default sort col
-$rcmail_config['message_sort_col'] = 'date';
+// ----------------------------------
+// USER PREFERENCES
+// ----------------------------------
 
-// default sort order
-$rcmail_config['message_sort_order'] = 'DESC';
-
-// THIS OPTION WILL ALLOW THE INSTALLER TO RUN AND CAN EXPOSE SENSITIVE CONFIG DATA.
-// ONLY ENABLE IT IF YOU'RE REALLY SURE WHAT YOU'RE DOING!
-$rcmail_config['enable_installer'] = false;
-
-// Log successful logins
-$rcmail_config['log_logins'] = false;
-
-/**
- * 'Delete always'
- * This setting reflects if mail should be always marked as deleted,
- * even if moving to "Trash" fails. This is necessary in some setups
- * because a) people may not have a Trash folder or b) they are over
- * quota (and Trash is included in the quota).
- *
- * This is a failover setting for iil_C_Move when a message is moved
- * to the Trash.
- */
-$rcmail_config['delete_always'] = false;
-
-// Minimal value of user's 'keep_alive' setting (in seconds)
-// Must be less than 'session_lifetime'
-$rcmail_config['min_keep_alive'] = 60;
-
-// Enable DNS checking for e-mail address validation
-$rcmail_config['email_dns_check'] = false;
-
-/***** these settings can be overwritten by user's preferences *****/
+// Use this charset as fallback for message decoding
+$rcmail_config['default_charset'] = 'ISO-8859-1';
 
 // skin name: folder from skins/
 $rcmail_config['skin'] = 'default';
@@ -387,7 +509,7 @@ $rcmail_config['timezone'] = 'auto';
 $rcmail_config['dst_active'] = (bool)date('I');
 
 // prefer displaying HTML messages
-$rcmail_config['prefer_html'] = TRUE;
+$rcmail_config['prefer_html'] = true;
 
 // display remote inline images
 // 0 - Never, always ask
@@ -396,28 +518,33 @@ $rcmail_config['prefer_html'] = TRUE;
 $rcmail_config['show_images'] = 0;
 
 // compose html formatted messages by default
-$rcmail_config['htmleditor'] = FALSE;
+// 0 - never, 1 - always, 2 - on reply to HTML message only 
+$rcmail_config['htmleditor'] = 0;
 
 // show pretty dates as standard
-$rcmail_config['prettydate'] = TRUE;
+$rcmail_config['prettydate'] = true;
 
 // save compose message every 300 seconds (5min)
 $rcmail_config['draft_autosave'] = 300;
 
 // default setting if preview pane is enabled
-$rcmail_config['preview_pane'] = FALSE;
+$rcmail_config['preview_pane'] = false;
+
+// Mark as read when viewed in preview pane (delay in seconds)
+// Set to -1 if messages in preview pane should not be marked as read
+$rcmail_config['preview_pane_mark_read'] = 0;
 
 // focus new window if new message arrives
 $rcmail_config['focus_on_new_message'] = true;
 
 // Clear Trash on logout
-$rcmail_config['logout_purge'] = FALSE;
+$rcmail_config['logout_purge'] = false;
 
 // Compact INBOX on logout
-$rcmail_config['logout_expunge'] = FALSE;
+$rcmail_config['logout_expunge'] = false;
 
 // Display attached images below the message body 
-$rcmail_config['inline_images'] = TRUE;
+$rcmail_config['inline_images'] = true;
 
 // Encoding of long/non-ascii attachment names:
 // 0 - Full RFC 2231 compatible
@@ -425,30 +552,77 @@ $rcmail_config['inline_images'] = TRUE;
 // 2 - Full 2047 compatible
 $rcmail_config['mime_param_folding'] = 1;
 
-// Set TRUE if deleted messages should not be displayed
+// Set true if deleted messages should not be displayed
 // This will make the application run slower
-$rcmail_config['skip_deleted'] = FALSE;
+$rcmail_config['skip_deleted'] = false;
 
 // Set true to Mark deleted messages as read as well as deleted
 // False means that a message's read status is not affected by marking it as deleted
-$rcmail_config['read_when_deleted'] = TRUE;
+$rcmail_config['read_when_deleted'] = true;
 
-// Set to TRUE to newer delete messages immediately
+// Set to true to newer delete messages immediately
 // Use 'Purge' to remove messages marked as deleted 
-$rcmail_config['flag_for_deletion'] = FALSE;
+$rcmail_config['flag_for_deletion'] = false;
 
 // Default interval for keep-alive/check-recent requests (in seconds)
 // Must be greater than or equal to 'min_keep_alive' and less than 'session_lifetime'
 $rcmail_config['keep_alive'] = 60;
 
 // If true all folders will be checked for recent messages
-$rcmail_config['check_all_folders'] = FALSE;
+$rcmail_config['check_all_folders'] = false;
 
 // If true, after message delete/move, the next message will be displayed
-$rcmail_config['display_next'] = FALSE;
+$rcmail_config['display_next'] = false;
+
+// 0 - Do not expand threads 
+// 1 - Expand all threads automatically 
+// 2 - Expand only threads with unread messages 
+$rcmail_config['autoexpand_threads'] = 0;
+
+// When replying place cursor above original message (top posting)
+$rcmail_config['top_posting'] = false;
+
+// When replying strip original signature from message
+$rcmail_config['strip_existing_sig'] = true;
+
+// Show signature:
+// 0 - Never
+// 1 - Always
+// 2 - New messages only
+// 3 - Forwards and Replies only
+$rcmail_config['show_sig'] = 1;
+
+// When replying or forwarding place sender's signature above existing message
+$rcmail_config['sig_above'] = false;
+
+// Use MIME encoding (quoted-printable) for 8bit characters in message body
+$rcmail_config['force_7bit'] = false;
+
+// Defaults of the search field configuration.
+// The array can contain a per-folder list of header fields which should be considered when searching
+// The entry with key '*' stands for all folders which do not have a specific list set.
+// Please note that folder names should to be in sync with $rcmail_config['default_imap_folders']
+$rcmail_config['search_mods'] = null;  // Example: array('*' => array('subject'=>1, 'from'=>1), 'Sent' => array('subject'=>1, 'to'=>1));
+
+// 'Delete always'
+// This setting reflects if mail should be always deleted
+// when moving to Trash fails. This is necessary in some setups
+// when user is over quota and Trash is included in the quota.
+$rcmail_config['delete_always'] = false;
+
+// Behavior if a received message requests a message delivery notification (read receipt)
+// 0 = ask the user, 1 = send automatically, 2 = ignore (never send or ask)
+// 3 = send automatically if sender is in addressbook, otherwise ask the user
+// 4 = send automatically if sender is in addressbook, otherwise ignore
+$rcmail_config['mdn_requests'] = 0;
+
+// Return receipt checkbox default state
+$rcmail_config['mdn_default'] = 0;
+
+// Delivery Status Notification checkbox default state
+$rcmail_config['dsn_default'] = 0;
 
-// If true, messages list will be sorted by message index instead of message date
-$rcmail_config['index_sort'] = TRUE;
+// Place replies in the folder of the message being replied to
+$rcmail_config['reply_same_folder'] = false;
 
 // end of config file
-?>
index 159fce0d0e0235daf2f4aaa6d92104dc809a4913..d404c1f2ca55f8b73baad65d509f57af28845a5c 100644 (file)
@@ -7,6 +7,7 @@ return array(
   'xlc' => 'application/vnd.ms-excel',
   'xlt' => 'application/vnd.ms-excel',
   'xlw' => 'application/vnd.ms-excel',
+  'pdf' => 'application/pdf',
   'ppt' => 'application/vnd.ms-powerpoint',
   'pps' => 'application/vnd.ms-powerpoint',
   'pot' => 'application/vnd.ms-powerpoint',
@@ -42,6 +43,7 @@ return array(
   'xps' => 'application/vnd.ms-xpsdocument',
   'rar' => 'application/x-rar-compressed',
   'vcf' => 'text/vcard',
+  'ics' => 'text/calendar',
 );
 
 ?>
\ No newline at end of file
index 2360d7f517811923ca6a6e864e9e091f69775434..57bcc64ce06d4fed1850944a7914e76654c73e47 100644 (file)
--- a/index.php
+++ b/index.php
@@ -1,10 +1,10 @@
 <?php
 /*
  +-------------------------------------------------------------------------+
- | RoundCube Webmail IMAP Client                                           |
- | Version 0.3.1-20091031                                                  |
+ | Roundcube Webmail IMAP Client                                           |
+ | Version 0.5                                                             |
  |                                                                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                   |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                   |
  |                                                                         |
  | This program is free software; you can redistribute it and/or modify    |
  | it under the terms of the GNU General Public License version 2          |
  | Author: Thomas Bruederli <roundcube@gmail.com>                          |
  +-------------------------------------------------------------------------+
 
- $Id: index.php 3081 2009-10-31 13:20:02Z thomasb $
+ $Id: index.php 4408 2011-01-12 15:54:35Z thomasb $
 
 */
 
 // include environment
 require_once 'program/include/iniset.php';
 
-// init application and start session with requested task
+// init application, start session, init output class, etc.
 $RCMAIL = rcmail::get_instance();
 
-// init output class
-$OUTPUT = !empty($_REQUEST['_remote']) ? $RCMAIL->init_json() : $RCMAIL->load_gui(!empty($_REQUEST['_framed']));
-
-// init plugin API
-$RCMAIL->plugins->init();
-
 // turn on output buffering
 ob_start();
 
@@ -67,7 +61,9 @@ if ($RCMAIL->action=='error' && !empty($_GET['_code'])) {
 if (empty($_SESSION['user_id']) && ($force_https = $RCMAIL->config->get('force_https', false))) {
   $https_port = is_bool($force_https) ? 443 : $force_https;
   if (!rcube_https_check($https_port)) {
-    header('Location: https://' . $_SERVER['HTTP_HOST'] . ($https_port != 443 ? ':' . $https_port : '') . $_SERVER['REQUEST_URI']);
+    $host  = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']);
+    $host .= ($https_port != 443 ? ':' . $https_port : '');
+    header('Location: https://' . $host . $_SERVER['REQUEST_URI']);
     exit;
   }
 }
@@ -78,59 +74,59 @@ $RCMAIL->set_task($startup['task']);
 $RCMAIL->action = $startup['action'];
 
 // try to log in
-if ($RCMAIL->action=='login' && $RCMAIL->task=='mail') {
+if ($RCMAIL->task == 'login' && $RCMAIL->action == 'login') {
   // purge the session in case of new login when a session already exists 
   $RCMAIL->kill_session();
-  
+
   $auth = $RCMAIL->plugins->exec_hook('authenticate', array(
     'host' => $RCMAIL->autoselect_host(),
     'user' => trim(get_input_value('_user', RCUBE_INPUT_POST)),
+    'pass' => get_input_value('_pass', RCUBE_INPUT_POST, true,
+       $RCMAIL->config->get('password_charset', 'ISO-8859-1')),
     'cookiecheck' => true,
-  )) + array('pass' => get_input_value('_pass', RCUBE_INPUT_POST, true, 'ISO-8859-1'));
+  ));
 
   // check if client supports cookies
   if ($auth['cookiecheck'] && empty($_COOKIE)) {
     $OUTPUT->show_message("cookiesdisabled", 'warning');
   }
-  else if ($_SESSION['temp'] && !$auth['abort'] && !empty($auth['host']) &&
-            !empty($auth['user']) && isset($auth['pass']) && 
-            $RCMAIL->login($auth['user'], $auth['pass'], $auth['host'])) {
+  else if ($_SESSION['temp'] && !$auth['abort'] &&
+        !empty($auth['host']) && !empty($auth['user']) &&
+        $RCMAIL->login($auth['user'], $auth['pass'], $auth['host'])) {
     // create new session ID
-    rcube_sess_unset('temp');
-    rcube_sess_regenerate_id();
+    $RCMAIL->session->remove('temp');
+    $RCMAIL->session->regenerate_id();
 
     // send auth cookie if necessary
     $RCMAIL->authenticate_session();
 
     // log successful login
-    if ($RCMAIL->config->get('log_logins')) {
-      write_log('userlogins', sprintf('Successful login for %s (id %d) from %s',
-        $RCMAIL->user->get_username(),
-        $RCMAIL->user->ID,
-        $_SERVER['REMOTE_ADDR']));
-    }
-    
+    rcmail_log_login();
+
     // restore original request parameters
-    $query = array();
+    $query = array('_task' => 'mail');
     if ($url = get_input_value('_url', RCUBE_INPUT_POST))
       parse_str($url, $query);
 
     // allow plugins to control the redirect url after login success
-    $redir = $RCMAIL->plugins->exec_hook('login_after', $query + array('task' => $RCMAIL->task));
+    $redir = $RCMAIL->plugins->exec_hook('login_after', $query);
     unset($redir['abort']);
 
     // send redirect
     $OUTPUT->redirect($redir);
   }
   else {
-    $OUTPUT->show_message($IMAP->error_code < -1 ? 'imaperror' : 'loginfailed', 'warning');
-    $RCMAIL->plugins->exec_hook('login_failed', array('code' => $IMAP->error_code, 'host' => $auth['host'], 'user' => $auth['user']));
+    $error_code = is_object($IMAP) ? $IMAP->get_error_code() : -1;
+
+    $OUTPUT->show_message($error_code < -1 ? 'imaperror' : 'loginfailed', 'warning');
+    $RCMAIL->plugins->exec_hook('login_failed', array(
+      'code' => $error_code, 'host' => $auth['host'], 'user' => $auth['user']));
     $RCMAIL->kill_session();
   }
 }
 
 // end session
-else if ($RCMAIL->task=='logout' && isset($_SESSION['user_id'])) {
+else if ($RCMAIL->task == 'logout' && isset($_SESSION['user_id'])) {
   $userdata = array('user' => $_SESSION['username'], 'host' => $_SESSION['imap_host'], 'lang' => $RCMAIL->user->language);
   $OUTPUT->show_message('loggedout');
   $RCMAIL->logout_actions();
@@ -139,34 +135,18 @@ else if ($RCMAIL->task=='logout' && isset($_SESSION['user_id'])) {
 }
 
 // check session and auth cookie
-else if ($RCMAIL->action != 'login' && $_SESSION['user_id'] && $RCMAIL->action != 'send') {
+else if ($RCMAIL->task != 'login' && $_SESSION['user_id'] && $RCMAIL->action != 'send') {
   if (!$RCMAIL->authenticate_session()) {
     $OUTPUT->show_message('sessionerror', 'error');
     $RCMAIL->kill_session();
   }
 }
 
-// don't check for valid request tokens in these actions
-$request_check_whitelist = array('login'=>1, 'spell'=>1);
-
-// check client X-header to verify request origin
-if ($OUTPUT->ajax_call) {
-  if (!$RCMAIL->config->get('devel_mode') && rc_request_header('X-RoundCube-Request') != $RCMAIL->get_request_token() && !empty($RCMAIL->user->ID)) {
-    header('HTTP/1.1 404 Not Found');
-    die("Invalid Request");
-  }
-}
-// check request token in POST form submissions
-else if (!empty($_POST) && !$request_check_whitelist[$RCMAIL->action] && !$RCMAIL->check_request()) {
-  $OUTPUT->show_message('invalidrequest', 'error');
-  $OUTPUT->send($RCMAIL->task);
-}
-
 // not logged in -> show login page
 if (empty($RCMAIL->user->ID)) {
   if ($OUTPUT->ajax_call)
     $OUTPUT->redirect(array(), 2000);
-  
+
   if (!empty($_REQUEST['_framed']))
     $OUTPUT->command('redirect', '?');
 
@@ -174,29 +154,43 @@ if (empty($RCMAIL->user->ID)) {
   if ($RCMAIL->config->get('enable_installer') && is_readable('./installer/index.php')) {
     $OUTPUT->add_footer(html::div(array('style' => "background:#ef9398; border:2px solid #dc5757; padding:0.5em; margin:2em auto; width:50em"),
       html::tag('h2', array('style' => "margin-top:0.2em"), "Installer script is still accessible") .
-      html::p(null, "The install script of your RoundCube installation is still stored in its default location!") .
-      html::p(null, "Please <b>remove</b> the whole <tt>installer</tt> folder from the RoundCube directory because .
+      html::p(null, "The install script of your Roundcube installation is still stored in its default location!") .
+      html::p(null, "Please <b>remove</b> the whole <tt>installer</tt> folder from the Roundcube directory because .
         these files may expose sensitive configuration data like server passwords and encryption keys
         to the public. Make sure you cannot access the <a href=\"./installer/\">installer script</a> from your browser.")
       )
     );
   }
-  
+
   $OUTPUT->set_env('task', 'login');
   $OUTPUT->send('login');
 }
+// CSRF prevention
+else {
+  // don't check for valid request tokens in these actions
+  $request_check_whitelist = array('login'=>1, 'spell'=>1);
+
+  // check client X-header to verify request origin
+  if ($OUTPUT->ajax_call) {
+    if (rc_request_header('X-Roundcube-Request') != $RCMAIL->get_request_token()) {
+      header('HTTP/1.1 404 Not Found');
+      die("Invalid Request");
+    }
+  }
+  // check request token in POST form submissions
+  else if (!empty($_POST) && !$request_check_whitelist[$RCMAIL->action] && !$RCMAIL->check_request()) {
+    $OUTPUT->show_message('invalidrequest', 'error');
+    $OUTPUT->send($RCMAIL->task);
+  }
+}
 
-
-// handle keep-alive signal
+// handle special actions
 if ($RCMAIL->action == 'keep-alive') {
   $OUTPUT->reset();
   $OUTPUT->send();
 }
-// save preference value
 else if ($RCMAIL->action == 'save-pref') {
-  $RCMAIL->user->save_prefs(array(get_input_value('_name', RCUBE_INPUT_POST) => get_input_value('_value', RCUBE_INPUT_POST)));
-  $OUTPUT->reset();
-  $OUTPUT->send();
+  include 'steps/utils/save_pref.inc';
 }
 
 
@@ -213,19 +207,26 @@ $action_map = array(
     'remove-attachment'  => 'attachments.inc',
     'display-attachment' => 'attachments.inc',
     'upload' => 'attachments.inc',
+    'group-expand' => 'autocomplete.inc',
   ),
   
   'addressbook' => array(
     'add' => 'edit.inc',
+    'group-create' => 'groups.inc',
+    'group-rename' => 'groups.inc',
+    'group-delete' => 'groups.inc',
+    'group-addmembers' => 'groups.inc',
+    'group-delmembers' => 'groups.inc',
   ),
-  
+
   'settings' => array(
-    'folders'       => 'manage_folders.inc',
-    'create-folder' => 'manage_folders.inc',
-    'rename-folder' => 'manage_folders.inc',
-    'delete-folder' => 'manage_folders.inc',
-    'subscribe'     => 'manage_folders.inc',
-    'unsubscribe'   => 'manage_folders.inc',
+    'folders'       => 'folders.inc',
+    'rename-folder' => 'folders.inc',
+    'delete-folder' => 'folders.inc',
+    'subscribe'     => 'folders.inc',
+    'unsubscribe'   => 'folders.inc',
+    'purge'         => 'folders.inc',
+    'folder-size'   => 'folders.inc',
     'add-identity'  => 'edit_identity.inc',
   )
 );
@@ -239,9 +240,13 @@ $redirects = 0; $incstep = null;
 while ($redirects < 5) {
   $stepfile = !empty($action_map[$RCMAIL->task][$RCMAIL->action]) ?
     $action_map[$RCMAIL->task][$RCMAIL->action] : strtr($RCMAIL->action, '-', '_') . '.inc';
-
+    
   // execute a plugin action
-  if (preg_match('/^plugin\./', $RCMAIL->action)) {
+  if ($RCMAIL->plugins->is_plugin_task($RCMAIL->task)) {
+    $RCMAIL->plugins->exec_action($RCMAIL->task.'.'.$RCMAIL->action);
+    break;
+  }
+  else if (preg_match('/^plugin\./', $RCMAIL->action)) {
     $RCMAIL->plugins->exec_action($RCMAIL->action);
     break;
   }
@@ -267,5 +272,4 @@ raise_error(array(
   'line' => __LINE__,
   'file' => __FILE__,
   'message' => "Invalid request"), true, true);
-                      
-?>
+
index 459305138cb84354432b885f8a95dc08cb5afc35..7fa4d95d3b245779f4d18c0be96f272f2864677b 100644 (file)
@@ -1,41 +1,65 @@
 <form action="index.php" method="get">
 <?php
 
-$required_php_exts = array('PCRE' => 'pcre', 'DOM' => 'dom',
-    'Session' => 'session', 'XML' => 'xml');
+$required_php_exts = array(
+    'PCRE'      => 'pcre',
+    'DOM'       => 'dom',
+    'Session'   => 'session',
+    'XML'       => 'xml',
+    'JSON'      => 'json'
+);
 
-$optional_php_exts = array('FileInfo' => 'fileinfo', 'Libiconv' => 'iconv',
-    'Multibyte' => 'mbstring', 'OpenSSL' => 'openssl', 'Mcrypt' => 'mcrypt',
-    'GD' => 'gd');
+$optional_php_exts = array(
+    'FileInfo'  => 'fileinfo',
+    'Libiconv'  => 'iconv',
+    'Multibyte' => 'mbstring',
+    'OpenSSL'   => 'openssl',
+    'Mcrypt'    => 'mcrypt',
+    'Intl'      => 'intl',
+);
 
-$required_libs = array('PEAR' => 'PEAR.php', 'MDB2' => 'MDB2.php',
-    'Net_SMTP' => 'Net/SMTP.php', 'Mail_mime' => 'Mail/mime.php',
-    'iilConnection' => 'lib/imap.inc');
+$required_libs = array(
+    'PEAR'      => 'PEAR.php',
+    'MDB2'      => 'MDB2.php',
+    'Net_SMTP'  => 'Net/SMTP.php',
+    'Mail_mime' => 'Mail/mime.php',
+);
 
-$supported_dbs = array('MySQL' => 'mysql', 'MySQLi' => 'mysqli',
-    'PostgreSQL' => 'pgsql', 'SQLite (v2)' => 'sqlite');
+$supported_dbs = array(
+    'MySQL'         => 'mysql',
+    'MySQLi'        => 'mysqli',
+    'PostgreSQL'    => 'pgsql',
+    'SQLite (v2)'   => 'sqlite',
+);
 
-$ini_checks = array('file_uploads' => 1, 'session.auto_start' => 0,
-    'zend.ze1_compatibility_mode' => 0, 'mbstring.func_overload' => 0,
-    'suhosin.session.encrypt' => 0);
+$ini_checks = array(
+    'file_uploads'                  => 1,
+    'session.auto_start'            => 0,
+    'zend.ze1_compatibility_mode'   => 0,
+    'mbstring.func_overload'        => 0,
+    'suhosin.session.encrypt'       => 0,
+);
 
-$optional_checks = array('date.timezone' => '-NOTEMPTY-');
+$optional_checks = array(
+    'date.timezone' => '-NOTEMPTY-',
+);
 
 $source_urls = array(
-    'Sockets' => 'http://www.php.net/manual/en/ref.sockets.php',
-    'Session' => 'http://www.php.net/manual/en/ref.session.php',
-    'PCRE' => 'http://www.php.net/manual/en/ref.pcre.php',
-    'FileInfo' => 'http://www.php.net/manual/en/ref.fileinfo.php',
-    'Libiconv' => 'http://www.php.net/manual/en/ref.iconv.php',
-    'Multibyte' => 'http://www.php.net/manual/en/ref.mbstring.php',
-    'Mcrypt' => 'http://www.php.net/manual/en/ref.mcrypt.php',
-    'OpenSSL' => 'http://www.php.net/manual/en/ref.openssl.php',
-    'GD' => 'http://www.php.net/manual/en/ref.image.php',
-    'PEAR' => 'http://pear.php.net',
-    'MDB2' => 'http://pear.php.net/package/MDB2',
-    'Net_SMTP' => 'http://pear.php.net/package/Net_SMTP',
+    'Sockets'   => 'http://www.php.net/manual/en/book.sockets.php',
+    'Session'   => 'http://www.php.net/manual/en/book.session.php',
+    'PCRE'      => 'http://www.php.net/manual/en/book.pcre.php',
+    'FileInfo'  => 'http://www.php.net/manual/en/book.fileinfo.php',
+    'Libiconv'  => 'http://www.php.net/manual/en/book.iconv.php',
+    'Multibyte' => 'http://www.php.net/manual/en/book.mbstring.php',
+    'Mcrypt'    => 'http://www.php.net/manual/en/book.mcrypt.php',
+    'OpenSSL'   => 'http://www.php.net/manual/en/book.openssl.php',
+    'JSON'      => 'http://www.php.net/manual/en/book.json.php',
+    'DOM'       => 'http://www.php.net/manual/en/book.dom.php',
+    'Intl'      => 'http://www.php.net/manual/en/book.intl.php',
+    'PEAR'      => 'http://pear.php.net',
+    'MDB2'      => 'http://pear.php.net/package/MDB2',
+    'Net_SMTP'  => 'http://pear.php.net/package/Net_SMTP',
     'Mail_mime' => 'http://pear.php.net/package/Mail_mime',
-    'DOM' => 'http://www.php.net/manual/en/intro.dom.php'
 );
 
 echo '<input type="hidden" name="_step" value="' . ($RCI->configured ? 3 : 2) . '" />';
@@ -53,14 +77,14 @@ if (version_compare(PHP_VERSION, MIN_PHP_VERSION, '>=')) {
 ?>
 
 <h3>Checking PHP extensions</h3>
-<p class="hint">The following modules/extensions are <em>required</em> to run RoundCube:</p>
+<p class="hint">The following modules/extensions are <em>required</em> to run Roundcube:</p>
 <?php
 
 // get extensions location
 $ext_dir = ini_get('extension_dir');
 
 $prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
-foreach ($required_php_exts AS $name => $ext) {
+foreach ($required_php_exts as $name => $ext) {
     if (extension_loaded($ext)) {
         $RCI->pass($name);
     } else {
@@ -76,7 +100,7 @@ foreach ($required_php_exts AS $name => $ext) {
 <p class="hint">The next couple of extensions are <em>optional</em> and recommended to get the best performance:</p>
 <?php
 
-foreach ($optional_php_exts AS $name => $ext) {
+foreach ($optional_php_exts as $name => $ext) {
     if (extension_loaded($ext)) {
         $RCI->pass($name);
     }
@@ -97,7 +121,7 @@ foreach ($optional_php_exts AS $name => $ext) {
 <?php
 
 $prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
-foreach ($supported_dbs AS $database => $ext) {
+foreach ($supported_dbs as $database => $ext) {
     if (extension_loaded($ext)) {
         $RCI->pass($database);
     }
@@ -132,7 +156,7 @@ foreach ($required_libs as $classname => $file) {
 ?>
 
 <h3>Checking php.ini/.htaccess settings</h3>
-<p class="hint">The following settings are <em>required</em> to run RoundCube:</p>
+<p class="hint">The following settings are <em>required</em> to run Roundcube:</p>
 
 <?php
 
@@ -183,7 +207,7 @@ foreach ($optional_checks as $var => $val) {
 <?php
 
 if ($RCI->failures) {
-  echo '<p class="warning">Sorry but your webserver does not meet the requirements for RoundCube!<br />
+  echo '<p class="warning">Sorry but your webserver does not meet the requirements for Roundcube!<br />
             Please install the missing modules or fix the php.ini settings according to the above check results.<br />
             Hint: only checks showing <span class="fail">NOT OK</span> need to be fixed.</p>';
 }
index 02deb9b6db1f51e49af596988664513518a322a8..5250782f9bd85d35c8913e830a2b4424a2d59223 100644 (file)
@@ -14,7 +14,6 @@ $RCI->bool_config_props = array(
   'smtp_log' => 1,
   'prefer_html' => 1,
   'preview_pane' => 1,
-  'htmleditor' => 1,
   'debug_level' => 1,
 );
 
@@ -24,7 +23,7 @@ $_SESSION['allowinstaller'] = true;
 if (!empty($_POST['submit'])) {
   
   echo '<p class="notice">Copy or download the following configurations and save them in two files';
-  echo ' (names above the text box) within the <tt>'.RCMAIL_CONFIG_DIR.'</tt> directory of your RoundCube installation.<br/>';
+  echo ' (names above the text box) within the <tt>'.RCMAIL_CONFIG_DIR.'</tt> directory of your Roundcube installation.<br/>';
   echo ' Make sure that there are no characters outside the <tt>&lt;?php ?&gt;</tt> brackets when saving the files.</p>';
   
   $textbox = new html_textarea(array('rows' => 16, 'cols' => 60, 'class' => "configfile"));
@@ -343,12 +342,12 @@ $check_autocreate = new html_checkbox(array('name' => '_auto_create_user', 'id'
 echo $check_autocreate->show(intval($RCI->getprop('auto_create_user')), array('value' => 1));
 
 ?>
-<label for="cfgautocreate">Automatically create a new RoundCube user when log-in the first time</label><br />
+<label for="cfgautocreate">Automatically create a new Roundcube user when log-in the first time</label><br />
 
 <p class="hint">A user is authenticated by the IMAP server but it requires a local record to store settings
 and contacts. With this option enabled a new user record will automatically be created once the IMAP login succeeds.</p>
 
-<p class="hint">If this option is disabled, the login only succeeds if there's a matching user-record in the local RoundCube database
+<p class="hint">If this option is disabled, the login only succeeds if there's a matching user-record in the local Roundcube database
 what means that you have to create those records manually or disable this option after the first login.</p>
 </dd>
 
@@ -543,13 +542,16 @@ echo $check_prevpane->show(intval($RCI->getprop('preview_pane')));
 
 <dt class="propname">htmleditor <span class="userconf">*</span></dt>
 <dd>
+<label for="cfghtmlcompose">Compose HTML formatted messages</label>
 <?php
 
-$check_htmlcomp = new html_checkbox(array('name' => '_htmleditor', 'id' => "cfghtmlcompose", 'value' => 1));
-echo $check_htmlcomp->show(intval($RCI->getprop('htmleditor')));
+$select_htmlcomp = new html_select(array('name' => '_htmleditor', 'id' => "cfghtmlcompose"));
+$select_htmlcomp->add('never', 0);
+$select_htmlcomp->add('always', 1);
+$select_htmlcomp->add('on reply to HTML message only', 2);
+echo $select_htmlcomp->show(intval($RCI->getprop('htmleditor')));
 
 ?>
-<label for="cfghtmlcompose">Compose HTML formatted messages</label><br />
 </dd>
 
 <dt class="propname">draft_autosave <span class="userconf">*</span></dt>
@@ -571,8 +573,16 @@ echo $select_autosave->show(intval($RCI->getprop('draft_autosave')));
 <dd>
 <?php
 
+$mdn_opts = array(
+    0 => 'ask the user',
+    1 => 'send automatically',
+    3 => 'send receipt to user contacts, otherwise ask the user',
+    4 => 'send receipt to user contacts, otherwise ignore',
+    2 => 'ignore',
+);
+
 $select_mdnreq = new html_select(array('name' => '_mdn_requests', 'id' => "cfgmdnreq"));
-$select_mdnreq->add(array('ask the user', 'send automatically', 'ignore'), array(0, 1, 2));
+$select_mdnreq->add(array_values($mdn_opts), array_keys($mdn_opts));
 echo $select_mdnreq->show(intval($RCI->getprop('mdn_requests')));
 
 ?>
index d1c55e4ec8f370d9331f8d2536118cb20d10174a..1c157da7f1e602b446829d76cc2120a9bdb84477 100644 (file)
@@ -58,7 +58,7 @@ if ($RCI->configured && empty($_REQUEST['_step'])) {
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
-<title>RoundCube Webmail Installer</title>
+<title>Roundcube Webmail Installer</title>
 <meta name="Robots" content="noindex,nofollow" />
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <link rel="stylesheet" type="text/css" href="styles.css" />
@@ -69,7 +69,7 @@ if ($RCI->configured && empty($_REQUEST['_step'])) {
 
 <div id="banner">
   <div id="header">
-    <div class="banner-logo"><a href="http://www.roundcube.net"><img src="images/banner_logo.gif" width="200" height="56" border="0" alt="RoundCube Webmal Project" /></a></div>
+    <div class="banner-logo"><a href="http://www.roundcube.net"><img src="images/banner_logo.gif" width="200" height="56" border="0" alt="Roundcube Webmal Project" /></a></div>
     <div class="banner-right"><img src="images/banner_right.gif" width="10" height="56" alt="" /></div>
   </div>
   <div id="topnav">
@@ -92,7 +92,7 @@ if ($RCI->configured && empty($_REQUEST['_step'])) {
   
 ?>
 
-<h1>RoundCube Webmail Installer</h1>
+<h1>Roundcube Webmail Installer</h1>
 
 <ol id="progress">
 <?php
@@ -120,7 +120,7 @@ else {
 </div>
 
 <div id="footer">
-  Installer by the RoundCube Dev Team. Copyright &copy; 2008 - Published under the GNU Public License;&nbsp;
+  Installer by the Roundcube Dev Team. Copyright &copy; 2008 - Published under the GNU Public License;&nbsp;
   Icons by <a href="http://famfamfam.com">famfamfam</a>
 </div>
 </body>
index f30c0085f1e4b3f44c86c6f870ddb4af4cb70055..69be02563997c1b69505f4cb9201060dd1279b7e 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | rcube_install.php                                                     |
  |                                                                       |
- | This file is part of the RoundCube Webmail package                    |
- | Copyright (C) 2008-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail package                    |
+ | Copyright (C) 2008-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU Public License                                 |
  +-----------------------------------------------------------------------+
 
 
 
 /**
- * Class to control the installation process of the RoundCube Webmail package
+ * Class to control the installation process of the Roundcube Webmail package
  *
  * @category Install
- * @package  RoundCube
+ * @package  Roundcube
  * @author Thomas Bruederli
  */
 class rcube_install
@@ -38,17 +38,11 @@ class rcube_install
     'locale_string' => 'language',
     'multiple_identities' => 'identities_level',
     'addrbook_show_images' => 'show_images',
+    'imap_root' => 'imap_ns_personal',
   );
   
-  // these config options are optional or can be set to null
-  var $optional_config = array(
-    'log_driver', 'syslog_id', 'syslog_facility', 'imap_auth_type',
-    'smtp_helo_host', 'smtp_auth_type', 'sendmail_delay', 'double_auth',
-    'language', 'mail_header_delimiter', 'create_default_folders',
-    'quota_zero_as_unlimited', 'spellcheck_uri', 'spellcheck_languages',
-    'http_received_header', 'session_domain', 'mime_magic', 'log_logins',
-    'enable_installer', 'skin_include_php', 'imap_root', 'imap_delimiter',
-    'virtuser_file', 'virtuser_query', 'dont_override');
+  // these config options are required for a working system
+  var $required_config = array('db_dsnw', 'db_table_contactgroups', 'db_table_contactgroupmembers', 'des_key');
   
   /**
    * Constructor
@@ -176,16 +170,17 @@ class rcube_install
       else if ($prop == 'smtp_pass' && !empty($_POST['_smtp_user_u'])) {
         $value = '%p';
       }
-      else if ($prop == 'default_imap_folders'){
-       $value = Array();
-       foreach($this->config['default_imap_folders'] as $_folder){
-         switch($_folder) {
-         case 'Drafts': $_folder = $this->config['drafts_mbox']; break;
-         case 'Sent':   $_folder = $this->config['sent_mbox']; break;
-         case 'Junk':   $_folder = $this->config['junk_mbox']; break;
-         case 'Trash':  $_folder = $this->config['trash_mbox']; break;
+      else if ($prop == 'default_imap_folders') {
+           $value = Array();
+           foreach ($this->config['default_imap_folders'] as $_folder) {
+             switch($_folder) {
+             case 'Drafts': $_folder = $this->config['drafts_mbox']; break;
+             case 'Sent':   $_folder = $this->config['sent_mbox']; break;
+             case 'Junk':   $_folder = $this->config['junk_mbox']; break;
+             case 'Trash':  $_folder = $this->config['trash_mbox']; break;
           }
-         if (!in_array($_folder, $value))  $value[] = $_folder;
+           if (!in_array($_folder, $value))
+             $value[] = $_folder;
         }
       }
       else if (is_bool($default)) {
@@ -230,7 +225,7 @@ class rcube_install
       return null;
     
     $out = $seen = array();
-    $optional = array_flip($this->optional_config);
+    $required = array_flip($this->required_config);
     
     // iterate over the current configuration
     foreach ($this->config as $prop => $value) {
@@ -246,19 +241,19 @@ class rcube_install
     
     // iterate over default config
     foreach ($defaults as $prop => $value) {
-      if (!$seen[$prop] && !isset($this->config[$prop]) && !isset($optional[$prop]))
+      if (!isset($seen[$prop]) && !isset($this->config[$prop]) && isset($required[$prop]))
         $out['missing'][] = array('prop' => $prop);
     }
-    
+
     // check config dependencies and contradictions
     if ($this->config['enable_spellcheck'] && $this->config['spellcheck_engine'] == 'pspell') {
       if (!extension_loaded('pspell')) {
         $out['dependencies'][] = array('prop' => 'spellcheck_engine',
           'explain' => 'This requires the <tt>pspell</tt> extension which could not be loaded.');
       }
-      if (!empty($this->config['spellcheck_languages'])) {
+      else if (!empty($this->config['spellcheck_languages'])) {
         foreach ($this->config['spellcheck_languages'] as $lang => $descr)
-         if (!pspell_new($lang))
+          if (!pspell_new($lang))
             $out['dependencies'][] = array('prop' => 'spellcheck_languages',
               'explain' => "You are missing pspell support for language $lang ($descr)");
       }
@@ -332,15 +327,53 @@ class rcube_install
     }
   }
   
+  /**
+   * Compare the local database schema with the reference schema
+   * required for this version of Roundcube
+   *
+   * @param boolean True if the schema schould be updated
+   * @return boolean True if the schema is up-to-date, false if not or an error occured
+   */
+  function db_schema_check($DB, $update = false)
+  {
+    if (!$this->configured)
+      return false;
+    
+    // simple ad hand-made db schema
+    $db_schema = array(
+      'users' => array(),
+      'identities' => array(),
+      'contacts' => array(),
+      'contactgroups' => array(),
+      'contactgroupmembers' => array(),
+      'cache' => array(),
+      'messages' => array(),
+      'session' => array(),
+    );
+    
+    $errors = array();
+    
+    // check list of tables
+    $existing_tables = $DB->list_tables();
+
+    foreach ($db_schema as $table => $cols) {
+      $table = !empty($this->config['db_table_'.$table]) ? $this->config['db_table_'.$table] : $table;
+      if (!in_array($table, $existing_tables))
+        $errors[] = "Missing table ".$table;
+      // TODO: check cols and indices
+    }
+    
+    return !empty($errors) ? $errors : false;
+  }
   
   /**
    * Compare the local database schema with the reference schema
-   * required for this version of RoundCube
+   * required for this version of Roundcube
    *
    * @param boolean True if the schema schould be updated
    * @return boolean True if the schema is up-to-date, false if not or an error occured
    */
-  function db_schema_check($update = false)
+  function mdb2_schema_check($update = false)
   {
     if (!$this->configured)
       return false;
@@ -355,7 +388,8 @@ class rcube_install
       'portability' => true
     );
     
-    $schema =& MDB2_Schema::factory($this->config['db_dsnw'], $options);
+    $dsnw = $this->config['db_dsnw'];
+    $schema = MDB2_Schema::factory($dsnw, $options);
     $schema->db->supported['transactions'] = false;
     
     if (PEAR::isError($schema)) {
@@ -372,10 +406,11 @@ class rcube_install
       }
       
       // load reference schema
-      $dsn = MDB2::parseDSN($this->config['db_dsnw']);
-      $ref_schema = INSTALL_PATH . 'SQL/' . $dsn['phptype'] . '.schema.xml';
+      $dsn_arr = MDB2::parseDSN($this->config['db_dsnw']);
+
+      $ref_schema = INSTALL_PATH . 'SQL/' . $dsn_arr['phptype'] . '.schema.xml';
       
-      if (is_file($ref_schema)) {
+      if (is_readable($ref_schema)) {
         $reference = $schema->parseDatabaseDefinition($ref_schema, false, array(), $schema->options['fail_on_invalid_names']);
         
         if (PEAR::isError($reference)) {
@@ -433,7 +468,7 @@ class rcube_install
     
     foreach ($default_hosts as $key => $name) {
       if (!empty($name))
-        $out[] = is_numeric($key) ? $name : $key;
+        $out[] = rcube_parse_host(is_numeric($key) ? $name : $key);
     }
     
     return $out;
@@ -591,7 +626,7 @@ class rcube_install
   }
   
   /**
-   * Handler for RoundCube errors
+   * Handler for Roundcube errors
    */
   function raise_error($p)
   {
index 90d089ffdfbc399aec7bf7c6905f892475edfcb8..713edfbb63187800ffe7ae59772aefffa70d6a09 100644 (file)
@@ -88,18 +88,18 @@ if ($RCI->configured && ($messages = $RCI->check_config())) {
 ?>
 
 <h3>Check if directories are writable</h3>
-<p>RoundCube may need to write/save files into these directories</p>
+<p>Roundcube may need to write/save files into these directories</p>
 <?php
 
 if ($RCI->configured) {
     $pass = false;
 
-    $dirs[] = $RCI->config['temp_dir'];
+    $dirs[] = $RCI->config['temp_dir'] ? $RCI->config['temp_dir'] : 'temp';
     if($RCI->config['log_driver'] != 'syslog')
-      $dirs[] = $RCI->config['log_dir'];
+      $dirs[] = $RCI->config['log_dir'] ? $RCI->config['log_dir'] : 'logs';
 
     foreach ($dirs as $dir) {
-        $dirpath = $dir{0} == '/' ? $dir : INSTALL_PATH . $dir;
+        $dirpath = $dir[0] == '/' ? $dir : INSTALL_PATH . $dir;
         if (is_writable(realpath($dirpath))) {
             $RCI->pass($dir);
             $pass = true;
@@ -119,7 +119,7 @@ else {
 
 ?>
 
-<h3>Check configured database settings</h3>
+<h3>Check DB config</h3>
 <?php
 
 $db_working = false;
@@ -164,15 +164,14 @@ if ($db_working) {
         echo '<p><input type="submit" name="initdb" value="Initialize database" /></p>';
         $db_working = false;
     }
-  /*
-    else if (!$RCI->db_schema_check($update = !empty($_POST['updatedb']))) {
+    else if ($RCI->db_schema_check($DB, $update = !empty($_POST['updatedb']))) {
         $RCI->fail('DB Schema', "Database schema differs");
-        
-        echo $update ? '<p class="warning">Failed to update the database schema! Please manually execute the SQL statements from the SQL/*.update.sql file on your database</p>' :
-          '<p><input type="submit" name="updatedb" value="Update schema now" /></p>';
+        $db_map = array('pgsql' => 'postgres', 'mysqli' => 'mysql', 'sqlsrv' => 'mssql');
+        $updatefile = INSTALL_PATH . 'SQL/' . (isset($db_map[$DB->db_provider]) ? $db_map[$DB->db_provider] : $DB->db_provider) . '.update.sql';
+        echo '<p class="warning">Please manually execute the SQL statements from '.$updatefile.' on your database.<br/>';
+        echo 'See comments in the file and execute queries that are superscribed with the currently installed version number.</p>';
         $db_working = false;
     }
-  */
     else {
         $RCI->pass('DB Schema');
         echo '<br />';
@@ -213,10 +212,10 @@ if ($db_working) {
 
 ?>
 
-<h3>Test SMTP settings</h3>
+<h3>Test SMTP config</h3>
 
 <p>
-Server: <?php echo $RCI->getprop('smtp_server', 'PHP mail()'); ?><br />
+Server: <?php echo rcube_parse_host($RCI->getprop('smtp_server', 'PHP mail()')); ?><br />
 Port: <?php echo $RCI->getprop('smtp_port'); ?><br />
 
 <?php
@@ -246,22 +245,25 @@ $to_field = new html_inputfield(array('name' => '_to', 'id' => 'sendmailto'));
 
 <?php
 
-if (isset($_POST['sendmail']) && !empty($_POST['_from']) && !empty($_POST['_to'])) {
-  
+if (isset($_POST['sendmail'])) {
+
   echo '<p>Trying to send email...<br />';
-  
-  if (preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_from'])) &&
-      preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_to']))) {
 
+  $from = idn_to_ascii(trim($_POST['_from']));
+  $to   = idn_to_ascii(trim($_POST['_to']));
+
+  if (preg_match('/^' . $RCI->email_pattern . '$/i', $from) &&
+      preg_match('/^' . $RCI->email_pattern . '$/i', $to)
+  ) {
     $headers = array(
-      'From'    => trim($_POST['_from']),
-      'To'      => trim($_POST['_to']),
-      'Subject' => 'Test message from RoundCube',
+      'From'    => $from,
+      'To'      => $to,
+      'Subject' => 'Test message from Roundcube',
     );
 
-    $body = 'This is a test to confirm that RoundCube can send email.';
+    $body = 'This is a test to confirm that Roundcube can send email.';
     $smtp_response = array();
-    
+
     // send mail using configured SMTP server
     if ($RCI->getprop('smtp_server')) {
       $CONFIG = $RCI->config;
@@ -273,11 +275,12 @@ if (isset($_POST['sendmail']) && !empty($_POST['_from']) && !empty($_POST['_to']
         $CONFIG['smtp_pass'] = $_POST['_smtp_pass'];
       }
 
-      $mail_object  = new rcube_mail_mime();
+      $mail_object  = new Mail_mime();
       $send_headers = $mail_object->headers($headers);
 
       $SMTP = new rcube_smtp();
-      $SMTP->connect();
+      $SMTP->connect(rcube_parse_host($RCI->getprop('smtp_server')),
+        $RCI->getprop('smtp_port'), $CONFIG['smtp_user'], $CONFIG['smtp_pass']);
 
       $status = $SMTP->send_mail($headers['From'], $headers['To'],
           ($foo = $mail_object->txtHeaders($send_headers)), $body);
@@ -328,7 +331,7 @@ if (isset($_POST['sendmail']) && !empty($_POST['_from']) && !empty($_POST['_to']
 <p><input type="submit" name="sendmail" value="Send test mail" /></p>
 
 
-<h3>Test IMAP configuration</h3>
+<h3>Test IMAP config</h3>
 
 <?php
 
@@ -383,9 +386,12 @@ if (isset($_POST['imaptest']) && !empty($_POST['_host']) && !empty($_POST['_user
     $imap_host = trim($_POST['_host']);
     $imap_port = $RCI->getprop('default_port');
   }
-  
+
+  $imap_host = idn_to_ascii($imap_host);
+  $imap_user = idn_to_ascii($_POST['_user']);
+
   $imap = new rcube_imap(null);
-  if ($imap->connect($imap_host, $_POST['_user'], $_POST['_pass'], $imap_port, $imap_ssl)) {
+  if ($imap->connect($imap_host, $imap_user, $_POST['_pass'], $imap_port, $imap_ssl)) {
     $RCI->pass('IMAP connect', 'SORT capability: ' . ($imap->get_capability('SORT') ? 'yes' : 'no'));
     $imap->close();
   }
@@ -405,7 +411,8 @@ if (isset($_POST['imaptest']) && !empty($_POST['_host']) && !empty($_POST['_user
 <p class="warning">
 
 After completing the installation and the final tests please <b>remove</b> the whole
-installer folder from the document root of the webserver.<br />
+installer folder from the document root of the webserver or make sure that
+enable_installer option in main.inc.php is disabled.<br />
 <br />
 
 These files may expose sensitive configuration data like server passwords and encryption keys
index 1c101058fcc0608503dcbf21b98353820c05424c..4294f79899a9a60397d5d0801f7172c54a8c88e4 100644 (file)
@@ -1,10 +1,10 @@
 <?php
 /*
  +-------------------------------------------------------------------------+
- | RoundCube Webmail IMAP Client                                           |
+ | Roundcube Webmail IMAP Client                                           |
  | Version 0.3-20090702                                                    |
  |                                                                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                   |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                   |
  |                                                                         |
  | This program is free software; you can redistribute it and/or modify    |
  | it under the terms of the GNU General Public License version 2          |
@@ -50,4 +50,3 @@ function raise_error($p)
   $rci = rcube_install::get_instance();
   $rci->raise_error($p);
 }
-
index 0c6805a1190d14a2668201dfe1465f03733a4296..a992c5ee91faedd1c30cabdb772b5e0e7e186c79 100644 (file)
@@ -1,8 +1,8 @@
 <form action="index.php" methond="get">
 <input type="hidden" name="_step" value="1" />
 
-<p>Welcome to the interactive install script for the RoundCube Webmail package</p>
-<p>First let's check your local environment and find out if everything RoundCube needs is available.</p>
+<p>Welcome to the interactive install script for the Roundcube Webmail package</p>
+<p>First let's check your local environment and find out if everything Roundcube needs is available.</p>
 
 <p>The basic requirements are:</p>
 <ul>
index 92471384e63e4495664a852bc195c9d47b13131c..80c58d58b3cbee7ab0748d5d0a9a3d9334585378 100644 (file)
@@ -3,40 +3,41 @@
 /**
  * Additional Message Headers
  *
- * Very simple plugin which will read additional headers for outgoing messages from the config file.
+ * Very simple plugin which will add additional headers
+ * to or remove them from outgoing messages.
  *
- * Enable the plugin in config/main.inc.php and add your desired headers.
+ * Enable the plugin in config/main.inc.php and add your desired headers:
+ * $rcmail_config['additional_message_headers'] = array('User-Agent');
  *
- * @version 1.0
+ * @version @package_version@
  * @author Ziba Scott
  * @website http://roundcube.net
- * 
- * Example:
- *
- * $rcmail_config['additional_message_headers']['X-Remote-Browser'] = $_SERVER['HTTP_USER_AGENT'];
- * $rcmail_config['additional_message_headers']['X-Originating-IP'] = $_SERVER['REMOTE_ADDR'];
- * $rcmail_config['additional_message_headers']['X-RoundCube-Server'] = $_SERVER['SERVER_ADDR'];
- * if( isset( $_SERVER['MACHINE_NAME'] )) {
- *     $rcmail_config['additional_message_headers']['X-RoundCube-Server'] .= ' (' . $_SERVER['MACHINE_NAME'] . ')';
- * }
  */
 class additional_message_headers extends rcube_plugin
 {
     public $task = 'mail';
-    
+
     function init()
     {
-        $this->add_hook('outgoing_message_headers', array($this, 'message_headers'));
+        $this->add_hook('message_outgoing_headers', array($this, 'message_headers'));
     }
 
-    function message_headers($args){
+    function message_headers($args)
+    {
+       $this->load_config();
 
         // additional email headers
         $additional_headers = rcmail::get_instance()->config->get('additional_message_headers',array());
         foreach($additional_headers as $header=>$value){
-            $args['headers'][$header] = $value;
+            if (null === $value) {
+                unset($args['headers'][$header]);
+            } else {
+                $args['headers'][$header] = $value;
+            }
         }
 
         return $args;
     }
 }
+
+?>
diff --git a/plugins/additional_message_headers/config.inc.php.dist b/plugins/additional_message_headers/config.inc.php.dist
new file mode 100644 (file)
index 0000000..83ccd86
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+
+// $rcmail_config['additional_message_headers']['X-Remote-Browser'] = $_SERVER['HTTP_USER_AGENT'];
+// $rcmail_config['additional_message_headers']['X-Originating-IP'] = $_SERVER['REMOTE_ADDR'];
+// $rcmail_config['additional_message_headers']['X-RoundCube-Server'] = $_SERVER['SERVER_ADDR'];
+
+// if( isset( $_SERVER['MACHINE_NAME'] )) {
+//     $rcmail_config['additional_message_headers']['X-RoundCube-Server'] .= ' (' . $_SERVER['MACHINE_NAME'] . ')';
+// }
+
+// To remove (e.g. X-Sender) message header use null value
+// $rcmail_config['additional_message_headers']['X-Sender'] = null;
+
+?>
diff --git a/plugins/additional_message_headers/package.xml b/plugins/additional_message_headers/package.xml
new file mode 100644 (file)
index 0000000..d79dbae
--- /dev/null
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.9.0" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+    http://pear.php.net/dtd/tasks-1.0.xsd
+    http://pear.php.net/dtd/package-2.0
+    http://pear.php.net/dtd/package-2.0.xsd">
+ <name>additional_message_headers</name>
+ <channel>pear.roundcube.net</channel>
+ <summary>Additional message headers for Roundcube</summary>
+ <description>Very simple plugin which will add additional headers to or remove them from outgoing messages.</description>
+ <lead>
+  <name>Ziba Scott</name>
+  <user>ziba</user>
+  <email>email@example.org</email>
+  <active>yes</active>
+ </lead>
+ <date>2010-01-16</date>
+ <time>18:19:33</time>
+ <version>
+  <release>1.1.0</release>
+  <api>1.1.0</api>
+ </version>
+ <stability>
+  <release>stable</release>
+  <api>stable</api>
+ </stability>
+ <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPL v2</license>
+ <notes>-</notes>
+ <contents>
+  <dir baseinstalldir="/" name="/">
+   <file name="additional_message_headers.php" role="php">
+    <tasks:replace from="@name@" to="name" type="package-info" />
+    <tasks:replace from="@package_version@" to="version" type="package-info" />
+   </file>
+  </dir> <!-- / -->
+ </contents>
+ <dependencies>
+  <required>
+   <php>
+    <min>5.2.1</min>
+   </php>
+   <pearinstaller>
+    <min>1.7.0</min>
+   </pearinstaller>
+  </required>
+ </dependencies>
+ <phprelease />
+</package>
index 954fd1549e919821922d3a979090e009c9fbf385..a837508192663c2640b48ca4bb836f7f917e8d70 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Archive plugin script
- * @version 1.2
+ * @version @package_version@
  */
 
 function rcmail_archive(prop)
@@ -8,10 +8,8 @@ function rcmail_archive(prop)
   if (!rcmail.env.uid && (!rcmail.message_list || !rcmail.message_list.get_selection().length))
     return;
   
-  var uids = rcmail.env.uid ? rcmail.env.uid : rcmail.message_list.get_selection().join(',');
-    
-  rcmail.set_busy(true, 'loading');
-  rcmail.http_post('plugin.archive', '_uid='+uids+'&_mbox='+urlencode(rcmail.env.mailbox), true);
+  if (rcmail.env.mailbox != rcmail.env.archive_folder)
+    rcmail.command('moveto', rcmail.env.archive_folder);
 }
 
 // callback for app-onload event
index 27887cef3310310992b61e5172ef66ec4b3c60f4..fbb01296d7f10fb08ca58a1ead069f28f44b81a7 100644 (file)
@@ -6,7 +6,7 @@
  * Plugin that adds a new button to the mailbox toolbar
  * to move messages to a (user selectable) archive folder.
  *
- * @version 1.4
+ * @version @package_version@
  * @author Andre Rodier, Thomas Bruederli
  */
 class archive extends rcube_plugin
@@ -15,15 +15,12 @@ class archive extends rcube_plugin
 
   function init()
   {
-    $this->register_action('plugin.archive', array($this, 'request_action'));
+    $rcmail = rcmail::get_instance();
 
     // There is no "Archived flags"
     // $GLOBALS['IMAP_FLAGS']['ARCHIVED'] = 'Archive';
-    
-    $rcmail = rcmail::get_instance();
     if ($rcmail->task == 'mail' && ($rcmail->action == '' || $rcmail->action == 'show')
       && ($archive_folder = $rcmail->config->get('archive_mbox'))) {
-
       $skin_path = $this->local_skin_path();
       
       $this->include_script('archive.js');
@@ -54,8 +51,8 @@ class archive extends rcube_plugin
     else if ($rcmail->task == 'settings') {
       $dont_override = $rcmail->config->get('dont_override', array());
       if (!in_array('archive_mbox', $dont_override)) {
-        $this->add_hook('user_preferences', array($this, 'prefs_table'));
-        $this->add_hook('save_preferences', array($this, 'save_prefs'));
+        $this->add_hook('preferences_list', array($this, 'prefs_table'));
+        $this->add_hook('preferences_save', array($this, 'save_prefs'));
       }
     }
   }
@@ -81,42 +78,29 @@ class archive extends rcube_plugin
     foreach ($list as $idx => $item) {
       if ($item['id'] == $folder) {
         $list[$idx]['name'] = $new_name;
-       return true;
+        return true;
       } else if (!empty($item['folders']))
         if ($this->_mod_folder_name($list[$idx]['folders'], $folder, $new_name))
-         return true;
+        return true;
     }
     return false;
   }
 
-  function request_action()
-  {
-    $this->add_texts('localization');
-    
-    $uids = get_input_value('_uid', RCUBE_INPUT_POST);
-    $mbox = get_input_value('_mbox', RCUBE_INPUT_POST);
-    
-    $rcmail = rcmail::get_instance();
-    
-    // There is no "Archive flags", but I left this line in case it may be useful
-    // $rcmail->imap->set_flag($uids, 'ARCHIVE');
-    
-    if (($archive_mbox = $rcmail->config->get('archive_mbox')) && $mbox != $archive_mbox) {
-      $rcmail->output->command('move_messages', $archive_mbox);
-      $rcmail->output->command('display_message', $this->gettext('archived'), 'confirmation');
-    }
-    
-    $rcmail->output->send();
-  }
-
   function prefs_table($args)
   {
+    global $CURR_SECTION;
+
     if ($args['section'] == 'folders') {
       $this->add_texts('localization');
-      
+
       $rcmail = rcmail::get_instance();
-      $select = rcmail_mailbox_select(array('noselection' => '---', 'realnames' => true,
-        'maxlength' => 30, 'exceptions' => array('INBOX')));
+
+      // load folders list when needed
+      if ($CURR_SECTION)
+        $select = rcmail_mailbox_select(array('noselection' => '---', 'realnames' => true,
+          'maxlength' => 30, 'exceptions' => array('INBOX')));
+      else
+        $select = new html_select();
 
       $args['blocks']['main']['options']['archive_mbox'] = array(
           'title' => $this->gettext('archivefolder'),
index 04c8fcfa8c2f8a7814cbe8e1ab3af1195af26d0c..1396fb8e88a77a2eb6086d917a15c065f2741008 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/cs_CZ/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube archive plugin                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube archive plugin                         |
+| Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
diff --git a/plugins/archive/localization/es_AR.inc b/plugins/archive/localization/es_AR.inc
new file mode 100644 (file)
index 0000000..7d021f5
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+// MPBAUPGRADE
+
+$labels = array();
+$labels['buttontitle'] = 'Archivar este mensaje';
+$labels['archived'] = 'Mensaje Archivado';
+$labels['archivefolder'] = 'Archivo';
+
+?>
diff --git a/plugins/archive/localization/es_ES.inc b/plugins/archive/localization/es_ES.inc
new file mode 100644 (file)
index 0000000..7d021f5
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+// MPBAUPGRADE
+
+$labels = array();
+$labels['buttontitle'] = 'Archivar este mensaje';
+$labels['archived'] = 'Mensaje Archivado';
+$labels['archivefolder'] = 'Archivo';
+
+?>
diff --git a/plugins/archive/localization/ja_JP.inc b/plugins/archive/localization/ja_JP.inc
new file mode 100644 (file)
index 0000000..31fa152
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+//  EN-Revision: 3891
+
+$labels = array();
+$labels['buttontitle'] = 'このメッセージのアーカイブ';
+$labels['archived'] = 'アーカイブに成功しました。';
+$labels['archivefolder'] = 'アーカイブ';
+
+?>
diff --git a/plugins/archive/localization/nl_NL.inc b/plugins/archive/localization/nl_NL.inc
new file mode 100644 (file)
index 0000000..0d47f7b
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+$labels = array();
+$labels['buttontitle'] = 'Archiveer dit bericht';
+$labels['archived'] = 'Succesvol gearchiveerd';
+$labels['archivefolder'] = 'Archief';
+
+?>
diff --git a/plugins/archive/localization/sv_SE.inc b/plugins/archive/localization/sv_SE.inc
new file mode 100644 (file)
index 0000000..c55da7a
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+$labels = array();
+$labels['buttontitle'] = 'Arkivera meddelande';
+$labels['archived'] = 'Meddelandet är arkiverat';
+$labels['archivefolder'] = 'Arkiv';
+
+?>
diff --git a/plugins/archive/localization/zh_TW.inc b/plugins/archive/localization/zh_TW.inc
new file mode 100644 (file)
index 0000000..5cccebb
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+$labels = array();
+$labels['buttontitle'] = '封存此信件';
+$labels['archived'] = '已成功封存';
+$labels['archivefolder'] = '封存';
+
+?>
diff --git a/plugins/archive/package.xml b/plugins/archive/package.xml
new file mode 100644 (file)
index 0000000..c442a5c
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+    http://pear.php.net/dtd/tasks-1.0.xsd
+    http://pear.php.net/dtd/package-2.0
+    http://pear.php.net/dtd/package-2.0.xsd">
+       <name>archive</name>
+       <channel>pear.roundcube.net</channel>
+       <summary>Archive feature for Roundcube</summary>
+       <description>This adds a button to move the selected messages to an archive folder. The folder can be selected in the settings panel.</description>
+       <lead>
+               <name>Thomas Bruederli</name>
+               <user>thomasb</user>
+               <email>roundcube@gmail.com</email>
+               <active>yes</active>
+       </lead>
+       <date>2010-02-06</date>
+       <time>12:12:00</time>
+       <version>
+               <release>1.4</release>
+               <api>1.4</api>
+       </version>
+       <stability>
+               <release>stable</release>
+               <api>stable</api>
+       </stability>
+       <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+       <notes>-</notes>
+       <contents>
+               <dir baseinstalldir="/" name="/">
+                       <file name="archive.php" role="php">
+                               <tasks:replace from="@name@" to="name" type="package-info"/>
+                               <tasks:replace from="@package_version@" to="version" type="package-info"/>
+                       </file>
+                       <file name="archive.js" role="data">
+                               <tasks:replace from="@name@" to="name" type="package-info"/>
+                               <tasks:replace from="@package_version@" to="version" type="package-info"/>
+                       </file>
+                       <file name="localization/en_US.inc" role="data"></file>
+                       <file name="localization/cs_CZ.inc" role="data"></file>
+                       <file name="localization/de_CH.inc" role="data"></file>
+                       <file name="localization/de_DE.inc" role="data"></file>
+                       <file name="localization/et_EE.inc" role="data"></file>
+                       <file name="localization/fr_FR.inc" role="data"></file>
+                       <file name="localization/pl_PL.inc" role="data"></file>
+                       <file name="localization/ru_RU.inc" role="data"></file>
+                       <file name="localization/zh_TW.inc" role="data"></file>
+                       <file name="skins/default/archive_act.png" role="data"></file>
+                       <file name="skins/default/archive_pas.png" role="data"></file>
+                       <file name="skins/default/foldericon.png" role="data"></file>
+               </dir>
+               <!-- / -->
+       </contents>
+       <dependencies>
+               <required>
+                       <php>
+                               <min>5.2.1</min>
+                       </php>
+                       <pearinstaller>
+                               <min>1.7.0</min>
+                       </pearinstaller>
+               </required>
+       </dependencies>
+       <phprelease/>
+</package>
index c40f2d4eb63d351c4ec1fece99b5cce032323ca9..bc3d2ee7649d8298be3bc5c80f71191454e35ea3 100644 (file)
@@ -6,6 +6,7 @@
  */
 class autologon extends rcube_plugin
 {
+  public $task = 'login';
 
   function init()
   {
@@ -18,7 +19,7 @@ class autologon extends rcube_plugin
     $rcmail = rcmail::get_instance();
 
     // change action to login
-    if ($args['task'] == 'mail' && empty($args['action']) && empty($_SESSION['user_id']) && !empty($_GET['_autologin']) && $this->is_localhost())
+    if (empty($_SESSION['user_id']) && !empty($_GET['_autologin']) && $this->is_localhost())
       $args['action'] = 'login';
 
     return $args;
index a8ac62e2630a15b8cca3d1043f4cd196cef486fe..919beacbfdecfd6c1770e26a5494d4d41f3a1f0f 100644 (file)
@@ -109,19 +109,19 @@ class database_attachments extends filesystem_attachments
 
     /**
      * When composing an html message, image attachments may be shown
-     * For this plugin, $this->get_attachment will check the file and
+     * For this plugin, $this->get() will check the file and
      * return it's contents
      */
     function display($args)
     {
-        return $this->get_attachment($args);
+        return $this->get($args);
     }
 
     /**
      * When displaying or sending the attachment the file contents are fetched
-     * using this method. This is also called by the display_attachment hook.
+     * using this method. This is also called by the attachment_display hook.
      */
-    function get_attachment($args)
+    function get($args)
     {
         $rcmail = rcmail::get_instance();
         
index be736b6255c85f888ead0304ac7382d06bc5c9b5..95f5ecf39b7635ecf3ed42efea22d411510f2da3 100644 (file)
@@ -5,35 +5,73 @@
  *
  * Sample plugin to replace emoticons in plain text message body with real icons
  *
- * @version 1.0.1
+ * @version 1.3
  * @author Thomas Bruederli
+ * @author Aleksander Machniak
  * @website http://roundcube.net
  */
 class emoticons extends rcube_plugin
 {
-  public $task = 'mail';
-  private $map;
+    public $task = 'mail';
 
-  function init()
-  {
-    $this->task = 'mail';
-    $this->add_hook('message_part_after', array($this, 'replace'));
-  
-    $this->map = array(
-      ':)'  => html::img(array('src' => './program/js/tiny_mce/plugins/emotions/img/smiley-smile.gif', 'alt' => ':)')),
-      ':-)' => html::img(array('src' => './program/js/tiny_mce/plugins/emotions/img/smiley-smile.gif', 'alt' => ':-)')),
-      ':('  => html::img(array('src' => './program/js/tiny_mce/plugins/emotions/img/smiley-cry.gif', 'alt' => ':(')),
-      ':-(' => html::img(array('src' => './program/js/tiny_mce/plugins/emotions/img/smiley-cry.gif', 'alt' => ':-(')),
-    );
-  }
+    function init()
+    {
+        $this->add_hook('message_part_after', array($this, 'replace'));
+    }
 
-  function replace($args)
-  {
-    if ($args['type'] == 'plain')
-      return array('body' => strtr($args['body'], $this->map));
-  
-    return null;
-  }
+    function replace($args)
+    {
+        // This is a lookbehind assertion which will exclude html entities
+        // E.g. situation when ";)" in "&quot;)" shouldn't be replaced by the icon
+        // It's so long because of assertion format restrictions
+        $entity = '(?<!&'
+            . '[a-zA-Z0-9]{2}' . '|' . '#[0-9]{2}' . '|'
+            . '[a-zA-Z0-9]{3}' . '|' . '#[0-9]{3}' . '|'
+            . '[a-zA-Z0-9]{4}' . '|' . '#[0-9]{4}' . '|'
+            . '[a-zA-Z0-9]{5}' . '|'
+            . '[a-zA-Z0-9]{6}' . '|'
+            . '[a-zA-Z0-9]{7}'
+            . ')';
 
-}
+        // map of emoticon replacements
+        $map = array(
+            '/:\)/'             => $this->img_tag('smiley-smile.gif',       ':)'    ),
+            '/:-\)/'            => $this->img_tag('smiley-smile.gif',       ':-)'   ),
+            '/(?<!mailto):D/'   => $this->img_tag('smiley-laughing.gif',    ':D'    ),
+            '/:-D/'             => $this->img_tag('smiley-laughing.gif',    ':-D'   ),
+            '/:\(/'             => $this->img_tag('smiley-frown.gif',       ':('    ),
+            '/:-\(/'            => $this->img_tag('smiley-frown.gif',       ':-('   ),
+            '/'.$entity.';\)/'  => $this->img_tag('smiley-wink.gif',        ';)'    ),
+            '/'.$entity.';-\)/' => $this->img_tag('smiley-wink.gif',        ';-)'   ),
+            '/8\)/'             => $this->img_tag('smiley-cool.gif',        '8)'    ),
+            '/8-\)/'            => $this->img_tag('smiley-cool.gif',        '8-)'   ),
+            '/(?<!mailto):O/i'  => $this->img_tag('smiley-surprised.gif',   ':O'    ),
+            '/(?<!mailto):-O/i' => $this->img_tag('smiley-surprised.gif',   ':-O'   ),
+            '/(?<!mailto):P/i'  => $this->img_tag('smiley-tongue-out.gif',  ':P'    ),
+            '/(?<!mailto):-P/i' => $this->img_tag('smiley-tongue-out.gif',  ':-P'   ),
+            '/(?<!mailto):@/i'  => $this->img_tag('smiley-yell.gif',        ':@'    ),
+            '/(?<!mailto):-@/i' => $this->img_tag('smiley-yell.gif',        ':-@'   ),
+            '/O:\)/i'           => $this->img_tag('smiley-innocent.gif',    'O:)'   ),
+            '/O:-\)/i'          => $this->img_tag('smiley-innocent.gif',    'O:-)'  ),
+            '/(?<!mailto):$/'   => $this->img_tag('smiley-embarassed.gif',  ':$'    ),
+            '/(?<!mailto):-$/'  => $this->img_tag('smiley-embarassed.gif',  ':-$'   ),
+            '/(?<!mailto):\*/i'  => $this->img_tag('smiley-kiss.gif',       ':*'    ),
+            '/(?<!mailto):-\*/i' => $this->img_tag('smiley-kiss.gif',       ':-*'   ),
+            '/(?<!mailto):S/i'  => $this->img_tag('smiley-undecided.gif',   ':S'    ),
+            '/(?<!mailto):-S/i' => $this->img_tag('smiley-undecided.gif',   ':-S'   ),
+        );
+
+        if ($args['type'] == 'plain') {
+            $args['body'] = preg_replace(
+                array_keys($map), array_values($map), $args['body']);
+        }
 
+        return $args;
+    }
+
+    private function img_tag($ico, $title)
+    { 
+        $path = './program/js/tiny_mce/plugins/emotions/img/';
+        return html::img(array('src' => $path.$ico, 'title' => $title));
+    }
+}
index 081efcb13a4358c5405165ec673c2f41a21a12a4..c50f8d8cec82be7862173d6679611a0c6cbc7c88 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+require_once(dirname(__FILE__) . '/example_addressbook_backend.php');
+
 /**
  * Sample plugin to add a new address book
  * with just a static list of contacts
@@ -10,13 +12,13 @@ class example_addressbook extends rcube_plugin
   
   public function init()
   {
-    $this->add_hook('address_sources', array($this, 'address_sources'));
-    $this->add_hook('get_address_book', array($this, 'get_address_book'));
+    $this->add_hook('addressbooks_list', array($this, 'address_sources'));
+    $this->add_hook('addressbook_get', array($this, 'get_address_book'));
     
     // use this address book for autocompletion queries
     // (maybe this should be configurable by the user?)
     $config = rcmail::get_instance()->config;
-    $sources = $config->get('autocomplete_addressbooks', array('sql'));
+    $sources = (array) $config->get('autocomplete_addressbooks', array('sql'));
     if (!in_array($this->abook_id, $sources)) {
       $sources[] = $this->abook_id;
       $config->set('autocomplete_addressbooks', $sources);
@@ -25,14 +27,19 @@ class example_addressbook extends rcube_plugin
   
   public function address_sources($p)
   {
-    $p['sources'][$this->abook_id] = array('id' => $this->abook_id, 'name' => 'Static List', 'readonly' => true);
+    $abook = new example_addressbook_backend;
+    $p['sources'][$this->abook_id] = array(
+      'id' => $this->abook_id,
+      'name' => 'Static List',
+      'readonly' => $abook->readonly,
+      'groups' => $abook->groups,
+    );
     return $p;
   }
   
   public function get_address_book($p)
   {
-    if ($p['id'] == $this->abook_id) {
-      require_once(dirname(__FILE__) . '/example_addressbook_backend.php');
+    if ($p['id'] === $this->abook_id) {
       $p['instance'] = new example_addressbook_backend;
     }
     
index ad6b89d670c09ecdafcce82ceb9dda920427dc67..5f4e0f45c8009453dfac6c33d51eb0d0c4d9ef59 100644 (file)
@@ -11,6 +11,7 @@ class example_addressbook_backend extends rcube_addressbook
 {
   public $primary_key = 'ID';
   public $readonly = true;
+  public $groups = true;
   
   private $filter;
   private $result;
@@ -36,6 +37,14 @@ class example_addressbook_backend extends rcube_addressbook
     $this->filter = null;
   }
 
+  function list_groups($search = null)
+  {
+    return array(
+      array('ID' => 'testgroup1', 'name' => "Testgroup"),
+      array('ID' => 'testgroup2', 'name' => "Sample Group"),
+    );
+  }
+  
   public function list_records($cols=null, $subset=0)
   {
     $this->result = $this->count();
@@ -44,7 +53,7 @@ class example_addressbook_backend extends rcube_addressbook
     return $this->result;
   }
 
-  public function search($fields, $value, $strict=false, $select=true)
+  public function search($fields, $value, $strict=false, $select=true, $nocount=false, $required=array())
   {
     // no search implemented, just list all records
     return $this->list_records();
@@ -68,5 +77,33 @@ class example_addressbook_backend extends rcube_addressbook
     
     return $assoc && $sql_arr ? $sql_arr : $this->result;
   }
+
+
+  function create_group($name)
+  {
+    $result = false;
+
+    return $result;
+  }
+
+  function delete_group($gid)
+  {
+    return false;
+  }
+
+  function rename_group($gid, $newname)
+  {
+    return $newname;
+  }
+
+  function add_to_group($group_id, $ids)
+  {
+    return false;
+  }
+
+  function remove_from_group($group_id, $ids)
+  {
+     return false;
+  }
   
 }
index dce2de29391df87a5fa6b5ac7dd0ec47ef7d66e0..a2ac3a8c9d62580dce8ffa8a868ba925224b618e 100644 (file)
  */
 class filesystem_attachments extends rcube_plugin
 {
-    public $task = 'mail';
-    
+    public $task = 'mail|addressbook';
+
     function init()
     {
         // Save a newly uploaded attachment
-        $this->add_hook('upload_attachment', array($this, 'upload'));
+        $this->add_hook('attachment_upload', array($this, 'upload'));
 
         // Save an attachment from a non-upload source (draft or forward)
-        $this->add_hook('save_attachment', array($this, 'save'));
+        $this->add_hook('attachment_save', array($this, 'save'));
 
         // Remove an attachment from storage
-        $this->add_hook('remove_attachment', array($this, 'remove'));
+        $this->add_hook('attachment_delete', array($this, 'remove'));
 
         // When composing an html message, image attachments may be shown
-        $this->add_hook('display_attachment', array($this, 'display'));
+        $this->add_hook('attachment_display', array($this, 'display'));
 
         // Get the attachment from storage and place it on disk to be sent
-        $this->add_hook('get_attachment', array($this, 'get_attachment'));
+        $this->add_hook('attachment_get', array($this, 'get'));
 
         // Delete all temp files associated with this user
-        $this->add_hook('cleanup_attachments', array($this, 'cleanup'));
-        $this->add_hook('kill_session', array($this, 'cleanup'));
+        $this->add_hook('attachments_cleanup', array($this, 'cleanup'));
+        $this->add_hook('session_destroy', array($this, 'cleanup'));
     }
 
     /**
@@ -52,8 +52,7 @@ class filesystem_attachments extends rcube_plugin
         $rcmail = rcmail::get_instance();
 
         // use common temp dir for file uploads
-        // #1484529: we need absolute path on Windows for move_uploaded_file()
-        $temp_dir = realpath($rcmail->config->get('temp_dir'));
+        $temp_dir = $rcmail->config->get('temp_dir');
         $tmpfname = tempnam($temp_dir, 'rcmAttmnt');
 
         if (move_uploaded_file($args['path'], $tmpfname) && file_exists($tmpfname)) {
@@ -77,7 +76,7 @@ class filesystem_attachments extends rcube_plugin
 
         if (!$args['path']) {
             $rcmail = rcmail::get_instance();
-            $temp_dir = unslashify($rcmail->config->get('temp_dir'));
+            $temp_dir = $rcmail->config->get('temp_dir');
             $tmp_path = tempnam($temp_dir, 'rcmAttmnt');
 
             if ($fp = fopen($tmp_path, 'w')) {
@@ -87,10 +86,10 @@ class filesystem_attachments extends rcube_plugin
             } else
                 return $args;
         }
-        
+
         $args['id'] = $this->file_id();
         $args['status'] = true;
-            
+
         // Note the file for later cleanup
         $_SESSION['plugins']['filesystem_attachments']['tmp_files'][] = $args['path'];
 
@@ -123,11 +122,11 @@ class filesystem_attachments extends rcube_plugin
      * on disk for use.  This stub function is kept here to make this 
      * class handy as a parent class for other plugins which may need it.
      */
-    function get_attachment($args)
+    function get($args)
     {
         return $args;
     }
-    
+
     /**
      * Delete all temp files associated with this user
      */
@@ -150,7 +149,7 @@ class filesystem_attachments extends rcube_plugin
     function file_id()
     {
         $userid = rcmail::get_instance()->user->ID;
-       list($usec, $sec) = explode(' ', microtime()); 
+           list($usec, $sec) = explode(' ', microtime()); 
         return preg_replace('/[^0-9]/', '', $userid . $sec . $usec);
     }
 }
index 6b27227b0cd839576eba6d44afd015d96f7e473b..d440dbbccd5f4d880c39cff8a2dea0e18d33b89c 100644 (file)
@@ -3,6 +3,3 @@
 // Help content iframe source
 // $rcmail_config['help_source'] = 'http://trac.roundcube.net/wiki';
 $rcmail_config['help_source'] = '';
-
-?>
-  
\ No newline at end of file
index 69ac080b69df5f6c677d9cd838778544efc5ba5c..c5bc2f477a6e579246dc7cac70cf1bb6a33276fa 100644 (file)
@@ -1,5 +1,5 @@
 <div id="helpabout">
-<h3 align="center">Copyright &copy; 2005-2009, The Roundcube Dev Team</h3>
+<h3 align="center">Copyright &copy; 2005-2010, The Roundcube Dev Team</h3>
 
 <p>This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License version 2
index c02b7e991583215ca47115fa54c6ad2a175f1266..0c70b3a695d463704f5a2a77fc1fbf2c119e6897 100644 (file)
 
 class help extends rcube_plugin
 {
+    // all task excluding 'login' and 'logout'
+    public $task = '?(?!login|logout).*';
+    // we've got no ajax handlers
+    public $noajax = true;
+    // skip frames
+    public $noframe = true;
+
     function init()
     {
-      $this->add_texts('localization/', false);
-      
-      // register actions
-      $this->register_action('plugin.help', array($this, 'action'));
-      $this->register_action('plugin.helpabout', array($this, 'action'));
-      $this->register_action('plugin.helplicense', array($this, 'action'));
-
-      // add taskbar button
-      $this->add_button(array(
-       'name'  => 'helptask',
-       'class' => 'button-help',
-       'label' => 'help.help',
-       'href'  => './?_task=dummy&_action=plugin.help',
-        ), 'taskbar');
-
-      $skin = rcmail::get_instance()->config->get('skin');
-      if (!file_exists($this->home."/skins/$skin/help.css"))
-       $skin = 'default';
-
-      // add style for taskbar button (must be here) and Help UI    
-      $this->include_stylesheet("skins/$skin/help.css");
+        $rcmail = rcmail::get_instance();
+
+        $this->add_texts('localization/', false);
+
+        // register task
+        $this->register_task('help');
+
+        // register actions
+        $this->register_action('', array($this, 'action'));
+        $this->register_action('about', array($this, 'action'));
+        $this->register_action('license', array($this, 'action'));
+
+        // add taskbar button
+        $this->add_button(array(
+               'name'  => 'helptask',
+               'class' => 'button-help',
+               'label' => 'help.help',
+               'href'  => './?_task=help',
+            'onclick' => sprintf("return %s.command('help')", JS_OBJECT_NAME)
+            ), 'taskbar');
+
+        $rcmail->output->add_script(
+            JS_OBJECT_NAME . ".enable_command('help', true);\n" .
+            JS_OBJECT_NAME . ".help = function () { location.href = './?_task=help'; }",
+            'head');
+
+        $skin = $rcmail->config->get('skin');
+        if (!file_exists($this->home."/skins/$skin/help.css"))
+               $skin = 'default';
+
+        // add style for taskbar button (must be here) and Help UI    
+        $this->include_stylesheet("skins/$skin/help.css");
     }
 
     function action()
     {
-      $rcmail = rcmail::get_instance();
+        $rcmail = rcmail::get_instance();
 
-      $this->load_config();
+        $this->load_config();
 
-      // register UI objects
-      $rcmail->output->add_handlers(array(
-           'helpcontent' => array($this, 'content'),
-      ));
+        // register UI objects
+        $rcmail->output->add_handlers(array(
+               'helpcontent' => array($this, 'content'),
+        ));
 
-      if ($rcmail->action == 'plugin.helpabout')
-       $rcmail->output->set_pagetitle($this->gettext('about'));
-      else if ($rcmail->action == 'plugin.helplicense')
-        $rcmail->output->set_pagetitle($this->gettext('license'));
-      else
-        $rcmail->output->set_pagetitle($this->gettext('help'));
+        if ($rcmail->action == 'about')
+               $rcmail->output->set_pagetitle($this->gettext('about'));
+        else if ($rcmail->action == 'license')
+            $rcmail->output->set_pagetitle($this->gettext('license'));
+        else
+            $rcmail->output->set_pagetitle($this->gettext('help'));
 
-      $rcmail->output->send('help.help');
+        $rcmail->output->send('help.help');
     }
-    
+
     function content($attrib)
     {
-      $rcmail = rcmail::get_instance();
+        $rcmail = rcmail::get_instance();
 
-      if ($rcmail->action == 'plugin.helpabout') {
-       return @file_get_contents($this->home.'/content/about.html');
-      }
-      else if ($rcmail->action == 'plugin.helplicense') {
-       return @file_get_contents($this->home.'/content/license.html');
-      }
+        if ($rcmail->action == 'about') {
+               return @file_get_contents($this->home.'/content/about.html');
+        }
+        else if ($rcmail->action == 'license') {
+               return @file_get_contents($this->home.'/content/license.html');
+        }
 
-      // default content: iframe
+        // default content: iframe
 
-      if ($src = $rcmail->config->get('help_source'))
-       $attrib['src'] = $src;
+        if ($src = $rcmail->config->get('help_source'))
+               $attrib['src'] = $src;
 
-      if (empty($attrib['id']))
-        $attrib['id'] = 'rcmailhelpcontent';
+        if (empty($attrib['id']))
+            $attrib['id'] = 'rcmailhelpcontent';
     
-      // allow the following attributes to be added to the <iframe> tag
-      $attrib_str = create_attrib_string($attrib, array('id', 'class', 'style', 'src', 'width', 'height', 'frameborder'));
-      $framename = $attrib['id'];
+        // allow the following attributes to be added to the <iframe> tag
+        $attrib_str = create_attrib_string($attrib, array(
+            'id', 'class', 'style', 'src', 'width', 'height', 'frameborder'));
 
-      $out = sprintf('<iframe name="%s"%s></iframe>'."\n", $framename, $attrib_str);
+        $out = sprintf('<iframe name="%s"%s></iframe>'."\n", $attrib['id'], $attrib_str);
     
-      return $out;
+        return $out;
     }
-    
-}
 
-?>
+}
index 638b3556fd703bd5c6d98358a1b3932b7e32e6c8..472c753c560faa52ccdefab2dc959a9b1d6f9567 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/cs_CZ/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube help plugin                            |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube help plugin                            |
+| Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
diff --git a/plugins/help/localization/da_DK.inc b/plugins/help/localization/da_DK.inc
new file mode 100644 (file)
index 0000000..7533012
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+$labels = array();
+$labels['help'] = 'Hjælp';
+$labels['about'] = 'Om';
+$labels['license'] = 'Licens';
+
+?>
diff --git a/plugins/help/localization/de_DE.inc b/plugins/help/localization/de_DE.inc
new file mode 100644 (file)
index 0000000..55d75e2
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+// translation done by Ulli Heist - http://heist.hobby-site.org/
+$labels = array();
+$labels['help'] = 'Hilfe';
+$labels['about'] = '&Uuml;ber';
+$labels['license'] = 'Lizenz';
+
+?>
diff --git a/plugins/help/localization/es_ES.inc b/plugins/help/localization/es_ES.inc
new file mode 100644 (file)
index 0000000..1d92185
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+$labels = array();
+$labels['help'] = 'Ayuda';
+$labels['about'] = 'Acerca de';
+$labels['license'] = 'Licencia';
+
+?>
diff --git a/plugins/help/localization/ja_JP.inc b/plugins/help/localization/ja_JP.inc
new file mode 100644 (file)
index 0000000..18081bb
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+//  EN-Revision: 3891
+
+$labels = array();
+$labels['help'] = 'ヘルプ';
+$labels['about'] = '紹介';
+$labels['license'] = 'ライセンス';
+
+?>
diff --git a/plugins/help/localization/ru_RU.inc b/plugins/help/localization/ru_RU.inc
new file mode 100644 (file)
index 0000000..aad0a61
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+
+/*
+
++-----------------------------------------------------------------------+
+| plugins/help/localization/ru_RU.inc                                   |
+|                                                                       |
+| Language file of the Roundcube help plugin                            |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Sergey Dukachev <iam@dukess.ru>                               |
++-----------------------------------------------------------------------+
+
+*/
+
+$labels = array();
+$labels['help'] = 'Помощь';
+$labels['about'] = 'О программе';
+$labels['license'] = 'Лицензия';
+
+?>
diff --git a/plugins/help/localization/zh_TW.inc b/plugins/help/localization/zh_TW.inc
new file mode 100644 (file)
index 0000000..6032837
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+$labels = array();
+$labels['help'] = '說明';
+$labels['about'] = '關於';
+$labels['license'] = '許可證';
+
+?>
index e0b01bbf0d17003268b38d2c5889b17b9b764ef1..8f67f111e449fe197bf3826bc2415f0761f57ffd 100644 (file)
@@ -1,23 +1,14 @@
-/***** RoundCube|Mail Help task styles *****/
+/***** Roundcube|Mail Help task styles *****/
 
 #taskbar a.button-help
 {
   background-image: url('help.gif');
 }
 
-#help-box
+.help-box
 {
-  position: absolute;
-  bottom: 30px; 
-  top: 95px;
-  left: 20px;
-  right: 20px;
-  border: 1px solid #999999;
   overflow: auto;  
   background-color: #F2F2F2;
-  /* IE hack */
-  height: expression((parseInt(document.documentElement.clientHeight)-125)+'px');
-  width: expression((parseInt(document.documentElement.clientWight)-40)+'px');
 }
 
 #helplicense, #helpabout
index 14b8fca52d0f6ac5872dc75eb850b3ac02b79d88..98beb6655fcf494628f6aa52e50832baaf8db82a 100644 (file)
@@ -8,10 +8,9 @@
 <script type="text/javascript">
 function help_init_settings_tabs()
 {
-    var tab = '#helptabdefault';
-    if (window.rcmail && rcmail.env.action) {
-       var action = rcmail.env.action.replace(/^plugin\.help/, '');
-       tab = '#helptab' + (action ? action : 'default');
+    var action, tab = '#helptabdefault';
+    if (window.rcmail && (action = rcmail.env.action)) {
+           tab = '#helptab' + (action ? action : 'default');
     }
     $(tab).addClass('tablink-selected');
 }             
@@ -23,14 +22,14 @@ function help_init_settings_tabs()
 <roundcube:include file="/includes/header.html" />
 
 <div id="tabsbar">
-<span id="helptabdefault" class="tablink"><roundcube:button name="helpdefault" href="?_task=dummy&_action=plugin.help" type="link" label="help.help" title="help.help" /></span>
-<span id="helptababout" class="tablink"><roundcube:button name="helpabout" href="?_task=dummy&_action=plugin.helpabout" type="link" label="help.about" title="help.about" class="tablink" /></span>
-<span id="helptablicense" class="tablink"><roundcube:button name="helplicense" href="?_task=dummy&_action=plugin.helplicense" type="link" label="help.license" title="help.license" class="tablink" /></span>
+<span id="helptabdefault" class="tablink"><roundcube:button name="helpdefault" href="?_task=help" type="link" label="help.help" title="help.help" /></span>
+<span id="helptababout" class="tablink"><roundcube:button name="helpabout" href="?_task=help&_action=about" type="link" label="help.about" title="help.about" class="tablink" /></span>
+<span id="helptablicense" class="tablink"><roundcube:button name="helplicense" href="?_task=help&_action=license" type="link" label="help.license" title="help.license" class="tablink" /></span>
 <roundcube:container name="helptabs" id="helptabsbar" />
 <script type="text/javascript"> if (window.rcmail) rcmail.add_onload(help_init_settings_tabs);</script>
 </div>
 
-<div id="help-box">
+<div id="mainscreen" class="box help-box">
 <roundcube:object name="helpcontent" id="helpcontentframe" width="100%" height="100%" frameborder="0" src="/watermark.html" />
 </div>
 
index 57422a74d74c2ab0377252c32b7cbad54310ee3c..a8003cf463f9a5be6a3d770327efa2fe2fa76a93 100644 (file)
@@ -5,11 +5,12 @@
  *
  * Make use of an existing HTTP authentication and perform login with the existing user credentials
  *
- * @version 1.0
+ * @version 1.1
  * @author Thomas Bruederli
  */
 class http_authentication extends rcube_plugin
 {
+  public $task = 'login';
 
   function init()
   {
@@ -20,7 +21,7 @@ class http_authentication extends rcube_plugin
   function startup($args)
   {
     // change action to login
-    if ($args['task'] == 'mail' && empty($args['action']) && empty($_SESSION['user_id'])
+    if (empty($args['action']) && empty($_SESSION['user_id'])
         && !empty($_SERVER['PHP_AUTH_USER']) && !empty($_SERVER['PHP_AUTH_PW']))
       $args['action'] = 'login';
 
@@ -33,6 +34,8 @@ class http_authentication extends rcube_plugin
       $args['user'] = $_SERVER['PHP_AUTH_USER'];
       $args['pass'] = $_SERVER['PHP_AUTH_PW'];
     }
+    
+    $args['cookiecheck'] = false;
   
     return $args;
   }
index d5abbb2c14e6d4763e2b79587e2a07990d660ca6..61d198ce626075822f0896953939ef7ddeac7e86 100644 (file)
@@ -1,3 +1,68 @@
+- Added support for SASL proxy authentication (#1486691)
+- Fixed parsing of scripts with \r\n line separator
+- Apply forgotten changes for form errors handling
+
+* version 2.10 [2010-10-10]
+-----------------------------------------------------------
+- Fixed import from Avelsieve
+- Use localized size units (#1486976)
+- Added support for relational operators and i;ascii-numeric comparator
+- Added popups with form errors
+
+* version 2.9 [2010-08-02]
+-----------------------------------------------------------
+- Fixed vacation parameters parsing (#1486883)
+
+* version 2.8 [2010-07-08]
+-----------------------------------------------------------
+- Added managesieve_auth_type option (#1486731)
+
+* version 2.7 [2010-07-06]
+-----------------------------------------------------------
+- Update Net_Sieve to version 1.3.0 (fixes LOGIN athentication)
+- Added support for copying and copy sending of messages (COPY extension)
+
+* version 2.6 [2010-06-03]
+-----------------------------------------------------------
+- Support %n and %d variables in managesieve_host option
+
+* version 2.5 [2010-05-04]
+-----------------------------------------------------------
+- Fix filters set label after activation
+- Fix filters set activation, add possibility to deactivate sets (#1486699)
+- Fix download button state when sets list is empty
+- Fix errors when sets list is empty
+
+* version 2.4 [2010-04-01]
+-----------------------------------------------------------
+- Fixed bug in DIGEST-MD5 authentication (http://pear.php.net/bugs/bug.php?id=17285)
+- Fixed disabling rules with many tests
+- Small css unification with core
+- Scripts import/export
+
+* version 2.3 [2010-03-18]
+-----------------------------------------------------------
+- Added import from Horde-INGO
+- Support for more than one match using if+stop instead of if+elsif structures (#1486078)
+- Support for selectively disabling rules within a single sieve script (#1485882)
+- Added vertical splitter
+
+* version 2.2 [2010-02-06]
+-----------------------------------------------------------
+- Fix handling of "<>" characters in filter names (#1486477)
+
+* version 2.1 [2010-01-12]
+-----------------------------------------------------------
+- Fix "require" structure generation when many modules are used
+- Fix problem with '<' and '>' characters in header tests
+
+* version 2.0 [2009-11-02]
+-----------------------------------------------------------
+- Added 'managesieve_debug' option
+- Added multi-script support
+- Small css improvements + sprite image buttons
+- PEAR::NetSieve 1.2.0b1
+
 * version 1.7 [2009-09-20]
 -----------------------------------------------------------
 - Support multiple managesieve hosts using %h variable
index c9ea44e764032c1f9a6f82cd32862e04dde17e29..905cfef18c5da255cbd2997ce58ddac5aa625a85 100644 (file)
@@ -4,9 +4,25 @@
 $rcmail_config['managesieve_port'] = 2000;
 
 // managesieve server address, default is localhost.
-// Use %h variable as replacement for user's IMAP hostname
+// Replacement variables supported in host name:
+// %h - user's IMAP hostname
+// %n - http hostname ($_SERVER['SERVER_NAME'])
+// %d - domain (http hostname without the first part)
+// For example %n = mail.domain.tld, %d = domain.tld
 $rcmail_config['managesieve_host'] = 'localhost';
 
+// authentication method. Can be CRAM-MD5, DIGEST-MD5, PLAIN, LOGIN, EXTERNAL
+// or none. Optional, defaults to best method supported by server.
+$rcmail_config['managesieve_auth_type'] = null;
+
+// Optional managesieve authentication identifier to be used as authorization proxy.
+// Authenticate as a different user but act on behalf of the logged in user.
+// Works with PLAIN and DIGEST-MD5 auth.
+$rcmail_config['managesieve_auth_cid'] = null;
+
+// Optional managesieve authentication password to be used for imap_auth_cid
+$rcmail_config['managesieve_auth_pw'] = null;
+
 // use or not TLS for managesieve server connection
 // it's because I've problems with TLS and dovecot's managesieve plugin
 // and it's not needed on localhost
@@ -17,8 +33,8 @@ $rcmail_config['managesieve_default'] = '/etc/dovecot/sieve/global';
 
 // Sieve RFC says that we should use UTF-8 endcoding for mailbox names,
 // but some implementations does not covert UTF-8 to modified UTF-7.
-// Defaults to UTF7-IMAP for backward compatybility
-$rcmail_config['managesieve_mbox_encoding'] = 'UTF7-IMAP';
+// Defaults to UTF7-IMAP
+$rcmail_config['managesieve_mbox_encoding'] = 'UTF-8';
 
 // I need this because my dovecot (with listescape plugin) uses
 // ':' delimiter, but creates folders with dot delimiter
@@ -31,4 +47,7 @@ $rcmail_config['managesieve_replace_delimiter'] = '';
 // Note: not all extensions are implemented
 $rcmail_config['managesieve_disabled_extensions'] = array();
 
+// Enables debugging of conversation with sieve server. Logs it into <log_dir>/sieve
+$rcmail_config['managesieve_debug'] = false;
+
 ?>
index 072905d68e6ffaa06321578ec268a1278d284ecd..ecc907194136f711adfbc58b017e0ac9e9bf855a 100644 (file)
 <?php
-// +-----------------------------------------------------------------------+
-// | Copyright (c) 2002-2003, Richard Heyes                                |
-// | Copyright (c) 2006,2008 Anish Mistry                                  |
-// | All rights reserved.                                                  |
-// |                                                                       |
-// | Redistribution and use in source and binary forms, with or without    |
-// | modification, are permitted provided that the following conditions    |
-// | are met:                                                              |
-// |                                                                       |
-// | o Redistributions of source code must retain the above copyright      |
-// |   notice, this list of conditions and the following disclaimer.       |
-// | o 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.|
-// | o The names of the authors may not be used to endorse or promote      |
-// |   products derived from this software without specific prior written  |
-// |   permission.                                                         |
-// |                                                                       |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
-// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
-// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
-// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
-// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
-// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
-// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
-// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
-// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
-// |                                                                       |
-// +-----------------------------------------------------------------------+
-// | Author: Richard Heyes <richard@phpguru.org>                           |
-// | Co-Author: Damian Fernandez Sosa <damlists@cnba.uba.ar>               |
-// | Co-Author: Anish Mistry <amistry@am-productions.biz>                  |
-// +-----------------------------------------------------------------------+
-
-require_once('Net/Socket.php');
+/**
+ * This file contains the Net_Sieve class.
+ *
+ * PHP version 4
+ *
+ * +-----------------------------------------------------------------------+
+ * | All rights reserved.                                                  |
+ * |                                                                       |
+ * | Redistribution and use in source and binary forms, with or without    |
+ * | modification, are permitted provided that the following conditions    |
+ * | are met:                                                              |
+ * |                                                                       |
+ * | o Redistributions of source code must retain the above copyright      |
+ * |   notice, this list of conditions and the following disclaimer.       |
+ * | o Redistributions in binary form must reproduce the above copyright   |
+ * |   notice, this list of conditions and the following disclaimer in the |
+ * |   documentation and/or other materials provided with the distribution.|
+ * |                                                                       |
+ * | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
+ * | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
+ * | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+ * | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
+ * | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+ * | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
+ * | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+ * | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+ * | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
+ * | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+ * | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
+ * +-----------------------------------------------------------------------+
+ *
+ * @category  Networking
+ * @package   Net_Sieve
+ * @author    Richard Heyes <richard@phpguru.org>
+ * @author    Damian Fernandez Sosa <damlists@cnba.uba.ar>
+ * @author    Anish Mistry <amistry@am-productions.biz>
+ * @author    Jan Schneider <jan@horde.org>
+ * @copyright 2002-2003 Richard Heyes
+ * @copyright 2006-2008 Anish Mistry
+ * @license   http://www.opensource.org/licenses/bsd-license.php BSD
+ * @version   SVN: $Id: Sieve.php 300898 2010-07-01 09:49:02Z yunosh $
+ * @link      http://pear.php.net/package/Net_Sieve
+ */
+
+require_once 'PEAR.php';
+require_once 'Net/Socket.php';
 
 /**
-* TODO
-*
-* o supportsAuthMech()
-*/
+ * TODO
+ *
+ * o supportsAuthMech()
+ */
 
 /**
-* Disconnected state
-* @const NET_SIEVE_STATE_DISCONNECTED
-*/
-define('NET_SIEVE_STATE_DISCONNECTED',  1, true);
+ * Disconnected state
+ * @const NET_SIEVE_STATE_DISCONNECTED
+ */
+define('NET_SIEVE_STATE_DISCONNECTED', 1, true);
 
 /**
-* Authorisation state
-* @const NET_SIEVE_STATE_AUTHORISATION
-*/
+ * Authorisation state
+ * @const NET_SIEVE_STATE_AUTHORISATION
+ */
 define('NET_SIEVE_STATE_AUTHORISATION', 2, true);
 
 /**
-* Transaction state
-* @const NET_SIEVE_STATE_TRANSACTION
-*/
-define('NET_SIEVE_STATE_TRANSACTION',   3, true);
+ * Transaction state
+ * @const NET_SIEVE_STATE_TRANSACTION
+ */
+define('NET_SIEVE_STATE_TRANSACTION', 3, true);
 
-/**
-* A class for talking to the timsieved server which
-* comes with Cyrus IMAP.
-*
-* SIEVE: RFC3028 http://www.ietf.org/rfc/rfc3028.txt
-* MANAGE-SIEVE: http://www.ietf.org/internet-drafts/draft-martin-managesieve-07.txt
-*
-* @author  Richard Heyes <richard@php.net>
-* @author  Damian Fernandez Sosa <damlists@cnba.uba.ar>
-* @author  Anish Mistry <amistry@am-productions.biz>
-* @access  public
-* @version 1.2.0
-* @package Net_Sieve
-*/
 
+/**
+ * A class for talking to the timsieved server which comes with Cyrus IMAP.
+ *
+ * @category  Networking
+ * @package   Net_Sieve
+ * @author    Richard Heyes <richard@phpguru.org>
+ * @author    Damian Fernandez Sosa <damlists@cnba.uba.ar>
+ * @author    Anish Mistry <amistry@am-productions.biz>
+ * @author    Jan Schneider <jan@horde.org>
+ * @copyright 2002-2003 Richard Heyes
+ * @copyright 2006-2008 Anish Mistry
+ * @license   http://www.opensource.org/licenses/bsd-license.php BSD
+ * @version   Release: 1.3.0
+ * @link      http://pear.php.net/package/Net_Sieve
+ * @link      http://www.ietf.org/rfc/rfc3028.txt RFC 3028 (Sieve: A Mail
+ *            Filtering Language)
+ * @link      http://tools.ietf.org/html/draft-ietf-sieve-managesieve A
+ *            Protocol for Remotely Managing Sieve Scripts
+ */
 class Net_Sieve
 {
     /**
-    * The socket object
-    * @var object
-    */
+     * The authentication methods this class supports.
+     *
+     * Can be overwritten if having problems with certain methods.
+     *
+     * @var array
+     */
+    var $supportedAuthMethods = array('DIGEST-MD5', 'CRAM-MD5', 'EXTERNAL',
+                                      'PLAIN' , 'LOGIN');
+
+    /**
+     * SASL authentication methods that require Auth_SASL.
+     *
+     * @var array
+     */
+    var $supportedSASLAuthMethods = array('DIGEST-MD5', 'CRAM-MD5');
+
+    /**
+     * The socket handle.
+     *
+     * @var resource
+     */
     var $_sock;
 
     /**
-    * Info about the connect
-    * @var array
-    */
+     * Parameters and connection information.
+     *
+     * @var array
+     */
     var $_data;
 
     /**
-    * Current state of the connection
-    * @var integer
-    */
+     * Current state of the connection.
+     *
+     * One of the NET_SIEVE_STATE_* constants.
+     *
+     * @var integer
+     */
     var $_state;
 
     /**
-    * Constructor error is any
-    * @var object
-    */
+     * Constructor error.
+     *
+     * @var PEAR_Error
+     */
     var $_error;
 
     /**
-    * To allow class debuging
-    * @var boolean
-    */
+     * Whether to enable debugging.
+     *
+     * @var boolean
+     */
     var $_debug = false;
 
     /**
-    * Allows picking up of an already established connection
-    * @var boolean
-    */
+     * Debug output handler.
+     *
+     * This has to be a valid callback.
+     *
+     * @var string|array
+     */
+    var $_debug_handler = null;
+
+    /**
+     * Whether to pick up an already established connection.
+     *
+     * @var boolean
+     */
     var $_bypassAuth = false;
 
     /**
-    * Whether to use TLS if available
-    * @var boolean
-    */
+     * Whether to use TLS if available.
+     *
+     * @var boolean
+     */
     var $_useTLS = true;
 
     /**
-    * Additional options for stream_context_create()
-    * @var array
-    */
+     * Additional options for stream_context_create().
+     *
+     * @var array
+     */
     var $_options = null;
 
     /**
-    * The auth methods this class support
-    * @var array
-    */
-    var $supportedAuthMethods=array('DIGEST-MD5', 'CRAM-MD5', 'EXTERNAL', 'PLAIN' , 'LOGIN');
-    //if you have problems using DIGEST-MD5 authentication  please comment the line above and uncomment the following line
-    //var $supportedAuthMethods=array( 'CRAM-MD5', 'PLAIN' , 'LOGIN');
-
-    //var $supportedAuthMethods=array( 'PLAIN' , 'LOGIN');
-
-    /**
-    * The auth methods this class support
-    * @var array
-    */
-    var $supportedSASLAuthMethods=array('DIGEST-MD5', 'CRAM-MD5');
-
-    /**
-    * Handles posible referral loops
-    * @var array
-    */
+     * Maximum number of referral loops
+     *
+     * @var array
+     */
     var $_maxReferralCount = 15;
 
     /**
-    * Constructor
-    * Sets up the object, connects to the server and logs in. stores
-    * any generated error in $this->_error, which can be retrieved
-    * using the getError() method.
-    *
-    * @param  string $user      Login username
-    * @param  string $pass      Login password
-    * @param  string $host      Hostname of server
-    * @param  string $port      Port of server
-    * @param  string $logintype Type of login to perform
-    * @param  string $euser     Effective User (if $user=admin, login as $euser)
-    * @param  string $bypassAuth Skip the authentication phase.  Useful if the socket
-                                  is already open.
-    * @param  boolean $useTLS Use TLS if available
-    * @param  array  $options   options for stream_context_create()
-    */
-    function Net_Sieve($user = null , $pass  = null , $host = 'localhost', $port = 2000, $logintype = '', $euser = '', $debug = false, $bypassAuth = false, $useTLS = true, $options = null)
+     * Constructor.
+     *
+     * Sets up the object, connects to the server and logs in. Stores any
+     * generated error in $this->_error, which can be retrieved using the
+     * getError() method.
+     *
+     * @param string  $user       Login username.
+     * @param string  $pass       Login password.
+     * @param string  $host       Hostname of server.
+     * @param string  $port       Port of server.
+     * @param string  $logintype  Type of login to perform (see
+     *                            $supportedAuthMethods).
+     * @param string  $euser      Effective user. If authenticating as an
+     *                            administrator, login as this user.
+     * @param boolean $debug      Whether to enable debugging (@see setDebug()).
+     * @param string  $bypassAuth Skip the authentication phase. Useful if the
+     *                            socket is already open.
+     * @param boolean $useTLS     Use TLS if available.
+     * @param array   $options    Additional options for
+     *                            stream_context_create().
+     * @param mixed   $handler    A callback handler for the debug output.
+     */
+    function Net_Sieve($user = null, $pass  = null, $host = 'localhost',
+                       $port = 2000, $logintype = '', $euser = '',
+                       $debug = false, $bypassAuth = false, $useTLS = true,
+                       $options = null, $handler = null)
     {
-        $this->_state = NET_SIEVE_STATE_DISCONNECTED;
-        $this->_data['user'] = $user;
-        $this->_data['pass'] = $pass;
-        $this->_data['host'] = $host;
-        $this->_data['port'] = $port;
+        $this->_state             = NET_SIEVE_STATE_DISCONNECTED;
+        $this->_data['user']      = $user;
+        $this->_data['pass']      = $pass;
+        $this->_data['host']      = $host;
+        $this->_data['port']      = $port;
         $this->_data['logintype'] = $logintype;
-        $this->_data['euser'] = $euser;
-        $this->_sock = &new Net_Socket();
-        $this->_debug = $debug;
-        $this->_bypassAuth = $bypassAuth;
-        $this->_useTLS = $useTLS;
-        $this->_options = $options;
-        /*
-        * Include the Auth_SASL package.  If the package is not available,
-        * we disable the authentication methods that depend upon it.
-        */
+        $this->_data['euser']     = $euser;
+        $this->_sock              = new Net_Socket();
+        $this->_bypassAuth        = $bypassAuth;
+        $this->_useTLS            = $useTLS;
+        $this->_options           = $options;
+        $this->setDebug($debug, $handler);
+
+        /* Try to include the Auth_SASL package.  If the package is not
+         * available, we disable the authentication methods that depend upon
+         * it. */
         if ((@include_once 'Auth/SASL.php') === false) {
-            if($this->_debug){
-                echo "AUTH_SASL NOT PRESENT!\n";
-            }
-            foreach($this->supportedSASLAuthMethods as $SASLMethod){
-                $pos = array_search( $SASLMethod, $this->supportedAuthMethods );
-                if($this->_debug){
-                    echo "DISABLING METHOD $SASLMethod\n";
-                }
+            $this->_debug('Auth_SASL not present');
+            foreach ($this->supportedSASLAuthMethods as $SASLMethod) {
+                $pos = array_search($SASLMethod, $this->supportedAuthMethods);
+                $this->_debug('Disabling method ' . $SASLMethod);
                 unset($this->supportedAuthMethods[$pos]);
             }
         }
-        if( ($user != null) && ($pass != null) ){
+
+        if (strlen($user) && strlen($pass)) {
             $this->_error = $this->_handleConnectAndLogin();
         }
     }
 
     /**
-    * Handles the errors the class can find
-    * on the server
-    *
-    * @access private
-    * @param mixed $msg  Text error message or PEAR error object
-    * @param integer $code  Numeric error code
-    * @return PEAR_Error
-    */
-    function _raiseError($msg, $code)
+     * Returns any error that may have been generated in the constructor.
+     *
+     * @return boolean|PEAR_Error  False if no error, PEAR_Error otherwise.
+     */
+    function getError()
     {
-        include_once 'PEAR.php';
-        return PEAR::raiseError($msg, $code);
+        return PEAR::isError($this->_error) ? $this->_error : false;
     }
 
     /**
-    * Handles connect and login.
-    * on the server
-    *
-    * @access private
-    * @return mixed Indexed array of scriptnames or PEAR_Error on failure
-    */
+     * Sets the debug state and handler function.
+     *
+     * @param boolean $debug   Whether to enable debugging.
+     * @param string  $handler A custom debug handler. Must be a valid callback.
+     *
+     * @return void
+     */
+    function setDebug($debug = true, $handler = null)
+    {
+        $this->_debug = $debug;
+        $this->_debug_handler = $handler;
+    }
+
+    /**
+     * Connects to the server and logs in.
+     *
+     * @return boolean  True on success, PEAR_Error on failure.
+     */
     function _handleConnectAndLogin()
     {
-        if (PEAR::isError($res = $this->connect($this->_data['host'] , $this->_data['port'], $this->_options, $this->_useTLS ))) {
+        if (PEAR::isError($res = $this->connect($this->_data['host'], $this->_data['port'], $this->_options, $this->_useTLS))) {
             return $res;
         }
-        if($this->_bypassAuth === false) {
-           if (PEAR::isError($res = $this->login($this->_data['user'], $this->_data['pass'], $this->_data['logintype'] , $this->_data['euser'] , $this->_bypassAuth) ) ) {
+        if ($this->_bypassAuth === false) {
+            if (PEAR::isError($res = $this->login($this->_data['user'], $this->_data['pass'], $this->_data['logintype'], $this->_data['euser'], $this->_bypassAuth))) {
                 return $res;
             }
         }
@@ -236,11 +284,100 @@ class Net_Sieve
     }
 
     /**
-    * Returns an indexed array of scripts currently
-    * on the server
-    *
-    * @return mixed Indexed array of scriptnames or PEAR_Error on failure
-    */
+     * Handles connecting to the server and checks the response validity.
+     *
+     * @param string  $host    Hostname of server.
+     * @param string  $port    Port of server.
+     * @param array   $options List of options to pass to
+     *                         stream_context_create().
+     * @param boolean $useTLS  Use TLS if available.
+     *
+     * @return boolean  True on success, PEAR_Error otherwise.
+     */
+    function connect($host, $port, $options = null, $useTLS = true)
+    {
+        if (NET_SIEVE_STATE_DISCONNECTED != $this->_state) {
+            return PEAR::raiseError('Not currently in DISCONNECTED state', 1);
+        }
+
+        if (PEAR::isError($res = $this->_sock->connect($host, $port, false, 5, $options))) {
+            return $res;
+        }
+
+        if ($this->_bypassAuth) {
+            $this->_state = NET_SIEVE_STATE_TRANSACTION;
+        } else {
+            $this->_state = NET_SIEVE_STATE_AUTHORISATION;
+            if (PEAR::isError($res = $this->_doCmd())) {
+                return $res;
+            }
+        }
+
+        // Explicitly ask for the capabilities in case the connection is
+        // picked up from an existing connection.
+        if (PEAR::isError($res = $this->_cmdCapability())) {
+            return PEAR::raiseError(
+                'Failed to connect, server said: ' . $res->getMessage(), 2
+            );
+        }
+
+        // Check if we can enable TLS via STARTTLS.
+        if ($useTLS && !empty($this->_capability['starttls'])
+            && function_exists('stream_socket_enable_crypto')
+        ) {
+            if (PEAR::isError($res = $this->_startTLS())) {
+                return $res;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Disconnect from the Sieve server.
+     *
+     * @param boolean $sendLogoutCMD Whether to send LOGOUT command before
+     *                               disconnecting.
+     *
+     * @return boolean  True on success, PEAR_Error otherwise.
+     */
+    function disconnect($sendLogoutCMD = true)
+    {
+        return $this->_cmdLogout($sendLogoutCMD);
+    }
+
+    /**
+     * Logs into server.
+     *
+     * @param string  $user       Login username.
+     * @param string  $pass       Login password.
+     * @param string  $logintype  Type of login method to use.
+     * @param string  $euser      Effective UID (perform on behalf of $euser).
+     * @param boolean $bypassAuth Do not perform authentication.
+     *
+     * @return boolean  True on success, PEAR_Error otherwise.
+     */
+    function login($user, $pass, $logintype = null, $euser = '', $bypassAuth = false)
+    {
+        if (NET_SIEVE_STATE_AUTHORISATION != $this->_state) {
+            return PEAR::raiseError('Not currently in AUTHORISATION state', 1);
+        }
+
+        if (!$bypassAuth ) {
+            if (PEAR::isError($res = $this->_cmdAuthenticate($user, $pass, $logintype, $euser))) {
+                return $res;
+            }
+        }
+        $this->_state = NET_SIEVE_STATE_TRANSACTION;
+
+        return true;
+    }
+
+    /**
+     * Returns an indexed array of scripts currently on the server.
+     *
+     * @return array  Indexed array of scriptnames.
+     */
     function listScripts()
     {
         if (is_array($scripts = $this->_cmdListScripts())) {
@@ -252,37 +389,39 @@ class Net_Sieve
     }
 
     /**
-    * Returns the active script
-    *
-    * @return mixed The active scriptname or PEAR_Error on failure
-    */
+     * Returns the active script.
+     *
+     * @return string  The active scriptname.
+     */
     function getActive()
     {
         if (!empty($this->_active)) {
             return $this->_active;
-
-        } elseif (is_array($scripts = $this->_cmdListScripts())) {
+        }
+        if (is_array($scripts = $this->_cmdListScripts())) {
             $this->_active = $scripts[1];
             return $scripts[1];
         }
     }
 
     /**
-    * Sets the active script
-    *
-    * @param  string $scriptname The name of the script to be set as active
-    * @return mixed              true on success, PEAR_Error on failure
-    */
+     * Sets the active script.
+     *
+     * @param string $scriptname The name of the script to be set as active.
+     *
+     * @return boolean  True on success, PEAR_Error on failure.
+     */
     function setActive($scriptname)
     {
         return $this->_cmdSetActive($scriptname);
     }
 
     /**
-    * Retrieves a script
-    *
-    * @param  string $scriptname The name of the script to be retrieved
-    * @return mixed              The script on success, PEAR_Error on failure
+     * Retrieves a script.
+     *
+     * @param string $scriptname The name of the script to be retrieved.
+     *
+     * @return string  The script on success, PEAR_Error on failure.
     */
     function getScript($scriptname)
     {
@@ -290,359 +429,337 @@ class Net_Sieve
     }
 
     /**
-    * Adds a script to the server
-    *
-    * @param  string $scriptname Name of the script
-    * @param  string $script     The script
-    * @param  boolean $makeactive Whether to make this the active script
-    * @return mixed              true on success, PEAR_Error on failure
-    */
+     * Adds a script to the server.
+     *
+     * @param string  $scriptname Name of the script.
+     * @param string  $script     The script content.
+     * @param boolean $makeactive Whether to make this the active script.
+     *
+     * @return boolean  True on success, PEAR_Error on failure.
+     */
     function installScript($scriptname, $script, $makeactive = false)
     {
         if (PEAR::isError($res = $this->_cmdPutScript($scriptname, $script))) {
             return $res;
-
-        } elseif ($makeactive) {
+        }
+        if ($makeactive) {
             return $this->_cmdSetActive($scriptname);
-
-        } else {
-            return true;
         }
+        return true;
     }
 
     /**
-    * Removes a script from the server
-    *
-    * @param  string $scriptname Name of the script
-    * @return mixed              True on success, PEAR_Error on failure
-    */
+     * Removes a script from the server.
+     *
+     * @param string $scriptname Name of the script.
+     *
+     * @return boolean  True on success, PEAR_Error on failure.
+     */
     function removeScript($scriptname)
     {
         return $this->_cmdDeleteScript($scriptname);
     }
 
     /**
-    * Returns any error that may have been generated in the
-    * constructor
-    *
-    * @return mixed False if no error, PEAR_Error otherwise
-    */
-    function getError()
+     * Checks if the server has space to store the script by the server.
+     *
+     * @param string  $scriptname The name of the script to mark as active.
+     * @param integer $size       The size of the script.
+     *
+     * @return boolean|PEAR_Error  True if there is space, PEAR_Error otherwise.
+     *
+     * @todo Rename to hasSpace()
+     */
+    function haveSpace($scriptname, $size)
     {
-        return PEAR::isError($this->_error) ? $this->_error : false;
+        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
+            return PEAR::raiseError('Not currently in TRANSACTION state', 1);
+        }
+        if (PEAR::isError($res = $this->_doCmd(sprintf('HAVESPACE "%s" %d', $scriptname, $size)))) {
+            return $res;
+        }
+        return true;
     }
 
     /**
-    * Handles connecting to the server and checking the
-    * response is valid.
-    *
-    * @access private
-    * @param  string $host Hostname of server
-    * @param  string $port Port of server
-    * @param  array  $options List of options to pass to connect
-    * @param  boolean $useTLS Use TLS if available
-    * @return mixed        True on success, PEAR_Error otherwise
-    */
-    function connect($host, $port, $options = null, $useTLS = true)
+     * Returns the list of extensions the server supports.
+     *
+     * @return array  List of extensions or PEAR_Error on failure.
+     */
+    function getExtensions()
     {
-        if (NET_SIEVE_STATE_DISCONNECTED != $this->_state) {
-            $msg='Not currently in DISCONNECTED state';
-            $code=1;
-            return $this->_raiseError($msg,$code);
+        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
+            return PEAR::raiseError('Not currently connected', 7);
         }
+        return $this->_capability['extensions'];
+    }
 
-        if (PEAR::isError($res = $this->_sock->connect($host, $port, false, 5, $options))) {
-            return $res;
+    /**
+     * Returns whether the server supports an extension.
+     *
+     * @param string $extension The extension to check.
+     *
+     * @return boolean  Whether the extension is supported or PEAR_Error on
+     *                  failure.
+     */
+    function hasExtension($extension)
+    {
+        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
+            return PEAR::raiseError('Not currently connected', 7);
         }
 
-        if($this->_bypassAuth === false) {
-            $this->_state = NET_SIEVE_STATE_AUTHORISATION;
-            if (PEAR::isError($res = $this->_doCmd())) {
-                return $res;
+        $extension = trim($this->_toUpper($extension));
+        if (is_array($this->_capability['extensions'])) {
+            foreach ($this->_capability['extensions'] as $ext) {
+                if ($ext == $extension) {
+                    return true;
+                }
             }
-        } else {
-            $this->_state = NET_SIEVE_STATE_TRANSACTION;
         }
 
-        // Explicitly ask for the capabilities in case the connection
-        // is picked up from an existing connection.
-        if(PEAR::isError($res = $this->_cmdCapability() )) {
-            $msg='Failed to connect, server said: ' . $res->getMessage();
-            $code=2;
-            return $this->_raiseError($msg,$code);
-        }
+        return false;
+    }
 
-        if($useTLS === true) {
-            // check if we can enable TLS via STARTTLS
-            if(isset($this->_capability['starttls']) && function_exists('stream_socket_enable_crypto') === true) {
-                if (PEAR::isError($res = $this->_startTLS())) {
-                    return $res;
-                }
-            }
+    /**
+     * Returns the list of authentication methods the server supports.
+     *
+     * @return array  List of authentication methods or PEAR_Error on failure.
+     */
+    function getAuthMechs()
+    {
+        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
+            return PEAR::raiseError('Not currently connected', 7);
         }
-
-        return true;
+        return $this->_capability['sasl'];
     }
 
     /**
-    * Logs into server.
-    *
-    * @param  string  $user          Login username
-    * @param  string  $pass          Login password
-    * @param  string  $logintype     Type of login method to use
-    * @param  string  $euser         Effective UID (perform on behalf of $euser)
-    * @param  boolean $bypassAuth    Do not perform authentication
-    * @return mixed                  True on success, PEAR_Error otherwise
-    */
-    function login($user, $pass, $logintype = null , $euser = '', $bypassAuth = false)
+     * Returns whether the server supports an authentication method.
+     *
+     * @param string $method The method to check.
+     *
+     * @return boolean  Whether the method is supported or PEAR_Error on
+     *                  failure.
+     */
+    function hasAuthMech($method)
     {
-        if (NET_SIEVE_STATE_AUTHORISATION != $this->_state) {
-            $msg='Not currently in AUTHORISATION state';
-            $code=1;
-            return $this->_raiseError($msg,$code);
+        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
+            return PEAR::raiseError('Not currently connected', 7);
         }
 
-        if( $bypassAuth === false ){
-            if(PEAR::isError($res=$this->_cmdAuthenticate($user , $pass , $logintype, $euser ) ) ){
-                return $res;
+        $method = trim($this->_toUpper($method));
+        if (is_array($this->_capability['sasl'])) {
+            foreach ($this->_capability['sasl'] as $sasl) {
+                if ($sasl == $method) {
+                    return true;
+                }
             }
         }
-        $this->_state = NET_SIEVE_STATE_TRANSACTION;
-        return true;
+
+        return false;
     }
 
     /**
-     * Handles the authentication using any known method
-     *
-     * @param string $uid The userid to authenticate as.
-     * @param string $pwd The password to authenticate with.
-     * @param string $userMethod The method to use ( if $userMethod == '' then the class chooses the best method (the stronger is the best ) )
-     * @param string $euser The effective uid to authenticate as.
+     * Handles the authentication using any known method.
      *
-     * @return mixed  string or PEAR_Error
+     * @param string $uid        The userid to authenticate as.
+     * @param string $pwd        The password to authenticate with.
+     * @param string $userMethod The method to use. If empty, the class chooses
+     *                           the best (strongest) available method.
+     * @param string $euser      The effective uid to authenticate as.
      *
-     * @access private
-     * @since  1.0
+     * @return void
      */
-    function _cmdAuthenticate($uid , $pwd , $userMethod = null , $euser = '' )
+    function _cmdAuthenticate($uid, $pwd, $userMethod = null, $euser = '')
     {
-        if ( PEAR::isError( $method = $this->_getBestAuthMethod($userMethod) ) ) {
+        if (PEAR::isError($method = $this->_getBestAuthMethod($userMethod))) {
             return $method;
         }
         switch ($method) {
-            case 'DIGEST-MD5':
-                $result = $this->_authDigest_MD5( $uid , $pwd , $euser );
-                return $result;
-                break;
-            case 'CRAM-MD5':
-                $result = $this->_authCRAM_MD5( $uid , $pwd, $euser);
-                break;
-            case 'LOGIN':
-                $result = $this->_authLOGIN( $uid , $pwd , $euser );
-                break;
-            case 'PLAIN':
-                $result = $this->_authPLAIN( $uid , $pwd , $euser );
-                break;
-            case 'EXTERNAL':
-                $result = $this->_authEXTERNAL( $uid , $pwd , $euser );
-                break;
-            default :
-                $result = new PEAR_Error( "$method is not a supported authentication method" );
-                break;
-        }
-
-        if (PEAR::isError($res = $this->_doCmd() )) {
+        case 'DIGEST-MD5':
+            return $this->_authDigestMD5($uid, $pwd, $euser);
+        case 'CRAM-MD5':
+            $result = $this->_authCRAMMD5($uid, $pwd, $euser);
+            break;
+        case 'LOGIN':
+            $result = $this->_authLOGIN($uid, $pwd, $euser);
+            break;
+        case 'PLAIN':
+            $result = $this->_authPLAIN($uid, $pwd, $euser);
+            break;
+        case 'EXTERNAL':
+            $result = $this->_authEXTERNAL($uid, $pwd, $euser);
+            break;
+        default :
+            $result = PEAR::raiseError(
+                $method . ' is not a supported authentication method'
+            );
+            break;
+        }
+
+        if (PEAR::isError($res = $this->_doCmd())) {
             return $res;
         }
+
         return $result;
     }
 
     /**
      * Authenticates the user using the PLAIN method.
      *
-     * @param string $user The userid to authenticate as.
-     * @param string $pass The password to authenticate with.
+     * @param string $user  The userid to authenticate as.
+     * @param string $pass  The password to authenticate with.
      * @param string $euser The effective uid to authenticate as.
      *
-     * @return array Returns an array containing the response
-     *
-     * @access private
-     * @since  1.0
+     * @return void
      */
-    function _authPLAIN($user, $pass , $euser )
+    function _authPLAIN($user, $pass, $euser)
     {
-        if ($euser != '') {
-            $cmd=sprintf('AUTHENTICATE "PLAIN" "%s"', base64_encode($euser . chr(0) . $user . chr(0) . $pass ) ) ;
-        } else {
-            $cmd=sprintf('AUTHENTICATE "PLAIN" "%s"', base64_encode( chr(0) . $user . chr(0) . $pass ) );
-        }
-        return  $this->_sendCmd( $cmd ) ;
+        return $this->_sendCmd(
+            sprintf(
+                'AUTHENTICATE "PLAIN" "%s"',
+                base64_encode($euser . chr(0) . $user . chr(0) . $pass)
+            )
+        );
     }
 
     /**
-     * Authenticates the user using the PLAIN method.
+     * Authenticates the user using the LOGIN method.
      *
-     * @param string $user The userid to authenticate as.
-     * @param string $pass The password to authenticate with.
+     * @param string $user  The userid to authenticate as.
+     * @param string $pass  The password to authenticate with.
      * @param string $euser The effective uid to authenticate as.
      *
-     * @return array Returns an array containing the response
-     *
-     * @access private
-     * @since  1.0
+     * @return void
      */
-    function _authLOGIN($user, $pass , $euser )
+    function _authLOGIN($user, $pass, $euser)
     {
-        $this->_sendCmd('AUTHENTICATE "LOGIN"');
-        $this->_doCmd(sprintf('"%s"', base64_encode($user)));
-        $this->_doCmd(sprintf('"%s"', base64_encode($pass)));
+        if (PEAR::isError($result = $this->_sendCmd('AUTHENTICATE "LOGIN"'))) {
+            return $result;
+        }
+        if (PEAR::isError($result = $this->_doCmd('"' . base64_encode($user) . '"', true))) {
+            return $result;
+        }
+        return $this->_doCmd('"' . base64_encode($pass) . '"', true);
     }
 
     /**
      * Authenticates the user using the CRAM-MD5 method.
      *
-     * @param string $uid The userid to authenticate as.
-     * @param string $pwd The password to authenticate with.
+     * @param string $user  The userid to authenticate as.
+     * @param string $pass  The password to authenticate with.
      * @param string $euser The effective uid to authenticate as.
      *
-     * @return array Returns an array containing the response
-     *
-     * @access private
-     * @since  1.0
+     * @return void
      */
-    function _authCRAM_MD5($uid, $pwd, $euser)
+    function _authCRAMMD5($user, $pass, $euser)
     {
-        if ( PEAR::isError( $challenge = $this->_doCmd( 'AUTHENTICATE "CRAM-MD5"' ) ) ) {
-            $this->_error=$challenge;
+        if (PEAR::isError($challenge = $this->_doCmd('AUTHENTICATE "CRAM-MD5"', true))) {
             return $challenge;
         }
-        $challenge=trim($challenge);
-        $challenge = base64_decode( trim($challenge) );
-        $cram = &Auth_SASL::factory('crammd5');
-        if ( PEAR::isError($resp=$cram->getResponse( $uid , $pwd , $challenge ) ) ) {
-            $this->_error=$resp;
-            return $resp;
-        }
-        $auth_str = base64_encode( $resp );
-        if ( PEAR::isError($error = $this->_sendStringResponse( $auth_str  ) ) ) {
-            $this->_error=$error;
-            return $error;
+
+        $challenge = base64_decode(trim($challenge));
+        $cram = Auth_SASL::factory('crammd5');
+        if (PEAR::isError($response = $cram->getResponse($user, $pass, $challenge))) {
+            return $response;
         }
 
+        return $this->_sendStringResponse(base64_encode($response));
     }
 
     /**
      * Authenticates the user using the DIGEST-MD5 method.
      *
-     * @param string $uid The userid to authenticate as.
-     * @param string $pwd The password to authenticate with.
+     * @param string $user  The userid to authenticate as.
+     * @param string $pass  The password to authenticate with.
      * @param string $euser The effective uid to authenticate as.
      *
-     * @return array Returns an array containing the response
-     *
-     * @access private
-     * @since  1.0
+     * @return void
      */
-    function _authDigest_MD5($uid, $pwd, $euser)
+    function _authDigestMD5($user, $pass, $euser)
     {
-        if ( PEAR::isError( $challenge = $this->_doCmd('AUTHENTICATE "DIGEST-MD5"') ) ) {
-            $this->_error= $challenge;
+        if (PEAR::isError($challenge = $this->_doCmd('AUTHENTICATE "DIGEST-MD5"', true))) {
             return $challenge;
         }
-        $challenge = base64_decode( $challenge );
-        $digest = &Auth_SASL::factory('digestmd5');
 
-        if(PEAR::isError($param=$digest->getResponse($uid, $pwd, $challenge, "localhost", "sieve" , $euser) )) {
-            return $param;
+        $challenge = base64_decode(trim($challenge));
+        $digest = Auth_SASL::factory('digestmd5');
+        // @todo Really 'localhost'?
+        if (PEAR::isError($response = $digest->getResponse($user, $pass, $challenge, 'localhost', 'sieve', $euser))) {
+            return $response;
         }
-        $auth_str = base64_encode($param);
 
-        if ( PEAR::isError($error = $this->_sendStringResponse( $auth_str  ) ) ) {
-            $this->_error=$error;
-            return $error;
+        if (PEAR::isError($result = $this->_sendStringResponse(base64_encode($response)))) {
+            return $result;
         }
-
-        if ( PEAR::isError( $challenge = $this->_doCmd() ) ) {
-            $this->_error=$challenge ;
-            return $challenge ;
+        if (PEAR::isError($result = $this->_doCmd('', true))) {
+            return $result;
         }
-
-        if( strtoupper(substr($challenge,0,2))== 'OK' ){
-                return true;
+        if ($this->_toUpper(substr($result, 0, 2)) == 'OK') {
+            return;
         }
 
-        /**
-        * We don't use the protocol's third step because SIEVE doesn't allow
-        * subsequent authentication, so we just silently ignore it.
-        */
-        if ( PEAR::isError($error = $this->_sendStringResponse( '' ) ) ) {
-            $this->_error=$error;
-            return $error;
+        /* We don't use the protocol's third step because SIEVE doesn't allow
+         * subsequent authentication, so we just silently ignore it. */
+        if (PEAR::isError($result = $this->_sendStringResponse(''))) {
+            return $result;
         }
 
-        if (PEAR::isError($res = $this->_doCmd() )) {
-            return $res;
-        }
+        return $this->_doCmd();
     }
 
-     /**
+    /**
      * Authenticates the user using the EXTERNAL method.
      *
-     * @param string $user The userid to authenticate as.
-     * @param string $pass The password to authenticate with.
+     * @param string $user  The userid to authenticate as.
+     * @param string $pass  The password to authenticate with.
      * @param string $euser The effective uid to authenticate as.
      *
-     * @return array Returns an array containing the response
+     * @return void
      *
-     * @access private
      * @since  1.1.7
      */
     function _authEXTERNAL($user, $pass, $euser)
     {
-        if ($euser != '') {
-            $cmd=sprintf('AUTHENTICATE "EXTERNAL" "%s"', base64_encode($euser) ) ;
-        } else {
-            $cmd=sprintf('AUTHENTICATE "EXTERNAL" "%s"', base64_encode($user) );
-        }
-        return $this->_sendCmd( $cmd ) ;
+        $cmd = sprintf(
+            'AUTHENTICATE "EXTERNAL" "%s"',
+            base64_encode(strlen($euser) ? $euser : $user)
+        );
+        return $this->_sendCmd($cmd);
     }
 
     /**
-    * Removes a script from the server
-    *
-    * @access private
-    * @param  string $scriptname Name of the script to delete
-    * @return mixed              True on success, PEAR_Error otherwise
-    */
+     * Removes a script from the server.
+     *
+     * @param string $scriptname Name of the script to delete.
+     *
+     * @return boolean  True on success, PEAR_Error otherwise.
+     */
     function _cmdDeleteScript($scriptname)
     {
         if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
-            $msg='Not currently in AUTHORISATION state';
-            $code=1;
-            return $this->_raiseError($msg,$code);
+            return PEAR::raiseError('Not currently in AUTHORISATION state', 1);
         }
-        if (PEAR::isError($res = $this->_doCmd(sprintf('DELETESCRIPT "%s"', $scriptname) ) )) {
+        if (PEAR::isError($res = $this->_doCmd(sprintf('DELETESCRIPT "%s"', $scriptname)))) {
             return $res;
         }
         return true;
     }
 
     /**
-    * Retrieves the contents of the named script
-    *
-    * @access private
-    * @param  string $scriptname Name of the script to retrieve
-    * @return mixed              The script if successful, PEAR_Error otherwise
-    */
+     * Retrieves the contents of the named script.
+     *
+     * @param string $scriptname Name of the script to retrieve.
+     *
+     * @return string  The script if successful, PEAR_Error otherwise.
+     */
     function _cmdGetScript($scriptname)
     {
         if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
-            $msg='Not currently in AUTHORISATION state';
-            $code=1;
-            return $this->_raiseError($msg,$code);
+            return PEAR::raiseError('Not currently in AUTHORISATION state', 1);
         }
 
-        if (PEAR::isError($res = $this->_doCmd(sprintf('GETSCRIPT "%s"', $scriptname) ) ) ) {
+        if (PEAR::isError($res = $this->_doCmd(sprintf('GETSCRIPT "%s"', $scriptname)))) {
             return $res;
         }
 
@@ -650,53 +767,45 @@ class Net_Sieve
     }
 
     /**
-    * Sets the ACTIVE script, ie the one that gets run on new mail
-    * by the server
-    *
-    * @access private
-    * @param  string $scriptname The name of the script to mark as active
-    * @return mixed              True on success, PEAR_Error otherwise
+     * Sets the active script, i.e. the one that gets run on new mail by the
+     * server.
+     *
+     * @param string $scriptname The name of the script to mark as active.
+     *
+     * @return boolean  True on success, PEAR_Error otherwise.
     */
     function _cmdSetActive($scriptname)
     {
         if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
-            $msg='Not currently in AUTHORISATION state';
-            $code=1;
-            return $this->_raiseError($msg,$code);
+            return PEAR::raiseError('Not currently in AUTHORISATION state', 1);
         }
-
-        if (PEAR::isError($res = $this->_doCmd(sprintf('SETACTIVE "%s"', $scriptname) ) ) ) {
+        if (PEAR::isError($res = $this->_doCmd(sprintf('SETACTIVE "%s"', $scriptname)))) {
             return $res;
         }
-
         $this->_activeScript = $scriptname;
         return true;
     }
 
     /**
-    * Sends the LISTSCRIPTS command
-    *
-    * @access private
-    * @return mixed Two item array of scripts, and active script on success,
-    *               PEAR_Error otherwise.
-    */
+     * Returns the list of scripts on the server.
+     *
+     * @return array  An array with the list of scripts in the first element
+     *                and the active script in the second element on success,
+     *                PEAR_Error otherwise.
+     */
     function _cmdListScripts()
     {
         if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
-            $msg='Not currently in AUTHORISATION state';
-            $code=1;
-            return $this->_raiseError($msg,$code);
+            return PEAR::raiseError('Not currently in AUTHORISATION state', 1);
         }
 
-        $scripts = array();
-        $activescript = null;
-
         if (PEAR::isError($res = $this->_doCmd('LISTSCRIPTS'))) {
             return $res;
         }
 
+        $scripts = array();
+        $activescript = null;
         $res = explode("\r\n", $res);
-
         foreach ($res as $value) {
             if (preg_match('/^"(.*)"( ACTIVE)?$/i', $value, $matches)) {
                 $scripts[] = $matches[1];
@@ -710,25 +819,22 @@ class Net_Sieve
     }
 
     /**
-    * Sends the PUTSCRIPT command to add a script to
-    * the server.
-    *
-    * @access private
-    * @param  string $scriptname Name of the new script
-    * @param  string $scriptdata The new script
-    * @return mixed              True on success, PEAR_Error otherwise
-    */
+     * Adds a script to the server.
+     *
+     * @param string $scriptname Name of the new script.
+     * @param string $scriptdata The new script.
+     *
+     * @return boolean  True on success, PEAR_Error otherwise.
+     */
     function _cmdPutScript($scriptname, $scriptdata)
     {
         if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
-            $msg='Not currently in TRANSACTION state';
-            $code=1;
-            return $this->_raiseError($msg,$code);
+            return PEAR::raiseError('Not currently in AUTHORISATION state', 1);
         }
 
         $stringLength = $this->_getLineLength($scriptdata);
 
-        if (PEAR::isError($res = $this->_doCmd(sprintf("PUTSCRIPT \"%s\" {%d+}\r\n%s", $scriptname, $stringLength, $scriptdata) ))) {
+        if (PEAR::isError($res = $this->_doCmd(sprintf("PUTSCRIPT \"%s\" {%d+}\r\n%s", $scriptname, $stringLength, $scriptdata)))) {
             return $res;
         }
 
@@ -736,22 +842,20 @@ class Net_Sieve
     }
 
     /**
-    * Sends the LOGOUT command and terminates the connection
-    *
-    * @access private
-    * @param boolean $sendLogoutCMD True to send LOGOUT command before disconnecting
-    * @return mixed True on success, PEAR_Error otherwise
-    */
-    function _cmdLogout($sendLogoutCMD=true)
+     * Logs out of the server and terminates the connection.
+     *
+     * @param boolean $sendLogoutCMD Whether to send LOGOUT command before
+     *                               disconnecting.
+     *
+     * @return boolean  True on success, PEAR_Error otherwise.
+     */
+    function _cmdLogout($sendLogoutCMD = true)
     {
-        if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) {
-            $msg='Not currently connected';
-            $code=1;
-            return $this->_raiseError($msg,$code);
-            //return PEAR::raiseError('Not currently connected');
+        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
+            return PEAR::raiseError('Not currently connected', 1);
         }
 
-        if($sendLogoutCMD){
+        if ($sendLogoutCMD) {
             if (PEAR::isError($res = $this->_doCmd('LOGOUT'))) {
                 return $res;
             }
@@ -759,23 +863,20 @@ class Net_Sieve
 
         $this->_sock->disconnect();
         $this->_state = NET_SIEVE_STATE_DISCONNECTED;
+
         return true;
     }
 
     /**
-    * Sends the CAPABILITY command
-    *
-    * @access private
-    * @return mixed True on success, PEAR_Error otherwise
-    */
+     * Sends the CAPABILITY command
+     *
+     * @return boolean  True on success, PEAR_Error otherwise.
+     */
     function _cmdCapability()
     {
-        if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) {
-            $msg='Not currently connected';
-            $code=1;
-            return $this->_raiseError($msg,$code);
+        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
+            return PEAR::raiseError('Not currently connected', 1);
         }
-
         if (PEAR::isError($res = $this->_doCmd('CAPABILITY'))) {
             return $res;
         }
@@ -784,405 +885,327 @@ class Net_Sieve
     }
 
     /**
-    * Checks if the server has space to store the script
-    * by the server
-    *
-    * @param  string $scriptname The name of the script to mark as active
-    * @param integer $size The size of the script
-    * @return mixed              True on success, PEAR_Error otherwise
-    */
-    function haveSpace($scriptname,$size)
-    {
-        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
-            $msg='Not currently in TRANSACTION state';
-            $code=1;
-            return $this->_raiseError($msg,$code);
-        }
-
-        if (PEAR::isError($res = $this->_doCmd(sprintf('HAVESPACE "%s" %d', $scriptname, $size) ) ) ) {
-            return $res;
-        }
-
-        return true;
-    }
-
-    /**
-    * Parses the response from the capability command. Stores
-    * the result in $this->_capability
-    *
-    * @access private
-    * @param string $data The response from the capability command
-    */
+     * Parses the response from the CAPABILITY command and stores the result
+     * in $_capability.
+     *
+     * @param string $data The response from the capability command.
+     *
+     * @return void
+     */
     function _parseCapability($data)
     {
-        // clear the cached capabilities
-        $this->_capability = array();
+        // Clear the cached capabilities.
+        $this->_capability = array('sasl' => array(),
+                                   'extensions' => array());
 
-        $data = preg_split('/\r?\n/', $data, -1, PREG_SPLIT_NO_EMPTY);
+        $data = preg_split('/\r?\n/', $this->_toUpper($data), -1, PREG_SPLIT_NO_EMPTY);
 
         for ($i = 0; $i < count($data); $i++) {
-            if (preg_match('/^"([a-z]+)"( "(.*)")?$/i', $data[$i], $matches)) {
-                switch (strtolower($matches[1])) {
-                    case 'implementation':
-                        $this->_capability['implementation'] = $matches[3];
-                        break;
+            if (!preg_match('/^"([A-Z]+)"( "(.*)")?$/', $data[$i], $matches)) {
+                continue;
+            }
+            switch ($matches[1]) {
+            case 'IMPLEMENTATION':
+                $this->_capability['implementation'] = $matches[3];
+                break;
 
-                    case 'sasl':
-                        $this->_capability['sasl'] = preg_split('/\s+/', $matches[3]);
-                        break;
+            case 'SASL':
+                $this->_capability['sasl'] = preg_split('/\s+/', $matches[3]);
+                break;
 
-                    case 'sieve':
-                        $this->_capability['extensions'] = preg_split('/\s+/', $matches[3]);
-                        break;
+            case 'SIEVE':
+                $this->_capability['extensions'] = preg_split('/\s+/', $matches[3]);
+                break;
 
-                    case 'starttls':
-                        $this->_capability['starttls'] = true;
-                        break;
-                }
+            case 'STARTTLS':
+                $this->_capability['starttls'] = true;
+                break;
             }
         }
     }
 
     /**
-    * Sends a command to the server
-    *
-    * @access private
-    * @param string $cmd The command to send
-    */
+     * Sends a command to the server
+     *
+     * @param string $cmd The command to send.
+     *
+     * @return void
+     */
     function _sendCmd($cmd)
     {
         $status = $this->_sock->getStatus();
         if (PEAR::isError($status) || $status['eof']) {
-            return new PEAR_Error( 'Failed to write to socket: (connection lost!) ' );
-        }
-        if ( PEAR::isError( $error = $this->_sock->write( $cmd . "\r\n" ) ) ) {
-            return new PEAR_Error( 'Failed to write to socket: ' . $error->getMessage() );
+            return PEAR::raiseError('Failed to write to socket: connection lost');
         }
-
-        if( $this->_debug ){
-            // C: means this data was sent by  the client (this class)
-            echo "C:$cmd\n";
+        if (PEAR::isError($error = $this->_sock->write($cmd . "\r\n"))) {
+            return PEAR::raiseError(
+                'Failed to write to socket: ' . $error->getMessage()
+            );
         }
-        return true;
+        $this->_debug("C: $cmd");
     }
 
     /**
-    * Sends a string response to the server
-    *
-    * @access private
-    * @param string $cmd The command to send
-    */
+     * Sends a string response to the server.
+     *
+     * @param string $str The string to send.
+     *
+     * @return void
+     */
     function _sendStringResponse($str)
     {
-        $response='{' .  $this->_getLineLength($str) . "+}\r\n" . $str  ;
-        return $this->_sendCmd($response);
+        return $this->_sendCmd('{' . $this->_getLineLength($str) . "+}\r\n" . $str);
     }
 
+    /**
+     * Receives a single line from the server.
+     *
+     * @return string  The server response line.
+     */
     function _recvLn()
     {
-        $lastline='';
-        if (PEAR::isError( $lastline = $this->_sock->gets( 8192 ) ) ) {
-            return new PEAR_Error( 'Failed to write to socket: ' . $lastline->getMessage() );
-        }
-        $lastline=rtrim($lastline);
-        if($this->_debug){
-            // S: means this data was sent by  the IMAP Server
-            echo "S:$lastline\n" ;
+        if (PEAR::isError($lastline = $this->_sock->gets(8192))) {
+            return PEAR::raiseError(
+                'Failed to read from socket: ' . $lastline->getMessage()
+            );
         }
 
-        if( $lastline === '' ) {
-            return new PEAR_Error( 'Failed to receive from the socket' );
+        $lastline = rtrim($lastline);
+        $this->_debug("S: $lastline");
+
+        if ($lastline === '') {
+            return PEAR::raiseError('Failed to read from socket');
         }
 
         return $lastline;
     }
 
     /**
-    * Send a command and retrieves a response from the server.
-    *
-    *
-    * @access private
-    * @param string $cmd The command to send
-    * @return mixed Reponse string if an OK response, PEAR_Error if a NO response
-    */
-    function _doCmd($cmd = '' )
+     * Send a command and retrieves a response from the server.
+     *
+     * @param string $cmd   The command to send.
+     * @param boolean $auth Whether this is an authentication command.
+     *
+     * @return string|PEAR_Error  Reponse string if an OK response, PEAR_Error
+     *                            if a NO response.
+     */
+    function _doCmd($cmd = '', $auth = false)
     {
-        $referralCount=0;
-        while($referralCount < $this->_maxReferralCount ){
-
-            if($cmd != '' ){
-                if(PEAR::isError($error = $this->_sendCmd($cmd) )) {
+        $referralCount = 0;
+        while ($referralCount < $this->_maxReferralCount) {
+            if (strlen($cmd)) {
+                if (PEAR::isError($error = $this->_sendCmd($cmd))) {
                     return $error;
                 }
             }
-            $response = '';
 
+            $response = '';
             while (true) {
-                    if(PEAR::isError( $line=$this->_recvLn() )){
-                        return $line;
+                if (PEAR::isError($line = $this->_recvLn())) {
+                    return $line;
+                }
+                $uc_line = $this->_toUpper($line);
+
+                if ('OK' == substr($uc_line, 0, 2)) {
+                    $response .= $line;
+                    return rtrim($response);
+                }
+
+                if ('NO' == substr($uc_line, 0, 2)) {
+                    // Check for string literal error message.
+                    if (preg_match('/^no {([0-9]+)\+?}/i', $line, $matches)) {
+                        $line .= str_replace(
+                            "\r\n", ' ', $this->_sock->read($matches[1] + 2)
+                        );
+                        $this->_debug("S: $line");
                     }
-                    if ('ok' === strtolower(substr($line, 0, 2))) {
-                        $response .= $line;
-                        return rtrim($response);
-
-                    } elseif ('no' === strtolower(substr($line, 0, 2))) {
-                        // Check for string literal error message
-                        if (preg_match('/^no {([0-9]+)\+?}/i', $line, $matches)) {
-                            $line .= str_replace("\r\n", ' ', $this->_sock->read($matches[1] + 2 ));
-                            if($this->_debug){
-                                echo "S:$line\n";
-                            }
-                        }
-                        $msg=trim($response . substr($line, 2));
-                        $code=3;
-                        return $this->_raiseError($msg,$code);
-                    } elseif ('bye' === strtolower(substr($line, 0, 3))) {
-
-                        if(PEAR::isError($error = $this->disconnect(false) ) ){
-                            $msg="Can't handle bye, The error was= " . $error->getMessage() ;
-                            $code=4;
-                            return $this->_raiseError($msg,$code);
-                        }
-                        //if (preg_match('/^bye \(referral "([^"]+)/i', $line, $matches)) {
-                        if (preg_match('/^bye \(referral "(sieve:\/\/)?([^"]+)/i', $line, $matches)) {
-                            // Check for referral, then follow it.  Otherwise, carp an error.
-                            // Replace the old host with the referral host preserving any protocol prefix
-                            $this->_data['host'] = preg_replace('/\w+(?!(\w|\:\/\/)).*/',$matches[2],$this->_data['host']);
-                           if (PEAR::isError($error = $this->_handleConnectAndLogin() ) ){
-                                $msg="Can't follow referral to " . $this->_data['host'] . ", The error was= " . $error->getMessage() ;
-                                $code=5;
-                                return $this->_raiseError($msg,$code);
-                            }
-                            break;
-                            // Retry the command
-                            if(PEAR::isError($error = $this->_sendCmd($cmd) )) {
-                                return $error;
-                            }
-                            continue;
-                        }
-                        $msg=trim($response . $line);
-                        $code=6;
-                        return $this->_raiseError($msg,$code);
-                    } elseif (preg_match('/^{([0-9]+)\+?}/i', $line, $matches)) {
-                        // Matches String Responses.
-                        //$line = str_replace("\r\n", ' ', $this->_sock->read($matches[1] + 2 ));
-                        $str_size = $matches[1] + 2;
-                        $line = '';
-                        $line_length = 0;
-                        while ($line_length < $str_size) {
-                            $line .= $this->_sock->read($str_size - $line_length);
-                            $line_length = $this->_getLineLength($line);
-                        }
-                        if($this->_debug){
-                            echo "S:$line\n";
-                        }
-                        if($this->_state != NET_SIEVE_STATE_AUTHORISATION) {
-                            // receive the pending OK only if we aren't authenticating
-                            // since string responses during authentication don't need an
-                            // OK.
-                            $this->_recvLn();
+                    return PEAR::raiseError(trim($response . substr($line, 2)), 3);
+                }
+
+                if ('BYE' == substr($uc_line, 0, 3)) {
+                    if (PEAR::isError($error = $this->disconnect(false))) {
+                        return PEAR::raiseError(
+                            'Cannot handle BYE, the error was: '
+                            . $error->getMessage(),
+                            4
+                        );
+                    }
+                    // Check for referral, then follow it.  Otherwise, carp an
+                    // error.
+                    if (preg_match('/^bye \(referral "(sieve:\/\/)?([^"]+)/i', $line, $matches)) {
+                        // Replace the old host with the referral host
+                        // preserving any protocol prefix.
+                        $this->_data['host'] = preg_replace(
+                            '/\w+(?!(\w|\:\/\/)).*/', $matches[2],
+                            $this->_data['host']
+                        );
+                        if (PEAR::isError($error = $this->_handleConnectAndLogin())) {
+                            return PEAR::raiseError(
+                                'Cannot follow referral to '
+                                . $this->_data['host'] . ', the error was: '
+                                . $error->getMessage(),
+                                5
+                            );
                         }
-                        return $line;
+                        break;
                     }
-                    $response .= $line . "\r\n";
-                    $referralCount++;
+                    return PEAR::raiseError(trim($response . $line), 6);
                 }
-        }
-        $msg="Max referral count reached ($referralCount times) Cyrus murder loop error?";
-        $code=7;
-        return $this->_raiseError($msg,$code);
-    }
 
-    /**
-    * Sets the debug state
-    *
-    * @param boolean $debug
-    * @return void
-    */
-    function setDebug($debug = true)
-    {
-        $this->_debug = $debug;
-    }
+                if (preg_match('/^{([0-9]+)\+?}/i', $line, $matches)) {
+                    // Matches String Responses.
+                    $str_size = $matches[1] + 2;
+                    $line = '';
+                    $line_length = 0;
+                    while ($line_length < $str_size) {
+                        $line .= $this->_sock->read($str_size - $line_length);
+                        $line_length = $this->_getLineLength($line);
+                    }
+                    $this->_debug("S: $line");
 
-    /**
-    * Disconnect from the Sieve server
-    *
-    * @param  string $scriptname The name of the script to be set as active
-    * @return mixed              true on success, PEAR_Error on failure
-    */
-    function disconnect($sendLogoutCMD=true)
-    {
-        return $this->_cmdLogout($sendLogoutCMD);
+                    if (!$auth) {
+                        // Receive the pending OK only if we aren't
+                        // authenticating since string responses during
+                        // authentication don't need an OK.
+                        $this->_recvLn();
+                    }
+                    return $line;
+                }
+
+                if ($auth) {
+                    // String responses during authentication don't need an
+                    // OK.
+                    $response .= $line;
+                    return rtrim($response);
+                }
+
+                $response .= $line . "\r\n";
+                $referralCount++;
+            }
+        }
+
+        return PEAR::raiseError('Max referral count (' . $referralCount . ') reached. Cyrus murder loop error?', 7);
     }
 
     /**
      * Returns the name of the best authentication method that the server
      * has advertised.
      *
-     * @param string if !=null,authenticate with this method ($userMethod).
+     * @param string $userMethod Only consider this method as available.
      *
-     * @return mixed    Returns a string containing the name of the best
-     *                  supported authentication method or a PEAR_Error object
-     *                  if a failure condition is encountered.
-     * @access private
-     * @since  1.0
+     * @return string  The name of the best supported authentication method or
+     *                 a PEAR_Error object on failure.
      */
     function _getBestAuthMethod($userMethod = null)
     {
-       if( isset($this->_capability['sasl']) ){
-           $serverMethods=$this->_capability['sasl'];
-       }else{
-           // if the server don't send an sasl capability fallback to login auth
-           //return 'LOGIN';
-           return new PEAR_Error("This server don't support any Auth methods SASL problem?");
-       }
-
-        if($userMethod != null ){
-            $methods = array();
-            $methods[] = $userMethod;
-        }else{
-
-            $methods = $this->supportedAuthMethods;
-        }
-        if( ($methods != null) && ($serverMethods != null)){
-            foreach ( $methods as $method ) {
-                if ( in_array( $method , $serverMethods ) ) {
-                    return $method;
-                }
-            }
-            $serverMethods=implode(',' , $serverMethods );
-            $myMethods=implode(',' ,$this->supportedAuthMethods);
-            return new PEAR_Error("$method NOT supported authentication method!. This server " .
-                "supports these methods= $serverMethods, but I support $myMethods");
-        }else{
-            return new PEAR_Error("This server don't support any Auth methods");
+        if (!isset($this->_capability['sasl'])) {
+            return PEAR::raiseError('This server doesn\'t support any authentication methods. SASL problem?');
         }
-    }
-
-    /**
-    * Return the list of extensions the server supports
-    *
-    * @return mixed              array  on success, PEAR_Error on failure
-    */
-    function getExtensions()
-    {
-        if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) {
-            $msg='Not currently connected';
-            $code=7;
-            return $this->_raiseError($msg,$code);
+        if (!$this->_capability['sasl']) {
+            return PEAR::raiseError('This server doesn\'t support any authentication methods.');
         }
 
-        return $this->_capability['extensions'];
-    }
-
-    /**
-    * Return true if tyhe server has that extension
-    *
-    * @param string  the extension to compare
-    * @return mixed              array  on success, PEAR_Error on failure
-    */
-    function hasExtension($extension)
-    {
-        if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) {
-            $msg='Not currently connected';
-            $code=7;
-            return $this->_raiseError($msg,$code);
-        }
-
-        if(is_array($this->_capability['extensions'] ) ){
-            foreach( $this->_capability['extensions'] as $ext){
-                if( trim( strtolower( $ext ) ) === trim( strtolower( $extension ) ) )
-                    return true;
+        if ($userMethod) {
+            if (in_array($userMethod, $this->_capability['sasl'])) {
+                return $userMethod;
             }
+            return PEAR::raiseError(
+                sprintf('No supported authentication method found. The server supports these methods: %s, but we want to use: %s',
+                        implode(', ', $this->_capability['sasl']),
+                        $userMethod));
         }
-        return false;
-    }
 
-    /**
-    * Return the list of auth methods the server supports
-    *
-    * @return mixed              array  on success, PEAR_Error on failure
-    */
-    function getAuthMechs()
-    {
-        if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) {
-            $msg='Not currently connected';
-            $code=7;
-            return $this->_raiseError($msg,$code);
-        }
-        if(!isset($this->_capability['sasl']) ){
-            $this->_capability['sasl']=array();
-        }
-        return $this->_capability['sasl'];
-    }
-
-    /**
-    * Return true if the server has that extension
-    *
-    * @param string  the extension to compare
-    * @return mixed              array  on success, PEAR_Error on failure
-    */
-    function hasAuthMech($method)
-    {
-        if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) {
-            $msg='Not currently connected';
-            $code=7;
-            return $this->_raiseError($msg,$code);
-            //return PEAR::raiseError('Not currently connected');
-        }
-
-        if(is_array($this->_capability['sasl'] ) ){
-            foreach( $this->_capability['sasl'] as $ext){
-                if( trim( strtolower( $ext ) ) === trim( strtolower( $method ) ) )
-                    return true;
+        foreach ($this->supportedAuthMethods as $method) {
+            if (in_array($method, $this->_capability['sasl'])) {
+                return $method;
             }
         }
-        return false;
+
+        return PEAR::raiseError(
+            sprintf('No supported authentication method found. The server supports these methods: %s, but we only support: %s',
+                    implode(', ', $this->_capability['sasl']),
+                    implode(', ', $this->supportedAuthMethods)));
     }
 
     /**
-    * Return true if the TLS negotiation was successful
-    *
-    * @access private
-    * @return mixed              true on success, PEAR_Error on failure
-    */
+     * Starts a TLS connection.
+     *
+     * @return boolean  True on success, PEAR_Error on failure.
+     */
     function _startTLS()
     {
-        if (PEAR::isError($res = $this->_doCmd("STARTTLS"))) {
+        if (PEAR::isError($res = $this->_doCmd('STARTTLS'))) {
             return $res;
         }
 
-        if(stream_socket_enable_crypto($this->_sock->fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT) == false) {
-            $msg='Failed to establish TLS connection';
-            $code=2;
-            return $this->_raiseError($msg,$code);
+        if (!stream_socket_enable_crypto($this->_sock->fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
+            return PEAR::raiseError('Failed to establish TLS connection', 2);
         }
 
-        if($this->_debug === true) {
-            echo "STARTTLS Negotiation Successful\n";
-        }
+        $this->_debug('STARTTLS negotiation successful');
 
         // The server should be sending a CAPABILITY response after
         // negotiating TLS. Read it, and ignore if it doesn't.
         $this->_doCmd();
 
-        // RFC says we need to query the server capabilities again now that
-        // we are under encryption
-        if(PEAR::isError($res = $this->_cmdCapability() )) {
-            $msg='Failed to connect, server said: ' . $res->getMessage();
-            $code=2;
-            return $this->_raiseError($msg,$code);
+        // RFC says we need to query the server capabilities again now that we
+        // are under encryption.
+        if (PEAR::isError($res = $this->_cmdCapability())) {
+            return PEAR::raiseError(
+                'Failed to connect, server said: ' . $res->getMessage(), 2
+            );
         }
 
         return true;
     }
 
-    function _getLineLength($string) {
-        if (extension_loaded('mbstring') || @dl(PHP_SHLIB_PREFIX.'mbstring.'.PHP_SHLIB_SUFFIX)) {
-          return mb_strlen($string,'latin1');
+    /**
+     * Returns the length of a string.
+     *
+     * @param string $string A string.
+     *
+     * @return integer  The length of the string.
+     */
+    function _getLineLength($string)
+    {
+        if (extension_loaded('mbstring')) {
+            return mb_strlen($string, 'latin1');
         } else {
-          return strlen($string);
+            return strlen($string);
+        }
+    }
+
+    /**
+     * Locale independant strtoupper() implementation.
+     *
+     * @param string $string The string to convert to lowercase.
+     *
+     * @return string  The lowercased string, based on ASCII encoding.
+     */
+    function _toUpper($string)
+    {
+        $language = setlocale(LC_CTYPE, 0);
+        setlocale(LC_CTYPE, 'C');
+        $string = strtoupper($string);
+        setlocale(LC_CTYPE, $language);
+        return $string;
+    }
+
+    /**
+     * Write debug text to the current debug output handler.
+     *
+     * @param string $message Debug message text.
+     *
+     * @return void
+     */
+    function _debug($message)
+    {
+        if ($this->_debug) {
+            if ($this->_debug_handler) {
+                call_user_func_array($this->_debug_handler, array(&$this, $message));
+            } else {
+                echo "$message\n";
+            }
         }
     }
 }
-?>
index 2490aca6edbc9bb969deb4a0df164c525f06e1c8..89ae7d496e9ea2d4378383218a74cbeb06b2dd80 100644 (file)
@@ -5,7 +5,7 @@
 
   Author: Aleksander Machniak <alec@alec.pl>
 
-  $Id$
+  $Id: rcube_sieve.php 4241 2010-11-20 17:59:50Z alec $
 
 */
 
 
 define('SIEVE_ERROR_CONNECTION', 1);
 define('SIEVE_ERROR_LOGIN', 2);
-define('SIEVE_ERROR_NOT_EXISTS', 3);   // script not exists
-define('SIEVE_ERROR_INSTALL', 4);      // script installation
-define('SIEVE_ERROR_ACTIVATE', 5);     // script activation
-define('SIEVE_ERROR_OTHER', 255);      // other/unknown error
+define('SIEVE_ERROR_NOT_EXISTS', 3);    // script not exists
+define('SIEVE_ERROR_INSTALL', 4);       // script installation
+define('SIEVE_ERROR_ACTIVATE', 5);      // script activation
+define('SIEVE_ERROR_DELETE', 6);        // script deletion
+define('SIEVE_ERROR_INTERNAL', 7);      // internal error
+define('SIEVE_ERROR_DEACTIVATE', 8);    // script activation
+define('SIEVE_ERROR_OTHER', 255);       // other/unknown error
 
 
 class rcube_sieve
 {
-  var $sieve;                          // Net_Sieve object
-  var $error = false;                  // error flag 
-  var $list = array();                         // scripts list 
+    private $sieve;                 // Net_Sieve object
+    private $error = false;         // error flag
+    private $list = array();        // scripts list
+
+    public $script;                 // rcube_sieve_script object
+    public $current;                // name of currently loaded script
+    private $disabled;              // array of disabled extensions
+
+
+    /**
+     * Object constructor
+     *
+     * @param string  Username (for managesieve login)
+     * @param string  Password (for managesieve login)
+     * @param string  Managesieve server hostname/address
+     * @param string  Managesieve server port number
+     * @param string  Managesieve authentication method 
+     * @param boolean Enable/disable TLS use
+     * @param array   Disabled extensions
+     * @param boolean Enable/disable debugging
+     * @param string  Proxy authentication identifier
+     * @param string  Proxy authentication password
+     */
+    public function __construct($username, $password='', $host='localhost', $port=2000,
+        $auth_type=null, $usetls=true, $disabled=array(), $debug=false,
+        $auth_cid=null, $auth_pw=null)
+    {
+        $this->sieve = new Net_Sieve();
+
+        if ($debug) {
+            $this->sieve->setDebug(true, array($this, 'debug_handler'));
+        }
 
-  public $script;                      // rcube_sieve_script object
-  private $disabled;                   // array of disabled extensions
+        if (PEAR::isError($this->sieve->connect($host, $port, NULL, $usetls))) {
+            return $this->_set_error(SIEVE_ERROR_CONNECTION);
+        }
 
-  /**
-    * Object constructor
-    *
-    * @param  string  Username (to managesieve login)
-    * @param  string  Password (to managesieve login)
-    * @param  string  Managesieve server hostname/address
-    * @param  string  Managesieve server port number
-    * @param  string  Enable/disable TLS use
-    * @param  array   Disabled extensions
-    */
-  public function __construct($username, $password='', $host='localhost', $port=2000, $usetls=true, $disabled=array())
+        if (!empty($auth_cid)) {
+            $authz    = $username;
+            $username = $auth_cid;
+            $password = $auth_pw;
+        }
+
+        if (PEAR::isError($this->sieve->login($username, $password,
+            $auth_type ? strtoupper($auth_type) : null, $authz))
+        ) {
+            return $this->_set_error(SIEVE_ERROR_LOGIN);
+        }
+
+        $this->disabled = $disabled;
+    }
+
+    public function __destruct() {
+        $this->sieve->disconnect();
+    }
+
+    /**
+     * Getter for error code
+     */
+    public function error()
     {
-      $this->sieve = new Net_Sieve();
-      
-//      $this->sieve->setDebug();
-      if (PEAR::isError($this->sieve->connect($host, $port, NULL, $usetls)))
-        return $this->_set_error(SIEVE_ERROR_CONNECTION);
+        return $this->error ? $this->error : false;
+    }
 
-      if (PEAR::isError($this->sieve->login($username, $password)))
-        return $this->_set_error(SIEVE_ERROR_LOGIN);
+    /**
+     * Saves current script into server
+     */
+    public function save($name = null)
+    {
+        if (!$this->sieve)
+            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+
+        if (!$this->script)
+            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+
+        if (!$name)
+            $name = $this->current;
+
+        $script = $this->script->as_text();
+
+        if (!$script)
+            $script = '/* empty script */';
+
+        if (PEAR::isError($this->sieve->installScript($name, $script)))
+            return $this->_set_error(SIEVE_ERROR_INSTALL);
 
-      $this->disabled = $disabled;
-      $this->_get_script();
+        return true;
     }
 
-  /**
-    * Getter for error code
-    */
-  public function error()
+    /**
+     * Saves text script into server
+     */
+    public function save_script($name, $content = null)
     {
-      return $this->error ? $this->error : false;
+        if (!$this->sieve)
+            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+
+        if (!$content)
+            $content = '/* empty script */';
+
+        if (PEAR::isError($this->sieve->installScript($name, $content)))
+            return $this->_set_error(SIEVE_ERROR_INSTALL);
+
+        return true;
     }
-                           
-  public function save()
+
+    /**
+     * Activates specified script
+     */
+    public function activate($name = null)
     {
-      $script = $this->script->as_text();
+        if (!$this->sieve)
+            return $this->_set_error(SIEVE_ERROR_INTERNAL);
 
-      if (!$script)
-       $script = '/* empty script */';
+        if (!$name)
+            $name = $this->current;
 
-      if (PEAR::isError($this->sieve->installScript('roundcube', $script)))
-       return $this->_set_error(SIEVE_ERROR_INSTALL);
+        if (PEAR::isError($this->sieve->setActive($name)))
+            return $this->_set_error(SIEVE_ERROR_ACTIVATE);
 
-      if (PEAR::isError($this->sieve->setActive('roundcube')))
-       return $this->_set_error(SIEVE_ERROR_ACTIVATE);
+        return true;
+    }
 
-      return true;
+    /**
+     * De-activates specified script
+     */
+    public function deactivate()
+    {
+        if (!$this->sieve)
+            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+
+        if (PEAR::isError($this->sieve->setActive('')))
+            return $this->_set_error(SIEVE_ERROR_DEACTIVATE);
+
+        return true;
     }
 
-  public function get_extensions()
+    /**
+     * Removes specified script
+     */
+    public function remove($name = null)
     {
-      if ($this->sieve) {
-       $ext = $this->sieve->getExtensions();
+        if (!$this->sieve)
+            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+
+        if (!$name)
+            $name = $this->current;
+
+        // script must be deactivated first
+        if ($name == $this->sieve->getActive())
+            if (PEAR::isError($this->sieve->setActive('')))
+                return $this->_set_error(SIEVE_ERROR_DELETE);
+
+        if (PEAR::isError($this->sieve->removeScript($name)))
+            return $this->_set_error(SIEVE_ERROR_DELETE);
+
+        if ($name == $this->current)
+            $this->current = null;
 
-       if ($this->script) {
-         $supported = $this->script->get_extensions();
-         foreach ($ext as $idx => $ext_name)
-           if (!in_array($ext_name, $supported))
-             unset($ext[$idx]);
-       }
+        return true;
+    }
+
+    /**
+     * Gets list of supported by server Sieve extensions
+     */
+    public function get_extensions()
+    {
+        if (!$this->sieve)
+            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+
+        $ext = $this->sieve->getExtensions();
+        // we're working on lower-cased names
+        $ext = array_map('strtolower', (array) $ext);
+
+        if ($this->script) {
+            $supported = $this->script->get_extensions();
+            foreach ($ext as $idx => $ext_name)
+                if (!in_array($ext_name, $supported))
+                    unset($ext[$idx]);
+        }
 
         return array_values($ext);
-      }
     }
 
-  private function _get_script()
+    /**
+     * Gets list of scripts from server
+     */
+    public function get_scripts()
     {
-      if (!$this->sieve)
-        return false;
-    
-      $this->list = $this->sieve->listScripts();
-
-      if (PEAR::isError($this->list))
-       return $this->_set_error(SIEVE_ERROR_OTHER);
-    
-      if (in_array('roundcube', $this->list))
-        {
-          $script = $this->sieve->getScript('roundcube');
-    
-          if (PEAR::isError($script))
-           return $this->_set_error(SIEVE_ERROR_OTHER);
-       }
-      // import scripts from squirrelmail
-      elseif (in_array('phpscript', $this->list))
-        {
-          $script = $this->sieve->getScript('phpscript');
-
-          $script = $this->_convert_from_squirrel_rules($script);
-
-          $this->script = new rcube_sieve_script($script, $this->disabled);
-       
-          $this->save();
-
-          $script = $this->sieve->getScript('roundcube');
-
-          if (PEAR::isError($script))
+        if (!$this->list) {
+
+            if (!$this->sieve)
+                return $this->_set_error(SIEVE_ERROR_INTERNAL);
+
+            $this->list = $this->sieve->listScripts();
+
+            if (PEAR::isError($this->list))
+                return $this->_set_error(SIEVE_ERROR_OTHER);
+        }
+
+        return $this->list;
+    }
+
+    /**
+     * Returns active script name
+     */
+    public function get_active()
+    {
+        if (!$this->sieve)
+            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+
+        return $this->sieve->getActive();
+    }
+
+    /**
+     * Loads script by name
+     */
+    public function load($name)
+    {
+        if (!$this->sieve)
+            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+
+        if ($this->current == $name)
+            return true;
+
+        $script = $this->sieve->getScript($name);
+
+        if (PEAR::isError($script))
+            return $this->_set_error(SIEVE_ERROR_OTHER);
+
+        // try to parse from Roundcube format
+        $this->script = $this->_parse($script);
+
+        $this->current = $name;
+
+        return true;
+    }
+
+    /**
+     * Loads script from text content
+     */
+    public function load_script($script)
+    {
+        if (!$this->sieve)
+            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+
+        // try to parse from Roundcube format
+        $this->script = $this->_parse($script);
+    }
+
+    /**
+     * Creates rcube_sieve_script object from text script
+     */
+    private function _parse($txt)
+    {
+        // try to parse from Roundcube format
+        $script = new rcube_sieve_script($txt, $this->disabled);
+
+        // ... else try to import from different formats
+        if (empty($script->content)) {
+            $script = $this->_import_rules($txt);
+            $script = new rcube_sieve_script($script, $this->disabled);
+        }
+
+        // replace all elsif with if+stop, we support only ifs
+        foreach ($script->content as $idx => $rule) {
+            if (!isset($script->content[$idx+1])
+                || preg_match('/^else|elsif$/', $script->content[$idx+1]['type'])) {
+                // 'stop' not found?
+                if (!preg_match('/^(stop|vacation)$/', $rule['actions'][count($rule['actions'])-1]['type'])) {
+                    $script->content[$idx]['actions'][] = array(
+                        'type' => 'stop'
+                    );
+                }
+            }
+        }
+
+        return $script;
+    }
+
+    /**
+     * Gets specified script as text
+     */
+    public function get_script($name)
+    {
+        if (!$this->sieve)
+            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+
+        $content = $this->sieve->getScript($name);
+
+        if (PEAR::isError($content))
             return $this->_set_error(SIEVE_ERROR_OTHER);
+
+        return $content;
+    }
+
+    /**
+     * Creates empty script or copy of other script
+     */
+    public function copy($name, $copy)
+    {
+        if (!$this->sieve)
+            return $this->_set_error(SIEVE_ERROR_INTERNAL);
+
+        if ($copy) {
+            $content = $this->sieve->getScript($copy);
+
+            if (PEAR::isError($content))
+                return $this->_set_error(SIEVE_ERROR_OTHER);
+        }
+
+        return $this->save_script($name, $content);
+    }
+
+    private function _import_rules($script)
+    {
+        $i = 0;
+        $name = array();
+
+        // Squirrelmail (Avelsieve)
+        if ($tokens = preg_split('/(#START_SIEVE_RULE.*END_SIEVE_RULE)\r?\n/', $script, -1, PREG_SPLIT_DELIM_CAPTURE)) {
+            foreach($tokens as $token) {
+                if (preg_match('/^#START_SIEVE_RULE.*/', $token, $matches)) {
+                    $name[$i] = "unnamed rule ".($i+1);
+                    $content .= "# rule:[".$name[$i]."]\n";
+                }
+                elseif (isset($name[$i])) {
+                    // This preg_replace is added because I've found some Avelsieve scripts
+                    // with rules containing "if" here. I'm not sure it was working
+                    // before without this or not.
+                    $token = preg_replace('/^if\s+/', '', trim($token));
+                    $content .= "if $token\n";
+                    $i++;
+                }
+            }
         }
-      else
-        {
-         $this->_set_error(SIEVE_ERROR_NOT_EXISTS);
-          $script = '';
-       }
-
-      $this->script = new rcube_sieve_script($script, $this->disabled);
-    }
-    
-  private function _convert_from_squirrel_rules($script)
-    {
-      $i = 0;
-      $name = array();
-      // tokenize rules
-      if ($tokens = preg_split('/(#START_SIEVE_RULE.*END_SIEVE_RULE)\n/', $script, -1, PREG_SPLIT_DELIM_CAPTURE))
-        foreach($tokens as $token)
-          {
-            if (preg_match('/^#START_SIEVE_RULE.*/', $token, $matches))
-              {
-               $name[$i] = "unnamed rule ".($i+1);
-                $content .= "# rule:[".$name[$i]."]\n";
-              }
-            elseif (isset($name[$i]))
-              {
-               $content .= "if ".$token."\n";
-               $i++;
-              }
-          }
-
-      return $content;
-    }
-
-
-  private function _set_error($error)
-    {
-      $this->error = $error;
-      return false;
-    }    
+        // Horde (INGO)
+        else if ($tokens = preg_split('/(# .+)\r?\n/i', $script, -1, PREG_SPLIT_DELIM_CAPTURE)) {
+            foreach($tokens as $token) {
+                if (preg_match('/^# (.+)/i', $token, $matches)) {
+                    $name[$i] = $matches[1];
+                    $content .= "# rule:[" . $name[$i] . "]\n";
+                }
+                elseif (isset($name[$i])) {
+                    $token = str_replace(":comparator \"i;ascii-casemap\" ", "", $token);
+                    $content .= $token . "\n";
+                    $i++;
+                }
+            }
+        }
+
+        return $content;
+    }
+
+    private function _set_error($error)
+    {
+        $this->error = $error;
+        return false;
+    }
+
+    /**
+     * This is our own debug handler for connection
+     */
+    public function debug_handler(&$sieve, $message)
+    {
+        write_log('sieve', preg_replace('/\r\n$/', '', $message));
+    }
 }
 
+
 class rcube_sieve_script
 {
-  var $content = array();      // script rules array   
-
-  private $supported = array(  // extensions supported by class
-    'fileinto',
-    'reject',
-    'ereject',
-    'vacation',        // RFC5230
+    public $content = array();      // script rules array
+
+    private $supported = array(     // extensions supported by class
+        'fileinto',
+        'reject',
+        'ereject',
+        'copy',                     // RFC3894
+        'vacation',                 // RFC5230
+        'relational',               // RFC3431
     // TODO: (most wanted first) body, imapflags, notify, regex
     );
-  
-  /**
-    * Object constructor
-    *
-    * @param  string  Script's text content
-    * @param  array   Disabled extensions
-    */
-  public function __construct($script, $disabled=NULL)
-    {
-      if (!empty($disabled))
-        foreach ($disabled as $ext)
-          if (($idx = array_search($ext, $this->supported)) !== false)
-           unset($this->supported[$idx]);
-
-      $this->content = $this->_parse_text($script);
-    }
-
-  /**
-    * Adds script contents as text to the script array (at the end)
-    *
-    * @param   string  Text script contents
-    */
-  public function add_text($script)
-    {
-      $content = $this->_parse_text($script);
-      $result = false;
-      
-      // check existsing script rules names
-      foreach ($this->content as $idx => $elem)
-        $names[$elem['name']] = $idx;
-      
-      foreach ($content as $elem)
-        if (!isset($names[$elem['name']]))
-         {
-            array_push($this->content, $elem);
-           $result = true;
-         }
-
-      return $result;
-    }
-
-  /**
-    * Adds rule to the script (at the end)
-    *
-    * @param   string  Rule name
-    * @param   array   Rule content (as array)
-    */
-  public function add_rule($content)
-    {
-      // TODO: check this->supported
-      array_push($this->content, $content);
-      return sizeof($this->content)-1;
-    }
-
-  public function delete_rule($index)
-    {
-      if(isset($this->content[$index]))
-        {
-          unset($this->content[$index]);
-         return true;
-       }
-      return false;
-    }
-
-  public function size()
-    {
-      return sizeof($this->content);
-    }
-
-  public function update_rule($index, $content)
-    {
-      // TODO: check this->supported
-      if ($this->content[$index])
-        {
-         $this->content[$index] = $content;
-         return $index;
-       }
-      return false;
-    }
-
-  /**
-    * Returns script as text
-    */
-  public function as_text()
-    {
-      $script = '';
-      $exts = array();
-      $idx = 0;
-      
-      // rules
-      foreach ($this->content as $rule)
-        {
-         $extension = '';
-         $tests = array();
-         $i = 0;
-         
-         // header
-         $script .= '# rule:[' . $rule['name'] . "]\n";
-  
-         // constraints expressions
-         foreach ($rule['tests'] as $test)
-           {
-             $tests[$i] = '';
-             switch ($test['test'])
-               {
-                 case 'size':
-                   $tests[$i] .= ($test['not'] ? 'not ' : '');
-                   $tests[$i] .= 'size :' . ($test['type']=='under' ? 'under ' : 'over ') . $test['arg'];
-                 break;
-                 case 'true':
-                   $tests[$i] .= ($test['not'] ? 'not true' : 'true');
-                 break;
-                 case 'exists':
-                   $tests[$i] .= ($test['not'] ? 'not ' : '');
-                   if (is_array($test['arg']))
-                       $tests[$i] .= 'exists ["' . implode('", "', $this->_escape_string($test['arg'])) . '"]';
-                   else
-                       $tests[$i] .= 'exists "' . $this->_escape_string($test['arg']) . '"';
-                 break;    
-                 case 'header':
-                   $tests[$i] .= ($test['not'] ? 'not ' : '');
-                   $tests[$i] .= 'header :' . $test['type'];
-                   if (is_array($test['arg1']))
-                       $tests[$i] .= ' ["' . implode('", "', $this->_escape_string($test['arg1'])) . '"]';
-                   else
-                       $tests[$i] .= ' "' . $this->_escape_string($test['arg1']) . '"';
-                   if (is_array($test['arg2']))
-                       $tests[$i] .= ' ["' . implode('", "', $this->_escape_string($test['arg2'])) . '"]';
-                   else
-                       $tests[$i] .= ' "' . $this->_escape_string($test['arg2']) . '"';
-                 break;
-               }
-             $i++;
-           }
-  
-         $script .= ($idx>0 ? 'els' : '').($rule['join'] ? 'if allof (' : 'if anyof (');
-         if (sizeof($tests) > 1)
-           $script .= implode(",\n\t", $tests);
-         elseif (sizeof($tests))
-           $script .= $tests[0];
-         else
-           $script .= 'true';
-         $script .= ")\n{\n";
-  
-         // action(s)
-         foreach ($rule['actions'] as $action)
-           switch ($action['type'])
-           {
-             case 'fileinto':
-               $extension = 'fileinto';
-               $script .= "\tfileinto \"" . $this->_escape_string($action['target']) . "\";\n";
-             break;
-             case 'redirect':
-               $script .= "\tredirect \"" . $this->_escape_string($action['target']) . "\";\n";
-             break;
-             case 'reject':
-             case 'ereject':
-               $extension = $action['type'];
-               if (strpos($action['target'], "\n")!==false)
-                 $script .= "\t".$action['type']." text:\n" . $action['target'] . "\n.\n;\n";
-               else
-                 $script .= "\t".$action['type']." \"" . $this->_escape_string($action['target']) . "\";\n";
-             break;
-             case 'keep':
-             case 'discard':
-             case 'stop':
-               $script .= "\t" . $action['type'] .";\n";
-             break;
-             case 'vacation':
-                $extension = 'vacation';
-                $script .= "\tvacation";
-               if ($action['days'])
-                 $script .= " :days " . $action['days'];
-               if ($action['addresses'])
-                 $script .= " :addresses " . $this->_print_list($action['addresses']);
-               if ($action['subject'])
-                 $script .= " :subject \"" . $this->_escape_string($action['subject']) . "\"";
-               if ($action['handle'])
-                 $script .= " :handle \"" . $this->_escape_string($action['handle']) . "\"";
-               if ($action['from'])
-                 $script .= " :from \"" . $this->_escape_string($action['from']) . "\"";
-               if ($action['mime'])
-                 $script .= " :mime";
-               if (strpos($action['reason'], "\n")!==false)
-                 $script .= " text:\n" . $action['reason'] . "\n.\n;\n";
-               else
-                 $script .= " \"" . $this->_escape_string($action['reason']) . "\";\n";
-             break;
-           }
-         
-         $script .= "}\n";
-         $idx++;
-
-         if ($extension && !isset($exts[$extension]))
-           $exts[$extension] = $extension;
-       }
-      
-      // requires
-      if (sizeof($exts))
-        $script = 'require ["' . implode('","', $exts) . "\"];\n" . $script;
-
-      return $script;
-    }
-
-  /**
-    * Returns script object
-    *
-    */
-  public function as_array()
-    {
-      return $this->content;
-    }
-
-  /**
-    * Returns array of supported extensions
-    *
-    */
-  public function get_extensions()
-    {
-      return array_values($this->supported);
-    }
-
-  /**
-    * Converts text script to rules array
-    *
-    * @param   string  Text script
-    */
-  private function _parse_text($script)
-    {
-      $i = 0;
-      $content = array();
-
-      // remove C comments
-      $script = preg_replace('|/\*.*?\*/|sm', '', $script);
-
-      // tokenize rules
-      if ($tokens = preg_split('/(# rule:\[.*\])\r?\n/', $script, -1, PREG_SPLIT_DELIM_CAPTURE))
-        foreach($tokens as $token)
-         {
-           if (preg_match('/^# rule:\[(.*)\]/', $token, $matches))
-             {
-               $content[$i]['name'] = $matches[1];
-             }
-           elseif (isset($content[$i]['name']) && sizeof($content[$i]) == 1)
-             {
-               if ($rule = $this->_tokenize_rule($token))
-                 {
-                   $content[$i] = array_merge($content[$i], $rule);
-                   $i++;
-                 }
-               else // unknown rule format
-                   unset($content[$i]);
-             }
-         }
-
-      return $content;
-    }
-
-  /**
-    * Convert text script fragment to rule object
-    *
-    * @param   string  Text rule
-    */
-  private function _tokenize_rule($content)
-    {
-      $result = NULL;
-    
-      if (preg_match('/^(if|elsif|else)\s+((true|not\s+true|allof|anyof|exists|header|not|size)(.*))\s+\{(.*)\}$/sm', trim($content), $matches))
-        {
-         list($tests, $join) = $this->_parse_tests(trim($matches[2]));
-         $actions = $this->_parse_actions(trim($matches[5]));
-
-         if ($tests && $actions)
-           $result = array(
-                   'tests' => $tests,
-                   'actions' => $actions,
-                   'join' => $join,
-           );
-       }
-
-      return $result;
-    }    
-
-  /**
-    * Parse body of actions section
-    *
-    * @param   string  Text body
-    * @return  array   Array of parsed action type/target pairs
-    */
-  private function _parse_actions($content)
-    {
-      $result = NULL;
-
-      // supported actions
-      $patterns[] = '^\s*discard;';
-      $patterns[] = '^\s*keep;';
-      $patterns[] = '^\s*stop;';
-      $patterns[] = '^\s*redirect\s+(.*?[^\\\]);';
-      if (in_array('fileinto', $this->supported))
-        $patterns[] = '^\s*fileinto\s+(.*?[^\\\]);';
-      if (in_array('reject', $this->supported)) {
-        $patterns[] = '^\s*reject\s+text:(.*)\n\.\n;';
-        $patterns[] = '^\s*reject\s+(.*?[^\\\]);';
-        $patterns[] = '^\s*ereject\s+text:(.*)\n\.\n;';
-        $patterns[] = '^\s*ereject\s+(.*?[^\\\]);';
-      }
-      if (in_array('vacation', $this->supported))
-        $patterns[] = '^\s*vacation\s+(.*?[^\\\]);';
-
-      $pattern = '/(' . implode('$)|(', $patterns) . '$)/ms';
-
-      // parse actions body
-      if (preg_match_all($pattern, $content, $mm, PREG_SET_ORDER))
-      {
-       foreach ($mm as $m)
-       {
-         $content = trim($m[0]);
-         
-         if(preg_match('/^(discard|keep|stop)/', $content, $matches))
-           {
-             $result[] = array('type' => $matches[1]);
-           }
-          elseif(preg_match('/^fileinto/', $content))
-           {
-             $result[] = array('type' => 'fileinto', 'target' => $this->_parse_string($m[sizeof($m)-1])); 
-           }
-          elseif(preg_match('/^redirect/', $content))
-           {
-             $result[] = array('type' => 'redirect', 'target' => $this->_parse_string($m[sizeof($m)-1])); 
-           }
-         elseif(preg_match('/^(reject|ereject)\s+(.*);$/sm', $content, $matches))
-           {
-             $result[] = array('type' => $matches[1], 'target' => $this->_parse_string($matches[2])); 
-           }
-          elseif(preg_match('/^vacation\s+(.*);$/sm', $content, $matches))
-            {
-             $vacation = array('type' => 'vacation');
-
-             if (preg_match('/:(days)\s+([0-9]+)/', $content, $vm)) {
-               $vacation['days'] = $vm[2];
-               $content = preg_replace('/:(days)\s+([0-9]+)/', '', $content); 
-             }
-             if (preg_match('/:(subject)\s+(".*?[^\\\]")/', $content, $vm)) {
-               $vacation['subject'] = $vm[2];
-               $content = preg_replace('/:(subject)\s+(".*?[^\\\]")/', '', $content); 
-             }
-             if (preg_match('/:(addresses)\s+\[(.*?[^\\\])\]/', $content, $vm)) {
-               $vacation['addresses'] = $this->_parse_list($vm[2]);
-               $content = preg_replace('/:(addresses)\s+\[(.*?[^\\\])\]/', '', $content); 
-             }
-             if (preg_match('/:(handle)\s+(".*?[^\\\]")/', $content, $vm)) {
-               $vacation['handle'] = $vm[2];
-               $content = preg_replace('/:(handle)\s+(".*?[^\\\]")/', '', $content); 
-             }
-             if (preg_match('/:(from)\s+(".*?[^\\\]")/', $content, $vm)) {
-               $vacation['from'] = $vm[2];
-               $content = preg_replace('/:(from)\s+(".*?[^\\\]")/', '', $content); 
-             }
-             $content = preg_replace('/^vacation/', '', $content);          
-             $content = preg_replace('/;$/', '', $content);
-             $content = trim($content);
-             if (preg_match('/^:(mime)/', $content, $vm)) {
-               $vacation['mime'] = true;
-               $content = preg_replace('/^:mime/', '', $content); 
-             }
-
-             $vacation['reason'] = $this->_parse_string($content);
-
-              $result[] = $vacation;
+
+    /**
+     * Object constructor
+     *
+     * @param  string  Script's text content
+     * @param  array   Disabled extensions
+     */
+    public function __construct($script, $disabled=NULL)
+    {
+        if (!empty($disabled))
+            foreach ($disabled as $ext)
+                if (($idx = array_search($ext, $this->supported)) !== false)
+                    unset($this->supported[$idx]);
+
+        $this->content = $this->_parse_text($script);
+    }
+
+    /**
+     * Adds script contents as text to the script array (at the end)
+     *
+     * @param    string    Text script contents
+     */
+    public function add_text($script)
+    {
+        $content = $this->_parse_text($script);
+        $result = false;
+
+        // check existsing script rules names
+        foreach ($this->content as $idx => $elem) {
+            $names[$elem['name']] = $idx;
+        }
+
+        foreach ($content as $elem) {
+            if (!isset($names[$elem['name']])) {
+                array_push($this->content, $elem);
+                $result = true;
             }
         }
-      }
-
-      return $result;
-    }    
-    
-   /**
-    * Parse test/conditions section
-    *
-    * @param   string  Text 
-    */
-
-  private function _parse_tests($content)
-    {
-      $result = NULL;
-
-      // lists
-      if (preg_match('/^(allof|anyof)\s+\((.*)\)$/sm', $content, $matches))
-       {
-         $content = $matches[2];
-         $join = $matches[1]=='allof' ? true : false;
-       }
-      else
-         $join = false;
-      
-      // supported tests regular expressions
-      // TODO: comparators, envelope
-      $patterns[] = '(not\s+)?(exists)\s+\[(.*?[^\\\])\]';
-      $patterns[] = '(not\s+)?(exists)\s+(".*?[^\\\]")';
-      $patterns[] = '(not\s+)?(true)';
-      $patterns[] = '(not\s+)?(size)\s+:(under|over)\s+([0-9]+[KGM]{0,1})';
-      $patterns[] = '(not\s+)?(header)\s+:(contains|is|matches)\s+\[(.*?[^\\\]")\]\s+\[(.*?[^\\\]")\]';
-      $patterns[] = '(not\s+)?(header)\s+:(contains|is|matches)\s+(".*?[^\\\]")\s+(".*?[^\\\]")';
-      $patterns[] = '(not\s+)?(header)\s+:(contains|is|matches)\s+\[(.*?[^\\\]")\]\s+(".*?[^\\\]")';
-      $patterns[] = '(not\s+)?(header)\s+:(contains|is|matches)\s+(".*?[^\\\]")\s+\[(.*?[^\\\]")\]';
-      
-      // join patterns...
-      $pattern = '/(' . implode(')|(', $patterns) . ')/';
-
-      // ...and parse tests list
-      if (preg_match_all($pattern, $content, $matches, PREG_SET_ORDER))
-        {
-         foreach ($matches as $match)
-           {
-             $size = sizeof($match);
-             
-             if (preg_match('/^(not\s+)?size/', $match[0]))
-               {
-                 $result[] = array(
-                   'test'      => 'size',
-                   'not'       => $match[$size-4] ? true : false,
-                   'type'      => $match[$size-2], // under/over
-                   'arg'       => $match[$size-1], // value
-                 );
-               }
-             elseif (preg_match('/^(not\s+)?header/', $match[0]))
-               {
-                 $result[] = array(
-                   'test'      => 'header',
-                   'not'       => $match[$size-5] ? true : false,
-                   'type'      => $match[$size-3], // is/contains/matches
-                   'arg1'      => $this->_parse_list($match[$size-2]), // header(s)
-                   'arg2'      => $this->_parse_list($match[$size-1]), // string(s)
-                 );  
-               }
-             elseif (preg_match('/^(not\s+)?exists/', $match[0]))
-               {
-                 $result[] = array(
-                   'test'      => 'exists',
-                   'not'       => $match[$size-3] ? true : false,
-                   'arg'       => $this->_parse_list($match[$size-1]), // header(s)
-                 );
-               }
-             elseif (preg_match('/^(not\s+)?true/', $match[0]))
-               {
-                 $result[] = array(
-                   'test'      => 'true',
-                   'not'       => $match[$size-2] ? true : false,
-                 );
-               }
-           }
-       }
-
-      return array($result, $join);
-    }    
-
-   /**
-    * Parse string value
-    *
-    * @param   string  Text 
-    */
-  private function _parse_string($content)
-    {
-      $text = '';
-      $content = trim($content);
-
-      if (preg_match('/^text:(.*)\.$/sm', $content, $matches))
-        $text = trim($matches[1]);
-      elseif (preg_match('/^"(.*)"$/', $content, $matches))
-        $text = str_replace('\"', '"', $matches[1]);
-
-      return $text;
-    }    
-
-   /**
-    * Escape special chars in string value
-    *
-    * @param   string  Text 
-    */
-  private function _escape_string($content)
-    {
-      $replace['/"/'] = '\\"';
-      
-      if (is_array($content))
-        {
-         for ($x=0, $y=sizeof($content); $x<$y; $x++)
-           $content[$x] = preg_replace(array_keys($replace), array_values($replace), $content[$x]);
-        
-         return $content;
-       }
-      else
-        return preg_replace(array_keys($replace), array_values($replace), $content);
-    }
-
-   /**
-    * Parse string or list of strings to string or array of strings
-    *
-    * @param   string  Text 
-    */
-  private function _parse_list($content)
-    {
-      $result = array();
-      
-      for ($x=0, $len=strlen($content); $x<$len; $x++)
-        {
-         switch ($content[$x])
-           {
-             case '\\':
-               $str .= $content[++$x];
-              break;
-             case '"':
-               if (isset($str))
-                 {
-                   $result[] = $str;
-                   unset($str);
-                 }
-               else
-                 $str = '';
-             break;
-             default:
-               if(isset($str))
-                 $str .= $content[$x];
-             break;
-           }
-       }
-      
-      if (sizeof($result)>1)
+
         return $result;
-      elseif (sizeof($result) == 1)
-       return $result[0];
-      else
-        return NULL;
-    }    
-
-   /**
-    * Convert array of elements to list of strings
-    *
-    * @param   string  Text 
-    */
-  private function _print_list($list)
-    {
-      $list = (array) $list;
-      foreach($list as $idx => $val)
-        $list[$idx] = $this->_escape_string($val);
-    
-      return '["' . implode('","', $list) . '"]';
     }
-}
 
-?>
+    /**
+     * Adds rule to the script (at the end)
+     *
+     * @param string Rule name
+     * @param array  Rule content (as array)
+     */
+    public function add_rule($content)
+    {
+        // TODO: check this->supported
+        array_push($this->content, $content);
+        return sizeof($this->content)-1;
+    }
+
+    public function delete_rule($index)
+    {
+        if(isset($this->content[$index])) {
+            unset($this->content[$index]);
+            return true;
+        }
+        return false;
+    }
+
+    public function size()
+    {
+        return sizeof($this->content);
+    }
+
+    public function update_rule($index, $content)
+    {
+        // TODO: check this->supported
+        if ($this->content[$index]) {
+            $this->content[$index] = $content;
+            return $index;
+        }
+        return false;
+    }
+
+    /**
+     * Returns script as text
+     */
+    public function as_text()
+    {
+        $script = '';
+        $exts = array();
+        $idx = 0;
+
+        // rules
+        foreach ($this->content as $rule) {
+            $extension = '';
+            $tests = array();
+            $i = 0;
+
+            // header
+            $script .= '# rule:[' . $rule['name'] . "]\n";
+
+            // constraints expressions
+            foreach ($rule['tests'] as $test) {
+                $tests[$i] = '';
+                switch ($test['test']) {
+                case 'size':
+                    $tests[$i] .= ($test['not'] ? 'not ' : '');
+                    $tests[$i] .= 'size :' . ($test['type']=='under' ? 'under ' : 'over ') . $test['arg'];
+                    break;
+                case 'true':
+                    $tests[$i] .= ($test['not'] ? 'not true' : 'true');
+                    break;
+                case 'exists':
+                    $tests[$i] .= ($test['not'] ? 'not ' : '');
+                    if (is_array($test['arg']))
+                        $tests[$i] .= 'exists ["' . implode('", "', $this->_escape_string($test['arg'])) . '"]';
+                    else
+                        $tests[$i] .= 'exists "' . $this->_escape_string($test['arg']) . '"';
+                    break;
+                case 'header':
+                    $tests[$i] .= ($test['not'] ? 'not ' : '');
+
+                    // relational operator + comparator
+                                       if (preg_match('/^(value|count)-([gteqnl]{2})/', $test['type'], $m)) {
+                                               array_push($exts, 'relational');
+                                               array_push($exts, 'comparator-i;ascii-numeric');
+                        $tests[$i] .= 'header :' . $m[1] . ' "' . $m[2] . '" :comparator "i;ascii-numeric"';
+                    }
+                    else
+                        $tests[$i] .= 'header :' . $test['type'];
+                    
+                    if (is_array($test['arg1']))
+                        $tests[$i] .= ' ["' . implode('", "', $this->_escape_string($test['arg1'])) . '"]';
+                    else
+                        $tests[$i] .= ' "' . $this->_escape_string($test['arg1']) . '"';
+
+                    if (is_array($test['arg2']))
+                        $tests[$i] .= ' ["' . implode('", "', $this->_escape_string($test['arg2'])) . '"]';
+                    else
+                        $tests[$i] .= ' "' . $this->_escape_string($test['arg2']) . '"';
+
+                    break;
+                }
+                $i++;
+            }
+
+//          $script .= ($idx>0 ? 'els' : '').($rule['join'] ? 'if allof (' : 'if anyof (');
+            // disabled rule: if false #....
+            $script .= 'if' . ($rule['disabled'] ? ' false #' : '');
+            $script .= $rule['join'] ? ' allof (' : ' anyof (';
+            if (sizeof($tests) > 1)
+                $script .= implode(", ", $tests);
+            else if (sizeof($tests))
+                $script .= $tests[0];
+            else
+                $script .= 'true';
+            $script .= ")\n{\n";
+
+            // action(s)
+            foreach ($rule['actions'] as $action) {
+                switch ($action['type']) {
+                case 'fileinto':
+                    array_push($exts, 'fileinto');
+                    $script .= "\tfileinto ";
+                    if ($action['copy']) {
+                        $script .= ':copy ';
+                        array_push($exts, 'copy');
+                    }
+                    $script .= "\"" . $this->_escape_string($action['target']) . "\";\n";
+                    break;
+                case 'redirect':
+                    $script .= "\tredirect ";
+                    if ($action['copy']) {
+                        $script .= ':copy ';
+                        array_push($exts, 'copy');
+                    }
+                    $script .= "\"" . $this->_escape_string($action['target']) . "\";\n";
+                    break;
+                case 'reject':
+                case 'ereject':
+                    array_push($exts, $action['type']);
+                    if (strpos($action['target'], "\n")!==false)
+                        $script .= "\t".$action['type']." text:\n" . $action['target'] . "\n.\n;\n";
+                    else
+                        $script .= "\t".$action['type']." \"" . $this->_escape_string($action['target']) . "\";\n";
+                    break;
+                case 'keep':
+                case 'discard':
+                case 'stop':
+                    $script .= "\t" . $action['type'] .";\n";
+                    break;
+                case 'vacation':
+                    array_push($exts, 'vacation');
+                    $script .= "\tvacation";
+                    if ($action['days'])
+                        $script .= " :days " . $action['days'];
+                    if ($action['addresses'])
+                        $script .= " :addresses " . $this->_print_list($action['addresses']);
+                    if ($action['subject'])
+                        $script .= " :subject \"" . $this->_escape_string($action['subject']) . "\"";
+                    if ($action['handle'])
+                        $script .= " :handle \"" . $this->_escape_string($action['handle']) . "\"";
+                    if ($action['from'])
+                        $script .= " :from \"" . $this->_escape_string($action['from']) . "\"";
+                    if ($action['mime'])
+                        $script .= " :mime";
+                    if (strpos($action['reason'], "\n")!==false)
+                        $script .= " text:\n" . $action['reason'] . "\n.\n;\n";
+                    else
+                        $script .= " \"" . $this->_escape_string($action['reason']) . "\";\n";
+                    break;
+                }
+            }
+
+            $script .= "}\n";
+            $idx++;
+        }
+
+        // requires
+        if (!empty($exts))
+            $script = 'require ["' . implode('","', array_unique($exts)) . "\"];\n" . $script;
+
+        return $script;
+    }
+
+    /**
+     * Returns script object
+     *
+     */
+    public function as_array()
+    {
+        return $this->content;
+    }
+
+    /**
+     * Returns array of supported extensions
+     *
+     */
+    public function get_extensions()
+    {
+        return array_values($this->supported);
+    }
+
+    /**
+     * Converts text script to rules array
+     *
+     * @param string Text script
+     */
+    private function _parse_text($script)
+    {
+        $i = 0;
+        $content = array();
+
+        // remove C comments
+        $script = preg_replace('|/\*.*?\*/|sm', '', $script);
+
+        // tokenize rules
+        if ($tokens = preg_split('/(# rule:\[.*\])\r?\n/', $script, -1, PREG_SPLIT_DELIM_CAPTURE)) {
+            foreach($tokens as $token) {
+                if (preg_match('/^# rule:\[(.*)\]/', $token, $matches)) {
+                    $content[$i]['name'] = $matches[1];
+                }
+                else if (isset($content[$i]['name']) && sizeof($content[$i]) == 1) {
+                    if ($rule = $this->_tokenize_rule($token)) {
+                        $content[$i] = array_merge($content[$i], $rule);
+                        $i++;
+                    }
+                    else // unknown rule format
+                        unset($content[$i]);
+                }
+            }
+        }
+
+        return $content;
+    }
+
+    /**
+     * Convert text script fragment to rule object
+     *
+     * @param string Text rule
+     */
+    private function _tokenize_rule($content)
+    {
+        $result = NULL;
+
+        if (preg_match('/^(if|elsif|else)\s+((true|false|not\s+true|allof|anyof|exists|header|not|size)(.*))\s+\{(.*)\}$/sm',
+            trim($content), $matches)) {
+
+            $tests = trim($matches[2]);
+
+            // disabled rule (false + comment): if false #.....
+            if ($matches[3] == 'false') {
+                $tests = preg_replace('/^false\s+#\s+/', '', $tests);
+                $disabled = true;
+            }
+            else
+                $disabled = false;
+
+            list($tests, $join) = $this->_parse_tests($tests);
+            $actions = $this->_parse_actions(trim($matches[5]));
+
+            if ($tests && $actions)
+                $result = array(
+                    'type'     => $matches[1],
+                    'tests'    => $tests,
+                    'actions'  => $actions,
+                    'join'     => $join,
+                    'disabled' => $disabled,
+            );
+        }
+
+        return $result;
+    }
+
+    /**
+     * Parse body of actions section
+     *
+     * @param string Text body
+     * @return array Array of parsed action type/target pairs
+     */
+    private function _parse_actions($content)
+    {
+        $result = NULL;
+
+        // supported actions
+        $patterns[] = '^\s*discard;';
+        $patterns[] = '^\s*keep;';
+        $patterns[] = '^\s*stop;';
+        $patterns[] = '^\s*redirect\s+(.*?[^\\\]);';
+        if (in_array('fileinto', $this->supported))
+            $patterns[] = '^\s*fileinto\s+(.*?[^\\\]);';
+        if (in_array('reject', $this->supported)) {
+            $patterns[] = '^\s*reject\s+text:(.*)\n\.\n;';
+            $patterns[] = '^\s*reject\s+(.*?[^\\\]);';
+            $patterns[] = '^\s*ereject\s+text:(.*)\n\.\n;';
+            $patterns[] = '^\s*ereject\s+(.*?[^\\\]);';
+        }
+        if (in_array('vacation', $this->supported))
+            $patterns[] = '^\s*vacation\s+(.*?[^\\\]);';
+
+        $pattern = '/(' . implode('\s*$)|(', $patterns) . '$\s*)/ms';
+
+        // parse actions body
+        if (preg_match_all($pattern, $content, $mm, PREG_SET_ORDER)) {
+            foreach ($mm as $m) {
+                $content = trim($m[0]);
+
+                if(preg_match('/^(discard|keep|stop)/', $content, $matches)) {
+                    $result[] = array('type' => $matches[1]);
+                }
+                else if(preg_match('/^fileinto/', $content)) {
+                    $target = $m[sizeof($m)-1];
+                    $copy = false;
+                    if (preg_match('/^:copy\s+/', $target)) {
+                        $target = preg_replace('/^:copy\s+/', '', $target);
+                        $copy = true;
+                    }
+                    $result[] = array('type' => 'fileinto', 'copy' => $copy,
+                        'target' => $this->_parse_string($target));
+                }
+                else if(preg_match('/^redirect/', $content)) {
+                    $target = $m[sizeof($m)-1];
+                    $copy = false;
+                    if (preg_match('/^:copy\s+/', $target)) {
+                        $target = preg_replace('/^:copy\s+/', '', $target);
+                        $copy = true;
+                    }
+                    $result[] = array('type' => 'redirect', 'copy' => $copy,
+                        'target' => $this->_parse_string($target));
+                }
+                else if(preg_match('/^(reject|ereject)\s+(.*);$/sm', $content, $matches)) {
+                    $result[] = array('type' => $matches[1], 'target' => $this->_parse_string($matches[2]));
+                }
+                else if(preg_match('/^vacation\s+(.*);$/sm', $content, $matches)) {
+                    $vacation = array('type' => 'vacation');
+
+                    if (preg_match('/:days\s+([0-9]+)/', $content, $vm)) {
+                        $vacation['days'] = $vm[1];
+                        $content = preg_replace('/:days\s+([0-9]+)/', '', $content);
+                    }
+                    if (preg_match('/:subject\s+"(.*?[^\\\])"/', $content, $vm)) {
+                        $vacation['subject'] = $vm[1];
+                        $content = preg_replace('/:subject\s+"(.*?[^\\\])"/', '', $content);
+                    }
+                    if (preg_match('/:addresses\s+\[(.*?[^\\\])\]/', $content, $vm)) {
+                        $vacation['addresses'] = $this->_parse_list($vm[1]);
+                        $content = preg_replace('/:addresses\s+\[(.*?[^\\\])\]/', '', $content);
+                    }
+                    if (preg_match('/:handle\s+"(.*?[^\\\])"/', $content, $vm)) {
+                        $vacation['handle'] = $vm[1];
+                        $content = preg_replace('/:handle\s+"(.*?[^\\\])"/', '', $content);
+                    }
+                    if (preg_match('/:from\s+"(.*?[^\\\])"/', $content, $vm)) {
+                        $vacation['from'] = $vm[1];
+                        $content = preg_replace('/:from\s+"(.*?[^\\\])"/', '', $content);
+                    }
+
+                    $content = preg_replace('/^vacation/', '', $content);
+                    $content = preg_replace('/;$/', '', $content);
+                    $content = trim($content);
+
+                    if (preg_match('/^:mime/', $content, $vm)) {
+                        $vacation['mime'] = true;
+                        $content = preg_replace('/^:mime/', '', $content);
+                    }
+
+                    $vacation['reason'] = $this->_parse_string($content);
+
+                    $result[] = $vacation;
+                }
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Parse test/conditions section
+     *
+     * @param string Text
+     */
+    private function _parse_tests($content)
+    {
+        $result = NULL;
+
+        // lists
+        if (preg_match('/^(allof|anyof)\s+\((.*)\)$/sm', $content, $matches)) {
+            $content = $matches[2];
+            $join = $matches[1]=='allof' ? true : false;
+        }
+        else
+            $join = false;
+
+        // supported tests regular expressions
+        // TODO: comparators, envelope
+        $patterns[] = '(not\s+)?(exists)\s+\[(.*?[^\\\])\]';
+        $patterns[] = '(not\s+)?(exists)\s+(".*?[^\\\]")';
+        $patterns[] = '(not\s+)?(true)';
+        $patterns[] = '(not\s+)?(size)\s+:(under|over)\s+([0-9]+[KGM]{0,1})';
+        $patterns[] = '(not\s+)?(header)\s+:(contains|is|matches)((\s+))\[(.*?[^\\\]")\]\s+\[(.*?[^\\\]")\]';
+        $patterns[] = '(not\s+)?(header)\s+:(contains|is|matches)((\s+))(".*?[^\\\]")\s+(".*?[^\\\]")';
+        $patterns[] = '(not\s+)?(header)\s+:(contains|is|matches)((\s+))\[(.*?[^\\\]")\]\s+(".*?[^\\\]")';
+        $patterns[] = '(not\s+)?(header)\s+:(contains|is|matches)((\s+))(".*?[^\\\]")\s+\[(.*?[^\\\]")\]';
+               $patterns[] = '(not\s+)?(header)\s+:(count\s+"[gtleqn]{2}"|value\s+"[gtleqn]{2}")(\s+:comparator\s+"(.*?[^\\\])")?\s+\[(.*?[^\\\]")\]\s+\[(.*?[^\\\]")\]';
+               $patterns[] = '(not\s+)?(header)\s+:(count\s+"[gtleqn]{2}"|value\s+"[gtleqn]{2}")(\s+:comparator\s+"(.*?[^\\\])")?\s+(".*?[^\\\]")\s+(".*?[^\\\]")';
+               $patterns[] = '(not\s+)?(header)\s+:(count\s+"[gtleqn]{2}"|value\s+"[gtleqn]{2}")(\s+:comparator\s+"(.*?[^\\\])")?\s+\[(.*?[^\\\]")\]\s+(".*?[^\\\]")';
+               $patterns[] = '(not\s+)?(header)\s+:(count\s+"[gtleqn]{2}"|value\s+"[gtleqn]{2}")(\s+:comparator\s+"(.*?[^\\\])")?\s+(".*?[^\\\]")\s+\[(.*?[^\\\]")\]';
+
+        // join patterns...
+        $pattern = '/(' . implode(')|(', $patterns) . ')/';
+
+        // ...and parse tests list
+        if (preg_match_all($pattern, $content, $matches, PREG_SET_ORDER)) {
+            foreach ($matches as $match) {
+                $size = sizeof($match);
+
+                if (preg_match('/^(not\s+)?size/', $match[0])) {
+                    $result[] = array(
+                        'test' => 'size',
+                        'not'  => $match[$size-4] ? true : false,
+                        'type' => $match[$size-2], // under/over
+                        'arg'  => $match[$size-1], // value
+                    );
+                }
+                else if (preg_match('/^(not\s+)?header/', $match[0])) {
+                    $type = $match[$size-5];
+                    if (preg_match('/^(count|value)\s+"([gtleqn]{2})"/', $type, $m))
+                        $type = $m[1] . '-' . $m[2];
+                    
+                    $result[] = array(
+                        'test' => 'header',
+                        'type' => $type, // is/contains/matches
+                                               'not'  => $match[$size-7] ? true : false,
+                        'arg1' => $this->_parse_list($match[$size-2]), // header(s)
+                        'arg2' => $this->_parse_list($match[$size-1]), // string(s)
+                    );
+                }
+                else if (preg_match('/^(not\s+)?exists/', $match[0])) {
+                    $result[] = array(
+                        'test' => 'exists',
+                        'not'  => $match[$size-3] ? true : false,
+                        'arg'  => $this->_parse_list($match[$size-1]), // header(s)
+                    );
+                }
+                else if (preg_match('/^(not\s+)?true/', $match[0])) {
+                    $result[] = array(
+                        'test' => 'true',
+                        'not'  => $match[$size-2] ? true : false,
+                    );
+                }
+            }
+        }
+
+        return array($result, $join);
+    }
+
+    /**
+     * Parse string value
+     *
+     * @param string Text
+     */
+    private function _parse_string($content)
+    {
+        $text = '';
+        $content = trim($content);
+
+        if (preg_match('/^text:(.*)\.$/sm', $content, $matches))
+            $text = trim($matches[1]);
+        else if (preg_match('/^"(.*)"$/', $content, $matches))
+            $text = str_replace('\"', '"', $matches[1]);
+
+        return $text;
+    }
+
+    /**
+     * Escape special chars in string value
+     *
+     * @param string Text
+     */
+    private function _escape_string($content)
+    {
+        $replace['/"/'] = '\\"';
+
+        if (is_array($content)) {
+            for ($x=0, $y=sizeof($content); $x<$y; $x++)
+                $content[$x] = preg_replace(array_keys($replace),
+                    array_values($replace), $content[$x]);
+
+            return $content;
+        }
+        else
+            return preg_replace(array_keys($replace), array_values($replace), $content);
+    }
+
+    /**
+     * Parse string or list of strings to string or array of strings
+     *
+     * @param string Text
+     */
+    private function _parse_list($content)
+    {
+        $result = array();
+
+        for ($x=0, $len=strlen($content); $x<$len; $x++) {
+            switch ($content[$x]) {
+            case '\\':
+                $str .= $content[++$x];
+                break;
+            case '"':
+                if (isset($str)) {
+                    $result[] = $str;
+                    unset($str);
+                }
+                else
+                    $str = '';
+                break;
+            default:
+                if(isset($str))
+                    $str .= $content[$x];
+            break;
+            }
+        }
+
+        if (sizeof($result)>1)
+            return $result;
+        else if (sizeof($result) == 1)
+            return $result[0];
+        else
+            return NULL;
+    }
+
+    /**
+     * Convert array of elements to list of strings
+     *
+     * @param string Text
+     */
+    private function _print_list($list)
+    {
+        $list = (array) $list;
+        foreach($list as $idx => $val)
+            $list[$idx] = $this->_escape_string($val);
+
+        return '["' . implode('","', $list) . '"]';
+    }
+}
index 96ce63bd0e01b21cee35e557d23bad787cc4f9f5..90f34bf8e3f5b3f2a24ad2e3f893387fcb8d5dd9 100644 (file)
@@ -39,7 +39,7 @@ $messages['filterunknownerror'] = 'Неизвестна грешка на сър
 $messages['filterconnerror'] = 'Невъзможност за свързване с managesieve сървъра ';
 $messages['filterdeleteerror'] = 'Невъзможност за изтриване на филтър. Сървър грешка';
 $messages['filterdeleted'] = 'Филтърът е изтрит успешно';
-$messages['filterconfirmdelete'] = 'Наистина ли искате да изтриете избрания филтър?';
+$messages['filterdeleteconfirm'] = 'Наистина ли искате да изтриете избрания филтър?';
 $messages['filtersaved'] = 'Филтърът е записан успешно';
 $messages['filtersaveerror'] = 'Филтърът не може да бъде записан. Сървър грешка.';
 $messages['ruledeleteconfirm'] = 'Сигурни ли сте, че искате да изтриете избраното правило?';
index 62f0fdfd1479154f4df7b4010871102ff24d9721..033a1a0e35092126e5db51c03c26ebefeeb517e6 100644 (file)
@@ -50,7 +50,7 @@ $messages['filterunknownerror'] = 'Neznámá chyba serveru';
 $messages['filterconnerror'] = 'Nebylo možné se připojit k sieve serveru';
 $messages['filterdeleteerror'] = 'Nebylo možné smazat filtr. Server nahlásil chybu';
 $messages['filterdeleted'] = 'Filtr byl smazán';
-$messages['filterconfirmdelete'] = 'Opravdu chcete smazat vybraný filtr?';
+$messages['filterdeleteconfirm'] = 'Opravdu chcete smazat vybraný filtr?';
 $messages['filtersaved'] = 'Filtr byl uložen';
 $messages['filtersaveerror'] = 'Nebylo možné uložit filtr. Server nahlásil chybu.';
 $messages['ruledeleteconfirm'] = 'Jste si jisti, že chcete smazat vybrané pravidlo?';
index c4d4d4952be9511d297075da684c5962b2979f13..c0fe389f529732305b3af02243266c3600828a1d 100644 (file)
@@ -41,7 +41,7 @@ $messages['filterunknownerror'] = 'Unbekannter Serverfehler';
 $messages['filterconnerror'] = 'Kann nicht zum Sieve-Server verbinden';
 $messages['filterdeleteerror'] = 'Fehler beim des löschen  Filters. Serverfehler';
 $messages['filterdeleted'] = 'Filter erfolgreich gelöscht';
-$messages['filterconfirmdelete'] = 'Möchten Sie den Filter löschen ?';
+$messages['filterdeleteconfirm'] = 'Möchten Sie den Filter löschen ?';
 $messages['filtersaved'] = 'Filter gespeichert';
 $messages['filtersaveerror'] = 'Serverfehler, konnte den Filter nicht speichern.';
 $messages['ruledeleteconfirm'] = 'Sicher, dass Sie die Regel löschen wollen?';
index e2caf77ead3926b1576489fb21b07cb6cad7a276..e71d7e00d6b9aa904595a5dcbdec65ec8b0f6a4b 100644 (file)
@@ -1,9 +1,9 @@
 <?php
 
 $labels['filters'] = 'Filter';
-$labels['managefilters'] = 'Verwalte eingehende Nachrichtenfilter';
+$labels['managefilters'] = 'Posteingangs-Filter verwalten';
 $labels['filtername'] = 'Filtername';
-$labels['newfilter'] = 'Neuer Filter';
+$labels['newfilter'] = 'Filter anlegen';
 $labels['filteradd'] = 'Filter hinzufügen';
 $labels['filterdel'] = 'Filter löschen';
 $labels['moveup'] = 'Nach oben';
@@ -15,39 +15,78 @@ $labels['filtercontains'] = 'enthält';
 $labels['filternotcontains'] = 'enthält nicht';
 $labels['filteris'] = 'ist gleich';
 $labels['filterisnot'] = 'ist ungleich';
-$labels['filterexists'] = 'vorhanden';
-$labels['filternotexists'] = 'nicht vorhanden';
+$labels['filterexists'] = 'existiert';
+$labels['filternotexists'] = 'existiert nicht';
 $labels['filterunder'] = 'unter';
 $labels['filterover'] = 'über';
 $labels['addrule'] = 'Regel hinzufügen';
 $labels['delrule'] = 'Regel löschen';
 $labels['messagemoveto'] = 'Verschiebe Nachricht nach';
-$labels['messageredirect'] = 'Leite Nachricht um nach';
+$labels['messageredirect'] = 'Leite Nachricht um an';
+$labels['messagecopyto'] = 'Kopiere Nachricht nach';
+$labels['messagesendcopy'] = 'Sende Kopie an';
 $labels['messagereply'] = 'Antworte mit Nachricht';
-$labels['messagedelete'] = 'Nachricht löschen';
+$labels['messagedelete'] = 'Lösche Nachricht';
 $labels['messagediscard'] = 'Weise ab mit Nachricht';
 $labels['messagesrules'] = 'Für eingehende Nachrichten:';
-$labels['messagesactions'] = '...führe folgende Aktionen aus:';
+$labels['messagesactions'] = '...führende folgende Aktionen aus:';
 $labels['add'] = 'Hinzufügen';
 $labels['del'] = 'Löschen';
 $labels['sender'] = 'Absender';
 $labels['recipient'] = 'Empfänger';
-$labels['vacationaddresses'] = 'Zusätzliche Liste von eMail-Empfängern (Komma getrennt):';
+$labels['vacationaddresses'] = 'Zusätzliche Liste von E-Mail Empfängern (Komma getrennt):';
 $labels['vacationdays'] = 'Wie oft sollen Nachrichten gesendet werden (in Tagen):';
-$labels['vacationreason'] = 'Inhalt der Nachricht (Abwesenheitsgrund):';
+$labels['vacationreason'] = 'Nachrichteninhalt (Abwesenheitsgrund):';
 $labels['rulestop'] = 'Regelauswertung anhalten';
+$labels['filterset'] = 'Filtersätze';
+$labels['filtersetadd'] = 'Filtersatz anlegen';
+$labels['filtersetdel'] = 'Aktuellen Filtersatz löschen';
+$labels['filtersetact'] = 'Aktuellen Filtersatz aktivieren';
+$labels['filtersetdeact'] = 'Aktuellen Filtersatz deaktivieren';
+$labels['filtersetget'] = 'Filtersatz im Textformat herunterladen';
+$labels['filterdef'] = 'Filterdefinition';
+$labels['filtersetname'] = 'Filtersatzname';
+$labels['newfilterset'] = 'Neuer Filtersatz';
+$labels['active'] = 'aktiv';
+$labels['none'] = 'keine';
+$labels['fromset'] = 'aus Filtersatz';
+$labels['fromfile'] = 'aus Datei';
+$labels['filterdisabled'] = 'Filter deaktiviert';
+$labels['countisgreaterthan'] = 'Anzahl ist größer als';
+$labels['countisgreaterthanequal'] = 'Anzahl ist gleich oder größer als';
+$labels['countislessthan'] = 'Anzahl ist kleiner als';
+$labels['countislessthanequal'] = 'Anzahl ist gleich oder kleiner als';
+$labels['countequals'] = 'Anzahl ist gleich';
+$labels['countnotequals'] = 'Anzahl ist ungleich';
+$labels['valueisgreaterthan'] = 'Wert ist größer als';
+$labels['valueisgreaterthanequal'] = 'Wert ist gleich oder größer als';
+$labels['valueislessthan'] = 'Wert ist kleiner';
+$labels['valueislessthanequal'] = 'Wert ist gleich oder kleiner als';
+$labels['valueequals'] = 'Wert ist gleich';
+$labels['valuenotequals'] = 'Wert ist ungleich';
 
 $messages = array();
 $messages['filterunknownerror'] = 'Unbekannter Serverfehler';
-$messages['filterconnerror'] = 'Kann nicht zum Sieve-Server verbinden';
+$messages['filterconnerror'] = 'Kann keine Verbindung mit Managesieve-Server herstellen';
 $messages['filterdeleteerror'] = 'Fehler beim Löschen des Filters. Serverfehler';
 $messages['filterdeleted'] = 'Filter erfolgreich gelöscht';
-$messages['filterconfirmdelete'] = 'Möchten Sie den Filter löschen?';
-$messages['filtersaved'] = 'Filter gespeichert';
-$messages['filtersaveerror'] = 'Serverfehler, konnte den Filter nicht speichern.';
-$messages['ruledeleteconfirm'] = 'Sicher, dass Sie die Regel löschen wollen?';
-$messages['actiondeleteconfirm'] = 'Sicher, dass Sie die ausgewählte Aktion löschen wollen?';
-$messages['forbiddenchars'] = 'Unerlaubte Zeichen im Feld';
-$messages['cannotbeempty'] = 'Feld darf nicht leer sein';
+$messages['filtersaved'] = 'Filter erfolgreich gespeichert';
+$messages['filtersaveerror'] = 'Fehler beim Speichern des Filters. Serverfehler';
+$messages['filterdeleteconfirm'] = 'Möchten Sie den ausgewählten Filter wirklich löschen?';
+$messages['ruledeleteconfirm'] = 'Sind Sie sicher, dass Sie die ausgewählte Regel löschen möchten?';
+$messages['actiondeleteconfirm'] = 'Sind Sie sicher, dass Sie die ausgewählte Aktion löschen möchten?';
+$messages['forbiddenchars'] = 'Unzulässige Zeichen im Eingabefeld';
+$messages['cannotbeempty'] = 'Eingabefeld darf nicht leer sein';
+$messages['setactivateerror'] = 'Kann ausgewählten Filtersatz nicht aktivieren. Serverfehler';
+$messages['setdeactivateerror'] = 'Kann ausgewählten Filtersatz nicht deaktivieren. Serverfehler';
+$messages['setdeleteerror'] = 'Kann ausgewählten Filtersatz nicht löschen. Serverfehler';
+$messages['setactivated'] = 'Filtersatz wurde erfolgreich aktiviert';
+$messages['setdeactivated'] = 'Filtersatz wurde erfolgreich deaktiviert';
+$messages['setdeleted'] = 'Filtersatz wurde erfolgreich gelöscht';
+$messages['setdeleteconfirm'] = 'Sind Sie sicher, dass Sie den ausgewählten Filtersatz löschen möchten?';
+$messages['setcreateerror'] = 'Kann Filtersatz nicht erstellen. Serverfehler';
+$messages['setcreated'] = 'Filtersatz wurde erfolgreich erstellt';
+$messages['emptyname'] = 'Kann Filtersatz nicht erstellen. Kein Name vergeben';
+$messages['nametoolong'] = 'Kann Filtersatz nicht erstellen. Name zu lang'
 
 ?>
index c671b83ef1ca8d4849fbc8eca8074df5c1ea6573..c62979cc508c878c75f69f133c6f7136743dea5e 100644 (file)
@@ -42,7 +42,7 @@ $messages['filterunknownerror'] = 'Unknown server error';
 $messages['filterconnerror'] = 'Unable to connect to managesieve server';
 $messages['filterdeleteerror'] = 'Unable to delete filter. Server error occured';
 $messages['filterdeleted'] = 'Filter deleted successfully';
-$messages['filterconfirmdelete'] = 'Do you really want to delete selected filter?';
+$messages['filterdeleteconfirm'] = 'Do you really want to delete selected filter?';
 $messages['filtersaved'] = 'Filter saved successfully';
 $messages['filtersaveerror'] = 'Unable to save filter. Server error occured.';
 $messages['ruledeleteconfirm'] = 'Are you sure, you want to delete selected rule?';
index c671b83ef1ca8d4849fbc8eca8074df5c1ea6573..1bfc88d8c2bd6deae031d161c1e488ea311e5e97 100644 (file)
@@ -23,6 +23,8 @@ $labels['addrule'] = 'Add rule';
 $labels['delrule'] = 'Delete rule';
 $labels['messagemoveto'] = 'Move message to';
 $labels['messageredirect'] = 'Redirect message to';
+$labels['messagecopyto'] = 'Copy message to';
+$labels['messagesendcopy'] = 'Send message copy to';
 $labels['messagereply'] = 'Reply with message';
 $labels['messagedelete'] = 'Delete message';
 $labels['messagediscard'] = 'Discard with message';
@@ -36,18 +38,55 @@ $labels['vacationaddresses'] = 'Additional list of recipient e-mails (comma sepa
 $labels['vacationdays'] = 'How often send messages (in days):';
 $labels['vacationreason'] = 'Message body (vacation reason):';
 $labels['rulestop'] = 'Stop evaluating rules';
+$labels['filterset'] = 'Filters set';
+$labels['filtersetadd'] = 'Add filters set';
+$labels['filtersetdel'] = 'Delete current filters set';
+$labels['filtersetact'] = 'Activate current filters set';
+$labels['filtersetdeact'] = 'Deactivate current filters set';
+$labels['filtersetget'] = 'Download filters set in text format';
+$labels['filterdef'] = 'Filter definition';
+$labels['filtersetname'] = 'Filters set name';
+$labels['newfilterset'] = 'New filters set';
+$labels['active'] = 'active';
+$labels['none'] = 'none';
+$labels['fromset'] = 'from set';
+$labels['fromfile'] = 'from file';
+$labels['filterdisabled'] = 'Filter disabled';
+$labels['countisgreaterthan'] = 'count is greater than';
+$labels['countisgreaterthanequal'] = 'count is greater than or equal to';
+$labels['countislessthan'] = 'count is less than';
+$labels['countislessthanequal'] = 'count is less than or equal to';
+$labels['countequals'] = 'count is equal to';
+$labels['countnotequals'] = 'count does not equal';
+$labels['valueisgreaterthan'] = 'value is greater than';
+$labels['valueisgreaterthanequal'] = 'value is greater than or equal to';
+$labels['valueislessthan'] = 'value is less than';
+$labels['valueislessthanequal'] = 'value is less than or equal to';
+$labels['valueequals'] = 'value is equal to';
+$labels['valuenotequals'] = 'value does not equal';
 
 $messages = array();
 $messages['filterunknownerror'] = 'Unknown server error';
 $messages['filterconnerror'] = 'Unable to connect to managesieve server';
 $messages['filterdeleteerror'] = 'Unable to delete filter. Server error occured';
 $messages['filterdeleted'] = 'Filter deleted successfully';
-$messages['filterconfirmdelete'] = 'Do you really want to delete selected filter?';
 $messages['filtersaved'] = 'Filter saved successfully';
-$messages['filtersaveerror'] = 'Unable to save filter. Server error occured.';
+$messages['filtersaveerror'] = 'Unable to save filter. Server error occured';
+$messages['filterdeleteconfirm'] = 'Do you really want to delete selected filter?';
 $messages['ruledeleteconfirm'] = 'Are you sure, you want to delete selected rule?';
 $messages['actiondeleteconfirm'] = 'Are you sure, you want to delete selected action?';
 $messages['forbiddenchars'] = 'Forbidden characters in field';
 $messages['cannotbeempty'] = 'Field cannot be empty';
+$messages['setactivateerror'] = 'Unable to activate selected filters set. Server error occured';
+$messages['setdeactivateerror'] = 'Unable to deactivate selected filters set. Server error occured';
+$messages['setdeleteerror'] = 'Unable to delete selected filters set. Server error occured';
+$messages['setactivated'] = 'Filters set activated successfully';
+$messages['setdeactivated'] = 'Filters set deactivated successfully';
+$messages['setdeleted'] = 'Filters set deleted successfully';
+$messages['setdeleteconfirm'] = 'Are you sure, you want to delete selected filters set?';
+$messages['setcreateerror'] = 'Unable to create filters set. Server error occured';
+$messages['setcreated'] = 'Filters set created successfully';
+$messages['emptyname'] = 'Unable to create filters set. Empty set name';
+$messages['nametoolong'] = 'Unable to create filters set. Name too long'
 
 ?>
diff --git a/plugins/managesieve/localization/es_AR.inc b/plugins/managesieve/localization/es_AR.inc
new file mode 100644 (file)
index 0000000..93fd1e9
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+
+$labels = array();
+$labels['filters'] = 'Filtros';
+$labels['managefilters'] = 'Administrar filtros de correo entrante';
+$labels['filtername'] = 'Nombre del filtro';
+$labels['newfilter'] = 'Nuevo filtro';
+$labels['filteradd'] = 'Agregar filtro';
+$labels['filterdel'] = 'Eliminar filtro';
+$labels['moveup'] = 'Mover arriba';
+$labels['movedown'] = 'Mover abajo';
+$labels['filterallof'] = 'coinidir con todas las reglas siguientes';
+$labels['filteranyof'] = 'coincidir con alguna de las reglas siguientes';
+$labels['filterany'] = 'todos los mensajes';
+$labels['filtercontains'] = 'contiene';
+$labels['filternotcontains'] = 'no contiene';
+$labels['filteris'] = 'es igual a';
+$labels['filterisnot'] = 'no es igual a';
+$labels['filterexists'] = 'existe';
+$labels['filternotexists'] = 'no existe';
+$labels['filterunder'] = 'bajo';
+$labels['filterover'] = 'sobre';
+$labels['addrule'] = 'Agregar regla';
+$labels['delrule'] = 'Eliminar regla';
+$labels['messagemoveto'] = 'Mover mensaje a';
+$labels['messageredirect'] = 'Redirigir mensaje a';
+$labels['messagecopyto'] = 'Copiar mensaje a';
+$labels['messagesendcopy'] = 'Enviar copia del mensaje a';
+$labels['messagereply'] = 'Responder con un mensaje';
+$labels['messagedelete'] = 'Eliminar mensaje';
+$labels['messagediscard'] = 'Descartar con un mensaje';
+$labels['messagesrules'] = 'Para el correo entrante:';
+$labels['messagesactions'] = '... ejecutar las siguientes acciones:';
+$labels['add'] = 'Agregar';
+$labels['del'] = 'Eliminar';
+$labels['sender'] = 'Remitente';
+$labels['recipient'] = 'Destinatario';
+$labels['vacationaddresses'] = 'Lista de direcciones de correo de destinatarios adicionales (separados por comas):';
+$labels['vacationdays'] = 'Cada cuanto enviar mensajes (en días):';
+$labels['vacationreason'] = 'Cuerpo del mensaje (razón de vacaciones):';
+$labels['rulestop'] = 'Parar de evaluar reglas';
+$labels['filterset'] = 'Conjunto de filtros';
+$labels['filtersetadd'] = 'Agregar conjunto de filtros';
+$labels['filtersetdel'] = 'Eliminar conjunto de filtros';
+$labels['filtersetact'] = 'Activar conjunto de filtros';
+$labels['filtersetdeact'] = 'Deactivar conjunto de filtros';
+$labels['filtersetget'] = 'Descargar conjunto de filtros en archivo de texto';
+$labels['filterdef'] = 'Definicion del conjunto de filtros';
+$labels['filtersetname'] = 'Nombre del conjunto de filtros';
+$labels['newfilterset'] = 'Nuevo conjunto de filtros';
+$labels['active'] = 'Activar';
+$labels['none'] = 'none';
+$labels['fromset'] = 'desde conjunto';
+$labels['fromfile'] = 'desde archivo';
+$labels['filterdisabled'] = 'Filtro deshabilitado';
+
+$messages = array();
+$messages['filterunknownerror'] = 'Error desconocido de servidor';
+$messages['filterconnerror'] = 'Imposible conectar con el servidor managesieve';
+$messages['filterdeleteerror'] = 'Imposible borrar filtro. Ha ocurrido un error en el servidor';
+$messages['filterdeleted'] = 'Filtro borrado satisfactoriamente';
+$messages['filterdeleteconfirm'] = '¿Realmente desea borrar el filtro seleccionado?';
+$messages['filtersaved'] = 'Filtro guardado satisfactoriamente';
+$messages['filtersaveerror'] = 'Imposible guardar ell filtro. Ha ocurrido un error en el servidor';
+$messages['ruledeleteconfirm'] = '¿Está seguro de que desea borrar la regla seleccionada?';
+$messages['actiondeleteconfirm'] = '¿Está seguro de que desea borrar la acción seleccionada?';
+$messages['forbiddenchars'] = 'Caracteres prohibidos en el campo';
+$messages['cannotbeempty'] = 'El campo no puede estar vacío';
+$messages['setactivateerror'] = 'Imposible activar el conjunto de filtros. Error en el servidor.';
+$messages['setdeactivateerror'] = 'Imposible desactivar el conjunto de filtros. Error en el servidor.';
+$messages['setdeleteerror'] = 'Imposible eliminar el conjunto de filtros. Error en el servidor.';
+$messages['setactivated'] = 'Conjunto de filtros activados correctamente';
+$messages['setdeactivated'] = 'Conjunto de filtros desactivados correctamente';
+$messages['setdeleted'] = 'Conjunto de filtros eliminados correctamente';
+$messages['setdeleteconfirm'] = '¿Esta seguro, que quiere eliminar el conjunto de filtros seleccionado?';
+$messages['setcreateerror'] = 'Imposible crear el conjunto de filtros. Error en el servidor.';
+$messages['setcreated'] = 'Conjunto de filtros creados correctamente';
+$messages['emptyname'] = 'Imposible crear el conjunto de filtros. Nombre del conjunto de filtros vacio';
+$messages['nametoolong'] = 'Imposible crear el conjunto de filtros. Nombre del conjunto de filtros muy largo';
+
+?>
index 9e7e3f592b515dd7575b5f4f7a3e594b47ab600c..6130d70188b0c355e076cf3abbffd96bbd0e7c4f 100644 (file)
@@ -24,6 +24,8 @@ $labels['addrule'] = 'Agregar regla';
 $labels['delrule'] = 'Eliminar regla';
 $labels['messagemoveto'] = 'Mover mensaje a';
 $labels['messageredirect'] = 'Redirigir mensaje a';
+$labels['messagecopyto'] = 'Copiar mensaje a';
+$labels['messagesendcopy'] = 'Enviar copia del mensaje a';
 $labels['messagereply'] = 'Responder con un mensaje';
 $labels['messagedelete'] = 'Eliminar mensaje';
 $labels['messagediscard'] = 'Descartar con un mensaje';
@@ -37,18 +39,43 @@ $labels['vacationaddresses'] = 'Lista de direcciones de correo de destinatarios
 $labels['vacationdays'] = 'Cada cuanto enviar mensajes (en días):';
 $labels['vacationreason'] = 'Cuerpo del mensaje (razón de vacaciones):';
 $labels['rulestop'] = 'Parar de evaluar reglas';
+$labels['filterset'] = 'Conjunto de filtros';
+$labels['filtersetadd'] = 'Agregar conjunto de filtros';
+$labels['filtersetdel'] = 'Eliminar conjunto de filtros actual';
+$labels['filtersetact'] = 'Activar conjunto de filtros actual';
+$labels['filtersetdeact'] = 'Desactivar conjunto de filtros actual';
+$labels['filtersetget'] = 'Descargar conjunto de filtros en formato de texto';
+$labels['filterdef'] = 'Definición de filtros';
+$labels['filtersetname'] = 'Nombre del conjunto de filtros';
+$labels['newfilterset'] = 'Nuevo conjunto de filtros';
+$labels['active'] = 'activo';
+$labels['none'] = 'ninguno';
+$labels['fromset'] = 'de conjunto ';
+$labels['fromfile'] = 'de archivo';
+$labels['filterdisabled'] = 'Filtro desactivado';
 
 $messages = array();
 $messages['filterunknownerror'] = 'Error desconocido de servidor';
 $messages['filterconnerror'] = 'Imposible conectar con el servidor managesieve';
 $messages['filterdeleteerror'] = 'Imposible borrar filtro. Ha ocurrido un error en el servidor';
 $messages['filterdeleted'] = 'Filtro borrado satisfactoriamente';
-$messages['filterconfirmdelete'] = '¿Realmente desea borrar el filtro seleccionado?';
 $messages['filtersaved'] = 'Filtro guardado satisfactoriamente';
-$messages['filtersaveerror'] = 'Imposible guardar ell filtro. Ha ocurrido un error en el servidor';
+$messages['filtersaveerror'] = 'Imposible guardar el filtro. Ha ocurrido un error en el servidor';
+$messages['filterdeleteconfirm'] = '¿Realmente desea borrar el filtro seleccionado?';
 $messages['ruledeleteconfirm'] = '¿Está seguro de que desea borrar la regla seleccionada?';
 $messages['actiondeleteconfirm'] = '¿Está seguro de que desea borrar la acción seleccionada?';
 $messages['forbiddenchars'] = 'Caracteres prohibidos en el campo';
 $messages['cannotbeempty'] = 'El campo no puede estar vacío';
+$messages['setactivateerror'] = 'Imposible activar el conjunto de filtros seleccionado. Ha ocurrido un error en el servidor';
+$messages['setdeactivateerror'] = 'Imposible desactivar el conjunto de filtros seleccionado. Ha ocurrido un error en el servidor';
+$messages['setdeleteerror'] = 'Imposible borrar el conjunto de filtros seleccionado. Ha ocurrido un error en el servidor';
+$messages['setactivated'] = 'Conjunto de filtros activado satisfactoriamente';
+$messages['setdeactivated'] = 'Conjunto de filtros desactivado satisfactoriamente';
+$messages['setdeleted'] = 'Conjunto de filtros borrado satisfactoriamente';
+$messages['setdeleteconfirm'] = '¿Está seguro de que desea borrar el conjunto de filtros seleccionado?';
+$messages['setcreateerror'] = 'Imposible crear el conjunto de filtros. Ha ocurrido un error en el servidor';
+$messages['setcreated'] = 'Conjunto de filtros creado satisfactoriamente';
+$messages['emptyname'] = 'Imposible crear el conjunto de filtros. Sin nombre';
+$messages['nametoolong'] = 'Imposible crear el conjunto de filtros. Nombre demasiado largo'
 
 ?>
index 2915de8e1bea8bfa9480c7ed02109eea2907f501..7f891883bb9f294964e29989bd9875b58434352e 100644 (file)
@@ -42,7 +42,7 @@ $messages['filterunknownerror'] = 'Tundmatu serveri tõrge';
 $messages['filterconnerror'] = 'Managesieve serveriga ühendumine nurjus';
 $messages['filterdeleteerror'] = 'Filtri kustutamine nurjus. Ilmnes serveri tõrge.';
 $messages['filterdeleted'] = 'Filter edukalt kustutatud';
-$messages['filterconfirmdelete'] = 'Soovid valitud filtri kustutada?';
+$messages['filterdeleteconfirm'] = 'Soovid valitud filtri kustutada?';
 $messages['filtersaved'] = 'Filter edukalt salvestatud';
 $messages['filtersaveerror'] = 'Filtri salvestamine nurjus. Ilmnes serveri tõrge.';
 $messages['ruledeleteconfirm'] = 'Soovid valitud reegli kustutada?';
index f066ca6ea07939597f7de57499ccf6563f9e2166..70d3ccebbf5a5166f12c1a829a42dd17096d0e92 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+$labels = array();
 $labels['filters'] = 'Suodattimet';
 $labels['managefilters'] = 'Muokkaa saapuvan sähköpostin suodattimia';
 $labels['filtername'] = 'Suodattimen nimi';
@@ -32,13 +33,30 @@ $labels['add'] = 'Lisää';
 $labels['del'] = 'Poista';
 $labels['sender'] = 'Lähettäjä';
 $labels['recipient'] = 'Vastaanottaja';
+$labels['vacationaddresses'] = 'Lähetä viesti myös seuraaviin osotteisiin (erottele pilkulla):';
+$labels['vacationdays'] = 'Kuinka monen päivän välein lähetetään uusi vastaus:';
+$labels['vacationreason'] = 'Viesti:';
+$labels['rulestop'] = 'Viimeinen sääntö';
+$labels['filterset'] = 'Suodatinlista';
+$labels['filtersetadd'] = 'Lisää suodatinlista';
+$labels['filtersetdel'] = 'Poista valittu suodatinlista';
+$labels['filtersetact'] = 'Aktivoi valittu suodatinlista';
+$labels['filtersetget'] = 'Lataa valittu suodatinlista tekstimuodossa';
+$labels['filterdef'] = 'Suodatinmääritykset';
+$labels['filtersetname'] = 'Suodatinlistan nimi';
+$labels['newfilterset'] = 'Uusi suodatinlista';
+$labels['active'] = 'aktiivinen';
+$labels['none'] = 'ei mitään';
+$labels['fromset'] = 'listasta';
+$labels['fromfile'] = 'tiedostosta';
+$labels['filterdisabled'] = 'Suodatin on poistettu käytöstä';
 
 $messages = array();
 $messages['filterunknownerror'] = 'Tuntematon palvelin virhe';
 $messages['filterconnerror'] = 'Yhdistäminen palvelimeen epäonnistui';
 $messages['filterdeleteerror'] = 'Suodattimen poistaminen epäonnistui. Palvelin virhe';
 $messages['filterdeleted'] = 'Suodatin poistettu';
-$messages['filterconfirmdelete'] = 'Haluatko varmasti poistaa valitut suodattimet?';
+$messages['filterdeleteconfirm'] = 'Haluatko varmasti poistaa valitut suodattimet?';
 $messages['filtersaved'] = 'Suodatin tallennettu';
 $messages['filtersaveerror'] = 'Suodattimen tallennus epäonnistui. Palvelin virhe';
 $messages['ruledeleteconfirm'] = 'Haluatko poistaa valitut säännöt?';
@@ -46,4 +64,5 @@ $messages['actiondeleteconfirm'] = 'Haluatko poistaa valitut tapahtumat?';
 $messages['forbiddenchars'] = 'Sisältää kiellettyjä kirjaimia';
 $messages['cannotbeempty'] = 'Kenttä ei voi olla tyhjä';
 
+
 ?>
index 632db98ea590262c4d076167fdf2c9033263e3c0..0b494f04117cae3a8d3f3a716d626e94f835d16e 100644 (file)
@@ -26,6 +26,8 @@ $labels['messageredirect'] = 'Transférer le message à';
 $labels['messagereply'] = 'Répondre avec le message';
 $labels['messagedelete'] = 'Supprimer le message';
 $labels['messagediscard'] = 'Rejeter avec le message';
+$labels['messagecopyto'] = 'Copier le message vers';
+$labels['messagesendcopy'] = 'Envoyer une copie du message à';
 $labels['messagesrules'] = 'Pour les mails entrants:';
 $labels['messagesactions'] = '...exécuter les actions suivantes:';
 $labels['add'] = 'Ajouter';
@@ -42,7 +44,7 @@ $messages['filterunknownerror'] = 'Erreur du serveur inconnue';
 $messages['filterconnerror'] = 'Connexion au serveur Managesieve impossible';
 $messages['filterdeleteerror'] = 'Suppression du filtre impossible. Le serveur à produit une erreur';
 $messages['filterdeleted'] = 'Le filtre a bien été supprimé';
-$messages['filterconfirmdelete'] = 'Voulez-vous vraiment supprimer le filtre sélectionné?';
+$messages['filterdeleteconfirm'] = 'Voulez-vous vraiment supprimer le filtre sélectionné?';
 $messages['filtersaved'] = 'Le filtre a bien été enregistré';
 $messages['filtersaveerror'] = 'Enregistrement du filtre impossibe. Le serveur à produit une erreur';
 $messages['ruledeleteconfirm'] = 'Voulez-vous vraiment supprimer la règle sélectionnée?';
index 1647fbe23dce6387c7c0c684f85b56f4d91a31a7..47a84f1a6f0ae1d8e23887cc9539bde4e2e70f60 100644 (file)
@@ -43,7 +43,7 @@ $messages['filterunknownerror'] = 'Ismeretlen szerverhiba';
 $messages['filterconnerror'] = 'Nem tudok a szűrőszerverhez kapcsolódni';
 $messages['filterdeleteerror'] = 'A szűrőt nem lehet törölni, szerverhiba történt';
 $messages['filterdeleted'] = 'A szűrő törlése sikeres';
-$messages['filterconfirmdelete'] = 'Biztosan törli ezt a szűrőt?';
+$messages['filterdeleteconfirm'] = 'Biztosan törli ezt a szűrőt?';
 $messages['filtersaved'] = 'A szűrő mentése sikeres';
 $messages['filtersaveerror'] = 'A szűrő mentése sikertelen, szerverhiba történt';
 $messages['ruledeleteconfirm'] = 'Biztosan törli ezt a szabályt?';
index f7079b3dd3a068b302e633ba805ac0909032e1f7..2debf30336b8edb25a2676d127eb631224ea7b96 100644 (file)
@@ -37,18 +37,43 @@ $labels['vacationaddresses'] = 'Lista di indirizzi e-mail di destinatari addizio
 $labels['vacationdays'] = 'Ogni quanti giorni ribadire il messaggio allo stesso mittente';
 $labels['vacationreason'] = 'Corpo del messaggio (dettagli relativi all\'assenza):';
 $labels['rulestop'] = 'Non valutare le regole successive';
+$labels['filterset'] = 'Gruppi di filtri';
+$labels['filtersetadd'] = 'Aggiungi gruppo';
+$labels['filtersetdel'] = 'Cancella gruppo selezionato';
+$labels['filtersetact'] = 'Attiva gruppo selezionato';
+$labels['filtersetdeact'] = 'Disattiva gruppo selezionato';
+$labels['filtersetget'] = 'Scarica filtri come testo';
+$labels['filterdef'] = 'Definizione del filtro';
+$labels['filtersetname'] = 'Nome del Gruppo di filtri';
+$labels['newfilterset'] = 'Nuovo gruppo di filri';
+$labels['active'] = 'attivo';
+$labels['none'] = 'nessuno';
+$labels['fromset'] = 'dal set';
+$labels['fromfile'] = 'dal file';
+$labels['filterdisabled'] = 'Filtro disabilitato';
 
 $messages = array();
 $messages['filterunknownerror'] = 'Errore sconosciuto del server';
 $messages['filterconnerror'] = 'Collegamento al server managesieve fallito';
 $messages['filterdeleteerror'] = 'Eliminazione del filtro fallita. Si è verificato un errore nel server';
 $messages['filterdeleted'] = 'Filtro eliminato con successo';
-$messages['filterconfirmdelete'] = 'Vuoi veramente eliminare il filtro selezionato?';
+$messages['filterdeleteconfirm'] = 'Vuoi veramente eliminare il filtro selezionato?';
 $messages['filtersaved'] = 'Filtro salvato con successo';
 $messages['filtersaveerror'] = 'Salvataggio del filtro fallito. Si è verificato un errore nel server';
 $messages['ruledeleteconfirm'] = 'Sei sicuro di voler eliminare la regola selezionata?';
 $messages['actiondeleteconfirm'] = 'Sei sicuro di voler eliminare l\'azione selezionata?';
 $messages['forbiddenchars'] = 'Caratteri non consentiti nel campo';
 $messages['cannotbeempty'] = 'Il campo non può essere vuoto';
+$messages['setactivateerror'] = 'Impossibile attivare il filtro. Errore del server';
+$messages['setdeactivateerror'] = 'Impossibile disattivare il filtro. Errore del server';
+$messages['setdeleteerror'] = 'Impossibile cancellare il filtro. Errore del server';
+$messages['setactivated'] = 'Filtro attivato';
+$messages['setdeactivated'] = 'Filtro disattivato';
+$messages['setdeleted'] = 'Filtro cancellato';
+$messages['setdeleteconfirm'] = 'Sei sicuro di voler cancellare il gruppo di filtri';
+$messages['setcreateerror'] = 'Impossibile creare il gruppo. Errore del server';
+$messages['setcreated'] = 'Gruppo di filtri creato';
+$messages['emptyname'] = 'Impossibile creare il gruppo: Inserire un nome';
+$messages['nametoolong'] = 'Impossibile creare il gruppo: Nome troppo lungo';
 
 ?>
diff --git a/plugins/managesieve/localization/ja_JP.inc b/plugins/managesieve/localization/ja_JP.inc
new file mode 100644 (file)
index 0000000..a489054
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+//  EN-Revision: 3891
+
+$labels['filters'] = 'フィルター';
+$labels['managefilters'] = '受信メールのフィルターの管理';
+$labels['filtername'] = 'フィルターの名前';
+$labels['newfilter'] = '新規フィルター';
+$labels['filteradd'] = 'フィルターの追加';
+$labels['filterdel'] = 'フィルターの削除';
+$labels['moveup'] = '上に移動';
+$labels['movedown'] = '下に移動';
+$labels['filterallof'] = '次のルールすべてに一致';
+$labels['filteranyof'] = '次のルールのどれかに一致';
+$labels['filterany'] = '全メッセージ';
+$labels['filtercontains'] = '含む';
+$labels['filternotcontains'] = '含まない';
+$labels['filteris'] = '次と一致する';
+$labels['filterisnot'] = '次と一致しない';
+$labels['filterexists'] = '存在する';
+$labels['filternotexists'] = '存在しない';
+$labels['filterunder'] = 'より上';
+$labels['filterover'] = 'より下';
+$labels['addrule'] = 'ルールの追加';
+$labels['delrule'] = 'ルールの削除';
+$labels['messagemoveto'] = '次にメッセージを移動する';
+$labels['messageredirect'] = '次のメールアドレスに転送 (リダイレクト)';
+$labels['messagecopyto'] = '次にメッセージをコピーする';
+$labels['messagesendcopy'] = '次にメッセージのコピーを送信する';
+$labels['messagereply'] = 'メッセージに返信する';
+$labels['messagedelete'] = 'メッセージを削除する';
+$labels['messagediscard'] = 'メッセージを破棄する';
+$labels['messagesrules'] = '受信メールへの処理:';
+$labels['messagesactions'] = '…次の操作の実行:';
+$labels['add'] = '追加';
+$labels['del'] = '削除';
+$labels['sender'] = '送信者';
+$labels['recipient'] = '受信者';
+$labels['vacationaddresses'] = '電子メール受信者の一覧を追加する (カンマ区切り):';
+$labels['vacationdays'] = 'どれ位頻繁にメッセージの送信をするか (1 日あたり):';
+$labels['vacationreason'] = 'メッセージ本文 (vacation reason):';
+$labels['rulestop'] = 'ルール評価の停止';
+$labels['filterset'] = 'フィルター セット';
+$labels['filtersetadd'] = 'フィルター セットの追加';
+$labels['filtersetdel'] = '現在のルールセット の削除';
+$labels['filtersetact'] = '現在のフィルター セットを有効にする';
+$labels['filtersetdeact'] = '現在のフィルター セットを無効にする';
+$labels['filtersetget'] = 'テキスト形式でフィルター セットをダウンロードする';
+$labels['filterdef'] = 'フィルターの定義';
+$labels['filtersetname'] = 'フィルター セットの名前';
+$labels['newfilterset'] = '新規フィルター セット';
+$labels['active'] = '有効';
+$labels['none'] = 'なし';
+$labels['fromset'] = 'セットから';
+$labels['fromfile'] = 'ファイルから';
+$labels['filterdisabled'] = 'フィルターを無効にしました。';
+
+$messages = array();
+$messages['filterunknownerror'] = '不明なサーバーのエラーです';
+$messages['filterconnerror'] = 'managesieve サーバーに接続できません。';
+$messages['filterdeleteerror'] = 'フィルターを削除できませんでした。サーバーでエラーが発生しました。';
+$messages['filterdeleted'] = 'フィルターの削除に成功しました。';
+$messages['filtersaved'] = 'フィルターの保存に成功しました。';
+$messages['filtersaveerror'] = 'フィルターの保存に失敗しました。サーバーでエラーが発生しました。';
+$messages['filterdeleteconfirm'] = '本当に選択したフィルターを削除しますか?';
+$messages['ruledeleteconfirm'] = '本当に選択したルールを削除しますか?';
+$messages['actiondeleteconfirm'] = '本当に選択した操作を削除しますか?';
+$messages['forbiddenchars'] = '項目に禁止文字があります。';
+$messages['cannotbeempty'] = '空にできませんでした';
+$messages['setactivateerror'] = '選択したフィルター セットの有効化に失敗しました。サーバーでエラーが発生しました。';
+$messages['setdeactivateerror'] = '選択したフィルター セットの無効化に失敗しました。サーバーでエラーが発生しました。';
+$messages['setdeleteerror'] = '選択したフィルター セットの削除に失敗しました。サーバーでエラーが発生しました。';
+$messages['setactivated'] = 'フィルターセットの有効化に成功しました。';
+$messages['setdeactivated'] = 'フィルターセットの無効化に成功しました。';
+$messages['setdeleted'] = 'フィルターセットの削除に成功しました。';
+$messages['setdeleteconfirm'] = '本当に選択したフィルター セットを削除しますか?';
+$messages['setcreateerror'] = 'フィルター セットの作成に失敗しました。サーバーでエラーが発生しました。';
+$messages['setcreated'] = 'フィルター セットの作成に成功しました。';
+$messages['emptyname'] = 'フィルター セットの作成に失敗しました。名前が空です。';
+$messages['nametoolong'] = 'フィルター セットの作成に失敗しました。名前が長すぎます。';
+
+?>
diff --git a/plugins/managesieve/localization/nb_NO.inc b/plugins/managesieve/localization/nb_NO.inc
new file mode 100644 (file)
index 0000000..a0ed1f3
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+
+$labels = array();
+$labels['filters'] = 'Filtre';
+$labels['managefilters'] = 'Rediger filter for innkommende e-post';
+$labels['filtername'] = 'Filternavn';
+$labels['newfilter'] = 'Nytt filter';
+$labels['filteradd'] = 'Legg til filter';
+$labels['filterdel'] = 'Slett filter';
+$labels['moveup'] = 'Flytt opp';
+$labels['movedown'] = 'Flytt ned';
+$labels['filterallof'] = 'som treffer alle følgende regler';
+$labels['filteranyof'] = 'som treffer en av følgende regler';
+$labels['filterany'] = 'og alle meldinger';
+$labels['filtercontains'] = 'inneholder';
+$labels['filternotcontains'] = 'ikke innehold';
+$labels['filteris'] = 'er';
+$labels['filterisnot'] = 'ikke er';
+$labels['filterexists'] = 'eksisterer';
+$labels['filternotexists'] = 'ikke eksisterer';
+$labels['filterunder'] = 'under';
+$labels['filterover'] = 'over';
+$labels['addrule'] = 'Legg til regel';
+$labels['delrule'] = 'Slett regel';
+$labels['messagemoveto'] = 'Flytt meldingen til';
+$labels['messageredirect'] = 'Videresend meldingen til';
+$labels['messagereply'] = 'Svar med melding';
+$labels['messagedelete'] = 'Slett melding';
+$labels['messagediscard'] = 'Avvis med melding';
+$labels['messagesrules'] = 'For innkommende e-post';
+$labels['messagesactions'] = '...gjør følgende';
+$labels['add'] = 'Legg til';
+$labels['del'] = 'Slett';
+$labels['sender'] = 'Avsender';
+$labels['recipient'] = 'Mottaker';
+$labels['vacationaddresses'] = 'Liste med mottakeradresser (adskilt med komma):';
+$labels['vacationdays'] = 'Periode mellom meldinger (i dager):';
+$labels['vacationreason'] = 'Innhold (begrunnelse for fravær)';
+$labels['rulestop'] = 'Stopp evaluering av regler';
+
+$messages = array();
+$messages['filterunknownerror'] = 'Ukjent problem med tjener';
+$messages['filterconnerror'] = 'Kunne ikke koble til MANAGESIEVE-tjener';
+$messages['filterdeleteerror'] = 'Kunne ikke slette filter. Det dukket opp en feil på tjeneren.';
+$messages['filterdeleted'] = 'Filteret er blitt slettet';
+$messages['filterconfirmdelete'] = 'Er du sikker på at du vil slette følgende filter?';
+$messages['filtersaved'] = 'Filter er blitt lagret';
+$messages['filtersaveerror'] = 'Kunne ikke lagre filteret. Det dukket opp en feil på tjeneren.';
+$messages['ruledeleteconfirm'] = 'Er du sikker på at du vil slette valgte regel?';
+$messages['actiondeleteconfirm'] = 'Er du sikker på at du vil slette valgte hendelse?';
+$messages['forbiddenchars'] = 'Ugyldige tegn i felt';
+$messages['cannotbeempty'] = 'Feltet kan ikke stå tomt';
+
+?>
index 83a4e695f33ab21e91e7b883781a71955b30f9fb..8ee31721601c0c214bf17af968cccbf82177d0e9 100644 (file)
@@ -38,7 +38,7 @@ $messages['filterunknownerror'] = 'Onbekende fout';
 $messages['filterconnerror'] = 'Kan geen verbinding maken met de managesieve server';
 $messages['filterdeleteerror'] = 'Kan filter niet verwijderen. Er is een fout opgetreden';
 $messages['filterdeleted'] = 'Filter succesvol verwijderd';
-$messages['filterconfirmdelete'] = 'Weet je zeker dat je het geselecteerde filter wilt verwijderen?';
+$messages['filterdeleteconfirm'] = 'Weet je zeker dat je het geselecteerde filter wilt verwijderen?';
 $messages['filtersaved'] = 'Filter succesvol opgeslagen';
 $messages['filtersaveerror'] = 'Kan filter niet opslaan. Er is een fout opgetreden.';
 $messages['ruledeleteconfirm'] = 'Weet je zeker dat je de geselecteerde regel wilt verwijderen?';
index f309a4364f15a7251b81472fbcfc323cb82a67f6..e530619a45f8b5aa80904c34074e3ab5b9f484dd 100644 (file)
@@ -25,6 +25,8 @@ $labels['delrule'] = 'Usuń regułę';
 $labels['messagemoveto'] = 'Przenieś wiadomość do';
 $labels['messageredirect'] = 'Przekaż wiadomość na konto';
 $labels['messagereply'] = 'Odpowiedz wiadomością o treści';
+$labels['messagecopyto'] = 'Skopiuj wiadomość do';
+$labels['messagesendcopy'] = 'Wyślij kopię do';
 $labels['messagedelete'] = 'Usuń wiadomość';
 $labels['messagediscard'] = 'Odrzuć z komunikatem';
 $labels['messagesrules'] = 'W stosunku do przychodzących wiadomości:';
@@ -37,18 +39,55 @@ $labels['rulestop'] = 'Przerwij przetwarzanie reguł';
 $labels['vacationdays'] = 'Częstotliwość wysyłania wiadomości (w dniach):';
 $labels['vacationaddresses'] = 'Lista dodatkowych adresów odbiorców (oddzielonych przecinkami):';
 $labels['vacationreason'] = 'Treść (przyczyna nieobecności):';
+$labels['filterset'] = 'Zbiór filtrów';
+$labels['filtersetadd'] = 'Dodaj zbiór filtrów';
+$labels['filtersetdel'] = 'Usuń bierzący zbiór filtrów';
+$labels['filtersetact'] = 'Aktywuj bierzący zbiór filtrów';
+$labels['filtersetdeact'] = 'Deaktywuj bierzący zbiór filtrów';
+$labels['filtersetget'] = 'Pobierz bierzący zbiór filtrów w formacie tekstowym';
+$labels['filterdef'] = 'Definicja filtra';
+$labels['filtersetname'] = 'Nazwa zbioru';
+$labels['newfilterset'] = 'Nowy zbiór filtrów';
+$labels['active'] = 'aktywny';
+$labels['none'] = 'brak';
+$labels['fromset'] = 'ze zbioru';
+$labels['fromfile'] = 'z pliku';
+$labels['filterdisabled'] = 'Filtr wyłączony';
+$labels['countisgreaterthan'] = 'ilość jest większa od';
+$labels['countisgreaterthanequal'] = 'ilość jest równa lub większa od';
+$labels['countislessthan'] = 'ilość jest mniejsza od';
+$labels['countislessthanequal'] = 'ilość jest równa lub mniejsza od';
+$labels['countequals'] = 'ilość jest równa';
+$labels['countnotequals'] = 'ilość jest różna od';
+$labels['valueisgreaterthan'] = 'wartość jest większa od';
+$labels['valueisgreaterthanequal'] = 'wartość jest równa lub większa od';
+$labels['valueislessthan'] = 'wartość jest mniejsza od';
+$labels['valueislessthanequal'] = 'wartość jest równa lub mniejsza od';
+$labels['valueequals'] = 'wartość jest równa';
+$labels['valuenotequals'] = 'wartość jest różna od';
 
 $messages = array();
 $messages['filterunknownerror'] = 'Nieznany błąd serwera';
 $messages['filterconnerror'] = 'Nie można nawiązać połączenia z serwerem managesieve';
 $messages['filterdeleteerror'] = 'Nie można usunąć filtra. Wystąpił błąd serwera';
 $messages['filterdeleted'] = 'Filtr został usunięty pomyślnie';
-$messages['filterconfirmdelete'] = 'Czy na pewno chcesz usunąć wybrany filtr?';
+$messages['filterdeleteconfirm'] = 'Czy na pewno chcesz usunąć wybrany filtr?';
 $messages['filtersaved'] = 'Filtr został zapisany pomyślnie';
 $messages['filtersaveerror'] = 'Nie można zapisać filtra. Wystąpił błąd serwera.';
 $messages['ruledeleteconfirm'] = 'Czy na pewno chcesz usunąć wybraną regułę?';
 $messages['actiondeleteconfirm'] = 'Czy na pewno usunąć wybraną akcję?';
 $messages['forbiddenchars'] = 'Pole zawiera niedozwolone znaki';
 $messages['cannotbeempty'] = 'Pole nie może być puste';
+$messages['setactivateerror'] = 'Nie można aktywować wybranego zbioru filtrów. Błąd serwera';
+$messages['setdeactivateerror'] = 'Nie można deaktywować wybranego zbioru filtrów. Błąd serwera';
+$messages['setdeleteerror'] = 'Nie można usunąć wybranego zbioru filtrów. Błąd serwera';
+$messages['setactivated'] = 'Zbiór filtrów został aktywowany pomyślnie';
+$messages['setdeactivated'] = 'Zbiór filtrów został deaktywowany pomyślnie';
+$messages['setdeleted'] = 'Zbiór filtrów został usunięty pomyślnie';
+$messages['setdeleteconfirm'] = 'Czy na pewno chcesz usunąć wybrany zbiór filtrów?';
+$messages['setcreateerror'] = 'Nie można utworzyć zbioru filtrów. Błąd serwera';
+$messages['setcreated'] = 'Zbiór filtrów został utworzony pomyślnie';
+$messages['emptyname'] = 'Nie można utworzyć zbioru filtrów. Pusta nazwa zbioru';
+$messages['nametoolong'] = 'Nie można utworzyć zbioru filtrów. Nazwa zbyt długa'
 
 ?>
index 4515deb5044219f387c9ae9d2b81ec67522560ba..b48774e97ee62f82f05e5afa8d31eb40e07e4dc4 100644 (file)
@@ -42,7 +42,7 @@ $messages['filterunknownerror'] = 'Erro desconhecido de servidor';
 $messages['filterconnerror'] = 'Não foi possível conectar ao servidor managesieve';
 $messages['filterdeleteerror'] = 'Não foi possível excluir filtro. Occorreu um erro de servidor';
 $messages['filterdeleted'] = 'Filtro excluído com sucesso';
-$messages['filterconfirmdelete'] = 'Deseja realmente excluir o filtro selecionado?';
+$messages['filterdeleteconfirm'] = 'Deseja realmente excluir o filtro selecionado?';
 $messages['filtersaved'] = 'Filtro gravado com sucesso';
 $messages['filtersaveerror'] = 'Não foi possível gravar filtro. Occoreu um erro de servidor.';
 $messages['ruledeleteconfirm'] = 'Deseja realmente excluir a regra selecionada?';
diff --git a/plugins/managesieve/localization/pt_PT.inc b/plugins/managesieve/localization/pt_PT.inc
new file mode 100644 (file)
index 0000000..d35a963
--- /dev/null
@@ -0,0 +1,80 @@
+<?php
+
+$labels['filters'] = 'Filtros';
+$labels['managefilters'] = 'Gerir filtros de recepção de mails';
+$labels['filtername'] = 'Nome do filtro';
+$labels['newfilter'] = 'Novo filtro';
+$labels['filteradd'] = 'Adicionar filtro';
+$labels['filterdel'] = 'Eliminar filtro';
+$labels['moveup'] = 'Mover para cima';
+$labels['movedown'] = 'Mover para baixo';
+$labels['filterallof'] = 'corresponder a todas as seguintes regras';
+$labels['filteranyof'] = 'corresponder a qualquer das seguintes regras';
+$labels['filterany'] = 'todas as mensagens';
+$labels['filtercontains'] = 'contém';
+$labels['filternotcontains'] = 'não contém';
+$labels['filteris'] = 'é igual a';
+$labels['filterisnot'] = 'não é igual a';
+$labels['filterexists'] = 'existe';
+$labels['filternotexists'] = 'não existe';
+$labels['filterunder'] = 'inferior a';
+$labels['filterover'] = 'superior a';
+$labels['addrule'] = 'Adicionar regra';
+$labels['delrule'] = 'Eliminar regra';
+$labels['messagemoveto'] = 'Mover mensagem para';
+$labels['messageredirect'] = 'Redireccionar mensagem para';
+$labels['messagecopyto'] = 'Copiar mensagem para';
+$labels['messagesendcopy'] = 'Enviar cópia da mensagem para';
+$labels['messagereply'] = 'Responder com mensagem';
+$labels['messagedelete'] = 'Eliminar mensagem';
+$labels['messagediscard'] = 'Descartar com mensagem';
+$labels['messagesrules'] = 'Para mensagens recebidas:';
+$labels['messagesactions'] = '...executar as seguintes ações:';
+$labels['add'] = 'Adicionar';
+$labels['del'] = 'Eliminar';
+$labels['sender'] = 'Remetente';
+$labels['recipient'] = 'Destinatário';
+$labels['vacationaddresses'] = 'Lista complementar de destinatário de e-mails (separado por vírgula):';
+$labels['vacationdays'] = 'Enviar mensagens com que frequência (em dias):';
+$labels['vacationreason'] = 'Corpo da mensagem (motivo de férias):';
+$labels['rulestop'] = 'Parar execução de regras';
+$labels['filterset'] = 'Conjunto de filtros';
+$labels['filtersetadd'] = 'Adicionar conjunto de filtros';
+$labels['filtersetdel'] = 'Eliminar conjunto de filtros actual';
+$labels['filtersetact'] = 'Activar conjunto de filtros actual';
+$labels['filtersetdeact'] = 'Desactivar conjunto de filtros actual';
+$labels['filtersetget'] = 'Importar conjunto de filtros no formato de texto';
+$labels['filterdef'] = 'Definições para filtros';
+$labels['filtersetname'] = 'Nome conjunto de filtros';
+$labels['newfilterset'] = 'Novo conjunto de filtros';
+$labels['active'] = 'activo';
+$labels['none'] = 'nenhum';
+$labels['fromset'] = 'do conjunto';
+$labels['fromfile'] = 'do ficheiro';
+$labels['filterdisabled'] = 'Filtro inactivo';
+
+$messages = array();
+$messages['filterunknownerror'] = 'Ocorreu um erro desconhecido no servidor.';
+$messages['filterconnerror'] = 'Não foi possível ligar ao servidor ManageSieve.';
+$messages['filterdeleteerror'] = 'Não foi possível eliminar o filtro. Ocorreu um erro no servidor.';
+$messages['filterdeleted'] = 'Filtro eliminado com sucesso.';
+$messages['filterdeleteconfirm'] = 'Deseja realmente eliminar o filtro seleccionado?';
+$messages['filtersaved'] = 'Filtro guardado com sucesso.';
+$messages['filtersaveerror'] = 'Não foi possível guardar o filtro. Occoreu um erro no servidor.';
+$messages['ruledeleteconfirm'] = 'Deseja realmente eliminar a regra seleccionada?';
+$messages['actiondeleteconfirm'] = 'Deseja realmente eliminar a acção seleccionada?';
+$messages['forbiddenchars'] = 'Caracteres não permitidos no campo';
+$messages['cannotbeempty'] = 'Campo não pode ficar em branco';
+$messages['setactivateerror'] = 'Não foi possível activar os filtros seleccionados. Occoreu um erro no servidor.';
+$messages['setdeactivateerror'] = 'Não foi possível desactivar os filtros seleccionados. Occoreu um erro no servidor.';
+$messages['setdeleteerror'] = 'Não foi possível eliminar os filtros seleccionados. Occoreu um erro no servidor.';
+$messages['setactivated'] = 'Filtros activados com sucesso.';
+$messages['setdeactivated'] = 'Filtros desactivados com sucesso.';
+$messages['setdeleted'] = 'Filtros eliminados com sucesso.';
+$messages['setdeleteconfirm'] = 'Tem a certeza que quer eliminar os filtros seleccionados?';
+$messages['setcreateerror'] = 'Não foi possível criar o filtro. Ocorreu um erro no servidor.';
+$messages['setcreated'] = 'Filtros criados com sucesso';
+$messages['emptyname'] = 'Não foi possível criar o filtro. Tem de indicar um nome para o filtro.';
+$messages['nametoolong'] = 'Não foi possível criar o filtro. O nome do filtro é demasiado grande.';
+
+?>
\ No newline at end of file
index b4029438d8207899488ba4cfe9e86d34d2985017..c7c8bb07442e9d8780b95171c7d062cb1bb9580a 100644 (file)
@@ -1,4 +1,21 @@
 <?php
+/*
+
++-----------------------------------------------------------------------+
+| plugins/managesieve/localization/ru_RU.inc                            |
+|                                                                       |
+| Russian translation for roundcube/managesieve plugin                  |
+| Copyright (C) 2008-2010                                               |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author:                                                               |
+| Updates: Sergey Dukachev <iam@dukess.ru>                              |
++-----------------------------------------------------------------------+
+
+@version 2010-10-11
+
+*/
 
 $labels['filters'] = 'Фильтры';
 $labels['managefilters'] = 'Управление фильтрами для входящей почты';
@@ -13,8 +30,8 @@ $labels['filteranyof'] = 'соответствует любому из указ
 $labels['filterany'] = 'все сообщения';
 $labels['filtercontains'] = 'содержит';
 $labels['filternotcontains'] = 'не содержит';
-$labels['filteris'] = 'соответсвует';
-$labels['filterisnot'] = 'не соответсвует';
+$labels['filteris'] = 'соответствует';
+$labels['filterisnot'] = 'не соответствует';
 $labels['filterexists'] = 'существует';
 $labels['filternotexists'] = 'не существует';
 $labels['filterunder'] = 'под';
@@ -22,7 +39,9 @@ $labels['filterover'] = 'на';
 $labels['addrule'] = 'Добавить правило';
 $labels['delrule'] = 'Удалить правило';
 $labels['messagemoveto'] = 'Переместить сообщение в';
-$labels['messageredirect'] = 'Перенаправить сообщение на ';
+$labels['messageredirect'] = 'Перенаправить сообщение на';
+$labels['messagecopyto'] = 'Скопировать сообщение в';
+$labels['messagesendcopy'] = 'Отправить копию сообщения на';
 $labels['messagereply'] = 'Ответить с сообщением';
 $labels['messagedelete'] = 'Удалить сообщение';
 $labels['messagediscard'] = 'Отбросить с сообщением';
@@ -32,22 +51,59 @@ $labels['add'] = 'Добавить';
 $labels['del'] = 'Удалить';
 $labels['sender'] = 'Отправитель';
 $labels['recipient'] = 'Получатель';
-$labels['vacationaddresses'] = 'Список дополнительных адресов почты (разделённый запятыми):';
-$labels['vacationdays'] = 'Как часто отправлять сообщение (раз в сколько дней):';
-$labels['vacationreason'] = 'Текст сообщения (причины отсутствия):';
-$labels['rulestop'] = 'Не обрабатывать последующие правила';
+$labels['vacationaddresses'] = 'Список дополнительных адресов получателя (разделённых запятыми):';
+$labels['vacationdays'] = 'Как часто отправлять сообщения (в днях):';
+$labels['vacationreason'] = 'Текст сообщения (причина отсутствия):';
+$labels['rulestop'] = 'Закончить выполнение';
+$labels['filterset'] = 'Набор фильтров';
+$labels['filtersetadd'] = 'Добавить набор фильтров';
+$labels['filtersetdel'] = 'Удалить текущий набор фильтров';
+$labels['filtersetact'] = 'Включить текущий набор фильтров';
+$labels['filtersetdeact'] = 'Отключить текущий набор фильтров';
+$labels['filtersetget'] = 'Скачать набор фильтров в виде текста';
+$labels['filterdef'] = 'Описание фильтра';
+$labels['filtersetname'] = 'Название набора фильтров';
+$labels['newfilterset'] = 'Новый набор фильтров';
+$labels['active'] = 'используется';
+$labels['none'] = 'пустой';
+$labels['fromset'] = 'из набора';
+$labels['fromfile'] = 'из файла';
+$labels['filterdisabled'] = 'Отключить фильтр';
+$labels['countisgreaterthan'] = 'количество больше, чем';
+$labels['countisgreaterthanequal'] = 'количество больше или равно';
+$labels['countislessthan'] = 'количество меньше, чем';
+$labels['countislessthanequal'] = 'количество меньше или равно';
+$labels['countequals'] = 'количество равно';
+$labels['countnotequals'] = 'количество не равно';
+$labels['valueisgreaterthan'] = 'значение больше, чем';
+$labels['valueisgreaterthanequal'] = 'значение больше или равно';
+$labels['valueislessthan'] = 'значение меньше, чем';
+$labels['valueislessthanequal'] = 'значение меньше или равно';
+$labels['valueequals'] = 'значение равно';
+$labels['valuenotequals'] = 'значение не равно';
 
 $messages = array();
 $messages['filterunknownerror'] = 'Неизвестная ошибка сервера';
 $messages['filterconnerror'] = 'Невозможно подсоединится к серверу фильтров';
 $messages['filterdeleteerror'] = 'Невозможно удалить фильтр. Ошибка сервера';
 $messages['filterdeleted'] = 'Фильтр успешно удалён';
-$messages['filterconfirmdelete'] = 'Вы действительно хотите удалить фильтр?';
+$messages['filterdeleteconfirm'] = 'Вы действительно хотите удалить фильтр?';
 $messages['filtersaved'] = 'Фильтр успешно сохранён';
 $messages['filtersaveerror'] = 'Невозможно сохранить фильтр. Ошибка сервера';
 $messages['ruledeleteconfirm'] = 'Вы уверенны, что хотите удалить это правило?';
 $messages['actiondeleteconfirm'] = 'Вы уверенны, что хотите удалить это действие?';
 $messages['forbiddenchars'] = 'Недопустимые символы в поле';
 $messages['cannotbeempty'] = 'Поле не может быть пустым';
+$messages['setactivateerror'] = 'Невозможно включить выбранный набор фильтров. Ошибка сервера';
+$messages['setdeactivateerror'] = 'Невозможно отключить выбранный набор фильтров. Ошибка сервера';
+$messages['setdeleteerror'] = 'Невозможно удалить выбранный набор фильтров. Ошибка сервера';
+$messages['setactivated'] = 'Набор фильтров успешно включён';
+$messages['setdeactivated'] = 'Набор фильтров успешно отключён';
+$messages['setdeleted'] = 'Набор фильтров успешно удалён';
+$messages['setdeleteconfirm'] = 'Вы уверены в том, что хотите удалить выбранный набор фильтров?';
+$messages['setcreateerror'] = 'Невозможно создать набор фильтров. Ошибка сервера';
+$messages['setcreated'] = 'Набор фильтров успешно создан';
+$messages['emptyname'] = 'Невозможно создать набор фильтров. Название не задано';
+$messages['nametoolong'] = 'Невозможно создать набор фильтров. Название слишком длинное'
 
 ?>
diff --git a/plugins/managesieve/localization/sk_SK.inc b/plugins/managesieve/localization/sk_SK.inc
new file mode 100644 (file)
index 0000000..89c6a2b
--- /dev/null
@@ -0,0 +1,85 @@
+<?php
+
+/*
+ * Slovak translation for roundcube/managesieve plugin
+ *
+ * @version 1.0
+ * (c) 27.06.2010 by Juraj LUTTER <juraj@lutter.sk>
+ */
+
+$labels['filters'] = 'Filtre';
+$labels['managefilters'] = 'Správa filtrov príchádzajúcej pošty';
+$labels['filtername'] = 'Názov filtra';
+$labels['newfilter'] = 'Nový filter';
+$labels['filteradd'] = 'Pridaj filter';
+$labels['filterdel'] = 'Zmaž filter';
+$labels['moveup'] = 'Presuň vyššie';
+$labels['movedown'] = 'Presuň nižšie';
+$labels['filterallof'] = 'vyhovujúcu VŠETKÝM nasledujúcim pravidlám';
+$labels['filteranyof'] = 'vyhovujúcu ĽUBOVOĽNÉMU z nasledujúcich pravidiel';
+$labels['filterany'] = 'všetky správy';
+$labels['filtercontains'] = 'obsahuje';
+$labels['filternotcontains'] = 'neobsahuje';
+$labels['filteris'] = 'je';
+$labels['filterisnot'] = 'nie je';
+$labels['filterexists'] = 'existuje';
+$labels['filternotexists'] = 'neexistuje';
+$labels['filterunder'] = 'pod';
+$labels['filterover'] = 'nad';
+$labels['addrule'] = 'Pridaj pravidlo';
+$labels['delrule'] = 'Zmaž pravidlo';
+$labels['messagemoveto'] = 'Presuň správu do';
+$labels['messageredirect'] = 'Presmeruj správu na';
+$labels['messagereply'] = 'Pošli automatickú odpoveď';
+$labels['messagedelete'] = 'Zmaž správu';
+$labels['messagediscard'] = 'Zmaž a pošli správu na';
+$labels['messagesrules'] = 'Pre prichádzajúcu poštu';
+$labels['messagesactions'] = 'vykonaj nasledovné akcie';
+$labels['add'] = 'Pridaj';
+$labels['del'] = 'Zmaž';
+$labels['sender'] = 'Odosielateľ';
+$labels['recipient'] = 'Adresát';
+$labels['vacationaddresses'] = 'Dodatoční príjemcovia správy (oddelení čiarkami):';
+$labels['vacationdays'] = 'Počet dní medzi odoslaním správy:';
+$labels['vacationreason'] = 'Dôvod neprítomnosti:';
+$labels['rulestop'] = 'Koniec pravidiel';
+$labels['filterset'] = 'Sada filtrov';
+$labels['filtersetadd'] = 'Pridaj sadu filtrov';
+$labels['filtersetdel'] = 'Zmaž túto sadu filtrov';
+$labels['filtersetact'] = 'Aktivuj túto sadu filtrov';
+$labels['filtersetdeact'] = 'Deaktivuj túto sadu filtrov';
+$labels['filtersetget'] = 'Stiahni definíciu filtrov v textovom súbore';
+$labels['filterdef'] = 'Definícia filtra';
+$labels['filtersetname'] = 'Názov sady filtrov';
+$labels['newfilterset'] = 'Nová sada filtrov';
+$labels['active'] = 'aktívna';
+$labels['none'] = 'žiadne';
+$labels['fromset'] = 'zo sady';
+$labels['fromfile'] = 'zo súboru';
+$labels['filterdisabled'] = 'Filter zakázaný';
+
+$messages = array();
+$messages['filterunknownerror'] = 'Neznáma chyba serveru';
+$messages['filterconnerror'] = 'Nepodarilo sa pripojiť k managesieve serveru';
+$messages['filterdeleteerror'] = 'Nepodarilo sa zmazať filter, server ohlásil chybu';
+$messages['filterdeleted'] = 'Filter bol zmazaný';
+$messages['filtersaved'] = 'Filter bol uložený';
+$messages['filtersaveerror'] = 'Nepodarilo sa uložiť filter, server ohlásil chybu';
+$messages['filterdeleteconfirm'] = 'Naozaj si prajete zmazať tento filter?';
+$messages['ruledeleteconfirm'] = 'Naozaj si prajete zamzať toto pravidlo?';
+$messages['actiondeleteconfirm'] = 'Naozaj si prajete zmazať túto akciu?';
+$messages['forbiddenchars'] = 'Pole obsahuje nepovolené znaky';
+$messages['cannotbeempty'] = 'Pole nemôže byť prázdne';
+$messages['setactivateerror'] = 'Nepodarilo sa aktivovať zvolenú sadu filtrov, server ohlásil chybu';
+$messages['setdeactivateerror'] = 'Nepodarilo sa deaktivovať zvolenú sadu filtrov, server ohlásil chybu';
+$messages['setdeleteerror'] = 'Nepodarilo sa zmazať zvolenú sadu filtrov, server ohlásil chybu';
+$messages['setactivated'] = 'Sada filtrov bola aktivovaná';
+$messages['setdeactivated'] = 'Sada filtrov bola deaktivovaná';
+$messages['setdeleted'] = 'Sada filtrov bola zmazaná';
+$messages['setdeleteconfirm'] = 'Naozaj si prajete zmazať túto sadu filtrov?';
+$messages['setcreateerror'] = 'Nepodarilo sa vytvoriť sadu filtrov, server ohlásil chybu';
+$messages['setcreated'] = 'Sada filtrov bola vytvorená';
+$messages['emptyname'] = 'Názov sady filtrov nemôže byť prázdny';
+$messages['nametoolong'] = 'Názov sady filtrov je príliš dlhý'
+
+?>
index ee3c6fee2c1f5fbce1b29803e56f7e5b685c4057..ab9ccad6673c3666c0eb654fcb06e1fb93c48895 100644 (file)
@@ -42,7 +42,7 @@ $messages['filterunknownerror'] = 'Prišlo je do neznane napake.';
 $messages['filterconnerror'] = 'Povezave s strežnikom (managesieve) ni bilo mogoče vzpostaviti';
 $messages['filterdeleteerror'] = 'Pravila ni bilo mogoče izbrisati. Prišlo je do napake.';
 $messages['filterdeleted'] = 'Pravilo je bilo uspešno izbrisano.';
-$messages['filterconfirmdelete'] = 'Ste prepričani, da želite izbrisati izbrano pravilo?';
+$messages['filterdeleteconfirm'] = 'Ste prepričani, da želite izbrisati izbrano pravilo?';
 $messages['filtersaved'] = 'Pravilo je bilo uspešno shranjeno';
 $messages['filtersaveerror'] = 'Pravilo ni bilo shranjeno. Prišlo je do napake.';
 $messages['ruledeleteconfirm'] = 'Ste prepričani, da želite izbrisati izbrano pravilo?';
index 48d01586144e6a70ab4765eb2540d55f8995e865..883525b7127d245a06a4d5ac903ee0864487053e 100644 (file)
@@ -24,6 +24,8 @@ $labels['addrule'] = 'Lägg till regel';
 $labels['delrule'] = 'Ta bort regel';
 $labels['messagemoveto'] = 'Flytta meddelande till';
 $labels['messageredirect'] = 'Ändra mottagare till';
+$labels['messagecopyto'] = 'Kopiera meddelande till';
+$labels['messagesendcopy'] = 'Skicka kopia av meddelande till';
 $labels['messagereply'] = 'Besvara meddelande';
 $labels['messagedelete'] = 'Ta bort meddelande';
 $labels['messagediscard'] = 'Avböj med felmeddelande';
@@ -34,21 +36,58 @@ $labels['del'] = 'Ta bort';
 $labels['sender'] = 'Avsändare';
 $labels['recipient'] = 'Mottagare';
 $labels['vacationaddresses'] = 'Ytterligare mottagaradresser (avdelade med kommatecken)';
-$labels['vacationdays'] = 'Antal dagar mellan auto-svar';
-$labels['vacationreason'] = 'Meddelande i auto-svar';
+$labels['vacationdays'] = 'Antal dagar mellan auto-svar:';
+$labels['vacationreason'] = 'Meddelande i auto-svar:';
 $labels['rulestop'] = 'Avsluta filtrering';
+$labels['filterset'] = 'Filtergrupp';
+$labels['filtersetadd'] = 'Lägg till filtergrupp';
+$labels['filtersetdel'] = 'Ta bort filtergrupp';
+$labels['filtersetact'] = 'Aktivera filtergrupp';
+$labels['filtersetdeact'] = 'Deaktivera filtergrupp';
+$labels['filtersetget'] = 'Exportera filtergrupp i textformat';
+$labels['filterdef'] = 'Filterdefinition';
+$labels['filtersetname'] = 'Filtergruppsnamn';
+$labels['newfilterset'] = 'Ny filtergrupp';
+$labels['active'] = 'aktiv';
+$labels['none'] = 'ingen';
+$labels['fromset'] = 'från grupp';
+$labels['fromfile'] = 'från fil';
+$labels['filterdisabled'] = 'Filter deaktiverat';
+$labels['countisgreaterthan'] = 'antal är större än';
+$labels['countisgreaterthanequal'] = 'antal är större än eller lika med';
+$labels['countislessthan'] = 'antal är mindre än';
+$labels['countislessthanequal'] = 'antal är mindre än eller lika med';
+$labels['countequals'] = 'antal är lika med';
+$labels['countnotequals'] = 'antal är inte lika med';
+$labels['valueisgreaterthan'] = 'värde är större än';
+$labels['valueisgreaterthanequal'] = 'värde är större än eller lika med';
+$labels['valueislessthan'] = 'värde är mindre än';
+$labels['valueislessthanequal'] = 'värde är mindre än eller lika med';
+$labels['valueequals'] = 'värde är lika med';
+$labels['valuenotequals'] = 'värde är inte lika med';
 
 $messages = array();
 $messages['filterunknownerror'] = 'Okänt serverfel';
 $messages['filterconnerror'] = 'Anslutning till serverns filtertjänst misslyckades';
 $messages['filterdeleteerror'] = 'Filtret kunde inte tas bort på grund av serverfel';
 $messages['filterdeleted'] = 'Filtret är borttaget';
-$messages['filterconfirmdelete'] = 'Vill du ta bort det markerade filtret?';
 $messages['filtersaved'] = 'Filtret har sparats';
 $messages['filtersaveerror'] = 'Filtret kunde inte sparas på grund av serverfel';
+$messages['filterdeleteconfirm'] = 'Vill du ta bort det markerade filtret?';
 $messages['ruledeleteconfirm'] = 'Vill du ta bort filterregeln?';
 $messages['actiondeleteconfirm'] = 'Vill du ta bort filteråtgärden?';
 $messages['forbiddenchars'] = 'Otillåtet tecken i fältet';
 $messages['cannotbeempty'] = 'Fältet kan inte lämnas tomt';
+$messages['setactivateerror'] = 'Filtergruppen kunde inte aktiveras på grund av serverfel';
+$messages['setdeactivateerror'] = 'Filtergruppen kunde inte deaktiveras på grund av serverfel';
+$messages['setdeleteerror'] = 'Filtergruppen kunde inte tas bort på grund av serverfel';
+$messages['setactivated'] = 'Filtergruppen är aktiverad';
+$messages['setdeactivated'] = 'Filtergruppen är deaktiverad';
+$messages['setdeleted'] = 'Filtergruppen är borttagen';
+$messages['setdeleteconfirm'] = 'Vill du ta bort filtergruppen?';
+$messages['setcreateerror'] = 'Filtergruppen kunde inte läggas till på grund av serverfel';
+$messages['setcreated'] = 'Filtergruppen har lagts till';
+$messages['emptyname'] = 'Filtergruppen kan inte läggas till utan namn';
+$messages['nametoolong'] = 'Filtergruppen kan inte läggas till med för långt namn';
 
 ?>
index 2cc4436b28e8f52ccf56fbc2e9ce0dd3ff6ce39c..9a62af9759f942cf57339a8540d9ae2822a0f2c9 100644 (file)
@@ -9,8 +9,8 @@ $labels['filteradd'] = 'Додати фільтр';
 $labels['filterdel'] = 'Видалити фільтр';
 $labels['moveup'] = 'Пересунути вгору';
 $labels['movedown'] = 'Пересунути вниз';
-$labels['filterallof'] = 'задовольняє усім наступним';
-$labels['filteranyof'] = 'задовольняє будь-якому з наступного';
+$labels['filterallof'] = 'задовольняє усім наступним умовам';
+$labels['filteranyof'] = 'задовольняє будь-якій з умов';
 $labels['filterany'] = 'всі повідомлення';
 $labels['filtercontains'] = 'містить';
 $labels['filternotcontains'] = 'не містить';
@@ -18,13 +18,13 @@ $labels['filteris'] = 'ідентичний до';
 $labels['filterisnot'] = 'не ідентичний до';
 $labels['filterexists'] = 'існує';
 $labels['filternotexists'] = 'не існує';
-$labels['filterunder'] = 'пÑ\96д';
-$labels['filterover'] = 'над';
+$labels['filterunder'] = 'менÑ\88е, Ð½Ñ\96ж';
+$labels['filterover'] = 'бÑ\96лÑ\8cÑ\88е, Ð½Ñ\96ж';
 $labels['addrule'] = 'Додати правило';
 $labels['delrule'] = 'Видалити правило';
 $labels['messagemoveto'] = 'Пересунути повідомлення до';
 $labels['messageredirect'] = 'Перенаправити повідомлення до';
-$labels['messagereply'] = 'Ð\92Ñ\96дповÑ\96Ñ\81Ñ\82и Ð· Ð¿Ð¾Ð²Ñ\96домленнÑ\8fм';
+$labels['messagereply'] = 'Ð\90вÑ\82овÑ\96дповÑ\96даÑ\87';
 $labels['messagedelete'] = 'Видалити повідомлення';
 $labels['messagediscard'] = 'Відхилити з повідомленням';
 $labels['messagesrules'] = 'Для вхідної пошти';
@@ -34,21 +34,43 @@ $labels['del'] = 'Видалити';
 $labels['sender'] = 'Відправник';
 $labels['recipient'] = 'Отримувач';
 $labels['vacationaddresses'] = 'Додатковий список адрес отримувачів (розділених комою)';
-$labels['vacationdays'] = 'ЧаÑ\81Ñ\82оÑ\82а Ð½Ð°Ð´Ñ\81иланнÑ\8f Ð¿Ð¾Ð²Ñ\96домленÑ\8c (у днях):';
-$labels['vacationreason'] = 'Тіло повідомлення (причина):';
+$labels['vacationdays'] = 'Як Ñ\87аÑ\81Ñ\82о Ð¿Ð¾Ð²Ñ\82оÑ\80Ñ\8eваÑ\82и (у днях):';
+$labels['vacationreason'] = 'Текст повідомлення:';
 $labels['rulestop'] = 'Зупинити перевірку правил';
+$labels['filterset'] = 'Набір фільтрів';
+$labels['filtersetadd'] = 'Додати набір фільтрів';
+$labels['filtersetdel'] = 'Видалити поточний набір';
+$labels['filtersetact'] = 'Активувати поточний набір';
+$labels['filtersetget'] = 'Зберегти набір у текстовому форматі';
+$labels['filterdef'] = 'Параметри фільтру';
+$labels['filtersetname'] = 'Назва набору фільтрів';
+$labels['newfilterset'] = 'Новий набір фільтрів';
+$labels['active'] = 'активний';
+$labels['none'] = 'нічого';
+$labels['fromset'] = 'з набору';
+$labels['fromfile'] = 'з файлу';
+$labels['filterdisabled'] = 'Фільтр вимкнено';
 
 $messages = array();
-$messages['filterunknownerror'] = 'Невідома помилка сервера.';
-$messages['filterconnerror'] = 'Неможливо з\'єднатися з сервером.';
-$messages['filterdeleteerror'] = 'Неможливо видалити фільтр. Помилка сервера.';
-$messages['filterdeleted'] = 'Фільтр успішно видалено.';
-$messages['filterconfirmdelete'] = 'Ви дійсно хочете видалити вибраний фільтр?';
-$messages['filtersaved'] = 'Фільтр успішно збережено.';
-$messages['filtersaveerror'] = 'Неможливо зберегти фільтр. Помилка сервера.';
-$messages['ruledeleteconfirm'] = 'Ви дійсно хочете видалити вибране правило?';
-$messages['actiondeleteconfirm'] = 'Ви дійсно хочете видалити вибрану дію?';
-$messages['forbiddenchars'] = 'Введено заборонений символ.';
-$messages['cannotbeempty'] = 'Поле не може бути пустим.';
+$messages['filterunknownerror'] = 'Невідома помилка сервера';
+$messages['filterconnerror'] = 'Неможливо з\'єднатися з сервером';
+$messages['filterdeleteerror'] = 'Неможливо видалити фільтр. Помилка сервера';
+$messages['filterdeleted'] = 'Фільтр успішно видалено';
+$messages['filtersaved'] = 'Фільтр успішно збережено';
+$messages['filtersaveerror'] = 'Неможливо зберегти фільтр. Помилка сервера';
+$messages['filterdeleteconfirm'] = 'Ви дійсно хочете видалити обраний фільтр?';
+$messages['ruledeleteconfirm'] = 'Ви дійсно хочете видалити обране правило?';
+$messages['actiondeleteconfirm'] = 'Ви дійсно хочете видалити обрану дію?';
+$messages['forbiddenchars'] = 'Введено заборонений символ';
+$messages['cannotbeempty'] = 'Поле не може бути пустим';
+$messages['setactivateerror'] = 'Неможливо активувати обраний набір. Помилка сервера';
+$messages['setdeleteerror'] = 'Неможливо видалити обраний набір. Помилка сервера';
+$messages['setactivated'] = 'Набір фільтрів активовано успішно';
+$messages['setdeleted'] = 'Набір фільтрів видалено успішно';
+$messages['setdeleteconfirm'] = 'Ви впевнені, що хочете видалити обраний набір?';
+$messages['setcreateerror'] = 'Не вдалося створити набір. Помилка сервера';
+$messages['setcreated'] = 'Набір фільтрів створено успішно';
+$messages['emptyname'] = 'Не вдалося створити набір. Введіть назву набору';
+$messages['nametoolong'] = 'Не вдалося створити набір. Занадто довга назва'
 
 ?>
index fe63c6de8867b0a61c0553508b807c437b156475..a31a67d33904ec5e4c79a2b9e01ff4068321f812 100644 (file)
@@ -38,7 +38,7 @@ $messages['filterunknownerror'] = '未知的服务器错误';
 $messages['filterconnerror'] = '无法连接到 managesieve 服务器';
 $messages['filterdeleteerror'] = '无法删除过滤器。服务器错误';
 $messages['filterdeleted'] = '过滤器已成功删除';
-$messages['filterconfirmdelete'] = '您确定要删除所选择的过滤器吗?';
+$messages['filterdeleteconfirm'] = '您确定要删除所选择的过滤器吗?';
 $messages['filtersaved'] = '过滤器已成功保存。';
 $messages['filtersaveerror'] = '无法保存过滤器。服务器错误';
 $messages['ruledeleteconfirm'] = '您确定要删除所选择的规则吗?';
diff --git a/plugins/managesieve/localization/zh_TW.inc b/plugins/managesieve/localization/zh_TW.inc
new file mode 100644 (file)
index 0000000..8ab37d2
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+
+$labels['filters'] = '篩選器';
+$labels['managefilters'] = '設定篩選器';
+$labels['filtername'] = '篩選器名稱';
+$labels['newfilter'] = '建立新篩選器';
+$labels['filteradd'] = '增加篩選器';
+$labels['filterdel'] = '刪除篩選器';
+$labels['moveup'] = '上移';
+$labels['movedown'] = '下移';
+$labels['filterallof'] = '符合所有規則';
+$labels['filteranyof'] = '符合任一條規則';
+$labels['filterany'] = '所有信件';
+$labels['filtercontains'] = '包含';
+$labels['filternotcontains'] = '不包含';
+$labels['filteris'] = '等於';
+$labels['filterisnot'] = '不等於';
+$labels['filterexists'] = '存在';
+$labels['filternotexists'] = '不存在';
+$labels['filterunder'] = '小於';
+$labels['filterover'] = '大於';
+$labels['addrule'] = '新增規則';
+$labels['delrule'] = '刪除規則';
+$labels['messagemoveto'] = '將信件移至';
+$labels['messageredirect'] = '將信件轉寄至';
+$labels['messagereply'] = '以下列內容回覆';
+$labels['messagedelete'] = '刪除信件';
+$labels['messagediscard'] = '刪除信件並以下列內容回覆';
+$labels['messagesrules'] = '對新收到的信件:';
+$labels['messagesactions'] = '執行下列動作:';
+$labels['add'] = '新增';
+$labels['del'] = '刪除';
+$labels['sender'] = '寄件者';
+$labels['recipient'] = '收件者';
+$labels['vacationaddresses'] = '其他收件者(用半形逗號隔開):';
+$labels['vacationdays'] = '多久回覆一次(單位:天):';
+$labels['vacationreason'] = '信件內容(休假原因):';
+$labels['rulestop'] = '停止評估規則';
+$labels['filterset'] = '篩選器集合';
+$labels['filtersetadd'] = '加入篩選器集合';
+$labels['filtersetdel'] = '刪除目前的篩選器集合';
+$labels['filtersetact'] = '啟用目前的篩選器集合';
+$labels['filtersetdeact'] = '停用目前的篩選器集合';
+$labels['filtersetget'] = '以純文字下載篩選器集合';
+$labels['filterdef'] = '篩選器定義';
+$labels['filtersetname'] = '篩選器集合名稱';
+$labels['newfilterset'] = '建立篩選器集合';
+$labels['active'] = '啟用';
+$labels['none'] = '無';
+$labels['fromset'] = '從集合';
+$labels['fromfile'] = '重檔案';
+$labels['filterdisabled'] = '篩選器已停用';
+
+$messages = array();
+$messages['filterunknownerror'] = '未知的伺服器錯誤';
+$messages['filterconnerror'] = '無法與伺服器連線';
+$messages['filterdeleteerror'] = '無法刪除篩選器。發生伺服器錯誤';
+$messages['filterdeleted'] = '成功刪除篩選器';
+$messages['filterconfirmdelete'] = '您確定要刪除選擇的篩選器嗎?';
+$messages['filtersaved'] = '成功儲存篩選器。';
+$messages['filtersaveerror'] = '無法儲存篩選器。發生伺服器錯誤';
+$messages['ruledeleteconfirm'] = '您確定要刪除選的規則嗎?';
+$messages['actiondeleteconfirm'] = '您確定要刪除選擇的動作嗎?';
+$messages['forbiddenchars'] = '內容包含禁用字元';
+$messages['cannotbeempty'] = '內容不能為空白';
+$messages['setactivateerror'] = '無法啟用選擇的篩選器集合。 伺服器發生錯誤';
+$messages['setdeactivateerror'] = '無法停用選擇的篩選器集合。 伺服器發生錯誤';
+$messages['setdeleteerror'] = '無法刪除選擇的篩選器集合。 伺服器發生錯誤';
+$messages['setactivated'] = '篩選器集合成功啟用';
+$messages['setdeactivated'] = '篩選器集合成功停用';
+$messages['setdeleted'] = '篩選器集合成功刪除';
+$messages['setdeleteconfirm'] = '你確定要刪除選擇的篩選器集合嗎?';
+$messages['setcreateerror'] = '無法建立篩選器集合。 伺服器發生錯誤';
+$messages['setcreated'] = '篩選器集合成功建立';
+$messages['emptyname'] = '無法建立篩選器集合。 集合名稱空白';
+$messages['nametoolong'] = '無法建立篩選器集合。 名稱太長'
+
+?>
index 7ff1acf73389f9d10c8c2f70ad2b4ccab720611e..6b96561b495131875ebbf60ce99ef1bf6915d317 100644 (file)
@@ -2,14 +2,13 @@
 
 if (window.rcmail) {
   rcmail.addEventListener('init', function(evt) {
-    // <span id="settingstabdefault" class="tablink"><roundcube:button command="preferences" type="link" label="preferences" title="editpreferences" /></span>
+
     var tab = $('<span>').attr('id', 'settingstabpluginmanagesieve').addClass('tablink');
-    
     var button = $('<a>').attr('href', rcmail.env.comm_path+'&_action=plugin.managesieve')
-       .attr('title', rcmail.gettext('managesieve.managefilters'))
-       .html(rcmail.gettext('managesieve.filters'))
-       .bind('click', function(e){ return rcmail.command('plugin.managesieve', this) })
-       .appendTo(tab);
+      .attr('title', rcmail.gettext('managesieve.managefilters'))
+      .html(rcmail.gettext('managesieve.filters'))
+      .bind('click', function(e){ return rcmail.command('plugin.managesieve', this) })
+      .appendTo(tab);
 
     // add button and register commands
     rcmail.add_element(tab, 'tabs');
@@ -19,363 +18,494 @@ if (window.rcmail) {
     rcmail.register_command('plugin.managesieve-del', function() { rcmail.managesieve_del() }, true);
     rcmail.register_command('plugin.managesieve-up', function() { rcmail.managesieve_up() }, true);
     rcmail.register_command('plugin.managesieve-down', function() { rcmail.managesieve_down() }, true);
-
-    if (rcmail.env.action == 'plugin.managesieve')
-      {
-       if (rcmail.gui_objects.sieveform)
-         rcmail.enable_command('plugin.managesieve-save', true);
-       else {
-         rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', 'plugin.managesieve-down', false);
-          rcmail.enable_command('plugin.managesieve-add', !rcmail.env.sieveconnerror);
-       }
-       
-        if (rcmail.gui_objects.filterslist) {
-           var p = rcmail;
-           rcmail.filters_list = new rcube_list_widget(rcmail.gui_objects.filterslist, {multiselect:false, draggable:false, keyboard:false});
-           rcmail.filters_list.addEventListener('select', function(o){ p.managesieve_select(o); });
-           rcmail.filters_list.init();
-           rcmail.filters_list.focus();
-         }
+    rcmail.register_command('plugin.managesieve-set', function() { rcmail.managesieve_set() }, true);
+    rcmail.register_command('plugin.managesieve-setadd', function() { rcmail.managesieve_setadd() }, true);
+    rcmail.register_command('plugin.managesieve-setdel', function() { rcmail.managesieve_setdel() }, true);
+    rcmail.register_command('plugin.managesieve-setact', function() { rcmail.managesieve_setact() }, true);
+    rcmail.register_command('plugin.managesieve-setget', function() { rcmail.managesieve_setget() }, true);
+
+    if (rcmail.env.action == 'plugin.managesieve') {
+      if (rcmail.gui_objects.sieveform) {
+        rcmail.enable_command('plugin.managesieve-save', true);
+      }
+      else {
+        rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up',
+          'plugin.managesieve-down', false);
+        rcmail.enable_command('plugin.managesieve-add', 'plugin.managesieve-setadd', !rcmail.env.sieveconnerror);
       }
-  });
-
-  /*********************************************************/
-  /*********     Managesieve filters methods       *********/
-  /*********************************************************/
 
-  rcube_webmail.prototype.managesieve_add = function()
-    {
-      this.load_managesieveframe();
-      this.filters_list.clear_selection();
-    };
+      // Create layer for form tips
+      if (!rcmail.env.framed) {
+        rcmail.env.ms_tip_layer = $('<div id="managesieve-tip" class="popupmenu"></div>');
+        rcmail.env.ms_tip_layer.appendTo(document.body);
+      }
 
-  rcube_webmail.prototype.managesieve_del = function()
-    {
-    var id = this.filters_list.get_single_selection();
+      if (rcmail.gui_objects.filterslist) {
+        var p = rcmail;
+        rcmail.filters_list = new rcube_list_widget(rcmail.gui_objects.filterslist, {multiselect:false, draggable:false, keyboard:false});
+        rcmail.filters_list.addEventListener('select', function(o){ p.managesieve_select(o); });
+        rcmail.filters_list.init();
+        rcmail.filters_list.focus();
 
-    if (confirm(this.get_label('managesieve.filterconfirmdelete')))
-      this.http_request('plugin.managesieve',
-           '_act=delete&_fid='+this.filters_list.rows[id].uid, true);
-    };
+        rcmail.enable_command('plugin.managesieve-set', true);
+        rcmail.enable_command('plugin.managesieve-setact', 'plugin.managesieve-setget', rcmail.gui_objects.filtersetslist.length);
+        rcmail.enable_command('plugin.managesieve-setdel', rcmail.gui_objects.filtersetslist.length > 1);
 
-  rcube_webmail.prototype.managesieve_up = function()
-    {
-    var id = this.filters_list.get_single_selection();
+        $('#'+rcmail.buttons['plugin.managesieve-setact'][0].id).attr('title', rcmail.gettext('managesieve.filterset'
+          + (rcmail.gui_objects.filtersetslist.value == rcmail.env.active_set ? 'deact' : 'act')));
+      }
+    }
+    if (rcmail.gui_objects.sieveform && rcmail.env.rule_disabled)
+      $('#disabled').attr('checked', true);
+  });
+};
+
+/*********************************************************/
+/*********     Managesieve filters methods       *********/
+/*********************************************************/
+
+rcube_webmail.prototype.managesieve_add = function()
+{
+  this.load_managesieveframe();
+  this.filters_list.clear_selection();
+};
+
+rcube_webmail.prototype.managesieve_del = function()
+{
+  var id = this.filters_list.get_single_selection();
+  if (confirm(this.get_label('managesieve.filterdeleteconfirm')))
     this.http_request('plugin.managesieve',
-           '_act=up&_fid='+this.filters_list.rows[id].uid, true);
-    };
+      '_act=delete&_fid='+this.filters_list.rows[id].uid, true);
+};
+
+rcube_webmail.prototype.managesieve_up = function()
+{
+  var id = this.filters_list.get_single_selection();
+  this.http_request('plugin.managesieve',
+    '_act=up&_fid='+this.filters_list.rows[id].uid, true);
+};
+
+rcube_webmail.prototype.managesieve_down = function()
+{
+  var id = this.filters_list.get_single_selection();
+  this.http_request('plugin.managesieve',
+    '_act=down&_fid='+this.filters_list.rows[id].uid, true);
+};
+
+rcube_webmail.prototype.managesieve_rowid = function(id)
+{
+  var i, rows = this.filters_list.rows;
+
+  for (i=0; i<rows.length; i++)
+    if (rows[i] != null && rows[i].uid == id)
+      return i;
+}
 
-  rcube_webmail.prototype.managesieve_down = function()
-    {
-    var id = this.filters_list.get_single_selection();
-    this.http_request('plugin.managesieve',
-           '_act=down&_fid='+this.filters_list.rows[id].uid, true);
-    };
-
-  rcube_webmail.prototype.managesieve_rowid = function(id)
-    {
-    var rows = this.filters_list.rows;
-    
-    for (var i=0; i<rows.length; i++)
-      if (rows[i] != null && rows[i].uid == id)
-       return i;
-    }
+rcube_webmail.prototype.managesieve_updatelist = function(action, name, id, disabled)
+{
+  this.set_busy(true);
 
-  rcube_webmail.prototype.managesieve_updatelist = function(action, name, id)
-    {
-    this.set_busy(true);
-
-    switch (action)
-      {
-      case 'delete':
-        this.filters_list.remove_row(this.managesieve_rowid(id));
-       this.filters_list.clear_selection();
-       this.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', 'plugin.managesieve-down', false);
-       this.show_contentframe(false);
-
-       // re-numbering filters
-        var rows = this.filters_list.rows;
-        for (var i=0; i<rows.length; i++)
-          {
-         if (rows[i] != null && rows[i].uid > id)
-           rows[i].uid = rows[i].uid-1;
-         }
-       break;
-
-      case 'down':
-        var rows = this.filters_list.rows;
-       var from;
-
-       // we need only to replace filter names...
-        for (var i=0; i<rows.length; i++)
-        {
-         if (rows[i]==null) { // removed row
-           continue;
-          } else if (rows[i].uid == id) {
-           from = rows[i].obj.cells[0];
-         } else if (rows[i].uid == id+1){
-           name = rows[i].obj.cells[0].innerHTML;
-           rows[i].obj.cells[0].innerHTML = from.innerHTML;
-           from.innerHTML = name;
-           this.filters_list.highlight_row(i);
-           break;
-         }
-       }
-       // ... and disable/enable Down button
-       this.filters_listbuttons();
-        break;
+  switch (action) {
+    case 'delete':
+      this.filters_list.remove_row(this.managesieve_rowid(id));
+      this.filters_list.clear_selection();
+      this.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', 'plugin.managesieve-down', false);
+      this.show_contentframe(false);
+
+      // re-numbering filters
+      var i, rows = this.filters_list.rows;
+      for (i=0; i<rows.length; i++) {
+        if (rows[i] != null && rows[i].uid > id)
+          rows[i].uid = rows[i].uid-1;
+      }
+      break;
 
-      case 'up':
-        var rows = this.filters_list.rows;
-       var from;
-
-       // we need only to replace filter names...
-        for (var i=0; i<rows.length; i++)
-        {
-         if (rows[i]==null) { // removed row
-           continue;
-          } else if (rows[i].uid == id-1) {
-           from = rows[i].obj.cells[0];
-           this.filters_list.highlight_row(i);
-         } else if (rows[i].uid == id) {
-           name = rows[i].obj.cells[0].innerHTML;
-           rows[i].obj.cells[0].innerHTML = from.innerHTML;
-           from.innerHTML = name;
-           break;
-         }
-       }
-       // ... and disable/enable Up button
-       this.filters_listbuttons();
-        break;
-       
-      case 'update':
-        var rows = parent.rcmail.filters_list.rows;
-        for (var i=0; i<rows.length; i++)
-         if (rows[i] && rows[i].uid == id)
-           {
-           rows[i].obj.cells[0].innerHTML = name;
-           break;
-           }
-        break;
-      
-      case 'add':
-        var row, new_row, td;
-       var list = parent.rcmail.filters_list;
+    case 'down':
+      var from, fromstatus, status, rows = this.filters_list.rows;
 
-       if (!list)
+      // we need only to replace filter names...
+      for (var i=0; i<rows.length; i++) {
+        if (rows[i]==null) { // removed row
+          continue;
+        }
+        else if (rows[i].uid == id) {
+          from = rows[i].obj;
+          fromstatus = $(from).hasClass('disabled');
+        }
+        else if (rows[i].uid == id+1) {
+          name = rows[i].obj.cells[0].innerHTML;
+          status = $(rows[i].obj).hasClass('disabled');
+          rows[i].obj.cells[0].innerHTML = from.cells[0].innerHTML;
+          from.cells[0].innerHTML = name;
+          $(from)[status?'addClass':'removeClass']('disabled');
+          $(rows[i].obj)[fromstatus?'addClass':'removeClass']('disabled');
+          this.filters_list.highlight_row(i);
           break;
-
-       for (var i=0; i<list.rows.length; i++)
-         if (list.rows[i] != null && String(list.rows[i].obj.id).match(/^rcmrow/))
-           row = list.rows[i].obj;
-
-        if (row)
-         {
-           new_row = parent.document.createElement('tr');
-           new_row.id = 'rcmrow'+id;
-           td = parent.document.createElement('td');
-           new_row.appendChild(td);
-           list.insert_row(new_row, false);
-
-           if (row.cells[0].className)
-             td.className = row.cells[0].className;
-        
-           td.innerHTML = name;
-           list.highlight_row(id);
-
-           parent.rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', true);
-         }
-        else // refresh whole page
-         parent.rcmail.goto_url('plugin.managesieve');
-       break;
+        }
       }
+      // ... and disable/enable Down button
+      this.filters_listbuttons();
+      break;
 
-    this.set_busy(false);
-
-    };
+    case 'up':
+      var from, status, fromstatus, rows = this.filters_list.rows;
 
-  rcube_webmail.prototype.managesieve_select = function(list)
-    {
-    var id = list.get_single_selection();
-    if (id != null)
-      this.load_managesieveframe(list.rows[id].uid);
-    };
-
-  rcube_webmail.prototype.managesieve_save = function()
-    {
-      if (parent.rcmail && parent.rcmail.filters_list)
-        {
-        var id = parent.rcmail.filters_list.get_single_selection();
-       if (id != null)
-         this.gui_objects.sieveform.elements['_fid'].value = parent.rcmail.filters_list.rows[id].uid;
+      // we need only to replace filter names...
+      for (var i=0; i<rows.length; i++) {
+        if (rows[i] == null) { // removed row
+          continue;
         }
-      this.gui_objects.sieveform.submit();
-    };
-
-  // load filter frame
-  rcube_webmail.prototype.load_managesieveframe = function(id)
-    {
-    if (typeof(id) != 'undefined' && id != null)
-      {
-      this.enable_command('plugin.managesieve-del', true);
-      this.filters_listbuttons();
-      }
-    else
-      this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
-
-    if (this.env.contentframe && window.frames && window.frames[this.env.contentframe])
-      {
-      target = window.frames[this.env.contentframe];
-      this.set_busy(true, 'loading');
-      target.location.href = this.env.comm_path+'&_action=plugin.managesieve&_framed=1&_fid='+id;
-      }
-    };
-
-  // enable/disable Up/Down buttons
-  rcube_webmail.prototype.filters_listbuttons = function()
-    {
-    var id = this.filters_list.get_single_selection();
-    var rows = this.filters_list.rows;
-
-    for (var i=0; i<rows.length; i++)
-      {
-      if (rows[i] == null) { // removed row
-        } else if (i == id) {
-         this.enable_command('plugin.managesieve-up', false);
-         break;
-        } else {
-         this.enable_command('plugin.managesieve-up', true);
-         break;
+        else if (rows[i].uid == id-1) {
+          from = rows[i].obj;
+          fromstatus = $(from).hasClass('disabled');
+          this.filters_list.highlight_row(i);
+        }
+        else if (rows[i].uid == id) {
+          name = rows[i].obj.cells[0].innerHTML;
+          status = $(rows[i].obj).hasClass('disabled');
+          rows[i].obj.cells[0].innerHTML = from.cells[0].innerHTML;
+          from.cells[0].innerHTML = name;
+          $(from)[status?'addClass':'removeClass']('disabled');
+          $(rows[i].obj)[fromstatus?'addClass':'removeClass']('disabled');
+          break;
         }
       }
+      // ... and disable/enable Up button
+      this.filters_listbuttons();
+      break;
+
+    case 'update':
+      var rows = parent.rcmail.filters_list.rows;
+      for (var i=0; i<rows.length; i++)
+        if (rows[i] && rows[i].uid == id) {
+          rows[i].obj.cells[0].innerHTML = name;
+          if (disabled)
+            $(rows[i].obj).addClass('disabled');
+          else
+            $(rows[i].obj).removeClass('disabled');
+          break;
+        }
+      break;
 
-    for (var i=rows.length-1; i>0; i--)
-      {
-        if (rows[i] == null) { // removed row
-       } else if (i == id) {
-         this.enable_command('plugin.managesieve-down', false);
-         break;
-       } else {
-         this.enable_command('plugin.managesieve-down', true);
-         break;
-       }
-      } 
-    };
-
-  // operations on filters form
-  rcube_webmail.prototype.managesieve_ruleadd = function(id)
-    {
-      this.http_post('plugin.managesieve', '_act=ruleadd&_rid='+id);
-    };
-
-  rcube_webmail.prototype.managesieve_rulefill = function(content, id, after)
-    {
-      if (content != '')
-        {
-       // create new element
-       var div = document.getElementById('rules');
-       var row = document.createElement('div');
-
-       this.managesieve_insertrow(div, row, after);
-       // fill row after inserting (for IE)
-       row.setAttribute('id', 'rulerow'+id);
-       row.className = 'rulerow';
-        row.innerHTML = content;
-
-       this.managesieve_formbuttons(div);
-       }
-    };
-
-  rcube_webmail.prototype.managesieve_ruledel = function(id)
-    {
-      if (confirm(this.get_label('managesieve.ruledeleteconfirm')))
-       {
-       var row = document.getElementById('rulerow'+id);
-       row.parentNode.removeChild(row);
-       this.managesieve_formbuttons(document.getElementById('rules'));
-       }
-    };
-
-  rcube_webmail.prototype.managesieve_actionadd = function(id)
-    {
-      this.http_post('plugin.managesieve', '_act=actionadd&_aid='+id);
-    };
-
-  rcube_webmail.prototype.managesieve_actionfill = function(content, id, after)
-    {
-      if (content != '')
-        {
-       var div = document.getElementById('actions');
-       var row = document.createElement('div');
-
-       this.managesieve_insertrow(div, row, after);
-       // fill row after inserting (for IE)
-       row.className = 'actionrow';
-       row.setAttribute('id', 'actionrow'+id);
-        row.innerHTML = content;
-
-        this.managesieve_formbuttons(div);
-       }
-    };
-
-  rcube_webmail.prototype.managesieve_actiondel = function(id)
-    {
-      if (confirm(this.get_label('managesieve.actiondeleteconfirm')))
-       {
-       var row = document.getElementById('actionrow'+id);
-       row.parentNode.removeChild(row);
-       this.managesieve_formbuttons(document.getElementById('actions'));
-       }
-    };
-
-  // insert rule/action row in specified place on the list
-  rcube_webmail.prototype.managesieve_insertrow = function(div, row, after)
-    {
-      for (var i=0; i<div.childNodes.length; i++)
-       {
-        if (div.childNodes[i].id == (div.id == 'rules' ? 'rulerow' : 'actionrow')  + after)
-         break;
-       }
-
-      if (div.childNodes[i+1])
-        div.insertBefore(row, div.childNodes[i+1]);
-      else
-        div.appendChild(row);
+    case 'add':
+      var row, new_row, td, list = parent.rcmail.filters_list;
+
+      if (!list)
+        break;
+
+      for (var i=0; i<list.rows.length; i++)
+        if (list.rows[i] != null && String(list.rows[i].obj.id).match(/^rcmrow/))
+          row = list.rows[i].obj;
+
+      if (row) {
+        new_row = parent.document.createElement('tr');
+        new_row.id = 'rcmrow'+id;
+        td = parent.document.createElement('td');
+        new_row.appendChild(td);
+        list.insert_row(new_row, false);
+        if (disabled)
+          $(new_row).addClass('disabled');
+          if (row.cells[0].className)
+            td.className = row.cells[0].className;
+
+           td.innerHTML = name;
+        list.highlight_row(id);
+
+        parent.rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', true);
+      }
+      else // refresh whole page
+        parent.rcmail.goto_url('plugin.managesieve');
+      break;
+  }
+
+  this.set_busy(false);
+};
+
+rcube_webmail.prototype.managesieve_select = function(list)
+{
+  var id = list.get_single_selection();
+  if (id != null)
+    this.load_managesieveframe(list.rows[id].uid);
+};
+
+rcube_webmail.prototype.managesieve_save = function()
+{
+  if (parent.rcmail && parent.rcmail.filters_list && this.gui_objects.sieveform.name != 'filtersetform') {
+    var id = parent.rcmail.filters_list.get_single_selection();
+    if (id != null)
+      this.gui_objects.sieveform.elements['_fid'].value = parent.rcmail.filters_list.rows[id].uid;
+  }
+  this.gui_objects.sieveform.submit();
+};
+
+// load filter frame
+rcube_webmail.prototype.load_managesieveframe = function(id)
+{
+  if (typeof(id) != 'undefined' && id != null) {
+    this.enable_command('plugin.managesieve-del', true);
+    this.filters_listbuttons();
+  }
+  else
+    this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
+
+  if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
+    target = window.frames[this.env.contentframe];
+    var msgid = this.set_busy(true, 'loading');
+    target.location.href = this.env.comm_path+'&_action=plugin.managesieve&_framed=1&_fid='+id+'&_unlock='+msgid;
+  }
+};
+
+// enable/disable Up/Down buttons
+rcube_webmail.prototype.filters_listbuttons = function()
+{
+  var id = this.filters_list.get_single_selection(),
+    rows = this.filters_list.rows;
+
+  for (var i=0; i<rows.length; i++) {
+    if (rows[i] == null) { // removed row
+    }
+    else if (i == id) {
+      this.enable_command('plugin.managesieve-up', false);
+      break;
+    }
+    else {
+      this.enable_command('plugin.managesieve-up', true);
+      break;
     }
+  }
 
-  // update Delete buttons status
-  rcube_webmail.prototype.managesieve_formbuttons = function(div)
-    {
-      var buttons = new Array();
-      var i, j=0;
-      // count and get buttons
-      for (i=0; i<div.childNodes.length; i++)
-       {
-       if (div.id == 'rules' && div.childNodes[i].id)
-         {
-         if (/rulerow/.test(div.childNodes[i].id))
-           buttons.push('ruledel' + div.childNodes[i].id.replace(/rulerow/, ''));
-         }
-       else if (div.childNodes[i].id)
-         {
-         if (/actionrow/.test(div.childNodes[i].id))
-           buttons.push( 'actiondel' + div.childNodes[i].id.replace(/actionrow/, ''));
-         }
-        }
+  for (var i=rows.length-1; i>0; i--) {
+    if (rows[i] == null) { // removed row
+    }
+    else if (i == id) {
+      this.enable_command('plugin.managesieve-down', false);
+      break;
+    }
+    else {
+      this.enable_command('plugin.managesieve-down', true);
+      break;
+    }
+  } 
+};
+
+// operations on filters form
+rcube_webmail.prototype.managesieve_ruleadd = function(id)
+{
+  this.http_post('plugin.managesieve', '_act=ruleadd&_rid='+id);
+};
+
+rcube_webmail.prototype.managesieve_rulefill = function(content, id, after)
+{
+  if (content != '') {
+    // create new element
+    var div = document.getElementById('rules'),
+      row = document.createElement('div');
+
+    this.managesieve_insertrow(div, row, after);
+    // fill row after inserting (for IE)
+    row.setAttribute('id', 'rulerow'+id);
+    row.className = 'rulerow';
+    row.innerHTML = content;
+
+    this.managesieve_formbuttons(div);
+  }
+};
+
+rcube_webmail.prototype.managesieve_ruledel = function(id)
+{
+  if (confirm(this.get_label('managesieve.ruledeleteconfirm'))) {
+    var row = document.getElementById('rulerow'+id);
+    row.parentNode.removeChild(row);
+    this.managesieve_formbuttons(document.getElementById('rules'));
+  }
+};
+
+rcube_webmail.prototype.managesieve_actionadd = function(id)
+{
+  this.http_post('plugin.managesieve', '_act=actionadd&_aid='+id);
+};
+
+rcube_webmail.prototype.managesieve_actionfill = function(content, id, after)
+{
+  if (content != '') {
+    var div = document.getElementById('actions'),
+      row = document.createElement('div');
+
+    this.managesieve_insertrow(div, row, after);
+    // fill row after inserting (for IE)
+    row.className = 'actionrow';
+    row.setAttribute('id', 'actionrow'+id);
+    row.innerHTML = content;
+
+    this.managesieve_formbuttons(div);
+  }
+};
+
+rcube_webmail.prototype.managesieve_actiondel = function(id)
+{
+  if (confirm(this.get_label('managesieve.actiondeleteconfirm'))) {
+    var row = document.getElementById('actionrow'+id);
+    row.parentNode.removeChild(row);
+    this.managesieve_formbuttons(document.getElementById('actions'));
+  }
+};
+
+// insert rule/action row in specified place on the list
+rcube_webmail.prototype.managesieve_insertrow = function(div, row, after)
+{
+  for (var i=0; i<div.childNodes.length; i++) {
+    if (div.childNodes[i].id == (div.id == 'rules' ? 'rulerow' : 'actionrow')  + after)
+      break;
+  }
+
+  if (div.childNodes[i+1])
+    div.insertBefore(row, div.childNodes[i+1]);
+  else
+    div.appendChild(row);
+};
+
+// update Delete buttons status
+rcube_webmail.prototype.managesieve_formbuttons = function(div)
+{
+  var i, button, buttons = [];
+
+  // count and get buttons
+  for (i=0; i<div.childNodes.length; i++) {
+    if (div.id == 'rules' && div.childNodes[i].id) {
+      if (/rulerow/.test(div.childNodes[i].id))
+        buttons.push('ruledel' + div.childNodes[i].id.replace(/rulerow/, ''));
+    }
+    else if (div.childNodes[i].id) {
+      if (/actionrow/.test(div.childNodes[i].id))
+        buttons.push( 'actiondel' + div.childNodes[i].id.replace(/actionrow/, ''));
+    }
+  }
 
-      for (i=0; i<buttons.length; i++)
-       {
-       var button = document.getElementById(buttons[i]);
-       if (i>0 || buttons.length>1)
-         {
-         $(button).removeClass('disabled');
-         button.removeAttribute('disabled');
-         }
-       else
-         {
-         $(button).addClass('disabled');
-         button.setAttribute('disabled', true);
-         }
-        }
+  for (i=0; i<buttons.length; i++) {
+    button = document.getElementById(buttons[i]);
+    if (i>0 || buttons.length>1) {
+      $(button).removeClass('disabled');
+      button.removeAttribute('disabled');
     }
-}
+    else {
+      $(button).addClass('disabled');
+      button.setAttribute('disabled', true);
+    }
+  }
+};
+
+// Set change
+rcube_webmail.prototype.managesieve_set = function()
+{
+  var script = $(this.gui_objects.filtersetslist).val();
+  location.href = this.env.comm_path+'&_action=plugin.managesieve&_set='+script;
+};
+
+// Script download
+rcube_webmail.prototype.managesieve_setget = function()
+{
+  var script = $(this.gui_objects.filtersetslist).val();
+  location.href = this.env.comm_path+'&_action=plugin.managesieve&_act=setget&_set='+script;
+};
+
+// Set activate
+rcube_webmail.prototype.managesieve_setact = function()
+{
+  if (!this.gui_objects.filtersetslist)
+    return false;
+
+  var script = this.gui_objects.filtersetslist.value,
+    action = (script == rcmail.env.active_set ? 'deact' : 'setact');
+
+  this.http_post('plugin.managesieve', '_act='+action+'&_set='+script);
+};
+
+// Set activate flag in sets list after set activation
+rcube_webmail.prototype.managesieve_reset = function()
+{
+  if (!this.gui_objects.filtersetslist)
+    return false;
+
+  var list = this.gui_objects.filtersetslist,
+    opts = list.getElementsByTagName('option'),
+    label = ' (' + this.get_label('managesieve.active') + ')',
+    regx = new RegExp(RegExp.escape(label)+'$');
+
+  for (var x=0; x<opts.length; x++) {
+    if (opts[x].value != rcmail.env.active_set && opts[x].innerHTML.match(regx))
+      opts[x].innerHTML = opts[x].innerHTML.replace(regx, '');
+    else if (opts[x].value == rcmail.env.active_set)
+      opts[x].innerHTML = opts[x].innerHTML + label;
+  }
+
+  // change title of setact button
+  $('#'+rcmail.buttons['plugin.managesieve-setact'][0].id).attr('title', rcmail.gettext('managesieve.filterset'
+    + (list.value == rcmail.env.active_set ? 'deact' : 'act')));
+};
+
+// Set delete
+rcube_webmail.prototype.managesieve_setdel = function()
+{
+  if (!this.gui_objects.filtersetslist)
+    return false;
+
+  if (!confirm(this.get_label('managesieve.setdeleteconfirm')))
+    return false;
+
+  var script = this.gui_objects.filtersetslist.value;
+  this.http_post('plugin.managesieve', '_act=setdel&_set='+script);
+};
+
+// Set add
+rcube_webmail.prototype.managesieve_setadd = function()
+{
+  this.filters_list.clear_selection();
+  this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
+
+  if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
+    target = window.frames[this.env.contentframe];
+    var msgid = this.set_busy(true, 'loading');
+    target.location.href = this.env.comm_path+'&_action=plugin.managesieve&_framed=1&_newset=1&_unlock='+msgid;
+  }
+};
+
+rcube_webmail.prototype.managesieve_reload = function(set)
+{
+  this.env.reload_set = set;
+  window.setTimeout(function() {
+    location.href = rcmail.env.comm_path + '&_action=plugin.managesieve'
+      + (rcmail.env.reload_set ? '&_set=' + rcmail.env.reload_set : '')
+  }, 500);
+};
+
+// Register onmouse(leave/enter) events for tips on specified form element
+rcube_webmail.prototype.managesieve_tip_register = function(tips)
+{
+  for (var n in tips) {
+    $('#'+tips[n][0])
+      .bind('mouseenter', {str: tips[n][1]},
+        function(e) {
+          var offset = $(this).offset(),
+            tip = rcmail.env.framed ? parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer,
+            left = offset.left,
+            top = offset.top - 12;
+
+          if (rcmail.env.framed) {
+            offset = $(parent.document.getElementById('filter-box')).offset();
+            top  += offset.top;
+            left += offset.left;
+          }
+
+          tip.html(e.data.str)
+          top -= tip.height();
+          
+          tip.css({left: left, top: top}).show();
+        })
+      .bind('mouseleave',
+        function(e) {
+          var tip = parent.rcmail && parent.rcmail.env.ms_tip_layer ? 
+            parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer;
+          tip.hide();
+      });
+  }
+};
index 0c8c492e4bb4059016d19c4bc7baf3e90f1eceb5..535f3826502160dd8ae91120fad694ed4068fee4 100644 (file)
  * It's clickable interface which operates on text scripts and communicates
  * with server using managesieve protocol. Adds Filters tab in Settings.
  *
- * @version 1.7
+ * @version 2.10
  * @author Aleksander 'A.L.E.C' Machniak <alec@alec.pl>
  *
- * Configuration (see config.inc.php.dist):
+ * Configuration (see config.inc.php.dist)
+ *
+ * $Id: managesieve.php 4241 2010-11-20 17:59:50Z alec $
  */
 
 class managesieve extends rcube_plugin
 {
-  public $task = 'settings';
-
-  private $rc;
-  private $sieve;
-  private $errors;
-  private $form;
-  private $script = array();
-  private $exts = array();
-  private $headers = array(
-    'subject' => 'Subject',
-    'sender' => 'From',
-    'recipient' => 'To',
-  );
-
-  function init()
-  {
-    // add Tab label/title
-    $this->add_texts('localization/', array('filters','managefilters'));
-
-    // register actions
-    $this->register_action('plugin.managesieve', array($this, 'managesieve_init'));
-    $this->register_action('plugin.managesieve-save', array($this, 'managesieve_save'));
-
-    // include main js script
-    $this->include_script('managesieve.js');
-  }
-  
-  function managesieve_start()
-  {
-    $rcmail = rcmail::get_instance();
-    $this->rc = &$rcmail;
-
-    $this->load_config();
-
-    // register UI objects
-    $this->rc->output->add_handlers(array(
-       'filterslist' => array($this, 'filters_list'),
-       'filterframe' => array($this, 'filter_frame'),
-       'filterform' => array($this, 'filter_form'),
-    ));
-
-    require_once($this->home . '/lib/Net/Sieve.php');
-    require_once($this->home . '/lib/rcube_sieve.php');
-
-    // try to connect to managesieve server and to fetch the script
-    $this->sieve = new rcube_sieve($_SESSION['username'],
-       $this->rc->decrypt($_SESSION['password']), 
-       str_replace('%h', $_SESSION['imap_host'], $this->rc->config->get('managesieve_host', 'localhost')),
-       $this->rc->config->get('managesieve_port', 2000),
-       $this->rc->config->get('managesieve_usetls', false),
-       $this->rc->config->get('managesieve_disabled_extensions'));
-
-    $error = $this->sieve->error();
-
-    if ($error == SIEVE_ERROR_NOT_EXISTS)
+    public $task = 'settings';
+
+    private $rc;
+    private $sieve;
+    private $errors;
+    private $form;
+    private $tips = array();
+    private $script = array();
+    private $exts = array();
+    private $headers = array(
+        'subject'   => 'Subject',
+        'sender'    => 'From',
+        'recipient' => 'To',
+    );
+
+
+    function init()
     {
-      // if script not exists build default script contents
-      $script_file = $this->rc->config->get('managesieve_default');
-      if ($script_file && is_readable($script_file))
-       $this->sieve->script->add_text(file_get_contents($script_file)); 
-      // that's not exactly an error
-      $error = false;
+        // add Tab label/title
+        $this->add_texts('localization/', array('filters','managefilters'));
+
+        // register actions
+        $this->register_action('plugin.managesieve', array($this, 'managesieve_actions'));
+        $this->register_action('plugin.managesieve-save', array($this, 'managesieve_save'));
+
+        // include main js script
+        $this->include_script('managesieve.js');
     }
-    elseif ($error)
+
+    function managesieve_start()
     {
-      switch ($error)
-      {
-       case SIEVE_ERROR_CONNECTION:
-       case SIEVE_ERROR_LOGIN:
-          $this->rc->output->show_message('managesieve.filterconnerror', 'error');  
-       break;
-       default:
-          $this->rc->output->show_message('managesieve.filterunknownerror', 'error');
-       break;
-      }
-
-      // to disable 'Add filter' button set env variable
-      $this->rc->output->set_env('filterconnerror', true);
+        $this->rc = rcmail::get_instance();
+        $this->load_config();
+
+        // register UI objects
+        $this->rc->output->add_handlers(array(
+            'filterslist'    => array($this, 'filters_list'),
+            'filtersetslist' => array($this, 'filtersets_list'),
+            'filterframe'    => array($this, 'filter_frame'),
+            'filterform'     => array($this, 'filter_form'),
+            'filtersetform'  => array($this, 'filterset_form'),
+        ));
+
+        require_once($this->home . '/lib/Net/Sieve.php');
+        require_once($this->home . '/lib/rcube_sieve.php');
+
+        $host = rcube_parse_host($this->rc->config->get('managesieve_host', 'localhost'));
+        $port = $this->rc->config->get('managesieve_port', 2000);
+
+        $host = idn_to_ascii($host);
+
+        // try to connect to managesieve server and to fetch the script
+        $this->sieve = new rcube_sieve($_SESSION['username'],
+            $this->rc->decrypt($_SESSION['password']), $host, $port,
+            $this->rc->config->get('managesieve_auth_type'),
+            $this->rc->config->get('managesieve_usetls', false),
+            $this->rc->config->get('managesieve_disabled_extensions'),
+            $this->rc->config->get('managesieve_debug', false),
+            $this->rc->config->get('managesieve_auth_cid'), 
+            $this->rc->config->get('managesieve_auth_pw')
+        );
+
+        if (!($error = $this->sieve->error())) {
+
+            $list = $this->sieve->get_scripts();
+            $active = $this->sieve->get_active();
+            $_SESSION['managesieve_active'] = $active;
+
+            if (!empty($_GET['_set'])) {
+                $script_name = get_input_value('_set', RCUBE_INPUT_GET);
+            }
+            else if (!empty($_SESSION['managesieve_current'])) {
+                $script_name = $_SESSION['managesieve_current'];
+            }
+            else {
+                // get active script
+                if ($active) {
+                    $script_name = $active;
+                }
+                else if ($list) {
+                    $script_name = $list[0];
+                }
+                // create a new (initial) script
+                else {
+                    // if script not exists build default script contents
+                    $script_file = $this->rc->config->get('managesieve_default');
+                    $script_name = 'roundcube';
+                    if ($script_file && is_readable($script_file))
+                        $content = file_get_contents($script_file);
+
+                // add script and set it active
+                if ($this->sieve->save_script($script_name, $content))
+                    if ($this->sieve->activate($script_name))
+                        $_SESSION['managesieve_active'] = $script_name;
+                }
+            }
+
+            if ($script_name)
+                $this->sieve->load($script_name);
+
+            $error = $this->sieve->error();
+        }
+
+        // finally set script objects
+        if ($error) {
+            switch ($error) {
+                case SIEVE_ERROR_CONNECTION:
+                case SIEVE_ERROR_LOGIN:
+                    $this->rc->output->show_message('managesieve.filterconnerror', 'error');
+                    break;
+                default:
+                    $this->rc->output->show_message('managesieve.filterunknownerror', 'error');
+                    break;
+            }
+
+            raise_error(array('code' => 403, 'type' => 'php',
+                'file' => __FILE__, 'line' => __LINE__,
+                'message' => "Unable to connect to managesieve on $host:$port"), true, false);
+
+            // to disable 'Add filter' button set env variable
+            $this->rc->output->set_env('filterconnerror', true);
+            $this->script = array();
+        }
+        else {
+            $this->script = $this->sieve->script->as_array();
+            $this->exts = $this->sieve->get_extensions();
+            $this->rc->output->set_env('active_set', $_SESSION['managesieve_active']);
+            $_SESSION['managesieve_current'] = $this->sieve->current;
+        }
+
+        return $error;
     }
 
-    // finally set script objects
-    if ($error)
+    function managesieve_actions()
     {
-      $this->script = array();
+        // Init plugin and handle managesieve connection
+        $error = $this->managesieve_start();
+
+        // Handle user requests
+        if ($action = get_input_value('_act', RCUBE_INPUT_GPC)) {
+            $fid = (int) get_input_value('_fid', RCUBE_INPUT_GET);
+
+            if ($action == 'up' && !$error) {
+                if ($fid && isset($this->script[$fid]) && isset($this->script[$fid-1])) {
+                    if ($this->sieve->script->update_rule($fid, $this->script[$fid-1]) !== false
+                        && $this->sieve->script->update_rule($fid-1, $this->script[$fid]) !== false) {
+                        $result = $this->sieve->save();
+                    }
+
+                    if ($result) {
+//                      $this->rc->output->show_message('managesieve.filtersaved', 'confirmation');
+                        $this->rc->output->command('managesieve_updatelist', 'up', '', $fid);
+                    } else
+                        $this->rc->output->show_message('managesieve.filtersaveerror', 'error');
+                }
+            }
+            else if ($action == 'down' && !$error) {
+                if (isset($this->script[$fid]) && isset($this->script[$fid+1])) {
+                    if ($this->sieve->script->update_rule($fid, $this->script[$fid+1]) !== false
+                        && $this->sieve->script->update_rule($fid+1, $this->script[$fid]) !== false) {
+                        $result = $this->sieve->save();
+                    }
+
+                    if ($result === true) {
+//                      $this->rc->output->show_message('managesieve.filtersaved', 'confirmation');
+                        $this->rc->output->command('managesieve_updatelist', 'down', '', $fid);
+                    } else {
+                        $this->rc->output->show_message('managesieve.filtersaveerror', 'error');
+                    }
+                }
+            }
+            else if ($action == 'delete' && !$error) {
+                if (isset($this->script[$fid])) {
+                    if ($this->sieve->script->delete_rule($fid))
+                        $result = $this->sieve->save();
+
+                    if ($result === true) {
+                        $this->rc->output->show_message('managesieve.filterdeleted', 'confirmation');
+                        $this->rc->output->command('managesieve_updatelist', 'delete', '', $fid);
+                    } else {
+                        $this->rc->output->show_message('managesieve.filterdeleteerror', 'error');
+                    }
+                }
+            }
+            else if ($action == 'setact' && !$error) {
+                $script_name = get_input_value('_set', RCUBE_INPUT_GPC);
+                $result = $this->sieve->activate($script_name);
+
+                if ($result === true) {
+                    $this->rc->output->set_env('active_set', $script_name);
+                    $this->rc->output->show_message('managesieve.setactivated', 'confirmation');
+                    $this->rc->output->command('managesieve_reset');
+                    $_SESSION['managesieve_active'] = $script_name;
+                } else {
+                    $this->rc->output->show_message('managesieve.setactivateerror', 'error');
+                }
+            }
+            else if ($action == 'deact' && !$error) {
+                $result = $this->sieve->deactivate();
+
+                if ($result === true) {
+                    $this->rc->output->set_env('active_set', '');
+                    $this->rc->output->show_message('managesieve.setdeactivated', 'confirmation');
+                    $this->rc->output->command('managesieve_reset');
+                    $_SESSION['managesieve_active'] = '';
+                } else {
+                    $this->rc->output->show_message('managesieve.setdeactivateerror', 'error');
+                }
+            }
+            else if ($action == 'setdel' && !$error) {
+                $script_name = get_input_value('_set', RCUBE_INPUT_GPC);
+                $result = $this->sieve->remove($script_name);
+
+                if ($result === true) {
+                    $this->rc->output->show_message('managesieve.setdeleted', 'confirmation');
+                    $this->rc->output->command('managesieve_reload');
+                    $this->rc->session->remove('managesieve_current');
+                } else {
+                    $this->rc->output->show_message('managesieve.setdeleteerror', 'error');
+                }
+            }
+            else if ($action == 'setget') {
+                $script_name = get_input_value('_set', RCUBE_INPUT_GPC);
+                $script = $this->sieve->get_script($script_name);
+
+                if (PEAR::isError($script))
+                    exit;
+
+                $browser = new rcube_browser;
+
+                // send download headers
+                header("Content-Type: application/octet-stream");
+                header("Content-Length: ".strlen($script));
+
+                if ($browser->ie)
+                    header("Content-Type: application/force-download");
+                if ($browser->ie && $browser->ver < 7)
+                    $filename = rawurlencode(abbreviate_string($script_name, 55));
+                else if ($browser->ie)
+                    $filename = rawurlencode($script_name);
+                else
+                    $filename = addcslashes($script_name, '\\"');
+
+                header("Content-Disposition: attachment; filename=\"$filename.txt\"");
+                echo $script;
+                exit;
+            }
+            elseif ($action == 'ruleadd') {
+                $rid = get_input_value('_rid', RCUBE_INPUT_GPC);
+                $id = $this->genid();
+                $content = $this->rule_div($fid, $id, false);
+
+                $this->rc->output->command('managesieve_rulefill', $content, $id, $rid);
+            }
+            elseif ($action == 'actionadd') {
+                $aid = get_input_value('_aid', RCUBE_INPUT_GPC);
+                $id = $this->genid();
+                $content = $this->action_div($fid, $id, false);
+
+                $this->rc->output->command('managesieve_actionfill', $content, $id, $aid);
+            }
+
+            $this->rc->output->send();
+        }
+
+        $this->managesieve_send();
     }
-    else
+
+    function managesieve_save()
     {
-      $this->script = $this->sieve->script->as_array();
-      $this->exts = $this->sieve->get_extensions();
-    }
-    
-    return $error;
-  }
+        // Init plugin and handle managesieve connection
+        $error = $this->managesieve_start();
+
+        // filters set add action
+        if (!empty($_POST['_newset'])) {
+            $name = get_input_value('_name', RCUBE_INPUT_POST);
+            $copy = get_input_value('_copy', RCUBE_INPUT_POST);
+            $from = get_input_value('_from', RCUBE_INPUT_POST);
+
+            if (!$name)
+                $error = 'managesieve.emptyname';
+            else if (mb_strlen($name)>128)
+                $error = 'managesieve.nametoolong';
+            else if ($from == 'file') {
+                // from file
+                if (is_uploaded_file($_FILES['_file']['tmp_name'])) {
+                    $file = file_get_contents($_FILES['_file']['tmp_name']);
+                    $file = preg_replace('/\r/', '', $file);
+                    // for security don't save script directly
+                    // check syntax before, like this...
+                    $this->sieve->load_script($file);
+                    if (!$this->sieve->save($name)) {
+                        $error = 'managesieve.setcreateerror';
+                    }
+                }
+                else {  // upload failed
+                    $err = $_FILES['_file']['error'];
+                    $error = true;
+
+                    if ($err == UPLOAD_ERR_INI_SIZE || $err == UPLOAD_ERR_FORM_SIZE) {
+                        $msg = rcube_label(array('name' => 'filesizeerror',
+                            'vars' => array('size' =>
+                                show_bytes(parse_bytes(ini_get('upload_max_filesize'))))));
+                    }
+                    else {
+                        $error = 'fileuploaderror';
+                    }
+                }
+            }
+            else if (!$this->sieve->copy($name, $from == 'set' ? $copy : '')) {
+                $error = 'managesieve.setcreateerror';
+            }
+
+            if (!$error) {
+                $this->rc->output->show_message('managesieve.setcreated', 'confirmation');
+                $this->rc->output->command('parent.managesieve_reload', $name);
+            } else if ($msg) {
+                $this->rc->output->command('display_message', $msg, 'error');
+            } else {
+                $this->rc->output->show_message($error, 'error');
+            }
+        }
+        // filter add/edit action
+        else if (isset($_POST['_name'])) {
+            $name = trim(get_input_value('_name', RCUBE_INPUT_POST, true));
+            $fid  = trim(get_input_value('_fid', RCUBE_INPUT_POST));
+            $join = trim(get_input_value('_join', RCUBE_INPUT_POST));
+
+            // and arrays
+            $headers = $_POST['_header'];
+            $cust_headers = $_POST['_custom_header'];
+            $ops = $_POST['_rule_op'];
+            $sizeops = $_POST['_rule_size_op'];
+            $sizeitems = $_POST['_rule_size_item'];
+            $sizetargets = $_POST['_rule_size_target'];
+            $targets = $_POST['_rule_target'];
+            $act_types = $_POST['_action_type'];
+            $mailboxes = $_POST['_action_mailbox'];
+            $act_targets = $_POST['_action_target'];
+            $area_targets = $_POST['_action_target_area'];
+            $reasons = $_POST['_action_reason'];
+            $addresses = $_POST['_action_addresses'];
+            $days = $_POST['_action_days'];
+
+            // we need a "hack" for radiobuttons
+            foreach ($sizeitems as $item)
+                $items[] = $item;
+
+            $this->form['disabled'] = $_POST['_disabled'] ? true : false;
+            $this->form['join']     = $join=='allof' ? true : false;
+            $this->form['name']     = $name;
+            $this->form['tests']    = array();
+            $this->form['actions']  = array();
+
+            if ($name == '')
+                $this->errors['name'] = $this->gettext('cannotbeempty');
+            else
+                foreach($this->script as $idx => $rule)
+                    if($rule['name'] == $name && $idx != $fid) {
+                        $this->errors['name'] = $this->gettext('ruleexist');
+                        break;
+                    }
+
+            $i = 0;
+            // rules
+            if ($join == 'any') {
+                $this->form['tests'][0]['test'] = 'true';
+            }
+            else {
+                foreach ($headers as $idx => $header) {
+                    $header = $this->strip_value($header);
+                    $target = $this->strip_value($targets[$idx], true);
+                    $op     = $this->strip_value($ops[$idx]);
+
+                    // normal header
+                    if (in_array($header, $this->headers)) {
+                        if (preg_match('/^not/', $op))
+                            $this->form['tests'][$i]['not'] = true;
+                        $type = preg_replace('/^not/', '', $op);
+
+                        if ($type == 'exists') {
+                            $this->form['tests'][$i]['test'] = 'exists';
+                            $this->form['tests'][$i]['arg'] = $header;
+                        }
+                        else {
+                            $this->form['tests'][$i]['type'] = $type;
+                            $this->form['tests'][$i]['test'] = 'header';
+                            $this->form['tests'][$i]['arg1'] = $header;
+                            $this->form['tests'][$i]['arg2'] = $target;
+
+                            if ($target == '')
+                                $this->errors['tests'][$i]['target'] = $this->gettext('cannotbeempty');
+                            else if (preg_match('/^(value|count)-/', $type) && !preg_match('/[0-9]+/', $target))
+                                $this->errors['tests'][$i]['target'] = $this->gettext('forbiddenchars');
+                        }
+                    }
+                    else
+                        switch ($header) {
+                        case 'size':
+                            $sizeop     = $this->strip_value($sizeops[$idx]);
+                            $sizeitem   = $this->strip_value($items[$idx]);
+                            $sizetarget = $this->strip_value($sizetargets[$idx]);
+
+                            $this->form['tests'][$i]['test'] = 'size';
+                            $this->form['tests'][$i]['type'] = $sizeop;
+                            $this->form['tests'][$i]['arg']  = $sizetarget.$sizeitem;
+
+                            if ($sizetarget == '')
+                                $this->errors['tests'][$i]['sizetarget'] = $this->gettext('cannotbeempty');
+                            else if (!preg_match('/^[0-9]+(K|M|G)*$/i', $sizetarget))
+                                $this->errors['tests'][$i]['sizetarget'] = $this->gettext('forbiddenchars');
+                            break;
+                        case '...':
+                            $cust_header = $headers = $this->strip_value($cust_headers[$idx]);
+
+                            if (preg_match('/^not/', $op))
+                                $this->form['tests'][$i]['not'] = true;
+                            $type = preg_replace('/^not/', '', $op);
+
+                            if ($cust_header == '')
+                                $this->errors['tests'][$i]['header'] = $this->gettext('cannotbeempty');
+                            else {
+                                $headers = preg_split('/[\s,]+/', $cust_header, -1, PREG_SPLIT_NO_EMPTY);
+
+                                if (!count($headers))
+                                    $this->errors['tests'][$i]['header'] = $this->gettext('cannotbeempty');
+                                else {
+                                    foreach ($headers as $hr)
+                                        if (!preg_match('/^[a-z0-9-]+$/i', $hr))
+                                            $this->errors['tests'][$i]['header'] = $this->gettext('forbiddenchars');
+                                }
+                            }
+
+                            if (empty($this->errors['tests'][$i]['header']))
+                                $cust_header = (is_array($headers) && count($headers) == 1) ? $headers[0] : $headers;
+
+                            if ($type == 'exists') {
+                                $this->form['tests'][$i]['test'] = 'exists';
+                                $this->form['tests'][$i]['arg']  = $cust_header;
+                            }
+                            else {
+                                $this->form['tests'][$i]['test'] = 'header';
+                                $this->form['tests'][$i]['type'] = $type;
+                                $this->form['tests'][$i]['arg1'] = $cust_header;
+                                $this->form['tests'][$i]['arg2'] = $target;
+
+                                if ($target == '')
+                                    $this->errors['tests'][$i]['target'] = $this->gettext('cannotbeempty');
+                                else if (preg_match('/^(value|count)-/', $type) && !preg_match('/[0-9]+/', $target))
+                                    $this->errors['tests'][$i]['target'] = $this->gettext('forbiddenchars');
+                            }
+                            break;
+                        }
+                    $i++;
+                }
+            }
+
+            $i = 0;
+            // actions
+            foreach($act_types as $idx => $type) {
+                $type   = $this->strip_value($type);
+                $target = $this->strip_value($act_targets[$idx]);
+
+                switch ($type) {
+                case 'fileinto':
+                case 'fileinto_copy':
+                    $mailbox = $this->strip_value($mailboxes[$idx]);
+                    $this->form['actions'][$i]['target'] = $mailbox;
+                    if ($type == 'fileinto_copy') {
+                        $type = 'fileinto';
+                        $this->form['actions'][$i]['copy'] = true;
+                    }
+                    break;
+                case 'reject':
+                case 'ereject':
+                    $target = $this->strip_value($area_targets[$idx]);
+                    $this->form['actions'][$i]['target'] = str_replace("\r\n", "\n", $target);
+
+ //                 if ($target == '')
+//                      $this->errors['actions'][$i]['targetarea'] = $this->gettext('cannotbeempty');
+                    break;
+                case 'redirect':
+                case 'redirect_copy':
+                    $this->form['actions'][$i]['target'] = $target;
+
+                    if ($this->form['actions'][$i]['target'] == '')
+                        $this->errors['actions'][$i]['target'] = $this->gettext('cannotbeempty');
+                    else if (!check_email($this->form['actions'][$i]['target']))
+                        $this->errors['actions'][$i]['target'] = $this->gettext('noemailwarning');
+
+                    if ($type == 'redirect_copy') {
+                        $type = 'redirect';
+                        $this->form['actions'][$i]['copy'] = true;
+                    }
+                    break;
+                case 'vacation':
+                    $reason = $this->strip_value($reasons[$idx]);
+                    $this->form['actions'][$i]['reason']    = str_replace("\r\n", "\n", $reason);
+                    $this->form['actions'][$i]['days']      = $days[$idx];
+                    $this->form['actions'][$i]['addresses'] = explode(',', $addresses[$idx]);
+// @TODO: vacation :subject, :mime, :from, :handle
 
-  function managesieve_init()
-  {
-    // Init plugin and handle managesieve connection
-    $error = $this->managesieve_start();
+                    if ($this->form['actions'][$i]['addresses']) {
+                        foreach($this->form['actions'][$i]['addresses'] as $aidx => $address) {
+                            $address = trim($address);
+                            if (!$address)
+                                unset($this->form['actions'][$i]['addresses'][$aidx]);
+                            else if(!check_email($address)) {
+                                $this->errors['actions'][$i]['addresses'] = $this->gettext('noemailwarning');
+                                break;
+                            } else
+                                $this->form['actions'][$i]['addresses'][$aidx] = $address;
+                        }
+                    }
+
+                    if ($this->form['actions'][$i]['reason'] == '')
+                        $this->errors['actions'][$i]['reason'] = $this->gettext('cannotbeempty');
+                    if ($this->form['actions'][$i]['days'] && !preg_match('/^[0-9]+$/', $this->form['actions'][$i]['days']))
+                        $this->errors['actions'][$i]['days'] = $this->gettext('forbiddenchars');
+                    break;
+                }
+
+                $this->form['actions'][$i]['type'] = $type;
+                $i++;
+            }
+
+            if (!$this->errors) {
+                // zapis skryptu
+                if (!isset($this->script[$fid])) {
+                    $fid = $this->sieve->script->add_rule($this->form);
+                    $new = true;
+                } else
+                    $fid = $this->sieve->script->update_rule($fid, $this->form);
+
+                if ($fid !== false)
+                    $save = $this->sieve->save();
+
+                if ($save && $fid !== false) {
+                    $this->rc->output->show_message('managesieve.filtersaved', 'confirmation');
+                    $this->rc->output->add_script(
+                        sprintf("rcmail.managesieve_updatelist('%s', '%s', %d, %d);",
+                            isset($new) ? 'add' : 'update', Q($this->form['name']),
+                            $fid, $this->form['disabled']),
+                        'foot');
+                }
+                else {
+                    $this->rc->output->show_message('managesieve.filtersaveerror', 'error');
+//                  $this->rc->output->send();
+                }
+            }
+        }
 
-    // Handle user requests
-    if ($action = get_input_value('_act', RCUBE_INPUT_GPC))
+        $this->managesieve_send();
+    }
+
+    private function managesieve_send()
     {
-      $fid = (int) get_input_value('_fid', RCUBE_INPUT_GET);
-
-      if ($action=='up' && !$error)
-      {
-        if ($fid && isset($this->script[$fid]) && isset($this->script[$fid-1]))
-        {
-          if ($this->sieve->script->update_rule($fid, $this->script[$fid-1]) !== false
-               && $this->sieve->script->update_rule($fid-1, $this->script[$fid]) !== false)
-           $result = $this->sieve->save();
-      
-          if ($result) {
-//          $this->rc->output->show_message('managesieve.filtersaved', 'confirmation');
-           $this->rc->output->command('managesieve_updatelist', 'up', '', $fid);
-          } else
-            $this->rc->output->show_message('managesieve.filtersaveerror', 'error');
+        // Handle form action
+        if (isset($_GET['_framed']) || isset($_POST['_framed'])) {
+            if (isset($_GET['_newset']) || isset($_POST['_newset'])) {
+                $this->rc->output->send('managesieve.setedit');
+            }
+            else {
+                $this->rc->output->send('managesieve.filteredit');
+            }
+        } else {
+            $this->rc->output->set_pagetitle($this->gettext('filters'));
+            $this->rc->output->send('managesieve.managesieve');
         }
-      }
-      elseif ($action=='down' && !$error)
-      {
-        if (isset($this->script[$fid]) && isset($this->script[$fid+1]))
-        {
-          if ($this->sieve->script->update_rule($fid, $this->script[$fid+1]) !== false
-               && $this->sieve->script->update_rule($fid+1, $this->script[$fid]) !== false)
-           $result = $this->sieve->save();
-      
-          if ($result) {
-//          $this->rc->output->show_message('managesieve.filtersaved', 'confirmation');
-           $this->rc->output->command('managesieve_updatelist', 'down', '', $fid);
-          } else
-            $this->rc->output->show_message('managesieve.filtersaveerror', 'error');
+    }
+
+    // return the filters list as HTML table
+    function filters_list($attrib)
+    {
+        // add id to message list table if not specified
+        if (!strlen($attrib['id']))
+            $attrib['id'] = 'rcmfilterslist';
+
+        // define list of cols to be displayed
+        $a_show_cols = array('managesieve.filtername');
+
+        foreach($this->script as $idx => $filter)
+            $result[] = array(
+                'managesieve.filtername' => $filter['name'],
+                'id' => $idx,
+                'class' => $filter['disabled'] ? 'disabled' : '',
+            );
+
+        // create XHTML table
+        $out = rcube_table_output($attrib, $result, $a_show_cols, 'id');
+
+        // set client env
+        $this->rc->output->add_gui_object('filterslist', $attrib['id']);
+        $this->rc->output->include_script('list.js');
+
+        // add some labels to client
+        $this->rc->output->add_label('managesieve.filterdeleteconfirm');
+
+        return $out;
+    }
+
+    // return the filters list as <SELECT>
+    function filtersets_list($attrib)
+    {
+        // add id to message list table if not specified
+        if (!strlen($attrib['id']))
+            $attrib['id'] = 'rcmfiltersetslist';
+
+        $list = $this->sieve->get_scripts();
+        $active = $this->sieve->get_active();
+
+        $select = new html_select(array('name' => '_set', 'id' => $attrib['id'],
+            'onchange' => 'rcmail.managesieve_set()'));
+
+        if ($list) {
+            asort($list, SORT_LOCALE_STRING);
+
+            foreach ($list as $set)
+                $select->add($set . ($set == $active ? ' ('.$this->gettext('active').')' : ''), $set);
         }
-      }
-      elseif ($action=='delete' && !$error)
-      {
-        if (isset($this->script[$fid]))
-        {
-          if ($this->sieve->script->delete_rule($fid))
-            $result = $this->sieve->save();
-
-          if (!$result)
-            $this->rc->output->show_message('managesieve.filterdeleteerror', 'error');
-          else {
-           $this->rc->output->show_message('managesieve.filterdeleted', 'confirmation');
-           $this->rc->output->command('managesieve_updatelist', 'delete', '', $fid);
-          }
+
+        $out = $select->show($this->sieve->current);
+
+        // set client env
+        $this->rc->output->add_gui_object('filtersetslist', $attrib['id']);
+        $this->rc->output->add_label(
+            'managesieve.setdeleteconfirm',
+            'managesieve.active',
+            'managesieve.filtersetact',
+            'managesieve.filtersetdeact'
+        );
+
+        return $out;
+    }
+
+    function filter_frame($attrib)
+    {
+        if (!$attrib['id'])
+            $attrib['id'] = 'rcmfilterframe';
+
+        $attrib['name'] = $attrib['id'];
+
+        $this->rc->output->set_env('contentframe', $attrib['name']);
+        $this->rc->output->set_env('blankpage', $attrib['src'] ?
+        $this->rc->output->abs_url($attrib['src']) : 'program/blank.gif');
+
+        return html::tag('iframe', $attrib);
+    }
+
+    function filterset_form($attrib)
+    {
+        if (!$attrib['id'])
+            $attrib['id'] = 'rcmfiltersetform';
+
+        $out = '<form name="filtersetform" action="./" method="post" enctype="multipart/form-data">'."\n";
+
+        $hiddenfields = new html_hiddenfield(array('name' => '_task', 'value' => $this->rc->task));
+        $hiddenfields->add(array('name' => '_action', 'value' => 'plugin.managesieve-save'));
+        $hiddenfields->add(array('name' => '_framed', 'value' => ($_POST['_framed'] || $_GET['_framed'] ? 1 : 0)));
+        $hiddenfields->add(array('name' => '_newset', 'value' => 1));
+
+        $out .= $hiddenfields->show();
+
+        $name     = get_input_value('_name', RCUBE_INPUT_POST);
+        $copy     = get_input_value('_copy', RCUBE_INPUT_POST);
+        $selected = get_input_value('_from', RCUBE_INPUT_POST);
+
+        // filter set name input
+        $input_name = new html_inputfield(array('name' => '_name', 'id' => '_name', 'size' => 30,
+            'class' => ($this->errors['name'] ? 'error' : '')));
+
+        $out .= sprintf('<label for="%s"><b>%s:</b></label> %s<br /><br />',
+            '_name', Q($this->gettext('filtersetname')), $input_name->show($name));
+
+        $out .="\n<fieldset class=\"itemlist\"><legend>" . $this->gettext('filters') . ":</legend>\n";
+        $out .= '<input type="radio" id="from_none" name="_from" value="none"'
+            .(!$selected || $selected=='none' ? ' checked="checked"' : '').'></input>';
+        $out .= sprintf('<label for="%s">%s</label> ', 'from_none', Q($this->gettext('none')));
+
+        // filters set list
+        $list   = $this->sieve->get_scripts();
+        $active = $this->sieve->get_active();
+
+        $select = new html_select(array('name' => '_copy', 'id' => '_copy'));
+
+        if (is_array($list)) {
+            asort($list, SORT_LOCALE_STRING);
+
+            foreach ($list as $set)
+                $select->add($set . ($set == $active ? ' ('.$this->gettext('active').')' : ''), $set);
+
+            $out .= '<br /><input type="radio" id="from_set" name="_from" value="set"'
+                .($selected=='set' ? ' checked="checked"' : '').'></input>';
+            $out .= sprintf('<label for="%s">%s:</label> ', 'from_set', Q($this->gettext('fromset')));
+            $out .= $select->show($copy);
         }
-      }
-      elseif ($action=='ruleadd')
-      {
-        $rid = get_input_value('_rid', RCUBE_INPUT_GPC);
-        $id = $this->genid();
-        $content = $this->rule_div($fid, $id, false);
-
-        $this->rc->output->command('managesieve_rulefill', $content, $id, $rid);
-      }
-      elseif ($action=='actionadd')
-      {
-        $aid = get_input_value('_aid', RCUBE_INPUT_GPC);
-        $id = $this->genid();
-        $content = $this->action_div($fid, $id, false);
-    
-        $this->rc->output->command('managesieve_actionfill', $content, $id, $aid);
-      }
-
-      $this->rc->output->send();
+
+        // script upload box
+        $upload = new html_inputfield(array('name' => '_file', 'id' => '_file', 'size' => 30,
+            'type' => 'file', 'class' => ($this->errors['name'] ? 'error' : '')));
+
+        $out .= '<br /><input type="radio" id="from_file" name="_from" value="file"'
+            .($selected=='file' ? ' checked="checked"' : '').'></input>';
+        $out .= sprintf('<label for="%s">%s:</label> ', 'from_file', Q($this->gettext('fromfile')));
+        $out .= $upload->show();
+        $out .= '</fieldset>';
+
+        $this->rc->output->add_gui_object('sieveform', 'filtersetform');
+
+        return $out;
     }
 
-    $this->managesieve_send();
-  }
 
-  function managesieve_save()
-  {
-    // Init plugin and handle managesieve connection
-    $error = $this->managesieve_start();
+    function filter_form($attrib)
+    {
+        if (!$attrib['id'])
+            $attrib['id'] = 'rcmfilterform';
+
+        $fid = get_input_value('_fid', RCUBE_INPUT_GPC);
+        $scr = isset($this->form) ? $this->form : $this->script[$fid];
+
+        $hiddenfields = new html_hiddenfield(array('name' => '_task', 'value' => $this->rc->task));
+        $hiddenfields->add(array('name' => '_action', 'value' => 'plugin.managesieve-save'));
+        $hiddenfields->add(array('name' => '_framed', 'value' => ($_POST['_framed'] || $_GET['_framed'] ? 1 : 0)));
+        $hiddenfields->add(array('name' => '_fid', 'value' => $fid));
+
+        $out = '<form name="filterform" action="./" method="post">'."\n";
+        $out .= $hiddenfields->show();
+
+        // 'any' flag
+        if (sizeof($scr['tests']) == 1 && $scr['tests'][0]['test'] == 'true' && !$scr['tests'][0]['not'])
+            $any = true;
+
+        // filter name input
+        $field_id = '_name';
+        $input_name = new html_inputfield(array('name' => '_name', 'id' => $field_id, 'size' => 30,
+            'class' => ($this->errors['name'] ? 'error' : '')));
+
+        if ($this->errors['name'])
+            $this->add_tip($field_id, $this->errors['name'], true);
+
+        if (isset($scr))
+            $input_name = $input_name->show($scr['name']);
+        else
+            $input_name = $input_name->show();
+
+        $out .= sprintf("\n<label for=\"%s\"><b>%s:</b></label> %s<br /><br />\n",
+            $field_id, Q($this->gettext('filtername')), $input_name);
+
+        $out .= '<fieldset><legend>' . Q($this->gettext('messagesrules')) . "</legend>\n";
+
+        // any, allof, anyof radio buttons
+        $field_id = '_allof';
+        $input_join = new html_radiobutton(array('name' => '_join', 'id' => $field_id, 'value' => 'allof',
+            'onclick' => 'rule_join_radio(\'allof\')', 'class' => 'radio'));
+
+        if (isset($scr) && !$any)
+            $input_join = $input_join->show($scr['join'] ? 'allof' : '');
+        else
+            $input_join = $input_join->show();
+
+        $out .= sprintf("%s<label for=\"%s\">%s</label>&nbsp;\n",
+            $input_join, $field_id, Q($this->gettext('filterallof')));
+
+        $field_id = '_anyof';
+        $input_join = new html_radiobutton(array('name' => '_join', 'id' => $field_id, 'value' => 'anyof',
+            'onclick' => 'rule_join_radio(\'anyof\')', 'class' => 'radio'));
+
+        if (isset($scr) && !$any)
+            $input_join = $input_join->show($scr['join'] ? '' : 'anyof');
+        else
+            $input_join = $input_join->show('anyof'); // default
 
-    // add/edit action
-    if (isset($_POST['_name']))
+        $out .= sprintf("%s<label for=\"%s\">%s</label>\n",
+            $input_join, $field_id, Q($this->gettext('filteranyof')));
+
+        $field_id = '_any';
+        $input_join = new html_radiobutton(array('name' => '_join', 'id' => $field_id, 'value' => 'any',
+            'onclick' => 'rule_join_radio(\'any\')', 'class' => 'radio'));
+
+        $input_join = $input_join->show($any ? 'any' : '');
+
+        $out .= sprintf("%s<label for=\"%s\">%s</label>\n",
+            $input_join, $field_id, Q($this->gettext('filterany')));
+
+        $rows_num = isset($scr) ? sizeof($scr['tests']) : 1;
+
+        $out .= '<div id="rules"'.($any ? ' style="display: none"' : '').'>';
+        for ($x=0; $x<$rows_num; $x++)
+            $out .= $this->rule_div($fid, $x);
+        $out .= "</div>\n";
+
+        $out .= "</fieldset>\n";
+
+        // actions
+        $out .= '<fieldset><legend>' . Q($this->gettext('messagesactions')) . "</legend>\n";
+
+        $rows_num = isset($scr) ? sizeof($scr['actions']) : 1;
+
+        $out .= '<div id="actions">';
+        for ($x=0; $x<$rows_num; $x++)
+            $out .= $this->action_div($fid, $x);
+        $out .= "</div>\n";
+
+        $out .= "</fieldset>\n";
+
+        $this->print_tips();
+
+        if ($scr['disabled']) {
+            $this->rc->output->set_env('rule_disabled', true);
+        }
+        $this->rc->output->add_label(
+            'managesieve.ruledeleteconfirm',
+            'managesieve.actiondeleteconfirm'
+        );
+        $this->rc->output->add_gui_object('sieveform', 'filterform');
+
+        return $out;
+    }
+
+    function rule_div($fid, $id, $div=true)
     {
-      $name = trim(get_input_value('_name', RCUBE_INPUT_POST));
-      $fid = trim(get_input_value('_fid', RCUBE_INPUT_POST));
-      $join = trim(get_input_value('_join', RCUBE_INPUT_POST));
-  
-      // and arrays
-      $headers = $_POST['_header'];
-      $cust_headers = $_POST['_custom_header'];
-      $ops = $_POST['_rule_op'];
-      $sizeops = $_POST['_rule_size_op'];
-      $sizeitems = $_POST['_rule_size_item'];
-      $sizetargets = $_POST['_rule_size_target'];
-      $targets = $_POST['_rule_target'];
-      $act_types = $_POST['_action_type'];
-      $mailboxes = $_POST['_action_mailbox'];
-      $act_targets = $_POST['_action_target'];
-      $area_targets = $_POST['_action_target_area'];
-      $reasons = $_POST['_action_reason'];
-      $addresses = $_POST['_action_addresses'];
-      $days = $_POST['_action_days'];
-
-      // we need a "hack" for radiobuttons
-      foreach ($sizeitems as $item)
-       $items[] = $item;
-
-      $this->form['join'] = $join=='allof' ? true : false;
-      $this->form['name'] = $name;
-      $this->form['tests'] = array();
-      $this->form['actions'] = array();
-
-      if ($name == '')
-       $this->errors['name'] = $this->gettext('cannotbeempty');
-      else
-       foreach($this->script as $idx => $rule)
-          if($rule['name'] == $name && $idx != $fid) {
-           $this->errors['name'] = $this->gettext('ruleexist');
-             break;
-          }
-      
-      $i = 0;
-      // rules
-      if ($join == 'any')
-      {
-       $this->form['tests'][0]['test'] = 'true';
-      }
-      else foreach($headers as $idx => $header)
-      {
-       $header = $this->strip_value($header);
-       $target = $this->strip_value($targets[$idx]);
-       $op = $this->strip_value($ops[$idx]);
-
-       // normal header
-       if (in_array($header, $this->headers))
-       {
-          if(preg_match('/^not/', $op))
-           $this->form['tests'][$i]['not'] = true;
-          $type = preg_replace('/^not/', '', $op);
-
-          if ($type == 'exists')
-         {
-           $this->form['tests'][$i]['test'] = 'exists';
-           $this->form['tests'][$i]['arg'] = $header;
-         }
-          else
-          {    
-           $this->form['tests'][$i]['type'] = $type;
-           $this->form['tests'][$i]['test'] = 'header';
-           $this->form['tests'][$i]['arg1'] = $header;
-           $this->form['tests'][$i]['arg2'] = $target;
-
-           if ($target == '')
-              $this->errors['tests'][$i]['target'] = $this->gettext('cannotbeempty');
-         }
-       }
-       else
-          switch ($header)
-          {
-           case 'size':
-             $sizeop = $this->strip_value($sizeops[$idx]);
-             $sizeitem = $this->strip_value($items[$idx]);
-             $sizetarget = $this->strip_value($sizetargets[$idx]);
-
-              $this->form['tests'][$i]['test'] = 'size';
-              $this->form['tests'][$i]['type'] = $sizeop;
-              $this->form['tests'][$i]['arg'] = $sizetarget.$sizeitem;
-
-             if (!preg_match('/^[0-9]+(K|M|G)*$/i', $sizetarget))
-               $this->errors['tests'][$i]['sizetarget'] = $this->gettext('wrongformat');
-             break;
-           case '...':
-              $cust_header = $headers = $this->strip_value($cust_headers[$idx]);
-
-              if(preg_match('/^not/', $op))
-               $this->form['tests'][$i]['not'] = true;
-             $type = preg_replace('/^not/', '', $op);
-
-              if ($cust_header == '')
-               $this->errors['tests'][$i]['header'] = $this->gettext('cannotbeempty');
-              else {
-               $headers = preg_split('/[\s,]+/', $cust_header, -1, PREG_SPLIT_NO_EMPTY);
-               
-               if (!count($headers))
-                 $this->errors['tests'][$i]['header'] = $this->gettext('cannotbeempty');
-               else {
-                 foreach ($headers as $hr)
-                   if (!preg_match('/^[a-z0-9-]+$/i', $hr))
-                     $this->errors['tests'][$i]['header'] = $this->gettext('forbiddenchars');
+        $rule     = isset($this->form) ? $this->form['tests'][$id] : $this->script[$fid]['tests'][$id];
+        $rows_num = isset($this->form) ? sizeof($this->form['tests']) : sizeof($this->script[$fid]['tests']);
+
+        $out = $div ? '<div class="rulerow" id="rulerow' .$id .'">'."\n" : '';
+
+        $out .= '<table><tr><td class="rowactions">';
+
+        // headers select
+        $select_header = new html_select(array('name' => "_header[]", 'id' => 'header'.$id,
+            'onchange' => 'header_select(' .$id .')'));
+        foreach($this->headers as $name => $val)
+            $select_header->add(Q($this->gettext($name)), Q($val));
+        $select_header->add(Q($this->gettext('size')), 'size');
+        $select_header->add(Q($this->gettext('...')), '...');
+
+        // TODO: list arguments
+
+        if ((isset($rule['test']) && $rule['test'] == 'header')
+            && !is_array($rule['arg1']) && in_array($rule['arg1'], $this->headers))
+            $out .= $select_header->show($rule['arg1']);
+        else if ((isset($rule['test']) && $rule['test'] == 'exists')
+            && !is_array($rule['arg']) && in_array($rule['arg'], $this->headers))
+            $out .= $select_header->show($rule['arg']);
+        else if (isset($rule['test']) && $rule['test'] == 'size')
+            $out .= $select_header->show('size');
+        else if (isset($rule['test']) && $rule['test'] != 'true')
+            $out .= $select_header->show('...');
+        else
+            $out .= $select_header->show();
+
+        $out .= '</td><td class="rowtargets">';
+
+        if ((isset($rule['test']) && $rule['test'] == 'header')
+            && (is_array($rule['arg1']) || !in_array($rule['arg1'], $this->headers)))
+            $custom = is_array($rule['arg1']) ? implode(', ', $rule['arg1']) : $rule['arg1'];
+        else if ((isset($rule['test']) && $rule['test'] == 'exists')
+            && (is_array($rule['arg']) || !in_array($rule['arg'], $this->headers)))
+            $custom = is_array($rule['arg']) ? implode(', ', $rule['arg']) : $rule['arg'];
+
+        $out .= '<div id="custom_header' .$id. '" style="display:' .(isset($custom) ? 'inline' : 'none'). '">
+            <input type="text" name="_custom_header[]" id="custom_header_i'.$id.'" '
+            . $this->error_class($id, 'test', 'header', 'custom_header_i')
+            .' value="' .Q($custom). '" size="20" />&nbsp;</div>' . "\n";
+
+        // matching type select (operator)
+        $select_op = new html_select(array('name' => "_rule_op[]", 'id' => 'rule_op'.$id,
+            'style' => 'display:' .($rule['test']!='size' ? 'inline' : 'none'),
+            'onchange' => 'rule_op_select('.$id.')'));
+        $select_op->add(Q($this->gettext('filtercontains')), 'contains');
+        $select_op->add(Q($this->gettext('filternotcontains')), 'notcontains');
+        $select_op->add(Q($this->gettext('filteris')), 'is');
+        $select_op->add(Q($this->gettext('filterisnot')), 'notis');
+        $select_op->add(Q($this->gettext('filterexists')), 'exists');
+        $select_op->add(Q($this->gettext('filternotexists')), 'notexists');
+//      $select_op->add(Q($this->gettext('filtermatches')), 'matches');
+//      $select_op->add(Q($this->gettext('filternotmatches')), 'notmatches');
+               if (in_array('relational', $this->exts)) {
+                       $select_op->add(Q($this->gettext('countisgreaterthan')), 'count-gt');
+                       $select_op->add(Q($this->gettext('countisgreaterthanequal')), 'count-ge');
+                       $select_op->add(Q($this->gettext('countislessthan')), 'count-lt');
+                       $select_op->add(Q($this->gettext('countislessthanequal')), 'count-le');
+                       $select_op->add(Q($this->gettext('countequals')), 'count-eq');
+                       $select_op->add(Q($this->gettext('countnotequals')), 'count-ne');
+                       $select_op->add(Q($this->gettext('valueisgreaterthan')), 'value-gt');
+                       $select_op->add(Q($this->gettext('valueisgreaterthanequal')), 'value-ge');
+                       $select_op->add(Q($this->gettext('valueislessthan')), 'value-lt');
+                       $select_op->add(Q($this->gettext('valueislessthanequal')), 'value-le');
+                       $select_op->add(Q($this->gettext('valueequals')), 'value-eq');
+                       $select_op->add(Q($this->gettext('valuenotequals')), 'value-ne');
                }
-             }
-             
-             if (empty($this->errors['tests'][$i]['header']))
-               $cust_header = (is_array($headers) && count($headers) == 1) ? $headers[0] : $headers;
-              
-             if ($type == 'exists')
-             {
-               $this->form['tests'][$i]['test'] = 'exists';
-               $this->form['tests'][$i]['arg'] = $cust_header;
-             }
-              else
-             { 
-               $this->form['tests'][$i]['test'] = 'header';
-               $this->form['tests'][$i]['type'] = $type;
-               $this->form['tests'][$i]['arg1'] = $cust_header;
-               $this->form['tests'][$i]['arg2'] = $target;
-
-               if ($target == '')
-                 $this->errors['tests'][$i]['target'] = $this->gettext('cannotbeempty');
-             }
-           break;
-          }
-       $i++;
-      }
-  
-      $i = 0;
-      // actions
-      foreach($act_types as $idx => $type)
-      {
-       $type = $this->strip_value($type);
-       $target = $this->strip_value($act_targets[$idx]);
-  
-       $this->form['actions'][$i]['type'] = $type;
-    
-       switch ($type)
-       {
-          case 'fileinto':
-           $mailbox = $this->strip_value($mailboxes[$idx]);
-           $this->form['actions'][$i]['target'] = $mailbox;
-          break;
-          case 'reject':
-          case 'ereject':
-           $target = $this->strip_value($area_targets[$idx]);
-           $this->form['actions'][$i]['target'] = str_replace("\r\n", "\n", $target);
-
- //         if ($target == '')
-//             $this->errors['actions'][$i]['targetarea'] = $this->gettext('cannotbeempty');
-          break;
-          case 'redirect':
-           $this->form['actions'][$i]['target'] = $target;
-
-           if ($this->form['actions'][$i]['target'] == '')
-             $this->errors['actions'][$i]['target'] = $this->gettext('cannotbeempty');
-           else if (!$this->check_email($this->form['actions'][$i]['target']))
-             $this->errors['actions'][$i]['target'] = $this->gettext('noemailwarning');
-         break;
-          case 'vacation':
-           $reason = $this->strip_value($reasons[$idx]);
-           $this->form['actions'][$i]['reason'] = str_replace("\r\n", "\n", $reason);
-           $this->form['actions'][$i]['days'] = $days[$idx];
-           $this->form['actions'][$i]['addresses'] = explode(',', $addresses[$idx]);
-// @TODO: vacation :subject, :mime, :from, :handle
 
-           if ($this->form['actions'][$i]['addresses']) {
-             foreach($this->form['actions'][$i]['addresses'] as $aidx => $address) {
-               $address = trim($address);
-               if (!$address)
-                 unset($this->form['actions'][$i]['addresses'][$aidx]);
-               else if(!$this->check_email($address)) {
-                 $this->errors['actions'][$i]['addresses'] = $this->gettext('noemailwarning');
-                 break;
-               } else
-                 $this->form['actions'][$i]['addresses'][$aidx] = $address;
-             }
-           }
-        
-           if ($this->form['actions'][$i]['reason'] == '')
-             $this->errors['actions'][$i]['reason'] = $this->gettext('cannotbeempty');
-           if ($this->form['actions'][$i]['days'] && !preg_match('/^[0-9]+$/', $this->form['actions'][$i]['days']))
-             $this->errors['actions'][$i]['days'] = $this->gettext('forbiddenchars');
-          break;
-       }
-  
-        $i++;
-      }
-
-      if (!$this->errors)
-      {
-        // zapis skryptu
-        if (!isset($this->script[$fid])) {
-         $fid = $this->sieve->script->add_rule($this->form);
-          $new = true;
-       } else
-          $fid = $this->sieve->script->update_rule($fid, $this->form);
-
-       if ($fid !== false)
-          $save = $this->sieve->save();
-
-       if ($save && $fid !== false)
-       {
-         $this->rc->output->show_message('managesieve.filtersaved', 'confirmation');
-         $this->rc->output->add_script(sprintf("rcmail.managesieve_updatelist('%s', '%s', %d);",
-           isset($new) ? 'add' : 'update', $this->form['name'], $fid), 'foot');
-//       $this->rc->output->command('managesieve_updatelist', isset($new) ? 'add' : 'update', $this->form['name'], $fid);
-//       $this->rc->output->send();
-       }
-       else
-       {
-         $this->rc->output->show_message('managesieve.filtersaveerror', 'error');
-//       $this->rc->output->send();
-       }
-      }
+        // target input (TODO: lists)
+
+        if ($rule['test'] == 'header') {
+            $out .= $select_op->show(($rule['not'] ? 'not' : '').$rule['type']);
+            $target = $rule['arg2'];
+        }
+        else if ($rule['test'] == 'size') {
+            $out .= $select_op->show();
+            if (preg_match('/^([0-9]+)(K|M|G)*$/', $rule['arg'], $matches)) {
+                $sizetarget = $matches[1];
+                $sizeitem = $matches[2];
+            }
+        }
+        else {
+            $out .= $select_op->show(($rule['not'] ? 'not' : '').$rule['test']);
+            $target = '';
+        }
+
+        $out .= '<input type="text" name="_rule_target[]" id="rule_target' .$id. '"
+            value="' .Q($target). '" size="20" ' . $this->error_class($id, 'test', 'target', 'rule_target')
+            . ' style="display:' . ($rule['test']!='size' && $rule['test'] != 'exists' ? 'inline' : 'none') . '" />'."\n";
+
+        $select_size_op = new html_select(array('name' => "_rule_size_op[]", 'id' => 'rule_size_op'.$id));
+        $select_size_op->add(Q($this->gettext('filterunder')), 'under');
+        $select_size_op->add(Q($this->gettext('filterover')), 'over');
+
+        $out .= '<div id="rule_size' .$id. '" style="display:' . ($rule['test']=='size' ? 'inline' : 'none') .'">';
+        $out .= $select_size_op->show($rule['test']=='size' ? $rule['type'] : '');
+        $out .= '<input type="text" name="_rule_size_target[]" id="rule_size_i'.$id.'" value="'.$sizetarget.'" size="10" ' 
+            . $this->error_class($id, 'test', 'sizetarget', 'rule_size_i') .' />
+            <input type="radio" name="_rule_size_item['.$id.']" value=""'
+                . (!$sizeitem ? ' checked="checked"' : '') .' class="radio" />'.rcube_label('B').'
+            <input type="radio" name="_rule_size_item['.$id.']" value="K"'
+                . ($sizeitem=='K' ? ' checked="checked"' : '') .' class="radio" />'.rcube_label('KB').'
+            <input type="radio" name="_rule_size_item['.$id.']" value="M"'
+                . ($sizeitem=='M' ? ' checked="checked"' : '') .' class="radio" />'.rcube_label('MB').'
+            <input type="radio" name="_rule_size_item['.$id.']" value="G"'
+                . ($sizeitem=='G' ? ' checked="checked"' : '') .' class="radio" />'.rcube_label('GB');
+        $out .= '</div>';
+        $out .= '</td>';
+
+        // add/del buttons
+        $out .= '<td class="rowbuttons">';
+        $out .= '<input type="button" id="ruleadd' . $id .'" value="'. Q($this->gettext('add')). '"
+            onclick="rcmail.managesieve_ruleadd(' . $id .')" class="button" /> ';
+        $out .= '<input type="button" id="ruledel' . $id .'" value="'. Q($this->gettext('del')). '"
+            onclick="rcmail.managesieve_ruledel(' . $id .')" class="button' . ($rows_num<2 ? ' disabled' : '') .'"'
+            . ($rows_num<2 ? ' disabled="disabled"' : '') .' />';
+        $out .= '</td></tr></table>';
+
+        $out .= $div ? "</div>\n" : '';
+
+        return $out;
+    }
+
+    function action_div($fid, $id, $div=true)
+    {
+        $action   = isset($this->form) ? $this->form['actions'][$id] : $this->script[$fid]['actions'][$id];
+        $rows_num = isset($this->form) ? sizeof($this->form['actions']) : sizeof($this->script[$fid]['actions']);
+
+        $out = $div ? '<div class="actionrow" id="actionrow' .$id .'">'."\n" : '';
+
+        $out .= '<table><tr><td class="rowactions">';
+
+        // action select
+        $select_action = new html_select(array('name' => "_action_type[]", 'id' => 'action_type'.$id,
+            'onchange' => 'action_type_select(' .$id .')'));
+        if (in_array('fileinto', $this->exts))
+            $select_action->add(Q($this->gettext('messagemoveto')), 'fileinto');
+        if (in_array('fileinto', $this->exts) && in_array('copy', $this->exts))
+            $select_action->add(Q($this->gettext('messagecopyto')), 'fileinto_copy');
+        $select_action->add(Q($this->gettext('messageredirect')), 'redirect');
+        if (in_array('copy', $this->exts))
+            $select_action->add(Q($this->gettext('messagesendcopy')), 'redirect_copy');
+        if (in_array('reject', $this->exts))
+            $select_action->add(Q($this->gettext('messagediscard')), 'reject');
+        else if (in_array('ereject', $this->exts))
+            $select_action->add(Q($this->gettext('messagediscard')), 'ereject');
+        if (in_array('vacation', $this->exts))
+            $select_action->add(Q($this->gettext('messagereply')), 'vacation');
+        $select_action->add(Q($this->gettext('messagedelete')), 'discard');
+        $select_action->add(Q($this->gettext('rulestop')), 'stop');
+
+        $select_type = $action['type'];
+        if (in_array($action['type'], array('fileinto', 'redirect')) && $action['copy']) {
+            $select_type .= '_copy';
+        }
+
+        $out .= $select_action->show($select_type);
+        $out .= '</td>';
+
+        // actions target inputs
+        $out .= '<td class="rowtargets">';
+        // shared targets
+        $out .= '<input type="text" name="_action_target[]" id="action_target' .$id. '" '
+            .'value="' .($action['type']=='redirect' ? Q($action['target'], 'strict', false) : ''). '" size="40" '
+            .'style="display:' .($action['type']=='redirect' ? 'inline' : 'none') .'" '
+            . $this->error_class($id, 'action', 'target', 'action_target') .' />';
+        $out .= '<textarea name="_action_target_area[]" id="action_target_area' .$id. '" '
+            .'rows="3" cols="40" '. $this->error_class($id, 'action', 'targetarea', 'action_target_area')
+            .'style="display:' .(in_array($action['type'], array('reject', 'ereject')) ? 'inline' : 'none') .'">'
+            . (in_array($action['type'], array('reject', 'ereject')) ? Q($action['target'], 'strict', false) : '')
+            . "</textarea>\n";
+
+        // vacation
+        $out .= '<div id="action_vacation' .$id.'" style="display:' .($action['type']=='vacation' ? 'inline' : 'none') .'">';
+        $out .= '<span class="label">'. Q($this->gettext('vacationreason')) .'</span><br />'
+            .'<textarea name="_action_reason[]" id="action_reason' .$id. '" '
+            .'rows="3" cols="40" '. $this->error_class($id, 'action', 'reason', 'action_reason') . '>'
+            . Q($action['reason'], 'strict', false) . "</textarea>\n";
+        $out .= '<br /><span class="label">' .Q($this->gettext('vacationaddresses')) . '</span><br />'
+            .'<input type="text" name="_action_addresses[]" id="action_addr'.$id.'" '
+            .'value="' . (is_array($action['addresses']) ? Q(implode(', ', $action['addresses']), 'strict', false) : $action['addresses']) . '" size="40" '
+            . $this->error_class($id, 'action', 'addresses', 'action_addr') .' />';
+        $out .= '<br /><span class="label">' . Q($this->gettext('vacationdays')) . '</span><br />'
+            .'<input type="text" name="_action_days[]" id="action_days'.$id.'" '
+            .'value="' .Q($action['days'], 'strict', false) . '" size="2" '
+            . $this->error_class($id, 'action', 'days', 'action_days') .' />';
+        $out .= '</div>';
+
+        // mailbox select
+        $out .= '<select id="action_mailbox' .$id. '" name="_action_mailbox[]" style="display:'
+            .(!isset($action) || $action['type']=='fileinto' ? 'inline' : 'none'). '">';
+
+        $this->rc->imap_connect();
+
+        $a_folders = $this->rc->imap->list_mailboxes();
+        $delimiter = $this->rc->imap->get_hierarchy_delimiter();
+
+        // set mbox encoding
+        $mbox_encoding = $this->rc->config->get('managesieve_mbox_encoding', 'UTF7-IMAP');
+
+        if ($action['type'] == 'fileinto')
+            $mailbox = $action['target'];
+        else
+            $mailbox = '';
+
+        foreach ($a_folders as $folder) {
+            $utf7folder = $this->rc->imap->mod_mailbox($folder);
+            $names = explode($delimiter, rcube_charset_convert($folder, 'UTF7-IMAP'));
+            $name  = $names[sizeof($names)-1];
+
+            if ($replace_delimiter = $this->rc->config->get('managesieve_replace_delimiter'))
+                $utf7folder = str_replace($delimiter, $replace_delimiter, $utf7folder);
+
+            // convert to Sieve implementation encoding
+            $utf7folder = $this->mbox_encode($utf7folder, $mbox_encoding);
+
+            if ($folder_class = rcmail_folder_classname($name))
+                $foldername = $this->gettext($folder_class);
+            else
+                $foldername = $name;
+
+            $out .= sprintf('<option value="%s"%s>%s%s</option>'."\n",
+                htmlspecialchars($utf7folder),
+                ($mailbox == $utf7folder ? ' selected="selected"' : ''),
+                str_repeat('&nbsp;', 4 * (sizeof($names)-1)),
+                Q(abbreviate_string($foldername, 40 - (2 * sizeof($names)-1))));
+        }
+        $out .= '</select>';
+        $out .= '</td>';
+
+        // add/del buttons
+        $out .= '<td class="rowbuttons">';
+        $out .= '<input type="button" id="actionadd' . $id .'" value="'. Q($this->gettext('add')). '"
+            onclick="rcmail.managesieve_actionadd(' . $id .')" class="button" /> ';
+        $out .= '<input type="button" id="actiondel' . $id .'" value="'. Q($this->gettext('del')). '"
+            onclick="rcmail.managesieve_actiondel(' . $id .')" class="button' . ($rows_num<2 ? ' disabled' : '') .'"'
+            . ($rows_num<2 ? ' disabled="disabled"' : '') .' />';
+        $out .= '</td>';
+
+        $out .= '</tr></table>';
+
+        $out .= $div ? "</div>\n" : '';
+
+        return $out;
     }
 
-    $this->managesieve_send();
-  }
-
-  private function managesieve_send()
-  {
-    // Handle form action 
-    if (isset($_GET['_framed']) || isset($_POST['_framed']))
-      $this->rc->output->send('managesieve.managesieveedit');
-    else {
-      $this->rc->output->set_pagetitle($this->gettext('filters'));
-      $this->rc->output->send('managesieve.managesieve');
+    private function genid()
+    {
+        $result = intval(rcube_timer());
+        return $result;
     }
-  }
-  
-  // return the filters list as HTML table
-  function filters_list($attrib)
-  {
-    // add id to message list table if not specified
-    if (!strlen($attrib['id']))
-      $attrib['id'] = 'rcmfilterslist';
-  
-    // define list of cols to be displayed
-    $a_show_cols = array('managesieve.filtername');
-
-    foreach($this->script as $idx => $filter)
-      $result[] = array('managesieve.filtername' => $filter['name'], 'id' => $idx);
-    
-    // create XHTML table
-    $out = rcube_table_output($attrib, $result, $a_show_cols, 'id');
-
-    // set client env
-    $this->rc->output->add_gui_object('filterslist', $attrib['id']);
-    $this->rc->output->include_script('list.js');
-  
-    // add some labels to client
-    $this->rc->output->add_label('managesieve.filterconfirmdelete');
-  
-    return $out;
-  }
-
-  function filter_frame($attrib)
-  {
-    if (!$attrib['id'])
-      $attrib['id'] = 'rcmfilterframe';
-    
-    $attrib['name'] = $attrib['id'];
-
-    $this->rc->output->set_env('contentframe', $attrib['name']);
-    $this->rc->output->set_env('blankpage', $attrib['src'] ? 
-       $this->rc->output->abs_url($attrib['src']) : 'program/blank.gif');
-
-    return html::tag('iframe', $attrib);
-  }
-
-
-  function filter_form($attrib)
-  {
-    if (!$attrib['id'])
-      $attrib['id'] = 'rcmfilterform';
-
-    $fid = get_input_value('_fid', RCUBE_INPUT_GPC);
-    $scr = isset($this->form) ? $this->form : $this->script[$fid];
-
-    $hiddenfields = new html_hiddenfield(array('name' => '_task', 'value' => $this->rc->task));
-    $hiddenfields->add(array('name' => '_action', 'value' => 'plugin.managesieve-save'));
-    $hiddenfields->add(array('name' => '_framed', 'value' => ($_POST['_framed'] || $_GET['_framed'] ? 1 : 0)));
-    $hiddenfields->add(array('name' => '_fid', 'value' => $fid));
-
-    $out = '<form name="filterform" action="./" method="post">'."\n";
-    $out .= $hiddenfields->show();
-
-    // 'any' flag 
-    if (sizeof($scr['tests']) == 1 && $scr['tests'][0]['test'] == 'true' && !$scr['tests'][0]['not'])
-      $any = true; 
-
-    // filter name input
-    $field_id = '_name';
-    $input_name = new html_inputfield(array('name' => '_name', 'id' => $field_id, 'size' => 30,
-       'class' => ($this->errors['name'] ? 'error' : '')));
-
-    if (isset($scr))
-      $input_name = $input_name->show($scr['name']);
-    else
-      $input_name = $input_name->show();
-
-    $out .= sprintf("\n<label for=\"%s\"><b>%s:</b></label> %s<br /><br />\n",
-               $field_id, Q($this->gettext('filtername')), $input_name);
-
-    $out .= '<fieldset><legend>' . Q($this->gettext('messagesrules')) . "</legend>\n";
-
-    // any, allof, anyof radio buttons
-    $field_id = '_allof';
-    $input_join = new html_radiobutton(array('name' => '_join', 'id' => $field_id, 'value' => 'allof',
-       'onclick' => 'rule_join_radio(\'allof\')', 'class' => 'radio'));
-
-    if (isset($scr) && !$any)
-      $input_join = $input_join->show($scr['join'] ? 'allof' : '');
-    else
-      $input_join = $input_join->show();
-
-    $out .= sprintf("%s<label for=\"%s\">%s</label>&nbsp;\n",
-               $input_join, $field_id, Q($this->gettext('filterallof')));
-
-    $field_id = '_anyof';
-    $input_join = new html_radiobutton(array('name' => '_join', 'id' => $field_id, 'value' => 'anyof',
-       'onclick' => 'rule_join_radio(\'anyof\')', 'class' => 'radio'));
-
-    if (isset($scr) && !$any)
-      $input_join = $input_join->show($scr['join'] ? '' : 'anyof');
-    else
-      $input_join = $input_join->show('anyof'); // default
-
-    $out .= sprintf("%s<label for=\"%s\">%s</label>\n",
-               $input_join, $field_id, Q($this->gettext('filteranyof')));
-
-    $field_id = '_any';
-    $input_join = new html_radiobutton(array('name' => '_join', 'id' => $field_id, 'value' => 'any',
-       'onclick' => 'rule_join_radio(\'any\')', 'class' => 'radio'));
-
-    $input_join = $input_join->show($any ? 'any' : '');
-
-    $out .= sprintf("%s<label for=\"%s\">%s</label>\n",
-               $input_join, $field_id, Q($this->gettext('filterany')));
-
-    $rows_num = isset($scr) ? sizeof($scr['tests']) : 1;
-
-    $out .= '<div id="rules"'.($any ? ' style="display: none"' : '').'>';
-    for ($x=0; $x<$rows_num; $x++)
-      $out .= $this->rule_div($fid, $x);
-    $out .= "</div>\n";
-
-    $out .= "</fieldset>\n";
-
-    // actions
-    $out .= '<fieldset><legend>' . Q($this->gettext('messagesactions')) . "</legend>\n";
-
-    $rows_num = isset($scr) ? sizeof($scr['actions']) : 1;
-
-    $out .= '<div id="actions">';
-    for ($x=0; $x<$rows_num; $x++)
-      $out .= $this->action_div($fid, $x);
-    $out .= "</div>\n";
-
-    $out .= "</fieldset>\n";
-
-    $this->rc->output->add_label('managesieve.ruledeleteconfirm');
-    $this->rc->output->add_label('managesieve.actiondeleteconfirm');
-    $this->rc->output->add_gui_object('sieveform', 'filterform');
-
-    return $out;
-  }
-
-  function rule_div($fid, $id, $div=true)
-  {
-    $rule = isset($this->form) ? $this->form['tests'][$id] : $this->script[$fid]['tests'][$id];
-    $rows_num = isset($this->form) ? sizeof($this->form['tests']) : sizeof($this->script[$fid]['tests']);
-  
-    $out = $div ? '<div class="rulerow" id="rulerow' .$id .'">'."\n" : '';
-
-    $out .= '<table><tr><td class="rowactions">';
-
-    // headers select
-    $select_header = new html_select(array('name' => "_header[]", 'id' => 'header'.$id,
-       'onchange' => 'header_select(' .$id .')'));
-    foreach($this->headers as $name => $val)
-      $select_header->add(Q($this->gettext($name)), Q($val));
-    $select_header->add(Q($this->gettext('size')), 'size');
-    $select_header->add(Q($this->gettext('...')), '...');
-
-    // TODO: list arguments
-
-    if ((isset($rule['test']) && $rule['test'] == 'header')
-       && !is_array($rule['arg1']) && in_array($rule['arg1'], $this->headers))
-      $out .= $select_header->show($rule['arg1']);
-    elseif ((isset($rule['test']) && $rule['test'] == 'exists')
-       && !is_array($rule['arg']) && in_array($rule['arg'], $this->headers))
-      $out .= $select_header->show($rule['arg']);
-    elseif (isset($rule['test']) && $rule['test'] == 'size')
-      $out .= $select_header->show('size');
-    elseif (isset($rule['test']) && $rule['test'] != 'true')
-      $out .= $select_header->show('...');
-    else
-      $out .= $select_header->show();
-
-    $out .= '</td><td class="rowtargets">';
-
-    if ((isset($rule['test']) && $rule['test'] == 'header')
-       && (is_array($rule['arg1']) || !in_array($rule['arg1'], $this->headers)))
-      $custom = is_array($rule['arg1']) ? implode(', ', $rule['arg1']) : $rule['arg1'];
-    elseif ((isset($rule['test']) && $rule['test'] == 'exists')
-       && (is_array($rule['arg']) || !in_array($rule['arg'], $this->headers)))
-      $custom = is_array($rule['arg']) ? implode(', ', $rule['arg']) : $rule['arg'];
-    
-    $out .= '<div id="custom_header' .$id. '" style="display:' .(isset($custom) ? 'inline' : 'none'). '">
-       <input type="text" name="_custom_header[]" '. $this->error_class($id, 'test', 'header')
-       .' value="' .Q($custom). '" size="20" />&nbsp;</div>' . "\n";
-  
-    // matching type select (operator)
-    $select_op = new html_select(array('name' => "_rule_op[]", 'id' => 'rule_op'.$id, 
-       'style' => 'display:' .($rule['test']!='size' ? 'inline' : 'none'), 'onchange' => 'rule_op_select('.$id.')'));
-    $select_op->add(Q($this->gettext('filtercontains')), 'contains');
-    $select_op->add(Q($this->gettext('filternotcontains')), 'notcontains');
-    $select_op->add(Q($this->gettext('filteris')), 'is');
-    $select_op->add(Q($this->gettext('filterisnot')), 'notis');
-    $select_op->add(Q($this->gettext('filterexists')), 'exists');
-    $select_op->add(Q($this->gettext('filternotexists')), 'notexists');
-//    $select_op->add(Q($this->gettext('filtermatches')), 'matches');
-//    $select_op->add(Q($this->gettext('filternotmatches')), 'notmatches');
-
-    // target input (TODO: lists)
-
-    if ($rule['test'] == 'header')
+
+    private function strip_value($str, $allow_html=false)
     {
-      $out .= $select_op->show(($rule['not'] ? 'not' : '').$rule['type']);
-      $target = $rule['arg2'];
+        if (!$allow_html)
+            $str = strip_tags($str);
+
+        return trim($str);
     }
-    elseif ($rule['test'] == 'size')
+
+    private function error_class($id, $type, $target, $elem_prefix='')
     {
-      $out .= $select_op->show();
-      if(preg_match('/^([0-9]+)(K|M|G)*$/', $rule['arg'], $matches))
-      {
-       $sizetarget = $matches[1];
-       $sizeitem = $matches[2];
-      }
+        // TODO: tooltips
+        if (($type == 'test' && ($str = $this->errors['tests'][$id][$target])) ||
+            ($type == 'action' && ($str = $this->errors['actions'][$id][$target]))
+        ) {
+            $this->add_tip($elem_prefix.$id, $str, true);
+            return ' class="error"';
+        }
+
+        return '';
     }
-    else
+
+    private function mbox_encode($text, $encoding)
     {
-      $out .= $select_op->show(($rule['not'] ? 'not' : '').$rule['test']);
-      $target = '';
+        return rcube_charset_convert($text, 'UTF7-IMAP', $encoding);
     }
 
-    $out .= '<input type="text" name="_rule_target[]" id="rule_target' .$id. '" 
-       value="' .Q($target). '" size="20" ' . $this->error_class($id, 'test', 'target') 
-       . ' style="display:' . ($rule['test']!='size' && $rule['test'] != 'exists' ? 'inline' : 'none') . '" />'."\n";
-
-    $select_size_op = new html_select(array('name' => "_rule_size_op[]", 'id' => 'rule_size_op'.$id));
-    $select_size_op->add(Q($this->gettext('filterunder')), 'under');
-    $select_size_op->add(Q($this->gettext('filterover')), 'over');
-
-    $out .= '<div id="rule_size' .$id. '" style="display:' . ($rule['test']=='size' ? 'inline' : 'none') .'">';
-    $out .= $select_size_op->show($rule['test']=='size' ? $rule['type'] : '');
-    $out .= '<input type="text" name="_rule_size_target[]" value="'.$sizetarget.'" size="10" ' . $this->error_class($id, 'test', 'sizetarget') .' />
-       <input type="radio" name="_rule_size_item['.$id.']" value=""'. (!$sizeitem ? ' checked="checked"' : '') .' class="radio" />B
-       <input type="radio" name="_rule_size_item['.$id.']" value="K"'. ($sizeitem=='K' ? ' checked="checked"' : '') .' class="radio" />kB
-       <input type="radio" name="_rule_size_item['.$id.']" value="M"'. ($sizeitem=='M' ? ' checked="checked"' : '') .' class="radio" />MB
-       <input type="radio" name="_rule_size_item['.$id.']" value="G"'. ($sizeitem=='G' ? ' checked="checked"' : '') .' class="radio" />GB';
-    $out .= '</div>';
-    $out .= '</td>';
-  
-    // add/del buttons
-    $out .= '<td class="rowbuttons">';
-    $out .= '<input type="button" id="ruleadd' . $id .'" value="'. Q($this->gettext('add')). '" 
-       onclick="rcmail.managesieve_ruleadd(' . $id .')" class="button" /> ';
-    $out .= '<input type="button" id="ruledel' . $id .'" value="'. Q($this->gettext('del')). '"
-       onclick="rcmail.managesieve_ruledel(' . $id .')" class="button' . ($rows_num<2 ? ' disabled' : '') .'"'
-       . ($rows_num<2 ? ' disabled="disabled"' : '') .' />';
-    $out .= '</td></tr></table>';
-
-    $out .= $div ? "</div>\n" : '';
-        
-    return $out;
-  }
-
-  function action_div($fid, $id, $div=true)
-  {
-    $action = isset($this->form) ? $this->form['actions'][$id] : $this->script[$fid]['actions'][$id];
-    $rows_num = isset($this->form) ? sizeof($this->form['actions']) : sizeof($this->script[$fid]['actions']);
-
-    $out = $div ? '<div class="actionrow" id="actionrow' .$id .'">'."\n" : '';
-
-    $out .= '<table><tr><td class="rowactions">';
-
-    // action select
-    $select_action = new html_select(array('name' => "_action_type[]", 'id' => 'action_type'.$id,
-       'onchange' => 'action_type_select(' .$id .')'));
-    if (in_array('fileinto', $this->exts))
-      $select_action->add(Q($this->gettext('messagemoveto')), 'fileinto');
-    $select_action->add(Q($this->gettext('messageredirect')), 'redirect');
-    if (in_array('reject', $this->exts))
-      $select_action->add(Q($this->gettext('messagediscard')), 'reject');
-    elseif (in_array('ereject', $this->exts))
-      $select_action->add(Q($this->gettext('messagediscard')), 'ereject');
-    if (in_array('vacation', $this->exts))
-      $select_action->add(Q($this->gettext('messagereply')), 'vacation');
-    $select_action->add(Q($this->gettext('messagedelete')), 'discard');
-    $select_action->add(Q($this->gettext('rulestop')), 'stop');
-
-    $out .= $select_action->show($action['type']);
-    $out .= '</td>';
-
-    // actions target inputs
-    $out .= '<td class="rowtargets">';
-    // shared targets
-    $out .= '<input type="text" name="_action_target[]" id="action_target' .$id. '" '
-       .'value="' .($action['type']=='redirect' ? Q($action['target'], 'strict', false) : ''). '" size="40" '
-       .'style="display:' .($action['type']=='redirect' ? 'inline' : 'none') .'" '
-       . $this->error_class($id, 'action', 'target') .' />';
-    $out .= '<textarea name="_action_target_area[]" id="action_target_area' .$id. '" '
-       .'rows="3" cols="40" '. $this->error_class($id, 'action', 'targetarea')
-       .'style="display:' .(in_array($action['type'], array('reject', 'ereject')) ? 'inline' : 'none') .'">'
-       . (in_array($action['type'], array('reject', 'ereject')) ? Q($action['target'], 'strict', false) : '')
-       . "</textarea>\n";
-
-    // vacation
-    $out .= '<div id="action_vacation' .$id.'" style="display:' .($action['type']=='vacation' ? 'inline' : 'none') .'">';
-    $out .= '<span class="label">'. Q($this->gettext('vacationreason')) .'</span><br />'
-       .'<textarea name="_action_reason[]" id="action_reason' .$id. '" '
-       .'rows="3" cols="40" '. $this->error_class($id, 'action', 'reason') . '>'
-       . Q($action['reason'], 'strict', false) . "</textarea>\n";
-    $out .= '<br /><span class="label">' .Q($this->gettext('vacationaddresses')) . '</span><br />'
-       .'<input type="text" name="_action_addresses[]" '
-        .'value="' . (is_array($action['addresses']) ? Q(implode(', ', $action['addresses']), 'strict', false) : $action['addresses']) . '" size="40" '
-        . $this->error_class($id, 'action', 'addresses') .' />';
-    $out .= '<br /><span class="label">' . Q($this->gettext('vacationdays')) . '</span><br />'
-       .'<input type="text" name="_action_days[]" '
-        .'value="' .Q($action['days'], 'strict', false) . '" size="2" '
-        . $this->error_class($id, 'action', 'days') .' />';
-    $out .= '</div>';
-
-    // mailbox select
-    $out .= '<select id="action_mailbox' .$id. '" name="_action_mailbox[]" style="display:' 
-       .(!isset($action) || $action['type']=='fileinto' ? 'inline' : 'none'). '">';
-
-    $this->rc->imap_init(true);
-
-    $a_folders = $this->rc->imap->list_mailboxes();
-    $delimiter = $this->rc->imap->get_hierarchy_delimiter();
-
-    // set mbox encoding
-    $mbox_encoding = $this->rc->config->get('managesieve_mbox_encoding', 'UTF7-IMAP'); 
-
-    if ($action['type'] == 'fileinto')
-      $mailbox = $action['target'];
-    else
-      $mailbox = '';
-
-    foreach ($a_folders as $folder)
+    private function add_tip($id, $str, $error=false)
     {
-      $utf7folder = $this->rc->imap->mod_mailbox($folder);
-      $names = explode($delimiter, rcube_charset_convert($folder, 'UTF7-IMAP'));
-      $name = $names[sizeof($names)-1];
-    
-      if ($replace_delimiter = $this->rc->config->get('managesieve_replace_delimiter'))
-        $utf7folder = str_replace($delimiter, $replace_delimiter, $utf7folder);
-    
-      // convert to Sieve implementation encoding
-      $utf7folder = $this->mbox_encode($utf7folder, $mbox_encoding);
-    
-      if ($folder_class = rcmail_folder_classname($name))
-        $foldername = $this->gettext($folder_class);
-      else
-        $foldername = $name;
-
-      $out .= sprintf('<option value="%s"%s>%s%s</option>'."\n",
-                    htmlspecialchars($utf7folder),
-                   ($mailbox == $utf7folder ? ' selected="selected"' : ''),
-                   str_repeat('&nbsp;', 4 * (sizeof($names)-1)),
-                   Q(abbreviate_string($foldername, 40 - (2 * sizeof($names)-1))));
+        if ($error)
+            $str = html::span('sieve error', $str);
+
+        $this->tips[] = array($id, $str);
     }
-    $out .= '</select>';
-    $out .= '</td>';
-
-    // add/del buttons
-    $out .= '<td class="rowbuttons">';
-    $out .= '<input type="button" id="actionadd' . $id .'" value="'. Q($this->gettext('add')). '" 
-       onclick="rcmail.managesieve_actionadd(' . $id .')" class="button" /> ';
-    $out .= '<input type="button" id="actiondel' . $id .'" value="'. Q($this->gettext('del')). '"
-        onclick="rcmail.managesieve_actiondel(' . $id .')" class="button' . ($rows_num<2 ? ' disabled' : '') .'"'
-       . ($rows_num<2 ? ' disabled="disabled"' : '') .' />';
-    $out .= '</td>';
-  
-    $out .= '</tr></table>';
-
-    $out .= $div ? "</div>\n" : '';
-
-    return $out;
-  }
-
-  private function genid()
-  {
-    $result = intval(rcube_timer());
-    return $result;
-  }
-
-  private function strip_value($str)
-  {
-    return trim(strip_tags($str));
-  }
-
-  private function error_class($id, $type, $target, $name_only=false)
-  {
-    // TODO: tooltips
-    if ($type == 'test' && isset($this->errors['tests'][$id][$target]))
-      return ($name_only ? 'error' : ' class="error"');
-    elseif ($type == 'action' && isset($this->errors['actions'][$id][$target]))
-      return ($name_only ? 'error' : ' class="error"');
-
-    return '';
-  }
-
-  private function check_email($email)
-  {
-    if (function_exists('check_email'));
-      return check_email($email);
-
-    // Check for invalid characters
-    if (preg_match('/[\x00-\x1F\x7F-\xFF]/', $email))
-      return false;
-
-    // Check that there's one @ symbol, and that the lengths are right
-    if (!preg_match('/^[^@]{1,64}@[^@]{1,255}$/', $email))
-      return false;
-
-    // Split it into sections to make life easier
-    $email_array = explode('@', $email);
-
-    // Check local part
-    $local_array = explode('.', $email_array[0]);
-    foreach ($local_array as $local_part)
-      if (!preg_match('/^(([A-Za-z0-9!#$%&\'*+\/=?^_`{|}~-]+)|("[^"]+"))$/', $local_part))
-        return false;
-
-    // Check domain part
-    if (preg_match('/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}$/', $email_array[1]) 
-      || preg_match('/^\[(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\]$/', $email_array[1]))
-      return true; // If an IP address
-    else
-    { // If not an IP address
-      $domain_array = explode('.', $email_array[1]);
-      if (sizeof($domain_array) < 2)
-        return false; // Not enough parts to be a valid domain
-
-      foreach ($domain_array as $domain_part)
-        if (!preg_match('/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]))$/', $domain_part))
-         return false;
-
-      return true;
+
+    private function print_tips()
+    {
+        if (empty($this->tips))
+            return;
+
+        $script = JS_OBJECT_NAME.'.managesieve_tip_register('.json_encode($this->tips).');';
+        $this->rc->output->add_script($script, 'foot');
     }
-  
-    return false;
-  }
-  private function mbox_encode($text, $encoding)
-  {
-    return rcube_charset_convert($text, 'UTF7-IMAP', $encoding);
-  }
-}
 
-?>
+}
diff --git a/plugins/managesieve/skins/default/filter_add_act.png b/plugins/managesieve/skins/default/filter_add_act.png
deleted file mode 100644 (file)
index d8915dc..0000000
Binary files a/plugins/managesieve/skins/default/filter_add_act.png and /dev/null differ
diff --git a/plugins/managesieve/skins/default/filter_add_pas.png b/plugins/managesieve/skins/default/filter_add_pas.png
deleted file mode 100644 (file)
index b5be806..0000000
Binary files a/plugins/managesieve/skins/default/filter_add_pas.png and /dev/null differ
diff --git a/plugins/managesieve/skins/default/filter_add_sel.png b/plugins/managesieve/skins/default/filter_add_sel.png
deleted file mode 100644 (file)
index 8cb0593..0000000
Binary files a/plugins/managesieve/skins/default/filter_add_sel.png and /dev/null differ
diff --git a/plugins/managesieve/skins/default/filter_del_act.png b/plugins/managesieve/skins/default/filter_del_act.png
deleted file mode 100644 (file)
index 1974417..0000000
Binary files a/plugins/managesieve/skins/default/filter_del_act.png and /dev/null differ
diff --git a/plugins/managesieve/skins/default/filter_del_pas.png b/plugins/managesieve/skins/default/filter_del_pas.png
deleted file mode 100644 (file)
index 9f17e38..0000000
Binary files a/plugins/managesieve/skins/default/filter_del_pas.png and /dev/null differ
diff --git a/plugins/managesieve/skins/default/filter_del_sel.png b/plugins/managesieve/skins/default/filter_del_sel.png
deleted file mode 100644 (file)
index 483ffc0..0000000
Binary files a/plugins/managesieve/skins/default/filter_del_sel.png and /dev/null differ
diff --git a/plugins/managesieve/skins/default/filter_down_act.png b/plugins/managesieve/skins/default/filter_down_act.png
deleted file mode 100644 (file)
index 7a24a4f..0000000
Binary files a/plugins/managesieve/skins/default/filter_down_act.png and /dev/null differ
diff --git a/plugins/managesieve/skins/default/filter_down_pas.png b/plugins/managesieve/skins/default/filter_down_pas.png
deleted file mode 100644 (file)
index ac65239..0000000
Binary files a/plugins/managesieve/skins/default/filter_down_pas.png and /dev/null differ
diff --git a/plugins/managesieve/skins/default/filter_down_sel.png b/plugins/managesieve/skins/default/filter_down_sel.png
deleted file mode 100644 (file)
index b7a9e67..0000000
Binary files a/plugins/managesieve/skins/default/filter_down_sel.png and /dev/null differ
diff --git a/plugins/managesieve/skins/default/filter_up_act.png b/plugins/managesieve/skins/default/filter_up_act.png
deleted file mode 100644 (file)
index fd9689b..0000000
Binary files a/plugins/managesieve/skins/default/filter_up_act.png and /dev/null differ
diff --git a/plugins/managesieve/skins/default/filter_up_pas.png b/plugins/managesieve/skins/default/filter_up_pas.png
deleted file mode 100644 (file)
index c60226c..0000000
Binary files a/plugins/managesieve/skins/default/filter_up_pas.png and /dev/null differ
diff --git a/plugins/managesieve/skins/default/filter_up_sel.png b/plugins/managesieve/skins/default/filter_up_sel.png
deleted file mode 100644 (file)
index de4c5c3..0000000
Binary files a/plugins/managesieve/skins/default/filter_up_sel.png and /dev/null differ
index ce2493626009e202f4b50709c01dc36f19623fac..675c5d0dc9d8c589a12f51db6767466303aca9a4 100644 (file)
@@ -1,18 +1,16 @@
-/***** RoundCube|Filters styles *****/
+/***** Roundcube|Filters styles *****/
 
 
 #filterslist
 {
   position: absolute;
   left: 20px;
-  width: 220px;
-  top: 130px;
-  bottom: 30px;
+  top: 120px;
+  bottom: 20px;
   border: 1px solid #999999;
-  background-color: #F9F9F9;
   overflow: auto;
   /* css hack for IE */
-  height: expression((parseInt(document.documentElement.clientHeight)-155)+'px');
+  height: expression((parseInt(document.documentElement.clientHeight)-140)+'px');
 }
 
 #filters-table
   cursor: pointer;
 }
 
+#filters-table tbody tr.disabled td
+{
+  color: #999999;
+}
+
 #filtersbuttons
 {
   position: absolute;
   left: 20px;
-  top: 95px;
+  top: 85px;
+}
+
+#filtersetsbuttons
+{
+  position: absolute;
+  left: 230px;
+  top: 85px;
+}
+
+#filtersbuttons a,
+#filtersetsbuttons a
+{
+  display: block;
+  float: left;
+}
+
+#filtersbuttons a.button,
+#filtersbuttons a.buttonPas,
+#filtersetsbuttons a.button,
+#filtersetsbuttons a.buttonPas
+{
+  display: block;
+  float: left;
+  width: 32px;
+  height: 32px;
+  padding: 0;
+  margin-right: 3px;
+  overflow: hidden;
+  background: url(managesieve_toolbar.png) 0 0 no-repeat transparent;
+  opacity: 0.99; /* this is needed to make buttons appear correctly in Chrome */
+}
+
+#filtersbuttons a.buttonPas,
+#filtersetsbuttons a.buttonPas
+{
+  filter: alpha(opacity=35);
+  opacity: 0.35;
+}
+
+#filtersbuttons a.add {
+  background-position: 0px 0px;
+}
+
+#filtersbuttons a.addsel {
+  background-position: 0 -32px;
+}
+
+#filtersbuttons a.del {
+  background-position: -32px 0px;
+}
+
+#filtersbuttons a.delsel {
+  background-position: -32px -32px;
+}
+
+#filtersbuttons a.up {
+  background-position: -64px 0px;
+}
+
+#filtersbuttons a.upsel {
+  background-position: -64px -32px;
+}
+
+#filtersbuttons a.down {
+  background-position: -96px 0px;
+}
+
+#filtersbuttons a.downsel {
+  background-position: -96px -32px;
+}
+
+#filtersetsbuttons a.setadd {
+  background-position: -128px 0px;
+}
+
+#filtersetsbuttons a.setaddsel {
+  background-position: -128px -32px;
+}
+
+#filtersetsbuttons a.setdel {
+  background-position: -160px 0px;
+}
+
+#filtersetsbuttons a.setdelsel {
+  background-position: -160px -32px;
+}
+
+#filtersetsbuttons a.setset {
+  background-position: -192px 0px;
+}
+
+#filtersetsbuttons a.setsetsel {
+  background-position: -192px -32px;
+}
+
+#filtersetsbuttons a.setget {
+  background-position: -224px 0px;
+}
+
+#filtersetsbuttons a.setgetsel {
+  background-position: -224px -32px;
+}
+
+#filtersetselect
+{
+  position: absolute;
+  left: 375px;
+  top: 90px;
 }
 
 #filter-box
 {
   position: absolute;
-  top: 95px;
-  left: 250px;
+  top: 120px;
   right: 20px;
-  bottom: 30px;
+  bottom: 20px;
   border: 1px solid #999999;
   overflow: hidden;
   /* css hack for IE */
-  width: expression((parseInt(document.documentElement.clientWidth)-30-parseInt(document.getElementById('filterslist').offsetLeft)-parseInt(document.getElementById('filterslist').offsetWidth))+'px');
-  height: expression((parseInt(document.documentElement.clientHeight)-120)+'px');
+  width: expression((parseInt(document.documentElement.clientWidth)-40-parseInt(document.getElementById('filterslist').offsetWidth))+'px');
+  height: expression((parseInt(document.documentElement.clientHeight)-140)+'px');
 }
 
 #filter-frame
 {
-  background-color: #F9F9F9;
   border: none;
 }
 
 body.iframe
 {
-  background-color: #F9F9F9;
   min-width: 740px;
   width: expression(Math.max(740, document.documentElement.clientWidth)+'px');
 }
@@ -66,21 +174,9 @@ body.iframe
 {
   min-width: 650px;
   white-space: nowrap;
-  background-color: #F9F9F9;
   padding: 20px 10px 10px 10px;
 }
 
-#filter-form input, select
-{
-  font-size: 10pt;
-  font-family: inherit;
-}
-
-fieldset
-{
-  background-color: white;
-}
-
 legend, label
 {
   color: #666666;
@@ -89,48 +185,50 @@ legend, label
 #rules, #actions
 {
   margin-top: 5px;
-  width: 100%;
   padding: 0;
   border-collapse: collapse;
 }
 
 div.rulerow, div.actionrow
 {
-  width: 100%;
+  width: auto;
   padding: 2px;
   white-space: nowrap;
-  float: left;
-  border: 1px solid white;
-  display: block;
+  border: 1px solid #F2F2F2;
 }
 
 div.rulerow:hover, div.actionrow:hover
 {
   padding: 2px;
   white-space: nowrap;
-  display: block;
-  float: left;
-  background: #F2F2F2;
+  background: #F9F9F9;
   border: 1px solid silver;
 }
 
 div.rulerow table, div.actionrow table
 {
-  width: 100%;
   padding: 0px;
+  width: 100%;
 }
 
 td.rowbuttons
 {
-  width: 98%;
   text-align: right;
   white-space: nowrap;
+  width: 1%;
 }
 
-td.rowactions, td.rowtargets
+td.rowactions
 {
+  white-space: nowrap;
   width: 1%;
+}
+
+td.rowtargets
+{
   white-space: nowrap;
+  width: 98%;
+  padding-left: 10px;
 }
 
 input.disabled, input.disabled:hover
@@ -155,3 +253,44 @@ span.label
   font-size: 10px;
   white-space: nowrap;
 }
+
+#footer
+{
+  padding-top: 5px;
+  width: 100%;
+}
+  
+#footer .footerleft
+{
+  padding-left: 2px;
+  white-space: nowrap;
+  float: left;
+}
+
+#footer .footerright
+{
+  padding-right: 2px;
+  white-space: nowrap;
+  text-align: right;
+  float: right;
+}
+
+.itemlist
+{
+  line-height: 25px;
+}
+
+.itemlist input
+{
+  vertical-align: middle;
+}
+
+span.sieve.error
+{
+  color: red;
+}
+
+#managesieve-tip
+{
+  width: 200px;
+}
diff --git a/plugins/managesieve/skins/default/managesieve_toolbar.png b/plugins/managesieve/skins/default/managesieve_toolbar.png
new file mode 100644 (file)
index 0000000..473dbc8
Binary files /dev/null and b/plugins/managesieve/skins/default/managesieve_toolbar.png differ
diff --git a/plugins/managesieve/skins/default/templates/filteredit.html b/plugins/managesieve/skins/default/templates/filteredit.html
new file mode 100644 (file)
index 0000000..556d996
--- /dev/null
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<link rel="stylesheet" type="text/css" href="/this/managesieve.css" />
+</head>
+<body class="iframe">
+
+<script type="text/javascript">
+
+function header_select(id)
+{
+    var obj = document.getElementById('header'+id);
+
+    if (obj.value == 'size')
+    {
+       document.getElementById('rule_size' + id).style.display = 'inline';
+       document.getElementById('rule_op' + id).style.display = 'none';
+       document.getElementById('rule_target' + id).style.display = 'none';
+       document.getElementById('custom_header' + id).style.display = 'none';
+    }
+    else
+    {
+       if (obj.value != '...')
+           document.getElementById('custom_header' + id).style.display = 'none';
+       else
+           document.getElementById('custom_header' + id).style.display = 'inline';
+    
+       document.getElementById('rule_size' + id).style.display = 'none';
+       document.getElementById('rule_op' + id).style.display = 'inline';
+       rule_op_select(id);
+    }
+}
+
+function rule_op_select(id)
+{
+    var obj = document.getElementById('rule_op'+id);
+
+    if (obj.value == 'exists' || obj.value == 'notexists')
+    {
+       document.getElementById('rule_target' + id).style.display = 'none';
+    }
+    else
+    {
+       document.getElementById('rule_target' + id).style.display = 'inline';
+    }
+}
+
+function action_type_select(id)
+{
+    var obj = document.getElementById('action_type'+id);
+
+    if (obj.value == 'fileinto' || obj.value == 'fileinto_copy')
+    {
+       document.getElementById('action_mailbox' + id).style.display = 'inline';
+       document.getElementById('action_target' + id).style.display = 'none';
+       document.getElementById('action_target_area' + id).style.display = 'none';
+       document.getElementById('action_vacation' + id).style.display = 'none';
+    }
+    else if (obj.value == 'redirect' || obj.value == 'redirect_copy')
+    {
+       document.getElementById('action_target' + id).style.display = 'inline';
+       document.getElementById('action_mailbox' + id).style.display = 'none';
+       document.getElementById('action_target_area' + id).style.display = 'none';
+       document.getElementById('action_vacation' + id).style.display = 'none';
+    }
+    else if (obj.value.match(/^reject|ereject$/))
+    {
+       document.getElementById('action_target_area' + id).style.display = 'inline';
+       document.getElementById('action_vacation' + id).style.display = 'none';
+       document.getElementById('action_target' + id).style.display = 'none';
+       document.getElementById('action_mailbox' + id).style.display = 'none';
+    }
+    else if (obj.value == 'vacation')
+    {
+       document.getElementById('action_vacation' + id).style.display = 'inline';
+        document.getElementById('action_target_area' + id).style.display = 'none';
+       document.getElementById('action_target' + id).style.display = 'none';
+       document.getElementById('action_mailbox' + id).style.display = 'none';
+    }
+    else // discard, keep, stop
+    {
+       document.getElementById('action_target_area' + id).style.display = 'none';
+       document.getElementById('action_vacation' + id).style.display = 'none';
+       document.getElementById('action_target' + id).style.display = 'none';
+       document.getElementById('action_mailbox' + id).style.display = 'none';
+    }
+}
+
+function rule_join_radio(value)
+{
+    document.getElementById('rules').style.display = (value=='any' ? 'none' : 'block');
+}
+</script>
+
+<div id="filter-title" class="boxtitle"><roundcube:label name="managesieve.filterdef" /></div>
+
+<div id="filter-form" class="boxcontent">
+<roundcube:object name="filterform" />
+
+<div id="footer">
+<div class="footerleft">
+<roundcube:button command="plugin.managesieve-save" type="input" class="button mainaction" label="save" />
+</div>
+<div class="footerright">
+<label for="disabled"><roundcube:label name="managesieve.filterdisabled" /></label>
+<input type="checkbox" id="disabled" name="_disabled" value="1" />
+</div>
+</div>
+
+</form>
+</div>
+
+
+</body>
+</html>
index d5dd6c454abdd338cc12d2effe75b47595cf5102..94cd1f1cc11d9da57452e85a4f7eb9dc657b39f2 100644 (file)
@@ -5,6 +5,15 @@
 <roundcube:include file="/includes/links.html" />
 <link rel="stylesheet" type="text/css" href="/this/managesieve.css" />
 <script type="text/javascript" src="/functions.js"></script>
+<script type="text/javascript" src="/splitter.js"></script>
+
+<style type="text/css">
+#filterslist { width: <roundcube:exp expression="!empty(cookie:sieveviewsplitter) ? cookie:sieveviewsplitter-5 : 210" />px; }
+#filter-box { left: <roundcube:exp expression="!empty(cookie:sieveviewsplitter) ? cookie:sieveviewsplitter+5 : 220" />px;
+<roundcube:exp expression="browser:ie ? ('width:expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:sieveviewsplitter) ? cookie:sieveviewsplitter+5 : 220).')+\\'px\\');') : ''" />
+}
+</style>
+
 </head>
 <body>
 
 <roundcube:include file="/includes/settingstabs.html" />
 
 <div id="filtersbuttons">
-<roundcube:button command="plugin.managesieve-add" imageSel="/this/filter_add_sel.png" imagePas="/this/filter_add_pas.png" imageAct="/this/filter_add_act.png" width="32" height="32" title="managesieve.filteradd" />
-<roundcube:button command="plugin.managesieve-del" imageSel="/this/filter_del_sel.png" imagePas="/this/filter_del_pas.png" imageAct="/this/filter_del_act.png"  width="32" height="32" title="managesieve.filterdel" />
-<roundcube:button command="plugin.managesieve-up" imageSel="/this/filter_up_sel.png" imagePas="/this/filter_up_pas.png" imageAct="/this/filter_up_act.png"  width="32" height="32" title="managesieve.moveup" />
-<roundcube:button command="plugin.managesieve-down" imageSel="/this/filter_down_sel.png" imagePas="/this/filter_down_pas.png" imageAct="/this/filter_down_act.png"  width="32" height="32" title="managesieve.movedown" />
+<roundcube:button command="plugin.managesieve-add" type="link" class="buttonPas add" classSel="button addsel" classAct="button add" title="managesieve.filteradd" content=" " />
+<roundcube:button command="plugin.managesieve-del" type="link" class="buttonPas del" classSel="button delsel" classAct="button del" title="managesieve.filterdel" content=" " />
+<roundcube:button command="plugin.managesieve-up" type="link" class="buttonPas up" classSel="button upsel" classAct="button up" title="managesieve.moveup" content=" " />
+<roundcube:button command="plugin.managesieve-down" type="link" class="buttonPas down" classSel="button downsel" classAct="button down" title="managesieve.movedown" content=" " />
+</div>
+
+<div id="filtersetsbuttons">
+<roundcube:button command="plugin.managesieve-setadd" type="link" class="buttonPas setadd" classSel="button setaddsel" classAct="button setadd" title="managesieve.filtersetadd" content=" " />
+<roundcube:button command="plugin.managesieve-setdel" type="link" class="buttonPas setdel" classSel="button setdelsel" classAct="button setdel" title="managesieve.filtersetdel" content=" " />
+<roundcube:button command="plugin.managesieve-setact" type="link" class="buttonPas setset" classSel="button setsetsel" classAct="button setset" content=" " />
+<roundcube:button command="plugin.managesieve-setget" type="link" class="buttonPas setget" classSel="button setgetsel" classAct="button setget" title="managesieve.filtersetget" content=" " />
+</div>
+<div id="filtersetselect">
+<roundcube:label name="managesieve.filterset" />:
+<roundcube:object name="filtersetslist" id="filtersets-select" />
 </div>
 
 <div id="filterslist">
 <roundcube:object name="filterslist" id="filters-table" class="records-table" cellspacing="0" summary="Filters list" />
 </div>
-
+<script type="text/javascript">
+  var sieveviewsplit = new rcube_splitter({id:'sieveviewsplitter', p1: 'filterslist', p2: 'filter-box', orientation: 'v', relative: true, start: 215});
+  rcmail.add_onload('sieveviewsplit.init()');
+</script>
 <div id="filter-box">
 <roundcube:object name="filterframe" id="filter-frame" width="100%" height="100%" frameborder="0" src="/watermark.html" />
 </div>
diff --git a/plugins/managesieve/skins/default/templates/managesieveedit.html b/plugins/managesieve/skins/default/templates/managesieveedit.html
deleted file mode 100644 (file)
index 2302073..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title><roundcube:object name="pagetitle" /></title>
-<roundcube:include file="/includes/links.html" />
-<link rel="stylesheet" type="text/css" href="/this/managesieve.css" />
-</head>
-<body class="iframe">
-
-<script type="text/javascript">
-
-function header_select(id)
-{
-    var obj = document.getElementById('header'+id);
-
-    if (obj.value == 'size')
-    {
-       document.getElementById('rule_size' + id).style.display = 'inline';
-       document.getElementById('rule_op' + id).style.display = 'none';
-       document.getElementById('rule_target' + id).style.display = 'none';
-       document.getElementById('custom_header' + id).style.display = 'none';
-    }
-    else
-    {
-       if (obj.value != '...')
-           document.getElementById('custom_header' + id).style.display = 'none';
-       else
-           document.getElementById('custom_header' + id).style.display = 'inline';
-    
-       document.getElementById('rule_size' + id).style.display = 'none';
-       document.getElementById('rule_op' + id).style.display = 'inline';
-       rule_op_select(id);
-    }
-}
-
-function rule_op_select(id)
-{
-    var obj = document.getElementById('rule_op'+id);
-
-    if (obj.value == 'exists' || obj.value == 'notexists')
-    {
-       document.getElementById('rule_target' + id).style.display = 'none';
-    }
-    else
-    {
-       document.getElementById('rule_target' + id).style.display = 'inline';
-    }
-}
-
-function action_type_select(id)
-{
-    var obj = document.getElementById('action_type'+id);
-
-    if (obj.value == 'fileinto')
-    {
-       document.getElementById('action_mailbox' + id).style.display = 'inline';
-       document.getElementById('action_target' + id).style.display = 'none';
-       document.getElementById('action_target_area' + id).style.display = 'none';
-       document.getElementById('action_vacation' + id).style.display = 'none';
-    }
-    else if (obj.value == 'redirect')
-    {
-       document.getElementById('action_target' + id).style.display = 'inline';
-       document.getElementById('action_mailbox' + id).style.display = 'none';
-       document.getElementById('action_target_area' + id).style.display = 'none';
-       document.getElementById('action_vacation' + id).style.display = 'none';
-    }
-    else if (obj.value.match(/^reject|ereject$/))
-    {
-       document.getElementById('action_target_area' + id).style.display = 'inline';
-       document.getElementById('action_vacation' + id).style.display = 'none';
-       document.getElementById('action_target' + id).style.display = 'none';
-       document.getElementById('action_mailbox' + id).style.display = 'none';
-    }
-    else if (obj.value == 'vacation')
-    {
-       document.getElementById('action_vacation' + id).style.display = 'inline';
-        document.getElementById('action_target_area' + id).style.display = 'none';
-       document.getElementById('action_target' + id).style.display = 'none';
-       document.getElementById('action_mailbox' + id).style.display = 'none';
-    }
-    else // discard, keep, stop
-    {
-       document.getElementById('action_target_area' + id).style.display = 'none';
-       document.getElementById('action_vacation' + id).style.display = 'none';
-       document.getElementById('action_target' + id).style.display = 'none';
-       document.getElementById('action_mailbox' + id).style.display = 'none';
-    }
-}
-
-function rule_join_radio(value)
-{
-    document.getElementById('rules').style.display = (value=='any' ? 'none' : 'block');
-}
-</script>
-
-<div id="filter-form">
-<roundcube:object name="filterform" />
-
-<p>
-<roundcube:button command="plugin.managesieve-save" type="input" class="button mainaction" label="save" />
-</p>
-
-</form>
-</div>
-
-
-</body>
-</html>
diff --git a/plugins/managesieve/skins/default/templates/setedit.html b/plugins/managesieve/skins/default/templates/setedit.html
new file mode 100644 (file)
index 0000000..26f7fec
--- /dev/null
@@ -0,0 +1,24 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<link rel="stylesheet" type="text/css" href="/this/managesieve.css" />
+</head>
+<body class="iframe">
+
+<div id="filter-title" class="boxtitle"><roundcube:label name="managesieve.newfilterset" /></div>
+
+<div id="filter-form" class="boxcontent">
+<roundcube:object name="filtersetform" />
+
+<p>
+<roundcube:button command="plugin.managesieve-save" type="input" class="button mainaction" label="save" />
+</p>
+
+</form>
+</div>
+
+
+</body>
+</html>
index 06ab2e93f4a304ae19ccba288f97122bc75ee1af..c547e5a441213f7bf185f4880e5dfbb2e226dd88 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/cs_CZ/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube markasjunk plugin                      |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube markasjunk plugin                      |
+| Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
diff --git a/plugins/markasjunk/localization/da_DK.inc b/plugins/markasjunk/localization/da_DK.inc
new file mode 100644 (file)
index 0000000..e351b0f
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['buttontitle'] = 'Marker som junk mail';
+$labels['reportedasjunk'] = 'Successfuldt rapporteret som junk mail';
+
+?>
diff --git a/plugins/markasjunk/localization/de_DE.inc b/plugins/markasjunk/localization/de_DE.inc
new file mode 100644 (file)
index 0000000..f21edf7
--- /dev/null
@@ -0,0 +1,6 @@
+<?php
+// translation done by Ulli Heist - http://heist.hobby-site.org/
+$labels = array();
+$labels['buttontitle'] = 'als SPAM markieren';
+$labels['reportedasjunk'] = 'Erfolgreich als SPAM gemeldet';
+?>
\ No newline at end of file
diff --git a/plugins/markasjunk/localization/es_AR.inc b/plugins/markasjunk/localization/es_AR.inc
new file mode 100644 (file)
index 0000000..decdde2
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['buttontitle'] = 'Marcar como SPAM';
+$labels['reportedasjunk'] = 'Mensaje reportado como SPAM';
+
+?>
diff --git a/plugins/markasjunk/localization/es_ES.inc b/plugins/markasjunk/localization/es_ES.inc
new file mode 100644 (file)
index 0000000..8e5ca49
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['buttontitle'] = 'Marcar como SPAM';
+$labels['reportedasjunk'] = 'Mensaje informado como SPAM';
+
+?>
diff --git a/plugins/markasjunk/localization/ja_JP.inc b/plugins/markasjunk/localization/ja_JP.inc
new file mode 100644 (file)
index 0000000..bd5b8b2
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+
+//  EN-Revision: 3891
+
+$labels = array();
+$labels['buttontitle'] = '迷惑メールとして設定';
+$labels['reportedasjunk'] = '迷惑メールとして報告することに成功しました。';
+
+?>
\ No newline at end of file
diff --git a/plugins/markasjunk/localization/sk_SK.inc b/plugins/markasjunk/localization/sk_SK.inc
new file mode 100644 (file)
index 0000000..b56ac46
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * Slovak translation for Roundcube markasjunk plugin
+ *
+ * @version 1.0 (2010-10-18)
+ * @author panda <admin@whistler.sk>
+ *
+ */
+
+$labels = array();
+$labels['buttontitle'] = 'Označiť ako Spam';
+$labels['reportedasjunk'] = 'Úspešne nahlásené ako Spam';
+
+?>
diff --git a/plugins/markasjunk/localization/zh_TW.inc b/plugins/markasjunk/localization/zh_TW.inc
new file mode 100644 (file)
index 0000000..7b0b221
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['buttontitle'] = '標示為垃圾信';
+$labels['reportedasjunk'] = '成功回報垃圾信';
+
+?>
index 8b02d7438ed12b4f780f55390e9fa410a831c8be..0e30fb8f25cb5f019c307753ca1d11f458dde0cc 100644 (file)
@@ -5,10 +5,10 @@ function rcmail_markasjunk(prop)
   if (!rcmail.env.uid && (!rcmail.message_list || !rcmail.message_list.get_selection().length))
     return;
   
-    var uids = rcmail.env.uid ? rcmail.env.uid : rcmail.message_list.get_selection().join(',');
-    
-    rcmail.set_busy(true, 'loading');
-    rcmail.http_post('plugin.markasjunk', '_uid='+uids+'&_mbox='+urlencode(rcmail.env.mailbox), true);
+    var uids = rcmail.env.uid ? rcmail.env.uid : rcmail.message_list.get_selection().join(','),
+      lock = rcmail.set_busy(true, 'loading');
+
+    rcmail.http_post('plugin.markasjunk', '_uid='+uids+'&_mbox='+urlencode(rcmail.env.mailbox), lock);
 }
 
 // callback for app-onload event
index cf81883fc106ac16cb6bf12fee29e7c2a0ed49f4..4c15a270f87a6a97851c5f998d311d89a2820f1e 100644 (file)
@@ -6,7 +6,7 @@
  * Sample plugin that adds a new button to the mailbox toolbar
  * to mark the selected messages as Junk and move them to the Junk folder
  *
- * @version 1.0
+ * @version @package_version@
  * @author Thomas Bruederli
  */
 class markasjunk extends rcube_plugin
@@ -15,9 +15,10 @@ class markasjunk extends rcube_plugin
 
   function init()
   {
-    $this->register_action('plugin.markasjunk', array($this, 'request_action'));
-    
     $rcmail = rcmail::get_instance();
+
+    $this->register_action('plugin.markasjunk', array($this, 'request_action'));
+      
     if ($rcmail->action == '' || $rcmail->action == 'show') {
       $skin_path = $this->local_skin_path();
       $this->include_script('markasjunk.js');
diff --git a/plugins/markasjunk/package.xml b/plugins/markasjunk/package.xml
new file mode 100644 (file)
index 0000000..8ca7b18
--- /dev/null
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+    http://pear.php.net/dtd/tasks-1.0.xsd
+    http://pear.php.net/dtd/package-2.0
+    http://pear.php.net/dtd/package-2.0.xsd">
+       <name>markasjunk</name>
+       <channel>pear.roundcube.net</channel>
+       <summary>Mark messages as Junk</summary>
+       <description>Adds a new button to the mailbox toolbar to mark the selected messages as Junk and move them to the configured Junk folder.</description>
+       <lead>
+               <name>Thomas Bruederli</name>
+               <user>thomasb</user>
+               <email>roundcube@gmail.com</email>
+               <active>yes</active>
+       </lead>
+       <date>2010-03-29</date>
+       <time>13:20:00</time>
+       <version>
+               <release>1.0</release>
+               <api>1.0</api>
+       </version>
+       <stability>
+               <release>stable</release>
+               <api>stable</api>
+       </stability>
+       <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+       <notes>-</notes>
+       <contents>
+               <dir baseinstalldir="/" name="/">
+                       <file name="markasjunk.php" role="php">
+                               <tasks:replace from="@name@" to="name" type="package-info"/>
+                               <tasks:replace from="@package_version@" to="version" type="package-info"/>
+                       </file>
+                       <file name="markasjunk.js" role="data">
+                               <tasks:replace from="@name@" to="name" type="package-info"/>
+                               <tasks:replace from="@package_version@" to="version" type="package-info"/>
+                       </file>
+                       <file name="localization/cs_CZ.inc" role="data"></file>
+                       <file name="localization/da_DK.inc" role="data"></file>
+                       <file name="localization/de_DE.inc" role="data"></file>
+                       <file name="localization/en_US.inc" role="data"></file>
+                       <file name="localization/es_AR.inc" role="data"></file>
+                       <file name="localization/es_ES.inc" role="data"></file>
+                       <file name="localization/et_EE.inc" role="data"></file>
+                       <file name="localization/ja_JP.inc" role="data"></file>
+                       <file name="localization/pl_PL.inc" role="data"></file>
+                       <file name="localization/ru_RU.inc" role="data"></file>
+                       <file name="localization/sv_SE.inc" role="data"></file>
+                       <file name="localization/zh_TW.inc" role="data"></file>
+                       <file name="skins/default/junk_act.png" role="data"></file>
+                       <file name="skins/default/junk_pas.png" role="data"></file>
+               </dir>
+               <!-- / -->
+       </contents>
+       <dependencies>
+               <required>
+                       <php>
+                               <min>5.2.1</min>
+                       </php>
+                       <pearinstaller>
+                               <min>1.7.0</min>
+                       </pearinstaller>
+               </required>
+       </dependencies>
+       <phprelease/>
+</package>
diff --git a/plugins/new_user_dialog/localization/cs_CZ.inc b/plugins/new_user_dialog/localization/cs_CZ.inc
new file mode 100644 (file)
index 0000000..fe05e6a
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['identitydialogtitle'] = 'Prosím doplňte své jméno a e-mail';
+$labels['identitydialoghint'] = 'Tento dialog se objeví pouze při prvním přihlášení.';
+
+?>
diff --git a/plugins/new_user_dialog/localization/es_ES.inc b/plugins/new_user_dialog/localization/es_ES.inc
new file mode 100644 (file)
index 0000000..2d2ccfe
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['identitydialogtitle'] = 'Por favor, complete sus datos personales';
+$labels['identitydialoghint'] = 'Este diálogo sólo aparecerá la primera vez que se conecte al correo.';
+
+?>
diff --git a/plugins/new_user_dialog/localization/gl_ES.inc b/plugins/new_user_dialog/localization/gl_ES.inc
new file mode 100644 (file)
index 0000000..e299935
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['identitydialogtitle'] = 'Por favor, complete os seus datos persoais';
+$labels['identitydialoghint'] = 'Este diálogo só aparecerá a primera vez que se conecte ao correo.';
+
+?>
diff --git a/plugins/new_user_dialog/localization/it_IT.inc b/plugins/new_user_dialog/localization/it_IT.inc
new file mode 100644 (file)
index 0000000..6c834a9
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['identitydialogtitle'] = 'Per favore completa le informazioni riguardo la tua identità';
+$labels['identitydialoghint'] = 'Questa finestra comparirà una volta sola al primo accesso';
+
+?>
diff --git a/plugins/new_user_dialog/localization/ja_JP.inc b/plugins/new_user_dialog/localization/ja_JP.inc
new file mode 100644 (file)
index 0000000..55f4791
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+
+//  EN-Revision: 3891
+
+$labels = array();
+$labels['identitydialogtitle'] = '送信者情報の入力を完了してください。';
+$labels['identitydialoghint'] = 'このボックスには最初のログイン時に一度だけ表示されます。';
+
+?>
\ No newline at end of file
diff --git a/plugins/new_user_dialog/localization/nl_NL.inc b/plugins/new_user_dialog/localization/nl_NL.inc
new file mode 100644 (file)
index 0000000..3cc9cec
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['identitydialogtitle'] = 'Vul uw correcte identiteitgegevens in a.u.b.';
+$labels['identitydialoghint'] = 'Dit scherm verschijnt enkel bij uw eerste login.';
+
+?>
diff --git a/plugins/new_user_dialog/localization/pt_BR.inc b/plugins/new_user_dialog/localization/pt_BR.inc
new file mode 100644 (file)
index 0000000..64e3e6a
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['identitydialogtitle'] = 'Por favor complete a sua identidade';
+$labels['identitydialoghint'] = 'Esta caixa aparece apenas uma vez no primeiro login.';
+
+?>
diff --git a/plugins/new_user_dialog/localization/pt_PT.inc b/plugins/new_user_dialog/localization/pt_PT.inc
new file mode 100644 (file)
index 0000000..64e3e6a
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['identitydialogtitle'] = 'Por favor complete a sua identidade';
+$labels['identitydialoghint'] = 'Esta caixa aparece apenas uma vez no primeiro login.';
+
+?>
diff --git a/plugins/new_user_dialog/localization/sk_SK.inc b/plugins/new_user_dialog/localization/sk_SK.inc
new file mode 100644 (file)
index 0000000..b7b841c
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+/*
+ *
+ * Slovak translation for Roundcube new_user_dialog plugin
+ *
+ * @version 1.0 (2010-09-13)
+ * @author panda <admin@whistler.sk>
+ *
+*/
+
+
+$labels = array();
+$labels['identitydialogtitle'] = 'Doplňte prosím Vašu identifikáciu odosielateľa';
+$labels['identitydialoghint'] = 'Toto okno sa objaví len pri prvom prihlásení.';
+
+?>
diff --git a/plugins/new_user_dialog/localization/sl_SI.inc b/plugins/new_user_dialog/localization/sl_SI.inc
new file mode 100644 (file)
index 0000000..57f5638
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['identitydialogtitle'] = 'Izberite identiteto za pošiljanje';
+$labels['identitydialoghint'] = 'To okno se prikaže le ob prvi prijavi v spletno pošto.';
+
+?>
diff --git a/plugins/new_user_dialog/localization/zh_TW.inc b/plugins/new_user_dialog/localization/zh_TW.inc
new file mode 100644 (file)
index 0000000..87261f9
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['identitydialogtitle'] = '請完成您的身份資訊';
+$labels['identitydialoghint'] = '此視窗只會於第一次登入時出現。';
+
+?>
index 965a405b782c0da4d9bf3b5d2df90645acaef580..96cd0da23768965e7da171915718e41cd0411305 100644 (file)
@@ -7,24 +7,24 @@
  * and sets a session flag in case it is incomplete. An overlay box will appear
  * on the screen until the user has reviewed/completed his identity.
  *
- * @version 1.0
+ * @version @package_version@
  * @author Thomas Bruederli
  */
 class new_user_dialog extends rcube_plugin
 {
-  public $task = 'mail';
-  
+  public $task = 'login|mail';
+
   function init()
   {
-    $this->add_hook('create_identity', array($this, 'create_identity'));
-    
+    $this->add_hook('identity_create', array($this, 'create_identity'));
+    $this->register_action('plugin.newusersave', array($this, 'save_data'));
+
     // register additional hooks if session flag is set
     if ($_SESSION['plugin.newuserdialog']) {
       $this->add_hook('render_page', array($this, 'render_page'));
-      $this->register_action('plugin.newusersave', array($this, 'save_data'));
     }
   }
-  
+
   /**
    * Check newly created identity at first login
    */
@@ -41,35 +41,53 @@ class new_user_dialog extends rcube_plugin
    */
   function render_page($p)
   {
-    if ($_SESSION['plugin.newuserdialog']) {
+    if ($_SESSION['plugin.newuserdialog'] && $p['template'] == 'mail') {
       $this->add_texts('localization');
-      
+
       $rcmail = rcmail::get_instance();
       $identity = $rcmail->user->get_identity();
       $identities_level = intval($rcmail->config->get('identities_level', 0));
-      
+
       // compose user-identity dialog
       $table = new html_table(array('cols' => 2));
-      
+
       $table->add('title', $this->gettext('name'));
-      $table->add(null, html::tag('input', array('type' => "text", 'name' => "_name", 'value' => $identity['name'])));
+      $table->add(null, html::tag('input', array(
+        'type' => 'text',
+        'name' => '_name',
+        'value' => $identity['name']
+      )));
 
       $table->add('title', $this->gettext('email'));
-      $table->add(null, html::tag('input', array('type' => "text", 'name' => "_email", 'value' => $identity['email'], 'disabled' => ($identities_level == 1 || $identities_level == 3))));
-      
+      $table->add(null, html::tag('input', array(
+        'type' => 'text',
+        'name' => '_email',
+        'value' => idn_to_utf8($identity['email']),
+        'disabled' => ($identities_level == 1 || $identities_level == 3)
+      )));
+
       // add overlay input box to html page
-      $rcmail->output->add_footer(html::div(array('id' => "newuseroverlay"),
+      $rcmail->output->add_footer(html::div(array('id' => 'newuseroverlay'),
         html::tag('form', array(
             'action' => $rcmail->url('plugin.newusersave'),
-            'method' => "post"),
+            'method' => 'post'),
           html::tag('h3', null, Q($this->gettext('identitydialogtitle'))) .
           html::p('hint', Q($this->gettext('identitydialoghint'))) .
           $table->show() .
-          html::p(array('class' => "formbuttons"),
-            html::tag('input', array('type' => "submit", 'class' => "button mainaction", 'value' => $this->gettext('save'))))
+          html::p(array('class' => 'formbuttons'),
+            html::tag('input', array('type' => 'submit',
+              'class' => 'button mainaction', 'value' => $this->gettext('save'))))
         )
       ));
-      
+
+      // disable keyboard events for messages list (#1486726)
+      $rcmail->output->add_script(
+        "$(document).ready(function () {
+          rcmail.message_list.key_press = function(){};
+          rcmail.message_list.key_down = function(){};
+          $('input[name=_name]').focus();
+          });", 'foot');
+
       $this->include_stylesheet('newuserdialog.css');
     }
   }
@@ -85,25 +103,27 @@ class new_user_dialog extends rcube_plugin
     $rcmail = rcmail::get_instance();
     $identity = $rcmail->user->get_identity();
     $identities_level = intval($rcmail->config->get('identities_level', 0));
-    
+
     $save_data = array(
       'name' => get_input_value('_name', RCUBE_INPUT_POST),
       'email' => get_input_value('_email', RCUBE_INPUT_POST),
     );
-    
+
     // don't let the user alter the e-mail address if disabled by config
     if ($identities_level == 1 || $identities_level == 3)
       $save_data['email'] = $identity['email'];
-    
+    else
+      $save_data['email'] = idn_to_ascii($save_data['email']);
+
     // save data if not empty
     if (!empty($save_data['name']) && !empty($save_data['email'])) {
       $rcmail->user->update_identity($identity['identity_id'], $save_data);
-      rcube_sess_unset('plugin.newuserdialog');
+      $rcmail->session->remove('plugin.newuserdialog');
     }
-    
+
     $rcmail->output->redirect('');
   }
-  
+
 }
 
 ?>
\ No newline at end of file
diff --git a/plugins/new_user_dialog/package.xml b/plugins/new_user_dialog/package.xml
new file mode 100644 (file)
index 0000000..198a9fa
--- /dev/null
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+    http://pear.php.net/dtd/tasks-1.0.xsd
+    http://pear.php.net/dtd/package-2.0
+    http://pear.php.net/dtd/package-2.0.xsd">
+       <name>new_user_dialog</name>
+       <channel>pear.roundcube.net</channel>
+       <summary>Present identities settings dialog to new users</summary>
+       <description>When a new user is created, this plugin checks the default identity and sets a session flag in case it is incomplete. An overlay box will appear on the screen until the user has reviewed/completed his identity.</description>
+       <lead>
+               <name>Thomas Bruederli</name>
+               <user>thomasb</user>
+               <email>roundcube@gmail.com</email>
+               <active>yes</active>
+       </lead>
+       <date>2010-12-02</date>
+       <time>12:00:00</time>
+       <version>
+               <release>1.3</release>
+               <api>1.0</api>
+       </version>
+       <stability>
+               <release>stable</release>
+               <api>stable</api>
+       </stability>
+       <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+       <notes>
+- Added setting of focus on name input
+- Added gl_ES translation
+    </notes>
+       <contents>
+               <dir baseinstalldir="/" name="/">
+                       <file name="new_user_dialog.php" role="php">
+                               <tasks:replace from="@name@" to="name" type="package-info"/>
+                               <tasks:replace from="@package_version@" to="version" type="package-info"/>
+                       </file>
+                       <file name="newuserdialog.css" role="data">
+                               <tasks:replace from="@name@" to="name" type="package-info"/>
+                               <tasks:replace from="@package_version@" to="version" type="package-info"/>
+                       </file>
+                       <dir name="localization">
+                               <file name="en_US.inc" role="data" />
+                               <file name="cs_CZ.inc" role="data" />
+                               <file name="de_CH.inc" role="data" />
+                               <file name="de_DE.inc" role="data" />
+                               <file name="es_ES.inc" role="data" />
+                               <file name="et_EE.inc" role="data" />
+                               <file name="gl_ES.inc" role="data" />
+                               <file name="it_IT.inc" role="data" />
+                               <file name="ja_JP.inc" role="data" />
+                               <file name="nl_NL.inc" role="data" />
+                               <file name="pl_PL.inc" role="data" />
+                               <file name="pt_BR.inc" role="data" />
+                               <file name="pt_PT.inc" role="data" />
+                               <file name="ru_RU.inc" role="data" />
+                               <file name="sl_SI.inc" role="data" />
+                               <file name="sv_DE.inc" role="data" />
+                               <file name="zh_TW.inc" role="data" />
+                       </dir>
+               </dir>
+               <!-- / -->
+       </contents>
+       <dependencies>
+               <required>
+                       <php>
+                               <min>5.2.1</min>
+                       </php>
+                       <pearinstaller>
+                               <min>1.7.0</min>
+                       </pearinstaller>
+               </required>
+       </dependencies>
+       <phprelease/>
+    <changelog>
+        <release>
+               <date>2010-03-29</date>
+               <time>13:20:00</time>
+               <version>
+                       <release>1.0</release>
+                       <api>1.0</api>
+               </version>
+               <stability>
+                       <release>stable</release>
+                       <api>stable</api>
+               </stability>
+               <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+               <notes></notes>
+        </release>
+        <release>
+               <date>2010-05-13</date>
+               <time>19:35:00</time>
+               <version>
+                       <release>1.1</release>
+                       <api>1.0</api>
+               </version>
+               <stability>
+                       <release>stable</release>
+                       <api>stable</api>
+               </stability>
+               <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+               <notes>
+- Fix space bar and backspace buttons not working (#1486726)
+            </notes>
+        </release>
+        <release>
+               <date>2010-05-27</date>
+               <time>12:00:00</time>
+               <version>
+                       <release>1.2</release>
+                       <api>1.0</api>
+               </version>
+               <stability>
+                       <release>stable</release>
+                       <api>stable</api>
+               </stability>
+               <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+               <notes>
+- Add overlay box only to mail task main template
+- Fix possible error on form submission (#1486103)
+            </notes>
+        </release>
+    </changelog>
+</package>
index 78c99522d9700f4b4d184e2e64b780864af9a063..ecdf7c137830bbc00289e5510b1cd1c4d7b63b8e 100644 (file)
  */
 class new_user_identity extends rcube_plugin
 {
+    public $task = 'login';
+
     function init()
     {
-        $this->add_hook('create_user', array($this, 'lookup_user_name'));
+        $this->add_hook('user_create', array($this, 'lookup_user_name'));
     }
 
     function lookup_user_name($args)
@@ -37,6 +39,9 @@ class new_user_identity extends rcube_plugin
             $results = $ldap->search($match, $args['user'], TRUE);
             if (count($results->records) == 1) {
                 $args['user_name'] = $results->records[0]['name'];
+                if (!$args['user_email'] && strpos($results->records[0]['email'], '@')) {
+                    $args['user_email'] = idn_to_ascii($results->records[0]['email']);
+                }
             }
         }
         return $args;
index c7e8203ad516afde707d9984fbfc64f5add57434..a31a0e07642a9d6f9efa6c722fa491bf925b9427 100644 (file)
  with this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
- @version 1.2
+ @version @package_version@
  @author Aleksander 'A.L.E.C' Machniak <alec@alec.pl>
  @author <see driver files for driver authors>
  -----------------------------------------------------------------------
 
  1.    Configuration
  2.    Drivers
- 2.1.  Database (sql)
- 2.2.  Cyrus/SASL (sasl)
- 2.3.  Poppassd/Courierpassd (poppassd)
- 2.4.  LDAP (ldap)
- 2.5.  DirectAdmin Control Panel
- 2.6.   cPanel
- 2.7.   XIMSS (Communigate)
+ 2.1.  Database (sql)
+ 2.2.  Cyrus/SASL (sasl)
+ 2.3.  Poppassd/Courierpassd (poppassd)
+ 2.4.  LDAP (ldap)
+ 2.5.  DirectAdmin Control Panel (directadmin)
+ 2.6.  cPanel (cpanel)
+ 2.7.  XIMSS/Communigate (ximms)
+ 2.8.  Virtualmin (virtualmin)
+ 2.9.  hMailServer (hmail)
+ 2.10. PAM (pam)
+ 2.11. Chpasswd (chpasswd)
+ 2.12. LDAP - no PEAR (ldap_simple)
+ 2.13. XMail (xmail)
  3.    Driver API
 
 
@@ -54,7 +60,7 @@
  -------------------
 
  You can specify which database to connect by 'password_db_dsn' option and
- what SQL query to execute by 'password_query'. See main.inc.php file for
+ what SQL query to execute by 'password_query'. See main.inc.php.dist file for
  more info.
 
  Example implementations of an update_passwd function:
  2.2. Cyrus/SASL (sasl)
  ----------------------
 
- Cyrus SASL database authentication allows your Cyrus+RoundCube
+ Cyrus SASL database authentication allows your Cyrus+Roundcube
  installation to host mail users without requiring a Unix Shell account!
 
  This driver only covers the "sasldb" case when using Cyrus SASL. Kerberos
  -------------------------------------
 
  You can specify which host to connect to via 'password_pop_host' and
- what port via 'password_pop_port'. See config.inc.php file for more info.
+ what port via 'password_pop_port'. See config.inc.php.dist file for more info.
 
 
  2.4. LDAP (ldap)
  ----------------
 
- See config.inc.php file. Requires PEAR::Net_LDAP2 package.
+ See config.inc.php.dist file. Requires PEAR::Net_LDAP2 package.
 
 
- 2.5. DirectAdmin Control Panel
- -------------------------------------
+ 2.5. DirectAdmin Control Panel (directadmin)
+ --------------------------------------------
 
- You can specify which host to connect to via 'password_directadmin_host' 
- and what port via 'password_direactadmin_port'. See config.inc.php file 
+ You can specify which host to connect to via 'password_directadmin_host'
+ and what port via 'password_direactadmin_port'. See config.inc.php.dist file
  for more info.
 
 
- 2.6. cPanel
- -----------
+ 2.6. cPanel (cpanel)
+ --------------------
 
  You can specify parameters for HTTP connection to cPanel's admin
- interface. See config.inc.php file for more info.
+ interface. See config.inc.php.dist file for more info.
 
 
- 2.7. XIMSS (Communigate)
- -------------------------------------
+ 2.7. XIMSS/Communigate (ximms)
+ ------------------------------
 
  You can specify which host and port to connect to via 'password_ximss_host' 
- and 'password_ximss_port'. See config.inc.php file for more info.
+ and 'password_ximss_port'. See config.inc.php.dist file for more info.
+
+
+ 2.8. Virtualmin (virtualmin)
+ ----------------------------
+
+ As in sasl driver this one allows to change password using shell
+ utility called "virtualmin". See drivers/chgvirtualminpasswd.c for
+ installation instructions.
+
+
+ 2.9. hMailServer (hmail)
+ ------------------------
+
+ Requires PHP COM (Windows only). For access to hMail server on remote host
+ you'll need to define 'hmailserver_remote_dcom' and 'hmailserver_server'.
+ See config.inc.php.dist file for more info.
+
+
+ 2.10. PAM (pam)
+ ---------------
+
+ This driver is for changing passwords of shell users authenticated with PAM.
+ Requires PECL's PAM exitension to be installed (http://pecl.php.net/package/PAM).
+
+
+ 2.11. Chpasswd (chpasswd)
+ -------------------------
+
+ Driver that adds functionality to change the systems user password via 
+ the 'chpasswd' command. See config.inc.php.dist file.
+
+ Attached wrapper script (chpass-wrapper.py) restricts password changes
+ to uids >= 1000 and can deny requests based on a blacklist.
+
+
+ 2.12.  LDAP - no PEAR (ldap_simple)
+ -----------------------------------
+
+ It's rewritten ldap driver that doesn't require the Net_LDAP2 PEAR extension.
+ It uses directly PHP's ldap module functions instead (as Roundcube does).
+
+ This driver is fully compatible with the ldap driver, but
+ does not require (or uses) the
+    $rcmail_config['password_ldap_force_replace'] variable.
+ Other advantages:
+    * Connects only once with the LDAP server when using the search user.
+    * Does not read the DN, but only replaces the password within (that is
+      why the 'force replace' is always used).
+
+
+ 2.13.  XMail (xmail)
+ -----------------------------------
+
+ Driver for XMail (www.xmailserver.org). See config.inc.php.dist file
+ for configuration description.
 
 
  3. Driver API
  may return PASSWORD_SUCCESS on success or any of PASSWORD_CONNECT_ERROR,
  PASSWORD_CRYPT_ERROR, PASSWORD_ERROR when driver was unable to change password.
  See existing drivers in drivers/ directory for examples.
+
index b9e3b9102f4ac67955d2d2c71a802a8082a9b410..54e9e51c67795e6bc0b190ca410d4f3e252f2b82 100644 (file)
@@ -3,7 +3,7 @@
 // Password Plugin options
 // -----------------------
 // A driver to use for password change. Default: "sql".
-// Current possibilities: 'directadmin', 'ldap', 'poppassd', 'sasl', 'sql', 'vpopmaild', 'cpanel'
+// See README file for list of supported driver names.
 $rcmail_config['password_driver'] = 'sql';
 
 // Determine whether current password is required to change password.
@@ -13,7 +13,7 @@ $rcmail_config['password_confirm_current'] = true;
 // Require the new password to be a certain length.
 // set to blank to allow passwords of any length
 $rcmail_config['password_minimum_length'] = 0;
+
 // Require the new password to contain a letter and punctuation character
 // Change to false to remove this check.
 $rcmail_config['password_require_nonalpha'] = false;
@@ -30,6 +30,7 @@ $rcmail_config['password_db_dsn'] = '';
 //      %p is replaced with the plaintext new password
 //      %c is replaced with the crypt version of the new password, MD5 if available
 //         otherwise DES.
+//      %D is replaced with the dovecotpw-crypted version of the new password
 //      %o is replaced with the password before the change
 //      %n is replaced with the hashed version of the new password
 //      %q is replaced with the hashed password before the change
@@ -43,6 +44,15 @@ $rcmail_config['password_db_dsn'] = '';
 // Default: "SELECT update_passwd(%c, %u)"
 $rcmail_config['password_query'] = 'SELECT update_passwd(%c, %u)';
 
+// Path for dovecotpw (if not in $PATH)
+// $rcmail_config['password_dovecotpw'] = '/usr/local/sbin/dovecotpw';
+
+// Dovecot method (dovecotpw -s 'method')
+$rcmail_config['password_dovecotpw_method'] = 'CRAM-MD5';
+
+// Enables use of password with crypt method prefix in %D, e.g. {MD5}$1$LUiMYWqx$fEkg/ggr/L6Mb2X7be4i1/
+$rcmail_config['password_dovecotpw_with_method'] = false;
+
 // Using a password hash for %n and %q variables.
 // Determine which hashing algorithm should be used to generate
 // the hashed new and current password for using them within the
@@ -69,8 +79,8 @@ $rcmail_config['password_pop_port'] = 106;
 $rcmail_config['password_saslpasswd_args'] = '';
 
 
-// LDAP Driver options
-// -------------------
+// LDAP and LDAP_SIMPLE Driver options
+// -----------------------------------
 // LDAP server name to connect to. 
 // You can provide one or several hosts in an array in which case the hosts are tried from left to right.
 // Exemple: array('ldap1.exemple.com', 'ldap2.exemple.com');
@@ -117,9 +127,49 @@ $rcmail_config['password_ldap_adminPW'] = null;
 // '%login' will be replaced by the current roundcube user's login
 // '%name' will be replaced by the current roundcube user's name part
 // '%domain' will be replaced by the current roundcube user's domain part
+// '%dc' will be replaced by domain name hierarchal string e.g. "dc=test,dc=domain,dc=com"
 // Exemple: 'uid=%login,ou=people,dc=exemple,dc=com'
 $rcmail_config['password_ldap_userDN_mask'] = 'uid=%login,ou=people,dc=exemple,dc=com';
 
+// LDAP search DN
+// The DN roundcube should bind with to find out user's DN
+// based on his login. Note that you should comment out the default
+// password_ldap_userDN_mask setting for this to take effect.
+// Use this if you cannot specify a general template for user DN with
+// password_ldap_userDN_mask. You need to perform a search based on
+// users login to find his DN instead. A common reason might be that
+// your users are placed under different ou's like engineering or
+// sales which cannot be derived from their login only.
+$rcmail_config['password_ldap_searchDN'] = 'cn=roundcube,ou=services,dc=example,dc=com';
+
+// LDAP search password
+// If password_ldap_searchDN is set, the password to use for
+// binding to search for user's DN. Note that you should comment out the default
+// password_ldap_userDN_mask setting for this to take effect.
+// Warning: Be sure to set approperiate permissions on this file so this password
+// is only accesible to roundcube and don't forget to restrict roundcube's access to
+// your directory as much as possible using ACLs. Should this password be compromised
+// you want to minimize the damage.
+$rcmail_config['password_ldap_searchPW'] = 'secret';
+
+// LDAP search base
+// If password_ldap_searchDN is set, the base to search in using the filter below.
+// Note that you should comment out the default password_ldap_userDN_mask setting
+// for this to take effect.
+$rcmail_config['password_ldap_search_base'] = 'ou=people,dc=example,dc=com';
+
+// LDAP search filter
+// If password_ldap_searchDN is set, the filter to use when
+// searching for user's DN. Note that you should comment out the default
+// password_ldap_userDN_mask setting for this to take effect.
+// '%login' will be replaced by the current roundcube user's login
+// '%name' will be replaced by the current roundcube user's name part
+// '%domain' will be replaced by the current roundcube user's domain part
+// '%dc' will be replaced by domain name hierarchal string e.g. "dc=test,dc=domain,dc=com"
+// Example: '(uid=%login)'
+// Example: '(&(objectClass=posixAccount)(uid=%login))'
+$rcmail_config['password_ldap_search_filter'] = '(uid=%login)';
+
 // LDAP password hash type
 // Standard LDAP encryption type which must be one of: crypt,
 // ext_des, md5crypt, blowfish, md5, sha, smd5, ssha, or clear.
@@ -139,6 +189,15 @@ $rcmail_config['password_ldap_pwattr'] = 'userPassword';
 // Default: true
 $rcmail_config['password_ldap_force_replace'] = true;
 
+// LDAP Password Last Change Date
+// Some places use an attribute to store the date of the last password change
+// The date is meassured in "days since epoch" (an integer value)
+// Whenever the password is changed, the attribute will be updated if set (e.g. shadowLastChange)
+$rcmail_config['password_ldap_lchattr'] = '';
+
+// Also try to update Samba password attributes: sambaNTPassword and sambaPwdLastSet
+$rcmail_config['password_ldap_samba'] = false;
+
 
 // DirectAdmin Driver options
 // --------------------------
@@ -188,4 +247,31 @@ $rcmail_config['password_ximss_host'] = 'mail.example.com';
 // XIMSS port on Communigate server
 $rcmail_config['password_ximss_port'] = 11024;
 
-?>
+
+// chpasswd Driver options
+// ---------------------
+// Command to use
+$rcmail_config['password_chpasswd_cmd'] = 'sudo /usr/sbin/chpasswd 2> /dev/null';
+
+
+// XMail Driver options
+// ---------------------
+$rcmail_config['xmail_host'] = 'localhost';
+$rcmail_config['xmail_user'] = 'YourXmailControlUser';
+$rcmail_config['xmail_pass'] = 'YourXmailControlPass';
+$rcmail_config['xmail_port'] = 6017;
+
+
+// hMail Driver options
+// -----------------------
+// Remote hMailServer configuration
+// true:  HMailserver is on a remote box (php.ini: com.allow_dcom = true)
+// false: Hmailserver is on same box as PHP
+$rcmail_config['hmailserver_remote_dcom'] = false;
+// Windows credentials
+$rcmail_config['hmailserver_server'] = array(
+    'Server' => 'localhost', // hostname or ip address
+    'Username' => 'administrator', // windows username
+    'Password' => 'password' // windows user password
+);
+
diff --git a/plugins/password/drivers/chgvirtualminpasswd.c b/plugins/password/drivers/chgvirtualminpasswd.c
new file mode 100644 (file)
index 0000000..4e2299c
--- /dev/null
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <unistd.h>
+
+// set the UID this script will run as (root user)
+#define UID 0
+#define CMD "/usr/sbin/virtualmin"
+
+/* INSTALLING:
+  gcc -o chgvirtualminpasswd chgvirtualminpasswd.c
+  chown root.apache chgvirtualminpasswd
+  strip chgvirtualminpasswd
+  chmod 4550 chgvirtualminpasswd
+*/
+
+main(int argc, char *argv[])
+{
+  int rc,cc;
+
+  cc = setuid(UID);
+  rc = execvp(CMD, argv);
+  if ((rc != 0) || (cc != 0))
+  {
+    fprintf(stderr, "__ %s:  failed %d  %d\n", argv[0], rc, cc);
+    return 1;
+  }
+
+  return 0;
+}
diff --git a/plugins/password/drivers/chpass-wrapper.py b/plugins/password/drivers/chpass-wrapper.py
new file mode 100644 (file)
index 0000000..61bba84
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/bin/env python
+
+import sys
+import pwd
+import subprocess
+
+BLACKLIST = (
+    # add blacklisted users here
+    #'user1',
+)
+
+try:
+    username, password = sys.stdin.readline().split(':', 1)
+except ValueError, e:
+    sys.exit('Malformed input')
+
+try:
+    user = pwd.getpwnam(username)
+except KeyError, e:
+    sys.exit('No such user: %s' % username)
+
+if user.pw_uid < 1000:
+    sys.exit('Changing the password for user id < 1000 is forbidden')
+
+if username in BLACKLIST:
+    sys.exit('Changing password for user %s is forbidden (user blacklisted)' %
+             username)
+
+handle = subprocess.Popen('/usr/sbin/chpasswd', stdin = subprocess.PIPE)
+handle.communicate('%s:%s' % (username, password))
+
+sys.exit(handle.returncode)
diff --git a/plugins/password/drivers/chpasswd.php b/plugins/password/drivers/chpasswd.php
new file mode 100644 (file)
index 0000000..28c3e5d
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * chpasswd Driver
+ *
+ * Driver that adds functionality to change the systems user password via
+ * the 'chpasswd' command.
+ *
+ * For installation instructions please read the README file.
+ *
+ * @version 1.0
+ * @author Alex Cartwright <acartwright@mutinydesign.co.uk)
+ */
+
+function password_save($currpass, $newpass)
+{
+    $cmd = rcmail::get_instance()->config->get('password_chpasswd_cmd');
+    $username = $_SESSION['username'];
+
+    $handle = popen($cmd, "w");
+    fwrite($handle, "$username:$newpass\n");
+
+    if (pclose($handle) == 0) {
+        return PASSWORD_SUCCESS;
+    }
+    else {
+        raise_error(array(
+            'code' => 600,
+            'type' => 'php',
+            'file' => __FILE__, 'line' => __LINE__,
+            'message' => "Password plugin: Unable to execute $cmd"
+            ), true, false);
+    }
+
+    return PASSWORD_ERROR;
+}
diff --git a/plugins/password/drivers/hmail.php b/plugins/password/drivers/hmail.php
new file mode 100644 (file)
index 0000000..39a87ab
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * hMailserver password driver
+ *
+ * @version 1.3 - 05.11.2010
+ * @author Roland 'rosali' Liebl <myroundcube@mail4us.net>
+ *
+ */
+
+function password_save($curpass, $passwd)
+{
+    $rcmail = rcmail::get_instance();
+
+    if ($curpass == '' || $passwd == '')
+      return PASSWORD_ERROR;
+
+    try {
+      $remote = $rcmail->config->get('hmailserver_remote_dcom', false);
+      if ($remote)
+        $obApp = new COM("hMailServer.Application", $rcmail->config->get('hmailserver_server'));
+      else
+        $obApp = new COM("hMailServer.Application");
+    }
+    catch (Exception $e) {
+        write_log('errors', "Plugin password (hmail driver): " . trim(strip_tags($e->getMessage())));
+        write_log('errors', "Plugin password (hmail driver): This problem is often caused by DCOM permissions not being set.");
+        return PASSWORD_ERROR;
+    }
+
+    $username = $rcmail->user->data['username'];
+    if (strstr($username,'@')){
+      $temparr = explode('@', $username);
+      $domain = $temparr[1];
+    }
+    else {
+      $domain = $rcmail->config->get('username_domain',false);
+      if (!$domain) {
+        write_log('errors','Plugin password (hmail driver): $rcmail_config[\'username_domain\'] is not defined.');
+        write_log('errors','Plugin password (hmail driver): Hint: Use hmail_login plugin (http://myroundcube.googlecode.com');
+        return PASSWORD_ERROR;
+      }
+      $username = $username . "@" . $domain;
+    }
+
+    $obApp->Authenticate($username, $curpass);
+    try {
+      $obDomain = $obApp->Domains->ItemByName($domain);
+      $obAccount = $obDomain->Accounts->ItemByAddress($username);
+      $obAccount->Password = $passwd;
+      $obAccount->Save();
+      return PASSWORD_SUCCESS;
+    }
+    catch (Exception $e) {
+      write_log('errors', "Plugin password (hmail driver): " . trim(strip_tags($e->getMessage())));
+      write_log('errors', "Plugin password (hmail driver): This problem is often caused by DCOM permissions not being set.");
+      return PASSWORD_ERROR;
+    }
+}
+
+?>
index e38f13f8c9eb85d54bb1eceacf1d8dec121bc163..e4d91fe1b61daaa47173ffea33a9ad20602c5403 100644 (file)
@@ -6,7 +6,7 @@
  * Driver for passwords stored in LDAP
  * This driver use the PEAR Net_LDAP2 class (http://pear.php.net/package/Net_LDAP2).
  *
- * @version 1.0 (2009-06-24)
+ * @version 1.1 (2010-04-07)
  * @author Edouard MOREAU <edouard.moreau@ensma.fr>
  *
  * function hashPassword based on code from the phpLDAPadmin development team (http://phpldapadmin.sourceforge.net/).
@@ -18,26 +18,31 @@ function password_save($curpass, $passwd)
 {
     $rcmail = rcmail::get_instance();
     require_once ('Net/LDAP2.php');
-    
+
     // Building user DN
-    $userDN = str_replace('%login', $_SESSION['username'], $rcmail->config->get('password_ldap_userDN_mask'));
-    
-    $parts = explode('@', $_SESSION['username']);
-    if (count($parts) == 2)
-    {
-        $userDN = str_replace('%name', $parts[0], $userDN);
-        $userDN = str_replace('%domain', $parts[1], $userDN);
+    if ($userDN = $rcmail->config->get('password_ldap_userDN_mask')) {
+        $userDN = substitute_vars($userDN);
+    } else {
+        $userDN = search_userdn($rcmail);
+    }
+
+    if (empty($userDN)) {
+        return PASSWORD_CONNECT_ERROR;
     }
 
-    if (empty($userDN)) {return PASSWORD_CONNECT_ERROR;}
-    
     // Connection Method
     switch($rcmail->config->get('password_ldap_method')) {
-        case 'user': $binddn = $userDN; $bindpw = $curpass; break;
-        case 'admin': $binddn = $rcmail->config->get('password_ldap_adminDN'); $bindpw = $rcmail->config->get('password_ldap_adminPW'); break;
-        default: $binddn = $userDN; $bindpw = $curpass; break; // default is user mode
+        case 'admin':
+            $binddn = $rcmail->config->get('password_ldap_adminDN');
+            $bindpw = $rcmail->config->get('password_ldap_adminPW');
+            break;
+        case 'user':
+        default:
+            $binddn = $userDN;
+            $bindpw = $curpass;
+            break;
     }
-    
+
     // Configuration array
     $ldapConfig = array (
         'binddn'    => $binddn,
@@ -48,25 +53,121 @@ function password_save($curpass, $passwd)
         'starttls'  => $rcmail->config->get('password_ldap_starttls'),
         'version'   => $rcmail->config->get('password_ldap_version'),
     );
-    
+
     // Connecting using the configuration array
     $ldap = Net_LDAP2::connect($ldapConfig);
-    
+
     // Checking for connection error
-    if (PEAR::isError($ldap)) {return PASSWORD_CONNECT_ERROR;}
-    
+    if (PEAR::isError($ldap)) {
+        return PASSWORD_CONNECT_ERROR;
+    }
+
     // Crypting new password
     $newCryptedPassword = hashPassword($passwd, $rcmail->config->get('password_ldap_encodage'));
-    if (!$newCryptedPassword) {return PASSWORD_CRYPT_ERROR;}
-    
+    if (!$newCryptedPassword) {
+        return PASSWORD_CRYPT_ERROR;
+    }
+
     // Writing new crypted password to LDAP
     $userEntry = $ldap->getEntry($userDN);
-    if (Net_LDAP2::isError($userEntry)) {return PASSWORD_CONNECT_ERROR;}
-    if (!$userEntry->replace(array($rcmail->config->get('password_ldap_pwattr') => $newCryptedPassword),$rcmail->config->get('password_ldap_force_replace'))) {return PASSWORD_CONNECT_ERROR;}
-    if (Net_LDAP2::isError($userEntry->update())) {return PASSWORD_CONNECT_ERROR;}
-    
+    if (Net_LDAP2::isError($userEntry)) {
+        return PASSWORD_CONNECT_ERROR;
+    }
+
+    $pwattr = $rcmail->config->get('password_ldap_pwattr');
+    $force = $rcmail->config->get('password_ldap_force_replace');
+
+    if (!$userEntry->replace(array($pwattr => $newCryptedPassword), $force)) {
+        return PASSWORD_CONNECT_ERROR;
+    }
+
+    // Updating PasswordLastChange Attribute if desired
+    if ($lchattr = $rcmail->config->get('password_ldap_lchattr')) {
+       $current_day = (int)(time() / 86400);
+       if (!$userEntry->replace(array($lchattr => $current_day), $force)) {
+           return PASSWORD_CONNECT_ERROR;
+       }
+    }
+
+    if (Net_LDAP2::isError($userEntry->update())) {
+        return PASSWORD_CONNECT_ERROR;
+    }
+
+    // Update Samba password fields, ignore errors if attributes are not found
+    if ($rcmail->config->get('password_ldap_samba')) {
+        $sambaNTPassword = hash('md4', rcube_charset_convert($passwd, RCMAIL_CHARSET, 'UTF-16LE'));
+        $userEntry->replace(array('sambaNTPassword' => $sambaNTPassword), $force);
+        $userEntry->replace(array('sambaPwdLastSet' => time()), $force);
+        $userEntry->update();
+    }
+
     // All done, no error
-    return PASSWORD_SUCCESS;    
+    return PASSWORD_SUCCESS;
+}
+
+/**
+ * Bind with searchDN and searchPW and search for the user's DN.
+ * Use search_base and search_filter defined in config file.
+ * Return the found DN.
+ */
+function search_userdn($rcmail)
+{
+    $ldapConfig = array (
+        'binddn'    => $rcmail->config->get('password_ldap_searchDN'),
+        'bindpw'    => $rcmail->config->get('password_ldap_searchPW'),
+        'basedn'    => $rcmail->config->get('password_ldap_basedn'),
+        'host'      => $rcmail->config->get('password_ldap_host'),
+        'port'      => $rcmail->config->get('password_ldap_port'),
+        'starttls'  => $rcmail->config->get('password_ldap_starttls'),
+        'version'   => $rcmail->config->get('password_ldap_version'),
+    );
+
+    $ldap = Net_LDAP2::connect($ldapConfig);
+
+    if (PEAR::isError($ldap)) {
+        return '';
+    }
+
+    $base = $rcmail->config->get('password_ldap_search_base');
+    $filter = substitute_vars($rcmail->config->get('password_ldap_search_filter'));
+    $options = array (
+            'scope' => 'sub',
+            'attributes' => array(),
+    );
+
+    $result = $ldap->search($base, $filter, $options);
+    $ldap->done();
+    if (PEAR::isError($result) || ($result->count() != 1)) {
+        return '';
+    }
+
+    return $result->current()->dn();
+}
+
+/**
+ * Substitute %login, %name, %domain, %dc in $str.
+ * See plugin config for details.
+ */
+function substitute_vars($str)
+{
+    $rcmail = rcmail::get_instance();
+    $domain = $rcmail->user->get_username('domain');
+    $dc     = 'dc='.strtr($domain, array('.' => ',dc=')); // hierarchal domain string
+
+    $str = str_replace(array(
+            '%login',
+            '%name',
+            '%domain',
+            '%dc',
+        ), array(
+            $_SESSION['username'],
+            $rcmail->user->get_username('local'),
+            $domain,
+            $dc,
+        ), $str
+    );
+
+    return $str;
 }
 
 
@@ -90,21 +191,31 @@ function hashPassword( $passwordClear, $encodageType )
         case 'crypt': 
             $cryptedPassword = '{CRYPT}' . crypt($passwordClear,randomSalt(2)); 
             break;
-            
+
         case 'ext_des':
             // extended des crypt. see OpenBSD crypt man page.
-            if ( ! defined( 'CRYPT_EXT_DES' ) || CRYPT_EXT_DES == 0 ) {return FALSE;} //Your system crypt library does not support extended DES encryption.
+            if ( ! defined( 'CRYPT_EXT_DES' ) || CRYPT_EXT_DES == 0 ) {
+                // Your system crypt library does not support extended DES encryption.
+                return FALSE;
+            }
             $cryptedPassword = '{CRYPT}' . crypt( $passwordClear, '_' . randomSalt(8) );
             break;
 
         case 'md5crypt':
-            if( ! defined( 'CRYPT_MD5' ) || CRYPT_MD5 == 0 ) {return FALSE;} //Your system crypt library does not support md5crypt encryption.
+            if( ! defined( 'CRYPT_MD5' ) || CRYPT_MD5 == 0 ) {
+                // Your system crypt library does not support md5crypt encryption.
+                return FALSE;
+            }
             $cryptedPassword = '{CRYPT}' . crypt( $passwordClear , '$1$' . randomSalt(9) );
             break;
 
         case 'blowfish':
-            if( ! defined( 'CRYPT_BLOWFISH' ) || CRYPT_BLOWFISH == 0 ) {return FALSE;} //Your system crypt library does not support blowfish encryption.
-            $cryptedPassword = '{CRYPT}' . crypt( $passwordClear , '$2a$12$' . randomSalt(13) ); // hardcoded to second blowfish version and set number of rounds
+            if( ! defined( 'CRYPT_BLOWFISH' ) || CRYPT_BLOWFISH == 0 ) {
+                // Your system crypt library does not support blowfish encryption.
+                return FALSE;
+            }
+            // hardcoded to second blowfish version and set number of rounds
+            $cryptedPassword = '{CRYPT}' . crypt( $passwordClear , '$2a$12$' . randomSalt(13) );
             break;
 
         case 'md5':
@@ -125,8 +236,8 @@ function hashPassword( $passwordClear, $encodageType )
         case 'ssha':
             if( function_exists( 'mhash' ) && function_exists( 'mhash_keygen_s2k' ) ) {
                 mt_srand( (double) microtime() * 1000000 );
-                $salt = mhash_keygen_s2k( MHASH_SHA1, $passwordClear, substr( pack( "h*", md5( mt_rand() ) ), 0, 8 ), 4 );
-                $cryptedPassword = "{SSHA}".base64_encode( mhash( MHASH_SHA1, $passwordClear.$salt ).$salt );
+                $salt = mhash_keygen_s2k( MHASH_SHA1, $passwordClear, substr( pack( 'h*', md5( mt_rand() ) ), 0, 8 ), 4 );
+                $cryptedPassword = '{SSHA}'.base64_encode( mhash( MHASH_SHA1, $passwordClear.$salt ).$salt );
             } else {
                 return FALSE; //Your PHP install does not have the mhash() function. Cannot do SHA hashes.
             }
@@ -135,8 +246,8 @@ function hashPassword( $passwordClear, $encodageType )
         case 'smd5':
             if( function_exists( 'mhash' ) && function_exists( 'mhash_keygen_s2k' ) ) {
                 mt_srand( (double) microtime() * 1000000 );
-                $salt = mhash_keygen_s2k( MHASH_MD5, $passwordClear, substr( pack( "h*", md5( mt_rand() ) ), 0, 8 ), 4 );
-                $cryptedPassword = "{SMD5}".base64_encode( mhash( MHASH_MD5, $passwordClear.$salt ).$salt );
+                $salt = mhash_keygen_s2k( MHASH_MD5, $passwordClear, substr( pack( 'h*', md5( mt_rand() ) ), 0, 8 ), 4 );
+                $cryptedPassword = '{SMD5}'.base64_encode( mhash( MHASH_MD5, $passwordClear.$salt ).$salt );
             } else {
                 return FALSE; //Your PHP install does not have the mhash() function. Cannot do SHA hashes.
             }
@@ -150,8 +261,6 @@ function hashPassword( $passwordClear, $encodageType )
     return $cryptedPassword;
 }
 
-
-
 /**
  * Code originaly from the phpLDAPadmin development team
  * http://phpldapadmin.sourceforge.net/
@@ -167,20 +276,17 @@ function hashPassword( $passwordClear, $encodageType )
  * @param int $length The length of the salt string to generate.
  * @return string The generated salt string.
  */
-function randomSalt( $length ) 
+function randomSalt( $length )
 {
     $possible = '0123456789'.
         'abcdefghijklmnopqrstuvwxyz'.
         'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
         './';
-    $str = "";
-    mt_srand((double)microtime() * 1000000);
+    $str = '';
+//    mt_srand((double)microtime() * 1000000);
 
-    while( strlen( $str ) < $length )
-        $str .= substr( $possible, ( rand() % strlen( $possible ) ), 1 );
+    while (strlen($str) < $length)
+        $str .= substr($possible, (rand() % strlen($possible)), 1);
 
     return $str;
 }
-
-?>
diff --git a/plugins/password/drivers/ldap_simple.php b/plugins/password/drivers/ldap_simple.php
new file mode 100644 (file)
index 0000000..67f53d0
--- /dev/null
@@ -0,0 +1,242 @@
+<?php
+
+/**
+ * Simple LDAP Password Driver
+ *
+ * Driver for passwords stored in LDAP
+ * This driver is based on Edouard's LDAP Password Driver, but does not
+ * require PEAR's Net_LDAP2 to be installed
+ * 
+ * @version 1.0 (2010-07-31)
+ * @author Wout Decre <wout@canodus.be>
+ */
+function password_save($curpass, $passwd)
+{
+       $rcmail = rcmail::get_instance();
+
+       /* Connect */
+       if (!$ds = ldap_connect($rcmail->config->get('password_ldap_host'), $rcmail->config->get('password_ldap_port'))) {
+               ldap_unbind($ds);
+               return PASSWORD_CONNECT_ERROR;
+       }
+
+       /* Set protocol version */
+       if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, $rcmail->config->get('password_ldap_version'))) {
+               ldap_unbind($ds);
+               return PASSWORD_CONNECT_ERROR;
+       }
+
+       /* Start TLS */
+       if ($rcmail->config->get('password_ldap_starttls')) {
+               if (!ldap_start_tls($ds)) {
+                       ldap_unbind($ds);
+                       return PASSWORD_CONNECT_ERROR;
+               }
+       }
+
+       /* Build user DN */
+       if ($user_dn = $rcmail->config->get('password_ldap_userDN_mask')) {
+               $user_dn = ldap_simple_substitute_vars($user_dn);
+       } else {
+               $user_dn = ldap_simple_search_userdn($rcmail, $ds);
+       }
+
+       if (empty($user_dn)) {
+               ldap_unbind($ds);
+               return PASSWORD_CONNECT_ERROR;
+       }
+
+       /* Connection method */
+       switch ($rcmail->config->get('password_ldap_method')) {
+               case 'admin':
+                       $binddn = $rcmail->config->get('password_ldap_adminDN');
+                       $bindpw = $rcmail->config->get('password_ldap_adminPW');
+                       break;
+               case 'user':
+               default:
+                       $binddn = $user_dn;
+                       $bindpw = $curpass;
+                       break;
+       }
+
+       /* Bind */
+       if (!ldap_bind($ds, $binddn, $bindpw)) {
+               ldap_unbind($ds);
+               return PASSWORD_CONNECT_ERROR;
+       }
+
+       /* Crypting new password */
+       $crypted_pass = ldap_simple_hash_password($passwd, $rcmail->config->get('password_ldap_encodage'));
+       if (!$crypted_pass) {
+               ldap_unbind($ds);
+               return PASSWORD_CRYPT_ERROR;
+       }
+
+       $entree[$rcmail->config->get('password_ldap_pwattr')] = $crypted_pass;
+
+       /* Updating PasswordLastChange Attribute if desired */
+       if ($lchattr = $rcmail->config->get('password_ldap_lchattr')) {
+               $entree[$lchattr] = (int)(time() / 86400);
+       }
+
+    /* Update Samba password fields */
+    if ($smbattr = $rcmail->config->get('password_ldap_samba')) {
+        $sambaNTPassword = hash('md4', rcube_charset_convert($passwd, RCMAIL_CHARSET, 'UTF-16LE'));
+        $entree['sambaNTPassword'] = $sambaNTPassword;
+        $entree['sambaPwdLastSet'] = time();
+    }
+
+       if (!ldap_modify($ds, $user_dn, $entree)) {
+               ldap_unbind($ds);
+               return PASSWORD_CONNECT_ERROR;
+       }
+
+       /* All done, no error */
+       ldap_unbind($ds);
+       return PASSWORD_SUCCESS;
+}
+
+/**
+ * Bind with searchDN and searchPW and search for the user's DN
+ * Use search_base and search_filter defined in config file
+ * Return the found DN
+ */
+function ldap_simple_search_userdn($rcmail, $ds)
+{
+       /* Bind */
+       if (!ldap_bind($ds, $rcmail->config->get('password_ldap_searchDN'), $rcmail->config->get('password_ldap_searchPW'))) {
+               return false;
+       }
+
+       /* Search for the DN */
+       if (!$sr = ldap_search($ds, $rcmail->config->get('password_ldap_search_base'), ldap_simple_substitute_vars($rcmail->config->get('password_ldap_search_filter')))) {
+               return false;
+       }
+
+       /* If no or more entries were found, return false */
+       if (ldap_count_entries($ds, $sr) != 1) {
+               return false;
+       }
+
+       return ldap_get_dn($ds, ldap_first_entry($ds, $sr));
+}
+
+/**
+ * Substitute %login, %name, %domain, %dc in $str
+ * See plugin config for details
+ */
+function ldap_simple_substitute_vars($str)
+{
+       $str = str_replace('%login', $_SESSION['username'], $str);
+       $str = str_replace('%l', $_SESSION['username'], $str);
+
+       $parts = explode('@', $_SESSION['username']);
+
+       if (count($parts) == 2) {
+        $dc = 'dc='.strtr($parts[1], array('.' => ',dc=')); // hierarchal domain string
+
+               $str = str_replace('%name', $parts[0], $str);
+        $str = str_replace('%n', $parts[0], $str);
+        $str = str_replace('%dc', $dc, $str);
+               $str = str_replace('%domain', $parts[1], $str);
+               $str = str_replace('%d', $parts[1], $str);
+       }
+
+       return $str;
+}
+
+/**
+ * Code originaly from the phpLDAPadmin development team
+ * http://phpldapadmin.sourceforge.net/
+ *
+ * Hashes a password and returns the hash based on the specified enc_type
+ */
+function ldap_simple_hash_password($password_clear, $encodage_type)
+{
+       $encodage_type = strtolower($encodage_type);
+       switch ($encodage_type) {
+               case 'crypt':
+                       $crypted_password = '{CRYPT}' . crypt($password_clear, ldap_simple_random_salt(2));
+                       break;
+               case 'ext_des':
+                       /* Extended DES crypt. see OpenBSD crypt man page */
+                       if (!defined('CRYPT_EXT_DES') || CRYPT_EXT_DES == 0) {
+                               /* Your system crypt library does not support extended DES encryption */
+                               return false;
+                       }
+                       $crypted_password = '{CRYPT}' . crypt($password_clear, '_' . ldap_simple_random_salt(8));
+                       break;
+               case 'md5crypt':
+                       if (!defined('CRYPT_MD5') || CRYPT_MD5 == 0) {
+                               /* Your system crypt library does not support md5crypt encryption */
+                               return false;
+                       }
+                       $crypted_password = '{CRYPT}' . crypt($password_clear, '$1$' . ldap_simple_random_salt(9));
+                       break;
+               case 'blowfish':
+                       if (!defined('CRYPT_BLOWFISH') || CRYPT_BLOWFISH == 0) {
+                               /* Your system crypt library does not support blowfish encryption */
+                               return false;
+                       }
+                       /* Hardcoded to second blowfish version and set number of rounds */
+                       $crypted_password = '{CRYPT}' . crypt($password_clear, '$2a$12$' . ldap_simple_random_salt(13));
+                       break;
+               case 'md5':
+                       $crypted_password = '{MD5}' . base64_encode(pack('H*', md5($password_clear)));
+                       break;
+               case 'sha':
+                       if (function_exists('sha1')) {
+                               /* Use PHP 4.3.0+ sha1 function, if it is available */
+                               $crypted_password = '{SHA}' . base64_encode(pack('H*', sha1($password_clear)));
+                       } else if (function_exists('mhash')) {
+                               $crypted_password = '{SHA}' . base64_encode(mhash(MHASH_SHA1, $password_clear));
+                       } else {
+                               /* Your PHP install does not have the mhash() function */
+                               return false;
+                       }
+                       break;
+               case 'ssha':
+                       if (function_exists('mhash') && function_exists('mhash_keygen_s2k')) {
+                               mt_srand((double) microtime() * 1000000 );
+                               $salt = mhash_keygen_s2k(MHASH_SHA1, $password_clear, substr(pack('h*', md5(mt_rand())), 0, 8), 4);
+                               $crypted_password = '{SSHA}' . base64_encode(mhash(MHASH_SHA1, $password_clear . $salt) . $salt);
+                       } else {
+                               /* Your PHP install does not have the mhash() function */
+                               return false;
+                       }
+                       break;
+               case 'smd5':
+                       if (function_exists('mhash') && function_exists('mhash_keygen_s2k')) {
+                               mt_srand((double) microtime() * 1000000 );
+                               $salt = mhash_keygen_s2k(MHASH_MD5, $password_clear, substr(pack('h*', md5(mt_rand())), 0, 8), 4);
+                               $crypted_password = '{SMD5}' . base64_encode(mhash(MHASH_MD5, $password_clear . $salt) . $salt);
+                       } else {
+                               /* Your PHP install does not have the mhash() function */
+                               return false;
+                       }
+                       break;
+               case 'clear':
+               default:
+                       $crypted_password = $password_clear;
+       }
+
+       return $crypted_password;
+}
+
+/**
+ * Code originaly from the phpLDAPadmin development team
+ * http://phpldapadmin.sourceforge.net/
+ *
+ * Used to generate a random salt for crypt-style passwords
+ */
+function ldap_simple_random_salt($length)
+{
+       $possible = '0123456789' . 'abcdefghijklmnopqrstuvwxyz' . 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' . './';
+       $str = '';
+       // mt_srand((double)microtime() * 1000000);
+       while (strlen($str) < $length) {
+               $str .= substr($possible, (rand() % strlen($possible)), 1);
+       }
+
+       return $str;
+}
diff --git a/plugins/password/drivers/pam.php b/plugins/password/drivers/pam.php
new file mode 100644 (file)
index 0000000..e9363cc
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * PAM Password Driver
+ *
+ * @version 1.0
+ * @author Aleksander Machniak
+ */
+function password_save($currpass, $newpass)
+{
+    $user = $_SESSION['username'];
+
+    if (extension_loaded('pam')) {
+        if (pam_auth($user, $currpass, $error, false)) {
+            if (pam_chpass($user, $currpass, $newpass)) {
+                return PASSWORD_SUCCESS;
+            }
+        }
+        else {
+            raise_error(array(
+                'code' => 600,
+                'type' => 'php',
+                'file' => __FILE__, 'line' => __LINE__,
+                'message' => "Password plugin: PAM authentication failed for user $user: $error"
+                ), true, false);
+        }
+    }
+    else {
+        raise_error(array(
+            'code' => 600,
+            'type' => 'php',
+            'file' => __FILE__, 'line' => __LINE__,
+            'message' => "Password plugin: PECL-PAM module not loaded"
+            ), true, false);
+    }
+
+    return PASSWORD_ERROR;
+}
+
+?>
index 8a54fb7d9d55744e5b6ef22da0f1a6739ed42b2e..fc105de47da3bfc60b488dbc0916060086412796 100644 (file)
@@ -5,46 +5,56 @@
  *
  * Driver to change passwords via Poppassd/Courierpassd
  *
- * @version 1.0
+ * @version 1.1
  * @author Philip Weir
  *
  */
 
+function format_error_result($code, $line)
+{
+    if (preg_match('/^\d\d\d\s+(\S.*)\s*$/', $line, $matches)) {
+        return array('code' => $code, 'message' => $matches[1]);
+    } else {
+        return $code;
+    }
+}
+
 function password_save($curpass, $passwd)
 {
     $rcmail = rcmail::get_instance();
 //    include('Net/Socket.php');
     $poppassd = new Net_Socket();
 
-    if (PEAR::isError($poppassd->connect($rcmail->config->get('password_pop_host'), $rcmail->config->get('password_pop_port'), null))) {
-        return PASSWORD_CONNECT_ERROR;
+    $result = $poppassd->connect($rcmail->config->get('password_pop_host'), $rcmail->config->get('password_pop_port'), null);
+    if (PEAR::isError($result)) {
+        return format_error_result(PASSWORD_CONNECT_ERROR, $result->getMessage());
     }
     else {
         $result = $poppassd->readLine();
         if(!preg_match('/^2\d\d/', $result)) {
             $poppassd->disconnect();
-            return PASSWORD_ERROR;
+            return format_error_result(PASSWORD_ERROR, $result);
         }
         else {
             $poppassd->writeLine("user ". $_SESSION['username']);
             $result = $poppassd->readLine();
             if(!preg_match('/^[23]\d\d/', $result) ) {
                 $poppassd->disconnect();
-                return PASSWORD_CONNECT_ERROR;
+                return format_error_result(PASSWORD_CONNECT_ERROR, $result);
             }
             else {
                 $poppassd->writeLine("pass ". $curpass);
                 $result = $poppassd->readLine();
                 if(!preg_match('/^[23]\d\d/', $result) ) {
                     $poppassd->disconnect();
-                    return PASSWORD_ERROR;
+                    return format_error_result(PASSWORD_ERROR, $result);
                 }
                 else {
                     $poppassd->writeLine("newpass ". $passwd);
                     $result = $poppassd->readLine();
                     $poppassd->disconnect();
                     if (!preg_match('/^2\d\d/', $result))
-                        return PASSWORD_ERROR;
+                        return format_error_result(PASSWORD_ERROR, $result);
                     else
                         return PASSWORD_SUCCESS;
                 }
@@ -52,5 +62,3 @@ function password_save($curpass, $passwd)
         }
     }
 }
-
-?>
index b1e9ba4878e7778ca100b21ad553e8b91ff2d131..f8ac5c60687046802cf53125ef0d709fabe39d53 100644 (file)
@@ -7,7 +7,7 @@
  * The code is derrived from the Squirrelmail "Change SASL Password" Plugin
  * by Galen Johnson.
  *
- * It only works with saslpasswd2 on the same host where RoundCube runs
+ * It only works with saslpasswd2 on the same host where Roundcube runs
  * and requires shell access and gcc in order to compile the binary.
  *
  * For installation instructions please read the README file.
@@ -33,7 +33,7 @@ function password_save($currpass, $newpass)
         raise_error(array(
             'code' => 600,
             'type' => 'php',
-            'file' => __FILE__,
+            'file' => __FILE__, 'line' => __LINE__,
             'message' => "Password plugin: Unable to execute $curdir/chgsaslpasswd"
             ), true, false);
     }
index 1e737f2333accaf1750e28bfaeac474e70868856..33469ec622790cc2142a0f3b7f9c4874591a4fa6 100644 (file)
@@ -18,11 +18,11 @@ function password_save($curpass, $passwd)
         $sql = 'SELECT update_passwd(%c, %u)';
 
     if ($dsn = $rcmail->config->get('password_db_dsn')) {
-       // #1486067: enable new_link option
-       if (is_array($dsn) && empty($dsn['new_link']))
-           $dsn['new_link'] = true;
-       else if (!is_array($dsn) && !preg_match('/\?new_link=true/', $dsn))
-         $dsn .= '?new_link=true';
+           // #1486067: enable new_link option
+           if (is_array($dsn) && empty($dsn['new_link']))
+               $dsn['new_link'] = true;
+           else if (!is_array($dsn) && !preg_match('/\?new_link=true/', $dsn))
+               $dsn .= '?new_link=true';
 
         $db = new rcube_mdb2($dsn, '', FALSE);
         $db->set_debug((bool)$rcmail->config->get('sql_debug'));
@@ -33,7 +33,7 @@ function password_save($curpass, $passwd)
 
     if ($err = $db->is_error())
         return PASSWORD_ERROR;
-    
+
     // crypted password
     if (strpos($sql, '%c') !== FALSE) {
         $salt = '';
@@ -49,56 +49,98 @@ function password_save($curpass, $passwd)
         }
         $sql = str_replace('%c',  $db->quote(crypt($passwd, CRYPT_MD5 ? '$1$'.$salt.'$' : $salt)), $sql);
     }
-    
+
+    // dovecotpw
+    if (strpos($sql, '%D') !== FALSE) {
+        if (!($dovecotpw = $rcmail->config->get('password_dovecotpw')))
+            $dovecotpw = 'dovecotpw';
+        if (!($method = $rcmail->config->get('password_dovecotpw_method')))
+            $method = 'CRAM-MD5';
+
+        // use common temp dir
+        $tmp_dir = $rcmail->config->get('temp_dir');
+        $tmpfile = tempnam($tmp_dir, 'roundcube-');
+
+        $pipe = popen("'$dovecotpw' -s '$method' > '$tmpfile'", "w");
+        if (!$pipe) {
+            unlink($tmpfile);
+            return PASSWORD_CRYPT_ERROR;
+        }
+        else {
+            fwrite($pipe, $passwd . "\n", 1+strlen($passwd)); usleep(1000);
+            fwrite($pipe, $passwd . "\n", 1+strlen($passwd));
+            pclose($pipe);
+            $newpass = trim(file_get_contents($tmpfile), "\n");
+            if (!preg_match('/^\{' . $method . '\}/', $newpass)) {
+                return PASSWORD_CRYPT_ERROR;
+            }
+            if (!$rcmail->config->get('password_dovecotpw_with_method'))
+                $newpass = trim(str_replace('{' . $method . '}', '', $newpass));
+            unlink($tmpfile);
+        }
+        $sql = str_replace('%D', $db->quote($newpass), $sql);
+    }
+
     // hashed passwords
     if (preg_match('/%[n|q]/', $sql)) {
 
-       if (!extension_loaded('hash')) {
-           raise_error(array(
-               'code' => 600,
-               'type' => 'php',
-               'file' => __FILE__,
-               'message' => "Password plugin: 'hash' extension not loaded!"
-               ), true, false);
-           return PASSWORD_ERROR;                          
-       }
-
-       if (!($hash_algo = strtolower($rcmail->config->get('password_hash_algorithm'))))
+           if (!extension_loaded('hash')) {
+               raise_error(array(
+                   'code' => 600,
+                       'type' => 'php',
+                       'file' => __FILE__, 'line' => __LINE__,
+                       'message' => "Password plugin: 'hash' extension not loaded!"
+                   ), true, false);
+
+               return PASSWORD_ERROR;
+           }
+
+           if (!($hash_algo = strtolower($rcmail->config->get('password_hash_algorithm'))))
             $hash_algo = 'sha1';
         
-       $hash_passwd = hash($hash_algo, $passwd);
+           $hash_passwd = hash($hash_algo, $passwd);
         $hash_curpass = hash($hash_algo, $curpass);
         
-       if ($rcmail->config->get('password_hash_base64')) {
+           if ($rcmail->config->get('password_hash_base64')) {
             $hash_passwd = base64_encode(pack('H*', $hash_passwd));
             $hash_curpass = base64_encode(pack('H*', $hash_curpass));
         }
        
-       $sql = str_replace('%n', $db->quote($hash_passwd, 'text'), $sql);
-       $sql = str_replace('%q', $db->quote($hash_curpass, 'text'), $sql);
+           $sql = str_replace('%n', $db->quote($hash_passwd, 'text'), $sql);
+           $sql = str_replace('%q', $db->quote($hash_curpass, 'text'), $sql);
     }
 
-    $user_info = explode('@', $_SESSION['username']);
-    if (count($user_info) >= 2) {
-       $sql = str_replace('%l', $db->quote($user_info[0], 'text'), $sql);
-       $sql = str_replace('%d', $db->quote($user_info[1], 'text'), $sql);
+    // Handle clear text passwords securely (#1487034)
+    $sql_vars = array();
+    if (preg_match_all('/%[p|o]/', $sql, $m)) {
+        foreach ($m[0] as $var) {
+            if ($var == '%p') {
+                $sql = preg_replace('/%p/', '?', $sql, 1);
+                $sql_vars[] = (string) $passwd;
+            }
+            else { // %o
+                $sql = preg_replace('/%o/', '?', $sql, 1);
+                $sql_vars[] = (string) $curpass;
+            }
+        }
     }
-    
+
+    // at least we should always have the local part
+    $sql = str_replace('%l', $db->quote($rcmail->user->get_username('local'), 'text'), $sql);
+    $sql = str_replace('%d', $db->quote($rcmail->user->get_username('domain'), 'text'), $sql);
     $sql = str_replace('%u', $db->quote($_SESSION['username'],'text'), $sql);
     $sql = str_replace('%h', $db->quote($_SESSION['imap_host'],'text'), $sql);
-    $sql = str_replace('%p', $db->quote($passwd,'text'), $sql);
-    $sql = str_replace('%o', $db->quote($curpass,'text'), $sql);
 
-    $res = $db->query($sql);
+    $res = $db->query($sql, $sql_vars);
 
     if (!$db->is_error()) {
-       if (strtolower(substr(trim($query),0,6))=='select') {
+           if (strtolower(substr(trim($query),0,6))=='select') {
            if ($result = $db->fetch_array($res))
-               return PASSWORD_SUCCESS;
-       } else { 
+                       return PASSWORD_SUCCESS;
+           } else { 
            if ($db->affected_rows($res) == 1)
-               return PASSWORD_SUCCESS; // This is the good case: 1 row updated
-       }
+                       return PASSWORD_SUCCESS; // This is the good case: 1 row updated
+           }
     }
 
     return PASSWORD_ERROR;
diff --git a/plugins/password/drivers/virtualmin.php b/plugins/password/drivers/virtualmin.php
new file mode 100644 (file)
index 0000000..96200d6
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Virtualmin Password Driver
+ *
+ * Driver that adds functionality to change the users Virtualmin password.
+ * The code is derrived from the Squirrelmail "Change Cyrus/SASL Password" Plugin
+ * by Thomas Bruederli.
+ *
+ * It only works with virtualmin on the same host where Roundcube runs
+ * and requires shell access and gcc in order to compile the binary.
+ *
+ * @version 1.0
+ * @author Martijn de Munnik
+ */
+
+function password_save($currpass, $newpass)
+{
+    $curdir = realpath(dirname(__FILE__));
+    $username = escapeshellcmd($_SESSION['username']);
+    $domain = substr(strrchr($username, "@"), 1);
+
+    exec("$curdir/chgvirtualminpasswd modify-user --domain $domain --user $username --pass $newpass", $output, $returnvalue);
+
+    if ($returnvalue == 0) {
+        return PASSWORD_SUCCESS;
+    }
+    else {
+        raise_error(array(
+            'code' => 600,
+            'type' => 'php',
+            'file' => __FILE__, 'line' => __LINE__,
+            'message' => "Password plugin: Unable to execute $curdir/chgvirtualminpasswd"
+            ), true, false);
+    }
+
+    return PASSWORD_ERROR;
+}
+
+?>
index db57eaf7063c35be301a3053ebea20a99c166e44..b6fb3934371d3b0a07fe62b6043a6da9df3b82ff 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Driver to change passwords via vpopmaild
  *
- * @version 1.0
+ * @version 1.1
  * @author Johannes Hessellund
  *
  */
@@ -16,45 +16,36 @@ function password_save($curpass, $passwd)
 //    include('Net/Socket.php');
     $vpopmaild = new Net_Socket();
 
-    if (PEAR::isError($vpopmaild->connect($rcmail->config->get('password_vpopmaild_host'), $rcmail->config->get('password_vpopmaild_port'), null))) {
+    if (PEAR::isError($vpopmaild->connect($rcmail->config->get('password_vpopmaild_host'),
+           $rcmail->config->get('password_vpopmaild_port'), null))) {
         return PASSWORD_CONNECT_ERROR;
     }
-    else {
-        $result = $vpopmaild->readLine();
-        if(!preg_match('/^\+OK/', $result)) {
-            $vpopmaild->disconnect();
-            return PASSWORD_CONNECT_ERROR;
-        }
-        else {
-            $vpopmaild->writeLine("slogin ". $_SESSION['username'] . " " . $curpass);
-            $result = $vpopmaild->readLine();
-            if(!preg_match('/^\+OK/', $result) ) {
-                $vpopmaild->writeLine("quit");
-                $vpopmaild->disconnect();
-                return PASSWORD_ERROR;
-            }
-            else {
-                $vpopmaild->writeLine("mod_user ". $_SESSION['username']);
-                $result = $vpopmaild->readLine();
-                if(!preg_match('/^\+OK/', $result) ) {
-                    $vpopmaild->writeLine("quit");
-                    $vpopmaild->disconnect();
-                    return PASSWORD_ERROR;
-                }
-                else {
-                    $vpopmaild->writeLine("clear_text_password ". $passwd);
-                    $vpopmaild->writeLine(".");
-                    $result = $vpopmaild->readLine();
-                    $vpopmaild->writeLine("quit");
-                    $vpopmaild->disconnect();
-                    if (!preg_match('/^\+OK/', $result))
-                        return PASSWORD_ERROR;
-                    else
-                        return PASSWORD_SUCCESS;
-                }
-            }
-        }
+
+    $result = $vpopmaild->readLine();
+    if(!preg_match('/^\+OK/', $result)) {
+        $vpopmaild->disconnect();
+        return PASSWORD_CONNECT_ERROR;
+    }
+
+    $vpopmaild->writeLine("slogin ". $_SESSION['username'] . " " . $curpass);
+    $result = $vpopmaild->readLine();
+    if(!preg_match('/^\+OK/', $result) ) {
+        $vpopmaild->writeLine("quit");
+        $vpopmaild->disconnect();
+        return PASSWORD_ERROR;
     }
+
+    $vpopmaild->writeLine("mod_user ". $_SESSION['username']);
+    $vpopmaild->writeLine("clear_text_password ". $passwd);
+    $vpopmaild->writeLine(".");
+    $result = $vpopmaild->readLine();
+    $vpopmaild->writeLine("quit");
+    $vpopmaild->disconnect();
+
+    if (!preg_match('/^\+OK/', $result))
+        return PASSWORD_ERROR;
+
+    return PASSWORD_SUCCESS;
 }
 
 ?>
diff --git a/plugins/password/drivers/xmail.php b/plugins/password/drivers/xmail.php
new file mode 100644 (file)
index 0000000..39d1e71
--- /dev/null
@@ -0,0 +1,101 @@
+<?php
+/**
+ * XMail Password Driver
+ *
+ * Driver for XMail password
+ *
+ * @version 1.0
+ * @author Helio Cavichiolo Jr <helio@hcsistemas.com.br>
+ *
+ * Setup xmail_host, xmail_user, xmail_pass and xmail_port into
+ * config.inc.php of password plugin as follows:
+ *
+ * $rcmail_config['xmail_host'] = 'localhost';
+ * $rcmail_config['xmail_user'] = 'YourXmailControlUser';
+ * $rcmail_config['xmail_pass'] = 'YourXmailControlPass';
+ * $rcmail_config['xmail_port'] = 6017;
+ *
+ */
+
+function password_save($currpass, $newpass)
+{
+    $rcmail = rcmail::get_instance();
+    list($user,$domain) = split('@',$_SESSION['username']);
+
+    $xmail = new XMail;
+
+    $xmail->hostname = $rcmail->config->get('xmail_host');
+    $xmail->username = $rcmail->config->get('xmail_user');
+    $xmail->password = $rcmail->config->get('xmail_pass');
+    $xmail->port = $rcmail->config->get('xmail_port');
+
+    if (!$xmail->connect()) {
+        raise_error(array(
+            'code' => 600,
+            'type' => 'php',
+            'file' => __FILE__, 'line' => __LINE__,
+            'message' => "Password plugin: Unable to connect to mail server"
+        ), true, false);
+        return PASSWORD_CONNECT_ERROR;
+    } else if (!$xmail->send("userpasswd\t".$domain."\t".$user."\t".$newpass."\n")) {
+        $xmail->close();
+        raise_error(array(
+            'code' => 600,
+            'type' => 'php',
+            'file' => __FILE__, 'line' => __LINE__,
+            'message' => "Password plugin: Unable to change password"
+        ), true, false);
+        return PASSWORD_ERROR;
+    } else {
+        $xmail->close();
+        return PASSWORD_SUCCESS;
+    }
+}
+
+class XMail {
+    var $socket;
+    var $hostname = 'localhost';
+    var $username = 'xmail';
+    var $password = '';
+    var $port = 6017;
+
+    function send($msg)
+    {
+        socket_write($this->socket,$msg);
+        if (substr($in = socket_read($this->socket, 512, PHP_BINARY_READ),0,1) != "+") {
+            return false;
+        }
+        return true;
+    }
+
+    function connect()
+    {
+        $this->socket = socket_create(AF_INET, SOCK_STREAM, 0);
+        if ($this->socket < 0)
+            return false;
+
+        $result = socket_connect($this->socket, $this->hostname, $this->port);
+        if ($result < 0) {
+            socket_close($this->socket);
+            return false;
+        }
+
+        if (substr($in = socket_read($this->socket, 512, PHP_BINARY_READ),0,1) != "+") {
+            socket_close($this->socket);
+            return false;
+        }
+
+        if (!$this->send("$this->username\t$this->password\n")) {
+            socket_close($this->socket);
+            return false;
+        }
+        return true;
+    }
+
+    function close()
+    {
+        $this->send("quit\n");
+        socket_close($this->socket);
+    }
+}
+
diff --git a/plugins/password/localization/az_AZ.inc b/plugins/password/localization/az_AZ.inc
new file mode 100644 (file)
index 0000000..62df01b
--- /dev/null
@@ -0,0 +1,24 @@
+<?php
+
+/* Azerbaijani translate for password plugin */
+/* Translated by Nadir Aliyev, nadir at ultel dot net */
+
+$labels = array();
+$labels['changepasswd']  = 'Şifrəni dəyiş';
+$labels['curpasswd']  = 'Hal-hazırki şifrə:';
+$labels['newpasswd']  = 'Yeni şifrə:';
+$labels['confpasswd']  = 'Yeni şifrə: (təkrar)';
+
+$messages = array();
+$messages['nopassword'] = 'Yeni şifrəni daxil edin.';
+$messages['nocurpassword'] = 'Hal-hazırda istifadə etdiyiniz şifrəni daxil edin.';
+$messages['passwordincorrect'] = 'Yalnış şifrə daxil etdiniz.';
+$messages['passwordinconsistency'] = 'Yeni daxil etdiyiniz şifrələr bir-birinə uyğun deyildir.';
+$messages['crypterror'] = 'Yeni şifrənin saxlanılması mümkün olmadı. Şifrələmə metodu tapılmadı.';
+$messages['connecterror'] = 'Yeni şifrənin saxlanılması mümkün olmadı. Qoşulma səhvi.';
+$messages['internalerror'] = 'Yeni şifrənin saxlanılması mümkün olmadı.';
+$messages['passwordshort'] = 'Yeni şifrə $length simvoldan uzun olmalıdır.';
+$messages['passwordweak'] = 'Şifrədə heç olmasa minimum bir rəqəm və simvol olmalıdır.';
+$messages['passwordforbidden'] = 'Şifrədə icazə verilməyən simvollar vardır.';
+
+?>
diff --git a/plugins/password/localization/ca_ES.inc b/plugins/password/localization/ca_ES.inc
new file mode 100644 (file)
index 0000000..18c10c8
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+
+$labels = array();
+$labels['changepasswd']  = 'Canviar contrasenya';
+$labels['curpasswd']  = 'Contrasenya actual:';
+$labels['newpasswd']  = 'Nova contrasenya:';
+$labels['confpasswd']  = 'Confirmar nova contrasenya:';
+
+$messages = array();
+$messages['nopassword'] = 'Si us plau, introdueix la nova contrasenya.';
+$messages['nocurpassword'] = 'Si us plau, introdueix la contrasenya actual.';
+$messages['passwordincorrect'] = 'Contrasenya actual incorrecte.';
+$messages['passwordinconsistency'] = 'La contrasenya nova no coincideix!.';
+$messages['crypterror'] = 'No es pot desar la nova contrasenya. No existeix la funció d\'encriptació.';
+$messages['connecterror'] = 'No es pot desar la nova contrasenya. Error de connexió.';
+$messages['internalerror'] = 'No es pot desar la nova contrasenya.';
+$messages['passwordshort'] = 'La nova contrasenya ha de tenir com a mínim $length caràcters de llarg.';
+$messages['passwordweak'] = 'La nova contrasenya ha d\'incloure com a mínim un nombre i un caràcter de puntuació.';
+
+?>
index 18270db9653899254b711dae91752f426b94f253..b4b7b29f9629dfe275150ecda857f165bb4f476a 100644 (file)
@@ -5,6 +5,7 @@
  *
  * @version 1.0 (2009-08-29)
  * @author Milan Kozak <hodza@hodza.net>
+ * @author Tomáš Šafařík <safarik@server.cz>
  *
  */
 
@@ -22,5 +23,8 @@ $messages['passwordinconsistency'] = 'Zadaná hesla se neshodují. Prosím zkust
 $messages['crypterror'] = 'Heslo se nepodařilo uložit. Chybí šifrovací funkce.';
 $messages['connecterror'] = 'Heslo se nepodařilo uložit. Problém s připojením.';
 $messages['internalerror'] = 'Heslo se nepodařilo uložit.';
+$messages['passwordshort'] = 'Heslo musí mít alespoň $length znaků.';
+$messages['passwordweak'] = 'Heslo musí obsahovat alespoň jedno číslo a jedno interpuknční znaménko.';
+$messages['passwordforbidden'] = 'Heslo obsahuje nepovolené znaky.';
 
 ?>
index 75fe8618f565a13d2483ef763c5c8cfff215b10b..1ae2158b0e465e9ba03e909805b89b4c29b42742 100644 (file)
@@ -11,10 +11,11 @@ $messages['nopassword'] = 'Please input new password.';
 $messages['nocurpassword'] = 'Please input current password.';
 $messages['passwordincorrect'] = 'Current password incorrect.';
 $messages['passwordinconsistency'] = 'Passwords do not match, please try again.';
-$messages['crypterror'] = 'Could not save new password. Encrypt function missing.';
+$messages['crypterror'] = 'Could not save new password. Encryption function missing.';
 $messages['connecterror'] = 'Could not save new password. Connection error.';
 $messages['internalerror'] = 'Could not save new password.';
-$messages['passwordshort'] = 'Your password must be at least $length characters long.';
-$messages['passwordweak'] = 'Your new password must include at least one number and one punctuation character.';
+$messages['passwordshort'] = 'Password must be at least $length characters long.';
+$messages['passwordweak'] = 'Password must include at least one number and one punctuation character.';
+$messages['passwordforbidden'] = 'Password contains forbidden characters.';
 
 ?>
diff --git a/plugins/password/localization/es_AR.inc b/plugins/password/localization/es_AR.inc
new file mode 100644 (file)
index 0000000..40c74e6
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+$labels = array();
+$labels['changepasswd']  = 'Cambiar Contraseña';
+$labels['curpasswd']  = 'Contraseña Actual:';
+$labels['newpasswd']  = 'Contraseña Nueva:';
+$labels['confpasswd']  = 'Confirmar Contraseña:';
+
+$messages = array();
+$messages['nopassword'] = 'Por favor introduce una nueva contraseña.';
+$messages['nocurpassword'] = 'Por favor introduce la contraseña actual.';
+$messages['passwordincorrect'] = 'Contraseña actual incorrecta.';
+$messages['passwordinconsistency'] = 'Las contraseñas no coinciden, por favor inténtalo de nuevo.';
+$messages['crypterror'] = 'No se pudo guardar la contraseña nueva. Falta la función de cifrado.';
+$messages['connecterror'] = 'No se pudo guardar la contraseña nueva. Error de conexión';
+$messages['internalerror'] = 'No se pudo guardar la contraseña nueva.';
+$messages['passwordshort'] = 'Tu contraseña debe tener una longitud mínima de $length.';
+$messages['passwordweak'] = 'Tu nueva contraseña debe incluir al menos un número y un signo de puntuación.';
+$messages['passwordforbidden'] = 'La contraseña contiene caracteres inválidos.';
+
+?>
diff --git a/plugins/password/localization/es_ES.inc b/plugins/password/localization/es_ES.inc
new file mode 100644 (file)
index 0000000..b9a9c16
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+$labels = array();
+$labels['changepasswd']  = 'Cambiar Contraseña';
+$labels['curpasswd']  = 'Contraseña Actual:';
+$labels['newpasswd']  = 'Contraseña Nueva:';
+$labels['confpasswd']  = 'Confirmar Contraseña:';
+
+$messages = array();
+$messages['nopassword'] = 'Por favor introduce una nueva contraseña.';
+$messages['nocurpassword'] = 'Por favor introduce la contraseña actual.';
+$messages['passwordincorrect'] = 'Contraseña actual incorrecta.';
+$messages['passwordinconsistency'] = 'Las contraseñas no coinciden, por favor inténtalo de nuevo.';
+$messages['crypterror'] = 'No se pudo guardar la contraseña nueva. Falta la función de cifrado.';
+$messages['connecterror'] = 'No se pudo guardar la contraseña nueva. Error de conexión';
+$messages['internalerror'] = 'No se pudo guardar la contraseña nueva.';
+$messages['passwordshort'] = 'Tu contraseña debe tener una longitud mínima de $length.';
+$messages['passwordweak'] = 'Tu nueva contraseña debe incluir al menos un número y un signo de puntuación.';
+$messages['passwordforbidden'] = 'La contraseña contiene caracteres prohibidos.';
+
+?>
diff --git a/plugins/password/localization/fi_FI.inc b/plugins/password/localization/fi_FI.inc
new file mode 100644 (file)
index 0000000..a2108a5
--- /dev/null
@@ -0,0 +1,22 @@
+<?php
+
+// Translation by Tapio Salonsaari <take@nerd.fi>
+
+$labels = array();
+$labels['changepasswd']  = 'Vaihda salasana';
+$labels['curpasswd']  = 'Nykyinen salasana:';
+$labels['newpasswd']  = 'Uusi salasana:';
+$labels['confpasswd']  = 'Uusi salasana uudestaan:';
+
+$messages = array();
+$messages['nopassword'] = 'Syötä uusi salasana.';
+$messages['nocurpassword'] = 'Syötä nykyinen salasana.';
+$messages['passwordincorrect'] = 'Syöttämäsi nykyinen salasana on väärin.';
+$messages['passwordinconsistency'] = 'Syöttämäsi salasanat eivät täsmää, yritä uudelleen.';
+$messages['crypterror'] = 'Salasanaa ei voitu vaihtaa. Kryptausfunktio puuttuu.';
+$messages['connecterror'] = 'Salasanaa ei voitu vaihtaa. Yhteysongelma.';
+$messages['internalerror'] = 'Salasanaa ei voitu vaihtaa.';
+$messages['passwordshort'] = 'Salasanan täytyy olla vähintään $length merkkiä pitkä.';
+$messages['passwordweak'] = 'Salasanan täytyy sisältää vähintään yksi numero ja yksi välimerkki.';
+
+?>
index b33d8d54f11aec47f791c280b15573012211b93d..13b4885d7efd86247243af754695e13f4f041765 100644 (file)
@@ -14,5 +14,8 @@ $messages['passwordinconsistency'] = 'Le password non coincidono, inserirle di n
 $messages['crypterror'] = 'Non posso salvare la password, funzione di cifratura assente.';
 $messages['connecterror'] = 'Non posso salvare la password, errore di connessione.';
 $messages['internalerror'] = 'Non posso salvare la password.';
+$messages['passwordshort'] = 'La nuova password deve essere lunga almeno $length caratteri.';
+$messages['passwordweak'] = 'La nuova password deve contenere almeno una cifra e un segno di punteggiatura.';
+$messages['passwordforbidden'] = 'La password scelta contiene dei caratteri non consentiti.';
 
 ?>
diff --git a/plugins/password/localization/ja_JP.inc b/plugins/password/localization/ja_JP.inc
new file mode 100644 (file)
index 0000000..47cac04
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+
+//  EN-Revision: 3891
+
+$labels = array();
+$labels['changepasswd']  = 'パスワードの変更';
+$labels['curpasswd']  = '現在のパスワード:';
+$labels['newpasswd']  = '新しいパスワード:';
+$labels['confpasswd']  = '新しいパスワード (確認):';
+
+$messages = array();
+$messages['nopassword'] = '新しいパスワードを入力してください。';
+$messages['nocurpassword'] = '現在のパスワードを入力してください。';
+$messages['passwordincorrect'] = '現在のパスワードが間違っています。';
+$messages['passwordinconsistency'] = 'パスワードが一致しません。もう一度やり直してください。';
+$messages['crypterror'] = 'パスワードを保存できませんでした。暗号化関数がみあたりません。';
+$messages['connecterror'] = '新しいパスワードを保存できませんでした。接続エラーです。';
+$messages['internalerror'] = '新しいパスワードを保存できませんでした。';
+$messages['passwordshort'] = 'パスワードは少なくとも $length 文字の長さが必要です。';
+$messages['passwordweak'] = 'パスワードは少なくとも数字を 1 文字と記号が 1 文字含んでなければなりません。';
+$messages['passwordforbidden'] = 'パスワードに禁止された文字が含まれています。';
+
+?>
diff --git a/plugins/password/localization/lt_LT.inc b/plugins/password/localization/lt_LT.inc
new file mode 100644 (file)
index 0000000..b4563cc
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+$labels = array();
+$labels['changepasswd']  = 'Slaptažodžio keitimas';
+$labels['curpasswd']  = 'Dabartinis slaptažodis:';
+$labels['newpasswd']  = 'Naujasis slaptažodis:';
+$labels['confpasswd']  = 'Pakartokite naująjį slaptažodį:';
+
+$messages = array();
+$messages['nopassword'] = 'Prašom įvesti naująjį slaptažodį.';
+$messages['nocurpassword'] = 'Prašom įvesti dabartinį slaptažodį.';
+$messages['passwordincorrect'] = 'Dabartinis slaptažodis neteisingas.';
+$messages['passwordinconsistency'] = 'Slaptažodžiai nesutapo. Bandykite dar kartą.';
+$messages['crypterror'] = 'Nepavyko įrašyti naujojo slaptažodžio. Trūksta šifravimo funkcijos.';
+$messages['connecterror'] = 'Nepavyko įrašyti naujojo slaptažodžio. Prisijungimo klaida.';
+$messages['internalerror'] = 'Nepavyko įrašyti naujojo slaptažodžio.';
+$messages['passwordshort'] = 'Slaptažodis turi būti sudarytas iš bent $length simbolių.';
+$messages['passwordweak'] = 'Slaptažodyje turi būti bent vienas skaitmuo ir vienas skyrybos ženklas.';
+$messages['passwordforbidden'] = 'Slaptažodyje rasta neleistinų simbolių.';
+
+?>
diff --git a/plugins/password/localization/lv_LV.inc b/plugins/password/localization/lv_LV.inc
new file mode 100644 (file)
index 0000000..8f5f4c2
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+
+$labels = array();
+$labels['changepasswd']  = 'Nomainīt paroli';
+$labels['curpasswd']  = 'Pašreizējā parole:';
+$labels['newpasswd']  = 'Jaunā parole:';
+$labels['confpasswd']  = 'Vēlreiz jauno paroli:';
+
+$messages = array();
+$messages['nopassword'] = 'Lūdzu, ievadiet jauno paroli.';
+$messages['nocurpassword'] = 'Lūdzu, ievadiet pašreizējo paroli.';
+$messages['passwordincorrect'] = 'Pašreizējā parole nepareiza.';
+$messages['passwordinconsistency'] = 'Paroles nesakrīt. Lūdzu, ievadiet vēlreiz.';
+$messages['crypterror'] = 'Nevarēja saglabāt jauno paroli. Trūkst kriptēšanas funkcija.';
+$messages['connecterror'] = 'Nevarēja saglabāt jauno paroli. Savienojuma kļūda.';
+$messages['internalerror'] = 'Nevarēja saglabāt jauno paroli.';
+$messages['passwordshort'] = 'Jaunajai parolei jābūt vismaz $length simbola garai.';
+$messages['passwordweak'] = 'Jaunajai parolei jāsatur vismaz viens cipars un punktuācijas simbols.';
+
+?>
index 774437a282052cd6f2136444dfeaaa665d580b3a..687ca938324fc15f3a6ed49fe5b700cba13a5fec 100644 (file)
@@ -16,5 +16,6 @@ $messages['connecterror'] = 'Nie udało się zapisać nowego hasła. Błąd poł
 $messages['internalerror'] = 'Nie udało się zapisać nowego hasła.';
 $messages['passwordshort'] = 'Hasło musi posiadać co najmniej $length znaków.';
 $messages['passwordweak'] = 'Hasło musi zawierać co najmniej jedną cyfrę i znak interpunkcyjny.';
+$messages['passwordforbidden'] = 'Hasło zawiera niedozwolone znaki.';
 
 ?>
diff --git a/plugins/password/localization/ru_RU.inc b/plugins/password/localization/ru_RU.inc
new file mode 100644 (file)
index 0000000..5a108d6
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/*
+
++-----------------------------------------------------------------------+
+| plugins/password/localization/ru_RU.inc                               |
+|                                                                       |
+| Language file of the Roundcube help plugin                            |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Sergey Dukachev <iam@dukess.ru>                               |
++-----------------------------------------------------------------------+
+
+*/
+
+$labels = array();
+$labels['changepasswd']  = 'Изменить пароль';
+$labels['curpasswd']  = 'Текущий пароль:';
+$labels['newpasswd']  = 'Новый пароль:';
+$labels['confpasswd']  = 'Подтвердите новый пароль:';
+
+$messages = array();
+$messages['nopassword'] = 'Пожалуйста, введите новый пароль.';
+$messages['nocurpassword'] = 'Пожалуйста, введите текущий пароль.';
+$messages['passwordincorrect'] = 'Текущий пароль неверен.';
+$messages['passwordinconsistency'] = 'Пароли не совпадают, попробуйте, пожалуйста, ещё.';
+$messages['crypterror'] = 'Не могу сохранить новый пароль. Отсутствует криптографическая функция.';
+$messages['connecterror'] = 'Не могу сохранить новый пароль. Ошибка соединения.';
+$messages['internalerror'] = 'Не могу сохранить новый пароль.';
+$messages['passwordshort'] = 'Пароль должен быть длиной как минимум $length символов.';
+$messages['passwordweak'] = 'Пароль должен включать в себя как минимум одну цифру и один знак пунктуации.';
+$messages['passwordforbidden'] = 'Пароль содержит недопустимые символы.';
+
+?>
diff --git a/plugins/password/localization/sk_SK.inc b/plugins/password/localization/sk_SK.inc
new file mode 100644 (file)
index 0000000..6def2f9
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Slovak translation for Roundcube password plugin
+ *
+ * @version 1.0 (2010-10-18)
+ * @author panda <admin@whistler.sk>
+ *
+ */
+
+$labels = array();
+$labels['changepasswd']  = 'Zmeniť heslo';
+$labels['curpasswd']  = 'Súčasné heslo:';
+$labels['newpasswd']  = 'Nové heslo:';
+$labels['confpasswd']  = 'Potvrď nové heslo:';
+
+$messages = array();
+$messages['nopassword'] = 'Prosím zadaj nové heslo.';
+$messages['nocurpassword'] = 'Prosím zadaj súčasné heslo.';
+$messages['passwordincorrect'] = 'Súčasné heslo je nesprávne.';
+$messages['passwordinconsistency'] = 'Heslá nie sú rovnaké, skús znova.';
+$messages['crypterror'] = 'Nemôžem uložiť nové heslo. Chýba šifrovacia funkcia.';
+$messages['connecterror'] = 'Nemôžem uložiť nové heslo. Chyba spojenia.';
+$messages['internalerror'] = 'Nemôžem uložiť nové heslo.';
+$messages['passwordshort'] = 'Heslo musí mať najmenej $length znakov.';
+$messages['passwordweak'] = 'Heslo musí obsahovať aspoň jedno číslo a jedno interpunkčné znamienko.';
+$messages['passwordforbidden'] = 'Heslo obsahuje nepovolené znaky.';
+
+?>
index 5d9398e5c9eb21041eb2c8656c150a82cd5f5821..d649bbd9ac7fee2d8af3d24a12d05547940c407a 100644 (file)
@@ -14,5 +14,8 @@ $messages['passwordinconsistency'] = 'Nya lösenordet och bekräftelsen överens
 $messages['crypterror'] = 'Lösenordet kunde inte ändras. Krypteringsfunktionen saknas.';
 $messages['connecterror'] = 'Lösenordet kunde inte ändras. Anslutningen misslyckades.';
 $messages['internalerror'] = 'Lösenordet kunde inte ändras.';
+$messages['passwordshort'] = 'Lösenordet måste vara minst $length tecken långt.';
+$messages['passwordweak'] = 'Lösenordet måste innehålla minst en siffra och ett specialtecken.';
+$messages['passwordforbidden'] = 'Lösenordet innehåller otillåtna tecken.';
 
 ?>
\ No newline at end of file
diff --git a/plugins/password/localization/tr_TR.inc b/plugins/password/localization/tr_TR.inc
new file mode 100644 (file)
index 0000000..4f2322a
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+$labels = array();
+$labels['changepasswd']  = 'Parolayı Değiştir';
+$labels['curpasswd']  = 'Şu anki Parola:';
+$labels['newpasswd']  = 'Yeni Parola:';
+$labels['confpasswd']  = 'Yeni Parolayı Onaylayın:';
+
+$messages = array();
+$messages['nopassword'] = 'Lütfen yeni şifreyi girin.';
+$messages['nocurpassword'] = 'Lütfen şu anki şifrenizi girin.';
+$messages['passwordincorrect'] = 'Parolanızı yanlış girdiniz.';
+$messages['passwordinconsistency'] = 'Girdiğiniz parolalar uyuşmuyor. Lütfen tekrar deneyin..';
+$messages['crypterror'] = 'Yeni şifre kaydedilemedi. Gerekli fonksiyon eksik.';
+$messages['connecterror'] = 'Yeni şifre kaydedilemedi. Bağlantı hatası.';
+$messages['internalerror'] = 'Yeni şifre kaydedilemedi.';
+$messages['passwordshort'] = 'Parola en az $length karakterden oluşmalı.';
+$messages['passwordweak'] = 'Parola en az bir sayı ve bir noktalama işareti içermeli.';
+$messages['passwordforbidden'] = 'Parola uygunsuz karakter(ler) içeriyor.';
+
+?>
diff --git a/plugins/password/localization/zh_TW.inc b/plugins/password/localization/zh_TW.inc
new file mode 100644 (file)
index 0000000..7d16227
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+$labels = array();
+$labels['changepasswd']  = '更改密碼';
+$labels['curpasswd']  = '目前的密碼';
+$labels['newpasswd']  = '新密碼';
+$labels['confpasswd']  = '確認新密碼';
+
+$messages = array();
+$messages['nopassword'] = '請輸入新密碼';
+$messages['nocurpassword'] = '請輸入目前的密碼';
+$messages['passwordincorrect'] = '目前的密碼錯誤';
+$messages['passwordinconsistency'] = '密碼不相符,請重新輸入';
+$messages['crypterror'] = '無法更新密碼:無加密機制';
+$messages['connecterror'] = '無法更新密碼:連線失敗';
+$messages['internalerror'] = '無法更新密碼';
+$messages['passwordshort'] = '您的密碼至少需 $length 個字元長';
+$messages['passwordweak'] = '您的新密碼至少需含有一個數字與一個標點符號';
+$messages['passwordforbidden'] = '您的密碼含有禁用字元';
+
+?>
diff --git a/plugins/password/package.xml b/plugins/password/package.xml
new file mode 100644 (file)
index 0000000..1d63142
--- /dev/null
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+    http://pear.php.net/dtd/tasks-1.0.xsd
+    http://pear.php.net/dtd/package-2.0
+    http://pear.php.net/dtd/package-2.0.xsd">
+       <name>password</name>
+       <channel>pear.roundcube.net</channel>
+       <summary>Password Change for Roundcube</summary>
+       <description>Plugin that adds a possibility to change user password using many
+        methods (drivers) via Settings/Password tab.
+    </description>
+       <lead>
+               <name>Aleksander Machniak</name>
+               <user>alec</user>
+               <email>alec@alec.pl</email>
+               <active>yes</active>
+       </lead>
+       <date></date>
+       <time></time>
+       <version>
+               <release>2.2</release>
+               <api>1.6</api>
+       </version>
+       <stability>
+               <release>stable</release>
+               <api>stable</api>
+       </stability>
+       <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+       <notes>
+- hMail driver: add username_domain detection (#1487100)
+- hMail driver: HTML tags in logged messages should be stripped off (#1487099)
+- Chpasswd driver: add newline at end of input to chpasswd binary (#1487141)
+- Fix usage of configured temp_dir instead of /tmp (#1487447)
+- ldap_simple driver: fix parse error
+- ldap/ldap_simple drivers: support %dc variable in config
+- ldap/ldap_simple drivers: support Samba password change
+    </notes>
+       <contents>
+               <dir baseinstalldir="/" name="/">
+                       <file name="password.php" role="php">
+                               <tasks:replace from="@name@" to="name" type="package-info"/>
+                               <tasks:replace from="@package_version@" to="version" type="package-info"/>
+                       </file>
+                       <file name="password.js" role="data">
+                               <tasks:replace from="@name@" to="name" type="package-info"/>
+                               <tasks:replace from="@package_version@" to="version" type="package-info"/>
+                       </file>
+            <file name="README" role="data">
+                               <tasks:replace from="@name@" to="name" type="package-info"/>
+                               <tasks:replace from="@package_version@" to="version" type="package-info"/>
+            </file>
+                       <file name="localization/az_AZ.inc" role="data"></file>
+                       <file name="localization/bg_BG.inc" role="data"></file>
+                       <file name="localization/ca_ES.inc" role="data"></file>
+                       <file name="localization/cs_CZ.inc" role="data"></file>
+                       <file name="localization/da_DK.inc" role="data"></file>
+                       <file name="localization/de_CH.inc" role="data"></file>
+                       <file name="localization/de_DE.inc" role="data"></file>
+                       <file name="localization/en_US.inc" role="data"></file>
+                       <file name="localization/es_ES.inc" role="data"></file>
+                       <file name="localization/et_EE.inc" role="data"></file>
+                       <file name="localization/fi_FI.inc" role="data"></file>
+                       <file name="localization/fr_FR.inc" role="data"></file>
+                       <file name="localization/hu_HU.inc" role="data"></file>
+                       <file name="localization/it_IT.inc" role="data"></file>
+                       <file name="localization/lt_LT.inc" role="data"></file>
+                       <file name="localization/lv_LV.inc" role="data"></file>
+                       <file name="localization/nl_NL.inc" role="data"></file>
+                       <file name="localization/pl_PL.inc" role="data"></file>
+                       <file name="localization/pt_BR.inc" role="data"></file>
+                       <file name="localization/pt_PT.inc" role="data"></file>
+                       <file name="localization/sl_SI.inc" role="data"></file>
+                       <file name="localization/sv_SE.inc" role="data"></file>
+                       <file name="localization/zh_TW.inc" role="data"></file>
+
+                       <file name="drivers/chgsaslpasswd.c" role="data"></file>
+            <file name="drivers/chgvirtualminpasswd.c" role="data"></file>
+            <file name="drivers/chpasswd.php" role="php"></file>
+            <file name="drivers/directadmin.php" role="php"></file>
+            <file name="drivers/ldap.php" role="php"></file>
+            <file name="drivers/ldap_simple.php" role="php"></file>
+            <file name="drivers/poppassd.php" role="php"></file>
+            <file name="drivers/sql.php" role="php"></file>
+            <file name="drivers/vpopmaild.php" role="php"></file>
+            <file name="drivers/cpanel.php" role="php"></file>
+            <file name="drivers/hmail.php" role="php"></file>
+            <file name="drivers/pam.php" role="php"></file>
+            <file name="drivers/sasl.php" role="php"></file>
+            <file name="drivers/virtualmin.php" role="php"></file>
+            <file name="drivers/ximss.php" role="php"></file>
+            <file name="drivers/xmail.php" role="php"></file>
+            <file name="drivers/chpass-wrapper.py" role="data"></file>
+
+            <file name="config.inc.php.disc" role="data"></file>
+               </dir>
+               <!-- / -->
+       </contents>
+       <dependencies>
+               <required>
+                       <php>
+                               <min>5.2.1</min>
+                       </php>
+                       <pearinstaller>
+                               <min>1.7.0</min>
+                       </pearinstaller>
+               </required>
+       </dependencies>
+       <phprelease/>
+       <changelog>
+           <release>
+               <date>2010-04-29</date>
+               <time>12:00:00</time>
+               <version>
+                       <release>1.4</release>
+                       <api>1.4</api>
+               </version>
+               <stability>
+                       <release>stable</release>
+                       <api>stable</api>
+               </stability>
+               <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+               <notes>
+- Use mail_domain value for domain variables when there is no domain in username:
+  sql and ldap drivers (#1486694)
+- Created package.xml
+            </notes>
+           </release>
+        <release>
+               <date>2010-06-20</date>
+               <time>12:00:00</time>
+               <version>
+                       <release>1.5</release>
+                       <api>1.5</api>
+               </version>
+               <stability>
+                       <release>stable</release>
+                       <api>stable</api>
+               </stability>
+               <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+               <notes>
+- Removed user_login/username_local/username_domain methods,
+  use rcube_user::get_username instead (#1486707)
+            </notes>
+        </release>
+        <release>
+               <date>2010-08-01</date>
+               <time>09:00:00</time>
+               <version>
+                       <release>1.6</release>
+                       <api>1.5</api>
+               </version>
+               <stability>
+                       <release>stable</release>
+                       <api>stable</api>
+               </stability>
+               <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+               <notes>
+- Added ldap_simple driver
+            </notes>
+        </release>
+        <release>
+               <date>2010-09-10</date>
+               <time>09:00:00</time>
+               <version>
+                       <release>1.7</release>
+                       <api>1.5</api>
+               </version>
+               <stability>
+                       <release>stable</release>
+                       <api>stable</api>
+               </stability>
+               <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+               <notes>
+- Added XMail driver
+- Improve security of chpasswd driver using popen instead of exec+echo (#1486987)
+- Added chpass-wrapper.py script to improve security (#1486987)
+            </notes>
+           </release>
+        <release>
+               <date>2010-09-29</date>
+               <time>19:00:00</time>
+               <version>
+                       <release>1.8</release>
+                       <api>1.6</api>
+               </version>
+               <stability>
+                       <release>stable</release>
+                       <api>stable</api>
+               </stability>
+               <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+               <notes>
+- Added possibility to display extended error messages (#1486704)
+- Added extended error messages in Poppassd driver (#1486704)
+            </notes>
+        </release>
+        <release>
+               <version>
+                       <release>1.9</release>
+                       <api>1.6</api>
+               </version>
+               <stability>
+                       <release>stable</release>
+                       <api>stable</api>
+               </stability>
+               <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+               <notes>
+- Added password_ldap_lchattr option (#1486927)
+            </notes>
+        </release>
+        <release>
+               <date>2010-10-07</date>
+               <time>09:00:00</time>
+               <version>
+                       <release>2.0</release>
+                       <api>1.6</api>
+               </version>
+               <stability>
+                       <release>stable</release>
+                       <api>stable</api>
+               </stability>
+               <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+               <notes>
+- Fixed SQL Injection in SQL driver when using %p or %o variables in query (#1487034)
+            </notes>
+        </release>
+        <release>
+               <date>2010-11-02</date>
+               <time>09:00:00</time>
+               <version>
+                       <release>2.1</release>
+                       <api>1.6</api>
+               </version>
+               <stability>
+                       <release>stable</release>
+                       <api>stable</api>
+               </stability>
+               <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+               <notes>
+- hMail driver: Add possibility to connect to remote host
+            </notes>
+        </release>
+    </changelog>
+</package>
index 8a079de2d98ffa61a6b86f44410297966c9bc3ee..17fe3f7bb51bc60ab39f89aea97fec4dba384579 100644 (file)
@@ -1,4 +1,7 @@
-/* Password change interface (tab) */
+/*
+ * Password plugin script
+ * @version @package_version@
+ */
 
 if (window.rcmail) {
   rcmail.addEventListener('init', function(evt) {
index a03d3540abde89da7b07a54c9811b7354e04c5dc..6d3042b5fa52deaf50ed5a9fb67dba675ea1a417 100644 (file)
@@ -3,9 +3,9 @@
 /*
  +-------------------------------------------------------------------------+
  | Password Plugin for Roundcube                                           |
- | Version 1.3.1                                                           |
+ | @version @package_version@                                                             |
  |                                                                         |
- | Copyright (C) 2009, RoundCube Dev.                                      |
+ | Copyright (C) 2009-2010, Roundcube Dev.                                 |
  |                                                                         |
  | This program is free software; you can redistribute it and/or modify    |
  | it under the terms of the GNU General Public License version 2          |
@@ -42,187 +42,216 @@ define('PASSWORD_SUCCESS', 0);
  *
  * For installation and configuration instructions please read the README file.
  *
- * @version 1.3.1
  * @author Aleksander Machniak
  */
 class password extends rcube_plugin
 {
-  public $task = 'settings';
-
-  function init()
-  {
-    $rcmail = rcmail::get_instance();
-    // add Tab label
-    $rcmail->output->add_label('password');
-    $this->register_action('plugin.password', array($this, 'password_init'));
-    $this->register_action('plugin.password-save', array($this, 'password_save'));
-    $this->include_script('password.js');
-  }
-
-  function password_init()
-  {
-    $this->add_texts('localization/');
-    $this->register_handler('plugin.body', array($this, 'password_form'));
-
-    $rcmail = rcmail::get_instance();
-    $rcmail->output->set_pagetitle($this->gettext('changepasswd'));
-    $rcmail->output->send('plugin');
-  }
-  
-  function password_save()
-  {
-    $rcmail = rcmail::get_instance();
-    $this->load_config();
-
-    $this->add_texts('localization/');
-    $this->register_handler('plugin.body', array($this, 'password_form'));
-    $rcmail->output->set_pagetitle($this->gettext('changepasswd'));
+    public $task    = 'settings';
+    public $noframe = true;
+    public $noajax  = true;
+
+    function init()
+    {
+        $rcmail = rcmail::get_instance();
+        // add Tab label
+        $rcmail->output->add_label('password');
+        $this->register_action('plugin.password', array($this, 'password_init'));
+        $this->register_action('plugin.password-save', array($this, 'password_save'));
+        $this->include_script('password.js');
+    }
 
-    $confirm = $rcmail->config->get('password_confirm_current');
-    $required_length = intval($rcmail->config->get('password_minimum_length'));
-    $check_strength = $rcmail->config->get('password_require_nonalpha');
+    function password_init()
+    {
+        $this->add_texts('localization/');
+        $this->register_handler('plugin.body', array($this, 'password_form'));
 
-    if (($confirm && !isset($_POST['_curpasswd'])) || !isset($_POST['_newpasswd'])) {
-      $rcmail->output->command('display_message', $this->gettext('nopassword'), 'error');
-    }
-    else {
-
-      $curpwd = get_input_value('_curpasswd', RCUBE_INPUT_POST);
-      $newpwd = get_input_value('_newpasswd', RCUBE_INPUT_POST);
-      $conpwd = get_input_value('_confpasswd', RCUBE_INPUT_POST);
-
-      if ($conpwd != $newpwd) {
-        $rcmail->output->command('display_message', $this->gettext('passwordinconsistency'), 'error');
-      }
-      else if ($confirm && $rcmail->decrypt($_SESSION['password']) != $curpwd) {
-        $rcmail->output->command('display_message', $this->gettext('passwordincorrect'), 'error');
-      }
-      else if ($required_length && strlen($newpwd) < $required_length) {
-        $rcmail->output->command('display_message', $this->gettext(
-         array('name' => 'passwordshort', 'vars' => array('length' => $required_length))), 'error');
-      }
-      else if ($check_strength && (!preg_match("/[0-9]/", $newpwd) || !preg_match("/[^A-Za-z0-9]/", $newpwd))) {
-        $rcmail->output->command('display_message', $this->gettext('passwordweak'), 'error');
-      }
-      else if (!($res = $this->_save($curpwd,$newpwd))) {
-        $rcmail->output->command('display_message', $this->gettext('successfullysaved'), 'confirmation');
-        $_SESSION['password'] = $rcmail->encrypt($newpwd);
-      }
-      else
-        $rcmail->output->command('display_message', $res, 'error');
+        $rcmail = rcmail::get_instance();
+        $rcmail->output->set_pagetitle($this->gettext('changepasswd'));
+        $rcmail->output->send('plugin');
     }
 
-    rcmail_overwrite_action('plugin.password');
-    $rcmail->output->send('plugin');
-  }
+    function password_save()
+    {
+        $rcmail = rcmail::get_instance();
+        $this->load_config();
+
+        $this->add_texts('localization/');
+        $this->register_handler('plugin.body', array($this, 'password_form'));
+        $rcmail->output->set_pagetitle($this->gettext('changepasswd'));
+
+        $confirm = $rcmail->config->get('password_confirm_current');
+        $required_length = intval($rcmail->config->get('password_minimum_length'));
+        $check_strength = $rcmail->config->get('password_require_nonalpha');
+
+        if (($confirm && !isset($_POST['_curpasswd'])) || !isset($_POST['_newpasswd'])) {
+            $rcmail->output->command('display_message', $this->gettext('nopassword'), 'error');
+        }
+        else {
+
+            $charset    = strtoupper($rcmail->config->get('password_charset', 'ISO-8859-1'));
+            $rc_charset = strtoupper($rcmail->output->get_charset());
+
+            $curpwd = get_input_value('_curpasswd', RCUBE_INPUT_POST, true, $charset);
+            $newpwd = get_input_value('_newpasswd', RCUBE_INPUT_POST, true);
+            $conpwd = get_input_value('_confpasswd', RCUBE_INPUT_POST, true);
+
+            // check allowed characters according to the configured 'password_charset' option
+            // by converting the password entered by the user to this charset and back to UTF-8
+            $orig_pwd = $newpwd;
+            $chk_pwd = rcube_charset_convert($orig_pwd, $rc_charset, $charset);
+            $chk_pwd = rcube_charset_convert($chk_pwd, $charset, $rc_charset);
+
+            // WARNING: Default password_charset is ISO-8859-1, so conversion will
+            // change national characters. This may disable possibility of using
+            // the same password in other MUA's.
+            // We're doing this for consistence with Roundcube core
+            $newpwd = rcube_charset_convert($newpwd, $rc_charset, $charset);
+            $conpwd = rcube_charset_convert($conpwd, $rc_charset, $charset);
+
+            if ($chk_pwd != $orig_pwd) {
+                $rcmail->output->command('display_message', $this->gettext('passwordforbidden'), 'error');
+            }
+            // other passwords validity checks
+            else if ($conpwd != $newpwd) {
+                $rcmail->output->command('display_message', $this->gettext('passwordinconsistency'), 'error');
+            }
+            else if ($confirm && $rcmail->decrypt($_SESSION['password']) != $curpwd) {
+                $rcmail->output->command('display_message', $this->gettext('passwordincorrect'), 'error');
+            }
+            else if ($required_length && strlen($newpwd) < $required_length) {
+                $rcmail->output->command('display_message', $this->gettext(
+                       array('name' => 'passwordshort', 'vars' => array('length' => $required_length))), 'error');
+            }
+            else if ($check_strength && (!preg_match("/[0-9]/", $newpwd) || !preg_match("/[^A-Za-z0-9]/", $newpwd))) {
+                $rcmail->output->command('display_message', $this->gettext('passwordweak'), 'error');
+            }
+            // try to save the password
+            else if (!($res = $this->_save($curpwd, $newpwd))) {
+                $rcmail->output->command('display_message', $this->gettext('successfullysaved'), 'confirmation');
+                $_SESSION['password'] = $rcmail->encrypt($newpwd);
+            }
+            else {
+                $rcmail->output->command('display_message', $res, 'error');
+            }
+        }
+
+        rcmail_overwrite_action('plugin.password');
+        $rcmail->output->send('plugin');
+    }
 
-  function password_form()
-  {
-    $rcmail = rcmail::get_instance();
-    $this->load_config();
+    function password_form()
+    {
+        $rcmail = rcmail::get_instance();
+        $this->load_config();
 
-    // add some labels to client
-    $rcmail->output->add_label(
-      'password.nopassword',
-      'password.nocurpassword',
-      'password.passwordinconsistency'
-    );
+        // add some labels to client
+        $rcmail->output->add_label(
+            'password.nopassword',
+            'password.nocurpassword',
+            'password.passwordinconsistency'
+        );
 
-    $rcmail->output->set_env('product_name', $rcmail->config->get('product_name'));
+        $rcmail->output->set_env('product_name', $rcmail->config->get('product_name'));
 
-    $table = new html_table(array('cols' => 2));
+        $table = new html_table(array('cols' => 2));
 
-    if ($rcmail->config->get('password_confirm_current')) {
-      // show current password selection
-      $field_id = 'curpasswd';
-      $input_curpasswd = new html_passwordfield(array('name' => '_curpasswd', 'id' => $field_id,
-        'size' => 20, 'autocomplete' => 'off'));
+        if ($rcmail->config->get('password_confirm_current')) {
+            // show current password selection
+            $field_id = 'curpasswd';
+            $input_curpasswd = new html_passwordfield(array('name' => '_curpasswd', 'id' => $field_id,
+                'size' => 20, 'autocomplete' => 'off'));
   
-      $table->add('title', html::label($field_id, Q($this->gettext('curpasswd'))));
-      $table->add(null, $input_curpasswd->show());
+            $table->add('title', html::label($field_id, Q($this->gettext('curpasswd'))));
+            $table->add(null, $input_curpasswd->show());
+        }
+
+        // show new password selection
+        $field_id = 'newpasswd';
+        $input_newpasswd = new html_passwordfield(array('name' => '_newpasswd', 'id' => $field_id,
+            'size' => 20, 'autocomplete' => 'off'));
+
+        $table->add('title', html::label($field_id, Q($this->gettext('newpasswd'))));
+        $table->add(null, $input_newpasswd->show());
+
+        // show confirm password selection
+        $field_id = 'confpasswd';
+        $input_confpasswd = new html_passwordfield(array('name' => '_confpasswd', 'id' => $field_id,
+            'size' => 20, 'autocomplete' => 'off'));
+
+        $table->add('title', html::label($field_id, Q($this->gettext('confpasswd'))));
+        $table->add(null, $input_confpasswd->show());
+
+        $out = html::div(array('class' => 'box'),
+            html::div(array('id' => 'prefs-title', 'class' => 'boxtitle'), $this->gettext('changepasswd')) .
+            html::div(array('class' => 'boxcontent'), $table->show() .
+            html::p(null,
+                $rcmail->output->button(array(
+                    'command' => 'plugin.password-save',
+                    'type' => 'input',
+                    'class' => 'button mainaction',
+                    'label' => 'save'
+            )))));
+
+        $rcmail->output->add_gui_object('passform', 'password-form');
+
+        return $rcmail->output->form_tag(array(
+            'id' => 'password-form',
+            'name' => 'password-form',
+            'method' => 'post',
+            'action' => './?_task=settings&_action=plugin.password-save',
+        ), $out);
     }
 
-    // show new password selection
-    $field_id = 'newpasswd';
-    $input_newpasswd = new html_passwordfield(array('name' => '_newpasswd', 'id' => $field_id,
-      'size' => 20, 'autocomplete' => 'off'));
-
-    $table->add('title', html::label($field_id, Q($this->gettext('newpasswd'))));
-    $table->add(null, $input_newpasswd->show());
-
-    // show confirm password selection
-    $field_id = 'confpasswd';
-    $input_confpasswd = new html_passwordfield(array('name' => '_confpasswd', 'id' => $field_id,
-      'size' => 20, 'autocomplete' => 'off'));
-
-    $table->add('title', html::label($field_id, Q($this->gettext('confpasswd'))));
-    $table->add(null, $input_confpasswd->show());
-
-    $out = html::div(array('class' => 'settingsbox', 'style' => 'margin:0'),
-      html::div(array('id' => 'prefs-title', 'class' => 'boxtitle'), $this->gettext('changepasswd')) .
-      html::div(array('class' => 'boxcontent'), $table->show() .
-        html::p(null,
-          $rcmail->output->button(array(
-            'command' => 'plugin.password-save',
-            'type' => 'input',
-            'class' => 'button mainaction',
-            'label' => 'save'
-        )))
-      )
-    );
-
-    $rcmail->output->add_gui_object('passform', 'password-form');
-
-    return $rcmail->output->form_tag(array(
-      'id' => 'password-form',
-      'name' => 'password-form',
-      'method' => 'post',
-      'action' => './?_task=settings&_action=plugin.password-save',
-      ), $out);
-  }
-
-  private function _save($curpass, $passwd)
-  {
-    $config = rcmail::get_instance()->config;
-    $driver = $this->home.'/drivers/'.$config->get('password_driver', 'sql').'.php';
+    private function _save($curpass, $passwd)
+    {
+        $config = rcmail::get_instance()->config;
+        $driver = $this->home.'/drivers/'.$config->get('password_driver', 'sql').'.php';
     
-    if (!is_readable($driver)) {
-      raise_error(array(
-        'code' => 600,
-        'type' => 'php',
-        'file' => __FILE__,
-        'message' => "Password plugin: Unable to open driver file $driver"
-        ), true, false);
-      return $this->gettext('internalerror');
-    }
+        if (!is_readable($driver)) {
+            raise_error(array(
+                'code' => 600,
+                'type' => 'php',
+                'file' => __FILE__, 'line' => __LINE__,
+                'message' => "Password plugin: Unable to open driver file $driver"
+            ), true, false);
+            return $this->gettext('internalerror');
+        }
     
-    include($driver);
-
-    if (!function_exists('password_save')) {
-      raise_error(array(
-        'code' => 600,
-        'type' => 'php',
-        'file' => __FILE__,
-        'message' => "Password plugin: Broken driver: $driver"
-        ), true, false);
-      return $this->gettext('internalerror');
-    }
-
-    $result = password_save($curpass, $passwd);
-
-    switch ($result) {
-      case PASSWORD_SUCCESS:
-        return;
-      case PASSWORD_CRYPT_ERROR;
-        return $this->gettext('crypterror');
-      case PASSWORD_CONNECT_ERROR;
-        return $this->gettext('connecterror');
-      case PASSWORD_ERROR:
-      default:
-        return $this->gettext('internalerror');
-    }
-  }
-
+        include($driver);
+
+        if (!function_exists('password_save')) {
+            raise_error(array(
+                'code' => 600,
+                'type' => 'php',
+                'file' => __FILE__, 'line' => __LINE__,
+                'message' => "Password plugin: Broken driver: $driver"
+            ), true, false);
+            return $this->gettext('internalerror');
+        }
+
+        $result = password_save($curpass, $passwd);
+
+        if (is_array($result)) {
+            $result  = $result['code'];
+            $message = $result['message'];
+        }
+
+        switch ($result) {
+            case PASSWORD_SUCCESS:
+                return;
+            case PASSWORD_CRYPT_ERROR;
+                $reason = $this->gettext('crypterror');
+            case PASSWORD_CONNECT_ERROR;
+                $reason = $this->gettext('connecterror');
+            case PASSWORD_ERROR:
+            default:
+                $reason = $this->gettext('internalerror');
+        }
+
+        if ($message) {
+            $reason .= ' ' . $message;
+        }
+
+        return $reason;
+    }                                     
 }
-
-?>
index 7e7c50354ce10ed968d137351ab790d1d6e288de..1cbe690e9ac9379ebb042c9457f54617dfaf8b27 100644 (file)
@@ -32,7 +32,7 @@ class show_additional_headers extends rcube_plugin
   function imap_init($p)
   {
     $rcmail = rcmail::get_instance();
-    if ($add_headers = $rcmail->config->get('show_additional_headers', array()))
+    if ($add_headers = (array)$rcmail->config->get('show_additional_headers', array()))
       $p['fetch_headers'] = trim($p['fetch_headers'].' ' . strtoupper(join(' ', $add_headers)));
 
     return $p;
@@ -41,7 +41,7 @@ class show_additional_headers extends rcube_plugin
   function message_headers($p)
   {
     $rcmail = rcmail::get_instance();
-    foreach ($rcmail->config->get('show_additional_headers', array()) as $header) {
+    foreach ((array)$rcmail->config->get('show_additional_headers', array()) as $header) {
       $key = strtolower($header);
       if ($value = $p['headers']->others[$key])
         $p['output'][$key] = array('title' => $header, 'value' => $value);
index 5c2560f1555a3a0fbfb82b8147d64ef346595caf..0dc0abb02c79edec61d127e3d7c3d2a79d682248 100644 (file)
@@ -1,5 +1,25 @@
 <?php
 
+// Driver - 'file' or 'sql'
+$rcmail_config['squirrelmail_driver'] = 'sql';
+
 // full path to the squirrelmail data directory
 $rcmail_config['squirrelmail_data_dir'] = '';
+$rcmail_config['squirrelmail_data_dir_hash_level'] = 0;
+
+// 'mysql://dbuser:dbpass@localhost/database'
+$rcmail_config['squirrelmail_dsn'] = 'mysql://user:password@localhost/webmail';
+$rcmail_config['squirrelmail_db_charset'] = 'iso-8859-1';
+
+$rcmail_config['squirrelmail_address_table'] = 'address';
+$rcmail_config['squirrelmail_userprefs_table'] = 'userprefs';
+
+// identities_level option value for squirrelmail plugin
+// With this you can bypass/change identities_level checks
+// for operations inside this plugin. See #1486773
+$rcmail_config['squirrelmail_identities_level'] = null;
 
+// Set to false if you don't want the email address of the default identity
+// (squirrelmail preference "email_address") to be saved as alias.
+// Recommended: set to false if your squirrelmail config setting $edit_identity has been true.
+$rcmail_config['squirrelmail_set_alias'] = true;
index 4a14ff2c928f7ba7a3a3ef3dc46b4b67fa86f12c..5d7cc012e320ddb16e4410079dfc0bc0260eb155 100644 (file)
@@ -3,51 +3,83 @@
 /**
  * Copy a new users identity and settings from a nearby Squirrelmail installation
  *
- * Currently only file-based data storage of Squirrelmail is supported.
- *
- * @version 1.0
- * @author Thomas Bruederli
+ * @version 1.4
+ * @author Thomas Bruederli, Johannes Hessellund, pommi, Thomas Lueder
  */
 class squirrelmail_usercopy extends rcube_plugin
 {
+       public $task = 'login';
+
        private $prefs = null;
+       private $identities_level = 0;
        private $abook = array();
 
        public function init()
        {
-               $this->add_hook('create_user', array($this, 'create_user'));
-               $this->add_hook('create_identity', array($this, 'create_identity'));
+               $this->add_hook('user_create', array($this, 'create_user'));
+               $this->add_hook('identity_create', array($this, 'create_identity'));
        }
 
        public function create_user($p)
        {
+               $rcmail = rcmail::get_instance();
+
+               // Read plugin's config
+               $this->initialize();
+
                // read prefs and add email address
                $this->read_squirrel_prefs($p['user']);
-               if ($this->prefs['email_address'])
+               if (($this->identities_level == 0 || $this->identities_level == 2) && $rcmail->config->get('squirrelmail_set_alias') && $this->prefs['email_address'])
                        $p['user_email'] = $this->prefs['email_address'];
-
                return $p;
        }
 
        public function create_identity($p)
        {
-               // only execute on login
-               if ($p['login'] && $this->prefs) {
+               $rcmail = rcmail::get_instance();
+
+               // prefs are set in create_user()
+               if ($this->prefs) {
                        if ($this->prefs['full_name'])
                                $p['record']['name'] = $this->prefs['full_name'];
-                       if ($this->prefs['email_address'])
+                       if (($this->identities_level == 0 || $this->identities_level == 2) && $this->prefs['email_address'])
                                $p['record']['email'] = $this->prefs['email_address'];
-                       if ($this->prefs['signature'])
-                               $p['record']['signature'] = $this->prefs['signature'];
-               
+                       if ($this->prefs['___signature___'])
+                               $p['record']['signature'] = $this->prefs['___signature___'];
+                       if ($this->prefs['reply_to']) 
+                               $p['record']['reply-to'] = $this->prefs['reply_to']; 
+                       if (($this->identities_level == 0 || $this->identities_level == 1) && isset($this->prefs['identities']) && $this->prefs['identities'] > 1) {
+                               for ($i=1; $i < $this->prefs['identities']; $i++) {
+                                       unset($ident_data);
+                                       $ident_data = array('name' => '', 'email' => ''); // required data
+                                       if ($this->prefs['full_name'.$i])
+                                               $ident_data['name'] = $this->prefs['full_name'.$i];
+                                       if ($this->identities_level == 0 && $this->prefs['email_address'.$i])
+                                               $ident_data['email'] = $this->prefs['email_address'.$i];
+                                       else
+                                               $ident_data['email'] = $p['record']['email'];
+                                       if ($this->prefs['reply_to'.$i])
+                                               $ident_data['reply-to'] = $this->prefs['reply_to'.$i];
+                                       if ($this->prefs['___sig'.$i.'___'])
+                                               $ident_data['signature'] = $this->prefs['___sig'.$i.'___'];
+                                       // insert identity
+                                       $identid = $rcmail->user->insert_identity($ident_data);
+                               }
+                       }
+
                        // copy address book
-                       $rcmail = rcmail::get_instance();
                        $contacts = $rcmail->get_address_book(null, true);
                        if ($contacts && count($this->abook)) {
-                               foreach ($this->abook as $rec)
-                                       $contacts->insert($rec, true);
+                               foreach ($this->abook as $rec) {
+                                   // #1487096 handle multi-address and/or too long items
+                                   $rec['email'] = array_shift(explode(';', $rec['email']));
+                    if (check_email(idn_to_ascii($rec['email']))) {
+                        $rec['email'] = idn_to_utf8($rec['email']);
+                                       $contacts->insert($rec, true);
+                               }
+                           }
                        }
-                       
+
                        // mark identity as complete for following hooks
                        $p['complete'] = true;
                }
@@ -55,15 +87,33 @@ class squirrelmail_usercopy extends rcube_plugin
                return $p;
        }
 
-       private function read_squirrel_prefs($uname)
+       private function initialize()
        {
+               $rcmail = rcmail::get_instance();
+
+               // Load plugin's config file
                $this->load_config();
+
+               // Set identities_level for operations of this plugin
+               $ilevel = $rcmail->config->get('squirrelmail_identities_level');
+               if ($ilevel === null)
+                       $ilevel = $rcmail->config->get('identities_level', 0);
+
+               $this->identities_level = intval($ilevel);
+       }
+
+       private function read_squirrel_prefs($uname)
+       {
                $rcmail = rcmail::get_instance();
 
-               if ($srcdir = $rcmail->config->get('squirrelmail_data_dir')) {
+               /**** File based backend ****/
+               if ($rcmail->config->get('squirrelmail_driver') == 'file' && ($srcdir = $rcmail->config->get('squirrelmail_data_dir'))) {
+                       if (($hash_level = $rcmail->config->get('squirrelmail_data_dir_hash_level')) > 0) 
+                               $srcdir = slashify($srcdir).chunk_split(substr(base_convert(crc32($uname), 10, 16), 0, $hash_level), 1, '/');
                        $prefsfile = slashify($srcdir) . $uname . '.pref';
                        $abookfile = slashify($srcdir) . $uname . '.abook';
                        $sigfile = slashify($srcdir) . $uname . '.sig';
+                       $sigbase = slashify($srcdir) . $uname . '.si';
 
                        if (is_readable($prefsfile)) {
                                $this->prefs = array();
@@ -74,7 +124,16 @@ class squirrelmail_usercopy extends rcube_plugin
 
                                // also read signature file if exists
                                if (is_readable($sigfile)) {
-                                       $this->prefs['signature'] = utf8_encode(file_get_contents($sigfile));
+                                       $this->prefs['___signature___'] = utf8_encode(file_get_contents($sigfile));
+                               }
+
+                               if (isset($this->prefs['identities']) && $this->prefs['identities'] > 1) {
+                                       for ($i=1; $i < $this->prefs['identities']; $i++) {
+                                               // read signature file if exists
+                                               if (is_readable($sigbase.$i)) {
+                                                       $this->prefs['___sig'.$i.'___'] = utf8_encode(file_get_contents($sigbase.$i));
+                                               }
+                                       }
                                }
 
                                // parse addres book file
@@ -86,9 +145,46 @@ class squirrelmail_usercopy extends rcube_plugin
                                        }
                                }
                        }
-               }
+               } 
+               /**** Database backend ****/
+               else if ($rcmail->config->get('squirrelmail_driver') == 'sql') { 
+                       $this->prefs = array();
+
+                       /* connect to squirrelmail database */
+                       $db = new rcube_mdb2($rcmail->config->get('squirrelmail_dsn'));
+                       $db->db_connect('r'); // connect in read mode
+
+                       // $db->set_debug(true);
+
+                       /* retrieve prefs */
+                       $userprefs_table = $rcmail->config->get('squirrelmail_userprefs_table');
+                       $address_table = $rcmail->config->get('squirrelmail_address_table');
+                       $db_charset = $rcmail->config->get('squirrelmail_db_charset');
+
+                       if ($db_charset)
+                               $db->query('SET NAMES '.$db_charset);
+
+                       $sql_result = $db->query('SELECT * FROM '.$userprefs_table.' WHERE user=?', $uname); // ? is replaced with emailaddress
+
+                       while ($sql_array = $db->fetch_assoc($sql_result) ) { // fetch one row from result
+                               $this->prefs[$sql_array['prefkey']] = rcube_charset_convert(rtrim($sql_array['prefval']), $db_charset);
+                       }
+
+                       /* retrieve address table data */
+                       $sql_result = $db->query('SELECT * FROM '.$address_table.' WHERE owner=?', $uname); // ? is replaced with emailaddress
+
+                       // parse addres book
+                       while ($sql_array = $db->fetch_assoc($sql_result) ) { // fetch one row from result
+                               $rec['name']      = rcube_charset_convert(rtrim($sql_array['nickname']), $db_charset);
+                               $rec['firstname'] = rcube_charset_convert(rtrim($sql_array['firstname']), $db_charset);
+                               $rec['surname']   = rcube_charset_convert(rtrim($sql_array['lastname']), $db_charset);
+                               $rec['email']     = rcube_charset_convert(rtrim($sql_array['email']), $db_charset);
+                               $rec['note']      = rcube_charset_convert(rtrim($sql_array['label']), $db_charset);
+
+                               if ($rec['name'] && $rec['email'])
+                                       $this->abook[] = $rec;
+                       }
+               } // end if 'sql'-driver
        }
 
 }
-
-?>
\ No newline at end of file
index ca637fc6c220bd5696ddb1fe1445684e7e31235a..d625201971e2129e9179243e38114461eca57341 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/cs_CZ/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube subscriptions option plugin            |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube subscriptions option plugin            |
+| Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
diff --git a/plugins/subscriptions_option/localization/es_ES.inc b/plugins/subscriptions_option/localization/es_ES.inc
new file mode 100644 (file)
index 0000000..ca9a421
--- /dev/null
@@ -0,0 +1,6 @@
+<?php
+
+$labels = array();
+$labels['useimapsubscriptions']  = 'Usar suscripciones IMAP';
+
+?>
diff --git a/plugins/subscriptions_option/localization/ja_JP.inc b/plugins/subscriptions_option/localization/ja_JP.inc
new file mode 100644 (file)
index 0000000..dacea29
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+//  EN-Revision: 3891
+
+$labels = array();
+$labels['useimapsubscriptions']  = 'IMAP 購読リストを使う';
+
+?>
diff --git a/plugins/subscriptions_option/localization/zh_TW.inc b/plugins/subscriptions_option/localization/zh_TW.inc
new file mode 100644 (file)
index 0000000..f310b51
--- /dev/null
@@ -0,0 +1,6 @@
+<?php
+
+$labels = array();
+$labels['useimapsubscriptions']  = '使用IMAP訂閱';
+
+?>
index ecbc4e238aed09ce27211d89c5c5e1309afb625c..d9c5ce7db8b8b498bc8e99e6615b1d30cade7408 100644 (file)
@@ -31,11 +31,11 @@ class subscriptions_option extends rcube_plugin
         $this->add_texts('localization/', false);
         $dont_override = rcmail::get_instance()->config->get('dont_override', array());
         if (!in_array('use_subscriptions', $dont_override)) {
-            $this->add_hook('user_preferences', array($this, 'settings_blocks'));
-            $this->add_hook('save_preferences', array($this, 'save_prefs'));
+            $this->add_hook('preferences_list', array($this, 'settings_blocks'));
+            $this->add_hook('preferences_save', array($this, 'save_prefs'));
         }
-        $this->add_hook('list_mailboxes', array($this, 'list_mailboxes'));
-        $this->add_hook('manage_folders', array($this, 'manage_folders'));
+        $this->add_hook('mailboxes_list', array($this, 'mailboxes_list'));
+        $this->add_hook('folders_list', array($this, 'folders_list'));
     }
 
     function settings_blocks($args)
@@ -65,23 +65,23 @@ class subscriptions_option extends rcube_plugin
             // if the use_subscriptions preference changes, flush the folder cache
             if (($use_subscriptions && !isset($_POST['_use_subscriptions'])) ||
                 (!$use_subscriptions && isset($_POST['_use_subscriptions']))) {
-                    $rcmail->imap_init(true);
+                    $rcmail->imap_connect();
                     $rcmail->imap->clear_cache('mailboxes');
             }
         }
         return $args;
     }
 
-    function list_mailboxes($args)
+    function mailboxes_list($args)
     {
         $rcmail = rcmail::get_instance();
         if (!$rcmail->config->get('use_subscriptions', true)) {
-            $args['folders'] = iil_C_ListMailboxes($rcmail->imap->conn, $rcmail->imap->mod_mailbox($args['root']), $args['filter']);
+            $args['folders'] = $rcmail->imap->conn->listMailboxes($rcmail->imap->mod_mailbox($args['root']), $args['filter']);
         }
         return $args;
     }
 
-    function manage_folders($args)
+    function folders_list($args)
     {
         $rcmail = rcmail::get_instance();
         if (!$rcmail->config->get('use_subscriptions', true)) {
index 812ca7b2a74114d743fc35e29a89941b760a87b8..30f8221c99135fe39edeb90b209a051b3d328760 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/cs_CZ/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube userinfo plugin                        |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube userinfo plugin                        |
+| Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
diff --git a/plugins/userinfo/localization/da_DK.inc b/plugins/userinfo/localization/da_DK.inc
new file mode 100644 (file)
index 0000000..0fed309
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+
+$labels = array();
+$labels['userinfo'] = 'Bruger info';
+$labels['created'] = 'Oprettet';
+$labels['lastlogin'] = 'Sidste login';
+$labels['defaultidentity'] = 'Standard identitet';
+
+?>
diff --git a/plugins/userinfo/localization/es_ES.inc b/plugins/userinfo/localization/es_ES.inc
new file mode 100644 (file)
index 0000000..dd6662f
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+
+$labels = array();
+$labels['userinfo'] = 'Información de usuario';
+$labels['created'] = 'Creado';
+$labels['lastlogin'] = 'Última conexión';
+$labels['defaultidentity'] = 'Identidad predeterminada';
+
+?>
\ No newline at end of file
diff --git a/plugins/userinfo/localization/ja_JP.inc b/plugins/userinfo/localization/ja_JP.inc
new file mode 100644 (file)
index 0000000..1fd4eaf
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+
+//  EN-Revision: 3891
+
+$labels = array();
+$labels['userinfo'] = 'ユーザー情報';
+$labels['created'] = '作成日';
+$labels['lastlogin'] = '最終ログイン';
+$labels['defaultidentity'] = '標準の識別情報';
+
+?>
\ No newline at end of file
diff --git a/plugins/userinfo/localization/ru_RU.inc b/plugins/userinfo/localization/ru_RU.inc
new file mode 100644 (file)
index 0000000..0e7ed4f
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+
+$labels = array();
+$labels['userinfo'] = 'Информация';
+$labels['created'] = 'Создан';
+$labels['lastlogin'] = 'Последний вход';
+$labels['defaultidentity'] = 'Профиль по умолчанию';
+
+?>
diff --git a/plugins/userinfo/localization/zh_TW.inc b/plugins/userinfo/localization/zh_TW.inc
new file mode 100644 (file)
index 0000000..d312445
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+
+$labels = array();
+$labels['userinfo'] = '使用者資訊';
+$labels['created'] = '建立時間';
+$labels['lastlogin'] = '上次登入';
+$labels['defaultidentity'] = '預設身份';
+
+?>
index 0f1b18cd9296c165edb01d7cab42001127ab890b..efb65f51d5d58a91038eaf654593bc0bda610143 100644 (file)
@@ -6,7 +6,9 @@
  */
 class userinfo extends rcube_plugin
 {
-  public $task = 'settings';
+  public $task    = 'settings';
+  public $noajax  = true;
+  public $noframe = true;
 
   function init()
   {
@@ -50,4 +52,4 @@ class userinfo extends rcube_plugin
     return html::tag('h4', null, Q('Infos for ' . $user->get_username())) . $table->show();
   }
 
-}
\ No newline at end of file
+}
diff --git a/plugins/vcard_attachments/localization/cs_CZ.inc b/plugins/vcard_attachments/localization/cs_CZ.inc
new file mode 100644 (file)
index 0000000..5d7c9c4
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+/*
++-----------------------------------------------------------------------+
+| language/cs_CZ/labels.inc                                             |
+|                                                                       |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2008-2010, RoundQube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Ales Pospichal <ales@pospichalales.info>                      |
++-----------------------------------------------------------------------+
+
+*/
+
+$labels = array();
+$labels['addvcardmsg'] = 'Přidat vCard do adresáře';
+$labels['vcardsavefailed'] = 'Nelze uložit vCard';
+
+?>
index dcc8ce713112f697cd5e0665d29da470a975f787..48bb9001396bc36be1466435426a7b6616b83540 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 $labels = array();
-$labels['addvardmsg'] = 'Kontakt im Adressbuch speichern';
+$labels['addvcardmsg'] = 'Kontakt im Adressbuch speichern';
 $labels['vcardsavefailed'] = 'Der Kontakt konnte nicht gespeichert werden';
 
 ?>
\ No newline at end of file
index dcc8ce713112f697cd5e0665d29da470a975f787..48bb9001396bc36be1466435426a7b6616b83540 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 $labels = array();
-$labels['addvardmsg'] = 'Kontakt im Adressbuch speichern';
+$labels['addvcardmsg'] = 'Kontakt im Adressbuch speichern';
 $labels['vcardsavefailed'] = 'Der Kontakt konnte nicht gespeichert werden';
 
 ?>
\ No newline at end of file
index 59a36e9bd2098734ba9dbc9f3afbf2ae33d3b9dc..bce44d7391697b70417ecfe19c05685e1e2e8ac4 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 $labels = array();
-$labels['addvardmsg'] = 'Add vCard to addressbook';
+$labels['addvcardmsg'] = 'Add vCard to addressbook';
 $labels['vcardsavefailed'] = 'Unable to save vCard';
 
 ?>
\ No newline at end of file
diff --git a/plugins/vcard_attachments/localization/es_ES.inc b/plugins/vcard_attachments/localization/es_ES.inc
new file mode 100644 (file)
index 0000000..c00b499
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['addvcardmsg'] = 'Añadir tarjeta a la libreta de direcciones';
+$labels['vcardsavefailed'] = 'Imposible guardar la tarjeta';
+
+?>
\ No newline at end of file
diff --git a/plugins/vcard_attachments/localization/et_EE.inc b/plugins/vcard_attachments/localization/et_EE.inc
new file mode 100644 (file)
index 0000000..eb6ce23
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['addvcardmsg'] = 'Lisa vCard aadressiraamatusse';
+$labels['vcardsavefailed'] = 'vCard salvestamine nurjus';
+
+?>
diff --git a/plugins/vcard_attachments/localization/it_IT.inc b/plugins/vcard_attachments/localization/it_IT.inc
new file mode 100644 (file)
index 0000000..55cde39
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['addvcardmsg'] = 'Aggiungi vCard alla Agenda';
+$labels['vcardsavefailed'] = 'Abilita a salvare vCard';
+
+?>
diff --git a/plugins/vcard_attachments/localization/ja_JP.inc b/plugins/vcard_attachments/localization/ja_JP.inc
new file mode 100644 (file)
index 0000000..0b4d0d9
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+
+//  EN-Revision: 3891
+
+$labels = array();
+$labels['addvardmsg'] = 'アドレス帳に vCard を追加する';
+$labels['vcardsavefailed'] = 'vCard を保存できませんでした。';
+
+?>
\ No newline at end of file
diff --git a/plugins/vcard_attachments/localization/pl_PL.inc b/plugins/vcard_attachments/localization/pl_PL.inc
new file mode 100644 (file)
index 0000000..800e35b
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['addvcardmsg'] = 'Dodaj wizytówkę (vCard) do kontaktów';
+$labels['vcardsavefailed'] = 'Nie można zapisać wizytówki (vCard)';
+
+?>
index e127b58d6cd5cd9a6e51f23ab33924d6ebb40698..1688c5dc8abb974d5f4c57a80c67ea06e93592bd 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 $labels = array();
-$labels['addvardmsg'] = 'Добавить в контакты';
+$labels['addvcardmsg'] = 'Добавить в контакты';
 $labels['vcardsavefailed'] = 'Не удалось сохранить vCard';
 
 ?>
\ No newline at end of file
diff --git a/plugins/vcard_attachments/localization/sv_SE.inc b/plugins/vcard_attachments/localization/sv_SE.inc
new file mode 100644 (file)
index 0000000..4c9fadd
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['addvcardmsg'] = 'Lägg till vCard i adressbok';
+$labels['vcardsavefailed'] = 'Kunde inte spara vCard';
+
+?>
\ No newline at end of file
diff --git a/plugins/vcard_attachments/localization/zh_TW.inc b/plugins/vcard_attachments/localization/zh_TW.inc
new file mode 100644 (file)
index 0000000..361837b
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+$labels = array();
+$labels['addvcardmsg'] = '加入 vCard 到通訊錄';
+$labels['vcardsavefailed'] = '無法儲存 vCard';
+
+?>
\ No newline at end of file
diff --git a/plugins/vcard_attachments/package.xml b/plugins/vcard_attachments/package.xml
new file mode 100644 (file)
index 0000000..714750b
--- /dev/null
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.9.0" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+    http://pear.php.net/dtd/tasks-1.0.xsd
+    http://pear.php.net/dtd/package-2.0
+    http://pear.php.net/dtd/package-2.0.xsd">
+       <name>vcard_attachments</name>
+       <channel>pear.roundcube.net</channel>
+       <summary>vCard handler for Roundcube</summary>
+       <description>This plugin detects vCard attachments/bodies and shows a button(s) to add them to address book</description>
+       <lead>
+               <name>Thomas Bruederli</name>
+               <user>thomasb</user>
+               <email>roundcube@gmail.com</email>
+               <active>yes</active>
+       </lead>
+       <lead>
+               <name>Aleksander Machniak</name>
+               <user>alec</user>
+               <email>alec@alec.pl</email>
+               <active>yes</active>
+       </lead>
+       <date>2010-10-14</date>
+       <time>19:00</time>
+       <version>
+               <release>3.0</release>
+               <api>3.0</api>
+       </version>
+       <stability>
+               <release>stable</release>
+               <api>stable</api>
+       </stability>
+       <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+       <notes>
+- Exec contact_create hook when adding contact (#1486964)
+- Make icons skinable
+- Display vcard icon on messages list when message is of type vcard
+    </notes>
+       <contents>
+               <dir baseinstalldir="/" name="/">
+                       <file name="vcard_attachments.php" role="php">
+                               <tasks:replace from="@name@" to="name" type="package-info"/>
+                               <tasks:replace from="@package_version@" to="version" type="package-info"/>
+                       </file>
+                       <file name="vcardattach.js" role="data">
+                               <tasks:replace from="@name@" to="name" type="package-info"/>
+                               <tasks:replace from="@package_version@" to="version" type="package-info"/>
+                       </file>
+                       <file name="localization/cs_CZ.inc" role="data"></file>
+                       <file name="localization/en_US.inc" role="data"></file>
+                       <file name="localization/de_CH.inc" role="data"></file>
+                       <file name="localization/de_DE.inc" role="data"></file>
+                       <file name="localization/es_ES.inc" role="data"></file>
+                       <file name="localization/et_EE.inc" role="data"></file>
+                       <file name="localization/it_IT.inc" role="data"></file>
+                       <file name="localization/ja_JP.inc" role="data"></file>
+                       <file name="localization/es_ES.inc" role="data"></file>
+                       <file name="localization/pl_PL.inc" role="data"></file>
+                       <file name="localization/ru_RU.inc" role="data"></file>
+                       <file name="localization/sv_SE.inc" role="data"></file>
+                       <file name="localization/zh_TW.inc" role="data"></file>
+                       <file name="skins/default/vcard_add_contact.png" role="data"></file>
+                       <file name="skins/default/vcard.png" role="data"></file>
+               </dir>
+               <!-- / -->
+       </contents>
+       <dependencies>
+               <required>
+                       <php>
+                               <min>5.2.1</min>
+                       </php>
+                       <pearinstaller>
+                               <min>1.7.0</min>
+                       </pearinstaller>
+               </required>
+       </dependencies>
+       <phprelease/>
+       <changelog>
+           <release>
+               <date>2010-04-28</date>
+               <time>12:00:00</time>
+            <version>
+                       <release>2.0</release>
+                       <api>2.0</api>
+               </version>
+               <stability>
+                       <release>stable</release>
+                       <api>stable</api>
+               </stability>
+               <license uri="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPLv2</license>
+               <notes>
+- Added support for Content-Type: text/directory; profile=vCard
+- Added handler for message bodies of type vCard (#1486683)
+- Added support for more than one vCard attachment/body
+- Added support for more than one contact in one vCard file
+- Created package.xml
+            </notes>
+        </release>
+       </changelog>
+</package>
diff --git a/plugins/vcard_attachments/skins/default/vcard.png b/plugins/vcard_attachments/skins/default/vcard.png
new file mode 100644 (file)
index 0000000..8bf6b1b
Binary files /dev/null and b/plugins/vcard_attachments/skins/default/vcard.png differ
diff --git a/plugins/vcard_attachments/skins/default/vcard_add_contact.png b/plugins/vcard_attachments/skins/default/vcard_add_contact.png
new file mode 100644 (file)
index 0000000..478c1f3
Binary files /dev/null and b/plugins/vcard_attachments/skins/default/vcard_add_contact.png differ
diff --git a/plugins/vcard_attachments/vcard_add_contact.png b/plugins/vcard_attachments/vcard_add_contact.png
deleted file mode 100644 (file)
index 478c1f3..0000000
Binary files a/plugins/vcard_attachments/vcard_add_contact.png and /dev/null differ
index d23cf37b1ef61460c7e2ca2d8f87fa7846a70a10..3fb3bf9adc2d7912e95d10a88c000b6b90b033e9 100644 (file)
 /**
  * Detect VCard attachments and show a button to add them to address book
  *
- * @version 1.0
- * @author Thomas Bruederli
+ * @version @package_version@
+ * @author Thomas Bruederli, Aleksander Machniak
  */
 class vcard_attachments extends rcube_plugin
 {
-  public $task = 'mail';
-  
-  private $message;
-  private $vcard_part;
-
-  function init()
-  {
-    $rcmail = rcmail::get_instance();
-    if ($rcmail->action == 'show' || $rcmail->action == 'preview') {
-      $this->add_hook('message_load', array($this, 'message_load'));
-      $this->add_hook('template_object_messagebody', array($this, 'html_output'));
+    public $task = 'mail';
+
+    private $message;
+    private $vcard_parts = array();
+    private $vcard_bodies = array();
+
+    function init()
+    {
+        $rcmail = rcmail::get_instance();
+        if ($rcmail->action == 'show' || $rcmail->action == 'preview') {
+            $this->add_hook('message_load', array($this, 'message_load'));
+            $this->add_hook('template_object_messagebody', array($this, 'html_output'));
+        }
+        else if (!$rcmail->output->framed && (!$rcmail->action || $rcmail->action == 'list')) {
+            $icon = 'plugins/vcard_attachments/' .$this->local_skin_path(). '/vcard.png';
+            $rcmail->output->set_env('vcard_icon', $icon);
+            $this->include_script('vcardattach.js');
+        }
+
+        $this->register_action('plugin.savevcard', array($this, 'save_vcard'));
     }
-    
-    $this->register_action('plugin.savevcard', array($this, 'save_vcard'));
-  }
-  
-  /**
-   * Check message attachments for vcards
-   */
-  function message_load($p)
-  {
-    $this->message = $p['object'];
-    
-    foreach ((array)$this->message->attachments as $attachment) {
-      if (in_array($attachment->mimetype, array('text/vcard', 'text/x-vcard')))
-        $this->vcard_part = $attachment->mime_id;
+
+    /**
+     * Check message bodies and attachments for vcards
+     */
+    function message_load($p)
+    {
+        $this->message = $p['object'];
+
+        // handle attachments vcard attachments
+        foreach ((array)$this->message->attachments as $attachment) {
+            if ($this->is_vcard($attachment)) {
+                $this->vcard_parts[] = $attachment->mime_id;
+            }
+        }
+        // the same with message bodies
+        foreach ((array)$this->message->parts as $idx => $part) {
+            if ($this->is_vcard($part)) {
+                $this->vcard_parts[] = $part->mime_id;
+                $this->vcard_bodies[] = $part->mime_id;
+            }
+        }
+
+        if ($this->vcard_parts)
+            $this->add_texts('localization');
     }
 
-    if ($this->vcard_part)
-      $this->add_texts('localization');
-  }
-  
-  /**
-   * This callback function adds a box below the message content
-   * if there is a vcard attachment available
-   */
-  function html_output($p)
-  {
-    if ($this->vcard_part) {
-      $vcard = new rcube_vcard($this->message->get_part_content($this->vcard_part));
-      
-      // successfully parsed vcard
-      if ($vcard->displayname) {
-        $display = $vcard->displayname;
-        if ($vcard->email[0])
-          $display .= ' <'.$vcard->email[0].'>';
-        
-        // add box below messsage body
-        $p['content'] .= html::p(array('style' => "margin:1em; padding:0.5em; border:1px solid #999; border-radius:4px; -moz-border-radius:4px; -webkit-border-radius:4px; width: auto;"),
-          html::a(array(
-              'href' => "#",
-              'onclick' => "return plugin_vcard_save_contact('".JQ($this->vcard_part)."')",
-              'title' => $this->gettext('addvardmsg')),
-            html::img(array('src' => $this->url('vcard_add_contact.png'), 'align' => "middle")))
-            . ' ' . html::span(null, Q($display)));
-        
-        $this->include_script('vcardattach.js');
-      }
+    /**
+     * This callback function adds a box below the message content
+     * if there is a vcard attachment available
+     */
+    function html_output($p)
+    {
+        $attach_script = false;
+        $icon = 'plugins/vcard_attachments/' .$this->local_skin_path(). '/vcard_add_contact.png';
+
+        foreach ($this->vcard_parts as $part) {
+            $vcards = rcube_vcard::import($this->message->get_part_content($part));
+
+            // successfully parsed vcards?
+            if (empty($vcards))
+                continue;
+
+            // remove part's body
+            if (in_array($part, $this->vcard_bodies))
+                $p['content'] = '';
+
+            $style = 'margin:0.5em 1em; padding:0.2em 0.5em; border:1px solid #999; '
+                .'border-radius:4px; -moz-border-radius:4px; -webkit-border-radius:4px; width: auto';
+
+            foreach ($vcards as $idx => $vcard) {
+                $display = $vcard->displayname;
+                if ($vcard->email[0])
+                    $display .= ' <'.$vcard->email[0].'>';
+
+                // add box below messsage body
+                $p['content'] .= html::p(array('style' => $style),
+                    html::a(array(
+                        'href' => "#",
+                        'onclick' => "return plugin_vcard_save_contact('".JQ($part.':'.$idx)."')",
+                        'title' => $this->gettext('addvcardmsg')),
+                        html::img(array('src' => $icon, 'style' => "vertical-align:middle")))
+                    . ' ' . html::span(null, Q($display)));
+            }
+
+            $attach_script = true;
+        }
+
+        if ($attach_script)
+            $this->include_script('vcardattach.js');
+
+        return $p;
     }
-    
-    return $p;
-  }
-  
-  /**
-   * Handler for request action
-   */
-  function save_vcard()
-  {
-         $this->add_texts('localization', true);
-
-    $uid = get_input_value('_uid', RCUBE_INPUT_POST);
-    $mbox = get_input_value('_mbox', RCUBE_INPUT_POST);
-    $mime_id = get_input_value('_part', RCUBE_INPUT_POST);
-    
-    $rcmail = rcmail::get_instance();
-    $part = $uid && $mime_id ? $rcmail->imap->get_message_part($uid, $mime_id) : null;
-    
-    $error_msg = $this->gettext('vcardsavefailed');
-    
-    if ($part && ($vcard = new rcube_vcard($part)) && $vcard->displayname && $vcard->email) {
-      $contacts = $rcmail->get_address_book(null, true);
-      
-      // check for existing contacts
-      $existing = $contacts->search('email', $vcard->email[0], true, false);
-      if ($done = $existing->count) {
-        $rcmail->output->command('display_message', $this->gettext('contactexists'), 'warning');
-      }
-      else {
-        // add contact
-        $success = $contacts->insert(array(
-          'name' => $vcard->displayname,
-          'firstname' => $vcard->firstname,
-          'surname' => $vcard->surname,
-          'email' => $vcard->email[0],
-          'vcard' => $vcard->export(),
-        ));
-        
-        if ($success)
-          $rcmail->output->command('display_message', $this->gettext('addedsuccessfully'), 'confirmation');
+
+    /**
+     * Handler for request action
+     */
+    function save_vcard()
+    {
+           $this->add_texts('localization', true);
+
+        $uid = get_input_value('_uid', RCUBE_INPUT_POST);
+        $mbox = get_input_value('_mbox', RCUBE_INPUT_POST);
+        $mime_id = get_input_value('_part', RCUBE_INPUT_POST);
+
+        $rcmail = rcmail::get_instance();
+
+        if ($uid && $mime_id) {
+            list($mime_id, $index) = explode(':', $mime_id);
+            $part = $rcmail->imap->get_message_part($uid, $mime_id);
+        }
+
+        $error_msg = $this->gettext('vcardsavefailed');
+
+        if ($part && ($vcards = rcube_vcard::import($part))
+            && ($vcard = $vcards[$index]) && $vcard->displayname && $vcard->email) {
+
+            $contacts = $rcmail->get_address_book(null, true);
+
+            // check for existing contacts
+            $existing = $contacts->search('email', $vcard->email[0], true, false);
+            if ($existing->count) {
+                $rcmail->output->command('display_message', $this->gettext('contactexists'), 'warning');
+            }
+            else {
+                // add contact
+                $contact = array(
+                    'name'      => $vcard->displayname,
+                    'firstname' => $vcard->firstname,
+                    'surname'   => $vcard->surname,
+                    'email'     => $vcard->email[0],
+                    'vcard'     => $vcard->export(),
+                );
+
+                $plugin = $rcmail->plugins->exec_hook('contact_create', array('record' => $contact, 'source' => null));
+                $contact = $plugin['record'];
+
+                if (!$plugin['abort'] && ($done = $contacts->insert($contact)))
+                    $rcmail->output->command('display_message', $this->gettext('addedsuccessfully'), 'confirmation');
+                else
+                    $rcmail->output->command('display_message', $error_msg, 'error');
+            }
+        }
         else
-          $rcmail->output->command('display_message', $error_msg, 'error');
-      }
+            $rcmail->output->command('display_message', $error_msg, 'error');
+
+        $rcmail->output->send();
+    }
+
+    /**
+     * Checks if specified message part is a vcard data
+     *
+     * @param rcube_message_part Part object
+     *
+     * @return boolean True if part is of type vcard
+     */
+    function is_vcard($part)
+    {
+        return (
+            // Content-Type: text/vcard;
+            $part->mimetype == 'text/vcard' ||
+            // Content-Type: text/x-vcard;
+            $part->mimetype == 'text/x-vcard' ||
+            // Content-Type: text/directory; profile=vCard;
+            ($part->mimetype == 'text/directory' && (
+                ($part->ctype_parameters['profile'] &&
+                    strtolower($part->ctype_parameters['profile']) == 'vcard')
+            // Content-Type: text/directory; (with filename=*.vcf)
+                    || ($part->filename && preg_match('/\.vcf$/i', $part->filename))
+                )
+            )
+        );
     }
-    else
-      $rcmail->output->command('display_message', $error_msg, 'error');
-    
-    $rcmail->output->send();
-  }
 }
index e03e5084df52f1cb763fba8c891b3e50cf77b825..ef19190e70e205f6e5785c2e171620884432f3a8 100644 (file)
@@ -1,10 +1,23 @@
-
+/*
+ * vcard_attachments plugin script
+ * @version @package_version@
+ */
 function plugin_vcard_save_contact(mime_id)
 {
-  rcmail.set_busy(true, 'loading');
-  rcmail.http_post('plugin.savevcard', '_uid='+rcmail.env.uid+'&_mbox='+urlencode(rcmail.env.mailbox)+'&_part='+urlencode(mime_id), true);
+  var lock = rcmail.set_busy(true, 'loading');
+  rcmail.http_post('plugin.savevcard', '_uid='+rcmail.env.uid+'&_mbox='+urlencode(rcmail.env.mailbox)+'&_part='+urlencode(mime_id), lock);
   
   return false;
 }
 
+function plugin_vcard_insertrow(data)
+{
+  var ctype = data.row.ctype;
+  if (ctype == 'text/vcard' || ctype == 'text/x-vcard' || ctype == 'text/directory') {
+    $('#rcmrow'+data.uid+' > td.attachment').html('<img src="'+rcmail.env.vcard_icon+'" alt="">');
+  }
+}
 
+if (window.rcmail && rcmail.gui_objects.messagelist) {
+  rcmail.addEventListener('insertrow', function(data, evt) { plugin_vcard_insertrow(data); });
+}
diff --git a/plugins/virtuser_file/virtuser_file.php b/plugins/virtuser_file/virtuser_file.php
new file mode 100644 (file)
index 0000000..d91e532
--- /dev/null
@@ -0,0 +1,106 @@
+<?php
+
+/**
+ * File based User-to-Email and Email-to-User lookup
+ * 
+ * Add it to the plugins list in config/main.inc.php and set
+ * path to a virtuser table file to resolve user names and e-mail
+ * addresses
+ * $rcmail_config['virtuser_file'] = '';
+ *
+ * @version 1.0
+ * @author Aleksander Machniak
+ */
+class virtuser_file extends rcube_plugin
+{
+    private $file;
+    private $app;
+
+    function init()
+    {
+           $this->app = rcmail::get_instance();
+           $this->file = $this->app->config->get('virtuser_file');
+
+           if ($this->file) {
+               $this->add_hook('user2email', array($this, 'user2email'));
+               $this->add_hook('email2user', array($this, 'email2user'));
+           }
+    }
+
+    /**
+     * User > Email
+     */
+    function user2email($p)
+    {
+        $r = $this->findinvirtual('/\s' . preg_quote($p['user'], '/') . '\s*$/');
+           $result = array();
+
+           for ($i=0; $i<count($r); $i++)
+           {
+               $arr = preg_split('/\s+/', $r[$i]);
+
+               if (count($arr) > 0 && strpos($arr[0], '@')) {
+                       $result[] = idn_to_ascii(trim(str_replace('\\@', '@', $arr[0])));
+
+                       if ($p['first']) {
+                           $p['email'] = $result[0];
+                           break;
+                       }
+               }
+           }
+
+           $p['email'] = empty($result) ? NULL : $result;
+
+           return $p;
+    }
+
+    /**
+     * Email > User
+     */
+    function email2user($p)
+    {
+           $r = $this->findinvirtual('/^' . preg_quote($p['email'], '/') . '\s/');
+
+           for ($i=0; $i<count($r); $i++) {
+               $arr = preg_split('/\s+/', trim($r[$i]));
+           
+               if (count($arr) > 0) {
+                       $p['user'] = trim($arr[count($arr)-1]);
+                       break;
+               }
+           }
+
+           return $p;
+    }
+
+    /**
+     * Find matches of the given pattern in virtuser file
+     *
+     * @param string Regular expression to search for
+     * @return array Matching entries
+     */
+    private function findinvirtual($pattern)
+    {
+           $result = array();
+           $virtual = null;
+       
+           if ($this->file)
+               $virtual = file($this->file);
+       
+           if (empty($virtual))
+               return $result;
+       
+           // check each line for matches
+           foreach ($virtual as $line) {
+               $line = trim($line);
+               if (empty($line) || $line[0]=='#')
+                   continue;
+       
+               if (preg_match($pattern, $line))
+                   $result[] = $line;
+           }
+       
+           return $result;
+    }
+
+}
diff --git a/plugins/virtuser_query/virtuser_query.php b/plugins/virtuser_query/virtuser_query.php
new file mode 100644 (file)
index 0000000..8f154c2
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * DB based User-to-Email and Email-to-User lookup
+ *
+ * Add it to the plugins list in config/main.inc.php and set
+ * SQL queries to resolve usernames, e-mail addresses and hostnames from the database
+ * %u will be replaced with the current username for login.
+ * %m will be replaced with the current e-mail address for login.
+ *
+ * Queries should select the user's e-mail address, username or the imap hostname as first column
+ * The email query could optionally select identity data columns in specified order:
+ *    name, organization, reply-to, bcc, signature, html_signature
+ *
+ * $rcmail_config['virtuser_query'] = array('email' => '', 'user' => '', 'host' => '');
+ *
+ * @version 1.1
+ * @author Aleksander Machniak
+ * @author Steffen Vogel
+ */
+class virtuser_query extends rcube_plugin
+{
+    private $config;
+    private $app;
+
+    function init()
+    {
+           $this->app = rcmail::get_instance();
+           $this->config = $this->app->config->get('virtuser_query');
+
+        if (!empty($this->config)) {
+            if (is_string($this->config)) {
+                $this->config = array('email' => $this->config);
+            }
+
+            if ($this->config['email']) {
+                $this->add_hook('user2email', array($this, 'user2email'));
+            }
+            if ($this->config['user']) {
+                $this->add_hook('email2user', array($this, 'email2user'));
+            }
+            if ($this->config['host']) {
+                $this->add_hook('authenticate', array($this, 'user2host'));
+            }
+        }
+    }
+
+    /**
+     * User > Email
+     */
+    function user2email($p)
+    {
+           $dbh = $this->app->get_dbh();
+
+           $sql_result = $dbh->query(preg_replace('/%u/', $dbh->escapeSimple($p['user']), $this->config['email']));
+
+           while ($sql_arr = $dbh->fetch_array($sql_result)) {
+               if (strpos($sql_arr[0], '@')) {
+                       if ($p['extended'] && count($sql_arr) > 1) {
+                           $result[] = array(
+                                   'email'         => idn_to_ascii($sql_arr[0]),
+                               'name'              => $sql_arr[1],
+                                   'organization'  => $sql_arr[2],
+                               'reply-to'          => idn_to_ascii($sql_arr[3]),
+                                   'bcc'                   => idn_to_ascii($sql_arr[4]),
+                                   'signature'         => $sql_arr[5],
+                               'html_signature' => (int)$sql_arr[6],
+                       );
+                       }
+                       else {
+                           $result[] = $sql_arr[0];
+                       }
+
+                       if ($p['first'])
+                           break;
+               }
+           }
+
+           $p['email'] = $result;
+
+           return $p;
+    }
+
+    /**
+     * EMail > User
+     */
+    function email2user($p)
+    {
+        $dbh = $this->app->get_dbh();
+
+        $sql_result = $dbh->query(preg_replace('/%m/', $dbh->escapeSimple($p['email']), $this->config['user']));
+
+        if ($sql_arr = $dbh->fetch_array($sql_result)) {
+            $p['user'] = $sql_arr[0];
+        }
+
+        return $p;
+    }
+
+    /**
+     * User > Host
+     */
+    function user2host($p)
+    {
+        $dbh = $this->app->get_dbh();
+
+        $sql_result = $dbh->query(preg_replace('/%u/', $dbh->escapeSimple($p['user']), $this->config['host']));
+
+        if ($sql_arr = $dbh->fetch_array($sql_result)) {
+            $p['host'] = $sql_arr[0];
+        }
+
+        return $p;
+    }
+
+}
+
diff --git a/program/include/bugs.inc b/program/include/bugs.inc
deleted file mode 100644 (file)
index 4ce4998..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/include/bugs.inc                                              |
- |                                                                       |
- | This file is part of the RoudCube Webmail client                      |
- | Copyright (C) 2005-2009, RoudCube Dev - Switzerland                   |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Provide error handling and logging functions                        |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: bugs.inc 2862 2009-08-17 09:54:53Z thomasb $
-
-*/
-
-
-/**
- * Error handling and logging functions
- *
- * @package Core
- */
-
-
-/**
- * Throw system error and show error page
- *
- * @param array Named parameters
- *  - code: Error code (required)
- *  - type: Error type [php|db|imap|javascript] (required)
- *  - message: Error message
- *  - file: File where error occured
- *  - line: Line where error occured
- * @param boolean True to log the error
- * @param boolean Terminate script execution
- */
-function raise_error($arg=array(), $log=false, $terminate=false)
-  {
-  global $__page_content, $CONFIG, $OUTPUT, $ERROR_CODE, $ERROR_MESSAGE;
-  
-  // report bug (if not incompatible browser)
-  if ($log && $arg['type'] && $arg['message'])
-    log_bug($arg);
-
-  // display error page and terminate script
-  if ($terminate)
-    {
-    $ERROR_CODE = $arg['code'];
-    $ERROR_MESSAGE = $arg['message'];
-    include("program/steps/error.inc");
-    exit;
-    }
-  }
-
-
-/**
- * Report error according to configured debug_level
- *
- * @param array Named parameters
- * @see raise_error()
- */
-function log_bug($arg_arr)
-{
-  global $CONFIG;
-  $program = strtoupper($arg_arr['type']);
-
-  // write error to local log file
-  if ($CONFIG['debug_level'] & 1)
-  {
-    $post_query = ($_SERVER['REQUEST_METHOD'] == 'POST' ? '?_task='.urlencode($_POST['_task']).'&_action='.urlencode($_POST['_action']) : '');
-    $log_entry = sprintf("%s Error: %s%s (%s %s)",
-      $program,
-      $arg_arr['message'],
-      $arg_arr['file'] ? sprintf(' in %s on line %d', $arg_arr['file'], $arg_arr['line']) : '',
-      $_SERVER['REQUEST_METHOD'],
-      $_SERVER['REQUEST_URI'] . $post_query);
-    
-    if (!write_log('errors', $log_entry))
-    {
-      // send error to PHPs error handler if write_log didn't succeed
-      trigger_error($arg_arr['message']);
-    }
-  }
-
-  // resport the bug to the global bug reporting system
-  if ($CONFIG['debug_level'] & 2)
-  {
-    // TODO: Send error via HTTP
-  }
-
-  // show error if debug_mode is on
-  if ($CONFIG['debug_level'] & 4)
-  {
-    print "<b>$program Error";
-
-    if (!empty($arg_arr['file']) && !empty($arg_arr['line']))
-      print " in $arg_arr[file] ($arg_arr[line])";
-
-    print ":</b>&nbsp;";
-    print nl2br($arg_arr['message']);
-    print '<br />';
-    flush();
-  }
-}
-
-?>
diff --git a/program/include/clisetup.php b/program/include/clisetup.php
new file mode 100644 (file)
index 0000000..51d7b6e
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/clisetup.php                                          |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2010, Roundcube Dev, - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Setup the command line environment and provide some utitlity        |
+ |   functions.                                                          |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: clisetup.php 3998 2010-09-29 08:30:56Z thomasb $
+
+*/
+
+if (php_sapi_name() != 'cli') {
+  die('Not on the "shell" (php-cli).');
+}
+
+require_once 'iniset.php';
+
+
+/**
+ * Parse commandline arguments into a hash array
+ */
+function get_opt($aliases=array())
+{
+       $args = array();
+       for ($i=1; $i<count($_SERVER['argv']); $i++)
+       {
+               $arg = $_SERVER['argv'][$i];
+               if (substr($arg, 0, 2) == '--')
+               {
+                       $sp = strpos($arg, '=');
+                       $key = substr($arg, 2, $sp - 2);
+                       $value = substr($arg, $sp+1);
+               }
+               else if ($arg{0} == '-')
+               {
+                       $key = substr($arg, 1);
+                       $value = $_SERVER['argv'][++$i];
+               }
+               else
+                       continue;
+
+               $args[$key] = preg_replace(array('/^["\']/', '/["\']$/'), '', $value);
+               
+               if ($alias = $aliases[$key])
+                       $args[$alias] = $args[$key];
+       }
+
+       return $args;
+}
+
+
+/**
+ * from http://blogs.sitepoint.com/2009/05/01/interactive-cli-password-prompt-in-php/
+ */
+function prompt_silent($prompt = "Password:")
+{
+  if (preg_match('/^win/i', PHP_OS)) {
+    $vbscript = sys_get_temp_dir() . 'prompt_password.vbs';
+    file_put_contents($vbscript, 'wscript.echo(InputBox("' . addslashes($prompt) . '", "", "password here"))');
+    $command = "cscript //nologo " . escapeshellarg($vbscript);
+    $password = rtrim(shell_exec($command));
+    unlink($vbscript);
+    return $password;
+  }
+  else {
+    $command = "/usr/bin/env bash -c 'echo OK'";
+    if (rtrim(shell_exec($command)) !== 'OK') {
+      echo $prompt;
+      $pass = trim(fgets(STDIN));
+      echo chr(8)."\r" . $prompt . str_repeat("*", strlen($pass))."\n";
+      return $pass;
+    }
+    $command = "/usr/bin/env bash -c 'read -s -p \"" . addslashes($prompt) . "\" mypassword && echo \$mypassword'";
+    $password = rtrim(shell_exec($command));
+    echo "\n";
+    return $password;
+  }
+}
+
+?>
\ No newline at end of file
index 350b894ee940baf1bc655d89ac8074f52b9fb837..ad53f7e49d1e04a3ae52bb8e789bde4db0839207 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/html.php                                              |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev, - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev, - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: $
+ $Id: html.php 4216 2010-11-12 10:47:04Z alec $
 
  */
 
@@ -32,14 +32,14 @@ class html
     protected $allowed = array();
     protected $content;
 
-    public static $common_attrib = array('id','class','style','title','align');
-    public static $containers = array('iframe','div','span','p','h1','h2','h3','form','textarea','table','tr','th','td','style','script');
     public static $lc_tags = true;
+    public static $common_attrib = array('id','class','style','title','align');
+    public static $containers = array('iframe','div','span','p','h1','h2','h3','form','textarea','table','thead','tbody','tr','th','td','style','script');
 
     /**
      * Constructor
      *
-     * @param array Hash array with tag attributes
+     * @param array $attrib Hash array with tag attributes
      */
     public function __construct($attrib = array())
     {
@@ -63,10 +63,10 @@ class html
     /**
      * Generic method to create a HTML tag
      *
-     * @param string Tag name
-     * @param array  Tag attributes as key/value pairs
-     * @param string Optinal Tag content (creates a container tag)
-     * @param array  List with allowed attributes, omit to allow all
+     * @param string $tagname Tag name
+     * @param array  $attrib  Tag attributes as key/value pairs
+     * @param string $content Optinal Tag content (creates a container tag)
+     * @param array  $allowed_attrib List with allowed attributes, omit to allow all
      * @return string The XHTML tag
      */
     public static function tag($tagname, $attrib = array(), $content = null, $allowed_attrib = null)
@@ -75,7 +75,7 @@ class html
         $suffix = $attrib['nl'] || ($content && $attrib['nl'] !== false && !in_array($tagname, $inline_tags)) ? "\n" : '';
 
         $tagname = self::$lc_tags ? strtolower($tagname) : $tagname;
-        if ($content || in_array($tagname, self::$containers)) {
+        if (isset($content) || in_array($tagname, self::$containers)) {
             $templ = $attrib['noclose'] ? "<%s%s>%s" : "<%s%s>%s</%s>%s";
             unset($attrib['noclose']);
             return sprintf($templ, $tagname, self::attrib_string($attrib, $allowed_attrib), $content, $tagname, $suffix);
@@ -88,8 +88,8 @@ class html
     /**
      * Derrived method for <div> containers
      *
-     * @param mixed  Hash array with tag attributes or string with class name
-     * @param string Div content
+     * @param mixed  $attr Hash array with tag attributes or string with class name
+     * @param string $cont Div content
      * @return string HTML code
      * @see html::tag()
      */
@@ -104,8 +104,8 @@ class html
     /**
      * Derrived method for <p> blocks
      *
-     * @param mixed  Hash array with tag attributes or string with class name
-     * @param string Paragraph content
+     * @param mixed  $attr Hash array with tag attributes or string with class name
+     * @param string $cont Paragraph content
      * @return string HTML code
      * @see html::tag()
      */
@@ -120,7 +120,7 @@ class html
     /**
      * Derrived method to create <img />
      *
-     * @param mixed Hash array with tag attributes or string with image source (src)
+     * @param mixed $attr Hash array with tag attributes or string with image source (src)
      * @return string HTML code
      * @see html::tag()
      */
@@ -129,14 +129,15 @@ class html
         if (is_string($attr)) {
             $attr = array('src' => $attr);
         }
-        return self::tag('img', $attr + array('alt' => ''), null, array_merge(self::$common_attrib, array('src','alt','width','height','border','usemap')));
+        return self::tag('img', $attr + array('alt' => ''), null, array_merge(self::$common_attrib,
+           array('src','alt','width','height','border','usemap')));
     }
 
     /**
      * Derrived method for link tags
      *
-     * @param mixed  Hash array with tag attributes or string with link location (href)
-     * @param string Link content
+     * @param mixed  $attr Hash array with tag attributes or string with link location (href)
+     * @param string $cont Link content
      * @return string HTML code
      * @see html::tag()
      */
@@ -145,14 +146,15 @@ class html
         if (is_string($attr)) {
             $attr = array('href' => $attr);
         }
-        return self::tag('a', $attr, $cont, array_merge(self::$common_attrib, array('href','target','name','onclick','onmouseover','onmouseout','onmousedown','onmouseup')));
+        return self::tag('a', $attr, $cont, array_merge(self::$common_attrib,
+           array('href','target','name','onclick','onmouseover','onmouseout','onmousedown','onmouseup')));
     }
 
     /**
      * Derrived method for inline span tags
      *
-     * @param mixed  Hash array with tag attributes or string with class name
-     * @param string Tag content
+     * @param mixed  $attr Hash array with tag attributes or string with class name
+     * @param string $cont Tag content
      * @return string HTML code
      * @see html::tag()
      */
@@ -167,8 +169,8 @@ class html
     /**
      * Derrived method for form element labels
      *
-     * @param mixed  Hash array with tag attributes or string with 'for' attrib
-     * @param string Tag content
+     * @param mixed  $attr Hash array with tag attributes or string with 'for' attrib
+     * @param string $cont Tag content
      * @return string HTML code
      * @see html::tag()
      */
@@ -183,7 +185,7 @@ class html
     /**
      * Derrived method to create <iframe></iframe>
      *
-     * @param mixed Hash array with tag attributes or string with frame source (src)
+     * @param mixed $attr Hash array with tag attributes or string with frame source (src)
      * @return string HTML code
      * @see html::tag()
      */
@@ -192,7 +194,8 @@ class html
         if (is_string($attr)) {
             $attr = array('src' => $attr);
         }
-        return self::tag('iframe', $attr, $cont, array_merge(self::$common_attrib, array('src','name','width','height','border','frameborder')));
+        return self::tag('iframe', $attr, $cont, array_merge(self::$common_attrib,
+           array('src','name','width','height','border','frameborder')));
     }
 
     /**
@@ -209,8 +212,8 @@ class html
     /**
      * Create string with attributes
      *
-     * @param array Associative arry with tag attributes
-     * @param array List of allowed attributes
+     * @param array $attrib Associative arry with tag attributes
+     * @param array $allowed List of allowed attributes
      * @return string Valid attribute string
      */
     public static function attrib_string($attrib = array(), $allowed = null)
@@ -263,8 +266,15 @@ class html_inputfield extends html
 {
     protected $tagname = 'input';
     protected $type = 'text';
-    protected $allowed = array('type','name','value','size','tabindex','autocomplete','checked','onchange','onclick','disabled','readonly','spellcheck','results');
+    protected $allowed = array('type','name','value','size','tabindex',
+       'autocomplete','checked','onchange','onclick','disabled','readonly',
+       'spellcheck','results','maxlength','src');
 
+    /**
+     * Object constructor
+     *
+     * @param array $attrib Associative array with tag attributes
+     */
     public function __construct($attrib = array())
     {
         if (is_array($attrib)) {
@@ -283,8 +293,8 @@ class html_inputfield extends html
     /**
      * Compose input tag
      *
-     * @param string Field value
-     * @param array Additional attributes to override
+     * @param string $value Field value
+     * @param array  $attrib Additional attributes to override
      * @return string HTML output
      */
     public function show($value = null, $attrib = null)
@@ -329,7 +339,7 @@ class html_hiddenfield extends html_inputfield
     /**
      * Constructor
      *
-     * @param array Named tag attributes
+     * @param array $attrib Named tag attributes
      */
     public function __construct($attrib = null)
     {
@@ -341,7 +351,7 @@ class html_hiddenfield extends html_inputfield
     /**
      * Add a hidden field to this instance
      *
-     * @param array Named tag attributes
+     * @param array $attrib Named tag attributes
      */
     public function add($attrib)
     {
@@ -375,8 +385,8 @@ class html_radiobutton extends html_inputfield
     /**
      * Get HTML code for this object
      *
-     * @param string Value of the checked field
-     * @param array Additional attributes to override
+     * @param string $value  Value of the checked field
+     * @param array  $attrib Additional attributes to override
      * @return string HTML output
      */
     public function show($value = '', $attrib = null)
@@ -405,8 +415,8 @@ class html_checkbox extends html_inputfield
     /**
      * Get HTML code for this object
      *
-     * @param string Value of the checked field
-     * @param array Additional attributes to override
+     * @param string $value  Value of the checked field
+     * @param array  $attrib Additional attributes to override
      * @return string HTML output
      */
     public function show($value = '', $attrib = null)
@@ -431,13 +441,14 @@ class html_checkbox extends html_inputfield
 class html_textarea extends html
 {
     protected $tagname = 'textarea';
-    protected $allowed = array('name','rows','cols','wrap','tabindex','onchange','disabled','readonly','spellcheck');
+    protected $allowed = array('name','rows','cols','wrap','tabindex',
+       'onchange','disabled','readonly','spellcheck');
 
     /**
      * Get HTML code for this object
      *
-     * @param string Textbox value
-     * @param array Additional attributes to override
+     * @param string $value  Textbox value
+     * @param array  $attrib Additional attributes to override
      * @return string HTML output
      */
     public function show($value = '', $attrib = null)
@@ -461,7 +472,8 @@ class html_textarea extends html
             $value = Q($value, 'strict', false);
         }
 
-        return self::tag($this->tagname, $this->attrib, $value, array_merge(self::$common_attrib, $this->allowed));
+        return self::tag($this->tagname, $this->attrib, $value,
+           array_merge(self::$common_attrib, $this->allowed));
     }
 }
 
@@ -488,13 +500,14 @@ class html_select extends html
 {
     protected $tagname = 'select';
     protected $options = array();
-    protected $allowed = array('name','size','tabindex','autocomplete','multiple','onchange','disabled');
+    protected $allowed = array('name','size','tabindex','autocomplete',
+       'multiple','onchange','disabled');
     
     /**
      * Add a new option to this drop-down
      *
-     * @param mixed Option name or array with option names
-     * @param mixed Option value or array with option values
+     * @param mixed $names  Option name or array with option names
+     * @param mixed $values Option value or array with option values
      */
     public function add($names, $values = null)
     {
@@ -512,8 +525,8 @@ class html_select extends html
     /**
      * Get HTML code for this object
      *
-     * @param string Value of the selection option
-     * @param array Additional attributes to override
+     * @param string $select Value of the selection option
+     * @param array  $attrib Additional attributes to override
      * @return string HTML output
      */
     public function show($select = array(), $attrib = null)
@@ -546,13 +559,19 @@ class html_select extends html
 class html_table extends html
 {
     protected $tagname = 'table';
-    protected $allowed = array('id','class','style','width','summary','cellpadding','cellspacing','border');
+    protected $allowed = array('id','class','style','width','summary',
+       'cellpadding','cellspacing','border');
+
     private $header = array();
     private $rows = array();
     private $rowindex = 0;
     private $colindex = 0;
 
-
+    /**
+     * Constructor
+     *
+     * @param array $attrib Named tag attributes
+     */
     public function __construct($attrib = array())
     {
         $this->attrib = array_merge($attrib, array('summary' => '', 'border' => 0));
@@ -561,8 +580,8 @@ class html_table extends html
     /**
      * Add a table cell
      *
-     * @param array Cell attributes
-     * @param string Cell content
+     * @param array  $attr Cell attributes
+     * @param string $cont Cell content
      */
     public function add($attr, $cont)
     {
@@ -585,8 +604,8 @@ class html_table extends html
     /**
      * Add a table header cell
      *
-     * @param array Cell attributes
-     * @param string Cell content
+     * @param array  $attr Cell attributes
+     * @param string $cont Cell content
      */
     public function add_header($attr, $cont)
     {
@@ -630,7 +649,7 @@ class html_table extends html
     /**
      * Jump to next row
      *
-     * @param array Row attributes
+     * @param array $attr Row attributes
      */
     public function add_row($attr = array())
     {
@@ -644,7 +663,7 @@ class html_table extends html
     /**
      * Set current row attrib
      *
-     * @param array Row attributes
+     * @param array $attr Row attributes
      */
     public function set_row_attribs($attr = array())
     {
@@ -657,7 +676,7 @@ class html_table extends html
     /**
      * Build HTML output of the table data
      *
-     * @param array Table attributes
+     * @param array $attrib Table attributes
      * @return string The final table HTML code
      */
     public function show($attrib = null)
@@ -709,4 +728,3 @@ class html_table extends html
     }
 }
 
-?>
index df2f3f310445c0e3984a41bf6497293abd48ac92..89fbb911ef76d887498afca49844222d48de0c8e 100755 (executable)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/iniset.php                                            |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2008-2009, RoundCube Dev, - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2008-2009, Roundcube Dev, - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  |         Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: iniset.php 3081 2009-10-31 13:20:02Z thomasb $
+ $Id: iniset.php 4408 2011-01-12 15:54:35Z thomasb $
 
 */
 
+// Some users are not using Installer, so we'll check some
+// critical PHP settings here. Only these, which doesn't provide
+// an error/warning in the logs later. See (#1486307).
+$crit_opts = array(
+    'mbstring.func_overload' => 0,
+    'suhosin.session.encrypt' => 0,
+    'session.auto_start' => 0,
+    'file_uploads' => 1,
+);
+foreach ($crit_opts as $optname => $optval) {
+    if ($optval != ini_get($optname)) {
+        die("ERROR: Wrong '$optname' option value. Read REQUIREMENTS section in INSTALL file or use Roundcube Installer, please!");
+    }
+}
 
 // application constants
-define('RCMAIL_VERSION', '0.3.1');
+define('RCMAIL_VERSION', '0.5');
 define('RCMAIL_CHARSET', 'UTF-8');
 define('JS_OBJECT_NAME', 'rcmail');
+define('RCMAIL_START', microtime(true));
 
 if (!defined('INSTALL_PATH')) {
-  define('INSTALL_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/');
+    define('INSTALL_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/');
 }
 
-define('RCMAIL_CONFIG_DIR', INSTALL_PATH . 'config');
+if (!defined('RCMAIL_CONFIG_DIR')) {
+    define('RCMAIL_CONFIG_DIR', INSTALL_PATH . 'config');
+}
 
 // make sure path_separator is defined
 if (!defined('PATH_SEPARATOR')) {
-  define('PATH_SEPARATOR', (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') ? ';' : ':');
+    define('PATH_SEPARATOR', (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') ? ';' : ':');
 }
 
 // RC include folders MUST be included FIRST to avoid other
@@ -47,18 +64,10 @@ $include_path.= INSTALL_PATH . 'program/include' . PATH_SEPARATOR;
 $include_path.= ini_get('include_path');
 
 if (set_include_path($include_path) === false) {
-  die('Fatal error: ini_set/set_include_path does not work.');
+    die("Fatal error: ini_set/set_include_path does not work.");
 }
 
 ini_set('error_reporting', E_ALL&~E_NOTICE);
-if  (isset($_SERVER['HTTPS'])) {
-   ini_set('session.cookie_secure', ($_SERVER['HTTPS'] && ($_SERVER['HTTPS'] != 'off'))?1:0);
-} else {
-   ini_set('session.cookie_secure', 0);
-}
-ini_set('session.name', 'roundcube_sessid');
-ini_set('session.use_cookies', 1);
-ini_set('session.use_only_cookies', 1);
 
 // increase maximum execution time for php scripts
 // (does not work in safe mode)
@@ -66,8 +75,8 @@ ini_set('session.use_only_cookies', 1);
 
 // set internal encoding for mbstring extension
 if(extension_loaded('mbstring'))
-  mb_internal_encoding(RCMAIL_CHARSET);
-             
+    mb_internal_encoding(RCMAIL_CHARSET);
+
 
 /**
  * Use PHP5 autoload for dynamic class loading
@@ -77,26 +86,33 @@ if(extension_loaded('mbstring'))
  */
 function rcube_autoload($classname)
 {
-  $filename = preg_replace(
-      array(
-        '/MDB2_(.+)/',
-        '/Mail_(.+)/',
-        '/Net_(.+)/',
-        '/^html_.+/',
-        '/^utf8$/',
-        '/html2text/'
-      ),
-      array(
-        'MDB2/\\1',
-        'Mail/\\1',
-        'Net/\\1',
-        'html',
-        'utf8.class',
-        'lib/html2text'  // see #1485505
-      ),
-      $classname
-  );
-  include $filename. '.php';
+    $filename = preg_replace(
+        array(
+            '/MDB2_(.+)/',
+            '/Mail_(.+)/',
+            '/Net_(.+)/',
+            '/Auth_(.+)/',
+            '/^html_.+/',
+            '/^utf8$/',
+        ),
+        array(
+            'MDB2/\\1',
+            'Mail/\\1',
+            'Net/\\1',
+            'Auth/\\1',
+            'html',
+            'utf8.class',
+        ),
+        $classname
+    );
+
+    if ($fp = @fopen("$filename.php", 'r', true)) {
+        fclose($fp);
+        include_once("$filename.php");
+        return true;
+    }
+
+    return false;
 }
 
 spl_autoload_register('rcube_autoload');
@@ -106,17 +122,15 @@ spl_autoload_register('rcube_autoload');
  */
 function rcube_pear_error($err)
 {
-  error_log(sprintf("%s (%s): %s",
-    $err->getMessage(),
-    $err->getCode(),
-    $err->getUserinfo()), 0);
+    error_log(sprintf("%s (%s): %s",
+        $err->getMessage(),
+        $err->getCode(),
+        $err->getUserinfo()), 0);
 }
 
+// set PEAR error handling (will also load the PEAR main class)
+PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'rcube_pear_error');
+
 // include global functions
-require_once 'include/bugs.inc';
 require_once 'include/main.inc';
 require_once 'include/rcube_shared.inc';
-
-
-// set PEAR error handling (will also load the PEAR main class)
-PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'rcube_pear_error');
index 423b46e1b7670d51e8177a466dd1c9a2c33a28f5..982352c5de20969d28ef42807695fcc6afbb97d7 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/main.inc                                              |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev, - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev, - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: main.inc 3063 2009-10-27 09:43:39Z alec $
+ $Id: main.inc 4334 2010-12-10 11:08:22Z alec $
 
 */
 
 /**
- * RoundCube Webmail common functions
+ * Roundcube Webmail common functions
  *
  * @package Core
  * @author Thomas Bruederli <roundcube@gmail.com>
@@ -65,7 +65,7 @@ function get_table_name($table)
  */
 function get_sequence_name($sequence)
   {
-  // return table name if configured
+  // return sequence name if configured
   $config_key = 'db_sequence_'.$sequence;
   $opt = rcmail::get_instance()->config->get($config_key);
 
@@ -148,6 +148,7 @@ function rcmail_temp_gc()
 /**
  * Garbage collector for cache entries.
  * Remove all expired message cache records
+ * @return void
  */
 function rcmail_cache_gc()
   {
@@ -165,6 +166,18 @@ function rcmail_cache_gc()
   }
 
 
+/**
+ * Catch an error and throw an exception.
+ *
+ * @param  int    Level of the error
+ * @param  string Error message
+ */ 
+function rcube_error_handler($errno, $errstr)
+  {
+  throw new ErrorException($errstr, 0, $errno);
+  }
+
+
 /**
  * Convert a string from one charset to another.
  * Uses mbstring and iconv functions if possible
@@ -172,39 +185,57 @@ function rcmail_cache_gc()
  * @param  string Input string
  * @param  string Suspected charset of the input string
  * @param  string Target charset to convert to; defaults to RCMAIL_CHARSET
- * @return Converted string
+ * @return string Converted string
  */
 function rcube_charset_convert($str, $from, $to=NULL)
   {
+  static $iconv_options = null;
   static $mbstring_loaded = null;
   static $mbstring_list = null;
   static $convert_warning = false;
   static $conv = null;
-  
+
   $error = false;
 
-  $to = empty($to) ? $to = strtoupper(RCMAIL_CHARSET) : rcube_parse_charset($to);
+  $to = empty($to) ? strtoupper(RCMAIL_CHARSET) : rcube_parse_charset($to);
   $from = rcube_parse_charset($from);
 
   if ($from == $to || empty($str) || empty($from))
     return $str;
 
-  // convert charset using iconv module  
-  if (function_exists('iconv') && $from != 'UTF-7' && $to != 'UTF-7') {
-    $_iconv = iconv($from, $to . '//IGNORE', $str);
+  // convert charset using iconv module
+  if (function_exists('iconv') && $from != 'UTF7-IMAP' && $to != 'UTF7-IMAP') {
+    if ($iconv_options === null) {
+      // ignore characters not available in output charset
+      $iconv_options = '//IGNORE';
+      if (iconv('', $iconv_options, '') === false) {
+        // iconv implementation does not support options
+        $iconv_options = '';
+      }
+    }
+
+    // throw an exception if iconv reports an illegal character in input
+    // it means that input string has been truncated
+    set_error_handler('rcube_error_handler', E_NOTICE);
+    try {
+      $_iconv = iconv($from, $to . $iconv_options, $str);
+    } catch (ErrorException $e) {
+      $_iconv = false;
+    }
+    restore_error_handler();
     if ($_iconv !== false) {
-        return $_iconv;
+      return $_iconv;
     }
   }
 
-  if (is_null($mbstring_loaded))
+  if ($mbstring_loaded === null)
     $mbstring_loaded = extension_loaded('mbstring');
     
   // convert charset using mbstring module
   if ($mbstring_loaded) {
     $aliases['WINDOWS-1257'] = 'ISO-8859-13';
     
-    if (is_null($mbstring_list)) {
+    if ($mbstring_list === null) {
       $mbstring_list = mb_list_encodings();
       $mbstring_list = array_map('strtoupper', $mbstring_list);
     }
@@ -289,15 +320,26 @@ function rcube_charset_convert($str, $from, $to=NULL)
  * Sometimes charset string is malformed, there are also charset aliases 
  * but we need strict names for charset conversion (specially utf8 class)
  *
- * @param  string  Input charset name
- * @return The validated charset name
+ * @param  string Input charset name
+ * @return string The validated charset name
  */
-function rcube_parse_charset($charset)
+function rcube_parse_charset($input)
   {
-  $charset = strtoupper($charset);
+  static $charsets = array();
+  $charset = strtoupper($input);
 
-  # RFC1642
-  $charset = str_replace('UNICODE-1-1-', '', $charset);
+  if (isset($charsets[$input]))
+    return $charsets[$input];
+
+  $charset = preg_replace(array(
+    '/^[^0-9A-Z]+/',    // e.g. _ISO-8859-JP$SIO
+    '/\$.*$/',          // e.g. _ISO-8859-JP$SIO
+    '/UNICODE-1-1-*/',  // RFC1641/1642
+    '/^X-/',            // X- prefix (e.g. X-ROMAN8 => ROMAN8)
+    ), '', $charset);
+
+  if ($charset == 'BINARY')
+    return $charsets[$input] = null;
 
   # Aliases: some of them from HTML5 spec.
   $aliases = array(
@@ -315,25 +357,72 @@ function rcube_parse_charset($charset)
     'TIS620'       => 'WINDOWS-874',
     'ISO88599'     => 'WINDOWS-1254',
     'ISO885911'            => 'WINDOWS-874',
+    'MACROMAN'     => 'MACINTOSH',
+    '77'            => 'MAC',
+    '128'           => 'SHIFT-JIS',
+    '129'           => 'CP949',
+    '130'           => 'CP1361',
+    '134'           => 'GBK',
+    '136'           => 'BIG5',
+    '161'           => 'WINDOWS-1253',
+    '162'           => 'WINDOWS-1254',
+    '163'           => 'WINDOWS-1258',
+    '177'           => 'WINDOWS-1255',
+    '178'           => 'WINDOWS-1256',
+    '186'           => 'WINDOWS-1257',
+    '204'           => 'WINDOWS-1251',
+    '222'           => 'WINDOWS-874',
+    '238'           => 'WINDOWS-1250',
+    'MS950'         => 'CP950',
+    'WINDOWS949'    => 'UHC',
   );
 
-  // allow a-z and 0-9 only and remove X- prefix (e.g. X-ROMAN8 => ROMAN8)
-  $str = preg_replace(array('/[^a-z0-9]/i', '/^x+/i'), '', $charset);
+  // allow A-Z and 0-9 only
+  $str = preg_replace('/[^A-Z0-9]/', '', $charset);
 
   if (isset($aliases[$str]))
-    return $aliases[$str];
-
-  if (preg_match('/UTF(7|8|16|32)(BE|LE)*/', $str, $m))
-    return 'UTF-' . $m[1] . $m[2];
-
-  if (preg_match('/ISO8859([0-9]{0,2})/', $str, $m)) {
+    $result = $aliases[$str];
+  // UTF
+  else if (preg_match('/U[A-Z][A-Z](7|8|16|32)(BE|LE)*/', $str, $m))
+    $result = 'UTF-' . $m[1] . $m[2];
+  // ISO-8859
+  else if (preg_match('/ISO8859([0-9]{0,2})/', $str, $m)) {
     $iso = 'ISO-8859-' . ($m[1] ? $m[1] : 1);
-    # some clients sends windows-1252 text as latin1,
-    # it is safe to use windows-1252 for all latin1
-    return $iso == 'ISO-8859-1' ? 'WINDOWS-1252' : $iso;
+    // some clients sends windows-1252 text as latin1,
+    // it is safe to use windows-1252 for all latin1
+    $result = $iso == 'ISO-8859-1' ? 'WINDOWS-1252' : $iso;
+    }
+  // handle broken charset names e.g. WINDOWS-1250HTTP-EQUIVCONTENT-TYPE
+  else if (preg_match('/(WIN|WINDOWS)([0-9]+)/', $str, $m)) {
+    $result = 'WINDOWS-' . $m[2];
+    }
+  // LATIN
+  else if (preg_match('/LATIN(.*)/', $str, $m)) {
+    $aliases = array('2' => 2, '3' => 3, '4' => 4, '5' => 9, '6' => 10,
+        '7' => 13, '8' => 14, '9' => 15, '10' => 16,
+        'ARABIC' => 6, 'CYRILLIC' => 5, 'GREEK' => 7, 'GREEK1' => 7, 'HEBREW' => 8);
+
+    // some clients sends windows-1252 text as latin1,
+    // it is safe to use windows-1252 for all latin1
+    if ($m[1] == 1) {
+      $result = 'WINDOWS-1252';
+      }
+    // if iconv is not supported we need ISO labels, it's also safe for iconv
+    else if (!empty($aliases[$m[1]])) {
+      $result = 'ISO-8859-'.$aliases[$m[1]];
+      }
+    // iconv requires convertion of e.g. LATIN-1 to LATIN1
+    else {
+      $result = $str;
+      }
     }
+  else {
+    $result = $charset;
+    }
+
+  $charsets[$input] = $result;
 
-  return $charset;
+  return $result;
   }
 
 
@@ -341,7 +430,7 @@ function rcube_parse_charset($charset)
  * Converts string from standard UTF-7 (RFC 2152) to UTF-8.
  *
  * @param  string  Input string
- * @return The converted string
+ * @return string  The converted string
  */
 function rcube_utf7_to_utf8($str)
 {
@@ -400,7 +489,7 @@ function rcube_utf7_to_utf8($str)
  * Converts string from UTF-16 to UTF-8 (helper for utf-7 to utf-8 conversion)
  *
  * @param  string  Input string
- * @return The converted string
+ * @return string  The converted string
  */
 function rcube_utf16_to_utf8($str)
 {
@@ -431,7 +520,7 @@ function rcube_utf16_to_utf8($str)
  * @param  string  Encoding type: text|html|xml|js|url
  * @param  string  Replace mode for tags: show|replace|remove
  * @param  boolean Convert newlines
- * @return The quoted string
+ * @return string  The quoted string
  */
 function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
   {
@@ -447,7 +536,7 @@ function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
     {
     if (!$html_encode_arr)
       {
-      $html_encode_arr = get_html_translation_table(HTML_SPECIALCHARS);        
+      $html_encode_arr = get_html_translation_table(HTML_SPECIALCHARS);
       unset($html_encode_arr['?']);
       }
 
@@ -464,10 +553,12 @@ function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
       }
     else if ($mode=='remove')
       $str = strip_tags($str);
-    
+
+    $out = strtr($str, $encode_arr);
+
     // avoid douple quotation of &
-    $out = preg_replace('/&amp;([A-Za-z]{2,6}|#[0-9]{2,4});/', '&\\1;', strtr($str, $encode_arr));
-      
+    $out = preg_replace('/&amp;([A-Za-z]{2,6}|#[0-9]{2,4});/', '&\\1;', $out);
+
     return $newlines ? nl2br($out) : $out;
     }
 
@@ -478,12 +569,15 @@ function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
     $xml_rep_table['&'] = '&amp;';
 
     for ($c=160; $c<256; $c++)  // can be increased to support more charsets
-      $xml_rep_table[Chr($c)] = "&#$c;";
+      $xml_rep_table[chr($c)] = "&#$c;";
 
     $xml_rep_table['"'] = '&quot;';
     $js_rep_table['"'] = '\\"';
     $js_rep_table["'"] = "\\'";
     $js_rep_table["\\"] = "\\\\";
+    // Unicode line and paragraph separators (#1486310)
+    $js_rep_table[chr(hexdec(E2)).chr(hexdec(80)).chr(hexdec(A8))] = '&#8232;';
+    $js_rep_table[chr(hexdec(E2)).chr(hexdec(80)).chr(hexdec(A9))] = '&#8233;';
     }
 
   // encode for javascript use
@@ -542,7 +636,6 @@ function JQ($str)
  */
 function get_input_value($fname, $source, $allow_html=FALSE, $charset=NULL)
 {
-  global $OUTPUT;
   $value = NULL;
   
   if ($source==RCUBE_INPUT_GET && isset($_GET[$fname]))
@@ -559,9 +652,31 @@ function get_input_value($fname, $source, $allow_html=FALSE, $charset=NULL)
       $value = $_COOKIE[$fname];
     }
 
+  return parse_input_value($value, $allow_html, $charset);
+}
+
+/**
+ * Parse/validate input value. See get_input_value()
+ * Performs stripslashes() and charset conversion if necessary
+ * 
+ * @param  string   Input value
+ * @param  boolean  Allow HTML tags in field value
+ * @param  string   Charset to convert into
+ * @return string   Parsed value
+ */
+function parse_input_value($value, $allow_html=FALSE, $charset=NULL)
+{
+  global $OUTPUT;
+
   if (empty($value))
     return $value;
 
+  if (is_array($value)) {
+    foreach ($value as $idx => $val)
+      $value[$idx] = parse_input_value($val, $allow_html, $charset);
+    return $value;
+  }
+
   // strip single quotes if magic_quotes_sybase is enabled
   if (ini_get('magic_quotes_sybase'))
     $value = str_replace("''", "'", $value);
@@ -574,7 +689,7 @@ function get_input_value($fname, $source, $allow_html=FALSE, $charset=NULL)
     $value = strip_tags($value);
   
   // convert to internal charset
-  if (is_object($OUTPUT))
+  if (is_object($OUTPUT) && $charset)
     return rcube_charset_convert($value, $OUTPUT->get_charset(), $charset);
   else
     return $value;
@@ -617,7 +732,7 @@ function asciiwords($str, $css_id = false, $replace_with = '')
  */
 function strip_quotes($str)
 {
-  return preg_replace('/[\'"]/', '', $str);
+  return str_replace(array("'", '"'), '', $str);
 }
 
 
@@ -649,8 +764,9 @@ function rcube_table_output($attrib, $table_data, $a_show_cols, $id_col)
   $table = new html_table(/*array('cols' => count($a_show_cols))*/);
     
   // add table header
-  foreach ($a_show_cols as $col)
-    $table->add_header($col, Q(rcube_label($col)));
+  if (!$attrib['noheader'])
+    foreach ($a_show_cols as $col)
+      $table->add_header($col, Q(rcube_label($col)));
   
   $c = 0;
   if (!is_array($table_data)) 
@@ -673,6 +789,9 @@ function rcube_table_output($attrib, $table_data, $a_show_cols, $id_col)
     foreach ($table_data as $row_data)
     {
       $zebra_class = $c % 2 ? 'even' : 'odd';
+      if (!empty($row_data['class']))
+        $zebra_class .= ' '.$row_data['class'];
+
       $table->add_row(array('id' => 'rcmrow' . $row_data[$id_col], 'class' => $zebra_class));
 
       // format each col
@@ -737,12 +856,15 @@ function rcmail_mod_css_styles($source, $container_id)
   {
   $last_pos = 0;
   $replacements = new rcube_string_replacer;
-  
+
   // ignore the whole block if evil styles are detected
   $stripped = preg_replace('/[^a-z\(:]/', '', rcmail_xss_entity_decode($source));
   if (preg_match('/expression|behavior|url\(|import/', $stripped))
     return '/* evil! */';
 
+  // remove css comments (sometimes used for some ugly hacks)
+  $source = preg_replace('!/\*(.+)\*/!Ums', '', $source);
+
   // cut out all contents between { and }
   while (($pos = strpos($source, '{', $last_pos)) && ($pos2 = strpos($source, '}', $pos)))
   {
@@ -750,22 +872,22 @@ function rcmail_mod_css_styles($source, $container_id)
     $source = substr($source, 0, $pos+1) . $replacements->get_replacement($key) . substr($source, $pos2, strlen($source)-$pos2);
     $last_pos = $pos+2;
   }
-  
+
   // remove html comments and add #container to each tag selector.
   // also replace body definition because we also stripped off the <body> tag
   $styles = preg_replace(
     array(
       '/(^\s*<!--)|(-->\s*$)/',
-      '/(^\s*|,\s*|\}\s*)([a-z0-9\._#][a-z0-9\.\-_]*)/im',
-      "/$container_id\s+body/i",
+      '/(^\s*|,\s*|\}\s*)([a-z0-9\._#\*][a-z0-9\.\-_]*)/im',
+      '/'.preg_quote($container_id, '/').'\s+body/i',
     ),
     array(
       '',
       "\\1#$container_id \\2",
-      "$container_id div.rcmBody",
+      $container_id,
     ),
     $source);
-  
+
   // put block contents back in
   $styles = $replacements->resolve($styles);
 
@@ -896,13 +1018,15 @@ function format_date($date, $format=NULL)
   $today_limit = mktime(0, 0, 0, $now_date['mon'], $now_date['mday'], $now_date['year']);
   $week_limit = mktime(0, 0, 0, $now_date['mon'], $now_date['mday']-6, $now_date['year']);
 
-  // define date format depending on current time  
-  if ($CONFIG['prettydate'] && !$format && $timestamp > $today_limit && $timestamp < $now)
-    return sprintf('%s %s', rcube_label('today'), date($CONFIG['date_today'] ? $CONFIG['date_today'] : 'H:i', $timestamp));
-  else if ($CONFIG['prettydate'] && !$format && $timestamp > $week_limit && $timestamp < $now)
-    $format = $CONFIG['date_short'] ? $CONFIG['date_short'] : 'D H:i';
-  else if (!$format)
-    $format = $CONFIG['date_long'] ? $CONFIG['date_long'] : 'd.m.Y H:i';
+  // define date format depending on current time
+  if (!$format) {
+    if ($CONFIG['prettydate'] && $timestamp > $today_limit && $timestamp < $now)
+      return sprintf('%s %s', rcube_label('today'), date($CONFIG['date_today'] ? $CONFIG['date_today'] : 'H:i', $timestamp));
+    else if ($CONFIG['prettydate'] && $timestamp > $week_limit && $timestamp < $now)
+      $format = $CONFIG['date_short'] ? $CONFIG['date_short'] : 'D H:i';
+    else
+      $format = $CONFIG['date_long'] ? $CONFIG['date_long'] : 'd.m.Y H:i';
+    }
 
   // strftime() format
   if (preg_match('/%[a-z]+/i', $format))
@@ -968,6 +1092,7 @@ function format_email_recipient($email, $name='')
  * Print or write debug messages
  *
  * @param mixed Debug message or data
+ * @return void
  */
 function console()
   {
@@ -1002,6 +1127,7 @@ function console()
  *
  * @param $name name of log file
  * @param line Line to append
+ * @return void
  */
 function write_log($name, $line)
   {
@@ -1025,14 +1151,14 @@ function write_log($name, $line)
       return true;
   }
  
-  $log_entry = sprintf("[%s]: %s\n", $date, $line);
-
   if ($CONFIG['log_driver'] == 'syslog') {
     $prio = $name == 'errors' ? LOG_ERR : LOG_INFO;
-    syslog($prio, $log_entry);
+    syslog($prio, $line);
     return true;
   }
   else {
+    $line = sprintf("[%s]: %s\n", $date, $line);
+
     // log_driver == 'file' is assumed here
     if (empty($CONFIG['log_dir']))
       $CONFIG['log_dir'] = INSTALL_PATH.'logs';
@@ -1040,7 +1166,7 @@ function write_log($name, $line)
     // try to open specific log file for writing
     $logfile = $CONFIG['log_dir'].'/'.$name;
     if ($fp = @fopen($logfile, 'a')) {
-      fwrite($fp, $log_entry);
+      fwrite($fp, $line);
       fflush($fp);
       fclose($fp);
       return true;
@@ -1052,17 +1178,61 @@ function write_log($name, $line)
 }
 
 
+/**
+ * Write login data (name, ID, IP address) to the 'userlogins' log file.
+ *
+ * @return void
+ */
+function rcmail_log_login()
+{
+  global $RCMAIL;
+
+  if (!$RCMAIL->config->get('log_logins') || !$RCMAIL->user)
+    return;
+
+  write_log('userlogins', sprintf('Successful login for %s (ID: %d) from %s',
+    $RCMAIL->user->get_username(), $RCMAIL->user->ID, rcmail_remote_ip()));
+}
+
+
+/**
+ * Returns remote IP address and forwarded addresses if found
+ *
+ * @return string Remote IP address(es)
+ */
+function rcmail_remote_ip()
+{
+    $address = $_SERVER['REMOTE_ADDR'];
+
+    // append the NGINX X-Real-IP header, if set
+    if (!empty($_SERVER['HTTP_X_REAL_IP'])) {
+        $remote_ip[] = 'X-Real-IP: ' . $_SERVER['HTTP_X_REAL_IP'];
+    }
+    // append the X-Forwarded-For header, if set
+    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
+        $remote_ip[] = 'X-Forwarded-For: ' . $_SERVER['HTTP_X_FORWARDED_FOR'];
+    }
+
+    if (!empty($remote_ip))
+        $address .= '(' . implode(',', $remote_ip) . ')';
+
+    return $address;
+}
+
+
 /**
  * @access private
+ * @return mixed
  */
 function rcube_timer()
 {
   return microtime(true);
 }
-  
+
 
 /**
  * @access private
+ * @return void
  */
 function rcube_print_time($timer, $label='Timer', $dest='console')
 {
@@ -1090,7 +1260,7 @@ function rcmail_mailbox_list($attrib)
   global $RCMAIL;
   static $a_mailboxes;
   
-  $attrib += array('maxlength' => 100, 'relanames' => false);
+  $attrib += array('maxlength' => 100, 'realnames' => false);
 
   // add some labels to client
   $RCMAIL->output->add_label('purgefolderconfirm', 'deletemessagesconfirm');
@@ -1114,7 +1284,7 @@ function rcmail_mailbox_list($attrib)
     foreach ($a_folders as $folder)
       rcmail_build_folder_tree($a_mailboxes, $folder, $delimiter);
   }
-  
+
   // allow plugins to alter the folder tree or to localize folder names
   $hook = $RCMAIL->plugins->exec_hook('render_mailboxlist', array('list' => $a_mailboxes, 'delimiter' => $delimiter));
 
@@ -1145,7 +1315,7 @@ function rcmail_mailbox_list($attrib)
  * Return the mailboxlist as html_select object
  *
  * @param array Named parameters
- * @return object html_select HTML drop-down object
+ * @return html_select HTML drop-down object
  */
 function rcmail_mailbox_select($p = array())
 {
@@ -1153,8 +1323,13 @@ function rcmail_mailbox_select($p = array())
   
   $p += array('maxlength' => 100, 'realnames' => false);
   $a_mailboxes = array();
-  
-  foreach ($RCMAIL->imap->list_mailboxes() as $folder)
+
+  if ($p['unsubscribed'])
+    $list = $RCMAIL->imap->list_unsubscribed();
+  else
+    $list = $RCMAIL->imap->list_mailboxes();
+
+  foreach ($list as $folder)
     if (empty($p['exceptions']) || !in_array($folder, $p['exceptions']))
       rcmail_build_folder_tree($a_mailboxes, $folder, $RCMAIL->imap->get_hierarchy_delimiter());
 
@@ -1172,14 +1347,25 @@ function rcmail_mailbox_select($p = array())
 /**
  * Create a hierarchical array of the mailbox list
  * @access private
+ * @return void
  */
 function rcmail_build_folder_tree(&$arrFolders, $folder, $delm='/', $path='')
 {
+  global $RCMAIL;
+
   $pos = strpos($folder, $delm);
+
   if ($pos !== false) {
     $subFolders = substr($folder, $pos+1);
     $currentFolder = substr($folder, 0, $pos);
-    $virtual = !isset($arrFolders[$currentFolder]);
+
+    // sometimes folder has a delimiter as the last character
+    if (!strlen($subFolders))
+      $virtual = false;
+    else if (!isset($arrFolders[$currentFolder]))
+      $virtual = true;
+    else
+      $virtual = $arrFolders[$currentFolder]['virtual'];
   }
   else {
     $subFolders = false;
@@ -1189,6 +1375,11 @@ function rcmail_build_folder_tree(&$arrFolders, $folder, $delm='/', $path='')
 
   $path .= $currentFolder;
 
+  // Check \Noselect option (if options are in cache)
+  if (!$virtual && ($opts = $RCMAIL->imap->mailbox_options($path))) {
+    $virtual = in_array('\\Noselect', $opts);
+  }
+
   if (!isset($arrFolders[$currentFolder])) {
     $arrFolders[$currentFolder] = array(
       'id' => $path,
@@ -1199,7 +1390,7 @@ function rcmail_build_folder_tree(&$arrFolders, $folder, $delm='/', $path='')
   else
     $arrFolders[$currentFolder]['virtual'] = $virtual;
 
-  if (!empty($subFolders))
+  if (strlen($subFolders))
     rcmail_build_folder_tree($arrFolders[$currentFolder]['folders'], $subFolders, $delm, $path.$delm);
 }
   
@@ -1207,6 +1398,7 @@ function rcmail_build_folder_tree(&$arrFolders, $folder, $delm='/', $path='')
 /**
  * Return html for a structured list &lt;ul&gt; for the mailbox tree
  * @access private
+ * @return string
  */
 function rcmail_render_folder_tree_html(&$arrFolders, &$mbox_name, &$jslist, $attrib, $nestLevel=0)
 {
@@ -1305,6 +1497,7 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$mbox_name, &$jslist, $at
 /**
  * Return html for a flat list <select> for the mailbox tree
  * @access private
+ * @return string
  */
 function rcmail_render_folder_tree_select(&$arrFolders, &$mbox_name, $maxlength, &$select, $realnames=false, $nestLevel=0)
   {
@@ -1338,20 +1531,21 @@ function rcmail_render_folder_tree_select(&$arrFolders, &$mbox_name, $maxlength,
 /**
  * Return internal name for the given folder if it matches the configured special folders
  * @access private
+ * @return string
  */
 function rcmail_folder_classname($folder_id)
 {
   global $CONFIG;
 
+  if ($folder_id == 'INBOX')
+    return 'inbox';
+
   // for these mailboxes we have localized labels and css classes
   foreach (array('sent', 'drafts', 'trash', 'junk') as $smbx)
   {
     if ($folder_id == $CONFIG[$smbx.'_mbox'])
       return $smbx;
   }
-
-  if ($folder_id == 'INBOX')
-    return 'inbox';
 }
 
 
@@ -1371,10 +1565,102 @@ function rcmail_localize_foldername($name)
 }
 
 
+function rcmail_quota_display($attrib)
+{
+  global $OUTPUT;
+
+  if (!$attrib['id'])
+    $attrib['id'] = 'rcmquotadisplay';
+
+  if(isset($attrib['display']))
+    $_SESSION['quota_display'] = $attrib['display'];
+
+  $OUTPUT->add_gui_object('quotadisplay', $attrib['id']);
+
+  $quota = rcmail_quota_content($attrib);
+
+  $OUTPUT->add_script('$(document).ready(function(){
+       rcmail.set_quota('.json_serialize($quota).')});', 'foot');
+
+  return html::span($attrib, '');
+}
+
+
+function rcmail_quota_content($attrib=NULL)
+{
+  global $RCMAIL;
+
+  $quota = $RCMAIL->imap->get_quota();
+  $quota = $RCMAIL->plugins->exec_hook('quota', $quota);
+
+  $quota_result = (array) $quota;
+  $quota_result['type'] = isset($_SESSION['quota_display']) ? $_SESSION['quota_display'] : '';
+
+  if (!$quota['total'] && $RCMAIL->config->get('quota_zero_as_unlimited')) {
+    $quota_result['title'] = rcube_label('unlimited');
+    $quota_result['percent'] = 0;
+  }
+  else if ($quota['total']) {
+    if (!isset($quota['percent']))
+      $quota_result['percent'] = min(100, round(($quota['used']/max(1,$quota['total']))*100));
+
+    $title = sprintf('%s / %s (%.0f%%)',
+        show_bytes($quota['used'] * 1024), show_bytes($quota['total'] * 1024),
+        $quota_result['percent']);
+
+    $quota_result['title'] = $title;
+
+    if ($attrib['width'])
+      $quota_result['width'] = $attrib['width'];
+    if ($attrib['height'])
+      $quota_result['height']  = $attrib['height'];
+  }
+  else {
+    $quota_result['title'] = rcube_label('unknown');
+    $quota_result['percent'] = 0;
+  }
+
+  return $quota_result;
+}
+
+
+/**
+ * Outputs error message according to server error/response codes
+ *
+ * @param string Fallback message label
+ * @param string Fallback message label arguments
+ *
+ * @return void
+ */
+function rcmail_display_server_error($fallback=null, $fallback_args=null)
+{
+    global $RCMAIL;
+
+    $err_code = $RCMAIL->imap->get_error_code();
+    $res_code = $RCMAIL->imap->get_response_code();
+
+    if ($res_code == rcube_imap::NOPERM) {
+        $RCMAIL->output->show_message('errornoperm', 'error');
+    }
+    else if ($res_code == rcube_imap::READONLY) {
+        $RCMAIL->output->show_message('errorreadonly', 'error');
+    }
+    else if ($err_code && ($err_str = $RCMAIL->imap->get_error_str())) {
+        $RCMAIL->output->show_message('servererrormsg', 'error', array('msg' => $err_str));
+    }
+    else if ($fallback) {
+        $RCMAIL->output->show_message($fallback, 'error', $fallback_args);
+    }
+
+    return true;
+}
+
+
 /**
  * Output HTML editor scripts
  *
  * @param string Editor mode
+ * @return void
  */
 function rcube_html_editor($mode='')
 {
@@ -1385,14 +1671,56 @@ function rcube_html_editor($mode='')
   if ($hook['abort'])
     return;  
 
-  $lang = strtolower(substr($_SESSION['language'], 0, 2));
+  $lang = strtolower($_SESSION['language']);
+
+  // TinyMCE uses 'tw' for zh_TW (which is wrong, because tw is a code of Twi language)
+  $lang = ($lang == 'zh_tw') ? 'tw' : substr($lang, 0, 2);
+
   if (!file_exists(INSTALL_PATH . 'program/js/tiny_mce/langs/'.$lang.'.js'))
     $lang = 'en';
 
   $RCMAIL->output->include_script('tiny_mce/tiny_mce.js');
   $RCMAIL->output->include_script('editor.js');
-  $RCMAIL->output->add_script('rcmail_editor_init("$__skin_path",
-    "'.JQ($lang).'", '.intval($CONFIG['enable_spellcheck']).', "'.$mode.'");');
+  $RCMAIL->output->add_script(sprintf("rcmail_editor_init('\$__skin_path', '%s', %d, '%s');",
+    JQ($lang), intval($CONFIG['enable_spellcheck']), $mode),
+    'foot');
+}
+
+
+/**
+ * Replaces TinyMCE's emoticon images with plain-text representation
+ *
+ * @param string HTML content
+ * @return string HTML content
+ */
+function rcmail_replace_emoticons($html)
+{
+  $emoticons = array(
+    '8-)' => 'smiley-cool',
+    ':-#' => 'smiley-foot-in-mouth',
+    ':-*' => 'smiley-kiss',
+    ':-X' => 'smiley-sealed',
+    ':-P' => 'smiley-tongue-out',
+    ':-@' => 'smiley-yell',
+    ":'(" => 'smiley-cry',
+    ':-(' => 'smiley-frown',
+    ':-D' => 'smiley-laughing',
+    ':-)' => 'smiley-smile',
+    ':-S' => 'smiley-undecided',
+    ':-$' => 'smiley-embarassed',
+    'O:-)' => 'smiley-innocent',
+    ':-|' => 'smiley-money-mouth',
+    ':-O' => 'smiley-surprised',
+    ';-)' => 'smiley-wink',
+  );
+
+  foreach ($emoticons as $idx => $file) {
+    // <img title="Cry" src="http://.../program/js/tiny_mce/plugins/emotions/img/smiley-cry.gif" border="0" alt="Cry" />
+    $search[]  = '/<img title="[a-z ]+" src="https?:\/\/[a-z0-9_.\/-]+\/tiny_mce\/plugins\/emotions\/img\/'.$file.'.gif"[^>]+\/>/i';
+    $replace[] = $idx;
+  }
+
+  return preg_replace($search, $replace, $html);
 }
 
 
@@ -1401,67 +1729,130 @@ function rcube_html_editor($mode='')
  *
  * @param integer HTTPS port number
  * @param boolean Enables 'use_https' option checking
+ * @return boolean
  */
 function rcube_https_check($port=null, $use_https=true)
 {
   global $RCMAIL;
-  
-  if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')
+
+  if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off')
+    return true;
+  if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https')
     return true;
   if ($port && $_SERVER['SERVER_PORT'] == $port)
     return true;
-  if ($use_https && $RCMAIL->config->get('use_https'))
+  if ($use_https && isset($RCMAIL) && $RCMAIL->config->get('use_https'))
     return true;
 
   return false;
 }
 
 
+/**
+ * For backward compatibility.
+ *
+ * @global rcmail $RCMAIL
+ * @param string $var_name Variable name.
+ * @return void
+ */
+function rcube_sess_unset($var_name=null)
+{
+  global $RCMAIL;
+
+  $RCMAIL->session->remove($var_name);
+}
+
+
+
+/**
+ * Replaces hostname variables
+ *
+ * @param string $name Hostname
+ * @return string
+ */
+function rcube_parse_host($name)
+{
+  // %n - host
+  $n = preg_replace('/:\d+$/', '', $_SERVER['SERVER_NAME']);
+  // %d - domain name without first part, e.g. %d=mail.domain.tld, %m=domain.tld
+  $d = preg_replace('/^[^\.]+\./', '', $n);
+  // %h - IMAP host
+  $h = $_SESSION['imap_host'];
+  // %z - IMAP domain without first part, e.g. %h=imap.domain.tld, %z=domain.tld
+  $z = preg_replace('/^[^\.]+\./', '', $h);
+
+  $name = str_replace(array('%n', '%d', '%h', '%z'), array($n, $d, $h, $z), $name);
+  return $name;
+}
+
+
 /**
  * E-mail address validation
+ *
+ * @param string $email Email address
+ * @param boolean $dns_check True to check dns
+ * @return boolean
  */
-function check_email($email)
+function check_email($email, $dns_check=true)
 {
   // Check for invalid characters
   if (preg_match('/[\x00-\x1F\x7F-\xFF]/', $email))
     return false;
 
-  // Check that there's one @ symbol, and that the lengths are right
-  if (!preg_match('/^([^@]{1,64})@([^@]{1,255})$/', $email, $email_array))
+  // Check for length limit specified by RFC 5321 (#1486453)
+  if (strlen($email) > 254) 
     return false;
 
-  // Check local part
-  $local_array = explode('.', $email_array[1]);
-  foreach ($local_array as $local_part)
-    if (!preg_match('/^(([A-Za-z0-9!#$%&\'*+\/=?^_`{|}~-]+)|("[^"]+"))$/', $local_part))
-      return false;
+  $email_array = explode('@', $email);
+
+  // Check that there's one @ symbol
+  if (count($email_array) < 2)
+    return false;
+
+  $domain_part = array_pop($email_array);
+  $local_part = implode('@', $email_array);
+
+  // from PEAR::Validate
+  $regexp = '&^(?:
+       ("\s*(?:[^"\f\n\r\t\v\b\s]+\s*)+")|                             #1 quoted name
+       ([-\w!\#\$%\&\'*+~/^`|{}=]+(?:\.[-\w!\#\$%\&\'*+~/^`|{}=]+)*))  #2 OR dot-atom (RFC5322)
+       $&xi';
+
+  if (!preg_match($regexp, $local_part))
+    return false;
 
   // Check domain part
-  if (preg_match('/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}$/', $email_array[2]) 
-      || preg_match('/^\[(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\]$/', $email_array[2]))
-    return true; // If an IP address
+  if (preg_match('/^\[*(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\]*$/', $domain_part))
+    return true; // IP address
   else {
     // If not an IP address
-    $domain_array = explode('.', $email_array[2]);
+    $domain_array = explode('.', $domain_part);
     if (sizeof($domain_array) < 2)
       return false; // Not enough parts to be a valid domain
 
-    foreach ($domain_array as $domain_part)
-      if (!preg_match('/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]))$/', $domain_part))
+    foreach ($domain_array as $part)
+      if (!preg_match('/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]))$/', $part))
         return false;
 
-    if (!rcmail::get_instance()->config->get('email_dns_check'))
+    if (!$dns_check || !rcmail::get_instance()->config->get('email_dns_check'))
       return true;
 
-    if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && version_compare(PHP_VERSION, '5.3.0', '<'))
-      return true;
+    if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && version_compare(PHP_VERSION, '5.3.0', '<')) {
+      $lookup = array();
+      @exec("nslookup -type=MX " . escapeshellarg($domain_part) . " 2>&1", $lookup);
+      foreach ($lookup as $line) {
+        if (strpos($line, 'MX preference'))
+          return true;
+      }
+      return false;
+    }
 
     // find MX record(s)
-    if (getmxrr($email_array[2], $mx_records))
+    if (getmxrr($domain_part, $mx_records))
       return true;
 
     // find any DNS record
-    if (checkdnsrr($email_array[2], 'ANY'))
+    if (checkdnsrr($domain_part, 'ANY'))
       return true;
   }
 
@@ -1476,16 +1867,96 @@ function check_email($email)
 class rcube_base_replacer
 {
   private $base_url;
-  
+
   public function __construct($base)
   {
     $this->base_url = $base;
   }
-  
+
   public function callback($matches)
   {
     return $matches[1] . '="' . make_absolute_url($matches[3], $this->base_url) . '"';
   }
 }
 
-?>
+
+/**
+ * Throw system error and show error page
+ *
+ * @param array Named parameters
+ *  - code: Error code (required)
+ *  - type: Error type [php|db|imap|javascript] (required)
+ *  - message: Error message
+ *  - file: File where error occured
+ *  - line: Line where error occured
+ * @param boolean True to log the error
+ * @param boolean Terminate script execution
+ */
+// may be defined in Installer
+if (!function_exists('raise_error')) {
+function raise_error($arg=array(), $log=false, $terminate=false)
+{
+    global $__page_content, $CONFIG, $OUTPUT, $ERROR_CODE, $ERROR_MESSAGE;
+
+    // report bug (if not incompatible browser)
+    if ($log && $arg['type'] && $arg['message'])
+        log_bug($arg);
+
+    // display error page and terminate script
+    if ($terminate) {
+        $ERROR_CODE = $arg['code'];
+        $ERROR_MESSAGE = $arg['message'];
+        include('program/steps/utils/error.inc');
+        exit;
+    }
+}
+}
+
+
+/**
+ * Report error according to configured debug_level
+ *
+ * @param array Named parameters
+ * @return void
+ * @see raise_error()
+ */
+function log_bug($arg_arr)
+{
+    global $CONFIG;
+    $program = strtoupper($arg_arr['type']);
+
+    // write error to local log file
+    if ($CONFIG['debug_level'] & 1) {
+        $post_query = ($_SERVER['REQUEST_METHOD'] == 'POST' ? '?_task='.urlencode($_POST['_task']).'&_action='.urlencode($_POST['_action']) : '');
+        $log_entry = sprintf("%s Error: %s%s (%s %s)",
+            $program,
+            $arg_arr['message'],
+            $arg_arr['file'] ? sprintf(' in %s on line %d', $arg_arr['file'], $arg_arr['line']) : '',
+            $_SERVER['REQUEST_METHOD'],
+            $_SERVER['REQUEST_URI'] . $post_query);
+
+        if (!write_log('errors', $log_entry)) {
+            // send error to PHPs error handler if write_log didn't succeed
+            trigger_error($arg_arr['message']);
+        }
+    }
+
+    // resport the bug to the global bug reporting system
+    if ($CONFIG['debug_level'] & 2) {
+        // TODO: Send error via HTTP
+    }
+
+    // show error if debug_mode is on
+    if ($CONFIG['debug_level'] & 4) {
+        print "<b>$program Error";
+
+        if (!empty($arg_arr['file']) && !empty($arg_arr['line']))
+            print " in $arg_arr[file] ($arg_arr[line])";
+
+        print ':</b>&nbsp;';
+        print nl2br($arg_arr['message']);
+        print '<br />';
+        flush();
+    }
+}
+
index 763c7088953fb6aba1d9c25193b2f76a1ce20e46..cbfb884af307490c75bc1b6ff6c9f8136a4f7df5 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcmail.php                                            |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2008-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2008-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcmail.php 328 2006-08-30 17:41:21Z thomasb $
+ $Id: rcmail.php 4396 2011-01-06 12:41:16Z thomasb $
 
 */
 
 
 /**
- * Application class of RoundCube Webmail
+ * Application class of Roundcube Webmail
  * implemented as singleton
  *
  * @package Core
  */
 class rcmail
 {
-  static public $main_tasks = array('mail','settings','addressbook','login','logout','dummy');
-  
+  /**
+   * Main tasks.
+   *
+   * @var array
+   */
+  static public $main_tasks = array('mail','settings','addressbook','login','logout','utils','dummy');
+
+  /**
+   * Singleton instace of rcmail
+   *
+   * @var rcmail
+   */
   static private $instance;
-  
+
+  /**
+   * Stores instance of rcube_config.
+   *
+   * @var rcube_config
+   */
   public $config;
+
+  /**
+   * Stores rcube_user instance.
+   *
+   * @var rcube_user
+   */
   public $user;
+
+  /**
+   * Instace of database class.
+   *
+   * @var rcube_mdb2
+   */
   public $db;
+
+  /**
+   * Instace of rcube_session class.
+   *
+   * @var rcube_session
+   */
+  public $session;
+
+  /**
+   * Instance of rcube_smtp class.
+   *
+   * @var rcube_smtp
+   */
   public $smtp;
+
+  /**
+   * Instance of rcube_imap class.
+   *
+   * @var rcube_imap
+   */
   public $imap;
+
+  /**
+   * Instance of rcube_template class.
+   *
+   * @var rcube_template
+   */
   public $output;
+
+  /**
+   * Instance of rcube_plugin_api.
+   *
+   * @var rcube_plugin_api
+   */
   public $plugins;
-  public $task = 'mail';
+
+  /**
+   * Current task.
+   *
+   * @var string
+   */
+  public $task;
+
+  /**
+   * Current action.
+   *
+   * @var string
+   */
   public $action = '';
   public $comm_path = './';
-  
+
   private $texts;
-  
-  
+  private $books = array();
+
+
   /**
    * This implements the 'singleton' design pattern
    *
-   * @return object rcmail The one and only instance
+   * @return rcmail The one and only instance
    */
   static function get_instance()
   {
@@ -60,8 +131,8 @@ class rcmail
 
     return self::$instance;
   }
-  
-  
+
+
   /**
    * Private constructor
    */
@@ -69,11 +140,11 @@ class rcmail
   {
     // load configuration
     $this->config = new rcube_config();
-    
+
     register_shutdown_function(array($this, 'shutdown'));
   }
-  
-  
+
+
   /**
    * Initial startup function
    * to register session, create database and imap connections
@@ -82,8 +153,6 @@ class rcmail
    */
   private function startup()
   {
-    $config_all = $this->config->all();
-
     // initialize syslog
     if ($this->config->get('log_driver') == 'syslog') {
       $syslog_id = $this->config->get('syslog_id', 'roundcube');
@@ -91,54 +160,44 @@ class rcmail
       openlog($syslog_id, LOG_ODELAY, $syslog_facility);
     }
 
-    // set task and action properties
-    $this->set_task(get_input_value('_task', RCUBE_INPUT_GPC));
-    $this->action = asciiwords(get_input_value('_action', RCUBE_INPUT_GPC));
-
     // connect to database
     $GLOBALS['DB'] = $this->get_dbh();
 
-    // use database for storing session data
-    include_once('include/session.inc');
-
-    // set session domain
-    if (!empty($config_all['session_domain'])) {
-      ini_set('session.cookie_domain', $config_all['session_domain']);
-    }
-    // set session garbage collecting time according to session_lifetime
-    if (!empty($config_all['session_lifetime'])) {
-      ini_set('session.gc_maxlifetime', ($config_all['session_lifetime']) * 120);
-    }
-
-    // start PHP session (if not in CLI mode)
-    if ($_SERVER['REMOTE_ADDR'])
-      session_start();
-
-    // set initial session vars
-    if (!isset($_SESSION['auth_time'])) {
-      $_SESSION['auth_time'] = time();
-      $_SESSION['temp'] = true;
-    }
+    // start session
+    $this->session_init();
 
     // create user object
     $this->set_user(new rcube_user($_SESSION['user_id']));
 
+    // configure session (after user config merge!)
+    $this->session_configure();
+
+    // set task and action properties
+    $this->set_task(get_input_value('_task', RCUBE_INPUT_GPC));
+    $this->action = asciiwords(get_input_value('_action', RCUBE_INPUT_GPC));
+
     // reset some session parameters when changing task
-    if ($_SESSION['task'] != $this->task)
-      rcube_sess_unset('page');
+    if ($this->task != 'utils') {
+      if ($this->session && $_SESSION['task'] != $this->task)
+        $this->session->remove('page');
+      // set current task to session
+      $_SESSION['task'] = $this->task;
+    }
 
-    // set current task to session
-    $_SESSION['task'] = $this->task;
+    // init output class
+    if (!empty($_REQUEST['_remote']))
+      $GLOBALS['OUTPUT'] = $this->json_init();
+    else
+      $GLOBALS['OUTPUT'] = $this->load_gui(!empty($_REQUEST['_framed']));
 
-    // create IMAP object
-    if ($this->task == 'mail')
-      $this->imap_init();
-      
     // create plugin API and load plugins
     $this->plugins = rcube_plugin_api::get_instance();
+
+    // init plugins
+    $this->plugins->init();
   }
-  
-  
+
+
   /**
    * Setter for application task
    *
@@ -147,40 +206,46 @@ class rcmail
   public function set_task($task)
   {
     $task = asciiwords($task);
-    $this->task = $task ? $task : 'mail';
+
+    if ($this->user && $this->user->ID)
+      $task = !$task ? 'mail' : $task;
+    else
+      $task = 'login';
+
+    $this->task = $task;
     $this->comm_path = $this->url(array('task' => $this->task));
-    
+
     if ($this->output)
       $this->output->set_env('task', $this->task);
   }
-  
-  
+
+
   /**
    * Setter for system user object
    *
-   * @param object rcube_user Current user instance
+   * @param rcube_user Current user instance
    */
   public function set_user($user)
   {
     if (is_object($user)) {
       $this->user = $user;
       $GLOBALS['USER'] = $this->user;
-      
+
       // overwrite config with user preferences
-      $this->config->merge((array)$this->user->get_prefs());
+      $this->config->set_user_prefs((array)$this->user->get_prefs());
     }
-    
+
     $_SESSION['language'] = $this->user->language = $this->language_prop($this->config->get('language', $_SESSION['language']));
 
     // set localization
     setlocale(LC_ALL, $_SESSION['language'] . '.utf8', 'en_US.utf8');
 
-    // workaround for http://bugs.php.net/bug.php?id=18556 
-    if (in_array($_SESSION['language'], array('tr_TR', 'ku', 'az_AZ'))) 
-      setlocale(LC_CTYPE, 'en_US' . '.utf8'); 
+    // workaround for http://bugs.php.net/bug.php?id=18556
+    if (in_array($_SESSION['language'], array('tr_TR', 'ku', 'az_AZ')))
+      setlocale(LC_CTYPE, 'en_US' . '.utf8');
   }
-  
-  
+
+
   /**
    * Check the given string and return a valid language code
    *
@@ -190,17 +255,17 @@ class rcmail
   private function language_prop($lang)
   {
     static $rcube_languages, $rcube_language_aliases;
-    
+
     // user HTTP_ACCEPT_LANGUAGE if no language is specified
     if (empty($lang) || $lang == 'auto') {
        $accept_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
        $lang = str_replace('-', '_', $accept_langs[0]);
      }
-     
+
     if (empty($rcube_languages)) {
       @include(INSTALL_PATH . 'program/localization/index.inc');
     }
-    
+
     // check if we have an alias for that language
     if (!isset($rcube_languages[$lang]) && isset($rcube_language_aliases[$lang])) {
       $lang = $rcube_language_aliases[$lang];
@@ -208,7 +273,7 @@ class rcmail
     // try the first two chars
     else if (!isset($rcube_languages[$lang])) {
       $short = substr($lang, 0, 2);
-     
+
       // check if we have an alias for the short language code
       if (!isset($rcube_languages[$short]) && isset($rcube_language_aliases[$short])) {
         $lang = $rcube_language_aliases[$short];
@@ -225,12 +290,12 @@ class rcmail
 
     return $lang;
   }
-  
-  
+
+
   /**
    * Get the current database connection
    *
-   * @return object rcube_mdb2  Database connection object
+   * @return rcube_mdb2  Database connection object
    */
   public function get_dbh()
   {
@@ -240,18 +305,18 @@ class rcmail
       $this->db = new rcube_mdb2($config_all['db_dsnw'], $config_all['db_dsnr'], $config_all['db_persistent']);
       $this->db->sqlite_initials = INSTALL_PATH . 'SQL/sqlite.initial.sql';
       $this->db->set_debug((bool)$config_all['sql_debug']);
-      $this->db->db_connect('w');
     }
 
     return $this->db;
   }
-  
-  
+
+
   /**
    * Return instance of the internal address book class
    *
+   * @param string  Address book identifier
    * @param boolean True if the address book needs to be writeable
-   * @return object rcube_contacts Address book object
+   * @return rcube_contacts Address book object
    */
   public function get_address_book($id, $writeable = false)
   {
@@ -259,8 +324,8 @@ class rcmail
     $ldap_config = (array)$this->config->get('ldap_public');
     $abook_type = strtolower($this->config->get('address_book_type'));
 
-    $plugin = $this->plugins->exec_hook('get_address_book', array('id' => $id, 'writeable' => $writeable));
-    
+    $plugin = $this->plugins->exec_hook('addressbook_get', array('id' => $id, 'writeable' => $writeable));
+
     // plugin returned instance of a rcube_addressbook
     if ($plugin['instance'] instanceof rcube_addressbook) {
       $contacts = $plugin['instance'];
@@ -280,21 +345,77 @@ class rcmail
         }
       }
     }
-    else {
+    else { // $id == 'sql'
       $contacts = new rcube_contacts($this->db, $this->user->ID);
     }
-    
+
+    // add to the 'books' array for shutdown function
+    if (!in_array($contacts, $this->books))
+      $this->books[] = $contacts;
+
     return $contacts;
   }
-  
-  
+
+
+  /**
+   * Return address books list
+   *
+   * @param boolean True if the address book needs to be writeable
+   * @return array  Address books array
+   */
+  public function get_address_sources($writeable = false)
+  {
+    $abook_type = strtolower($this->config->get('address_book_type'));
+    $ldap_config = $this->config->get('ldap_public');
+    $autocomplete = (array) $this->config->get('autocomplete_addressbooks');
+    $list = array();
+
+    // We are using the DB address book
+    if ($abook_type != 'ldap') {
+      $contacts = new rcube_contacts($this->db, null);
+      $list['0'] = array(
+        'id' => 0,
+        'name' => rcube_label('personaladrbook'),
+        'groups' => $contacts->groups,
+        'readonly' => false,
+        'autocomplete' => in_array('sql', $autocomplete)
+      );
+    }
+
+    if ($ldap_config) {
+      $ldap_config = (array) $ldap_config;
+      foreach ($ldap_config as $id => $prop)
+        $list[$id] = array(
+          'id' => $id,
+          'name' => $prop['name'],
+          'groups' => false,
+          'readonly' => !$prop['writable'],
+          'autocomplete' => in_array('sql', $autocomplete)
+        );
+    }
+
+    $plugin = $this->plugins->exec_hook('addressbooks_list', array('sources' => $list));
+    $list = $plugin['sources'];
+
+    if ($writeable && !empty($list)) {
+      foreach ($list as $idx => $item) {
+        if ($item['readonly']) {
+          unset($list[$idx]);
+        }
+      }
+    }
+
+    return $list;
+  }
+
+
   /**
    * Init output object for GUI and add common scripts.
    * This will instantiate a rcmail_template object and set
    * environment vars according to the current session and configuration
    *
    * @param boolean True if this request is loaded in a (i)frame
-   * @return object rcube_template Reference to HTML output object
+   * @return rcube_template Reference to HTML output object
    */
   public function load_gui($framed = false)
   {
@@ -303,11 +424,8 @@ class rcmail
       $this->output = new rcube_template($this->task, $framed);
 
     // set keep-alive/check-recent interval
-    if ($keep_alive = $this->config->get('keep_alive')) {
-      // be sure that it's less than session lifetime
-      if ($session_lifetime = $this->config->get('session_lifetime'))
-        $keep_alive = min($keep_alive, $session_lifetime * 60 - 30);
-      $this->output->set_env('keep_alive', max(60, $keep_alive));
+    if ($this->session && ($keep_alive = $this->session->get_keep_alive())) {
+      $this->output->set_env('keep_alive', $keep_alive);
     }
 
     if ($framed) {
@@ -322,21 +440,21 @@ class rcmail
 
     // add some basic label to client
     $this->output->add_label('loading', 'servererror');
-    
+
     return $this->output;
   }
-  
-  
+
+
   /**
    * Create an output object for JSON responses
    *
-   * @return object rcube_json_output Reference to JSON output object
+   * @return rcube_json_output Reference to JSON output object
    */
-  public function init_json()
+  public function json_init()
   {
     if (!($this->output instanceof rcube_json_output))
       $this->output = new rcube_json_output($this->task);
-    
+
     return $this->output;
   }
 
@@ -349,12 +467,12 @@ class rcmail
   public function smtp_init($connect = false)
   {
     $this->smtp = new rcube_smtp();
-  
+
     if ($connect)
       $this->smtp->connect();
   }
-  
-  
+
+
   /**
    * Create global IMAP object and connect to server
    *
@@ -363,10 +481,13 @@ class rcmail
    */
   public function imap_init($connect = false)
   {
+    // already initialized
+    if (is_object($this->imap))
+      return;
+
     $this->imap = new rcube_imap($this->db);
     $this->imap->debug_level = $this->config->get('debug_level');
     $this->imap->skip_deleted = $this->config->get('skip_deleted');
-    $this->imap->index_sort = $this->config->get('index_sort', true);
 
     // enable caching of imap data
     if ($this->config->get('enable_caching')) {
@@ -375,23 +496,36 @@ class rcmail
 
     // set pagesize from config
     $this->imap->set_pagesize($this->config->get('pagesize', 50));
-    
-    // Setting root and delimiter before iil_Connect can save time detecting them
-    // using NAMESPACE and LIST 
+
+    // Setting root and delimiter before establishing the connection
+    // can save time detecting them using NAMESPACE and LIST
     $options = array(
       'auth_method' => $this->config->get('imap_auth_type', 'check'),
-      'delimiter' => isset($_SESSION['imap_delimiter']) ? $_SESSION['imap_delimiter'] : $this->config->get('imap_delimiter'),
-      'rootdir' => isset($_SESSION['imap_root']) ? $_SESSION['imap_root'] : $this->config->get('imap_root'),
-      'debug_mode' => (bool) $this->config->get('imap_debug', 0),
+      'auth_cid'    => $this->config->get('imap_auth_cid'),
+      'auth_pw'     => $this->config->get('imap_auth_pw'),
+      'debug'       => (bool) $this->config->get('imap_debug', 0),
+      'force_caps'  => (bool) $this->config->get('imap_force_caps'),
+      'timeout'     => (int) $this->config->get('imap_timeout', 0),
     );
 
     $this->imap->set_options($options);
-  
+
     // set global object for backward compatibility
     $GLOBALS['IMAP'] = $this->imap;
-    
-    if ($connect)
+
+    $hook = $this->plugins->exec_hook('imap_init', array('fetch_headers' => $this->imap->fetch_add_headers));
+    if ($hook['fetch_headers'])
+      $this->imap->fetch_add_headers = $hook['fetch_headers'];
+
+    // support this parameter for backward compatibility but log warning
+    if ($connect) {
       $this->imap_connect();
+      raise_error(array(
+        'code' => 800, 'type' => 'imap',
+        'file' => __FILE__, 'line' => __LINE__,
+        'message' => "rcube::imap_init(true) is deprecated, use rcube::imap_connect() instead"),
+        true, false);
+    }
   }
 
 
@@ -402,18 +536,87 @@ class rcmail
    */
   public function imap_connect()
   {
-    $conn = false;
-    
-    if ($_SESSION['imap_host'] && !$this->imap->conn) {
-      if (!($conn = $this->imap->connect($_SESSION['imap_host'], $_SESSION['username'], $this->decrypt($_SESSION['password']), $_SESSION['imap_port'], $_SESSION['imap_ssl']))) {
+    if (!$this->imap)
+      $this->imap_init();
+
+    if ($_SESSION['imap_host'] && !$this->imap->conn->connected()) {
+      if (!$this->imap->connect($_SESSION['imap_host'], $_SESSION['username'], $this->decrypt($_SESSION['password']), $_SESSION['imap_port'], $_SESSION['imap_ssl'])) {
         if ($this->output)
-          $this->output->show_message($this->imap->error_code == -1 ? 'imaperror' : 'sessionerror', 'error');
+          $this->output->show_message($this->imap->get_error_code() == -1 ? 'imaperror' : 'sessionerror', 'error');
       }
+      else {
+        $this->set_imap_prop();
+        return $this->imap->conn;
+      }
+    }
+
+    return false;
+  }
+
 
-      $this->set_imap_prop();
+  /**
+   * Create session object and start the session.
+   */
+  public function session_init()
+  {
+    // session started (Installer?)
+    if (session_id())
+      return;
+
+    $lifetime = $this->config->get('session_lifetime', 0) * 60;
+
+    // set session domain
+    if ($domain = $this->config->get('session_domain')) {
+      ini_set('session.cookie_domain', $domain);
     }
+    // set session garbage collecting time according to session_lifetime
+    if ($lifetime) {
+      ini_set('session.gc_maxlifetime', $lifetime * 2);
+    }
+
+    ini_set('session.cookie_secure', rcube_https_check());
+    ini_set('session.name', 'roundcube_sessid');
+    ini_set('session.use_cookies', 1);
+    ini_set('session.use_only_cookies', 1);
+    ini_set('session.serialize_handler', 'php');
+
+    // use database for storing session data
+    $this->session = new rcube_session($this->get_dbh(), $lifetime);
+
+    $this->session->register_gc_handler('rcmail_temp_gc');
+    if ($this->config->get('enable_caching'))
+      $this->session->register_gc_handler('rcmail_cache_gc');
 
-    return $conn;
+    // start PHP session (if not in CLI mode)
+    if ($_SERVER['REMOTE_ADDR'])
+      session_start();
+
+    // set initial session vars
+    if (!isset($_SESSION['auth_time'])) {
+      $_SESSION['auth_time'] = time();
+      $_SESSION['temp'] = true;
+    }
+  }
+
+
+  /**
+   * Configure session object internals
+   */
+  public function session_configure()
+  {
+    if (!$this->session)
+      return;
+
+    $lifetime = $this->config->get('session_lifetime', 0) * 60;
+
+    // set keep-alive/check-recent interval
+    if ($keep_alive = $this->config->get('keep_alive')) {
+      // be sure that it's less than session lifetime
+      if ($lifetime)
+        $keep_alive = min($keep_alive, $lifetime - 30);
+      $keep_alive = max(60, $keep_alive);
+      $this->session->set_keep_alive($keep_alive);
+    }
   }
 
 
@@ -448,7 +651,7 @@ class rcmail
       if (!$allowed)
         return false;
       }
-    else if (!empty($config['default_host']) && $host != $config['default_host'])
+    else if (!empty($config['default_host']) && $host != rcube_parse_host($config['default_host']))
       return false;
 
     // parse $host URL
@@ -456,67 +659,100 @@ class rcmail
     if ($a_host['host']) {
       $host = $a_host['host'];
       $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? $a_host['scheme'] : null;
-      if(!empty($a_host['port']))
+      if (!empty($a_host['port']))
         $imap_port = $a_host['port'];
-      else if ($imap_ssl && $imap_ssl != 'tls')
+      else if ($imap_ssl && $imap_ssl != 'tls' && (!$config['default_port'] || $config['default_port'] == 143))
         $imap_port = 993;
     }
-    
+
     $imap_port = $imap_port ? $imap_port : $config['default_port'];
 
-    /* Modify username with domain if required  
+    /* Modify username with domain if required
        Inspired by Marco <P0L0_notspam_binware.org>
     */
     // Check if we need to add domain
-    if (!empty($config['username_domain']) && !strpos($username, '@')) {
+    if (!empty($config['username_domain']) && strpos($username, '@') === false) {
       if (is_array($config['username_domain']) && isset($config['username_domain'][$host]))
-        $username .= '@'.$config['username_domain'][$host];
+        $username .= '@'.rcube_parse_host($config['username_domain'][$host]);
       else if (is_string($config['username_domain']))
-        $username .= '@'.$config['username_domain'];
+        $username .= '@'.rcube_parse_host($config['username_domain']);
+    }
+
+    // Convert username to lowercase. If IMAP backend
+    // is case-insensitive we need to store always the same username (#1487113)
+    if ($config['login_lc']) {
+      $username = mb_strtolower($username);
     }
 
     // try to resolve email address from virtuser table
-    if (strpos($username, '@'))
-      if ($virtuser = rcube_user::email2user($username))
-        $username = $virtuser;
+    if (strpos($username, '@') && ($virtuser = rcube_user::email2user($username))) {
+      $username = $virtuser;
+    }
 
-    // lowercase username if it's an e-mail address (#1484473)
-    if (strpos($username, '@'))
-      $username = mb_strtolower($username);
+    // Here we need IDNA ASCII
+    // Only rcube_contacts class is using domain names in Unicode
+    $host = idn_to_ascii($host);
+    if (strpos($username, '@')) {
+      // lowercase domain name
+      list($local, $domain) = explode('@', $username);
+      $username = $local . '@' . mb_strtolower($domain);
+      $username = idn_to_ascii($username);
+    }
 
     // user already registered -> overwrite username
     if ($user = rcube_user::query($username, $host))
       $username = $user->data['username'];
 
+    if (!$this->imap)
+      $this->imap_init();
+
+    // try IMAP login
+    if (!($imap_login = $this->imap->connect($host, $username, $pass, $imap_port, $imap_ssl))) {
+      // try with lowercase
+      $username_lc = mb_strtolower($username);
+      if ($username_lc != $username) {
+        // try to find user record again -> overwrite username
+        if (!$user && ($user = rcube_user::query($username_lc, $host)))
+          $username_lc = $user->data['username'];
+
+        if ($imap_login = $this->imap->connect($host, $username_lc, $pass, $imap_port, $imap_ssl))
+          $username = $username_lc;
+      }
+    }
+
     // exit if IMAP login failed
-    if (!($imap_login  = $this->imap->connect($host, $username, $pass, $imap_port, $imap_ssl)))
+    if (!$imap_login)
       return false;
 
+    $this->set_imap_prop();
+
     // user already registered -> update user's record
     if (is_object($user)) {
+      // create default folders on first login
+      if (!$user->data['last_login'] && $config['create_default_folders'])
+        $this->imap->create_default_folders();
       $user->touch();
     }
     // create new system user
     else if ($config['auto_create_user']) {
       if ($created = rcube_user::create($username, $host)) {
         $user = $created;
-
-        // get existing mailboxes (but why?)
-        // $a_mailboxes = $this->imap->list_mailboxes();
+        // create default folders on first login
+        if ($config['create_default_folders'])
+          $this->imap->create_default_folders();
       }
       else {
         raise_error(array(
-          'code' => 600,
-          'type' => 'php',
+          'code' => 600, 'type' => 'php',
+          'file' => __FILE__, 'line' => __LINE__,
           'message' => "Failed to create a user record. Maybe aborted by a plugin?"
-          ), true, false);        
+          ), true, false);
       }
     }
     else {
       raise_error(array(
-        'code' => 600,
-        'type' => 'php',
-        'file' => RCMAIL_CONFIG_DIR."/main.inc.php",
+        'code' => 600, 'type' => 'php',
+        'file' => __FILE__, 'line' => __LINE__,
         'message' => "Acces denied for new user $username. 'auto_create_user' is disabled"
         ), true, false);
     }
@@ -533,17 +769,13 @@ class rcmail
       $_SESSION['imap_ssl']  = $imap_ssl;
       $_SESSION['password']  = $this->encrypt($pass);
       $_SESSION['login_time'] = mktime();
-      
-      if ($_REQUEST['_timezone'] != '_default_')
+
+      if (isset($_REQUEST['_timezone']) && $_REQUEST['_timezone'] != '_default_')
         $_SESSION['timezone'] = floatval($_REQUEST['_timezone']);
 
       // force reloading complete list of subscribed mailboxes
-      $this->set_imap_prop();
       $this->imap->clear_cache('mailboxes');
 
-      if ($config['create_default_folders'])
-          $this->imap->create_default_folders();
-
       return true;
     }
 
@@ -562,16 +794,12 @@ class rcmail
     if ($default_folders = $this->config->get('default_imap_folders')) {
       $this->imap->set_default_mailboxes($default_folders);
     }
-    if (!empty($_SESSION['mbox'])) {
+    if (isset($_SESSION['mbox'])) {
       $this->imap->set_mailbox($_SESSION['mbox']);
     }
     if (isset($_SESSION['page'])) {
       $this->imap->set_page($_SESSION['page']);
     }
-    
-    // cache IMAP root and delimiter in session for performance reasons
-    $_SESSION['imap_root'] = $this->imap->root_dir;
-    $_SESSION['imap_delimiter'] = $this->imap->delimiter;
   }
 
 
@@ -584,15 +812,15 @@ class rcmail
   {
     $default_host = $this->config->get('default_host');
     $host = null;
-    
+
     if (is_array($default_host)) {
       $post_host = get_input_value('_host', RCUBE_INPUT_POST);
-      
+
       // direct match in default_host array
       if ($default_host[$post_host] || in_array($post_host, array_values($default_host))) {
         $host = $post_host;
       }
-      
+
       // try to select host by mail domain
       list($user, $domain) = explode('@', get_input_value('_user', RCUBE_INPUT_POST));
       if (!empty($domain)) {
@@ -613,7 +841,7 @@ class rcmail
       $host = get_input_value('_host', RCUBE_INPUT_POST);
     }
     else
-      $host = $default_host;
+      $host = rcube_parse_host($default_host);
 
     return $host;
   }
@@ -630,34 +858,23 @@ class rcmail
     // load localization files if not done yet
     if (empty($this->texts))
       $this->load_language();
-    
+
     // extract attributes
     if (is_string($attrib))
       $attrib = array('name' => $attrib);
 
     $nr = is_numeric($attrib['nr']) ? $attrib['nr'] : 1;
-    $vars = isset($attrib['vars']) ? $attrib['vars'] : '';
+    $name = $attrib['name'] ? $attrib['name'] : '';
 
-    $command_name = !empty($attrib['command']) ? $attrib['command'] : NULL;
-    $alias = $attrib['name'] ? $attrib['name'] : ($command_name && $command_label_map[$command_name] ? $command_label_map[$command_name] : '');
-    
     // check for text with domain
-    if ($domain && ($text_item = $this->texts[$domain.'.'.$alias]))
+    if ($domain && ($text_item = $this->texts[$domain.'.'.$name]))
       ;
     // text does not exist
-    else if (!($text_item = $this->texts[$alias])) {
-      /*
-      raise_error(array(
-        'code' => 500,
-        'type' => 'php',
-        'line' => __LINE__,
-        'file' => __FILE__,
-        'message' => "Missing localized text for '$alias' in '$sess_user_lang'"), TRUE, FALSE);
-      */
-      return "[$alias]";
+    else if (!($text_item = $this->texts[$name])) {
+      return "[$name]";
     }
 
-    // make text item array 
+    // make text item array
     $a_text_item = is_array($text_item) ? $text_item : array('single' => $text_item);
 
     // decide which text to use
@@ -684,19 +901,16 @@ class rcmail
     // replace vars in text
     if (is_array($attrib['vars'])) {
       foreach ($attrib['vars'] as $var_key => $var_value)
-        $a_replace_vars[$var_key{0}=='$' ? substr($var_key, 1) : $var_key] = $var_value;
+        $text = str_replace($var_key[0]!='$' ? '$'.$var_key : $var_key, $var_value, $text);
     }
 
-    if ($a_replace_vars)
-      $text = preg_replace('/\$\{?([_a-z]{1}[_a-z0-9]*)\}?/ei', '$a_replace_vars["\1"]', $text);
-
     // format output
     if (($attrib['uppercase'] && strtolower($attrib['uppercase']=='first')) || $attrib['ucfirst'])
       return ucfirst($text);
     else if ($attrib['uppercase'])
-      return strtoupper($text);
+      return mb_strtoupper($text);
     else if ($attrib['lowercase'])
-      return strtolower($text);
+      return mb_strtolower($text);
 
     return $text;
   }
@@ -710,11 +924,14 @@ class rcmail
   public function load_language($lang = null, $add = array())
   {
     $lang = $this->language_prop(($lang ? $lang : $_SESSION['language']));
-    
+
     // load localized texts
     if (empty($this->texts) || $lang != $_SESSION['language']) {
       $this->texts = array();
 
+      // handle empty lines after closing PHP tag in localization files
+      ob_start();
+
       // get english labels (these should be complete)
       @include(INSTALL_PATH . 'program/localization/en_US/labels.inc');
       @include(INSTALL_PATH . 'program/localization/en_US/messages.inc');
@@ -734,7 +951,9 @@ class rcmail
         if (is_array($messages))
           $this->texts = array_merge($this->texts, $messages);
       }
-      
+
+      ob_end_clean();
+
       $_SESSION['language'] = $lang;
     }
 
@@ -758,7 +977,7 @@ class rcmail
 
       if ($dh = @opendir(INSTALL_PATH . 'program/localization')) {
         while (($name = readdir($dh)) !== false) {
-          if ($name{0}=='.' || !is_dir(INSTALL_PATH . 'program/localization/' . $name))
+          if ($name[0] == '.' || !is_dir(INSTALL_PATH . 'program/localization/' . $name))
             continue;
 
           if ($label = $rcube_languages[$name])
@@ -779,8 +998,6 @@ class rcmail
    */
   function authenticate_session()
   {
-    global $SESS_CLIENT_IP, $SESS_CHANGED;
-
     // advanced session authentication
     if ($this->config->get('double_auth')) {
       $now = time();
@@ -795,12 +1012,13 @@ class rcmail
       }
     }
     else {
-      $valid = $this->config->get('ip_check') ? $_SERVER['REMOTE_ADDR'] == $SESS_CLIENT_IP : true;
+      $valid = $this->config->get('ip_check') ? $_SERVER['REMOTE_ADDR'] == $this->session->get_ip() : true;
     }
 
     // check session filetime
     $lifetime = $this->config->get('session_lifetime');
-    if (!empty($lifetime) && isset($SESS_CHANGED) && $SESS_CHANGED + $lifetime*60 < time()) {
+    $sess_ts = $this->session->get_ts();
+    if (!empty($lifetime) && !empty($sess_ts) && $sess_ts + $lifetime*60 < time()) {
       $valid = false;
     }
 
@@ -813,9 +1031,9 @@ class rcmail
    */
   public function kill_session()
   {
-    $this->plugins->exec_hook('kill_session');
-    
-    rcube_sess_unset();
+    $this->plugins->exec_hook('session_destroy');
+
+    $this->session->remove();
     $_SESSION = array('language' => $this->user->language, 'auth_time' => time(), 'temp' => true);
     rcmail::setcookie('sessauth', '-del-', time() - 60);
     $this->user->reset();
@@ -828,13 +1046,13 @@ class rcmail
   public function logout_actions()
   {
     $config = $this->config->all();
-    
-    // on logout action we're not connected to imap server  
+
+    // on logout action we're not connected to imap server
     if (($config['logout_purge'] && !empty($config['trash_mbox'])) || $config['logout_expunge']) {
       if (!$this->authenticate_session())
         return;
 
-      $this->imap_init(true);
+      $this->imap_connect();
     }
 
     if ($config['logout_purge'] && !empty($config['trash_mbox'])) {
@@ -853,23 +1071,36 @@ class rcmail
    */
   public function shutdown()
   {
-    if (is_object($this->imap)) {
+    if (is_object($this->imap))
       $this->imap->close();
-      $this->imap->write_cache();
-    }
 
     if (is_object($this->smtp))
       $this->smtp->disconnect();
 
-    if (is_object($this->contacts))
-      $this->contacts->close();
+    foreach ($this->books as $book)
+      if (is_object($book))
+        $book->close();
 
     // before closing the database connection, write session data
     if ($_SERVER['REMOTE_ADDR'])
       session_write_close();
+
+    // write performance stats to logs/console
+    if ($this->config->get('devel_mode')) {
+      if (function_exists('memory_get_usage'))
+        $mem = show_bytes(memory_get_usage());
+      if (function_exists('memory_get_peak_usage'))
+        $mem .= '/'.show_bytes(memory_get_peak_usage());
+
+      $log = $this->task . ($this->action ? '/'.$this->action : '') . ($mem ? " [$mem]" : '');
+      if (defined('RCMAIL_START'))
+        rcube_print_time(RCMAIL_START, $log);
+      else
+        console($log);
+    }
   }
-  
-  
+
+
   /**
    * Generate a unique token to be used in a form request
    *
@@ -878,14 +1109,14 @@ class rcmail
   public function get_request_token()
   {
     $key = $this->task;
-    
+
     if (!$_SESSION['request_tokens'][$key])
       $_SESSION['request_tokens'][$key] = md5(uniqid($key . mt_rand(), true));
-    
+
     return $_SESSION['request_tokens'][$key];
   }
-  
-  
+
+
   /**
    * Check if the current request contains a valid token
    *
@@ -897,8 +1128,8 @@ class rcmail
     $token = get_input_value('_token', $mode);
     return !empty($token) && $_SESSION['request_tokens'][$this->task] == $token;
   }
-  
-  
+
+
   /**
    * Create unique authorization hash
    *
@@ -940,34 +1171,33 @@ class rcmail
      * upon decryption; see http://php.net/mcrypt_generic#68082
      */
     $clear = pack("a*H2", $clear, "80");
-  
+
     if (function_exists('mcrypt_module_open') &&
         ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_CBC, "")))
     {
-      $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
+      $iv = $this->create_iv(mcrypt_enc_get_iv_size($td));
       mcrypt_generic_init($td, $this->config->get_crypto_key($key), $iv);
       $cipher = $iv . mcrypt_generic($td, $clear);
       mcrypt_generic_deinit($td);
       mcrypt_module_close($td);
     }
-    else if (function_exists('des'))
-    {
-      define('DES_IV_SIZE', 8);
-      $iv = '';
-      for ($i = 0; $i < constant('DES_IV_SIZE'); $i++)
-        $iv .= sprintf("%c", mt_rand(0, 255));
-      $cipher = $iv . des($this->config->get_crypto_key($key), $clear, 1, 1, $iv);
-    }
-    else
-    {
-      raise_error(array(
-        'code' => 500,
-        'type' => 'php',
-        'file' => __FILE__,
-        'message' => "Could not perform encryption; make sure Mcrypt is installed or lib/des.inc is available"
-      ), true, true);
+    else {
+      //@include_once('lib/des.inc'); (not shipped with this distribution)
+
+      if (function_exists('des')) {
+        $des_iv_size = 8;
+        $iv = $this->create_iv($des_iv_size);
+        $cipher = $iv . des($this->config->get_crypto_key($key), $clear, 1, 1, $iv);
+      }
+      else {
+        raise_error(array(
+          'code' => 500, 'type' => 'php',
+          'file' => __FILE__, 'line' => __LINE__,
+          'message' => "Could not perform encryption; make sure Mcrypt is installed or lib/des.inc is available"
+        ), true, true);
+      }
     }
-  
+
     return $base64 ? base64_encode($cipher) : $cipher;
   }
 
@@ -984,47 +1214,70 @@ class rcmail
   {
     if (!$cipher)
       return '';
-  
+
     $cipher = $base64 ? base64_decode($cipher) : $cipher;
 
     if (function_exists('mcrypt_module_open') &&
         ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_CBC, "")))
     {
-      $iv = substr($cipher, 0, mcrypt_enc_get_iv_size($td));
-      $cipher = substr($cipher, mcrypt_enc_get_iv_size($td));
+      $iv_size = mcrypt_enc_get_iv_size($td);
+      $iv = substr($cipher, 0, $iv_size);
+
+      // session corruption? (#1485970)
+      if (strlen($iv) < $iv_size)
+        return '';
+
+      $cipher = substr($cipher, $iv_size);
       mcrypt_generic_init($td, $this->config->get_crypto_key($key), $iv);
       $clear = mdecrypt_generic($td, $cipher);
       mcrypt_generic_deinit($td);
       mcrypt_module_close($td);
     }
-    else if (function_exists('des'))
-    {
-      define('DES_IV_SIZE', 8);
-      $iv = substr($cipher, 0, constant('DES_IV_SIZE'));
-      $cipher = substr($cipher, constant('DES_IV_SIZE'));
-      $clear = des($this->config->get_crypto_key($key), $cipher, 0, 1, $iv);
-    }
-    else
-    {
-      raise_error(array(
-        'code' => 500,
-        'type' => 'php',
-        'file' => __FILE__,
-        'message' => "Could not perform decryption; make sure Mcrypt is installed or lib/des.inc is available"
-      ), true, true);
+    else {
+      // @include_once('lib/des.inc'); (not shipped with this distribution)
+
+      if (function_exists('des')) {
+        $des_iv_size = 8;
+        $iv = substr($cipher, 0, $des_iv_size);
+        $cipher = substr($cipher, $des_iv_size);
+        $clear = des($this->config->get_crypto_key($key), $cipher, 0, 1, $iv);
+      }
+      else {
+        raise_error(array(
+          'code' => 500, 'type' => 'php',
+          'file' => __FILE__, 'line' => __LINE__,
+          'message' => "Could not perform decryption; make sure Mcrypt is installed or lib/des.inc is available"
+        ), true, true);
+      }
     }
-  
+
     /*-
      * Trim PHP's padding and the canary byte; see note in
      * rcmail::encrypt() and http://php.net/mcrypt_generic#68082
      */
     $clear = substr(rtrim($clear, "\0"), 0, -1);
-  
+
     return $clear;
   }
 
   /**
-   * Build a valid URL to this instance of RoundCube
+   * Generates encryption initialization vector (IV)
+   *
+   * @param int Vector size
+   * @return string Vector string
+   */
+  private function create_iv($size)
+  {
+    // mcrypt_create_iv() can be slow when system lacks entrophy
+    // we'll generate IV vector manually
+    $iv = '';
+    for ($i = 0; $i < $size; $i++)
+        $iv .= chr(mt_rand(0, 255));
+    return $iv;
+  }
+
+  /**
+   * Build a valid URL to this instance of Roundcube
    *
    * @param mixed Either a string with the action or url parameters as key-value pairs
    * @return string Valid application URL
@@ -1033,7 +1286,7 @@ class rcmail
   {
     if (!is_array($p))
       $p = array('_action' => @func_get_arg(0));
-    
+
     $task = $p['_task'] ? $p['_task'] : ($p['task'] ? $p['task'] : $this->task);
     $p['_task'] = $task;
     unset($p['task']);
@@ -1061,9 +1314,13 @@ class rcmail
    */
   public static function setcookie($name, $value, $exp = 0)
   {
+    if (headers_sent())
+      return;
+
     $cookie = session_get_cookie_params();
+
     setcookie($name, $value, $exp, $cookie['path'], $cookie['domain'],
-      ($_SERVER['HTTPS'] && ($_SERVER['HTTPS'] != 'off')));
+      rcube_https_check(), true);
   }
 }
 
diff --git a/program/include/rcmail.php.orig b/program/include/rcmail.php.orig
new file mode 100644 (file)
index 0000000..11da562
--- /dev/null
@@ -0,0 +1,1327 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcmail.php                                            |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2008-2010, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Application class providing core functions and holding              |
+ |   instances of all 'global' objects like db- and imap-connections     |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: rcmail.php 4396 2011-01-06 12:41:16Z thomasb $
+
+*/
+
+
+/**
+ * Application class of Roundcube Webmail
+ * implemented as singleton
+ *
+ * @package Core
+ */
+class rcmail
+{
+  /**
+   * Main tasks.
+   *
+   * @var array
+   */
+  static public $main_tasks = array('mail','settings','addressbook','login','logout','utils','dummy');
+
+  /**
+   * Singleton instace of rcmail
+   *
+   * @var rcmail
+   */
+  static private $instance;
+
+  /**
+   * Stores instance of rcube_config.
+   *
+   * @var rcube_config
+   */
+  public $config;
+
+  /**
+   * Stores rcube_user instance.
+   *
+   * @var rcube_user
+   */
+  public $user;
+
+  /**
+   * Instace of database class.
+   *
+   * @var rcube_mdb2
+   */
+  public $db;
+
+  /**
+   * Instace of rcube_session class.
+   *
+   * @var rcube_session
+   */
+  public $session;
+
+  /**
+   * Instance of rcube_smtp class.
+   *
+   * @var rcube_smtp
+   */
+  public $smtp;
+
+  /**
+   * Instance of rcube_imap class.
+   *
+   * @var rcube_imap
+   */
+  public $imap;
+
+  /**
+   * Instance of rcube_template class.
+   *
+   * @var rcube_template
+   */
+  public $output;
+
+  /**
+   * Instance of rcube_plugin_api.
+   *
+   * @var rcube_plugin_api
+   */
+  public $plugins;
+
+  /**
+   * Current task.
+   *
+   * @var string
+   */
+  public $task;
+
+  /**
+   * Current action.
+   *
+   * @var string
+   */
+  public $action = '';
+  public $comm_path = './';
+
+  private $texts;
+  private $books = array();
+
+
+  /**
+   * This implements the 'singleton' design pattern
+   *
+   * @return rcmail The one and only instance
+   */
+  static function get_instance()
+  {
+    if (!self::$instance) {
+      self::$instance = new rcmail();
+      self::$instance->startup();  // init AFTER object was linked with self::$instance
+    }
+
+    return self::$instance;
+  }
+
+
+  /**
+   * Private constructor
+   */
+  private function __construct()
+  {
+    // load configuration
+    $this->config = new rcube_config();
+
+    register_shutdown_function(array($this, 'shutdown'));
+  }
+
+
+  /**
+   * Initial startup function
+   * to register session, create database and imap connections
+   *
+   * @todo Remove global vars $DB, $USER
+   */
+  private function startup()
+  {
+    // initialize syslog
+    if ($this->config->get('log_driver') == 'syslog') {
+      $syslog_id = $this->config->get('syslog_id', 'roundcube');
+      $syslog_facility = $this->config->get('syslog_facility', LOG_USER);
+      openlog($syslog_id, LOG_ODELAY, $syslog_facility);
+    }
+
+    // connect to database
+    $GLOBALS['DB'] = $this->get_dbh();
+
+    // start session
+    $this->session_init();
+
+    // create user object
+    $this->set_user(new rcube_user($_SESSION['user_id']));
+
+    // configure session (after user config merge!)
+    $this->session_configure();
+
+    // set task and action properties
+    $this->set_task(get_input_value('_task', RCUBE_INPUT_GPC));
+    $this->action = asciiwords(get_input_value('_action', RCUBE_INPUT_GPC));
+
+    // reset some session parameters when changing task
+    if ($this->task != 'utils') {
+      if ($this->session && $_SESSION['task'] != $this->task)
+        $this->session->remove('page');
+      // set current task to session
+      $_SESSION['task'] = $this->task;
+    }
+
+    // init output class
+    if (!empty($_REQUEST['_remote']))
+      $GLOBALS['OUTPUT'] = $this->json_init();
+    else
+      $GLOBALS['OUTPUT'] = $this->load_gui(!empty($_REQUEST['_framed']));
+
+    // create plugin API and load plugins
+    $this->plugins = rcube_plugin_api::get_instance();
+
+    // init plugins
+    $this->plugins->init();
+  }
+
+
+  /**
+   * Setter for application task
+   *
+   * @param string Task to set
+   */
+  public function set_task($task)
+  {
+    $task = asciiwords($task);
+
+    if ($this->user && $this->user->ID)
+      $task = !$task ? 'mail' : $task;
+    else
+      $task = 'login';
+
+    $this->task = $task;
+    $this->comm_path = $this->url(array('task' => $this->task));
+
+    if ($this->output)
+      $this->output->set_env('task', $this->task);
+  }
+
+
+  /**
+   * Setter for system user object
+   *
+   * @param rcube_user Current user instance
+   */
+  public function set_user($user)
+  {
+    if (is_object($user)) {
+      $this->user = $user;
+      $GLOBALS['USER'] = $this->user;
+
+      // overwrite config with user preferences
+      $this->config->set_user_prefs((array)$this->user->get_prefs());
+    }
+
+    $_SESSION['language'] = $this->user->language = $this->language_prop($this->config->get('language', $_SESSION['language']));
+
+    // set localization
+    setlocale(LC_ALL, $_SESSION['language'] . '.utf8', 'en_US.utf8');
+
+    // workaround for http://bugs.php.net/bug.php?id=18556
+    if (in_array($_SESSION['language'], array('tr_TR', 'ku', 'az_AZ')))
+      setlocale(LC_CTYPE, 'en_US' . '.utf8');
+  }
+
+
+  /**
+   * Check the given string and return a valid language code
+   *
+   * @param string Language code
+   * @return string Valid language code
+   */
+  private function language_prop($lang)
+  {
+    static $rcube_languages, $rcube_language_aliases;
+
+    // user HTTP_ACCEPT_LANGUAGE if no language is specified
+    if (empty($lang) || $lang == 'auto') {
+       $accept_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+       $lang = str_replace('-', '_', $accept_langs[0]);
+     }
+
+    if (empty($rcube_languages)) {
+      @include(INSTALL_PATH . 'program/localization/index.inc');
+    }
+
+    // check if we have an alias for that language
+    if (!isset($rcube_languages[$lang]) && isset($rcube_language_aliases[$lang])) {
+      $lang = $rcube_language_aliases[$lang];
+    }
+    // try the first two chars
+    else if (!isset($rcube_languages[$lang])) {
+      $short = substr($lang, 0, 2);
+
+      // check if we have an alias for the short language code
+      if (!isset($rcube_languages[$short]) && isset($rcube_language_aliases[$short])) {
+        $lang = $rcube_language_aliases[$short];
+      }
+      // expand 'nn' to 'nn_NN'
+      else if (!isset($rcube_languages[$short])) {
+        $lang = $short.'_'.strtoupper($short);
+      }
+    }
+
+    if (!isset($rcube_languages[$lang]) || !is_dir(INSTALL_PATH . 'program/localization/' . $lang)) {
+      $lang = 'en_US';
+    }
+
+    return $lang;
+  }
+
+
+  /**
+   * Get the current database connection
+   *
+   * @return rcube_mdb2  Database connection object
+   */
+  public function get_dbh()
+  {
+    if (!$this->db) {
+      $config_all = $this->config->all();
+
+      $this->db = new rcube_mdb2($config_all['db_dsnw'], $config_all['db_dsnr'], $config_all['db_persistent']);
+      $this->db->sqlite_initials = INSTALL_PATH . 'SQL/sqlite.initial.sql';
+      $this->db->set_debug((bool)$config_all['sql_debug']);
+    }
+
+    return $this->db;
+  }
+
+
+  /**
+   * Return instance of the internal address book class
+   *
+   * @param string  Address book identifier
+   * @param boolean True if the address book needs to be writeable
+   * @return rcube_contacts Address book object
+   */
+  public function get_address_book($id, $writeable = false)
+  {
+    $contacts = null;
+    $ldap_config = (array)$this->config->get('ldap_public');
+    $abook_type = strtolower($this->config->get('address_book_type'));
+
+    $plugin = $this->plugins->exec_hook('addressbook_get', array('id' => $id, 'writeable' => $writeable));
+
+    // plugin returned instance of a rcube_addressbook
+    if ($plugin['instance'] instanceof rcube_addressbook) {
+      $contacts = $plugin['instance'];
+    }
+    else if ($id && $ldap_config[$id]) {
+      $contacts = new rcube_ldap($ldap_config[$id], $this->config->get('ldap_debug'), $this->config->mail_domain($_SESSION['imap_host']));
+    }
+    else if ($id === '0') {
+      $contacts = new rcube_contacts($this->db, $this->user->ID);
+    }
+    else if ($abook_type == 'ldap') {
+      // Use the first writable LDAP address book.
+      foreach ($ldap_config as $id => $prop) {
+        if (!$writeable || $prop['writable']) {
+          $contacts = new rcube_ldap($prop, $this->config->get('ldap_debug'), $this->config->mail_domain($_SESSION['imap_host']));
+          break;
+        }
+      }
+    }
+    else { // $id == 'sql'
+      $contacts = new rcube_contacts($this->db, $this->user->ID);
+    }
+
+    // add to the 'books' array for shutdown function
+    if (!in_array($contacts, $this->books))
+      $this->books[] = $contacts;
+
+    return $contacts;
+  }
+
+
+  /**
+   * Return address books list
+   *
+   * @param boolean True if the address book needs to be writeable
+   * @return array  Address books array
+   */
+  public function get_address_sources($writeable = false)
+  {
+    $abook_type = strtolower($this->config->get('address_book_type'));
+    $ldap_config = $this->config->get('ldap_public');
+    $autocomplete = (array) $this->config->get('autocomplete_addressbooks');
+    $list = array();
+
+    // We are using the DB address book
+    if ($abook_type != 'ldap') {
+      $contacts = new rcube_contacts($this->db, null);
+      $list['0'] = array(
+        'id' => 0,
+        'name' => rcube_label('personaladrbook'),
+        'groups' => $contacts->groups,
+        'readonly' => false,
+        'autocomplete' => in_array('sql', $autocomplete)
+      );
+    }
+
+    if ($ldap_config) {
+      $ldap_config = (array) $ldap_config;
+      foreach ($ldap_config as $id => $prop)
+        $list[$id] = array(
+          'id' => $id,
+          'name' => $prop['name'],
+          'groups' => false,
+          'readonly' => !$prop['writable'],
+          'autocomplete' => in_array('sql', $autocomplete)
+        );
+    }
+
+    $plugin = $this->plugins->exec_hook('addressbooks_list', array('sources' => $list));
+    $list = $plugin['sources'];
+
+    if ($writeable && !empty($list)) {
+      foreach ($list as $idx => $item) {
+        if ($item['readonly']) {
+          unset($list[$idx]);
+        }
+      }
+    }
+
+    return $list;
+  }
+
+
+  /**
+   * Init output object for GUI and add common scripts.
+   * This will instantiate a rcmail_template object and set
+   * environment vars according to the current session and configuration
+   *
+   * @param boolean True if this request is loaded in a (i)frame
+   * @return rcube_template Reference to HTML output object
+   */
+  public function load_gui($framed = false)
+  {
+    // init output page
+    if (!($this->output instanceof rcube_template))
+      $this->output = new rcube_template($this->task, $framed);
+
+    // set keep-alive/check-recent interval
+    if ($this->session && ($keep_alive = $this->session->get_keep_alive())) {
+      $this->output->set_env('keep_alive', $keep_alive);
+    }
+
+    if ($framed) {
+      $this->comm_path .= '&_framed=1';
+      $this->output->set_env('framed', true);
+    }
+
+    $this->output->set_env('task', $this->task);
+    $this->output->set_env('action', $this->action);
+    $this->output->set_env('comm_path', $this->comm_path);
+    $this->output->set_charset(RCMAIL_CHARSET);
+
+    // add some basic label to client
+    $this->output->add_label('loading', 'servererror');
+
+    return $this->output;
+  }
+
+
+  /**
+   * Create an output object for JSON responses
+   *
+   * @return rcube_json_output Reference to JSON output object
+   */
+  public function json_init()
+  {
+    if (!($this->output instanceof rcube_json_output))
+      $this->output = new rcube_json_output($this->task);
+
+    return $this->output;
+  }
+
+
+  /**
+   * Create SMTP object and connect to server
+   *
+   * @param boolean True if connection should be established
+   */
+  public function smtp_init($connect = false)
+  {
+    $this->smtp = new rcube_smtp();
+
+    if ($connect)
+      $this->smtp->connect();
+  }
+
+
+  /**
+   * Create global IMAP object and connect to server
+   *
+   * @param boolean True if connection should be established
+   * @todo Remove global $IMAP
+   */
+  public function imap_init($connect = false)
+  {
+    // already initialized
+    if (is_object($this->imap))
+      return;
+
+    $this->imap = new rcube_imap($this->db);
+    $this->imap->debug_level = $this->config->get('debug_level');
+    $this->imap->skip_deleted = $this->config->get('skip_deleted');
+
+    // enable caching of imap data
+    if ($this->config->get('enable_caching')) {
+      $this->imap->set_caching(true);
+    }
+
+    // set pagesize from config
+    $this->imap->set_pagesize($this->config->get('pagesize', 50));
+
+    // Setting root and delimiter before establishing the connection
+    // can save time detecting them using NAMESPACE and LIST
+    $options = array(
+      'auth_method' => $this->config->get('imap_auth_type', 'check'),
+      'auth_cid'    => $this->config->get('imap_auth_cid'),
+      'auth_pw'     => $this->config->get('imap_auth_pw'),
+      'debug'       => (bool) $this->config->get('imap_debug', 0),
+      'force_caps'  => (bool) $this->config->get('imap_force_caps'),
+      'timeout'     => (int) $this->config->get('imap_timeout', 0),
+    );
+
+    $this->imap->set_options($options);
+
+    // set global object for backward compatibility
+    $GLOBALS['IMAP'] = $this->imap;
+
+    $hook = $this->plugins->exec_hook('imap_init', array('fetch_headers' => $this->imap->fetch_add_headers));
+    if ($hook['fetch_headers'])
+      $this->imap->fetch_add_headers = $hook['fetch_headers'];
+
+    // support this parameter for backward compatibility but log warning
+    if ($connect) {
+      $this->imap_connect();
+      raise_error(array(
+        'code' => 800, 'type' => 'imap',
+        'file' => __FILE__, 'line' => __LINE__,
+        'message' => "rcube::imap_init(true) is deprecated, use rcube::imap_connect() instead"),
+        true, false);
+    }
+  }
+
+
+  /**
+   * Connect to IMAP server with stored session data
+   *
+   * @return bool True on success, false on error
+   */
+  public function imap_connect()
+  {
+    if (!$this->imap)
+      $this->imap_init();
+
+    if ($_SESSION['imap_host'] && !$this->imap->conn->connected()) {
+      if (!$this->imap->connect($_SESSION['imap_host'], $_SESSION['username'], $this->decrypt($_SESSION['password']), $_SESSION['imap_port'], $_SESSION['imap_ssl'])) {
+        if ($this->output)
+          $this->output->show_message($this->imap->get_error_code() == -1 ? 'imaperror' : 'sessionerror', 'error');
+      }
+      else {
+        $this->set_imap_prop();
+        return $this->imap->conn;
+      }
+    }
+
+    return false;
+  }
+
+
+  /**
+   * Create session object and start the session.
+   */
+  public function session_init()
+  {
+    // session started (Installer?)
+    if (session_id())
+      return;
+
+    $lifetime = $this->config->get('session_lifetime', 0) * 60;
+
+    // set session domain
+    if ($domain = $this->config->get('session_domain')) {
+      ini_set('session.cookie_domain', $domain);
+    }
+    // set session garbage collecting time according to session_lifetime
+    if ($lifetime) {
+      ini_set('session.gc_maxlifetime', $lifetime * 2);
+    }
+
+    ini_set('session.cookie_secure', rcube_https_check());
+    ini_set('session.name', 'roundcube_sessid');
+    ini_set('session.use_cookies', 1);
+    ini_set('session.use_only_cookies', 1);
+    ini_set('session.serialize_handler', 'php');
+
+    // use database for storing session data
+    $this->session = new rcube_session($this->get_dbh(), $lifetime);
+
+    $this->session->register_gc_handler('rcmail_temp_gc');
+    if ($this->config->get('enable_caching'))
+      $this->session->register_gc_handler('rcmail_cache_gc');
+
+    // start PHP session (if not in CLI mode)
+    if ($_SERVER['REMOTE_ADDR'])
+      session_start();
+
+    // set initial session vars
+    if (!isset($_SESSION['auth_time'])) {
+      $_SESSION['auth_time'] = time();
+      $_SESSION['temp'] = true;
+    }
+  }
+
+
+  /**
+   * Configure session object internals
+   */
+  public function session_configure()
+  {
+    if (!$this->session)
+      return;
+
+    $lifetime = $this->config->get('session_lifetime', 0) * 60;
+
+    // set keep-alive/check-recent interval
+    if ($keep_alive = $this->config->get('keep_alive')) {
+      // be sure that it's less than session lifetime
+      if ($lifetime)
+        $keep_alive = min($keep_alive, $lifetime - 30);
+      $keep_alive = max(60, $keep_alive);
+      $this->session->set_keep_alive($keep_alive);
+    }
+  }
+
+
+  /**
+   * Perfom login to the IMAP server and to the webmail service.
+   * This will also create a new user entry if auto_create_user is configured.
+   *
+   * @param string IMAP user name
+   * @param string IMAP password
+   * @param string IMAP host
+   * @return boolean True on success, False on failure
+   */
+  function login($username, $pass, $host=NULL)
+  {
+    $user = NULL;
+    $config = $this->config->all();
+
+    if (!$host)
+      $host = $config['default_host'];
+
+    // Validate that selected host is in the list of configured hosts
+    if (is_array($config['default_host'])) {
+      $allowed = false;
+      foreach ($config['default_host'] as $key => $host_allowed) {
+        if (!is_numeric($key))
+          $host_allowed = $key;
+        if ($host == $host_allowed) {
+          $allowed = true;
+          break;
+        }
+      }
+      if (!$allowed)
+        return false;
+      }
+    else if (!empty($config['default_host']) && $host != rcube_parse_host($config['default_host']))
+      return false;
+
+    // parse $host URL
+    $a_host = parse_url($host);
+    if ($a_host['host']) {
+      $host = $a_host['host'];
+      $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? $a_host['scheme'] : null;
+      if (!empty($a_host['port']))
+        $imap_port = $a_host['port'];
+      else if ($imap_ssl && $imap_ssl != 'tls' && (!$config['default_port'] || $config['default_port'] == 143))
+        $imap_port = 993;
+    }
+
+    $imap_port = $imap_port ? $imap_port : $config['default_port'];
+
+    /* Modify username with domain if required
+       Inspired by Marco <P0L0_notspam_binware.org>
+    */
+    // Check if we need to add domain
+    if (!empty($config['username_domain']) && strpos($username, '@') === false) {
+      if (is_array($config['username_domain']) && isset($config['username_domain'][$host]))
+        $username .= '@'.rcube_parse_host($config['username_domain'][$host]);
+      else if (is_string($config['username_domain']))
+        $username .= '@'.rcube_parse_host($config['username_domain']);
+    }
+
+    // Convert username to lowercase. If IMAP backend
+    // is case-insensitive we need to store always the same username (#1487113)
+    if ($config['login_lc']) {
+      $username = mb_strtolower($username);
+    }
+
+    // try to resolve email address from virtuser table
+    if (strpos($username, '@') && ($virtuser = rcube_user::email2user($username))) {
+      $username = $virtuser;
+    }
+
+    // Here we need IDNA ASCII
+    // Only rcube_contacts class is using domain names in Unicode
+    $host = idn_to_ascii($host);
+    if (strpos($username, '@')) {
+      // lowercase domain name
+      list($local, $domain) = explode('@', $username);
+      $username = $local . '@' . mb_strtolower($domain);
+      $username = idn_to_ascii($username);
+    }
+
+    // user already registered -> overwrite username
+    if ($user = rcube_user::query($username, $host))
+      $username = $user->data['username'];
+
+    if (!$this->imap)
+      $this->imap_init();
+
+    // try IMAP login
+    if (!($imap_login = $this->imap->connect($host, $username, $pass, $imap_port, $imap_ssl))) {
+      // try with lowercase
+      $username_lc = mb_strtolower($username);
+      if ($username_lc != $username) {
+        // try to find user record again -> overwrite username
+        if (!$user && ($user = rcube_user::query($username_lc, $host)))
+          $username_lc = $user->data['username'];
+
+        if ($imap_login = $this->imap->connect($host, $username_lc, $pass, $imap_port, $imap_ssl))
+          $username = $username_lc;
+      }
+    }
+
+    // exit if IMAP login failed
+    if (!$imap_login)
+      return false;
+
+    $this->set_imap_prop();
+
+    // user already registered -> update user's record
+    if (is_object($user)) {
+      // create default folders on first login
+      if (!$user->data['last_login'] && $config['create_default_folders'])
+        $this->imap->create_default_folders();
+      $user->touch();
+    }
+    // create new system user
+    else if ($config['auto_create_user']) {
+      if ($created = rcube_user::create($username, $host)) {
+        $user = $created;
+        // create default folders on first login
+        if ($config['create_default_folders'])
+          $this->imap->create_default_folders();
+      }
+      else {
+        raise_error(array(
+          'code' => 600, 'type' => 'php',
+          'file' => __FILE__, 'line' => __LINE__,
+          'message' => "Failed to create a user record. Maybe aborted by a plugin?"
+          ), true, false);
+      }
+    }
+    else {
+      raise_error(array(
+        'code' => 600, 'type' => 'php',
+        'file' => __FILE__, 'line' => __LINE__,
+        'message' => "Acces denied for new user $username. 'auto_create_user' is disabled"
+        ), true, false);
+    }
+
+    // login succeeded
+    if (is_object($user) && $user->ID) {
+      $this->set_user($user);
+
+      // set session vars
+      $_SESSION['user_id']   = $user->ID;
+      $_SESSION['username']  = $user->data['username'];
+      $_SESSION['imap_host'] = $host;
+      $_SESSION['imap_port'] = $imap_port;
+      $_SESSION['imap_ssl']  = $imap_ssl;
+      $_SESSION['password']  = $this->encrypt($pass);
+      $_SESSION['login_time'] = mktime();
+
+      if (isset($_REQUEST['_timezone']) && $_REQUEST['_timezone'] != '_default_')
+        $_SESSION['timezone'] = floatval($_REQUEST['_timezone']);
+
+      // force reloading complete list of subscribed mailboxes
+      $this->imap->clear_cache('mailboxes');
+
+      return true;
+    }
+
+    return false;
+  }
+
+
+  /**
+   * Set root dir and last stored mailbox
+   * This must be done AFTER connecting to the server!
+   */
+  public function set_imap_prop()
+  {
+    $this->imap->set_charset($this->config->get('default_charset', RCMAIL_CHARSET));
+
+    if ($default_folders = $this->config->get('default_imap_folders')) {
+      $this->imap->set_default_mailboxes($default_folders);
+    }
+    if (isset($_SESSION['mbox'])) {
+      $this->imap->set_mailbox($_SESSION['mbox']);
+    }
+    if (isset($_SESSION['page'])) {
+      $this->imap->set_page($_SESSION['page']);
+    }
+  }
+
+
+  /**
+   * Auto-select IMAP host based on the posted login information
+   *
+   * @return string Selected IMAP host
+   */
+  public function autoselect_host()
+  {
+    $default_host = $this->config->get('default_host');
+    $host = null;
+
+    if (is_array($default_host)) {
+      $post_host = get_input_value('_host', RCUBE_INPUT_POST);
+
+      // direct match in default_host array
+      if ($default_host[$post_host] || in_array($post_host, array_values($default_host))) {
+        $host = $post_host;
+      }
+
+      // try to select host by mail domain
+      list($user, $domain) = explode('@', get_input_value('_user', RCUBE_INPUT_POST));
+      if (!empty($domain)) {
+        foreach ($default_host as $imap_host => $mail_domains) {
+          if (is_array($mail_domains) && in_array($domain, $mail_domains)) {
+            $host = $imap_host;
+            break;
+          }
+        }
+      }
+
+      // take the first entry if $host is still an array
+      if (empty($host)) {
+        $host = array_shift($default_host);
+      }
+    }
+    else if (empty($default_host)) {
+      $host = get_input_value('_host', RCUBE_INPUT_POST);
+    }
+    else
+      $host = rcube_parse_host($default_host);
+
+    return $host;
+  }
+
+
+  /**
+   * Get localized text in the desired language
+   *
+   * @param mixed Named parameters array or label name
+   * @return string Localized text
+   */
+  public function gettext($attrib, $domain=null)
+  {
+    // load localization files if not done yet
+    if (empty($this->texts))
+      $this->load_language();
+
+    // extract attributes
+    if (is_string($attrib))
+      $attrib = array('name' => $attrib);
+
+    $nr = is_numeric($attrib['nr']) ? $attrib['nr'] : 1;
+    $name = $attrib['name'] ? $attrib['name'] : '';
+
+    // check for text with domain
+    if ($domain && ($text_item = $this->texts[$domain.'.'.$name]))
+      ;
+    // text does not exist
+    else if (!($text_item = $this->texts[$name])) {
+      return "[$name]";
+    }
+
+    // make text item array
+    $a_text_item = is_array($text_item) ? $text_item : array('single' => $text_item);
+
+    // decide which text to use
+    if ($nr == 1) {
+      $text = $a_text_item['single'];
+    }
+    else if ($nr > 0) {
+      $text = $a_text_item['multiple'];
+    }
+    else if ($nr == 0) {
+      if ($a_text_item['none'])
+        $text = $a_text_item['none'];
+      else if ($a_text_item['single'])
+        $text = $a_text_item['single'];
+      else if ($a_text_item['multiple'])
+        $text = $a_text_item['multiple'];
+    }
+
+    // default text is single
+    if ($text == '') {
+      $text = $a_text_item['single'];
+    }
+
+    // replace vars in text
+    if (is_array($attrib['vars'])) {
+      foreach ($attrib['vars'] as $var_key => $var_value)
+        $text = str_replace($var_key[0]!='$' ? '$'.$var_key : $var_key, $var_value, $text);
+    }
+
+    // format output
+    if (($attrib['uppercase'] && strtolower($attrib['uppercase']=='first')) || $attrib['ucfirst'])
+      return ucfirst($text);
+    else if ($attrib['uppercase'])
+      return mb_strtoupper($text);
+    else if ($attrib['lowercase'])
+      return mb_strtolower($text);
+
+    return $text;
+  }
+
+
+  /**
+   * Load a localization package
+   *
+   * @param string Language ID
+   */
+  public function load_language($lang = null, $add = array())
+  {
+    $lang = $this->language_prop(($lang ? $lang : $_SESSION['language']));
+
+    // load localized texts
+    if (empty($this->texts) || $lang != $_SESSION['language']) {
+      $this->texts = array();
+
+      // handle empty lines after closing PHP tag in localization files
+      ob_start();
+
+      // get english labels (these should be complete)
+      @include(INSTALL_PATH . 'program/localization/en_US/labels.inc');
+      @include(INSTALL_PATH . 'program/localization/en_US/messages.inc');
+
+      if (is_array($labels))
+        $this->texts = $labels;
+      if (is_array($messages))
+        $this->texts = array_merge($this->texts, $messages);
+
+      // include user language files
+      if ($lang != 'en' && is_dir(INSTALL_PATH . 'program/localization/' . $lang)) {
+        include_once(INSTALL_PATH . 'program/localization/' . $lang . '/labels.inc');
+        include_once(INSTALL_PATH . 'program/localization/' . $lang . '/messages.inc');
+
+        if (is_array($labels))
+          $this->texts = array_merge($this->texts, $labels);
+        if (is_array($messages))
+          $this->texts = array_merge($this->texts, $messages);
+      }
+
+      ob_end_clean();
+
+      $_SESSION['language'] = $lang;
+    }
+
+    // append additional texts (from plugin)
+    if (is_array($add) && !empty($add))
+      $this->texts += $add;
+  }
+
+
+  /**
+   * Read directory program/localization and return a list of available languages
+   *
+   * @return array List of available localizations
+   */
+  public function list_languages()
+  {
+    static $sa_languages = array();
+
+    if (!sizeof($sa_languages)) {
+      @include(INSTALL_PATH . 'program/localization/index.inc');
+
+      if ($dh = @opendir(INSTALL_PATH . 'program/localization')) {
+        while (($name = readdir($dh)) !== false) {
+          if ($name[0] == '.' || !is_dir(INSTALL_PATH . 'program/localization/' . $name))
+            continue;
+
+          if ($label = $rcube_languages[$name])
+            $sa_languages[$name] = $label;
+        }
+        closedir($dh);
+      }
+    }
+
+    return $sa_languages;
+  }
+
+
+  /**
+   * Check the auth hash sent by the client against the local session credentials
+   *
+   * @return boolean True if valid, False if not
+   */
+  function authenticate_session()
+  {
+    // advanced session authentication
+    if ($this->config->get('double_auth')) {
+      $now = time();
+      $valid = ($_COOKIE['sessauth'] == $this->get_auth_hash(session_id(), $_SESSION['auth_time']) ||
+                $_COOKIE['sessauth'] == $this->get_auth_hash(session_id(), $_SESSION['last_auth']));
+
+      // renew auth cookie every 5 minutes (only for GET requests)
+      if (!$valid || ($_SERVER['REQUEST_METHOD']!='POST' && $now - $_SESSION['auth_time'] > 300)) {
+        $_SESSION['last_auth'] = $_SESSION['auth_time'];
+        $_SESSION['auth_time'] = $now;
+        rcmail::setcookie('sessauth', $this->get_auth_hash(session_id(), $now), 0);
+      }
+    }
+    else {
+      $valid = $this->config->get('ip_check') ? $_SERVER['REMOTE_ADDR'] == $this->session->get_ip() : true;
+    }
+
+    // check session filetime
+    $lifetime = $this->config->get('session_lifetime');
+    $sess_ts = $this->session->get_ts();
+    if (!empty($lifetime) && !empty($sess_ts) && $sess_ts + $lifetime*60 < time()) {
+      $valid = false;
+    }
+
+    return $valid;
+  }
+
+
+  /**
+   * Destroy session data and remove cookie
+   */
+  public function kill_session()
+  {
+    $this->plugins->exec_hook('session_destroy');
+
+    $this->session->remove();
+    $_SESSION = array('language' => $this->user->language, 'auth_time' => time(), 'temp' => true);
+    rcmail::setcookie('sessauth', '-del-', time() - 60);
+    $this->user->reset();
+  }
+
+
+  /**
+   * Do server side actions on logout
+   */
+  public function logout_actions()
+  {
+    $config = $this->config->all();
+
+    // on logout action we're not connected to imap server
+    if (($config['logout_purge'] && !empty($config['trash_mbox'])) || $config['logout_expunge']) {
+      if (!$this->authenticate_session())
+        return;
+
+      $this->imap_connect();
+    }
+
+    if ($config['logout_purge'] && !empty($config['trash_mbox'])) {
+      $this->imap->clear_mailbox($config['trash_mbox']);
+    }
+
+    if ($config['logout_expunge']) {
+      $this->imap->expunge('INBOX');
+    }
+  }
+
+
+  /**
+   * Function to be executed in script shutdown
+   * Registered with register_shutdown_function()
+   */
+  public function shutdown()
+  {
+    if (is_object($this->imap))
+      $this->imap->close();
+
+    if (is_object($this->smtp))
+      $this->smtp->disconnect();
+
+    foreach ($this->books as $book)
+      if (is_object($book))
+        $book->close();
+
+    // before closing the database connection, write session data
+    if ($_SERVER['REMOTE_ADDR'])
+      session_write_close();
+
+    // write performance stats to logs/console
+    if ($this->config->get('devel_mode')) {
+      if (function_exists('memory_get_usage'))
+        $mem = show_bytes(memory_get_usage());
+      if (function_exists('memory_get_peak_usage'))
+        $mem .= '/'.show_bytes(memory_get_peak_usage());
+
+      $log = $this->task . ($this->action ? '/'.$this->action : '') . ($mem ? " [$mem]" : '');
+      if (defined('RCMAIL_START'))
+        rcube_print_time(RCMAIL_START, $log);
+      else
+        console($log);
+    }
+  }
+
+
+  /**
+   * Generate a unique token to be used in a form request
+   *
+   * @return string The request token
+   */
+  public function get_request_token()
+  {
+    $key = $this->task;
+
+    if (!$_SESSION['request_tokens'][$key])
+      $_SESSION['request_tokens'][$key] = md5(uniqid($key . mt_rand(), true));
+
+    return $_SESSION['request_tokens'][$key];
+  }
+
+
+  /**
+   * Check if the current request contains a valid token
+   *
+   * @param int Request method
+   * @return boolean True if request token is valid false if not
+   */
+  public function check_request($mode = RCUBE_INPUT_POST)
+  {
+    $token = get_input_value('_token', $mode);
+    return !empty($token) && $_SESSION['request_tokens'][$this->task] == $token;
+  }
+
+
+  /**
+   * Create unique authorization hash
+   *
+   * @param string Session ID
+   * @param int Timestamp
+   * @return string The generated auth hash
+   */
+  private function get_auth_hash($sess_id, $ts)
+  {
+    $auth_string = sprintf('rcmail*sess%sR%s*Chk:%s;%s',
+      $sess_id,
+      $ts,
+      $this->config->get('ip_check') ? $_SERVER['REMOTE_ADDR'] : '***.***.***.***',
+      $_SERVER['HTTP_USER_AGENT']);
+
+    if (function_exists('sha1'))
+      return sha1($auth_string);
+    else
+      return md5($auth_string);
+  }
+
+
+  /**
+   * Encrypt using 3DES
+   *
+   * @param string $clear clear text input
+   * @param string $key encryption key to retrieve from the configuration, defaults to 'des_key'
+   * @param boolean $base64 whether or not to base64_encode() the result before returning
+   *
+   * @return string encrypted text
+   */
+  public function encrypt($clear, $key = 'des_key', $base64 = true)
+  {
+    if (!$clear)
+      return '';
+    /*-
+     * Add a single canary byte to the end of the clear text, which
+     * will help find out how much of padding will need to be removed
+     * upon decryption; see http://php.net/mcrypt_generic#68082
+     */
+    $clear = pack("a*H2", $clear, "80");
+
+    if (function_exists('mcrypt_module_open') &&
+        ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_CBC, "")))
+    {
+      $iv = $this->create_iv(mcrypt_enc_get_iv_size($td));
+      mcrypt_generic_init($td, $this->config->get_crypto_key($key), $iv);
+      $cipher = $iv . mcrypt_generic($td, $clear);
+      mcrypt_generic_deinit($td);
+      mcrypt_module_close($td);
+    }
+    else {
+      @include_once('lib/des.inc');
+
+      if (function_exists('des')) {
+        $des_iv_size = 8;
+        $iv = $this->create_iv($des_iv_size);
+        $cipher = $iv . des($this->config->get_crypto_key($key), $clear, 1, 1, $iv);
+      }
+      else {
+        raise_error(array(
+          'code' => 500, 'type' => 'php',
+          'file' => __FILE__, 'line' => __LINE__,
+          'message' => "Could not perform encryption; make sure Mcrypt is installed or lib/des.inc is available"
+        ), true, true);
+      }
+    }
+
+    return $base64 ? base64_encode($cipher) : $cipher;
+  }
+
+  /**
+   * Decrypt 3DES-encrypted string
+   *
+   * @param string $cipher encrypted text
+   * @param string $key encryption key to retrieve from the configuration, defaults to 'des_key'
+   * @param boolean $base64 whether or not input is base64-encoded
+   *
+   * @return string decrypted text
+   */
+  public function decrypt($cipher, $key = 'des_key', $base64 = true)
+  {
+    if (!$cipher)
+      return '';
+
+    $cipher = $base64 ? base64_decode($cipher) : $cipher;
+
+    if (function_exists('mcrypt_module_open') &&
+        ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_CBC, "")))
+    {
+      $iv_size = mcrypt_enc_get_iv_size($td);
+      $iv = substr($cipher, 0, $iv_size);
+
+      // session corruption? (#1485970)
+      if (strlen($iv) < $iv_size)
+        return '';
+
+      $cipher = substr($cipher, $iv_size);
+      mcrypt_generic_init($td, $this->config->get_crypto_key($key), $iv);
+      $clear = mdecrypt_generic($td, $cipher);
+      mcrypt_generic_deinit($td);
+      mcrypt_module_close($td);
+    }
+    else {
+      @include_once('lib/des.inc');
+
+      if (function_exists('des')) {
+        $des_iv_size = 8;
+        $iv = substr($cipher, 0, $des_iv_size);
+        $cipher = substr($cipher, $des_iv_size);
+        $clear = des($this->config->get_crypto_key($key), $cipher, 0, 1, $iv);
+      }
+      else {
+        raise_error(array(
+          'code' => 500, 'type' => 'php',
+          'file' => __FILE__, 'line' => __LINE__,
+          'message' => "Could not perform decryption; make sure Mcrypt is installed or lib/des.inc is available"
+        ), true, true);
+      }
+    }
+
+    /*-
+     * Trim PHP's padding and the canary byte; see note in
+     * rcmail::encrypt() and http://php.net/mcrypt_generic#68082
+     */
+    $clear = substr(rtrim($clear, "\0"), 0, -1);
+
+    return $clear;
+  }
+
+  /**
+   * Generates encryption initialization vector (IV)
+   *
+   * @param int Vector size
+   * @return string Vector string
+   */
+  private function create_iv($size)
+  {
+    // mcrypt_create_iv() can be slow when system lacks entrophy
+    // we'll generate IV vector manually
+    $iv = '';
+    for ($i = 0; $i < $size; $i++)
+        $iv .= chr(mt_rand(0, 255));
+    return $iv;
+  }
+
+  /**
+   * Build a valid URL to this instance of Roundcube
+   *
+   * @param mixed Either a string with the action or url parameters as key-value pairs
+   * @return string Valid application URL
+   */
+  public function url($p)
+  {
+    if (!is_array($p))
+      $p = array('_action' => @func_get_arg(0));
+
+    $task = $p['_task'] ? $p['_task'] : ($p['task'] ? $p['task'] : $this->task);
+    $p['_task'] = $task;
+    unset($p['task']);
+
+    $url = './';
+    $delm = '?';
+    foreach (array_reverse($p) as $key => $val)
+    {
+      if (!empty($val)) {
+        $par = $key[0] == '_' ? $key : '_'.$key;
+        $url .= $delm.urlencode($par).'='.urlencode($val);
+        $delm = '&';
+      }
+    }
+    return $url;
+  }
+
+
+  /**
+   * Helper method to set a cookie with the current path and host settings
+   *
+   * @param string Cookie name
+   * @param string Cookie value
+   * @param string Expiration time
+   */
+  public static function setcookie($name, $value, $exp = 0)
+  {
+    if (headers_sent())
+      return;
+
+    $cookie = session_get_cookie_params();
+
+    setcookie($name, $value, $exp, $cookie['path'], $cookie['domain'],
+      rcube_https_check(), true);
+  }
+}
+
+
index 9e970f21380b7b5c05a8077aa47f2f529b0bc939..982ac25285638e909f91e6c3f54fd5a79da60a79 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_addressbook.php                                 |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2006-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2006-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id:  $
+ $Id: rcube_addressbook.php 4145 2010-10-27 07:23:57Z alec $
 
 */
 
@@ -29,6 +29,7 @@ abstract class rcube_addressbook
 {
     /** public properties */
     var $primary_key;
+    var $groups = false;
     var $readonly = true;
     var $ready = false;
     var $list_page = 1;
@@ -75,14 +76,14 @@ abstract class rcube_addressbook
     /**
      * Count number of available contacts in database
      *
-     * @return object rcube_result_set Result set with values for 'count' and 'first'
+     * @return rcube_result_set Result set with values for 'count' and 'first'
      */
     abstract function count();
 
     /**
      * Return the last result set
      *
-     * @return object rcube_result_set Current result set or NULL if nothing selected yet
+     * @return rcube_result_set Current result set or NULL if nothing selected yet
      */
     abstract function get_result();
 
@@ -91,6 +92,7 @@ abstract class rcube_addressbook
      *
      * @param mixed record identifier(s)
      * @param boolean True to return record as associative array, otherwise a result set is returned
+     *
      * @return mixed Result object with all record fields or False if not found
      */
     abstract function get_record($id, $assoc=false);
@@ -109,7 +111,7 @@ abstract class rcube_addressbook
      */
     function set_page($page)
     {
-      $this->list_page = (int)$page;
+        $this->list_page = (int)$page;
     }
 
     /**
@@ -120,7 +122,7 @@ abstract class rcube_addressbook
      */
     function set_pagesize($size)
     {
-      $this->page_size = (int)$size;
+        $this->page_size = (int)$size;
     }
 
     /**
@@ -128,11 +130,11 @@ abstract class rcube_addressbook
      *
      * @param array Assoziative array with save data
      * @param boolean True to check for duplicates first
-     * @return The created record ID on success, False on error
+     * @return mixed The created record ID on success, False on error
      */
     function insert($save_data, $check=false)
     {
-      /* empty for read-only address books */
+        /* empty for read-only address books */
     }
 
     /**
@@ -140,11 +142,11 @@ abstract class rcube_addressbook
      *
      * @param mixed Record identifier
      * @param array Assoziative array with save data
-     * @return True on success, False on error
+     * @return boolean True on success, False on error
      */
     function update($id, $save_cols)
     {
-      /* empty for read-only address books */
+        /* empty for read-only address books */
     }
 
     /**
@@ -154,7 +156,7 @@ abstract class rcube_addressbook
      */
     function delete($ids)
     {
-      /* empty for read-only address books */
+        /* empty for read-only address books */
     }
 
     /**
@@ -162,8 +164,101 @@ abstract class rcube_addressbook
      */
     function delete_all()
     {
-      /* empty for read-only address books */
+        /* empty for read-only address books */
+    }
+
+    /**
+     * Setter for the current group
+     * (empty, has to be re-implemented by extending class)
+     */
+    function set_group($gid) { }
+
+    /**
+     * List all active contact groups of this source
+     *
+     * @return array  Indexed list of contact groups, each a hash array
+     */
+    function list_groups()
+    {
+        /* empty for address books don't supporting groups */
+        return array();
+    }
+
+    /**
+     * Create a contact group with the given name
+     *
+     * @param string The group name
+     * @return mixed False on error, array with record props in success
+     */
+    function create_group($name)
+    {
+        /* empty for address books don't supporting groups */
+        return false;
+    }
+
+    /**
+     * Delete the given group and all linked group members
+     *
+     * @param string Group identifier
+     * @return boolean True on success, false if no data was changed
+     */
+    function delete_group($gid)
+    {
+        /* empty for address books don't supporting groups */
+        return false;
+    }
+
+    /**
+     * Rename a specific contact group
+     *
+     * @param string Group identifier
+     * @param string New name to set for this group
+     * @return boolean New name on success, false if no data was changed
+     */
+    function rename_group($gid, $newname)
+    {
+        /* empty for address books don't supporting groups */
+        return false;
+    }
+
+    /**
+     * Add the given contact records the a certain group
+     *
+     * @param string  Group identifier
+     * @param array   List of contact identifiers to be added
+     * @return int    Number of contacts added
+     */
+    function add_to_group($group_id, $ids)
+    {
+        /* empty for address books don't supporting groups */
+        return 0;
+    }
+
+    /**
+     * Remove the given contact records from a certain group
+     *
+     * @param string  Group identifier
+     * @param array   List of contact identifiers to be removed
+     * @return int    Number of deleted group members
+     */
+    function remove_from_group($group_id, $ids)
+    {
+        /* empty for address books don't supporting groups */
+        return 0;
     }
 
+    /**
+     * Get group assignments of a specific contact record
+     *
+     * @param mixed Record identifier
+     *
+     * @return array List of assigned groups as ID=>Name pairs
+     * @since 0.5-beta
+     */
+    function get_record_groups($id)
+    {
+        /* empty for address books don't supporting groups */
+        return array();
+    }
 }
\ No newline at end of file
+
index 9f37aaa0b9c051bb89a475dfcd2ee488c434037c..82ba731e7bfe3200a37ae078ff2acb5fe3d8307c 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_browser.php                                     |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2007-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2007-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_browser.php 328 2006-08-30 17:41:21Z thomasb $
+ $Id: rcube_browser.php 3989 2010-09-25 13:03:53Z alec $
 
 */
 
@@ -30,25 +30,25 @@ class rcube_browser
 {
     function __construct()
     {
-        $HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
+        $HTTP_USER_AGENT = strtolower($_SERVER['HTTP_USER_AGENT']);
 
         $this->ver = 0;
-        $this->win = stristr($HTTP_USER_AGENT, 'win');
-        $this->mac = stristr($HTTP_USER_AGENT, 'mac');
-        $this->linux = stristr($HTTP_USER_AGENT, 'linux');
-        $this->unix  = stristr($HTTP_USER_AGENT, 'unix');
+        $this->win = strstr($HTTP_USER_AGENT, 'win');
+        $this->mac = strstr($HTTP_USER_AGENT, 'mac');
+        $this->linux = strstr($HTTP_USER_AGENT, 'linux');
+        $this->unix  = strstr($HTTP_USER_AGENT, 'unix');
 
-        $this->opera = stristr($HTTP_USER_AGENT, 'opera');
-        $this->ns4 = stristr($HTTP_USER_AGENT, 'mozilla/4') && !stristr($HTTP_USER_AGENT, 'msie');
-        $this->ns  = ($this->ns4 || stristr($HTTP_USER_AGENT, 'netscape'));
-        $this->ie  = stristr($HTTP_USER_AGENT, 'compatible; msie') && !$this->opera;
-        $this->mz  = stristr($HTTP_USER_AGENT, 'mozilla/5');
-        $this->chrome = stristr($HTTP_USER_AGENT, 'chrome');
-        $this->khtml = stristr($HTTP_USER_AGENT, 'khtml');
-        $this->safari = ($this->khtml || stristr($HTTP_USER_AGENT, 'safari'));
+        $this->opera = strstr($HTTP_USER_AGENT, 'opera');
+        $this->ns4 = strstr($HTTP_USER_AGENT, 'mozilla/4') && !strstr($HTTP_USER_AGENT, 'msie');
+        $this->ns  = ($this->ns4 || strstr($HTTP_USER_AGENT, 'netscape'));
+        $this->ie  = !$this->opera && strstr($HTTP_USER_AGENT, 'compatible; msie');
+        $this->mz  = strstr($HTTP_USER_AGENT, 'mozilla/5');
+        $this->chrome = strstr($HTTP_USER_AGENT, 'chrome');
+        $this->khtml = strstr($HTTP_USER_AGENT, 'khtml');
+        $this->safari = !$this->chrome && ($this->khtml || strstr($HTTP_USER_AGENT, 'safari'));
 
         if ($this->ns || $this->chrome) {
-            $test = preg_match('/(mozilla|chrome)\/([0-9.]+)/i', $HTTP_USER_AGENT, $regs);
+            $test = preg_match('/(mozilla|chrome)\/([0-9.]+)/', $HTTP_USER_AGENT, $regs);
             $this->ver = $test ? (float)$regs[2] : 0;
         }
         else if ($this->mz) {
@@ -56,11 +56,11 @@ class rcube_browser
             $this->ver = $test ? (float)$regs[1] : 0;
         }
         else if ($this->ie || $this->opera) {
-            $test = preg_match('/(msie|opera) ([0-9.]+)/i', $HTTP_USER_AGENT, $regs);
+            $test = preg_match('/(msie|opera) ([0-9.]+)/', $HTTP_USER_AGENT, $regs);
             $this->ver = $test ? (float)$regs[2] : 0;
         }
 
-        if (preg_match('/ ([a-z]{2})-([a-z]{2})/i', $HTTP_USER_AGENT, $regs))
+        if (preg_match('/ ([a-z]{2})-([a-z]{2})/', $HTTP_USER_AGENT, $regs))
             $this->lang =  $regs[1];
         else
             $this->lang =  'en';
@@ -69,5 +69,5 @@ class rcube_browser
         $this->pngalpha = $this->mz || $this->safari || ($this->ie && $this->ver>=5.5) ||
             ($this->ie && $this->ver>=5 && $this->mac) || ($this->opera && $this->ver>=7) ? true : false;
     }
-  }
+}
 
index b30cf2d38a8861ef8a3eb8c04b4e067b0f2504e4..66d7b675d96f45aa3bbbda26a21675ce7e3d2192 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_config.php                                      |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2008-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2008-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: $
+ $Id: rcube_config.php 4363 2010-12-22 19:17:47Z alec $
 
 */
 
 /**
- * Configuration class for RoundCube
+ * Configuration class for Roundcube
  *
  * @package Core
  */
 class rcube_config
 {
-  private $prop = array();
-  private $errors = array();
-
-
-  /**
-   * Object constructor
-   */
-  public function __construct()
-  {
-    $this->load();
-  }
-
-
-  /**
-   * Load config from local config file
-   *
-   * @todo Remove global $CONFIG
-   */
-  private function load()
-  {
-    // start output buffering, we don't need any output yet, 
-    // it'll be cleared after reading of config files, etc.
-    ob_start();
+    private $prop = array();
+    private $errors = array();
+    private $userprefs = array();
+
+
+    /**
+     * Object constructor
+     */
+    public function __construct()
+    {
+        $this->load();
+    }
+
+
+    /**
+     * Load config from local config file
+     *
+     * @todo Remove global $CONFIG
+     */
+    private function load()
+    {
+        // load main config file
+        if (!$this->load_from_file(RCMAIL_CONFIG_DIR . '/main.inc.php'))
+            $this->errors[] = 'main.inc.php was not found.';
+
+        // load database config
+        if (!$this->load_from_file(RCMAIL_CONFIG_DIR . '/db.inc.php'))
+            $this->errors[] = 'db.inc.php was not found.';
     
-    // load main config file
-    if (!$this->load_from_file(RCMAIL_CONFIG_DIR . '/main.inc.php'))
-      $this->errors[] = 'main.inc.php was not found.';
+        // load host-specific configuration
+        $this->load_host_config();
 
-    // load database config
-    if (!$this->load_from_file(RCMAIL_CONFIG_DIR . '/db.inc.php'))
-      $this->errors[] = 'db.inc.php was not found.';
+        // set skin (with fallback to old 'skin_path' property)
+        if (empty($this->prop['skin']) && !empty($this->prop['skin_path']))
+            $this->prop['skin'] = str_replace('skins/', '', unslashify($this->prop['skin_path']));
+        else if (empty($this->prop['skin']))
+            $this->prop['skin'] = 'default';
+
+        // fix paths
+        $this->prop['log_dir'] = $this->prop['log_dir'] ? realpath(unslashify($this->prop['log_dir'])) : INSTALL_PATH . 'logs';
+        $this->prop['temp_dir'] = $this->prop['temp_dir'] ? realpath(unslashify($this->prop['temp_dir'])) : INSTALL_PATH . 'temp';
     
-    // load host-specific configuration
-    $this->load_host_config();
-
-    // set skin (with fallback to old 'skin_path' property)
-    if (empty($this->prop['skin']) && !empty($this->prop['skin_path']))
-      $this->prop['skin'] = str_replace('skins/', '', unslashify($this->prop['skin_path']));
-    else if (empty($this->prop['skin']))
-      $this->prop['skin'] = 'default';
-
-    // fix paths
-    $this->prop['log_dir'] = $this->prop['log_dir'] ? unslashify($this->prop['log_dir']) : INSTALL_PATH . 'logs';
-    $this->prop['temp_dir'] = $this->prop['temp_dir'] ? unslashify($this->prop['temp_dir']) : INSTALL_PATH . 'temp';
-
-    // fix default imap folders encoding
-    foreach (array('drafts_mbox', 'junk_mbox', 'sent_mbox', 'trash_mbox') as $folder)
-      $this->prop[$folder] = rcube_charset_convert($this->prop[$folder], RCMAIL_CHARSET, 'UTF7-IMAP');
-
-    if (!empty($this->prop['default_imap_folders']))
-      foreach ($this->prop['default_imap_folders'] as $n => $folder)
-        $this->prop['default_imap_folders'][$n] = rcube_charset_convert($folder, RCMAIL_CHARSET, 'UTF7-IMAP');
-
-    // set PHP error logging according to config
-    if ($this->prop['debug_level'] & 1) {
-      ini_set('log_errors', 1);
-
-      if ($this->prop['log_driver'] == 'syslog') {
-        ini_set('error_log', 'syslog');
-      } else {
-        ini_set('error_log', $this->prop['log_dir'].'/errors');
-      }
+        // fix default imap folders encoding
+        foreach (array('drafts_mbox', 'junk_mbox', 'sent_mbox', 'trash_mbox') as $folder)
+            $this->prop[$folder] = rcube_charset_convert($this->prop[$folder], RCMAIL_CHARSET, 'UTF7-IMAP');
+
+        if (!empty($this->prop['default_imap_folders']))
+            foreach ($this->prop['default_imap_folders'] as $n => $folder)
+                $this->prop['default_imap_folders'][$n] = rcube_charset_convert($folder, RCMAIL_CHARSET, 'UTF7-IMAP');
+
+        // set PHP error logging according to config
+        if ($this->prop['debug_level'] & 1) {
+            ini_set('log_errors', 1);
+
+            if ($this->prop['log_driver'] == 'syslog') {
+                ini_set('error_log', 'syslog');
+            }
+            else {
+                ini_set('error_log', $this->prop['log_dir'].'/errors');
+            }
+        }
+        if ($this->prop['debug_level'] & 4) {
+            ini_set('display_errors', 1);
+        }
+        else {
+            ini_set('display_errors', 0);
+        }
+
+        // export config data
+        $GLOBALS['CONFIG'] = &$this->prop;
     }
-    if ($this->prop['debug_level'] & 4) {
-      ini_set('display_errors', 1);
+
+    /**
+     * Load a host-specific config file if configured
+     * This will merge the host specific configuration with the given one
+     */
+    private function load_host_config()
+    {
+        $fname = null;
+
+        if (is_array($this->prop['include_host_config'])) {
+            $fname = $this->prop['include_host_config'][$_SERVER['HTTP_HOST']];
+        }
+        else if (!empty($this->prop['include_host_config'])) {
+            $fname = preg_replace('/[^a-z0-9\.\-_]/i', '', $_SERVER['HTTP_HOST']) . '.inc.php';
+        }
+
+        if ($fname) {
+            $this->load_from_file(RCMAIL_CONFIG_DIR . '/' . $fname);
+        }
     }
-    else {
-      ini_set('display_errors', 0);
+
+
+    /**
+     * Read configuration from a file
+     * and merge with the already stored config values
+     *
+     * @param string $fpath Full path to the config file to be loaded
+     * @return booelan True on success, false on failure
+     */
+    public function load_from_file($fpath)
+    {
+        if (is_file($fpath) && is_readable($fpath)) {
+            // use output buffering, we don't need any output here 
+            ob_start();
+            include($fpath);
+            ob_end_clean();
+
+            if (is_array($rcmail_config)) {
+                $this->prop = array_merge($this->prop, $rcmail_config, $this->userprefs);
+                return true;
+            }
+        }
+
+        return false;
     }
-    
-    // clear output buffer
-    ob_end_clean();
-
-    // export config data
-    $GLOBALS['CONFIG'] = &$this->prop;
-  }
-  
-  
-  /**
-   * Load a host-specific config file if configured
-   * This will merge the host specific configuration with the given one
-   */
-  private function load_host_config()
-  {
-    $fname = null;
-
-    if (is_array($this->prop['include_host_config'])) {
-      $fname = $this->prop['include_host_config'][$_SERVER['HTTP_HOST']];
+
+
+    /**
+     * Getter for a specific config parameter
+     *
+     * @param  string $name Parameter name
+     * @param  mixed  $def  Default value if not set
+     * @return mixed  The requested config value
+     */
+    public function get($name, $def = null)
+    {
+        return isset($this->prop[$name]) ? $this->prop[$name] : $def;
     }
-    else if (!empty($this->prop['include_host_config'])) {
-      $fname = preg_replace('/[^a-z0-9\.\-_]/i', '', $_SERVER['HTTP_HOST']) . '.inc.php';
+
+
+    /**
+     * Setter for a config parameter
+     *
+     * @param string $name  Parameter name
+     * @param mixed  $value Parameter value
+     */
+    public function set($name, $value)
+    {
+        $this->prop[$name] = $value;
     }
 
-    if ($fname) {
-      $this->load_from_file(RCMAIL_CONFIG_DIR . '/' . $fname);
+
+    /**
+     * Override config options with the given values (eg. user prefs)
+     *
+     * @param array $prefs Hash array with config props to merge over
+     */
+    public function merge($prefs)
+    {
+        $this->prop = array_merge($this->prop, $prefs, $this->userprefs);
     }
-  }
-  
-  
-  /**
-   * Read configuration from a file
-   * and merge with the already stored config values
-   *
-   * @param string Full path to the config file to be loaded
-   * @return booelan True on success, false on failure
-   */
-  public function load_from_file($fpath)
-  {
-    if (is_file($fpath) && is_readable($fpath)) {
-      include($fpath);
-      if (is_array($rcmail_config)) {
-        $this->prop = array_merge($this->prop, $rcmail_config);
-        return true;
-      }
+
+
+    /**
+     * Merge the given prefs over the current config
+     * and make sure that they survive further merging.
+     *
+     * @param array $prefs Hash array with user prefs
+     */
+    public function set_user_prefs($prefs)
+    {
+        $this->userprefs = $prefs;
+        $this->prop = array_merge($this->prop, $prefs);
     }
-    
-    return false;
-  }
-  
-  
-  /**
-   * Getter for a specific config parameter
-   *
-   * @param  string Parameter name
-   * @param  mixed  Default value if not set
-   * @return mixed  The requested config value
-   */
-  public function get($name, $def = null)
-  {
-    return isset($this->prop[$name]) ? $this->prop[$name] : $def;
-  }
-  
-  
-  /**
-   * Setter for a config parameter
-   *
-   * @param string Parameter name
-   * @param mixed  Parameter value
-   */
-  public function set($name, $value)
-  {
-    $this->prop[$name] = $value;
-  }
-  
-  
-  /**
-   * Override config options with the given values (eg. user prefs)
-   *
-   * @param array Hash array with config props to merge over
-   */
-  public function merge($prefs)
-  {
-    $this->prop = array_merge($this->prop, $prefs);
-  }
-  
-  
-  /**
-   * Getter for all config options
-   *
-   * @return array  Hash array containg all config properties
-   */
-  public function all()
-  {
-    return $this->prop;
-  }
-
-  /**
-   * Return requested DES crypto key.
-   *
-   * @param string Crypto key name
-   * @return string Crypto key
-   */
-  public function get_crypto_key($key)
-  {
-    // Bomb out if the requested key does not exist
-    if (!array_key_exists($key, $this->prop))
+
+
+    /**
+     * Getter for all config options
+     *
+     * @return array  Hash array containg all config properties
+     */
+    public function all()
     {
-      raise_error(array(
-        'code' => 500,
-        'type' => 'php',
-        'file' => __FILE__,
-        'message' => "Request for unconfigured crypto key \"$key\""
-      ), true, true);
+        return $this->prop;
     }
-  
-    $key = $this->prop[$key];
-  
-    // Bomb out if the configured key is not exactly 24 bytes long
-    if (strlen($key) != 24)
+
+
+    /**
+     * Return requested DES crypto key.
+     *
+     * @param string $key Crypto key name
+     * @return string Crypto key
+     */
+    public function get_crypto_key($key)
     {
-      raise_error(array(
-        'code' => 500,
-        'type' => 'php',
-        'file' => __FILE__,
-        'message' => "Configured crypto key \"$key\" is not exactly 24 bytes long"
-      ), true, true);
+        // Bomb out if the requested key does not exist
+        if (!array_key_exists($key, $this->prop)) {
+            raise_error(array(
+                'code' => 500, 'type' => 'php',
+                'file' => __FILE__, 'line' => __LINE__,
+                'message' => "Request for unconfigured crypto key \"$key\""
+            ), true, true);
+        }
+
+        $key = $this->prop[$key];
+
+        // Bomb out if the configured key is not exactly 24 bytes long
+        if (strlen($key) != 24) {
+            raise_error(array(
+                'code' => 500, 'type' => 'php',
+                   'file' => __FILE__, 'line' => __LINE__,
+                'message' => "Configured crypto key '$key' is not exactly 24 bytes long"
+            ), true, true);
+        }
+
+        return $key;
     }
 
-    return $key;
-  }
-
-  /**
-   * Try to autodetect operating system and find the correct line endings
-   *
-   * @return string The appropriate mail header delimiter
-   */
-  public function header_delimiter()
-  {
-    // use the configured delimiter for headers
-    if (!empty($this->prop['mail_header_delimiter']))
-      return $this->prop['mail_header_delimiter'];
-    else if (strtolower(substr(PHP_OS, 0, 3)) == 'win')
-      return "\r\n";
-    else if (strtolower(substr(PHP_OS, 0, 3)) == 'mac')
-      return "\r\n";
-    else
-      return "\n";
-  }
-
-  
-  
-  /**
-   * Return the mail domain configured for the given host
-   *
-   * @param string IMAP host
-   * @return string Resolved SMTP host
-   */
-  public function mail_domain($host)
-  {
-    $domain = $host;
-    
-    if (is_array($this->prop['mail_domain'])) {
-      if (isset($this->prop['mail_domain'][$host]))
-        $domain = $this->prop['mail_domain'][$host];
+
+    /**
+     * Try to autodetect operating system and find the correct line endings
+     *
+     * @return string The appropriate mail header delimiter
+     */
+    public function header_delimiter()
+    {
+        // use the configured delimiter for headers
+        if (!empty($this->prop['mail_header_delimiter'])) {
+            $delim = $this->prop['mail_header_delimiter'];
+            if ($delim == "\n" || $delim == "\r\n")
+                return $delim;
+            else
+                raise_error(array(
+                    'code' => 500, 'type' => 'php',
+                       'file' => __FILE__, 'line' => __LINE__,
+                    'message' => "Invalid mail_header_delimiter setting"
+                ), true, false);
+        }
+
+        $php_os = strtolower(substr(PHP_OS, 0, 3));
+
+        if ($php_os == 'win')
+            return "\r\n";
+
+        if ($php_os == 'mac')
+            return "\r\n";
+
+        return "\n";
     }
-    else if (!empty($this->prop['mail_domain']))
-      $domain = $this->prop['mail_domain'];
-    
-    return $domain;
-  }
-  
-  
-  /**
-   * Getter for error state
-   *
-   * @return mixed Error message on error, False if no errors
-   */
-  public function get_error()
-  {
-    return empty($this->errors) ? false : join("\n", $this->errors);
-  }
 
 
-}
+    /**
+     * Return the mail domain configured for the given host
+     *
+     * @param string  $host   IMAP host
+     * @param boolean $encode If true, domain name will be converted to IDN ASCII
+     * @return string Resolved SMTP host
+     */
+    public function mail_domain($host, $encode=true)
+    {
+        $domain = $host;
+
+        if (is_array($this->prop['mail_domain'])) {
+            if (isset($this->prop['mail_domain'][$host]))
+                $domain = $this->prop['mail_domain'][$host];
+        }
+        else if (!empty($this->prop['mail_domain']))
+            $domain = rcube_parse_host($this->prop['mail_domain']);
+
+        if ($encode)
+            $domain = idn_to_ascii($domain);
 
+        return $domain;
+    }
+
+
+    /**
+     * Getter for error state
+     *
+     * @return mixed Error message on error, False if no errors
+     */
+    public function get_error()
+    {
+        return empty($this->errors) ? false : join("\n", $this->errors);
+    }
+
+}
index a931845ae581924c626ff8765511abe7d807c016..9dfb60b5bb81e6e593c7106344aa8273c599c9d8 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_contacts.php                                    |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2006-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2006-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_contacts.inc 328 2006-08-30 17:41:21Z thomasb $
+ $Id: rcube_contacts.php 4145 2010-10-27 07:23:57Z alec $
 
 */
 
  */
 class rcube_contacts extends rcube_addressbook
 {
-  var $db = null;
-  var $db_name = '';
-  var $user_id = 0;
-  var $filter = null;
-  var $result = null;
-  var $search_fields;
-  var $search_string;
-  var $table_cols = array('name', 'email', 'firstname', 'surname', 'vcard');
-  
-  /** public properties */
-  var $primary_key = 'contact_id';
-  var $readonly = false;
-  var $list_page = 1;
-  var $page_size = 10;
-  var $ready = false;
-
-  
-  /**
-   * Object constructor
-   *
-   * @param object  Instance of the rcube_db class
-   * @param integer User-ID
-   */
-  function __construct($dbconn, $user)
-  {
-    $this->db = $dbconn;
-    $this->db_name = get_table_name('contacts');
-    $this->user_id = $user;
-    $this->ready = $this->db && !$this->db->is_error();
-  }
-
-
-  /**
-   * Save a search string for future listings
-   *
-   * @param  string SQL params to use in listing method
-   */
-  function set_search_set($filter)
-  {
-    $this->filter = $filter;
-  }
-  
-  
-  /**
-   * Getter for saved search properties
-   *
-   * @return mixed Search properties used by this class
-   */
-  function get_search_set()
-  {
-    return $this->filter;
-  }
-
-
-  /**
-   * Reset all saved results and search parameters
-   */
-  function reset()
-  {
-    $this->result = null;
-    $this->filter = null;
-    $this->search_fields = null;
-    $this->search_string = null;
-  }
-  
-  
-  /**
-   * List the current set of contact records
-   *
-   * @param  array  List of cols to show
-   * @param  int    Only return this number of records, use negative values for tail
-   * @return array  Indexed list of contact records, each a hash array
-   */
-  function list_records($cols=null, $subset=0)
-  {
-    // count contacts for this user
-    $this->result = $this->count();
-    $sql_result = NULL;
-
-    // get contacts from DB
-    if ($this->result->count)
+    // protected for backward compat. with some plugins
+    protected $db_name = 'contacts';
+    protected $db_groups = 'contactgroups';
+    protected $db_groupmembers = 'contactgroupmembers';
+
+    /**
+     * Store database connection.
+     *
+     * @var rcube_mdb2
+     */
+    private $db = null;
+    private $user_id = 0;
+    private $filter = null;
+    private $result = null;
+    private $search_fields;
+    private $search_string;
+    private $cache;
+    private $table_cols = array('name', 'email', 'firstname', 'surname', 'vcard');
+
+    // public properties
+    var $primary_key = 'contact_id';
+    var $readonly = false;
+    var $groups = true;
+    var $list_page = 1;
+    var $page_size = 10;
+    var $group_id = 0;
+    var $ready = false;
+
+
+    /**
+     * Object constructor
+     *
+     * @param object  Instance of the rcube_db class
+     * @param integer User-ID
+     */
+    function __construct($dbconn, $user)
     {
-      $start_row = $subset < 0 ? $this->result->first + $this->page_size + $subset : $this->result->first;
-      $length = $subset != 0 ? abs($subset) : $this->page_size;
-      
-      $sql_result = $this->db->limitquery(
-        "SELECT * FROM ".$this->db_name."
-         WHERE  del<>1
-         AND    user_id=?" .
-        ($this->filter ? " AND (".$this->filter.")" : "") .
-        " ORDER BY name",
-        $start_row,
-        $length,
-        $this->user_id);
+        $this->db = $dbconn;
+        $this->user_id = $user;
+        $this->ready = $this->db && !$this->db->is_error();
     }
-    
-    while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result)))
+
+
+    /**
+     * Save a search string for future listings
+     *
+     * @param  string SQL params to use in listing method
+     */
+    function set_search_set($filter)
     {
-      $sql_arr['ID'] = $sql_arr[$this->primary_key];
-      // make sure we have a name to display
-      if (empty($sql_arr['name']))
-        $sql_arr['name'] = $sql_arr['email'];
-      $this->result->add($sql_arr);
+        $this->filter = $filter;
+        $this->cache = null;
     }
-    
-    return $this->result;
-  }
-
-
-  /**
-   * Search contacts
-   *
-   * @param array   List of fields to search in
-   * @param string  Search value
-   * @param boolean True if results are requested, False if count only
-   * @return Indexed list of contact records and 'count' value
-   */
-  function search($fields, $value, $strict=false, $select=true)
-  {
-    if (!is_array($fields))
-      $fields = array($fields);
-      
-    $add_where = array();
-    foreach ($fields as $col)
+
+
+    /**
+     * Getter for saved search properties
+     *
+     * @return mixed Search properties used by this class
+     */
+    function get_search_set()
     {
-      if ($col == 'ID' || $col == $this->primary_key)
-      {
-        $ids = !is_array($value) ? explode(',', $value) : $value;
-        $add_where[] = $this->primary_key.' IN ('.join(',', $ids).')';
-      }
-      else if ($strict)
-        $add_where[] = $this->db->quoteIdentifier($col).'='.$this->db->quote($value);
-      else
-        $add_where[] = $this->db->ilike($col, '%'.$value.'%');
+        return $this->filter;
     }
-    
-    if (!empty($add_where))
+
+
+    /**
+     * Setter for the current group
+     * (empty, has to be re-implemented by extending class)
+     */
+    function set_group($gid)
     {
-      $this->set_search_set(join(' OR ', $add_where));
-      if ($select)
-        $this->list_records();
-      else
-        $this->result = $this->count();
+        $this->group_id = $gid;
+        $this->cache = null;
     }
-   
-    return $this->result; 
-  }
-
-
-  /**
-   * Count number of available contacts in database
-   *
-   * @return Result array with values for 'count' and 'first'
-   */
-  function count()
-  {
-    // count contacts for this user
-    $sql_result = $this->db->query(
-      "SELECT COUNT(contact_id) AS rows
-       FROM ".$this->db_name."
-       WHERE  del<>1
-       AND    user_id=?".
-       ($this->filter ? " AND (".$this->filter.")" : ""),
-      $this->user_id);
-
-    $sql_arr = $this->db->fetch_assoc($sql_result);
-    return new rcube_result_set($sql_arr['rows'], ($this->list_page-1) * $this->page_size);;
-  }
-
-
-  /**
-   * Return the last result set
-   *
-   * @return Result array or NULL if nothing selected yet
-   */
-  function get_result()
-  {
-    return $this->result;
-  }
-  
-  
-  /**
-   * Get a specific contact record
-   *
-   * @param mixed record identifier(s)
-   * @return Result object with all record fields or False if not found
-   */
-  function get_record($id, $assoc=false)
-  {
-    // return cached result
-    if ($this->result && ($first = $this->result->first()) && $first[$this->primary_key] == $id)
-      return $assoc ? $first : $this->result;
-      
-    $this->db->query(
-      "SELECT * FROM ".$this->db_name."
-       WHERE  contact_id=?
-       AND    user_id=?
-       AND    del<>1",
-      $id,
-      $this->user_id);
-
-    if ($sql_arr = $this->db->fetch_assoc())
+
+
+    /**
+     * Reset all saved results and search parameters
+     */
+    function reset()
     {
-      $sql_arr['ID'] = $sql_arr[$this->primary_key];
-      $this->result = new rcube_result_set(1);
-      $this->result->add($sql_arr);
+        $this->result = null;
+        $this->filter = null;
+        $this->search_fields = null;
+        $this->search_string = null;
+        $this->cache = null;
     }
 
-    return $assoc && $sql_arr ? $sql_arr : $this->result;
-  }
-  
-  
-  /**
-   * Create a new contact record
-   *
-   * @param array Assoziative array with save data
-   * @return The created record ID on success, False on error
-   */
-  function insert($save_data, $check=false)
-  {
-    if (is_object($save_data) && is_a($save_data, rcube_result_set))
-      return $this->insert_recset($save_data, $check);
-
-    $insert_id = $existing = false;
-
-    if ($check)
-      $existing = $this->search('email', $save_data['email'], true, false);
-
-    $a_insert_cols = $a_insert_values = array();
-    foreach ($this->table_cols as $col)
-      if (isset($save_data[$col]))
-      {
-        $a_insert_cols[] = $this->db->quoteIdentifier($col);
-        $a_insert_values[] = $this->db->quote($save_data[$col]);
+
+    /**
+     * List all active contact groups of this source
+     *
+     * @param string  Search string to match group name
+     * @return array  Indexed list of contact groups, each a hash array
+     */
+    function list_groups($search = null)
+    {
+        $results = array();
+
+        if (!$this->groups)
+            return $results;
+
+        $sql_filter = $search ? " AND " . $this->db->ilike('name', '%'.$search.'%') : '';
+
+        $sql_result = $this->db->query(
+            "SELECT * FROM ".get_table_name($this->db_groups).
+            " WHERE del<>1".
+            " AND user_id=?".
+            $sql_filter.
+            " ORDER BY name",
+            $this->user_id);
+
+        while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) {
+            $sql_arr['ID'] = $sql_arr['contactgroup_id'];
+            $results[]     = $sql_arr;
+        }
+
+        return $results;
+    }
+
+
+    /**
+     * List the current set of contact records
+     *
+     * @param  array   List of cols to show
+     * @param  int     Only return this number of records, use negative values for tail
+     * @param  boolean True to skip the count query (select only)
+     * @return array  Indexed list of contact records, each a hash array
+     */
+    function list_records($cols=null, $subset=0, $nocount=false)
+    {
+        if ($nocount || $this->list_page <= 1) {
+            // create dummy result, we don't need a count now
+            $this->result = new rcube_result_set();
+        } else {
+            // count all records
+            $this->result = $this->count();
+        }
+
+        $start_row = $subset < 0 ? $this->result->first + $this->page_size + $subset : $this->result->first;
+        $length = $subset != 0 ? abs($subset) : $this->page_size;
+
+        if ($this->group_id)
+            $join = " LEFT JOIN ".get_table_name($this->db_groupmembers)." AS m".
+                " ON (m.contact_id = c.".$this->primary_key.")";
+
+        $sql_result = $this->db->limitquery(
+            "SELECT * FROM ".get_table_name($this->db_name)." AS c" .
+            $join .
+            " WHERE c.del<>1" .
+                " AND c.user_id=?" .
+                ($this->group_id ? " AND m.contactgroup_id=?" : "").
+                ($this->filter ? " AND (".$this->filter.")" : "") .
+            " ORDER BY c.name",
+            $start_row,
+            $length,
+            $this->user_id,
+            $this->group_id);
+
+        while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) {
+            $sql_arr['ID'] = $sql_arr[$this->primary_key];
+            // make sure we have a name to display
+            if (empty($sql_arr['name']))
+                $sql_arr['name'] = $sql_arr['email'];
+            $this->result->add($sql_arr);
+        }
+
+        $cnt = count($this->result->records);
+
+        // update counter
+        if ($nocount)
+            $this->result->count = $cnt;
+        else if ($this->list_page <= 1) {
+            if ($cnt < $this->page_size && $subset == 0)
+                $this->result->count = $cnt;
+            else if (isset($this->cache['count']))
+                $this->result->count = $this->cache['count'];
+            else
+                $this->result->count = $this->_count();
+        }
+
+        return $this->result;
+    }
+
+
+    /**
+     * Search contacts
+     *
+     * @param array   List of fields to search in
+     * @param string  Search value
+     * @param boolean True for strict (=), False for partial (LIKE) matching
+     * @param boolean True if results are requested, False if count only
+     * @param boolean True to skip the count query (select only)
+     * @param array   List of fields that cannot be empty
+     * @return Indexed list of contact records and 'count' value
+     */
+    function search($fields, $value, $strict=false, $select=true, $nocount=false, $required=array())
+    {
+        if (!is_array($fields))
+            $fields = array($fields);
+        if (!is_array($required) && !empty($required))
+            $required = array($required);
+
+        $where = $and_where = array();
+
+        foreach ($fields as $col) {
+            if ($col == 'ID' || $col == $this->primary_key) {
+                $ids     = !is_array($value) ? explode(',', $value) : $value;
+                $ids     = $this->db->array2list($ids, 'integer');
+                $where[] = 'c.' . $this->primary_key.' IN ('.$ids.')';
+            }
+            else if ($strict)
+                $where[] = $this->db->quoteIdentifier($col).' = '.$this->db->quote($value);
+            else
+                $where[] = $this->db->ilike($col, '%'.$value.'%');
+        }
+
+        foreach ($required as $col) {
+            $and_where[] = $this->db->quoteIdentifier($col).' <> '.$this->db->quote('');
+        }
+
+        if (!empty($where))
+            $where = join(' OR ', $where);
+
+        if (!empty($and_where))
+            $where = ($where ? "($where) AND " : '') . join(' AND ', $and_where);
+
+        if (!empty($where)) {
+            $this->set_search_set($where);
+            if ($select)
+                $this->list_records(null, 0, $nocount);
+            else
+                $this->result = $this->count();
+        }
+
+        return $this->result; 
+    }
+
+
+    /**
+     * Count number of available contacts in database
+     *
+     * @return rcube_result_set Result object
+     */
+    function count()
+    {
+        $count = isset($this->cache['count']) ? $this->cache['count'] : $this->_count();
+
+        return new rcube_result_set($count, ($this->list_page-1) * $this->page_size);
+    }
+
+
+    /**
+     * Count number of available contacts in database
+     *
+     * @return int Contacts count
+     */
+    private function _count()
+    {
+        if ($this->group_id)
+            $join = " LEFT JOIN ".get_table_name($this->db_groupmembers)." AS m".
+                " ON (m.contact_id=c.".$this->primary_key.")";
+
+        // count contacts for this user
+        $sql_result = $this->db->query(
+            "SELECT COUNT(c.contact_id) AS rows".
+            " FROM ".get_table_name($this->db_name)." AS c".
+                $join.
+            " WHERE c.del<>1".
+            " AND c.user_id=?".
+            ($this->group_id ? " AND m.contactgroup_id=?" : "").
+            ($this->filter ? " AND (".$this->filter.")" : ""),
+            $this->user_id,
+            $this->group_id
+        );
+
+        $sql_arr = $this->db->fetch_assoc($sql_result);
+
+        $this->cache['count'] = (int) $sql_arr['rows'];
+
+        return $this->cache['count'];
+    }
+
+
+    /**
+     * Return the last result set
+     *
+     * @return mixed Result array or NULL if nothing selected yet
+     */
+    function get_result()
+    {
+        return $this->result;
+    }
+
+
+    /**
+     * Get a specific contact record
+     *
+     * @param mixed record identifier(s)
+     * @return mixed Result object with all record fields or False if not found
+     */
+    function get_record($id, $assoc=false)
+    {
+        // return cached result
+        if ($this->result && ($first = $this->result->first()) && $first[$this->primary_key] == $id)
+            return $assoc ? $first : $this->result;
+
+        $this->db->query(
+            "SELECT * FROM ".get_table_name($this->db_name).
+            " WHERE contact_id=?".
+                " AND user_id=?".
+                " AND del<>1",
+            $id,
+            $this->user_id
+        );
+
+        if ($sql_arr = $this->db->fetch_assoc()) {
+            $sql_arr['ID'] = $sql_arr[$this->primary_key];
+            $this->result = new rcube_result_set(1);
+            $this->result->add($sql_arr);
+        }
+
+        return $assoc && $sql_arr ? $sql_arr : $this->result;
+    }
+
+
+    /**
+     * Get group assignments of a specific contact record
+     *
+     * @param mixed Record identifier
+     * @return array List of assigned groups as ID=>Name pairs
+     */
+    function get_record_groups($id)
+    {
+      $results = array();
+
+      if (!$this->groups)
+          return $results;
+
+      $sql_result = $this->db->query(
+        "SELECT cgm.contactgroup_id, cg.name FROM " . get_table_name($this->db_groupmembers) . " AS cgm" .
+        " LEFT JOIN " . get_table_name($this->db_groups) . " AS cg ON (cgm.contactgroup_id = cg.contactgroup_id AND cg.del<>1)" .
+        " WHERE cgm.contact_id=?",
+        $id
+      );
+      while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) {
+        $results[$sql_arr['contactgroup_id']] = $sql_arr['name'];
       }
 
-    if (!$existing->count && !empty($a_insert_cols))
+      return $results;
+    }
+
+
+    /**
+     * Create a new contact record
+     *
+     * @param array Associative array with save data
+     * @return integer|boolean The created record ID on success, False on error
+     */
+    function insert($save_data, $check=false)
+    {
+        if (is_object($save_data) && is_a($save_data, rcube_result_set))
+            return $this->insert_recset($save_data, $check);
+
+        $insert_id = $existing = false;
+
+        if ($check)
+            $existing = $this->search('email', $save_data['email'], true, false);
+
+        $a_insert_cols = $a_insert_values = array();
+
+        foreach ($this->table_cols as $col)
+            if (isset($save_data[$col])) {
+                $a_insert_cols[]   = $this->db->quoteIdentifier($col);
+                $a_insert_values[] = $this->db->quote($save_data[$col]);
+            }
+
+        if (!$existing->count && !empty($a_insert_cols)) {
+            $this->db->query(
+                "INSERT INTO ".get_table_name($this->db_name).
+                " (user_id, changed, del, ".join(', ', $a_insert_cols).")".
+                " VALUES (".intval($this->user_id).", ".$this->db->now().", 0, ".join(', ', $a_insert_values).")"
+            );
+
+            $insert_id = $this->db->insert_id($this->db_name);
+        }
+
+        // also add the newly created contact to the active group
+        if ($insert_id && $this->group_id)
+            $this->add_to_group($this->group_id, $insert_id);
+
+        $this->cache = null;
+
+        return $insert_id;
+    }
+
+
+    /**
+     * Insert new contacts for each row in set
+     */
+    function insert_recset($result, $check=false)
+    {
+        $ids = array();
+        while ($row = $result->next()) {
+            if ($insert = $this->insert($row, $check))
+                $ids[] = $insert;
+        }
+        return $ids;
+    }
+
+
+    /**
+     * Update a specific contact record
+     *
+     * @param mixed Record identifier
+     * @param array Assoziative array with save data
+     * @return boolean True on success, False on error
+     */
+    function update($id, $save_cols)
     {
-      $this->db->query(
-        "INSERT INTO ".$this->db_name."
-         (user_id, changed, del, ".join(', ', $a_insert_cols).")
-         VALUES (".intval($this->user_id).", ".$this->db->now().", 0, ".join(', ', $a_insert_values).")"
+        $updated = false;
+        $write_sql = array();
+
+        foreach ($this->table_cols as $col)
+            if (isset($save_cols[$col]))
+                $write_sql[] = sprintf("%s=%s", $this->db->quoteIdentifier($col),
+                    $this->db->quote($save_cols[$col]));
+
+        if (!empty($write_sql)) {
+            $this->db->query(
+                "UPDATE ".get_table_name($this->db_name).
+                " SET changed=".$this->db->now().", ".join(', ', $write_sql).
+                " WHERE contact_id=?".
+                    " AND user_id=?".
+                    " AND del<>1",
+                $id,
+                $this->user_id
+            );
+
+            $updated = $this->db->affected_rows();
+        }
+
+        return $updated;
+    }
+
+
+    /**
+     * Mark one or more contact records as deleted
+     *
+     * @param array  Record identifiers
+     */
+    function delete($ids)
+    {
+        if (!is_array($ids))
+            $ids = explode(',', $ids);
+
+        $ids = $this->db->array2list($ids, 'integer');
+
+        // flag record as deleted
+        $this->db->query(
+            "UPDATE ".get_table_name($this->db_name).
+            " SET del=1, changed=".$this->db->now().
+            " WHERE user_id=?".
+                " AND contact_id IN ($ids)",
+            $this->user_id
         );
-        
-      $insert_id = $this->db->insert_id('contacts');
+
+        $this->cache = null;
+
+        return $this->db->affected_rows();
     }
 
-    return $insert_id;
-  }
+
+    /**
+     * Remove all records from the database
+     */
+    function delete_all()
+    {
+        $this->db->query("DELETE FROM ".get_table_name($this->db_name)." WHERE user_id = ?", $this->user_id);
+        $this->cache = null;
+        return $this->db->affected_rows();
+    }
 
 
-  /**
-   * Insert new contacts for each row in set
-   */
-  function insert_recset($result, $check=false)
-  {
-    $ids = array();
-    while ($row = $result->next())
+    /**
+     * Create a contact group with the given name
+     *
+     * @param string The group name
+     * @return mixed False on error, array with record props in success
+     */
+    function create_group($name)
     {
-      if ($insert = $this->insert($row, $check))
-        $ids[] = $insert;
+        $result = false;
+
+        // make sure we have a unique name
+        $name = $this->unique_groupname($name);
+
+        $this->db->query(
+            "INSERT INTO ".get_table_name($this->db_groups).
+            " (user_id, changed, name)".
+            " VALUES (".intval($this->user_id).", ".$this->db->now().", ".$this->db->quote($name).")"
+        );
+
+        if ($insert_id = $this->db->insert_id($this->db_groups))
+            $result = array('id' => $insert_id, 'name' => $name);
+
+        return $result;
     }
-    return $ids;
-  }
-  
-  
-  /**
-   * Update a specific contact record
-   *
-   * @param mixed Record identifier
-   * @param array Assoziative array with save data
-   * @return True on success, False on error
-   */
-  function update($id, $save_cols)
-  {
-    $updated = false;
-    $write_sql = array();
-    foreach ($this->table_cols as $col)
-      if (isset($save_cols[$col]))
-        $write_sql[] = sprintf("%s=%s", $this->db->quoteIdentifier($col), $this->db->quote($save_cols[$col]));
-
-    if (!empty($write_sql))
+
+
+    /**
+     * Delete the given group (and all linked group members)
+     *
+     * @param string Group identifier
+     * @return boolean True on success, false if no data was changed
+     */
+    function delete_group($gid)
+    {
+        // flag group record as deleted
+        $sql_result = $this->db->query(
+            "UPDATE ".get_table_name($this->db_groups).
+            " SET del=1, changed=".$this->db->now().
+            " WHERE contactgroup_id=?",
+            $gid
+        );
+
+        $this->cache = null;
+
+        return $this->db->affected_rows();
+    }
+
+
+    /**
+     * Rename a specific contact group
+     *
+     * @param string Group identifier
+     * @param string New name to set for this group
+     * @return boolean New name on success, false if no data was changed
+     */
+    function rename_group($gid, $newname)
+    {
+        // make sure we have a unique name
+        $name = $this->unique_groupname($newname);
+
+        $sql_result = $this->db->query(
+            "UPDATE ".get_table_name($this->db_groups).
+            " SET name=?, changed=".$this->db->now().
+            " WHERE contactgroup_id=?",
+            $name, $gid
+        );
+
+        return $this->db->affected_rows() ? $name : false;
+    }
+
+
+    /**
+     * Add the given contact records the a certain group
+     *
+     * @param string  Group identifier
+     * @param array   List of contact identifiers to be added
+     * @return int    Number of contacts added 
+     */
+    function add_to_group($group_id, $ids)
+    {
+        if (!is_array($ids))
+            $ids = explode(',', $ids);
+
+        $added = 0;
+        $exists = array();
+
+        // get existing assignments ...
+        $sql_result = $this->db->query(
+            "SELECT contact_id FROM ".get_table_name($this->db_groupmembers).
+            " WHERE contactgroup_id=?".
+                " AND contact_id IN (".$this->db->array2list($ids, 'integer').")",
+            $group_id
+        );
+        while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) {
+            $exists[] = $sql_arr['contact_id'];
+        }
+        // ... and remove them from the list
+        $ids = array_diff($ids, $exists);
+
+        foreach ($ids as $contact_id) {
+            $this->db->query(
+                "INSERT INTO ".get_table_name($this->db_groupmembers).
+                " (contactgroup_id, contact_id, created)".
+                " VALUES (?, ?, ".$this->db->now().")",
+                $group_id,
+                $contact_id
+            );
+
+            if (!$this->db->db_error)
+                $added++;
+        }
+
+        return $added;
+    }
+
+
+    /**
+     * Remove the given contact records from a certain group
+     *
+     * @param string  Group identifier
+     * @param array   List of contact identifiers to be removed
+     * @return int    Number of deleted group members
+     */
+    function remove_from_group($group_id, $ids)
+    {
+        if (!is_array($ids))
+            $ids = explode(',', $ids);
+
+        $ids = $this->db->array2list($ids, 'integer');
+
+        $sql_result = $this->db->query(
+            "DELETE FROM ".get_table_name($this->db_groupmembers).
+            " WHERE contactgroup_id=?".
+                " AND contact_id IN ($ids)",
+            $group_id
+        );
+
+        return $this->db->affected_rows();
+    }
+
+
+    /**
+     * Check for existing groups with the same name
+     *
+     * @param string Name to check
+     * @return string A group name which is unique for the current use
+     */
+    private function unique_groupname($name)
     {
-      $this->db->query(
-        "UPDATE ".$this->db_name."
-         SET    changed=".$this->db->now().", ".join(', ', $write_sql)."
-         WHERE  contact_id=?
-         AND    user_id=?
-         AND    del<>1",
-        $id,
-        $this->user_id);
-
-      $updated = $this->db->affected_rows();
+        $checkname = $name;
+        $num = 2; $hit = false;
+
+        do {
+            $sql_result = $this->db->query(
+                "SELECT 1 FROM ".get_table_name($this->db_groups).
+                " WHERE del<>1".
+                    " AND user_id=?".
+                    " AND name=?",
+                $this->user_id,
+                $checkname);
+
+            // append number to make name unique
+            if ($hit = $this->db->num_rows($sql_result))
+                $checkname = $name . ' ' . $num++;
+        } while ($hit > 0);
+
+        return $checkname;
     }
-    
-    return $updated;
-  }
-  
-  
-  /**
-   * Mark one or more contact records as deleted
-   *
-   * @param array  Record identifiers
-   */
-  function delete($ids)
-  {
-    if (is_array($ids))
-      $ids = join(',', $ids);
-
-    $this->db->query(
-      "UPDATE ".$this->db_name."
-       SET    del=1
-       WHERE  user_id=?
-       AND    contact_id IN (".$ids.")",
-      $this->user_id);
-
-    return $this->db->affected_rows();
-  }
-  
-  
-  /**
-   * Remove all records from the database
-   */
-  function delete_all()
-  {
-    $this->db->query("DELETE FROM {$this->db_name} WHERE user_id=?", $this->user_id);
-    return $this->db->affected_rows();
-  }
 
 }
index 6a197036bf1d8a3a8ca4458473feaf19875b2b8d..a3cec3f6c0619ae49648e9f784996307e0390f1c 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_html_page.php                                   |
  |                                                                       |
- | This file is part of the RoundCube PHP suite                          |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube PHP suite                          |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | CONTENTS:                                                             |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id:  $
+ $Id: rcube_html_page.php 4015 2010-09-29 16:47:05Z alec $
 
 */
 
@@ -39,6 +39,7 @@ class rcube_html_page
     protected $header = '';
     protected $footer = '';
     protected $body = '';
+    protected $base_path = '';
 
 
     /** Constructor */
@@ -55,7 +56,7 @@ class rcube_html_page
         static $sa_files = array();
         
         if (!preg_match('|^https?://|i', $file) && $file[0] != '/')
-          $file = $this->scripts_path . $file . (($fs = @filemtime($this->scripts_path . $file)) ? '?s='.$fs : '');
+            $file = $this->scripts_path . $file . (($fs = @filemtime($this->scripts_path . $file)) ? '?s='.$fs : '');
 
         if (in_array($file, $sa_files)) {
             return;
@@ -83,6 +84,8 @@ class rcube_html_page
 
     /**
      * Add HTML code to the page header
+     *
+     * @param string $str HTML code
      */
     public function add_header($str)
     {
@@ -92,6 +95,8 @@ class rcube_html_page
     /**
      * Add HTML code to the page footer
      * To be added right befor </body>
+     *
+     * @param string $str HTML code
      */
     public function add_footer($str)
     {
@@ -100,6 +105,8 @@ class rcube_html_page
 
     /**
      * Setter for page title
+     *
+     * @param string $t Page title
      */
     public function set_title($t)
     {
@@ -109,6 +116,8 @@ class rcube_html_page
     /**
      * Setter for output charset.
      * To be specified in a meta tag and sent as http-header
+     *
+     * @param string $charset Charset
      */
     public function set_charset($charset)
     {
@@ -117,6 +126,8 @@ class rcube_html_page
 
     /**
      * Getter for output charset
+     *
+     * @return string Output charset
      */
     public function get_charset()
     {
@@ -129,11 +140,11 @@ class rcube_html_page
     public function reset()
     {
         $this->script_files = array();
-        $this->scripts = array();
-        $this->title = '';
-        $this->header = '';
-        $this->footer = '';
-        $this->body = '';
+        $this->scripts      = array();
+        $this->title        = '';
+        $this->header       = '';
+        $this->footer       = '';
+        $this->body         = '';
     }
 
     /**
@@ -148,7 +159,7 @@ class rcube_html_page
 
         // set default page title
         if (empty($this->title)) {
-            $this->title = 'RoundCube Mail';
+            $this->title = 'Roundcube Mail';
         }
 
         // replace specialchars in content
@@ -196,14 +207,14 @@ class rcube_html_page
         }
 
         // find page header
-        if ($hpos = strpos(strtolower($output), '</head>')) {
+        if ($hpos = stripos($output, '</head>')) {
             $__page_header .= "\n";
         }
         else {
             if (!is_numeric($hpos)) {
-                $hpos = strpos(strtolower($output), '<body');
+                $hpos = stripos($output, '<body');
             }
-            if (!is_numeric($hpos) && ($hpos = strpos(strtolower($output), '<html'))) {
+            if (!is_numeric($hpos) && ($hpos = stripos($output, '<html'))) {
                 while ($output[$hpos] != '>') {
                     $hpos++;
                 }
@@ -221,14 +232,14 @@ class rcube_html_page
         }
 
         // find page body
-        if ($bpos = strpos(strtolower($output), '<body')) {
+        if ($bpos = stripos($output, '<body')) {
             while ($output[$bpos] != '>') {
                 $bpos++;
             }
             $bpos++;
         }
         else {
-            $bpos = strpos(strtolower($output), '</head>')+7;
+            $bpos = stripos($output, '</head>')+7;
         }
 
         // add page body
@@ -237,8 +248,7 @@ class rcube_html_page
         }
 
         // find and add page footer
-        $output_lc = strtolower($output);
-        if (($fpos = strrpos($output_lc, '</body>')) || ($fpos = strrpos($output_lc, '</html>'))) {
+        if (($fpos = strripos($output, '</body>')) || ($fpos = strripos($output, '</html>'))) {
             $output = substr($output, 0, $fpos) . "$__page_footer\n" . substr($output, $fpos);
         }
         else {
@@ -248,23 +258,37 @@ class rcube_html_page
         // reset those global vars
         $__page_header = $__page_footer = '';
 
+           $this->base_path = $base_path;
         // correct absolute paths in images and other tags
-        $output = preg_replace('!(src|href|background)=(["\']?)(/[a-z0-9_-]+)!i', "\\1=\\2$base_path\\3", $output);
-        $output = preg_replace_callback('!(src|href)=(["\']?)([a-z0-9/_.-]+.(css|js))(["\'\s>])!i', array($this, 'add_filemtime'), $output);
+           // add timestamp to .js and .css filename
+        $output = preg_replace_callback('!(src|href|background)=(["\']?)([a-z0-9/_.-]+)(["\'\s>])!i',
+           array($this, 'file_callback'), $output);
         $output = str_replace('$__skin_path', $base_path, $output);
 
         if ($this->charset != RCMAIL_CHARSET)
-           echo rcube_charset_convert($output, RCMAIL_CHARSET, $this->charset);
-       else
-           echo $output;
+               echo rcube_charset_convert($output, RCMAIL_CHARSET, $this->charset);
+           else
+               echo $output;
     }
     
     /**
      * Callback function for preg_replace_callback in write()
+     *
+     * @return string Parsed string
      */
-    public function add_filemtime($matches)
+    private function file_callback($matches)
     {
-        return sprintf("%s=%s%s?s=%d%s", $matches[1], $matches[2], $matches[3], @filemtime($matches[3]), $matches[5]);
+           $file = $matches[3];
+
+        // correct absolute paths
+           if ($file[0] == '/')
+               $file = $this->base_path . $file;
+
+        // add file modification timestamp
+           if (preg_match('/\.(js|css)$/', $file))
+           $file .= '?s=' . @filemtime($file);
+
+           return sprintf("%s=%s%s%s", $matches[1], $matches[2], $file, $matches[4]);
     }
 }
 
index 2a64c5d295d28f86d3290a4e7891895a72090d7d..e22bbfc579a99956fd91d7008a96d916e93c7ee3 100644 (file)
  +-----------------------------------------------------------------------+
  | program/include/rcube_imap.php                                        |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
- |   IMAP wrapper that implements the Iloha IMAP Library (IIL)           |
- |   See http://ilohamail.org/ for details                               |
+ |   IMAP Engine                                                         |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_imap.php 3048 2009-10-19 07:47:10Z alec $
+ $Id: rcube_imap.php 4389 2011-01-04 11:16:54Z alec $
 
 */
 
 
-/*
- * Obtain classes from the Iloha IMAP library
+/**
+ * Interface class for accessing an IMAP server
+ *
+ * @package    Mail
+ * @author     Thomas Bruederli <roundcube@gmail.com>
+ * @author     Aleksander Machniak <alec@alec.pl>
+ * @version    2.0
  */
-require_once('lib/imap.inc');
-require_once('lib/mime.inc');
-require_once('lib/tnef_decoder.inc');
+class rcube_imap
+{
+    public $debug_level = 1;
+    public $skip_deleted = false;
+    public $page_size = 10;
+    public $list_page = 1;
+    public $threading = false;
+    public $fetch_add_headers = '';
+    public $get_all_headers = false;
+
+    /**
+     * Instance of rcube_imap_generic
+     *
+     * @var rcube_imap_generic
+     */
+    public $conn;
+
+    /**
+     * Instance of rcube_mdb2
+     *
+     * @var rcube_mdb2
+     */
+    private $db;
+    private $mailbox = 'INBOX';
+    private $delimiter = NULL;
+    private $namespace = NULL;
+    private $sort_field = '';
+    private $sort_order = 'DESC';
+    private $caching_enabled = false;
+    private $default_charset = 'ISO-8859-1';
+    private $struct_charset = NULL;
+    private $default_folders = array('INBOX');
+    private $icache = array();
+    private $cache = array();
+    private $cache_keys = array();
+    private $cache_changes = array();
+    private $uid_id_map = array();
+    private $msg_headers = array();
+    public  $search_set = NULL;
+    public  $search_string = '';
+    private $search_charset = '';
+    private $search_sort_field = '';
+    private $search_threads = false;
+    private $search_sorted = false;
+    private $db_header_fields = array('idx', 'uid', 'subject', 'from', 'to', 'cc', 'date', 'size');
+    private $options = array('auth_method' => 'check');
+    private $host, $user, $pass, $port, $ssl;
+
+    /**
+     * All (additional) headers used (in any way) by Roundcube
+     * Not listed here: DATE, FROM, TO, SUBJECT, CONTENT-TYPE, LIST-POST
+     * (used for messages listing) are hardcoded in rcube_imap_generic::fetchHeaders()
+     *
+     * @var array
+     * @see rcube_imap::fetch_add_headers
+     */
+    private $all_headers = array(
+        'REPLY-TO',
+        'IN-REPLY-TO',
+        'CC',
+        'BCC',
+        'MESSAGE-ID',
+        'CONTENT-TRANSFER-ENCODING',
+        'REFERENCES',
+        'X-PRIORITY',
+        'X-DRAFT-INFO',
+        'MAIL-FOLLOWUP-TO',
+        'MAIL-REPLY-TO',
+        'RETURN-PATH',
+    );
+
+    const UNKNOWN       = 0;
+    const NOPERM        = 1;
+    const READONLY      = 2;
+    const TRYCREATE     = 3;
+    const INUSE         = 4;
+    const OVERQUOTA     = 5;
+    const ALREADYEXISTS = 6;
+    const NONEXISTENT   = 7;
+    const CONTACTADMIN  = 8;
+
+
+    /**
+     * Object constructor
+     *
+     * @param object DB Database connection
+     */
+    function __construct($db_conn)
+    {
+        $this->db = $db_conn;
+        $this->conn = new rcube_imap_generic();
+    }
+
+
+    /**
+     * Connect to an IMAP server
+     *
+     * @param  string   $host    Host to connect
+     * @param  string   $user    Username for IMAP account
+     * @param  string   $pass    Password for IMAP account
+     * @param  integer  $port    Port to connect to
+     * @param  string   $use_ssl SSL schema (either ssl or tls) or null if plain connection
+     * @return boolean  TRUE on success, FALSE on failure
+     * @access public
+     */
+    function connect($host, $user, $pass, $port=143, $use_ssl=null)
+    {
+        // check for OpenSSL support in PHP build
+        if ($use_ssl && extension_loaded('openssl'))
+            $this->options['ssl_mode'] = $use_ssl == 'imaps' ? 'ssl' : $use_ssl;
+        else if ($use_ssl) {
+            raise_error(array('code' => 403, 'type' => 'imap',
+                'file' => __FILE__, 'line' => __LINE__,
+                'message' => "OpenSSL not available"), true, false);
+            $port = 143;
+        }
+
+        $this->options['port'] = $port;
+
+        if ($this->options['debug'])
+            $this->conn->setDebug(true, array($this, 'debug_handler'));
+
+        $attempt = 0;
+        do {
+            $data = rcmail::get_instance()->plugins->exec_hook('imap_connect',
+                array('host' => $host, 'user' => $user, 'attempt' => ++$attempt));
+
+            if (!empty($data['pass']))
+                $pass = $data['pass'];
+
+            $this->conn->connect($data['host'], $data['user'], $pass, $this->options);
+        } while(!$this->conn->connected() && $data['retry']);
+
+        $this->host = $data['host'];
+        $this->user = $data['user'];
+        $this->pass = $pass;
+        $this->port = $port;
+        $this->ssl  = $use_ssl;
+
+        if ($this->conn->connected()) {
+            // get namespace and delimiter
+            $this->set_env();
+            return true;
+        }
+        // write error log
+        else if ($this->conn->error) {
+            if ($pass && $user) {
+                $message = sprintf("Login failed for %s from %s. %s",
+                    $user, rcmail_remote_ip(), $this->conn->error);
+
+                raise_error(array('code' => 403, 'type' => 'imap',
+                    'file' => __FILE__, 'line' => __LINE__,
+                    'message' => $message), true, false);
+            }
+        }
+
+        return false;
+    }
+
+
+    /**
+     * Close IMAP connection
+     * Usually done on script shutdown
+     *
+     * @access public
+     */
+    function close()
+    {
+        $this->conn->closeConnection();
+        $this->write_cache();
+    }
+
+
+    /**
+     * Close IMAP connection and re-connect
+     * This is used to avoid some strange socket errors when talking to Courier IMAP
+     *
+     * @access public
+     */
+    function reconnect()
+    {
+        $this->conn->closeConnection();
+        $connected = $this->connect($this->host, $this->user, $this->pass, $this->port, $this->ssl);
+
+        // issue SELECT command to restore connection status
+        if ($connected && strlen($this->mailbox))
+            $this->conn->select($this->mailbox);
+    }
+
+
+    /**
+     * Returns code of last error
+     *
+     * @return int Error code
+     */
+    function get_error_code()
+    {
+        return $this->conn->errornum;
+    }
+
+
+    /**
+     * Returns message of last error
+     *
+     * @return string Error message
+     */
+    function get_error_str()
+    {
+        return $this->conn->error;
+    }
+
+
+    /**
+     * Returns code of last command response
+     *
+     * @return int Response code
+     */
+    function get_response_code()
+    {
+        switch ($this->conn->resultcode) {
+            case 'NOPERM':
+                return self::NOPERM;
+            case 'READ-ONLY':
+                return self::READONLY;
+            case 'TRYCREATE':
+                return self::TRYCREATE;
+            case 'INUSE':
+                return self::INUSE;
+            case 'OVERQUOTA':
+                return self::OVERQUOTA;
+            case 'ALREADYEXISTS':
+                return self::ALREADYEXISTS;
+            case 'NONEXISTENT':
+                return self::NONEXISTENT;
+            case 'CONTACTADMIN':
+                return self::CONTACTADMIN;
+            default:
+                return self::UNKNOWN;
+        }
+    }
+
+
+    /**
+     * Returns last command response
+     *
+     * @return string Response
+     */
+    function get_response_str()
+    {
+        return $this->conn->result;
+    }
+
+
+    /**
+     * Set options to be used in rcube_imap_generic::connect()
+     *
+     * @param array $opt Options array
+     */
+    function set_options($opt)
+    {
+        $this->options = array_merge($this->options, (array)$opt);
+    }
+
+
+    /**
+     * Set default message charset
+     *
+     * This will be used for message decoding if a charset specification is not available
+     *
+     * @param  string $cs Charset string
+     * @access public
+     */
+    function set_charset($cs)
+    {
+        $this->default_charset = $cs;
+    }
+
+
+    /**
+     * This list of folders will be listed above all other folders
+     *
+     * @param  array $arr Indexed list of folder names
+     * @access public
+     */
+    function set_default_mailboxes($arr)
+    {
+        if (is_array($arr)) {
+            $this->default_folders = $arr;
+
+            // add inbox if not included
+            if (!in_array('INBOX', $this->default_folders))
+                array_unshift($this->default_folders, 'INBOX');
+        }
+    }
+
+
+    /**
+     * Set internal mailbox reference.
+     *
+     * All operations will be perfomed on this mailbox/folder
+     *
+     * @param  string $new_mbox Mailbox/Folder name
+     * @access public
+     */
+    function set_mailbox($new_mbox)
+    {
+        $mailbox = $this->mod_mailbox($new_mbox);
+
+        if ($this->mailbox == $mailbox)
+            return;
+
+        $this->mailbox = $mailbox;
+
+        // clear messagecount cache for this mailbox
+        $this->_clear_messagecount($mailbox);
+    }
+
+
+    /**
+     * Forces selection of a mailbox
+     *
+     * @param  string $mailbox Mailbox/Folder name
+     * @access public
+     */
+    function select_mailbox($mailbox=null)
+    {
+        $mailbox = strlen($mailbox) ? $this->mod_mailbox($mailbox) : $this->mailbox;
+
+        $selected = $this->conn->select($mailbox);
+
+        if ($selected && $this->mailbox != $mailbox) {
+            // clear messagecount cache for this mailbox
+            $this->_clear_messagecount($mailbox);
+            $this->mailbox = $mailbox;
+        }
+    }
+
+
+    /**
+     * Set internal list page
+     *
+     * @param  number $page Page number to list
+     * @access public
+     */
+    function set_page($page)
+    {
+        $this->list_page = (int)$page;
+    }
+
+
+    /**
+     * Set internal page size
+     *
+     * @param  number $size Number of messages to display on one page
+     * @access public
+     */
+    function set_pagesize($size)
+    {
+        $this->page_size = (int)$size;
+    }
+
+
+    /**
+     * Save a set of message ids for future message listing methods
+     *
+     * @param  string  IMAP Search query
+     * @param  array   List of message ids or NULL if empty
+     * @param  string  Charset of search string
+     * @param  string  Sorting field
+     * @param  string  True if set is sorted (SORT was used for searching)
+     */
+    function set_search_set($str=null, $msgs=null, $charset=null, $sort_field=null, $threads=false, $sorted=false)
+    {
+        if (is_array($str) && $msgs == null)
+            list($str, $msgs, $charset, $sort_field, $threads) = $str;
+        if ($msgs === false)
+            $msgs = array();
+        else if ($msgs != null && !is_array($msgs))
+            $msgs = explode(',', $msgs);
+
+        $this->search_string     = $str;
+        $this->search_set        = $msgs;
+        $this->search_charset    = $charset;
+        $this->search_sort_field = $sort_field;
+        $this->search_threads    = $threads;
+        $this->search_sorted     = $sorted;
+    }
+
+
+    /**
+     * Return the saved search set as hash array
+     * @return array Search set
+     */
+    function get_search_set()
+    {
+        return array($this->search_string,
+               $this->search_set,
+               $this->search_charset,
+               $this->search_sort_field,
+               $this->search_threads,
+               $this->search_sorted,
+           );
+    }
+
+
+    /**
+     * Returns the currently used mailbox name
+     *
+     * @return  string Name of the mailbox/folder
+     * @access  public
+     */
+    function get_mailbox_name()
+    {
+        return $this->conn->connected() ? $this->mod_mailbox($this->mailbox, 'out') : '';
+    }
+
+
+    /**
+     * Returns the IMAP server's capability
+     *
+     * @param   string  $cap Capability name
+     * @return  mixed   Capability value or TRUE if supported, FALSE if not
+     * @access  public
+     */
+    function get_capability($cap)
+    {
+        return $this->conn->getCapability(strtoupper($cap));
+    }
+
+
+    /**
+     * Sets threading flag to the best supported THREAD algorithm
+     *
+     * @param  boolean  $enable TRUE to enable and FALSE
+     * @return string   Algorithm or false if THREAD is not supported
+     * @access public
+     */
+    function set_threading($enable=false)
+    {
+        $this->threading = false;
+
+        if ($enable && ($caps = $this->get_capability('THREAD'))) {
+            if (in_array('REFS', $caps))
+                $this->threading = 'REFS';
+            else if (in_array('REFERENCES', $caps))
+                $this->threading = 'REFERENCES';
+            else if (in_array('ORDEREDSUBJECT', $caps))
+                $this->threading = 'ORDEREDSUBJECT';
+        }
+
+        return $this->threading;
+    }
+
+
+    /**
+     * Checks the PERMANENTFLAGS capability of the current mailbox
+     * and returns true if the given flag is supported by the IMAP server
+     *
+     * @param   string  $flag Permanentflag name
+     * @return  boolean True if this flag is supported
+     * @access  public
+     */
+    function check_permflag($flag)
+    {
+        $flag = strtoupper($flag);
+        $imap_flag = $this->conn->flags[$flag];
+        return (in_array_nocase($imap_flag, $this->conn->data['PERMANENTFLAGS']));
+    }
+
+
+    /**
+     * Returns the delimiter that is used by the IMAP server for folder separation
+     *
+     * @return  string  Delimiter string
+     * @access  public
+     */
+    function get_hierarchy_delimiter()
+    {
+        return $this->delimiter;
+    }
+
+
+    /**
+     * Get namespace
+     *
+     * @return  array  Namespace data
+     * @access  public
+     */
+    function get_namespace()
+    {
+        return $this->namespace;
+    }
+
+
+    /**
+     * Sets delimiter and namespaces
+     *
+     * @access private
+     */
+    private function set_env()
+    {
+        if ($this->delimiter !== null && $this->namespace !== null) {
+            return;
+        }
+
+        if (isset($_SESSION['imap_namespace']) && isset($_SESSION['imap_delimiter'])) {
+            $this->namespace = $_SESSION['imap_namespace'];
+            $this->delimiter = $_SESSION['imap_delimiter'];
+            return;
+        }
+
+        $config = rcmail::get_instance()->config;
+        $imap_personal  = $config->get('imap_ns_personal');
+        $imap_other     = $config->get('imap_ns_other');
+        $imap_shared    = $config->get('imap_ns_shared');
+        $imap_delimiter = $config->get('imap_delimiter');
+
+        if (!$this->conn->connected())
+            return;
+
+        $ns = $this->conn->getNamespace();
+
+        // Set namespaces (NAMESPACE supported)
+        if (is_array($ns)) {
+            $this->namespace = $ns;
+        }
+        else {
+            $this->namespace = array(
+                'personal' => NULL,
+                'other'    => NULL,
+                'shared'   => NULL,
+            );
+        }
+
+        if ($imap_delimiter) {
+            $this->delimiter = $imap_delimiter;
+        }
+        if (empty($this->delimiter)) {
+            $this->delimiter = $this->namespace['personal'][0][1];
+        }
+        if (empty($this->delimiter)) {
+            $this->delimiter = $this->conn->getHierarchyDelimiter();
+        }
+        if (empty($this->delimiter)) {
+            $this->delimiter = '/';
+        }
+
+        // Overwrite namespaces
+        if ($imap_personal !== null) {
+            $this->namespace['personal'] = NULL;
+            foreach ((array)$imap_personal as $dir) {
+                $this->namespace['personal'][] = array($dir, $this->delimiter);
+            }
+        }
+        if ($imap_other !== null) {
+            $this->namespace['other'] = NULL;
+            foreach ((array)$imap_other as $dir) {
+                if ($dir) {
+                    $this->namespace['other'][] = array($dir, $this->delimiter);
+                }
+            }
+        }
+        if ($imap_shared !== null) {
+            $this->namespace['shared'] = NULL;
+            foreach ((array)$imap_shared as $dir) {
+                if ($dir) {
+                    $this->namespace['shared'][] = array($dir, $this->delimiter);
+                }
+            }
+        }
+
+        $_SESSION['imap_namespace'] = $this->namespace;
+        $_SESSION['imap_delimiter'] = $this->delimiter;
+    }
+
+
+    /**
+     * Get message count for a specific mailbox
+     *
+     * @param  string  $mbox_name Mailbox/folder name
+     * @param  string  $mode      Mode for count [ALL|THREADS|UNSEEN|RECENT]
+     * @param  boolean $force     Force reading from server and update cache
+     * @param  boolean $status    Enables storing folder status info (max UID/count),
+     *                            required for mailbox_status()
+     * @return int     Number of messages
+     * @access public
+     */
+    function messagecount($mbox_name='', $mode='ALL', $force=false, $status=true)
+    {
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+        return $this->_messagecount($mailbox, $mode, $force, $status);
+    }
+
+
+    /**
+     * Private method for getting nr of messages
+     *
+     * @param string  $mailbox Mailbox name
+     * @param string  $mode    Mode for count [ALL|THREADS|UNSEEN|RECENT]
+     * @param boolean $force   Force reading from server and update cache
+     * @param boolean $status  Enables storing folder status info (max UID/count),
+     *                         required for mailbox_status()
+     * @return int Number of messages
+     * @access  private
+     * @see     rcube_imap::messagecount()
+     */
+    private function _messagecount($mailbox='', $mode='ALL', $force=false, $status=true)
+    {
+        $mode = strtoupper($mode);
+
+        if (!strlen($mailbox))
+            $mailbox = $this->mailbox;
+
+        // count search set
+        if ($this->search_string && $mailbox == $this->mailbox && ($mode == 'ALL' || $mode == 'THREADS') && !$force) {
+            if ($this->search_threads)
+                return $mode == 'ALL' ? count((array)$this->search_set['depth']) : count((array)$this->search_set['tree']);
+            else
+                return count((array)$this->search_set);
+        }
+
+        $a_mailbox_cache = $this->get_cache('messagecount');
+
+        // return cached value
+        if (!$force && is_array($a_mailbox_cache[$mailbox]) && isset($a_mailbox_cache[$mailbox][$mode]))
+            return $a_mailbox_cache[$mailbox][$mode];
+
+        if (!is_array($a_mailbox_cache[$mailbox]))
+            $a_mailbox_cache[$mailbox] = array();
+
+        if ($mode == 'THREADS') {
+            $res   = $this->_threadcount($mailbox, $msg_count);
+            $count = $res['count'];
+
+            if ($status) {
+                $this->set_folder_stats($mailbox, 'cnt', $res['msgcount']);
+                $this->set_folder_stats($mailbox, 'maxuid', $res['maxuid'] ? $this->_id2uid($res['maxuid'], $mailbox) : 0);
+            }
+        }
+        // RECENT count is fetched a bit different
+        else if ($mode == 'RECENT') {
+            $count = $this->conn->countRecent($mailbox);
+        }
+        // use SEARCH for message counting
+        else if ($this->skip_deleted) {
+            $search_str = "ALL UNDELETED";
+            $keys       = array('COUNT');
+            $need_uid   = false;
+
+            if ($mode == 'UNSEEN') {
+                $search_str .= " UNSEEN";
+            }
+            else {
+                if ($this->caching_enabled) {
+                    $keys[] = 'ALL';
+                }
+                if ($status) {
+                    $keys[]   = 'MAX';
+                    $need_uid = true;
+                }
+            }
+
+            // get message count using (E)SEARCH
+            // not very performant but more precise (using UNDELETED)
+            $index = $this->conn->search($mailbox, $search_str, $need_uid, $keys);
+
+            $count = is_array($index) ? $index['COUNT'] : 0;
+
+            if ($mode == 'ALL') {
+                if ($need_uid && $this->caching_enabled) {
+                    // Save messages index for check_cache_status()
+                    $this->icache['all_undeleted_idx'] = $index['ALL'];
+                }
+                if ($status) {
+                    $this->set_folder_stats($mailbox, 'cnt', $count);
+                    $this->set_folder_stats($mailbox, 'maxuid', is_array($index) ? $index['MAX'] : 0);
+                }
+            }
+        }
+        else {
+            if ($mode == 'UNSEEN')
+                $count = $this->conn->countUnseen($mailbox);
+            else {
+                $count = $this->conn->countMessages($mailbox);
+                if ($status) {
+                    $this->set_folder_stats($mailbox,'cnt', $count);
+                    $this->set_folder_stats($mailbox, 'maxuid', $count ? $this->_id2uid($count, $mailbox) : 0);
+                }
+            }
+        }
+
+        $a_mailbox_cache[$mailbox][$mode] = (int)$count;
+
+        // write back to cache
+        $this->update_cache('messagecount', $a_mailbox_cache);
+
+        return (int)$count;
+    }
+
+
+    /**
+     * Private method for getting nr of threads
+     *
+     * @param string $mailbox   Folder name
+     *
+     * @returns array Array containing items: 'count' - threads count,
+     *                'msgcount' = messages count, 'maxuid' = max. UID in the set
+     * @access  private
+     */
+    private function _threadcount($mailbox)
+    {
+        $result = array();
+
+        if (!empty($this->icache['threads'])) {
+            $dcount = count($this->icache['threads']['depth']);
+            $result = array(
+                'count'    => count($this->icache['threads']['tree']),
+                'msgcount' => $dcount,
+                'maxuid'   => $dcount ? max(array_keys($this->icache['threads']['depth'])) : 0,
+            );
+        }
+        else if (is_array($result = $this->_fetch_threads($mailbox))) {
+            $dcount = count($result[1]);
+            $result = array(
+                'count'    => count($result[0]),
+                'msgcount' => $dcount,
+                'maxuid'   => $dcount ? max(array_keys($result[1])) : 0,
+            );
+        }
+
+        return $result;
+    }
+
+
+    /**
+     * Public method for listing headers
+     * convert mailbox name with root dir first
+     *
+     * @param   string   $mbox_name  Mailbox/folder name
+     * @param   int      $page       Current page to list
+     * @param   string   $sort_field Header field to sort by
+     * @param   string   $sort_order Sort order [ASC|DESC]
+     * @param   int      $slice      Number of slice items to extract from result array
+     * @return  array    Indexed array with message header objects
+     * @access  public
+     */
+    function list_headers($mbox_name='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $slice=0)
+    {
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+        return $this->_list_headers($mailbox, $page, $sort_field, $sort_order, false, $slice);
+    }
+
+
+    /**
+     * Private method for listing message headers
+     *
+     * @param   string   $mailbox    Mailbox name
+     * @param   int      $page       Current page to list
+     * @param   string   $sort_field Header field to sort by
+     * @param   string   $sort_order Sort order [ASC|DESC]
+     * @param   int      $slice      Number of slice items to extract from result array
+     * @return  array    Indexed array with message header objects
+     * @access  private
+     * @see     rcube_imap::list_headers
+     */
+    private function _list_headers($mailbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $recursive=false, $slice=0)
+    {
+        if (!strlen($mailbox))
+            return array();
+
+        // use saved message set
+        if ($this->search_string && $mailbox == $this->mailbox)
+            return $this->_list_header_set($mailbox, $page, $sort_field, $sort_order, $slice);
+
+        if ($this->threading)
+            return $this->_list_thread_headers($mailbox, $page, $sort_field, $sort_order, $recursive, $slice);
+
+        $this->_set_sort_order($sort_field, $sort_order);
+
+        $page         = $page ? $page : $this->list_page;
+        $cache_key    = $mailbox.'.msg';
+
+        if ($this->caching_enabled) {
+            // cache is OK, we can get messages from local cache
+            // (assume cache is in sync when in recursive mode)
+            if ($recursive || $this->check_cache_status($mailbox, $cache_key)>0) {
+                $start_msg = ($page-1) * $this->page_size;
+                $a_msg_headers = $this->get_message_cache($cache_key, $start_msg,
+                    $start_msg+$this->page_size, $this->sort_field, $this->sort_order);
+                $result = array_values($a_msg_headers);
+                if ($slice)
+                    $result = array_slice($result, -$slice, $slice);
+                return $result;
+            }
+            // cache is incomplete, sync it (all messages in the folder)
+            else if (!$recursive) {
+                $this->sync_header_index($mailbox);
+                return $this->_list_headers($mailbox, $page, $this->sort_field, $this->sort_order, true, $slice);
+            }
+        }
+
+        // retrieve headers from IMAP
+        $a_msg_headers = array();
+
+        // use message index sort as default sorting (for better performance)
+        if (!$this->sort_field) {
+            if ($this->skip_deleted) {
+                // @TODO: this could be cached
+                if ($msg_index = $this->_search_index($mailbox, 'ALL UNDELETED')) {
+                    $max = max($msg_index);
+                    list($begin, $end) = $this->_get_message_range(count($msg_index), $page);
+                    $msg_index = array_slice($msg_index, $begin, $end-$begin);
+                }
+            }
+            else if ($max = $this->conn->countMessages($mailbox)) {
+                list($begin, $end) = $this->_get_message_range($max, $page);
+                $msg_index = range($begin+1, $end);
+            }
+            else
+                $msg_index = array();
+
+            if ($slice && $msg_index)
+                $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice);
+
+            // fetch reqested headers from server
+            if ($msg_index)
+                $this->_fetch_headers($mailbox, join(",", $msg_index), $a_msg_headers, $cache_key);
+        }
+        // use SORT command
+        else if ($this->get_capability('SORT') &&
+            // Courier-IMAP provides SORT capability but allows to disable it by admin (#1486959)
+            ($msg_index = $this->conn->sort($mailbox, $this->sort_field, $this->skip_deleted ? 'UNDELETED' : '')) !== false
+        ) {
+            if (!empty($msg_index)) {
+                list($begin, $end) = $this->_get_message_range(count($msg_index), $page);
+                $max = max($msg_index);
+                $msg_index = array_slice($msg_index, $begin, $end-$begin);
+
+                if ($slice)
+                    $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice);
+
+                // fetch reqested headers from server
+                $this->_fetch_headers($mailbox, join(',', $msg_index), $a_msg_headers, $cache_key);
+            }
+        }
+        // fetch specified header for all messages and sort
+        else if ($a_index = $this->conn->fetchHeaderIndex($mailbox, "1:*", $this->sort_field, $this->skip_deleted)) {
+            asort($a_index); // ASC
+            $msg_index = array_keys($a_index);
+            $max = max($msg_index);
+            list($begin, $end) = $this->_get_message_range(count($msg_index), $page);
+            $msg_index = array_slice($msg_index, $begin, $end-$begin);
+
+            if ($slice)
+                $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice);
+
+            // fetch reqested headers from server
+            $this->_fetch_headers($mailbox, join(",", $msg_index), $a_msg_headers, $cache_key);
+        }
+
+        // delete cached messages with a higher index than $max+1
+        // Changed $max to $max+1 to fix this bug : #1484295
+        $this->clear_message_cache($cache_key, $max + 1);
+
+        // kick child process to sync cache
+        // ...
+
+        // return empty array if no messages found
+        if (!is_array($a_msg_headers) || empty($a_msg_headers))
+            return array();
+
+        // use this class for message sorting
+        $sorter = new rcube_header_sorter();
+        $sorter->set_sequence_numbers($msg_index);
+        $sorter->sort_headers($a_msg_headers);
+
+        if ($this->sort_order == 'DESC')
+            $a_msg_headers = array_reverse($a_msg_headers);
+
+        return array_values($a_msg_headers);
+    }
+
+
+    /**
+     * Private method for listing message headers using threads
+     *
+     * @param   string   $mailbox    Mailbox/folder name
+     * @param   int      $page       Current page to list
+     * @param   string   $sort_field Header field to sort by
+     * @param   string   $sort_order Sort order [ASC|DESC]
+     * @param   boolean  $recursive  True if called recursively
+     * @param   int      $slice      Number of slice items to extract from result array
+     * @return  array    Indexed array with message header objects
+     * @access  private
+     * @see     rcube_imap::list_headers
+     */
+    private function _list_thread_headers($mailbox, $page=NULL, $sort_field=NULL, $sort_order=NULL, $recursive=false, $slice=0)
+    {
+        $this->_set_sort_order($sort_field, $sort_order);
+
+        $page = $page ? $page : $this->list_page;
+//    $cache_key = $mailbox.'.msg';
+//    $cache_status = $this->check_cache_status($mailbox, $cache_key);
+
+        // get all threads (default sort order)
+        list ($thread_tree, $msg_depth, $has_children) = $this->_fetch_threads($mailbox);
+
+        if (empty($thread_tree))
+            return array();
+
+        $msg_index = $this->_sort_threads($mailbox, $thread_tree);
+
+        return $this->_fetch_thread_headers($mailbox,
+            $thread_tree, $msg_depth, $has_children, $msg_index, $page, $slice);
+    }
+
+
+    /**
+     * Private method for fetching threads data
+     *
+     * @param   string   $mailbox Mailbox/folder name
+     * @return  array    Array with thread data
+     * @access  private
+     */
+    private function _fetch_threads($mailbox)
+    {
+        if (empty($this->icache['threads'])) {
+            // get all threads
+            $result = $this->conn->thread($mailbox, $this->threading,
+                $this->skip_deleted ? 'UNDELETED' : '');
+
+            // add to internal (fast) cache
+            $this->icache['threads'] = array();
+            $this->icache['threads']['tree'] = is_array($result) ? $result[0] : array();
+            $this->icache['threads']['depth'] = is_array($result) ? $result[1] : array();
+            $this->icache['threads']['has_children'] = is_array($result) ? $result[2] : array();
+        }
+
+        return array(
+            $this->icache['threads']['tree'],
+            $this->icache['threads']['depth'],
+            $this->icache['threads']['has_children'],
+        );
+    }
+
+
+    /**
+     * Private method for fetching threaded messages headers
+     *
+     * @param string  $mailbox      Mailbox name
+     * @param array   $thread_tree  Thread tree data
+     * @param array   $msg_depth    Thread depth data
+     * @param array   $has_children Thread children data
+     * @param array   $msg_index    Messages index
+     * @param int     $page         List page number
+     * @param int     $slice        Number of threads to slice
+     * @return array  Messages headers
+     * @access  private
+     */
+    private function _fetch_thread_headers($mailbox, $thread_tree, $msg_depth, $has_children, $msg_index, $page, $slice=0)
+    {
+        $cache_key = $mailbox.'.msg';
+        // now get IDs for current page
+        list($begin, $end) = $this->_get_message_range(count($msg_index), $page);
+        $msg_index = array_slice($msg_index, $begin, $end-$begin);
+
+        if ($slice)
+            $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice);
+
+        if ($this->sort_order == 'DESC')
+            $msg_index = array_reverse($msg_index);
+
+        // flatten threads array
+        // @TODO: fetch children only in expanded mode (?)
+        $all_ids = array();
+        foreach ($msg_index as $root) {
+            $all_ids[] = $root;
+            if (!empty($thread_tree[$root]))
+                $all_ids = array_merge($all_ids, array_keys_recursive($thread_tree[$root]));
+        }
+
+        // fetch reqested headers from server
+        $this->_fetch_headers($mailbox, $all_ids, $a_msg_headers, $cache_key);
+
+        // return empty array if no messages found
+        if (!is_array($a_msg_headers) || empty($a_msg_headers))
+            return array();
+
+        // use this class for message sorting
+        $sorter = new rcube_header_sorter();
+        $sorter->set_sequence_numbers($all_ids);
+        $sorter->sort_headers($a_msg_headers);
+
+        // Set depth, has_children and unread_children fields in headers
+        $this->_set_thread_flags($a_msg_headers, $msg_depth, $has_children);
+
+        return array_values($a_msg_headers);
+    }
+
+
+    /**
+     * Private method for setting threaded messages flags:
+     * depth, has_children and unread_children
+     *
+     * @param  array  $headers      Reference to headers array indexed by message ID
+     * @param  array  $msg_depth    Array of messages depth indexed by message ID
+     * @param  array  $msg_children Array of messages children flags indexed by message ID
+     * @return array   Message headers array indexed by message ID
+     * @access private
+     */
+    private function _set_thread_flags(&$headers, $msg_depth, $msg_children)
+    {
+        $parents = array();
+
+        foreach ($headers as $idx => $header) {
+            $id = $header->id;
+            $depth = $msg_depth[$id];
+            $parents = array_slice($parents, 0, $depth);
+
+            if (!empty($parents)) {
+                $headers[$idx]->parent_uid = end($parents);
+                if (!$header->seen)
+                    $headers[$parents[0]]->unread_children++;
+            }
+            array_push($parents, $header->uid);
+
+            $headers[$idx]->depth = $depth;
+            $headers[$idx]->has_children = $msg_children[$id];
+        }
+    }
+
+
+    /**
+     * Private method for listing a set of message headers (search results)
+     *
+     * @param   string   $mailbox    Mailbox/folder name
+     * @param   int      $page       Current page to list
+     * @param   string   $sort_field Header field to sort by
+     * @param   string   $sort_order Sort order [ASC|DESC]
+     * @param   int  $slice      Number of slice items to extract from result array
+     * @return  array    Indexed array with message header objects
+     * @access  private
+     * @see     rcube_imap::list_header_set()
+     */
+    private function _list_header_set($mailbox, $page=NULL, $sort_field=NULL, $sort_order=NULL, $slice=0)
+    {
+        if (!strlen($mailbox) || empty($this->search_set))
+            return array();
+
+        // use saved messages from searching
+        if ($this->threading)
+            return $this->_list_thread_header_set($mailbox, $page, $sort_field, $sort_order, $slice);
+
+        // search set is threaded, we need a new one
+        if ($this->search_threads) {
+            if (empty($this->search_set['tree']))
+                return array();
+            $this->search('', $this->search_string, $this->search_charset, $sort_field);
+        }
+
+        $msgs = $this->search_set;
+        $a_msg_headers = array();
+        $page = $page ? $page : $this->list_page;
+        $start_msg = ($page-1) * $this->page_size;
+
+        $this->_set_sort_order($sort_field, $sort_order);
+
+        // quickest method (default sorting)
+        if (!$this->search_sort_field && !$this->sort_field) {
+            if ($sort_order == 'DESC')
+                $msgs = array_reverse($msgs);
+
+            // get messages uids for one page
+            $msgs = array_slice(array_values($msgs), $start_msg, min(count($msgs)-$start_msg, $this->page_size));
+
+            if ($slice)
+                $msgs = array_slice($msgs, -$slice, $slice);
+
+            // fetch headers
+            $this->_fetch_headers($mailbox, join(',',$msgs), $a_msg_headers, NULL);
+
+            // I didn't found in RFC that FETCH always returns messages sorted by index
+            $sorter = new rcube_header_sorter();
+            $sorter->set_sequence_numbers($msgs);
+            $sorter->sort_headers($a_msg_headers);
+
+            return array_values($a_msg_headers);
+        }
+
+        // sorted messages, so we can first slice array and then fetch only wanted headers
+        if ($this->search_sorted) { // SORT searching result
+            // reset search set if sorting field has been changed
+            if ($this->sort_field && $this->search_sort_field != $this->sort_field)
+                $msgs = $this->search('', $this->search_string, $this->search_charset, $this->sort_field);
+
+            // return empty array if no messages found
+            if (empty($msgs))
+                return array();
+
+            if ($sort_order == 'DESC')
+                $msgs = array_reverse($msgs);
+
+            // get messages uids for one page
+            $msgs = array_slice(array_values($msgs), $start_msg, min(count($msgs)-$start_msg, $this->page_size));
+
+            if ($slice)
+                $msgs = array_slice($msgs, -$slice, $slice);
+
+            // fetch headers
+            $this->_fetch_headers($mailbox, join(',',$msgs), $a_msg_headers, NULL);
+
+            $sorter = new rcube_header_sorter();
+            $sorter->set_sequence_numbers($msgs);
+            $sorter->sort_headers($a_msg_headers);
+
+            return array_values($a_msg_headers);
+        }
+        else { // SEARCH result, need sorting
+            $cnt = count($msgs);
+            // 300: experimantal value for best result
+            if (($cnt > 300 && $cnt > $this->page_size) || !$this->sort_field) {
+                // use memory less expensive (and quick) method for big result set
+                $a_index = $this->message_index('', $this->sort_field, $this->sort_order);
+                // get messages uids for one page...
+                $msgs = array_slice($a_index, $start_msg, min($cnt-$start_msg, $this->page_size));
+                if ($slice)
+                    $msgs = array_slice($msgs, -$slice, $slice);
+                // ...and fetch headers
+                $this->_fetch_headers($mailbox, join(',', $msgs), $a_msg_headers, NULL);
+
+                // return empty array if no messages found
+                if (!is_array($a_msg_headers) || empty($a_msg_headers))
+                    return array();
+
+                $sorter = new rcube_header_sorter();
+                $sorter->set_sequence_numbers($msgs);
+                $sorter->sort_headers($a_msg_headers);
+
+                return array_values($a_msg_headers);
+            }
+            else {
+                // for small result set we can fetch all messages headers
+                $this->_fetch_headers($mailbox, join(',', $msgs), $a_msg_headers, NULL);
+
+                // return empty array if no messages found
+                if (!is_array($a_msg_headers) || empty($a_msg_headers))
+                    return array();
+
+                // if not already sorted
+                $a_msg_headers = $this->conn->sortHeaders(
+                    $a_msg_headers, $this->sort_field, $this->sort_order);
+
+                // only return the requested part of the set
+                $a_msg_headers = array_slice(array_values($a_msg_headers),
+                    $start_msg, min($cnt-$start_msg, $this->page_size));
+
+                if ($slice)
+                    $a_msg_headers = array_slice($a_msg_headers, -$slice, $slice);
+
+                return $a_msg_headers;
+            }
+        }
+    }
+
+
+    /**
+     * Private method for listing a set of threaded message headers (search results)
+     *
+     * @param   string   $mailbox    Mailbox/folder name
+     * @param   int      $page       Current page to list
+     * @param   string   $sort_field Header field to sort by
+     * @param   string   $sort_order Sort order [ASC|DESC]
+     * @param   int      $slice      Number of slice items to extract from result array
+     * @return  array    Indexed array with message header objects
+     * @access  private
+     * @see     rcube_imap::list_header_set()
+     */
+    private function _list_thread_header_set($mailbox, $page=NULL, $sort_field=NULL, $sort_order=NULL, $slice=0)
+    {
+        // update search_set if previous data was fetched with disabled threading
+        if (!$this->search_threads) {
+            if (empty($this->search_set))
+                return array();
+            $this->search('', $this->search_string, $this->search_charset, $sort_field);
+        }
+
+        // empty result
+        if (empty($this->search_set['tree']))
+            return array();
+
+        $thread_tree = $this->search_set['tree'];
+        $msg_depth = $this->search_set['depth'];
+        $has_children = $this->search_set['children'];
+        $a_msg_headers = array();
+
+        $page = $page ? $page : $this->list_page;
+        $start_msg = ($page-1) * $this->page_size;
+
+        $this->_set_sort_order($sort_field, $sort_order);
+
+        $msg_index = $this->_sort_threads($mailbox, $thread_tree, array_keys($msg_depth));
+
+        return $this->_fetch_thread_headers($mailbox,
+            $thread_tree, $msg_depth, $has_children, $msg_index, $page, $slice=0);
+    }
+
+
+    /**
+     * Helper function to get first and last index of the requested set
+     *
+     * @param  int     $max  Messages count
+     * @param  mixed   $page Page number to show, or string 'all'
+     * @return array   Array with two values: first index, last index
+     * @access private
+     */
+    private function _get_message_range($max, $page)
+    {
+        $start_msg = ($page-1) * $this->page_size;
+
+        if ($page=='all') {
+            $begin  = 0;
+            $end    = $max;
+        }
+        else if ($this->sort_order=='DESC') {
+            $begin  = $max - $this->page_size - $start_msg;
+            $end    = $max - $start_msg;
+        }
+        else {
+            $begin  = $start_msg;
+            $end    = $start_msg + $this->page_size;
+        }
+
+        if ($begin < 0) $begin = 0;
+        if ($end < 0) $end = $max;
+        if ($end > $max) $end = $max;
+
+        return array($begin, $end);
+    }
+
+
+    /**
+     * Fetches message headers (used for loop)
+     *
+     * @param  string  $mailbox       Mailbox name
+     * @param  string  $msgs          Message index to fetch
+     * @param  array   $a_msg_headers Reference to message headers array
+     * @param  string  $cache_key     Cache index key
+     * @return int     Messages count
+     * @access private
+     */
+    private function _fetch_headers($mailbox, $msgs, &$a_msg_headers, $cache_key)
+    {
+        // fetch reqested headers from server
+        $a_header_index = $this->conn->fetchHeaders(
+            $mailbox, $msgs, false, false, $this->get_fetch_headers());
+
+        if (empty($a_header_index))
+            return 0;
+
+        foreach ($a_header_index as $i => $headers) {
+            $a_msg_headers[$headers->uid] = $headers;
+        }
+
+        // Update cache
+        if ($this->caching_enabled && $cache_key) {
+            // cache is incomplete?
+            $cache_index = $this->get_message_cache_index($cache_key);
+
+            foreach ($a_header_index as $headers) {
+                // message in cache
+                if ($cache_index[$headers->id] == $headers->uid) {
+                    unset($cache_index[$headers->id]);
+                    continue;
+                }
+                // wrong UID at this position
+                if ($cache_index[$headers->id]) {
+                    $for_remove[] = $cache_index[$headers->id];
+                    unset($cache_index[$headers->id]);
+                }
+                // message UID in cache but at wrong position
+                if (is_int($key = array_search($headers->uid, $cache_index))) {
+                    $for_remove[] = $cache_index[$key];
+                    unset($cache_index[$key]);
+                }
+
+                $for_create[] = $headers->uid;
+            }
+
+            if ($for_remove)
+                $this->remove_message_cache($cache_key, $for_remove);
+
+            // add messages to cache
+            foreach ((array)$for_create as $uid) {
+                $headers = $a_msg_headers[$uid];
+                $this->add_message_cache($cache_key, $headers->id, $headers, NULL, true);
+            }
+        }
+
+        return count($a_msg_headers);
+    }
+
+
+    /**
+     * Returns current status of mailbox
+     *
+     * We compare the maximum UID to determine the number of
+     * new messages because the RECENT flag is not reliable.
+     *
+     * @param string $mbox_name Mailbox/folder name
+     * @return int   Folder status
+     */
+    function mailbox_status($mbox_name = null)
+    {
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+        $old = $this->get_folder_stats($mailbox);
+
+        // refresh message count -> will update
+        $this->_messagecount($mailbox, 'ALL', true);
+
+        $result = 0;
+        $new = $this->get_folder_stats($mailbox);
+
+        // got new messages
+        if ($new['maxuid'] > $old['maxuid'])
+            $result += 1;
+        // some messages has been deleted
+        if ($new['cnt'] < $old['cnt'])
+            $result += 2;
+
+        // @TODO: optional checking for messages flags changes (?)
+        // @TODO: UIDVALIDITY checking
+
+        return $result;
+    }
+
+
+    /**
+     * Stores folder statistic data in session
+     * @TODO: move to separate DB table (cache?)
+     *
+     * @param string $mbox_name Mailbox name
+     * @param string $name      Data name
+     * @param mixed  $data      Data value
+     */
+    private function set_folder_stats($mbox_name, $name, $data)
+    {
+        $_SESSION['folders'][$mbox_name][$name] = $data;
+    }
+
+
+    /**
+     * Gets folder statistic data
+     *
+     * @param string $mbox_name Mailbox name
+     * @return array Stats data
+     */
+    private function get_folder_stats($mbox_name)
+    {
+        if ($_SESSION['folders'][$mbox_name])
+            return (array) $_SESSION['folders'][$mbox_name];
+        else
+            return array();
+    }
+
+
+    /**
+     * Return sorted array of message IDs (not UIDs)
+     *
+     * @param string $mbox_name  Mailbox to get index from
+     * @param string $sort_field Sort column
+     * @param string $sort_order Sort order [ASC, DESC]
+     * @return array Indexed array with message IDs
+     */
+    function message_index($mbox_name='', $sort_field=NULL, $sort_order=NULL)
+    {
+        if ($this->threading)
+            return $this->thread_index($mbox_name, $sort_field, $sort_order);
+
+        $this->_set_sort_order($sort_field, $sort_order);
+
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+        $key = "{$mailbox}:{$this->sort_field}:{$this->sort_order}:{$this->search_string}.msgi";
+
+        // we have a saved search result, get index from there
+        if (!isset($this->icache[$key]) && $this->search_string
+            && !$this->search_threads && $mailbox == $this->mailbox) {
+            // use message index sort as default sorting
+            if (!$this->sort_field) {
+                $msgs = $this->search_set;
+
+                if ($this->search_sort_field != 'date')
+                    sort($msgs);
+
+                if ($this->sort_order == 'DESC')
+                    $this->icache[$key] = array_reverse($msgs);
+                else
+                    $this->icache[$key] = $msgs;
+            }
+            // sort with SORT command
+            else if ($this->search_sorted) {
+                if ($this->sort_field && $this->search_sort_field != $this->sort_field)
+                    $this->search('', $this->search_string, $this->search_charset, $this->sort_field);
+
+                if ($this->sort_order == 'DESC')
+                    $this->icache[$key] = array_reverse($this->search_set);
+                else
+                    $this->icache[$key] = $this->search_set;
+            }
+            else {
+                $a_index = $this->conn->fetchHeaderIndex($mailbox,
+                       join(',', $this->search_set), $this->sort_field, $this->skip_deleted);
+
+                if (is_array($a_index)) {
+                    if ($this->sort_order=="ASC")
+                        asort($a_index);
+                    else if ($this->sort_order=="DESC")
+                        arsort($a_index);
+
+                    $this->icache[$key] = array_keys($a_index);
+                }
+                else {
+                    $this->icache[$key] = array();
+                }
+            }
+        }
+
+        // have stored it in RAM
+        if (isset($this->icache[$key]))
+            return $this->icache[$key];
+
+        // check local cache
+        $cache_key = $mailbox.'.msg';
+        $cache_status = $this->check_cache_status($mailbox, $cache_key);
+
+        // cache is OK
+        if ($cache_status>0) {
+            $a_index = $this->get_message_cache_index($cache_key,
+                $this->sort_field, $this->sort_order);
+            return array_keys($a_index);
+        }
+
+        // use message index sort as default sorting
+        if (!$this->sort_field) {
+            if ($this->skip_deleted) {
+                $a_index = $this->_search_index($mailbox, 'ALL');
+            } else if ($max = $this->_messagecount($mailbox)) {
+                $a_index = range(1, $max);
+            }
+
+            if ($a_index !== false && $this->sort_order == 'DESC')
+                $a_index = array_reverse($a_index);
+
+            $this->icache[$key] = $a_index;
+        }
+        // fetch complete message index
+        else if ($this->get_capability('SORT') &&
+            ($a_index = $this->conn->sort($mailbox,
+                $this->sort_field, $this->skip_deleted ? 'UNDELETED' : '')) !== false
+        ) {
+            if ($this->sort_order == 'DESC')
+                $a_index = array_reverse($a_index);
+
+            $this->icache[$key] = $a_index;
+        }
+        else if ($a_index = $this->conn->fetchHeaderIndex(
+            $mailbox, "1:*", $this->sort_field, $this->skip_deleted)) {
+            if ($this->sort_order=="ASC")
+                asort($a_index);
+            else if ($this->sort_order=="DESC")
+                arsort($a_index);
+
+            $this->icache[$key] = array_keys($a_index);
+        }
+
+        return $this->icache[$key] !== false ? $this->icache[$key] : array();
+    }
+
+
+    /**
+     * Return sorted array of threaded message IDs (not UIDs)
+     *
+     * @param string $mbox_name  Mailbox to get index from
+     * @param string $sort_field Sort column
+     * @param string $sort_order Sort order [ASC, DESC]
+     * @return array Indexed array with message IDs
+     */
+    function thread_index($mbox_name='', $sort_field=NULL, $sort_order=NULL)
+    {
+        $this->_set_sort_order($sort_field, $sort_order);
+
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+        $key = "{$mailbox}:{$this->sort_field}:{$this->sort_order}:{$this->search_string}.thi";
+
+        // we have a saved search result, get index from there
+        if (!isset($this->icache[$key]) && $this->search_string
+            && $this->search_threads && $mailbox == $this->mailbox) {
+            // use message IDs for better performance
+            $ids = array_keys_recursive($this->search_set['tree']);
+            $this->icache[$key] = $this->_flatten_threads($mailbox, $this->search_set['tree'], $ids);
+        }
+
+        // have stored it in RAM
+        if (isset($this->icache[$key]))
+            return $this->icache[$key];
+/*
+        // check local cache
+        $cache_key = $mailbox.'.msg';
+        $cache_status = $this->check_cache_status($mailbox, $cache_key);
+
+        // cache is OK
+        if ($cache_status>0) {
+            $a_index = $this->get_message_cache_index($cache_key, $this->sort_field, $this->sort_order);
+            return array_keys($a_index);
+        }
+*/
+        // get all threads (default sort order)
+        list ($thread_tree) = $this->_fetch_threads($mailbox);
+
+        $this->icache[$key] = $this->_flatten_threads($mailbox, $thread_tree);
+
+        return $this->icache[$key];
+    }
+
+
+    /**
+     * Return array of threaded messages (all, not only roots)
+     *
+     * @param string $mailbox     Mailbox to get index from
+     * @param array  $thread_tree Threaded messages array (see _fetch_threads())
+     * @param array  $ids         Message IDs if we know what we need (e.g. search result)
+     *                            for better performance
+     * @return array Indexed array with message IDs
+     *
+     * @access private
+     */
+    private function _flatten_threads($mailbox, $thread_tree, $ids=null)
+    {
+        if (empty($thread_tree))
+            return array();
+
+        $msg_index = $this->_sort_threads($mailbox, $thread_tree, $ids);
+
+        if ($this->sort_order == 'DESC')
+            $msg_index = array_reverse($msg_index);
+
+        // flatten threads array
+        $all_ids = array();
+        foreach ($msg_index as $root) {
+            $all_ids[] = $root;
+            if (!empty($thread_tree[$root])) {
+                foreach (array_keys_recursive($thread_tree[$root]) as $val)
+                    $all_ids[] = $val;
+            }
+        }
+
+        return $all_ids;
+    }
+
+
+    /**
+     * @param string $mailbox Mailbox name
+     * @access private
+     */
+    private function sync_header_index($mailbox)
+    {
+        $cache_key = $mailbox.'.msg';
+        $cache_index = $this->get_message_cache_index($cache_key);
+        $chunk_size = 1000;
+
+        // cache is empty, get all messages
+        if (is_array($cache_index) && empty($cache_index)) {
+            $max = $this->_messagecount($mailbox);
+            // syncing a big folder maybe slow
+            @set_time_limit(0);
+            $start = 1;
+            $end   = min($chunk_size, $max);
+            while (true) {
+                // do this in loop to save memory (1000 msgs ~= 10 MB)
+                if ($headers = $this->conn->fetchHeaders($mailbox,
+                    "$start:$end", false, false, $this->get_fetch_headers())
+                ) {
+                    foreach ($headers as $header) {
+                        $this->add_message_cache($cache_key, $header->id, $header, NULL, true);
+                    }
+                }
+                if ($end - $start < $chunk_size - 1)
+                    break;
+
+                $end   = min($end+$chunk_size, $max);
+                $start += $chunk_size;
+            }
+            return;
+        }
+
+        // fetch complete message index
+        if (isset($this->icache['folder_index']))
+            $a_message_index = &$this->icache['folder_index'];
+        else
+            $a_message_index = $this->conn->fetchHeaderIndex($mailbox, "1:*", 'UID', $this->skip_deleted);
+
+        if ($a_message_index === false || $cache_index === null)
+            return;
+
+        // compare cache index with real index
+        foreach ($a_message_index as $id => $uid) {
+            // message in cache at correct position
+            if ($cache_index[$id] == $uid) {
+                unset($cache_index[$id]);
+                continue;
+            }
+
+            // other message at this position
+            if (isset($cache_index[$id])) {
+                $for_remove[] = $cache_index[$id];
+                unset($cache_index[$id]);
+            }
+
+            // message in cache but at wrong position
+            if (is_int($key = array_search($uid, $cache_index))) {
+                $for_remove[] = $uid;
+                unset($cache_index[$key]);
+            }
+
+            $for_update[] = $id;
+        }
+
+        // remove messages at wrong positions and those deleted that are still in cache_index
+        if (!empty($for_remove))
+            $cache_index = array_merge($cache_index, $for_remove);
+
+        if (!empty($cache_index))
+            $this->remove_message_cache($cache_key, $cache_index);
+
+        // fetch complete headers and add to cache
+        if (!empty($for_update)) {
+            // syncing a big folder maybe slow
+            @set_time_limit(0);
+            // To save memory do this in chunks
+            $for_update = array_chunk($for_update, $chunk_size);
+            foreach ($for_update as $uids) {
+                if ($headers = $this->conn->fetchHeaders($mailbox,
+                    $uids, false, false, $this->get_fetch_headers())
+                ) {
+                    foreach ($headers as $header) {
+                        $this->add_message_cache($cache_key, $header->id, $header, NULL, true);
+                    }
+                }
+            }
+        }
+    }
+
+
+    /**
+     * Invoke search request to IMAP server
+     *
+     * @param  string  $mbox_name  Mailbox name to search in
+     * @param  string  $str        Search criteria
+     * @param  string  $charset    Search charset
+     * @param  string  $sort_field Header field to sort by
+     * @return array   search results as list of message IDs
+     * @access public
+     */
+    function search($mbox_name='', $str=NULL, $charset=NULL, $sort_field=NULL)
+    {
+        if (!$str)
+            return false;
+
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+
+        $results = $this->_search_index($mailbox, $str, $charset, $sort_field);
+
+        $this->set_search_set($str, $results, $charset, $sort_field, (bool)$this->threading,
+            $this->threading || $this->search_sorted ? true : false);
+
+        return $results;
+    }
+
+
+    /**
+     * Private search method
+     *
+     * @param string $mailbox    Mailbox name
+     * @param string $criteria   Search criteria
+     * @param string $charset    Charset
+     * @param string $sort_field Sorting field
+     * @return array   search results as list of message ids
+     * @access private
+     * @see rcube_imap::search()
+     */
+    private function _search_index($mailbox, $criteria='ALL', $charset=NULL, $sort_field=NULL)
+    {
+        $orig_criteria = $criteria;
+
+        if ($this->skip_deleted && !preg_match('/UNDELETED/', $criteria))
+            $criteria = 'UNDELETED '.$criteria;
+
+        if ($this->threading) {
+            $a_messages = $this->conn->thread($mailbox, $this->threading, $criteria, $charset);
+
+            // Error, try with US-ASCII (RFC5256: SORT/THREAD must support US-ASCII and UTF-8,
+            // but I've seen that Courier doesn't support UTF-8)
+            if ($a_messages === false && $charset && $charset != 'US-ASCII')
+                $a_messages = $this->conn->thread($mailbox, $this->threading,
+                    $this->convert_criteria($criteria, $charset), 'US-ASCII');
+
+            if ($a_messages !== false) {
+                list ($thread_tree, $msg_depth, $has_children) = $a_messages;
+                $a_messages = array(
+                    'tree'     => $thread_tree,
+                       'depth' => $msg_depth,
+                       'children' => $has_children
+                );
+            }
+
+            return $a_messages;
+        }
+
+        if ($sort_field && $this->get_capability('SORT')) {
+            $charset = $charset ? $charset : $this->default_charset;
+            $a_messages = $this->conn->sort($mailbox, $sort_field, $criteria, false, $charset);
+
+            // Error, try with US-ASCII (RFC5256: SORT/THREAD must support US-ASCII and UTF-8,
+            // but I've seen that Courier doesn't support UTF-8)
+            if ($a_messages === false && $charset && $charset != 'US-ASCII')
+                $a_messages = $this->conn->sort($mailbox, $sort_field,
+                    $this->convert_criteria($criteria, $charset), false, 'US-ASCII');
+
+            if ($a_messages !== false) {
+                $this->search_sorted = true;
+                return $a_messages;
+            }
+        }
+
+        if ($orig_criteria == 'ALL') {
+            $max = $this->_messagecount($mailbox);
+            $a_messages = $max ? range(1, $max) : array();
+        }
+        else {
+            $a_messages = $this->conn->search($mailbox,
+                ($charset ? "CHARSET $charset " : '') . $criteria);
+
+            // Error, try with US-ASCII (some servers may support only US-ASCII)
+            if ($a_messages === false && $charset && $charset != 'US-ASCII')
+                $a_messages = $this->conn->search($mailbox,
+                    'CHARSET US-ASCII ' . $this->convert_criteria($criteria, $charset));
+
+            // I didn't found that SEARCH should return sorted IDs
+            if (is_array($a_messages) && !$this->sort_field)
+                sort($a_messages);
+        }
+
+        $this->search_sorted = false;
+
+        return $a_messages;
+    }
+
+
+    /**
+     * Direct (real and simple) SEARCH request to IMAP server,
+     * without result sorting and caching
+     *
+     * @param  string  $mbox_name Mailbox name to search in
+     * @param  string  $str       Search string
+     * @param  boolean $ret_uid   True if UIDs should be returned
+     * @return array   Search results as list of message IDs or UIDs
+     * @access public
+     */
+    function search_once($mbox_name='', $str=NULL, $ret_uid=false)
+    {
+        if (!$str)
+            return false;
+
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+
+        return $this->conn->search($mailbox, $str, $ret_uid);
+    }
+
+
+    /**
+     * Converts charset of search criteria string
+     *
+     * @param  string  $str          Search string
+     * @param  string  $charset      Original charset
+     * @param  string  $dest_charset Destination charset (default US-ASCII)
+     * @return string  Search string
+     * @access private
+     */
+    private function convert_criteria($str, $charset, $dest_charset='US-ASCII')
+    {
+        // convert strings to US_ASCII
+        if (preg_match_all('/\{([0-9]+)\}\r\n/', $str, $matches, PREG_OFFSET_CAPTURE)) {
+            $last = 0; $res = '';
+            foreach ($matches[1] as $m) {
+                $string_offset = $m[1] + strlen($m[0]) + 4; // {}\r\n
+                $string = substr($str, $string_offset - 1, $m[0]);
+                $string = rcube_charset_convert($string, $charset, $dest_charset);
+                if (!$string)
+                    continue;
+                $res .= sprintf("%s{%d}\r\n%s", substr($str, $last, $m[1] - $last - 1), strlen($string), $string);
+                $last = $m[0] + $string_offset - 1;
+            }
+            if ($last < strlen($str))
+                $res .= substr($str, $last, strlen($str)-$last);
+        }
+        else // strings for conversion not found
+            $res = $str;
+
+        return $res;
+    }
+
+
+    /**
+     * Sort thread
+     *
+     * @param string $mailbox     Mailbox name
+     * @param  array $thread_tree Unsorted thread tree (rcube_imap_generic::thread() result)
+     * @param  array $ids         Message IDs if we know what we need (e.g. search result)
+     * @return array Sorted roots IDs
+     * @access private
+     */
+    private function _sort_threads($mailbox, $thread_tree, $ids=NULL)
+    {
+        // THREAD=ORDEREDSUBJECT:      sorting by sent date of root message
+        // THREAD=REFERENCES:  sorting by sent date of root message
+        // THREAD=REFS:                sorting by the most recent date in each thread
+        // default sorting
+        if (!$this->sort_field || ($this->sort_field == 'date' && $this->threading == 'REFS')) {
+            return array_keys((array)$thread_tree);
+          }
+        // here we'll implement REFS sorting, for performance reason
+        else { // ($sort_field == 'date' && $this->threading != 'REFS')
+            // use SORT command
+            if ($this->get_capability('SORT') && 
+                ($a_index = $this->conn->sort($mailbox, $this->sort_field,
+                       !empty($ids) ? $ids : ($this->skip_deleted ? 'UNDELETED' : ''))) !== false
+            ) {
+                   // return unsorted tree if we've got no index data
+                   if (!$a_index)
+                       return array_keys((array)$thread_tree);
+            }
+            else {
+                // fetch specified headers for all messages and sort them
+                $a_index = $this->conn->fetchHeaderIndex($mailbox, !empty($ids) ? $ids : "1:*",
+                       $this->sort_field, $this->skip_deleted);
+
+                   // return unsorted tree if we've got no index data
+                   if (!$a_index)
+                       return array_keys((array)$thread_tree);
+
+                asort($a_index); // ASC
+                   $a_index = array_values($a_index);
+            }
+
+               return $this->_sort_thread_refs($thread_tree, $a_index);
+        }
+    }
+
+
+    /**
+     * THREAD=REFS sorting implementation
+     *
+     * @param  array $tree  Thread tree array (message identifiers as keys)
+     * @param  array $index Array of sorted message identifiers
+     * @return array   Array of sorted roots messages
+     * @access private
+     */
+    private function _sort_thread_refs($tree, $index)
+    {
+        if (empty($tree))
+            return array();
+
+        $index = array_combine(array_values($index), $index);
+
+        // assign roots
+        foreach ($tree as $idx => $val) {
+            $index[$idx] = $idx;
+            if (!empty($val)) {
+                $idx_arr = array_keys_recursive($tree[$idx]);
+                foreach ($idx_arr as $subidx)
+                    $index[$subidx] = $idx;
+            }
+        }
+
+        $index = array_values($index);
+
+        // create sorted array of roots
+        $msg_index = array();
+        if ($this->sort_order != 'DESC') {
+            foreach ($index as $idx)
+                if (!isset($msg_index[$idx]))
+                    $msg_index[$idx] = $idx;
+            $msg_index = array_values($msg_index);
+        }
+        else {
+            for ($x=count($index)-1; $x>=0; $x--)
+                if (!isset($msg_index[$index[$x]]))
+                    $msg_index[$index[$x]] = $index[$x];
+            $msg_index = array_reverse($msg_index);
+        }
+
+        return $msg_index;
+    }
+
+
+    /**
+     * Refresh saved search set
+     *
+     * @return array Current search set
+     */
+    function refresh_search()
+    {
+        if (!empty($this->search_string))
+            $this->search_set = $this->search('', $this->search_string, $this->search_charset,
+               $this->search_sort_field, $this->search_threads, $this->search_sorted);
+
+        return $this->get_search_set();
+    }
+
+
+    /**
+     * Check if the given message ID is part of the current search set
+     *
+     * @param string $msgid Message id
+     * @return boolean True on match or if no search request is stored
+     */
+    function in_searchset($msgid)
+    {
+        if (!empty($this->search_string)) {
+            if ($this->search_threads)
+                return isset($this->search_set['depth']["$msgid"]);
+            else
+                return in_array("$msgid", (array)$this->search_set, true);
+        }
+        else
+            return true;
+    }
+
+
+    /**
+     * Return message headers object of a specific message
+     *
+     * @param int     $id        Message ID
+     * @param string  $mbox_name Mailbox to read from
+     * @param boolean $is_uid    True if $id is the message UID
+     * @param boolean $bodystr   True if we need also BODYSTRUCTURE in headers
+     * @return object Message headers representation
+     */
+    function get_headers($id, $mbox_name=NULL, $is_uid=true, $bodystr=false)
+    {
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+        $uid = $is_uid ? $id : $this->_id2uid($id, $mailbox);
+
+        // get cached headers
+        if ($uid && ($headers = &$this->get_cached_message($mailbox.'.msg', $uid)))
+            return $headers;
+
+        $headers = $this->conn->fetchHeader(
+            $mailbox, $id, $is_uid, $bodystr, $this->get_fetch_headers());
+
+        // write headers cache
+        if ($headers) {
+            if ($headers->uid && $headers->id)
+                $this->uid_id_map[$mailbox][$headers->uid] = $headers->id;
+
+            $this->add_message_cache($mailbox.'.msg', $headers->id, $headers, NULL, false, true);
+        }
+
+        return $headers;
+    }
+
+
+    /**
+     * Fetch body structure from the IMAP server and build
+     * an object structure similar to the one generated by PEAR::Mail_mimeDecode
+     *
+     * @param int    $uid           Message UID to fetch
+     * @param string $structure_str Message BODYSTRUCTURE string (optional)
+     * @return object rcube_message_part Message part tree or False on failure
+     */
+    function &get_structure($uid, $structure_str='')
+    {
+        $cache_key = $this->mailbox.'.msg';
+        $headers = &$this->get_cached_message($cache_key, $uid);
+
+        // return cached message structure
+        if (is_object($headers) && is_object($headers->structure)) {
+            return $headers->structure;
+        }
+
+        if (!$structure_str) {
+            $structure_str = $this->conn->fetchStructureString($this->mailbox, $uid, true);
+        }
+        $structure = rcube_mime_struct::parseStructure($structure_str);
+        $struct = false;
+
+        // parse structure and add headers
+        if (!empty($structure)) {
+            $headers = $this->get_headers($uid);
+            $this->_msg_id = $headers->id;
+
+        // set message charset from message headers
+        if ($headers->charset)
+            $this->struct_charset = $headers->charset;
+        else
+            $this->struct_charset = $this->_structure_charset($structure);
+
+        $headers->ctype = strtolower($headers->ctype);
+
+        // Here we can recognize malformed BODYSTRUCTURE and
+        // 1. [@TODO] parse the message in other way to create our own message structure
+        // 2. or just show the raw message body.
+        // Example of structure for malformed MIME message:
+        // ("text" "plain" NIL NIL NIL "7bit" 2154 70 NIL NIL NIL)
+        if ($headers->ctype && !is_array($structure[0]) && $headers->ctype != 'text/plain'
+            && strtolower($structure[0].'/'.$structure[1]) == 'text/plain') {
+            // we can handle single-part messages, by simple fix in structure (#1486898)
+            if (preg_match('/^(text|application)\/(.*)/', $headers->ctype, $m)) {
+                $structure[0] = $m[1];
+                $structure[1] = $m[2];
+            }
+            else
+                return false;
+        }
+
+        $struct = &$this->_structure_part($structure);
+        $struct->headers = get_object_vars($headers);
+
+        // don't trust given content-type
+        if (empty($struct->parts) && !empty($struct->headers['ctype'])) {
+            $struct->mime_id = '1';
+            $struct->mimetype = strtolower($struct->headers['ctype']);
+            list($struct->ctype_primary, $struct->ctype_secondary) = explode('/', $struct->mimetype);
+        }
+
+        // write structure to cache
+        if ($this->caching_enabled)
+            $this->add_message_cache($cache_key, $this->_msg_id, $headers, $struct,
+                $this->icache['message.id'][$uid], true);
+        }
+
+        return $struct;
+    }
+
+
+    /**
+     * Build message part object
+     *
+     * @param array  $part
+     * @param int    $count
+     * @param string $parent
+     * @access private
+     */
+    function &_structure_part($part, $count=0, $parent='', $mime_headers=null)
+    {
+        $struct = new rcube_message_part;
+        $struct->mime_id = empty($parent) ? (string)$count : "$parent.$count";
+
+        // multipart
+        if (is_array($part[0])) {
+            $struct->ctype_primary = 'multipart';
+
+        /* RFC3501: BODYSTRUCTURE fields of multipart part
+            part1 array
+            part2 array
+            part3 array
+            ....
+            1. subtype
+            2. parameters (optional)
+            3. description (optional)
+            4. language (optional)
+            5. location (optional)
+        */
+
+            // find first non-array entry
+            for ($i=1; $i<count($part); $i++) {
+                if (!is_array($part[$i])) {
+                    $struct->ctype_secondary = strtolower($part[$i]);
+                    break;
+                }
+            }
+
+            $struct->mimetype = 'multipart/'.$struct->ctype_secondary;
+
+            // build parts list for headers pre-fetching
+            for ($i=0; $i<count($part); $i++) {
+                if (!is_array($part[$i]))
+                    break;
+                // fetch message headers if message/rfc822
+                // or named part (could contain Content-Location header)
+                if (!is_array($part[$i][0])) {
+                    $tmp_part_id = $struct->mime_id ? $struct->mime_id.'.'.($i+1) : $i+1;
+                    if (strtolower($part[$i][0]) == 'message' && strtolower($part[$i][1]) == 'rfc822') {
+                        $mime_part_headers[] = $tmp_part_id;
+                    }
+                    else if (in_array('name', (array)$part[$i][2]) && (empty($part[$i][3]) || $part[$i][3]=='NIL')) {
+                        $mime_part_headers[] = $tmp_part_id;
+                    }
+                }
+            }
+
+            // pre-fetch headers of all parts (in one command for better performance)
+            // @TODO: we could do this before _structure_part() call, to fetch
+            // headers for parts on all levels
+            if ($mime_part_headers) {
+                $mime_part_headers = $this->conn->fetchMIMEHeaders($this->mailbox,
+                    $this->_msg_id, $mime_part_headers);
+            }
+
+            $struct->parts = array();
+            for ($i=0, $count=0; $i<count($part); $i++) {
+                if (!is_array($part[$i]))
+                    break;
+                $tmp_part_id = $struct->mime_id ? $struct->mime_id.'.'.($i+1) : $i+1;
+                $struct->parts[] = $this->_structure_part($part[$i], ++$count, $struct->mime_id,
+                    $mime_part_headers[$tmp_part_id]);
+            }
+
+            return $struct;
+        }
+
+        /* RFC3501: BODYSTRUCTURE fields of non-multipart part
+            0. type
+            1. subtype
+            2. parameters
+            3. id
+            4. description
+            5. encoding
+            6. size
+          -- text
+            7. lines
+          -- message/rfc822
+            7. envelope structure
+            8. body structure
+            9. lines
+          --
+            x. md5 (optional)
+            x. disposition (optional)
+            x. language (optional)
+            x. location (optional)
+        */
+
+        // regular part
+        $struct->ctype_primary = strtolower($part[0]);
+        $struct->ctype_secondary = strtolower($part[1]);
+        $struct->mimetype = $struct->ctype_primary.'/'.$struct->ctype_secondary;
+
+        // read content type parameters
+        if (is_array($part[2])) {
+            $struct->ctype_parameters = array();
+            for ($i=0; $i<count($part[2]); $i+=2)
+                $struct->ctype_parameters[strtolower($part[2][$i])] = $part[2][$i+1];
+
+            if (isset($struct->ctype_parameters['charset']))
+                $struct->charset = $struct->ctype_parameters['charset'];
+        }
+
+        // read content encoding
+        if (!empty($part[5]) && $part[5]!='NIL') {
+            $struct->encoding = strtolower($part[5]);
+            $struct->headers['content-transfer-encoding'] = $struct->encoding;
+        }
+
+        // get part size
+        if (!empty($part[6]) && $part[6]!='NIL')
+            $struct->size = intval($part[6]);
+
+        // read part disposition
+        $di = 8;
+        if ($struct->ctype_primary == 'text') $di += 1;
+        else if ($struct->mimetype == 'message/rfc822') $di += 3;
+
+        if (is_array($part[$di]) && count($part[$di]) == 2) {
+            $struct->disposition = strtolower($part[$di][0]);
+
+            if (is_array($part[$di][1]))
+                for ($n=0; $n<count($part[$di][1]); $n+=2)
+                    $struct->d_parameters[strtolower($part[$di][1][$n])] = $part[$di][1][$n+1];
+        }
+
+        // get message/rfc822's child-parts
+        if (is_array($part[8]) && $di != 8) {
+            $struct->parts = array();
+            for ($i=0, $count=0; $i<count($part[8]); $i++) {
+                if (!is_array($part[8][$i]))
+                    break;
+                $struct->parts[] = $this->_structure_part($part[8][$i], ++$count, $struct->mime_id);
+            }
+        }
+
+        // get part ID
+        if (!empty($part[3]) && $part[3]!='NIL') {
+            $struct->content_id = $part[3];
+            $struct->headers['content-id'] = $part[3];
+
+            if (empty($struct->disposition))
+                $struct->disposition = 'inline';
+        }
+
+        // fetch message headers if message/rfc822 or named part (could contain Content-Location header)
+        if ($struct->ctype_primary == 'message' || ($struct->ctype_parameters['name'] && !$struct->content_id)) {
+            if (empty($mime_headers)) {
+                $mime_headers = $this->conn->fetchPartHeader(
+                    $this->mailbox, $this->_msg_id, false, $struct->mime_id);
+            }
+            $struct->headers = $this->_parse_headers($mime_headers) + $struct->headers;
+
+            // get real content-type of message/rfc822
+            if ($struct->mimetype == 'message/rfc822') {
+                // single-part
+                if (!is_array($part[8][0]))
+                    $struct->real_mimetype = strtolower($part[8][0] . '/' . $part[8][1]);
+                // multi-part
+                else {
+                    for ($n=0; $n<count($part[8]); $n++)
+                        if (!is_array($part[8][$n]))
+                            break;
+                    $struct->real_mimetype = 'multipart/' . strtolower($part[8][$n]);
+                }
+            }
+
+            if ($struct->ctype_primary == 'message' && empty($struct->parts)) {
+                if (is_array($part[8]) && $di != 8)
+                    $struct->parts[] = $this->_structure_part($part[8], ++$count, $struct->mime_id);
+            }
+        }
+
+        // normalize filename property
+        $this->_set_part_filename($struct, $mime_headers);
+
+        return $struct;
+    }
+
+
+    /**
+     * Set attachment filename from message part structure
+     *
+     * @param  rcube_message_part $part    Part object
+     * @param  string             $headers Part's raw headers
+     * @access private
+     */
+    private function _set_part_filename(&$part, $headers=null)
+    {
+        if (!empty($part->d_parameters['filename']))
+            $filename_mime = $part->d_parameters['filename'];
+        else if (!empty($part->d_parameters['filename*']))
+            $filename_encoded = $part->d_parameters['filename*'];
+        else if (!empty($part->ctype_parameters['name*']))
+            $filename_encoded = $part->ctype_parameters['name*'];
+        // RFC2231 value continuations
+        // TODO: this should be rewrited to support RFC2231 4.1 combinations
+        else if (!empty($part->d_parameters['filename*0'])) {
+            $i = 0;
+            while (isset($part->d_parameters['filename*'.$i])) {
+                $filename_mime .= $part->d_parameters['filename*'.$i];
+                $i++;
+            }
+            // some servers (eg. dovecot-1.x) have no support for parameter value continuations
+            // we must fetch and parse headers "manually"
+            if ($i<2) {
+                if (!$headers) {
+                    $headers = $this->conn->fetchPartHeader(
+                        $this->mailbox, $this->_msg_id, false, $part->mime_id);
+                }
+                $filename_mime = '';
+                $i = 0;
+                while (preg_match('/filename\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
+                    $filename_mime .= $matches[1];
+                    $i++;
+                }
+            }
+        }
+        else if (!empty($part->d_parameters['filename*0*'])) {
+            $i = 0;
+            while (isset($part->d_parameters['filename*'.$i.'*'])) {
+                $filename_encoded .= $part->d_parameters['filename*'.$i.'*'];
+                $i++;
+            }
+            if ($i<2) {
+                if (!$headers) {
+                    $headers = $this->conn->fetchPartHeader(
+                            $this->mailbox, $this->_msg_id, false, $part->mime_id);
+                }
+                $filename_encoded = '';
+                $i = 0; $matches = array();
+                while (preg_match('/filename\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
+                    $filename_encoded .= $matches[1];
+                    $i++;
+                }
+            }
+        }
+        else if (!empty($part->ctype_parameters['name*0'])) {
+            $i = 0;
+            while (isset($part->ctype_parameters['name*'.$i])) {
+                $filename_mime .= $part->ctype_parameters['name*'.$i];
+                $i++;
+            }
+            if ($i<2) {
+                if (!$headers) {
+                    $headers = $this->conn->fetchPartHeader(
+                        $this->mailbox, $this->_msg_id, false, $part->mime_id);
+                }
+                $filename_mime = '';
+                $i = 0; $matches = array();
+                while (preg_match('/\s+name\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
+                    $filename_mime .= $matches[1];
+                    $i++;
+                }
+            }
+        }
+        else if (!empty($part->ctype_parameters['name*0*'])) {
+            $i = 0;
+            while (isset($part->ctype_parameters['name*'.$i.'*'])) {
+                $filename_encoded .= $part->ctype_parameters['name*'.$i.'*'];
+                $i++;
+            }
+            if ($i<2) {
+                if (!$headers) {
+                    $headers = $this->conn->fetchPartHeader(
+                        $this->mailbox, $this->_msg_id, false, $part->mime_id);
+                }
+                $filename_encoded = '';
+                $i = 0; $matches = array();
+                while (preg_match('/\s+name\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
+                    $filename_encoded .= $matches[1];
+                    $i++;
+                }
+            }
+        }
+        // read 'name' after rfc2231 parameters as it may contains truncated filename (from Thunderbird)
+        else if (!empty($part->ctype_parameters['name']))
+            $filename_mime = $part->ctype_parameters['name'];
+        // Content-Disposition
+        else if (!empty($part->headers['content-description']))
+            $filename_mime = $part->headers['content-description'];
+        else
+            return;
+
+        // decode filename
+        if (!empty($filename_mime)) {
+            $part->filename = rcube_imap::decode_mime_string($filename_mime,
+                $part->charset ? $part->charset : ($this->struct_charset ? $this->struct_charset :
+                rc_detect_encoding($filename_mime, $this->default_charset)));
+        }
+        else if (!empty($filename_encoded)) {
+            // decode filename according to RFC 2231, Section 4
+            if (preg_match("/^([^']*)'[^']*'(.*)$/", $filename_encoded, $fmatches)) {
+                $filename_charset = $fmatches[1];
+                $filename_encoded = $fmatches[2];
+            }
+            $part->filename = rcube_charset_convert(urldecode($filename_encoded), $filename_charset);
+        }
+    }
+
+
+    /**
+     * Get charset name from message structure (first part)
+     *
+     * @param  array $structure Message structure
+     * @return string Charset name
+     * @access private
+     */
+    private function _structure_charset($structure)
+    {
+        while (is_array($structure)) {
+            if (is_array($structure[2]) && $structure[2][0] == 'charset')
+                return $structure[2][1];
+            $structure = $structure[0];
+        }
+    }
+
+
+    /**
+     * Fetch message body of a specific message from the server
+     *
+     * @param  int                $uid    Message UID
+     * @param  string             $part   Part number
+     * @param  rcube_message_part $o_part Part object created by get_structure()
+     * @param  mixed              $print  True to print part, ressource to write part contents in
+     * @param  resource           $fp     File pointer to save the message part
+     * @return string Message/part body if not printed
+     */
+    function &get_message_part($uid, $part=1, $o_part=NULL, $print=NULL, $fp=NULL)
+    {
+        // get part encoding if not provided
+        if (!is_object($o_part)) {
+            $structure_str = $this->conn->fetchStructureString($this->mailbox, $uid, true);
+            $structure = new rcube_mime_struct();
+            // error or message not found
+            if (!$structure->loadStructure($structure_str)) {
+                return false;
+            }
+
+            $o_part = new rcube_message_part;
+            $o_part->ctype_primary = strtolower($structure->getPartType($part));
+            $o_part->encoding      = strtolower($structure->getPartEncoding($part));
+            $o_part->charset       = $structure->getPartCharset($part);
+        }
+
+        // TODO: Add caching for message parts
+
+        if (!$part) {
+            $part = 'TEXT';
+        }
+
+        $body = $this->conn->handlePartBody($this->mailbox, $uid, true, $part,
+            $o_part->encoding, $print, $fp);
+
+        if ($fp || $print) {
+            return true;
+        }
+
+        // convert charset (if text or message part) and part's charset is specified
+        if ($body && $o_part->charset
+            && preg_match('/^(text|message)$/', $o_part->ctype_primary)
+        ) {
+            $body = rcube_charset_convert($body, $o_part->charset);
+        }
+
+        return $body;
+    }
+
+
+    /**
+     * Fetch message body of a specific message from the server
+     *
+     * @param  int    $uid  Message UID
+     * @return string $part Message/part body
+     * @see    rcube_imap::get_message_part()
+     */
+    function &get_body($uid, $part=1)
+    {
+        $headers = $this->get_headers($uid);
+        return rcube_charset_convert($this->get_message_part($uid, $part, NULL),
+            $headers->charset ? $headers->charset : $this->default_charset);
+    }
+
+
+    /**
+     * Returns the whole message source as string
+     *
+     * @param int $uid Message UID
+     * @return string Message source string
+     */
+    function &get_raw_body($uid)
+    {
+        return $this->conn->handlePartBody($this->mailbox, $uid, true);
+    }
+
+
+    /**
+     * Returns the message headers as string
+     *
+     * @param int $uid  Message UID
+     * @return string Message headers string
+     */
+    function &get_raw_headers($uid)
+    {
+        return $this->conn->fetchPartHeader($this->mailbox, $uid, true);
+    }
+
+
+    /**
+     * Sends the whole message source to stdout
+     *
+     * @param int $uid Message UID
+     */
+    function print_raw_body($uid)
+    {
+        $this->conn->handlePartBody($this->mailbox, $uid, true, NULL, NULL, true);
+    }
+
+
+    /**
+     * Set message flag to one or several messages
+     *
+     * @param mixed   $uids       Message UIDs as array or comma-separated string, or '*'
+     * @param string  $flag       Flag to set: SEEN, UNDELETED, DELETED, RECENT, ANSWERED, DRAFT, MDNSENT
+     * @param string  $mbox_name  Folder name
+     * @param boolean $skip_cache True to skip message cache clean up
+     * @return boolean  Operation status
+     */
+    function set_flag($uids, $flag, $mbox_name=NULL, $skip_cache=false)
+    {
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+
+        $flag = strtoupper($flag);
+        list($uids, $all_mode) = $this->_parse_uids($uids, $mailbox);
+
+        if (strpos($flag, 'UN') === 0)
+            $result = $this->conn->unflag($mailbox, $uids, substr($flag, 2));
+        else
+            $result = $this->conn->flag($mailbox, $uids, $flag);
+
+        if ($result) {
+            // reload message headers if cached
+            if ($this->caching_enabled && !$skip_cache) {
+                $cache_key = $mailbox.'.msg';
+                if ($all_mode)
+                    $this->clear_message_cache($cache_key);
+                else
+                    $this->remove_message_cache($cache_key, explode(',', $uids));
+            }
+
+            // clear cached counters
+            if ($flag == 'SEEN' || $flag == 'UNSEEN') {
+                $this->_clear_messagecount($mailbox, 'SEEN');
+                $this->_clear_messagecount($mailbox, 'UNSEEN');
+            }
+            else if ($flag == 'DELETED') {
+                $this->_clear_messagecount($mailbox, 'DELETED');
+            }
+        }
+
+        return $result;
+    }
+
+
+    /**
+     * Remove message flag for one or several messages
+     *
+     * @param mixed  $uids      Message UIDs as array or comma-separated string, or '*'
+     * @param string $flag      Flag to unset: SEEN, DELETED, RECENT, ANSWERED, DRAFT, MDNSENT
+     * @param string $mbox_name Folder name
+     * @return int   Number of flagged messages, -1 on failure
+     * @see set_flag
+     */
+    function unset_flag($uids, $flag, $mbox_name=NULL)
+    {
+        return $this->set_flag($uids, 'UN'.$flag, $mbox_name);
+    }
+
+
+    /**
+     * Append a mail message (source) to a specific mailbox
+     *
+     * @param string  $mbox_name Target mailbox
+     * @param string  $message   The message source string or filename
+     * @param string  $headers   Headers string if $message contains only the body
+     * @param boolean $is_file   True if $message is a filename
+     *
+     * @return boolean True on success, False on error
+     */
+    function save_message($mbox_name, &$message, $headers='', $is_file=false)
+    {
+        $mailbox = $this->mod_mailbox($mbox_name);
+
+        // make sure mailbox exists
+        if ($this->mailbox_exists($mbox_name)) {
+            if ($is_file)
+                $saved = $this->conn->appendFromFile($mailbox, $message, $headers);
+            else
+                $saved = $this->conn->append($mailbox, $message);
+        }
+
+        if ($saved) {
+            // increase messagecount of the target mailbox
+            $this->_set_messagecount($mailbox, 'ALL', 1);
+        }
+
+        return $saved;
+    }
+
+
+    /**
+     * Move a message from one mailbox to another
+     *
+     * @param mixed  $uids      Message UIDs as array or comma-separated string, or '*'
+     * @param string $to_mbox   Target mailbox
+     * @param string $from_mbox Source mailbox
+     * @return boolean True on success, False on error
+     */
+    function move_message($uids, $to_mbox, $from_mbox='')
+    {
+        $fbox = $from_mbox;
+        $tbox = $to_mbox;
+        $to_mbox = $this->mod_mailbox($to_mbox);
+        $from_mbox = strlen($from_mbox) ? $this->mod_mailbox($from_mbox) : $this->mailbox;
+
+        if ($to_mbox === $from_mbox)
+            return false;
+
+        list($uids, $all_mode) = $this->_parse_uids($uids, $from_mbox);
+
+        // exit if no message uids are specified
+        if (empty($uids))
+            return false;
+
+        // make sure mailbox exists
+        if ($to_mbox != 'INBOX' && !$this->mailbox_exists($tbox)) {
+            if (in_array($tbox, $this->default_folders))
+                $this->create_mailbox($tbox, true);
+            else
+                return false;
+        }
+
+        // flag messages as read before moving them
+        $config = rcmail::get_instance()->config;
+        if ($config->get('read_when_deleted') && $tbox == $config->get('trash_mbox')) {
+            // don't flush cache (4th argument)
+            $this->set_flag($uids, 'SEEN', $fbox, true);
+        }
+
+        // move messages
+        $moved = $this->conn->move($uids, $from_mbox, $to_mbox);
+
+        // send expunge command in order to have the moved message
+        // really deleted from the source mailbox
+        if ($moved) {
+            $this->_expunge($from_mbox, false, $uids);
+            $this->_clear_messagecount($from_mbox);
+            $this->_clear_messagecount($to_mbox);
+        }
+        // moving failed
+        else if ($config->get('delete_always', false) && $tbox == $config->get('trash_mbox')) {
+            $moved = $this->delete_message($uids, $fbox);
+        }
+
+        if ($moved) {
+            // unset threads internal cache
+            unset($this->icache['threads']);
+
+            // remove message ids from search set
+            if ($this->search_set && $from_mbox == $this->mailbox) {
+                // threads are too complicated to just remove messages from set
+                if ($this->search_threads || $all_mode)
+                    $this->refresh_search();
+                else {
+                    $uids = explode(',', $uids);
+                    foreach ($uids as $uid)
+                        $a_mids[] = $this->_uid2id($uid, $from_mbox);
+                    $this->search_set = array_diff($this->search_set, $a_mids);
+                }
+            }
+
+            // update cached message headers
+            $cache_key = $from_mbox.'.msg';
+            if ($all_mode || ($start_index = $this->get_message_cache_index_min($cache_key, $uids))) {
+                // clear cache from the lowest index on
+                $this->clear_message_cache($cache_key, $all_mode ? 1 : $start_index);
+            }
+        }
+
+        return $moved;
+    }
+
+
+    /**
+     * Copy a message from one mailbox to another
+     *
+     * @param mixed  $uids      Message UIDs as array or comma-separated string, or '*'
+     * @param string $to_mbox   Target mailbox
+     * @param string $from_mbox Source mailbox
+     * @return boolean True on success, False on error
+     */
+    function copy_message($uids, $to_mbox, $from_mbox='')
+    {
+        $fbox = $from_mbox;
+        $tbox = $to_mbox;
+        $to_mbox = $this->mod_mailbox($to_mbox);
+        $from_mbox = $from_mbox ? $this->mod_mailbox($from_mbox) : $this->mailbox;
+
+        list($uids, $all_mode) = $this->_parse_uids($uids, $from_mbox);
+
+        // exit if no message uids are specified
+        if (empty($uids)) {
+            return false;
+        }
+
+        // make sure mailbox exists
+        if ($to_mbox != 'INBOX' && !$this->mailbox_exists($tbox)) {
+            if (in_array($tbox, $this->default_folders))
+                $this->create_mailbox($tbox, true);
+            else
+                return false;
+        }
+
+        // copy messages
+        $copied = $this->conn->copy($uids, $from_mbox, $to_mbox);
+
+        if ($copied) {
+            $this->_clear_messagecount($to_mbox);
+        }
+
+        return $copied;
+    }
+
+
+    /**
+     * Mark messages as deleted and expunge mailbox
+     *
+     * @param mixed  $uids      Message UIDs as array or comma-separated string, or '*'
+     * @param string $mbox_name Source mailbox
+     * @return boolean True on success, False on error
+     */
+    function delete_message($uids, $mbox_name='')
+    {
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+
+        list($uids, $all_mode) = $this->_parse_uids($uids, $mailbox);
+
+        // exit if no message uids are specified
+        if (empty($uids))
+            return false;
+
+        $deleted = $this->conn->delete($mailbox, $uids);
+
+        if ($deleted) {
+            // send expunge command in order to have the deleted message
+            // really deleted from the mailbox
+            $this->_expunge($mailbox, false, $uids);
+            $this->_clear_messagecount($mailbox);
+            unset($this->uid_id_map[$mailbox]);
+
+            // unset threads internal cache
+            unset($this->icache['threads']);
+
+            // remove message ids from search set
+            if ($this->search_set && $mailbox == $this->mailbox) {
+                // threads are too complicated to just remove messages from set
+                if ($this->search_threads || $all_mode)
+                    $this->refresh_search();
+                else {
+                    $uids = explode(',', $uids);
+                    foreach ($uids as $uid)
+                        $a_mids[] = $this->_uid2id($uid, $mailbox);
+                    $this->search_set = array_diff($this->search_set, $a_mids);
+                }
+            }
+
+            // remove deleted messages from cache
+            $cache_key = $mailbox.'.msg';
+            if ($all_mode || ($start_index = $this->get_message_cache_index_min($cache_key, $uids))) {
+                // clear cache from the lowest index on
+                $this->clear_message_cache($cache_key, $all_mode ? 1 : $start_index);
+            }
+        }
+
+        return $deleted;
+    }
+
+
+    /**
+     * Clear all messages in a specific mailbox
+     *
+     * @param string $mbox_name Mailbox name
+     * @return int Above 0 on success
+     */
+    function clear_mailbox($mbox_name=NULL)
+    {
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+
+        // SELECT will set messages count for clearFolder()
+        if ($this->conn->select($mailbox)) {
+            $cleared = $this->conn->clearFolder($mailbox);
+        }
+
+        // make sure the message count cache is cleared as well
+        if ($cleared) {
+            $this->clear_message_cache($mailbox.'.msg');
+            $a_mailbox_cache = $this->get_cache('messagecount');
+            unset($a_mailbox_cache[$mailbox]);
+            $this->update_cache('messagecount', $a_mailbox_cache);
+        }
+
+        return $cleared;
+    }
+
+
+    /**
+     * Send IMAP expunge command and clear cache
+     *
+     * @param string  $mbox_name   Mailbox name
+     * @param boolean $clear_cache False if cache should not be cleared
+     * @return boolean True on success
+     */
+    function expunge($mbox_name='', $clear_cache=true)
+    {
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+        return $this->_expunge($mailbox, $clear_cache);
+    }
+
+
+    /**
+     * Send IMAP expunge command and clear cache
+     *
+     * @param string  $mailbox     Mailbox name
+     * @param boolean $clear_cache False if cache should not be cleared
+     * @param mixed   $uids        Message UIDs as array or comma-separated string, or '*'
+     * @return boolean True on success
+     * @access private
+     * @see rcube_imap::expunge()
+     */
+    private function _expunge($mailbox, $clear_cache=true, $uids=NULL)
+    {
+        if ($uids && $this->get_capability('UIDPLUS'))
+            $a_uids = is_array($uids) ? join(',', $uids) : $uids;
+        else
+            $a_uids = NULL;
+
+        // force mailbox selection and check if mailbox is writeable
+        // to prevent a situation when CLOSE is executed on closed
+        // or EXPUNGE on read-only mailbox
+        $result = $this->conn->select($mailbox);
+        if (!$result) {
+            return false;
+        }
+        if (!$this->conn->data['READ-WRITE']) {
+            $this->conn->setError(rcube_imap_generic::ERROR_READONLY, "Mailbox is read-only");
+            return false;
+        }
+
+        // CLOSE(+SELECT) should be faster than EXPUNGE
+        if (empty($a_uids) || $a_uids == '1:*')
+            $result = $this->conn->close();
+        else
+            $result = $this->conn->expunge($mailbox, $a_uids);
+
+        if ($result && $clear_cache) {
+            $this->clear_message_cache($mailbox.'.msg');
+            $this->_clear_messagecount($mailbox);
+        }
+
+        return $result;
+    }
+
+
+    /**
+     * Parse message UIDs input
+     *
+     * @param mixed  $uids    UIDs array or comma-separated list or '*' or '1:*'
+     * @param string $mailbox Mailbox name
+     * @return array Two elements array with UIDs converted to list and ALL flag
+     * @access private
+     */
+    private function _parse_uids($uids, $mailbox)
+    {
+        if ($uids === '*' || $uids === '1:*') {
+            if (empty($this->search_set)) {
+                $uids = '1:*';
+                $all = true;
+            }
+            // get UIDs from current search set
+            // @TODO: skip fetchUIDs() and work with IDs instead of UIDs (?)
+            else {
+                if ($this->search_threads)
+                    $uids = $this->conn->fetchUIDs($mailbox, array_keys($this->search_set['depth']));
+                else
+                    $uids = $this->conn->fetchUIDs($mailbox, $this->search_set);
+
+                // save ID-to-UID mapping in local cache
+                if (is_array($uids))
+                    foreach ($uids as $id => $uid)
+                        $this->uid_id_map[$mailbox][$uid] = $id;
+
+                $uids = join(',', $uids);
+            }
+        }
+        else {
+            if (is_array($uids))
+                $uids = join(',', $uids);
+
+            if (preg_match('/[^0-9,]/', $uids))
+                $uids = '';
+        }
+
+        return array($uids, (bool) $all);
+    }
+
+
+    /**
+     * Translate UID to message ID
+     *
+     * @param int    $uid       Message UID
+     * @param string $mbox_name Mailbox name
+     * @return int   Message ID
+     */
+    function get_id($uid, $mbox_name=NULL)
+    {
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+        return $this->_uid2id($uid, $mailbox);
+    }
+
+
+    /**
+     * Translate message number to UID
+     *
+     * @param int    $id        Message ID
+     * @param string $mbox_name Mailbox name
+     * @return int   Message UID
+     */
+    function get_uid($id, $mbox_name=NULL)
+    {
+        $mailbox = strlen($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
+        return $this->_id2uid($id, $mailbox);
+    }
+
+
+
+    /* --------------------------------
+     *        folder managment
+     * --------------------------------*/
+
+    /**
+     * Public method for listing subscribed folders
+     *
+     * Converts mailbox name with root dir first
+     *
+     * @param   string  $root   Optional root folder
+     * @param   string  $filter Optional filter for mailbox listing
+     * @return  array   List of mailboxes/folders
+     * @access  public
+     */
+    function list_mailboxes($root='', $filter='*')
+    {
+        $a_out = array();
+        $a_mboxes = $this->_list_mailboxes($root, $filter);
+
+        foreach ($a_mboxes as $idx => $mbox_row) {
+            if (strlen($name = $this->mod_mailbox($mbox_row, 'out')))
+                $a_out[] = $name;
+            unset($a_mboxes[$idx]);
+        }
+
+        // INBOX should always be available
+        if (!in_array('INBOX', $a_out))
+            array_unshift($a_out, 'INBOX');
+
+        // sort mailboxes
+        $a_out = $this->_sort_mailbox_list($a_out);
+
+        return $a_out;
+    }
+
+
+    /**
+     * Private method for mailbox listing
+     *
+     * @param   string  $root   Optional root folder
+     * @param   string  $filter Optional filter for mailbox listing
+     * @return  array   List of mailboxes/folders
+     * @see     rcube_imap::list_mailboxes()
+     * @access  private
+     */
+    private function _list_mailboxes($root='', $filter='*')
+    {
+        // get cached folder list
+        $a_mboxes = $this->get_cache('mailboxes');
+        if (is_array($a_mboxes))
+            return $a_mboxes;
+
+        $a_defaults = $a_out = array();
+
+        // Give plugins a chance to provide a list of mailboxes
+        $data = rcmail::get_instance()->plugins->exec_hook('mailboxes_list',
+            array('root' => $root, 'filter' => $filter, 'mode' => 'LSUB'));
+
+        if (isset($data['folders'])) {
+            $a_folders = $data['folders'];
+        }
+        else {
+            // Server supports LIST-EXTENDED, we can use selection options
+            $config = rcmail::get_instance()->config;
+            // #1486225: Some dovecot versions returns wrong result using LIST-EXTENDED
+            if (!$config->get('imap_force_lsub') && $this->get_capability('LIST-EXTENDED')) {
+                // This will also set mailbox options, LSUB doesn't do that
+                $a_folders = $this->conn->listMailboxes($this->mod_mailbox($root), $filter,
+                    NULL, array('SUBSCRIBED'));
+
+                // remove non-existent folders
+                if (is_array($a_folders)) {
+                    foreach ($a_folders as $idx => $folder) {
+                        if ($this->conn->data['LIST'] && ($opts = $this->conn->data['LIST'][$folder])
+                            && in_array('\\NonExistent', $opts)
+                        ) {
+                            unset($a_folders[$idx]);
+                        } 
+                    }
+                }
+            }
+            // retrieve list of folders from IMAP server using LSUB
+            else {
+                $a_folders = $this->conn->listSubscribed($this->mod_mailbox($root), $filter);
+            }
+        }
+
+        if (!is_array($a_folders) || !sizeof($a_folders))
+            $a_folders = array();
+
+        // write mailboxlist to cache
+        $this->update_cache('mailboxes', $a_folders);
+
+        return $a_folders;
+    }
+
+
+    /**
+     * Get a list of all folders available on the IMAP server
+     *
+     * @param string $root   IMAP root dir
+     * @param string $filter Optional filter for mailbox listing
+     * @return array Indexed array with folder names
+     */
+    function list_unsubscribed($root='', $filter='*')
+    {
+        // Give plugins a chance to provide a list of mailboxes
+        $data = rcmail::get_instance()->plugins->exec_hook('mailboxes_list',
+            array('root' => $root, 'filter' => $filter, 'mode' => 'LIST'));
+
+        if (isset($data['folders'])) {
+            $a_mboxes = $data['folders'];
+        }
+        else {
+            // retrieve list of folders from IMAP server
+            $a_mboxes = $this->conn->listMailboxes($this->mod_mailbox($root), $filter);
+        }
+
+        $a_folders = array();
+        if (!is_array($a_mboxes))
+            $a_mboxes = array();
+
+        // modify names with root dir
+        foreach ($a_mboxes as $idx => $mbox_name) {
+            if (strlen($name = $this->mod_mailbox($mbox_name, 'out')))
+                $a_folders[] = $name;
+            unset($a_mboxes[$idx]);
+        }
+
+        // INBOX should always be available
+        if (!in_array('INBOX', $a_folders))
+            array_unshift($a_folders, 'INBOX');
+
+        // filter folders and sort them
+        $a_folders = $this->_sort_mailbox_list($a_folders);
+        return $a_folders;
+    }
+
+
+    /**
+     * Get mailbox quota information
+     * added by Nuny
+     *
+     * @return mixed Quota info or False if not supported
+     */
+    function get_quota()
+    {
+        if ($this->get_capability('QUOTA'))
+            return $this->conn->getQuota();
+
+        return false;
+    }
+
+
+    /**
+     * Get mailbox size (size of all messages in a mailbox)
+     *
+     * @param string $name Mailbox name
+     * @return int Mailbox size in bytes, False on error
+     */
+    function get_mailbox_size($name)
+    {
+        $name = $this->mod_mailbox($name);
+
+        // @TODO: could we try to use QUOTA here?
+        $result = $this->conn->fetchHeaderIndex($name, '1:*', 'SIZE', false);
+
+        if (is_array($result))
+            $result = array_sum($result);
+
+        return $result;
+    }
+
 
+    /**
+     * Subscribe to a specific mailbox(es)
+     *
+     * @param array $a_mboxes Mailbox name(s)
+     * @return boolean True on success
+     */
+    function subscribe($a_mboxes)
+    {
+        if (!is_array($a_mboxes))
+            $a_mboxes = array($a_mboxes);
 
-/**
- * Interface class for accessing an IMAP server
- *
- * This is a wrapper that implements the Iloha IMAP Library (IIL)
- *
- * @package    Mail
- * @author     Thomas Bruederli <roundcube@gmail.com>
- * @version    1.5
- * @link       http://ilohamail.org
- */
-class rcube_imap
-{
-  var $db;
-  var $conn;
-  var $root_ns = '';
-  var $root_dir = '';
-  var $mailbox = 'INBOX';
-  var $list_page = 1;
-  var $page_size = 10;
-  var $sort_field = 'date';
-  var $sort_order = 'DESC';
-  var $index_sort = true;
-  var $delimiter = NULL;
-  var $caching_enabled = FALSE;
-  var $default_charset = 'ISO-8859-1';
-  var $struct_charset = NULL;
-  var $default_folders = array('INBOX');
-  var $default_folders_lc = array('inbox');
-  var $fetch_add_headers = '';
-  var $cache = array();
-  var $cache_keys = array();  
-  var $cache_changes = array();
-  var $uid_id_map = array();
-  var $msg_headers = array();
-  var $skip_deleted = FALSE;
-  var $search_set = NULL;
-  var $search_string = '';
-  var $search_charset = '';
-  var $search_sort_field = '';  
-  var $debug_level = 1;
-  var $error_code = 0;
-  var $options = array('auth_method' => 'check');
-  
-  private $host, $user, $pass, $port, $ssl;
-
-
-  /**
-   * Object constructor
-   *
-   * @param object DB Database connection
-   */
-  function __construct($db_conn)
-    {
-    $this->db = $db_conn;
-    }
-
-
-  /**
-   * Connect to an IMAP server
-   *
-   * @param  string   Host to connect
-   * @param  string   Username for IMAP account
-   * @param  string   Password for IMAP account
-   * @param  number   Port to connect to
-   * @param  string   SSL schema (either ssl or tls) or null if plain connection
-   * @return boolean  TRUE on success, FALSE on failure
-   * @access public
-   */
-  function connect($host, $user, $pass, $port=143, $use_ssl=null)
-    {
-    global $ICL_SSL, $ICL_PORT, $IMAP_USE_INTERNAL_DATE;
-    
-    // check for Open-SSL support in PHP build
-    if ($use_ssl && extension_loaded('openssl'))
-      $ICL_SSL = $use_ssl == 'imaps' ? 'ssl' : $use_ssl;
-    else if ($use_ssl) {
-      raise_error(array('code' => 403, 'type' => 'imap', 'file' => __FILE__,
-                        'message' => 'Open SSL not available;'), TRUE, FALSE);
-      $port = 143;
-    }
-
-    $ICL_PORT = $port;
-    $IMAP_USE_INTERNAL_DATE = false;
-
-    $attempt = 0;
-    do {
-      $data = rcmail::get_instance()->plugins->exec_hook('imap_connect', array('host' => $host, 'user' => $user, 'attempt' => ++$attempt));
-      if (!empty($data['pass']))
-        $pass = $data['pass'];
-
-      $this->conn = iil_Connect($data['host'], $data['user'], $pass, $this->options);
-    } while(!$this->conn && $data['retry']);
-
-    $this->host = $data['host'];
-    $this->user = $data['user'];
-    $this->pass = $pass;
-    $this->port = $port;
-    $this->ssl = $use_ssl;
-    
-    // print trace messages
-    if ($this->conn && ($this->debug_level & 8))
-      console($this->conn->message);
-    
-    // write error log
-    else if (!$this->conn && $GLOBALS['iil_error'])
-      {
-      $this->error_code = $GLOBALS['iil_errornum'];
-      raise_error(array('code' => 403,
-                       'type' => 'imap',
-                       'message' => $GLOBALS['iil_error']), TRUE, FALSE);
-      }
-
-    // get server properties
-    if ($this->conn)
-      {
-      if (!empty($this->conn->rootdir))
-        {
-        $this->set_rootdir($this->conn->rootdir);
-        $this->root_ns = preg_replace('/[.\/]$/', '', $this->conn->rootdir);
-        }
-      if (empty($this->delimiter))
-       $this->get_hierarchy_delimiter();
-      }
-
-    return $this->conn ? TRUE : FALSE;
-    }
-
-
-  /**
-   * Close IMAP connection
-   * Usually done on script shutdown
-   *
-   * @access public
-   */
-  function close()
-    {    
-    if ($this->conn)
-      iil_Close($this->conn);
-    }
-
-
-  /**
-   * Close IMAP connection and re-connect
-   * This is used to avoid some strange socket errors when talking to Courier IMAP
-   *
-   * @access public
-   */
-  function reconnect()
-    {
-    $this->close();
-    $this->connect($this->host, $this->user, $this->pass, $this->port, $this->ssl);
-    
-    // issue SELECT command to restore connection status
-    if ($this->mailbox)
-      iil_C_Select($this->conn, $this->mailbox);
-    }
-
-  /**
-   * Set options to be used in iil_Connect()
-   */
-  function set_options($opt)
-  {
-    $this->options = array_merge($this->options, (array)$opt);
-  }
-
-  /**
-   * Set a root folder for the IMAP connection.
-   *
-   * Only folders within this root folder will be displayed
-   * and all folder paths will be translated using this folder name
-   *
-   * @param  string   Root folder
-   * @access public
-   */
-  function set_rootdir($root)
-    {
-    if (preg_match('/[.\/]$/', $root)) //(substr($root, -1, 1)==='/')
-      $root = substr($root, 0, -1);
-
-    $this->root_dir = $root;
-    $this->options['rootdir'] = $root;
-    
-    if (empty($this->delimiter))
-      $this->get_hierarchy_delimiter();
-    }
-
-
-  /**
-   * Set default message charset
-   *
-   * This will be used for message decoding if a charset specification is not available
-   *
-   * @param  string   Charset string
-   * @access public
-   */
-  function set_charset($cs)
-    {
-    $this->default_charset = $cs;
-    }
-
-
-  /**
-   * This list of folders will be listed above all other folders
-   *
-   * @param  array  Indexed list of folder names
-   * @access public
-   */
-  function set_default_mailboxes($arr)
+        // let this common function do the main work
+        return $this->_change_subscription($a_mboxes, 'subscribe');
+    }
+
+
+    /**
+     * Unsubscribe mailboxes
+     *
+     * @param array $a_mboxes Mailbox name(s)
+     * @return boolean True on success
+     */
+    function unsubscribe($a_mboxes)
+    {
+        if (!is_array($a_mboxes))
+            $a_mboxes = array($a_mboxes);
+
+        // let this common function do the main work
+        return $this->_change_subscription($a_mboxes, 'unsubscribe');
+    }
+
+
+    /**
+     * Create a new mailbox on the server and register it in local cache
+     *
+     * @param string  $name      New mailbox name
+     * @param boolean $subscribe True if the new mailbox should be subscribed
+     * @param boolean True on success
+     */
+    function create_mailbox($name, $subscribe=false)
     {
-    if (is_array($arr))
-      {
-      $this->default_folders = $arr;
-      $this->default_folders_lc = array();
+        $result   = false;
+        $abs_name = $this->mod_mailbox($name);
+        $result   = $this->conn->createFolder($abs_name);
 
-      // add inbox if not included
-      if (!in_array_nocase('INBOX', $this->default_folders))
-        array_unshift($this->default_folders, 'INBOX');
+        // try to subscribe it
+        if ($result && $subscribe)
+            $this->subscribe($name);
 
-      // create a second list with lower cased names
-      foreach ($this->default_folders as $mbox)
-        $this->default_folders_lc[] = strtolower($mbox);
-      }
+        return $result;
     }
 
 
-  /**
-   * Set internal mailbox reference.
-   *
-   * All operations will be perfomed on this mailbox/folder
-   *
-   * @param  string  Mailbox/Folder name
-   * @access public
-   */
-  function set_mailbox($new_mbox)
+    /**
+     * Set a new name to an existing mailbox
+     *
+     * @param string $mbox_name Mailbox to rename
+     * @param string $new_name  New mailbox name
+     *
+     * @return boolean True on success
+     */
+    function rename_mailbox($mbox_name, $new_name)
     {
-    $mailbox = $this->mod_mailbox($new_mbox);
+        $result = false;
 
-    if ($this->mailbox == $mailbox)
-      return;
+        // make absolute path
+        $mailbox  = $this->mod_mailbox($mbox_name);
+        $abs_name = $this->mod_mailbox($new_name);
+        $delm     = $this->get_hierarchy_delimiter();
+
+        // get list of subscribed folders
+        if ((strpos($mailbox, '%') === false) && (strpos($mailbox, '*') === false)) {
+            $a_subscribed = $this->_list_mailboxes('', $mbox_name . $delm . '*');
+            $subscribed   = $this->mailbox_exists($mbox_name, true);
+        }
+        else {
+            $a_subscribed = $this->_list_mailboxes();
+            $subscribed   = in_array($mailbox, $a_subscribed);
+        }
 
-    $this->mailbox = $mailbox;
+        if (strlen($abs_name))
+            $result = $this->conn->renameFolder($mailbox, $abs_name);
+
+        if ($result) {
+            // unsubscribe the old folder, subscribe the new one
+            if ($subscribed) {
+                $this->conn->unsubscribe($mailbox);
+                $this->conn->subscribe($abs_name);
+            }
+
+            // check if mailbox children are subscribed
+            foreach ($a_subscribed as $c_subscribed) {
+                if (preg_match('/^'.preg_quote($mailbox.$delm, '/').'/', $c_subscribed)) {
+                    $this->conn->unsubscribe($c_subscribed);
+                    $this->conn->subscribe(preg_replace('/^'.preg_quote($mailbox, '/').'/',
+                        $abs_name, $c_subscribed));
+                }
+            }
+
+            // clear cache
+            $this->clear_message_cache($mailbox.'.msg');
+            $this->clear_cache('mailboxes');
+        }
 
-    // clear messagecount cache for this mailbox
-    $this->_clear_messagecount($mailbox);
+        return $result;
     }
 
 
-  /**
-   * Set internal list page
-   *
-   * @param  number  Page number to list
-   * @access public
-   */
-  function set_page($page)
+    /**
+     * Remove mailbox from server
+     *
+     * @param string $mbox_name Mailbox name
+     *
+     * @return boolean True on success
+     */
+    function delete_mailbox($mbox_name)
     {
-    $this->list_page = (int)$page;
+        $result  = false;
+        $mailbox = $this->mod_mailbox($mbox_name);
+        $delm    = $this->get_hierarchy_delimiter();
+
+        // get list of folders
+        if ((strpos($mailbox, '%') === false) && (strpos($mailbox, '*') === false))
+            $sub_mboxes = $this->list_unsubscribed('', $mailbox . $delm . '*');
+        else
+            $sub_mboxes = $this->list_unsubscribed();
+
+        // send delete command to server
+        $result = $this->conn->deleteFolder($mailbox);
+
+        if ($result) {
+            // unsubscribe mailbox
+            $this->conn->unsubscribe($mailbox);
+
+            foreach ($sub_mboxes as $c_mbox) {
+                if (preg_match('/^'.preg_quote($mailbox.$delm, '/').'/', $c_mbox)) {
+                    $this->conn->unsubscribe($c_mbox);
+                    if ($this->conn->deleteFolder($c_mbox)) {
+                           $this->clear_message_cache($c_mbox.'.msg');
+                    }
+                }
+            }
+
+            // clear mailbox-related cache
+            $this->clear_message_cache($mailbox.'.msg');
+            $this->clear_cache('mailboxes');
+        }
+
+        return $result;
     }
 
 
-  /**
-   * Set internal page size
-   *
-   * @param  number  Number of messages to display on one page
-   * @access public
-   */
-  function set_pagesize($size)
+    /**
+     * Create all folders specified as default
+     */
+    function create_default_folders()
     {
-    $this->page_size = (int)$size;
+        // create default folders if they do not exist
+        foreach ($this->default_folders as $folder) {
+            if (!$this->mailbox_exists($folder))
+                $this->create_mailbox($folder, true);
+            else if (!$this->mailbox_exists($folder, true))
+                $this->subscribe($folder);
+        }
     }
-    
 
-  /**
-   * Save a set of message ids for future message listing methods
-   *
-   * @param  string  IMAP Search query
-   * @param  array   List of message ids or NULL if empty
-   * @param  string  Charset of search string
-   * @param  string  Sorting field
-   */
-  function set_search_set($str=null, $msgs=null, $charset=null, $sort_field=null)
+
+    /**
+     * Checks if folder exists and is subscribed
+     *
+     * @param string   $mbox_name    Folder name
+     * @param boolean  $subscription Enable subscription checking
+     * @return boolean TRUE or FALSE
+     */
+    function mailbox_exists($mbox_name, $subscription=false)
     {
-    if (is_array($str) && $msgs == null)
-      list($str, $msgs, $charset, $sort_field) = $str;
-    if ($msgs != null && !is_array($msgs))
-      $msgs = explode(',', $msgs);
-      
-    $this->search_string = $str;
-    $this->search_set = $msgs;
-    $this->search_charset = $charset;
-    $this->search_sort_field = $sort_field;
+        if ($mbox_name == 'INBOX')
+            return true;
+
+        $key  = $subscription ? 'subscribed' : 'existing';
+        $mbox = $this->mod_mailbox($mbox_name);
+
+        if (is_array($this->icache[$key]) && in_array($mbox, $this->icache[$key]))
+            return true;
+
+        if ($subscription) {
+            $a_folders = $this->conn->listSubscribed('', $mbox);
+        }
+        else {
+            $a_folders = $this->conn->listMailboxes('', $mbox);
+        }
+
+        if (is_array($a_folders) && in_array($mbox, $a_folders)) {
+            $this->icache[$key][] = $mbox;
+            return true;
+        }
+
+        return false;
     }
 
 
-  /**
-   * Return the saved search set as hash array
-   * @return array Search set
-   */
-  function get_search_set()
+    /**
+     * Modify folder name for input/output according to root dir and namespace
+     *
+     * @param string  $mbox_name Folder name
+     * @param string  $mode      Mode
+     * @return string Folder name
+     */
+    function mod_mailbox($mbox_name, $mode='in')
     {
-    return array($this->search_string, $this->search_set, $this->search_charset, $this->search_sort_field);
+        if (!strlen($mbox_name))
+            return '';
+
+        if ($mode == 'in') {
+            // If folder contains namespace prefix, don't modify it
+            if (is_array($this->namespace['shared'])) {
+                foreach ($this->namespace['shared'] as $ns) {
+                    if ($ns[0] && strpos($mbox_name, $ns[0]) === 0) {
+                        return $mbox_name;
+                    }
+                }
+            }
+            if (is_array($this->namespace['other'])) {
+                foreach ($this->namespace['other'] as $ns) {
+                    if ($ns[0] && strpos($mbox_name, $ns[0]) === 0) {
+                        return $mbox_name;
+                    }
+                }
+            }
+            if (is_array($this->namespace['personal'])) {
+                foreach ($this->namespace['personal'] as $ns) {
+                    if ($ns[0] && strpos($mbox_name, $ns[0]) === 0) {
+                        return $mbox_name;
+                    }
+                }
+                // Add prefix if first personal namespace is non-empty
+                if ($mbox_name != 'INBOX' && $this->namespace['personal'][0][0]) {
+                    return $this->namespace['personal'][0][0].$mbox_name;
+                }
+            }
+        }
+        else {
+            // Remove prefix if folder is from first ("non-empty") personal namespace
+            if (is_array($this->namespace['personal'])) {
+                if ($prefix = $this->namespace['personal'][0][0]) {
+                    if (strpos($mbox_name, $prefix) === 0) {
+                        return substr($mbox_name, strlen($prefix));
+                    }
+                }
+            }
+        }
+
+        return $mbox_name;
     }
 
 
-  /**
-   * Returns the currently used mailbox name
-   *
-   * @return  string Name of the mailbox/folder
-   * @access  public
-   */
-  function get_mailbox_name()
+    /**
+     * Gets folder options from LIST response, e.g. \Noselect, \Noinferiors
+     *
+     * @param string $mbox_name Folder name
+     * @param bool   $force     Set to True if options should be refreshed
+     *                          Options are available after LIST command only
+     *
+     * @return array Options list
+     */
+    function mailbox_options($mbox_name, $force=false)
     {
-    return $this->conn ? $this->mod_mailbox($this->mailbox, 'out') : '';
+        $mbox = $this->mod_mailbox($mbox_name);
+
+        if ($mbox == 'INBOX') {
+            return array();
+        }
+
+        if (!is_array($this->conn->data['LIST']) || !is_array($this->conn->data['LIST'][$mbox])) {
+            if ($force) {
+                $this->conn->listMailboxes('', $mbox_name);
+            }
+            else {
+                return array();
+            }
+        }
+
+        $opts = $this->conn->data['LIST'][$mbox];
+
+        return is_array($opts) ? $opts : array();
     }
 
 
-  /**
-   * Returns the IMAP server's capability
-   *
-   * @param   string  Capability name
-   * @return  mixed   Capability value or TRUE if supported, FALSE if not
-   * @access  public
-   */
-  function get_capability($cap)
+    /**
+     * Get message header names for rcube_imap_generic::fetchHeader(s)
+     *
+     * @return string Space-separated list of header names
+     */
+    private function get_fetch_headers()
     {
-    return iil_C_GetCapability($this->conn, strtoupper($cap));
+        $headers = explode(' ', $this->fetch_add_headers);
+        $headers = array_map('strtoupper', $headers);
+
+        if ($this->caching_enabled || $this->get_all_headers)
+            $headers = array_merge($headers, $this->all_headers);
+
+        return implode(' ', array_unique($headers));
     }
 
 
-  /**
-   * Checks the PERMANENTFLAGS capability of the current mailbox
-   * and returns true if the given flag is supported by the IMAP server
-   *
-   * @param   string  Permanentflag name
-   * @return  mixed   True if this flag is supported
-   * @access  public
-   */
-  function check_permflag($flag)
+    /* -----------------------------------------
+     *   ACL and METADATA/ANNOTATEMORE methods
+     * ----------------------------------------*/
+
+    /**
+     * Changes the ACL on the specified mailbox (SETACL)
+     *
+     * @param string $mailbox Mailbox name
+     * @param string $user    User name
+     * @param string $acl     ACL string
+     *
+     * @return boolean True on success, False on failure
+     *
+     * @access public
+     * @since 0.5-beta
+     */
+    function set_acl($mailbox, $user, $acl)
     {
-    $flag = strtoupper($flag);
-    $imap_flag = $GLOBALS['IMAP_FLAGS'][$flag];
-    return (in_array_nocase($imap_flag, $this->conn->permanentflags));
+        $mailbox = $this->mod_mailbox($mailbox);
+
+        if ($this->get_capability('ACL'))
+            return $this->conn->setACL($mailbox, $user, $acl);
+
+        return false;
     }
 
 
-  /**
-   * Returns the delimiter that is used by the IMAP server for folder separation
-   *
-   * @return  string  Delimiter string
-   * @access  public
-   */
-  function get_hierarchy_delimiter()
+    /**
+     * Removes any <identifier,rights> pair for the
+     * specified user from the ACL for the specified
+     * mailbox (DELETEACL)
+     *
+     * @param string $mailbox Mailbox name
+     * @param string $user    User name
+     *
+     * @return boolean True on success, False on failure
+     *
+     * @access public
+     * @since 0.5-beta
+     */
+    function delete_acl($mailbox, $user)
     {
-    if ($this->conn && empty($this->delimiter))
-      $this->delimiter = iil_C_GetHierarchyDelimiter($this->conn);
+        $mailbox = $this->mod_mailbox($mailbox);
 
-    if (empty($this->delimiter))
-      $this->delimiter = '/';
+        if ($this->get_capability('ACL'))
+            return $this->conn->deleteACL($mailbox, $user);
 
-    return $this->delimiter;
+        return false;
     }
 
 
-  /**
-   * Public method for mailbox listing.
-   *
-   * Converts mailbox name with root dir first
-   *
-   * @param   string  Optional root folder
-   * @param   string  Optional filter for mailbox listing
-   * @return  array   List of mailboxes/folders
-   * @access  public
-   */
-  function list_mailboxes($root='', $filter='*')
+    /**
+     * Returns the access control list for mailbox (GETACL)
+     *
+     * @param string $mailbox Mailbox name
+     *
+     * @return array User-rights array on success, NULL on error
+     * @access public
+     * @since 0.5-beta
+     */
+    function get_acl($mailbox)
     {
-    $a_out = array();
-    $a_mboxes = $this->_list_mailboxes($root, $filter);
+        $mailbox = $this->mod_mailbox($mailbox);
 
-    foreach ($a_mboxes as $mbox_row)
-      {
-      $name = $this->mod_mailbox($mbox_row, 'out');
-      if (strlen($name))
-        $a_out[] = $name;
-      }
+        if ($this->get_capability('ACL'))
+            return $this->conn->getACL($mailbox);
 
-    // INBOX should always be available
-    if (!in_array_nocase('INBOX', $a_out))
-      array_unshift($a_out, 'INBOX');
+        return NULL;
+    }
 
-    // sort mailboxes
-    $a_out = $this->_sort_mailbox_list($a_out);
 
-    return $a_out;
-    }
+    /**
+     * Returns information about what rights can be granted to the
+     * user (identifier) in the ACL for the mailbox (LISTRIGHTS)
+     *
+     * @param string $mailbox Mailbox name
+     * @param string $user    User name
+     *
+     * @return array List of user rights
+     * @access public
+     * @since 0.5-beta
+     */
+    function list_rights($mailbox, $user)
+    {
+        $mailbox = $this->mod_mailbox($mailbox);
 
+        if ($this->get_capability('ACL'))
+            return $this->conn->listRights($mailbox, $user);
 
-  /**
-   * Private method for mailbox listing
-   *
-   * @return  array   List of mailboxes/folders
-   * @see     rcube_imap::list_mailboxes()
-   * @access  private
-   */
-  private function _list_mailboxes($root='', $filter='*')
-    {
-    $a_defaults = $a_out = array();
-    
-    // get cached folder list    
-    $a_mboxes = $this->get_cache('mailboxes');
-    if (is_array($a_mboxes))
-      return $a_mboxes;
+        return NULL;
+    }
 
-    // Give plugins a chance to provide a list of mailboxes
-    $data = rcmail::get_instance()->plugins->exec_hook('list_mailboxes',array('root'=>$root,'filter'=>$filter));
-    if (isset($data['folders'])) {
-        $a_folders = $data['folders'];
-    }
-    else{
-        // retrieve list of folders from IMAP server
-        $a_folders = iil_C_ListSubscribed($this->conn, $this->mod_mailbox($root), $filter);
-    }
-
-    
-    if (!is_array($a_folders) || !sizeof($a_folders))
-      $a_folders = array();
-
-    // write mailboxlist to cache
-    $this->update_cache('mailboxes', $a_folders);
-    
-    return $a_folders;
-    }
-
-
-  /**
-   * Get message count for a specific mailbox
-   *
-   * @param   string   Mailbox/folder name
-   * @param   string   Mode for count [ALL|UNSEEN|RECENT]
-   * @param   boolean  Force reading from server and update cache
-   * @return  int      Number of messages
-   * @access  public
-   */
-  function messagecount($mbox_name='', $mode='ALL', $force=FALSE)
-    {
-    $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox;
-    return $this->_messagecount($mailbox, $mode, $force);
-    }
-
-
-  /**
-   * Private method for getting nr of messages
-   *
-   * @access  private
-   * @see     rcube_imap::messagecount()
-   */
-  private function _messagecount($mailbox='', $mode='ALL', $force=FALSE)
-    {
-    $mode = strtoupper($mode);
-
-    if (empty($mailbox))
-      $mailbox = $this->mailbox;
-      
-    // count search set
-    if ($this->search_string && $mailbox == $this->mailbox && $mode == 'ALL' && !$force)
-      return count((array)$this->search_set);
-
-    $a_mailbox_cache = $this->get_cache('messagecount');
-    
-    // return cached value
-    if (!$force && is_array($a_mailbox_cache[$mailbox]) && isset($a_mailbox_cache[$mailbox][$mode]))
-      return $a_mailbox_cache[$mailbox][$mode];
-
-    // RECENT count is fetched a bit different
-    if ($mode == 'RECENT')
-       $count = iil_C_CheckForRecent($this->conn, $mailbox);
-
-    // use SEARCH for message counting
-    else if ($this->skip_deleted)
-      {
-      $search_str = "ALL UNDELETED";
-
-      // get message count and store in cache
-      if ($mode == 'UNSEEN')
-        $search_str .= " UNSEEN";
-
-      // get message count using SEARCH
-      // not very performant but more precise (using UNDELETED)
-      $index = $this->_search_index($mailbox, $search_str);
-      $count = is_array($index) ? count($index) : 0;
-      }
-    else
-      {
-      if ($mode == 'UNSEEN')
-        $count = iil_C_CountUnseen($this->conn, $mailbox);
-      else
-        $count = iil_C_CountMessages($this->conn, $mailbox);
-      }
-
-    if (!is_array($a_mailbox_cache[$mailbox]))
-      $a_mailbox_cache[$mailbox] = array();
-      
-    $a_mailbox_cache[$mailbox][$mode] = (int)$count;
-
-    // write back to cache
-    $this->update_cache('messagecount', $a_mailbox_cache);
-
-    return (int)$count;
-    }
-
-
-  /**
-   * Public method for listing headers
-   * convert mailbox name with root dir first
-   *
-   * @param   string   Mailbox/folder name
-   * @param   int      Current page to list
-   * @param   string   Header field to sort by
-   * @param   string   Sort order [ASC|DESC]
-   * @param   boolean  Number of slice items to extract from result array
-   * @return  array    Indexed array with message header objects
-   * @access  public   
-   */
-  function list_headers($mbox_name='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $slice=0)
-    {
-    $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox;
-    return $this->_list_headers($mailbox, $page, $sort_field, $sort_order, false, $slice);
-    }
-
-
-  /**
-   * Private method for listing message headers
-   *
-   * @access  private
-   * @see     rcube_imap::list_headers
-   */
-  private function _list_headers($mailbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $recursive=FALSE, $slice=0)
-    {
-    if (!strlen($mailbox))
-      return array();
-
-    // use saved message set
-    if ($this->search_string && $mailbox == $this->mailbox)
-      return $this->_list_header_set($mailbox, $page, $sort_field, $sort_order, $slice);
-
-    $this->_set_sort_order($sort_field, $sort_order);
-
-    $page = $page ? $page : $this->list_page;
-    $cache_key = $mailbox.'.msg';
-    $cache_status = $this->check_cache_status($mailbox, $cache_key);
-
-    // cache is OK, we can get all messages from local cache
-    if ($cache_status>0)
-      {
-      $start_msg = ($page-1) * $this->page_size;
-      $a_msg_headers = $this->get_message_cache($cache_key, $start_msg, $start_msg+$this->page_size, $this->sort_field, $this->sort_order);
-      $result = array_values($a_msg_headers);
-      if ($slice)
-        $result = array_slice($result, -$slice, $slice);
-      return $result;
-      }
-    // cache is dirty, sync it
-    else if ($this->caching_enabled && $cache_status==-1 && !$recursive)
-      {
-      $this->sync_header_index($mailbox);
-      return $this->_list_headers($mailbox, $page, $this->sort_field, $this->sort_order, TRUE, $slice);
-      }
-
-    // retrieve headers from IMAP
-    $a_msg_headers = array();
-
-    // use message index sort for sorting by Date (for better performance)
-    if ($this->index_sort && $this->sort_field == 'date')
-      {
-        if ($this->skip_deleted) {
-          // @TODO: this could be cached
-         if ($msg_index = $this->_search_index($mailbox, 'ALL UNDELETED')) {
-            $max = max($msg_index);
-            list($begin, $end) = $this->_get_message_range(count($msg_index), $page);
-            $msg_index = array_slice($msg_index, $begin, $end-$begin);
-           }
-       } else if ($max = iil_C_CountMessages($this->conn, $mailbox)) {
-          list($begin, $end) = $this->_get_message_range($max, $page);
-         $msg_index = range($begin+1, $end);
-       } else
-         $msg_index = array();
 
-        if ($slice)
-          $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice);
+    /**
+     * Returns the set of rights that the current user has to
+     * mailbox (MYRIGHTS)
+     *
+     * @param string $mailbox Mailbox name
+     *
+     * @return array MYRIGHTS response on success, NULL on error
+     * @access public
+     * @since 0.5-beta
+     */
+    function my_rights($mailbox)
+    {
+        $mailbox = $this->mod_mailbox($mailbox);
 
-        // fetch reqested headers from server
-       if ($msg_index)
-          $this->_fetch_headers($mailbox, join(",", $msg_index), $a_msg_headers, $cache_key);
-      }
-    // use SORT command
-    else if ($this->get_capability('sort') && ($msg_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field, $this->skip_deleted ? 'UNDELETED' : '')))
-      {
-      list($begin, $end) = $this->_get_message_range(count($msg_index), $page);
-      $max = max($msg_index);
-      $msg_index = array_slice($msg_index, $begin, $end-$begin);
-
-      if ($slice)
-        $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice);
-
-      // fetch reqested headers from server
-      $this->_fetch_headers($mailbox, join(',', $msg_index), $a_msg_headers, $cache_key);
-      }
-    // fetch specified header for all messages and sort
-    else if ($a_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, "1:*", $this->sort_field, $this->skip_deleted))
-      {
-      asort($a_index); // ASC
-      $msg_index = array_keys($a_index);
-      $max = max($msg_index);
-      list($begin, $end) = $this->_get_message_range(count($msg_index), $page);
-      $msg_index = array_slice($msg_index, $begin, $end-$begin);
-
-      if ($slice)
-        $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice);
-
-      // fetch reqested headers from server
-      $this->_fetch_headers($mailbox, join(",", $msg_index), $a_msg_headers, $cache_key);
-      }
-
-    // delete cached messages with a higher index than $max+1
-    // Changed $max to $max+1 to fix this bug : #1484295
-    $this->clear_message_cache($cache_key, $max + 1);
-
-    // kick child process to sync cache
-    // ...
-
-    // return empty array if no messages found
-    if (!is_array($a_msg_headers) || empty($a_msg_headers))
-      return array();
-    
-    // use this class for message sorting
-    $sorter = new rcube_header_sorter();
-    $sorter->set_sequence_numbers($msg_index);
-    $sorter->sort_headers($a_msg_headers);
-
-    if ($this->sort_order == 'DESC')
-      $a_msg_headers = array_reverse($a_msg_headers);      
-
-    return array_values($a_msg_headers);
-    }
-
-
-  /**
-   * Private method for listing a set of message headers (search results)
-   *
-   * @param   string   Mailbox/folder name
-   * @param   int      Current page to list
-   * @param   string   Header field to sort by
-   * @param   string   Sort order [ASC|DESC]
-   * @param   boolean  Number of slice items to extract from result array
-   * @return  array    Indexed array with message header objects
-   * @access  private
-   * @see     rcube_imap::list_header_set()
-   */
-  private function _list_header_set($mailbox, $page=NULL, $sort_field=NULL, $sort_order=NULL, $slice=0)
-    {
-    if (!strlen($mailbox) || empty($this->search_set))
-      return array();
-
-    $msgs = $this->search_set;
-    $a_msg_headers = array();
-    $page = $page ? $page : $this->list_page;
-    $start_msg = ($page-1) * $this->page_size;
-
-    $this->_set_sort_order($sort_field, $sort_order);
-
-    // quickest method
-    if ($this->index_sort && $this->search_sort_field == 'date' && $this->sort_field == 'date')
-      {
-      if ($sort_order == 'DESC')
-        $msgs = array_reverse($msgs);
-
-      // get messages uids for one page
-      $msgs = array_slice(array_values($msgs), $start_msg, min(count($msgs)-$start_msg, $this->page_size));
-
-      if ($slice)
-        $msgs = array_slice($msgs, -$slice, $slice);
-
-      // fetch headers
-      $this->_fetch_headers($mailbox, join(',',$msgs), $a_msg_headers, NULL);
-
-      // I didn't found in RFC that FETCH always returns messages sorted by index
-      $sorter = new rcube_header_sorter();
-      $sorter->set_sequence_numbers($msgs);
-      $sorter->sort_headers($a_msg_headers);
-
-      return array_values($a_msg_headers);
-      }
-    // sorted messages, so we can first slice array and then fetch only wanted headers
-    if ($this->get_capability('sort') && (!$this->index_sort || $this->sort_field != 'date')) // SORT searching result
-      {
-      // reset search set if sorting field has been changed
-      if ($this->sort_field && $this->search_sort_field != $this->sort_field)
-        $msgs = $this->search('', $this->search_string, $this->search_charset, $this->sort_field);
-
-      // return empty array if no messages found
-      if (empty($msgs))
-        return array();
-
-      if ($sort_order == 'DESC')
-        $msgs = array_reverse($msgs);
-
-      // get messages uids for one page
-      $msgs = array_slice(array_values($msgs), $start_msg, min(count($msgs)-$start_msg, $this->page_size));
-
-      if ($slice)
-        $msgs = array_slice($msgs, -$slice, $slice);
-
-      // fetch headers
-      $this->_fetch_headers($mailbox, join(',',$msgs), $a_msg_headers, NULL);
-
-      $sorter = new rcube_header_sorter();
-      $sorter->set_sequence_numbers($msgs);
-      $sorter->sort_headers($a_msg_headers);
-
-      return array_values($a_msg_headers);
-      }
-    else { // SEARCH searching result, need sorting
-      $cnt = count($msgs);
-      // 300: experimantal value for best result
-      if (($cnt > 300 && $cnt > $this->page_size) || ($this->index_sort && $this->sort_field == 'date')) {
-        // use memory less expensive (and quick) method for big result set
-       $a_index = $this->message_index('', $this->sort_field, $this->sort_order);
-        // get messages uids for one page...
-        $msgs = array_slice($a_index, $start_msg, min($cnt-$start_msg, $this->page_size));
-        if ($slice)
-          $msgs = array_slice($msgs, -$slice, $slice);
-       // ...and fetch headers
-        $this->_fetch_headers($mailbox, join(',', $msgs), $a_msg_headers, NULL);
+        if ($this->get_capability('ACL'))
+            return $this->conn->myRights($mailbox);
 
-        // return empty array if no messages found
-        if (!is_array($a_msg_headers) || empty($a_msg_headers))
-          return array();
+        return NULL;
+    }
 
-        $sorter = new rcube_header_sorter();
-        $sorter->set_sequence_numbers($msgs);
-        $sorter->sort_headers($a_msg_headers);
 
-        return array_values($a_msg_headers);
+    /**
+     * Sets IMAP metadata/annotations (SETMETADATA/SETANNOTATION)
+     *
+     * @param string $mailbox Mailbox name (empty for server metadata)
+     * @param array  $entries Entry-value array (use NULL value as NIL)
+     *
+     * @return boolean True on success, False on failure
+     * @access public
+     * @since 0.5-beta
+     */
+    function set_metadata($mailbox, $entries)
+    {
+        if ($mailbox)
+            $mailbox = $this->mod_mailbox($mailbox);
+
+        if ($this->get_capability('METADATA') ||
+            (!strlen($mailbox) && $this->get_capability('METADATA-SERVER'))
+        ) {
+            return $this->conn->setMetadata($mailbox, $entries);
+        }
+        else if ($this->get_capability('ANNOTATEMORE') || $this->get_capability('ANNOTATEMORE2')) {
+            foreach ($entries as $entry => $value) {
+                list($ent, $attr) = $this->md2annotate($entry);
+                $entries[$entry] = array($ent, $attr, $value);
+            }
+            return $this->conn->setAnnotation($mailbox, $entries);
         }
-      else {
-        // for small result set we can fetch all messages headers
-        $this->_fetch_headers($mailbox, join(',', $msgs), $a_msg_headers, NULL);
-    
-        // return empty array if no messages found
-        if (!is_array($a_msg_headers) || empty($a_msg_headers))
-          return array();
 
-        // if not already sorted
-        $a_msg_headers = iil_SortHeaders($a_msg_headers, $this->sort_field, $this->sort_order);
-      
-        // only return the requested part of the set
-       $a_msg_headers = array_slice(array_values($a_msg_headers), $start_msg, min($cnt-$start_msg, $this->page_size));
-        if ($slice)
-          $a_msg_headers = array_slice($a_msg_headers, -$slice, $slice);
-
-        return $a_msg_headers;
-        }
-      }
-    }
-
-
-  /**
-   * Helper function to get first and last index of the requested set
-   *
-   * @param  int     message count
-   * @param  mixed   page number to show, or string 'all'
-   * @return array   array with two values: first index, last index
-   * @access private
-   */
-  private function _get_message_range($max, $page)
-    {
-    $start_msg = ($page-1) * $this->page_size;
-    
-    if ($page=='all')
-      {
-      $begin = 0;
-      $end = $max;
-      }
-    else if ($this->sort_order=='DESC')
-      {
-      $begin = $max - $this->page_size - $start_msg;
-      $end =   $max - $start_msg;
-      }
-    else
-      {
-      $begin = $start_msg;
-      $end   = $start_msg + $this->page_size;
-      }
-
-    if ($begin < 0) $begin = 0;
-    if ($end < 0) $end = $max;
-    if ($end > $max) $end = $max;
-    
-    return array($begin, $end);
-    }
-    
-
-  /**
-   * Fetches message headers
-   * Used for loop
-   *
-   * @param  string  Mailbox name
-   * @param  string  Message index to fetch
-   * @param  array   Reference to message headers array
-   * @param  array   Array with cache index
-   * @return int     Messages count
-   * @access private
-   */
-  private function _fetch_headers($mailbox, $msgs, &$a_msg_headers, $cache_key)
-    {
-    // fetch reqested headers from server
-    $a_header_index = iil_C_FetchHeaders($this->conn, $mailbox, $msgs, false, false, $this->fetch_add_headers);
-
-    if (!empty($a_header_index))
-      {
-      // cache is incomplete
-      $cache_index = $this->get_message_cache_index($cache_key);
-
-      foreach ($a_header_index as $i => $headers) {
-        if ($this->caching_enabled && $cache_index[$headers->id] != $headers->uid) {
-         // prevent index duplicates
-         if ($cache_index[$headers->id]) {
-           $this->remove_message_cache($cache_key, $headers->id, true);
-           unset($cache_index[$headers->id]);
-           }
-          // add message to cache
-         $this->add_message_cache($cache_key, $headers->id, $headers, NULL,
-           !in_array($headers->uid, $cache_index));
-         }
-
-        $a_msg_headers[$headers->uid] = $headers;
-        }
-      }
-
-    return count($a_msg_headers);
-    }
-    
-  
-  /**
-   * Return sorted array of message IDs (not UIDs)
-   *
-   * @param string Mailbox to get index from
-   * @param string Sort column
-   * @param string Sort order [ASC, DESC]
-   * @return array Indexed array with message ids
-   */
-  function message_index($mbox_name='', $sort_field=NULL, $sort_order=NULL)
-    {
-    $this->_set_sort_order($sort_field, $sort_order);
-
-    $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox;
-    $key = "{$mailbox}:{$this->sort_field}:{$this->sort_order}:{$this->search_string}.msgi";
-
-    // we have a saved search result, get index from there
-    if (!isset($this->cache[$key]) && $this->search_string && $mailbox == $this->mailbox)
-    {
-      $this->cache[$key] = array();
-      
-      // use message index sort for sorting by Date
-      if ($this->index_sort && $this->sort_field == 'date')
-        {
-       $msgs = $this->search_set;
-       
-       if ($this->search_sort_field != 'date')
-         sort($msgs);
-       
-        if ($this->sort_order == 'DESC')
-          $this->cache[$key] = array_reverse($msgs);
-        else
-          $this->cache[$key] = $msgs;
+        return false;
+    }
+
+
+    /**
+     * Unsets IMAP metadata/annotations (SETMETADATA/SETANNOTATION)
+     *
+     * @param string $mailbox Mailbox name (empty for server metadata)
+     * @param array  $entries Entry names array
+     *
+     * @return boolean True on success, False on failure
+     *
+     * @access public
+     * @since 0.5-beta
+     */
+    function delete_metadata($mailbox, $entries)
+    {
+        if ($mailbox)
+            $mailbox = $this->mod_mailbox($mailbox);
+
+        if ($this->get_capability('METADATA') || 
+            (!strlen($mailbox) && $this->get_capability('METADATA-SERVER'))
+        ) {
+            return $this->conn->deleteMetadata($mailbox, $entries);
+        }
+        else if ($this->get_capability('ANNOTATEMORE') || $this->get_capability('ANNOTATEMORE2')) {
+            foreach ($entries as $idx => $entry) {
+                list($ent, $attr) = $this->md2annotate($entry);
+                $entries[$idx] = array($ent, $attr, NULL);
+            }
+            return $this->conn->setAnnotation($mailbox, $entries);
         }
-      // sort with SORT command
-      else if ($this->get_capability('sort'))
-        {
-        if ($this->sort_field && $this->search_sort_field != $this->sort_field)
-          $this->search('', $this->search_string, $this->search_charset, $this->sort_field);
 
-        if ($this->sort_order == 'DESC')
-          $this->cache[$key] = array_reverse($this->search_set);
-        else
-          $this->cache[$key] = $this->search_set;
-        }
-      else
-        {
-        $a_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, join(',', $this->search_set), $this->sort_field, $this->skip_deleted);
-
-        if ($this->sort_order=="ASC")
-          asort($a_index);
-        else if ($this->sort_order=="DESC")
-          arsort($a_index);
-
-        $this->cache[$key] = array_keys($a_index);
-       }
-    }
-
-    // have stored it in RAM
-    if (isset($this->cache[$key]))
-      return $this->cache[$key];
-
-    // check local cache
-    $cache_key = $mailbox.'.msg';
-    $cache_status = $this->check_cache_status($mailbox, $cache_key);
-
-    // cache is OK
-    if ($cache_status>0)
-      {
-      $a_index = $this->get_message_cache_index($cache_key, TRUE, $this->sort_field, $this->sort_order);
-      return array_keys($a_index);
-      }
-
-    // use message index sort for sorting by Date
-    if ($this->index_sort && $this->sort_field == 'date')
-      {
-      if ($this->skip_deleted) {
-        $a_index = $this->_search_index($mailbox, 'ALL');
-      } else if ($max = $this->_messagecount($mailbox)) {
-        $a_index = range(1, $max);
-      }
-
-      if ($this->sort_order == 'DESC')
-        $a_index = array_reverse($a_index);
-
-      $this->cache[$key] = $a_index;
-      }
-    // fetch complete message index
-    else if ($this->get_capability('sort') && ($a_index = iil_C_Sort($this->conn, $mailbox, $this->sort_field, $this->skip_deleted ? 'UNDELETED' : '')))
-      {
-      if ($this->sort_order == 'DESC')
-        $a_index = array_reverse($a_index);
-
-      $this->cache[$key] = $a_index;
-      }
-    else
-      {
-      $a_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, "1:*", $this->sort_field, $this->skip_deleted);
-
-      if ($this->sort_order=="ASC")
-        asort($a_index);
-      else if ($this->sort_order=="DESC")
-        arsort($a_index);
-        
-      $this->cache[$key] = array_keys($a_index);
-      }
-
-    return $this->cache[$key];
-    }
-
-
-  /**
-   * @access private
-   */
-  function sync_header_index($mailbox)
-    {
-    $cache_key = $mailbox.'.msg';
-    $cache_index = $this->get_message_cache_index($cache_key);
-
-    // fetch complete message index
-    $a_message_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, "1:*", 'UID', $this->skip_deleted);
-    
-    if ($a_message_index === false)
-      return false;
-        
-    foreach ($a_message_index as $id => $uid)
-      {
-      // message in cache at correct position
-      if ($cache_index[$id] == $uid)
-        {
-        unset($cache_index[$id]);
-        continue;
-        }
-        
-      // message in cache but in wrong position
-      if (in_array((string)$uid, $cache_index, TRUE))
-        {
-        unset($cache_index[$id]);
-        }
-      
-      // other message at this position
-      if (isset($cache_index[$id]))
-        {
-       $for_remove[] = $cache_index[$id];
-        unset($cache_index[$id]);
-        }
-        
-       $for_update[] = $id;
-      }
-
-    // clear messages at wrong positions and those deleted that are still in cache_index      
-    if (!empty($for_remove))
-      $cache_index = array_merge($cache_index, $for_remove);
-    
-    if (!empty($cache_index))
-      $this->remove_message_cache($cache_key, $cache_index);
-
-    // fetch complete headers and add to cache
-    if (!empty($for_update)) {
-      if ($headers = iil_C_FetchHeader($this->conn, $mailbox, join(',', $for_update), false, $this->fetch_add_headers))
-        foreach ($headers as $header)
-          $this->add_message_cache($cache_key, $header->id, $header, NULL,
-               in_array($header->uid, (array)$for_remove));
-      }
-    }
-
-
-  /**
-   * Invoke search request to IMAP server
-   *
-   * @param  string  mailbox name to search in
-   * @param  string  search string
-   * @param  string  search string charset
-   * @param  string  header field to sort by
-   * @return array   search results as list of message ids
-   * @access public
-   */
-  function search($mbox_name='', $str=NULL, $charset=NULL, $sort_field=NULL)
-    {
-    if (!$str)
-      return false;
-    
-    $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox;
-
-    $results = $this->_search_index($mailbox, $str, $charset, $sort_field);
-
-    // try search with US-ASCII charset (should be supported by server)
-    // only if UTF-8 search is not supported
-    if (empty($results) && !is_array($results) && !empty($charset) && $charset != 'US-ASCII')
-      {
-       // convert strings to US_ASCII
-        if(preg_match_all('/\{([0-9]+)\}\r\n/', $str, $matches, PREG_OFFSET_CAPTURE))
-         {
-         $last = 0; $res = '';
-         foreach($matches[1] as $m)
-           {
-           $string_offset = $m[1] + strlen($m[0]) + 4; // {}\r\n
-           $string = substr($str, $string_offset - 1, $m[0]);
-           $string = rcube_charset_convert($string, $charset, 'US-ASCII');
-           if (!$string) continue;
-           $res .= sprintf("%s{%d}\r\n%s", substr($str, $last, $m[1] - $last - 1), strlen($string), $string);
-           $last = $m[0] + $string_offset - 1;
-           }
-           if ($last < strlen($str))
-             $res .= substr($str, $last, strlen($str)-$last);
-         }
-       else // strings for conversion not found
-         $res = $str;
-         
-       $results = $this->search($mbox_name, $res, NULL, $sort_field);
-      }
-
-    $this->set_search_set($str, $results, $charset, $sort_field);
-
-    return $results;
-    }
-
-
-  /**
-   * Private search method
-   *
-   * @return array   search results as list of message ids
-   * @access private
-   * @see rcube_imap::search()
-   */
-  private function _search_index($mailbox, $criteria='ALL', $charset=NULL, $sort_field=NULL)
-    {
-    $orig_criteria = $criteria;
-
-    if ($this->skip_deleted && !preg_match('/UNDELETED/', $criteria))
-      $criteria = 'UNDELETED '.$criteria;
-
-    if ($sort_field && $this->get_capability('sort') && (!$this->index_sort || $sort_field != 'date')) {
-      $charset = $charset ? $charset : $this->default_charset;
-      $a_messages = iil_C_Sort($this->conn, $mailbox, $sort_field, $criteria, FALSE, $charset);
-      }
-    else {
-      if ($orig_criteria == 'ALL') {
-        $max = $this->_messagecount($mailbox);
-        $a_messages = $max ? range(1, $max) : array();
-        }
-      else {
-        $a_messages = iil_C_Search($this->conn, $mailbox, ($charset ? "CHARSET $charset " : '') . $criteria);
-    
-        // I didn't found that SEARCH always returns sorted IDs
-        if ($this->index_sort && $this->sort_field == 'date')
-          sort($a_messages);
-        }
-      }
-    // update messagecount cache ?
-//    $a_mailbox_cache = get_cache('messagecount');
-//    $a_mailbox_cache[$mailbox][$criteria] = sizeof($a_messages);
-//    $this->update_cache('messagecount', $a_mailbox_cache);
-        
-    return $a_messages;
-    }
-    
-  
-  /**
-   * Refresh saved search set
-   *
-   * @return array Current search set
-   */
-  function refresh_search()
-    {
-    if (!empty($this->search_string))
-      $this->search_set = $this->search('', $this->search_string, $this->search_charset, $this->search_sort_field);
-      
-    return $this->get_search_set();
-    }
-  
-  
-  /**
-   * Check if the given message ID is part of the current search set
-   *
-   * @return boolean True on match or if no search request is stored
-   */
-  function in_searchset($msgid)
-  {
-    if (!empty($this->search_string))
-      return in_array("$msgid", (array)$this->search_set, true);
-    else
-      return true;
-  }
-
-
-  /**
-   * Return message headers object of a specific message
-   *
-   * @param int     Message ID
-   * @param string  Mailbox to read from 
-   * @param boolean True if $id is the message UID
-   * @param boolean True if we need also BODYSTRUCTURE in headers
-   * @return object Message headers representation
-   */
-  function get_headers($id, $mbox_name=NULL, $is_uid=TRUE, $bodystr=FALSE)
-    {
-    $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox;
-    $uid = $is_uid ? $id : $this->_id2uid($id);
-
-    // get cached headers
-    if ($uid && ($headers = &$this->get_cached_message($mailbox.'.msg', $uid)))
-      return $headers;
-
-    $headers = iil_C_FetchHeader($this->conn, $mailbox, $id, $is_uid, $bodystr, $this->fetch_add_headers);
-
-    // write headers cache
-    if ($headers)
-      {
-      if ($headers->uid && $headers->id)
-        $this->uid_id_map[$mailbox][$headers->uid] = $headers->id;
-
-      $this->add_message_cache($mailbox.'.msg', $headers->id, $headers, NULL, true);
-      }
-
-    return $headers;
-    }
-
-
-  /**
-   * Fetch body structure from the IMAP server and build
-   * an object structure similar to the one generated by PEAR::Mail_mimeDecode
-   *
-   * @param int Message UID to fetch
-   * @param string Message BODYSTRUCTURE string (optional)
-   * @return object rcube_message_part Message part tree or False on failure
-   */
-  function &get_structure($uid, $structure_str='')
-    {
-    $cache_key = $this->mailbox.'.msg';
-    $headers = &$this->get_cached_message($cache_key, $uid);
-
-    // return cached message structure
-    if (is_object($headers) && is_object($headers->structure)) {
-      return $headers->structure;
-    }
-
-    if (!$structure_str)
-      $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $uid, true);
-    $structure = iml_GetRawStructureArray($structure_str);
-    $struct = false;
-
-    // parse structure and add headers
-    if (!empty($structure))
-      {
-      $headers = $this->get_headers($uid);
-      $this->_msg_id = $headers->id;
-
-      // set message charset from message headers
-      if ($headers->charset)
-        $this->struct_charset = $headers->charset;
-      else
-        $this->struct_charset = $this->_structure_charset($structure);
-
-      // Here we can recognize malformed BODYSTRUCTURE and 
-      // 1. [@TODO] parse the message in other way to create our own message structure
-      // 2. or just show the raw message body.
-      // Example of structure for malformed MIME message:
-      // ("text" "plain" ("charset" "us-ascii") NIL NIL "7bit" 2154 70 NIL NIL NIL)
-      if ($headers->ctype && $headers->ctype != 'text/plain'
-         && $structure[0] == 'text' && $structure[1] == 'plain') {
-       return false;  
-       }
-
-      $struct = &$this->_structure_part($structure);
-      $struct->headers = get_object_vars($headers);
-
-      // don't trust given content-type
-      if (empty($struct->parts) && !empty($struct->headers['ctype']))
-        {
-        $struct->mime_id = '1';
-        $struct->mimetype = strtolower($struct->headers['ctype']);
-        list($struct->ctype_primary, $struct->ctype_secondary) = explode('/', $struct->mimetype);
-        }
-
-      // write structure to cache
-      if ($this->caching_enabled)
-        $this->add_message_cache($cache_key, $this->_msg_id, $headers, $struct);
-      }
-
-    return $struct;
-    }
-
-  
-  /**
-   * Build message part object
-   *
-   * @access private
-   */
-  function &_structure_part($part, $count=0, $parent='', $raw_headers=null)
-    {
-    $struct = new rcube_message_part;
-    $struct->mime_id = empty($parent) ? (string)$count : "$parent.$count";
-
-    // multipart
-    if (is_array($part[0]))
-      {
-      $struct->ctype_primary = 'multipart';
-      
-      // find first non-array entry
-      for ($i=1; $i<count($part); $i++)
-        if (!is_array($part[$i]))
-          {
-          $struct->ctype_secondary = strtolower($part[$i]);
-          break;
-          }
-          
-      $struct->mimetype = 'multipart/'.$struct->ctype_secondary;
-
-      // build parts list for headers pre-fetching
-      for ($i=0, $count=0; $i<count($part); $i++)
-        if (is_array($part[$i]) && count($part[$i]) > 3)
-         // fetch message headers if message/rfc822 or named part (could contain Content-Location header)
-         if (strtolower($part[$i][0]) == 'message' ||
-           (in_array('name', (array)$part[$i][2]) && (empty($part[$i][3]) || $part[$i][3]=='NIL'))) {
-           $part_headers[] = $struct->mime_id ? $struct->mime_id.'.'.($i+1) : $i+1;
-           }
-
-      // pre-fetch headers of all parts (in one command for better performance)
-      if ($part_headers)
-        $part_headers = iil_C_FetchMIMEHeaders($this->conn, $this->mailbox, $this->_msg_id, $part_headers);
-
-      $struct->parts = array();
-      for ($i=0, $count=0; $i<count($part); $i++)
-        if (is_array($part[$i]) && count($part[$i]) > 3) {
-          $struct->parts[] = $this->_structure_part($part[$i], ++$count, $struct->mime_id,
-               $part_headers[$struct->mime_id ? $struct->mime_id.'.'.($i+1) : $i+1]);
-       }
-
-      return $struct;
-      }
-    
-    
-    // regular part
-    $struct->ctype_primary = strtolower($part[0]);
-    $struct->ctype_secondary = strtolower($part[1]);
-    $struct->mimetype = $struct->ctype_primary.'/'.$struct->ctype_secondary;
-
-    // read content type parameters
-    if (is_array($part[2]))
-      {
-      $struct->ctype_parameters = array();
-      for ($i=0; $i<count($part[2]); $i+=2)
-        $struct->ctype_parameters[strtolower($part[2][$i])] = $part[2][$i+1];
-        
-      if (isset($struct->ctype_parameters['charset']))
-        $struct->charset = $struct->ctype_parameters['charset'];
-      }
-    
-    // read content encoding
-    if (!empty($part[5]) && $part[5]!='NIL')
-      {
-      $struct->encoding = strtolower($part[5]);
-      $struct->headers['content-transfer-encoding'] = $struct->encoding;
-      }
-    
-    // get part size
-    if (!empty($part[6]) && $part[6]!='NIL')
-      $struct->size = intval($part[6]);
-
-    // read part disposition
-    $di = count($part) - 2;
-    if ((is_array($part[$di]) && count($part[$di]) == 2 && is_array($part[$di][1])) ||
-        (is_array($part[--$di]) && count($part[$di]) == 2))
-      {
-      $struct->disposition = strtolower($part[$di][0]);
-
-      if (is_array($part[$di][1]))
-        for ($n=0; $n<count($part[$di][1]); $n+=2)
-          $struct->d_parameters[strtolower($part[$di][1][$n])] = $part[$di][1][$n+1];
-      }
-      
-    // get child parts
-    if (is_array($part[8]) && $di != 8)
-      {
-      $struct->parts = array();
-      for ($i=0, $count=0; $i<count($part[8]); $i++)
-        if (is_array($part[8][$i]) && count($part[8][$i]) > 5)
-          $struct->parts[] = $this->_structure_part($part[8][$i], ++$count, $struct->mime_id);
-      }
-
-    // get part ID
-    if (!empty($part[3]) && $part[3]!='NIL')
-      {
-      $struct->content_id = $part[3];
-      $struct->headers['content-id'] = $part[3];
-    
-      if (empty($struct->disposition))
-        $struct->disposition = 'inline';
-      }
-    
-    // fetch message headers if message/rfc822 or named part (could contain Content-Location header)
-    if ($struct->ctype_primary == 'message' || ($struct->ctype_parameters['name'] && !$struct->content_id)) {
-      if (empty($raw_headers))
-        $raw_headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $struct->mime_id);
-      $struct->headers = $this->_parse_headers($raw_headers) + $struct->headers;
-    }
-
-    if ($struct->ctype_primary=='message') {
-      if (is_array($part[8]) && empty($struct->parts))
-        $struct->parts[] = $this->_structure_part($part[8], ++$count, $struct->mime_id);
-    }
-
-    // normalize filename property
-    $this->_set_part_filename($struct, $raw_headers);
-
-    return $struct;
-    }
-    
-
-  /**
-   * Set attachment filename from message part structure 
-   *
-   * @access private
-   * @param  object rcube_message_part Part object
-   * @param  string Part's raw headers
-   */
-  private function _set_part_filename(&$part, $headers=null)
-    {
-    if (!empty($part->d_parameters['filename']))
-      $filename_mime = $part->d_parameters['filename'];
-    else if (!empty($part->d_parameters['filename*']))
-      $filename_encoded = $part->d_parameters['filename*'];
-    else if (!empty($part->ctype_parameters['name*']))
-      $filename_encoded = $part->ctype_parameters['name*'];
-    // RFC2231 value continuations
-    // TODO: this should be rewrited to support RFC2231 4.1 combinations
-    else if (!empty($part->d_parameters['filename*0'])) {
-      $i = 0;
-      while (isset($part->d_parameters['filename*'.$i])) {
-        $filename_mime .= $part->d_parameters['filename*'.$i];
-        $i++;
-      }
-      // some servers (eg. dovecot-1.x) have no support for parameter value continuations
-      // we must fetch and parse headers "manually"
-      if ($i<2) {
-       if (!$headers)
-          $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
-        $filename_mime = '';
-        $i = 0;
-        while (preg_match('/filename\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
-          $filename_mime .= $matches[1];
-          $i++;
-        }
-      }
-    }
-    else if (!empty($part->d_parameters['filename*0*'])) {
-      $i = 0;
-      while (isset($part->d_parameters['filename*'.$i.'*'])) {
-        $filename_encoded .= $part->d_parameters['filename*'.$i.'*'];
-        $i++;
-      }
-      if ($i<2) {
-       if (!$headers)
-          $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
-        $filename_encoded = '';
-        $i = 0; $matches = array();
-        while (preg_match('/filename\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
-          $filename_encoded .= $matches[1];
-          $i++;
-        }
-      }
-    }
-    else if (!empty($part->ctype_parameters['name*0'])) {
-      $i = 0;
-      while (isset($part->ctype_parameters['name*'.$i])) {
-        $filename_mime .= $part->ctype_parameters['name*'.$i];
-        $i++;
-      }
-      if ($i<2) {
-       if (!$headers)
-          $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
-        $filename_mime = '';
-        $i = 0; $matches = array();
-        while (preg_match('/\s+name\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
-          $filename_mime .= $matches[1];
-          $i++;
-        }
-      }
-    }
-    else if (!empty($part->ctype_parameters['name*0*'])) {
-      $i = 0;
-      while (isset($part->ctype_parameters['name*'.$i.'*'])) {
-        $filename_encoded .= $part->ctype_parameters['name*'.$i.'*'];
-        $i++;
-      }
-      if ($i<2) {
-       if (!$headers)
-          $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
-        $filename_encoded = '';
-        $i = 0; $matches = array();
-        while (preg_match('/\s+name\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
-          $filename_encoded .= $matches[1];
-          $i++;
-        }
-      }
-    }
-    // read 'name' after rfc2231 parameters as it may contains truncated filename (from Thunderbird)
-    else if (!empty($part->ctype_parameters['name']))
-      $filename_mime = $part->ctype_parameters['name'];
-    // Content-Disposition
-    else if (!empty($part->headers['content-description']))
-      $filename_mime = $part->headers['content-description'];
-    else
-      return;
-
-    // decode filename
-    if (!empty($filename_mime)) {
-      $part->filename = rcube_imap::decode_mime_string($filename_mime, 
-        $part->charset ? $part->charset : $this->struct_charset ? $this->struct_charset :
-           rc_detect_encoding($filename_mime, $this->default_charset));
-      } 
-    else if (!empty($filename_encoded)) {
-      // decode filename according to RFC 2231, Section 4
-      if (preg_match("/^([^']*)'[^']*'(.*)$/", $filename_encoded, $fmatches)) {
-        $filename_charset = $fmatches[1];
-        $filename_encoded = $fmatches[2];
-        }
-      $part->filename = rcube_charset_convert(urldecode($filename_encoded), $filename_charset);
-      }
-    }
-
-
-  /**
-   * Get charset name from message structure (first part)
-   *
-   * @access private
-   * @param  array  Message structure
-   * @return string Charset name
-   */
-  function _structure_charset($structure)
-    {
-      while (is_array($structure)) {
-       if (is_array($structure[2]) && $structure[2][0] == 'charset')
-         return $structure[2][1];
-       $structure = $structure[0];
-       }
-    } 
-
-
-  /**
-   * Fetch message body of a specific message from the server
-   *
-   * @param  int    Message UID
-   * @param  string Part number
-   * @param  object rcube_message_part Part object created by get_structure()
-   * @param  mixed  True to print part, ressource to write part contents in
-   * @param  resource File pointer to save the message part
-   * @return string Message/part body if not printed
-   */
-  function &get_message_part($uid, $part=1, $o_part=NULL, $print=NULL, $fp=NULL)
-    {
-    // get part encoding if not provided
-    if (!is_object($o_part))
-      {
-      $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $uid, true); 
-      $structure = iml_GetRawStructureArray($structure_str);
-      // error or message not found
-      if (empty($structure))
         return false;
+    }
+
 
-      $part_type = iml_GetPartTypeCode($structure, $part);
-      $o_part = new rcube_message_part;
-      $o_part->ctype_primary = $part_type==0 ? 'text' : ($part_type==2 ? 'message' : 'other');
-      $o_part->encoding = strtolower(iml_GetPartEncodingString($structure, $part));
-      $o_part->charset = iml_GetPartCharset($structure, $part);
-      }
-      
-    // TODO: Add caching for message parts
+    /**
+     * Returns IMAP metadata/annotations (GETMETADATA/GETANNOTATION)
+     *
+     * @param string $mailbox Mailbox name (empty for server metadata)
+     * @param array  $entries Entries
+     * @param array  $options Command options (with MAXSIZE and DEPTH keys)
+     *
+     * @return array Metadata entry-value hash array on success, NULL on error
+     *
+     * @access public
+     * @since 0.5-beta
+     */
+    function get_metadata($mailbox, $entries, $options=array())
+    {
+        if ($mailbox)
+            $mailbox = $this->mod_mailbox($mailbox);
 
-    if (!$part) $part = 'TEXT';
+        if ($this->get_capability('METADATA') || 
+            !strlen(($mailbox) && $this->get_capability('METADATA-SERVER'))
+        ) {
+            return $this->conn->getMetadata($mailbox, $entries, $options);
+        }
+        else if ($this->get_capability('ANNOTATEMORE') || $this->get_capability('ANNOTATEMORE2')) {
+            $queries = array();
+            $res     = array();
+
+            // Convert entry names
+            foreach ($entries as $entry) {
+                list($ent, $attr) = $this->md2annotate($entry);
+                $queries[$attr][] = $ent;
+            }
+
+            // @TODO: Honor MAXSIZE and DEPTH options
+            foreach ($queries as $attrib => $entry)
+                if ($result = $this->conn->getAnnotation($mailbox, $entry, $attrib))
+                    $res = array_merge($res, $result);
+
+            return $res;
+        }
 
-    $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $uid, true, $part,
-        $o_part->encoding, $print, $fp);
+        return NULL;
+    }
 
-    if ($fp || $print)
-      return true;
 
-    // convert charset (if text or message part)
-    if ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message') {
-      // assume default if no charset specified
-      if (empty($o_part->charset) || strtolower($o_part->charset) == 'us-ascii')
-        $o_part->charset = $this->default_charset;
+    /**
+     * Converts the METADATA extension entry name into the correct
+     * entry-attrib names for older ANNOTATEMORE version.
+     *
+     * @param string Entry name
+     *
+     * @return array Entry-attribute list, NULL if not supported (?)
+     */
+    private function md2annotate($name)
+    {
+        if (substr($entry, 0, 7) == '/shared') {
+            return array(substr($entry, 7), 'value.shared');
+        }
+        else if (substr($entry, 0, 8) == '/private') {
+            return array(substr($entry, 8), 'value.priv');
+        }
 
-      $body = rcube_charset_convert($body, $o_part->charset);
-      }
-    
-    return $body;
+        // @TODO: log error
+        return NULL;
     }
 
 
-  /**
-   * Fetch message body of a specific message from the server
-   *
-   * @param  int    Message UID
-   * @return string Message/part body
-   * @see    rcube_imap::get_message_part()
-   */
-  function &get_body($uid, $part=1)
+    /* --------------------------------
+     *   internal caching methods
+     * --------------------------------*/
+
+    /**
+     * Enable or disable caching
+     *
+     * @param boolean $set Flag
+     * @access public
+     */
+    function set_caching($set)
     {
-    $headers = $this->get_headers($uid);
-    return rcube_charset_convert($this->get_message_part($uid, $part, NULL),
-      $headers->charset ? $headers->charset : $this->default_charset);
+        if ($set && is_object($this->db))
+            $this->caching_enabled = true;
+        else
+            $this->caching_enabled = false;
     }
 
 
-  /**
-   * Returns the whole message source as string
-   *
-   * @param int  Message UID
-   * @return string Message source string
-   */
-  function &get_raw_body($uid)
+    /**
+     * Returns cached value
+     *
+     * @param string $key Cache key
+     * @return mixed
+     * @access public
+     */
+    function get_cache($key)
     {
-    return iil_C_HandlePartBody($this->conn, $this->mailbox, $uid, true);
+        // read cache (if it was not read before)
+        if (!count($this->cache) && $this->caching_enabled) {
+            return $this->_read_cache_record($key);
+        }
+
+        return $this->cache[$key];
     }
 
 
-  /**
-   * Returns the message headers as string
-   *
-   * @param int  Message UID
-   * @return string Message headers string
-   */
-  function &get_raw_headers($uid)
+    /**
+     * Update cache
+     *
+     * @param string $key  Cache key
+     * @param mixed  $data Data
+     * @access private
+     */
+    private function update_cache($key, $data)
     {
-    return iil_C_FetchPartHeader($this->conn, $this->mailbox, $uid, true);
+        $this->cache[$key] = $data;
+        $this->cache_changed = true;
+        $this->cache_changes[$key] = true;
     }
-    
 
-  /**
-   * Sends the whole message source to stdout
-   *
-   * @param int  Message UID
-   */ 
-  function print_raw_body($uid)
+
+    /**
+     * Writes the cache
+     *
+     * @access private
+     */
+    private function write_cache()
     {
-    iil_C_HandlePartBody($this->conn, $this->mailbox, $uid, true, NULL, NULL, true);
+        if ($this->caching_enabled && $this->cache_changed) {
+            foreach ($this->cache as $key => $data) {
+                if ($this->cache_changes[$key])
+                    $this->_write_cache_record($key, serialize($data));
+            }
+        }
     }
 
 
-  /**
-   * Set message flag to one or several messages
-   *
-   * @param mixed  Message UIDs as array or as comma-separated string
-   * @param string Flag to set: SEEN, UNDELETED, DELETED, RECENT, ANSWERED, DRAFT, MDNSENT
-   * @param string Folder name
-   * @param boolean True to skip message cache clean up
-   * @return boolean True on success, False on failure
-   */
-  function set_flag($uids, $flag, $mbox_name=NULL, $skip_cache=false)
-    {
-    $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox;
-
-    $flag = strtoupper($flag);
-    if (!is_array($uids))
-      $uids = explode(',',$uids);
-      
-    if (strpos($flag, 'UN') === 0)
-      $result = iil_C_UnFlag($this->conn, $mailbox, join(',', $uids), substr($flag, 2));
-    else
-      $result = iil_C_Flag($this->conn, $mailbox, join(',', $uids), $flag);
-
-    // reload message headers if cached
-    if ($this->caching_enabled && !$skip_cache) {
-      $cache_key = $mailbox.'.msg';
-      $this->remove_message_cache($cache_key, $uids);
-      }
-
-    // set nr of messages that were flaged
-    $count = count($uids);
-
-    // clear message count cache
-    if ($result && $flag=='SEEN')
-      $this->_set_messagecount($mailbox, 'UNSEEN', $count*(-1));
-    else if ($result && $flag=='UNSEEN')
-      $this->_set_messagecount($mailbox, 'UNSEEN', $count);
-    else if ($result && $flag=='DELETED')
-      $this->_set_messagecount($mailbox, 'ALL', $count*(-1));
-
-    return $result;
-    }
-
-
-  /**
-   * Remove message flag for one or several messages
-   *
-   * @param mixed  Message UIDs as array or as comma-separated string
-   * @param string Flag to unset: SEEN, DELETED, RECENT, ANSWERED, DRAFT, MDNSENT
-   * @param string Folder name
-   * @return boolean True on success, False on failure
-   * @see set_flag
-   */
-  function unset_flag($uids, $flag, $mbox_name=NULL)
-    {
-    return $this->set_flag($uids, 'UN'.$flag, $mbox_name);
-    }
-
-
-  /**
-   * Append a mail message (source) to a specific mailbox
-   *
-   * @param string Target mailbox
-   * @param string Message source
-   * @return boolean True on success, False on error
-   */
-  function save_message($mbox_name, &$message)
-    {
-    $mailbox = $this->mod_mailbox($mbox_name);
-
-    // make sure mailbox exists
-    if (($mailbox == 'INBOX') || in_array($mailbox, $this->_list_mailboxes()))
-      $saved = iil_C_Append($this->conn, $mailbox, $message);
-
-    if ($saved)
-      {
-      // increase messagecount of the target mailbox
-      $this->_set_messagecount($mailbox, 'ALL', 1);
-      }
-          
-    return $saved;
-    }
-
-
-  /**
-   * Move a message from one mailbox to another
-   *
-   * @param string List of UIDs to move, separated by comma
-   * @param string Target mailbox
-   * @param string Source mailbox
-   * @return boolean True on success, False on error
-   */
-  function move_message($uids, $to_mbox, $from_mbox='')
-    {
-    $fbox = $from_mbox;
-    $tbox = $to_mbox;
-    $to_mbox = $this->mod_mailbox($to_mbox);
-    $from_mbox = $from_mbox ? $this->mod_mailbox($from_mbox) : $this->mailbox;
-
-    // make sure mailbox exists
-    if ($to_mbox != 'INBOX' && !in_array($to_mbox, $this->_list_mailboxes()))
-      {
-      if (in_array($to_mbox_in, $this->default_folders))
-        $this->create_mailbox($to_mbox_in, TRUE);
-      else
-        return FALSE;
-      }
-
-    // convert the list of uids to array
-    $a_uids = is_string($uids) ? explode(',', $uids) : (is_array($uids) ? $uids : NULL);
-
-    // exit if no message uids are specified
-    if (!is_array($a_uids) || empty($a_uids))
-      return false;
-
-    // flag messages as read before moving them
-    $config = rcmail::get_instance()->config;
-    if ($config->get('read_when_deleted') && $tbox == $config->get('trash_mbox')) {
-      // don't flush cache (4th argument)
-      $this->set_flag($uids, 'SEEN', $fbox, true);
-      }
-
-    // move messages
-    $iil_move = iil_C_Move($this->conn, join(',', $a_uids), $from_mbox, $to_mbox);
-    $moved = !($iil_move === false || $iil_move < 0);
-    
-    // send expunge command in order to have the moved message
-    // really deleted from the source mailbox
-    if ($moved) {
-      $this->_expunge($from_mbox, FALSE, $a_uids);
-      $this->_clear_messagecount($from_mbox);
-      $this->_clear_messagecount($to_mbox);
-    }
-    // moving failed
-    else if (rcmail::get_instance()->config->get('delete_always', false)) {
-      return iil_C_Delete($this->conn, $from_mbox, join(',', $a_uids));
-    }
-
-    // remove message ids from search set
-    if ($moved && $this->search_set && $from_mbox == $this->mailbox) {
-      foreach ($a_uids as $uid)
-        $a_mids[] = $this->_uid2id($uid, $from_mbox);
-      $this->search_set = array_diff($this->search_set, $a_mids);
-    }
-
-    // update cached message headers
-    $cache_key = $from_mbox.'.msg';
-    if ($moved && $start_index = $this->get_message_cache_index_min($cache_key, $a_uids)) {
-      // clear cache from the lowest index on
-      $this->clear_message_cache($cache_key, $start_index);
-      }
-
-    return $moved;
-    }
-
-
-  /**
-   * Mark messages as deleted and expunge mailbox
-   *
-   * @param string List of UIDs to move, separated by comma
-   * @param string Source mailbox
-   * @return boolean True on success, False on error
-   */
-  function delete_message($uids, $mbox_name='')
-    {
-    $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox;
-
-    // convert the list of uids to array
-    $a_uids = is_string($uids) ? explode(',', $uids) : (is_array($uids) ? $uids : NULL);
-    
-    // exit if no message uids are specified
-    if (!is_array($a_uids) || empty($a_uids))
-      return false;
-
-    $deleted = iil_C_Delete($this->conn, $mailbox, join(',', $a_uids));
-
-    // send expunge command in order to have the deleted message
-    // really deleted from the mailbox
-    if ($deleted)
-      {
-      $this->_expunge($mailbox, FALSE, $a_uids);
-      $this->_clear_messagecount($mailbox);
-      unset($this->uid_id_map[$mailbox]);
-      }
-
-    // remove message ids from search set
-    if ($deleted && $this->search_set && $mailbox == $this->mailbox) {
-      foreach ($a_uids as $uid)
-        $a_mids[] = $this->_uid2id($uid, $mailbox);
-      $this->search_set = array_diff($this->search_set, $a_mids);
-    }
-
-    // remove deleted messages from cache
-    $cache_key = $mailbox.'.msg';
-    if ($deleted && $start_index = $this->get_message_cache_index_min($cache_key, $a_uids)) {
-      // clear cache from the lowest index on
-      $this->clear_message_cache($cache_key, $start_index);
-      }
-
-    return $deleted;
-    }
-
-
-  /**
-   * Clear all messages in a specific mailbox
-   *
-   * @param string Mailbox name
-   * @return int Above 0 on success
-   */
-  function clear_mailbox($mbox_name=NULL)
-    {
-    $mailbox = !empty($mbox_name) ? $this->mod_mailbox($mbox_name) : $this->mailbox;
-    $msg_count = $this->_messagecount($mailbox, 'ALL');
-    
-    if ($msg_count>0)
-      {
-      $cleared = iil_C_ClearFolder($this->conn, $mailbox);
-      
-      // make sure the message count cache is cleared as well
-      if ($cleared)
-        {
-        $this->clear_message_cache($mailbox.'.msg');      
-        $a_mailbox_cache = $this->get_cache('messagecount');
-        unset($a_mailbox_cache[$mailbox]);
-        $this->update_cache('messagecount', $a_mailbox_cache);
+    /**
+     * Clears the cache.
+     *
+     * @param string $key Cache key
+     * @access public
+     */
+    function clear_cache($key=NULL)
+    {
+        if (!$this->caching_enabled)
+            return;
+
+        if ($key===NULL) {
+            foreach ($this->cache as $key => $data)
+                $this->_clear_cache_record($key);
+
+            $this->cache = array();
+            $this->cache_changed = false;
+            $this->cache_changes = array();
+        }
+        else {
+            $this->_clear_cache_record($key);
+            $this->cache_changes[$key] = false;
+            unset($this->cache[$key]);
         }
-        
-      return $cleared;
-      }
-    else
-      return 0;
     }
-
-
-  /**
-   * Send IMAP expunge command and clear cache
-   *
-   * @param string Mailbox name
-   * @param boolean False if cache should not be cleared
-   * @return boolean True on success
-   */
-  function expunge($mbox_name='', $clear_cache=TRUE)
+
+
+    /**
+     * Returns cached entry
+     *
+     * @param string $key Cache key
+     * @return mixed Cached value
+     * @access private
+     */
+    private function _read_cache_record($key)
     {
-    $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox;
-    return $this->_expunge($mailbox, $clear_cache);
+        if ($this->db) {
+            // get cached data from DB
+            $sql_result = $this->db->query(
+                "SELECT cache_id, data, cache_key ".
+                "FROM ".get_table_name('cache').
+                " WHERE user_id=? ".
+                   "AND cache_key LIKE 'IMAP.%'",
+                $_SESSION['user_id']);
+
+            while ($sql_arr = $this->db->fetch_assoc($sql_result)) {
+                   $sql_key = preg_replace('/^IMAP\./', '', $sql_arr['cache_key']);
+                $this->cache_keys[$sql_key] = $sql_arr['cache_id'];
+                   if (!isset($this->cache[$sql_key]))
+                       $this->cache[$sql_key] = $sql_arr['data'] ? unserialize($sql_arr['data']) : false;
+            }
+        }
+
+        return $this->cache[$key];
     }
 
 
-  /**
-   * Send IMAP expunge command and clear cache
-   *
-   * @see rcube_imap::expunge()
-   * @param string     Mailbox name
-   * @param boolean    False if cache should not be cleared
-   * @param string     List of UIDs to remove, separated by comma
-   * @return boolean True on success
-   * @access private
-   */
-  private function _expunge($mailbox, $clear_cache=TRUE, $uids=NULL)
+    /**
+     * Writes single cache record
+     *
+     * @param string $key  Cache key
+     * @param mxied  $data Cache value
+     * @access private
+     */
+    private function _write_cache_record($key, $data)
     {
-    if ($uids && $this->get_capability('UIDPLUS')) 
-      $a_uids = is_array($uids) ? join(',', $uids) : $uids;
-    else
-      $a_uids = NULL;
+        if (!$this->db)
+            return false;
+
+        // update existing cache record
+        if ($this->cache_keys[$key]) {
+            $this->db->query(
+                "UPDATE ".get_table_name('cache').
+                " SET created=". $this->db->now().", data=? ".
+                "WHERE user_id=? ".
+                "AND cache_key=?",
+                $data,
+                $_SESSION['user_id'],
+                'IMAP.'.$key);
+        }
+        // add new cache record
+        else {
+            $this->db->query(
+                "INSERT INTO ".get_table_name('cache').
+                " (created, user_id, cache_key, data) ".
+                "VALUES (".$this->db->now().", ?, ?, ?)",
+                $_SESSION['user_id'],
+                'IMAP.'.$key,
+                $data);
+
+            // get cache entry ID for this key
+            $sql_result = $this->db->query(
+                "SELECT cache_id ".
+                "FROM ".get_table_name('cache').
+                " WHERE user_id=? ".
+                "AND cache_key=?",
+                $_SESSION['user_id'],
+                'IMAP.'.$key);
+
+            if ($sql_arr = $this->db->fetch_assoc($sql_result))
+                $this->cache_keys[$key] = $sql_arr['cache_id'];
+        }
+    }
 
-    $result = iil_C_Expunge($this->conn, $mailbox, $a_uids);
 
-    if ($result>=0 && $clear_cache)
-      {
-      $this->clear_message_cache($mailbox.'.msg');
-      $this->_clear_messagecount($mailbox);
-      }
-      
-    return $result;
+    /**
+     * Clears cache for single record
+     *
+     * @param string $ket Cache key
+     * @access private
+     */
+    private function _clear_cache_record($key)
+    {
+        $this->db->query(
+            "DELETE FROM ".get_table_name('cache').
+            " WHERE user_id=? ".
+            "AND cache_key=?",
+            $_SESSION['user_id'],
+            'IMAP.'.$key);
+
+        unset($this->cache_keys[$key]);
     }
 
 
-  /* --------------------------------
-   *        folder managment
-   * --------------------------------*/
+
+    /* --------------------------------
+     *   message caching methods
+     * --------------------------------*/
+
+    /**
+     * Checks if the cache is up-to-date
+     *
+     * @param string $mailbox   Mailbox name
+     * @param string $cache_key Internal cache key
+     * @return int   Cache status: -3 = off, -2 = incomplete, -1 = dirty, 1 = OK
+     */
+    private function check_cache_status($mailbox, $cache_key)
+    {
+        if (!$this->caching_enabled)
+            return -3;
+
+        $cache_index = $this->get_message_cache_index($cache_key);
+        $msg_count = $this->_messagecount($mailbox);
+        $cache_count = count($cache_index);
+
+        // empty mailbox
+        if (!$msg_count) {
+            return $cache_count ? -2 : 1;
+        }
+
+        if ($cache_count == $msg_count) {
+            if ($this->skip_deleted) {
+                if (!empty($this->icache['all_undeleted_idx'])) {
+                    $uids = rcube_imap_generic::uncompressMessageSet($this->icache['all_undeleted_idx']);
+                    $uids = array_flip($uids);
+                    foreach ($cache_index as $uid) {
+                        unset($uids[$uid]);
+                    }
+                }
+                else {
+                    // get all undeleted messages excluding cached UIDs
+                    $uids = $this->search_once($mailbox, 'ALL UNDELETED NOT UID '.
+                        rcube_imap_generic::compressMessageSet($cache_index));
+                }
+                if (empty($uids)) {
+                    return 1;
+                }
+            } else {
+                // get UID of the message with highest index
+                $uid = $this->_id2uid($msg_count, $mailbox);
+                $cache_uid = array_pop($cache_index);
+
+                // uids of highest message matches -> cache seems OK
+                if ($cache_uid == $uid) {
+                    return 1;
+                }
+            }
+            // cache is dirty
+            return -1;
+        }
+
+        // if cache count differs less than 10% report as dirty
+        return (abs($msg_count - $cache_count) < $msg_count/10) ? -1 : -2;
+    }
 
 
-  /**
-   * Get a list of all folders available on the IMAP server
-   * 
-   * @param string IMAP root dir
-   * @return array Indexed array with folder names
-   */
-  function list_unsubscribed($root='')
+    /**
+     * @param string $key Cache key
+     * @param string $from
+     * @param string $to
+     * @param string $sort_field
+     * @param string $sort_order
+     * @access private
+     */
+    private function get_message_cache($key, $from, $to, $sort_field, $sort_order)
     {
-    static $sa_unsubscribed;
-    
-    if (is_array($sa_unsubscribed))
-      return $sa_unsubscribed;
-      
-    // retrieve list of folders from IMAP server
-    $a_mboxes = iil_C_ListMailboxes($this->conn, $this->mod_mailbox($root), '*');
+        if (!$this->caching_enabled)
+            return NULL;
+
+        // use idx sort as default sorting
+        if (!$sort_field || !in_array($sort_field, $this->db_header_fields)) {
+            $sort_field = 'idx';
+        }
 
-    // modify names with root dir
-    foreach ($a_mboxes as $mbox_name)
-      {
-      $name = $this->mod_mailbox($mbox_name, 'out');
-      if (strlen($name))
-        $a_folders[] = $name;
-      }
+        $result = array();
+
+        $sql_result = $this->db->limitquery(
+                "SELECT idx, uid, headers".
+                " FROM ".get_table_name('messages').
+                " WHERE user_id=?".
+                " AND cache_key=?".
+                " ORDER BY ".$this->db->quoteIdentifier($sort_field)." ".strtoupper($sort_order),
+                $from,
+                $to - $from,
+                $_SESSION['user_id'],
+                $key);
+
+        while ($sql_arr = $this->db->fetch_assoc($sql_result)) {
+            $uid = intval($sql_arr['uid']);
+            $result[$uid] = $this->db->decode(unserialize($sql_arr['headers']));
+
+            // featch headers if unserialize failed
+            if (empty($result[$uid]))
+                $result[$uid] = $this->conn->fetchHeader(
+                    preg_replace('/.msg$/', '', $key), $uid, true, false, $this->get_fetch_headers());
+        }
 
-    // filter folders and sort them
-    $sa_unsubscribed = $this->_sort_mailbox_list($a_folders);
-    return $sa_unsubscribed;
+        return $result;
     }
 
 
-  /**
-   * Get mailbox quota information
-   * added by Nuny
-   * 
-   * @return mixed Quota info or False if not supported
-   */
-  function get_quota()
+    /**
+     * @param string $key Cache key
+     * @param int    $uid Message UID
+     * @return mixed
+     * @access private
+     */
+    private function &get_cached_message($key, $uid)
     {
-    if ($this->get_capability('QUOTA'))
-      return iil_C_GetQuota($this->conn);
-       
-    return FALSE;
-    }
-
-
-  /**
-   * Subscribe to a specific mailbox(es)
-   *
-   * @param array Mailbox name(s)
-   * @return boolean True on success
-   */ 
-  function subscribe($a_mboxes)
-    {
-    if (!is_array($a_mboxes))
-      $a_mboxes = array($a_mboxes);
-
-    // let this common function do the main work
-    return $this->_change_subscription($a_mboxes, 'subscribe');
-    }
-
-
-  /**
-   * Unsubscribe mailboxes
-   *
-   * @param array Mailbox name(s)
-   * @return boolean True on success
-   */
-  function unsubscribe($a_mboxes)
-    {
-    if (!is_array($a_mboxes))
-      $a_mboxes = array($a_mboxes);
-
-    // let this common function do the main work
-    return $this->_change_subscription($a_mboxes, 'unsubscribe');
-    }
-
-
-  /**
-   * Create a new mailbox on the server and register it in local cache
-   *
-   * @param string  New mailbox name (as utf-7 string)
-   * @param boolean True if the new mailbox should be subscribed
-   * @param string  Name of the created mailbox, false on error
-   */
-  function create_mailbox($name, $subscribe=FALSE)
-    {
-    $result = FALSE;
-    
-    // reduce mailbox name to 100 chars
-    $name = substr($name, 0, 100);
+        $internal_key = 'message';
+
+        if ($this->caching_enabled && !isset($this->icache[$internal_key][$uid])) {
+            $sql_result = $this->db->query(
+                "SELECT idx, headers, structure, message_id".
+                " FROM ".get_table_name('messages').
+                " WHERE user_id=?".
+                " AND cache_key=?".
+                " AND uid=?",
+                $_SESSION['user_id'],
+                $key,
+                $uid);
+
+            if ($sql_arr = $this->db->fetch_assoc($sql_result)) {
+                $this->icache['message.id'][$uid] = intval($sql_arr['message_id']);
+                   $this->uid_id_map[preg_replace('/\.msg$/', '', $key)][$uid] = intval($sql_arr['idx']);
+                $this->icache[$internal_key][$uid] = $this->db->decode(unserialize($sql_arr['headers']));
+
+                if (is_object($this->icache[$internal_key][$uid]) && !empty($sql_arr['structure']))
+                    $this->icache[$internal_key][$uid]->structure = $this->db->decode(unserialize($sql_arr['structure']));
+            }
+        }
+
+        return $this->icache[$internal_key][$uid];
+    }
 
-    $abs_name = $this->mod_mailbox($name);
-    $a_mailbox_cache = $this->get_cache('mailboxes');
 
-    if (strlen($abs_name) && (!is_array($a_mailbox_cache) || !in_array($abs_name, $a_mailbox_cache)))
-      $result = iil_C_CreateFolder($this->conn, $abs_name);
-
-    // try to subscribe it
-    if ($result && $subscribe)
-      $this->subscribe($name);
-
-    return $result ? $name : FALSE;
-    }
-
-
-  /**
-   * Set a new name to an existing mailbox
-   *
-   * @param string Mailbox to rename (as utf-7 string)
-   * @param string New mailbox name (as utf-7 string)
-   * @return string Name of the renames mailbox, False on error
-   */
-  function rename_mailbox($mbox_name, $new_name)
+    /**
+     * @param string  $key        Cache key
+     * @param string  $sort_field Sorting column
+     * @param string  $sort_order Sorting order
+     * @return array Messages index
+     * @access private
+     */
+    private function get_message_cache_index($key, $sort_field='idx', $sort_order='ASC')
     {
-    $result = FALSE;
+        if (!$this->caching_enabled || empty($key))
+            return NULL;
+
+        // use idx sort as default
+        if (!$sort_field || !in_array($sort_field, $this->db_header_fields))
+            $sort_field = 'idx';
+
+        if (array_key_exists('index', $this->icache)
+            && $this->icache['index']['key'] == $key
+            && $this->icache['index']['sort_field'] == $sort_field
+        ) {
+            if ($this->icache['index']['sort_order'] == $sort_order)
+                return $this->icache['index']['result'];
+            else
+                return array_reverse($this->icache['index']['result'], true);
+        }
 
-    // encode mailbox name and reduce it to 100 chars
-    $name = substr($new_name, 0, 100);
+        $this->icache['index'] = array(
+            'result'     => array(),
+            'key'        => $key,
+            'sort_field' => $sort_field,
+            'sort_order' => $sort_order,
+        );
 
-    // make absolute path
-    $mailbox = $this->mod_mailbox($mbox_name);
-    $abs_name = $this->mod_mailbox($name);
-    
-    // check if mailbox is subscribed
-    $a_subscribed = $this->_list_mailboxes();
-    $subscribed = in_array($mailbox, $a_subscribed);
-    
-    // unsubscribe folder
-    if ($subscribed)
-      iil_C_UnSubscribe($this->conn, $mailbox);
-
-    if (strlen($abs_name))
-      $result = iil_C_RenameFolder($this->conn, $mailbox, $abs_name);
+        $sql_result = $this->db->query(
+            "SELECT idx, uid".
+            " FROM ".get_table_name('messages').
+            " WHERE user_id=?".
+            " AND cache_key=?".
+            " ORDER BY ".$this->db->quote_identifier($sort_field)." ".$sort_order,
+            $_SESSION['user_id'],
+            $key);
 
-    if ($result)
-      {
-      $delm = $this->get_hierarchy_delimiter();
-      
-      // check if mailbox children are subscribed
-      foreach ($a_subscribed as $c_subscribed)
-        if (preg_match('/^'.preg_quote($mailbox.$delm, '/').'/', $c_subscribed))
-          {
-          iil_C_UnSubscribe($this->conn, $c_subscribed);
-          iil_C_Subscribe($this->conn, preg_replace('/^'.preg_quote($mailbox, '/').'/', $abs_name, $c_subscribed));
-          }
+        while ($sql_arr = $this->db->fetch_assoc($sql_result))
+            $this->icache['index']['result'][$sql_arr['idx']] = intval($sql_arr['uid']);
+
+        return $this->icache['index']['result'];
+    }
+
+
+    /**
+     * @access private
+     */
+    private function add_message_cache($key, $index, $headers, $struct=null, $force=false, $internal_cache=false)
+    {
+        if (empty($key) || !is_object($headers) || empty($headers->uid))
+            return;
+
+        // add to internal (fast) cache
+        if ($internal_cache) {
+            $this->icache['message'][$headers->uid] = clone $headers;
+            $this->icache['message'][$headers->uid]->structure = $struct;
+        }
+
+        // no further caching
+        if (!$this->caching_enabled)
+            return;
 
-      // clear cache
-      $this->clear_message_cache($mailbox.'.msg');
-      $this->clear_cache('mailboxes');      
-      }
+        // known message id
+        if (is_int($force) && $force > 0) {
+            $message_id = $force;
+        }
+        // check for an existing record (probably headers are cached but structure not)
+        else if (!$force) {
+            $sql_result = $this->db->query(
+                "SELECT message_id".
+                " FROM ".get_table_name('messages').
+                " WHERE user_id=?".
+                " AND cache_key=?".
+                " AND uid=?",
+                $_SESSION['user_id'],
+                $key,
+                $headers->uid);
+
+            if ($sql_arr = $this->db->fetch_assoc($sql_result))
+                $message_id = $sql_arr['message_id'];
+        }
 
-    // try to subscribe it
-    if ($result && $subscribed)
-      iil_C_Subscribe($this->conn, $abs_name);
+        // update cache record
+        if ($message_id) {
+            $this->db->query(
+                "UPDATE ".get_table_name('messages').
+                " SET idx=?, headers=?, structure=?".
+                " WHERE message_id=?",
+                $index,
+                serialize($this->db->encode(clone $headers)),
+                is_object($struct) ? serialize($this->db->encode(clone $struct)) : NULL,
+                $message_id
+            );
+        }
+        else { // insert new record
+            $this->db->query(
+                "INSERT INTO ".get_table_name('messages').
+                " (user_id, del, cache_key, created, idx, uid, subject, ".
+                $this->db->quoteIdentifier('from').", ".
+                $this->db->quoteIdentifier('to').", ".
+                "cc, date, size, headers, structure)".
+                " VALUES (?, 0, ?, ".$this->db->now().", ?, ?, ?, ?, ?, ?, ".
+                $this->db->fromunixtime($headers->timestamp).", ?, ?, ?)",
+                $_SESSION['user_id'],
+                $key,
+                $index,
+                $headers->uid,
+                (string)mb_substr($this->db->encode($this->decode_header($headers->subject, true)), 0, 128),
+                (string)mb_substr($this->db->encode($this->decode_header($headers->from, true)), 0, 128),
+                (string)mb_substr($this->db->encode($this->decode_header($headers->to, true)), 0, 128),
+                (string)mb_substr($this->db->encode($this->decode_header($headers->cc, true)), 0, 128),
+                (int)$headers->size,
+                serialize($this->db->encode(clone $headers)),
+                is_object($struct) ? serialize($this->db->encode(clone $struct)) : NULL
+            );
+        }
 
-    return $result ? $name : FALSE;
+        unset($this->icache['index']);
     }
 
 
-  /**
-   * Remove mailboxes from server
-   *
-   * @param string Mailbox name(s) string/array
-   * @return boolean True on success
-   */
-  function delete_mailbox($mbox_name)
+    /**
+     * @access private
+     */
+    private function remove_message_cache($key, $ids, $idx=false)
     {
-    $deleted = FALSE;
+        if (!$this->caching_enabled)
+            return;
+
+        $this->db->query(
+            "DELETE FROM ".get_table_name('messages').
+            " WHERE user_id=?".
+            " AND cache_key=?".
+            " AND ".($idx ? "idx" : "uid")." IN (".$this->db->array2list($ids, 'integer').")",
+            $_SESSION['user_id'],
+            $key);
+
+        unset($this->icache['index']);
+    }
+
 
-    if (is_array($mbox_name))
-      $a_mboxes = $mbox_name;
-    else if (is_string($mbox_name) && strlen($mbox_name))
-      $a_mboxes = explode(',', $mbox_name);
+    /**
+     * @param string $key         Cache key
+     * @param int    $start_index Start index
+     * @access private
+     */
+    private function clear_message_cache($key, $start_index=1)
+    {
+        if (!$this->caching_enabled)
+            return;
 
-    $all_mboxes = iil_C_ListMailboxes($this->conn, $this->mod_mailbox($root), '*');
+        $this->db->query(
+            "DELETE FROM ".get_table_name('messages').
+            " WHERE user_id=?".
+            " AND cache_key=?".
+            " AND idx>=?",
+            $_SESSION['user_id'], $key, $start_index);
 
-    if (is_array($a_mboxes))
-      foreach ($a_mboxes as $mbox_name)
-        {
-        $mailbox = $this->mod_mailbox($mbox_name);
+        unset($this->icache['index']);
+    }
 
-        // unsubscribe mailbox before deleting
-        iil_C_UnSubscribe($this->conn, $mailbox);
 
-        // send delete command to server
-        $result = iil_C_DeleteFolder($this->conn, $mailbox);
-        if ($result >= 0) {
-          $deleted = TRUE;
-          $this->clear_message_cache($mailbox.'.msg');
-         }
-         
-        foreach ($all_mboxes as $c_mbox)
-          {
-          $regex = preg_quote($mailbox . $this->delimiter, '/');
-          $regex = '/^' . $regex . '/';
-          if (preg_match($regex, $c_mbox))
-            {
-            iil_C_UnSubscribe($this->conn, $c_mbox);
-            $result = iil_C_DeleteFolder($this->conn, $c_mbox);
-            if ($result >= 0) {
-              $deleted = TRUE;
-             $this->clear_message_cache($c_mbox.'.msg');
-              }
-           }
-          }
+    /**
+     * @access private
+     */
+    private function get_message_cache_index_min($key, $uids=NULL)
+    {
+        if (!$this->caching_enabled)
+            return;
+
+        if (!empty($uids) && !is_array($uids)) {
+            if ($uids == '*' || $uids == '1:*')
+                $uids = NULL;
+            else
+                $uids = explode(',', $uids);
         }
 
-    // clear mailboxlist cache
-    if ($deleted)
-      $this->clear_cache('mailboxes');
+        $sql_result = $this->db->query(
+            "SELECT MIN(idx) AS minidx".
+            " FROM ".get_table_name('messages').
+            " WHERE  user_id=?".
+            " AND    cache_key=?"
+            .(!empty($uids) ? " AND uid IN (".$this->db->array2list($uids, 'integer').")" : ''),
+            $_SESSION['user_id'],
+            $key);
 
-    return $deleted;
+        if ($sql_arr = $this->db->fetch_assoc($sql_result))
+            return $sql_arr['minidx'];
+        else
+            return 0;
     }
 
 
-  /**
-   * Create all folders specified as default
-   */
-  function create_default_folders()
+    /**
+     * @param string $key Cache key
+     * @param int    $id  Message (sequence) ID
+     * @return int Message UID
+     * @access private
+     */
+    private function get_cache_id2uid($key, $id)
     {
-    $a_folders = iil_C_ListMailboxes($this->conn, $this->mod_mailbox(''), '*');
-    $a_subscribed = iil_C_ListSubscribed($this->conn, $this->mod_mailbox(''), '*');
-    
-    // create default folders if they do not exist
-    foreach ($this->default_folders as $folder)
-      {
-      $abs_name = $this->mod_mailbox($folder);
-      if (!in_array_nocase($abs_name, $a_folders))
-        $this->create_mailbox($folder, TRUE);
-      else if (!in_array_nocase($abs_name, $a_subscribed))
-        $this->subscribe($folder);
-      }
-    }
-
-
-
-  /* --------------------------------
-   *   internal caching methods
-   * --------------------------------*/
+        if (!$this->caching_enabled)
+            return null;
 
-  /**
-   * @access private
-   */
-  function set_caching($set)
-    {
-    if ($set && is_object($this->db))
-      $this->caching_enabled = TRUE;
-    else
-      $this->caching_enabled = FALSE;
+        if (array_key_exists('index', $this->icache)
+            && $this->icache['index']['key'] == $key
+        ) {
+            return $this->icache['index']['result'][$id];
+        }
+
+        $sql_result = $this->db->query(
+            "SELECT uid".
+            " FROM ".get_table_name('messages').
+            " WHERE user_id=?".
+            " AND cache_key=?".
+            " AND idx=?",
+            $_SESSION['user_id'], $key, $id);
+
+        if ($sql_arr = $this->db->fetch_assoc($sql_result))
+            return intval($sql_arr['uid']);
+
+        return null;
     }
 
-  /**
-   * @access private
-   */
-  function get_cache($key)
+
+    /**
+     * @param string $key Cache key
+     * @param int    $uid Message UID
+     * @return int Message (sequence) ID
+     * @access private
+     */
+    private function get_cache_uid2id($key, $uid)
     {
-    // read cache (if it was not read before)
-    if (!count($this->cache) && $this->caching_enabled)
-      {
-      return $this->_read_cache_record($key);
-      }
-    
-    return $this->cache[$key];
-    }
-
-  /**
-   * @access private
-   */
-  function update_cache($key, $data)
-    {
-    $this->cache[$key] = $data;
-    $this->cache_changed = TRUE;
-    $this->cache_changes[$key] = TRUE;
-    }
-
-  /**
-   * @access private
-   */
-  function write_cache()
-    {
-    if ($this->caching_enabled && $this->cache_changed)
-      {
-      foreach ($this->cache as $key => $data)
-        {
-        if ($this->cache_changes[$key])
-          $this->_write_cache_record($key, serialize($data));
-        }
-      }    
-    }
-
-  /**
-   * @access private
-   */
-  function clear_cache($key=NULL)
-    {
-    if (!$this->caching_enabled)
-      return;
-    
-    if ($key===NULL)
-      {
-      foreach ($this->cache as $key => $data)
-        $this->_clear_cache_record($key);
-
-      $this->cache = array();
-      $this->cache_changed = FALSE;
-      $this->cache_changes = array();
-      }
-    else
-      {
-      $this->_clear_cache_record($key);
-      $this->cache_changes[$key] = FALSE;
-      unset($this->cache[$key]);
-      }
-    }
-
-  /**
-   * @access private
-   */
-  private function _read_cache_record($key)
-    {
-    if ($this->db)
-      {
-      // get cached data from DB
-      $sql_result = $this->db->query(
-        "SELECT cache_id, data, cache_key
-         FROM ".get_table_name('cache')."
-         WHERE  user_id=?
-        AND cache_key LIKE 'IMAP.%'",
-        $_SESSION['user_id']);
-
-      while ($sql_arr = $this->db->fetch_assoc($sql_result))
-        {
-       $sql_key = preg_replace('/^IMAP\./', '', $sql_arr['cache_key']);
-        $this->cache_keys[$sql_key] = $sql_arr['cache_id'];
-       if (!isset($this->cache[$sql_key]))
-         $this->cache[$sql_key] = $sql_arr['data'] ? unserialize($sql_arr['data']) : FALSE;
-        }
-      }
-
-    return $this->cache[$key];
-    }
-
-  /**
-   * @access private
-   */
-  private function _write_cache_record($key, $data)
-    {
-    if (!$this->db)
-      return FALSE;
-
-    // update existing cache record
-    if ($this->cache_keys[$key])
-      {
-      $this->db->query(
-        "UPDATE ".get_table_name('cache')."
-         SET    created=". $this->db->now().", data=?
-         WHERE  user_id=?
-         AND    cache_key=?",
-        $data,
-        $_SESSION['user_id'],
-        'IMAP.'.$key);
-      }
-    // add new cache record
-    else
-      {
-      $this->db->query(
-        "INSERT INTO ".get_table_name('cache')."
-         (created, user_id, cache_key, data)
-         VALUES (".$this->db->now().", ?, ?, ?)",
-        $_SESSION['user_id'],
-        'IMAP.'.$key,
-        $data);
-
-      // get cache entry ID for this key
-      $sql_result = $this->db->query(
-        "SELECT cache_id
-         FROM ".get_table_name('cache')."
-         WHERE  user_id=?
-         AND    cache_key=?",
-        $_SESSION['user_id'],
-        'IMAP.'.$key);
-                                     
+        if (!$this->caching_enabled)
+            return null;
+
+        if (array_key_exists('index', $this->icache)
+            && $this->icache['index']['key'] == $key
+        ) {
+            return array_search($uid, $this->icache['index']['result']);
+        }
+
+        $sql_result = $this->db->query(
+            "SELECT idx".
+            " FROM ".get_table_name('messages').
+            " WHERE user_id=?".
+            " AND cache_key=?".
+            " AND uid=?",
+            $_SESSION['user_id'], $key, $uid);
+
         if ($sql_arr = $this->db->fetch_assoc($sql_result))
-          $this->cache_keys[$key] = $sql_arr['cache_id'];
-      }
-    }
-
-  /**
-   * @access private
-   */
-  private function _clear_cache_record($key)
-    {
-    $this->db->query(
-      "DELETE FROM ".get_table_name('cache')."
-       WHERE  user_id=?
-       AND    cache_key=?",
-      $_SESSION['user_id'],
-      'IMAP.'.$key);
-      
-    unset($this->cache_keys[$key]);
-    }
-
-
-
-  /* --------------------------------
-   *   message caching methods
-   * --------------------------------*/
-   
-
-  /**
-   * Checks if the cache is up-to-date
-   *
-   * @param string Mailbox name
-   * @param string Internal cache key
-   * @return int   Cache status: -3 = off, -2 = incomplete, -1 = dirty
-   */
-  private function check_cache_status($mailbox, $cache_key)
-  {
-    if (!$this->caching_enabled)
-      return -3;
-
-    $cache_index = $this->get_message_cache_index($cache_key);
-    $msg_count = $this->_messagecount($mailbox);
-    $cache_count = count($cache_index);
-
-    // empty mailbox
-    if (!$msg_count)
-      return $cache_count ? -2 : 1;
-
-    // @TODO: We've got one big performance problem in cache status checking method
-    // E.g. mailbox contains 1000 messages, in cache table we've got first 100
-    // of them. Now if we want to display only that 100 (which we've got)
-    // check_cache_status returns 'incomplete' and messages are fetched
-    // from IMAP instead of DB.
-
-    if ($cache_count==$msg_count) {
-      if ($this->skip_deleted) {
-       $h_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, "1:*", 'UID', $this->skip_deleted);
-
-       if (sizeof($h_index) == $cache_count) {
-         $cache_index = array_flip($cache_index);
-         foreach ($h_index as $idx => $uid)
-            unset($cache_index[$uid]);
-
-         if (empty($cache_index))
-           return 1;
-       }
-       return -2;
-      } else {
-        // get UID of message with highest index
-        $uid = iil_C_ID2UID($this->conn, $mailbox, $msg_count);
-        $cache_uid = array_pop($cache_index);
-      
-        // uids of highest message matches -> cache seems OK
-        if ($cache_uid == $uid)
-          return 1;
-      }
-      // cache is dirty
-      return -1;
-    }
-    // if cache count differs less than 10% report as dirty
-    else if (abs($msg_count - $cache_count) < $msg_count/10)
-      return -1;
-    else
-      return -2;
-  }
-
-  /**
-   * @access private
-   */
-  private function get_message_cache($key, $from, $to, $sort_field, $sort_order)
-    {
-    $cache_key = "$key:$from:$to:$sort_field:$sort_order";
-    $db_header_fields = array('idx', 'uid', 'subject', 'from', 'to', 'cc', 'date', 'size');
-    
-    $config = rcmail::get_instance()->config;
-
-    // use idx sort for sorting by Date with index_sort=true or for unknown field
-    if (($sort_field == 'date' && $this->index_sort)
-      || !in_array($sort_field, $db_header_fields)) {
-      $sort_field = 'idx';
-      }
-    
-    if ($this->caching_enabled && !isset($this->cache[$cache_key]))
-      {
-      $this->cache[$cache_key] = array();
-      $sql_result = $this->db->limitquery(
-        "SELECT idx, uid, headers
-         FROM ".get_table_name('messages')."
-         WHERE  user_id=?
-         AND    cache_key=?
-         ORDER BY ".$this->db->quoteIdentifier($sort_field)." ".strtoupper($sort_order),
-        $from,
-        $to-$from,
-        $_SESSION['user_id'],
-        $key);
-
-      while ($sql_arr = $this->db->fetch_assoc($sql_result))
-        {
-        $uid = $sql_arr['uid'];
-        $this->cache[$cache_key][$uid] =  $this->db->decode(unserialize($sql_arr['headers']));
-
-        // featch headers if unserialize failed
-        if (empty($this->cache[$cache_key][$uid]))
-          $this->cache[$cache_key][$uid] = iil_C_FetchHeader($this->conn, preg_replace('/.msg$/', '', $key), $uid, true, $this->fetch_add_headers);
-        }
-      }
-
-    return $this->cache[$cache_key];
-    }
-
-  /**
-   * @access private
-   */
-  private function &get_cached_message($key, $uid)
-    {
-    $internal_key = '__single_msg';
-    
-    if ($this->caching_enabled && !isset($this->cache[$internal_key][$uid]))
-      {
-      $sql_result = $this->db->query(
-        "SELECT idx, headers, structure
-         FROM ".get_table_name('messages')."
-         WHERE  user_id=?
-         AND    cache_key=?
-         AND    uid=?",
-        $_SESSION['user_id'],
-        $key,
-        $uid);
-
-      if ($sql_arr = $this->db->fetch_assoc($sql_result))
-        {
-       $this->uid_id_map[preg_replace('/\.msg$/', '', $key)][$uid] = $sql_arr['idx'];
-        $this->cache[$internal_key][$uid] = $this->db->decode(unserialize($sql_arr['headers']));
-        if (is_object($this->cache[$internal_key][$uid]) && !empty($sql_arr['structure']))
-          $this->cache[$internal_key][$uid]->structure = $this->db->decode(unserialize($sql_arr['structure']));
-        }
-      }
-
-    return $this->cache[$internal_key][$uid];
-    }
-
-  /**
-   * @access private
-   */  
-  private function get_message_cache_index($key, $force=FALSE, $sort_field='idx', $sort_order='ASC')
-    {
-    static $sa_message_index = array();
-    
-    // empty key -> empty array
-    if (!$this->caching_enabled || empty($key))
-      return array();
-    
-    if (!empty($sa_message_index[$key]) && !$force)
-      return $sa_message_index[$key];
-
-    // use idx sort for sorting by Date with index_sort=true
-    if ($sort_field == 'date' && $this->index_sort)
-      $sort_field = 'idx';
-    
-    $sa_message_index[$key] = array();
-    $sql_result = $this->db->query(
-      "SELECT idx, uid
-       FROM ".get_table_name('messages')."
-       WHERE  user_id=?
-       AND    cache_key=?
-       ORDER BY ".$this->db->quote_identifier($sort_field)." ".$sort_order,
-      $_SESSION['user_id'],
-      $key);
-
-    while ($sql_arr = $this->db->fetch_assoc($sql_result))
-      $sa_message_index[$key][$sql_arr['idx']] = $sql_arr['uid'];
-      
-    return $sa_message_index[$key];
-    }
-
-  /**
-   * @access private
-   */
-  private function add_message_cache($key, $index, $headers, $struct=null, $force=false)
-    {
-    if (empty($key) || !is_object($headers) || empty($headers->uid))
-        return;
-
-    // add to internal (fast) cache
-    $this->cache['__single_msg'][$headers->uid] = clone $headers;
-    $this->cache['__single_msg'][$headers->uid]->structure = $struct;
-
-    // no further caching
-    if (!$this->caching_enabled)
-      return;
-    
-    // check for an existing record (probly headers are cached but structure not)
-    if (!$force) {
-      $sql_result = $this->db->query(
-        "SELECT message_id
-         FROM ".get_table_name('messages')."
-         WHERE  user_id=?
-         AND    cache_key=?
-         AND    uid=?",
-        $_SESSION['user_id'],
-        $key,
-        $headers->uid);
-      if ($sql_arr = $this->db->fetch_assoc($sql_result))
-        $message_id = $sql_arr['message_id'];
-      }
-
-    // update cache record
-    if ($message_id)
-      {
-      $this->db->query(
-        "UPDATE ".get_table_name('messages')."
-         SET   idx=?, headers=?, structure=?
-         WHERE message_id=?",
-        $index,
-        serialize($this->db->encode(clone $headers)),
-        is_object($struct) ? serialize($this->db->encode(clone $struct)) : NULL,
-        $message_id
-        );
-      }
-    else  // insert new record
-      {
-      $this->db->query(
-        "INSERT INTO ".get_table_name('messages')."
-         (user_id, del, cache_key, created, idx, uid, subject, ".$this->db->quoteIdentifier('from').", ".$this->db->quoteIdentifier('to').", cc, date, size, headers, structure)
-         VALUES (?, 0, ?, ".$this->db->now().", ?, ?, ?, ?, ?, ?, ".$this->db->fromunixtime($headers->timestamp).", ?, ?, ?)",
-        $_SESSION['user_id'],
-        $key,
-        $index,
-        $headers->uid,
-        (string)mb_substr($this->db->encode($this->decode_header($headers->subject, TRUE)), 0, 128),
-        (string)mb_substr($this->db->encode($this->decode_header($headers->from, TRUE)), 0, 128),
-        (string)mb_substr($this->db->encode($this->decode_header($headers->to, TRUE)), 0, 128),
-        (string)mb_substr($this->db->encode($this->decode_header($headers->cc, TRUE)), 0, 128),
-        (int)$headers->size,
-        serialize($this->db->encode(clone $headers)),
-        is_object($struct) ? serialize($this->db->encode(clone $struct)) : NULL
-        );
-      }
-    }
-    
-  /**
-   * @access private
-   */
-  private function remove_message_cache($key, $ids, $idx=false)
-    {
-    if (!$this->caching_enabled)
-      return;
-    
-    $this->db->query(
-      "DELETE FROM ".get_table_name('messages')."
-      WHERE user_id=?
-      AND cache_key=?
-      AND ".($idx ? "idx" : "uid")." IN (".$this->db->array2list($ids, 'integer').")",
-      $_SESSION['user_id'],
-      $key);
-    }
-
-  /**
-   * @access private
-   */
-  private function clear_message_cache($key, $start_index=1)
-    {
-    if (!$this->caching_enabled)
-      return;
-    
-    $this->db->query(
-      "DELETE FROM ".get_table_name('messages')."
-       WHERE user_id=?
-       AND cache_key=?
-       AND idx>=?",
-      $_SESSION['user_id'], $key, $start_index);
-    }
-
-  /**
-   * @access private
-   */
-  private function get_message_cache_index_min($key, $uids=NULL)
-    {
-    if (!$this->caching_enabled)
-      return;
-    
-    $sql_result = $this->db->query(
-      "SELECT MIN(idx) AS minidx
-      FROM ".get_table_name('messages')."
-      WHERE  user_id=?
-      AND    cache_key=?"
-      .(!empty($uids) ? " AND uid IN (".$this->db->array2list($uids, 'integer').")" : ''),
-      $_SESSION['user_id'],
-      $key);
-
-    if ($sql_arr = $this->db->fetch_assoc($sql_result))
-      return $sql_arr['minidx'];
-    else
-      return 0;  
-    }
-
-
-  /* --------------------------------
-   *   encoding/decoding methods
-   * --------------------------------*/
-
-  /**
-   * Split an address list into a structured array list
-   *
-   * @param string  Input string
-   * @param int     List only this number of addresses
-   * @param boolean Decode address strings
-   * @return array  Indexed list of addresses
-   */
-  function decode_address_list($input, $max=null, $decode=true)
-    {
-    $a = $this->_parse_address_list($input, $decode);
-    $out = array();
-    // Special chars as defined by RFC 822 need to in quoted string (or escaped).
-    $special_chars = '[\(\)\<\>\\\.\[\]@,;:"]';
-    
-    if (!is_array($a))
-      return $out;
-
-    $c = count($a);
-    $j = 0;
-
-    foreach ($a as $val)
-      {
-      $j++;
-      $address = $val['address'];
-      $name = preg_replace(array('/^[\'"]/', '/[\'"]$/'), '', trim($val['name']));
-      if ($name && $address && $name != $address)
-        $string = sprintf('%s <%s>', preg_match("/$special_chars/", $name) ? '"'.addcslashes($name, '"').'"' : $name, $address);
-      else if ($address)
-        $string = $address;
-      else if ($name)
-        $string = $name;
-      
-      $out[$j] = array('name' => $name,
-                       'mailto' => $address,
-                       'string' => $string);
-              
-      if ($max && $j==$max)
-        break;
-      }
-    
-    return $out;
-    }
-  
-  
-  /**
-   * Decode a Microsoft Outlook TNEF part (winmail.dat)
-   *
-   * @param object rcube_message_part Message part to decode
-   * @param string UID of the message
-   * @return array List of rcube_message_parts extracted from windmail.dat
-   */
-  function tnef_decode(&$part, $uid)
-  {
-    if (!isset($part->body))
-      $part->body = $this->get_message_part($uid, $part->mime_id, $part);
-
-    $pid = 0;
-    $tnef_parts = array();
-    $tnef_arr = tnef_decode($part->body);
-    foreach ($tnef_arr as $winatt) {
-      $tpart = new rcube_message_part;
-      $tpart->filename = $winatt["name"];
-      $tpart->encoding = 'stream';
-      $tpart->ctype_primary = $winatt["type0"];
-      $tpart->ctype_secondary = $winatt["type1"];
-      $tpart->mimetype = strtolower($winatt["type0"] . "/" . $winatt["type1"]);
-      $tpart->mime_id = "winmail." . $part->mime_id . ".$pid";
-      $tpart->size = $winatt["size"];
-      $tpart->body = $winatt['stream'];
-      
-      $tnef_parts[] = $tpart;
-      $pid++;
-    }
-
-    return $tnef_parts;
-  }
-
-
-  /**
-   * Decode a message header value
-   *
-   * @param string  Header value
-   * @param boolean Remove quotes if necessary
-   * @return string Decoded string
-   */
-  function decode_header($input, $remove_quotes=FALSE)
-    {
-    $str = rcube_imap::decode_mime_string((string)$input, $this->default_charset);
-    if ($str{0}=='"' && $remove_quotes)
-      $str = str_replace('"', '', $str);
-    
-    return $str;
-    }
-
-
-  /**
-   * Decode a mime-encoded string to internal charset
-   *
-   * @param string $input    Header value
-   * @param string $fallback Fallback charset if none specified
-   *
-   * @return string Decoded string
-   * @static
-   */
-  public static function decode_mime_string($input, $fallback=null)
-    {
-    // Initialize variable
-    $out = '';
-
-    // Iterate instead of recursing, this way if there are too many values we don't have stack overflows
-    // rfc: all line breaks or other characters not found 
-    // in the Base64 Alphabet must be ignored by decoding software
-    // delete all blanks between MIME-lines, differently we can 
-    // receive unnecessary blanks and broken utf-8 symbols
-    $input = preg_replace("/\?=\s+=\?/", '?==?', $input);
-
-    // Check if there is stuff to decode
-    if (strpos($input, '=?') !== false) {
-      // Loop through the string to decode all occurences of =? ?= into the variable $out 
-      while(($pos = strpos($input, '=?')) !== false) {
-        // Append everything that is before the text to be decoded
-        $out .= substr($input, 0, $pos);
-
-        // Get the location of the text to decode
-        $end_cs_pos = strpos($input, "?", $pos+2);
-        $end_en_pos = strpos($input, "?", $end_cs_pos+1);
-        $end_pos = strpos($input, "?=", $end_en_pos+1);
-
-        // Extract the encoded string
-        $encstr = substr($input, $pos+2, ($end_pos-$pos-2));
-        // Extract the remaining string
-        $input = substr($input, $end_pos+2);
-
-        // Decode the string fragement
-        $out .= rcube_imap::_decode_mime_string_part($encstr);
-      }
-
-      // Deocde the rest (if any)
-      if (strlen($input) != 0)
-         $out .= rcube_imap::decode_mime_string($input, $fallback);
-
-       // return the results
-      return $out;
-    }
-
-    // no encoding information, use fallback
-    return rcube_charset_convert($input, 
-      !empty($fallback) ? $fallback : rcmail::get_instance()->config->get('default_charset', 'ISO-8859-1'));
-    }
-
-
-  /**
-   * Decode a part of a mime-encoded string
-   *
-   * @access private
-   */
-  private function _decode_mime_string_part($str)
-    {
-    $a = explode('?', $str);
-    $count = count($a);
-
-    // should be in format "charset?encoding?base64_string"
-    if ($count >= 3)
-      {
-      for ($i=2; $i<$count; $i++)
-        $rest.=$a[$i];
-
-      if (($a[1]=="B")||($a[1]=="b"))
-        $rest = base64_decode($rest);
-      else if (($a[1]=="Q")||($a[1]=="q"))
-        {
-        $rest = str_replace("_", " ", $rest);
-        $rest = quoted_printable_decode($rest);
-        }
-
-      return rcube_charset_convert($rest, $a[0]);
-      }
-    else
-      return $str;    // we dont' know what to do with this  
-    }
-
-
-  /**
-   * Decode a mime part
-   *
-   * @param string Input string
-   * @param string Part encoding
-   * @return string Decoded string
-   */
-  function mime_decode($input, $encoding='7bit')
-    {
-    switch (strtolower($encoding))
-      {
-      case 'quoted-printable':
-        return quoted_printable_decode($input);
-        break;
-      
-      case 'base64':
-        return base64_decode($input);
-        break;
-
-      case 'x-uuencode':
-      case 'x-uue':
-      case 'uue':
-      case 'uuencode':
-        return convert_uudecode($input);
-        break;
-                                                     
-      case '7bit':
-      default:
-        return $input;
-      }
-    }
-
-
-  /**
-   * Convert body charset to RCMAIL_CHARSET according to the ctype_parameters
-   *
-   * @param string Part body to decode
-   * @param string Charset to convert from
-   * @return string Content converted to internal charset
-   */
-  function charset_decode($body, $ctype_param)
-    {
-    if (is_array($ctype_param) && !empty($ctype_param['charset']))
-      return rcube_charset_convert($body, $ctype_param['charset']);
-
-    // defaults to what is specified in the class header
-    return rcube_charset_convert($body,  $this->default_charset);
-    }
-
-
-  /**
-   * Translate UID to message ID
-   *
-   * @param int    Message UID
-   * @param string Mailbox name
-   * @return int   Message ID
-   */
-  function get_id($uid, $mbox_name=NULL) 
+            return intval($sql_arr['idx']);
+
+        return null;
+    }
+
+
+    /* --------------------------------
+     *   encoding/decoding methods
+     * --------------------------------*/
+
+    /**
+     * Split an address list into a structured array list
+     *
+     * @param string  $input  Input string
+     * @param int     $max    List only this number of addresses
+     * @param boolean $decode Decode address strings
+     * @return array  Indexed list of addresses
+     */
+    function decode_address_list($input, $max=null, $decode=true)
     {
-      $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox;
-      return $this->_uid2id($uid, $mailbox);
+        $a = $this->_parse_address_list($input, $decode);
+        $out = array();
+        // Special chars as defined by RFC 822 need to in quoted string (or escaped).
+        $special_chars = '[\(\)\<\>\\\.\[\]@,;:"]';
+
+        if (!is_array($a))
+            return $out;
+
+        $c = count($a);
+        $j = 0;
+
+        foreach ($a as $val) {
+            $j++;
+            $address = trim($val['address']);
+            $name    = trim($val['name']);
+
+            if ($name && $address && $name != $address)
+                $string = sprintf('%s <%s>', preg_match("/$special_chars/", $name) ? '"'.addcslashes($name, '"').'"' : $name, $address);
+            else if ($address)
+                $string = $address;
+            else if ($name)
+                $string = $name;
+
+            $out[$j] = array(
+                'name'   => $name,
+                'mailto' => $address,
+                'string' => $string
+            );
+
+            if ($max && $j==$max)
+                break;
+        }
+
+        return $out;
     }
 
 
-  /**
-   * Translate message number to UID
-   *
-   * @param int    Message ID
-   * @param string Mailbox name
-   * @return int   Message UID
-   */
-  function get_uid($id,$mbox_name=NULL)
-    {
-      $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox;
-      return $this->_id2uid($id, $mailbox);
-    }
-
-
-  /**
-   * Modify folder name for input/output according to root dir and namespace
-   *
-   * @param string  Folder name
-   * @param string  Mode
-   * @return string Folder name
-   */
-  function mod_mailbox($mbox_name, $mode='in')
-    {
-    if ((!empty($this->root_ns) && $this->root_ns == $mbox_name) || $mbox_name == 'INBOX')
-      return $mbox_name;
-
-    if (!empty($this->root_dir) && $mode=='in') 
-      $mbox_name = $this->root_dir.$this->delimiter.$mbox_name;
-    else if (strlen($this->root_dir) && $mode=='out') 
-      $mbox_name = substr($mbox_name, strlen($this->root_dir)+1);
-
-    return $mbox_name;
-    }
-
-
-  /* --------------------------------
-   *         private methods
-   * --------------------------------*/
-
-  /**
-   * Validate the given input and save to local properties
-   * @access private
-   */
-  private function _set_sort_order($sort_field, $sort_order)
-  {
-    if ($sort_field != null)
-      $this->sort_field = asciiwords($sort_field);
-    if ($sort_order != null)
-      $this->sort_order = strtoupper($sort_order) == 'DESC' ? 'DESC' : 'ASC';
-  }
-
-  /**
-   * Sort mailboxes first by default folders and then in alphabethical order
-   * @access private
-   */
-  private function _sort_mailbox_list($a_folders)
-    {
-    $a_out = $a_defaults = $folders = array();
-
-    $delimiter = $this->get_hierarchy_delimiter();
+    /**
+     * Decode a message header value
+     *
+     * @param string  $input         Header value
+     * @param boolean $remove_quotas Remove quotes if necessary
+     * @return string Decoded string
+     */
+    function decode_header($input, $remove_quotes=false)
+    {
+        $str = rcube_imap::decode_mime_string((string)$input, $this->default_charset);
+        if ($str[0] == '"' && $remove_quotes)
+            $str = str_replace('"', '', $str);
 
-    // find default folders and skip folders starting with '.'
-    foreach ($a_folders as $i => $folder)
-      {
-      if ($folder{0}=='.')
-        continue;
+        return $str;
+    }
 
-      if (($p = array_search(strtolower($folder), $this->default_folders_lc)) !== false && !$a_defaults[$p])
-        $a_defaults[$p] = $folder;
-      else
-        $folders[$folder] = mb_strtolower(rcube_charset_convert($folder, 'UTF7-IMAP'));
-      }
 
-    // sort folders and place defaults on the top
-    asort($folders, SORT_LOCALE_STRING);
-    ksort($a_defaults);
-    $folders = array_merge($a_defaults, array_keys($folders));
+    /**
+     * Decode a mime-encoded string to internal charset
+     *
+     * @param string $input    Header value
+     * @param string $fallback Fallback charset if none specified
+     *
+     * @return string Decoded string
+     * @static
+     */
+    public static function decode_mime_string($input, $fallback=null)
+    {
+        // Initialize variable
+        $out = '';
+
+        // Iterate instead of recursing, this way if there are too many values we don't have stack overflows
+        // rfc: all line breaks or other characters not found
+        // in the Base64 Alphabet must be ignored by decoding software
+        // delete all blanks between MIME-lines, differently we can
+        // receive unnecessary blanks and broken utf-8 symbols
+        $input = preg_replace("/\?=\s+=\?/", '?==?', $input);
+
+        // Check if there is stuff to decode
+        if (strpos($input, '=?') !== false) {
+            // Loop through the string to decode all occurences of =? ?= into the variable $out
+            while(($pos = strpos($input, '=?')) !== false) {
+                // Append everything that is before the text to be decoded
+                $out .= substr($input, 0, $pos);
+
+                // Get the location of the text to decode
+                $end_cs_pos = strpos($input, "?", $pos+2);
+                $end_en_pos = strpos($input, "?", $end_cs_pos+1);
+                $end_pos = strpos($input, "?=", $end_en_pos+1);
+
+                // Extract the encoded string
+                $encstr = substr($input, $pos+2, ($end_pos-$pos-2));
+                // Extract the remaining string
+                $input = substr($input, $end_pos+2);
+
+                // Decode the string fragement
+                $out .= rcube_imap::_decode_mime_string_part($encstr);
+            }
+
+            // Deocde the rest (if any)
+            if (strlen($input) != 0)
+                $out .= rcube_imap::decode_mime_string($input, $fallback);
+
+            // return the results
+            return $out;
+        }
 
-    // finally we must rebuild the list to move 
-    // subfolders of default folders to their place...
-    // ...also do this for the rest of folders because
-    // asort() is not properly sorting case sensitive names
-    while (list($key, $folder) = each($folders)) {
-      // set the type of folder name variable (#1485527) 
-      $a_out[] = (string) $folder;
-      unset($folders[$key]);
-      $this->_rsort($folder, $delimiter, $folders, $a_out);    
-      }
-
-    return $a_out;
+        // no encoding information, use fallback
+        return rcube_charset_convert($input,
+            !empty($fallback) ? $fallback : rcmail::get_instance()->config->get('default_charset', 'ISO-8859-1'));
     }
 
 
-  /**
-   * @access private
-   */
-  private function _rsort($folder, $delimiter, &$list, &$out)
+    /**
+     * Decode a part of a mime-encoded string
+     *
+     * @param string $str String to decode
+     * @return string Decoded string
+     * @access private
+     */
+    private function _decode_mime_string_part($str)
     {
-      while (list($key, $name) = each($list)) {
-       if (strpos($name, $folder.$delimiter) === 0) {
-         // set the type of folder name variable (#1485527) 
-         $out[] = (string) $name;
-         unset($list[$key]);
-         $this->_rsort($name, $delimiter, $list, $out);
-         }
+        $a = explode('?', $str);
+        $count = count($a);
+
+        // should be in format "charset?encoding?base64_string"
+        if ($count >= 3) {
+            for ($i=2; $i<$count; $i++)
+                $rest .= $a[$i];
+
+            if (($a[1]=='B') || ($a[1]=='b'))
+                $rest = base64_decode($rest);
+            else if (($a[1]=='Q') || ($a[1]=='q')) {
+                $rest = str_replace('_', ' ', $rest);
+                $rest = quoted_printable_decode($rest);
+            }
+
+            return rcube_charset_convert($rest, $a[0]);
         }
-      reset($list);    
+
+        // we dont' know what to do with this
+        return $str;
     }
 
 
-  /**
-   * @access private
-   */
-  private function _uid2id($uid, $mbox_name=NULL)
-    {
-    if (!$mbox_name)
-      $mbox_name = $this->mailbox;
-      
-    if (!isset($this->uid_id_map[$mbox_name][$uid]))
-      $this->uid_id_map[$mbox_name][$uid] = iil_C_UID2ID($this->conn, $mbox_name, $uid);
-
-    return $this->uid_id_map[$mbox_name][$uid];
+    /**
+     * Decode a mime part
+     *
+     * @param string $input    Input string
+     * @param string $encoding Part encoding
+     * @return string Decoded string
+     */
+    function mime_decode($input, $encoding='7bit')
+    {
+        switch (strtolower($encoding)) {
+        case 'quoted-printable':
+            return quoted_printable_decode($input);
+        case 'base64':
+            return base64_decode($input);
+        case 'x-uuencode':
+        case 'x-uue':
+        case 'uue':
+        case 'uuencode':
+            return convert_uudecode($input);
+        case '7bit':
+        default:
+            return $input;
+        }
     }
-
-  /**
-   * @access private
-   */
-  private function _id2uid($id, $mbox_name=NULL)
-    {
-    if (!$mbox_name)
-      $mbox_name = $this->mailbox;
-      
-    $index = array_flip((array)$this->uid_id_map[$mbox_name]);
-    if (isset($index[$id]))
-      $uid = $index[$id];
-    else
-      {
-      $uid = iil_C_ID2UID($this->conn, $mbox_name, $id);
-      $this->uid_id_map[$mbox_name][$uid] = $id;
-      }
-    
-    return $uid;
-    }
-
-
-  /**
-   * Subscribe/unsubscribe a list of mailboxes and update local cache
-   * @access private
-   */
-  private function _change_subscription($a_mboxes, $mode)
+
+
+    /**
+     * Convert body charset to RCMAIL_CHARSET according to the ctype_parameters
+     *
+     * @param string $body        Part body to decode
+     * @param string $ctype_param Charset to convert from
+     * @return string Content converted to internal charset
+     */
+    function charset_decode($body, $ctype_param)
     {
-    $updated = FALSE;
-
-    if (is_array($a_mboxes))
-      foreach ($a_mboxes as $i => $mbox_name)
-        {
-        $mailbox = $this->mod_mailbox($mbox_name);
-        $a_mboxes[$i] = $mailbox;
+        if (is_array($ctype_param) && !empty($ctype_param['charset']))
+            return rcube_charset_convert($body, $ctype_param['charset']);
+
+        // defaults to what is specified in the class header
+        return rcube_charset_convert($body,  $this->default_charset);
+    }
 
-        if ($mode=='subscribe')
-          $updated = iil_C_Subscribe($this->conn, $mailbox);
-        else if ($mode=='unsubscribe')
-          $updated = iil_C_UnSubscribe($this->conn, $mailbox);
+
+    /* --------------------------------
+     *         private methods
+     * --------------------------------*/
+
+    /**
+     * Validate the given input and save to local properties
+     *
+     * @param string $sort_field Sort column
+     * @param string $sort_order Sort order
+     * @access private
+     */
+    private function _set_sort_order($sort_field, $sort_order)
+    {
+        if ($sort_field != null)
+            $this->sort_field = asciiwords($sort_field);
+        if ($sort_order != null)
+            $this->sort_order = strtoupper($sort_order) == 'DESC' ? 'DESC' : 'ASC';
+    }
+
+
+    /**
+     * Sort mailboxes first by default folders and then in alphabethical order
+     *
+     * @param array $a_folders Mailboxes list
+     * @access private
+     */
+    private function _sort_mailbox_list($a_folders)
+    {
+        $a_out = $a_defaults = $folders = array();
+
+        $delimiter = $this->get_hierarchy_delimiter();
+
+        // find default folders and skip folders starting with '.'
+        foreach ($a_folders as $i => $folder) {
+            if ($folder[0] == '.')
+                continue;
+
+            if (($p = array_search($folder, $this->default_folders)) !== false && !$a_defaults[$p])
+                $a_defaults[$p] = $folder;
+            else
+                $folders[$folder] = rcube_charset_convert($folder, 'UTF7-IMAP');
         }
 
-    // get cached mailbox list
-    if ($updated)
-      {
-      $a_mailbox_cache = $this->get_cache('mailboxes');
-      if (!is_array($a_mailbox_cache))
-        return $updated;
+        // sort folders and place defaults on the top
+        asort($folders, SORT_LOCALE_STRING);
+        ksort($a_defaults);
+        $folders = array_merge($a_defaults, array_keys($folders));
+
+        // finally we must rebuild the list to move
+        // subfolders of default folders to their place...
+        // ...also do this for the rest of folders because
+        // asort() is not properly sorting case sensitive names
+        while (list($key, $folder) = each($folders)) {
+            // set the type of folder name variable (#1485527)
+            $a_out[] = (string) $folder;
+            unset($folders[$key]);
+            $this->_rsort($folder, $delimiter, $folders, $a_out);
+        }
 
-      // modify cached list
-      if ($mode=='subscribe')
-        $a_mailbox_cache = array_merge($a_mailbox_cache, $a_mboxes);
-      else if ($mode=='unsubscribe')
-        $a_mailbox_cache = array_diff($a_mailbox_cache, $a_mboxes);
+        return $a_out;
+    }
 
-      // write mailboxlist to cache
-      $this->update_cache('mailboxes', $this->_sort_mailbox_list($a_mailbox_cache));
-      }
 
-    return $updated;
+    /**
+     * @access private
+     */
+    private function _rsort($folder, $delimiter, &$list, &$out)
+    {
+        while (list($key, $name) = each($list)) {
+               if (strpos($name, $folder.$delimiter) === 0) {
+                   // set the type of folder name variable (#1485527)
+               $out[] = (string) $name;
+                   unset($list[$key]);
+                   $this->_rsort($name, $delimiter, $list, $out);
+               }
+        }
+        reset($list);
     }
 
 
-  /**
-   * Increde/decrese messagecount for a specific mailbox
-   * @access private
-   */
-  private function _set_messagecount($mbox_name, $mode, $increment)
+    /**
+     * @param int    $uid       Message UID
+     * @param string $mbox_name Mailbox name
+     * @return int Message (sequence) ID
+     * @access private
+     */
+    private function _uid2id($uid, $mbox_name=NULL)
     {
-    $a_mailbox_cache = FALSE;
-    $mailbox = $mbox_name ? $mbox_name : $this->mailbox;
-    $mode = strtoupper($mode);
+        if (!strlen($mbox_name))
+            $mbox_name = $this->mailbox;
+
+        if (!isset($this->uid_id_map[$mbox_name][$uid])) {
+            if (!($id = $this->get_cache_uid2id($mbox_name.'.msg', $uid)))
+                $id = $this->conn->UID2ID($mbox_name, $uid);
 
-    $a_mailbox_cache = $this->get_cache('messagecount');
-    
-    if (!is_array($a_mailbox_cache[$mailbox]) || !isset($a_mailbox_cache[$mailbox][$mode]) || !is_numeric($increment))
-      return FALSE;
-    
-    // add incremental value to messagecount
-    $a_mailbox_cache[$mailbox][$mode] += $increment;
-    
-    // there's something wrong, delete from cache
-    if ($a_mailbox_cache[$mailbox][$mode] < 0)
-      unset($a_mailbox_cache[$mailbox][$mode]);
+            $this->uid_id_map[$mbox_name][$uid] = $id;
+        }
 
-    // write back to cache
-    $this->update_cache('messagecount', $a_mailbox_cache);
-    
-    return TRUE;
+        return $this->uid_id_map[$mbox_name][$uid];
     }
 
 
-  /**
-   * Remove messagecount of a specific mailbox from cache
-   * @access private
-   */
-  private function _clear_messagecount($mbox_name='')
+    /**
+     * @param int    $id        Message (sequence) ID
+     * @param string $mbox_name Mailbox name
+     * @return int Message UID
+     * @access private
+     */
+    private function _id2uid($id, $mbox_name=NULL)
     {
-    $a_mailbox_cache = FALSE;
-    $mailbox = $mbox_name ? $mbox_name : $this->mailbox;
+        if (!strlen($mbox_name))
+            $mbox_name = $this->mailbox;
+
+        if ($uid = array_search($id, (array)$this->uid_id_map[$mbox_name]))
+            return $uid;
 
-    $a_mailbox_cache = $this->get_cache('messagecount');
+        if (!($uid = $this->get_cache_id2uid($mbox_name.'.msg', $id)))
+            $uid = $this->conn->ID2UID($mbox_name, $id);
 
-    if (is_array($a_mailbox_cache[$mailbox]))
-      {
-      unset($a_mailbox_cache[$mailbox]);
-      $this->update_cache('messagecount', $a_mailbox_cache);
-      }
+        $this->uid_id_map[$mbox_name][$uid] = $id;
+
+        return $uid;
     }
 
 
-  /**
-   * Split RFC822 header string into an associative array
-   * @access private
-   */
-  private function _parse_headers($headers)
+    /**
+     * Subscribe/unsubscribe a list of mailboxes and update local cache
+     * @access private
+     */
+    private function _change_subscription($a_mboxes, $mode)
     {
-    $a_headers = array();
-    $lines = explode("\n", $headers);
-    $c = count($lines);
-    for ($i=0; $i<$c; $i++)
-      {
-      if ($p = strpos($lines[$i], ': '))
-        {
-        $field = strtolower(substr($lines[$i], 0, $p));
-        $value = trim(substr($lines[$i], $p+1));
-        if (!empty($value))
-          $a_headers[$field] = $value;
+        $updated = false;
+
+        if (is_array($a_mboxes))
+            foreach ($a_mboxes as $i => $mbox_name) {
+                $mailbox = $this->mod_mailbox($mbox_name);
+                $a_mboxes[$i] = $mailbox;
+
+                if ($mode=='subscribe')
+                    $updated = $this->conn->subscribe($mailbox);
+                else if ($mode=='unsubscribe')
+                    $updated = $this->conn->unsubscribe($mailbox);
+            }
+
+        // get cached mailbox list
+        if ($updated) {
+            $a_mailbox_cache = $this->get_cache('mailboxes');
+            if (!is_array($a_mailbox_cache))
+                return $updated;
+
+            // modify cached list
+            if ($mode=='subscribe')
+                $a_mailbox_cache = array_merge($a_mailbox_cache, $a_mboxes);
+            else if ($mode=='unsubscribe')
+                $a_mailbox_cache = array_diff($a_mailbox_cache, $a_mboxes);
+
+            // write mailboxlist to cache
+            $this->update_cache('mailboxes', $this->_sort_mailbox_list($a_mailbox_cache));
         }
-      }
-    
-    return $a_headers;
+
+        return $updated;
     }
 
 
-  /**
-   * @access private
-   */
-  private function _parse_address_list($str, $decode=true)
+    /**
+     * Increde/decrese messagecount for a specific mailbox
+     * @access private
+     */
+    private function _set_messagecount($mbox_name, $mode, $increment)
     {
-    // remove any newlines and carriage returns before
-    $a = rcube_explode_quoted_string('[,;]', preg_replace( "/[\r\n]/", " ", $str));
-    $result = array();
+        $a_mailbox_cache = false;
+        $mailbox = strlen($mbox_name) ? $mbox_name : $this->mailbox;
+        $mode = strtoupper($mode);
 
-    foreach ($a as $key => $val)
-      {
-      $val = preg_replace("/([\"\w])</", "$1 <", $val);
-      $sub_a = rcube_explode_quoted_string(' ', $decode ? $this->decode_header($val) : $val);
-      $result[$key]['name'] = '';
-
-      foreach ($sub_a as $k => $v)
-        {
-       // use angle brackets in regexp to not handle names with @ sign
-        if (preg_match('/^<\S+@\S+>$/', $v))
-          $result[$key]['address'] = trim($v, '<>');
-        else
-          $result[$key]['name'] .= (empty($result[$key]['name'])?'':' ').str_replace("\"",'',stripslashes($v));
+        $a_mailbox_cache = $this->get_cache('messagecount');
+
+        if (!is_array($a_mailbox_cache[$mailbox]) || !isset($a_mailbox_cache[$mailbox][$mode]) || !is_numeric($increment))
+            return false;
+
+        // add incremental value to messagecount
+        $a_mailbox_cache[$mailbox][$mode] += $increment;
+
+        // there's something wrong, delete from cache
+        if ($a_mailbox_cache[$mailbox][$mode] < 0)
+            unset($a_mailbox_cache[$mailbox][$mode]);
+
+        // write back to cache
+        $this->update_cache('messagecount', $a_mailbox_cache);
+
+        return true;
+    }
+
+
+    /**
+     * Remove messagecount of a specific mailbox from cache
+     * @access private
+     */
+    private function _clear_messagecount($mbox_name='', $mode=null)
+    {
+        $mailbox = strlen($mbox_name) ? $mbox_name : $this->mailbox;
+
+        $a_mailbox_cache = $this->get_cache('messagecount');
+
+        if (is_array($a_mailbox_cache[$mailbox])) {
+            if ($mode) {
+                unset($a_mailbox_cache[$mailbox][$mode]);
+            }
+            else {
+                unset($a_mailbox_cache[$mailbox]);
+            }
+            $this->update_cache('messagecount', $a_mailbox_cache);
+        }
+    }
+
+
+    /**
+     * Split RFC822 header string into an associative array
+     * @access private
+     */
+    private function _parse_headers($headers)
+    {
+        $a_headers = array();
+        $headers = preg_replace('/\r?\n(\t| )+/', ' ', $headers);
+        $lines = explode("\n", $headers);
+        $c = count($lines);
+
+        for ($i=0; $i<$c; $i++) {
+            if ($p = strpos($lines[$i], ': ')) {
+                $field = strtolower(substr($lines[$i], 0, $p));
+                $value = trim(substr($lines[$i], $p+1));
+                if (!empty($value))
+                    $a_headers[$field] = $value;
+            }
+        }
+
+        return $a_headers;
+    }
+
+
+    /**
+     * @access private
+     */
+    private function _parse_address_list($str, $decode=true)
+    {
+        // remove any newlines and carriage returns before
+        $a = rcube_explode_quoted_string('[,;]', preg_replace( "/[\r\n]/", " ", $str));
+        $result = array();
+
+        foreach ($a as $key => $val) {
+            $name    = '';
+            $address = '';
+            $val     = trim($val);
+
+            if (preg_match('/(.*)<(\S+@\S+)>$/', $val, $m)) {
+                $address = $m[2];
+                $name    = trim($m[1]);
+            }
+            else if (preg_match('/^(\S+@\S+)$/', $val, $m)) {
+                $address = $m[1];
+                $name    = '';
+            }
+            else {
+                $name = $val;
+            }
+
+            // dequote and/or decode name
+            if ($name) {
+                if ($name[0] == '"') {
+                    $name = substr($name, 1, -1);
+                    $name = stripslashes($name);
+                }
+                if ($decode) {
+                    $name = $this->decode_header($name);
+                }
+            }
+
+            if (!$address && $name) {
+                $address = $name;
+            }
+
+            if ($address) {
+                $result[$key] = array('name' => $name, 'address' => $address);
+            }
         }
-        
-      if (empty($result[$key]['name']))
-        $result[$key]['name'] = $result[$key]['address'];        
-      elseif (empty($result[$key]['address']))
-        $result[$key]['address'] = $result[$key]['name'];
-      }
-    
-    return $result;
+
+        return $result;
+    }
+
+
+    /**
+     * This is our own debug handler for the IMAP connection
+     * @access public
+     */
+    public function debug_handler(&$imap, $message)
+    {
+        write_log('imap', $message);
     }
 
 }  // end class rcube_imap
@@ -3141,80 +4754,83 @@ class rcube_imap
  */
 class rcube_message_part
 {
-  var $mime_id = '';
-  var $ctype_primary = 'text';
-  var $ctype_secondary = 'plain';
-  var $mimetype = 'text/plain';
-  var $disposition = '';
-  var $filename = '';
-  var $encoding = '8bit';
-  var $charset = '';
-  var $size = 0;
-  var $headers = array();
-  var $d_parameters = array();
-  var $ctype_parameters = array();
-
-  function __clone()
-  {
-    if (isset($this->parts))
-      foreach ($this->parts as $idx => $part)
-        if (is_object($part))
-         $this->parts[$idx] = clone $part;
-  }                            
+    var $mime_id = '';
+    var $ctype_primary = 'text';
+    var $ctype_secondary = 'plain';
+    var $mimetype = 'text/plain';
+    var $disposition = '';
+    var $filename = '';
+    var $encoding = '8bit';
+    var $charset = '';
+    var $size = 0;
+    var $headers = array();
+    var $d_parameters = array();
+    var $ctype_parameters = array();
+
+    function __clone()
+    {
+        if (isset($this->parts))
+            foreach ($this->parts as $idx => $part)
+                if (is_object($part))
+                       $this->parts[$idx] = clone $part;
+    }
 }
 
 
 /**
- * Class for sorting an array of iilBasicHeader objects in a predetermined order.
+ * Class for sorting an array of rcube_mail_header objects in a predetermined order.
  *
  * @package Mail
  * @author Eric Stadtherr
  */
 class rcube_header_sorter
 {
-   var $sequence_numbers = array();
-   
-   /**
-    * Set the predetermined sort order.
-    *
-    * @param array Numerically indexed array of IMAP message sequence numbers
-    */
-   function set_sequence_numbers($seqnums)
-   {
-      $this->sequence_numbers = array_flip($seqnums);
-   }
-   /**
-    * Sort the array of header objects
-    *
-    * @param array Array of iilBasicHeader objects indexed by UID
-    */
-   function sort_headers(&$headers)
-   {
-      /*
-       * uksort would work if the keys were the sequence number, but unfortunately
-       * the keys are the UIDs.  We'll use uasort instead and dereference the value
-       * to get the sequence number (in the "id" field).
-       * 
-       * uksort($headers, array($this, "compare_seqnums")); 
-       */
-       uasort($headers, array($this, "compare_seqnums"));
-   }
-   /**
-    * Sort method called by uasort()
-    */
-   function compare_seqnums($a, $b)
-   {
-      // First get the sequence number from the header object (the 'id' field).
-      $seqa = $a->id;
-      $seqb = $b->id;
-      
-      // then find each sequence number in my ordered list
-      $posa = isset($this->sequence_numbers[$seqa]) ? intval($this->sequence_numbers[$seqa]) : -1;
-      $posb = isset($this->sequence_numbers[$seqb]) ? intval($this->sequence_numbers[$seqb]) : -1;
-      
-      // return the relative position as the comparison value
-      return $posa - $posb;
-   }
+    var $sequence_numbers = array();
+
+    /**
+     * Set the predetermined sort order.
+     *
+     * @param array $seqnums Numerically indexed array of IMAP message sequence numbers
+     */
+    function set_sequence_numbers($seqnums)
+    {
+        $this->sequence_numbers = array_flip($seqnums);
+    }
+
+    /**
+     * Sort the array of header objects
+     *
+     * @param array $headers Array of rcube_mail_header objects indexed by UID
+     */
+    function sort_headers(&$headers)
+    {
+        /*
+        * uksort would work if the keys were the sequence number, but unfortunately
+        * the keys are the UIDs.  We'll use uasort instead and dereference the value
+        * to get the sequence number (in the "id" field).
+        *
+        * uksort($headers, array($this, "compare_seqnums"));
+        */
+        uasort($headers, array($this, "compare_seqnums"));
+    }
+
+    /**
+     * Sort method called by uasort()
+     *
+     * @param rcube_mail_header $a
+     * @param rcube_mail_header $b
+     */
+    function compare_seqnums($a, $b)
+    {
+        // First get the sequence number from the header object (the 'id' field).
+        $seqa = $a->id;
+        $seqb = $b->id;
+
+        // then find each sequence number in my ordered list
+        $posa = isset($this->sequence_numbers[$seqa]) ? intval($this->sequence_numbers[$seqa]) : -1;
+        $posb = isset($this->sequence_numbers[$seqb]) ? intval($this->sequence_numbers[$seqb]) : -1;
+
+        // return the relative position as the comparison value
+        return $posa - $posb;
+    }
 }
diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php
new file mode 100644 (file)
index 0000000..0fa4d80
--- /dev/null
@@ -0,0 +1,3334 @@
+<?php
+
+/**
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_imap_generic.php                                |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Provide alternative IMAP library that doesn't rely on the standard  |
+ |   C-Client based version. This allows to function regardless          |
+ |   of whether or not the PHP build it's running on has IMAP            |
+ |   functionality built-in.                                             |
+ |                                                                       |
+ |   Based on Iloha IMAP Library. See http://ilohamail.org/ for details  |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
+ | Author: Ryo Chijiiwa <Ryo@IlohaMail.org>                              |
+ +-----------------------------------------------------------------------+
+
+ $Id: rcube_imap_generic.php 4399 2011-01-08 08:37:55Z alec $
+
+*/
+
+
+/**
+ * Struct representing an e-mail message header
+ *
+ * @package Mail
+ * @author  Aleksander Machniak <alec@alec.pl>
+ */
+class rcube_mail_header
+{
+    public $id;
+    public $uid;
+    public $subject;
+    public $from;
+    public $to;
+    public $cc;
+    public $replyto;
+    public $in_reply_to;
+    public $date;
+    public $messageID;
+    public $size;
+    public $encoding;
+    public $charset;
+    public $ctype;
+    public $flags;
+    public $timestamp;
+    public $body_structure;
+    public $internaldate;
+    public $references;
+    public $priority;
+    public $mdn_to;
+    public $mdn_sent = false;
+    public $is_draft = false;
+    public $seen = false;
+    public $deleted = false;
+    public $recent = false;
+    public $answered = false;
+    public $forwarded = false;
+    public $junk = false;
+    public $flagged = false;
+    public $has_children = false;
+    public $depth = 0;
+    public $unread_children = 0;
+    public $others = array();
+}
+
+// For backward compatibility with cached messages (#1486602)
+class iilBasicHeader extends rcube_mail_header
+{
+}
+
+/**
+ * PHP based wrapper class to connect to an IMAP server
+ *
+ * @package Mail
+ * @author  Aleksander Machniak <alec@alec.pl>
+ */
+class rcube_imap_generic
+{
+    public $error;
+    public $errornum;
+    public $result;
+    public $resultcode;
+    public $data = array();
+    public $flags = array(
+        'SEEN'     => '\\Seen',
+        'DELETED'  => '\\Deleted',
+        'RECENT'   => '\\Recent',
+        'ANSWERED' => '\\Answered',
+        'DRAFT'    => '\\Draft',
+        'FLAGGED'  => '\\Flagged',
+        'FORWARDED' => '$Forwarded',
+        'MDNSENT'  => '$MDNSent',
+        '*'        => '\\*',
+    );
+
+    private $selected;
+    private $fp;
+    private $host;
+    private $logged = false;
+    private $capability = array();
+    private $capability_readed = false;
+    private $prefs;
+    private $cmd_tag;
+    private $cmd_num = 0;
+    private $_debug = false;
+    private $_debug_handler = false;
+
+    const ERROR_OK = 0;
+    const ERROR_NO = -1;
+    const ERROR_BAD = -2;
+    const ERROR_BYE = -3;
+    const ERROR_UNKNOWN = -4;
+    const ERROR_COMMAND = -5;
+    const ERROR_READONLY = -6;
+
+    const COMMAND_NORESPONSE = 1;
+    const COMMAND_CAPABILITY = 2;
+    const COMMAND_LASTLINE   = 4;
+
+    /**
+     * Object constructor
+     */
+    function __construct()
+    {
+    }
+
+    /**
+     * Send simple (one line) command to the connection stream
+     *
+     * @param string $string Command string
+     * @param bool   $endln  True if CRLF need to be added at the end of command
+     *
+     * @param int Number of bytes sent, False on error
+     */
+    function putLine($string, $endln=true)
+    {
+        if (!$this->fp)
+            return false;
+
+        if ($this->_debug) {
+            $this->debug('C: '. rtrim($string));
+        }
+
+        $res = fwrite($this->fp, $string . ($endln ? "\r\n" : ''));
+
+        if ($res === false) {
+            @fclose($this->fp);
+            $this->fp = null;
+        }
+
+        return $res;
+    }
+
+    /**
+     * Send command to the connection stream with Command Continuation
+     * Requests (RFC3501 7.5) and LITERAL+ (RFC2088) support
+     *
+     * @param string $string Command string
+     * @param bool   $endln  True if CRLF need to be added at the end of command
+     *
+     * @param int Number of bytes sent, False on error
+     */
+    function putLineC($string, $endln=true)
+    {
+        if (!$this->fp)
+            return false;
+
+        if ($endln)
+            $string .= "\r\n";
+
+        $res = 0;
+        if ($parts = preg_split('/(\{[0-9]+\}\r\n)/m', $string, -1, PREG_SPLIT_DELIM_CAPTURE)) {
+            for ($i=0, $cnt=count($parts); $i<$cnt; $i++) {
+                if (preg_match('/^\{[0-9]+\}\r\n$/', $parts[$i+1])) {
+                    // LITERAL+ support
+                    if ($this->prefs['literal+'])
+                        $parts[$i+1] = preg_replace('/([0-9]+)/', '\\1+', $parts[$i+1]);
+
+                    $bytes = $this->putLine($parts[$i].$parts[$i+1], false);
+                    if ($bytes === false)
+                        return false;
+                    $res += $bytes;
+
+                    // don't wait if server supports LITERAL+ capability
+                    if (!$this->prefs['literal+']) {
+                        $line = $this->readLine(1000);
+                        // handle error in command
+                        if ($line[0] != '+')
+                            return false;
+                    }
+                    $i++;
+                }
+                else {
+                    $bytes = $this->putLine($parts[$i], false);
+                    if ($bytes === false)
+                        return false;
+                    $res += $bytes;
+                }
+            }
+        }
+
+        return $res;
+    }
+
+    function readLine($size=1024)
+    {
+        $line = '';
+
+        if (!$this->fp) {
+            return NULL;
+        }
+
+        if (!$size) {
+            $size = 1024;
+        }
+
+        do {
+            if (feof($this->fp)) {
+                return $line ? $line : NULL;
+            }
+
+            $buffer = fgets($this->fp, $size);
+
+            if ($buffer === false) {
+                @fclose($this->fp);
+                $this->fp = null;
+                break;
+            }
+            if ($this->_debug) {
+                $this->debug('S: '. rtrim($buffer));
+            }
+            $line .= $buffer;
+        } while ($buffer[strlen($buffer)-1] != "\n");
+
+        return $line;
+    }
+
+    function multLine($line, $escape=false)
+    {
+        $line = rtrim($line);
+        if (preg_match('/\{[0-9]+\}$/', $line)) {
+            $out = '';
+
+            preg_match_all('/(.*)\{([0-9]+)\}$/', $line, $a);
+            $bytes = $a[2][0];
+            while (strlen($out) < $bytes) {
+                $line = $this->readBytes($bytes);
+                if ($line === NULL)
+                    break;
+                $out .= $line;
+            }
+
+            $line = $a[1][0] . ($escape ? $this->escape($out) : $out);
+        }
+
+        return $line;
+    }
+
+    function readBytes($bytes)
+    {
+        $data = '';
+        $len  = 0;
+        while ($len < $bytes && !feof($this->fp))
+        {
+            $d = fread($this->fp, $bytes-$len);
+            if ($this->_debug) {
+                $this->debug('S: '. $d);
+            }
+            $data .= $d;
+            $data_len = strlen($data);
+            if ($len == $data_len) {
+                break; // nothing was read -> exit to avoid apache lockups
+            }
+            $len = $data_len;
+        }
+
+        return $data;
+    }
+
+    function readReply(&$untagged=null)
+    {
+        do {
+            $line = trim($this->readLine(1024));
+            // store untagged response lines
+            if ($line[0] == '*')
+                $untagged[] = $line;
+        } while ($line[0] == '*');
+
+        if ($untagged)
+            $untagged = join("\n", $untagged);
+
+        return $line;
+    }
+
+    function parseResult($string, $err_prefix='')
+    {
+        if (preg_match('/^[a-z0-9*]+ (OK|NO|BAD|BYE)(.*)$/i', trim($string), $matches)) {
+            $res = strtoupper($matches[1]);
+            $str = trim($matches[2]);
+
+            if ($res == 'OK') {
+                $this->errornum = self::ERROR_OK;
+            } else if ($res == 'NO') {
+                $this->errornum = self::ERROR_NO;
+            } else if ($res == 'BAD') {
+                $this->errornum = self::ERROR_BAD;
+            } else if ($res == 'BYE') {
+                @fclose($this->fp);
+                $this->fp = null;
+                $this->errornum = self::ERROR_BYE;
+            }
+
+            if ($str) {
+                $str = trim($str);
+                // get response string and code (RFC5530)
+                if (preg_match("/^\[([a-z-]+)\]/i", $str, $m)) {
+                    $this->resultcode = strtoupper($m[1]);
+                    $str = trim(substr($str, strlen($m[1]) + 2));
+                }
+                else {
+                    $this->resultcode = null;
+                }
+                $this->result = $str;
+
+                if ($this->errornum != self::ERROR_OK) {
+                    $this->error = $err_prefix ? $err_prefix.$str : $str;
+                }
+            }
+
+            return $this->errornum;
+        }
+        return self::ERROR_UNKNOWN;
+    }
+
+    function setError($code, $msg='')
+    {
+        $this->errornum = $code;
+        $this->error    = $msg;
+    }
+
+    // check if $string starts with $match (or * BYE/BAD)
+    function startsWith($string, $match, $error=false, $nonempty=false)
+    {
+        $len = strlen($match);
+        if ($len == 0) {
+            return false;
+        }
+        if (!$this->fp) {
+            return true;
+        }
+        if (strncmp($string, $match, $len) == 0) {
+            return true;
+        }
+        if ($error && preg_match('/^\* (BYE|BAD) /i', $string, $m)) {
+            if (strtoupper($m[1]) == 'BYE') {
+                @fclose($this->fp);
+                $this->fp = null;
+            }
+            return true;
+        }
+        if ($nonempty && !strlen($string)) {
+            return true;
+        }
+        return false;
+    }
+
+    private function hasCapability($name)
+    {
+        if (empty($this->capability) || $name == '') {
+            return false;
+        }
+
+        if (in_array($name, $this->capability)) {
+            return true;
+        }
+        else if (strpos($name, '=')) {
+            return false;
+        }
+
+        $result = array();
+        foreach ($this->capability as $cap) {
+            $entry = explode('=', $cap);
+            if ($entry[0] == $name) {
+                $result[] = $entry[1];
+            }
+        }
+
+        return !empty($result) ? $result : false;
+    }
+
+    /**
+     * Capabilities checker
+     *
+     * @param string $name Capability name
+     *
+     * @return mixed Capability values array for key=value pairs, true/false for others
+     */
+    function getCapability($name)
+    {
+        $result = $this->hasCapability($name);
+
+        if (!empty($result)) {
+            return $result;
+        }
+        else if ($this->capability_readed) {
+            return false;
+        }
+
+        // get capabilities (only once) because initial
+        // optional CAPABILITY response may differ
+        $result = $this->execute('CAPABILITY');
+
+        if ($result[0] == self::ERROR_OK) {
+            $this->parseCapability($result[1]);
+        }
+
+        $this->capability_readed = true;
+
+        return $this->hasCapability($name);
+    }
+
+    function clearCapability()
+    {
+        $this->capability = array();
+        $this->capability_readed = false;
+    }
+
+    /**
+     * DIGEST-MD5/CRAM-MD5/PLAIN Authentication
+     *
+     * @param string $user
+     * @param string $pass
+     * @param string $type Authentication type (PLAIN/CRAM-MD5/DIGEST-MD5)
+     *
+     * @return resource Connection resourse on success, error code on error
+     */
+    function authenticate($user, $pass, $type='PLAIN')
+    {
+        if ($type == 'CRAM-MD5' || $type == 'DIGEST-MD5') {
+            if ($type == 'DIGEST-MD5' && !class_exists('Auth_SASL')) {
+                $this->setError(self::ERROR_BYE,
+                    "The Auth_SASL package is required for DIGEST-MD5 authentication");
+                return self::ERROR_BAD;
+            }
+
+            $this->putLine($this->nextTag() . " AUTHENTICATE $type");
+            $line = trim($this->readReply());
+
+            if ($line[0] == '+') {
+                $challenge = substr($line, 2);
+            }
+            else {
+                return $this->parseResult($line);
+            }
+
+            if ($type == 'CRAM-MD5') {
+                // RFC2195: CRAM-MD5
+                $ipad = '';
+                $opad = '';
+
+                // initialize ipad, opad
+                for ($i=0; $i<64; $i++) {
+                    $ipad .= chr(0x36);
+                    $opad .= chr(0x5C);
+                }
+
+                // pad $pass so it's 64 bytes
+                $padLen = 64 - strlen($pass);
+                for ($i=0; $i<$padLen; $i++) {
+                    $pass .= chr(0);
+                }
+
+                // generate hash
+                $hash  = md5($this->_xor($pass, $opad) . pack("H*",
+                    md5($this->_xor($pass, $ipad) . base64_decode($challenge))));
+                $reply = base64_encode($user . ' ' . $hash);
+
+                // send result
+                $this->putLine($reply);
+            }
+            else {
+                // RFC2831: DIGEST-MD5
+                // proxy authorization
+                if (!empty($this->prefs['auth_cid'])) {
+                    $authc = $this->prefs['auth_cid'];
+                    $pass  = $this->prefs['auth_pw'];
+                }
+                else {
+                    $authc = $user;
+                }
+                $auth_sasl = Auth_SASL::factory('digestmd5');
+                $reply = base64_encode($auth_sasl->getResponse($authc, $pass,
+                    base64_decode($challenge), $this->host, 'imap', $user));
+
+                // send result
+                $this->putLine($reply);
+                $line = trim($this->readReply());
+
+                if ($line[0] == '+') {
+                    $challenge = substr($line, 2);
+                }
+                else {
+                    return $this->parseResult($line);
+                }
+
+                // check response
+                $challenge = base64_decode($challenge);
+                if (strpos($challenge, 'rspauth=') === false) {
+                    $this->setError(self::ERROR_BAD,
+                        "Unexpected response from server to DIGEST-MD5 response");
+                    return self::ERROR_BAD;
+                }
+
+                $this->putLine('');
+            }
+
+            $line = $this->readReply();
+            $result = $this->parseResult($line);
+        }
+        else { // PLAIN
+            // proxy authorization
+            if (!empty($this->prefs['auth_cid'])) {
+                $authc = $this->prefs['auth_cid'];
+                $pass  = $this->prefs['auth_pw'];
+            }
+            else {
+                $authc = $user;
+            }
+
+            $reply = base64_encode($user . chr(0) . $authc . chr(0) . $pass);
+
+            // RFC 4959 (SASL-IR): save one round trip
+            if ($this->getCapability('SASL-IR')) {
+                list($result, $line) = $this->execute("AUTHENTICATE PLAIN", array($reply),
+                    self::COMMAND_LASTLINE | self::COMMAND_CAPABILITY);
+            }
+            else {
+                $this->putLine($this->nextTag() . " AUTHENTICATE PLAIN");
+                $line = trim($this->readReply());
+
+                if ($line[0] != '+') {
+                    return $this->parseResult($line);
+                }
+
+                // send result, get reply and process it
+                $this->putLine($reply);
+                $line = $this->readReply();
+                $result = $this->parseResult($line);
+            }
+        }
+
+        if ($result == self::ERROR_OK) {
+            // optional CAPABILITY response
+            if ($line && preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) {
+                $this->parseCapability($matches[1], true);
+            }
+            return $this->fp;
+        }
+        else {
+            $this->setError($result, "AUTHENTICATE $type: $line");
+        }
+
+        return $result;
+    }
+
+    /**
+     * LOGIN Authentication
+     *
+     * @param string $user
+     * @param string $pass
+     *
+     * @return resource Connection resourse on success, error code on error
+     */
+    function login($user, $password)
+    {
+        list($code, $response) = $this->execute('LOGIN', array(
+            $this->escape($user), $this->escape($password)), self::COMMAND_CAPABILITY);
+
+        // re-set capabilities list if untagged CAPABILITY response provided
+        if (preg_match('/\* CAPABILITY (.+)/i', $response, $matches)) {
+            $this->parseCapability($matches[1], true);
+        }
+
+        if ($code == self::ERROR_OK) {
+            return $this->fp;
+        }
+
+        return $code;
+    }
+
+    /**
+     * Gets the delimiter
+     *
+     * @return string The delimiter
+     */
+    function getHierarchyDelimiter()
+    {
+        if ($this->prefs['delimiter']) {
+            return $this->prefs['delimiter'];
+        }
+
+        // try (LIST "" ""), should return delimiter (RFC2060 Sec 6.3.8)
+        list($code, $response) = $this->execute('LIST',
+            array($this->escape(''), $this->escape('')));
+
+        if ($code == self::ERROR_OK) {
+            $args = $this->tokenizeResponse($response, 4);
+            $delimiter = $args[3];
+
+            if (strlen($delimiter) > 0) {
+                return ($this->prefs['delimiter'] = $delimiter);
+            }
+        }
+
+        return NULL;
+    }
+
+    /**
+     * NAMESPACE handler (RFC 2342)
+     *
+     * @return array Namespace data hash (personal, other, shared)
+     */
+    function getNamespace()
+    {
+        if (array_key_exists('namespace', $this->prefs)) {
+            return $this->prefs['namespace'];
+        }
+
+        if (!$this->getCapability('NAMESPACE')) {
+            return self::ERROR_BAD;
+        }
+
+        list($code, $response) = $this->execute('NAMESPACE');
+
+        if ($code == self::ERROR_OK && preg_match('/^\* NAMESPACE /', $response)) {
+            $data = $this->tokenizeResponse(substr($response, 11));
+        }
+
+        if (!is_array($data)) {
+            return $code;
+        }
+
+        $this->prefs['namespace'] = array(
+            'personal' => $data[0],
+            'other'    => $data[1],
+            'shared'   => $data[2],
+        );
+
+        return $this->prefs['namespace'];
+    }
+
+    function connect($host, $user, $password, $options=null)
+    {
+        // set options
+        if (is_array($options)) {
+            $this->prefs = $options;
+        }
+        // set auth method
+        if (!empty($this->prefs['auth_method'])) {
+            $auth_method = strtoupper($this->prefs['auth_method']);
+        } else {
+            $auth_method = 'CHECK';
+        }
+
+        $result = false;
+
+        // initialize connection
+        $this->error    = '';
+        $this->errornum = self::ERROR_OK;
+        $this->selected = '';
+        $this->user     = $user;
+        $this->host     = $host;
+        $this->logged   = false;
+
+        // check input
+        if (empty($host)) {
+            $this->setError(self::ERROR_BAD, "Empty host");
+            return false;
+        }
+        if (empty($user)) {
+            $this->setError(self::ERROR_NO, "Empty user");
+            return false;
+        }
+        if (empty($password)) {
+            $this->setError(self::ERROR_NO, "Empty password");
+            return false;
+        }
+
+        if (!$this->prefs['port']) {
+            $this->prefs['port'] = 143;
+        }
+        // check for SSL
+        if ($this->prefs['ssl_mode'] && $this->prefs['ssl_mode'] != 'tls') {
+            $host = $this->prefs['ssl_mode'] . '://' . $host;
+        }
+
+        // Connect
+        if ($this->prefs['timeout'] > 0)
+            $this->fp = @fsockopen($host, $this->prefs['port'], $errno, $errstr, $this->prefs['timeout']);
+        else
+            $this->fp = @fsockopen($host, $this->prefs['port'], $errno, $errstr);
+
+        if (!$this->fp) {
+            $this->setError(self::ERROR_BAD, sprintf("Could not connect to %s:%d: %s", $host, $this->prefs['port'], $errstr));
+            return false;
+        }
+
+        if ($this->prefs['timeout'] > 0)
+            stream_set_timeout($this->fp, $this->prefs['timeout']);
+
+        $line = trim(fgets($this->fp, 8192));
+
+        if ($this->_debug && $line) {
+            $this->debug('S: '. $line);
+        }
+
+        // Connected to wrong port or connection error?
+        if (!preg_match('/^\* (OK|PREAUTH)/i', $line)) {
+            if ($line)
+                $error = sprintf("Wrong startup greeting (%s:%d): %s", $host, $this->prefs['port'], $line);
+            else
+                $error = sprintf("Empty startup greeting (%s:%d)", $host, $this->prefs['port']);
+
+            $this->setError(self::ERROR_BAD, $error);
+            $this->closeConnection();
+            return false;
+        }
+
+        // RFC3501 [7.1] optional CAPABILITY response
+        if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) {
+            $this->parseCapability($matches[1], true);
+        }
+
+        // TLS connection
+        if ($this->prefs['ssl_mode'] == 'tls' && $this->getCapability('STARTTLS')) {
+            if (version_compare(PHP_VERSION, '5.1.0', '>=')) {
+                $res = $this->execute('STARTTLS');
+
+                if ($res[0] != self::ERROR_OK) {
+                    $this->closeConnection();
+                    return false;
+                }
+
+                if (!stream_socket_enable_crypto($this->fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
+                    $this->setError(self::ERROR_BAD, "Unable to negotiate TLS");
+                    $this->closeConnection();
+                    return false;
+                }
+
+                // Now we're secure, capabilities need to be reread
+                $this->clearCapability();
+            }
+        }
+
+        $auth_methods = array();
+        $result       = null;
+
+        // check for supported auth methods
+        if ($auth_method == 'CHECK') {
+            if ($auth_caps = $this->getCapability('AUTH')) {
+                $auth_methods = $auth_caps;
+            }
+            // RFC 2595 (LOGINDISABLED) LOGIN disabled when connection is not secure
+            $login_disabled = $this->getCapability('LOGINDISABLED');
+            if (($key = array_search('LOGIN', $auth_methods)) !== false) {
+                if ($login_disabled) {
+                    unset($auth_methods[$key]);
+                }
+            }
+            else if (!$login_disabled) {
+                $auth_methods[] = 'LOGIN';
+            }
+        }
+        else {
+            // Prevent from sending credentials in plain text when connection is not secure
+            if ($auth_method == 'LOGIN' && $this->getCapability('LOGINDISABLED')) {
+                $this->setError(self::ERROR_BAD, "Login disabled by IMAP server");
+                $this->closeConnection();
+                return false;
+            }
+            // replace AUTH with CRAM-MD5 for backward compat.
+            $auth_methods[] = $auth_method == 'AUTH' ? 'CRAM-MD5' : $auth_method;
+        }
+
+        // pre-login capabilities can be not complete
+        $this->capability_readed = false;
+
+        // Authenticate
+        foreach ($auth_methods as $method) {
+            switch ($method) {
+            case 'CRAM_MD5':
+                $method = 'CRAM-MD5';
+            case 'CRAM-MD5':
+            case 'DIGEST-MD5':
+            case 'PLAIN':
+                $result = $this->authenticate($user, $password, $method);
+                break;
+            case 'LOGIN':
+                $result = $this->login($user, $password);
+                break;
+            default:
+                $this->setError(self::ERROR_BAD, "Configuration error. Unknown auth method: $method");
+            }
+
+            if (is_resource($result)) {
+                break;
+            }
+        }
+
+        // Connected and authenticated
+        if (is_resource($result)) {
+            if ($this->prefs['force_caps']) {
+                $this->clearCapability();
+            }
+            $this->logged = true;
+
+            return true;
+        }
+
+        $this->closeConnection();
+
+        return false;
+    }
+
+    function connected()
+    {
+        return ($this->fp && $this->logged) ? true : false;
+    }
+
+    function closeConnection()
+    {
+        if ($this->putLine($this->nextTag() . ' LOGOUT')) {
+            $this->readReply();
+        }
+
+        @fclose($this->fp);
+        $this->fp = false;
+    }
+
+    /**
+     * Executes SELECT command (if mailbox is already not in selected state)
+     *
+     * @param string $mailbox Mailbox name
+     *
+     * @return boolean True on success, false on error
+     * @access public
+     */
+    function select($mailbox)
+    {
+        if (!strlen($mailbox)) {
+            return false;
+        }
+
+        if ($this->selected == $mailbox) {
+            return true;
+        }
+/*
+    Temporary commented out because Courier returns \Noselect for INBOX
+    Requires more investigation
+
+        if (is_array($this->data['LIST']) && is_array($opts = $this->data['LIST'][$mailbox])) {
+            if (in_array('\\Noselect', $opts)) {
+                return false;
+            }
+        }
+*/
+        list($code, $response) = $this->execute('SELECT', array($this->escape($mailbox)));
+
+        if ($code == self::ERROR_OK) {
+            $response = explode("\r\n", $response);
+            foreach ($response as $line) {
+                if (preg_match('/^\* ([0-9]+) (EXISTS|RECENT)$/i', $line, $m)) {
+                    $this->data[strtoupper($m[2])] = (int) $m[1];
+                }
+                else if (preg_match('/^\* OK \[(UIDNEXT|UIDVALIDITY|UNSEEN) ([0-9]+)\]/i', $line, $match)) {
+                    $this->data[strtoupper($match[1])] = (int) $match[2];
+                }
+                else if (preg_match('/^\* OK \[PERMANENTFLAGS \(([^\)]+)\)\]/iU', $line, $match)) {
+                    $this->data['PERMANENTFLAGS'] = explode(' ', $match[1]);
+                }
+            }
+
+            $this->data['READ-WRITE'] = $this->resultcode != 'READ-ONLY';
+
+            $this->selected = $mailbox;
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Executes STATUS command
+     *
+     * @param string $mailbox Mailbox name
+     * @param array  $items   Additional requested item names. By default
+     *                        MESSAGES and UNSEEN are requested. Other defined
+     *                        in RFC3501: UIDNEXT, UIDVALIDITY, RECENT
+     *
+     * @return array Status item-value hash
+     * @access public
+     * @since 0.5-beta
+     */
+    function status($mailbox, $items=array())
+    {
+        if (!strlen($mailbox)) {
+            return false;
+        }
+
+        if (!in_array('MESSAGES', $items)) {
+            $items[] = 'MESSAGES';
+        }
+        if (!in_array('UNSEEN', $items)) {
+            $items[] = 'UNSEEN';
+        }
+
+        list($code, $response) = $this->execute('STATUS', array($this->escape($mailbox),
+            '(' . implode(' ', (array) $items) . ')'));
+
+        if ($code == self::ERROR_OK && preg_match('/\* STATUS /i', $response)) {
+            $result   = array();
+            $response = substr($response, 9); // remove prefix "* STATUS "
+
+            list($mbox, $items) = $this->tokenizeResponse($response, 2);
+
+            for ($i=0, $len=count($items); $i<$len; $i += 2) {
+                $result[$items[$i]] = (int) $items[$i+1];
+            }
+
+            $this->data['STATUS:'.$mailbox] = $result;
+
+            return $result;
+        }
+
+        return false;
+    }
+
+    /**
+     * Executes EXPUNGE command
+     *
+     * @param string $mailbox  Mailbox name
+     * @param string $messages Message UIDs to expunge
+     *
+     * @return boolean True on success, False on error
+     * @access public
+     */
+    function expunge($mailbox, $messages=NULL)
+    {
+        if (!$this->select($mailbox)) {
+            return false;
+        }
+
+        if (!$this->data['READ-WRITE']) {
+            $this->setError(self::ERROR_READONLY, "Mailbox is read-only", 'EXPUNGE');
+            return false;
+        }
+
+        // Clear internal status cache
+        unset($this->data['STATUS:'.$mailbox]);
+
+        if ($messages)
+            $result = $this->execute('UID EXPUNGE', array($messages), self::COMMAND_NORESPONSE);
+        else
+            $result = $this->execute('EXPUNGE', null, self::COMMAND_NORESPONSE);
+
+        if ($result == self::ERROR_OK) {
+            $this->selected = ''; // state has changed, need to reselect
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Executes CLOSE command
+     *
+     * @return boolean True on success, False on error
+     * @access public
+     * @since 0.5
+     */
+    function close()
+    {
+        $result = $this->execute('CLOSE', NULL, self::COMMAND_NORESPONSE);
+
+        if ($result == self::ERROR_OK) {
+            $this->selected = '';
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Executes SUBSCRIBE command
+     *
+     * @param string $mailbox Mailbox name
+     *
+     * @return boolean True on success, False on error
+     * @access public
+     */
+    function subscribe($mailbox)
+    {
+        $result = $this->execute('SUBSCRIBE', array($this->escape($mailbox)),
+            self::COMMAND_NORESPONSE);
+
+        return ($result == self::ERROR_OK);
+    }
+
+    /**
+     * Executes UNSUBSCRIBE command
+     *
+     * @param string $mailbox Mailbox name
+     *
+     * @return boolean True on success, False on error
+     * @access public
+     */
+    function unsubscribe($mailbox)
+    {
+        $result = $this->execute('UNSUBSCRIBE', array($this->escape($mailbox)),
+            self::COMMAND_NORESPONSE);
+
+        return ($result == self::ERROR_OK);
+    }
+
+    /**
+     * Executes DELETE command
+     *
+     * @param string $mailbox Mailbox name
+     *
+     * @return boolean True on success, False on error
+     * @access public
+     */
+    function deleteFolder($mailbox)
+    {
+        $result = $this->execute('DELETE', array($this->escape($mailbox)),
+            self::COMMAND_NORESPONSE);
+
+        return ($result == self::ERROR_OK);
+    }
+
+    /**
+     * Removes all messages in a folder
+     *
+     * @param string $mailbox Mailbox name
+     *
+     * @return boolean True on success, False on error
+     * @access public
+     */
+    function clearFolder($mailbox)
+    {
+        $num_in_trash = $this->countMessages($mailbox);
+        if ($num_in_trash > 0) {
+            $res = $this->delete($mailbox, '1:*');
+        }
+
+        if ($res) {
+            if ($this->selected == $mailbox)
+                $res = $this->close();
+            else
+                $res = $this->expunge($mailbox);
+        }
+
+        return $res;
+    }
+
+    /**
+     * Returns count of all messages in a folder
+     *
+     * @param string $mailbox Mailbox name
+     *
+     * @return int Number of messages, False on error
+     * @access public
+     */
+    function countMessages($mailbox, $refresh = false)
+    {
+        if ($refresh) {
+            $this->selected = '';
+        }
+
+        if ($this->selected == $mailbox) {
+            return $this->data['EXISTS'];
+        }
+
+        // Check internal cache
+        $cache = $this->data['STATUS:'.$mailbox];
+        if (!empty($cache) && isset($cache['MESSAGES'])) {
+            return (int) $cache['MESSAGES'];
+        }
+
+        // Try STATUS (should be faster than SELECT)
+        $counts = $this->status($mailbox);
+        if (is_array($counts)) {
+            return (int) $counts['MESSAGES'];
+        }
+
+        return false;
+    }
+
+    /**
+     * Returns count of messages with \Recent flag in a folder
+     *
+     * @param string $mailbox Mailbox name
+     *
+     * @return int Number of messages, False on error
+     * @access public
+     */
+    function countRecent($mailbox)
+    {
+        if (!strlen($mailbox)) {
+            $mailbox = 'INBOX';
+        }
+
+        $this->select($mailbox);
+
+        if ($this->selected == $mailbox) {
+            return $this->data['RECENT'];
+        }
+
+        return false;
+    }
+
+    /**
+     * Returns count of messages without \Seen flag in a specified folder
+     *
+     * @param string $mailbox Mailbox name
+     *
+     * @return int Number of messages, False on error
+     * @access public
+     */
+    function countUnseen($mailbox)
+    {
+        // Check internal cache
+        $cache = $this->data['STATUS:'.$mailbox];
+        if (!empty($cache) && isset($cache['UNSEEN'])) {
+            return (int) $cache['UNSEEN'];
+        }
+
+        // Try STATUS (should be faster than SELECT+SEARCH)
+        $counts = $this->status($mailbox);
+        if (is_array($counts)) {
+            return (int) $counts['UNSEEN'];
+        }
+
+        // Invoke SEARCH as a fallback
+        $index = $this->search($mailbox, 'ALL UNSEEN', false, array('COUNT'));
+        if (is_array($index)) {
+            return (int) $index['COUNT'];
+        }
+
+        return false;
+    }
+
+    function sort($mailbox, $field, $add='', $is_uid=FALSE, $encoding = 'US-ASCII')
+    {
+        $field = strtoupper($field);
+        if ($field == 'INTERNALDATE') {
+            $field = 'ARRIVAL';
+        }
+
+        $fields = array('ARRIVAL' => 1,'CC' => 1,'DATE' => 1,
+            'FROM' => 1, 'SIZE' => 1, 'SUBJECT' => 1, 'TO' => 1);
+
+        if (!$fields[$field]) {
+            return false;
+        }
+
+        if (!$this->select($mailbox)) {
+            return false;
+        }
+
+        // message IDs
+        if (!empty($add))
+            $add = $this->compressMessageSet($add);
+
+        list($code, $response) = $this->execute($is_uid ? 'UID SORT' : 'SORT',
+            array("($field)", $encoding, 'ALL' . (!empty($add) ? ' '.$add : '')));
+
+        if ($code == self::ERROR_OK) {
+            // remove prefix and unilateral untagged server responses
+            $response = substr($response, stripos($response, '* SORT') + 7);
+            if ($pos = strpos($response, '*')) {
+                $response = substr($response, 0, $pos);
+            }
+            return preg_split('/[\s\r\n]+/', $response, -1, PREG_SPLIT_NO_EMPTY);
+        }
+
+        return false;
+    }
+
+    function fetchHeaderIndex($mailbox, $message_set, $index_field='', $skip_deleted=true, $uidfetch=false)
+    {
+        if (is_array($message_set)) {
+            if (!($message_set = $this->compressMessageSet($message_set)))
+                return false;
+        } else {
+            list($from_idx, $to_idx) = explode(':', $message_set);
+            if (empty($message_set) ||
+                (isset($to_idx) && $to_idx != '*' && (int)$from_idx > (int)$to_idx)) {
+                return false;
+            }
+        }
+
+        $index_field = empty($index_field) ? 'DATE' : strtoupper($index_field);
+
+        $fields_a['DATE']         = 1;
+        $fields_a['INTERNALDATE'] = 4;
+        $fields_a['ARRIVAL']      = 4;
+        $fields_a['FROM']         = 1;
+        $fields_a['REPLY-TO']     = 1;
+        $fields_a['SENDER']       = 1;
+        $fields_a['TO']           = 1;
+        $fields_a['CC']           = 1;
+        $fields_a['SUBJECT']      = 1;
+        $fields_a['UID']          = 2;
+        $fields_a['SIZE']         = 2;
+        $fields_a['SEEN']         = 3;
+        $fields_a['RECENT']       = 3;
+        $fields_a['DELETED']      = 3;
+
+        if (!($mode = $fields_a[$index_field])) {
+            return false;
+        }
+
+        /*  Do "SELECT" command */
+        if (!$this->select($mailbox)) {
+            return false;
+        }
+
+        // build FETCH command string
+        $key     = $this->nextTag();
+        $cmd     = $uidfetch ? 'UID FETCH' : 'FETCH';
+        $deleted = $skip_deleted ? ' FLAGS' : '';
+
+        if ($mode == 1 && $index_field == 'DATE')
+            $request = " $cmd $message_set (INTERNALDATE BODY.PEEK[HEADER.FIELDS (DATE)]$deleted)";
+        else if ($mode == 1)
+            $request = " $cmd $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)]$deleted)";
+        else if ($mode == 2) {
+            if ($index_field == 'SIZE')
+                $request = " $cmd $message_set (RFC822.SIZE$deleted)";
+            else
+                $request = " $cmd $message_set ($index_field$deleted)";
+        } else if ($mode == 3)
+            $request = " $cmd $message_set (FLAGS)";
+        else // 4
+            $request = " $cmd $message_set (INTERNALDATE$deleted)";
+
+        $request = $key . $request;
+
+        if (!$this->putLine($request)) {
+            $this->setError(self::ERROR_COMMAND, "Unable to send command: $request");
+            return false;
+        }
+
+        $result = array();
+
+        do {
+            $line = rtrim($this->readLine(200));
+            $line = $this->multLine($line);
+
+            if (preg_match('/^\* ([0-9]+) FETCH/', $line, $m)) {
+                $id     = $m[1];
+                $flags  = NULL;
+
+                if ($skip_deleted && preg_match('/FLAGS \(([^)]+)\)/', $line, $matches)) {
+                    $flags = explode(' ', strtoupper($matches[1]));
+                    if (in_array('\\DELETED', $flags)) {
+                        $deleted[$id] = $id;
+                        continue;
+                    }
+                }
+
+                if ($mode == 1 && $index_field == 'DATE') {
+                    if (preg_match('/BODY\[HEADER\.FIELDS \("*DATE"*\)\] (.*)/', $line, $matches)) {
+                        $value = preg_replace(array('/^"*[a-z]+:/i'), '', $matches[1]);
+                        $value = trim($value);
+                        $result[$id] = $this->strToTime($value);
+                    }
+                    // non-existent/empty Date: header, use INTERNALDATE
+                    if (empty($result[$id])) {
+                        if (preg_match('/INTERNALDATE "([^"]+)"/', $line, $matches))
+                            $result[$id] = $this->strToTime($matches[1]);
+                        else
+                            $result[$id] = 0;
+                    }
+                } else if ($mode == 1) {
+                    if (preg_match('/BODY\[HEADER\.FIELDS \("?(FROM|REPLY-TO|SENDER|TO|SUBJECT)"?\)\] (.*)/', $line, $matches)) {
+                        $value = preg_replace(array('/^"*[a-z]+:/i', '/\s+$/sm'), array('', ''), $matches[2]);
+                        $result[$id] = trim($value);
+                    } else {
+                        $result[$id] = '';
+                    }
+                } else if ($mode == 2) {
+                    if (preg_match('/\((UID|RFC822\.SIZE) ([0-9]+)/', $line, $matches)) {
+                        $result[$id] = trim($matches[2]);
+                    } else {
+                        $result[$id] = 0;
+                    }
+                } else if ($mode == 3) {
+                    if (!$flags && preg_match('/FLAGS \(([^)]+)\)/', $line, $matches)) {
+                        $flags = explode(' ', $matches[1]);
+                    }
+                    $result[$id] = in_array('\\'.$index_field, $flags) ? 1 : 0;
+                } else if ($mode == 4) {
+                    if (preg_match('/INTERNALDATE "([^"]+)"/', $line, $matches)) {
+                        $result[$id] = $this->strToTime($matches[1]);
+                    } else {
+                        $result[$id] = 0;
+                    }
+                }
+            }
+        } while (!$this->startsWith($line, $key, true, true));
+
+        return $result;
+    }
+
+    static function compressMessageSet($messages, $force=false)
+    {
+        // given a comma delimited list of independent mid's,
+        // compresses by grouping sequences together
+
+        if (!is_array($messages)) {
+            // if less than 255 bytes long, let's not bother
+            if (!$force && strlen($messages)<255) {
+                return $messages;
+           }
+
+            // see if it's already been compressed
+            if (strpos($messages, ':') !== false) {
+                return $messages;
+            }
+
+            // separate, then sort
+            $messages = explode(',', $messages);
+        }
+
+        sort($messages);
+
+        $result = array();
+        $start  = $prev = $messages[0];
+
+        foreach ($messages as $id) {
+            $incr = $id - $prev;
+            if ($incr > 1) { // found a gap
+                if ($start == $prev) {
+                    $result[] = $prev; // push single id
+                } else {
+                    $result[] = $start . ':' . $prev; // push sequence as start_id:end_id
+                }
+                $start = $id; // start of new sequence
+            }
+            $prev = $id;
+        }
+
+        // handle the last sequence/id
+        if ($start == $prev) {
+            $result[] = $prev;
+        } else {
+            $result[] = $start.':'.$prev;
+        }
+
+        // return as comma separated string
+        return implode(',', $result);
+    }
+
+    static function uncompressMessageSet($messages)
+    {
+        $result   = array();
+        $messages = explode(',', $messages);
+
+        foreach ($messages as $part) {
+            $items = explode(':', $part);
+            $max   = max($items[0], $items[1]);
+
+            for ($x=$items[0]; $x<=$max; $x++) {
+                $result[] = $x;
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Returns message sequence identifier
+     *
+     * @param string $mailbox Mailbox name
+     * @param int    $uid     Message unique identifier (UID)
+     *
+     * @return int Message sequence identifier
+     * @access public
+     */
+    function UID2ID($mailbox, $uid)
+    {
+        if ($uid > 0) {
+            $id_a = $this->search($mailbox, "UID $uid");
+            if (is_array($id_a) && count($id_a) == 1) {
+                return (int) $id_a[0];
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns message unique identifier (UID)
+     *
+     * @param string $mailbox Mailbox name
+     * @param int    $uid     Message sequence identifier
+     *
+     * @return int Message unique identifier
+     * @access public
+     */
+    function ID2UID($mailbox, $id)
+    {
+        if (empty($id) || $id < 0) {
+            return     null;
+        }
+
+        if (!$this->select($mailbox)) {
+            return null;
+        }
+
+        list($code, $response) = $this->execute('FETCH', array($id, '(UID)'));
+
+        if ($code == self::ERROR_OK && preg_match("/^\* $id FETCH \(UID (.*)\)/i", $response, $m)) {
+            return (int) $m[1];
+        }
+
+        return null;
+    }
+
+    function fetchUIDs($mailbox, $message_set=null)
+    {
+        if (is_array($message_set))
+            $message_set = join(',', $message_set);
+        else if (empty($message_set))
+            $message_set = '1:*';
+
+        return $this->fetchHeaderIndex($mailbox, $message_set, 'UID', false);
+    }
+
+    function fetchHeaders($mailbox, $message_set, $uidfetch=false, $bodystr=false, $add='')
+    {
+        $result = array();
+
+        if (!$this->select($mailbox)) {
+            return false;
+        }
+
+        $message_set = $this->compressMessageSet($message_set);
+
+        if ($add)
+            $add = ' '.trim($add);
+
+        /* FETCH uid, size, flags and headers */
+        $key      = $this->nextTag();
+        $request  = $key . ($uidfetch ? ' UID' : '') . " FETCH $message_set ";
+        $request .= "(UID RFC822.SIZE FLAGS INTERNALDATE ";
+        if ($bodystr)
+            $request .= "BODYSTRUCTURE ";
+        $request .= "BODY.PEEK[HEADER.FIELDS (DATE FROM TO SUBJECT CONTENT-TYPE ";
+        $request .= "LIST-POST DISPOSITION-NOTIFICATION-TO".$add.")])";
+
+        if (!$this->putLine($request)) {
+            $this->setError(self::ERROR_COMMAND, "Unable to send command: $request");
+            return false;
+        }
+        do {
+            $line = $this->readLine(4096);
+            $line = $this->multLine($line);
+
+            if (!$line)
+                break;
+
+            if (preg_match('/^\* ([0-9]+) FETCH/', $line, $m)) {
+                $id = intval($m[1]);
+
+                $result[$id]            = new rcube_mail_header;
+                $result[$id]->id        = $id;
+                $result[$id]->subject   = '';
+                $result[$id]->messageID = 'mid:' . $id;
+
+                $lines = array();
+                $ln = 0;
+
+                // Sample reply line:
+                // * 321 FETCH (UID 2417 RFC822.SIZE 2730 FLAGS (\Seen)
+                // INTERNALDATE "16-Nov-2008 21:08:46 +0100" BODYSTRUCTURE (...)
+                // BODY[HEADER.FIELDS ...
+
+                if (preg_match('/^\* [0-9]+ FETCH \((.*) BODY/s', $line, $matches)) {
+                    $str = $matches[1];
+
+                    // swap parents with quotes, then explode
+                    $str = preg_replace('/[()]/', '"', $str);
+                    $a = rcube_explode_quoted_string(' ', $str);
+
+                    // did we get the right number of replies?
+                    $parts_count = count($a);
+                    if ($parts_count>=6) {
+                        for ($i=0; $i<$parts_count; $i=$i+2) {
+                            if ($a[$i] == 'UID') {
+                                $result[$id]->uid = intval($a[$i+1]);
+                            }
+                            else if ($a[$i] == 'RFC822.SIZE') {
+                                $result[$id]->size = intval($a[$i+1]);
+                            }
+                            else if ($a[$i] == 'INTERNALDATE') {
+                                $time_str = $a[$i+1];
+                            }
+                            else if ($a[$i] == 'FLAGS') {
+                                $flags_str = $a[$i+1];
+                            }
+                        }
+
+                        $time_str = str_replace('"', '', $time_str);
+
+                        // if time is gmt...
+                        $time_str = str_replace('GMT','+0000',$time_str);
+
+                        $result[$id]->internaldate = $time_str;
+                        $result[$id]->timestamp    = $this->StrToTime($time_str);
+                        $result[$id]->date         = $time_str;
+                    }
+
+                    // BODYSTRUCTURE
+                    if ($bodystr) {
+                        while (!preg_match('/ BODYSTRUCTURE (.*) BODY\[HEADER.FIELDS/s', $line, $m)) {
+                            $line2 = $this->readLine(1024);
+                            $line .= $this->multLine($line2, true);
+                        }
+                        $result[$id]->body_structure = $m[1];
+                    }
+
+                    // the rest of the result
+                    if (preg_match('/ BODY\[HEADER.FIELDS \(.*?\)\]\s*(.*)$/s', $line, $m)) {
+                        $reslines = explode("\n", trim($m[1], '"'));
+                        // re-parse (see below)
+                        foreach ($reslines as $resln) {
+                            if (ord($resln[0])<=32) {
+                                $lines[$ln] .= (empty($lines[$ln])?'':"\n").trim($resln);
+                            } else {
+                                $lines[++$ln] = trim($resln);
+                            }
+                        }
+                    }
+                }
+
+                // Start parsing headers.  The problem is, some header "lines" take up multiple lines.
+                // So, we'll read ahead, and if the one we're reading now is a valid header, we'll
+                // process the previous line.  Otherwise, we'll keep adding the strings until we come
+                // to the next valid header line.
+
+                do {
+                    $line = rtrim($this->readLine(300), "\r\n");
+
+                    // The preg_match below works around communigate imap, which outputs " UID <number>)".
+                    // Without this, the while statement continues on and gets the "FH0 OK completed" message.
+                    // If this loop gets the ending message, then the outer loop does not receive it from radline on line 1249.
+                    // This in causes the if statement on line 1278 to never be true, which causes the headers to end up missing
+                    // If the if statement was changed to pick up the fh0 from this loop, then it causes the outer loop to spin
+                    // An alternative might be:
+                    // if (!preg_match("/:/",$line) && preg_match("/\)$/",$line)) break;
+                    // however, unsure how well this would work with all imap clients.
+                    if (preg_match("/^\s*UID [0-9]+\)$/", $line)) {
+                        break;
+                    }
+
+                    // handle FLAGS reply after headers (AOL, Zimbra?)
+                    if (preg_match('/\s+FLAGS \((.*)\)\)$/', $line, $matches)) {
+                        $flags_str = $matches[1];
+                        break;
+                    }
+
+                    if (ord($line[0])<=32) {
+                        $lines[$ln] .= (empty($lines[$ln])?'':"\n").trim($line);
+                    } else {
+                        $lines[++$ln] = trim($line);
+                    }
+                // patch from "Maksim Rubis" <siburny@hotmail.com>
+                } while ($line[0] != ')' && !$this->startsWith($line, $key, true));
+
+                if (strncmp($line, $key, strlen($key))) {
+                    // process header, fill rcube_mail_header obj.
+                    // initialize
+                    if (is_array($headers)) {
+                        reset($headers);
+                        while (list($k, $bar) = each($headers)) {
+                            $headers[$k] = '';
+                        }
+                    }
+
+                    // create array with header field:data
+                    while (list($lines_key, $str) = each($lines)) {
+                        list($field, $string) = $this->splitHeaderLine($str);
+
+                        $field  = strtolower($field);
+                        $string = preg_replace('/\n\s*/', ' ', $string);
+
+                        switch ($field) {
+                        case 'date';
+                            $result[$id]->date = $string;
+                            $result[$id]->timestamp = $this->strToTime($string);
+                            break;
+                        case 'from':
+                            $result[$id]->from = $string;
+                            break;
+                        case 'to':
+                            $result[$id]->to = preg_replace('/undisclosed-recipients:[;,]*/', '', $string);
+                            break;
+                        case 'subject':
+                            $result[$id]->subject = $string;
+                            break;
+                        case 'reply-to':
+                            $result[$id]->replyto = $string;
+                            break;
+                        case 'cc':
+                            $result[$id]->cc = $string;
+                            break;
+                        case 'bcc':
+                            $result[$id]->bcc = $string;
+                            break;
+                        case 'content-transfer-encoding':
+                            $result[$id]->encoding = $string;
+                        break;
+                        case 'content-type':
+                            $ctype_parts = preg_split('/[; ]/', $string);
+                            $result[$id]->ctype = array_shift($ctype_parts);
+                            if (preg_match('/charset\s*=\s*"?([a-z0-9\-\.\_]+)"?/i', $string, $regs)) {
+                                $result[$id]->charset = $regs[1];
+                            }
+                            break;
+                        case 'in-reply-to':
+                            $result[$id]->in_reply_to = str_replace(array("\n", '<', '>'), '', $string);
+                            break;
+                        case 'references':
+                            $result[$id]->references = $string;
+                            break;
+                        case 'return-receipt-to':
+                        case 'disposition-notification-to':
+                        case 'x-confirm-reading-to':
+                            $result[$id]->mdn_to = $string;
+                            break;
+                        case 'message-id':
+                            $result[$id]->messageID = $string;
+                            break;
+                        case 'x-priority':
+                            if (preg_match('/^(\d+)/', $string, $matches)) {
+                                $result[$id]->priority = intval($matches[1]);
+                            }
+                            break;
+                        default:
+                            if (strlen($field) > 2) {
+                                $result[$id]->others[$field] = $string;
+                            }
+                            break;
+                        } // end switch ()
+                    } // end while ()
+                }
+
+                // process flags
+                if (!empty($flags_str)) {
+                    $flags_str = preg_replace('/[\\\"]/', '', $flags_str);
+                    $flags_a   = explode(' ', $flags_str);
+
+                    if (is_array($flags_a)) {
+                        foreach($flags_a as $flag) {
+                            $flag = strtoupper($flag);
+                            if ($flag == 'SEEN') {
+                                $result[$id]->seen = true;
+                            } else if ($flag == 'DELETED') {
+                                $result[$id]->deleted = true;
+                            } else if ($flag == 'RECENT') {
+                                $result[$id]->recent = true;
+                            } else if ($flag == 'ANSWERED') {
+                                $result[$id]->answered = true;
+                            } else if ($flag == '$FORWARDED') {
+                                $result[$id]->forwarded = true;
+                            } else if ($flag == 'DRAFT') {
+                                $result[$id]->is_draft = true;
+                            } else if ($flag == '$MDNSENT') {
+                                $result[$id]->mdn_sent = true;
+                            } else if ($flag == 'FLAGGED') {
+                                 $result[$id]->flagged = true;
+                            }
+                        }
+                        $result[$id]->flags = $flags_a;
+                    }
+                }
+            }
+        } while (!$this->startsWith($line, $key, true));
+
+        return $result;
+    }
+
+    function fetchHeader($mailbox, $id, $uidfetch=false, $bodystr=false, $add='')
+    {
+        $a  = $this->fetchHeaders($mailbox, $id, $uidfetch, $bodystr, $add);
+        if (is_array($a)) {
+            return array_shift($a);
+        }
+        return false;
+    }
+
+    function sortHeaders($a, $field, $flag)
+    {
+        if (empty($field)) {
+            $field = 'uid';
+        }
+        else {
+            $field = strtolower($field);
+        }
+
+        if ($field == 'date' || $field == 'internaldate') {
+            $field = 'timestamp';
+        }
+
+        if (empty($flag)) {
+            $flag = 'ASC';
+        } else {
+            $flag = strtoupper($flag);
+        }
+
+        $c = count($a);
+        if ($c > 0) {
+            // Strategy:
+            // First, we'll create an "index" array.
+            // Then, we'll use sort() on that array,
+            // and use that to sort the main array.
+
+            // create "index" array
+            $index = array();
+            reset($a);
+            while (list($key, $val) = each($a)) {
+                if ($field == 'timestamp') {
+                    $data = $this->strToTime($val->date);
+                    if (!$data) {
+                        $data = $val->timestamp;
+                    }
+                } else {
+                    $data = $val->$field;
+                    if (is_string($data)) {
+                        $data = str_replace('"', '', $data);
+                        if ($field == 'subject') {
+                            $data = preg_replace('/^(Re: \s*|Fwd:\s*|Fw:\s*)+/i', '', $data);
+                        }
+                        $data = strtoupper($data);
+                    }
+                }
+                $index[$key] = $data;
+            }
+
+            // sort index
+            if ($flag == 'ASC') {
+                asort($index);
+            } else {
+                arsort($index);
+            }
+
+            // form new array based on index
+            $result = array();
+            reset($index);
+            while (list($key, $val) = each($index)) {
+                $result[$key] = $a[$key];
+            }
+        }
+
+        return $result;
+    }
+
+
+    function modFlag($mailbox, $messages, $flag, $mod)
+    {
+        if ($mod != '+' && $mod != '-') {
+            $mod = '+';
+        }
+
+        if (!$this->select($mailbox)) {
+            return false;
+        }
+
+        if (!$this->data['READ-WRITE']) {
+            $this->setError(self::ERROR_READONLY, "Mailbox is read-only", 'STORE');
+            return false;
+        }
+
+        // Clear internal status cache
+        if ($flag == 'SEEN') {
+            unset($this->data['STATUS:'.$mailbox]['UNSEEN']);
+        }
+
+        $flag   = $this->flags[strtoupper($flag)];
+        $result = $this->execute('UID STORE', array(
+            $this->compressMessageSet($messages), $mod . 'FLAGS.SILENT', "($flag)"),
+            self::COMMAND_NORESPONSE);
+
+        return ($result == self::ERROR_OK);
+    }
+
+    function flag($mailbox, $messages, $flag) {
+        return $this->modFlag($mailbox, $messages, $flag, '+');
+    }
+
+    function unflag($mailbox, $messages, $flag) {
+        return $this->modFlag($mailbox, $messages, $flag, '-');
+    }
+
+    function delete($mailbox, $messages) {
+        return $this->modFlag($mailbox, $messages, 'DELETED', '+');
+    }
+
+    function copy($messages, $from, $to)
+    {
+        if (!$this->select($from)) {
+            return false;
+        }
+
+        // Clear internal status cache
+        unset($this->data['STATUS:'.$to]);
+
+        $result = $this->execute('UID COPY', array(
+            $this->compressMessageSet($messages), $this->escape($to)),
+            self::COMMAND_NORESPONSE);
+
+        return ($result == self::ERROR_OK);
+    }
+
+    function move($messages, $from, $to)
+    {
+        if (!$this->select($from)) {
+            return false;
+        }
+
+        if (!$this->data['READ-WRITE']) {
+            $this->setError(self::ERROR_READONLY, "Mailbox is read-only", 'STORE');
+            return false;
+        }
+
+        $r = $this->copy($messages, $from, $to);
+
+        if ($r) {
+            // Clear internal status cache
+            unset($this->data['STATUS:'.$from]);
+
+            return $this->delete($from, $messages);
+        }
+        return $r;
+    }
+
+    // Don't be tempted to change $str to pass by reference to speed this up - it will slow it down by about
+    // 7 times instead :-) See comments on http://uk2.php.net/references and this article:
+    // http://derickrethans.nl/files/phparch-php-variables-article.pdf
+    private function parseThread($str, $begin, $end, $root, $parent, $depth, &$depthmap, &$haschildren)
+    {
+        $node = array();
+        if ($str[$begin] != '(') {
+            $stop = $begin + strspn($str, '1234567890', $begin, $end - $begin);
+            $msg = substr($str, $begin, $stop - $begin);
+            if ($msg == 0)
+                return $node;
+            if (is_null($root))
+                $root = $msg;
+            $depthmap[$msg] = $depth;
+            $haschildren[$msg] = false;
+            if (!is_null($parent))
+                $haschildren[$parent] = true;
+            if ($stop + 1 < $end)
+                $node[$msg] = $this->parseThread($str, $stop + 1, $end, $root, $msg, $depth + 1, $depthmap, $haschildren);
+            else
+                $node[$msg] = array();
+        } else {
+            $off = $begin;
+            while ($off < $end) {
+                $start = $off;
+                $off++;
+                $n = 1;
+                while ($n > 0) {
+                    $p = strpos($str, ')', $off);
+                    if ($p === false) {
+                        error_log("Mismatched brackets parsing IMAP THREAD response:");
+                        error_log(substr($str, ($begin < 10) ? 0 : ($begin - 10), $end - $begin + 20));
+                        error_log(str_repeat(' ', $off - (($begin < 10) ? 0 : ($begin - 10))));
+                        return $node;
+                    }
+                    $p1 = strpos($str, '(', $off);
+                    if ($p1 !== false && $p1 < $p) {
+                        $off = $p1 + 1;
+                        $n++;
+                    } else {
+                        $off = $p + 1;
+                        $n--;
+                    }
+                }
+                $node += $this->parseThread($str, $start + 1, $off - 1, $root, $parent, $depth, $depthmap, $haschildren);
+            }
+        }
+
+        return $node;
+    }
+
+    function thread($mailbox, $algorithm='REFERENCES', $criteria='', $encoding='US-ASCII')
+    {
+        $old_sel = $this->selected;
+
+        if (!$this->select($mailbox)) {
+            return false;
+        }
+
+        // return empty result when folder is empty and we're just after SELECT
+        if ($old_sel != $mailbox && !$this->data['EXISTS']) {
+            return array(array(), array(), array());
+        }
+
+        $encoding  = $encoding ? trim($encoding) : 'US-ASCII';
+        $algorithm = $algorithm ? trim($algorithm) : 'REFERENCES';
+        $criteria  = $criteria ? 'ALL '.trim($criteria) : 'ALL';
+        $data      = '';
+
+        list($code, $response) = $this->execute('THREAD', array(
+            $algorithm, $encoding, $criteria));
+
+        if ($code == self::ERROR_OK) {
+            // remove prefix...
+            $response = substr($response, stripos($response, '* THREAD') + 9);
+            // ...unilateral untagged server responses
+            if ($pos = strpos($response, '*')) {
+                $response = substr($response, 0, $pos);
+            }
+
+            $response    = str_replace("\r\n", '', $response);
+            $depthmap    = array();
+            $haschildren = array();
+
+            $tree = $this->parseThread($response, 0, strlen($response),
+                null, null, 0, $depthmap, $haschildren);
+
+            return array($tree, $depthmap, $haschildren);
+        }
+
+        return false;
+    }
+
+    /**
+     * Executes SEARCH command
+     *
+     * @param string $mailbox    Mailbox name
+     * @param string $criteria   Searching criteria
+     * @param bool   $return_uid Enable UID in result instead of sequence ID
+     * @param array  $items      Return items (MIN, MAX, COUNT, ALL)
+     *
+     * @return array Message identifiers or item-value hash 
+     */
+    function search($mailbox, $criteria, $return_uid=false, $items=array())
+    {
+        $old_sel = $this->selected;
+
+        if (!$this->select($mailbox)) {
+            return false;
+        }
+
+        // return empty result when folder is empty and we're just after SELECT
+        if ($old_sel != $mailbox && !$this->data['EXISTS']) {
+            if (!empty($items))
+                return array_combine($items, array_fill(0, count($items), 0));
+            else
+                return array();
+        }
+
+        $esearch  = empty($items) ? false : $this->getCapability('ESEARCH');
+        $criteria = trim($criteria);
+        $params   = '';
+
+        // RFC4731: ESEARCH
+        if (!empty($items) && $esearch) {
+            $params .= 'RETURN (' . implode(' ', $items) . ')';
+        }
+        if (!empty($criteria)) {
+            $params .= ($params ? ' ' : '') . $criteria;
+        }
+        else {
+            $params .= 'ALL';
+        }
+
+        list($code, $response) = $this->execute($return_uid ? 'UID SEARCH' : 'SEARCH',
+            array($params));
+
+        if ($code == self::ERROR_OK) {
+            // remove prefix...
+            $response = substr($response, stripos($response, 
+                $esearch ? '* ESEARCH' : '* SEARCH') + ($esearch ? 10 : 9));
+            // ...and unilateral untagged server responses
+            if ($pos = strpos($response, '*')) {
+                $response = rtrim(substr($response, 0, $pos));
+            }
+
+            if ($esearch) {
+                // Skip prefix: ... (TAG "A285") UID ...
+                $this->tokenizeResponse($response, $return_uid ? 2 : 1);
+
+                $result = array();
+                for ($i=0; $i<count($items); $i++) {
+                    // If the SEARCH results in no matches, the server MUST NOT
+                    // include the item result option in the ESEARCH response
+                    if ($ret = $this->tokenizeResponse($response, 2)) {
+                        list ($name, $value) = $ret;
+                        $result[$name] = $value;
+                    }
+                }
+
+                return $result;
+            }
+            else {
+                $response = preg_split('/[\s\r\n]+/', $response, -1, PREG_SPLIT_NO_EMPTY);
+
+                if (!empty($items)) {
+                    $result = array();
+                    if (in_array('COUNT', $items)) {
+                        $result['COUNT'] = count($response);
+                    }
+                    if (in_array('MIN', $items)) {
+                        $result['MIN'] = !empty($response) ? min($response) : 0;
+                    }
+                    if (in_array('MAX', $items)) {
+                        $result['MAX'] = !empty($response) ? max($response) : 0;
+                    }
+                    if (in_array('ALL', $items)) {
+                        $result['ALL'] = $this->compressMessageSet($response, true);
+                    }
+
+                    return $result;
+                }
+                else {
+                    return $response;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Returns list of mailboxes
+     *
+     * @param string $ref         Reference name
+     * @param string $mailbox     Mailbox name
+     * @param array  $status_opts (see self::_listMailboxes)
+     * @param array  $select_opts (see self::_listMailboxes)
+     *
+     * @return array List of mailboxes or hash of options if $status_opts argument
+     *               is non-empty.
+     * @access public
+     */
+    function listMailboxes($ref, $mailbox, $status_opts=array(), $select_opts=array())
+    {
+        return $this->_listMailboxes($ref, $mailbox, false, $status_opts, $select_opts);
+    }
+
+    /**
+     * Returns list of subscribed mailboxes
+     *
+     * @param string $ref         Reference name
+     * @param string $mailbox     Mailbox name
+     * @param array  $status_opts (see self::_listMailboxes)
+     *
+     * @return array List of mailboxes or hash of options if $status_opts argument
+     *               is non-empty.
+     * @access public
+     */
+    function listSubscribed($ref, $mailbox, $status_opts=array())
+    {
+        return $this->_listMailboxes($ref, $mailbox, true, $status_opts, NULL);
+    }
+
+    /**
+     * IMAP LIST/LSUB command
+     *
+     * @param string $ref         Reference name
+     * @param string $mailbox     Mailbox name
+     * @param bool   $subscribed  Enables returning subscribed mailboxes only
+     * @param array  $status_opts List of STATUS options (RFC5819: LIST-STATUS)
+     *                            Possible: MESSAGES, RECENT, UIDNEXT, UIDVALIDITY, UNSEEN
+     * @param array  $select_opts List of selection options (RFC5258: LIST-EXTENDED)
+     *                            Possible: SUBSCRIBED, RECURSIVEMATCH, REMOTE
+     *
+     * @return array List of mailboxes or hash of options if $status_ops argument
+     *               is non-empty.
+     * @access private
+     */
+    private function _listMailboxes($ref, $mailbox, $subscribed=false,
+        $status_opts=array(), $select_opts=array())
+    {
+        if (!strlen($mailbox)) {
+            $mailbox = '*';
+        }
+
+        $args = array();
+
+        if (!empty($select_opts) && $this->getCapability('LIST-EXTENDED')) {
+            $select_opts = (array) $select_opts;
+
+            $args[] = '(' . implode(' ', $select_opts) . ')';
+        }
+
+        $args[] = $this->escape($ref);
+        $args[] = $this->escape($mailbox);
+
+        if (!empty($status_opts) && $this->getCapability('LIST-STATUS')) {
+            $status_opts = (array) $status_opts;
+            $lstatus = true;
+
+            $args[] = 'RETURN (STATUS (' . implode(' ', $status_opts) . '))';
+        }
+
+        list($code, $response) = $this->execute($subscribed ? 'LSUB' : 'LIST', $args);
+
+        if ($code == self::ERROR_OK) {
+            $folders = array();
+            while ($this->tokenizeResponse($response, 1) == '*') {
+                $cmd = strtoupper($this->tokenizeResponse($response, 1));
+                // * LIST (<options>) <delimiter> <mailbox>
+                if (!$lstatus || $cmd == 'LIST' || $cmd == 'LSUB') {
+                    list($opts, $delim, $mailbox) = $this->tokenizeResponse($response, 3);
+
+                    // Add to result array
+                    if (!$lstatus) {
+                        $folders[] = $mailbox;
+                    }
+                    else {
+                        $folders[$mailbox] = array();
+                    }
+
+                    // Add to options array
+                    if (!empty($opts)) {
+                        if (empty($this->data['LIST'][$mailbox]))
+                            $this->data['LIST'][$mailbox] = $opts;
+                        else
+                            $this->data['LIST'][$mailbox] = array_unique(array_merge(
+                                $this->data['LIST'][$mailbox], $opts));
+                    }
+                }
+                // * STATUS <mailbox> (<result>)
+                else if ($cmd == 'STATUS') {
+                    list($mailbox, $status) = $this->tokenizeResponse($response, 2);
+
+                    for ($i=0, $len=count($status); $i<$len; $i += 2) {
+                        list($name, $value) = $this->tokenizeResponse($status, 2);
+                        $folders[$mailbox][$name] = $value;
+                    }
+                }
+            }
+
+            return $folders;
+        }
+
+        return false;
+    }
+
+    function fetchMIMEHeaders($mailbox, $id, $parts, $mime=true)
+    {
+        if (!$this->select($mailbox)) {
+            return false;
+        }
+
+        $result = false;
+        $parts  = (array) $parts;
+        $key    = $this->nextTag();
+        $peeks  = '';
+        $idx    = 0;
+        $type   = $mime ? 'MIME' : 'HEADER';
+
+        // format request
+        foreach($parts as $part) {
+            $peeks[] = "BODY.PEEK[$part.$type]";
+        }
+
+        $request = "$key FETCH $id (" . implode(' ', $peeks) . ')';
+
+        // send request
+        if (!$this->putLine($request)) {
+            $this->setError(self::ERROR_COMMAND, "Unable to send command: $request");
+            return false;
+        }
+
+        do {
+            $line = $this->readLine(1024);
+            $line = $this->multLine($line);
+
+            if (preg_match('/BODY\[([0-9\.]+)\.'.$type.'\]/', $line, $matches)) {
+                $idx = $matches[1];
+                $result[$idx] = preg_replace('/^(\* '.$id.' FETCH \()?\s*BODY\['.$idx.'\.'.$type.'\]\s+/', '', $line);
+                $result[$idx] = trim($result[$idx], '"');
+                $result[$idx] = rtrim($result[$idx], "\t\r\n\0\x0B");
+            }
+        } while (!$this->startsWith($line, $key, true));
+
+        return $result;
+    }
+
+    function fetchPartHeader($mailbox, $id, $is_uid=false, $part=NULL)
+    {
+        $part = empty($part) ? 'HEADER' : $part.'.MIME';
+
+        return $this->handlePartBody($mailbox, $id, $is_uid, $part);
+    }
+
+    function handlePartBody($mailbox, $id, $is_uid=false, $part='', $encoding=NULL, $print=NULL, $file=NULL)
+    {
+        if (!$this->select($mailbox)) {
+            return false;
+        }
+
+        switch ($encoding) {
+        case 'base64':
+            $mode = 1;
+            break;
+        case 'quoted-printable':
+            $mode = 2;
+            break;
+        case 'x-uuencode':
+        case 'x-uue':
+        case 'uue':
+        case 'uuencode':
+            $mode = 3;
+            break;
+        default:
+            $mode = 0;
+        }
+
+        // format request
+        $reply_key = '* ' . $id;
+        $key       = $this->nextTag();
+        $request   = $key . ($is_uid ? ' UID' : '') . " FETCH $id (BODY.PEEK[$part])";
+
+        // send request
+        if (!$this->putLine($request)) {
+            $this->setError(self::ERROR_COMMAND, "Unable to send command: $request");
+            return false;
+        }
+
+        // receive reply line
+        do {
+            $line = rtrim($this->readLine(1024));
+            $a    = explode(' ', $line);
+        } while (!($end = $this->startsWith($line, $key, true)) && $a[2] != 'FETCH');
+
+        $len    = strlen($line);
+        $result = false;
+
+        // handle empty "* X FETCH ()" response
+        if ($line[$len-1] == ')' && $line[$len-2] != '(') {
+            // one line response, get everything between first and last quotes
+            if (substr($line, -4, 3) == 'NIL') {
+                // NIL response
+                $result = '';
+            } else {
+                $from = strpos($line, '"') + 1;
+                $to   = strrpos($line, '"');
+                $len  = $to - $from;
+                $result = substr($line, $from, $len);
+            }
+
+            if ($mode == 1) {
+                $result = base64_decode($result);
+            }
+            else if ($mode == 2) {
+                $result = quoted_printable_decode($result);
+            }
+            else if ($mode == 3) {
+                $result = convert_uudecode($result);
+            }
+
+        } else if ($line[$len-1] == '}') {
+            // multi-line request, find sizes of content and receive that many bytes
+            $from     = strpos($line, '{') + 1;
+            $to       = strrpos($line, '}');
+            $len      = $to - $from;
+            $sizeStr  = substr($line, $from, $len);
+            $bytes    = (int)$sizeStr;
+            $prev     = '';
+
+            while ($bytes > 0) {
+                $line = $this->readLine(4096);
+
+                if ($line === NULL) {
+                    break;
+                }
+
+                $len  = strlen($line);
+
+                if ($len > $bytes) {
+                    $line = substr($line, 0, $bytes);
+                    $len = strlen($line);
+                }
+                $bytes -= $len;
+
+                // BASE64
+                if ($mode == 1) {
+                    $line = rtrim($line, "\t\r\n\0\x0B");
+                    // create chunks with proper length for base64 decoding
+                    $line = $prev.$line;
+                    $length = strlen($line);
+                    if ($length % 4) {
+                        $length = floor($length / 4) * 4;
+                        $prev = substr($line, $length);
+                        $line = substr($line, 0, $length);
+                    }
+                    else
+                        $prev = '';
+                    $line = base64_decode($line);
+                // QUOTED-PRINTABLE
+                } else if ($mode == 2) {
+                    $line = rtrim($line, "\t\r\0\x0B");
+                    $line = quoted_printable_decode($line);
+                    // Remove NULL characters (#1486189)
+                    $line = str_replace("\x00", '', $line);
+                // UUENCODE
+                } else if ($mode == 3) {
+                    $line = rtrim($line, "\t\r\n\0\x0B");
+                    if ($line == 'end' || preg_match('/^begin\s+[0-7]+\s+.+$/', $line))
+                        continue;
+                    $line = convert_uudecode($line);
+                // default
+                } else {
+                    $line = rtrim($line, "\t\r\n\0\x0B") . "\n";
+                }
+
+                if ($file)
+                    fwrite($file, $line);
+                else if ($print)
+                    echo $line;
+                else
+                    $result .= $line;
+            }
+        }
+
+        // read in anything up until last line
+        if (!$end)
+            do {
+                $line = $this->readLine(1024);
+            } while (!$this->startsWith($line, $key, true));
+
+        if ($result !== false) {
+            if ($file) {
+                fwrite($file, $result);
+            } else if ($print) {
+                echo $result;
+            } else
+                return $result;
+            return true;
+        }
+
+        return false;
+    }
+
+    function createFolder($mailbox)
+    {
+        $result = $this->execute('CREATE', array($this->escape($mailbox)),
+            self::COMMAND_NORESPONSE);
+
+        return ($result == self::ERROR_OK);
+    }
+
+    function renameFolder($from, $to)
+    {
+        $result = $this->execute('RENAME', array($this->escape($from), $this->escape($to)),
+            self::COMMAND_NORESPONSE);
+
+        return ($result == self::ERROR_OK);
+    }
+
+    function append($mailbox, &$message)
+    {
+        if (!$mailbox) {
+            return false;
+        }
+
+        $message = str_replace("\r", '', $message);
+        $message = str_replace("\n", "\r\n", $message);
+
+        $len = strlen($message);
+        if (!$len) {
+            return false;
+        }
+
+        $key = $this->nextTag();
+        $request = sprintf("$key APPEND %s (\\Seen) {%d%s}", $this->escape($mailbox),
+            $len, ($this->prefs['literal+'] ? '+' : ''));
+
+        if ($this->putLine($request)) {
+            // Don't wait when LITERAL+ is supported
+            if (!$this->prefs['literal+']) {
+                $line = $this->readReply();
+
+                if ($line[0] != '+') {
+                    $this->parseResult($line, 'APPEND: ');
+                    return false;
+                }
+            }
+
+            if (!$this->putLine($message)) {
+                return false;
+            }
+
+            do {
+                $line = $this->readLine();
+            } while (!$this->startsWith($line, $key, true, true));
+
+            // Clear internal status cache
+            unset($this->data['STATUS:'.$mailbox]);
+
+            return ($this->parseResult($line, 'APPEND: ') == self::ERROR_OK);
+        }
+        else {
+            $this->setError(self::ERROR_COMMAND, "Unable to send command: $request");
+        }
+
+        return false;
+    }
+
+    function appendFromFile($mailbox, $path, $headers=null)
+    {
+        if (!$mailbox) {
+            return false;
+        }
+
+        // open message file
+        $in_fp = false;
+        if (file_exists(realpath($path))) {
+            $in_fp = fopen($path, 'r');
+        }
+        if (!$in_fp) {
+            $this->setError(self::ERROR_UNKNOWN, "Couldn't open $path for reading");
+            return false;
+        }
+
+        $body_separator = "\r\n\r\n";
+        $len = filesize($path);
+
+        if (!$len) {
+            return false;
+        }
+
+        if ($headers) {
+            $headers = preg_replace('/[\r\n]+$/', '', $headers);
+            $len += strlen($headers) + strlen($body_separator);
+        }
+
+        // send APPEND command
+        $key = $this->nextTag();
+        $request = sprintf("$key APPEND %s (\\Seen) {%d%s}", $this->escape($mailbox),
+            $len, ($this->prefs['literal+'] ? '+' : ''));
+
+        if ($this->putLine($request)) {
+            // Don't wait when LITERAL+ is supported
+            if (!$this->prefs['literal+']) {
+                $line = $this->readReply();
+
+                if ($line[0] != '+') {
+                    $this->parseResult($line, 'APPEND: ');
+                    return false;
+                }
+            }
+
+            // send headers with body separator
+            if ($headers) {
+                $this->putLine($headers . $body_separator, false);
+            }
+
+            // send file
+            while (!feof($in_fp) && $this->fp) {
+                $buffer = fgets($in_fp, 4096);
+                $this->putLine($buffer, false);
+            }
+            fclose($in_fp);
+
+            if (!$this->putLine('')) { // \r\n
+                return false;
+            }
+
+            // read response
+            do {
+                $line = $this->readLine();
+            } while (!$this->startsWith($line, $key, true, true));
+
+            // Clear internal status cache
+            unset($this->data['STATUS:'.$mailbox]);
+
+            return ($this->parseResult($line, 'APPEND: ') == self::ERROR_OK);
+        }
+        else {
+            $this->setError(self::ERROR_COMMAND, "Unable to send command: $request");
+        }
+
+        return false;
+    }
+
+    function fetchStructureString($mailbox, $id, $is_uid=false)
+    {
+        if (!$this->select($mailbox)) {
+            return false;
+        }
+
+        $key = $this->nextTag();
+        $result = false;
+        $command = $key . ($is_uid ? ' UID' : '') ." FETCH $id (BODYSTRUCTURE)";
+
+        if ($this->putLine($command)) {
+            do {
+                $line = $this->readLine(5000);
+                $line = $this->multLine($line, true);
+                if (!preg_match("/^$key /", $line))
+                    $result .= $line;
+            } while (!$this->startsWith($line, $key, true, true));
+
+            $result = trim(substr($result, strpos($result, 'BODYSTRUCTURE')+13, -1));
+        }
+        else {
+            $this->setError(self::ERROR_COMMAND, "Unable to send command: $command");
+        }
+
+        return $result;
+    }
+
+    function getQuota()
+    {
+        /*
+         * GETQUOTAROOT "INBOX"
+         * QUOTAROOT INBOX user/rchijiiwa1
+         * QUOTA user/rchijiiwa1 (STORAGE 654 9765)
+         * OK Completed
+         */
+        $result      = false;
+        $quota_lines = array();
+        $key         = $this->nextTag();
+        $command     = $key . ' GETQUOTAROOT INBOX';
+
+        // get line(s) containing quota info
+        if ($this->putLine($command)) {
+            do {
+                $line = rtrim($this->readLine(5000));
+                if (preg_match('/^\* QUOTA /', $line)) {
+                    $quota_lines[] = $line;
+                }
+            } while (!$this->startsWith($line, $key, true, true));
+        }
+        else {
+            $this->setError(self::ERROR_COMMAND, "Unable to send command: $command");
+        }
+
+        // return false if not found, parse if found
+        $min_free = PHP_INT_MAX;
+        foreach ($quota_lines as $key => $quota_line) {
+            $quota_line   = str_replace(array('(', ')'), '', $quota_line);
+            $parts        = explode(' ', $quota_line);
+            $storage_part = array_search('STORAGE', $parts);
+
+            if (!$storage_part) {
+                continue;
+            }
+
+            $used  = intval($parts[$storage_part+1]);
+            $total = intval($parts[$storage_part+2]);
+            $free  = $total - $used;
+
+            // return lowest available space from all quotas
+            if ($free < $min_free) {
+                $min_free          = $free;
+                $result['used']    = $used;
+                $result['total']   = $total;
+                $result['percent'] = min(100, round(($used/max(1,$total))*100));
+                $result['free']    = 100 - $result['percent'];
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Send the SETACL command (RFC4314)
+     *
+     * @param string $mailbox Mailbox name
+     * @param string $user    User name
+     * @param mixed  $acl     ACL string or array
+     *
+     * @return boolean True on success, False on failure
+     *
+     * @access public
+     * @since 0.5-beta
+     */
+    function setACL($mailbox, $user, $acl)
+    {
+        if (is_array($acl)) {
+            $acl = implode('', $acl);
+        }
+
+        $result = $this->execute('SETACL', array(
+            $this->escape($mailbox), $this->escape($user), strtolower($acl)),
+            self::COMMAND_NORESPONSE);
+
+        return ($result == self::ERROR_OK);
+    }
+
+    /**
+     * Send the DELETEACL command (RFC4314)
+     *
+     * @param string $mailbox Mailbox name
+     * @param string $user    User name
+     *
+     * @return boolean True on success, False on failure
+     *
+     * @access public
+     * @since 0.5-beta
+     */
+    function deleteACL($mailbox, $user)
+    {
+        $result = $this->execute('DELETEACL', array(
+            $this->escape($mailbox), $this->escape($user)),
+            self::COMMAND_NORESPONSE);
+
+        return ($result == self::ERROR_OK);
+    }
+
+    /**
+     * Send the GETACL command (RFC4314)
+     *
+     * @param string $mailbox Mailbox name
+     *
+     * @return array User-rights array on success, NULL on error
+     * @access public
+     * @since 0.5-beta
+     */
+    function getACL($mailbox)
+    {
+        list($code, $response) = $this->execute('GETACL', array($this->escape($mailbox)));
+
+        if ($code == self::ERROR_OK && preg_match('/^\* ACL /i', $response)) {
+            // Parse server response (remove "* ACL ")
+            $response = substr($response, 6);
+            $ret  = $this->tokenizeResponse($response);
+            $mbox = array_shift($ret);
+            $size = count($ret);
+
+            // Create user-rights hash array
+            // @TODO: consider implementing fixACL() method according to RFC4314.2.1.1
+            // so we could return only standard rights defined in RFC4314,
+            // excluding 'c' and 'd' defined in RFC2086.
+            if ($size % 2 == 0) {
+                for ($i=0; $i<$size; $i++) {
+                    $ret[$ret[$i]] = str_split($ret[++$i]);
+                    unset($ret[$i-1]);
+                    unset($ret[$i]);
+                }
+                return $ret;
+            }
+
+            $this->setError(self::ERROR_COMMAND, "Incomplete ACL response");
+            return NULL;
+        }
+
+        return NULL;
+    }
+
+    /**
+     * Send the LISTRIGHTS command (RFC4314)
+     *
+     * @param string $mailbox Mailbox name
+     * @param string $user    User name
+     *
+     * @return array List of user rights
+     * @access public
+     * @since 0.5-beta
+     */
+    function listRights($mailbox, $user)
+    {
+        list($code, $response) = $this->execute('LISTRIGHTS', array(
+            $this->escape($mailbox), $this->escape($user)));
+
+        if ($code == self::ERROR_OK && preg_match('/^\* LISTRIGHTS /i', $response)) {
+            // Parse server response (remove "* LISTRIGHTS ")
+            $response = substr($response, 13);
+
+            $ret_mbox = $this->tokenizeResponse($response, 1);
+            $ret_user = $this->tokenizeResponse($response, 1);
+            $granted  = $this->tokenizeResponse($response, 1);
+            $optional = trim($response);
+
+            return array(
+                'granted'  => str_split($granted),
+                'optional' => explode(' ', $optional),
+            );
+        }
+
+        return NULL;
+    }
+
+    /**
+     * Send the MYRIGHTS command (RFC4314)
+     *
+     * @param string $mailbox Mailbox name
+     *
+     * @return array MYRIGHTS response on success, NULL on error
+     * @access public
+     * @since 0.5-beta
+     */
+    function myRights($mailbox)
+    {
+        list($code, $response) = $this->execute('MYRIGHTS', array($this->escape($mailbox)));
+
+        if ($code == self::ERROR_OK && preg_match('/^\* MYRIGHTS /i', $response)) {
+            // Parse server response (remove "* MYRIGHTS ")
+            $response = substr($response, 11);
+
+            $ret_mbox = $this->tokenizeResponse($response, 1);
+            $rights   = $this->tokenizeResponse($response, 1);
+
+            return str_split($rights);
+        }
+
+        return NULL;
+    }
+
+    /**
+     * Send the SETMETADATA command (RFC5464)
+     *
+     * @param string $mailbox Mailbox name
+     * @param array  $entries Entry-value array (use NULL value as NIL)
+     *
+     * @return boolean True on success, False on failure
+     * @access public
+     * @since 0.5-beta
+     */
+    function setMetadata($mailbox, $entries)
+    {
+        if (!is_array($entries) || empty($entries)) {
+            $this->setError(self::ERROR_COMMAND, "Wrong argument for SETMETADATA command");
+            return false;
+        }
+
+        foreach ($entries as $name => $value) {
+            if ($value === null) {
+                $value = 'NIL';
+            }
+            else {
+                $value = sprintf("{%d}\r\n%s", strlen($value), $value);
+            }
+            $entries[$name] = $this->escape($name) . ' ' . $value;
+        }
+
+        $entries = implode(' ', $entries);
+        $result = $this->execute('SETMETADATA', array(
+            $this->escape($mailbox), '(' . $entries . ')'),
+            self::COMMAND_NORESPONSE);
+
+        return ($result == self::ERROR_OK);
+    }
+
+    /**
+     * Send the SETMETADATA command with NIL values (RFC5464)
+     *
+     * @param string $mailbox Mailbox name
+     * @param array  $entries Entry names array
+     *
+     * @return boolean True on success, False on failure
+     *
+     * @access public
+     * @since 0.5-beta
+     */
+    function deleteMetadata($mailbox, $entries)
+    {
+        if (!is_array($entries) && !empty($entries)) {
+            $entries = explode(' ', $entries);
+        }
+
+        if (empty($entries)) {
+            $this->setError(self::ERROR_COMMAND, "Wrong argument for SETMETADATA command");
+            return false;
+        }
+
+        foreach ($entries as $entry) {
+            $data[$entry] = NULL;
+        }
+
+        return $this->setMetadata($mailbox, $data);
+    }
+
+    /**
+     * Send the GETMETADATA command (RFC5464)
+     *
+     * @param string $mailbox Mailbox name
+     * @param array  $entries Entries
+     * @param array  $options Command options (with MAXSIZE and DEPTH keys)
+     *
+     * @return array GETMETADATA result on success, NULL on error
+     *
+     * @access public
+     * @since 0.5-beta
+     */
+    function getMetadata($mailbox, $entries, $options=array())
+    {
+        if (!is_array($entries)) {
+            $entries = array($entries);
+        }
+
+        // create entries string
+        foreach ($entries as $idx => $name) {
+            $entries[$idx] = $this->escape($name);
+        }
+
+        $optlist = '';
+        $entlist = '(' . implode(' ', $entries) . ')';
+
+        // create options string
+        if (is_array($options)) {
+            $options = array_change_key_case($options, CASE_UPPER);
+            $opts = array();
+
+            if (!empty($options['MAXSIZE'])) {
+                $opts[] = 'MAXSIZE '.intval($options['MAXSIZE']);
+            }
+            if (!empty($options['DEPTH'])) {
+                $opts[] = 'DEPTH '.intval($options['DEPTH']);
+            }
+
+            if ($opts) {
+                $optlist = '(' . implode(' ', $opts) . ')';
+            }
+        }
+
+        $optlist .= ($optlist ? ' ' : '') . $entlist;
+
+        list($code, $response) = $this->execute('GETMETADATA', array(
+            $this->escape($mailbox), $optlist));
+
+        if ($code == self::ERROR_OK) {
+            $result = array();
+            $data   = $this->tokenizeResponse($response);
+
+            // The METADATA response can contain multiple entries in a single
+            // response or multiple responses for each entry or group of entries
+            if (!empty($data) && ($size = count($data))) {
+                for ($i=0; $i<$size; $i++) {
+                    if (isset($mbox) && is_array($data[$i])) {
+                        $size_sub = count($data[$i]);
+                        for ($x=0; $x<$size_sub; $x++) {
+                            $result[$mbox][$data[$i][$x]] = $data[$i][++$x];
+                        }
+                        unset($data[$i]);
+                    }
+                    else if ($data[$i] == '*') {
+                        if ($data[$i+1] == 'METADATA') {
+                            $mbox = $data[$i+2];
+                            unset($data[$i]);   // "*"
+                            unset($data[++$i]); // "METADATA"
+                            unset($data[++$i]); // Mailbox
+                        }
+                        // get rid of other untagged responses
+                        else {
+                            unset($mbox);
+                            unset($data[$i]);
+                        }
+                    }
+                    else if (isset($mbox)) {
+                        $result[$mbox][$data[$i]] = $data[++$i];
+                        unset($data[$i]);
+                        unset($data[$i-1]);
+                    }
+                    else {
+                        unset($data[$i]);
+                    }
+                }
+            }
+
+            return $result;
+        }
+
+        return NULL;
+    }
+
+    /**
+     * Send the SETANNOTATION command (draft-daboo-imap-annotatemore)
+     *
+     * @param string $mailbox Mailbox name
+     * @param array  $data    Data array where each item is an array with
+     *                        three elements: entry name, attribute name, value
+     *
+     * @return boolean True on success, False on failure
+     * @access public
+     * @since 0.5-beta
+     */
+    function setAnnotation($mailbox, $data)
+    {
+        if (!is_array($data) || empty($data)) {
+            $this->setError(self::ERROR_COMMAND, "Wrong argument for SETANNOTATION command");
+            return false;
+        }
+
+        foreach ($data as $entry) {
+            $name  = $entry[0];
+            $attr  = $entry[1];
+            $value = $entry[2];
+
+            if ($value === null) {
+                $value = 'NIL';
+            }
+            else {
+                $value = sprintf("{%d}\r\n%s", strlen($value), $value);
+            }
+
+            // ANNOTATEMORE drafts before version 08 require quoted parameters
+            $entries[] = sprintf('%s (%s %s)',
+                $this->escape($name, true), $this->escape($attr, true), $value);
+        }
+
+        $entries = implode(' ', $entries);
+        $result  = $this->execute('SETANNOTATION', array(
+            $this->escape($mailbox), $entries), self::COMMAND_NORESPONSE);
+
+        return ($result == self::ERROR_OK);
+    }
+
+    /**
+     * Send the SETANNOTATION command with NIL values (draft-daboo-imap-annotatemore)
+     *
+     * @param string $mailbox Mailbox name
+     * @param array  $data    Data array where each item is an array with
+     *                        two elements: entry name and attribute name
+     *
+     * @return boolean True on success, False on failure
+     *
+     * @access public
+     * @since 0.5-beta
+     */
+    function deleteAnnotation($mailbox, $data)
+    {
+        if (!is_array($data) || empty($data)) {
+            $this->setError(self::ERROR_COMMAND, "Wrong argument for SETANNOTATION command");
+            return false;
+        }
+
+        return $this->setAnnotation($mailbox, $data);
+    }
+
+    /**
+     * Send the GETANNOTATION command (draft-daboo-imap-annotatemore)
+     *
+     * @param string $mailbox Mailbox name
+     * @param array  $entries Entries names
+     * @param array  $attribs Attribs names
+     *
+     * @return array Annotations result on success, NULL on error
+     *
+     * @access public
+     * @since 0.5-beta
+     */
+    function getAnnotation($mailbox, $entries, $attribs)
+    {
+        if (!is_array($entries)) {
+            $entries = array($entries);
+        }
+        // create entries string
+        // ANNOTATEMORE drafts before version 08 require quoted parameters
+        foreach ($entries as $idx => $name) {
+            $entries[$idx] = $this->escape($name, true);
+        }
+        $entries = '(' . implode(' ', $entries) . ')';
+
+        if (!is_array($attribs)) {
+            $attribs = array($attribs);
+        }
+        // create entries string
+        foreach ($attribs as $idx => $name) {
+            $attribs[$idx] = $this->escape($name, true);
+        }
+        $attribs = '(' . implode(' ', $attribs) . ')';
+
+        list($code, $response) = $this->execute('GETANNOTATION', array(
+            $this->escape($mailbox), $entries, $attribs));
+
+        if ($code == self::ERROR_OK) {
+            $result = array();
+            $data   = $this->tokenizeResponse($response);
+
+            // Here we returns only data compatible with METADATA result format
+            if (!empty($data) && ($size = count($data))) {
+                for ($i=0; $i<$size; $i++) {
+                    $entry = $data[$i];
+                    if (isset($mbox) && is_array($entry)) {
+                        $attribs = $entry;
+                        $entry   = $last_entry;
+                    }
+                    else if ($entry == '*') {
+                        if ($data[$i+1] == 'ANNOTATION') {
+                            $mbox = $data[$i+2];
+                            unset($data[$i]);   // "*"
+                            unset($data[++$i]); // "ANNOTATION"
+                            unset($data[++$i]); // Mailbox
+                        }
+                        // get rid of other untagged responses
+                        else {
+                            unset($mbox);
+                            unset($data[$i]);
+                        }
+                        continue;
+                    }
+                    else if (isset($mbox)) {
+                        $attribs = $data[++$i];
+                    }
+                    else {
+                        unset($data[$i]);
+                        continue;
+                    }
+
+                    if (!empty($attribs)) {
+                        for ($x=0, $len=count($attribs); $x<$len;) {
+                            $attr  = $attribs[$x++];
+                            $value = $attribs[$x++];
+                            if ($attr == 'value.priv') {
+                                $result[$mbox]['/private' . $entry] = $value;
+                            }
+                            else if ($attr == 'value.shared') {
+                                $result[$mbox]['/shared' . $entry] = $value;
+                            }
+                        }
+                    }
+                    $last_entry = $entry;
+                    unset($data[$i]);
+                }
+            }
+
+            return $result;
+        }
+
+        return NULL;
+    }
+
+    /**
+     * Creates next command identifier (tag)
+     *
+     * @return string Command identifier
+     * @access public
+     * @since 0.5-beta
+     */
+    function nextTag()
+    {
+        $this->cmd_num++;
+        $this->cmd_tag = sprintf('A%04d', $this->cmd_num);
+
+        return $this->cmd_tag;
+    }
+
+    /**
+     * Sends IMAP command and parses result
+     *
+     * @param string $command   IMAP command
+     * @param array  $arguments Command arguments
+     * @param int    $options   Execution options
+     *
+     * @return mixed Response code or list of response code and data
+     * @access public
+     * @since 0.5-beta
+     */
+    function execute($command, $arguments=array(), $options=0)
+    {
+        $tag      = $this->nextTag();
+        $query    = $tag . ' ' . $command;
+        $noresp   = ($options & self::COMMAND_NORESPONSE);
+        $response = $noresp ? null : '';
+
+        if (!empty($arguments)) {
+            $query .= ' ' . implode(' ', $arguments);
+        }
+
+        // Send command
+        if (!$this->putLineC($query)) {
+            $this->setError(self::ERROR_COMMAND, "Unable to send command: $query");
+            return $noresp ? self::ERROR_COMMAND : array(self::ERROR_COMMAND, '');
+        }
+
+        // Parse response
+        do {
+            $line = $this->readLine(4096);
+            if ($response !== null) {
+                $response .= $line;
+            }
+        } while (!$this->startsWith($line, $tag . ' ', true, true));
+
+        $code = $this->parseResult($line, $command . ': ');
+
+        // Remove last line from response
+        if ($response) {
+            $line_len = min(strlen($response), strlen($line) + 2);
+            $response = substr($response, 0, -$line_len);
+        }
+
+        // optional CAPABILITY response
+        if (($options & self::COMMAND_CAPABILITY) && $code == self::ERROR_OK
+            && preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)
+        ) {
+            $this->parseCapability($matches[1], true);
+        }
+
+        // return last line only (without command tag, result and response code)
+        if ($line && ($options & self::COMMAND_LASTLINE)) {
+            $response = preg_replace("/^$tag (OK|NO|BAD|BYE|PREAUTH)?\s*(\[[a-z-]+\])?\s*/i", '', trim($line));
+        }
+
+        return $noresp ? $code : array($code, $response);
+    }
+
+    /**
+     * Splits IMAP response into string tokens
+     *
+     * @param string &$str The IMAP's server response
+     * @param int    $num  Number of tokens to return
+     *
+     * @return mixed Tokens array or string if $num=1
+     * @access public
+     * @since 0.5-beta
+     */
+    static function tokenizeResponse(&$str, $num=0)
+    {
+        $result = array();
+
+        while (!$num || count($result) < $num) {
+            // remove spaces from the beginning of the string
+            $str = ltrim($str);
+
+            switch ($str[0]) {
+
+            // String literal
+            case '{':
+                if (($epos = strpos($str, "}\r\n", 1)) == false) {
+                    // error
+                }
+                if (!is_numeric(($bytes = substr($str, 1, $epos - 1)))) {
+                    // error
+                }
+                $result[] = substr($str, $epos + 3, $bytes);
+                // Advance the string
+                $str = substr($str, $epos + 3 + $bytes);
+                break;
+
+            // Quoted string
+            case '"':
+                $len = strlen($str);
+
+                for ($pos=1; $pos<$len; $pos++) {
+                    if ($str[$pos] == '"') {
+                        break;
+                    }
+                    if ($str[$pos] == "\\") {
+                        if ($str[$pos + 1] == '"' || $str[$pos + 1] == "\\") {
+                            $pos++;
+                        }
+                    }
+                }
+                if ($str[$pos] != '"') {
+                    // error
+                }
+                // we need to strip slashes for a quoted string
+                $result[] = stripslashes(substr($str, 1, $pos - 1));
+                $str      = substr($str, $pos + 1);
+                break;
+
+            // Parenthesized list
+            case '(':
+                $str = substr($str, 1);
+                $result[] = self::tokenizeResponse($str);
+                break;
+            case ')':
+                $str = substr($str, 1);
+                return $result;
+                break;
+
+            // String atom, number, NIL, *, %
+            default:
+                // empty or one character
+                if ($str === '') {
+                    break 2;
+                }
+                if (strlen($str) < 2) {
+                    $result[] = $str;
+                    $str = '';
+                    break;
+                }
+
+                // excluded chars: SP, CTL, (, ), {, ", ], %
+                if (preg_match('/^([\x21\x23\x24\x26\x27\x2A-\x5C\x5E-\x7A\x7C-\x7E]+)/', $str, $m)) {
+                    $result[] = $m[1] == 'NIL' ? NULL : $m[1];
+                    $str = substr($str, strlen($m[1]));
+                }
+                break;
+            }
+        }
+
+        return $num == 1 ? $result[0] : $result;
+    }
+
+    private function _xor($string, $string2)
+    {
+        $result = '';
+        $size   = strlen($string);
+
+        for ($i=0; $i<$size; $i++) {
+            $result .= chr(ord($string[$i]) ^ ord($string2[$i]));
+        }
+
+        return $result;
+    }
+
+    /**
+     * Converts datetime string into unix timestamp
+     *
+     * @param string $date Date string
+     *
+     * @return int Unix timestamp
+     */
+    private function strToTime($date)
+    {
+        // support non-standard "GMTXXXX" literal
+        $date = preg_replace('/GMT\s*([+-][0-9]+)/', '\\1', $date);
+        // if date parsing fails, we have a date in non-rfc format.
+        // remove token from the end and try again
+        while ((($ts = @strtotime($date))===false) || ($ts < 0)) {
+            $d = explode(' ', $date);
+            array_pop($d);
+            if (!$d) {
+                break;
+            }
+            $date = implode(' ', $d);
+        }
+
+        $ts = (int) $ts;
+
+        return $ts < 0 ? 0 : $ts;
+    }
+
+    private function splitHeaderLine($string)
+    {
+        $pos = strpos($string, ':');
+        if ($pos>0) {
+            $res[0] = substr($string, 0, $pos);
+            $res[1] = trim(substr($string, $pos+1));
+            return $res;
+        }
+        return $string;
+    }
+
+    private function parseCapability($str, $trusted=false)
+    {
+        $str = preg_replace('/^\* CAPABILITY /i', '', $str);
+
+        $this->capability = explode(' ', strtoupper($str));
+
+        if (!isset($this->prefs['literal+']) && in_array('LITERAL+', $this->capability)) {
+            $this->prefs['literal+'] = true;
+        }
+
+        if ($trusted) {
+            $this->capability_readed = true;
+        }
+    }
+
+    /**
+     * Escapes a string when it contains special characters (RFC3501)
+     *
+     * @param string  $string       IMAP string
+     * @param boolean $force_quotes Forces string quoting
+     *
+     * @return string Escaped string
+     * @todo String literals, lists
+     */
+    static function escape($string, $force_quotes=false)
+    {
+        if ($string === null) {
+            return 'NIL';
+        }
+        else if ($string === '') {
+            return '""';
+        }
+        else if ($force_quotes ||
+            preg_match('/([\x00-\x20\x28-\x29\x7B\x25\x2A\x22\x5C\x5D\x7F]+)/', $string)
+        ) {
+            // string: special chars: SP, CTL, (, ), {, %, *, ", \, ]
+            return '"' . strtr($string, array('"'=>'\\"', '\\' => '\\\\')) . '"';
+        }
+
+        // atom
+        return $string;
+    }
+
+    static function unEscape($string)
+    {
+        return strtr($string, array('\\"'=>'"', '\\\\' => '\\'));
+    }
+
+    /**
+     * Set the value of the debugging flag.
+     *
+     * @param   boolean $debug      New value for the debugging flag.
+     *
+     * @access  public
+     * @since   0.5-stable
+     */
+    function setDebug($debug, $handler = null)
+    {
+        $this->_debug = $debug;
+        $this->_debug_handler = $handler;
+    }
+
+    /**
+     * Write the given debug text to the current debug output handler.
+     *
+     * @param   string  $message    Debug mesage text.
+     *
+     * @access  private
+     * @since   0.5-stable
+     */
+    private function debug($message)
+    {
+        if ($this->_debug_handler) {
+            call_user_func_array($this->_debug_handler, array(&$this, $message));
+        } else {
+            echo "DEBUG: $message\n";
+        }
+    }
+
+}
index ea23dc20ba3866bcce133a72dfc18f4fc5aa30a2..c19a68bcdf85629424b9058e9f1a483db1a220ef 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_json_output.php                                 |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2008-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2008-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -16,7 +16,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id:  $
+ $Id: rcube_json_output.php 4139 2010-10-26 13:20:34Z alec $
 
 */
 
  */
 class rcube_json_output
 {
+    /**
+     * Stores configuration object.
+     *
+     * @var rcube_config
+     */
     private $config;
     private $charset = RCMAIL_CHARSET;
-    private $env = array();
     private $texts = array();
     private $commands = array();
     private $callbacks = array();
     private $message = null;
 
+    public $browser;
+    public $env = array();
     public $type = 'js';
     public $ajax_call = true;
-    
-    
+
+
     /**
      * Constructor
      */
-    public function __construct($task)
+    public function __construct($task=null)
     {
-        $this->config = rcmail::get_instance()->config;
+        $this->config  = rcmail::get_instance()->config;
+        $this->browser = new rcube_browser();
     }
-    
-    
+
+
     /**
      * Set environment variable
      *
-     * @param string Property name
-     * @param mixed Property value
+     * @param string $name Property name
+     * @param mixed $value Property value
      */
     public function set_env($name, $value)
     {
         $this->env[$name] = $value;
     }
-    
+
+
     /**
      * Issue command to set page title
      *
-     * @param string New page title
+     * @param string $title New page title
      */
     public function set_pagetitle($title)
     {
@@ -71,6 +79,7 @@ class rcube_json_output
         $this->command('set_pagetitle', empty($name) ? $title : $name.' :: '.$title);
     }
 
+
     /**
      * @ignore
      */
@@ -94,8 +103,8 @@ class rcube_json_output
     /**
      * Register a template object handler
      *
-     * @param  string Object name
-     * @param  string Function name to call
+     * @param  string $obj Object name
+     * @param  string $func Function name to call
      * @return void
      */
     public function add_handler($obj, $func)
@@ -103,18 +112,19 @@ class rcube_json_output
         // ignore
     }
 
+
     /**
      * Register a list of template object handlers
      *
-     * @param  array Hash array with object=>handler pairs
+     * @param  array $arr Hash array with object=>handler pairs
      * @return void
      */
     public function add_handlers($arr)
     {
         // ignore
     }
-    
-    
+
+
     /**
      * Call a client method
      *
@@ -124,14 +134,14 @@ class rcube_json_output
     public function command()
     {
         $cmd = func_get_args();
-        
+
         if (strpos($cmd[0], 'plugin.') === 0)
           $this->callbacks[] = $cmd;
         else
           $this->commands[] = $cmd;
     }
-    
-    
+
+
     /**
      * Add a localized label to the client environment
      */
@@ -140,20 +150,20 @@ class rcube_json_output
         $args = func_get_args();
         if (count($args) == 1 && is_array($args[0]))
             $args = $args[0];
-        
+
         foreach ($args as $name) {
             $this->texts[$name] = rcube_label($name);
         }
     }
-    
+
 
     /**
      * Invoke display_message command
      *
-     * @param string Message to display
-     * @param string Message type [notice|confirm|error]
-     * @param array Key-value pairs to be replaced in localized text
-     * @param boolean Override last set message
+     * @param string  $message  Message to display
+     * @param string  $type     Message type [notice|confirm|error]
+     * @param array   $vars     Key-value pairs to be replaced in localized text
+     * @param boolean $override Override last set message
      * @uses self::command()
      */
     public function show_message($message, $type='notice', $vars=null, $override=true)
@@ -167,7 +177,8 @@ class rcube_json_output
             );
         }
     }
-    
+
+
     /**
      * Delete all stored env variables and commands
      */
@@ -177,11 +188,13 @@ class rcube_json_output
         $this->texts = array();
         $this->commands = array();
     }
-    
+
+
     /**
      * Redirect to a certain url
      *
-     * @param mixed Either a string with the action or url parameters as key-value pairs
+     * @param mixed $p Either a string with the action or url parameters as key-value pairs
+     * @param int $delay Delay in seconds
      * @see rcmail::url()
      */
     public function redirect($p = array(), $delay = 1)
@@ -190,8 +203,8 @@ class rcube_json_output
         $this->remote_response("window.setTimeout(\"location.href='{$location}'\", $delay);");
         exit;
     }
-    
-    
+
+
     /**
      * Send an AJAX response to the client.
      */
@@ -200,12 +213,12 @@ class rcube_json_output
         $this->remote_response();
         exit;
     }
-    
-    
+
+
     /**
      * Send an AJAX response with executable JS code
      *
-     * @param  string  Additional JS code
+     * @param  string  $add Additional JS code
      * @param  boolean True if output buffer should be flushed
      * @return void
      * @deprecated
@@ -218,31 +231,34 @@ class rcube_json_output
             $s_header_sent = true;
             send_nocacheing_headers();
             header('Content-Type: text/plain; charset=' . $this->get_charset());
-            print '/** ajax response ['.date('d/M/Y h:i:s O')."] **/\n";
         }
 
         // unset default env vars
         unset($this->env['task'], $this->env['action'], $this->env['comm_path']);
 
         $rcmail = rcmail::get_instance();
-        $response = array('action' => $rcmail->action, 'unlock' => (bool)$_REQUEST['_unlock']);
-        
+        $response['action'] = $rcmail->action;
+
+        if ($unlock = get_input_value('_unlock', RCUBE_INPUT_GPC)) {
+            $response['unlock'] = $unlock;
+        }
+
         if (!empty($this->env))
-          $response['env'] = $this->env;
-          
+            $response['env'] = $this->env;
+
         if (!empty($this->texts))
-          $response['texts'] = $this->texts;
+            $response['texts'] = $this->texts;
 
         // send function calls
         $response['exec'] = $this->get_js_commands() . $add;
-        
+
         if (!empty($this->callbacks))
-          $response['callbacks'] = $this->callbacks;
+            $response['callbacks'] = $this->callbacks;
 
         echo json_serialize($response);
     }
-    
-    
+
+
     /**
      * Return executable javascript code for all registered commands
      *
@@ -251,7 +267,7 @@ class rcube_json_output
     private function get_js_commands()
     {
         $out = '';
-        
+
         foreach ($this->commands as $i => $args) {
             $method = array_shift($args);
             foreach ($args as $i => $arg) {
@@ -268,5 +284,3 @@ class rcube_json_output
         return $out;
     }
 }
-
-
index a8e35a33ee3479dd59f42d22a27f24515cc96b47..dcc6a190fd69e1d937f8336b0e2aba01baaed11e 100644 (file)
@@ -3,8 +3,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_ldap.php                                        |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2006-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2006-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -14,7 +14,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_ldap.php 2976 2009-09-21 11:50:53Z alec $
+ $Id: rcube_ldap.php 4021 2010-09-30 07:28:51Z alec $
 
 */
 
@@ -29,22 +29,22 @@ class rcube_ldap extends rcube_addressbook
   var $conn;
   var $prop = array();
   var $fieldmap = array();
-  
+
   var $filter = '';
   var $result = null;
   var $ldap_result = null;
   var $sort_col = '';
   var $mail_domain = '';
   var $debug = false;
-  
+
   /** public properties */
   var $primary_key = 'ID';
   var $readonly = true;
   var $list_page = 1;
   var $page_size = 10;
   var $ready = false;
-  
-  
+
+
   /**
    * Object constructor
    *
@@ -84,11 +84,13 @@ class rcube_ldap extends rcube_addressbook
     global $RCMAIL;
     
     if (!function_exists('ldap_connect'))
-      raise_error(array('code' => 100, 'type' => 'ldap', 'message' => "No ldap support in this installation of PHP"), true);
+      raise_error(array('code' => 100, 'type' => 'ldap',
+        'file' => __FILE__, 'line' => __LINE__,
+        'message' => "No ldap support in this installation of PHP"), true);
 
     if (is_resource($this->conn))
       return true;
-    
+
     if (!is_array($this->prop['hosts']))
       $this->prop['hosts'] = array($this->prop['hosts']);
 
@@ -97,6 +99,7 @@ class rcube_ldap extends rcube_addressbook
 
     foreach ($this->prop['hosts'] as $host)
     {
+      $host = idn_to_ascii(rcube_parse_host($host));
       $this->_debug("C: Connect [$host".($this->prop['port'] ? ':'.$this->prop['port'] : '')."]");
 
       if ($lc = @ldap_connect($host, $this->prop['port']))
@@ -129,18 +132,42 @@ class rcube_ldap extends rcube_addressbook
         // Get the pieces needed for variable replacement.
         $fu = $RCMAIL->user->get_username();
         list($u, $d) = explode('@', $fu);
-        
+        $dc = 'dc='.strtr($d, array('.' => ',dc=')); // hierarchal domain string
+
+        $replaces = array('%dc' => $dc, '%d' => $d, '%fu' => $fu, '%u' => $u);
+
+        if ($this->prop['search_base_dn'] && $this->prop['search_filter']) {
+          // Search for the dn to use to authenticate
+          $this->prop['search_base_dn'] = strtr($this->prop['search_base_dn'], $replaces);
+          $this->prop['search_filter'] = strtr($this->prop['search_filter'], $replaces);
+
+          $this->_debug("S: searching with base {$this->prop['search_base_dn']} for {$this->prop['search_filter']}");
+
+          $res = ldap_search($this->conn, $this->prop['search_base_dn'], $this->prop['search_filter'], array('uid'));
+          if ($res && ($entry = ldap_first_entry($this->conn, $res))) {
+            $bind_dn = ldap_get_dn($this->conn, $entry);
+
+            $this->_debug("S: search returned dn: $bind_dn");
+
+            if ($bind_dn) {
+              $this->prop['bind_dn'] = $bind_dn;
+              $dn = ldap_explode_dn($bind_dn, 1);
+              $replaces['%dn'] = $dn[0];
+            }
+          }
+        }
         // Replace the bind_dn and base_dn variables.
-        $replaces = array('%fu' => $fu, '%u' => $u, '%d' => $d);
         $this->prop['bind_dn'] = strtr($this->prop['bind_dn'], $replaces);
         $this->prop['base_dn'] = strtr($this->prop['base_dn'], $replaces);
       }
-      
+
       if (!empty($this->prop['bind_dn']) && !empty($this->prop['bind_pass']))
         $this->ready = $this->bind($this->prop['bind_dn'], $this->prop['bind_pass']);
     }
     else
-      raise_error(array('code' => 100, 'type' => 'ldap', 'message' => "Could not connect to any LDAP server, tried $host:{$this->prop[port]} last"), true);
+      raise_error(array('code' => 100, 'type' => 'ldap',
+        'file' => __FILE__, 'line' => __LINE__,
+        'message' => "Could not connect to any LDAP server, last tried $host:{$this->prop[port]}"), true);
 
     // See if the directory is writeable.
     if ($this->prop['writable']) {
@@ -173,8 +200,8 @@ class rcube_ldap extends rcube_addressbook
     $this->_debug("S: ".ldap_error($this->conn));
 
     raise_error(array(
-        'code' => ldap_errno($this->conn),
-        'type' => 'ldap',
+        'code' => ldap_errno($this->conn), 'type' => 'ldap',
+       'file' => __FILE__, 'line' => __LINE__,
         'message' => "Bind failed for dn=$dn: ".ldap_error($this->conn)),
         true);
 
@@ -300,10 +327,13 @@ class rcube_ldap extends rcube_addressbook
    *
    * @param array   List of fields to search in
    * @param string  Search value
+   * @param boolean True for strict, False for partial (fuzzy) matching
    * @param boolean True if results are requested, False if count only
+   * @param boolean (Not used)
+   * @param array   List of fields that cannot be empty
    * @return array  Indexed list of contact records and 'count' value
    */
-  function search($fields, $value, $strict=false, $select=true)
+  function search($fields, $value, $strict=false, $select=true, $nocount=false, $required=array())
   {
     // special treatment for ID-based search
     if ($fields == 'ID' || $fields == $this->primary_key)
@@ -334,10 +364,19 @@ class rcube_ldap extends rcube_addressbook
           $filter .= "($f=$wc" . rcube_ldap::quote_string($value) . "$wc)";
     }
     $filter .= ')';
-    
+
+    // add required (non empty) fields filter
+    $req_filter = '';
+    foreach ((array)$required as $field)
+      if ($f = $this->_map_field($field))
+        $req_filter .= "($f=*)";
+
+    if (!empty($req_filter))
+      $filter = '(&' . $req_filter . $filter . ')';
+
     // avoid double-wildcard if $value is empty
     $filter = preg_replace('/\*+/', '*', $filter);
-    
+
     // add general filter to query
     if (!empty($this->prop['filter']))
       $filter = '(&(' . preg_replace('/^\(|\)$/', '', $this->prop['filter']) . ')' . $filter . ')';
@@ -405,9 +444,11 @@ class rcube_ldap extends rcube_addressbook
     $res = null;
     if ($this->conn && $dn)
     {
-      $this->_debug("C: Read [dn: ".base64_decode($dn)."] [(objectclass=*)]");
+      $dn = base64_decode($dn);
+
+      $this->_debug("C: Read [dn: $dn] [(objectclass=*)]");
     
-      if ($this->ldap_result = @ldap_read($this->conn, base64_decode($dn), '(objectclass=*)', array_values($this->fieldmap)))
+      if ($this->ldap_result = @ldap_read($this->conn, $dn, '(objectclass=*)', array_values($this->fieldmap)))
         $entry = ldap_first_entry($this->conn, $this->ldap_result);
       else
         $this->_debug("S: ".ldap_error($this->conn));
@@ -419,7 +460,7 @@ class rcube_ldap extends rcube_addressbook
         $rec = array_change_key_case($rec, CASE_LOWER);
 
         // Add in the dn for the entry.
-        $rec['dn'] = base64_decode($dn);
+        $rec['dn'] = $dn;
         $res = $this->_ldap2result($rec);
         $this->result = new rcube_result_set(1);
         $this->result->add($res);
@@ -459,7 +500,8 @@ class rcube_ldap extends rcube_addressbook
     } // end foreach
 
     // Build the new entries DN.
-    $dn = $this->prop['LDAP_rdn'].'='.$newentry[$this->prop['LDAP_rdn']].','.$this->prop['base_dn'];
+    $dn = $this->prop['LDAP_rdn'].'='.rcube_ldap::quote_string($newentry[$this->prop['LDAP_rdn']], true)
+      .','.$this->prop['base_dn'];
 
     $this->_debug("C: Add [dn: $dn]: ".print_r($newentry, true));
 
@@ -532,9 +574,12 @@ class rcube_ldap extends rcube_addressbook
     if (!empty($replacedata)) {
       // Handle RDN change
       if ($replacedata[$this->prop['LDAP_rdn']]) {
-        $newdn = $this->prop['LDAP_rdn'].'='.$replacedata[$this->prop['LDAP_rdn']].','.$this->prop['base_dn']; 
+        $newdn = $this->prop['LDAP_rdn'].'='
+         .rcube_ldap::quote_string($replacedata[$this->prop['LDAP_rdn']], true)
+         .','.$this->prop['base_dn']; 
         if ($dn != $newdn) {
-          $newrdn = $this->prop['LDAP_rdn'].'='.$replacedata[$this->prop['LDAP_rdn']];
+          $newrdn = $this->prop['LDAP_rdn'].'='
+           .rcube_ldap::quote_string($replacedata[$this->prop['LDAP_rdn']], true);
           unset($replacedata[$this->prop['LDAP_rdn']]);
         }
       }
@@ -616,7 +661,9 @@ class rcube_ldap extends rcube_addressbook
 
       $this->_debug("C: Search [".$filter."]");
 
-      if ($this->ldap_result = @$function($this->conn, $this->prop['base_dn'], $filter, array_values($this->fieldmap), 0, 0)) {
+      if ($this->ldap_result = @$function($this->conn, $this->prop['base_dn'], $filter,
+          array_values($this->fieldmap), 0, (int) $this->prop['sizelimit'], (int) $this->prop['timelimit'])
+      ) {
         $this->_debug("S: ".ldap_count_entries($this->conn, $this->ldap_result)." record(s)");
         return true;
       } else
@@ -642,7 +689,7 @@ class rcube_ldap extends rcube_addressbook
     foreach ($this->fieldmap as $rf => $lf)
     {
       if ($rec[$lf]['count']) {
-        if ($rf == 'email' && $mail_domain && !strpos($rec[$lf][0], '@'))
+        if ($rf == 'email' && $this->mail_domain && !strpos($rec[$lf][0], '@'))
           $out[$rf] = sprintf('%s@%s', $rec[$lf][0], $this->mail_domain);
         else
           $out[$rf] = $rec[$lf][0];
@@ -670,7 +717,7 @@ class rcube_ldap extends rcube_addressbook
     // list of known attribute aliases
     $aliases = array(
       'gn' => 'givenname',
-      'rfc822mailbox' => 'mail',
+      'rfc822mailbox' => 'email',
       'userid' => 'uid',
       'emailaddress' => 'email',
       'pkcs9email' => 'email',
@@ -692,11 +739,17 @@ class rcube_ldap extends rcube_addressbook
   /**
    * @static
    */
-  function quote_string($str)
+  function quote_string($str, $dn=false)
   {
-    return strtr($str, array('*'=>'\2a', '('=>'\28', ')'=>'\29', '\\'=>'\5c'));
+    if ($dn)
+      $replace = array(','=>'\2c', '='=>'\3d', '+'=>'\2b', '<'=>'\3c',
+        '>'=>'\3e', ';'=>'\3b', '\\'=>'\5c', '"'=>'\22', '#'=>'\23');
+    else
+      $replace = array('*'=>'\2a', '('=>'\28', ')'=>'\29', '\\'=>'\5c',
+        '/'=>'\2f');
+
+    return strtr($str, $replace);
   }
 
 }
 
-?>
diff --git a/program/include/rcube_mail_mime.php b/program/include/rcube_mail_mime.php
deleted file mode 100644 (file)
index ab93d3a..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/include/rcube_mail_mime.php                                   |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2007-2009, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Extend PEAR:Mail_mime class and override encodeHeaders method       |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: sendmail.inc 506 2007-03-14 00:39:51Z thomasb $
-
-*/
-
-
-/**
- * Replacement PEAR:Mail_mime with some additional or overloaded methods
- *
- * @package Mail
- */
-class rcube_mail_mime extends Mail_mime
-{
-
-  protected $mime_content;
-
-  /**
-   * Set build parameters
-   */
-  function setParam($param)
-  {
-    if (is_array($param)) {
-      $this->_build_params = array_merge($this->_build_params, $param);
-    }
-  }
-  
-  /**
-   * Adds an image to the list of embedded images.
-   *
-   * @param  string  $file       The image file name OR image data itself
-   * @param  string  $c_type     The content type
-   * @param  string  $name       The filename of the image.
-   *                             Only use if $file is the image data
-   * @param  bool    $isfilename Whether $file is a filename or not
-   *                             Defaults to true
-   * @param  string  $contentid  Desired Content-ID of MIME part
-   *                             Defaults to generated unique ID
-   * @return mixed   true on success or PEAR_Error object
-   * @access public
-   */
-  function addHTMLImage($file, $c_type='application/octet-stream', $name = '', $isfilename = true, $contentid = '')
-  {
-    $filedata = ($isfilename === true) ? $this->_file2str($file) : $file;
-    if ($isfilename === true) {
-      $filename = ($name == '' ? $file : $name);
-    }
-    else {
-      $filename = $name;
-    }
-
-    if (PEAR::isError($filedata)) {
-        return $filedata;
-    }
-
-    if ($contentid == '') {
-       $contentid = md5(uniqid(time()));
-    }
-
-    $this->_html_images[] = array(
-      'body'   => $filedata,
-      'name'   => $filename,
-      'c_type' => $c_type,
-      'cid'    => $contentid
-    );
-
-    return true;
-  }
-  
-  
-  /**
-  * returns the HTML body portion of the message
-  * @return string HTML body of the message
-  * @access public
-  */
-  function getHTMLBody()
-  {
-     return $this->_htmlbody;
-  }
-  
-  
-  /**
-   * Creates a new mimePart object, using multipart/mixed as
-   * the initial content-type and returns it during the
-   * build process.
-   *
-   * @return object  The multipart/mixed mimePart object
-   * @access private
-   */
-  function &_addMixedPart()
-  {
-    $params['content_type'] = $this->_headers['Content-Type'] ? $this->_headers['Content-Type'] : 'multipart/mixed';
-    $ret = new Mail_mimePart('', $params);
-    return $ret;
-  }
-  
-  
-  /**
-   * Encodes a header as per RFC2047
-   *
-   * @param  array $input The header data to encode
-   * @param  array $params Extra build parameters
-   * @return array Encoded data
-   * @access private
-   * @override
-   */
-  function _encodeHeaders($input, $params = array())
-  {
-    $maxlen = 73;
-    $params += $this->_build_params;
-    
-    foreach ($input as $hdr_name => $hdr_value)
-    {
-      // if header contains e-mail addresses
-      if (preg_match('/\s<.+@[a-z0-9\-\.]+\.[a-z]+>/U', $hdr_value)) {
-        $chunks = rcube_explode_quoted_string(',', $hdr_value);
-      }
-      else {
-        $chunks = array($hdr_value);
-      }
-
-      $hdr_value = '';
-      $line_len = 0;
-
-      foreach ($chunks as $i => $value) {
-        $value = trim($value);
-
-        //This header contains non ASCII chars and should be encoded.
-        if (preg_match('/[\x80-\xFF]{1}/', $value)) {
-          $suffix = '';
-          // Don't encode e-mail address
-          if (preg_match('/(.+)\s(<.+@[a-z0-9\-\.]+>)$/Ui', $value, $matches)) {
-            $value = $matches[1];
-            $suffix = ' '.$matches[2];
-          }
-
-          switch ($params['head_encoding']) {
-            case 'base64':
-            // Base64 encoding has been selected.
-            $mode = 'B';
-            $encoded = base64_encode($value);
-            break;
-
-            case 'quoted-printable':
-            default:
-            // quoted-printable encoding has been selected
-            $mode = 'Q';
-            // replace ?, =, _ and spaces
-            $encoded = str_replace(array('=','_','?',' '), array('=3D','=5F','=3F','_'), $value);
-            $encoded = preg_replace('/([\x80-\xFF])/e', "'='.sprintf('%02X', ord('\\1'))", $encoded);
-          }
-
-          $value = '=?' . $params['head_charset'] . '?' . $mode . '?' . $encoded . '?=' . $suffix;
-        }
-
-        // add chunk to output string by regarding the header maxlen
-        $len = strlen($value);
-        if ($i == 0 || $line_len + $len < $maxlen) {
-          $hdr_value .= ($i>0?', ':'') . $value;
-          $line_len += $len + ($i>0?2:0);
-        }
-        else {
-          $hdr_value .= ($i>0?', ':'') . "\n " . $value;
-          $line_len = $len;
-        }
-      }
-
-      $input[$hdr_name] = wordwrap($hdr_value, 990, "\n", true);  // hard limit header length
-    }
-
-    return $input;
-  }
-
-
-  /**
-   * Provides caching of body of constructed MIME Message to avoid 
-   * duplicate construction of message and damage of MIME headers
-   *
-   * @return string The mime content
-   * @access public
-   * @override
-   */
-  public function &get($build_params = null)
-  {
-    if(empty($this->mime_content))
-      $this->mime_content = parent::get($build_params);
-    return $this->mime_content;
-  }
-
-}
-
index f8ed4bb0bd3c15c62b3095015e75c428d2529dd4..ab9e64826ef890302b79976f4d7d5d0e29c1d78d 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_mdb2.php                                        |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -16,7 +16,7 @@
  | Author: Lukas Kahwe Smith <smith@pooteeweet.org>                      |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_mdb2.php 2920 2009-09-04 13:07:48Z alec $
+ $Id: rcube_mdb2.php 4057 2010-10-07 07:03:25Z alec $
 
 */
 
  * @author     David Saez Padros <david@ols.es>
  * @author     Thomas Bruederli <roundcube@gmail.com>
  * @author     Lukas Kahwe Smith <smith@pooteeweet.org>
- * @version    1.16
+ * @version    1.17
  * @link       http://pear.php.net/package/MDB2
  */
 class rcube_mdb2
-  {
-  var $db_dsnw;               // DSN for write operations
-  var $db_dsnr;               // DSN for read operations
-  var $db_connected = false;  // Already connected ?
-  var $db_mode = '';          // Connection mode
-  var $db_handle = 0;         // Connection handle
-  var $db_error = false;
-  var $db_error_msg = '';
-  var $debug_mode = false;
-
-  var $a_query_results = array('dummy');
-  var $last_res_id = 0;
-
-
-  /**
-   * Object constructor
-   *
-   * @param  string  DSN for read/write operations
-   * @param  string  Optional DSN for read only operations
-   */
-  function __construct($db_dsnw, $db_dsnr='', $pconn=false)
+{
+    var $db_dsnw;               // DSN for write operations
+    var $db_dsnr;               // DSN for read operations
+    var $db_connected = false;  // Already connected ?
+    var $db_mode = '';          // Connection mode
+    var $db_handle = 0;         // Connection handle
+    var $db_error = false;
+    var $db_error_msg = '';
+
+    private $debug_mode = false;
+    private $a_query_results = array('dummy');
+    private $last_res_id = 0;
+    private $tables;
+
+
+    /**
+     * Object constructor
+     *
+     * @param  string $db_dsnw DSN for read/write operations
+     * @param  string $db_dsnr Optional DSN for read only operations
+     */
+    function __construct($db_dsnw, $db_dsnr='', $pconn=false)
     {
-    if ($db_dsnr=='')
-      $db_dsnr=$db_dsnw;
-
-    $this->db_dsnw = $db_dsnw;
-    $this->db_dsnr = $db_dsnr;
-    $this->db_pconn = $pconn;
-    
-    $dsn_array = MDB2::parseDSN($db_dsnw);
-    $this->db_provider = $dsn_array['phptype'];
-    }
-
-
-  /**
-   * Connect to specific database
-   *
-   * @param  string  DSN for DB connections
-   * @return object  PEAR database handle
-   * @access private
-   */
-  function dsn_connect($dsn)
+        if ($db_dsnr == '')
+            $db_dsnr = $db_dsnw;
+
+        $this->db_dsnw = $db_dsnw;
+        $this->db_dsnr = $db_dsnr;
+        $this->db_pconn = $pconn;
+
+        $dsn_array = MDB2::parseDSN($db_dsnw);
+        $this->db_provider = $dsn_array['phptype'];
+    }
+
+
+    /**
+     * Connect to specific database
+     *
+     * @param  string $dsn  DSN for DB connections
+     * @return MDB2 PEAR database handle
+     * @access private
+     */
+    private function dsn_connect($dsn)
     {
-    // Use persistent connections if available
-    $db_options = array(
-        'persistent' => $this->db_pconn,
-        'emulate_prepared' => $this->debug_mode,
-        'debug' => $this->debug_mode,
-        'debug_handler' => 'mdb2_debug_handler',
-        'portability' => MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_NULL);
-
-    if ($this->db_provider == 'pgsql') {
-      $db_options['disable_smart_seqname'] = true;
-      $db_options['seqname_format'] = '%s';
-    }
-
-    $dbh = MDB2::connect($dsn, $db_options);
-
-    if (MDB2::isError($dbh))
-      {
-      $this->db_error = TRUE;
-      $this->db_error_msg = $dbh->getMessage();
-      
-      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__,
-        'file' => __FILE__, 'message' => $dbh->getUserInfo()), TRUE, FALSE);
-      }
-    else if ($this->db_provider=='sqlite')
-      {
-      $dsn_array = MDB2::parseDSN($dsn);
-      if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials))
-        $this->_sqlite_create_database($dbh, $this->sqlite_initials);
-      }
-    else if ($this->db_provider!='mssql')
-      $dbh->setCharset('utf8');
-
-    return $dbh;
-    }
-
-
-  /**
-   * Connect to appropiate databse
-   * depending on the operation
-   *
-   * @param  string  Connection mode (r|w)
-   * @access public
-   */
-  function db_connect($mode)
+        // Use persistent connections if available
+        $db_options = array(
+            'persistent'       => $this->db_pconn,
+            'emulate_prepared' => $this->debug_mode,
+            'debug'            => $this->debug_mode,
+            'debug_handler'    => 'mdb2_debug_handler',
+            'portability'      => MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_NULL);
+
+        if ($this->db_provider == 'pgsql') {
+            $db_options['disable_smart_seqname'] = true;
+            $db_options['seqname_format'] = '%s';
+        }
+
+        $dbh = MDB2::connect($dsn, $db_options);
+
+        if (MDB2::isError($dbh)) {
+            $this->db_error = true;
+            $this->db_error_msg = $dbh->getMessage();
+
+            raise_error(array('code' => 500, 'type' => 'db',
+                'line' => __LINE__, 'file' => __FILE__,
+                'message' => $dbh->getUserInfo()), true, false);
+        }
+        else if ($this->db_provider == 'sqlite') {
+            $dsn_array = MDB2::parseDSN($dsn);
+            if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials))
+                $this->_sqlite_create_database($dbh, $this->sqlite_initials);
+        }
+        else if ($this->db_provider!='mssql' && $this->db_provider!='sqlsrv')
+            $dbh->setCharset('utf8');
+
+        return $dbh;
+    }
+
+
+    /**
+     * Connect to appropiate database depending on the operation
+     *
+     * @param  string $mode Connection mode (r|w)
+     * @access public
+     */
+    function db_connect($mode)
     {
-    $this->db_mode = $mode;
-
-    // Already connected
-    if ($this->db_connected)
-      {
-      // no replication, current connection is ok
-      if ($this->db_dsnw==$this->db_dsnr)
-        return;
-
-      // connected to master, current connection is ok
-      if ($this->db_mode=='w')
-        return;
-
-      // Same mode, current connection is ok
-      if ($this->db_mode==$mode)
-        return;
-      }
-
-    if ($mode=='r')
-      $dsn = $this->db_dsnr;
-    else
-      $dsn = $this->db_dsnw;
-
-    $this->db_handle = $this->dsn_connect($dsn);
-    $this->db_connected = true;
-    }
-
-
-  /**
-   * Activate/deactivate debug mode
-   *
-   * @param boolean True if SQL queries should be logged
-   */
-  function set_debug($dbg = true)
-  {
-    $this->debug_mode = $dbg;
-    if ($this->db_connected)
+        // Already connected
+        if ($this->db_connected) {
+            // connected to read-write db, current connection is ok
+            if ($this->db_mode == 'w')
+                return;
+
+            // no replication, current connection is ok for read and write
+            if (empty($this->db_dsnr) || $this->db_dsnw == $this->db_dsnr) {
+                $this->db_mode = 'w';
+                return;
+            }
+
+            // Same mode, current connection is ok
+            if ($this->db_mode == $mode)
+                return;
+        }
+
+        $dsn = ($mode == 'r') ? $this->db_dsnr : $this->db_dsnw;
+
+        $this->db_handle = $this->dsn_connect($dsn);
+        $this->db_connected = !PEAR::isError($this->db_handle);
+        $this->db_mode = $mode;
+    }
+
+
+    /**
+     * Activate/deactivate debug mode
+     *
+     * @param boolean $dbg True if SQL queries should be logged
+     * @access public
+     */
+    function set_debug($dbg = true)
     {
-      $this->db_handle->setOption('debug', $dbg);
-      $this->db_handle->setOption('emulate_prepared', $dbg);
-    }
-  }
-
-    
-  /**
-   * Getter for error state
-   *
-   * @param  boolean  True on error
-   */
-  function is_error()
+        $this->debug_mode = $dbg;
+        if ($this->db_connected) {
+            $this->db_handle->setOption('debug', $dbg);
+            $this->db_handle->setOption('emulate_prepared', $dbg);
+        }
+    }
+
+
+    /**
+     * Getter for error state
+     *
+     * @param  boolean  True on error
+     * @access public
+     */
+    function is_error()
     {
-    return $this->db_error ? $this->db_error_msg : FALSE;
+        return $this->db_error ? $this->db_error_msg : false;
     }
-    
 
-  /**
-   * Connection state checker
-   *
-   * @param  boolean  True if in connected state
-   */
-  function is_connected()
+
+    /**
+     * Connection state checker
+     *
+     * @param  boolean  True if in connected state
+     * @access public
+     */
+    function is_connected()
     {
-    return PEAR::isError($this->db_handle) ? false : true;
+        return PEAR::isError($this->db_handle) ? false : $this->db_connected;
     }
 
 
-  /**
-   * Execute a SQL query
-   *
-   * @param  string  SQL query to execute
-   * @param  mixed   Values to be inserted in query
-   * @return number  Query handle identifier
-   * @access public
-   */
-  function query()
+    /**
+     * Execute a SQL query
+     *
+     * @param  string  SQL query to execute
+     * @param  mixed   Values to be inserted in query
+     * @return number  Query handle identifier
+     * @access public
+     */
+    function query()
     {
-    if (!$this->is_connected())
-      return NULL;
-    
-    $params = func_get_args();
-    $query = array_shift($params);
-
-    return $this->_query($query, 0, 0, $params);
-    }
-
-
-  /**
-   * Execute a SQL query with limits
-   *
-   * @param  string  SQL query to execute
-   * @param  number  Offset for LIMIT statement
-   * @param  number  Number of rows for LIMIT statement
-   * @param  mixed   Values to be inserted in query
-   * @return number  Query handle identifier
-   * @access public
-   */
-  function limitquery()
+        $params = func_get_args();
+        $query = array_shift($params);
+
+        // Support one argument of type array, instead of n arguments
+        if (count($params) == 1 && is_array($params[0]))
+            $params = $params[0];
+
+        return $this->_query($query, 0, 0, $params);
+    }
+
+
+    /**
+     * Execute a SQL query with limits
+     *
+     * @param  string  SQL query to execute
+     * @param  number  Offset for LIMIT statement
+     * @param  number  Number of rows for LIMIT statement
+     * @param  mixed   Values to be inserted in query
+     * @return number  Query handle identifier
+     * @access public
+     */
+    function limitquery()
     {
-    $params = func_get_args();
-    $query = array_shift($params);
-    $offset = array_shift($params);
-    $numrows = array_shift($params);
-
-    return $this->_query($query, $offset, $numrows, $params);
-    }
-
-
-  /**
-   * Execute a SQL query with limits
-   *
-   * @param  string  SQL query to execute
-   * @param  number  Offset for LIMIT statement
-   * @param  number  Number of rows for LIMIT statement
-   * @param  array   Values to be inserted in query
-   * @return number  Query handle identifier
-   * @access private
-   */
-  function _query($query, $offset, $numrows, $params)
+        $params  = func_get_args();
+        $query   = array_shift($params);
+        $offset  = array_shift($params);
+        $numrows = array_shift($params);
+
+        return $this->_query($query, $offset, $numrows, $params);
+    }
+
+
+    /**
+     * Execute a SQL query with limits
+     *
+     * @param  string $query   SQL query to execute
+     * @param  number $offset  Offset for LIMIT statement
+     * @param  number $numrows Number of rows for LIMIT statement
+     * @param  array  $params  Values to be inserted in query
+     * @return number  Query handle identifier
+     * @access private
+     */
+    private function _query($query, $offset, $numrows, $params)
     {
-    // Read or write ?
-    if (strtolower(substr(trim($query),0,6))=='select')
-      $mode='r';
-    else
-      $mode='w';
-
-    $this->db_connect($mode);
-
-    if ($this->db_provider == 'sqlite')
-      $this->_sqlite_prepare();
-
-    if ($numrows || $offset)
-      $result = $this->db_handle->setLimit($numrows,$offset);
-
-    if (empty($params))
-      $result = $mode=='r' ? $this->db_handle->query($query) : $this->db_handle->exec($query);
-    else
-      {
-      $params = (array)$params;
-      $q = $this->db_handle->prepare($query, null, $mode=='w' ? MDB2_PREPARE_MANIP : null);
-      if ($this->db_handle->isError($q))
-        {
-        $this->db_error = TRUE;
-        $this->db_error_msg = $q->userinfo;
-
-        raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
-                          'message' => $this->db_error_msg), TRUE, TRUE);
-        }
-      else
-        {
-        $result = $q->execute($params);
-        $q->free();
+        // Read or write ?
+        $mode = (strtolower(substr(trim($query),0,6)) == 'select') ? 'r' : 'w';
+
+        $this->db_connect($mode);
+
+        // check connection before proceeding
+        if (!$this->is_connected())
+            return null;
+
+        if ($this->db_provider == 'sqlite')
+            $this->_sqlite_prepare();
+
+        if ($numrows || $offset)
+            $result = $this->db_handle->setLimit($numrows,$offset);
+
+        if (empty($params))
+            $result = $mode == 'r' ? $this->db_handle->query($query) : $this->db_handle->exec($query);
+        else {
+            $params = (array)$params;
+            $q = $this->db_handle->prepare($query, null, $mode=='w' ? MDB2_PREPARE_MANIP : null);
+            if ($this->db_handle->isError($q)) {
+                $this->db_error = true;
+                $this->db_error_msg = $q->userinfo;
+
+                raise_error(array('code' => 500, 'type' => 'db',
+                    'line' => __LINE__, 'file' => __FILE__,
+                    'message' => $this->db_error_msg), true, true);
+            }
+            else {
+                $result = $q->execute($params);
+                $q->free();
+            }
         }
-      }
 
-    // add result, even if it's an error
-    return $this->_add_result($result);
+        // add result, even if it's an error
+        return $this->_add_result($result);
     }
 
 
-  /**
-   * Get number of rows for a SQL query
-   * If no query handle is specified, the last query will be taken as reference
-   *
-   * @param  number  Optional query handle identifier
-   * @return mixed   Number of rows or FALSE on failure
-   * @access public
-   */
-  function num_rows($res_id=NULL)
+    /**
+     * Get number of rows for a SQL query
+     * If no query handle is specified, the last query will be taken as reference
+     *
+     * @param  number $res_id  Optional query handle identifier
+     * @return mixed   Number of rows or false on failure
+     * @access public
+     */
+    function num_rows($res_id=null)
     {
-    if (!$this->db_handle)
-      return FALSE;
+        if (!$this->db_handle)
+            return false;
 
-    if ($result = $this->_get_result($res_id))
-      return $result->numRows();
-    else
-      return FALSE;
+        if ($result = $this->_get_result($res_id))
+            return $result->numRows();
+        else
+            return false;
     }
 
 
-  /**
-   * Get number of affected rows for the last query
-   *
-   * @param  number  Optional query handle identifier
-   * @return mixed   Number of rows or FALSE on failure
-   * @access public
-   */
-  function affected_rows($res_id = null)
+    /**
+     * Get number of affected rows for the last query
+     *
+     * @param  number $res_id Optional query handle identifier
+     * @return mixed   Number of rows or false on failure
+     * @access public
+     */
+    function affected_rows($res_id = null)
     {
-    if (!$this->db_handle)
-      return FALSE;
+        if (!$this->db_handle)
+            return false;
 
-    return (int) $this->_get_result($res_id);
+        return (int) $this->_get_result($res_id);
     }
 
 
-  /**
-   * Get last inserted record ID
-   * For Postgres databases, a sequence name is required
-   *
-   * @param  string  Table name (to find the incremented sequence)
-   * @return mixed   ID or FALSE on failure
-   * @access public
-   */
-  function insert_id($table = '')
+    /**
+     * Get last inserted record ID
+     * For Postgres databases, a sequence name is required
+     *
+     * @param  string $table  Table name (to find the incremented sequence)
+     * @return mixed   ID or false on failure
+     * @access public
+     */
+    function insert_id($table = '')
     {
-    if (!$this->db_handle || $this->db_mode=='r')
-      return FALSE;
+        if (!$this->db_handle || $this->db_mode == 'r')
+            return false;
+
+        if ($table) {
+            if ($this->db_provider == 'pgsql')
+                // find sequence name
+                $table = get_sequence_name($table);
+            else
+                // resolve table name
+                $table = get_table_name($table);
+        }
 
-    // find sequence name
-    if ($table && $this->db_provider == 'pgsql')
-      $table = get_sequence_name($table);
+        $id = $this->db_handle->lastInsertID($table);
 
-    $id = $this->db_handle->lastInsertID($table);
-    
-    return $this->db_handle->isError($id) ? null : $id;
+        return $this->db_handle->isError($id) ? null : $id;
     }
 
 
-  /**
-   * Get an associative array for one row
-   * If no query handle is specified, the last query will be taken as reference
-   *
-   * @param  number  Optional query handle identifier
-   * @return mixed   Array with col values or FALSE on failure
-   * @access public
-   */
-  function fetch_assoc($res_id=NULL)
+    /**
+     * Get an associative array for one row
+     * If no query handle is specified, the last query will be taken as reference
+     *
+     * @param  number $res_id Optional query handle identifier
+     * @return mixed   Array with col values or false on failure
+     * @access public
+     */
+    function fetch_assoc($res_id=null)
     {
-    $result = $this->_get_result($res_id);
-    return $this->_fetch_row($result, MDB2_FETCHMODE_ASSOC);
+        $result = $this->_get_result($res_id);
+        return $this->_fetch_row($result, MDB2_FETCHMODE_ASSOC);
     }
 
 
-  /**
-   * Get an index array for one row
-   * If no query handle is specified, the last query will be taken as reference
-   *
-   * @param  number  Optional query handle identifier
-   * @return mixed   Array with col values or FALSE on failure
-   * @access public
-   */
-  function fetch_array($res_id=NULL)
+    /**
+     * Get an index array for one row
+     * If no query handle is specified, the last query will be taken as reference
+     *
+     * @param  number $res_id  Optional query handle identifier
+     * @return mixed   Array with col values or false on failure
+     * @access public
+     */
+    function fetch_array($res_id=null)
     {
-    $result = $this->_get_result($res_id);
-    return $this->_fetch_row($result, MDB2_FETCHMODE_ORDERED);
+        $result = $this->_get_result($res_id);
+        return $this->_fetch_row($result, MDB2_FETCHMODE_ORDERED);
     }
 
 
-  /**
-   * Get col values for a result row
-   *
-   * @param  object  Query result handle
-   * @param  number  Fetch mode identifier
-   * @return mixed   Array with col values or FALSE on failure
-   * @access private
-   */
-  function _fetch_row($result, $mode)
+    /**
+     * Get col values for a result row
+     *
+     * @param  MDB2_Result_Common Query $result result handle
+     * @param  number                   $mode   Fetch mode identifier
+     * @return mixed   Array with col values or false on failure
+     * @access private
+     */
+    private function _fetch_row($result, $mode)
     {
-    if ($result === FALSE || PEAR::isError($result) || !$this->is_connected())
-      return FALSE;
+        if ($result === false || PEAR::isError($result) || !$this->is_connected())
+            return false;
 
-    return $result->fetchRow($mode);
+        return $result->fetchRow($mode);
     }
 
 
-  /**
-   * Formats input so it can be safely used in a query
-   *
-   * @param  mixed   Value to quote
-   * @return string  Quoted/converted string for use in query
-   * @access public
-   */
-  function quote($input, $type = null)
+    /**
+     * Wrapper for the SHOW TABLES command
+     *
+     * @return array List of all tables of the current database
+     * @access public
+     * @since 0.4-beta
+     */
+    function list_tables()
     {
-    // create DB handle if not available
-    if (!$this->db_handle)
-      $this->db_connect('r');
+        // get tables if not cached
+        if (!$this->tables) {
+            $this->db_handle->loadModule('Manager');
+            if (!PEAR::isError($result = $this->db_handle->listTables()))
+                $this->tables = $result;
+            else
+                $this->tables = array();
+        }
 
-    // escape pear identifier chars
-    $rep_chars = array('?' => '\?',
-                       '!' => '\!',
-                       '&' => '\&');
+        return $this->tables;
+    }
+
+
+    /**
+     * Formats input so it can be safely used in a query
+     *
+     * @param  mixed  $input  Value to quote
+     * @param  string $type   Type of data
+     * @return string  Quoted/converted string for use in query
+     * @access public
+     */
+    function quote($input, $type = null)
+    {
+        // handle int directly for better performance
+        if ($type == 'integer')
+            return intval($input);
+
+        // create DB handle if not available
+        if (!$this->db_handle)
+            $this->db_connect('r');
 
-    return $this->db_handle->quote($input, $type);
+        return $this->db_handle->quote($input, $type);
     }
 
 
-  /**
-   * Quotes a string so it can be safely used as a table or column name
-   *
-   * @param  string  Value to quote
-   * @return string  Quoted string for use in query
-   * @deprecated     Replaced by rcube_MDB2::quote_identifier
-   * @see            rcube_mdb2::quote_identifier
-   * @access public
-   */
-  function quoteIdentifier($str)
+    /**
+     * Quotes a string so it can be safely used as a table or column name
+     *
+     * @param  string $str Value to quote
+     * @return string  Quoted string for use in query
+     * @deprecated     Replaced by rcube_MDB2::quote_identifier
+     * @see            rcube_mdb2::quote_identifier
+     * @access public
+     */
+    function quoteIdentifier($str)
     {
-    return $this->quote_identifier($str);
+        return $this->quote_identifier($str);
     }
 
 
-  /**
-   * Quotes a string so it can be safely used as a table or column name
-   *
-   * @param  string  Value to quote
-   * @return string  Quoted string for use in query
-   * @access public
-   */
-  function quote_identifier($str)
+    /**
+     * Quotes a string so it can be safely used as a table or column name
+     *
+     * @param  string $str Value to quote
+     * @return string  Quoted string for use in query
+     * @access public
+     */
+    function quote_identifier($str)
     {
-    if (!$this->db_handle)
-      $this->db_connect('r');
+        if (!$this->db_handle)
+            $this->db_connect('r');
 
-    return $this->db_handle->quoteIdentifier($str);
+        return $this->db_handle->quoteIdentifier($str);
     }
 
-  /**
-   * Escapes a string
-   *
-   * @param  string  The string to be escaped
-   * @return string  The escaped string
-   * @access public
-   * @since  0.1.1
-   */
-  function escapeSimple($str)
+
+    /**
+     * Escapes a string
+     *
+     * @param  string $str The string to be escaped
+     * @return string  The escaped string
+     * @access public
+     * @since  0.1.1
+     */
+    function escapeSimple($str)
     {
-    if (!$this->db_handle)
-      $this->db_connect('r');
-   
-    return $this->db_handle->escape($str);
+        if (!$this->db_handle)
+            $this->db_connect('r');
+
+        return $this->db_handle->escape($str);
     }
 
 
-  /**
-   * Return SQL function for current time and date
-   *
-   * @return string SQL function to use in query
-   * @access public
-   */
-  function now()
+    /**
+     * Return SQL function for current time and date
+     *
+     * @return string SQL function to use in query
+     * @access public
+     */
+    function now()
     {
-    switch($this->db_provider)
-      {
-      case 'mssql':
-        return "getdate()";
+        switch($this->db_provider) {
+            case 'mssql':
+            case 'sqlsrv':
+                return "getdate()";
 
-      default:
-        return "now()";
-      }
+            default:
+                return "now()";
+        }
     }
 
 
-  /**
-   * Return list of elements for use with SQL's IN clause
-   *
-   * @param  string Input array
-   * @return string Elements list string
-   * @access public
-   */
-  function array2list($arr, $type=null)
+    /**
+     * Return list of elements for use with SQL's IN clause
+     *
+     * @param  array  $arr  Input array
+     * @param  string $type Type of data
+     * @return string Comma-separated list of quoted values for use in query
+     * @access public
+     */
+    function array2list($arr, $type = null)
     {
-    if (!is_array($arr))
-      return $this->quote($arr, $type);
-    
-    $res = array();
-    foreach ($arr as $item)
-      $res[] = $this->quote($item, $type);
+        if (!is_array($arr))
+            return $this->quote($arr, $type);
 
-    return implode(',', $res);
+        foreach ($arr as $idx => $item)
+            $arr[$idx] = $this->quote($item, $type);
+
+        return implode(',', $arr);
     }
 
 
-  /**
-   * Return SQL statement to convert a field value into a unix timestamp
-   *
-   * @param  string  Field name
-   * @return string  SQL statement to use in query
-   * @access public
-   */
-  function unixtimestamp($field)
+    /**
+     * Return SQL statement to convert a field value into a unix timestamp
+     *
+     * @param  string $field Field name
+     * @return string  SQL statement to use in query
+     * @access public
+     */
+    function unixtimestamp($field)
     {
-    switch($this->db_provider)
-      {
-      case 'pgsql':
-        return "EXTRACT (EPOCH FROM $field)";
-        break;
+        switch($this->db_provider) {
+            case 'pgsql':
+                return "EXTRACT (EPOCH FROM $field)";
 
-      case 'mssql':
-       return "DATEDIFF(second, '19700101', $field) + DATEDIFF(second, GETDATE(), GETUTCDATE())";
+            case 'mssql':
+            case 'sqlsrv':
+                return "DATEDIFF(second, '19700101', $field) + DATEDIFF(second, GETDATE(), GETUTCDATE())";
 
-      default:
-        return "UNIX_TIMESTAMP($field)";
-      }
+            default:
+                return "UNIX_TIMESTAMP($field)";
+        }
     }
 
 
-  /**
-   * Return SQL statement to convert from a unix timestamp
-   *
-   * @param  string  Field name
-   * @return string  SQL statement to use in query
-   * @access public
-   */
-  function fromunixtime($timestamp)
+    /**
+     * Return SQL statement to convert from a unix timestamp
+     *
+     * @param  string $timestamp Field name
+     * @return string  SQL statement to use in query
+     * @access public
+     */
+    function fromunixtime($timestamp)
     {
-    switch($this->db_provider)
-      {
-      case 'mysqli':
-      case 'mysql':
-      case 'sqlite':
-        return sprintf("FROM_UNIXTIME(%d)", $timestamp);
-
-      default:
-        return date("'Y-m-d H:i:s'", $timestamp);
-      }
-    }
-
-
-  /**
-   * Return SQL statement for case insensitive LIKE
-   *
-   * @param  string  Field name
-   * @param  string  Search value
-   * @return string  SQL statement to use in query
-   * @access public
-   */
-  function ilike($column, $value)
-    {
-    // TODO: use MDB2's matchPattern() function
-    switch($this->db_provider)
-      {
-      case 'pgsql':
-        return $this->quote_identifier($column).' ILIKE '.$this->quote($value);
-      default:
-        return $this->quote_identifier($column).' LIKE '.$this->quote($value);
-      }
-    }
-
-
-  /**
-   * Encodes non-UTF-8 characters in string/array/object (recursive)
-   *
-   * @param  mixed  Data to fix
-   * @return mixed  Properly UTF-8 encoded data
-   * @access public
-   */
-  function encode($input)
+        switch($this->db_provider) {
+            case 'mysqli':
+            case 'mysql':
+            case 'sqlite':
+                return sprintf("FROM_UNIXTIME(%d)", $timestamp);
+
+            default:
+                return date("'Y-m-d H:i:s'", $timestamp);
+        }
+    }
+
+
+    /**
+     * Return SQL statement for case insensitive LIKE
+     *
+     * @param  string $column  Field name
+     * @param  string $value   Search value
+     * @return string  SQL statement to use in query
+     * @access public
+     */
+    function ilike($column, $value)
     {
-    if (is_object($input)) {
-      foreach (get_object_vars($input) as $idx => $value)
-        $input->$idx = $this->encode($value);
-      return $input;
-      }
-    else if (is_array($input)) {
-      foreach ($input as $idx => $value)
-        $input[$idx] = $this->encode($value);
-      return $input;   
-      }
-
-    return utf8_encode($input);
-    }
-
-
-  /**
-   * Decodes encoded UTF-8 string/object/array (recursive)
-   *
-   * @param  mixed  Input data
-   * @return mixed  Decoded data
-   * @access public
-   */
-  function decode($input)
+        // TODO: use MDB2's matchPattern() function
+        switch($this->db_provider) {
+            case 'pgsql':
+                return $this->quote_identifier($column).' ILIKE '.$this->quote($value);
+            default:
+                return $this->quote_identifier($column).' LIKE '.$this->quote($value);
+        }
+    }
+
+
+    /**
+     * Encodes non-UTF-8 characters in string/array/object (recursive)
+     *
+     * @param  mixed  $input Data to fix
+     * @return mixed  Properly UTF-8 encoded data
+     * @access public
+     */
+    function encode($input)
     {
-    if (is_object($input)) {
-      foreach (get_object_vars($input) as $idx => $value)
-        $input->$idx = $this->decode($value);
-      return $input;
-      }
-    else if (is_array($input)) {
-      foreach ($input as $idx => $value)
-        $input[$idx] = $this->decode($value);
-      return $input;   
-      }
-
-    return utf8_decode($input);
-    }
-
-
-  /**
-   * Adds a query result and returns a handle ID
-   *
-   * @param  object  Query handle
-   * @return mixed   Handle ID
-   * @access private
-   */
-  function _add_result($res)
+        if (is_object($input)) {
+            foreach (get_object_vars($input) as $idx => $value)
+                $input->$idx = $this->encode($value);
+            return $input;
+        }
+        else if (is_array($input)) {
+            foreach ($input as $idx => $value)
+                $input[$idx] = $this->encode($value);
+            return $input;     
+        }
+
+        return utf8_encode($input);
+    }
+
+
+    /**
+     * Decodes encoded UTF-8 string/object/array (recursive)
+     *
+     * @param  mixed $input Input data
+     * @return mixed  Decoded data
+     * @access public
+     */
+    function decode($input)
     {
-    // sql error occured
-    if (PEAR::isError($res))
-      {
-      $this->db_error = TRUE;
-      $this->db_error_msg = $res->getMessage();
-      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
-           'message' => $res->getMessage() . " Query: " 
-           . substr(preg_replace('/[\r\n]+\s*/', ' ', $res->userinfo), 0, 512)),
-           TRUE, FALSE);
-      }
-    
-    $res_id = sizeof($this->a_query_results);
-    $this->last_res_id = $res_id;
-    $this->a_query_results[$res_id] = $res;
-    return $res_id;
-    }
-
-
-  /**
-   * Resolves a given handle ID and returns the according query handle
-   * If no ID is specified, the last resource handle will be returned
-   *
-   * @param  number  Handle ID
-   * @return mixed   Resource handle or FALSE on failure
-   * @access private
-   */
-  function _get_result($res_id=NULL)
+        if (is_object($input)) {
+            foreach (get_object_vars($input) as $idx => $value)
+                $input->$idx = $this->decode($value);
+            return $input;
+        }
+        else if (is_array($input)) {
+            foreach ($input as $idx => $value)
+                $input[$idx] = $this->decode($value);
+            return $input;     
+        }
+
+        return utf8_decode($input);
+    }
+
+
+    /**
+     * Adds a query result and returns a handle ID
+     *
+     * @param  object $res Query handle
+     * @return mixed   Handle ID
+     * @access private
+     */
+    private function _add_result($res)
     {
-    if ($res_id==NULL)
-      $res_id = $this->last_res_id;
+        // sql error occured
+        if (PEAR::isError($res)) {
+            $this->db_error = true;
+            $this->db_error_msg = $res->getMessage();
+            raise_error(array('code' => 500, 'type' => 'db',
+                'line' => __LINE__, 'file' => __FILE__,
+                'message' => $res->getMessage() . " Query: " 
+                . substr(preg_replace('/[\r\n]+\s*/', ' ', $res->userinfo), 0, 512)),
+                true, false);
+        }
 
-    if (isset($this->a_query_results[$res_id]))
-      if (!PEAR::isError($this->a_query_results[$res_id]))
-        return $this->a_query_results[$res_id];
-    
-    return FALSE;
+        $res_id = sizeof($this->a_query_results);
+        $this->last_res_id = $res_id;
+        $this->a_query_results[$res_id] = $res;
+        return $res_id;
     }
 
 
-  /**
-   * Create a sqlite database from a file
-   *
-   * @param  object  SQLite database handle
-   * @param  string  File path to use for DB creation
-   * @access private
-   */
-  function _sqlite_create_database($dbh, $file_name)
+    /**
+     * Resolves a given handle ID and returns the according query handle
+     * If no ID is specified, the last resource handle will be returned
+     *
+     * @param  number $res_id Handle ID
+     * @return mixed   Resource handle or false on failure
+     * @access private
+     */
+    private function _get_result($res_id = null)
     {
-    if (empty($file_name) || !is_string($file_name))
-      return;
+        if ($res_id == null)
+            $res_id = $this->last_res_id;
 
-    $data = file_get_contents($file_name);
+        if (isset($this->a_query_results[$res_id]))
+            if (!PEAR::isError($this->a_query_results[$res_id]))
+                return $this->a_query_results[$res_id];
 
-    if (strlen($data))
-      if (!sqlite_exec($dbh->connection, $data, $error) || MDB2::isError($dbh)) 
-        raise_error(array('code' => 500, 'type' => 'db',
-           'line' => __LINE__, 'file' => __FILE__, 'message' => $error), TRUE, FALSE); 
+        return false;
     }
 
 
-  /**
-   * Add some proprietary database functions to the current SQLite handle
-   * in order to make it MySQL compatible
-   *
-   * @access private
-   */
-  function _sqlite_prepare()
+    /**
+     * Create a sqlite database from a file
+     *
+     * @param  MDB2   $dbh       SQLite database handle
+     * @param  string $file_name File path to use for DB creation
+     * @access private
+     */
+    private function _sqlite_create_database($dbh, $file_name)
     {
-    include_once('include/rcube_sqlite.inc');
+        if (empty($file_name) || !is_string($file_name))
+            return;
 
-    // we emulate via callback some missing MySQL function
-    sqlite_create_function($this->db_handle->connection, "from_unixtime", "rcube_sqlite_from_unixtime");
-    sqlite_create_function($this->db_handle->connection, "unix_timestamp", "rcube_sqlite_unix_timestamp");
-    sqlite_create_function($this->db_handle->connection, "now", "rcube_sqlite_now");
-    sqlite_create_function($this->db_handle->connection, "md5", "rcube_sqlite_md5");
+        $data = file_get_contents($file_name);
+
+        if (strlen($data))
+            if (!sqlite_exec($dbh->connection, $data, $error) || MDB2::isError($dbh)) 
+                raise_error(array('code' => 500, 'type' => 'db',
+                    'line' => __LINE__, 'file' => __FILE__,
+                    'message' => $error), true, false); 
     }
 
 
-  }  // end class rcube_db
+    /**
+     * Add some proprietary database functions to the current SQLite handle
+     * in order to make it MySQL compatible
+     *
+     * @access private
+     */
+    private function _sqlite_prepare()
+    {
+        include_once('include/rcube_sqlite.inc');
+
+        // we emulate via callback some missing MySQL function
+        sqlite_create_function($this->db_handle->connection,
+            'from_unixtime', 'rcube_sqlite_from_unixtime');
+        sqlite_create_function($this->db_handle->connection,
+            'unix_timestamp', 'rcube_sqlite_unix_timestamp');
+        sqlite_create_function($this->db_handle->connection,
+            'now', 'rcube_sqlite_now');
+        sqlite_create_function($this->db_handle->connection,
+            'md5', 'rcube_sqlite_md5');
+    }
+
+}  // end class rcube_db
 
 
 /* this is our own debug handler for the MDB2 connection */
 function mdb2_debug_handler(&$db, $scope, $message, $context = array())
 {
-  if ($scope != 'prepare')
-  {
-    $debug_output = $scope . '('.$db->db_index.'): ';
-    $debug_output .= $message . $db->getOption('log_line_break');
-    write_log('sql', $debug_output);
-  }
+    if ($scope != 'prepare') {
+        $debug_output = sprintf('%s(%d): %s;',
+            $scope, $db->db_index, rtrim($message, ';'));
+        write_log('sql', $debug_output);
+    }
 }
+
index 1a22427d03ac89e0167eb3dba79abc8e4f1cf294..f28d94d82ed52d00b1097e9ba3da73dd3dbc79d4 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_message.php                                     |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2008-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2008-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_imap.php 1344 2008-04-30 08:21:42Z thomasb $
+ $Id: rcube_message.php 4288 2010-11-29 09:54:15Z alec $
 
 */
 
  */
 class rcube_message
 {
-  private $app;
-  private $imap;
-  private $opt = array();
-  private $inline_parts = array();
-  private $parse_alternative = false;
-  
-  public $uid = null;
-  public $headers;
-  public $structure;
-  public $parts = array();
-  public $mime_parts = array();
-  public $attachments = array();
-  public $subject = '';
-  public $sender = null;
-  public $is_safe = false;
-  
-
-  /**
-   * __construct
-   *
-   * Provide a uid, and parse message structure.
-   *
-   * @param string $uid The message UID.
-   *
-   * @uses rcmail::get_instance()
-   * @uses rcube_imap::decode_mime_string()
-   * @uses self::set_safe()
-   *
-   * @see self::$app, self::$imap, self::$opt, self::$structure
-   */
-  function __construct($uid)
-  {
-    $this->app = rcmail::get_instance();
-    $this->imap = $this->app->imap;
-    
-    $this->uid = $uid;
-    $this->headers = $this->imap->get_headers($uid, NULL, true, true);
-
-    $this->subject = rcube_imap::decode_mime_string($this->headers->subject, $this->headers->charset);
-    list(, $this->sender) = each($this->imap->decode_address_list($this->headers->from));
-    
-    $this->set_safe((intval($_GET['_safe']) || $_SESSION['safe_messages'][$uid]));
-    $this->opt = array(
-      'safe' => $this->is_safe,
-      'prefer_html' => $this->app->config->get('prefer_html'),
-      'get_url' => rcmail_url('get', array('_mbox' => $this->imap->get_mailbox_name(), '_uid' => $uid))
-    );
-
-    if ($this->structure = $this->imap->get_structure($uid, $this->headers->body_structure)) {
-      $this->get_mime_numbers($this->structure);
-      $this->parse_structure($this->structure);
+    /**
+     * Instace of rcmail.
+     *
+     * @var rcmail
+     */
+    private $app;
+
+    /**
+     * Instance of imap class
+     *
+     * @var rcube_imap
+     */
+    private $imap;
+    private $opt = array();
+    private $inline_parts = array();
+    private $parse_alternative = false;
+
+    public $uid = null;
+    public $headers;
+    public $structure;
+    public $parts = array();
+    public $mime_parts = array();
+    public $attachments = array();
+    public $subject = '';
+    public $sender = null;
+    public $is_safe = false;
+
+
+    /**
+     * __construct
+     *
+     * Provide a uid, and parse message structure.
+     *
+     * @param string $uid The message UID.
+     *
+     * @uses rcmail::get_instance()
+     * @uses rcube_imap::decode_mime_string()
+     * @uses self::set_safe()
+     *
+     * @see self::$app, self::$imap, self::$opt, self::$structure
+     */
+    function __construct($uid)
+    {
+        $this->app = rcmail::get_instance();
+        $this->imap = $this->app->imap;
+        $this->imap->get_all_headers = true;
+
+        $this->uid = $uid;
+        $this->headers = $this->imap->get_headers($uid, NULL, true, true);
+
+        if (!$this->headers)
+            return;
+
+        $this->subject = rcube_imap::decode_mime_string(
+            $this->headers->subject, $this->headers->charset);
+        list(, $this->sender) = each($this->imap->decode_address_list($this->headers->from));
+
+        $this->set_safe((intval($_GET['_safe']) || $_SESSION['safe_messages'][$uid]));
+        $this->opt = array(
+            'safe' => $this->is_safe,
+            'prefer_html' => $this->app->config->get('prefer_html'),
+            'get_url' => rcmail_url('get', array(
+                '_mbox' => $this->imap->get_mailbox_name(), '_uid' => $uid))
+        );
+
+        if ($this->structure = $this->imap->get_structure($uid, $this->headers->body_structure)) {
+            $this->get_mime_numbers($this->structure);
+            $this->parse_structure($this->structure);
+        }
+        else {
+            $this->body = $this->imap->get_body($uid);
+        }
+
+        // notify plugins and let them analyze this structured message object
+        $this->app->plugins->exec_hook('message_load', array('object' => $this));
     }
-    else {
-      $this->body = $this->imap->get_body($uid);
+
+
+    /**
+     * Return a (decoded) message header
+     *
+     * @param string $name Header name
+     * @param bool   $row  Don't mime-decode the value
+     * @return string Header value
+     */
+    public function get_header($name, $raw = false)
+    {
+        if ($this->headers->$name)
+            $value = $this->headers->$name;
+        else if ($this->headers->others[$name])
+            $value = $this->headers->others[$name];
+
+        return $raw ? $value : $this->imap->decode_header($value);
     }
-    
-    // notify plugins and let them analyze this structured message object
-    $this->app->plugins->exec_hook('message_load', array('object' => $this));
-  }
-  
-  
-  /**
-   * Return a (decoded) message header
-   *
-   * @param string Header name
-   * @param bool   Don't mime-decode the value
-   * @return string Header value
-   */
-  public function get_header($name, $raw = false)
-  {
-    $value = $this->headers->$name;
-    return $raw ? $value : $this->imap->decode_header($value);
-  }
-  
-  /**
-   * Set is_safe var and session data
-   *
-   * @param bool enable/disable
-   */
-  public function set_safe($safe = true)
-  {
-    $this->is_safe = $safe;
-    $_SESSION['safe_messages'][$this->uid] = $this->is_safe;
-  }
-  
-  /**
-   * Compose a valid URL for getting a message part
-   *
-   * @param string Part MIME-ID
-   * @return string URL or false if part does not exist
-   */
-  public function get_part_url($mime_id)
-  {
-    if ($this->mime_parts[$mime_id])
-      return $this->opt['get_url'] . "&_part=" . $mime_id;
-    else
-      return false;
-  }
-  
-  
-  /**
-   * Get content of a specific part of this message
-   *
-   * @param string Part MIME-ID
-   * @param resource File pointer to save the message part
-   * @return string Part content
-   */
-  public function get_part_content($mime_id, $fp=NULL)
-  {
-    if ($part = $this->mime_parts[$mime_id])
-      return $this->imap->get_message_part($this->uid, $mime_id, $part, NULL, $fp);
-    else
-      return null;
-  }
-  
-  
-  /**
-   * Determine if the message contains a HTML part
-   *
-   * @return bool True if a HTML is available, False if not
-   */
-  function has_html_part()
-  {
-     // check all message parts
-     foreach ($this->parts as $pid => $part) {
-        $mimetype = strtolower($part->ctype_primary . '/' . $part->ctype_secondary);
-        if ($mimetype == 'text/html')
-           return true;
-     }
-
-     return false;
-  }
-
-  /**
-   * Return the first HTML part of this message
-   *
-   * @return string HTML message part content
-   */
-  function first_html_part()
+
+
+    /**
+     * Set is_safe var and session data
+     *
+     * @param bool $safe enable/disable
+     */
+    public function set_safe($safe = true)
     {
-    // check all message parts
-    foreach ($this->mime_parts as $mime_id => $part) {
-      $mimetype = strtolower($part->ctype_primary . '/' . $part->ctype_secondary);
-      if ($mimetype == 'text/html') {
-        return $this->imap->get_message_part($this->uid, $mime_id, $part);
-      }
+        $this->is_safe = $safe;
+        $_SESSION['safe_messages'][$this->uid] = $this->is_safe;
     }
-  }
 
 
-  /**
-   * Return the first text part of this message
-   *
-   * @return string Plain text message/part content
-   */
-  function first_text_part()
+    /**
+     * Compose a valid URL for getting a message part
+     *
+     * @param string $mime_id Part MIME-ID
+     * @return string URL or false if part does not exist
+     */
+    public function get_part_url($mime_id)
     {
-    // no message structure, return complete body
-    if (empty($this->parts))
-      return $this->body;
-      
-    $out = null;
-
-    // check all message parts
-    foreach ($this->mime_parts as $mime_id => $part) {
-      $mimetype = strtolower($part->ctype_primary . '/' . $part->ctype_secondary);
-
-      if ($mimetype == 'text/plain') {
-        $out = $this->imap->get_message_part($this->uid, $mime_id, $part);
-        break;
-      }
-      else if ($mimetype == 'text/html') {
-        $html_part = $this->imap->get_message_part($this->uid, $mime_id, $part);
-
-        // remove special chars encoding
-        $trans = array_flip(get_html_translation_table(HTML_ENTITIES));
-        $html_part = strtr($html_part, $trans);
-
-        // create instance of html2text class
-        $txt = new html2text($html_part);
-        $out = $txt->get_text();
-        break;
-      }
+        if ($this->mime_parts[$mime_id])
+            return $this->opt['get_url'] . '&_part=' . $mime_id;
+        else
+            return false;
     }
 
-    return $out;
-  }
-
-
-  /**
-   * Raad the message structure returend by the IMAP server
-   * and build flat lists of content parts and attachments
-   *
-   * @param object rcube_message_part Message structure node
-   * @param bool  True when called recursively
-   */
-  private function parse_structure($structure, $recursive = false)
-  {
-    $message_ctype_primary = strtolower($structure->ctype_primary);
-    $message_ctype_secondary = strtolower($structure->ctype_secondary);
-
-    // show message headers
-    if ($recursive && is_array($structure->headers) && isset($structure->headers['subject'])) {
-      $c = new stdClass;
-      $c->type = 'headers';
-      $c->headers = &$structure->headers;
-      $this->parts[] = $c;
+
+    /**
+     * Get content of a specific part of this message
+     *
+     * @param string $mime_id Part MIME-ID
+     * @param resource $fp File pointer to save the message part
+     * @return string Part content
+     */
+    public function get_part_content($mime_id, $fp=NULL)
+    {
+        if ($part = $this->mime_parts[$mime_id]) {
+            // stored in message structure (winmail/inline-uuencode)
+            if ($part->encoding == 'stream') {
+                if ($fp) {
+                    fwrite($fp, $part->body);
+                }
+                return $fp ? true : $part->body;
+            }
+            // get from IMAP
+            return $this->imap->get_message_part($this->uid, $mime_id, $part, NULL, $fp);
+        } else
+            return null;
+    }
+
+
+    /**
+     * Determine if the message contains a HTML part
+     *
+     * @return bool True if a HTML is available, False if not
+     */
+    function has_html_part()
+    {
+        // check all message parts
+        foreach ($this->parts as $pid => $part) {
+            $mimetype = strtolower($part->ctype_primary . '/' . $part->ctype_secondary);
+            if ($mimetype == 'text/html')
+                return true;
+        }
+
+        return false;
     }
 
-    // print body if message doesn't have multiple parts
-    if ($message_ctype_primary == 'text' && !$recursive) {
-      $structure->type = 'content';
-      $this->parts[] = &$structure;
+
+    /**
+     * Return the first HTML part of this message
+     *
+     * @return string HTML message part content
+     */
+    function first_html_part()
+    {
+        // check all message parts
+        foreach ($this->mime_parts as $mime_id => $part) {
+            $mimetype = strtolower($part->ctype_primary . '/' . $part->ctype_secondary);
+            if ($mimetype == 'text/html') {
+                return $this->imap->get_message_part($this->uid, $mime_id, $part);
+            }
+        }
     }
-    // the same for pgp signed messages
-    else if ($message_ctype_primary == 'application' && $message_ctype_secondary == 'pgp' && !$recursive) {
-      $structure->type = 'content';
-      $this->parts[] = &$structure;
+
+
+    /**
+     * Return the first text part of this message
+     *
+     * @param rcube_message_part $part Reference to the part if found
+     * @return string Plain text message/part content
+     */
+    function first_text_part(&$part=null)
+    {
+        // no message structure, return complete body
+        if (empty($this->parts))
+            return $this->body;
+
+        // check all message parts
+        foreach ($this->mime_parts as $mime_id => $part) {
+            $mimetype = $part->ctype_primary . '/' . $part->ctype_secondary;
+
+            if ($mimetype == 'text/plain') {
+                return $this->imap->get_message_part($this->uid, $mime_id, $part);
+            }
+            else if ($mimetype == 'text/html') {
+                $out = $this->imap->get_message_part($this->uid, $mime_id, $part);
+
+                // remove special chars encoding
+                $trans = array_flip(get_html_translation_table(HTML_ENTITIES));
+                $out = strtr($out, $trans);
+
+                // create instance of html2text class
+                $txt = new html2text($out);
+                return $txt->get_text();
+            }
+        }
+
+        $part = null;
+        return null;
     }
-    // message contains alternative parts
-    else if ($message_ctype_primary == 'multipart' && ($message_ctype_secondary == 'alternative') && is_array($structure->parts)) {
-      // get html/plaintext parts
-      $plain_part = $html_part = $print_part = $related_part = null;
-
-      foreach ($structure->parts as $p => $sub_part) {
-        $rel_parts = $attachmnts = null;
-        $sub_ctype_primary = strtolower($sub_part->ctype_primary);
-        $sub_ctype_secondary = strtolower($sub_part->ctype_secondary);
+
+
+    /**
+     * Raad the message structure returend by the IMAP server
+     * and build flat lists of content parts and attachments
+     *
+     * @param rcube_message_part $structure Message structure node
+     * @param bool               $recursive True when called recursively
+     */
+    private function parse_structure($structure, $recursive = false)
+    {
+        // real content-type of message/rfc822 part
+        if ($structure->mimetype == 'message/rfc822' && $structure->real_mimetype)
+            $mimetype = $structure->real_mimetype;
+        else
+            $mimetype = $structure->mimetype;
+
+        // show message headers
+        if ($recursive && is_array($structure->headers) && isset($structure->headers['subject'])) {
+            $c = new stdClass;
+            $c->type = 'headers';
+            $c->headers = &$structure->headers;
+            $this->parts[] = $c;
+        }
+
+        // Allow plugins to handle message parts
+        $plugin = $this->app->plugins->exec_hook('message_part_structure',
+            array('object' => $this, 'structure' => $structure,
+                'mimetype' => $mimetype, 'recursive' => $recursive));
+
+        if ($plugin['abort'])
+            return;
+
+        $structure = $plugin['structure'];
+        list($message_ctype_primary, $message_ctype_secondary) = explode('/', $plugin['mimetype']);
+
+        // print body if message doesn't have multiple parts
+        if ($message_ctype_primary == 'text' && !$recursive) {
+            $structure->type = 'content';
+            $this->parts[] = &$structure;
+            
+            // Parse simple (plain text) message body
+            if ($message_ctype_secondary == 'plain')
+                foreach ((array)$this->uu_decode($structure) as $uupart) {
+                    $this->mime_parts[$uupart->mime_id] = $uupart;
+                    $this->attachments[] = $uupart;
+                }
+        }
+        // the same for pgp signed messages
+        else if ($mimetype == 'application/pgp' && !$recursive) {
+            $structure->type = 'content';
+            $this->parts[] = &$structure;
+        }
+        // message contains alternative parts
+        else if ($mimetype == 'multipart/alternative' && is_array($structure->parts)) {
+            // get html/plaintext parts
+            $plain_part = $html_part = $print_part = $related_part = null;
+
+            foreach ($structure->parts as $p => $sub_part) {
+                $sub_mimetype = $sub_part->mimetype;
         
-        // check if sub part is 
-        if ($sub_ctype_primary=='text' && $sub_ctype_secondary=='plain')
-          $plain_part = $p;
-        else if ($sub_ctype_primary=='text' && $sub_ctype_secondary=='html')
-          $html_part = $p;
-        else if ($sub_ctype_primary=='text' && $sub_ctype_secondary=='enriched')
-          $enriched_part = $p;
-        else if ($sub_ctype_primary=='multipart' && in_array($sub_ctype_secondary, array('related', 'mixed', 'alternative')))
-          $related_part = $p;
-      }
-
-      // parse related part (alternative part could be in here)
-      if ($related_part !== null && !$this->parse_alternative) {
-        $this->parse_alternative = true;
-        $this->parse_structure($structure->parts[$related_part], true);
-        $this->parse_alternative = false;
+                // check if sub part is
+                if ($sub_mimetype == 'text/plain')
+                    $plain_part = $p;
+                else if ($sub_mimetype == 'text/html')
+                    $html_part = $p;
+                else if ($sub_mimetype == 'text/enriched')
+                    $enriched_part = $p;
+                else if (in_array($sub_mimetype, array('multipart/related', 'multipart/mixed', 'multipart/alternative')))
+                    $related_part = $p;
+            }
+
+            // parse related part (alternative part could be in here)
+            if ($related_part !== null && !$this->parse_alternative) {
+                $this->parse_alternative = true;
+                $this->parse_structure($structure->parts[$related_part], true);
+                $this->parse_alternative = false;
         
-        // if plain part was found, we should unset it if html is preferred
-        if ($this->opt['prefer_html'] && count($this->parts))
-          $plain_part = null;
-      }
-
-      // choose html/plain part to print
-      if ($html_part !== null && $this->opt['prefer_html']) {
-        $print_part = &$structure->parts[$html_part];
-      }
-      else if ($enriched_part !== null) {
-        $print_part = &$structure->parts[$enriched_part];
-      }
-      else if ($plain_part !== null) {
-        $print_part = &$structure->parts[$plain_part];
-      }
-
-      // add the right message body
-      if (is_object($print_part)) {
-        $print_part->type = 'content';
-        $this->parts[] = $print_part;
-      }
-      // show plaintext warning
-      else if ($html_part !== null && empty($this->parts)) {
-        $c = new stdClass;
-        $c->type = 'content';
-        $c->body = rcube_label('htmlmessage');
-        $c->ctype_primary = 'text';
-        $c->ctype_secondary = 'plain';
-
-        $this->parts[] = $c;
-      }
-
-      // add html part as attachment
-      if ($html_part !== null && $structure->parts[$html_part] !== $print_part) {
-        $html_part = &$structure->parts[$html_part];
-        $html_part->filename = rcube_label('htmlmessage');
-        $html_part->mimetype = 'text/html';
-
-        $this->attachments[] = $html_part;
-      }
-    }
-    // this is an ecrypted message -> create a plaintext body with the according message
-    else if ($message_ctype_primary == 'multipart' && $message_ctype_secondary == 'encrypted') {
-      $p = new stdClass;
-      $p->type = 'content';
-      $p->ctype_primary = 'text';
-      $p->ctype_secondary = 'plain';
-      $p->body = rcube_label('encryptedmessage');
-      $p->size = strlen($p->body);
-      
-      // maybe some plugins are able to decode this encrypted message part
-      $data = $this->app->plugins->exec_hook('message_part_encrypted', array('object' => $this, 'struct' => $structure, 'part' => $p));
-      if (is_array($data['parts'])) {
-        $this->parts = array_merge($this->parts, $data['parts']);
-      }
-      else if ($data['part']) {
-        $this->parts[] = $p;
-      }
-    }
-    // message contains multiple parts
-    else if (is_array($structure->parts) && !empty($structure->parts)) {
-      // iterate over parts
-      for ($i=0; $i < count($structure->parts); $i++) {
-        $mail_part = &$structure->parts[$i];
-        $primary_type = strtolower($mail_part->ctype_primary);
-        $secondary_type = strtolower($mail_part->ctype_secondary);
-
-        // multipart/alternative
-        if ($primary_type=='multipart') {
-          $this->parse_structure($mail_part, true);
+                // if plain part was found, we should unset it if html is preferred
+                if ($this->opt['prefer_html'] && count($this->parts))
+                    $plain_part = null;
+            }
+
+            // choose html/plain part to print
+            if ($html_part !== null && $this->opt['prefer_html']) {
+                $print_part = &$structure->parts[$html_part];
+            }
+            else if ($enriched_part !== null) {
+                $print_part = &$structure->parts[$enriched_part];
+            }
+            else if ($plain_part !== null) {
+                $print_part = &$structure->parts[$plain_part];
+            }
+
+            // add the right message body
+            if (is_object($print_part)) {
+                $print_part->type = 'content';
+                $this->parts[] = $print_part;
+            }
+            // show plaintext warning
+            else if ($html_part !== null && empty($this->parts)) {
+                $c = new stdClass;
+                $c->type            = 'content';
+                $c->ctype_primary   = 'text';
+                $c->ctype_secondary = 'plain';
+                $c->body            = rcube_label('htmlmessage');
+
+                $this->parts[] = $c;
+            }
+
+            // add html part as attachment
+            if ($html_part !== null && $structure->parts[$html_part] !== $print_part) {
+                $html_part = &$structure->parts[$html_part];
+                $html_part->filename = rcube_label('htmlmessage');
+                $html_part->mimetype = 'text/html';
+
+                $this->attachments[] = $html_part;
+            }
         }
-        // part text/[plain|html] OR message/delivery-status
-        else if (($primary_type == 'text' && ($secondary_type == 'plain' || $secondary_type == 'html') && $mail_part->disposition != 'attachment') ||
-                 ($primary_type == 'message' && ($secondary_type == 'delivery-status' || $secondary_type == 'disposition-notification'))) {
-
-          // add text part if we're not in alternative mode or if it matches the prefs
-          if (!$this->parse_alternative ||
-              ($secondary_type == 'html' && $this->opt['prefer_html']) ||
-              ($secondary_type == 'plain' && !$this->opt['prefer_html'])) {
-            $mail_part->type = 'content';
-            $this->parts[] = $mail_part;
-          }
-
-          // list as attachment as well
-          if (!empty($mail_part->filename))
-            $this->attachments[] = $mail_part;
+        // this is an ecrypted message -> create a plaintext body with the according message
+        else if ($mimetype == 'multipart/encrypted') {
+            $p = new stdClass;
+            $p->type            = 'content';
+            $p->ctype_primary   = 'text';
+            $p->ctype_secondary = 'plain';
+            $p->body            = rcube_label('encryptedmessage');
+            $p->size            = strlen($p->body);
         }
-        // part message/*
-        else if ($primary_type=='message') {
-          $this->parse_structure($mail_part, true);
-          
-          // list as attachment as well (mostly .eml)
-          if (!empty($mail_part->filename))
-            $this->attachments[] = $mail_part;
+        // message contains multiple parts
+        else if (is_array($structure->parts) && !empty($structure->parts)) {
+            // iterate over parts
+            for ($i=0; $i < count($structure->parts); $i++) {
+                $mail_part      = &$structure->parts[$i];
+                $primary_type   = $mail_part->ctype_primary;
+                $secondary_type = $mail_part->ctype_secondary;
+
+                // real content-type of message/rfc822
+                if ($mail_part->real_mimetype) {
+                    $part_orig_mimetype = $mail_part->mimetype;
+                    $part_mimetype = $mail_part->real_mimetype;
+                    list($primary_type, $secondary_type) = explode('/', $part_mimetype);
+                }
+                else
+                    $part_mimetype = $mail_part->mimetype;
+
+                // multipart/alternative
+                if ($primary_type == 'multipart') {
+                    $this->parse_structure($mail_part, true);
+
+                    // list message/rfc822 as attachment as well (mostly .eml)
+                    if ($part_orig_mimetype == 'message/rfc822' && !empty($mail_part->filename))
+                        $this->attachments[] = $mail_part;
+                }
+                // part text/[plain|html] or delivery status
+                else if ((($part_mimetype == 'text/plain' || $part_mimetype == 'text/html') && $mail_part->disposition != 'attachment') ||
+                    in_array($part_mimetype, array('message/delivery-status', 'text/rfc822-headers', 'message/disposition-notification'))
+                ) {
+                    // Allow plugins to handle also this part
+                    $plugin = $this->app->plugins->exec_hook('message_part_structure',
+                        array('object' => $this, 'structure' => $mail_part,
+                            'mimetype' => $part_mimetype, 'recursive' => true));
+
+                    if ($plugin['abort'])
+                        continue;
+
+                    if ($part_mimetype == 'text/html') {
+                        $got_html_part = true;
+                    }
+
+                    $mail_part = $plugin['structure'];
+                    list($primary_type, $secondary_type) = explode('/', $plugin['mimetype']);
+
+                    // add text part if it matches the prefs
+                    if (!$this->parse_alternative ||
+                        ($secondary_type == 'html' && $this->opt['prefer_html']) ||
+                        ($secondary_type == 'plain' && !$this->opt['prefer_html'])
+                    ) {
+                        $mail_part->type = 'content';
+                        $this->parts[] = $mail_part;
+                    }
+
+                    // list as attachment as well
+                    if (!empty($mail_part->filename))
+                        $this->attachments[] = $mail_part;
+                }
+                // part message/*
+                else if ($primary_type=='message') {
+                    $this->parse_structure($mail_part, true);
+
+                    // list as attachment as well (mostly .eml)
+                    if (!empty($mail_part->filename))
+                        $this->attachments[] = $mail_part;
+                }
+                // ignore "virtual" protocol parts
+                else if ($primary_type == 'protocol') {
+                    continue;
+                }
+                // part is Microsoft Outlook TNEF (winmail.dat)
+                else if ($part_mimetype == 'application/ms-tnef') {
+                    foreach ((array)$this->tnef_decode($mail_part) as $tpart) {
+                        $this->mime_parts[$tpart->mime_id] = $tpart;
+                        $this->attachments[] = $tpart;
+                    }
+                }
+                // part is a file/attachment
+                else if (preg_match('/^(inline|attach)/', $mail_part->disposition) ||
+                    $mail_part->headers['content-id'] ||
+                    ($mail_part->filename &&
+                        (empty($mail_part->disposition) || preg_match('/^[a-z0-9!#$&.+^_-]+$/i', $mail_part->disposition)))
+                ) {
+                    // skip apple resource forks
+                    if ($message_ctype_secondary == 'appledouble' && $secondary_type == 'applefile')
+                        continue;
+
+                    // part belongs to a related message and is linked
+                    if ($mimetype == 'multipart/related'
+                        && ($mail_part->headers['content-id'] || $mail_part->headers['content-location'])) {
+                        if ($mail_part->headers['content-id'])
+                            $mail_part->content_id = preg_replace(array('/^</', '/>$/'), '', $mail_part->headers['content-id']);
+                        if ($mail_part->headers['content-location'])
+                            $mail_part->content_location = $mail_part->headers['content-base'] . $mail_part->headers['content-location'];
+
+                        $this->inline_parts[] = $mail_part;
+                    }
+                    // attachment encapsulated within message/rfc822 part needs further decoding (#1486743)
+                    else if ($part_orig_mimetype == 'message/rfc822') {
+                        $this->parse_structure($mail_part, true);
+
+                        // list as attachment as well (mostly .eml)
+                        if (!empty($mail_part->filename))
+                            $this->attachments[] = $mail_part;
+                    }
+                    // is a regular attachment (content-type name regexp according to RFC4288.4.2)
+                    else if (preg_match('/^[a-z0-9!#$&.+^_-]+\/[a-z0-9!#$&.+^_-]+$/i', $part_mimetype)) {
+                        if (!$mail_part->filename)
+                            $mail_part->filename = 'Part '.$mail_part->mime_id;
+                        $this->attachments[] = $mail_part;
+                    }
+                }
+            }
+
+            // if this was a related part try to resolve references
+            if ($mimetype == 'multipart/related' && sizeof($this->inline_parts)) {
+                $a_replaces = array();
+
+                foreach ($this->inline_parts as $inline_object) {
+                    $part_url = $this->get_part_url($inline_object->mime_id);
+                    if ($inline_object->content_id)
+                        $a_replaces['cid:'.$inline_object->content_id] = $part_url;
+                    if ($inline_object->content_location) {
+                        $a_replaces[$inline_object->content_location] = $part_url;
+                    }
+                    // MS Outlook sends sometimes non-related attachments as related
+                    // In this case multipart/related message has only one text part
+                    // We'll add all such attachments to the attachments list
+                    if (!isset($got_html_part) && empty($inline_object->content_id)
+                        && !empty($inline_object->filename)
+                    ) {
+                        $this->attachments[] = $inline_object;
+                    }
+                }
+
+                // add replace array to each content part
+                // (will be applied later when part body is available)
+                foreach ($this->parts as $i => $part) {
+                    if ($part->type == 'content')
+                        $this->parts[$i]->replaces = $a_replaces;
+                }
+            }
         }
-        // ignore "virtual" protocol parts
-        else if ($primary_type == 'protocol')
-          continue;
-          
-        // part is Microsoft Outlook TNEF (winmail.dat)
-        else if ($primary_type == 'application' && $secondary_type == 'ms-tnef') {
-          foreach ((array)$this->imap->tnef_decode($mail_part, $structure->headers['uid']) as $tnef_part) {
-            $this->mime_parts[$tnef_part->mime_id] = $tnef_part;
-            $this->attachments[] = $tnef_part;
-          }
+        // message is a single part non-text
+        else if ($structure->filename) {
+            $this->attachments[] = $structure;
         }
-
-        // part is a file/attachment
-        else if (preg_match('/^(inline|attach)/', $mail_part->disposition) ||
-                 $mail_part->headers['content-id'] || (empty($mail_part->disposition) && $mail_part->filename)) {
-
-          // skip apple resource forks
-          if ($message_ctype_secondary == 'appledouble' && $secondary_type == 'applefile')
-            continue;
-
-          // part belongs to a related message and is linked
-          if ($message_ctype_secondary == 'related'
-              && preg_match('!^image/!', $mail_part->mimetype)
-              && ($mail_part->headers['content-id'] || $mail_part->headers['content-location'])) {
-            if ($mail_part->headers['content-id'])
-              $mail_part->content_id = preg_replace(array('/^</', '/>$/'), '', $mail_part->headers['content-id']);
-            if ($mail_part->headers['content-location'])
-              $mail_part->content_location = $mail_part->headers['content-base'] . $mail_part->headers['content-location'];
-              
-            $this->inline_parts[] = $mail_part;
-          }
-          // is a regular attachment
-          else if (preg_match('!^[a-z]+/[a-z0-9-.+]+$!i', $mail_part->mimetype)) {
-            if (!$mail_part->filename)
-              $mail_part->filename = 'Part '.$mail_part->mime_id;
-            $this->attachments[] = $mail_part;
-          }
+        // message is a single part non-text (without filename)
+        else if (preg_match('/application\//i', $mimetype)) {
+            $structure->filename = 'Part '.$structure->mime_id;
+            $this->attachments[] = $structure;
         }
-      }
-
-      // if this was a related part try to resolve references
-      if ($message_ctype_secondary == 'related' && sizeof($this->inline_parts)) {
-        $a_replaces = array();
-
-        foreach ($this->inline_parts as $inline_object) {
-          $part_url = $this->get_part_url($inline_object->mime_id);
-          if ($inline_object->content_id)
-            $a_replaces['cid:'.$inline_object->content_id] = $part_url;
-          if ($inline_object->content_location)
-            $a_replaces[$inline_object->content_location] = $part_url;
+    }
+
+
+    /**
+     * Fill aflat array with references to all parts, indexed by part numbers
+     *
+     * @param rcube_message_part $part Message body structure
+     */
+    private function get_mime_numbers(&$part)
+    {
+        if (strlen($part->mime_id))
+            $this->mime_parts[$part->mime_id] = &$part;
+
+        if (is_array($part->parts))
+            for ($i=0; $i<count($part->parts); $i++)
+                $this->get_mime_numbers($part->parts[$i]);
+    }
+
+
+    /**
+     * Decode a Microsoft Outlook TNEF part (winmail.dat)
+     *
+     * @param rcube_message_part $part Message part to decode
+     * @return array
+     */
+    function tnef_decode(&$part)
+    {
+        // @TODO: attachment may be huge, hadle it via file
+        if (!isset($part->body))
+            $part->body = $this->imap->get_message_part($this->uid, $part->mime_id, $part);
+
+        $parts = array();
+        $tnef = new tnef_decoder;
+        $tnef_arr = $tnef->decompress($part->body);
+
+        foreach ($tnef_arr as $pid => $winatt) {
+            $tpart = new rcube_message_part;
+
+            $tpart->filename        = trim($winatt['name']);
+            $tpart->encoding        = 'stream';
+            $tpart->ctype_primary   = trim(strtolower($winatt['type']));
+            $tpart->ctype_secondary = trim(strtolower($winatt['subtype']));
+            $tpart->mimetype        = $tpart->ctype_primary . '/' . $tpart->ctype_secondary;
+            $tpart->mime_id         = 'winmail.' . $part->mime_id . '.' . $pid;
+            $tpart->size            = $winatt['size'];
+            $tpart->body            = $winatt['stream'];
+
+            $parts[] = $tpart;
+            unset($tnef_arr[$pid]);
         }
 
-        // add replace array to each content part
-        // (will be applied later when part body is available)
-        foreach ($this->parts as $i => $part) {
-          if ($part->type == 'content')
-            $this->parts[$i]->replaces = $a_replaces;
+        return $parts;
+    }
+
+
+    /**
+     * Parse message body for UUencoded attachments bodies
+     *
+     * @param rcube_message_part $part Message part to decode
+     * @return array
+     */
+    function uu_decode(&$part)
+    {
+        // @TODO: messages may be huge, hadle body via file
+        if (!isset($part->body))
+            $part->body = $this->imap->get_message_part($this->uid, $part->mime_id, $part);
+
+        $parts = array();
+        // FIXME: line length is max.65?
+        $uu_regexp = '/begin [0-7]{3,4} ([^\n]+)\n(([\x21-\x7E]{0,65}\n)+)`\nend/s';
+
+        if (preg_match_all($uu_regexp, $part->body, $matches, PREG_SET_ORDER)) {
+            // remove attachments bodies from the message body
+            $part->body = preg_replace($uu_regexp, '', $part->body);
+            // update message content-type
+            $part->ctype_primary   = 'multipart';
+            $part->ctype_secondary = 'mixed';
+            $part->mimetype        = $part->ctype_primary . '/' . $part->ctype_secondary;
+
+            // add attachments to the structure
+            foreach ($matches as $pid => $att) {
+                $uupart = new rcube_message_part;
+
+                $uupart->filename = trim($att[1]);
+                $uupart->encoding = 'stream';
+                $uupart->body     = convert_uudecode($att[2]);
+                $uupart->size     = strlen($uupart->body);
+                $uupart->mime_id  = 'uu.' . $part->mime_id . '.' . $pid;
+
+                $ctype = rc_mime_content_type($uupart->body, $uupart->filename, 'application/octet-stream', true);
+                $uupart->mimetype = $ctype;
+                list($uupart->ctype_primary, $uupart->ctype_secondary) = explode('/', $ctype);
+
+                $parts[] = $uupart;
+                unset($matches[$pid]);
+            }
         }
-      }
+
+        return $parts;
     }
 
-    // message is single part non-text
-    else if ($structure->filename) {
-      $this->attachments[] = $structure;
+
+    /**
+     * Interpret a format=flowed message body according to RFC 2646
+     *
+     * @param string  $text Raw body formatted as flowed text
+     * @return string Interpreted text with unwrapped lines and stuffed space removed
+     */
+    public static function unfold_flowed($text)
+    {
+        $text = preg_split('/\r?\n/', $text);
+        $last = -1;
+        $q_level = 0;
+
+        foreach ($text as $idx => $line) {
+            if ($line[0] == '>' && preg_match('/^(>+\s*)/', $line, $regs)) {
+                $q = strlen(str_replace(' ', '', $regs[0]));
+                $line = substr($line, strlen($regs[0]));
+
+                if ($q == $q_level && $line
+                    && isset($text[$last])
+                    && $text[$last][strlen($text[$last])-1] == ' '
+                ) {
+                    $text[$last] .= $line;
+                    unset($text[$idx]);
+                }
+                else {
+                    $last = $idx;
+                }
+            }
+            else {
+                $q = 0;
+                if ($line == '-- ') {
+                    $last = $idx;
+                }
+                else {
+                    // remove space-stuffing
+                    $line = preg_replace('/^\s/', '', $line);
+
+                    if (isset($text[$last]) && $line
+                        && $text[$last] != '-- '
+                        && $text[$last][strlen($text[$last])-1] == ' '
+                    ) {
+                        $text[$last] .= $line;
+                        unset($text[$idx]);
+                    }
+                    else {
+                        $text[$idx] = $line;
+                        $last = $idx;
+                    }
+                }
+            }
+            $q_level = $q;
+        }
+
+        return implode("\r\n", $text);
     }
-  }
 
 
-  /**
-   * Fill aflat array with references to all parts, indexed by part numbers
-   *
-   * @param object rcube_message_part Message body structure
-   */
-  private function get_mime_numbers(&$part)
-  {
-    if (strlen($part->mime_id))
-      $this->mime_parts[$part->mime_id] = &$part;
-      
-    if (is_array($part->parts))
-      for ($i=0; $i<count($part->parts); $i++)
-        $this->get_mime_numbers($part->parts[$i]);
-  }
+    /**
+     * Wrap the given text to comply with RFC 2646
+     *
+     * @param string $text Text to wrap
+     * @param int $length Length
+     * @return string Wrapped text
+     */
+    public static function format_flowed($text, $length = 72)
+    {
+        $text = preg_split('/\r?\n/', $text);
+
+        foreach ($text as $idx => $line) {
+            if ($line != '-- ') {
+                if ($line[0] == '>' && preg_match('/^(>+)/', $line, $regs)) {
+                    $prefix = $regs[0];
+                    $level = strlen($prefix);
+                    $line  = rtrim(substr($line, $level));
+                    $line  = $prefix . rc_wordwrap($line, $length - $level - 2, " \r\n$prefix ");
+                }
+                else if ($line) {
+                    $line = ' ' . rc_wordwrap(rtrim($line), $length - 2, " \r\n ");
+                }
+
+                $text[$idx] = $line;
+            }
+        }
 
+        return implode("\r\n", $text);
+    }
 
 }
-
diff --git a/program/include/rcube_mime_struct.php b/program/include/rcube_mime_struct.php
new file mode 100644 (file)
index 0000000..e74acc0
--- /dev/null
@@ -0,0 +1,214 @@
+<?php
+
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_mime_struct.php                                 |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Provide functions for handling mime messages structure              |
+ |                                                                       |
+ |   Based on Iloha MIME Library. See http://ilohamail.org/ for details  |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
+ | Author: Ryo Chijiiwa <Ryo@IlohaMail.org>                              |
+ +-----------------------------------------------------------------------+
+
+ $Id$
+
+*/
+
+/**
+ * Helper class to process IMAP's BODYSTRUCTURE string
+ *
+ * @package    Mail
+ * @author     Aleksander Machniak <alec@alec.pl>
+ */
+class rcube_mime_struct
+{
+    private $structure;
+
+
+    function __construct($str=null)
+    {
+        if ($str)
+            $this->structure = $this->parseStructure($str);
+    }
+
+    /*
+     * Parses IMAP's BODYSTRUCTURE string into array
+    */
+    function parseStructure($str)
+    {
+        $line = substr($str, 1, strlen($str) - 2);
+        $line = str_replace(')(', ') (', $line);
+
+           $struct = self::parseBSString($line);
+       if (!is_array($struct[0]) && (strcasecmp($struct[0], 'message') == 0)
+                   && (strcasecmp($struct[1], 'rfc822') == 0)) {
+                   $struct = array($struct);
+           }
+
+        return $struct;
+    }
+
+    /*
+     * Parses IMAP's BODYSTRUCTURE string into array and loads it into class internal variable
+    */
+    function loadStructure($str)
+    {
+        if (empty($str))
+            return true;
+
+        $this->structure = $this->parseStructure($str);
+        return (!empty($this->structure));
+    }
+
+    function getPartType($part)
+    {
+           $part_a = $this->getPartArray($this->structure, $part);
+           if (!empty($part_a)) {
+                   if (is_array($part_a[0]))
+                return 'multipart';
+                   else if ($part_a[0])
+                return $part_a[0];
+           }
+        
+        return 'other';
+    }
+
+    function getPartEncoding($part)
+    {
+           $part_a = $this->getPartArray($this->structure, $part);
+           if ($part_a) {
+                   if (!is_array($part_a[0]))
+                return $part_a[5];
+           }
+        
+        return '';
+    }
+
+    function getPartCharset($part)
+    {
+           $part_a = $this->getPartArray($this->structure, $part);
+           if ($part_a) {
+                   if (is_array($part_a[0]))
+                return '';
+                   else {
+                           if (is_array($part_a[2])) {
+                                   $name = '';
+                                   while (list($key, $val) = each($part_a[2]))
+                        if (strcasecmp($val, 'charset') == 0)
+                            return $part_a[2][$key+1];
+                           }
+                   }
+           }
+        
+        return '';
+    }
+
+    function getPartArray($a, $part)
+    {
+           if (!is_array($a)) {
+            return false;
+        }
+           if (strpos($part, '.') > 0) {
+                   $original_part = $part;
+                   $pos = strpos($part, '.');
+                   $rest = substr($original_part, $pos+1);
+                   $part = substr($original_part, 0, $pos);
+                   if ((strcasecmp($a[0], 'message') == 0) && (strcasecmp($a[1], 'rfc822') == 0)) {
+                           $a = $a[8];
+                   }
+                   return self::getPartArray($a[$part-1], $rest);
+           }
+        else if ($part>0) {
+                   if (!is_array($a[0]) && (strcasecmp($a[0], 'message') == 0)
+                && (strcasecmp($a[1], 'rfc822') == 0)) {
+                           $a = $a[8];
+                   }
+                   if (is_array($a[$part-1]))
+                return $a[$part-1];
+                   else
+                return $a;
+           }
+        else if (($part==0) || (empty($part))) {
+                   return $a;
+           }
+    }
+
+    private function closingParenPos($str, $start)
+    {
+        $level = 0;
+        $len = strlen($str);
+        $in_quote = 0;
+
+        for ($i=$start; $i<$len; $i++) {
+           if ($str[$i] == '"' && $str[$i-1] != "\\") {
+                       $in_quote = ($in_quote + 1) % 2;
+           }
+            if (!$in_quote) {
+                   if ($str[$i] == '(')
+                    $level++;
+                   else if (($level > 0) && ($str[$i] == ')'))
+                    $level--;
+                   else if (($level == 0) && ($str[$i] == ')'))
+                    return $i;
+           }
+        }
+    }
+
+    /*
+     * Parses IMAP's BODYSTRUCTURE string into array
+    */
+    private function parseBSString($str)
+    {  
+        $id = 0;
+        $a = array();
+        $len = strlen($str);
+        $in_quote = 0;
+
+        for ($i=0; $i<$len; $i++) {
+            if ($str[$i] == '"') {
+                   $in_quote = ($in_quote + 1) % 2;
+            } else if (!$in_quote) {
+                // space means new element
+                if ($str[$i] == ' ') {
+                    $id++;
+                    // skip additional spaces
+                    while ($str[$i+1] == ' ')
+                        $i++;
+                // new part
+                } else if ($str[$i] == '(') {
+                    $i++;
+                    $endPos = self::closingParenPos($str, $i);
+                    $partLen = $endPos - $i;
+                    if ($partLen < 0)
+                        break;
+                    $part = substr($str, $i, $partLen);
+                    $a[$id] = self::parseBSString($part); // send part string
+                    $i = $endPos;
+                } else
+                           $a[$id] .= $str[$i]; //add to current element in array
+            } else if ($in_quote) {
+                if ($str[$i] == "\\") {
+                           $i++; // escape backslashes
+                           if ($str[$i] == '"' || $str[$i] == "\\")
+                               $a[$id] .= $str[$i];
+                }
+                else
+                           $a[$id] .= $str[$i]; //add to current element in array
+            }
+        }
+        
+        reset($a);
+        return $a;
+    }
+
+
+}
index ed30e8f175db9ecb36facf1c88b30c63edcbc230..a75e9276f22e68f7465aedbc90ddd5113d239714 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_plugin.php                                      |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2008-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2008-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: $
+ $Id: rcube_plugin.php 4363 2010-12-22 19:17:47Z alec $
 
 */
 
 /**
  * Plugin interface class
  *
- * @package Core
+ * @package PluginAPI
  */
 abstract class rcube_plugin
 {
+  /**
+   * Class name of the plugin instance
+   *
+   * @var string
+   */
   public $ID;
+
+  /**
+   * Instance of Plugin API
+   *
+   * @var rcube_plugin_api
+   */
   public $api;
+
+  /**
+   * Regular expression defining task(s) to bind with 
+   *
+   * @var string
+   */
   public $task;
+
+  /**
+   * Disables plugin in AJAX requests
+   *
+   * @var boolean
+   */
+  public $noajax = false;
+
+  /**
+   * Disables plugin in framed mode
+   *
+   * @var boolean
+   */
+  public $noframe = false;
+
   protected $home;
   protected $urlbase;
+  private $mytask;
+
 
   /**
    * Default constructor.
+   *
+   * @param rcube_plugin_api $api Plugin API
    */
   public function __construct($api)
   {
     $this->ID = get_class($this);
     $this->api = $api;
-    $this->home = $api->dir . DIRECTORY_SEPARATOR . $this->ID;
+    $this->home = $api->dir . $this->ID;
     $this->urlbase = $api->url . $this->ID . '/';
   }
   
@@ -52,15 +88,17 @@ abstract class rcube_plugin
    * Load local config file from plugins directory.
    * The loaded values are patched over the global configuration.
    *
-   * @param string Config file name relative to the plugin's folder
+   * @param string $fname Config file name relative to the plugin's folder
    * @return boolean True on success, false on failure
    */
   public function load_config($fname = 'config.inc.php')
   {
     $fpath = $this->home.'/'.$fname;
     $rcmail = rcmail::get_instance();
-    if (!$rcmail->config->load_from_file($fpath)) {
-      raise_error(array('code' => 527, 'type' => 'php', 'message' => "Failed to load config from $fpath"), true, false);
+    if (is_file($fpath) && !$rcmail->config->load_from_file($fpath)) {
+      raise_error(array('code' => 527, 'type' => 'php',
+        'file' => __FILE__, 'line' => __LINE__,
+        'message' => "Failed to load config from $fpath"), true, false);
       return false;
     }
     
@@ -70,8 +108,8 @@ abstract class rcube_plugin
   /**
    * Register a callback function for a specific (server-side) hook
    *
-   * @param string Hook name
-   * @param mixed Callback function as string or array with object reference and method name
+   * @param string $hook Hook name
+   * @param mixed  $callback Callback function as string or array with object reference and method name
    */
   public function add_hook($hook, $callback)
   {
@@ -81,8 +119,8 @@ abstract class rcube_plugin
   /**
    * Load localized texts from the plugins dir
    *
-   * @param string Directory to search in
-   * @param mixed Make texts also available on the client (array with list or true for all)
+   * @param string $dir Directory to search in
+   * @param mixed  $add2client Make texts also available on the client (array with list or true for all)
    */
   public function add_texts($dir, $add2client = false)
   {
@@ -91,12 +129,17 @@ abstract class rcube_plugin
     $lang = $_SESSION['language'];
     $locdir = slashify(realpath(slashify($this->home) . $dir));
     $texts = array();
-    
+
+    // use buffering to handle empty lines/spaces after closing PHP tag
+    ob_start();
+
     foreach (array('en_US', $lang) as $lng) {
       @include($locdir . $lng . '.inc');
       $texts = (array)$labels + (array)$messages + (array)$texts;
     }
 
+    ob_end_clean();
+
     // prepend domain to text keys and add to the application texts repository
     if (!empty($texts)) {
       $add = array();
@@ -117,6 +160,7 @@ abstract class rcube_plugin
   /**
    * Wrapper for rcmail::gettext() adding the plugin ID as domain
    *
+   * @param string $p Message identifier
    * @return string Localized text
    * @see rcmail::gettext()
    */
@@ -128,19 +172,12 @@ abstract class rcube_plugin
   /**
    * Register this plugin to be responsible for a specific task
    *
-   * @param string Task name (only characters [a-z0-9_.-] are allowed)
+   * @param string $task Task name (only characters [a-z0-9_.-] are allowed)
    */
   public function register_task($task)
   {
-    if ($task != asciiwords($task)) {
-      raise_error(array('code' => 526, 'type' => 'php', 'message' => "Invalid task name: $task. Only characters [a-z0-9_.-] are allowed"), true, false);
-    }
-    else if (in_array(rcmail::$main_tasks, $task)) {
-      raise_error(array('code' => 526, 'type' => 'php', 'message' => "Cannot register taks $task; already taken by another plugin or the application itself"), true, false);
-    }
-    else {
-      rcmail::$main_tasks[] = $task;
-    }
+    if ($this->api->register_task($task, $this->ID))
+      $this->mytask = $task;
   }
 
   /**
@@ -148,12 +185,12 @@ abstract class rcube_plugin
     *
     * The callback will be executed upon a request like /?_task=mail&_action=plugin.myaction
     *
-    * @param string Action name (should be unique)
-    * @param mixed Callback function as string or array with object reference and method name
+    * @param string $action  Action name (should be unique)
+    * @param mixed $callback Callback function as string or array with object reference and method name
    */
   public function register_action($action, $callback)
   {
-    $this->api->register_action($action, $this->ID, $callback);
+    $this->api->register_action($action, $this->ID, $callback, $this->mytask);
   }
 
   /**
@@ -162,8 +199,8 @@ abstract class rcube_plugin
    * When parsing a template for display, tags like <roundcube:object name="plugin.myobject" />
    * will be replaced by the return value if the registered callback function.
    *
-   * @param string Object name (should be unique and start with 'plugin.')
-   * @param mixed Callback function as string or array with object reference and method name
+   * @param string $name Object name (should be unique and start with 'plugin.')
+   * @param mixed  $callback Callback function as string or array with object reference and method name
    */
   public function register_handler($name, $callback)
   {
@@ -173,7 +210,7 @@ abstract class rcube_plugin
   /**
    * Make this javascipt file available on the client
    *
-   * @param string File path; absolute or relative to the plugin directory
+   * @param string $fn File path; absolute or relative to the plugin directory
    */
   public function include_script($fn)
   {
@@ -183,7 +220,7 @@ abstract class rcube_plugin
   /**
    * Make this stylesheet available on the client
    *
-   * @param string File path; absolute or relative to the plugin directory
+   * @param string $fn File path; absolute or relative to the plugin directory
    */
   public function include_stylesheet($fn)
   {
@@ -193,8 +230,8 @@ abstract class rcube_plugin
   /**
    * Append a button to a certain container
    *
-   * @param array Hash array with named parameters (as used in skin templates)
-   * @param string Container name where the buttons should be added to
+   * @param array $p Hash array with named parameters (as used in skin templates)
+   * @param string $container Container name where the buttons should be added to
    * @see rcube_remplate::button()
    */
   public function add_button($p, $container)
@@ -213,7 +250,7 @@ abstract class rcube_plugin
    * Generate an absolute URL to the given resource within the current
    * plugin directory
    *
-   * @param string The file name
+   * @param string $fn The file name
    * @return string Absolute URL to the given resource
    */
   public function url($fn)
@@ -223,6 +260,8 @@ abstract class rcube_plugin
 
   /**
    * Make the given file name link into the plugin directory
+   *
+   * @param string $fn Filename
    */
   private function resource_url($fn)
   {
@@ -240,7 +279,7 @@ abstract class rcube_plugin
    */
   protected function local_skin_path()
   {
-      $skin_path = 'skins/'.$this->api->output->config['skin'];
+      $skin_path = 'skins/'.$this->api->config->get('skin');
       if (!is_dir(realpath(slashify($this->home) . $skin_path)))
         $skin_path = 'skins/default';
     return $skin_path;
@@ -248,6 +287,9 @@ abstract class rcube_plugin
 
   /**
    * Callback function for array_map
+   *
+   * @param string $key Array key.
+   * @return string
    */
   private function label_map_callback($key)
   {
index 75f1cc4784ac9d0e84c06a2c059fb287ced3eeb2..7eec2dc1434ce27f45063c2b207af6cd7a163b17 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_plugin_api.php                                  |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2008-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2008-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: $
+ $Id: rcube_plugin_api.php 4154 2010-10-29 08:42:28Z alec $
 
 */
 
 /**
  * The plugin loader and global API
  *
- * @package Core
+ * @package PluginAPI
  */
 class rcube_plugin_api
 {
@@ -31,21 +31,52 @@ class rcube_plugin_api
   public $dir;
   public $url = 'plugins/';
   public $output;
+  public $config;
   
   public $handlers = array();
   private $plugins = array();
+  private $tasks = array();
   private $actions = array();
   private $actionmap = array();
   private $objectsmap = array();
   private $template_contents = array();
-  
   private $required_plugins = array('filesystem_attachments');
   private $active_hook = false;
 
+  // Deprecated names of hooks, will be removed after 0.5-stable release
+  private $deprecated_hooks = array(
+    'create_user'       => 'user_create',
+    'kill_session'      => 'session_destroy',
+    'upload_attachment' => 'attachment_upload',
+    'save_attachment'   => 'attachment_save',
+    'get_attachment'    => 'attachment_get',
+    'cleanup_attachments' => 'attachments_cleanup',
+    'display_attachment' => 'attachment_display',
+    'remove_attachment' => 'attachment_delete',
+    'outgoing_message_headers' => 'message_outgoing_headers',
+    'outgoing_message_body' => 'message_outgoing_body',
+    'address_sources'   => 'addressbooks_list',
+    'get_address_book'  => 'addressbook_get',
+    'create_contact'    => 'contact_create',
+    'save_contact'      => 'contact_update',
+    'contact_save'      => 'contact_update',
+    'delete_contact'    => 'contact_delete',
+    'manage_folders'    => 'folders_list',
+    'list_mailboxes'    => 'mailboxes_list',
+    'save_preferences'  => 'preferences_save',
+    'user_preferences'  => 'preferences_list',
+    'list_prefs_sections' => 'preferences_sections_list',
+    'list_identities'   => 'identities_list',
+    'create_identity'   => 'identity_create',
+    'delete_identity'   => 'identity_delete',
+    'save_identity'     => 'identity_update',
+    'identity_save'     => 'identity_update',
+  );
+
   /**
    * This implements the 'singleton' design pattern
    *
-   * @return object rcube_plugin_api The one and only instance if this class
+   * @return rcube_plugin_api The one and only instance if this class
    */
   static function get_instance()
   {
@@ -69,38 +100,50 @@ class rcube_plugin_api
   /**
    * Load and init all enabled plugins
    *
-   * This has to be done after rcmail::load_gui() or rcmail::init_json()
+   * This has to be done after rcmail::load_gui() or rcmail::json_init()
    * was called because plugins need to have access to rcmail->output
    */
   public function init()
   {
     $rcmail = rcmail::get_instance();
     $this->output = $rcmail->output;
-    
+    $this->config = $rcmail->config;
+
     $plugins_dir = dir($this->dir);
+    $plugins_dir = unslashify($plugins_dir->path);
     $plugins_enabled = (array)$rcmail->config->get('plugins', array());
-    
+
     foreach ($plugins_enabled as $plugin_name) {
-      $fn = $plugins_dir->path . DIRECTORY_SEPARATOR . $plugin_name . DIRECTORY_SEPARATOR . $plugin_name . '.php';
-      
+      $fn = $plugins_dir . DIRECTORY_SEPARATOR . $plugin_name . DIRECTORY_SEPARATOR . $plugin_name . '.php';
+
       if (file_exists($fn)) {
         include($fn);
-        
+
         // instantiate class if exists
         if (class_exists($plugin_name, false)) {
           $plugin = new $plugin_name($this);
-          // check inheritance and task specification
-          if (is_subclass_of($plugin, 'rcube_plugin') && (!$plugin->task || preg_match('/('.$plugin->task.')/i', $rcmail->task))) {
-            $plugin->init();
-            $this->plugins[] = $plugin;
+          // check inheritance...
+          if (is_subclass_of($plugin, 'rcube_plugin')) {
+            // ... task, request type and framed mode
+            if ((!$plugin->task || preg_match('/^('.$plugin->task.')$/i', $rcmail->task))
+                && (!$plugin->noajax || is_a($this->output, 'rcube_template'))
+                && (!$plugin->noframe || empty($_REQUEST['_framed']))
+            ) {
+              $plugin->init();
+              $this->plugins[] = $plugin;
+            }
           }
         }
         else {
-          raise_error(array('code' => 520, 'type' => 'php', 'message' => "No plugin class $plugin_name found in $fn"), true, false);
+          raise_error(array('code' => 520, 'type' => 'php',
+           'file' => __FILE__, 'line' => __LINE__,
+           'message' => "No plugin class $plugin_name found in $fn"), true, false);
         }
       }
       else {
-        raise_error(array('code' => 520, 'type' => 'php', 'message' => "Failed to load plugin file $fn"), true, false);
+        raise_error(array('code' => 520, 'type' => 'php',
+         'file' => __FILE__, 'line' => __LINE__,
+         'message' => "Failed to load plugin file $fn"), true, false);
       }
     }
     
@@ -116,7 +159,8 @@ class rcube_plugin_api
       
       // load required core plugin if no derivate was found
       if (!$loaded) {
-        $fn = $plugins_dir->path . DIRECTORY_SEPARATOR . $plugin_name . DIRECTORY_SEPARATOR . $plugin_name . '.php';
+        $fn = $plugins_dir . DIRECTORY_SEPARATOR . $plugin_name . DIRECTORY_SEPARATOR . $plugin_name . '.php';
+
         if (file_exists($fn)) {
           include_once($fn);
           
@@ -136,7 +180,9 @@ class rcube_plugin_api
       
       // trigger fatal error if still not loaded
       if (!$loaded) {
-        raise_error(array('code' => 520, 'type' => 'php', 'message' => "Requried plugin $plugin_name was not loaded"), true, true);
+        raise_error(array('code' => 520, 'type' => 'php',
+         'file' => __FILE__, 'line' => __LINE__,
+         'message' => "Requried plugin $plugin_name was not loaded"), true, true);
       }
     }
 
@@ -144,30 +190,30 @@ class rcube_plugin_api
     $this->register_hook('template_container', array($this, 'template_container_hook'));
     
     // maybe also register a shudown function which triggers shutdown functions of all plugin objects
-    
-    
-    // call imap_init right now
-    // (should actually be done in rcmail::imap_init() but plugins are not initialized then)
-    if ($rcmail->imap) {
-      $hook = $this->exec_hook('imap_init', array('fetch_headers' => $rcmail->imap->fetch_add_headers));
-      if ($hook['fetch_headers'])
-        $rcmail->imap->fetch_add_headers = $hook['fetch_headers'];
-    }
   }
   
   
   /**
    * Allows a plugin object to register a callback for a certain hook
    *
-   * @param string Hook name
-   * @param mixed String with global function name or array($obj, 'methodname')
+   * @param string $hook Hook name
+   * @param mixed  $callback String with global function name or array($obj, 'methodname')
    */
   public function register_hook($hook, $callback)
   {
-    if (is_callable($callback))
+    if (is_callable($callback)) {
+      if (isset($this->deprecated_hooks[$hook])) {
+        raise_error(array('code' => 522, 'type' => 'php',
+          'file' => __FILE__, 'line' => __LINE__,
+          'message' => "Deprecated hook name. ".$hook.' -> '.$this->deprecated_hooks[$hook]), true, false);
+        $hook = $this->deprecated_hooks[$hook];
+      }
       $this->handlers[$hook][] = $callback;
+    }
     else
-      raise_error(array('code' => 521, 'type' => 'php', 'message' => "Invalid callback function for $hook"), true, false);
+      raise_error(array('code' => 521, 'type' => 'php',
+        'file' => __FILE__, 'line' => __LINE__,
+        'message' => "Invalid callback function for $hook"), true, false);
   }
   
   
@@ -175,12 +221,15 @@ class rcube_plugin_api
    * Triggers a plugin hook.
    * This is called from the application and executes all registered handlers
    *
-   * @param string Hook name
-   * @param array Named arguments (key->value pairs)
+   * @param string $hook Hook name
+   * @param array $args Named arguments (key->value pairs)
    * @return array The (probably) altered hook arguments
    */
   public function exec_hook($hook, $args = array())
   {
+    if (!is_array($args))
+      $args = array('arg' => $args);
+
     $args += array('abort' => false);
     $this->active_hook = $hook;
     
@@ -201,23 +250,28 @@ class rcube_plugin_api
   /**
    * Let a plugin register a handler for a specific request
    *
-   * @param string Action name (_task=mail&_action=plugin.foo)
-   * @param string Plugin name that registers this action
-   * @param mixed Callback: string with global function name or array($obj, 'methodname')
+   * @param string $action Action name (_task=mail&_action=plugin.foo)
+   * @param string $owner Plugin name that registers this action
+   * @param mixed  $callback Callback: string with global function name or array($obj, 'methodname')
+   * @param string $task Task name registered by this plugin
    */
-  public function register_action($action, $owner, $callback)
+  public function register_action($action, $owner, $callback, $task = null)
   {
     // check action name
-    if (strpos($action, 'plugin.') !== 0)
+    if ($task)
+      $action = $task.'.'.$action;
+    else if (strpos($action, 'plugin.') !== 0)
       $action = 'plugin.'.$action;
-    
+
     // can register action only if it's not taken or registered by myself
     if (!isset($this->actionmap[$action]) || $this->actionmap[$action] == $owner) {
       $this->actions[$action] = $callback;
       $this->actionmap[$action] = $owner;
     }
     else {
-      raise_error(array('code' => 523, 'type' => 'php', 'message' => "Cannot register action $action; already taken by another plugin"), true, false);
+      raise_error(array('code' => 523, 'type' => 'php',
+        'file' => __FILE__, 'line' => __LINE__,
+        'message' => "Cannot register action $action; already taken by another plugin"), true, false);
     }
   }
 
@@ -226,7 +280,7 @@ class rcube_plugin_api
    * This method handles requests like _task=mail&_action=plugin.foo
    * It executes the callback function that was registered with the given action.
    *
-   * @param string Action name
+   * @param string $action Action name
    */
   public function exec_action($action)
   {
@@ -234,7 +288,9 @@ class rcube_plugin_api
       call_user_func($this->actions[$action]);
     }
     else {
-      raise_error(array('code' => 524, 'type' => 'php', 'message' => "No handler found for action $action"), true, true);
+      raise_error(array('code' => 524, 'type' => 'php',
+        'file' => __FILE__, 'line' => __LINE__,
+        'message' => "No handler found for action $action"), true, true);
     }
   }
 
@@ -242,9 +298,9 @@ class rcube_plugin_api
   /**
    * Register a handler function for template objects
    *
-   * @param string Object name
-   * @param string Plugin name that registers this action
-   * @param mixed Callback: string with global function name or array($obj, 'methodname')
+   * @param string $name Object name
+   * @param string $owner Plugin name that registers this action
+   * @param mixed  $callback Callback: string with global function name or array($obj, 'methodname')
    */
   public function register_handler($name, $owner, $callback)
   {
@@ -258,16 +314,58 @@ class rcube_plugin_api
       $this->objectsmap[$name] = $owner;
     }
     else {
-      raise_error(array('code' => 525, 'type' => 'php', 'message' => "Cannot register template handler $name; already taken by another plugin"), true, false);
+      raise_error(array('code' => 525, 'type' => 'php',
+        'file' => __FILE__, 'line' => __LINE__,
+        'message' => "Cannot register template handler $name; already taken by another plugin"), true, false);
     }
   }
   
   
+  /**
+   * Register this plugin to be responsible for a specific task
+   *
+   * @param string $task Task name (only characters [a-z0-9_.-] are allowed)
+   * @param string $owner Plugin name that registers this action
+   */
+  public function register_task($task, $owner)
+  {
+    if ($task != asciiwords($task)) {
+      raise_error(array('code' => 526, 'type' => 'php',
+        'file' => __FILE__, 'line' => __LINE__,
+        'message' => "Invalid task name: $task. Only characters [a-z0-9_.-] are allowed"), true, false);
+    }
+    else if (in_array($task, rcmail::$main_tasks)) {
+      raise_error(array('code' => 526, 'type' => 'php',
+        'file' => __FILE__, 'line' => __LINE__,
+        'message' => "Cannot register taks $task; already taken by another plugin or the application itself"), true, false);
+    }
+    else {
+      $this->tasks[$task] = $owner;
+      rcmail::$main_tasks[] = $task;
+      return true;
+    }
+    
+    return false;
+  }
+
+
+  /**
+   * Checks whether the given task is registered by a plugin
+   *
+   * @param string $task Task name
+   * @return boolean True if registered, otherwise false
+   */
+  public function is_plugin_task($task)
+  {
+    return $this->tasks[$task] ? true : false;
+  }
+
+
   /**
    * Check if a plugin hook is currently processing.
    * Mainly used to prevent loops and recursion.
    *
-   * @param string Hook to check (optional)
+   * @param string $hook Hook to check (optional)
    * @return boolean True if any/the given hook is currently processed, otherwise false
    */
   public function is_processing($hook = null)
@@ -277,6 +375,8 @@ class rcube_plugin_api
   
   /**
    * Include a plugin script file in the current HTML page
+   *
+   * @param string $fn Path to script
    */
   public function include_script($fn)
   {
@@ -288,6 +388,8 @@ class rcube_plugin_api
 
   /**
    * Include a plugin stylesheet in the current HTML page
+   *
+   * @param string $fn Path to stylesheet
    */
   public function include_stylesheet($fn)
   {
@@ -299,6 +401,9 @@ class rcube_plugin_api
   
   /**
    * Save the given HTML content to be added to a template container
+   *
+   * @param string $html HTML content
+   * @param string $container Template container identifier
    */
   public function add_content($html, $container)
   {
@@ -307,6 +412,9 @@ class rcube_plugin_api
   
   /**
    * Callback for template_container hooks
+   *
+   * @param array $attrib
+   * @return array
    */
   private function template_container_hook($attrib)
   {
@@ -316,6 +424,9 @@ class rcube_plugin_api
   
   /**
    * Make the given file name link into the plugins directory
+   *
+   * @param string $fn Filename
+   * @return string 
    */
   private function resource_url($fn)
   {
index 036ebc33a9aa3fa524cd0ee009bab879dee6b5e8..e0e788139daec45febcdd27d128edad59330c137 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_result_set.php                                  |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2006-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2006-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_result_set.php 328 2006-08-30 17:41:21Z thomasb $
+ $Id: rcube_result_set.php 3989 2010-09-25 13:03:53Z alec $
 
 */
 
 
 /**
- * RoundCube result set class.
+ * Roundcube result set class.
  * Representing an address directory result set.
  *
  * @package Addressbook
  */
 class rcube_result_set
 {
-  var $count = 0;
-  var $first = 0;
-  var $current = 0;
-  var $records = array();
-  
-  function __construct($c=0, $f=0)
-  {
-    $this->count = (int)$c;
-    $this->first = (int)$f;
-  }
-  
-  function add($rec)
-  {
-    $this->records[] = $rec;
-  }
+    var $count = 0;
+    var $first = 0;
+    var $current = 0;
+    var $records = array();
+
+
+    function __construct($c=0, $f=0)
+    {
+        $this->count = (int)$c;
+        $this->first = (int)$f;
+    }
+
+    function add($rec)
+    {
+        $this->records[] = $rec;
+    }
   
-  function iterate()
-  {
-    return $this->records[$this->current++];
-  }
+    function iterate()
+    {
+        return $this->records[$this->current++];
+    }
   
-  function first()
-  {
-    $this->current = 0;
-    return $this->records[$this->current++];
-  }
+    function first()
+    {
+        $this->current = 0;
+        return $this->records[$this->current++];
+    }
   
-  // alias
-  function next()
-  {
-    return $this->iterate();
-  }
+    // alias for iterate()
+    function next()
+    {
+        return $this->iterate();
+    }
   
-  function seek($i)
-  {
-    $this->current = $i;
-  }
+    function seek($i)
+    {
+        $this->current = $i;
+    }
   
-}
\ No newline at end of file
+}
diff --git a/program/include/rcube_session.php b/program/include/rcube_session.php
new file mode 100644 (file)
index 0000000..4137b37
--- /dev/null
@@ -0,0 +1,343 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_session.php                                     |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Provide database supported session management                       |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
+ +-----------------------------------------------------------------------+
+
+ $Id: session.inc 2932 2009-09-07 12:51:21Z alec $
+
+*/
+
+/**
+ * Class to provide database supported session storage
+ *
+ * @package    Core
+ * @author     Thomas Bruederli <roundcube@gmail.com>
+ * @author     Aleksander Machniak <alec@alec.pl>
+ */
+class rcube_session
+{
+  private $db;
+  private $ip;
+  private $changed;
+  private $unsets = array();
+  private $gc_handlers = array();
+  private $start;
+  private $vars = false;
+  private $key;
+  private $keep_alive = 0;
+
+  /**
+   * Default constructor
+   */
+  public function __construct($db, $lifetime=60)
+  {
+    $this->db = $db;
+    $this->lifetime = $lifetime;
+    $this->start = microtime(true);
+
+    // set custom functions for PHP session management
+    session_set_save_handler(
+      array($this, 'open'),
+      array($this, 'close'),
+      array($this, 'read'),
+      array($this, 'write'),
+      array($this, 'destroy'),
+      array($this, 'gc'));
+  }
+
+
+  public function open($save_path, $session_name)
+  {
+    return true;
+  }
+
+
+  public function close()
+  {
+    return true;
+  }
+
+
+  // read session data
+  public function read($key)
+  {
+    $sql_result = $this->db->query(
+      sprintf("SELECT vars, ip, %s AS changed FROM %s WHERE sess_id = ?",
+        $this->db->unixtimestamp('changed'), get_table_name('session')),
+      $key);
+
+    if ($sql_arr = $this->db->fetch_assoc($sql_result)) {
+      $this->changed = $sql_arr['changed'];
+      $this->ip      = $sql_arr['ip'];
+      $this->vars    = base64_decode($sql_arr['vars']);
+      $this->key     = $key;
+
+      if (!empty($this->vars))
+        return $this->vars;
+    }
+
+    return false;
+  }
+
+
+  // save session data
+  public function write($key, $vars)
+  {
+    $ts = microtime(true);
+    $now = $this->db->fromunixtime((int)$ts);
+
+    // use internal data from read() for fast requests (up to 0.5 sec.)
+    if ($key == $this->key && $ts - $this->start < 0.5) {
+      $oldvars = $this->vars;
+    } else { // else read data again from DB
+      $oldvars = $this->read($key);
+    }
+
+    if ($oldvars !== false) {
+      $a_oldvars = $this->unserialize($oldvars);
+      if (is_array($a_oldvars)) {
+        foreach ((array)$this->unsets as $k)
+          unset($a_oldvars[$k]);
+
+        $newvars = $this->serialize(array_merge(
+          (array)$a_oldvars, (array)$this->unserialize($vars)));
+      }
+      else
+        $newvars = $vars;
+
+      if (!$this->lifetime) {
+        $timeout = 600;
+      }
+      else if ($this->keep_alive>0) {
+        $timeout = min($this->lifetime * 0.5, $this->lifetime - $this->keep_alive);
+      } else {
+        $timeout = 0;
+      }
+
+      if (!($newvars === $oldvars) || ($ts - $this->changed > $timeout)) {
+        $this->db->query(
+          sprintf("UPDATE %s SET vars = ?, changed = %s WHERE sess_id = ?",
+            get_table_name('session'), $now),
+          base64_encode($newvars), $key);
+      }
+    }
+    else {
+      $this->db->query(
+        sprintf("INSERT INTO %s (sess_id, vars, ip, created, changed) ".
+          "VALUES (?, ?, ?, %s, %s)",
+          get_table_name('session'), $now, $now),
+        $key, base64_encode($vars), (string)$_SERVER['REMOTE_ADDR']);
+    }
+
+    $this->unsets = array();
+    return true;
+  }
+
+
+  // handler for session_destroy()
+  public function destroy($key)
+  {
+    $this->db->query(
+      sprintf("DELETE FROM %s WHERE sess_id = ?", get_table_name('session')),
+      $key);
+
+    return true;
+  }
+
+
+  // garbage collecting function
+  public function gc($maxlifetime)
+  {
+    // just delete all expired sessions
+    $this->db->query(
+      sprintf("DELETE FROM %s WHERE changed < %s",
+        get_table_name('session'), $this->db->fromunixtime(time() - $maxlifetime)));
+
+    foreach ($this->gc_handlers as $fct)
+      $fct();
+
+    return true;
+  }
+
+
+  // registering additional garbage collector functions
+  public function register_gc_handler($func_name)
+  {
+    if ($func_name && !in_array($func_name, $this->gc_handlers))
+      $this->gc_handlers[] = $func_name;
+  }
+
+
+  public function regenerate_id()
+  {
+    $randval = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+
+    for ($random = '', $i=1; $i <= 32; $i++) {
+      $random .= substr($randval, mt_rand(0,(strlen($randval) - 1)), 1);
+    }
+
+    // use md5 value for id or remove capitals from string $randval
+    $random = md5($random);
+
+    // delete old session record
+    $this->destroy(session_id());
+
+    session_id($random);
+
+    $cookie   = session_get_cookie_params();
+    $lifetime = $cookie['lifetime'] ? time() + $cookie['lifetime'] : 0;
+
+    rcmail::setcookie(session_name(), $random, $lifetime);
+
+    return true;
+  }
+
+
+  // unset session variable
+  public function remove($var=NULL)
+  {
+    if (empty($var))
+      return $this->destroy(session_id());
+
+    $this->unsets[] = $var;
+    unset($_SESSION[$var]);
+
+    return true;
+  }
+
+
+  // serialize session data
+  private function serialize($vars)
+  {
+    $data = '';
+    if (is_array($vars))
+      foreach ($vars as $var=>$value)
+        $data .= $var.'|'.serialize($value);
+    else
+      $data = 'b:0;';
+    return $data;
+  }
+
+
+  // unserialize session data
+  // http://www.php.net/manual/en/function.session-decode.php#56106
+  private function unserialize($str)
+  {
+    $str = (string)$str;
+    $endptr = strlen($str);
+    $p = 0;
+
+    $serialized = '';
+    $items = 0;
+    $level = 0;
+
+    while ($p < $endptr) {
+      $q = $p;
+      while ($str[$q] != '|')
+        if (++$q >= $endptr) break 2;
+
+      if ($str[$p] == '!') {
+        $p++;
+        $has_value = false;
+      } else {
+        $has_value = true;
+      }
+
+      $name = substr($str, $p, $q - $p);
+      $q++;
+
+      $serialized .= 's:' . strlen($name) . ':"' . $name . '";';
+
+      if ($has_value) {
+        for (;;) {
+          $p = $q;
+          switch (strtolower($str[$q])) {
+            case 'n': /* null */
+            case 'b': /* boolean */
+            case 'i': /* integer */
+            case 'd': /* decimal */
+              do $q++;
+              while ( ($q < $endptr) && ($str[$q] != ';') );
+              $q++;
+              $serialized .= substr($str, $p, $q - $p);
+              if ($level == 0) break 2;
+              break;
+            case 'r': /* reference  */
+              $q+= 2;
+              for ($id = ''; ($q < $endptr) && ($str[$q] != ';'); $q++) $id .= $str[$q];
+              $q++;
+              $serialized .= 'R:' . ($id + 1) . ';'; /* increment pointer because of outer array */
+              if ($level == 0) break 2;
+              break;
+            case 's': /* string */
+              $q+=2;
+              for ($length=''; ($q < $endptr) && ($str[$q] != ':'); $q++) $length .= $str[$q];
+              $q+=2;
+              $q+= (int)$length + 2;
+              $serialized .= substr($str, $p, $q - $p);
+              if ($level == 0) break 2;
+              break;
+            case 'a': /* array */
+            case 'o': /* object */
+              do $q++;
+              while ( ($q < $endptr) && ($str[$q] != '{') );
+              $q++;
+              $level++;
+              $serialized .= substr($str, $p, $q - $p);
+              break;
+            case '}': /* end of array|object */
+              $q++;
+              $serialized .= substr($str, $p, $q - $p);
+              if (--$level == 0) break 2;
+              break;
+            default:
+              return false;
+          }
+        }
+      } else {
+        $serialized .= 'N;';
+        $q += 2;
+      }
+      $items++;
+      $p = $q;
+    }
+
+    return unserialize( 'a:' . $items . ':{' . $serialized . '}' );
+  }
+
+  public function set_keep_alive($keep_alive)
+  {
+    $this->keep_alive = $keep_alive;
+  }
+
+  public function get_keep_alive()
+  {
+    return $this->keep_alive;
+  }
+
+  // getter for private variables
+  public function get_ts()
+  {
+    return $this->changed;
+  }
+
+  // getter for private variables
+  public function get_ip()
+  {
+    return $this->ip;
+  }
+
+}
index 04885df4cd87b67278697925ca60d368804877af..f55f84c9969af63e536f7827dceb7f158ecedad4 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | rcube_shared.inc                                                      |
  |                                                                       |
- | This file is part of the RoundCube PHP suite                          |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube PHP suite                          |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | CONTENTS:                                                             |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_shared.inc 3063 2009-10-27 09:43:39Z alec $
+ $Id: rcube_shared.inc 4232 2010-11-18 10:34:10Z alec $
 
 */
 
 
 /**
- * RoundCube shared functions
+ * Roundcube shared functions
  * 
  * @package Core
  */
  */
 function send_nocacheing_headers()
 {
+  global $OUTPUT;
+
   if (headers_sent())
     return;
 
   header("Expires: ".gmdate("D, d M Y H:i:s")." GMT");
   header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
-  header("Cache-Control: private, must-revalidate, post-check=0, pre-check=0");
-  header("Pragma: no-cache");
-  
+  // Request browser to disable DNS prefetching (CVE-2010-0464)
+  header("X-DNS-Prefetch-Control: off");
+
   // We need to set the following headers to make downloads work using IE in HTTPS mode.
-  if (rcube_https_check()) {
-    header('Pragma: ');
-    header('Cache-Control: ');
+  if ($OUTPUT->browser->ie && rcube_https_check()) {
+    header('Pragma: private');
+    header("Cache-Control: private, must-revalidate");
+  } else {
+    header("Cache-Control: private, no-cache, must-revalidate, post-check=0, pre-check=0");
+    header("Pragma: no-cache");
   }
 }
 
@@ -93,7 +98,7 @@ function send_modified_header($mdate, $etag=null, $skip_check=false)
   else
     header("Last-Modified: ".gmdate("D, d M Y H:i:s", $mdate)." GMT");
   
-  header("Cache-Control: max-age=0");
+  header("Cache-Control: private, must-revalidate, max-age=0");
   header("Expires: ");
   header("Pragma: ");
   
@@ -108,97 +113,6 @@ function send_modified_header($mdate, $etag=null, $skip_check=false)
 }
 
 
-/**
- * Returns whether an $str is a reserved word for any of the version of Javascript or ECMAScript
- * @param str String to check
- * @return boolean True if $str is a reserver word, False if not
- */
-function is_js_reserved_word($str)
-{
-  return in_array($str, array(
-    // ECMASript ver 4 reserved words
-    'as','break','case','catch','class','const','continue',
-    'default','delete','do','else','export','extends','false','finally','for','function',
-    'if','import','in','instanceof','is','namespace','new','null','package','private',
-    'public','return','super','switch','this','throw','true','try','typeof','use','var',
-    'void','while','with',
-    // ECMAScript ver 4 future reserved words
-    'abstract','debugger','enum','goto','implements','interface','native','protected',
-    'synchronized','throws','transient','volatile',
-    // special meaning in some contexts
-    'get','set',
-    // were reserved in ECMAScript ver 3
-    'boolean','byte','char','double','final','float','int','long','short','static'
-  ));
-}
-
-
-/**
- * Convert a variable into a javascript object notation
- *
- * @param mixed Input value
- * @return string Serialized JSON string
- */
-function json_serialize($var)
-{
-  if (is_object($var))
-    $var = get_object_vars($var);
-
-  if (is_array($var))
-  {
-    // empty array
-    if (!sizeof($var))
-      return '[]';
-    else
-    {
-      $keys_arr = array_keys($var);
-      $is_assoc = $have_numeric = 0;
-
-      for ($i=0; $i<sizeof($keys_arr); ++$i)
-      {
-        if (is_numeric($keys_arr[$i]))
-          $have_numeric = 1;
-        if (!is_numeric($keys_arr[$i]) || $keys_arr[$i] != $i)
-          $is_assoc = 1;
-        if ($is_assoc && $have_numeric)
-          break;
-      }
-      
-      $brackets = $is_assoc ? '{}' : '[]';
-      $pairs = array();
-
-      foreach ($var as $key => $value)
-      {
-        // enclose key with quotes if it is not variable-name conform
-        if (!preg_match('/^[_a-zA-Z]{1}[_a-zA-Z0-9]*$/', $key) || is_js_reserved_word($key))
-          $key = "'$key'";
-
-        $pairs[] = sprintf("%s%s", $is_assoc ? "$key:" : '', json_serialize($value));
-      }
-
-      return $brackets{0} . implode(',', $pairs) . $brackets{1};
-    }
-  }
-  else if (!is_string($var) && strval(intval($var)) === strval($var))
-    return $var;
-  else if (is_bool($var))
-    return $var ? '1' : '0';
-  else
-    return "'".JQ($var)."'";
-}
-
-
-/**
- * Function to convert an array to a javascript array
- * Actually an alias function for json_serialize()
- * @deprecated
- */
-function array2js($arr, $type='')
-{
-  return json_serialize($arr);
-}
-
-
 /**
  * Similar function as in_array() but case-insensitive
  *
@@ -243,19 +157,22 @@ function parse_bytes($str)
 {
   if (is_numeric($str))
     return floatval($str);
-    
-  if (preg_match('/([0-9]+)([a-z])/i', $str, $regs))
+
+  if (preg_match('/([0-9\.]+)\s*([a-z]*)/i', $str, $regs))
   {
     $bytes = floatval($regs[1]);
     switch (strtolower($regs[2]))
     {
       case 'g':
+      case 'gb':
         $bytes *= 1073741824;
         break;
       case 'm':
+      case 'mb':
         $bytes *= 1048576;
         break;
       case 'k':
+      case 'kb':
         $bytes *= 1024;
         break;
     }
@@ -310,7 +227,7 @@ function make_absolute_url($path, $base_url)
   // cut base_url to the last directory
   if (strrpos($base_url, '/')>7)
   {
-    $host_url = substr($base_url, 0, strpos($base_url, '/'));
+    $host_url = substr($base_url, 0, strpos($base_url, '/', 7));
     $base_url = substr($base_url, 0, strrpos($base_url, '/'));
   }
 
@@ -345,7 +262,12 @@ function rc_wordwrap($string, $width=75, $break="\n", $cut=false)
   $para = explode($break, $string);
   $string = '';
   while (count($para)) {
-    $list = explode(' ', array_shift($para));
+    $line = array_shift($para);
+    if ($line[0] == '>') {
+      $string .= $line.$break;
+      continue;
+    }
+    $list = explode(' ', $line);
     $len = 0;
     while (count($list)) {
       $line = array_shift($list);
@@ -356,25 +278,25 @@ function rc_wordwrap($string, $width=75, $break="\n", $cut=false)
         $string .= ($len ? ' ' : '').$line;
         $len += (1 + $l);
       } else {
-       if ($l > $width) {
-         if ($cut) {
-           $start = 0;
-           while ($l) {
-             $str = mb_substr($line, $start, $width);
-             $strlen = mb_strlen($str);
-             $string .= ($len ? $break : '').$str;
-             $start += $strlen;
-             $l -= $strlen;
-             $len = $strlen;
-           }
-         } else {
-            $string .= ($len ? $break : '').$line;
-           if (count($list)) $string .= $break;
-           $len = 0;
-         }
-       } else {
+        if ($l > $width) {
+          if ($cut) {
+            $start = 0;
+            while ($l) {
+              $str = mb_substr($line, $start, $width);
+              $strlen = mb_strlen($str);
+              $string .= ($len ? $break : '').$str;
+              $start += $strlen;
+              $l -= $strlen;
+              $len = $strlen;
+            }
+          } else {
+                $string .= ($len ? $break : '').$line;
+            if (count($list)) $string .= $break;
+            $len = 0;
+          }
+        } else {
           $string .= $break.$line;
-         $len = $l;
+          $len = $l;
         }
       }
     }
@@ -485,23 +407,28 @@ function get_offset_time($offset_str, $factor=1)
 
 
 /**
- * Replace the middle part of a string with ...
- * if it is longer than the allowed length
+ * Truncate string if it is longer than the allowed length
+ * Replace the middle or the ending part of a string with a placeholder
  *
  * @param string Input string
  * @param int    Max. length
  * @param string Replace removed chars with this
+ * @param bool   Set to True if string should be truncated from the end
  * @return string Abbreviated string
  */
-function abbreviate_string($str, $maxlength, $place_holder='...')
+function abbreviate_string($str, $maxlength, $place_holder='...', $ending=false)
 {
   $length = mb_strlen($str);
-  $first_part_length = floor($maxlength/2) - mb_strlen($place_holder);
   
   if ($length > $maxlength)
   {
-    $second_starting_location = $length - $maxlength + $first_part_length + 1;
-    $str = mb_substr($str, 0, $first_part_length) . $place_holder . mb_substr($str, $second_starting_location, $length);
+    if ($ending)
+      return mb_substr($str, 0, $maxlength) . $place_holder;
+
+    $place_holder_length = mb_strlen($place_holder);
+    $first_part_length = floor(($maxlength - $place_holder_length)/2);
+    $second_starting_location = $length - $maxlength + $first_part_length + $place_holder_length;
+    $str = mb_substr($str, 0, $first_part_length) . $place_holder . mb_substr($str, $second_starting_location);
   }
 
   return $str;
@@ -510,16 +437,17 @@ function abbreviate_string($str, $maxlength, $place_holder='...')
 /**
  * A method to guess the mime_type of an attachment.
  *
- * @param string $path     Path to the file.
- * @param string $name     File name (with suffix)
- * @param string $failover Mime type supplied for failover.
+ * @param string $path      Path to the file.
+ * @param string $name      File name (with suffix)
+ * @param string $failover  Mime type supplied for failover.
+ * @param string $is_stream Set to True if $path contains file body
  *
  * @return string
  * @author Till Klampaeckel <till@php.net>
  * @see    http://de2.php.net/manual/en/ref.fileinfo.php
  * @see    http://de2.php.net/mime_content_type
  */
-function rc_mime_content_type($path, $name, $failover = 'application/octet-stream')
+function rc_mime_content_type($path, $name, $failover = 'application/octet-stream', $is_stream=false)
 {
     $mime_type = null;
     $mime_magic = rcmail::get_instance()->config->get('mime_magic');
@@ -531,25 +459,28 @@ function rc_mime_content_type($path, $name, $failover = 'application/octet-strea
         $mime_type = $mime_ext[$suffix];
     }
     // try fileinfo extension if available
-    if (!$mime_type) {
-        if (!extension_loaded('fileinfo')) {
-            @dl('fileinfo.' . PHP_SHLIB_SUFFIX);
-        }
-        if (function_exists('finfo_open')) {
-            if ($finfo = finfo_open(FILEINFO_MIME, $mime_magic)) {
+    if (!$mime_type && function_exists('finfo_open')) {
+        if ($finfo = finfo_open(FILEINFO_MIME, $mime_magic)) {
+            if ($is_stream)
+                $mime_type = finfo_buffer($finfo, $path);
+            else
                 $mime_type = finfo_file($finfo, $path);
-                finfo_close($finfo);
-            }
+            finfo_close($finfo);
         }
     }
     // try PHP's mime_content_type
-    if (!$mime_type && function_exists('mime_content_type')) {
-      $mime_type = mime_content_type($path); 
+    if (!$mime_type && !$is_stream && function_exists('mime_content_type')) {
+      $mime_type = @mime_content_type($path);
     }
     // fall back to user-submitted string
     if (!$mime_type) {
         $mime_type = $failover;
     }
+    else {
+        // Sometimes (PHP-5.3?) content-type contains charset definition,
+        // Remove it (#1487122) also "charset=binary" is useless
+        $mime_type = array_shift(preg_split('/[; ]/', $mime_type));
+    }
 
     return $mime_type;
 }
@@ -601,12 +532,12 @@ function rc_utf8_clean($input)
   
   if (!is_string($input) || $input == '')
     return $input;
-  
+
   // iconv/mbstring are much faster (especially with long strings)
-  if (function_exists('mb_convert_encoding') && ($res = mb_convert_encoding($input, 'UTF8', 'UTF8')))
+  if (function_exists('mb_convert_encoding') && ($res = mb_convert_encoding($input, 'UTF-8', 'UTF-8')) !== false)
     return $res;
 
-  if (function_exists('iconv') && ($res = iconv('UTF8', 'UTF8//IGNORE', $input)))
+  if (function_exists('iconv') && ($res = @iconv('UTF-8', 'UTF-8//IGNORE', $input)) !== false)
     return $res;
 
   $regexp = '/^('.
@@ -624,7 +555,7 @@ function rc_utf8_clean($input)
   $seq = '';
   $out = '';
 
-  for ($i = 0, $len = strlen($input)-1; $i < $len; $i++) {
+  for ($i = 0, $len = strlen($input); $i < $len; $i++) {
     $chr = $input[$i];
     $ord = ord($chr);
     // 1-byte character
@@ -654,6 +585,23 @@ function rc_utf8_clean($input)
   return $out;
 }
 
+
+/**
+ * Convert a variable into a javascript object notation
+ *
+ * @param mixed Input value
+ * @return string Serialized JSON string
+ */
+function json_serialize($input)
+{
+  $input = rc_utf8_clean($input);
+
+  // sometimes even using rc_utf8_clean() the input contains invalid UTF-8 sequences
+  // that's why we have @ here
+  return @json_encode($input);
+}
+
+
 /**
  * Explode quoted string
  * 
@@ -680,6 +628,26 @@ function rcube_explode_quoted_string($delimiter, $string)
 }
 
 
+/**
+ * Get all keys from array (recursive)
+ * 
+ * @param array Input array
+ * @return array
+ */
+function array_keys_recursive($array)
+{
+  $keys = array();
+  
+  if (!empty($array))
+    foreach ($array as $key => $child) {
+      $keys[] = $key;
+      foreach (array_keys_recursive($child) as $val)
+        $keys[] = $val;
+    }
+  return $keys;
+}
+
+
 /**
  * mbstring replacement functions
  */
@@ -717,4 +685,51 @@ if (!extension_loaded('mbstring'))
     }
 }
 
-?>
+/**
+ * intl replacement functions
+ */
+
+if (!function_exists('idn_to_utf8'))
+{
+    function idn_to_utf8($domain, $flags=null)
+    {
+        static $idn, $loaded;
+
+        if (!$loaded) {
+            $idn = new Net_IDNA2();
+            $loaded = true;
+        }
+
+        if ($idn && $domain && preg_match('/(^|@|\.)xn--/i', $domain)) {
+            try {
+                $domain = $idn->decode($domain);
+            }
+            catch (Exception $e) {
+            }
+        }
+        return $domain;
+    }
+}
+
+if (!function_exists('idn_to_ascii'))
+{
+    function idn_to_ascii($domain, $flags=null)
+    {
+        static $idn, $loaded;
+
+        if (!$loaded) {
+            $idn = new Net_IDNA2();
+            $loaded = true;
+        }
+
+        if ($idn && $domain && preg_match('/[^\x20-\x7E]/', $domain)) {
+            try {
+                $domain = $idn->encode($domain);
+            }
+            catch (Exception $e) {
+            }
+        }
+        return $domain;
+    }
+}
+
index 92534688de6856e3e38a6cd2b9780ee69a5e015f..b3db9d22955d275d4c39df9b034ba4b47c80342e 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_smtp.php                                        |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id$
+ $Id: rcube_smtp.php 4123 2010-10-22 19:16:45Z alec $
 
 */
 
 // define headers delimiter
 define('SMTP_MIME_CRLF', "\r\n");
 
-class rcube_smtp {
+/**
+ * Class to provide SMTP functionality using PEAR Net_SMTP
+ *
+ * @package    Mail
+ * @author     Thomas Bruederli <roundcube@gmail.com>
+ * @author     Aleksander Machniak <alec@alec.pl>
+ */
+class rcube_smtp
+{
 
   private $conn = null;
   private $response;
   private $error;
 
 
-  /**
-   * Object constructor
-   *
-   * @param 
-   */
-  function __construct()
-  {
-  }
-
-
   /**
    * SMTP Connection and authentication
    *
+   * @param string Server host
+   * @param string Server port
+   * @param string User name
+   * @param string Password
+   *
    * @return bool  Returns true on success, or false on error
    */
-  public function connect()
+  public function connect($host=null, $port=null, $user=null, $pass=null)
   {
     $RCMAIL = rcmail::get_instance();
   
@@ -56,16 +59,18 @@ class rcube_smtp {
   
     // let plugins alter smtp connection config
     $CONFIG = $RCMAIL->plugins->exec_hook('smtp_connect', array(
-      'smtp_server' => $RCMAIL->config->get('smtp_server'),
-      'smtp_port'   => $RCMAIL->config->get('smtp_port', 25),
-      'smtp_user'   => $RCMAIL->config->get('smtp_user'),
-      'smtp_pass'   => $RCMAIL->config->get('smtp_pass'),
+      'smtp_server'    => $host ? $host : $RCMAIL->config->get('smtp_server'),
+      'smtp_port'      => $port ? $port : $RCMAIL->config->get('smtp_port', 25),
+      'smtp_user'      => $user ? $user : $RCMAIL->config->get('smtp_user'),
+      'smtp_pass'      => $pass ? $pass : $RCMAIL->config->get('smtp_pass'),
+      'smtp_auth_cid'  => $RCMAIL->config->get('smtp_auth_cid'),
+      'smtp_auth_pw'   => $RCMAIL->config->get('smtp_auth_pw'),
       'smtp_auth_type' => $RCMAIL->config->get('smtp_auth_type'),
       'smtp_helo_host' => $RCMAIL->config->get('smtp_helo_host'),
       'smtp_timeout'   => $RCMAIL->config->get('smtp_timeout'),
     ));
 
-    $smtp_host = str_replace('%h', $_SESSION['imap_host'], $CONFIG['smtp_server']);
+    $smtp_host = rcube_parse_host($CONFIG['smtp_server']);
     // when called from Installer it's possible to have empty $smtp_host here
     if (!$smtp_host) $smtp_host = 'localhost';
     $smtp_port = is_numeric($CONFIG['smtp_port']) ? $CONFIG['smtp_port'] : 25;
@@ -82,6 +87,12 @@ class rcube_smtp {
     if (isset($smtp_host_url['host']) && isset($smtp_host_url['scheme']))
       $smtp_host = sprintf('%s://%s', $smtp_host_url['scheme'], $smtp_host_url['host']);
 
+    // remove TLS prefix and set flag for use in Net_SMTP::auth()
+    if (preg_match('#^tls://#i', $smtp_host)) {
+      $smtp_host = preg_replace('#^tls://#i', '', $smtp_host);
+      $use_tls = true;
+    }
+
     if (!empty($CONFIG['smtp_helo_host']))
       $helo_host = $CONFIG['smtp_helo_host'];
     else if (!empty($_SERVER['SERVER_NAME']))
@@ -89,15 +100,18 @@ class rcube_smtp {
     else
       $helo_host = 'localhost';
 
+    // IDNA Support
+    $smtp_host = idn_to_ascii($smtp_host);
+
     $this->conn = new Net_SMTP($smtp_host, $smtp_port, $helo_host);
 
     if($RCMAIL->config->get('smtp_debug'))
       $this->conn->setDebug(true, array($this, 'debug_handler'));
-    
+
     // try to connect to server and exit on failure
     $result = $this->conn->connect($smtp_timeout);
-    if (PEAR::isError($result))
-    {
+
+    if (PEAR::isError($result)) {
       $this->response[] = "Connection failed: ".$result->getMessage();
       $this->error = array('label' => 'smtpconnerror', 'vars' => array('code' => $this->conn->_code));
       $this->conn = null;
@@ -107,17 +121,28 @@ class rcube_smtp {
     $smtp_user = str_replace('%u', $_SESSION['username'], $CONFIG['smtp_user']);
     $smtp_pass = str_replace('%p', $RCMAIL->decrypt($_SESSION['password']), $CONFIG['smtp_pass']);
     $smtp_auth_type = empty($CONFIG['smtp_auth_type']) ? NULL : $CONFIG['smtp_auth_type'];
-      
+
+    if (!empty($CONFIG['smtp_auth_cid'])) {
+      $smtp_authz = $smtp_user;
+      $smtp_user  = $CONFIG['smtp_auth_cid'];
+      $smtp_pass  = $CONFIG['smtp_auth_pw'];
+    }
+
     // attempt to authenticate to the SMTP server
     if ($smtp_user && $smtp_pass)
     {
-      $result = $this->conn->auth($smtp_user, $smtp_pass, $smtp_auth_type);
+      // IDNA Support
+      if (strpos($smtp_user, '@'))
+        $smtp_user = idn_to_ascii($smtp_user);
+
+      $result = $this->conn->auth($smtp_user, $smtp_pass, $smtp_auth_type, $use_tls, $smtp_authz);
+
       if (PEAR::isError($result))
       {
         $this->error = array('label' => 'smtpautherror', 'vars' => array('code' => $this->conn->_code));
         $this->response[] .= 'Authentication failure: ' . $result->getMessage() . ' (Code: ' . $result->getCode() . ')';
         $this->reset();
-       $this->disconnect();
+        $this->disconnect();
         return false;
       }
     }
@@ -136,16 +161,16 @@ class rcube_smtp {
    *               each RFC822 valid. This may contain recipients not
    *               specified in the headers, for Bcc:, resending
    *               messages, etc.
-   *
    * @param mixed  The message headers to send with the mail
    *               Either as an associative array or a finally
    *               formatted string
-   *
-   * @param string The full text of the message body, including any Mime parts, etc.
+   * @param mixed  The full text of the message body, including any Mime parts
+   *               or file handle
+   * @param array  Delivery options (e.g. DSN request)
    *
    * @return bool  Returns true on success, or false on error
    */
-  public function send_mail($from, $recipients, &$headers, &$body)
+  public function send_mail($from, $recipients, &$headers, &$body, $opts=null)
   {
     if (!is_object($this->conn))
       return false;
@@ -165,7 +190,7 @@ class rcube_smtp {
     else
     {
       $this->reset();
-      $this->response[] .= "Invalid message headers";
+      $this->response[] = "Invalid message headers";
       return false;
     }
 
@@ -173,15 +198,38 @@ class rcube_smtp {
     if (!isset($from))
     {
       $this->reset();
-      $this->response[] .= "No From address has been provided";
+      $this->response[] = "No From address has been provided";
       return false;
     }
 
+    // RFC3461: Delivery Status Notification
+    if ($opts['dsn']) {
+      $exts = $this->conn->getServiceExtensions();
+
+      if (!isset($exts['DSN'])) {
+        $this->error = array('label' => 'smtpdsnerror');
+        $this->response[] = "DSN not supported";
+        return false;
+      }
+
+      $from_params      = 'RET=HDRS';
+      $recipient_params = 'NOTIFY=SUCCESS,FAILURE';
+    }
+
+    // RFC2298.3: remove envelope sender address
+    if (preg_match('/Content-Type: multipart\/report/', $text_headers)
+      && preg_match('/report-type=disposition-notification/', $text_headers)
+    ) {
+      $from = '';
+    }
+
     // set From: address
-    if (PEAR::isError($this->conn->mailFrom($from)))
+    if (PEAR::isError($this->conn->mailFrom($from, $from_params)))
     {
-      $this->error = array('label' => 'smtpfromerror', 'vars' => array('from' => $from, 'code' => $this->conn->_code));
-      $this->response[] .= "Failed to set sender '$from'";
+      $err = $this->conn->getResponse();
+      $this->error = array('label' => 'smtpfromerror', 'vars' => array(
+        'from' => $from, 'code' => $this->conn->_code, 'msg' => $err[1]));
+      $this->response[] = "Failed to set sender '$from'";
       $this->reset();
       return false;
     }
@@ -198,28 +246,43 @@ class rcube_smtp {
     // set mail recipients
     foreach ($recipients as $recipient)
     {
-      if (PEAR::isError($this->conn->rcptTo($recipient))) {
-        $this->error = array('label' => 'smtptoerror', 'vars' => array('to' => $recipient, 'code' => $this->conn->_code));
-        $this->response[] .= "Failed to add recipient '$recipient'";
+      if (PEAR::isError($this->conn->rcptTo($recipient, $recipient_params))) {
+        $err = $this->conn->getResponse();
+        $this->error = array('label' => 'smtptoerror', 'vars' => array(
+          'to' => $recipient, 'code' => $this->conn->_code, 'msg' => $err[1]));
+        $this->response[] = "Failed to add recipient '$recipient'";
         $this->reset();
         return false;
       }
     }
 
-    // Concatenate headers and body so it can be passed by reference to SMTP_CONN->data
-    // so preg_replace in SMTP_CONN->quotedata will store a reference instead of a copy. 
-    // We are still forced to make another copy here for a couple ticks so we don't really 
-    // get to save a copy in the method call.
-    $data = $text_headers . "\r\n" . $body;
+    if (is_resource($body))
+    {
+      // file handle
+      $data = $body;
+      $text_headers = preg_replace('/[\r\n]+$/', '', $text_headers);
+    } else {
+      // Concatenate headers and body so it can be passed by reference to SMTP_CONN->data
+      // so preg_replace in SMTP_CONN->quotedata will store a reference instead of a copy. 
+      // We are still forced to make another copy here for a couple ticks so we don't really 
+      // get to save a copy in the method call.
+      $data = $text_headers . "\r\n" . $body;
+
+      // unset old vars to save data and so we can pass into SMTP_CONN->data by reference.
+      unset($text_headers, $body);
+    }
 
-    // unset old vars to save data and so we can pass into SMTP_CONN->data by reference.
-    unset($text_headers, $body);
-   
     // Send the message's headers and the body as SMTP data.
-    if (PEAR::isError($result = $this->conn->data($data)))
+    if (PEAR::isError($result = $this->conn->data($data, $text_headers)))
     {
-      $this->error = array('label' => 'smtperror', 'vars' => array('msg' => $result->getMessage()));
-      $this->response[] .= "Failed to send data";
+      $err = $this->conn->getResponse();
+      if (!in_array($err[0], array(354, 250, 221)))
+        $msg = sprintf('[%d] %s', $err[0], $err[1]);
+      else
+        $msg = $result->getMessage();
+
+      $this->error = array('label' => 'smtperror', 'vars' => array('msg' => $msg));
+      $this->response[] = "Failed to send data";
       $this->reset();
       return false;
     }
@@ -371,14 +434,14 @@ class rcube_smtp {
     
     $addresses = array();
     $recipients = rcube_explode_quoted_string(',', $recipients);
-  
+
     reset($recipients);
     while (list($k, $recipient) = each($recipients))
     {
       $a = explode(" ", $recipient);
       while (list($k2, $word) = each($a))
       {
-        if ((strpos($word, "@") > 0) && (strpos($word, "\"")===false))
+        if (strpos($word, "@") > 0 && $word[strlen($word)-1] != '"')
         {
           $word = preg_replace('/^<|>$/', '', trim($word));
           if (in_array($word, $addresses)===false)
@@ -390,5 +453,3 @@ class rcube_smtp {
   }
 
 }
-
-?>
index a8f18cb137a276baf99093b5bf55c2bde415e481..c837fc3377329274144d05223db24266ec28bca4 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_sqlite.inc                                      |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -16,7 +16,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_sqlite.inc 850 2007-10-03 00:13:32Z ihug $
+ $Id: rcube_sqlite.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
 
 
 function rcube_sqlite_from_unixtime($timestamp)
-  {
-  $timestamp = trim($timestamp);
-  if (!preg_match("/^[0-9]+$/is", $timestamp))
-    $ret = strtotime($timestamp);
-  else
-    $ret = $timestamp;
+{
+    $timestamp = trim($timestamp);
+    if (!preg_match('/^[0-9]+$/is', $timestamp))
+        $ret = strtotime($timestamp);
+    else
+        $ret = $timestamp;
     
-  $ret = date("Y-m-d H:i:s", $ret);
-  rcube_sqlite_debug("FROM_UNIXTIME ($timestamp) = $ret");
-  return $ret;
-  }
+    $ret = date('Y-m-d H:i:s', $ret);
+    rcube_sqlite_debug("FROM_UNIXTIME ($timestamp) = $ret");
+    return $ret;
+}
 
 
-function rcube_sqlite_unix_timestamp($timestamp="")
-  {
-  $timestamp = trim($timestamp);
-  if (!$timestamp)
-    $ret = time();
-  else if (!preg_match("/^[0-9]+$/is", $timestamp))
-    $ret = strtotime($timestamp);
-  else
-    $ret = $timestamp;
+function rcube_sqlite_unix_timestamp($timestamp='')
+{
+    $timestamp = trim($timestamp);
+    if (!$timestamp)
+        $ret = time();
+    else if (!preg_match('/^[0-9]+$/is', $timestamp))
+        $ret = strtotime($timestamp);
+    else
+        $ret = $timestamp;
 
-  rcube_sqlite_debug("UNIX_TIMESTAMP ($timestamp) = $ret");
-  return $ret;
-  }
+    rcube_sqlite_debug("UNIX_TIMESTAMP ($timestamp) = $ret");
+    return $ret;
+}
 
 
 function rcube_sqlite_now()
-  {
-  rcube_sqlite_debug("NOW() = ".date("Y-m-d H:i:s"));
-  return date("Y-m-d H:i:s");
-  }
+{
+    rcube_sqlite_debug("NOW() = ".date("Y-m-d H:i:s"));
+    return date("Y-m-d H:i:s");
+}
 
 
 function rcube_sqlite_md5($str)
-  {
-  return md5($str);
-  }
+{
+    return md5($str);
+}
 
 
 function rcube_sqlite_debug($str)
-  {
-  //console($str);
-  }
-  
-?>
+{
+    //console($str);
+}
+
index b1c1fbbbeb6644202857d3bbda230b92fde8d78e..0a0564673ae6386127d723b2947ab4034571494d 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_string_replacer.php                             |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2009, RoundCube Dev. - Switzerland                      |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2009, Roundcube Dev. - Switzerland                      |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id:  $
+ $Id: rcube_string_replacer.php 4402 2011-01-10 14:50:48Z thomasb $
 
 */
 
@@ -35,11 +35,17 @@ class rcube_string_replacer
 
   function __construct()
   {
-    $url_chars = 'a-z0-9_\-\+\*\$\/&%=@#:;';
-    $url_chars_within = '\?\.~,!';
-
-    $this->link_pattern = "/([\w]+:\/\/|\Wwww\.)([a-z0-9\-\.]+[a-z]{2,4}([$url_chars$url_chars_within]*[$url_chars])?)/i";
-    $this->mailto_pattern = "/([a-z0-9][a-z0-9\-\.\+\_]*@([a-z0-9]([-a-z0-9]*[a-z0-9])?\\.)+[a-z]{2,5})/i";
+    // Simplified domain expression for UTF8 characters handling
+    $utf_domain = '[^?&@"\'\\/()\s\r\t\n]+\\.[a-z]{2,5}';
+    $url1 = '.:;';
+    $url2 = 'a-z0-9%=#@+?&\\/_~\\[\\]-';
+
+    $this->link_pattern = "/([\w]+:\/\/|\Wwww\.)($utf_domain([$url1]?[$url2]+)*)/i";
+    $this->mailto_pattern = "/("
+        ."[-\w!\#\$%&\'*+~\/^`|{}=]+(?:\.[-\w!\#\$%&\'*+~\/^`|{}=]+)*"  // local-part
+        ."@$utf_domain"                                                 // domain-part
+        ."(\?[$url1$url2]+)?"                                           // e.g. ?subject=test...
+        .")/i";
   }
 
   /**
@@ -76,11 +82,19 @@ class rcube_string_replacer
 
     if (preg_match('!^(http|ftp|file)s?://!', $scheme)) {
       $url = $matches[1] . $matches[2];
-      $i = $this->add(html::a(array('href' => $url, 'target' => '_blank'), Q($url)));
     }
     else if (preg_match('/^(\W)www\.$/', $matches[1], $m)) {
-      $url = 'www.' . $matches[2];
-      $i = $this->add($m[1] . html::a(array('href' => 'http://' . $url, 'target' => '_blank'), Q($url)));
+      $url        = 'www.' . $matches[2];
+      $url_prefix = 'http://';
+      $prefix     = $m[1];
+    }
+
+    if ($url) {
+      $suffix = $this->parse_url_brackets($url);
+      $i = $this->add($prefix . html::a(array(
+          'href' => $url_prefix . $url,
+          'target' => '_blank'
+        ), Q($url)) . $suffix);
     }
 
     // Return valid link for recognized schemes, otherwise, return the unmodified string for unrecognized schemes.
@@ -95,11 +109,13 @@ class rcube_string_replacer
    */
   public function mailto_callback($matches)
   {
+    $href   = $matches[1];
+    $suffix = $this->parse_url_brackets($href);
+
     $i = $this->add(html::a(array(
-        'href' => 'mailto:' . $matches[1],
-        'onclick' => "return ".JS_OBJECT_NAME.".command('compose','".JQ($matches[1])."',this)",
-      ),
-      Q($matches[1])));
+        'href' => 'mailto:' . $href,
+        'onclick' => "return ".JS_OBJECT_NAME.".command('compose','".JQ($href)."',this)",
+      ), Q($href)) . $suffix);
 
     return $i >= 0 ? $this->get_replacement($i) : '';
   }
@@ -124,4 +140,38 @@ class rcube_string_replacer
     return preg_replace_callback(self::$pattern, array($this, 'replace_callback'), $str);
   }
 
-}
\ No newline at end of file
+  /**
+   * Fixes bracket characters in URL handling
+   */
+  public static function parse_url_brackets(&$url)
+  {
+    // #1487672: special handling of square brackets,
+    // URL regexp allows [] characters in URL, for example:
+    // "http://example.com/?a[b]=c". However we need to handle
+    // properly situation when a bracket is placed at the end
+    // of the link e.g. "[http://example.com]"
+    if (preg_match('/(\\[|\\])/', $url)) {
+      $in = false;
+      for ($i=0, $len=strlen($url); $i<$len; $i++) {
+        if ($url[$i] == '[') {
+          if ($in)
+            break;
+          $in = true;
+        }
+        else if ($url[$i] == ']') {
+          if (!$in)
+            break;
+          $in = false;
+        }
+      }
+
+      if ($i<$len) {
+        $suffix = substr($url, $i);
+        $url    = substr($url, 0, $i);
+      }
+    }
+
+    return $suffix;
+  }
+
+}
index 5226f8db891ecce1e990495d5402bb1e81f17f41..201bde511e45f773da8d8f80c4eadc9c348383c5 100755 (executable)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_template.php                                    |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2006-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2006-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -16,7 +16,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id$
+ $Id: rcube_template.php 4404 2011-01-12 10:26:32Z alec $
 
  */
 
  */
 class rcube_template extends rcube_html_page
 {
-    var $app;
-    var $config;
-    var $framed = false;
-    var $pagetitle = '';
-    var $message = null;
-    var $env = array();
-    var $js_env = array();
-    var $js_commands = array();
-    var $object_handlers = array();
-
+    private $app;
+    private $config;
+    private $pagetitle = '';
+    private $message = null;
+    private $js_env = array();
+    private $js_commands = array();
+    private $object_handlers = array();
+    private $plugin_skin_path;
+
+    public $browser;
+    public $framed = false;
+    public $env = array();
     public $type = 'html';
     public $ajax_call = false;
 
+    // deprecated names of templates used before 0.5
+    private $deprecated_templates = array(
+        'contact' => 'showcontact',
+        'contactadd' => 'addcontact',
+        'contactedit' => 'editcontact',
+        'identityedit' => 'editidentity',
+        'messageprint' => 'printmessage',
+    );
+
     /**
      * Constructor
      *
@@ -56,7 +67,7 @@ class rcube_template extends rcube_html_page
         $this->app = rcmail::get_instance();
         $this->config = $this->app->config->all();
         $this->browser = new rcube_browser();
-        
+
         //$this->framed = $framed;
         $this->set_env('task', $task);
         $this->set_env('request_token', $this->app->get_request_token());
@@ -73,13 +84,14 @@ class rcube_template extends rcube_html_page
         $this->add_script($javascript, 'head_top');
         $this->add_script($javascript_foot, 'foot');
         $this->scripts_path = 'program/js/';
-        $this->include_script('jquery-1.3.min.js');
+        $this->include_script('jquery-1.4.min.js');
         $this->include_script('common.js');
         $this->include_script('app.js');
 
         // register common UI objects
         $this->add_handlers(array(
             'loginform'       => array($this, 'login_form'),
+            'preloader'       => array($this, 'preloader'),
             'username'        => array($this, 'current_username'),
             'message'         => array($this, 'message_container'),
             'charsetselector' => array($this, 'charset_selector'),
@@ -127,7 +139,7 @@ class rcube_template extends rcube_html_page
         else {
             $title = ucfirst($this->env['task']);
         }
-        
+
         return $title;
     }
 
@@ -137,13 +149,21 @@ class rcube_template extends rcube_html_page
      */
     public function set_skin($skin)
     {
-        if (!empty($skin) && is_dir('skins/'.$skin) && is_readable('skins/'.$skin))
+        $valid = false;
+
+        if (!empty($skin) && is_dir('skins/'.$skin) && is_readable('skins/'.$skin)) {
             $skin_path = 'skins/'.$skin;
-        else
+            $valid = true;
+        }
+        else {
             $skin_path = $this->config['skin_path'] ? $this->config['skin_path'] : 'skins/default';
+            $valid = !$skin;
+        }
 
         $this->app->config->set('skin_path', $skin_path);
         $this->config['skin_path'] = $skin_path;
+
+        return $valid;
     }
 
     /**
@@ -155,8 +175,7 @@ class rcube_template extends rcube_html_page
     public function template_exists($name)
     {
         $filename = $this->config['skin_path'] . '/templates/' . $name . '.html';
-
-        return (is_file($filename) && is_readable($filename));
+        return (is_file($filename) && is_readable($filename)) || ($this->deprecated_templates[$name] && $this->template_exists($this->deprecated_templates[$name]));
     }
 
     /**
@@ -216,7 +235,7 @@ class rcube_template extends rcube_html_page
         $args = func_get_args();
         if (count($args) == 1 && is_array($args[0]))
           $args = $args[0];
-        
+
         foreach ($args as $name) {
             $this->command('add_label', $name, rcube_label($name));
         }
@@ -290,7 +309,9 @@ class rcube_template extends rcube_html_page
         if ($templ != 'iframe') {
             // prevent from endless loops
             if ($exit != 'recur' && $this->app->plugins->is_processing('render_page')) {
-                raise_error(array('code' => 505, 'type' => 'php', 'message' => 'Recursion alert: ignoring output->send()'), true, false);
+                raise_error(array('code' => 505, 'type' => 'php',
+                  'file' => __FILE__, 'line' => __LINE__,
+                  'message' => 'Recursion alert: ignoring output->send()'), true, false);
                 return;
             }
             $this->parse($templ, false);
@@ -303,7 +324,7 @@ class rcube_template extends rcube_html_page
         // set output asap
         ob_flush();
         flush();
-        
+
         if ($exit) {
             exit;
         }
@@ -319,14 +340,18 @@ class rcube_template extends rcube_html_page
     public function write($template = '')
     {
         // unlock interface after iframe load
+        $unlock = preg_replace('/[^a-z0-9]/i', '', $_GET['_unlock']);
         if ($this->framed) {
-            array_unshift($this->js_commands, array('set_busy', false));
+            array_unshift($this->js_commands, array('set_busy', false, null, $unlock));
+        }
+        else if ($unlock) {
+            array_unshift($this->js_commands, array('hide_message', $unlock));
         }
         // write all env variables to client
         $js = $this->framed ? "if(window.parent) {\n" : '';
         $js .= $this->get_js_commands() . ($this->framed ? ' }' : '');
         $this->add_script($js, 'head_top');
-        
+
         // make sure all <form> tags have a valid request token
         $template = preg_replace_callback('/<form\s+([^>]+)>/Ui', array($this, 'alter_form_tag'), $template);
         $this->footer = preg_replace_callback('/<form\s+([^>]+)>/Ui', array($this, 'alter_form_tag'), $this->footer);
@@ -349,21 +374,31 @@ class rcube_template extends rcube_html_page
     {
         $skin_path = $this->config['skin_path'];
         $plugin = false;
-        
+        $this->plugin_skin_path = null;
+
         $temp = explode(".", $name, 2);
         if (count($temp) > 1) {
             $plugin = $temp[0];
             $name = $temp[1];
             $skin_dir = $plugin . '/skins/' . $this->config['skin'];
-            $skin_path = $this->app->plugins->dir . $skin_dir;
+            $skin_path = $this->plugin_skin_path = $this->app->plugins->dir . $skin_dir;
             if (!is_dir($skin_path)) {  // fallback to default skin
                 $skin_dir = $plugin . '/skins/default';
-                $skin_path = $this->app->plugins->dir . $skin_dir;
+                $skin_path = $this->plugin_skin_path = $this->app->plugins->dir . $skin_dir;
             }
         }
-        
+
         $path = "$skin_path/templates/$name.html";
 
+        if (!is_readable($path) && $this->deprecated_templates[$name]) {
+            $path = "$skin_path/templates/".$this->deprecated_templates[$name].".html";
+            if (is_readable($path))
+                raise_error(array('code' => 502, 'type' => 'php',
+                    'file' => __FILE__, 'line' => __LINE__,
+                    'message' => "Using deprecated template '".$this->deprecated_templates[$name]."' in ".$this->config['skin_path']."/templates. Please rename to '".$name."'"),
+                true, false);
+        }
+
         // read template file
         if (($templ = @file_get_contents($path)) === false) {
             raise_error(array(
@@ -375,7 +410,7 @@ class rcube_template extends rcube_html_page
                 ), true, true);
             return false;
         }
-        
+
         // replace all path references to plugins/... with the configured plugins dir
         // and /this/ to the current plugin skin directory
         if ($plugin) {
@@ -385,18 +420,18 @@ class rcube_template extends rcube_html_page
         // parse for specialtags
         $output = $this->parse_conditions($templ);
         $output = $this->parse_xml($output);
-        
+
         // trigger generic hook where plugins can put additional content to the page
         $hook = $this->app->plugins->exec_hook("render_page", array('template' => $name, 'content' => $output));
 
         // add debug console
         if ($this->config['debug_level'] & 8) {
             $this->add_footer('<div id="console" style="position:absolute;top:5px;left:5px;width:405px;padding:2px;background:white;z-index:9000;">
-                <a href="#toggle" onclick="con=document.getElementById(\'dbgconsole\');con.style.display=(con.style.display==\'none\'?\'block\':\'none\');return false">console</a>
-                <form action="/" name="debugform" style="display:inline"><textarea name="console" id="dbgconsole" rows="20" cols="40" wrap="off" style="display:none;width:400px;border:none;font-size:x-small" spellcheck="false"></textarea></form></div>'
+                <a href="#toggle" onclick="con=$(\'#dbgconsole\');con[con.is(\':visible\')?\'hide\':\'show\']();return false">console</a>
+                <textarea name="console" id="dbgconsole" rows="20" cols="40" wrap="off" style="display:none;width:400px;border:none;font-size:10px" spellcheck="false"></textarea></div>'
             );
         }
-        
+
         $output = $this->parse_with_globals($hook['content']);
         $this->write(trim($output));
         if ($exit) {
@@ -429,7 +464,7 @@ class rcube_template extends rcube_html_page
                 implode(',', $args)
             );
         }
-        
+
         return $out;
     }
 
@@ -441,7 +476,10 @@ class rcube_template extends rcube_html_page
      */
     public function abs_url($str)
     {
-        return preg_replace('/^\//', $this->config['skin_path'].'/', $str);
+        if ($str[0] == '/')
+            return $this->config['skin_path'] . $str;
+        else
+            return $str;
     }
 
 
@@ -455,7 +493,16 @@ class rcube_template extends rcube_html_page
     {
         $GLOBALS['__version'] = Q(RCMAIL_VERSION);
         $GLOBALS['__comm_path'] = Q($this->app->comm_path);
-        return preg_replace('/\$(__[a-z0-9_\-]+)/e', '$GLOBALS["\\1"]', $input);
+        return preg_replace_callback('/\$(__[a-z0-9_\-]+)/',
+           array($this, 'globals_callback'), $input);
+    }
+
+    /**
+     * Callback funtion for preg_replace_callback() in parse_with_globals()
+     */
+    private function globals_callback($matches)
+    {
+        return $GLOBALS[$matches[1]];
     }
 
     /**
@@ -479,7 +526,7 @@ class rcube_template extends rcube_html_page
      */
     private function parse_conditions($input)
     {
-        $matches = preg_split('/<roundcube:(if|elseif|else|endif)\s+([^>]+)>/is', $input, 2, PREG_SPLIT_DELIM_CAPTURE);
+        $matches = preg_split('/<roundcube:(if|elseif|else|endif)\s+([^>]+)>\n?/is', $input, 2, PREG_SPLIT_DELIM_CAPTURE);
         if ($matches && count($matches) == 4) {
             if (preg_match('/^(else|endif)$/i', $matches[1])) {
                 return $matches[0] . $this->parse_conditions($matches[3]);
@@ -487,10 +534,10 @@ class rcube_template extends rcube_html_page
             $attrib = parse_attrib_string($matches[2]);
             if (isset($attrib['condition'])) {
                 $condmet = $this->check_condition($attrib['condition']);
-                $submatches = preg_split('/<roundcube:(elseif|else|endif)\s+([^>]+)>/is', $matches[3], 2, PREG_SPLIT_DELIM_CAPTURE);
+                $submatches = preg_split('/<roundcube:(elseif|else|endif)\s+([^>]+)>\n?/is', $matches[3], 2, PREG_SPLIT_DELIM_CAPTURE);
                 if ($condmet) {
                     $result = $submatches[0];
-                    $result.= ($submatches[1] != 'endif' ? preg_replace('/.*<roundcube:endif\s+[^>]+>/Uis', '', $submatches[3], 1) : $submatches[3]);
+                    $result.= ($submatches[1] != 'endif' ? preg_replace('/.*<roundcube:endif\s+[^>]+>\n?/Uis', '', $submatches[3], 1) : $submatches[3]);
                 }
                 else {
                     $result = "<roundcube:$submatches[1] $submatches[2]>" . $submatches[3];
@@ -521,21 +568,21 @@ class rcube_template extends rcube_html_page
     {
         return eval("return (".$this->parse_expression($condition).");");
     }
-    
-    
+
+
     /**
-     *
+     * Inserts hidden field with CSRF-prevention-token into POST forms
      */
     private function alter_form_tag($matches)
     {
         $out = $matches[0];
         $attrib  = parse_attrib_string($matches[1]);
-      
+
         if (strtolower($attrib['method']) == 'post') {
             $hidden = new html_hiddenfield(array('name' => '_token', 'value' => $this->app->get_request_token()));
             $out .= "\n" . $hidden->show();
         }
-      
+
         return $out;
     }
 
@@ -544,7 +591,7 @@ class rcube_template extends rcube_html_page
      * Parses expression and replaces variables
      *
      * @param  string Expression statement
-     * @return string Expression statement
+     * @return string Expression value
      */
     private function parse_expression($expression)
     {
@@ -619,7 +666,9 @@ class rcube_template extends rcube_html_page
 
             // include a file
             case 'include':
-                $path = realpath($this->config['skin_path'].$attrib['file']);
+                if (!$this->plugin_skin_path || !is_file($path = realpath($this->plugin_skin_path . $attrib['file'])))
+                    $path = realpath(($attrib['skin_path'] ? $attrib['skin_path'] : $this->config['skin_path']).$attrib['file']);
+                
                 if (is_readable($path)) {
                     if ($this->config['skin_include_php']) {
                         $incl = $this->include_php($path);
@@ -636,7 +685,7 @@ class rcube_template extends rcube_html_page
                 $hook = $this->app->plugins->exec_hook("template_plugin_include", $attrib);
                 return $hook['content'];
                 break;
-            
+
             // define a container block
             case 'container':
                 if ($attrib['name'] && $attrib['id']) {
@@ -663,7 +712,7 @@ class rcube_template extends rcube_html_page
                     $content = call_user_func($handler, $attrib);
                 }
                 else if ($object == 'productname') {
-                    $name = !empty($this->config['product_name']) ? $this->config['product_name'] : 'RoundCube Webmail';
+                    $name = !empty($this->config['product_name']) ? $this->config['product_name'] : 'Roundcube Webmail';
                     $content = Q($name);
                 }
                 else if ($object == 'version') {
@@ -682,7 +731,7 @@ class rcube_template extends rcube_html_page
                     $title .= $this->get_pagetitle();
                     $content = Q($title);
                 }
-                
+
                 // exec plugin hooks for this template object
                 $hook = $this->app->plugins->exec_hook("template_object_$object", $attrib + array('content' => $content));
                 return $hook['content'];
@@ -691,7 +740,7 @@ class rcube_template extends rcube_html_page
             case 'exp':
                 $value = $this->parse_expression($attrib['expression']);
                 return eval("return Q($value);");
-            
+
             // return variable
             case 'var':
                 $var = explode(':', $attrib['name']);
@@ -758,7 +807,6 @@ class rcube_template extends rcube_html_page
      */
     public function button($attrib)
     {
-        static $sa_buttons = array();
         static $s_button_count = 100;
 
         // these commands can be called directly via url
@@ -775,25 +823,14 @@ class rcube_template extends rcube_html_page
         else {
             $attrib['type'] = ($attrib['image'] || $attrib['imagepas'] || $attrib['imageact']) ? 'image' : 'link';
         }
+
         $command = $attrib['command'];
 
-        // take the button from the stack
-        if ($attrib['name'] && $sa_buttons[$attrib['name']]) {
-            $attrib = $sa_buttons[$attrib['name']];
-        }
-        else if($attrib['image'] || $attrib['imageact'] || $attrib['imagepas'] || $attrib['class']) {
-            // add button to button stack
-            if (!$attrib['name']) {
-                $attrib['name'] = $command;
-            }
-            if (!$attrib['image']) {
-                $attrib['image'] = $attrib['imagepas'] ? $attrib['imagepas'] : $attrib['imageact'];
-            }
-            $sa_buttons[$attrib['name']] = $attrib;
-        }
-        else if ($command && $sa_buttons[$command]) {
-            // get saved button for this command/name
-            $attrib = $sa_buttons[$command];
+        if ($attrib['task'])
+          $command = $attrib['task'] . '.' . $command;
+
+        if (!$attrib['image']) {
+            $attrib['image'] = $attrib['imagepas'] ? $attrib['imagepas'] : $attrib['imageact'];
         }
 
         if (!$attrib['id']) {
@@ -837,6 +874,9 @@ class rcube_template extends rcube_html_page
             if (in_array($attrib['command'], rcmail::$main_tasks)) {
                 $attrib['href'] = rcmail_url(null, null, $attrib['command']);
             }
+            else if ($attrib['task'] && in_array($attrib['task'], rcmail::$main_tasks)) {
+                $attrib['href'] = rcmail_url($attrib['command'], null, $attrib['task']);
+            }
             else if (in_array($attrib['command'], $a_static_commands)) {
                 $attrib['href'] = rcmail_url($attrib['command']);
             }
@@ -849,7 +889,11 @@ class rcube_template extends rcube_html_page
         if (!$attrib['href']) {
             $attrib['href'] = '#';
         }
-        if ($command) {
+        if ($attrib['task']) {
+            if ($attrib['classact'])
+                $attrib['class'] = $attrib['classact'];
+        }
+        else if ($command && !$attrib['onclick']) {
             $attrib['onclick'] = sprintf(
                 "return %s.command('%s','%s',this)",
                 JS_OBJECT_NAME,
@@ -920,17 +964,17 @@ class rcube_template extends rcube_html_page
         $hiddenfield = new html_hiddenfield(array('name' => '_framed', 'value' => '1'));
         $hidden = $hiddenfield->show();
       }
-      
+
       if (!$content)
         $attrib['noclose'] = true;
-      
+
       return html::tag('form',
         $attrib + array('action' => "./", 'method' => "get"),
         $hidden . $content,
         array('id','class','style','name','method','action','enctype','onsubmit'));
     }
-    
-    
+
+
     /**
      * Build a form tag with a unique request token
      *
@@ -947,10 +991,10 @@ class rcube_template extends rcube_html_page
         if ($attrib['action']) {
             $hidden->add(array('name' => '_action', 'value' => $attrib['action']));
         }
-      
+
         unset($attrib['task'], $attrib['request']);
         $attrib['action'] = './';
-      
+
         // we already have a <form> tag
         if ($attrib['form'])
             return $hidden->show() . $content;
@@ -975,15 +1019,19 @@ class rcube_template extends rcube_html_page
             return $username;
         }
 
-        // get e-mail address form default identity
-        if ($sql_arr = $this->app->user->get_identity()) {
+        // Current username is an e-mail address
+        if (strpos($_SESSION['username'], '@')) {
+            $username = $_SESSION['username'];
+        }
+        // get e-mail address from default identity
+        else if ($sql_arr = $this->app->user->get_identity()) {
             $username = $sql_arr['email'];
         }
         else {
             $username = $this->app->user->get_username();
         }
 
-        return $username;
+        return idn_to_utf8($username);
     }
 
 
@@ -997,22 +1045,31 @@ class rcube_template extends rcube_html_page
     private function login_form($attrib)
     {
         $default_host = $this->config['default_host'];
+        $autocomplete = (int) $this->config['login_autocomplete'];
 
         $_SESSION['temp'] = true;
-        
+
         // save original url
         $url = get_input_value('_url', RCUBE_INPUT_POST);
         if (empty($url) && !preg_match('/_(task|action)=logout/', $_SERVER['QUERY_STRING']))
             $url = $_SERVER['QUERY_STRING'];
 
-        $input_user   = new html_inputfield(array('name' => '_user', 'id' => 'rcmloginuser') + $attrib);
-        $input_pass   = new html_passwordfield(array('name' => '_pass', 'id' => 'rcmloginpwd') + $attrib);
+        // set atocomplete attribute
+        $user_attrib = $autocomplete > 0 ? array() : array('autocomplete' => 'off');
+        $host_attrib = $autocomplete > 0 ? array() : array('autocomplete' => 'off');
+        $pass_attrib = $autocomplete > 1 ? array() : array('autocomplete' => 'off');
+
+        $input_task   = new html_hiddenfield(array('name' => '_task', 'value' => 'login'));
         $input_action = new html_hiddenfield(array('name' => '_action', 'value' => 'login'));
         $input_tzone  = new html_hiddenfield(array('name' => '_timezone', 'id' => 'rcmlogintz', 'value' => '_default_'));
         $input_url    = new html_hiddenfield(array('name' => '_url', 'id' => 'rcmloginurl', 'value' => $url));
+        $input_user   = new html_inputfield(array('name' => '_user', 'id' => 'rcmloginuser')
+            + $attrib + $user_attrib);
+        $input_pass   = new html_passwordfield(array('name' => '_pass', 'id' => 'rcmloginpwd')
+            + $attrib + $pass_attrib);
         $input_host   = null;
 
-        if (is_array($default_host)) {
+        if (is_array($default_host) && count($default_host) > 1) {
             $input_host = new html_select(array('name' => '_host', 'id' => 'rcmloginhost'));
 
             foreach ($default_host as $key => $value) {
@@ -1025,8 +1082,14 @@ class rcube_template extends rcube_html_page
                 }
             }
         }
+        else if (is_array($default_host) && ($host = array_pop($default_host))) {
+            $hide_host = true;
+            $input_host = new html_hiddenfield(array(
+                'name' => '_host', 'id' => 'rcmloginhost', 'value' => $host) + $attrib);
+        }
         else if (empty($default_host)) {
-            $input_host = new html_inputfield(array('name' => '_host', 'id' => 'rcmloginhost') + $attrib);
+            $input_host = new html_inputfield(array('name' => '_host', 'id' => 'rcmloginhost')
+                + $attrib + $host_attrib);
         }
 
         $form_name  = !empty($attrib['form']) ? $attrib['form'] : 'form';
@@ -1036,31 +1099,60 @@ class rcube_template extends rcube_html_page
         $table = new html_table(array('cols' => 2));
 
         $table->add('title', html::label('rcmloginuser', Q(rcube_label('username'))));
-        $table->add(null, $input_user->show(get_input_value('_user', RCUBE_INPUT_POST)));
+        $table->add(null, $input_user->show(get_input_value('_user', RCUBE_INPUT_GPC)));
 
         $table->add('title', html::label('rcmloginpwd', Q(rcube_label('password'))));
         $table->add(null, $input_pass->show());
 
         // add host selection row
-        if (is_object($input_host)) {
+        if (is_object($input_host) && !$hide_host) {
             $table->add('title', html::label('rcmloginhost', Q(rcube_label('server'))));
-            $table->add(null, $input_host->show(get_input_value('_host', RCUBE_INPUT_POST)));
+            $table->add(null, $input_host->show(get_input_value('_host', RCUBE_INPUT_GPC)));
         }
 
-        $out = $input_action->show();
+        $out  = $input_task->show();
+        $out .= $input_action->show();
         $out .= $input_tzone->show();
         $out .= $input_url->show();
         $out .= $table->show();
 
+        if ($hide_host) {
+            $out .= $input_host->show();
+        }
+
         // surround html output with a form tag
         if (empty($attrib['form'])) {
-            $out = $this->form_tag(array('name' => $form_name, 'method' => "post"), $out);
+            $out = $this->form_tag(array('name' => $form_name, 'method' => 'post'), $out);
         }
 
         return $out;
     }
 
 
+    /**
+     * GUI object 'preloader'
+     * Loads javascript code for images preloading
+     *
+     * @param array Named parameters
+     * @return void
+     */
+    private function preloader($attrib)
+    {
+        $images = preg_split('/[\s\t\n,]+/', $attrib['images'], -1, PREG_SPLIT_NO_EMPTY);
+        $images = array_map(array($this, 'abs_url'), $images);
+
+        if (empty($images) || $this->app->task == 'logout')
+            return;
+
+        $this->add_script('$(document).ready(function(){
+            var images = ' . json_serialize($images) .';
+            for (var i=0; i<images.length; i++) {
+                img = new Image();
+                img.src = images[i];
+            }});', 'foot');
+    }
+
+
     /**
      * GUI object 'searchform'
      * Returns code for search function
@@ -1079,9 +1171,9 @@ class rcube_template extends rcube_html_page
             $attrib['id'] = 'rcmqsearchbox';
         }
         if ($attrib['type'] == 'search' && !$this->browser->khtml) {
-          unset($attrib['type'], $attrib['results']);
+            unset($attrib['type'], $attrib['results']);
         }
-        
+
         $input_q = new html_inputfield($attrib);
         $out = $input_q->show();
 
@@ -1093,7 +1185,7 @@ class rcube_template extends rcube_html_page
                 'name' => "rcmqsearchform",
                 'onsubmit' => JS_OBJECT_NAME . ".command('search');return false;",
                 'style' => "display:inline"),
-              $out);
+                $out);
         }
 
         return $out;
@@ -1123,39 +1215,67 @@ class rcube_template extends rcube_html_page
      * @param array Named parameters for the select tag
      * @return string HTML code for the gui object
      */
-    static function charset_selector($attrib)
+    function charset_selector($attrib)
     {
         // pass the following attributes to the form class
         $field_attrib = array('name' => '_charset');
         foreach ($attrib as $attr => $value) {
-            if (in_array($attr, array('id', 'class', 'style', 'size', 'tabindex'))) {
+            if (in_array($attr, array('id', 'name', 'class', 'style', 'size', 'tabindex'))) {
                 $field_attrib[$attr] = $value;
             }
         }
-        $charsets = array(
-            'US-ASCII'     => 'ASCII (English)',
-            'EUC-JP'       => 'EUC-JP (Japanese)',
-            'EUC-KR'       => 'EUC-KR (Korean)',
-            'BIG5'         => 'BIG5 (Chinese)',
-            'GB2312'       => 'GB2312 (Chinese)',
-            'ISO-2022-JP'  => 'ISO-2022-JP (Japanese)',
-            'ISO-8859-1'   => 'ISO-8859-1 (Latin-1)',
-            'ISO-8859-2'   => 'ISO-8895-2 (Central European)',
-            'ISO-8859-7'   => 'ISO-8859-7 (Greek)',
-            'ISO-8859-9'   => 'ISO-8859-9 (Turkish)',
-            'Windows-1251' => 'Windows-1251 (Cyrillic)',
-            'Windows-1252' => 'Windows-1252 (Western)',
-            'Windows-1255' => 'Windows-1255 (Hebrew)',
-            'Windows-1256' => 'Windows-1256 (Arabic)',
-            'Windows-1257' => 'Windows-1257 (Baltic)',
-            'UTF-8'        => 'UTF-8'
-            );
 
-            $select = new html_select($field_attrib);
-            $select->add(array_values($charsets), array_keys($charsets));
-
-            $set = $_POST['_charset'] ? $_POST['_charset'] : $this->get_charset();
-            return $select->show($set);
+        $charsets = array(
+            'UTF-8'        => 'UTF-8 ('.rcube_label('unicode').')',
+            'US-ASCII'     => 'ASCII ('.rcube_label('english').')',
+            'ISO-8859-1'   => 'ISO-8859-1 ('.rcube_label('westerneuropean').')',
+            'ISO-8859-2'   => 'ISO-8895-2 ('.rcube_label('easterneuropean').')',
+            'ISO-8859-4'   => 'ISO-8895-4 ('.rcube_label('baltic').')',
+            'ISO-8859-5'   => 'ISO-8859-5 ('.rcube_label('cyrillic').')',
+            'ISO-8859-6'   => 'ISO-8859-6 ('.rcube_label('arabic').')',
+            'ISO-8859-7'   => 'ISO-8859-7 ('.rcube_label('greek').')',
+            'ISO-8859-8'   => 'ISO-8859-8 ('.rcube_label('hebrew').')',
+            'ISO-8859-9'   => 'ISO-8859-9 ('.rcube_label('turkish').')',
+            'ISO-8859-10'   => 'ISO-8859-10 ('.rcube_label('nordic').')',
+            'ISO-8859-11'   => 'ISO-8859-11 ('.rcube_label('thai').')',
+            'ISO-8859-13'   => 'ISO-8859-13 ('.rcube_label('baltic').')',
+            'ISO-8859-14'   => 'ISO-8859-14 ('.rcube_label('celtic').')',
+            'ISO-8859-15'   => 'ISO-8859-15 ('.rcube_label('westerneuropean').')',
+            'ISO-8859-16'   => 'ISO-8859-16 ('.rcube_label('southeasterneuropean').')',
+            'WINDOWS-1250' => 'Windows-1250 ('.rcube_label('easterneuropean').')',
+            'WINDOWS-1251' => 'Windows-1251 ('.rcube_label('cyrillic').')',
+            'WINDOWS-1252' => 'Windows-1252 ('.rcube_label('westerneuropean').')',
+            'WINDOWS-1253' => 'Windows-1253 ('.rcube_label('greek').')',
+            'WINDOWS-1254' => 'Windows-1254 ('.rcube_label('turkish').')',
+            'WINDOWS-1255' => 'Windows-1255 ('.rcube_label('hebrew').')',
+            'WINDOWS-1256' => 'Windows-1256 ('.rcube_label('arabic').')',
+            'WINDOWS-1257' => 'Windows-1257 ('.rcube_label('baltic').')',
+            'WINDOWS-1258' => 'Windows-1258 ('.rcube_label('vietnamese').')',
+            'ISO-2022-JP'  => 'ISO-2022-JP ('.rcube_label('japanese').')',
+            'ISO-2022-KR'  => 'ISO-2022-KR ('.rcube_label('korean').')',
+            'ISO-2022-CN'  => 'ISO-2022-CN ('.rcube_label('chinese').')',
+            'EUC-JP'       => 'EUC-JP ('.rcube_label('japanese').')',
+            'EUC-KR'       => 'EUC-KR ('.rcube_label('korean').')',
+            'EUC-CN'       => 'EUC-CN ('.rcube_label('chinese').')',
+            'BIG5'         => 'BIG5 ('.rcube_label('chinese').')',
+            'GB2312'       => 'GB2312 ('.rcube_label('chinese').')',
+        );
+
+        if (!empty($_POST['_charset']))
+               $set = $_POST['_charset'];
+           else if (!empty($attrib['selected']))
+               $set = $attrib['selected'];
+           else
+               $set = $this->get_charset();
+
+           $set = strtoupper($set);
+           if (!isset($charsets[$set]))
+               $charsets[$set] = $set;
+
+        $select = new html_select($field_attrib);
+        $select->add(array_values($charsets), array_keys($charsets));
+
+        return $select->show($set);
     }
 
 }  // end class rcube_template
index c2cad1121289d318ac73b749757c12f8c3dff96e..c764b186c2df094cfbf7f3577ebbb7efdd8d6ecf 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_user.inc                                        |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -16,7 +16,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_user.inc 933 2007-11-29 14:17:32Z thomasb $
+ $Id: rcube_user.php 4290 2010-11-30 13:43:04Z alec $
 
 */
 
  */
 class rcube_user
 {
-  public $ID = null;
-  public $data = null;
-  public $language = null;
-  
-  private $db = null;
-  
-  
-  /**
-   * Object constructor
-   *
-   * @param object DB Database connection
-   */
-  function __construct($id = null, $sql_arr = null)
-  {
-    $this->db = rcmail::get_instance()->get_dbh();
-    
-    if ($id && !$sql_arr)
+    public $ID = null;
+    public $data = null;
+    public $language = null;
+
+    /**
+     * Holds database connection.
+     *
+     * @var rcube_mdb2
+     */
+    private $db = null;
+
+
+    /**
+     * Object constructor
+     *
+     * @param int   $id      User id
+     * @param array $sql_arr SQL result set
+     */
+    function __construct($id = null, $sql_arr = null)
     {
-      $sql_result = $this->db->query("SELECT * FROM ".get_table_name('users')." WHERE  user_id=?", $id);
-      $sql_arr = $this->db->fetch_assoc($sql_result);
+        $this->db = rcmail::get_instance()->get_dbh();
+
+        if ($id && !$sql_arr) {
+            $sql_result = $this->db->query(
+                "SELECT * FROM ".get_table_name('users')." WHERE user_id = ?", $id);
+            $sql_arr = $this->db->fetch_assoc($sql_result);
+        }
+
+        if (!empty($sql_arr)) {
+            $this->ID       = $sql_arr['user_id'];
+            $this->data     = $sql_arr;
+            $this->language = $sql_arr['language'];
+        }
     }
-    
-    if (!empty($sql_arr))
+
+
+    /**
+     * Build a user name string (as e-mail address)
+     *
+     * @param  string $part Username part (empty or 'local' or 'domain')
+     * @return string Full user name or its part
+     */
+    function get_username($part = null)
     {
-      $this->ID = $sql_arr['user_id'];
-      $this->data = $sql_arr;
-      $this->language = $sql_arr['language'];
-    }
-  }
-
-
-  /**
-   * Build a user name string (as e-mail address)
-   *
-   * @return string Full user name
-   */
-  function get_username()
-  {
-    return $this->data['username'] ? $this->data['username'] . (!strpos($this->data['username'], '@') ? '@'.$this->data['mail_host'] : '') : false;
-  }
-  
-  
-  /**
-   * Get the preferences saved for this user
-   *
-   * @return array Hash array with prefs
-   */
-  function get_prefs()
-  {
-    if (!empty($this->language))
-      $prefs = array('language' => $this->language);
-    
-    if ($this->ID && $this->data['preferences'])
-      $prefs += (array)unserialize($this->data['preferences']);
-    
-    return $prefs;
-  }
-  
-  
-  /**
-   * Write the given user prefs to the user's record
-   *
-   * @param array User prefs to save
-   * @return boolean True on success, False on failure
-   */
-  function save_prefs($a_user_prefs)
-  {
-    if (!$this->ID)
-      return false;
-      
-    $config = rcmail::get_instance()->config;
-    $old_prefs = (array)$this->get_prefs();
-
-    // merge (partial) prefs array with existing settings
-    $save_prefs = $a_user_prefs + $old_prefs;
-    unset($save_prefs['language']);
-    
-    // don't save prefs with default values if they haven't been changed yet
-    foreach ($a_user_prefs as $key => $value) {
-      if (!isset($old_prefs[$key]) && ($value == $config->get($key)))
-        unset($save_prefs[$key]);
-    }
-    
-    $this->db->query(
-      "UPDATE ".get_table_name('users')."
-       SET    preferences=?,
-              language=?
-       WHERE  user_id=?",
-      serialize($save_prefs),
-      $_SESSION['language'],
-      $this->ID);
-
-    $this->language = $_SESSION['language'];
-    if ($this->db->affected_rows()) {
-      $config->merge($a_user_prefs);
-      return true;
-    }
+        if ($this->data['username']) {
+            list($local, $domain) = explode('@', $this->data['username']);
+
+            // at least we should always have the local part
+            if ($part == 'local') {
+                return $local;
+            }
+            // if no domain was provided...
+            if (empty($domain)) {
+                $rcmail = rcmail::get_instance();
+                $domain = $rcmail->config->mail_domain($this->data['mail_host']);
+            }
+
+            if ($part == 'domain') {
+                return $domain;
+            }
+
+            if (!empty($domain))
+                return $local . '@' . $domain;
+            else
+                return $local;
+        }
 
-    return false;
-  }
-  
-  
-  /**
-   * Get default identity of this user
-   *
-   * @param int  Identity ID. If empty, the default identity is returned
-   * @return array Hash array with all cols of the identity record
-   */
-  function get_identity($id = null)
-  {
-    $result = $this->list_identities($id ? sprintf('AND identity_id=%d', $id) : '');
-    return $result[0];
-  }
-  
-  
-  /**
-   * Return a list of all identities linked with this user
-   *
-   * @return array List of identities
-   */
-  function list_identities($sql_add = '')
-  {
-    // get contacts from DB
-    $sql_result = $this->db->query(
-      "SELECT * FROM ".get_table_name('identities')."
-       WHERE  del<>1
-       AND    user_id=?
-       $sql_add
-       ORDER BY ".$this->db->quoteIdentifier('standard')." DESC, name ASC, identity_id ASC",
-      $this->ID);
-    
-    $result = array();
-    while ($sql_arr = $this->db->fetch_assoc($sql_result)) {
-      $result[] = $sql_arr;
+        return false;
     }
-    
-    return $result;
-  }
-  
-  
-  /**
-   * Update a specific identity record
-   *
-   * @param int    Identity ID
-   * @param array  Hash array with col->value pairs to save
-   * @return boolean True if saved successfully, false if nothing changed
-   */
-  function update_identity($iid, $data)
-  {
-    if (!$this->ID)
-      return false;
-    
-    $query_cols = $query_params = array();
-    
-    foreach ((array)$data as $col => $value)
+
+
+    /**
+     * Get the preferences saved for this user
+     *
+     * @return array Hash array with prefs
+     */
+    function get_prefs()
     {
-      $query_cols[] = $this->db->quoteIdentifier($col) . '=?';
-      $query_params[] = $value;
+        if (!empty($this->language))
+            $prefs = array('language' => $this->language);
+
+        if ($this->ID && $this->data['preferences'])
+            $prefs += (array)unserialize($this->data['preferences']);
+
+        return $prefs;
     }
-    $query_params[] = $iid;
-    $query_params[] = $this->ID;
-
-    $sql = "UPDATE ".get_table_name('identities')."
-       SET ".join(', ', $query_cols)."
-       WHERE  identity_id=?
-       AND    user_id=?
-       AND    del<>1";
-
-    call_user_func_array(array($this->db, 'query'),
-                        array_merge(array($sql), $query_params));
-    
-    return $this->db->affected_rows();
-  }
-  
-  
-  /**
-   * Create a new identity record linked with this user
-   *
-   * @param array  Hash array with col->value pairs to save
-   * @return int  The inserted identity ID or false on error
-   */
-  function insert_identity($data)
-  {
-    if (!$this->ID)
-      return false;
-
-    $insert_cols = $insert_values = array();
-    foreach ((array)$data as $col => $value)
+
+
+    /**
+     * Write the given user prefs to the user's record
+     *
+     * @param array $a_user_prefs User prefs to save
+     * @return boolean True on success, False on failure
+     */
+    function save_prefs($a_user_prefs)
     {
-      $insert_cols[] = $this->db->quoteIdentifier($col);
-      $insert_values[] = $value;
+        if (!$this->ID)
+            return false;
+
+        $config = rcmail::get_instance()->config;
+        $old_prefs = (array)$this->get_prefs();
+
+        // merge (partial) prefs array with existing settings
+        $save_prefs = $a_user_prefs + $old_prefs;
+        unset($save_prefs['language']);
+
+        // don't save prefs with default values if they haven't been changed yet
+        foreach ($a_user_prefs as $key => $value) {
+            if (!isset($old_prefs[$key]) && ($value == $config->get($key)))
+                unset($save_prefs[$key]);
+        }
+
+        $save_prefs = serialize($save_prefs);
+
+        $this->db->query(
+            "UPDATE ".get_table_name('users').
+            " SET preferences = ?".
+                ", language = ?".
+            " WHERE user_id = ?",
+            $save_prefs,
+            $_SESSION['language'],
+            $this->ID);
+
+        $this->language = $_SESSION['language'];
+
+        if ($this->db->affected_rows()) {
+            $config->set_user_prefs($a_user_prefs);
+            $this->data['preferences'] = $save_prefs;
+            return true;
+        }
+
+        return false;
     }
-    $insert_cols[] = 'user_id';
-    $insert_values[] = $this->ID;
-
-    $sql = "INSERT INTO ".get_table_name('identities')."
-        (".join(', ', $insert_cols).")
-       VALUES (".join(', ', array_pad(array(), sizeof($insert_values), '?')).")";
-
-    call_user_func_array(array($this->db, 'query'),
-                        array_merge(array($sql), $insert_values));
-
-    return $this->db->insert_id('identities');
-  }
-  
-  
-  /**
-   * Mark the given identity as deleted
-   *
-   * @param int  Identity ID
-   * @return boolean True if deleted successfully, false if nothing changed
-   */
-  function delete_identity($iid)
-  {
-    if (!$this->ID)
-      return false;
-
-    if (!$this->ID || $this->ID == '')
-      return false;
-
-    $sql_result = $this->db->query("SELECT count(*) AS ident_count FROM " .
-      get_table_name('identities') .
-      " WHERE user_id = ? AND del <> 1",
-      $this->ID);
-
-    $sql_arr = $this->db->fetch_assoc($sql_result);
-    if ($sql_arr['ident_count'] <= 1)
-      return false;
-    
-    $this->db->query(
-      "UPDATE ".get_table_name('identities')."
-       SET    del=1
-       WHERE  user_id=?
-       AND    identity_id=?",
-      $this->ID,
-      $iid);
-
-    return $this->db->affected_rows();
-  }
-  
-  
-  /**
-   * Make this identity the default one for this user
-   *
-   * @param int The identity ID
-   */
-  function set_default($iid)
-  {
-    if ($this->ID && $iid)
+
+
+    /**
+     * Get default identity of this user
+     *
+     * @param  int   $id Identity ID. If empty, the default identity is returned
+     * @return array Hash array with all cols of the identity record
+     */
+    function get_identity($id = null)
     {
-      $this->db->query(
-        "UPDATE ".get_table_name('identities')."
-         SET ".$this->db->quoteIdentifier('standard')."='0'
-         WHERE  user_id=?
-         AND    identity_id<>?
-         AND    del<>1",
-        $this->ID,
-        $iid);
+        $result = $this->list_identities($id ? sprintf('AND identity_id = %d', $id) : '');
+        return $result[0];
     }
-  }
-  
-  
-  /**
-   * Update user's last_login timestamp
-   */
-  function touch()
-  {
-    if ($this->ID)
+
+
+    /**
+     * Return a list of all identities linked with this user
+     *
+     * @param string $sql_add Optional WHERE clauses
+     * @return array List of identities
+     */
+    function list_identities($sql_add = '')
     {
-      $this->db->query(
-        "UPDATE ".get_table_name('users')."
-         SET    last_login=".$this->db->now()."
-         WHERE  user_id=?",
-        $this->ID);
+        $result = array();
+
+        $sql_result = $this->db->query(
+            "SELECT * FROM ".get_table_name('identities').
+            " WHERE del <> 1 AND user_id = ?".
+            ($sql_add ? " ".$sql_add : "").
+            " ORDER BY ".$this->db->quoteIdentifier('standard')." DESC, name ASC, identity_id ASC",
+            $this->ID);
+
+        while ($sql_arr = $this->db->fetch_assoc($sql_result)) {
+            $result[] = $sql_arr;
+        }
+
+        return $result;
     }
-  }
-  
-  
-  /**
-   * Clear the saved object state
-   */
-  function reset()
-  {
-    $this->ID = null;
-    $this->data = null;
-  }
-  
-  
-  /**
-   * Find a user record matching the given name and host
-   *
-   * @param string IMAP user name
-   * @param string IMAP host name
-   * @return object rcube_user New user instance
-   */
-  static function query($user, $host)
-  {
-    $dbh = rcmail::get_instance()->get_dbh();
-    
-    // query for matching user name
-    $query = "SELECT * FROM ".get_table_name('users')." WHERE mail_host=? AND %s=?";
-    $sql_result = $dbh->query(sprintf($query, 'username'), $host, $user);
-    
-    // query for matching alias
-    if (!($sql_arr = $dbh->fetch_assoc($sql_result))) {
-      $sql_result = $dbh->query(sprintf($query, 'alias'), $host, $user);
-      $sql_arr = $dbh->fetch_assoc($sql_result);
+
+
+    /**
+     * Update a specific identity record
+     *
+     * @param int    $iid  Identity ID
+     * @param array  $data Hash array with col->value pairs to save
+     * @return boolean True if saved successfully, false if nothing changed
+     */
+    function update_identity($iid, $data)
+    {
+        if (!$this->ID)
+            return false;
+
+        $query_cols = $query_params = array();
+
+        foreach ((array)$data as $col => $value) {
+            $query_cols[]   = $this->db->quoteIdentifier($col) . ' = ?';
+            $query_params[] = $value;
+        }
+        $query_params[] = $iid;
+        $query_params[] = $this->ID;
+
+        $sql = "UPDATE ".get_table_name('identities').
+            " SET changed = ".$this->db->now().", ".join(', ', $query_cols).
+            " WHERE identity_id = ?".
+                " AND user_id = ?".
+                " AND del <> 1";
+
+        call_user_func_array(array($this->db, 'query'),
+            array_merge(array($sql), $query_params));
+
+        return $this->db->affected_rows();
     }
-    
-    // user already registered -> overwrite username
-    if ($sql_arr)
-      return new rcube_user($sql_arr['user_id'], $sql_arr);
-    else
-      return false;
-  }
-  
-  
-  /**
-   * Create a new user record and return a rcube_user instance
-   *
-   * @param string IMAP user name
-   * @param string IMAP host
-   * @return object rcube_user New user instance
-   */
-  static function create($user, $host)
-  {
-    $user_name  = '';
-    $user_email = '';
-    $rcmail = rcmail::get_instance();
-
-    // try to resolve user in virtuser table and file
-    if ($email_list = self::user2email($user, false, true)) {
-      $user_email = is_array($email_list[0]) ? $email_list[0][0] : $email_list[0];
+
+
+    /**
+     * Create a new identity record linked with this user
+     *
+     * @param array $data Hash array with col->value pairs to save
+     * @return int  The inserted identity ID or false on error
+     */
+    function insert_identity($data)
+    {
+        if (!$this->ID)
+            return false;
+
+        unset($data['user_id']);
+
+        $insert_cols = $insert_values = array();
+        foreach ((array)$data as $col => $value) {
+            $insert_cols[]   = $this->db->quoteIdentifier($col);
+            $insert_values[] = $value;
+        }
+        $insert_cols[]   = 'user_id';
+        $insert_values[] = $this->ID;
+
+        $sql = "INSERT INTO ".get_table_name('identities').
+            " (changed, ".join(', ', $insert_cols).")".
+            " VALUES (".$this->db->now().", ".join(', ', array_pad(array(), sizeof($insert_values), '?')).")";
+
+        call_user_func_array(array($this->db, 'query'),
+            array_merge(array($sql), $insert_values));
+
+        return $this->db->insert_id('identities');
     }
 
-    $data = $rcmail->plugins->exec_hook('create_user',
-       array('user'=>$user, 'user_name'=>$user_name, 'user_email'=>$user_email));
 
-    // plugin aborted this operation
-    if ($data['abort'])
-      return false;
+    /**
+     * Mark the given identity as deleted
+     *
+     * @param  int     $iid Identity ID
+     * @return boolean True if deleted successfully, false if nothing changed
+     */
+    function delete_identity($iid)
+    {
+        if (!$this->ID)
+            return false;
+
+        $sql_result = $this->db->query(
+            "SELECT count(*) AS ident_count FROM ".get_table_name('identities').
+            " WHERE user_id = ? AND del <> 1",
+            $this->ID);
+
+        $sql_arr = $this->db->fetch_assoc($sql_result);
 
-    $user_name = $data['user_name'];
-    $user_email = $data['user_email'];
+        // we'll not delete last identity
+        if ($sql_arr['ident_count'] <= 1)
+            return false;
 
-    $dbh = $rcmail->get_dbh();
+        $this->db->query(
+            "UPDATE ".get_table_name('identities').
+            " SET del = 1, changed = ".$this->db->now().
+            " WHERE user_id = ?".
+                " AND identity_id = ?",
+            $this->ID,
+            $iid);
+
+        return $this->db->affected_rows();
+    }
 
-    $dbh->query(
-      "INSERT INTO ".get_table_name('users')."
-        (created, last_login, username, mail_host, alias, language)
-       VALUES (".$dbh->now().", ".$dbh->now().", ?, ?, ?, ?)",
-      strip_newlines($user),
-      strip_newlines($host),
-      strip_newlines($data['alias'] ? $data['alias'] : $user_email),
-      $_SESSION['language']);
 
-    if ($user_id = $dbh->insert_id('users'))
+    /**
+     * Make this identity the default one for this user
+     *
+     * @param int $iid The identity ID
+     */
+    function set_default($iid)
     {
-      // create rcube_user instance to make plugin hooks work
-      $user_instance = new rcube_user($user_id);
-      $rcmail->user = $user_instance;
-
-      $mail_domain = $rcmail->config->mail_domain($host);
-
-      if ($user_email=='')
-        $user_email = strpos($user, '@') ? $user : sprintf('%s@%s', $user, $mail_domain);
-
-      if ($user_name == '') {
-        $user_name = $user != $user_email ? $user : '';
-      }
-
-      if (empty($email_list))
-        $email_list[] = strip_newlines($user_email);
-      // identities_level check
-      else if (count($email_list) > 1 && $rcmail->config->get('identities_level', 0) > 1)
-        $email_list = array($email_list[0]);
-
-      // create new identities records
-      $standard = 1;
-      foreach ($email_list as $row) {
-        if (is_array($row)) {
-          $email = $row[0];
-          $name = $row[1] ? $row[1] : $user_name;
-        }
-        else {
-          $email = $row;
-          $name = $user_name;
+        if ($this->ID && $iid) {
+            $this->db->query(
+                "UPDATE ".get_table_name('identities').
+                " SET ".$this->db->quoteIdentifier('standard')." = '0'".
+                " WHERE user_id = ?".
+                    " AND identity_id <> ?".
+                    " AND del <> 1",
+                $this->ID,
+                $iid);
         }
+    }
+
 
-        $plugin = $rcmail->plugins->exec_hook('create_identity', array(
-          'login' => true,
-          'record' => array(
-            'user_id' => $user_id,
-            'name' => strip_newlines($name),
-            'email' => $email,
-            'standard' => $standard,
-            'signature' => '',
-          ),
-        ));
-          
-        if (!$plugin['abort'] && $plugin['record']['email']) {
-          $dbh->query(
-              "INSERT INTO ".get_table_name('identities')."
-                (user_id, del, standard, name, email, signature)
-               VALUES (?, 0, ?, ?, ?, ?)",
-              $user_id,
-              $plugin['record']['standard'],
-              $plugin['record']['name'] != NULL ? $plugin['record']['name'] : '',
-              $plugin['record']['email'],
-              $plugin['record']['signature']);
+    /**
+     * Update user's last_login timestamp
+     */
+    function touch()
+    {
+        if ($this->ID) {
+            $this->db->query(
+                "UPDATE ".get_table_name('users').
+                " SET last_login = ".$this->db->now().
+                " WHERE user_id = ?",
+                $this->ID);
         }
-        $standard = 0;
-      }
     }
-    else
+
+
+    /**
+     * Clear the saved object state
+     */
+    function reset()
     {
-      raise_error(array(
-        'code' => 500,
-        'type' => 'php',
-        'line' => __LINE__,
-        'file' => __FILE__,
-        'message' => "Failed to create new user"), true, false);
+        $this->ID = null;
+        $this->data = null;
     }
-    
-    return $user_id ? $user_instance : false;
-  }
-  
-  
-  /**
-   * Resolve username using a virtuser file
-   *
-   * @param string E-mail address to resolve
-   * @return string Resolved IMAP username
-   */
-  static function email2user($email)
-  {
-    $r = self::findinvirtual('/^' . preg_quote($email, '/') . '\s/');
-
-    for ($i=0; $i<count($r); $i++)
+
+
+    /**
+     * Find a user record matching the given name and host
+     *
+     * @param string $user IMAP user name
+     * @param string $host IMAP host name
+     * @return rcube_user New user instance
+     */
+    static function query($user, $host)
     {
-      $data = trim($r[$i]);
-      $arr = preg_split('/\s+/', $data);
-      if (count($arr) > 0)
-        return trim($arr[count($arr)-1]);
-    }
+        $dbh = rcmail::get_instance()->get_dbh();
+
+        // use BINARY (case-sensitive) comparison on MySQL, other engines are case-sensitive
+        $prefix = preg_match('/^mysql/', $dbh->db_provider) ? 'BINARY ' : '';
+
+        // query for matching user name
+        $query = "SELECT * FROM ".get_table_name('users')." WHERE mail_host = ? AND %s = ?";
 
-    return NULL;
-  }
-
-
-  /**
-   * Resolve e-mail address from virtuser file/table
-   *
-   * @param string User name
-   * @param boolean If true returns first found entry
-   * @param boolean If true returns email as array (email and name for identity)
-   * @return mixed Resolved e-mail address string or array of strings
-   */
-  static function user2email($user, $first=true, $extended=false)
-  {
-    $result = array();
-    $rcmail = rcmail::get_instance();
-    $dbh = $rcmail->get_dbh();
-
-    // SQL lookup
-    if ($virtuser_query = $rcmail->config->get('virtuser_query')) {
-      $sql_result = $dbh->query(preg_replace('/%u/', $dbh->escapeSimple($user), $virtuser_query));
-      while ($sql_arr = $dbh->fetch_array($sql_result))
-        if (strpos($sql_arr[0], '@')) {
-          $result[] = ($extended && count($sql_arr) > 1) ? $sql_arr : $sql_arr[0];
-          if ($first)
-            return $result[0];
+        $sql_result = $dbh->query(sprintf($query, $prefix.'username'), $host, $user);
+
+        // query for matching alias
+        if (!($sql_arr = $dbh->fetch_assoc($sql_result))) {
+            $sql_result = $dbh->query(sprintf($query, $prefix.'alias'), $host, $user);
+            $sql_arr = $dbh->fetch_assoc($sql_result);
         }
+
+        // user already registered -> overwrite username
+        if ($sql_arr)
+            return new rcube_user($sql_arr['user_id'], $sql_arr);
+        else
+            return false;
     }
-    // File lookup
-    $r = self::findinvirtual('/\s' . preg_quote($user, '/') . '\s*$/');
-    for ($i=0; $i<count($r); $i++)
+
+
+    /**
+     * Create a new user record and return a rcube_user instance
+     *
+     * @param string $user IMAP user name
+     * @param string $host IMAP host
+     * @return rcube_user New user instance
+     */
+    static function create($user, $host)
     {
-      $data = $r[$i];
-      $arr = preg_split('/\s+/', $data);
-      if (count($arr) > 0 && strpos($arr[0], '@'))
-      {
-        $result[] = trim(str_replace('\\@', '@', $arr[0]));
-
-        if ($first)
-          return $result[0];
-      }
+        $user_name  = '';
+        $user_email = '';
+        $rcmail = rcmail::get_instance();
+
+        // try to resolve user in virtuser table and file
+        if ($email_list = self::user2email($user, false, true)) {
+            $user_email = is_array($email_list[0]) ? $email_list[0]['email'] : $email_list[0];
+        }
+
+        $data = $rcmail->plugins->exec_hook('user_create',
+               array('user'=>$user, 'user_name'=>$user_name, 'user_email'=>$user_email));
+
+        // plugin aborted this operation
+        if ($data['abort'])
+            return false;
+
+        $user_name  = $data['user_name'];
+        $user_email = $data['user_email'];
+
+        $dbh = $rcmail->get_dbh();
+
+        $dbh->query(
+            "INSERT INTO ".get_table_name('users').
+            " (created, last_login, username, mail_host, alias, language)".
+            " VALUES (".$dbh->now().", ".$dbh->now().", ?, ?, ?, ?)",
+            strip_newlines($user),
+            strip_newlines($host),
+            strip_newlines($data['alias'] ? $data['alias'] : $user_email),
+            strip_newlines($data['language'] ? $data['language'] : $_SESSION['language']));
+
+        if ($user_id = $dbh->insert_id('users')) {
+            // create rcube_user instance to make plugin hooks work
+            $user_instance = new rcube_user($user_id);
+            $rcmail->user  = $user_instance;
+
+            $mail_domain = $rcmail->config->mail_domain($host);
+
+            if ($user_email == '') {
+                $user_email = strpos($user, '@') ? $user : sprintf('%s@%s', $user, $mail_domain);
+            }
+            if ($user_name == '') {
+                $user_name = $user != $user_email ? $user : '';
+            }
+
+            if (empty($email_list))
+                $email_list[] = strip_newlines($user_email);
+            // identities_level check
+            else if (count($email_list) > 1 && $rcmail->config->get('identities_level', 0) > 1)
+                $email_list = array($email_list[0]);
+
+            // create new identities records
+            $standard = 1;
+            foreach ($email_list as $row) {
+                   $record = array();
+
+                if (is_array($row)) {
+                       $record = $row;
+                }
+                else {
+                    $record['email'] = $row;
+                }
+
+                   if (empty($record['name']))
+                       $record['name'] = $user_name;
+                $record['name'] = strip_newlines($record['name']);
+                $record['user_id'] = $user_id;
+                $record['standard'] = $standard;
+
+                $plugin = $rcmail->plugins->exec_hook('identity_create',
+                       array('login' => true, 'record' => $record));
+
+                if (!$plugin['abort'] && $plugin['record']['email']) {
+                    $rcmail->user->insert_identity($plugin['record']);
+                }
+                $standard = 0;
+            }
+        }
+        else {
+            raise_error(array(
+                'code' => 500,
+                'type' => 'php',
+                'line' => __LINE__,
+                'file' => __FILE__,
+                'message' => "Failed to create new user"), true, false);
+        }
+
+        return $user_id ? $user_instance : false;
     }
-    
-    return empty($result) ? NULL : $result;
-  }
-  
-  
-  /**
-   * Find matches of the given pattern in virtuser file
-   * 
-   * @param string Regular expression to search for
-   * @return array Matching entries
-   */
-  private static function findinvirtual($pattern)
-  {
-    $result = array();
-    $virtual = null;
-    
-    if ($virtuser_file = rcmail::get_instance()->config->get('virtuser_file'))
-      $virtual = file($virtuser_file);
-    
-    if (empty($virtual))
-      return $result;
-    
-    // check each line for matches
-    foreach ($virtual as $line)
+
+
+    /**
+     * Resolve username using a virtuser plugins
+     *
+     * @param string $email E-mail address to resolve
+     * @return string Resolved IMAP username
+     */
+    static function email2user($email)
     {
-      $line = trim($line);
-      if (empty($line) || $line{0}=='#')
-        continue;
-        
-      if (preg_match($pattern, $line))
-        $result[] = $line;
+        $rcmail = rcmail::get_instance();
+        $plugin = $rcmail->plugins->exec_hook('email2user',
+            array('email' => $email, 'user' => NULL));
+
+        return $plugin['user'];
     }
-    
-    return $result;
-  }
 
-}
 
+    /**
+     * Resolve e-mail address from virtuser plugins
+     *
+     * @param string $user User name
+     * @param boolean $first If true returns first found entry
+     * @param boolean $extended If true returns email as array (email and name for identity)
+     * @return mixed Resolved e-mail address string or array of strings
+     */
+    static function user2email($user, $first=true, $extended=false)
+    {
+        $rcmail = rcmail::get_instance();
+        $plugin = $rcmail->plugins->exec_hook('user2email',
+            array('email' => NULL, 'user' => $user,
+                'first' => $first, 'extended' => $extended));
 
+        return empty($plugin['email']) ? NULL : $plugin['email'];
+    }
+
+}
index f574eed14a0d155ebb475aeecc9766ea4073a7a6..716c1fca4d21a71d761ef7683e8007e9498a3282 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_vcard.php                                       |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2008-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2008-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -14,7 +14,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: $
+ $Id: rcube_vcard.php 4393 2011-01-04 22:00:35Z thomasb $
 
 */
 
@@ -28,6 +28,7 @@
  */
 class rcube_vcard
 {
+  private static $values_decoded = false;
   private $raw = array(
     'FN' => array(),
     'N' => array(array('','','','','')),
@@ -47,10 +48,10 @@ class rcube_vcard
   /**
    * Constructor
    */
-  public function __construct($vcard = null)
+  public function __construct($vcard = null, $charset = RCMAIL_CHARSET, $detect = false)
   {
     if (!empty($vcard))
-      $this->load($vcard);
+      $this->load($vcard, $charset, $detect);
   }
 
 
@@ -58,19 +59,32 @@ class rcube_vcard
    * Load record from (internal, unfolded) vcard 3.0 format
    *
    * @param string vCard string to parse
+   * @param string Charset of string values
+   * @param boolean True if loading a 'foreign' vcard and extra heuristics for charset detection is required
    */
-  public function load($vcard)
+  public function load($vcard, $charset = RCMAIL_CHARSET, $detect = false)
   {
+    self::$values_decoded = false;
     $this->raw = self::vcard_decode($vcard);
 
+    // resolve charset parameters
+    if ($charset == null) {
+      $this->raw = self::charset_convert($this->raw);
+    }
+    // vcard has encoded values and charset should be detected
+    else if ($detect && self::$values_decoded &&
+      ($detected_charset = self::detect_encoding(self::vcard_encode($this->raw))) && $detected_charset != RCMAIL_CHARSET) {
+        $this->raw = self::charset_convert($this->raw, $detected_charset);
+    }
+
     // find well-known address fields
-    $this->displayname = $this->raw['FN'][0];
+    $this->displayname = $this->raw['FN'][0][0];
     $this->surname = $this->raw['N'][0][0];
     $this->firstname = $this->raw['N'][0][1];
     $this->middlename = $this->raw['N'][0][2];
-    $this->nickname = $this->raw['NICKNAME'][0];
-    $this->organization = $this->raw['ORG'][0];
-    $this->business = ($this->raw['X-ABShowAs'][0] == 'COMPANY') || (join('', (array)$this->raw['N'][0]) == '' && !empty($this->organization));
+    $this->nickname = $this->raw['NICKNAME'][0][0];
+    $this->organization = $this->raw['ORG'][0][0];
+    $this->business = ($this->raw['X-ABSHOWAS'][0][0] == 'COMPANY') || (join('', (array)$this->raw['N'][0]) == '' && !empty($this->organization));
     
     foreach ((array)$this->raw['EMAIL'] as $i => $raw_email)
       $this->email[$i] = is_array($raw_email) ? $raw_email[0] : $raw_email;
@@ -82,6 +96,13 @@ class rcube_vcard
       $this->email[0] = $this->email[$pref_index];
       $this->email[$pref_index] = $tmp;
     }
+
+    // make sure displayname is not empty (required by RFC2426)
+    if (!strlen($this->displayname)) {
+      // the same method is used in steps/mail/addcontact.inc
+      $this->displayname = ucfirst(preg_replace('/[\.\-]/', ' ',
+        substr($this->email[0], 0, strpos($this->email[0], '@'))));
+    }
   }
 
 
@@ -106,7 +127,7 @@ class rcube_vcard
     switch ($field) {
       case 'name':
       case 'displayname':
-        $this->raw['FN'][0] = $value;
+        $this->raw['FN'][0][0] = $value;
         break;
         
       case 'firstname':
@@ -118,11 +139,11 @@ class rcube_vcard
         break;
       
       case 'nickname':
-        $this->raw['NICKNAME'][0] = $value;
+        $this->raw['NICKNAME'][0][0] = $value;
         break;
         
       case 'organization':
-        $this->raw['ORG'][0] = $value;
+        $this->raw['ORG'][0][0] = $value;
         break;
         
       case 'email':
@@ -156,6 +177,28 @@ class rcube_vcard
     
     return $result;
   }
+  
+  
+  /**
+   * Convert a whole vcard (array) to UTF-8.
+   * If $force_charset is null, each member value that has a charset parameter will be converted
+   */
+  private static function charset_convert($card, $force_charset = null)
+  {
+    foreach ($card as $key => $node) {
+      foreach ($node as $i => $subnode) {
+        if (is_array($subnode) && (($charset = $force_charset) || ($subnode['charset'] && ($charset = $subnode['charset'][0])))) {
+          foreach ($subnode as $j => $value) {
+            if (is_numeric($j) && is_string($value))
+              $card[$key][$i][$j] = rcube_charset_convert($value, $charset);
+          }
+          unset($card[$key][$i]['charset']);
+        }
+      }
+    }
+
+    return $card;
+  }
 
 
   /**
@@ -168,11 +211,14 @@ class rcube_vcard
   {
     $out = array();
 
+    // check if charsets are specified (usually vcard version < 3.0 but this is not reliable)
+    if (preg_match('/charset=/i', substr($data, 0, 2048)))
+      $charset = null;
     // detect charset and convert to utf-8
-    $encoding = self::detect_encoding($data);
-    if ($encoding && $encoding != RCMAIL_CHARSET) {
-      $data = rcube_charset_convert($data, $encoding);
+    else if (($charset = self::detect_encoding($data)) && $charset != RCMAIL_CHARSET) {
+      $data = rcube_charset_convert($data, $charset);
       $data = preg_replace(array('/^[\xFE\xFF]{2}/', '/^\xEF\xBB\xBF/', '/^\x00+/'), '', $data); // also remove BOM
+      $charset = RCMAIL_CHARSET;
     }
 
     $vcard_block = '';
@@ -182,15 +228,17 @@ class rcube_vcard
       if ($in_vcard_block && !empty($line))
         $vcard_block .= $line . "\n";
 
-      if (trim($line) == 'END:VCARD') {
+      $line = trim($line);
+
+      if (preg_match('/^END:VCARD$/i', $line)) {
         // parse vcard
-        $obj = new rcube_vcard(self::cleanup($vcard_block));
+        $obj = new rcube_vcard(self::cleanup($vcard_block), $charset, true);
         if (!empty($obj->displayname))
           $out[] = $obj;
 
         $in_vcard_block = false;
       }
-      else if (trim($line) == 'BEGIN:VCARD') {
+      else if (preg_match('/^BEGIN:VCARD$/i', $line)) {
         $vcard_block = $line . "\n";
         $in_vcard_block = true;
       }
@@ -217,9 +265,6 @@ class rcube_vcard
     // Remove cruft like item1.X-AB*, item1.ADR instead of ADR, and empty lines
     $vcard = preg_replace(array('/^item\d*\.X-AB.*$/m', '/^item\d*\./m', "/\n+/"), array('', '', "\n"), $vcard);
 
-    // remove vcard 2.1 charset definitions
-    $vcard = preg_replace('/;CHARSET=[^:;]+/', '', $vcard);
-    
     // if N doesn't have any semicolons, add some 
     $vcard = preg_replace('/^(N:[^;\R]*)$/m', '\1;;;;', $vcard);
 
@@ -269,7 +314,7 @@ class rcube_vcard
 
         foreach($regs2[1] as $attrid => $attr) {
           if ((list($key, $value) = explode('=', $attr)) && $value) {
-           $value = trim($value);
+            $value = trim($value);
             if ($key == 'ENCODING') {
               // add next line(s) to value string if QP line end detected
               while ($value == 'QUOTED-PRINTABLE' && preg_match('/=$/', $lines[$i]))
@@ -286,7 +331,7 @@ class rcube_vcard
         }
 
         $entry = array_merge($entry, (array)self::vcard_unquote($line[2]));
-        $data[$field][] = count($entry) > 1 ? $entry : $entry[0];
+        $data[$field][] = $entry;
       }
     }
 
@@ -328,9 +373,11 @@ class rcube_vcard
   {
     switch (strtolower($encoding)) {
       case 'quoted-printable':
+        self::$values_decoded = true;
         return quoted_printable_decode($value);
 
       case 'base64':
+        self::$values_decoded = true;
         return base64_decode($value);
 
       default:
diff --git a/program/include/session.inc b/program/include/session.inc
deleted file mode 100644 (file)
index 77d1b1f..0000000
+++ /dev/null
@@ -1,271 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/include/session.inc                                           |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Provide database supported session management                       |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: session.inc 2932 2009-09-07 12:51:21Z alec $
-
-*/
-
-$GLOBALS['rcube_session_unsets'] = array();
-
-function rcube_sess_open($save_path, $session_name)
-{
-  return true;
-}
-
-
-function rcube_sess_close()
-{
-  return true;
-}
-
-
-// read session data
-function rcube_sess_read($key)
-{
-  global $SESS_CHANGED, $SESS_CLIENT_IP;
-  
-  $DB = rcmail::get_instance()->get_dbh();
-  
-  $sql_result = $DB->query(
-    "SELECT vars, ip, " . $DB->unixtimestamp('changed') . " AS changed
-     FROM " . get_table_name('session') . "
-     WHERE  sess_id=?",
-    $key);
-
-  if ($sql_arr = $DB->fetch_assoc($sql_result)) {
-    $SESS_CHANGED = $sql_arr['changed'];
-    $SESS_CLIENT_IP = $sql_arr['ip'];
-
-    if (strlen($sql_arr['vars']))
-      return $sql_arr['vars'];
-  }
-
-  return false;
-}
-  
-
-// save session data
-function rcube_sess_write($key, $vars)
-{
-  $DB = rcmail::get_instance()->get_dbh();
-  
-  $now = $DB->fromunixtime(time());
-
-  $sql_result = $DB->query(
-    "SELECT vars FROM " . get_table_name('session') . "
-     WHERE  sess_id=?", $key);
-
-  if ($sql_arr = $DB->fetch_assoc($sql_result)) {
-
-    $a_oldvars = rcube_sess_unserialize($sql_arr['vars']);
-    foreach ((array)$GLOBALS['rcube_session_unsets'] as $k)
-      unset($a_oldvars[$k]);
-
-    $DB->query(
-      "UPDATE " . get_table_name('session') . "
-       SET    vars=?, changed= " . $now . "
-       WHERE  sess_id=?",
-      rcube_sess_serialize(array_merge($a_oldvars, rcube_sess_unserialize($vars))),
-      $key);
-  }
-  else {
-    $DB->query(
-      "INSERT INTO " . get_table_name('session') . "
-       (sess_id, vars, ip, created, changed)
-       VALUES (?, ?, ?, " . $now . ", " . $now .")",
-      $key,
-      $vars,
-      (string)$_SERVER['REMOTE_ADDR']);
-  }
-
-  $GLOBALS['rcube_session_unsets'] = array();
-  return true;
-}
-
-
-// unset session variable
-function rcube_sess_unset($var=NULL)
-{
-  if (empty($var))
-    return rcube_sess_destroy(session_id());
-
-  $GLOBALS['rcube_session_unsets'][] = $var;
-  unset($_SESSION[$var]);
-
-  return true;
-}
-
-
-// serialize session data
-function rcube_sess_serialize($vars)
-{
-  $data = '';
-  if (is_array($vars))
-    foreach ($vars as $var=>$value)
-      $data .= $var.'|'.serialize($value);
-  else
-    $data = 'b:0;';
-  return $data;
-}
-
-
-// unserialize session data
-// http://www.php.net/manual/en/function.session-decode.php#56106
-function rcube_sess_unserialize($str)
-{
-  $str = (string)$str;
-  $endptr = strlen($str);
-  $p = 0;
-
-  $serialized = '';
-  $items = 0;
-  $level = 0;
-
-  while ($p < $endptr) {
-    $q = $p;
-    while ($str[$q] != '|')
-      if (++$q >= $endptr) break 2;
-
-    if ($str[$p] == '!') {
-      $p++;
-      $has_value = false;
-    } else {
-      $has_value = true;
-    }
-
-    $name = substr($str, $p, $q - $p);
-    $q++;
-
-    $serialized .= 's:' . strlen($name) . ':"' . $name . '";';
-
-    if ($has_value) {
-      for (;;) {
-        $p = $q;
-        switch (strtolower($str[$q])) {
-          case 'n': /* null */
-          case 'b': /* boolean */
-          case 'i': /* integer */
-          case 'd': /* decimal */
-            do $q++;
-            while ( ($q < $endptr) && ($str[$q] != ';') );
-            $q++;
-            $serialized .= substr($str, $p, $q - $p);
-            if ($level == 0) break 2;
-            break;
-          case 'r': /* reference  */
-            $q+= 2;
-            for ($id = ''; ($q < $endptr) && ($str[$q] != ';'); $q++) $id .= $str[$q];
-            $q++;
-            $serialized .= 'R:' . ($id + 1) . ';'; /* increment pointer because of outer array */
-            if ($level == 0) break 2;
-            break;
-          case 's': /* string */
-            $q+=2;
-            for ($length=''; ($q < $endptr) && ($str[$q] != ':'); $q++) $length .= $str[$q];
-            $q+=2;
-            $q+= (int)$length + 2;
-            $serialized .= substr($str, $p, $q - $p);
-            if ($level == 0) break 2;
-            break;
-          case 'a': /* array */
-          case 'o': /* object */
-            do $q++;
-            while ( ($q < $endptr) && ($str[$q] != '{') );
-            $q++;
-            $level++;
-            $serialized .= substr($str, $p, $q - $p);
-            break;
-          case '}': /* end of array|object */
-            $q++;
-            $serialized .= substr($str, $p, $q - $p);
-            if (--$level == 0) break 2;
-            break;
-          default:
-            return false;
-        }
-      }
-    } else {
-      $serialized .= 'N;';
-      $q+= 2;
-    }
-    $items++;
-    $p = $q;
-  }
-
-  return unserialize( 'a:' . $items . ':{' . $serialized . '}' );
-}
-
-
-// handler for session_destroy()
-function rcube_sess_destroy($key)
-{
-  $DB = rcmail::get_instance()->get_dbh();
-  
-  $DB->query("DELETE FROM " . get_table_name('session') . " WHERE sess_id=?", $key);
-
-  return true;
-}
-
-
-// garbage collecting function
-function rcube_sess_gc($maxlifetime)
-{
-  $rcmail = rcmail::get_instance();
-  $DB = $rcmail->get_dbh();
-
-  // just delete all expired sessions
-  $DB->query("DELETE FROM " . get_table_name('session') . "
-    WHERE changed < " . $DB->fromunixtime(time() - $maxlifetime));
-
-  if ($rcmail->config->get('enable_caching'))
-    rcmail_cache_gc();
-
-  rcmail_temp_gc();
-
-  return true;
-}
-
-
-function rcube_sess_regenerate_id()
-{
-  $randval = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
-
-  for ($random = "", $i=1; $i <= 32; $i++) {
-    $random .= substr($randval, mt_rand(0,(strlen($randval) - 1)), 1);
-  }
-
-  // use md5 value for id or remove capitals from string $randval
-  $random = md5($random);
-
-  // delete old session record
-  rcube_sess_destroy(session_id());
-
-  session_id($random);
-
-  $cookie   = session_get_cookie_params();
-  $lifetime = $cookie['lifetime'] ? time() + $cookie['lifetime'] : 0;
-
-  rcmail::setcookie(session_name(), $random, $lifetime);
-
-  return true;
-}
-
-
-// set custom functions for PHP session management
-session_set_save_handler('rcube_sess_open', 'rcube_sess_close', 'rcube_sess_read', 'rcube_sess_write', 'rcube_sess_destroy', 'rcube_sess_gc');
-
-?>
index 57d1471b6394336453e501781f4790bc346d2cf0..c58f06f12dd520a43e65e5a11a070e9988e95075 100644 (file)
-function rcube_webmail(){
-this.env=new Object();
-this.labels=new Object();
-this.buttons=new Object();
-this.buttons_sel=new Object();
-this.gui_objects=new Object();
-this.gui_containers=new Object();
-this.commands=new Object();
-this.command_handlers=new Object();
-this.onloads=new Array();
-this.ref="rcmail";
-var _1=this;
-this.dblclick_time=500;
-this.message_time=3000;
-this.identifier_expr=new RegExp("[^0-9a-z-_]","gi");
-this.mimetypes=new Array("text/plain","text/html","text/xml","image/jpeg","image/gif","image/png","application/x-javascript","application/pdf","application/x-shockwave-flash");
-this.env.keep_alive=60;
-this.env.request_timeout=180;
-this.env.draft_autosave=0;
-this.env.comm_path="./";
-this.env.bin_path="./bin/";
-this.env.blankpage="program/blank.gif";
-jQuery.ajaxSetup({cache:false,error:function(_2,_3,_4){
-_1.http_error(_2,_3,_4);
-},beforeSend:function(_5){
-_5.setRequestHeader("X-RoundCube-Request",_1.env.request_token);
-}});
-this.set_env=function(p,_7){
-if(p!=null&&typeof (p)=="object"&&!_7){
-for(var n in p){
-this.env[n]=p[n];
-}
-}else{
-this.env[p]=_7;
-}
-};
-this.add_label=function(_9,_a){
-this.labels[_9]=_a;
-};
-this.register_button=function(_b,id,_d,_e,_f,_10){
-if(!this.buttons[_b]){
-this.buttons[_b]=new Array();
-}
-var _11={id:id,type:_d};
-if(_e){
-_11.act=_e;
-}
-if(_f){
-_11.sel=_f;
-}
-if(_10){
-_11.over=_10;
-}
-this.buttons[_b][this.buttons[_b].length]=_11;
-};
-this.gui_object=function(_12,id){
-this.gui_objects[_12]=id;
-};
-this.gui_container=function(_14,id){
-this.gui_containers[_14]=id;
-};
-this.add_element=function(elm,_17){
-if(this.gui_containers[_17]&&this.gui_containers[_17].jquery){
-this.gui_containers[_17].append(elm);
-}
-};
-this.register_command=function(_18,_19,_1a){
-this.command_handlers[_18]=_19;
-if(_1a){
-this.enable_command(_18,true);
-}
-};
-this.add_onload=function(f){
-this.onloads[this.onloads.length]=f;
-};
-this.init=function(){
-var p=this;
-this.task=this.env.task;
-if(!bw.dom||!bw.xmlhttp_test()){
-this.goto_url("error","_code=0x199");
-return;
-}
-for(var n in this.gui_containers){
-this.gui_containers[n]=$("#"+this.gui_containers[n]);
-}
-for(var n in this.gui_objects){
-this.gui_objects[n]=rcube_find_object(this.gui_objects[n]);
-}
-this.init_buttons();
-if(this.env.framed&&parent.rcmail&&parent.rcmail.set_busy){
-parent.rcmail.set_busy(false);
-}
-this.enable_command("logout","mail","addressbook","settings",true);
-if(this.env.permaurl){
-this.enable_command("permaurl",true);
-}
-switch(this.task){
-case "mail":
-if(this.gui_objects.messagelist){
-this.message_list=new rcube_list_widget(this.gui_objects.messagelist,{multiselect:true,draggable:true,keyboard:true,dblclick_time:this.dblclick_time});
-this.message_list.row_init=function(o){
-p.init_message_row(o);
-};
-this.message_list.addEventListener("dblclick",function(o){
-p.msglist_dbl_click(o);
-});
-this.message_list.addEventListener("keypress",function(o){
-p.msglist_keypress(o);
-});
-this.message_list.addEventListener("select",function(o){
-p.msglist_select(o);
-});
-this.message_list.addEventListener("dragstart",function(o){
-p.drag_start(o);
-});
-this.message_list.addEventListener("dragmove",function(e){
-p.drag_move(e);
-});
-this.message_list.addEventListener("dragend",function(e){
-p.drag_end(e);
-});
-document.onmouseup=function(e){
-return p.doc_mouse_up(e);
-};
-this.message_list.init();
-this.enable_command("toggle_status","toggle_flag",true);
-if(this.gui_objects.mailcontframe){
-this.gui_objects.mailcontframe.onmousedown=function(e){
-return p.click_on_list(e);
-};
-}else{
-this.message_list.focus();
-}
-}
-if(this.env.coltypes){
-this.set_message_coltypes(this.env.coltypes);
-}
-this.enable_command("list","checkmail","compose","add-contact","search","reset-search","collapse-folder",true);
-if(this.env.search_text!=null&&document.getElementById("quicksearchbox")!=null){
-document.getElementById("quicksearchbox").value=this.env.search_text;
-}
-if(this.env.action=="show"||this.env.action=="preview"){
-this.enable_command("show","reply","reply-all","forward","moveto","delete","open","mark","edit","viewsource","download","print","load-attachment","load-headers",true);
-if(this.env.next_uid){
-this.enable_command("nextmessage",true);
-this.enable_command("lastmessage",true);
-}
-if(this.env.prev_uid){
-this.enable_command("previousmessage",true);
-this.enable_command("firstmessage",true);
-}
-if(this.env.blockedobjects){
-if(this.gui_objects.remoteobjectsmsg){
-this.gui_objects.remoteobjectsmsg.style.display="block";
-}
-this.enable_command("load-images","always-load",true);
-}
-}
-if(this.env.trash_mailbox&&this.env.mailbox!=this.env.trash_mailbox){
-this.set_alttext("delete","movemessagetotrash");
-}
-if(this.env.action=="preview"&&this.env.framed&&parent.rcmail){
-this.enable_command("compose","add-contact",false);
-parent.rcmail.show_contentframe(true);
-}
-if(this.env.action=="compose"){
-this.enable_command("add-attachment","send-attachment","remove-attachment","send",true);
-if(this.env.spellcheck){
-this.env.spellcheck.spelling_state_observer=function(s){
-_1.set_spellcheck_state(s);
-};
-this.set_spellcheck_state("ready");
-if($("input[name='_is_html']").val()=="1"){
-this.display_spellcheck_controls(false);
-}
-}
-if(this.env.drafts_mailbox){
-this.enable_command("savedraft",true);
-}
-document.onmouseup=function(e){
-return p.doc_mouse_up(e);
-};
-this.init_messageform();
-}
-if(this.env.messagecount){
-this.enable_command("select-all","select-none","expunge",true);
-}
-if(this.purge_mailbox_test()){
-this.enable_command("purge",true);
-}
-this.set_page_buttons();
-if(this.env.action=="print"){
-window.print();
-}
-if(this.gui_objects.mailboxlist){
-this.env.unread_counts={};
-this.gui_objects.folderlist=this.gui_objects.mailboxlist;
-this.http_request("getunread","");
-}
-if(this.env.mdn_request&&this.env.uid){
-var _29="_uid="+this.env.uid+"&_mbox="+urlencode(this.env.mailbox);
-if(confirm(this.get_label("mdnrequest"))){
-this.http_post("sendmdn",_29);
-}else{
-this.http_post("mark",_29+"&_flag=mdnsent");
-}
-}
-break;
-case "addressbook":
-if(this.gui_objects.contactslist){
-this.contact_list=new rcube_list_widget(this.gui_objects.contactslist,{multiselect:true,draggable:true,keyboard:true});
-this.contact_list.row_init=function(row){
-p.triggerEvent("insertrow",{cid:row.uid,row:row});
-};
-this.contact_list.addEventListener("keypress",function(o){
-p.contactlist_keypress(o);
-});
-this.contact_list.addEventListener("select",function(o){
-p.contactlist_select(o);
-});
-this.contact_list.addEventListener("dragstart",function(o){
-p.drag_start(o);
-});
-this.contact_list.addEventListener("dragmove",function(e){
-p.drag_move(e);
-});
-this.contact_list.addEventListener("dragend",function(e){
-p.drag_end(e);
-});
-this.contact_list.init();
-if(this.env.cid){
-this.contact_list.highlight_row(this.env.cid);
-}
-if(this.gui_objects.contactslist.parentNode){
-this.gui_objects.contactslist.parentNode.onmousedown=function(e){
-return p.click_on_list(e);
-};
-document.onmouseup=function(e){
-return p.doc_mouse_up(e);
-};
-}else{
-this.contact_list.focus();
-}
-this.gui_objects.folderlist=this.gui_objects.contactslist;
-}
-this.set_page_buttons();
-if(this.env.address_sources&&this.env.address_sources[this.env.source]&&!this.env.address_sources[this.env.source].readonly){
-this.enable_command("add",true);
-}
-if(this.env.cid){
-this.enable_command("show","edit",true);
-}
-if((this.env.action=="add"||this.env.action=="edit")&&this.gui_objects.editform){
-this.enable_command("save",true);
-}else{
-this.enable_command("search","reset-search","moveto","import",true);
-}
-if(this.contact_list&&this.contact_list.rowcount>0){
-this.enable_command("export",true);
-}
-this.enable_command("list",true);
-break;
-case "settings":
-this.enable_command("preferences","identities","save","folders",true);
-if(this.env.action=="identities"){
-this.enable_command("add",this.env.identities_level<2);
-}else{
-if(this.env.action=="edit-identity"||this.env.action=="add-identity"){
-this.enable_command("add",this.env.identities_level<2);
-this.enable_command("save","delete","edit",true);
-}else{
-if(this.env.action=="folders"){
-this.enable_command("subscribe","unsubscribe","create-folder","rename-folder","delete-folder",true);
-}
-}
-}
-if(this.gui_objects.identitieslist){
-this.identity_list=new rcube_list_widget(this.gui_objects.identitieslist,{multiselect:false,draggable:false,keyboard:false});
-this.identity_list.addEventListener("select",function(o){
-p.identity_select(o);
-});
-this.identity_list.init();
-this.identity_list.focus();
-if(this.env.iid){
-this.identity_list.highlight_row(this.env.iid);
-}
-}else{
-if(this.gui_objects.sectionslist){
-this.sections_list=new rcube_list_widget(this.gui_objects.sectionslist,{multiselect:false,draggable:false,keyboard:false});
-this.sections_list.addEventListener("select",function(o){
-p.section_select(o);
-});
-this.sections_list.init();
-this.sections_list.focus();
-this.sections_list.select_first();
-}else{
-if(this.gui_objects.subscriptionlist){
-this.init_subscription_list();
-}
-}
-}
-break;
-case "login":
-var _34=$("#rcmloginuser");
-_34.bind("keyup",function(e){
-return rcmail.login_user_keyup(e);
-});
-if(_34.val()==""){
-_34.focus();
-}else{
-$("#rcmloginpwd").focus();
-}
-$("#rcmlogintz").val(new Date().getTimezoneOffset()/-60);
-this.enable_command("login",true);
-break;
-default:
-break;
-}
-this.loaded=true;
-if(this.pending_message){
-this.display_message(this.pending_message[0],this.pending_message[1]);
-}
-if(this.gui_objects.folderlist){
-this.gui_containers.foldertray=$(this.gui_objects.folderlist);
-}
-this.triggerEvent("init",{task:this.task,action:this.env.action});
-for(var i=0;i<this.onloads.length;i++){
-if(typeof (this.onloads[i])=="string"){
-eval(this.onloads[i]);
-}else{
-if(typeof (this.onloads[i])=="function"){
-this.onloads[i]();
-}
-}
-}
-this.start_keepalive();
-};
-this.start_keepalive=function(){
-if(this.env.keep_alive&&!this.env.framed&&this.task=="mail"&&this.gui_objects.mailboxlist){
-this._int=setInterval(function(){
-_1.check_for_recent(false);
-},this.env.keep_alive*1000);
-}else{
-if(this.env.keep_alive&&!this.env.framed&&this.task!="login"){
-this._int=setInterval(function(){
-_1.send_keep_alive();
-},this.env.keep_alive*1000);
-}
-}
-};
-this.init_message_row=function(row){
-var uid=row.uid;
-if(uid&&this.env.messages[uid]){
-row.deleted=this.env.messages[uid].deleted?true:false;
-row.unread=this.env.messages[uid].unread?true:false;
-row.replied=this.env.messages[uid].replied?true:false;
-row.flagged=this.env.messages[uid].flagged?true:false;
-row.forwarded=this.env.messages[uid].forwarded?true:false;
-}
-if(row.icon=row.obj.getElementsByTagName("td")[0].getElementsByTagName("img")[0]){
-var p=this;
-row.icon.id="msgicn_"+row.uid;
-row.icon._row=row.obj;
-row.icon.onmousedown=function(e){
-p.command("toggle_status",this);
-};
-}
-if(!this.env.flagged_col&&this.env.coltypes){
-var _3b;
-if((_3b=find_in_array("flag",this.env.coltypes))>=0){
-this.set_env("flagged_col",_3b+1);
-}
-}
-if(this.env.flagged_col&&(row.flagged_icon=row.obj.getElementsByTagName("td")[this.env.flagged_col].getElementsByTagName("img")[0])){
-var p=this;
-row.flagged_icon.id="flaggedicn_"+row.uid;
-row.flagged_icon._row=row.obj;
-row.flagged_icon.onmousedown=function(e){
-p.command("toggle_flag",this);
-};
-}
-this.triggerEvent("insertrow",{uid:uid,row:row});
-};
-this.init_messageform=function(){
-if(!this.gui_objects.messageform){
-return false;
-}
-var _3d=$("[name='_from']");
-var _3e=$("[name='_to']");
-var _3f=$("input[name='_subject']");
-var _40=$("[name='_message']").get(0);
-var _41=$("input[name='_is_html']").val()=="1";
-this.init_address_input_events(_3e);
-this.init_address_input_events($("[name='_cc']"));
-this.init_address_input_events($("[name='_bcc']"));
-if(_3d.attr("type")=="select-one"&&$("input[name='_draft_saveid']").val()==""&&!_41){
-this.change_identity(_3d[0]);
-}
-if(_3e.val()==""){
-_3e.focus();
-}else{
-if(_3f.val()==""){
-_3f.focus();
-}else{
-if(_40&&!_41){
-_40.focus();
-}
-}
-}
-this.compose_field_hash(true);
-this.auto_save_start();
-};
-this.init_address_input_events=function(obj){
-var _43=function(e){
-return _1.ksearch_keypress(e,this);
-};
-obj.bind((bw.safari||bw.ie?"keydown":"keypress"),_43);
-obj.attr("autocomplete","off");
-};
-this.command=function(_45,_46,obj){
-if(obj&&obj.blur){
-obj.blur();
-}
-if(this.busy){
-return false;
-}
-if(!this.commands[_45]){
-if(this.env.framed&&parent.rcmail&&parent.rcmail.command){
-parent.rcmail.command(_45,_46);
-}
-return false;
-}
-if(this.task=="mail"&&this.env.action=="compose"&&(_45=="list"||_45=="mail"||_45=="addressbook"||_45=="settings")){
-if(this.cmp_hash!=this.compose_field_hash()&&!confirm(this.get_label("notsentwarning"))){
-return false;
-}
-}
-if(typeof this.command_handlers[_45]=="function"){
-var ret=this.command_handlers[_45](_46,obj);
-return ret!==null?ret:(obj?false:true);
-}else{
-if(typeof this.command_handlers[_45]=="string"){
-var ret=window[this.command_handlers[_45]](_46,obj);
-return ret!==null?ret:(obj?false:true);
-}
-}
-var _49=this.triggerEvent("before"+_45,_46);
-if(typeof _49!="undefined"){
-if(_49===false){
-return false;
-}else{
-_46=_49;
-}
-}
-switch(_45){
-case "login":
-if(this.gui_objects.loginform){
-this.gui_objects.loginform.submit();
-}
-break;
-case "mail":
-case "addressbook":
-case "settings":
-case "logout":
-this.switch_task(_45);
-break;
-case "permaurl":
-if(obj&&obj.href&&obj.target){
-return true;
-}else{
-if(this.env.permaurl){
-parent.location.href=this.env.permaurl;
-}
-}
-break;
-case "open":
-var uid;
-if(uid=this.get_single_uid()){
-obj.href="?_task="+this.env.task+"&_action=show&_mbox="+urlencode(this.env.mailbox)+"&_uid="+uid;
-return true;
-}
-break;
-case "list":
-if(this.task=="mail"){
-if(this.env.search_request<0||(_46!=""&&(this.env.search_request&&_46!=this.env.mailbox))){
-this.reset_qsearch();
-}
-this.list_mailbox(_46);
-if(this.env.trash_mailbox){
-this.set_alttext("delete",this.env.mailbox!=this.env.trash_mailbox?"movemessagetotrash":"deletemessage");
-}
-}else{
-if(this.task=="addressbook"){
-if(this.env.search_request<0||(this.env.search_request&&_46!=this.env.source)){
-this.reset_qsearch();
-}
-this.list_contacts(_46);
-this.enable_command("add",(this.env.address_sources&&!this.env.address_sources[_46].readonly));
-}
-}
-break;
-case "load-headers":
-this.load_headers(obj);
-break;
-case "sort":
-var _4b,_4c=_46;
-if(this.env.sort_col==_4c){
-_4b=this.env.sort_order=="ASC"?"DESC":"ASC";
-}else{
-_4b="ASC";
-}
-$("#rcm"+this.env.sort_col).removeClass("sorted"+(this.env.sort_order.toUpperCase()));
-$("#rcm"+_4c).addClass("sorted"+_4b);
-this.env.sort_col=_4c;
-this.env.sort_order=_4b;
-this.list_mailbox("","",_4c+"_"+_4b);
-break;
-case "nextpage":
-this.list_page("next");
-break;
-case "lastpage":
-this.list_page("last");
-break;
-case "previouspage":
-this.list_page("prev");
-break;
-case "firstpage":
-this.list_page("first");
-break;
-case "expunge":
-if(this.env.messagecount){
-this.expunge_mailbox(this.env.mailbox);
-}
-break;
-case "purge":
-case "empty-mailbox":
-if(this.env.messagecount){
-this.purge_mailbox(this.env.mailbox);
-}
-break;
-case "show":
-if(this.task=="mail"){
-var uid=this.get_single_uid();
-if(uid&&(!this.env.uid||uid!=this.env.uid)){
-if(this.env.mailbox==this.env.drafts_mailbox){
-this.goto_url("compose","_draft_uid="+uid+"&_mbox="+urlencode(this.env.mailbox),true);
-}else{
-this.show_message(uid);
-}
-}
-}else{
-if(this.task=="addressbook"){
-var cid=_46?_46:this.get_single_cid();
-if(cid&&!(this.env.action=="show"&&cid==this.env.cid)){
-this.load_contact(cid,"show");
-}
-}
-}
-break;
-case "add":
-if(this.task=="addressbook"){
-this.load_contact(0,"add");
-}else{
-if(this.task=="settings"){
-this.identity_list.clear_selection();
-this.load_identity(0,"add-identity");
-}
-}
-break;
-case "edit":
-var cid;
-if(this.task=="addressbook"&&(cid=this.get_single_cid())){
-this.load_contact(cid,"edit");
-}else{
-if(this.task=="settings"&&_46){
-this.load_identity(_46,"edit-identity");
-}else{
-if(this.task=="mail"&&(cid=this.get_single_uid())){
-var url=(this.env.mailbox==this.env.drafts_mailbox)?"_draft_uid=":"_uid=";
-this.goto_url("compose",url+cid+"&_mbox="+urlencode(this.env.mailbox),true);
-}
-}
-}
-break;
-case "save-identity":
-case "save":
-if(this.gui_objects.editform){
-var _4f=$("input[name='_pagesize']");
-var _50=$("input[name='_name']");
-var _51=$("input[name='_email']");
-if(_4f.length&&isNaN(parseInt(_4f.val()))){
-alert(this.get_label("nopagesizewarning"));
-_4f.focus();
-break;
-}else{
-if(_50.length&&_50.val()==""){
-alert(this.get_label("nonamewarning"));
-_50.focus();
-break;
-}else{
-if(_51.length&&!rcube_check_email(_51.val())){
-alert(this.get_label("noemailwarning"));
-_51.focus();
-break;
-}
-}
-}
-this.gui_objects.editform.submit();
-}
-break;
-case "delete":
-if(this.task=="mail"){
-this.delete_messages();
-}else{
-if(this.task=="addressbook"){
-this.delete_contacts();
-}else{
-if(this.task=="settings"){
-this.delete_identity();
-}
-}
-}
-break;
-case "move":
-case "moveto":
-if(this.task=="mail"){
-this.move_messages(_46);
-}else{
-if(this.task=="addressbook"&&this.drag_active){
-this.copy_contact(null,_46);
-}
-}
-break;
-case "mark":
-if(_46){
-this.mark_message(_46);
-}
-break;
-case "toggle_status":
-if(_46&&!_46._row){
-break;
-}
-var uid;
-var _52="read";
-if(_46._row.uid){
-uid=_46._row.uid;
-if(this.message_list.rows[uid].deleted){
-_52="undelete";
-}else{
-if(!this.message_list.rows[uid].unread){
-_52="unread";
-}
-}
-}
-this.mark_message(_52,uid);
-break;
-case "toggle_flag":
-if(_46&&!_46._row){
-break;
-}
-var uid;
-var _52="flagged";
-if(_46._row.uid){
-uid=_46._row.uid;
-if(this.message_list.rows[uid].flagged){
-_52="unflagged";
-}
-}
-this.mark_message(_52,uid);
-break;
-case "always-load":
-if(this.env.uid&&this.env.sender){
-this.add_contact(urlencode(this.env.sender));
-window.setTimeout(function(){
-_1.command("load-images");
-},300);
-break;
-}
-case "load-images":
-if(this.env.uid){
-this.show_message(this.env.uid,true,this.env.action=="preview");
-}
-break;
-case "load-attachment":
-var _53="_mbox="+urlencode(this.env.mailbox)+"&_uid="+this.env.uid+"&_part="+_46.part;
-if(this.env.uid&&_46.mimetype&&find_in_array(_46.mimetype,this.mimetypes)>=0){
-if(_46.mimetype=="text/html"){
-_53+="&_safe=1";
-}
-this.attachment_win=window.open(this.env.comm_path+"&_action=get&"+_53+"&_frame=1","rcubemailattachment");
-if(this.attachment_win){
-window.setTimeout(function(){
-_1.attachment_win.focus();
-},10);
-break;
-}
-}
-this.goto_url("get",_53+"&_download=1",false);
-break;
-case "select-all":
-if(_46=="invert"){
-this.message_list.invert_selection();
-}else{
-this.message_list.select_all(_46);
-}
-break;
-case "select-none":
-this.message_list.clear_selection();
-break;
-case "nextmessage":
-if(this.env.next_uid){
-this.show_message(this.env.next_uid,false,this.env.action=="preview");
-}
-break;
-case "lastmessage":
-if(this.env.last_uid){
-this.show_message(this.env.last_uid);
-}
-break;
-case "previousmessage":
-if(this.env.prev_uid){
-this.show_message(this.env.prev_uid,false,this.env.action=="preview");
-}
-break;
-case "firstmessage":
-if(this.env.first_uid){
-this.show_message(this.env.first_uid);
-}
-break;
-case "checkmail":
-this.check_for_recent(true);
-break;
-case "compose":
-var url=this.env.comm_path+"&_action=compose";
-if(this.task=="mail"){
-url+="&_mbox="+urlencode(this.env.mailbox);
-if(this.env.mailbox==this.env.drafts_mailbox){
-var uid;
-if(uid=this.get_single_uid()){
-url+="&_draft_uid="+uid;
-}
-}else{
-if(_46){
-url+="&_to="+urlencode(_46);
-}
-}
-}else{
-if(this.task=="addressbook"){
-if(_46&&_46.indexOf("@")>0){
-url=this.get_task_url("mail",url);
-this.redirect(url+"&_to="+urlencode(_46));
-break;
-}
-var _54=new Array();
-if(_46){
-_54[_54.length]=_46;
-}else{
-if(this.contact_list){
-var _55=this.contact_list.get_selection();
-for(var n=0;n<_55.length;n++){
-_54[_54.length]=_55[n];
-}
-}
-}
-if(_54.length){
-this.http_request("mailto","_cid="+urlencode(_54.join(","))+"&_source="+urlencode(this.env.source),true);
-}
-break;
-}
-}
-url=url.replace(/&_framed=1/,"");
-this.redirect(url);
-break;
-case "spellcheck":
-if(window.tinyMCE&&tinyMCE.get(this.env.composebody)){
-tinyMCE.execCommand("mceSpellCheck",true);
-}else{
-if(this.env.spellcheck&&this.env.spellcheck.spellCheck&&this.spellcheck_ready){
-this.env.spellcheck.spellCheck();
-this.set_spellcheck_state("checking");
-}
-}
-break;
-case "savedraft":
-self.clearTimeout(this.save_timer);
-if(!this.gui_objects.messageform){
-break;
-}
-if(!this.env.drafts_mailbox||this.cmp_hash==this.compose_field_hash()){
-break;
-}
-this.set_busy(true,"savingmessage");
-var _57=this.gui_objects.messageform;
-_57.target="savetarget";
-_57._draft.value="1";
-_57.submit();
-break;
-case "send":
-if(!this.gui_objects.messageform){
-break;
-}
-if(!this.check_compose_input()){
-break;
-}
-self.clearTimeout(this.save_timer);
-this.set_busy(true,"sendingmessage");
-var _57=this.gui_objects.messageform;
-_57.target="savetarget";
-_57._draft.value="";
-_57.submit();
-clearTimeout(this.request_timer);
-break;
-case "add-attachment":
-this.show_attachment_form(true);
-case "send-attachment":
-self.clearTimeout(this.save_timer);
-this.upload_file(_46);
-break;
-case "remove-attachment":
-this.remove_attachment(_46);
-break;
-case "reply-all":
-case "reply":
-var uid;
-if(uid=this.get_single_uid()){
-this.goto_url("compose","_reply_uid="+uid+"&_mbox="+urlencode(this.env.mailbox)+(_45=="reply-all"?"&_all=1":""),true);
-}
-break;
-case "forward":
-var uid;
-if(uid=this.get_single_uid()){
-this.goto_url("compose","_forward_uid="+uid+"&_mbox="+urlencode(this.env.mailbox),true);
-}
-break;
-case "print":
-var uid;
-if(uid=this.get_single_uid()){
-_1.printwin=window.open(this.env.comm_path+"&_action=print&_uid="+uid+"&_mbox="+urlencode(this.env.mailbox)+(this.env.safemode?"&_safe=1":""));
-if(this.printwin){
-window.setTimeout(function(){
-_1.printwin.focus();
-},20);
-if(this.env.action!="show"){
-this.mark_message("read",uid);
-}
-}
-}
-break;
-case "viewsource":
-var uid;
-if(uid=this.get_single_uid()){
-_1.sourcewin=window.open(this.env.comm_path+"&_action=viewsource&_uid="+uid+"&_mbox="+urlencode(this.env.mailbox));
-if(this.sourcewin){
-window.setTimeout(function(){
-_1.sourcewin.focus();
-},20);
-}
-}
-break;
-case "download":
-var uid;
-if(uid=this.get_single_uid()){
-this.goto_url("viewsource","&_uid="+uid+"&_mbox="+urlencode(this.env.mailbox)+"&_save=1");
-}
-break;
-case "add-contact":
-this.add_contact(_46);
-break;
-case "search":
-if(!_46&&this.gui_objects.qsearchbox){
-_46=this.gui_objects.qsearchbox.value;
-}
-if(_46){
-this.qsearch(_46);
-break;
-}
-case "reset-search":
-var s=this.env.search_request;
-this.reset_qsearch();
-if(s&&this.env.mailbox){
-this.list_mailbox(this.env.mailbox);
-}else{
-if(s&&this.task=="addressbook"){
-this.list_contacts(this.env.source);
-}
-}
-break;
-case "import":
-if(this.env.action=="import"&&this.gui_objects.importform){
-var _59=document.getElementById("rcmimportfile");
-if(_59&&!_59.value){
-alert(this.get_label("selectimportfile"));
-break;
-}
-this.gui_objects.importform.submit();
-this.set_busy(true,"importwait");
-this.lock_form(this.gui_objects.importform,true);
-}else{
-this.goto_url("import");
-}
-break;
-case "export":
-if(this.contact_list.rowcount>0){
-var _5a=(this.env.source?"_source="+urlencode(this.env.source)+"&":"");
-if(this.env.search_request){
-_5a+="_search="+this.env.search_request;
-}
-this.goto_url("export",_5a);
-}
-break;
-case "collapse-folder":
-if(_46){
-this.collapse_folder(_46);
-}
-break;
-case "preferences":
-this.goto_url("");
-break;
-case "identities":
-this.goto_url("identities");
-break;
-case "delete-identity":
-this.delete_identity();
-case "folders":
-this.goto_url("folders");
-break;
-case "subscribe":
-this.subscribe_folder(_46);
-break;
-case "unsubscribe":
-this.unsubscribe_folder(_46);
-break;
-case "create-folder":
-this.create_folder(_46);
-break;
-case "rename-folder":
-this.rename_folder(_46);
-break;
-case "delete-folder":
-this.delete_folder(_46);
-break;
-}
-this.triggerEvent("after"+_45,_46);
-return obj?false:true;
-};
-this.enable_command=function(){
-var _5b=arguments;
-if(!_5b.length){
-return -1;
-}
-var _5c;
-var _5d=_5b[_5b.length-1];
-for(var n=0;n<_5b.length-1;n++){
-_5c=_5b[n];
-this.commands[_5c]=_5d;
-this.set_button(_5c,(_5d?"act":"pas"));
-}
-return true;
-};
-this.set_busy=function(a,_60){
-if(a&&_60){
-var msg=this.get_label(_60);
-if(msg==_60){
-msg="Loading...";
-}
-this.display_message(msg,"loading",true);
-}else{
-if(!a){
-this.hide_message();
-}
-}
-this.busy=a;
-if(this.gui_objects.editform){
-this.lock_form(this.gui_objects.editform,a);
-}
-if(this.request_timer){
-clearTimeout(this.request_timer);
-}
-if(a&&this.env.request_timeout){
-this.request_timer=window.setTimeout(function(){
-_1.request_timed_out();
-},this.env.request_timeout*1000);
-}
-};
-this.get_label=function(_62,_63){
-if(_63&&this.labels[_63+"."+_62]){
-return this.labels[_63+"."+_62];
-}else{
-if(this.labels[_62]){
-return this.labels[_62];
-}else{
-return _62;
-}
-}
-};
-this.gettext=this.get_label;
-this.switch_task=function(_64){
-if(this.task===_64&&_64!="mail"){
-return;
-}
-var url=this.get_task_url(_64);
-if(_64=="mail"){
-url+="&_mbox=INBOX";
-}
-this.redirect(url);
-};
-this.get_task_url=function(_66,url){
-if(!url){
-url=this.env.comm_path;
-}
-return url.replace(/_task=[a-z]+/,"_task="+_66);
-};
-this.request_timed_out=function(){
-this.set_busy(false);
-this.display_message("Request timed out!","error");
-};
-this.reload=function(_68){
-if(this.env.framed&&parent.rcmail){
-parent.rcmail.reload(_68);
-}else{
-if(_68){
-window.setTimeout(function(){
-rcmail.reload();
-},_68);
-}else{
-if(window.location){
-location.href=this.env.comm_path;
-}
-}
-}
-};
-this.doc_mouse_up=function(e){
-var _6a,_6b,li;
-if(this.message_list){
-if(!rcube_mouse_is_over(e,this.message_list.list)){
-this.message_list.blur();
-}
-_6b=this.message_list;
-_6a=this.env.mailboxes;
-}else{
-if(this.contact_list){
-if(!rcube_mouse_is_over(e,this.contact_list.list)){
-this.contact_list.blur();
-}
-_6b=this.contact_list;
-_6a=this.env.address_sources;
-}else{
-if(this.ksearch_value){
-this.ksearch_blur();
-}
-}
-}
-if(this.drag_active&&_6a&&this.env.last_folder_target){
-$(this.get_folder_li(this.env.last_folder_target)).removeClass("droptarget");
-this.command("moveto",_6a[this.env.last_folder_target].id);
-this.env.last_folder_target=null;
-_6b.draglayer.hide();
-}
-if(this.buttons_sel){
-for(var id in this.buttons_sel){
-if(typeof id!="function"){
-this.button_out(this.buttons_sel[id],id);
-}
-}
-this.buttons_sel={};
-}
-};
-this.drag_start=function(_6e){
-var _6f=this.task=="mail"?this.env.mailboxes:this.env.address_sources;
-this.drag_active=true;
-if(this.preview_timer){
-clearTimeout(this.preview_timer);
-}
-if(this.gui_objects.folderlist&&_6f){
-this.initialBodyScrollTop=bw.ie?0:window.pageYOffset;
-this.initialListScrollTop=this.gui_objects.folderlist.parentNode.scrollTop;
-var li,pos,_6e,_72;
-_6e=$(this.gui_objects.folderlist);
-pos=_6e.offset();
-this.env.folderlist_coords={x1:pos.left,y1:pos.top,x2:pos.left+_6e.width(),y2:pos.top+_6e.height()};
-this.env.folder_coords=new Array();
-for(var k in _6f){
-if(li=this.get_folder_li(k)){
-if(_72=li.firstChild.offsetHeight){
-pos=$(li.firstChild).offset();
-this.env.folder_coords[k]={x1:pos.left,y1:pos.top,x2:pos.left+li.firstChild.offsetWidth,y2:pos.top+_72,on:0};
-}
-}
-}
-}
-};
-this.drag_end=function(e){
-this.drag_active=false;
-this.env.last_folder_target=null;
-if(this.folder_auto_timer){
-window.clearTimeout(this.folder_auto_timer);
-this.folder_auto_timer=null;
-this.folder_auto_expand=null;
-}
-if(this.gui_objects.folderlist&&this.env.folder_coords){
-for(var k in this.env.folder_coords){
-if(this.env.folder_coords[k].on){
-$(this.get_folder_li(k)).removeClass("droptarget");
-}
-}
-}
-};
-this.drag_move=function(e){
-if(this.gui_objects.folderlist&&this.env.folder_coords){
-var _77=bw.ie?-document.documentElement.scrollTop:this.initialBodyScrollTop;
-var _78=this.initialListScrollTop-this.gui_objects.folderlist.parentNode.scrollTop;
-var _79=-_78-_77;
-var li,div,pos,_7d;
-_7d=rcube_event.get_mouse_pos(e);
-pos=this.env.folderlist_coords;
-_7d.y+=_79;
-if(_7d.x<pos.x1||_7d.x>=pos.x2||_7d.y<pos.y1||_7d.y>=pos.y2){
-if(this.env.last_folder_target){
-$(this.get_folder_li(this.env.last_folder_target)).removeClass("droptarget");
-this.env.folder_coords[this.env.last_folder_target].on=0;
-this.env.last_folder_target=null;
-}
-return;
-}
-for(var k in this.env.folder_coords){
-pos=this.env.folder_coords[k];
-if(_7d.x>=pos.x1&&_7d.x<pos.x2&&_7d.y>=pos.y1&&_7d.y<pos.y2&&this.check_droptarget(k)){
-li=this.get_folder_li(k);
-div=$(li.getElementsByTagName("div")[0]);
-if(div.hasClass("collapsed")){
-if(this.folder_auto_timer){
-window.clearTimeout(this.folder_auto_timer);
-}
-this.folder_auto_expand=k;
-this.folder_auto_timer=window.setTimeout(function(){
-rcmail.command("collapse-folder",rcmail.folder_auto_expand);
-rcmail.drag_start(null);
-},1000);
-}else{
-if(this.folder_auto_timer){
-window.clearTimeout(this.folder_auto_timer);
-this.folder_auto_timer=null;
-this.folder_auto_expand=null;
-}
-}
-$(li).addClass("droptarget");
-this.env.last_folder_target=k;
-this.env.folder_coords[k].on=1;
-}else{
-if(pos.on){
-$(this.get_folder_li(k)).removeClass("droptarget");
-this.env.folder_coords[k].on=0;
-}
-}
-}
-}
-};
-this.collapse_folder=function(id){
-var div;
-if((li=this.get_folder_li(id))&&(div=$(li.getElementsByTagName("div")[0]))&&(div.hasClass("collapsed")||div.hasClass("expanded"))){
-var ul=$(li.getElementsByTagName("ul")[0]);
-if(div.hasClass("collapsed")){
-ul.show();
-div.removeClass("collapsed").addClass("expanded");
-var reg=new RegExp("&"+urlencode(id)+"&");
-this.set_env("collapsed_folders",this.env.collapsed_folders.replace(reg,""));
-}else{
-ul.hide();
-div.removeClass("expanded").addClass("collapsed");
-this.set_env("collapsed_folders",this.env.collapsed_folders+"&"+urlencode(id)+"&");
-if(this.env.mailbox.indexOf(id+this.env.delimiter)==0){
-this.command("list",id);
-}
-}
-if((bw.ie6||bw.ie7)&&li.nextSibling&&(li.nextSibling.getElementsByTagName("ul").length>0)&&li.nextSibling.getElementsByTagName("ul")[0].style&&(li.nextSibling.getElementsByTagName("ul")[0].style.display!="none")){
-li.nextSibling.getElementsByTagName("ul")[0].style.display="none";
-li.nextSibling.getElementsByTagName("ul")[0].style.display="";
-}
-this.http_post("save-pref","_name=collapsed_folders&_value="+urlencode(this.env.collapsed_folders));
-this.set_unread_count_display(id,false);
-}
-};
-this.click_on_list=function(e){
-if(this.gui_objects.qsearchbox){
-this.gui_objects.qsearchbox.blur();
-}
-if(this.message_list){
-this.message_list.focus();
-}else{
-if(this.contact_list){
-this.contact_list.focus();
-}
-}
-return rcube_event.get_button(e)==2?true:rcube_event.cancel(e);
-};
-this.msglist_select=function(_84){
-if(this.preview_timer){
-clearTimeout(this.preview_timer);
-}
-var _85=_84.selection.length==1;
-if(this.env.mailbox==this.env.drafts_mailbox){
-this.enable_command("reply","reply-all","forward",false);
-this.enable_command("show","print","open","edit","download","viewsource",_85);
-this.enable_command("delete","moveto","mark",(_84.selection.length>0?true:false));
-}else{
-this.enable_command("show","reply","reply-all","forward","print","edit","open","download","viewsource",_85);
-this.enable_command("delete","moveto","mark",(_84.selection.length>0?true:false));
-}
-if(_85&&this.env.contentframe&&!_84.multi_selecting){
-this.preview_timer=window.setTimeout(function(){
-_1.msglist_get_preview();
-},200);
-}else{
-if(this.env.contentframe){
-this.show_contentframe(false);
-}
-}
-};
-this.msglist_dbl_click=function(_86){
-if(this.preview_timer){
-clearTimeout(this.preview_timer);
-}
-var uid=_86.get_single_selection();
-if(uid&&this.env.mailbox==this.env.drafts_mailbox){
-this.goto_url("compose","_draft_uid="+uid+"&_mbox="+urlencode(this.env.mailbox),true);
-}else{
-if(uid){
-this.show_message(uid,false,false);
-}
-}
-};
-this.msglist_keypress=function(_88){
-if(_88.key_pressed==_88.ENTER_KEY){
-this.command("show");
-}else{
-if(_88.key_pressed==_88.DELETE_KEY){
-this.command("delete");
-}else{
-if(_88.key_pressed==_88.BACKSPACE_KEY){
-this.command("delete");
-}else{
-_88.shiftkey=false;
-}
-}
-}
-};
-this.msglist_get_preview=function(){
-var uid=this.get_single_uid();
-if(uid&&this.env.contentframe&&!this.drag_active){
-this.show_message(uid,false,true);
-}else{
-if(this.env.contentframe){
-this.show_contentframe(false);
-}
-}
-};
-this.check_droptarget=function(id){
-if(this.task=="mail"){
-return (this.env.mailboxes[id]&&this.env.mailboxes[id].id!=this.env.mailbox&&!this.env.mailboxes[id].virtual);
-}else{
-if(this.task=="addressbook"){
-return (id!=this.env.source&&this.env.address_sources[id]&&!this.env.address_sources[id].readonly);
-}else{
-if(this.task=="settings"){
-return (id!=this.env.folder);
-}
-}
-}
-};
-this.show_message=function(id,_8c,_8d){
-if(!id){
-return;
-}
-var _8e="";
-var _8f=_8d?"preview":"show";
-var _90=window;
-if(_8d&&this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){
-_90=window.frames[this.env.contentframe];
-_8e="&_framed=1";
-}
-if(_8c){
-_8e="&_safe=1";
-}
-if(this.env.search_request){
-_8e+="&_search="+this.env.search_request;
-}
-var url="&_action="+_8f+"&_uid="+id+"&_mbox="+urlencode(this.env.mailbox)+_8e;
-if(_8f=="preview"&&String(_90.location.href).indexOf(url)>=0){
-this.show_contentframe(true);
-}else{
-this.set_busy(true,"loading");
-_90.location.href=this.env.comm_path+url;
-if(_8f=="preview"&&this.message_list&&this.message_list.rows[id]&&this.message_list.rows[id].unread){
-this.set_message(id,"unread",false);
-if(this.env.unread_counts[this.env.mailbox]){
-this.env.unread_counts[this.env.mailbox]-=1;
-this.set_unread_count(this.env.mailbox,this.env.unread_counts[this.env.mailbox],this.env.mailbox=="INBOX");
-}
-}
-}
-};
-this.show_contentframe=function(_92){
-var frm;
-if(this.env.contentframe&&(frm=$("#"+this.env.contentframe))&&frm.length){
-if(!_92&&window.frames[this.env.contentframe]){
-if(window.frames[this.env.contentframe].location.href.indexOf(this.env.blankpage)<0){
-window.frames[this.env.contentframe].location.href=this.env.blankpage;
-}
-}else{
-if(!bw.safari&&!bw.konq){
-frm[_92?"show":"hide"]();
-}
-}
-}
-if(!_92&&this.busy){
-this.set_busy(false);
-}
-};
-this.list_page=function(_94){
-if(_94=="next"){
-_94=this.env.current_page+1;
-}
-if(_94=="last"){
-_94=this.env.pagecount;
-}
-if(_94=="prev"&&this.env.current_page>1){
-_94=this.env.current_page-1;
-}
-if(_94=="first"&&this.env.current_page>1){
-_94=1;
-}
-if(_94>0&&_94<=this.env.pagecount){
-this.env.current_page=_94;
-if(this.task=="mail"){
-this.list_mailbox(this.env.mailbox,_94);
-}else{
-if(this.task=="addressbook"){
-this.list_contacts(this.env.source,_94);
-}
-}
-}
-};
-this.filter_mailbox=function(_95){
-var _96;
-if(this.gui_objects.qsearchbox){
-_96=this.gui_objects.qsearchbox.value;
-}
-this.message_list.clear();
-this.env.current_page=1;
-this.set_busy(true,"searching");
-this.http_request("search","_filter="+_95+(_96?"&_q="+urlencode(_96):"")+(this.env.mailbox?"&_mbox="+urlencode(this.env.mailbox):""),true);
-};
-this.list_mailbox=function(_97,_98,_99){
-var _9a="";
-var _9b=window;
-if(!_97){
-_97=this.env.mailbox;
-}
-if(_99){
-_9a+="&_sort="+_99;
-}
-if(this.env.search_request){
-_9a+="&_search="+this.env.search_request;
-}
-if(!_98&&this.env.mailbox!=_97){
-_98=1;
-this.env.current_page=_98;
-this.show_contentframe(false);
-}
-if(_97!=this.env.mailbox||(_97==this.env.mailbox&&!_98&&!_99)){
-_9a+="&_refresh=1";
-}
-this.last_selected=0;
-if(this.message_list){
-this.message_list.clear_selection();
-}
-this.select_folder(_97,this.env.mailbox);
-this.env.mailbox=_97;
-if(this.gui_objects.messagelist){
-this.list_mailbox_remote(_97,_98,_9a);
-return;
-}
-if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){
-_9b=window.frames[this.env.contentframe];
-_9a+="&_framed=1";
-}
-if(_97){
-this.set_busy(true,"loading");
-_9b.location.href=this.env.comm_path+"&_mbox="+urlencode(_97)+(_98?"&_page="+_98:"")+_9a;
-}
-};
-this.list_mailbox_remote=function(_9c,_9d,_9e){
-this.message_list.clear();
-var url="_mbox="+urlencode(_9c)+(_9d?"&_page="+_9d:"");
-this.set_busy(true,"loading");
-this.http_request("list",url+_9e,true);
-};
-this.expunge_mailbox=function(_a0){
-var _a1=false;
-var _a2="";
-if(_a0==this.env.mailbox){
-_a1=true;
-this.set_busy(true,"loading");
-_a2="&_reload=1";
-}
-var url="_mbox="+urlencode(_a0);
-this.http_post("expunge",url+_a2,_a1);
-};
-this.purge_mailbox=function(_a4){
-var _a5=false;
-var _a6="";
-if(!confirm(this.get_label("purgefolderconfirm"))){
-return false;
-}
-if(_a4==this.env.mailbox){
-_a5=true;
-this.set_busy(true,"loading");
-_a6="&_reload=1";
-}
-var url="_mbox="+urlencode(_a4);
-this.http_post("purge",url+_a6,_a5);
-return true;
-};
-this.purge_mailbox_test=function(){
-return (this.env.messagecount&&(this.env.mailbox==this.env.trash_mailbox||this.env.mailbox==this.env.junk_mailbox||this.env.mailbox.match("^"+RegExp.escape(this.env.trash_mailbox)+RegExp.escape(this.env.delimiter))||this.env.mailbox.match("^"+RegExp.escape(this.env.junk_mailbox)+RegExp.escape(this.env.delimiter))));
-};
-this.set_message_icon=function(uid){
-var _a9;
-var _aa=this.message_list.rows;
-if(!_aa[uid]){
-return false;
-}
-if(_aa[uid].deleted&&this.env.deletedicon){
-_a9=this.env.deletedicon;
-}else{
-if(_aa[uid].replied&&this.env.repliedicon){
-if(_aa[uid].forwarded&&this.env.forwardedrepliedicon){
-_a9=this.env.forwardedrepliedicon;
-}else{
-_a9=this.env.repliedicon;
-}
-}else{
-if(_aa[uid].forwarded&&this.env.forwardedicon){
-_a9=this.env.forwardedicon;
-}else{
-if(_aa[uid].unread&&this.env.unreadicon){
-_a9=this.env.unreadicon;
-}else{
-if(this.env.messageicon){
-_a9=this.env.messageicon;
-}
-}
-}
-}
-}
-if(_a9&&_aa[uid].icon){
-_aa[uid].icon.src=_a9;
-}
-_a9="";
-if(_aa[uid].flagged&&this.env.flaggedicon){
-_a9=this.env.flaggedicon;
-}else{
-if(!_aa[uid].flagged&&this.env.unflaggedicon){
-_a9=this.env.unflaggedicon;
-}
-}
-if(_aa[uid].flagged_icon&&_a9){
-_aa[uid].flagged_icon.src=_a9;
-}
-};
-this.set_message_status=function(uid,_ac,_ad){
-var _ae=this.message_list.rows;
-if(!_ae[uid]){
-return false;
-}
-if(_ac=="unread"){
-_ae[uid].unread=_ad;
-}else{
-if(_ac=="deleted"){
-_ae[uid].deleted=_ad;
-}else{
-if(_ac=="replied"){
-_ae[uid].replied=_ad;
-}else{
-if(_ac=="forwarded"){
-_ae[uid].forwarded=_ad;
-}else{
-if(_ac=="flagged"){
-_ae[uid].flagged=_ad;
-}
-}
-}
-}
-}
-this.env.messages[uid]=_ae[uid];
-};
-this.set_message=function(uid,_b0,_b1){
-var _b2=this.message_list.rows;
-if(!_b2[uid]){
-return false;
-}
-if(_b0){
-this.set_message_status(uid,_b0,_b1);
-}
-var _b3=$(_b2[uid].obj);
-if(_b2[uid].unread&&_b2[uid].classname.indexOf("unread")<0){
-_b2[uid].classname+=" unread";
-_b3.addClass("unread");
-}else{
-if(!_b2[uid].unread&&_b2[uid].classname.indexOf("unread")>=0){
-_b2[uid].classname=_b2[uid].classname.replace(/\s*unread/,"");
-_b3.removeClass("unread");
-}
-}
-if(_b2[uid].deleted&&_b2[uid].classname.indexOf("deleted")<0){
-_b2[uid].classname+=" deleted";
-_b3.addClass("deleted");
-}else{
-if(!_b2[uid].deleted&&_b2[uid].classname.indexOf("deleted")>=0){
-_b2[uid].classname=_b2[uid].classname.replace(/\s*deleted/,"");
-_b3.removeClass("deleted");
-}
-}
-if(_b2[uid].flagged&&_b2[uid].classname.indexOf("flagged")<0){
-_b2[uid].classname+=" flagged";
-_b3.addClass("flagged");
-}else{
-if(!_b2[uid].flagged&&_b2[uid].classname.indexOf("flagged")>=0){
-_b2[uid].classname=_b2[uid].classname.replace(/\s*flagged/,"");
-_b3.removeClass("flagged");
-}
-}
-this.set_message_icon(uid);
-};
-this.move_messages=function(_b4){
-if(!_b4||_b4==this.env.mailbox||(!this.env.uid&&(!this.message_list||!this.message_list.get_selection().length))){
-return;
-}
-var _b5=false;
-var _b6="&_target_mbox="+urlencode(_b4)+"&_from="+(this.env.action?this.env.action:"");
-if(this.env.action=="show"){
-_b5=true;
-this.set_busy(true,"movingmessage");
-}else{
-this.show_contentframe(false);
-}
-this.enable_command("reply","reply-all","forward","delete","mark","print","open","edit","viewsource","download",false);
-this._with_selected_messages("moveto",_b5,_b6);
-};
-this.delete_messages=function(){
-var _b7=this.message_list?this.message_list.get_selection():new Array();
-if(!this.env.uid&&!_b7.length){
-return;
-}
-if(this.env.flag_for_deletion){
-this.mark_message("delete");
-}else{
-if(!this.env.trash_mailbox||String(this.env.mailbox).toLowerCase()==String(this.env.trash_mailbox).toLowerCase()){
-this.permanently_remove_messages();
-}else{
-if(this.message_list&&this.message_list.shiftkey){
-if(confirm(this.get_label("deletemessagesconfirm"))){
-this.permanently_remove_messages();
-}
-}else{
-this.move_messages(this.env.trash_mailbox);
-}
-}
-}
-};
-this.permanently_remove_messages=function(){
-if(!this.env.uid&&(!this.message_list||!this.message_list.get_selection().length)){
-return;
-}
-this.show_contentframe(false);
-this._with_selected_messages("delete",false,"&_from="+(this.env.action?this.env.action:""));
-};
-this._with_selected_messages=function(_b8,_b9,_ba,_bb){
-var _bc=new Array();
-if(this.env.uid){
-_bc[0]=this.env.uid;
-}else{
-var _bd=this.message_list.get_selection();
-var _be=this.message_list.rows;
-var id;
-for(var n=0;n<_bd.length;n++){
-id=_bd[n];
-_bc[_bc.length]=id;
-this.message_list.remove_row(id,(this.env.display_next&&n==_bd.length-1));
-}
-if(!this.env.display_next){
-this.message_list.clear_selection();
-}
-}
-if(this.env.search_request){
-_ba+="&_search="+this.env.search_request;
-}
-if(this.env.display_next&&this.env.next_uid){
-_ba+="&_next_uid="+this.env.next_uid;
-}
-this.http_post(_b8,"_uid="+_bc.join(",")+"&_mbox="+urlencode(this.env.mailbox)+_ba,_b9);
-};
-this.mark_message=function(_c1,uid){
-var _c3=new Array();
-var _c4=new Array();
-var _c5=this.message_list?this.message_list.get_selection():new Array();
-if(uid){
-_c3[0]=uid;
-}else{
-if(this.env.uid){
-_c3[0]=this.env.uid;
-}else{
-if(this.message_list){
-for(var n=0;n<_c5.length;n++){
-_c3[_c3.length]=_c5[n];
-}
-}
-}
-}
-if(!this.message_list){
-_c4=_c3;
-}else{
-for(var id,n=0;n<_c3.length;n++){
-id=_c3[n];
-if((_c1=="read"&&this.message_list.rows[id].unread)||(_c1=="unread"&&!this.message_list.rows[id].unread)||(_c1=="delete"&&!this.message_list.rows[id].deleted)||(_c1=="undelete"&&this.message_list.rows[id].deleted)||(_c1=="flagged"&&!this.message_list.rows[id].flagged)||(_c1=="unflagged"&&this.message_list.rows[id].flagged)){
-_c4[_c4.length]=id;
-}
-}
-}
-if(!_c4.length){
-return;
-}
-switch(_c1){
-case "read":
-case "unread":
-this.toggle_read_status(_c1,_c4);
-break;
-case "delete":
-case "undelete":
-this.toggle_delete_status(_c4);
-break;
-case "flagged":
-case "unflagged":
-this.toggle_flagged_status(_c1,_c3);
-break;
-}
-};
-this.toggle_read_status=function(_c8,_c9){
-for(var i=0;i<_c9.length;i++){
-this.set_message(_c9[i],"unread",(_c8=="unread"?true:false));
-}
-this.http_post("mark","_uid="+_c9.join(",")+"&_flag="+_c8);
-};
-this.toggle_flagged_status=function(_cb,_cc){
-for(var i=0;i<_cc.length;i++){
-this.set_message(_cc[i],"flagged",(_cb=="flagged"?true:false));
-}
-this.http_post("mark","_uid="+_cc.join(",")+"&_flag="+_cb);
-};
-this.toggle_delete_status=function(_ce){
-var _cf=this.message_list?this.message_list.rows:new Array();
-if(_ce.length==1){
-if(!_cf.length||(_cf[_ce[0]]&&!_cf[_ce[0]].deleted)){
-this.flag_as_deleted(_ce);
-}else{
-this.flag_as_undeleted(_ce);
-}
-return true;
-}
-var _d0=true;
-for(var i=0;i<_ce.length;i++){
-uid=_ce[i];
-if(_cf[uid]){
-if(!_cf[uid].deleted){
-_d0=false;
-break;
-}
-}
-}
-if(_d0){
-this.flag_as_undeleted(_ce);
-}else{
-this.flag_as_deleted(_ce);
-}
-return true;
-};
-this.flag_as_undeleted=function(_d2){
-for(var i=0;i<_d2.length;i++){
-this.set_message(_d2[i],"deleted",false);
-}
-this.http_post("mark","_uid="+_d2.join(",")+"&_flag=undelete");
-return true;
-};
-this.flag_as_deleted=function(_d4){
-var _d5="";
-var _d6=new Array();
-var _d7=this.message_list?this.message_list.rows:new Array();
-for(var i=0;i<_d4.length;i++){
-uid=_d4[i];
-if(_d7[uid]){
-if(_d7[uid].unread){
-_d6[_d6.length]=uid;
-}
-if(this.env.skip_deleted){
-this.message_list.remove_row(uid,(this.env.display_next&&i==this.message_list.selection.length-1));
-}else{
-this.set_message(uid,"deleted",true);
-}
-}
-}
-if(this.env.skip_deleted&&!this.env.display_next&&this.message_list){
-this.message_list.clear_selection();
-}
-_d5="&_from="+(this.env.action?this.env.action:"");
-if(_d6.length){
-_d5+="&_ruid="+_d6.join(",");
-}
-if(this.env.skip_deleted){
-if(this.env.search_request){
-_d5+="&_search="+this.env.search_request;
-}
-if(this.env.display_next&&this.env.next_uid){
-_d5+="&_next_uid="+this.env.next_uid;
-}
-}
-this.http_post("mark","_uid="+_d4.join(",")+"&_flag=delete"+_d5);
-return true;
-};
-this.flag_deleted_as_read=function(_d9){
-var _da;
-var _db=this.message_list?this.message_list.rows:new Array();
-var str=String(_d9);
-var _dd=new Array();
-_dd=str.split(",");
-for(var uid,i=0;i<_dd.length;i++){
-uid=_dd[i];
-if(_db[uid]){
-this.set_message(uid,"unread",false);
-}
-}
-};
-this.login_user_keyup=function(e){
-var key=rcube_event.get_keycode(e);
-var _e2=$("#rcmloginpwd");
-if(key==13&&_e2.length&&!_e2.val()){
-_e2.focus();
-return rcube_event.cancel(e);
-}
-return true;
-};
-this.check_compose_input=function(){
-var _e3=$("[name='_to']");
-var _e4=$("[name='_cc']");
-var _e5=$("[name='_bcc']");
-var _e6=$("[name='_from']");
-var _e7=$("[name='_subject']");
-var _e8=$("[name='_message']");
-if(_e6.attr("type")=="text"&&!rcube_check_email(_e6.val(),true)){
-alert(this.get_label("nosenderwarning"));
-_e6.focus();
-return false;
-}
-var _e9=_e3.val()?_e3.val():(_e4.val()?_e4.val():_e5.val());
-if(!rcube_check_email(_e9.replace(/^\s+/,"").replace(/[\s,;]+$/,""),true)){
-alert(this.get_label("norecipientwarning"));
-_e3.focus();
-return false;
-}
-for(var key in this.env.attachments){
-if(typeof this.env.attachments[key]=="object"&&!this.env.attachments[key].complete){
-alert(this.get_label("notuploadedwarning"));
-return false;
-}
-}
-if(_e7.val()==""){
-var _eb=prompt(this.get_label("nosubjectwarning"),this.get_label("nosubject"));
-if(!_eb&&_eb!==""){
-_e7.focus();
-return false;
-}else{
-_e7.val((_eb?_eb:this.get_label("nosubject")));
-}
-}
-if((!window.tinyMCE||!tinyMCE.get(this.env.composebody))&&_e8.val()==""&&!confirm(this.get_label("nobodywarning"))){
-_e8.focus();
-return false;
-}else{
-if(window.tinyMCE&&tinyMCE.get(this.env.composebody)&&!tinyMCE.get(this.env.composebody).getContent()&&!confirm(this.get_label("nobodywarning"))){
-tinyMCE.get(this.env.composebody).focus();
-return false;
-}
-}
-this.stop_spellchecking();
-if(window.tinyMCE&&tinyMCE.get(this.env.composebody)){
-tinyMCE.triggerSave();
-}
-return true;
-};
-this.stop_spellchecking=function(){
-if(this.env.spellcheck&&!this.spellcheck_ready){
-$(this.env.spellcheck.spell_span).trigger("click");
-this.set_spellcheck_state("ready");
-}
-};
-this.display_spellcheck_controls=function(vis){
-if(this.env.spellcheck){
-if(!vis){
-this.stop_spellchecking();
-}
-$(this.env.spellcheck.spell_container).css("visibility",vis?"visible":"hidden");
-}
-};
-this.set_spellcheck_state=function(s){
-this.spellcheck_ready=(s=="ready"||s=="no_error_found");
-this.enable_command("spellcheck",this.spellcheck_ready);
-};
-this.set_draft_id=function(id){
-$("input[name='_draft_saveid']").val(id);
-};
-this.auto_save_start=function(){
-if(this.env.draft_autosave){
-this.save_timer=self.setTimeout(function(){
-_1.command("savedraft");
-},this.env.draft_autosave*1000);
-}
-this.busy=false;
-};
-this.compose_field_hash=function(_ef){
-var _f0=$("[name='_to']").val();
-var _f1=$("[name='_cc']").val();
-var _f2=$("[name='_bcc']").val();
-var _f3=$("[name='_subject']").val();
-var str="";
-if(_f0){
-str+=_f0+":";
-}
-if(_f1){
-str+=_f1+":";
-}
-if(_f2){
-str+=_f2+":";
-}
-if(_f3){
-str+=_f3+":";
-}
-var _f5=tinyMCE.get(this.env.composebody);
-if(_f5){
-str+=_f5.getContent();
-}else{
-str+=$("[name='_message']").val();
-}
-if(this.env.attachments){
-for(var _f6 in this.env.attachments){
-str+=_f6;
-}
-}
-if(_ef){
-this.cmp_hash=str;
-}
-return str;
-};
-this.change_identity=function(obj){
-if(!obj||!obj.options){
-return false;
-}
-var id=obj.options[obj.selectedIndex].value;
-var _f9=$("[name='_message']");
-var _fa=_f9.val();
-var _fb=($("input[name='_is_html']").val()=="1");
-var sig,p,len;
-if(!this.env.identity){
-this.env.identity=id;
-}
-if(!_fb){
-if(this.env.identity&&this.env.signatures&&this.env.signatures[this.env.identity]){
-if(this.env.signatures[this.env.identity]["is_html"]){
-sig=this.env.signatures[this.env.identity]["plain_text"];
-}else{
-sig=this.env.signatures[this.env.identity]["text"];
-}
-if(sig.indexOf("-- ")!=0){
-sig="-- \n"+sig;
-}
-p=_fa.lastIndexOf(sig);
-if(p>=0){
-_fa=_fa.substring(0,p-1)+_fa.substring(p+sig.length,_fa.length);
-}
-}
-_fa=_fa.replace(/[\r\n]+$/,"");
-len=_fa.length;
-if(this.env.signatures&&this.env.signatures[id]){
-sig=this.env.signatures[id]["text"];
-if(this.env.signatures[id]["is_html"]){
-sig=this.env.signatures[id]["plain_text"];
-}
-if(sig.indexOf("-- ")!=0){
-sig="-- \n"+sig;
-}
-_fa+="\n\n"+sig;
-if(len){
-len+=1;
-}
-}
-}else{
-var _ff=tinyMCE.get(this.env.composebody);
-if(this.env.signatures){
-var _100=_ff.dom.get("_rc_sig");
-var _101="";
-var _102=true;
-if(!_100){
-if(bw.ie){
-_ff.getBody().appendChild(_ff.getDoc().createElement("br"));
-}
-_100=_ff.getDoc().createElement("div");
-_100.setAttribute("id","_rc_sig");
-_ff.getBody().appendChild(_100);
-}
-if(this.env.signatures[id]){
-_101=this.env.signatures[id]["text"];
-_102=this.env.signatures[id]["is_html"];
-if(_101){
-if(_102&&this.env.signatures[id]["plain_text"].indexOf("-- ")!=0){
-_101="<p>-- </p>"+_101;
-}else{
-if(!_102&&_101.indexOf("-- ")!=0){
-_101="-- \n"+_101;
-}
-}
-}
-}
-if(_102){
-_100.innerHTML=_101;
-}else{
-_100.innerHTML="<pre>"+_101+"</pre>";
-}
-}
-}
-_f9.val(_fa);
-if(!_fb){
-this.set_caret_pos(_f9.get(0),len);
-}
-this.env.identity=id;
-return true;
-};
-this.show_attachment_form=function(a){
-if(!this.gui_objects.uploadbox){
-return false;
-}
-var elm,list;
-if(elm=this.gui_objects.uploadbox){
-if(a&&(list=this.gui_objects.attachmentlist)){
-var pos=$(list).offset();
-elm.style.top=(pos.top+list.offsetHeight+10)+"px";
-elm.style.left=pos.left+"px";
-}
-elm.style.visibility=a?"visible":"hidden";
-}
-try{
-if(!a&&this.gui_objects.attachmentform!=this.gui_objects.messageform){
-this.gui_objects.attachmentform.reset();
-}
-}
-catch(e){
-}
-return true;
-};
-this.upload_file=function(form){
-if(!form){
-return false;
-}
-var send=false;
-for(var n=0;n<form.elements.length;n++){
-if(form.elements[n].type=="file"&&form.elements[n].value){
-send=true;
-break;
-}
-}
-if(send){
-var ts=new Date().getTime();
-var _10b="rcmupload"+ts;
-if(document.all){
-var html="<iframe name=\""+_10b+"\" src=\"program/blank.gif\" style=\"width:0;height:0;visibility:hidden;\"></iframe>";
-document.body.insertAdjacentHTML("BeforeEnd",html);
-}else{
-var _10d=document.createElement("iframe");
-_10d.name=_10b;
-_10d.style.border="none";
-_10d.style.width=0;
-_10d.style.height=0;
-_10d.style.visibility="hidden";
-document.body.appendChild(_10d);
-}
-var fr=document.getElementsByName(_10b)[0];
-$(fr).bind("load",{ts:ts},function(e){
-var _110="";
-try{
-if(this.contentDocument){
-var d=this.contentDocument;
-}else{
-if(this.contentWindow){
-var d=this.contentWindow.document;
-}
-}
-_110=d.childNodes[0].innerHTML;
-}
-catch(e){
-}
-if(!String(_110).match(/add2attachment/)&&(!bw.opera||(rcmail.env.uploadframe&&rcmail.env.uploadframe==e.data.ts))){
-rcmail.display_message(rcmail.get_label("fileuploaderror"),"error");
-rcmail.remove_from_attachment_list(e.data.ts);
-}
-if(bw.opera){
-rcmail.env.uploadframe=e.data.ts;
-}
-});
-form.target=_10b;
-form.action=this.env.comm_path+"&_action=upload&_uploadid="+ts;
-form.setAttribute("enctype","multipart/form-data");
-form.submit();
-this.show_attachment_form(false);
-var _112=this.get_label("uploading");
-if(this.env.loadingicon){
-_112="<img src=\""+this.env.loadingicon+"\" alt=\"\" />"+_112;
-}
-if(this.env.cancelicon){
-_112="<a title=\""+this.get_label("cancel")+"\" onclick=\"return rcmail.cancel_attachment_upload('"+ts+"', '"+_10b+"');\" href=\"#cancelupload\"><img src=\""+this.env.cancelicon+"\" alt=\"\" /></a>"+_112;
-}
-this.add2attachment_list(ts,{name:"",html:_112,complete:false});
-}
-this.gui_objects.attachmentform=form;
-return true;
-};
-this.add2attachment_list=function(name,att,_115){
-if(!this.gui_objects.attachmentlist){
-return false;
-}
-var li=$("<li>").attr("id",name).html(att.html);
-var _117;
-if(_115&&(_117=document.getElementById(_115))){
-li.replaceAll(_117);
-}else{
-li.appendTo(this.gui_objects.attachmentlist);
-}
-if(_115&&this.env.attachments[_115]){
-delete this.env.attachments[_115];
-}
-this.env.attachments[name]=att;
-return true;
-};
-this.remove_from_attachment_list=function(name){
-if(this.env.attachments[name]){
-delete this.env.attachments[name];
-}
-if(!this.gui_objects.attachmentlist){
-return false;
-}
-var list=this.gui_objects.attachmentlist.getElementsByTagName("li");
-for(i=0;i<list.length;i++){
-if(list[i].id==name){
-this.gui_objects.attachmentlist.removeChild(list[i]);
-}
-}
-};
-this.remove_attachment=function(name){
-if(name&&this.env.attachments[name]){
-this.http_post("remove-attachment","_file="+urlencode(name));
-}
-return true;
-};
-this.cancel_attachment_upload=function(name,_11c){
-if(!name||!_11c){
-return false;
-}
-this.remove_from_attachment_list(name);
-$("iframe[name='"+_11c+"']").remove();
-return false;
-};
-this.add_contact=function(_11d){
-if(_11d){
-this.http_post("addcontact","_address="+_11d);
-}
-return true;
-};
-this.qsearch=function(_11e){
-if(_11e!=""){
-var _11f="";
-if(this.message_list){
-this.message_list.clear();
-if(this.env.search_mods){
-var _120=new Array();
-for(var n in this.env.search_mods){
-_120.push(n);
-}
-_11f+="&_headers="+_120.join(",");
-}
-}else{
-if(this.contact_list){
-this.contact_list.clear(true);
-this.show_contentframe(false);
-}
-}
-if(this.gui_objects.search_filter){
-_11f+="&_filter="+this.gui_objects.search_filter.value;
-}
-this.env.current_page=1;
-this.set_busy(true,"searching");
-this.http_request("search","_q="+urlencode(_11e)+(this.env.mailbox?"&_mbox="+urlencode(this.env.mailbox):"")+(this.env.source?"&_source="+urlencode(this.env.source):"")+(_11f?_11f:""),true);
-}
-return true;
-};
-this.reset_qsearch=function(){
-if(this.gui_objects.qsearchbox){
-this.gui_objects.qsearchbox.value="";
-}
-this.env.search_request=null;
-return true;
-};
-this.sent_successfully=function(type,msg){
-this.list_mailbox();
-this.display_message(msg,type,true);
-};
-this.ksearch_keypress=function(e,obj){
-if(this.ksearch_timer){
-clearTimeout(this.ksearch_timer);
-}
-var _126;
-var key=rcube_event.get_keycode(e);
-var mod=rcube_event.get_modifier(e);
-switch(key){
-case 38:
-case 40:
-if(!this.ksearch_pane){
-break;
-}
-var dir=key==38?1:0;
-_126=document.getElementById("rcmksearchSelected");
-if(!_126){
-_126=this.ksearch_pane.__ul.firstChild;
-}
-if(_126){
-this.ksearch_select(dir?_126.previousSibling:_126.nextSibling);
-}
-return rcube_event.cancel(e);
-case 9:
-if(mod==SHIFT_KEY){
-break;
-}
-case 13:
-if(this.ksearch_selected===null||!this.ksearch_input||!this.ksearch_value){
-break;
-}
-this.insert_recipient(this.ksearch_selected);
-this.ksearch_hide();
-return rcube_event.cancel(e);
-case 27:
-this.ksearch_hide();
-break;
-case 37:
-case 39:
-if(mod!=SHIFT_KEY){
-return;
-}
-}
-this.ksearch_timer=window.setTimeout(function(){
-_1.ksearch_get_results();
-},200);
-this.ksearch_input=obj;
-return true;
-};
-this.ksearch_select=function(node){
-var _12b=$("#rcmksearchSelected");
-if(_12b[0]&&node){
-_12b.removeAttr("id").removeClass("selected");
-}
-if(node){
-$(node).attr("id","rcmksearchSelected").addClass("selected");
-this.ksearch_selected=node._rcm_id;
-}
-};
-this.insert_recipient=function(id){
-if(!this.env.contacts[id]||!this.ksearch_input){
-return;
-}
-var _12d=this.ksearch_input.value;
-var cpos=this.get_caret_pos(this.ksearch_input);
-var p=_12d.lastIndexOf(this.ksearch_value,cpos);
-var pre=this.ksearch_input.value.substring(0,p);
-var end=this.ksearch_input.value.substring(p+this.ksearch_value.length,this.ksearch_input.value.length);
-var _132=this.env.contacts[id]+", ";
-this.ksearch_input.value=pre+_132+end;
-cpos=p+_132.length;
-if(this.ksearch_input.setSelectionRange){
-this.ksearch_input.setSelectionRange(cpos,cpos);
-}
-};
-this.ksearch_get_results=function(){
-var _133=this.ksearch_input?this.ksearch_input.value:null;
-if(_133===null){
-return;
-}
-if(this.ksearch_pane&&this.ksearch_pane.is(":visible")){
-this.ksearch_pane.hide();
-}
-var cpos=this.get_caret_pos(this.ksearch_input);
-var p=_133.lastIndexOf(",",cpos-1);
-var q=_133.substring(p+1,cpos);
-q=q.replace(/(^\s+|\s+$)/g,"");
-if(q==this.ksearch_value){
-return;
-}
-var _137=this.ksearch_value;
-this.ksearch_value=q;
-if(!q.length){
-return;
-}
-if(_137&&_137.length&&this.env.contacts&&!this.env.contacts.length&&q.indexOf(_137)==0){
-return;
-}
-this.display_message(this.get_label("searching"),"loading",true);
-this.http_post("autocomplete","_search="+urlencode(q));
-};
-this.ksearch_query_results=function(_138,_139){
-if(this.ksearch_value&&_139!=this.ksearch_value){
-return;
-}
-this.hide_message();
-this.env.contacts=_138?_138:[];
-this.ksearch_display_results(this.env.contacts);
-};
-this.ksearch_display_results=function(_13a){
-if(_13a.length&&this.ksearch_input){
-var p,ul,li;
-if(!this.ksearch_pane){
-ul=$("<ul>");
-this.ksearch_pane=$("<div>").attr("id","rcmKSearchpane").css({position:"absolute","z-index":30000}).append(ul).appendTo(document.body);
-this.ksearch_pane.__ul=ul[0];
-}
-ul=this.ksearch_pane.__ul;
-ul.innerHTML="";
-for(i=0;i<_13a.length;i++){
-li=document.createElement("LI");
-li.innerHTML=_13a[i].replace(new RegExp("("+this.ksearch_value+")","ig"),"##$1%%").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/##([^%]+)%%/g,"<b>$1</b>");
-li.onmouseover=function(){
-_1.ksearch_select(this);
-};
-li.onmouseup=function(){
-_1.ksearch_click(this);
-};
-li._rcm_id=i;
-ul.appendChild(li);
-}
-$(ul.firstChild).attr("id","rcmksearchSelected").addClass("selected");
-this.ksearch_selected=0;
-var pos=$(this.ksearch_input).offset();
-this.ksearch_pane.css({left:pos.left+"px",top:(pos.top+this.ksearch_input.offsetHeight)+"px"}).show();
-}else{
-this.ksearch_hide();
-}
-};
-this.ksearch_click=function(node){
-if(this.ksearch_input){
-this.ksearch_input.focus();
-}
-this.insert_recipient(node._rcm_id);
-this.ksearch_hide();
-};
-this.ksearch_blur=function(){
-if(this.ksearch_timer){
-clearTimeout(this.ksearch_timer);
-}
-this.ksearch_value="";
-this.ksearch_input=null;
-this.ksearch_hide();
-};
-this.ksearch_hide=function(){
-this.ksearch_selected=null;
-if(this.ksearch_pane){
-this.ksearch_pane.hide();
-}
-};
-this.contactlist_keypress=function(list){
-if(list.key_pressed==list.DELETE_KEY){
-this.command("delete");
-}
-};
-this.contactlist_select=function(list){
-if(this.preview_timer){
-clearTimeout(this.preview_timer);
-}
-var id,_143,_1=this;
-if(id=list.get_single_selection()){
-this.preview_timer=window.setTimeout(function(){
-_1.load_contact(id,"show");
-},200);
-}else{
-if(this.env.contentframe){
-this.show_contentframe(false);
-}
-}
-this.enable_command("compose",list.selection.length>0);
-this.enable_command("edit",(id&&this.env.address_sources&&!this.env.address_sources[this.env.source].readonly)?true:false);
-this.enable_command("delete",list.selection.length&&this.env.address_sources&&!this.env.address_sources[this.env.source].readonly);
-return false;
-};
-this.list_contacts=function(src,page){
-var _146="";
-var _147=window;
-if(!src){
-src=this.env.source;
-}
-if(page&&this.current_page==page&&src==this.env.source){
-return false;
-}
-if(src!=this.env.source){
-page=1;
-this.env.current_page=page;
-this.reset_qsearch();
-}
-this.select_folder(src,this.env.source);
-this.env.source=src;
-if(this.gui_objects.contactslist){
-this.list_contacts_remote(src,page);
-return;
-}
-if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){
-_147=window.frames[this.env.contentframe];
-_146="&_framed=1";
-}
-if(this.env.search_request){
-_146+="&_search="+this.env.search_request;
-}
-this.set_busy(true,"loading");
-_147.location.href=this.env.comm_path+(src?"&_source="+urlencode(src):"")+(page?"&_page="+page:"")+_146;
-};
-this.list_contacts_remote=function(src,page){
-this.contact_list.clear(true);
-this.show_contentframe(false);
-this.enable_command("delete","compose",false);
-var url=(src?"_source="+urlencode(src):"")+(page?(src?"&":"")+"_page="+page:"");
-this.env.source=src;
-if(this.env.search_request){
-url+="&_search="+this.env.search_request;
-}
-this.set_busy(true,"loading");
-this.http_request("list",url,true);
-};
-this.load_contact=function(cid,_14c,_14d){
-var _14e="";
-var _14f=window;
-if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){
-_14e="&_framed=1";
-_14f=window.frames[this.env.contentframe];
-this.show_contentframe(true);
-}else{
-if(_14d){
-return false;
-}
-}
-if(_14c&&(cid||_14c=="add")&&!this.drag_active){
-this.set_busy(true);
-_14f.location.href=this.env.comm_path+"&_action="+_14c+"&_source="+urlencode(this.env.source)+"&_cid="+urlencode(cid)+_14e;
-}
-return true;
-};
-this.copy_contact=function(cid,to){
-if(!cid){
-cid=this.contact_list.get_selection().join(",");
-}
-if(to!=this.env.source&&cid&&this.env.address_sources[to]&&!this.env.address_sources[to].readonly){
-this.http_post("copy","_cid="+urlencode(cid)+"&_source="+urlencode(this.env.source)+"&_to="+urlencode(to));
-}
-};
-this.delete_contacts=function(){
-var _152=this.contact_list.get_selection();
-if(!(_152.length||this.env.cid)||!confirm(this.get_label("deletecontactconfirm"))){
-return;
-}
-var _153=new Array();
-var qs="";
-if(this.env.cid){
-_153[_153.length]=this.env.cid;
-}else{
-var id;
-for(var n=0;n<_152.length;n++){
-id=_152[n];
-_153[_153.length]=id;
-this.contact_list.remove_row(id,(n==_152.length-1));
-}
-if(_152.length==1){
-this.show_contentframe(false);
-}
-}
-if(this.env.search_request){
-qs+="&_search="+this.env.search_request;
-}
-this.http_post("delete","_cid="+urlencode(_153.join(","))+"&_source="+urlencode(this.env.source)+"&_from="+(this.env.action?this.env.action:"")+qs);
-return true;
-};
-this.update_contact_row=function(cid,_158,_159){
-var row;
-if(this.contact_list.rows[cid]&&(row=this.contact_list.rows[cid].obj)){
-for(var c=0;c<_158.length;c++){
-if(row.cells[c]){
-$(row.cells[c]).html(_158[c]);
-}
-}
-if(_159){
-row.id="rcmrow"+_159;
-this.contact_list.remove_row(cid);
-this.contact_list.init_row(row);
-this.contact_list.selection[0]=_159;
-row.style.display="";
-}
-return true;
-}
-return false;
-};
-this.add_contact_row=function(cid,cols,_15e){
-if(!this.gui_objects.contactslist||!this.gui_objects.contactslist.tBodies[0]){
-return false;
-}
-var _15f=this.gui_objects.contactslist.tBodies[0];
-var _160=_15f.rows.length;
-var even=_160%2;
-var row=document.createElement("tr");
-row.id="rcmrow"+cid;
-row.className="contact "+(even?"even":"odd");
-if(this.contact_list.in_selection(cid)){
-row.className+=" selected";
-}
-for(var c in cols){
-col=document.createElement("td");
-col.className=String(c).toLowerCase();
-col.innerHTML=cols[c];
-row.appendChild(col);
-}
-this.contact_list.insert_row(row);
-this.enable_command("export",(this.contact_list.rowcount>0));
-};
-this.init_subscription_list=function(){
-var p=this;
-this.subscription_list=new rcube_list_widget(this.gui_objects.subscriptionlist,{multiselect:false,draggable:true,keyboard:false,toggleselect:true});
-this.subscription_list.addEventListener("select",function(o){
-p.subscription_select(o);
-});
-this.subscription_list.addEventListener("dragstart",function(o){
-p.drag_active=true;
-});
-this.subscription_list.addEventListener("dragend",function(o){
-p.subscription_move_folder(o);
-});
-this.subscription_list.row_init=function(row){
-var _169=row.obj.getElementsByTagName("a");
-if(_169[0]){
-_169[0].onclick=function(){
-p.rename_folder(row.id);
-return false;
-};
-}
-if(_169[1]){
-_169[1].onclick=function(){
-p.delete_folder(row.id);
-return false;
-};
-}
-row.obj.onmouseover=function(){
-p.focus_subscription(row.id);
-};
-row.obj.onmouseout=function(){
-p.unfocus_subscription(row.id);
-};
-};
-this.subscription_list.init();
-};
-this.section_select=function(list){
-var id=list.get_single_selection();
-if(id){
-var _16c="";
-var _16d=window;
-this.set_busy(true);
-if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){
-_16c="&_framed=1";
-_16d=window.frames[this.env.contentframe];
-}
-_16d.location.href=this.env.comm_path+"&_action=edit-prefs&_section="+id+_16c;
-}
-return true;
-};
-this.identity_select=function(list){
-var id;
-if(id=list.get_single_selection()){
-this.load_identity(id,"edit-identity");
-}
-};
-this.load_identity=function(id,_171){
-if(_171=="edit-identity"&&(!id||id==this.env.iid)){
-return false;
-}
-var _172="";
-var _173=window;
-if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){
-_172="&_framed=1";
-_173=window.frames[this.env.contentframe];
-document.getElementById(this.env.contentframe).style.visibility="inherit";
-}
-if(_171&&(id||_171=="add-identity")){
-this.set_busy(true);
-_173.location.href=this.env.comm_path+"&_action="+_171+"&_iid="+id+_172;
-}
-return true;
-};
-this.delete_identity=function(id){
-var _175=this.identity_list.get_selection();
-if(!(_175.length||this.env.iid)){
-return;
-}
-if(!id){
-id=this.env.iid?this.env.iid:_175[0];
-}
-this.goto_url("delete-identity","_iid="+id+"&_token="+this.env.request_token,true);
-return true;
-};
-this.focus_subscription=function(id){
-var row,_178;
-var reg=RegExp("["+RegExp.escape(this.env.delimiter)+"]?[^"+RegExp.escape(this.env.delimiter)+"]+$");
-if(this.drag_active&&this.env.folder&&(row=document.getElementById(id))){
-if(this.env.subscriptionrows[id]&&(_178=this.env.subscriptionrows[id][0])){
-if(this.check_droptarget(_178)&&!this.env.subscriptionrows[this.get_folder_row_id(this.env.folder)][2]&&(_178!=this.env.folder.replace(reg,""))&&(!_178.match(new RegExp("^"+RegExp.escape(this.env.folder+this.env.delimiter))))){
-this.set_env("dstfolder",_178);
-$(row).addClass("droptarget");
-}
-}else{
-if(this.env.folder.match(new RegExp(RegExp.escape(this.env.delimiter)))){
-this.set_env("dstfolder",this.env.delimiter);
-$(this.subscription_list.frame).addClass("droptarget");
-}
-}
-}
-};
-this.unfocus_subscription=function(id){
-var row=$("#"+id);
-this.set_env("dstfolder",null);
-if(this.env.subscriptionrows[id]&&row[0]){
-row.removeClass("droptarget");
-}else{
-$(this.subscription_list.frame).removeClass("droptarget");
-}
-};
-this.subscription_select=function(list){
-var id,_17e;
-if((id=list.get_single_selection())&&this.env.subscriptionrows["rcmrow"+id]&&(_17e=this.env.subscriptionrows["rcmrow"+id][0])){
-this.set_env("folder",_17e);
-}else{
-this.set_env("folder",null);
-}
-if(this.gui_objects.createfolderhint){
-$(this.gui_objects.createfolderhint).html(this.env.folder?this.get_label("addsubfolderhint"):"");
-}
-};
-this.subscription_move_folder=function(list){
-var reg=RegExp("["+RegExp.escape(this.env.delimiter)+"]?[^"+RegExp.escape(this.env.delimiter)+"]+$");
-if(this.env.folder&&this.env.dstfolder&&(this.env.dstfolder!=this.env.folder)&&(this.env.dstfolder!=this.env.folder.replace(reg,""))){
-var reg=new RegExp("[^"+RegExp.escape(this.env.delimiter)+"]*["+RegExp.escape(this.env.delimiter)+"]","g");
-var _181=this.env.folder.replace(reg,"");
-var _182=this.env.dstfolder==this.env.delimiter?_181:this.env.dstfolder+this.env.delimiter+_181;
-this.set_busy(true,"foldermoving");
-this.http_post("rename-folder","_folder_oldname="+urlencode(this.env.folder)+"&_folder_newname="+urlencode(_182),true);
-}
-this.drag_active=false;
-this.unfocus_subscription(this.get_folder_row_id(this.env.dstfolder));
-};
-this.create_folder=function(name){
-if(this.edit_folder){
-this.reset_folder_rename();
-}
-var form;
-if((form=this.gui_objects.editform)&&form.elements["_folder_name"]){
-name=form.elements["_folder_name"].value;
-if(name.indexOf(this.env.delimiter)>=0){
-alert(this.get_label("forbiddencharacter")+" ("+this.env.delimiter+")");
-return false;
-}
-if(this.env.folder&&name!=""){
-name=this.env.folder+this.env.delimiter+name;
-}
-this.set_busy(true,"foldercreating");
-this.http_post("create-folder","_name="+urlencode(name),true);
-}else{
-if(form.elements["_folder_name"]){
-form.elements["_folder_name"].focus();
-}
-}
-};
-this.rename_folder=function(id){
-var temp,row,form;
-if(temp=this.edit_folder){
-this.reset_folder_rename();
-if(temp==id){
-return;
-}
-}
-if(id&&this.env.subscriptionrows[id]&&(row=document.getElementById(id))){
-var reg=new RegExp(".*["+RegExp.escape(this.env.delimiter)+"]");
-this.name_input=document.createElement("input");
-this.name_input.type="text";
-this.name_input.value=this.env.subscriptionrows[id][0].replace(reg,"");
-reg=new RegExp("["+RegExp.escape(this.env.delimiter)+"]?[^"+RegExp.escape(this.env.delimiter)+"]+$");
-this.name_input.__parent=this.env.subscriptionrows[id][0].replace(reg,"");
-this.name_input.onkeypress=function(e){
-rcmail.name_input_keypress(e);
-};
-row.cells[0].replaceChild(this.name_input,row.cells[0].firstChild);
-this.edit_folder=id;
-this.name_input.select();
-if(form=this.gui_objects.editform){
-form.onsubmit=function(){
-return false;
-};
-}
-}
-};
-this.reset_folder_rename=function(){
-var cell=this.name_input?this.name_input.parentNode:null;
-if(cell&&this.edit_folder&&this.env.subscriptionrows[this.edit_folder]){
-$(cell).html(this.env.subscriptionrows[this.edit_folder][1]);
-}
-this.edit_folder=null;
-};
-this.name_input_keypress=function(e){
-var key=rcube_event.get_keycode(e);
-if(key==13){
-var _18e=this.name_input?this.name_input.value:null;
-if(this.edit_folder&&_18e){
-if(_18e.indexOf(this.env.delimiter)>=0){
-alert(this.get_label("forbiddencharacter")+" ("+this.env.delimiter+")");
-return false;
-}
-if(this.name_input.__parent){
-_18e=this.name_input.__parent+this.env.delimiter+_18e;
-}
-this.set_busy(true,"folderrenaming");
-this.http_post("rename-folder","_folder_oldname="+urlencode(this.env.subscriptionrows[this.edit_folder][0])+"&_folder_newname="+urlencode(_18e),true);
-}
-}else{
-if(key==27){
-this.reset_folder_rename();
-}
-}
-};
-this.delete_folder=function(id){
-var _190=this.env.subscriptionrows[id][0];
-if(this.edit_folder){
-this.reset_folder_rename();
-}
-if(_190&&confirm(this.get_label("deletefolderconfirm"))){
-this.set_busy(true,"folderdeleting");
-this.http_post("delete-folder","_mboxes="+urlencode(_190),true);
-this.set_env("folder",null);
-$(this.gui_objects.createfolderhint).html("");
-}
-};
-this.add_folder_row=function(name,_192,_193,_194){
-if(!this.gui_objects.subscriptionlist){
-return false;
-}
-for(var _195 in this.env.subscriptionrows){
-if(this.env.subscriptionrows[_195]!=null&&!this.env.subscriptionrows[_195][2]){
-break;
-}
-}
-var _196,form;
-var _198=this.gui_objects.subscriptionlist.tBodies[0];
-var id="rcmrow"+(_198.childNodes.length+1);
-var _19a=this.subscription_list.get_single_selection();
-if(_193&&_193.id){
-id=_193.id;
-_195=_193.id;
-}
-if(!id||!(_196=document.getElementById(_195))){
-this.goto_url("folders");
-}else{
-var row=this.clone_table_row(_196);
-row.id=id;
-if(_194&&(_194=this.get_folder_row_id(_194))){
-_198.insertBefore(row,document.getElementById(_194));
-}else{
-_198.appendChild(row);
-}
-if(_193){
-_198.removeChild(_193);
-}
-}
-this.env.subscriptionrows[row.id]=[name,_192,0];
-row.cells[0].innerHTML=_192;
-if(!_193){
-row.cells[1].innerHTML="*";
-}
-if(!_193&&row.cells[2]&&row.cells[2].firstChild.tagName.toLowerCase()=="input"){
-row.cells[2].firstChild.value=name;
-row.cells[2].firstChild.checked=true;
-}
-if(!_193&&(form=this.gui_objects.editform)){
-if(form.elements["_folder_oldname"]){
-form.elements["_folder_oldname"].options[form.elements["_folder_oldname"].options.length]=new Option(name,name);
-}
-if(form.elements["_folder_name"]){
-form.elements["_folder_name"].value="";
-}
-}
-this.init_subscription_list();
-if(_19a&&document.getElementById("rcmrow"+_19a)){
-this.subscription_list.select_row(_19a);
-}
-if(document.getElementById(id).scrollIntoView){
-document.getElementById(id).scrollIntoView();
-}
-};
-this.replace_folder_row=function(_19c,_19d,_19e,_19f){
-var id=this.get_folder_row_id(_19c);
-var row=document.getElementById(id);
-this.add_folder_row(_19d,_19e,row,_19f);
-var form,elm;
-if((form=this.gui_objects.editform)&&(elm=form.elements["_folder_oldname"])){
-for(var i=0;i<elm.options.length;i++){
-if(elm.options[i].value==_19c){
-elm.options[i].text=_19e;
-elm.options[i].value=_19d;
-break;
-}
-}
-form.elements["_folder_newname"].value="";
-}
-};
-this.remove_folder_row=function(_1a5){
-var row;
-var id=this.get_folder_row_id(_1a5);
-if(id&&(row=document.getElementById(id))){
-row.style.display="none";
-}
-var form;
-if((form=this.gui_objects.editform)&&form.elements["_folder_oldname"]){
-for(var i=0;i<form.elements["_folder_oldname"].options.length;i++){
-if(form.elements["_folder_oldname"].options[i].value==_1a5){
-form.elements["_folder_oldname"].options[i]=null;
-break;
-}
-}
-}
-if(form&&form.elements["_folder_newname"]){
-form.elements["_folder_newname"].value="";
-}
-};
-this.subscribe_folder=function(_1aa){
-if(_1aa){
-this.http_post("subscribe","_mbox="+urlencode(_1aa));
-}
-};
-this.unsubscribe_folder=function(_1ab){
-if(_1ab){
-this.http_post("unsubscribe","_mbox="+urlencode(_1ab));
-}
-};
-this.get_folder_row_id=function(_1ac){
-for(var id in this.env.subscriptionrows){
-if(this.env.subscriptionrows[id]&&this.env.subscriptionrows[id][0]==_1ac){
-break;
-}
-}
-return id;
-};
-this.clone_table_row=function(row){
-var cell,td;
-var _1b1=document.createElement("tr");
-for(var n=0;n<row.cells.length;n++){
-cell=row.cells[n];
-td=document.createElement("td");
-if(cell.className){
-td.className=cell.className;
-}
-if(cell.align){
-td.setAttribute("align",cell.align);
-}
-td.innerHTML=cell.innerHTML;
-_1b1.appendChild(td);
-}
-return _1b1;
-};
-this.set_page_buttons=function(){
-this.enable_command("nextpage",(this.env.pagecount>this.env.current_page));
-this.enable_command("lastpage",(this.env.pagecount>this.env.current_page));
-this.enable_command("previouspage",(this.env.current_page>1));
-this.enable_command("firstpage",(this.env.current_page>1));
-};
-this.init_buttons=function(){
-for(var cmd in this.buttons){
-if(typeof cmd!="string"){
-continue;
-}
-for(var i=0;i<this.buttons[cmd].length;i++){
-var prop=this.buttons[cmd][i];
-var elm=document.getElementById(prop.id);
-if(!elm){
-continue;
-}
-var _1b7=false;
-if(prop.type=="image"){
-elm=elm.parentNode;
-_1b7=true;
-}
-elm._command=cmd;
-elm._id=prop.id;
-if(prop.sel){
-elm.onmousedown=function(e){
-return rcmail.button_sel(this._command,this._id);
-};
-elm.onmouseup=function(e){
-return rcmail.button_out(this._command,this._id);
-};
-if(_1b7){
-new Image().src=prop.sel;
-}
-}
-if(prop.over){
-elm.onmouseover=function(e){
-return rcmail.button_over(this._command,this._id);
-};
-elm.onmouseout=function(e){
-return rcmail.button_out(this._command,this._id);
-};
-if(_1b7){
-new Image().src=prop.over;
-}
-}
-}
-}
-};
-this.set_button=function(_1bc,_1bd){
-var _1be=this.buttons[_1bc];
-var _1bf,obj;
-if(!_1be||!_1be.length){
-return false;
-}
-for(var n=0;n<_1be.length;n++){
-_1bf=_1be[n];
-obj=document.getElementById(_1bf.id);
-if(obj&&_1bf.type=="image"&&!_1bf.status){
-_1bf.pas=obj._original_src?obj._original_src:obj.src;
-if(obj.runtimeStyle&&obj.runtimeStyle.filter&&obj.runtimeStyle.filter.match(/src=['"]([^'"]+)['"]/)){
-_1bf.pas=RegExp.$1;
-}
-}else{
-if(obj&&!_1bf.status){
-_1bf.pas=String(obj.className);
-}
-}
-if(obj&&_1bf.type=="image"&&_1bf[_1bd]){
-_1bf.status=_1bd;
-obj.src=_1bf[_1bd];
-}else{
-if(obj&&typeof (_1bf[_1bd])!="undefined"){
-_1bf.status=_1bd;
-obj.className=_1bf[_1bd];
-}
-}
-if(obj&&_1bf.type=="input"){
-_1bf.status=_1bd;
-obj.disabled=!_1bd;
-}
-}
-};
-this.set_alttext=function(_1c2,_1c3){
-if(!this.buttons[_1c2]||!this.buttons[_1c2].length){
-return;
-}
-var _1c4,obj,link;
-for(var n=0;n<this.buttons[_1c2].length;n++){
-_1c4=this.buttons[_1c2][n];
-obj=document.getElementById(_1c4.id);
-if(_1c4.type=="image"&&obj){
-obj.setAttribute("alt",this.get_label(_1c3));
-if((link=obj.parentNode)&&link.tagName.toLowerCase()=="a"){
-link.setAttribute("title",this.get_label(_1c3));
-}
-}else{
-if(obj){
-obj.setAttribute("title",this.get_label(_1c3));
-}
-}
-}
-};
-this.button_over=function(_1c8,id){
-var _1ca=this.buttons[_1c8];
-var _1cb,elm;
-if(!_1ca||!_1ca.length){
-return false;
-}
-for(var n=0;n<_1ca.length;n++){
-_1cb=_1ca[n];
-if(_1cb.id==id&&_1cb.status=="act"){
-elm=document.getElementById(_1cb.id);
-if(elm&&_1cb.over){
-if(_1cb.type=="image"){
-elm.src=_1cb.over;
-}else{
-elm.className=_1cb.over;
-}
-}
-}
-}
-};
-this.button_sel=function(_1ce,id){
-var _1d0=this.buttons[_1ce];
-var _1d1,elm;
-if(!_1d0||!_1d0.length){
-return;
-}
-for(var n=0;n<_1d0.length;n++){
-_1d1=_1d0[n];
-if(_1d1.id==id&&_1d1.status=="act"){
-elm=document.getElementById(_1d1.id);
-if(elm&&_1d1.sel){
-if(_1d1.type=="image"){
-elm.src=_1d1.sel;
-}else{
-elm.className=_1d1.sel;
-}
-}
-this.buttons_sel[id]=_1ce;
-}
-}
-};
-this.button_out=function(_1d4,id){
-var _1d6=this.buttons[_1d4];
-var _1d7,elm;
-if(!_1d6||!_1d6.length){
-return;
-}
-for(var n=0;n<_1d6.length;n++){
-_1d7=_1d6[n];
-if(_1d7.id==id&&_1d7.status=="act"){
-elm=document.getElementById(_1d7.id);
-if(elm&&_1d7.act){
-if(_1d7.type=="image"){
-elm.src=_1d7.act;
-}else{
-elm.className=_1d7.act;
-}
-}
-}
-}
-};
-this.set_pagetitle=function(_1da){
-if(_1da&&document.title){
-document.title=_1da;
-}
-};
-this.display_message=function(msg,type,hold){
-if(!this.loaded){
-this.pending_message=new Array(msg,type);
-return true;
-}
-if(this.env.framed&&parent.rcmail){
-return parent.rcmail.display_message(msg,type,hold);
-}
-if(!this.gui_objects.message){
-return false;
-}
-if(this.message_timer){
-clearTimeout(this.message_timer);
-}
-var cont=msg;
-if(type){
-cont="<div class=\""+type+"\">"+cont+"</div>";
-}
-var obj=$(this.gui_objects.message).html(cont).show();
-if(type!="loading"){
-obj.bind("mousedown",function(){
-_1.hide_message();
-return true;
-});
-}
-if(!hold){
-this.message_timer=window.setTimeout(function(){
-_1.hide_message(true);
-},this.message_time);
-}
-};
-this.hide_message=function(fade){
-if(this.gui_objects.message){
-$(this.gui_objects.message).unbind()[(fade?"fadeOut":"hide")]();
-}
-};
-this.select_folder=function(name,old){
-if(this.gui_objects.folderlist){
-var _1e3,_1e4;
-if((_1e3=this.get_folder_li(old))){
-$(_1e3).removeClass("selected").removeClass("unfocused");
-}
-if((_1e4=this.get_folder_li(name))){
-$(_1e4).removeClass("unfocused").addClass("selected");
-}
-this.triggerEvent("selectfolder",{folder:name,old:old});
-}
-};
-this.get_folder_li=function(name){
-if(this.gui_objects.folderlist){
-name=String(name).replace(this.identifier_expr,"_");
-return document.getElementById("rcmli"+name);
-}
-return null;
-};
-this.set_message_coltypes=function(_1e6){
-this.coltypes=_1e6;
-var cell,col;
-var _1e9=this.gui_objects.messagelist?this.gui_objects.messagelist.tHead:null;
-for(var n=0;_1e9&&n<this.coltypes.length;n++){
-col=this.coltypes[n];
-if((cell=_1e9.rows[0].cells[n+1])&&(col=="from"||col=="to")){
-if(cell.firstChild&&cell.firstChild.tagName.toLowerCase()=="a"){
-cell.firstChild.innerHTML=this.get_label(this.coltypes[n]);
-cell.firstChild.onclick=function(){
-return rcmail.command("sort",this.__col,this);
-};
-cell.firstChild.__col=col;
-}else{
-cell.innerHTML=this.get_label(this.coltypes[n]);
-}
-cell.id="rcm"+col;
-}else{
-if(col=="subject"&&this.message_list){
-this.message_list.subject_col=n+1;
-}
-}
-}
-};
-this.add_message_row=function(uid,cols,_1ed,_1ee,_1ef){
-if(!this.gui_objects.messagelist||!this.message_list){
-return false;
-}
-if(this.message_list.background){
-var _1f0=this.message_list.background;
-}else{
-var _1f0=this.gui_objects.messagelist.tBodies[0];
-}
-var _1f1=_1f0.rows.length;
-var even=_1f1%2;
-this.env.messages[uid]={deleted:_1ed.deleted?1:0,replied:_1ed.replied?1:0,unread:_1ed.unread?1:0,forwarded:_1ed.forwarded?1:0,flagged:_1ed.flagged?1:0};
-var _1f3="message"+(even?" even":" odd")+(_1ed.unread?" unread":"")+(_1ed.deleted?" deleted":"")+(_1ed.flagged?" flagged":"")+(this.message_list.in_selection(uid)?" selected":"");
-var row=document.createElement("tr");
-row.id="rcmrow"+uid;
-row.className=_1f3;
-var icon=this.env.messageicon;
-if(_1ed.deleted&&this.env.deletedicon){
-icon=this.env.deletedicon;
-}else{
-if(_1ed.replied&&this.env.repliedicon){
-if(_1ed.forwarded&&this.env.forwardedrepliedicon){
-icon=this.env.forwardedrepliedicon;
-}else{
-icon=this.env.repliedicon;
-}
-}else{
-if(_1ed.forwarded&&this.env.forwardedicon){
-icon=this.env.forwardedicon;
-}else{
-if(_1ed.unread&&this.env.unreadicon){
-icon=this.env.unreadicon;
-}
-}
-}
-}
-var col=document.createElement("td");
-col.className="icon";
-col.innerHTML=icon?"<img src=\""+icon+"\" alt=\"\" />":"";
-row.appendChild(col);
-for(var n=0;n<this.coltypes.length;n++){
-var c=this.coltypes[n];
-col=document.createElement("td");
-col.className=String(c).toLowerCase();
-if(c=="flag"){
-if(_1ed.flagged&&this.env.flaggedicon){
-col.innerHTML="<img src=\""+this.env.flaggedicon+"\" alt=\"\" />";
-}else{
-if(!_1ed.flagged&&this.env.unflaggedicon){
-col.innerHTML="<img src=\""+this.env.unflaggedicon+"\" alt=\"\" />";
-}
-}
-}else{
-if(c=="attachment"){
-col.innerHTML=(_1ee&&this.env.attachmenticon?"<img src=\""+this.env.attachmenticon+"\" alt=\"\" />":"&nbsp;");
-}else{
-col.innerHTML=cols[c];
-}
-}
-row.appendChild(col);
-}
-this.message_list.insert_row(row,_1ef);
-if(_1ef&&this.env.pagesize&&this.message_list.rowcount>this.env.pagesize){
-var uid=this.message_list.get_last_row();
-this.message_list.remove_row(uid);
-this.message_list.clear_selection(uid);
-}
-};
-this.offline_message_list=function(flag){
-if(this.message_list){
-this.message_list.set_background_mode(flag);
-}
-};
-this.set_rowcount=function(text){
-$(this.gui_objects.countdisplay).html(text);
-this.set_page_buttons();
-};
-this.set_mailboxname=function(_1fb){
-if(this.gui_objects.mailboxname&&_1fb){
-this.gui_objects.mailboxname.innerHTML=_1fb;
-}
-};
-this.set_quota=function(_1fc){
-if(_1fc&&this.gui_objects.quotadisplay){
-if(typeof (_1fc)=="object"){
-this.percent_indicator(this.gui_objects.quotadisplay,_1fc);
-}else{
-$(this.gui_objects.quotadisplay).html(_1fc);
-}
-}
-};
-this.set_unread_count=function(mbox,_1fe,_1ff){
-if(!this.gui_objects.mailboxlist){
-return false;
-}
-this.env.unread_counts[mbox]=_1fe;
-this.set_unread_count_display(mbox,_1ff);
-};
-this.set_unread_count_display=function(mbox,_201){
-var reg,_203,item,_205,_206,div;
-if(item=this.get_folder_li(mbox)){
-_205=this.env.unread_counts[mbox]?this.env.unread_counts[mbox]:0;
-_203=item.getElementsByTagName("a")[0];
-reg=/\s+\([0-9]+\)$/i;
-_206=0;
-if((div=item.getElementsByTagName("div")[0])&&div.className.match(/collapsed/)){
-for(var k in this.env.unread_counts){
-if(k.indexOf(mbox+this.env.delimiter)==0){
-_206+=this.env.unread_counts[k];
-}
-}
-}
-if(_205&&_203.innerHTML.match(reg)){
-_203.innerHTML=_203.innerHTML.replace(reg," ("+_205+")");
-}else{
-if(_205){
-_203.innerHTML+=" ("+_205+")";
-}else{
-_203.innerHTML=_203.innerHTML.replace(reg,"");
-}
-}
-reg=new RegExp(RegExp.escape(this.env.delimiter)+"[^"+RegExp.escape(this.env.delimiter)+"]+$");
-if(mbox.match(reg)){
-this.set_unread_count_display(mbox.replace(reg,""),false);
-}
-if((_205+_206)>0){
-$(item).addClass("unread");
-}else{
-$(item).removeClass("unread");
-}
-}
-reg=/^\([0-9]+\)\s+/i;
-if(_201&&document.title){
-var _209=String(document.title);
-var _20a="";
-if(_205&&_209.match(reg)){
-_20a=_209.replace(reg,"("+_205+") ");
-}else{
-if(_205){
-_20a="("+_205+") "+_209;
-}else{
-_20a=_209.replace(reg,"");
-}
-}
-this.set_pagetitle(_20a);
-}
-};
-this.new_message_focus=function(){
-if(this.env.framed&&window.parent){
-window.parent.focus();
-}else{
-window.focus();
-}
-};
-this.toggle_prefer_html=function(_20b){
-var _20c;
-if(_20c=document.getElementById("rcmfd_addrbook_show_images")){
-_20c.disabled=!_20b.checked;
-}
-};
-this.set_headers=function(_20d){
-if(this.gui_objects.all_headers_row&&this.gui_objects.all_headers_box&&_20d){
-$(this.gui_objects.all_headers_box).html(_20d).show();
-if(this.env.framed&&parent.rcmail){
-parent.rcmail.set_busy(false);
-}else{
-this.set_busy(false);
-}
-}
-};
-this.load_headers=function(elem){
-if(!this.gui_objects.all_headers_row||!this.gui_objects.all_headers_box||!this.env.uid){
-return;
-}
-$(elem).removeClass("show-headers").addClass("hide-headers");
-$(this.gui_objects.all_headers_row).show();
-elem.onclick=function(){
-rcmail.hide_headers(elem);
-};
-if(!this.gui_objects.all_headers_box.innerHTML){
-this.display_message(this.get_label("loading"),"loading",true);
-this.http_post("headers","_uid="+this.env.uid);
-}
-};
-this.hide_headers=function(elem){
-if(!this.gui_objects.all_headers_row||!this.gui_objects.all_headers_box){
-return;
-}
-$(elem).removeClass("hide-headers").addClass("show-headers");
-$(this.gui_objects.all_headers_row).hide();
-elem.onclick=function(){
-rcmail.load_headers(elem);
-};
-};
-this.percent_indicator=function(obj,data){
-if(!data||!obj){
-return false;
-}
-var _212=80;
-var _213=55;
-var _214=data.width?data.width:this.env.indicator_width?this.env.indicator_width:100;
-var _215=data.height?data.height:this.env.indicator_height?this.env.indicator_height:14;
-var _216=data.percent?Math.abs(parseInt(data.percent)):0;
-var _217=parseInt(_216/100*_214);
-var pos=$(obj).position();
-this.env.indicator_width=_214;
-this.env.indicator_height=_215;
-if(_217>_214){
-_217=_214;
-_216=100;
-}
-var main=$("<div>");
-main.css({position:"absolute",top:pos.top,left:pos.left,width:_214+"px",height:_215+"px",zIndex:100,lineHeight:_215+"px"}).attr("title",data.title).addClass("quota_text").html(_216+"%");
-var bar1=$("<div>");
-bar1.css({position:"absolute",top:pos.top+1,left:pos.left+1,width:_217+"px",height:_215+"px",zIndex:99});
-var bar2=$("<div>");
-bar2.css({position:"absolute",top:pos.top+1,left:pos.left+1,width:_214+"px",height:_215+"px",zIndex:98}).addClass("quota_bg");
-if(_216>=_212){
-main.addClass(" quota_text_high");
-bar1.addClass("quota_high");
-}else{
-if(_216>=_213){
-main.addClass(" quota_text_mid");
-bar1.addClass("quota_mid");
-}else{
-main.addClass(" quota_text_normal");
-bar1.addClass("quota_low");
-}
-}
-obj.innerHTML="";
-$(obj).append(bar1).append(bar2).append(main);
-};
-this.html2plain=function(_21c,id){
-var url=this.env.bin_path+"html2text.php";
-var _21f=this;
-this.set_busy(true,"converting");
-console.log("HTTP POST: "+url);
-$.ajax({type:"POST",url:url,data:_21c,contentType:"application/octet-stream",error:function(o){
-_21f.http_error(o);
-},success:function(data){
-_21f.set_busy(false);
-$(document.getElementById(id)).val(data);
-console.log(data);
-}});
-};
-this.plain2html=function(_222,id){
-this.set_busy(true,"converting");
-$(document.getElementById(id)).val("<pre>"+_222+"</pre>");
-this.set_busy(false);
-};
-this.redirect=function(url,lock){
-if(lock||lock===null){
-this.set_busy(true);
-}
-if(this.env.framed&&window.parent){
-parent.location.href=url;
-}else{
-location.href=url;
-}
-};
-this.goto_url=function(_226,_227,lock){
-var _229=_227?"&"+_227:"";
-this.redirect(this.env.comm_path+"&_action="+_226+_229,lock);
-};
-this.http_request=function(_22a,_22b,lock){
-_22b+=(_22b?"&":"")+"_remote=1";
-var url=this.env.comm_path+"&_action="+_22a+"&"+_22b;
-console.log("HTTP POST: "+url);
-jQuery.get(url,{_unlock:(lock?1:0)},function(data){
-_1.http_response(data);
-},"json");
-};
-this.http_post=function(_22f,_230,lock){
-var url=this.env.comm_path+"&_action="+_22f;
-if(_230&&typeof (_230)=="object"){
-_230._remote=1;
-_230._unlock=(lock?1:0);
-}else{
-_230+=(_230?"&":"")+"_remote=1"+(lock?"&_unlock=1":"");
-}
-console.log("HTTP POST: "+url);
-jQuery.post(url,_230,function(data){
-_1.http_response(data);
-},"json");
-};
-this.http_response=function(_234){
-var _235="";
-if(_234.unlock){
-this.set_busy(false);
-}
-if(_234.env){
-this.set_env(_234.env);
-}
-if(typeof _234.texts=="object"){
-for(var name in _234.texts){
-if(typeof _234.texts[name]=="string"){
-this.add_label(name,_234.texts[name]);
-}
-}
-}
-if(_234.exec){
-console.log(_234.exec);
-eval(_234.exec);
-}
-if(_234.callbacks&&_234.callbacks.length){
-for(var i=0;i<_234.callbacks.length;i++){
-this.triggerEvent(_234.callbacks[i][0],_234.callbacks[i][1]);
-}
-}
-switch(_234.action){
-case "delete":
-if(this.task=="addressbook"){
-var uid=this.contact_list.get_selection();
-this.enable_command("compose",(uid&&this.contact_list.rows[uid]));
-this.enable_command("delete","edit",(uid&&this.contact_list.rows[uid]&&this.env.address_sources&&!this.env.address_sources[this.env.source].readonly));
-this.enable_command("export",(this.contact_list&&this.contact_list.rowcount>0));
-}
-case "moveto":
-if(this.env.action=="show"){
-this.enable_command("reply","reply-all","forward","delete","mark","print","open","edit","viewsource","download",true);
-}else{
-if(this.message_list){
-this.message_list.init();
-}
-}
-break;
-case "purge":
-case "expunge":
-if(!this.env.messagecount&&this.task=="mail"){
-if(this.env.contentframe){
-this.show_contentframe(false);
-}
-this.enable_command("show","reply","reply-all","forward","moveto","delete","mark","viewsource","open","edit","download","print","load-attachment","purge","expunge","select-all","select-none","sort",false);
-}
-break;
-case "check-recent":
-case "getunread":
-case "list":
-if(this.task=="mail"){
-if(this.message_list&&_234.action=="list"){
-this.msglist_select(this.message_list);
-}
-this.enable_command("show","expunge","select-all","select-none","sort",(this.env.messagecount>0));
-this.enable_command("purge",this.purge_mailbox_test());
-if(_234.action=="list"){
-this.triggerEvent("listupdate",{folder:this.env.mailbox,rowcount:this.message_list.rowcount});
-}
-}else{
-if(this.task=="addressbook"){
-this.enable_command("export",(this.contact_list&&this.contact_list.rowcount>0));
-if(_234.action=="list"){
-this.triggerEvent("listupdate",{folder:this.env.source,rowcount:this.contact_list.rowcount});
-}
-}
-}
-break;
-}
-};
-this.http_error=function(_239,_23a,err){
-var _23c=_239.statusText;
-this.set_busy(false);
-_239.abort();
-if(_23c){
-this.display_message(this.get_label("servererror")+" ("+_23c+")","error");
-}
-};
-this.send_keep_alive=function(){
-var d=new Date();
-this.http_request("keep-alive","_t="+d.getTime());
-};
-this.check_for_recent=function(_23e){
-if(this.busy){
-return;
-}
-if(_23e){
-this.set_busy(true,"checkingmail");
-}
-var _23f="_t="+(new Date().getTime());
-if(this.gui_objects.messagelist){
-_23f+="&_list=1";
-}
-if(this.gui_objects.quotadisplay){
-_23f+="&_quota=1";
-}
-if(this.env.search_request){
-_23f+="&_search="+this.env.search_request;
-}
-this.http_request("check-recent",_23f,true);
-};
-this.get_single_uid=function(){
-return this.env.uid?this.env.uid:(this.message_list?this.message_list.get_single_selection():null);
-};
-this.get_single_cid=function(){
-return this.env.cid?this.env.cid:(this.contact_list?this.contact_list.get_single_selection():null);
-};
-this.get_caret_pos=function(obj){
-if(typeof (obj.selectionEnd)!="undefined"){
-return obj.selectionEnd;
-}else{
-if(document.selection&&document.selection.createRange){
-var _241=document.selection.createRange();
-if(_241.parentElement()!=obj){
-return 0;
-}
-var gm=_241.duplicate();
-if(obj.tagName=="TEXTAREA"){
-gm.moveToElementText(obj);
-}else{
-gm.expand("textedit");
-}
-gm.setEndPoint("EndToStart",_241);
-var p=gm.text.length;
-return p<=obj.value.length?p:-1;
-}else{
-return obj.value.length;
-}
-}
-};
-this.set_caret_pos=function(obj,pos){
-if(obj.setSelectionRange){
-obj.setSelectionRange(pos,pos);
-}else{
-if(obj.createTextRange){
-var _246=obj.createTextRange();
-_246.collapse(true);
-_246.moveEnd("character",pos);
-_246.moveStart("character",pos);
-_246.select();
-}
-}
-};
-this.lock_form=function(form,lock){
-if(!form||!form.elements){
-return;
-}
-var type;
-for(var n=0;n<form.elements.length;n++){
-type=form.elements[n];
-if(type=="hidden"){
-continue;
-}
-form.elements[n].disabled=lock;
-}
-};
-};
-rcube_webmail.prototype.addEventListener=rcube_event_engine.prototype.addEventListener;
-rcube_webmail.prototype.removeEventListener=rcube_event_engine.prototype.removeEventListener;
+function rcube_webmail(){this.env={};this.labels={};this.buttons={};this.buttons_sel={};this.gui_objects={};this.gui_containers={};this.commands={};this.command_handlers={};this.onloads=[];this.messages={};this.ref="rcmail";var l=this;this.dblclick_time=500;this.message_time=2E3;this.identifier_expr=RegExp("[^0-9a-z-_]","gi");this.mimetypes=["text/plain","text/html","text/xml","image/jpeg","image/gif","image/png","application/x-javascript","application/pdf","application/x-shockwave-flash"];this.env.keep_alive=
+60;this.env.request_timeout=180;this.env.draft_autosave=0;this.env.comm_path="./";this.env.blankpage="program/blank.gif";$.ajaxSetup({cache:false,error:function(a,b,d){l.http_error(a,b,d)},beforeSend:function(a){a.setRequestHeader("X-Roundcube-Request",l.env.request_token)}});this.set_env=function(a,b){if(a!=null&&typeof a=="object"&&!b)for(var d in a)this.env[d]=a[d];else this.env[a]=b};this.add_label=function(a,b){this.labels[a]=b};this.register_button=function(a,b,d,e,f,g){this.buttons[a]||(this.buttons[a]=
+[]);b={id:b,type:d};if(e)b.act=e;if(f)b.sel=f;if(g)b.over=g;this.buttons[a].push(b)};this.gui_object=function(a,b){this.gui_objects[a]=b};this.gui_container=function(a,b){this.gui_containers[a]=b};this.add_element=function(a,b){this.gui_containers[b]&&this.gui_containers[b].jquery&&this.gui_containers[b].append(a)};this.register_command=function(a,b,d){this.command_handlers[a]=b;d&&this.enable_command(a,true)};this.add_onload=function(a){this.onloads.push(a)};this.init=function(){var a=this;this.task=
+this.env.task;if(!bw.dom||!bw.xmlhttp_test())this.goto_url("error","_code=0x199");else{for(var b in this.gui_containers)this.gui_containers[b]=$("#"+this.gui_containers[b]);for(b in this.gui_objects)this.gui_objects[b]=rcube_find_object(this.gui_objects[b]);this.init_buttons();if(this.is_framed()){parent.rcmail.set_busy(false,null,parent.rcmail.env.frame_lock);parent.rcmail.env.frame_lock=null}this.enable_command("logout","mail","addressbook","settings",true);this.env.permaurl&&this.enable_command("permaurl",
+true);switch(this.task){case "mail":this.enable_command("list","checkmail","compose","add-contact","search","reset-search","collapse-folder",true);if(this.gui_objects.messagelist){this.message_list=new rcube_list_widget(this.gui_objects.messagelist,{multiselect:true,multiexpand:true,draggable:true,keyboard:true,column_movable:this.env.col_movable,dblclick_time:this.dblclick_time});this.message_list.row_init=function(e){a.init_message_row(e)};this.message_list.addEventListener("dblclick",function(e){a.msglist_dbl_click(e)});
+this.message_list.addEventListener("click",function(e){a.msglist_click(e)});this.message_list.addEventListener("keypress",function(e){a.msglist_keypress(e)});this.message_list.addEventListener("select",function(e){a.msglist_select(e)});this.message_list.addEventListener("dragstart",function(e){a.drag_start(e)});this.message_list.addEventListener("dragmove",function(e){a.drag_move(e)});this.message_list.addEventListener("dragend",function(e){a.drag_end(e)});this.message_list.addEventListener("expandcollapse",
+function(e){a.msglist_expand(e)});this.message_list.addEventListener("column_replace",function(e){a.msglist_set_coltypes(e)});document.onmouseup=function(e){return a.doc_mouse_up(e)};this.gui_objects.messagelist.parentNode.onmousedown=function(e){return a.click_on_list(e)};this.message_list.init();this.enable_command("toggle_status","toggle_flag","menu-open","menu-save",true);this.command("list")}if(this.gui_objects.qsearchbox){if(this.env.search_text!=null)this.gui_objects.qsearchbox.value=this.env.search_text;
+$(this.gui_objects.qsearchbox).focusin(function(){rcmail.message_list.blur()})}this.env.trash_mailbox&&this.env.mailbox!=this.env.trash_mailbox&&this.set_alttext("delete","movemessagetotrash");this.env.message_commands=["show","reply","reply-all","reply-list","forward","moveto","copy","delete","open","mark","edit","viewsource","download","print","load-attachment","load-headers"];if(this.env.action=="show"||this.env.action=="preview"){this.enable_command(this.env.message_commands,this.env.uid);this.enable_command("reply-list",
+this.env.list_post);this.env.action=="show"&&this.http_request("pagenav","_uid="+this.env.uid+"&_mbox="+urlencode(this.env.mailbox),this.display_message("","loading"));if(this.env.blockedobjects){if(this.gui_objects.remoteobjectsmsg)this.gui_objects.remoteobjectsmsg.style.display="block";this.enable_command("load-images","always-load",true)}if(this.env.action=="preview"&&this.is_framed()){this.enable_command("compose","add-contact",false);parent.rcmail.show_contentframe(true)}}else if(this.env.action==
+"compose"){this.env.compose_commands=["send-attachment","remove-attachment","send","toggle-editor"];this.env.drafts_mailbox&&this.env.compose_commands.push("savedraft");this.enable_command(this.env.compose_commands,"identities",true);if(this.env.spellcheck){this.env.spellcheck.spelling_state_observer=function(e){l.set_spellcheck_state(e)};this.env.compose_commands.push("spellcheck");this.set_spellcheck_state("ready");$("input[name='_is_html']").val()=="1"&&this.display_spellcheck_controls(false)}document.onmouseup=
+function(e){return a.doc_mouse_up(e)};this.init_messageform()}else this.env.action=="print"&&this.env.uid&&window.print();if(this.gui_objects.mailboxlist){this.env.unread_counts={};this.gui_objects.folderlist=this.gui_objects.mailboxlist;this.http_request("getunread","")}if(this.env.mdn_request&&this.env.uid){b="_uid="+this.env.uid+"&_mbox="+urlencode(this.env.mailbox);confirm(this.get_label("mdnrequest"))?this.http_post("sendmdn",b):this.http_post("mark",b+"&_flag=mdnsent")}break;case "addressbook":if(this.gui_objects.folderlist)this.env.contactfolders=
+$.extend($.extend({},this.env.address_sources),this.env.contactgroups);if(this.gui_objects.contactslist){this.contact_list=new rcube_list_widget(this.gui_objects.contactslist,{multiselect:true,draggable:this.gui_objects.folderlist?true:false,keyboard:true});this.contact_list.row_init=function(e){a.triggerEvent("insertrow",{cid:e.uid,row:e})};this.contact_list.addEventListener("keypress",function(e){a.contactlist_keypress(e)});this.contact_list.addEventListener("select",function(e){a.contactlist_select(e)});
+this.contact_list.addEventListener("dragstart",function(e){a.drag_start(e)});this.contact_list.addEventListener("dragmove",function(e){a.drag_move(e)});this.contact_list.addEventListener("dragend",function(e){a.drag_end(e)});this.contact_list.init();this.env.cid&&this.contact_list.highlight_row(this.env.cid);this.gui_objects.contactslist.parentNode.onmousedown=function(e){return a.click_on_list(e)};document.onmouseup=function(e){return a.doc_mouse_up(e)};this.gui_objects.qsearchbox&&$(this.gui_objects.qsearchbox).focusin(function(){rcmail.contact_list.blur()})}this.set_page_buttons();
+if(this.env.address_sources&&this.env.address_sources[this.env.source]&&!this.env.address_sources[this.env.source].readonly){this.enable_command("add","import",true);this.enable_command("group-create",this.env.address_sources[this.env.source].groups)}if(this.env.cid){this.enable_command("show","edit",true);this.gui_objects.editform&&$("input.groupmember").change(function(){l.http_post(this.checked?"group-addmembers":"group-delmembers","_cid="+urlencode(l.env.cid)+"&_source="+urlencode(l.env.source)+
+"&_gid="+urlencode(this.value))})}if((this.env.action=="add"||this.env.action=="edit")&&this.gui_objects.editform){this.enable_command("save",true);$("input[type='text']").first().select()}else if(this.gui_objects.qsearchbox){this.enable_command("search","reset-search","moveto",true);$(this.gui_objects.qsearchbox).select()}this.contact_list&&this.contact_list.rowcount>0&&this.enable_command("export",true);this.enable_command("list","listgroup",true);break;case "settings":this.enable_command("preferences",
+"identities","save","folders",true);if(this.env.action=="identities")this.enable_command("add",this.env.identities_level<2);else if(this.env.action=="edit-identity"||this.env.action=="add-identity"){this.enable_command("add",this.env.identities_level<2);this.enable_command("save","delete","edit","toggle-editor",true)}else if(this.env.action=="folders")this.enable_command("subscribe","unsubscribe","create-folder","rename-folder",true);else if(this.env.action=="edit-folder"&&this.gui_objects.editform){this.enable_command("save",
+"folder-size",true);parent.rcmail.env.messagecount=this.env.messagecount;parent.rcmail.enable_command("purge",this.env.messagecount);$("input[type='text']").first().select()}if(this.gui_objects.identitieslist){this.identity_list=new rcube_list_widget(this.gui_objects.identitieslist,{multiselect:false,draggable:false,keyboard:false});this.identity_list.addEventListener("select",function(e){a.identity_select(e)});this.identity_list.init();this.identity_list.focus();this.env.iid&&this.identity_list.highlight_row(this.env.iid)}else if(this.gui_objects.sectionslist){this.sections_list=
+new rcube_list_widget(this.gui_objects.sectionslist,{multiselect:false,draggable:false,keyboard:false});this.sections_list.addEventListener("select",function(e){a.section_select(e)});this.sections_list.init();this.sections_list.focus()}else this.gui_objects.subscriptionlist&&this.init_subscription_list();break;case "login":b=$("#rcmloginuser");b.bind("keyup",function(e){return rcmail.login_user_keyup(e)});b.val()==""?b.focus():$("#rcmloginpwd").focus();$("#rcmlogintz").val((new Date).getTimezoneOffset()/
+-60);$("form").submit(function(){$("input[type=submit]",this).attr("disabled",true);rcmail.display_message("","loading")});this.enable_command("login",true)}this.loaded=true;this.pending_message&&this.display_message(this.pending_message[0],this.pending_message[1]);if(this.gui_objects.folderlist)this.gui_containers.foldertray=$(this.gui_objects.folderlist);this.triggerEvent("init",{task:this.task,action:this.env.action});for(var d in this.onloads)if(typeof this.onloads[d]=="string")eval(this.onloads[d]);
+else typeof this.onloads[d]=="function"&&this.onloads[d]();this.start_keepalive()}};this.command=function(a,b,d){d&&d.blur&&d.blur();if(this.busy)return false;if(!this.commands[a]){this.is_framed()&&parent.rcmail.command(a,b);return false}if(this.task=="mail"&&this.env.action=="compose"&&$.inArray(a,this.env.compose_commands)<0)if(this.cmp_hash!=this.compose_field_hash()&&!confirm(this.get_label("notsentwarning")))return false;if(typeof this.command_handlers[a]=="function"){a=this.command_handlers[a](b,
+d);return a!==null?a:d?false:true}else if(typeof this.command_handlers[a]=="string"){a=window[this.command_handlers[a]](b,d);return a!==null?a:d?false:true}this.triggerEvent("actionbefore",{props:b,action:a});var e=this.triggerEvent("before"+a,b);if(typeof e!="undefined")if(e===false)return false;else b=e;switch(a){case "login":this.gui_objects.loginform&&this.gui_objects.loginform.submit();break;case "mail":case "addressbook":case "settings":case "logout":this.switch_task(a);break;case "permaurl":if(d&&
+d.href&&d.target)return true;else if(this.env.permaurl)parent.location.href=this.env.permaurl;break;case "menu-open":case "menu-save":this.triggerEvent(a,{props:b});return false;case "open":var f;if(f=this.get_single_uid()){d.href="?_task="+this.env.task+"&_action=show&_mbox="+urlencode(this.env.mailbox)+"&_uid="+f;return true}break;case "list":if(this.task=="mail"){if(!this.env.search_request||b&&b!=this.env.mailbox)this.reset_qsearch();this.list_mailbox(b);if(this.env.trash_mailbox)this.set_alttext("delete",
+this.env.mailbox!=this.env.trash_mailbox?"movemessagetotrash":"deletemessage")}else if(this.task=="addressbook"){if(!this.env.search_request||b!=this.env.source)this.reset_qsearch();this.list_contacts(b);this.enable_command("add","import",this.env.address_sources&&!this.env.address_sources[this.env.source].readonly)}break;case "load-headers":this.load_headers(d);break;case "sort":var g=b;f=this.env.sort_col==g?this.env.sort_order=="ASC"?"DESC":"ASC":"ASC";this.set_list_sorting(g,f);this.list_mailbox("",
+"",g+"_"+f);break;case "nextpage":this.list_page("next");break;case "lastpage":this.list_page("last");break;case "previouspage":this.list_page("prev");break;case "firstpage":this.list_page("first");break;case "expunge":this.env.messagecount&&this.expunge_mailbox(this.env.mailbox);break;case "purge":case "empty-mailbox":this.env.messagecount&&this.purge_mailbox(this.env.mailbox);break;case "show":if(this.task=="mail"){if((f=this.get_single_uid())&&(!this.env.uid||f!=this.env.uid))this.env.mailbox==
+this.env.drafts_mailbox?this.goto_url("compose","_draft_uid="+f+"&_mbox="+urlencode(this.env.mailbox),true):this.show_message(f)}else if(this.task=="addressbook")(g=b?b:this.get_single_cid())&&!(this.env.action=="show"&&g==this.env.cid)&&this.load_contact(g,"show");break;case "add":if(this.task=="addressbook")this.load_contact(0,"add");else if(this.task=="settings"){this.identity_list.clear_selection();this.load_identity(0,"add-identity")}break;case "edit":if(this.task=="addressbook"&&(g=this.get_single_cid()))this.load_contact(g,
+"edit");else if(this.task=="settings"&&b)this.load_identity(b,"edit-identity");else if(this.task=="mail"&&(g=this.get_single_uid())){e=this.env.mailbox==this.env.drafts_mailbox?"_draft_uid=":"_uid=";this.goto_url("compose",e+g+"&_mbox="+urlencode(this.env.mailbox),true)}break;case "save":if(this.gui_objects.editform){f=$("input[name='_pagesize']");g=$("input[name='_name']");e=$("input[name='_email']");if(f.length&&isNaN(parseInt(f.val()))){alert(this.get_label("nopagesizewarning"));f.focus();break}else if(g.length&&
+g.val()==""){alert(this.get_label("nonamewarning"));g.focus();break}else if(e.length&&!rcube_check_email(e.val())){alert(this.get_label("noemailwarning"));e.focus();break}this.gui_objects.editform.submit()}break;case "delete":if(this.task=="mail")this.delete_messages();else if(this.task=="addressbook")this.delete_contacts();else this.task=="settings"&&this.delete_identity();break;case "move":case "moveto":if(this.task=="mail")this.move_messages(b);else this.task=="addressbook"&&this.drag_active&&
+this.copy_contact(null,b);break;case "copy":this.task=="mail"&&this.copy_messages(b);break;case "mark":b&&this.mark_message(b);break;case "toggle_status":if(b&&!b._row)break;g="read";if(b._row.uid){f=b._row.uid;if(this.message_list.rows[f].deleted)g="undelete";else this.message_list.rows[f].unread||(g="unread")}this.mark_message(g,f);break;case "toggle_flag":if(b&&!b._row)break;g="flagged";if(b._row.uid){f=b._row.uid;if(this.message_list.rows[f].flagged)g="unflagged"}this.mark_message(g,f);break;
+case "always-load":if(this.env.uid&&this.env.sender){this.add_contact(urlencode(this.env.sender));window.setTimeout(function(){l.command("load-images")},300);break}case "load-images":this.env.uid&&this.show_message(this.env.uid,true,this.env.action=="preview");break;case "load-attachment":f="_mbox="+urlencode(this.env.mailbox)+"&_uid="+this.env.uid+"&_part="+b.part;if(this.env.uid&&b.mimetype&&$.inArray(b.mimetype,this.mimetypes)>=0){if(b.mimetype=="text/html")f+="&_safe=1";if(this.attachment_win=
+window.open(this.env.comm_path+"&_action=get&"+f+"&_frame=1","rcubemailattachment")){window.setTimeout(function(){l.attachment_win.focus()},10);break}}this.goto_url("get",f+"&_download=1",false);break;case "select-all":this.select_all_mode=b?false:true;this.dummy_select=true;b=="invert"?this.message_list.invert_selection():this.message_list.select_all(b=="page"?"":b);this.dummy_select=null;break;case "select-none":this.select_all_mode=false;this.message_list.clear_selection();break;case "expand-all":this.env.autoexpand_threads=
+1;this.message_list.expand_all();break;case "expand-unread":this.env.autoexpand_threads=2;this.message_list.collapse_all();this.expand_unread();break;case "collapse-all":this.env.autoexpand_threads=0;this.message_list.collapse_all();break;case "nextmessage":this.env.next_uid&&this.show_message(this.env.next_uid,false,this.env.action=="preview");break;case "lastmessage":this.env.last_uid&&this.show_message(this.env.last_uid);break;case "previousmessage":this.env.prev_uid&&this.show_message(this.env.prev_uid,
+false,this.env.action=="preview");break;case "firstmessage":this.env.first_uid&&this.show_message(this.env.first_uid);break;case "checkmail":this.check_for_recent(true);break;case "compose":e=this.env.comm_path+"&_action=compose";if(this.task=="mail"){e+="&_mbox="+urlencode(this.env.mailbox);if(this.env.mailbox==this.env.drafts_mailbox){if(f=this.get_single_uid())e+="&_draft_uid="+f}else if(b)e+="&_to="+urlencode(b)}else if(this.task=="addressbook"){if(b&&b.indexOf("@")>0){e=this.get_task_url("mail",
+e);this.redirect(e+"&_to="+urlencode(b));break}f=[];if(b)f.push(b);else if(this.contact_list){g=this.contact_list.get_selection();for(e=0;e<g.length;e++)f.push(g[e])}f.length&&this.http_request("mailto","_cid="+urlencode(f.join(","))+"&_source="+urlencode(this.env.source),true);break}e=e.replace(/&_framed=1/,"");this.redirect(e);break;case "spellcheck":if(window.tinyMCE&&tinyMCE.get(this.env.composebody))tinyMCE.execCommand("mceSpellCheck",true);else if(this.env.spellcheck&&this.env.spellcheck.spellCheck&&
+this.spellcheck_ready){this.env.spellcheck.spellCheck();this.set_spellcheck_state("checking")}break;case "savedraft":self.clearTimeout(this.save_timer);if(!this.gui_objects.messageform)break;if(!this.env.drafts_mailbox||this.cmp_hash==this.compose_field_hash())break;f=this.gui_objects.messageform;g=this.set_busy(true,"savingmessage");f.target="savetarget";f._draft.value="1";f.action=this.add_url(f.action,"_unlock",g);f.submit();break;case "send":if(!this.gui_objects.messageform)break;if(!this.check_compose_input())break;
+self.clearTimeout(this.save_timer);f=this.gui_objects.messageform;g=this.set_busy(true,"sendingmessage");f.target="savetarget";f._draft.value="";f.action=this.add_url(f.action,"_unlock",g);f.submit();clearTimeout(this.request_timer);break;case "send-attachment":self.clearTimeout(this.save_timer);this.upload_file(b);break;case "insert-sig":this.change_identity($("[name='_from']")[0],true);break;case "reply-all":case "reply-list":case "reply":if(f=this.get_single_uid()){e="_reply_uid="+f+"&_mbox="+
+urlencode(this.env.mailbox);if(a=="reply-all")e+="&_all="+(!b&&this.commands["reply-list"]?"list":"all");else if(a=="reply-list")e+="&_all=list";this.goto_url("compose",e,true)}break;case "forward":if(f=this.get_single_uid())this.goto_url("compose","_forward_uid="+f+"&_mbox="+urlencode(this.env.mailbox),true);break;case "print":if(f=this.get_single_uid()){l.printwin=window.open(this.env.comm_path+"&_action=print&_uid="+f+"&_mbox="+urlencode(this.env.mailbox)+(this.env.safemode?"&_safe=1":""));if(this.printwin){window.setTimeout(function(){l.printwin.focus()},
+20);this.env.action!="show"&&this.mark_message("read",f)}}break;case "viewsource":if(f=this.get_single_uid()){l.sourcewin=window.open(this.env.comm_path+"&_action=viewsource&_uid="+f+"&_mbox="+urlencode(this.env.mailbox));this.sourcewin&&window.setTimeout(function(){l.sourcewin.focus()},20)}break;case "download":if(f=this.get_single_uid())this.goto_url("viewsource","&_uid="+f+"&_mbox="+urlencode(this.env.mailbox)+"&_save=1");break;case "search":if(!b&&this.gui_objects.qsearchbox)b=this.gui_objects.qsearchbox.value;
+if(b){this.qsearch(b);break}case "reset-search":f=this.env.search_request;this.reset_qsearch();if(f&&this.env.mailbox)this.list_mailbox(this.env.mailbox);else f&&this.task=="addressbook"&&this.list_contacts(this.env.source,this.env.group);break;case "listgroup":this.list_contacts(b.source,b.id);break;case "import":if(this.env.action=="import"&&this.gui_objects.importform){if((f=document.getElementById("rcmimportfile"))&&!f.value){alert(this.get_label("selectimportfile"));break}this.gui_objects.importform.submit();
+this.set_busy(true,"importwait");this.lock_form(this.gui_objects.importform,true)}else this.goto_url("import",this.env.source?"_target="+urlencode(this.env.source)+"&":"");break;case "export":if(this.contact_list.rowcount>0){f=this.env.source?"_source="+urlencode(this.env.source)+"&":"";if(this.env.search_request)f+="_search="+this.env.search_request;this.goto_url("export",f)}break;case "preferences":this.goto_url("");break;case "identities":this.goto_url("settings/identities");break;case "folders":this.goto_url("settings/folders");
+break;default:f=a.replace(/-/g,"_");this[f]&&typeof this[f]=="function"&&this[f](b)}this.triggerEvent("after"+a,b);this.triggerEvent("actionafter",{props:b,action:a});return d?false:true};this.enable_command=function(){for(var a=Array.prototype.slice.call(arguments),b=a.pop(),d,e=0;e<a.length;e++){d=a[e];if(typeof d==="string"){this.commands[d]=b;this.set_button(d,b?"act":"pas")}else for(var f in d)a.push(d[f])}};this.set_busy=function(a,b,d){if(a&&b){d=this.get_label(b);if(d==b)d="Loading...";d=
+this.display_message(d,"loading")}else!a&&d&&this.hide_message(d);this.busy=a;this.gui_objects.editform&&this.lock_form(this.gui_objects.editform,a);this.request_timer&&clearTimeout(this.request_timer);if(a&&this.env.request_timeout)this.request_timer=window.setTimeout(function(){l.request_timed_out()},this.env.request_timeout*1E3);return d};this.gettext=this.get_label=function(a,b){return b&&this.labels[b+"."+a]?this.labels[b+"."+a]:this.labels[a]?this.labels[a]:a};this.switch_task=function(a){if(!(this.task===
+a&&a!="mail")){var b=this.get_task_url(a);if(a=="mail")b+="&_mbox=INBOX";this.redirect(b)}};this.get_task_url=function(a,b){if(!b)b=this.env.comm_path;return b.replace(/_task=[a-z]+/,"_task="+a)};this.request_timed_out=function(){this.set_busy(false);this.display_message("Request timed out!","error")};this.reload=function(a){if(this.is_framed())parent.rcmail.reload(a);else if(a)window.setTimeout(function(){rcmail.reload()},a);else if(window.location)location.href=this.env.comm_path+(this.env.action?
+"&_action="+this.env.action:"")};this.add_url=function(a,b,d){d=urlencode(d);if(/(\?.*)$/.test(a)){var e=RegExp.$1,f=RegExp("((\\?|&)"+RegExp.escape(b)+"=[^&]*)");if(f.test(e))e=e.replace(f,RegExp.$2+b+"="+d);else e+="&"+b+"="+d;return a.replace(/(\?.*)$/,e)}else return a+"?"+b+"="+d};this.is_framed=function(){return this.env.framed&&parent.rcmail};this.drag_menu=function(a,b){var d=rcube_event.get_modifier(a),e=$("#"+this.gui_objects.message_dragmenu);if(e&&d==SHIFT_KEY&&this.commands.copy){d=rcube_event.get_mouse_pos(a);
+this.env.drag_target=b;e.css({top:d.y-10+"px",left:d.x-10+"px"}).show();return true}return false};this.drag_menu_action=function(a){var b=$("#"+this.gui_objects.message_dragmenu);b&&b.hide();this.command(a,this.env.drag_target);this.env.drag_target=null};this.drag_start=function(a){var b=this.task=="mail"?this.env.mailboxes:this.env.contactfolders;this.drag_active=true;this.preview_timer&&clearTimeout(this.preview_timer);this.preview_read_timer&&clearTimeout(this.preview_read_timer);if(this.gui_objects.folderlist&&
+b){this.initialBodyScrollTop=bw.ie?0:window.pageYOffset;this.initialListScrollTop=this.gui_objects.folderlist.parentNode.scrollTop;var d,e;a=$(this.gui_objects.folderlist);d=a.offset();this.env.folderlist_coords={x1:d.left,y1:d.top,x2:d.left+a.width(),y2:d.top+a.height()};this.env.folder_coords=[];for(var f in b)if(a=this.get_folder_li(f))if(e=a.firstChild.offsetHeight){d=$(a.firstChild).offset();this.env.folder_coords[f]={x1:d.left,y1:d.top,x2:d.left+a.firstChild.offsetWidth,y2:d.top+e,on:0}}}};
+this.drag_end=function(){this.drag_active=false;this.env.last_folder_target=null;if(this.folder_auto_timer){window.clearTimeout(this.folder_auto_timer);this.folder_auto_expand=this.folder_auto_timer=null}if(this.gui_objects.folderlist&&this.env.folder_coords)for(var a in this.env.folder_coords)this.env.folder_coords[a].on&&$(this.get_folder_li(a)).removeClass("droptarget")};this.drag_move=function(a){if(this.gui_objects.folderlist&&this.env.folder_coords){var b=-(this.initialListScrollTop-this.gui_objects.folderlist.parentNode.scrollTop)-
+(bw.ie?-document.documentElement.scrollTop:this.initialBodyScrollTop),d,e,f;d="draglayernormal";if(this.contact_list&&this.contact_list.draglayer)f=this.contact_list.draglayer.attr("class");a=rcube_event.get_mouse_pos(a);e=this.env.folderlist_coords;a.y+=b;if(a.x<e.x1||a.x>=e.x2||a.y<e.y1||a.y>=e.y2){if(this.env.last_folder_target){$(this.get_folder_li(this.env.last_folder_target)).removeClass("droptarget");this.env.folder_coords[this.env.last_folder_target].on=0;this.env.last_folder_target=null}}else for(var g in this.env.folder_coords){e=
+this.env.folder_coords[g];if(a.x>=e.x1&&a.x<e.x2&&a.y>=e.y1&&a.y<e.y2)if(b=this.check_droptarget(g)){d=this.get_folder_li(g);e=$(d.getElementsByTagName("div")[0]);if(e.hasClass("collapsed")){this.folder_auto_timer&&window.clearTimeout(this.folder_auto_timer);this.folder_auto_expand=g;this.folder_auto_timer=window.setTimeout(function(){rcmail.command("collapse-folder",rcmail.folder_auto_expand);rcmail.drag_start(null)},1E3)}else if(this.folder_auto_timer){window.clearTimeout(this.folder_auto_timer);
+this.folder_auto_expand=this.folder_auto_timer=null}$(d).addClass("droptarget");this.env.folder_coords[g].on=1;this.env.last_folder_target=g;d="draglayer"+(b>1?"copy":"normal")}else this.env.last_folder_target=null;else if(e.on){$(this.get_folder_li(g)).removeClass("droptarget");this.env.folder_coords[g].on=0}}d!=f&&this.contact_list&&this.contact_list.draglayer&&this.contact_list.draglayer.attr("class",d)}};this.collapse_folder=function(a){var b=this.get_folder_li(a),d=$(b.getElementsByTagName("div")[0]);
+if(!(!d||!d.hasClass("collapsed")&&!d.hasClass("expanded"))){var e=$(b.getElementsByTagName("ul")[0]);if(d.hasClass("collapsed")){e.show();d.removeClass("collapsed").addClass("expanded");this.set_env("collapsed_folders",this.env.collapsed_folders.replace(RegExp("&"+urlencode(a)+"&"),""))}else{e.hide();d.removeClass("expanded").addClass("collapsed");this.set_env("collapsed_folders",this.env.collapsed_folders+"&"+urlencode(a)+"&");this.env.mailbox.indexOf(a+this.env.delimiter)==0&&this.command("list",
+a)}if(bw.ie6||bw.ie7)if((d=b.nextSibling?b.nextSibling.getElementsByTagName("ul"):null)&&d.length&&(b=d[0])&&b.style&&b.style.display!="none"){b.style.display="none";b.style.display=""}this.http_post("save-pref","_name=collapsed_folders&_value="+urlencode(this.env.collapsed_folders));this.set_unread_count_display(a,false)}};this.doc_mouse_up=function(a){var b,d;if(this.message_list){rcube_mouse_is_over(a,this.message_list.list.parentNode)?this.message_list.focus():this.message_list.blur();d=this.message_list;
+b=this.env.mailboxes}else if(this.contact_list){rcube_mouse_is_over(a,this.contact_list.list.parentNode)?this.contact_list.focus():this.contact_list.blur();d=this.contact_list;b=this.env.contactfolders}else this.ksearch_value&&this.ksearch_blur();if(this.drag_active&&b&&this.env.last_folder_target){b=b[this.env.last_folder_target];$(this.get_folder_li(this.env.last_folder_target)).removeClass("droptarget");this.env.last_folder_target=null;d.draglayer.hide();this.drag_menu(a,b)||this.command("moveto",
+b)}if(this.buttons_sel){for(var e in this.buttons_sel)typeof e!="function"&&this.button_out(this.buttons_sel[e],e);this.buttons_sel={}}};this.click_on_list=function(){this.gui_objects.qsearchbox&&this.gui_objects.qsearchbox.blur();if(this.message_list)this.message_list.focus();else this.contact_list&&this.contact_list.focus();return true};this.msglist_select=function(a){this.preview_timer&&clearTimeout(this.preview_timer);this.preview_read_timer&&clearTimeout(this.preview_read_timer);var b=a.get_single_selection()!=
+null;this.enable_command(this.env.message_commands,b);if(b)if(this.env.mailbox==this.env.drafts_mailbox)this.enable_command("reply","reply-all","reply-list","forward",false);else this.env.messages[a.get_single_selection()].ml||this.enable_command("reply-list",false);this.enable_command("delete","moveto","copy","mark",a.selection.length>0?true:false);if(b||a.selection.length&&a.selection.length!=a.rowcount)this.select_all_mode=false;if(b&&this.env.contentframe&&!a.multi_selecting&&!this.dummy_select)this.preview_timer=
+window.setTimeout(function(){l.msglist_get_preview()},200);else this.env.contentframe&&this.show_contentframe(false)};this.msglist_click=function(a){if(!(a.multi_selecting||!this.env.contentframe))if(a.get_single_selection()&&window.frames&&window.frames[this.env.contentframe])if(window.frames[this.env.contentframe].location.href.indexOf(this.env.blankpage)>=0){this.preview_timer&&clearTimeout(this.preview_timer);this.preview_read_timer&&clearTimeout(this.preview_read_timer);this.preview_timer=window.setTimeout(function(){l.msglist_get_preview()},
+200)}};this.msglist_dbl_click=function(a){this.preview_timer&&clearTimeout(this.preview_timer);this.preview_read_timer&&clearTimeout(this.preview_read_timer);if((a=a.get_single_selection())&&this.env.mailbox==this.env.drafts_mailbox)this.goto_url("compose","_draft_uid="+a+"&_mbox="+urlencode(this.env.mailbox),true);else a&&this.show_message(a,false,false)};this.msglist_keypress=function(a){if(a.key_pressed==a.ENTER_KEY)this.command("show");else if(a.key_pressed==a.DELETE_KEY)this.command("delete");
+else if(a.key_pressed==a.BACKSPACE_KEY)this.command("delete");else if(a.key_pressed==33)this.command("previouspage");else if(a.key_pressed==34)this.command("nextpage");else a.shiftkey=false};this.msglist_get_preview=function(){var a=this.get_single_uid();if(a&&this.env.contentframe&&!this.drag_active)this.show_message(a,false,true);else this.env.contentframe&&this.show_contentframe(false)};this.msglist_expand=function(a){if(this.env.messages[a.uid])this.env.messages[a.uid].expanded=a.expanded};this.msglist_set_coltypes=
+function(a){var b,d=a.list.tHead.rows[0].cells;this.env.coltypes=[];for(a=0;a<d.length;a++)if(d[a].id&&d[a].id.match(/^rcm/)){b=d[a].id.replace(/^rcm/,"");this.env.coltypes.push(b=="to"?"from":b)}if((a=$.inArray("flag",this.env.coltypes))>=0)this.set_env("flagged_col",a);if((a=$.inArray("subject",this.env.coltypes))>=0)this.set_env("subject_col",a);this.http_post("save-pref",{_name:"list_cols",_value:this.env.coltypes,_session:"list_attrib/columns"})};this.check_droptarget=function(a){var b=false,
+d=false;if(this.task=="mail")b=this.env.mailboxes[a]&&this.env.mailboxes[a].id!=this.env.mailbox&&!this.env.mailboxes[a].virtual;else if(this.task=="settings")b=a!=this.env.mailbox;else if(this.task=="addressbook")if(a!=this.env.source&&this.env.contactfolders[a])if(this.env.contactfolders[a].type=="group"){d=this.env.contactfolders[a].source;b=this.env.contactfolders[a].id!=this.env.group&&!this.env.contactfolders[d].readonly;d=d!=this.env.source}else{b=!this.env.contactfolders[a].readonly;d=true}return b?
+d?2:1:0};this.init_message_row=function(a){var b,d=this,e=a.uid,f=(this.env.status_col!=null?"status":"msg")+"icn"+a.uid;e&&this.env.messages[e]&&$.extend(a,this.env.messages[e]);if(a.icon=document.getElementById(f)){a.icon._row=a.obj;a.icon.onmousedown=function(g){d.command("toggle_status",this);rcube_event.cancel(g)}}a.msgicon=this.env.status_col!=null?document.getElementById("msgicn"+a.uid):a.icon;if(this.env.flagged_col!=null&&(a.flagicon=document.getElementById("flagicn"+a.uid))){a.flagicon._row=
+a.obj;a.flagicon.onmousedown=function(g){d.command("toggle_flag",this);rcube_event.cancel(g)}}if(!a.depth&&a.has_children&&(b=document.getElementById("rcmexpando"+a.uid))){a.expando=b;b.onmousedown=function(g){return d.expand_message_row(g,e)}}this.triggerEvent("insertrow",{uid:e,row:a})};this.add_message_row=function(a,b,d,e){if(!this.gui_objects.messagelist||!this.message_list)return false;this.env.messages[a]||(this.env.messages[a]={});$.extend(this.env.messages[a],{deleted:d.deleted?1:0,replied:d.replied?
+1:0,unread:d.unread?1:0,forwarded:d.forwarded?1:0,flagged:d.flagged?1:0,has_children:d.has_children?1:0,depth:d.depth?d.depth:0,unread_children:d.unread_children?d.unread_children:0,parent_uid:d.parent_uid?d.parent_uid:0,selected:this.select_all_mode||this.message_list.in_selection(a),ml:d.ml?1:0,ctype:d.ctype,flags:d.extra_flags});var f,g=expando="",h=this.message_list;f=h.rows;var k=this.env.messages[a],j="message"+(this.gui_objects.messagelist.tBodies[0].rows.length%2?" even":" odd")+(d.unread?
+" unread":"")+(d.deleted?" deleted":"")+(d.flagged?" flagged":"")+(d.unread_children&&!d.unread&&!this.env.autoexpand_threads?" unroot":"")+(k.selected?" selected":""),m=document.createElement("tr"),n=document.createElement("td");m.id="rcmrow"+a;m.className=j;j="msgicon";if(this.env.status_col===null){j+=" status";if(d.deleted)j+=" deleted";else if(d.unread)j+=" unread";else if(d.unread_children>0)j+=" unreadchildren"}if(d.replied)j+=" replied";if(d.forwarded)j+=" forwarded";k.selected&&!h.in_selection(a)&&
+h.selection.push(a);if(this.env.threading){n=k.depth*15;if(k.depth)if(f[k.parent_uid]&&f[k.parent_uid].expanded===false||(this.env.autoexpand_threads==0||this.env.autoexpand_threads==2)&&(!f[k.parent_uid]||!f[k.parent_uid].expanded)){m.style.display="none";k.expanded=false}else k.expanded=true;else if(k.has_children)if(typeof k.expanded=="undefined"&&(this.env.autoexpand_threads==1||this.env.autoexpand_threads==2&&k.unread_children))k.expanded=true;if(n)g+='<span id="rcmtab'+a+'" class="branch" style="width:'+
+n+'px;">&nbsp;&nbsp;</span>';if(k.has_children&&!k.depth)expando='<div id="rcmexpando'+a+'" class="'+(k.expanded?"expanded":"collapsed")+'">&nbsp;&nbsp;</div>'}g+='<span id="msgicn'+a+'" class="'+j+'">&nbsp;</span>';if(!bw.ie&&b.subject){n=d.mbox==this.env.drafts_mailbox?"_draft_uid":"_uid";b.subject='<a href="./?_task=mail&_action='+(d.mbox==this.env.drafts_mailbox?"compose":"show")+"&_mbox="+urlencode(d.mbox)+"&"+n+"="+a+'" onclick="return rcube_event.cancel(event)">'+b.subject+"</a>"}for(var o in this.env.coltypes){f=
+this.env.coltypes[o];n=document.createElement("td");n.className=String(f).toLowerCase();if(f=="flag"){j=d.flagged?"flagged":"unflagged";f='<span id="flagicn'+a+'" class="'+j+'">&nbsp;</span>'}else if(f=="attachment")f=/application\/|multipart\/m/.test(d.ctype)?'<span class="attachment">&nbsp;</span>':/multipart\/report/.test(d.ctype)?'<span class="report">&nbsp;</span>':"&nbsp;";else if(f=="status"){j=d.deleted?"deleted":d.unread?"unread":d.unread_children>0?"unreadchildren":"msgicon";f='<span id="statusicn'+
+a+'" class="'+j+'">&nbsp;</span>'}else f=f=="threads"?expando:f=="subject"?g+b[f]:b[f];n.innerHTML=f;m.appendChild(n)}h.insert_row(m,e);if(e&&this.env.pagesize&&h.rowcount>this.env.pagesize){a=h.get_last_row();h.remove_row(a);h.clear_selection(a)}};this.set_list_sorting=function(a,b){$("#rcm"+this.env.sort_col).removeClass("sorted"+this.env.sort_order.toUpperCase());a&&$("#rcm"+a).addClass("sorted"+b);this.env.sort_col=a;this.env.sort_order=b};this.set_list_options=function(a,b,d,e){var f,g="";if(typeof b==
+"undefined")b=this.env.sort_col;if(!d)d=this.env.sort_order;if(this.env.sort_col!=b||this.env.sort_order!=d){f=1;this.set_list_sorting(b,d)}if(this.env.threading!=e){f=1;g+="&_threads="+e}if(a&&a.length){var h,k,j=[],m=this.env.coltypes;for(e=0;e<m.length;e++){k=m[e]=="to"?"from":m[e];h=$.inArray(k,a);if(h!=-1){j.push(k);delete a[h]}}for(e=0;e<a.length;e++)a[e]&&j.push(a[e]);if(j.join()!=m.join()){f=1;g+="&_cols="+j.join(",")}}f&&this.list_mailbox("","",b+"_"+d,g)};this.show_message=function(a,b,
+d){if(a){var e=window,f=d?"preview":"show",g="&_action="+f+"&_uid="+a+"&_mbox="+urlencode(this.env.mailbox);if(d&&this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){e=window.frames[this.env.contentframe];g+="&_framed=1"}if(b)g+="&_safe=1";if(this.env.search_request)g+="&_search="+this.env.search_request;if(f=="preview"&&String(e.location.href).indexOf(g)>=0)this.show_contentframe(true);else{if(!this.env.frame_lock)(this.is_framed()?parent.rcmail:this).env.frame_lock=this.set_busy(true,
+"loading");e.location.href=this.env.comm_path+g;if(f=="preview"&&this.message_list&&this.message_list.rows[a]&&this.message_list.rows[a].unread&&this.env.preview_pane_mark_read>=0)this.preview_read_timer=window.setTimeout(function(){l.set_message(a,"unread",false);l.update_thread_root(a,"read");if(l.env.unread_counts[l.env.mailbox]){l.env.unread_counts[l.env.mailbox]-=1;l.set_unread_count(l.env.mailbox,l.env.unread_counts[l.env.mailbox],l.env.mailbox=="INBOX")}l.env.preview_pane_mark_read>0&&l.http_post("mark",
+"_uid="+a+"&_flag=read&_quiet=1")},this.env.preview_pane_mark_read*1E3)}}};this.show_contentframe=function(a){var b,d;if(this.env.contentframe&&(b=$("#"+this.env.contentframe))&&b.length)if(!a&&(d=window.frames[this.env.contentframe])){if(d.location&&d.location.href.indexOf(this.env.blankpage)<0)d.location.href=this.env.blankpage}else if(!bw.safari&&!bw.konq)b[a?"show":"hide"]();!a&&this.busy&&this.set_busy(false,null,this.env.frame_lock)};this.list_page=function(a){if(a=="next")a=this.env.current_page+
+1;else if(a=="last")a=this.env.pagecount;else if(a=="prev"&&this.env.current_page>1)a=this.env.current_page-1;else if(a=="first"&&this.env.current_page>1)a=1;if(a>0&&a<=this.env.pagecount){this.env.current_page=a;if(this.task=="mail")this.list_mailbox(this.env.mailbox,a);else this.task=="addressbook"&&this.list_contacts(this.env.source,this.env.group,a)}};this.filter_mailbox=function(a){var b,d=this.set_busy(true,"searching");if(this.gui_objects.qsearchbox)b=this.gui_objects.qsearchbox.value;this.clear_message_list();
+this.env.current_page=1;this.http_request("search","_filter="+a+(b?"&_q="+urlencode(b):"")+(this.env.mailbox?"&_mbox="+urlencode(this.env.mailbox):""),d)};this.list_mailbox=function(a,b,d,e){var f="",g=window;a||(a=this.env.mailbox?this.env.mailbox:"INBOX");if(e)f+=e;if(d)f+="&_sort="+d;if(this.env.search_request)f+="&_search="+this.env.search_request;if(this.env.mailbox!=a){b=1;this.env.current_page=b;this.select_all_mode=false}this.clear_message_list();if(a!=this.env.mailbox||a==this.env.mailbox&&
+!b&&!d)f+="&_refresh=1";this.select_folder(a,this.env.mailbox);this.env.mailbox=a;if(this.gui_objects.messagelist)this.list_mailbox_remote(a,b,f);else{if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){g=window.frames[this.env.contentframe];f+="&_framed=1"}if(a){this.set_busy(true,"loading");g.location.href=this.env.comm_path+"&_mbox="+urlencode(a)+(b?"&_page="+b:"")+f}}};this.clear_message_list=function(){this.env.messages={};this.last_selected=0;this.show_contentframe(false);
+this.message_list&&this.message_list.clear(true)};this.list_mailbox_remote=function(a,b,d){this.message_list.clear();a="_mbox="+urlencode(a)+(b?"&_page="+b:"");b=this.set_busy(true,"loading");this.http_request("list",a+d,b)};this.update_selection=function(){var a=this.message_list.selection,b=this.message_list.rows,d,e=[];for(d in a)b[a[d]]&&e.push(a[d]);this.message_list.selection=e};this.expand_unread=function(){for(var a,b=this.gui_objects.messagelist.tBodies[0].firstChild;b;){if(b.nodeType==1&&
+(a=this.message_list.rows[b.uid])&&a.unread_children){this.message_list.expand_all(a);this.set_unread_children(a.uid)}b=b.nextSibling}return false};this.expand_message_row=function(a,b){var d=this.message_list.rows[b];d.expanded=!d.expanded;this.set_unread_children(b);d.expanded=!d.expanded;this.message_list.expand_row(a,b)};this.expand_threads=function(){if(!(!this.env.threading||!this.env.autoexpand_threads||!this.message_list))switch(this.env.autoexpand_threads){case 2:this.expand_unread();break;
+case 1:this.message_list.expand_all()}};this.init_threads=function(a){for(var b=0,d=a.length;b<d;b++)this.add_tree_icons(a[b]);this.expand_threads()};this.add_tree_icons=function(a){var b,d,e,f,g=[],h=[],k,j=this.message_list.rows;for(k=a?j[a]?j[a].obj:null:this.message_list.list.tBodies[0].firstChild;k;){if(k.nodeType==1&&(d=j[k.uid]))if(d.depth){for(b=g.length-1;b>=0;b--){e=g[b].length;if(e>d.depth){f=e-d.depth;g[b][f]&2||(g[b][f]=g[b][f]?g[b][f]+2:2)}else if(e==d.depth)g[b][0]&2||(g[b][0]+=2);
+if(d.depth>e)break}g.push(Array(d.depth));g[g.length-1][0]=1;h.push(d.uid)}else{if(g.length){for(b in g)this.set_tree_icons(h[b],g[b]);g=[];h=[]}if(a&&k!=j[a].obj)break}k=k.nextSibling}if(g.length)for(b in g)this.set_tree_icons(h[b],g[b])};this.set_tree_icons=function(a,b){var d,e=[],f="",g=b.length;for(d=0;d<g;d++)if(b[d]>2)e.push({"class":"l3",width:15});else if(b[d]>1)e.push({"class":"l2",width:15});else if(b[d]>0)e.push({"class":"l1",width:15});else if(e.length&&!e[e.length-1]["class"])e[e.length-
+1].width+=15;else e.push({"class":null,width:15});for(d=e.length-1;d>=0;d--)f+=e[d]["class"]?'<div class="tree '+e[d]["class"]+'" />':'<div style="width:'+e[d].width+'px" />';f&&$("#rcmtab"+a).html(f)};this.update_thread_root=function(a,b){if(this.env.threading){var d=this.message_list.find_root(a);if(a!=d){var e=this.message_list.rows[d];if(b=="read"&&e.unread_children)e.unread_children--;else if(b=="unread"&&e.has_children)e.unread_children=e.unread_children?e.unread_children+1:1;else return;this.set_message_icon(d);
+this.set_unread_children(d)}}};this.update_thread=function(a){if(!this.env.threading)return 0;var b,d=0,e=this.message_list.rows,f=e[a],g=e[a].depth,h=[];if(f.depth){if(f.unread){a=this.message_list.find_root(a);e[a].unread_children--;this.set_unread_children(a)}}else d--;a=f.parent_uid;for(f=f.obj.nextSibling;f;){if(f.nodeType==1&&(b=e[f.uid])){if(!b.depth||b.depth<=g)break;b.depth--;$("#rcmtab"+b.uid).width(b.depth*15).html("");if(b.depth){if(b.depth==g)b.parent_uid=a;b.unread&&h.length&&h[h.length-
+1].unread_children++}else{d++;b.parent_uid=0;if(b.has_children){$("#rcmrow"+b.uid+" .leaf:first").attr("id","rcmexpando"+b.uid).attr("class",b.obj.style.display!="none"?"expanded":"collapsed").bind("mousedown",{uid:b.uid,p:this},function(k){return k.data.p.expand_message_row(k,k.data.uid)});b.unread_children=0;h.push(b)}b.obj.style.display=="none"&&$(b.obj).show()}}f=f.nextSibling}for(b=0;b<h.length;b++)this.set_unread_children(h[b].uid);return d};this.delete_excessive_thread_rows=function(){for(var a=
+this.message_list.rows,b=this.message_list.list.tBodies[0].firstChild,d=this.env.pagesize+1;b;){if(b.nodeType==1&&(r=a[b.uid])){!r.depth&&d&&d--;d||this.message_list.remove_row(b.uid)}b=b.nextSibling}};this.set_message_icon=function(a){var b=this.message_list.rows[a];if(!b)return false;if(b.icon){a="msgicon";if(b.deleted)a+=" deleted";else if(b.unread)a+=" unread";else if(b.unread_children)a+=" unreadchildren";if(b.msgicon==b.icon){if(b.replied)a+=" replied";if(b.forwarded)a+=" forwarded";a+=" status"}b.icon.className=
+a}if(b.msgicon&&b.msgicon!=b.icon){a="msgicon";if(!b.unread&&b.unread_children)a+=" unreadchildren";if(b.replied)a+=" replied";if(b.forwarded)a+=" forwarded";b.msgicon.className=a}if(b.flagicon){a=b.flagged?"flagged":"unflagged";b.flagicon.className=a}};this.set_message_status=function(a,b,d){a=this.message_list.rows[a];if(!a)return false;if(b=="unread")a.unread=d;else if(b=="deleted")a.deleted=d;else if(b=="replied")a.replied=d;else if(b=="forwarded")a.forwarded=d;else if(b=="flagged")a.flagged=
+d};this.set_message=function(a,b,d){var e=this.message_list.rows[a];if(!e)return false;b&&this.set_message_status(a,b,d);b=$(e.obj);if(e.unread&&!b.hasClass("unread"))b.addClass("unread");else!e.unread&&b.hasClass("unread")&&b.removeClass("unread");if(e.deleted&&!b.hasClass("deleted"))b.addClass("deleted");else!e.deleted&&b.hasClass("deleted")&&b.removeClass("deleted");if(e.flagged&&!b.hasClass("flagged"))b.addClass("flagged");else!e.flagged&&b.hasClass("flagged")&&b.removeClass("flagged");this.set_unread_children(a);
+this.set_message_icon(a)};this.set_unread_children=function(a){a=this.message_list.rows[a];a.parent_uid||(!a.unread&&a.unread_children&&!a.expanded?$(a.obj).addClass("unroot"):$(a.obj).removeClass("unroot"))};this.copy_messages=function(a){if(a&&typeof a=="object")a=a.id;if(!(!a||a==this.env.mailbox||!this.env.uid&&(!this.message_list||!this.message_list.get_selection().length))){var b=[],d=this.display_message(this.get_label("copyingmessage"),"loading");a="&_target_mbox="+urlencode(a)+"&_from="+
+(this.env.action?this.env.action:"");if(this.env.uid)b[0]=this.env.uid;else{var e=this.message_list.get_selection(),f;for(f in e)b.push(e[f])}a+="&_uid="+this.uids_to_list(b);this.http_post("copy","_mbox="+urlencode(this.env.mailbox)+a,d)}};this.move_messages=function(a){if(a&&typeof a=="object")a=a.id;if(!(!a||a==this.env.mailbox||!this.env.uid&&(!this.message_list||!this.message_list.get_selection().length))){var b=false;a="&_target_mbox="+urlencode(a)+"&_from="+(this.env.action?this.env.action:
+"");if(this.env.action=="show")b=this.set_busy(true,"movingmessage");else this.show_contentframe(false);this.enable_command(this.env.message_commands,false);this._with_selected_messages("moveto",b,a)}};this.delete_messages=function(){var a=this.message_list?$.merge([],this.message_list.get_selection()):[];if(this.env.uid||a.length){for(var b,d=0,e=a.length;d<e;d++){b=a[d];this.message_list.rows[b].has_children&&!this.message_list.rows[b].expanded&&this.message_list.select_childs(b)}if(this.env.flag_for_deletion){this.mark_message("delete");
+return false}else if(!this.env.trash_mailbox||this.env.mailbox==this.env.trash_mailbox)this.permanently_remove_messages();else if(this.message_list&&this.message_list.shiftkey)confirm(this.get_label("deletemessagesconfirm"))&&this.permanently_remove_messages();else this.move_messages(this.env.trash_mailbox);return true}};this.permanently_remove_messages=function(){if(!(!this.env.uid&&(!this.message_list||!this.message_list.get_selection().length))){this.show_contentframe(false);this._with_selected_messages("delete",
+false,"&_from="+(this.env.action?this.env.action:""))}};this._with_selected_messages=function(a,b,d){var e=[],f=0;if(this.env.uid)e[0]=this.env.uid;else{var g,h,k,j=[],m=this.message_list.get_selection();g=0;for(len=m.length;g<len;g++){h=m[g];e.push(h);if(this.env.threading){f+=this.update_thread(h);k=this.message_list.find_root(h);k!=h&&$.inArray(k,j)<0&&j.push(k)}this.message_list.remove_row(h,this.env.display_next&&g==m.length-1)}this.env.display_next||this.message_list.clear_selection();g=0;for(len=
+j.length;g<len;g++)this.add_tree_icons(j[g])}if(this.env.search_request)d+="&_search="+this.env.search_request;if(this.env.display_next&&this.env.next_uid)d+="&_next_uid="+this.env.next_uid;if(f<0)d+="&_count="+f*-1;else f>0&&this.delete_excessive_thread_rows();d+="&_uid="+this.uids_to_list(e);if(!b){b=a=="moveto"?"movingmessage":"deletingmessage";b=this.display_message(this.get_label(b),"loading")}this.http_post(a,"_mbox="+urlencode(this.env.mailbox)+d,b)};this.mark_message=function(a,b){var d=[],
+e=[],f,g,h;h=this.message_list?this.message_list.get_selection():[];if(b)d[0]=b;else if(this.env.uid)d[0]=this.env.uid;else if(this.message_list){g=0;for(f=h.length;g<f;g++)d.push(h[g])}if(this.message_list){g=0;for(f=d.length;g<f;g++){h=d[g];if(a=="read"&&this.message_list.rows[h].unread||a=="unread"&&!this.message_list.rows[h].unread||a=="delete"&&!this.message_list.rows[h].deleted||a=="undelete"&&this.message_list.rows[h].deleted||a=="flagged"&&!this.message_list.rows[h].flagged||a=="unflagged"&&
+this.message_list.rows[h].flagged)e.push(h)}}else e=d;if(e.length||this.select_all_mode)switch(a){case "read":case "unread":this.toggle_read_status(a,e);break;case "delete":case "undelete":this.toggle_delete_status(e);break;case "flagged":case "unflagged":this.toggle_flagged_status(a,d)}};this.toggle_read_status=function(a,b){for(var d=0;d<b.length;d++)this.set_message(b[d],"unread",a=="unread"?true:false);d="_uid="+this.uids_to_list(b)+"&_flag="+a;var e=this.display_message(this.get_label("markingmessage"),
+"loading");if(this.env.search_request)d+="&_search="+this.env.search_request;this.http_post("mark",d,e);for(d=0;d<b.length;d++)this.update_thread_root(b[d],a)};this.toggle_flagged_status=function(a,b){for(var d=0;d<b.length;d++)this.set_message(b[d],"flagged",a=="flagged"?true:false);d="_uid="+this.uids_to_list(b)+"&_flag="+a;var e=this.display_message(this.get_label("markingmessage"),"loading");if(this.env.search_request)d+="&_search="+this.env.search_request;this.http_post("mark",d,e)};this.toggle_delete_status=
+function(a){var b=this.message_list?this.message_list.rows:[];if(a.length==1){!b.length||b[a[0]]&&!b[a[0]].deleted?this.flag_as_deleted(a):this.flag_as_undeleted(a);return true}for(var d,e=true,f=0,g=a.length;f<g;f++){d=a[f];if(b[d]&&!b[d].deleted){e=false;break}}e?this.flag_as_undeleted(a):this.flag_as_deleted(a);return true};this.flag_as_undeleted=function(a){for(var b=0,d=a.length;b<d;b++)this.set_message(a[b],"deleted",false);a="_uid="+this.uids_to_list(a)+"&_flag=undelete";b=this.display_message(this.get_label("markingmessage"),
+"loading");if(this.env.search_request)a+="&_search="+this.env.search_request;this.http_post("mark",a,b);return true};this.flag_as_deleted=function(a){var b="",d=[];b=this.message_list?this.message_list.rows:[];for(var e=0,f=0,g=a.length;f<g;f++){uid=a[f];if(b[uid]){if(b[uid].unread)d[d.length]=uid;if(this.env.skip_deleted){e+=this.update_thread(uid);this.message_list.remove_row(uid,this.env.display_next&&f==this.message_list.selection.length-1)}else this.set_message(uid,"deleted",true)}}if(this.env.skip_deleted&&
+this.message_list){this.env.display_next||this.message_list.clear_selection();e<0||e>0&&this.delete_excessive_thread_rows()}b="&_from="+(this.env.action?this.env.action:"");lock=this.display_message(this.get_label("markingmessage"),"loading");if(d.length)b+="&_ruid="+this.uids_to_list(d);if(this.env.skip_deleted)if(this.env.display_next&&this.env.next_uid)b+="&_next_uid="+this.env.next_uid;if(this.env.search_request)b+="&_search="+this.env.search_request;this.http_post("mark","_uid="+this.uids_to_list(a)+
+"&_flag=delete"+b,lock);return true};this.flag_deleted_as_read=function(a){for(var b=this.message_list?this.message_list.rows:[],d=String(a).split(","),e=0;e<d.length;e++){a=d[e];b[a]&&this.set_message(a,"unread",false)}};this.uids_to_list=function(a){return this.select_all_mode?"*":a.join(",")};this.expunge_mailbox=function(a){var b=false,d="_mbox="+urlencode(a);if(a==this.env.mailbox){b=this.set_busy(true,"loading");d+="&_reload=1"}this.http_post("expunge",d,b)};this.purge_mailbox=function(a){var b=
+false,d="_mbox="+urlencode(a);if(!confirm(this.get_label("purgefolderconfirm")))return false;if(a==this.env.mailbox){b=this.set_busy(true,"loading");d+="&_reload=1"}this.http_post("purge",d,b)};this.purge_mailbox_test=function(){return this.env.messagecount&&(this.env.mailbox==this.env.trash_mailbox||this.env.mailbox==this.env.junk_mailbox||this.env.mailbox.match("^"+RegExp.escape(this.env.trash_mailbox)+RegExp.escape(this.env.delimiter))||this.env.mailbox.match("^"+RegExp.escape(this.env.junk_mailbox)+
+RegExp.escape(this.env.delimiter)))};this.login_user_keyup=function(a){var b=rcube_event.get_keycode(a),d=$("#rcmloginpwd");if(b==13&&d.length&&!d.val()){d.focus();return rcube_event.cancel(a)}return true};this.init_messageform=function(){if(!this.gui_objects.messageform)return false;var a=$("[name='_from']"),b=$("[name='_to']"),d=$("input[name='_subject']"),e=$("[name='_message']").get(0),f=$("input[name='_is_html']").val()=="1",g=["cc","bcc","replyto","followupto"];this.init_address_input_events(b);
+for(var h in g)this.init_address_input_events($("[name='_"+g[h]+"']"));if(!f){this.set_caret_pos(e,this.env.top_posting?0:$(e).val().length);a.attr("type")=="select-one"&&$("input[name='_draft_saveid']").val()==""&&this.change_identity(a[0])}if(b.val()=="")b.focus();else if(d.val()=="")d.focus();else e&&e.focus();this.env.compose_focus_elem=document.activeElement;this.compose_field_hash(true);this.auto_save_start()};this.init_address_input_events=function(a){a[bw.ie||bw.safari||bw.chrome?"keydown":
+"keypress"](function(b){return l.ksearch_keydown(b,this)}).attr("autocomplete","off")};this.check_compose_input=function(){var a,b=$("[name='_to']"),d=$("[name='_cc']"),e=$("[name='_bcc']"),f=$("[name='_from']"),g=$("[name='_subject']"),h=$("[name='_message']");if(f.attr("type")=="text"&&!rcube_check_email(f.val(),true)){alert(this.get_label("nosenderwarning"));f.focus();return false}d=b.val()?b.val():d.val()?d.val():e.val();if(!rcube_check_email(d.replace(/^\s+/,"").replace(/[\s,;]+$/,""),true)){alert(this.get_label("norecipientwarning"));
+b.focus();return false}for(var k in this.env.attachments)if(typeof this.env.attachments[k]=="object"&&!this.env.attachments[k].complete){alert(this.get_label("notuploadedwarning"));return false}if(g.val()==""){b=prompt(this.get_label("nosubjectwarning"),this.get_label("nosubject"));if(!b&&b!==""){g.focus();return false}else g.val(b?b:this.get_label("nosubject"))}this.stop_spellchecking();if(window.tinyMCE)a=tinyMCE.get(this.env.composebody);if(!a&&h.val()==""&&!confirm(this.get_label("nobodywarning"))){h.focus();
+return false}else if(a){if(!a.getContent()&&!confirm(this.get_label("nobodywarning"))){a.focus();return false}tinyMCE.triggerSave()}return true};this.toggle_editor=function(a){if(a.mode=="html"){this.display_spellcheck_controls(false);this.plain2html($("#"+a.id).val(),a.id);tinyMCE.execCommand("mceAddControl",false,a.id)}else{var b=tinyMCE.get(a.id);b.plugins.spellchecker&&b.plugins.spellchecker.active&&b.execCommand("mceSpellCheck",false);if(b=b.getContent()){if(!confirm(this.get_label("editorwarning")))return false;
+this.html2plain(b,a.id)}tinyMCE.execCommand("mceRemoveControl",false,a.id);this.display_spellcheck_controls(true)}return true};this.stop_spellchecking=function(){var a;if(window.tinyMCE&&(a=tinyMCE.get(this.env.composebody)))a.plugins.spellchecker&&a.plugins.spellchecker.active&&a.execCommand("mceSpellCheck");else if((a=this.env.spellcheck)&&!this.spellcheck_ready){$(a.spell_span).trigger("click");this.set_spellcheck_state("ready")}};this.display_spellcheck_controls=function(a){if(this.env.spellcheck){a||
+this.stop_spellchecking();$(this.env.spellcheck.spell_container).css("visibility",a?"visible":"hidden")}};this.set_spellcheck_state=function(a){this.spellcheck_ready=a=="ready"||a=="no_error_found";this.enable_command("spellcheck",this.spellcheck_ready)};this.set_draft_id=function(a){$("input[name='_draft_saveid']").val(a)};this.auto_save_start=function(){if(this.env.draft_autosave)this.save_timer=self.setTimeout(function(){l.command("savedraft")},this.env.draft_autosave*1E3);this.busy=false};this.compose_field_hash=
+function(a){var b=$("[name='_to']").val(),d=$("[name='_cc']").val(),e=$("[name='_bcc']").val(),f=$("[name='_subject']").val(),g="";if(b)g+=b+":";if(d)g+=d+":";if(e)g+=e+":";if(f)g+=f+":";b=tinyMCE.get(this.env.composebody);g+=b?b.getContent():$("[name='_message']").val();if(this.env.attachments)for(var h in this.env.attachments)g+=h;if(a)this.cmp_hash=g;return g};this.change_identity=function(a,b){if(!a||!a.options)return false;if(!b)b=this.env.show_sig;var d,e=-1,f=a.options[a.selectedIndex].value,
+g=$("[name='_message']"),h=g.val(),k=$("input[name='_is_html']").val()=="1",j=this.env.identity;d=this.env.sig_above&&(this.env.compose_mode=="reply"||this.env.compose_mode=="forward")?"---":"-- ";if(this.env.signatures&&this.env.signatures[f]){this.enable_command("insert-sig",true);this.env.compose_commands.push("insert-sig")}else this.enable_command("insert-sig",false);if(k){if(b&&this.env.signatures){e=tinyMCE.get(this.env.composebody);g=e.dom.get("_rc_sig");if(!g){j=e.getBody();h=e.getDoc();g=
+h.createElement("div");g.setAttribute("id","_rc_sig");if(this.env.sig_above){e.getWin().focus();e=e.selection.getNode();if(e.nodeName=="BODY"){j.insertBefore(g,j.firstChild);j.insertBefore(h.createElement("br"),j.firstChild)}else{j.insertBefore(g,e.nextSibling);j.insertBefore(h.createElement("br"),e.nextSibling)}}else{bw.ie&&j.appendChild(h.createElement("br"));j.appendChild(g)}}if(this.env.signatures[f]){if(this.env.signatures[f].is_html){j=this.env.signatures[f].text;this.env.signatures[f].plain_text.match(/^--[ -]\r?\n/)||
+(j=d+"<br />"+j)}else{j=this.env.signatures[f].text;j.match(/^--[ -]\r?\n/)||(j=d+"\n"+j);j="<pre>"+j+"</pre>"}g.innerHTML=j}}}else{if(b&&j&&this.env.signatures&&this.env.signatures[j]){j=this.env.signatures[j].is_html?this.env.signatures[j].plain_text:this.env.signatures[j].text;j=j.replace(/\r\n/g,"\n");j.match(/^--[ -]\n/)||(j=d+"\n"+j);e=this.env.sig_above?h.indexOf(j):h.lastIndexOf(j);if(e>=0)h=h.substring(0,e)+h.substring(e+j.length,h.length)}if(b&&this.env.signatures&&this.env.signatures[f]){j=
+this.env.signatures[f].is_html?this.env.signatures[f].plain_text:this.env.signatures[f].text;j=j.replace(/\r\n/g,"\n");j.match(/^--[ -]\n/)||(j=d+"\n"+j);if(this.env.sig_above)if(e>=0){h=h.substring(0,e)+j+h.substring(e,h.length);d=e-1}else if(pos=this.get_caret_pos(g.get(0))){h=h.substring(0,pos)+"\n"+j+"\n\n"+h.substring(pos,h.length);d=pos}else{d=0;h="\n\n"+j+"\n\n"+h.replace(/^[\r\n]+/,"")}else{h=h.replace(/[\r\n]+$/,"");d=!this.env.top_posting&&h.length?h.length+1:0;h+="\n\n"+j}}else d=this.env.top_posting?
+0:h.length;g.val(h);this.set_caret_pos(g.get(0),d)}this.env.identity=f;return true};this.upload_file=function(a){if(!a)return false;for(var b=false,d=0;d<a.elements.length;d++)if(a.elements[d].type=="file"&&a.elements[d].value){b=true;break}if(b){b=(new Date).getTime();d="rcmupload"+b;if(document.all)document.body.insertAdjacentHTML("BeforeEnd",'<iframe name="'+d+'" src="program/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>');else{var e=document.createElement("iframe");e.name=d;
+e.style.border="none";e.style.width=0;e.style.height=0;e.style.visibility="hidden";document.body.appendChild(e)}$(d).bind("load",{ts:b},function(f){var g,h="";try{if(this.contentDocument)g=this.contentDocument;else if(this.contentWindow)g=this.contentWindow.document;h=g.childNodes[0].innerHTML}catch(k){}if(!h.match(/add2attachment/)&&(!bw.opera||rcmail.env.uploadframe&&rcmail.env.uploadframe==f.data.ts)){h.match(/display_message/)||rcmail.display_message(rcmail.get_label("fileuploaderror"),"error");
+rcmail.remove_from_attachment_list(f.data.ts)}if(bw.opera)rcmail.env.uploadframe=f.data.ts});a.target=d;a.action=this.env.comm_path+"&_action=upload&_uploadid="+b;a.setAttribute("enctype","multipart/form-data");a.submit();e=this.get_label("uploading");if(this.env.loadingicon)e='<img src="'+this.env.loadingicon+'" alt="" />'+e;if(this.env.cancelicon)e='<a title="'+this.get_label("cancel")+'" onclick="return rcmail.cancel_attachment_upload(\''+b+"', '"+d+'\');" href="#cancelupload"><img src="'+this.env.cancelicon+
+'" alt="" /></a>'+e;this.add2attachment_list(b,{name:"",html:e,complete:false})}this.gui_objects.attachmentform=a;return true};this.add2attachment_list=function(a,b,d){if(!this.gui_objects.attachmentlist)return false;var e=$("<li>").attr("id",a).html(b.html),f;d&&(f=document.getElementById(d))?e.replaceAll(f):e.appendTo(this.gui_objects.attachmentlist);d&&this.env.attachments[d]&&delete this.env.attachments[d];this.env.attachments[a]=b;return true};this.remove_from_attachment_list=function(a){this.env.attachments[a]&&
+delete this.env.attachments[a];if(!this.gui_objects.attachmentlist)return false;var b=this.gui_objects.attachmentlist.getElementsByTagName("li");for(i=0;i<b.length;i++)b[i].id==a&&this.gui_objects.attachmentlist.removeChild(b[i])};this.remove_attachment=function(a){a&&this.env.attachments[a]&&this.http_post("remove-attachment","_file="+urlencode(a));return true};this.cancel_attachment_upload=function(a,b){if(!a||!b)return false;this.remove_from_attachment_list(a);$("iframe[name='"+b+"']").remove();
+return false};this.add_contact=function(a){a&&this.http_post("addcontact","_address="+a);return true};this.qsearch=function(a){if(a!=""){var b="";if(this.message_list){this.clear_message_list();if(this.env.search_mods){var d=this.env.search_mods[this.env.mailbox]?this.env.search_mods[this.env.mailbox]:this.env.search_mods["*"];if(d){var e=[],f;for(f in d)e.push(f);b+="&_headers="+e.join(",")}}}else if(this.contact_list){this.contact_list.clear(true);this.show_contentframe(false)}if(this.gui_objects.search_filter)b+=
+"&_filter="+this.gui_objects.search_filter.value;this.env.current_page=1;d=this.set_busy(true,"searching");this.http_request("search","_q="+urlencode(a)+(this.env.mailbox?"&_mbox="+urlencode(this.env.mailbox):"")+(this.env.source?"&_source="+urlencode(this.env.source):"")+(this.env.group?"&_gid="+urlencode(this.env.group):"")+(b?b:""),d)}return true};this.reset_qsearch=function(){if(this.gui_objects.qsearchbox)this.gui_objects.qsearchbox.value="";this.env.search_request=null;return true};this.sent_successfully=
+function(a,b){this.display_message(b,a);window.setTimeout(function(){l.list_mailbox()},500)};this.ksearch_keydown=function(a,b){this.ksearch_timer&&clearTimeout(this.ksearch_timer);var d;d=rcube_event.get_keycode(a);var e=rcube_event.get_modifier(a);switch(d){case 38:case 40:if(!this.ksearch_pane)break;e=d==38?1:0;d=document.getElementById("rcmksearchSelected");if(!d)d=this.ksearch_pane.__ul.firstChild;if(d)this.ksearch_select(e?d.previousSibling:d.nextSibling);return rcube_event.cancel(a);case 9:if(e==
+SHIFT_KEY)break;case 13:if(this.ksearch_selected===null||!this.ksearch_input||!this.ksearch_value)break;this.insert_recipient(this.ksearch_selected);this.ksearch_hide();return rcube_event.cancel(a);case 27:this.ksearch_hide();break;case 37:case 39:if(e!=SHIFT_KEY)return}this.ksearch_timer=window.setTimeout(function(){l.ksearch_get_results()},200);this.ksearch_input=b;return true};this.ksearch_select=function(a){var b=$("#rcmksearchSelected");b[0]&&a&&b.removeAttr("id").removeClass("selected");if(a){$(a).attr("id",
+"rcmksearchSelected").addClass("selected");this.ksearch_selected=a._rcm_id}};this.insert_recipient=function(a){if(this.env.contacts[a]&&this.ksearch_input){var b=this.ksearch_input.value,d=this.get_caret_pos(this.ksearch_input);d=b.lastIndexOf(this.ksearch_value,d);var e="",f=b.substring(0,d);b=b.substring(d+this.ksearch_value.length,b.length);if(typeof this.env.contacts[a]=="object"&&this.env.contacts[a].id){e+=this.env.contacts[a].name+", ";this.group2expand=$.extend({},this.env.contacts[a]);this.group2expand.input=
+this.ksearch_input;this.http_request("group-expand","_source="+urlencode(this.env.contacts[a].source)+"&_gid="+urlencode(this.env.contacts[a].id),false)}else if(typeof this.env.contacts[a]=="string")e=this.env.contacts[a]+", ";this.ksearch_input.value=f+e+b;d=d+e.length;this.ksearch_input.setSelectionRange&&this.ksearch_input.setSelectionRange(d,d)}};this.replace_group_recipients=function(a,b){if(this.group2expand&&this.group2expand.id==a){this.group2expand.input.value=this.group2expand.input.value.replace(this.group2expand.name,
+b);this.group2expand=null}};this.ksearch_get_results=function(){var a=this.ksearch_input?this.ksearch_input.value:null;if(a!==null){this.ksearch_pane&&this.ksearch_pane.is(":visible")&&this.ksearch_pane.hide();var b=this.get_caret_pos(this.ksearch_input),d=a.lastIndexOf(",",b-1);a=a.substring(d+1,b);b=this.env.autocomplete_min_length;a=$.trim(a);if(a!=this.ksearch_value)if(a.length<b){if(!this.env.acinfo){a=this.get_label("autocompletechars");a=a.replace("$min",b);this.env.acinfo=this.display_message(a)}}else{this.env.acinfo&&
+a.length==b&&this.hide_message(this.env.acinfo);b=this.ksearch_value;this.ksearch_value=a;if(a.length)if(!(b&&b.length&&this.env.contacts&&!this.env.contacts.length&&a.indexOf(b)==0)){b=this.display_message(this.get_label("searching"),"loading");this.http_post("autocomplete","_search="+urlencode(a),b)}}}};this.ksearch_query_results=function(a,b){if(!(this.ksearch_value&&b!=this.ksearch_value)){this.env.contacts=a?a:[];this.ksearch_display_results(this.env.contacts)}};this.ksearch_display_results=
+function(a){if(a.length&&this.ksearch_input&&this.ksearch_value){var b,d,e,f=this.ksearch_value;if(!this.ksearch_pane){b=$("<ul>");this.ksearch_pane=$("<div>").attr("id","rcmKSearchpane").css({position:"absolute","z-index":3E4}).append(b).appendTo(document.body);this.ksearch_pane.__ul=b[0]}b=this.ksearch_pane.__ul;b.innerHTML="";for(i=0;i<a.length;i++){e=typeof a[i]=="object"?a[i].name:a[i];d=document.createElement("LI");d.innerHTML=e.replace(RegExp("("+RegExp.escape(f)+")","ig"),"##$1%%").replace(/</g,
+"&lt;").replace(/>/g,"&gt;").replace(/##([^%]+)%%/g,"<b>$1</b>");d.onmouseover=function(){l.ksearch_select(this)};d.onmouseup=function(){l.ksearch_click(this)};d._rcm_id=i;b.appendChild(d)}$(b.firstChild).attr("id","rcmksearchSelected").addClass("selected");this.ksearch_selected=0;a=$(this.ksearch_input).offset();this.ksearch_pane.css({left:a.left+"px",top:a.top+this.ksearch_input.offsetHeight+"px"}).show()}else this.ksearch_hide()};this.ksearch_click=function(a){this.ksearch_input&&this.ksearch_input.focus();
+this.insert_recipient(a._rcm_id);this.ksearch_hide()};this.ksearch_blur=function(){this.ksearch_timer&&clearTimeout(this.ksearch_timer);this.ksearch_value="";this.ksearch_input=null;this.ksearch_hide()};this.ksearch_hide=function(){this.ksearch_selected=null;this.ksearch_pane&&this.ksearch_pane.hide()};this.contactlist_keypress=function(a){a.key_pressed==a.DELETE_KEY&&this.command("delete")};this.contactlist_select=function(a){this.preview_timer&&clearTimeout(this.preview_timer);var b,d=this;if(b=
+a.get_single_selection())this.preview_timer=window.setTimeout(function(){d.load_contact(b,"show")},200);else this.env.contentframe&&this.show_contentframe(false);this.enable_command("compose",a.selection.length>0);this.enable_command("edit",b&&this.env.address_sources&&!this.env.address_sources[this.env.source].readonly?true:false);this.enable_command("delete",a.selection.length&&this.env.address_sources&&!this.env.address_sources[this.env.source].readonly);return false};this.list_contacts=function(a,
+b,d){var e="",f=window;if(!a)a=this.env.source;if(d&&this.current_page==d&&a==this.env.source&&b==this.env.group)return false;if(a!=this.env.source){d=this.env.current_page=1;this.reset_qsearch()}else if(b!=this.env.group)d=this.env.current_page=1;this.select_folder(b?"G"+a+b:a,this.env.group?"G"+this.env.source+this.env.group:this.env.source);this.env.source=a;this.env.group=b;if(this.gui_objects.contactslist)this.list_contacts_remote(a,b,d);else{if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){f=
+window.frames[this.env.contentframe];e="&_framed=1"}if(b)e+="&_gid="+b;if(d)e+="&_page="+d;if(this.env.search_request)e+="&_search="+this.env.search_request;this.set_busy(true,"loading");f.location.href=this.env.comm_path+(a?"&_source="+urlencode(a):"")+e}};this.list_contacts_remote=function(a,b,d){this.contact_list.clear(true);this.show_contentframe(false);this.enable_command("delete","compose",false);d=(a?"_source="+urlencode(a):"")+(d?(a?"&":"")+"_page="+d:"");var e=this.set_busy(true,"loading");
+this.env.source=a;if(this.env.group=b)d+="&_gid="+b;if(this.env.search_request)d+="&_search="+this.env.search_request;this.http_request("list",d,e)};this.load_contact=function(a,b,d){var e="",f=window;if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){e="&_framed=1";f=window.frames[this.env.contentframe];this.show_contentframe(true)}else if(d)return false;if(b&&(a||b=="add")&&!this.drag_active){if(this.env.group)e+="&_gid="+urlencode(this.env.group);this.set_busy(true);
+f.location.href=this.env.comm_path+"&_action="+b+"&_source="+urlencode(this.env.source)+"&_cid="+urlencode(a)+e}return true};this.copy_contact=function(a,b){a||(a=this.contact_list.get_selection().join(","));if(b.type=="group"&&b.source==this.env.source)this.http_post("group-addmembers","_cid="+urlencode(a)+"&_source="+urlencode(this.env.source)+"&_gid="+urlencode(b.id));else if(b.type=="group"&&!this.env.address_sources[b.source].readonly)this.http_post("copy","_cid="+urlencode(a)+"&_source="+urlencode(this.env.source)+
+"&_to="+urlencode(b.source)+"&_togid="+urlencode(b.id)+(this.env.group?"&_gid="+urlencode(this.env.group):""));else if(b.id!=this.env.source&&a&&this.env.address_sources[b.id]&&!this.env.address_sources[b.id].readonly)this.http_post("copy","_cid="+urlencode(a)+"&_source="+urlencode(this.env.source)+"&_to="+urlencode(b.id)+(this.env.group?"&_gid="+urlencode(this.env.group):""))};this.delete_contacts=function(){var a=this.contact_list.get_selection();if((a.length||this.env.cid)&&confirm(this.get_label("deletecontactconfirm"))){var b,
+d=[],e="";if(this.env.cid)d.push(this.env.cid);else{for(var f=0;f<a.length;f++){b=a[f];d.push(b);this.contact_list.remove_row(b,f==a.length-1)}a.length==1&&this.show_contentframe(false)}if(this.env.search_request)e+="&_search="+this.env.search_request;this.http_post("delete","_cid="+urlencode(d.join(","))+"&_source="+urlencode(this.env.source)+"&_from="+(this.env.action?this.env.action:"")+e);return true}};this.update_contact_row=function(a,b,d){var e;if(this.contact_list.rows[a]&&(e=this.contact_list.rows[a].obj)){for(var f=
+0;f<b.length;f++)e.cells[f]&&$(e.cells[f]).html(b[f]);if(d){e.id="rcmrow"+d;this.contact_list.remove_row(a);this.contact_list.init_row(e);this.contact_list.selection[0]=d;e.style.display=""}return true}return false};this.add_contact_row=function(a,b){if(!this.gui_objects.contactslist||!this.gui_objects.contactslist.tBodies[0])return false;var d=this.gui_objects.contactslist.tBodies[0].rows.length%2,e=document.createElement("tr");e.id="rcmrow"+a;e.className="contact "+(d?"even":"odd");if(this.contact_list.in_selection(a))e.className+=
+" selected";for(var f in b){col=document.createElement("td");col.className=String(f).toLowerCase();col.innerHTML=b[f];e.appendChild(col)}this.contact_list.insert_row(e);this.enable_command("export",this.contact_list.rowcount>0)};this.group_create=function(){if(this.gui_objects.folderlist&&this.env.address_sources[this.env.source].groups){if(!this.name_input){this.name_input=$("<input>").attr("type","text");this.name_input.bind("keydown",function(a){return rcmail.add_input_keydown(a)});this.name_input_li=
+$("<li>").addClass("contactgroup").append(this.name_input);this.name_input_li.insertAfter(this.get_folder_li(this.env.source))}this.name_input.select().focus()}};this.group_rename=function(){if(this.env.group&&this.gui_objects.folderlist){if(!this.name_input){this.enable_command("list","listgroup",false);this.name_input=$("<input>").attr("type","text").val(this.env.contactgroups["G"+this.env.source+this.env.group].name);this.name_input.bind("keydown",function(d){return rcmail.add_input_keydown(d)});
+this.env.group_renaming=true;var a,b=this.get_folder_li(this.env.source+this.env.group,"rcmliG");if(b&&(a=b.firstChild))$(a).hide().before(this.name_input)}this.name_input.select().focus()}};this.group_delete=function(){this.env.group&&this.http_post("group-delete","_source="+urlencode(this.env.source)+"&_gid="+urlencode(this.env.group),true)};this.remove_group_item=function(a){var b,d="G"+a.source+a.id;if(b=this.get_folder_li(d)){this.triggerEvent("group_delete",{source:a.source,id:a.id,li:b});b.parentNode.removeChild(b);
+delete this.env.contactfolders[d];delete this.env.contactgroups[d]}this.list_contacts(a.source,0)};this.add_input_keydown=function(a){a=rcube_event.get_keycode(a);if(a==13){if(a=this.name_input.val()){var b=this.set_busy(true,"loading");this.env.group_renaming?this.http_post("group-rename","_source="+urlencode(this.env.source)+"&_gid="+urlencode(this.env.group)+"&_name="+urlencode(a),b):this.http_post("group-create","_source="+urlencode(this.env.source)+"&_name="+urlencode(a),b)}return false}else a==
+27&&this.reset_add_input();return true};this.reset_add_input=function(){if(this.name_input){if(this.env.group_renaming){this.name_input.parent().children().last().show();this.env.group_renaming=false}this.name_input.remove();this.name_input_li&&this.name_input_li.remove();this.name_input=this.name_input_li=null}this.enable_command("list","listgroup",true)};this.insert_contact_group=function(a){this.reset_add_input();a.type="group";var b="G"+a.source+a.id;this.env.contactfolders[b]=this.env.contactgroups[b]=
+a;var d=$("<a>").attr("href","#").bind("click",function(){return rcmail.command("listgroup",a,this)}).html(a.name);b=$("<li>").attr("id","rcmli"+b).addClass("contactgroup").append(d).insertAfter(this.get_folder_li(a.source));this.triggerEvent("group_insert",{id:a.id,source:a.source,name:a.name,li:b[0]})};this.update_contact_group=function(a){this.reset_add_input();var b="G"+a.source+a.id,d,e=this.get_folder_li(b);if(e&&(d=e.firstChild)&&d.tagName.toLowerCase()=="a")d.innerHTML=a.name;this.env.contactfolders[b].name=
+this.env.contactgroups[b].name=a.name;this.triggerEvent("group_update",{id:a.id,source:a.source,name:a.name,li:e[0]})};this.init_subscription_list=function(){var a=this;this.subscription_list=new rcube_list_widget(this.gui_objects.subscriptionlist,{multiselect:false,draggable:true,keyboard:false,toggleselect:true});this.subscription_list.addEventListener("select",function(b){a.subscription_select(b)});this.subscription_list.addEventListener("dragstart",function(){a.drag_active=true});this.subscription_list.addEventListener("dragend",
+function(b){a.subscription_move_folder(b)});this.subscription_list.row_init=function(b){b.obj.onmouseover=function(){a.focus_subscription(b.id)};b.obj.onmouseout=function(){a.unfocus_subscription(b.id)}};this.subscription_list.init()};this.section_select=function(a){if(a=a.get_single_selection()){var b="",d=window;this.set_busy(true);if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){b="&_framed=1";d=window.frames[this.env.contentframe]}d.location.href=this.env.comm_path+
+"&_action=edit-prefs&_section="+a+b}return true};this.identity_select=function(a){if(a=a.get_single_selection())this.load_identity(a,"edit-identity")};this.load_identity=function(a,b){if(b=="edit-identity"&&(!a||a==this.env.iid))return false;var d="",e=window;if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){d="&_framed=1";e=window.frames[this.env.contentframe];document.getElementById(this.env.contentframe).style.visibility="inherit"}if(b&&(a||b=="add-identity")){this.set_busy(true);
+e.location.href=this.env.comm_path+"&_action="+b+"&_iid="+a+d}return true};this.delete_identity=function(a){var b=this.identity_list.get_selection();if(b.length||this.env.iid){a||(a=this.env.iid?this.env.iid:b[0]);this.goto_url("delete-identity","_iid="+a+"&_token="+this.env.request_token,true);return true}};this.focus_subscription=function(a){var b,d,e=RegExp.escape(this.env.delimiter),f=RegExp("["+e+"]?[^"+e+"]+$");if(this.drag_active&&this.env.mailbox&&(b=document.getElementById(a)))if(this.env.subscriptionrows[a]&&
+(d=this.env.subscriptionrows[a][0])){if(this.check_droptarget(d)&&!this.env.subscriptionrows[this.get_folder_row_id(this.env.mailbox)][2]&&d!=this.env.mailbox.replace(f,"")&&!d.match(RegExp("^"+RegExp.escape(this.env.mailbox+this.env.delimiter)))){this.set_env("dstfolder",d);$(b).addClass("droptarget")}}else if(this.env.mailbox.match(RegExp(e))){this.set_env("dstfolder",this.env.delimiter);$(this.subscription_list.frame).addClass("droptarget")}};this.unfocus_subscription=function(a){var b=$("#"+a);
+this.set_env("dstfolder",null);this.env.subscriptionrows[a]&&b[0]?b.removeClass("droptarget"):$(this.subscription_list.frame).removeClass("droptarget")};this.subscription_select=function(a){var b,d;if(a&&(b=a.get_single_selection())&&(d=this.env.subscriptionrows["rcmrow"+b])){this.set_env("mailbox",d[0]);this.show_folder(d[0]);this.enable_command("delete-folder",!d[2])}else{this.env.mailbox=null;this.show_contentframe(false);this.enable_command("delete-folder","purge",false)}};this.subscription_move_folder=
+function(){var a=RegExp.escape(this.env.delimiter),b=RegExp("["+a+"]?[^"+a+"]+$");if(this.env.mailbox&&this.env.dstfolder&&this.env.dstfolder!=this.env.mailbox&&this.env.dstfolder!=this.env.mailbox.replace(b,"")){b=RegExp("[^"+a+"]*["+a+"]","g");a=this.set_busy(true,"foldermoving");b=this.env.mailbox.replace(b,"");b=this.env.dstfolder==this.env.delimiter?b:this.env.dstfolder+this.env.delimiter+b;this.http_post("rename-folder","_folder_oldname="+urlencode(this.env.mailbox)+"&_folder_newname="+urlencode(b),
+a)}this.drag_active=false;this.unfocus_subscription(this.get_folder_row_id(this.env.dstfolder))};this.create_folder=function(){this.show_folder("",this.env.mailbox)};this.delete_folder=function(a){if((a=this.env.subscriptionrows[this.get_folder_row_id(a?a:this.env.mailbox)][0])&&confirm(this.get_label("deletefolderconfirm"))){var b=this.set_busy(true,"folderdeleting");this.http_post("delete-folder","_mbox="+urlencode(a),b)}};this.add_folder_row=function(a,b,d,e){if(!this.gui_objects.subscriptionlist)return false;
+var f,g;for(g in this.env.subscriptionrows)if(this.env.subscriptionrows[g]!=null&&!this.env.subscriptionrows[g][2]){f=g;break}var h;g=this.gui_objects.subscriptionlist.tBodies[0];var k="rcmrow"+(g.childNodes.length+1),j=this.subscription_list.get_single_selection();if(d&&d.id)f=k=d.id;if(!k||!f||!(h=document.getElementById(f))){this.goto_url("folders");return false}f=this.clone_table_row(h);f.id=k;e&&(e=this.get_folder_row_id(e))?g.insertBefore(f,document.getElementById(e)):g.appendChild(f);d&&g.removeChild(d);
+this.env.subscriptionrows[f.id]=[a,b,0];f.cells[0].innerHTML=b;if(!d){f.cells[1].innerHTML="*";$('input[name="_subscribed[]"]',f).val(a).attr("checked",true)}this.init_subscription_list();j&&document.getElementById("rcmrow"+j)&&this.subscription_list.select_row(j);document.getElementById(k).scrollIntoView&&document.getElementById(k).scrollIntoView()};this.replace_folder_row=function(a,b,d,e){a=this.get_folder_row_id(a);a=document.getElementById(a);this.add_folder_row(b,d,a,e)};this.remove_folder_row=
+function(a){var b;if((a=this.get_folder_row_id(a))&&(b=document.getElementById(a)))b.style.display="none"};this.subscribe=function(a){if(a){var b=this.display_message(this.get_label("foldersubscribing"),"loading");this.http_post("subscribe","_mbox="+urlencode(a),b)}};this.unsubscribe=function(a){if(a){var b=this.display_message(this.get_label("folderunsubscribing"),"loading");this.http_post("unsubscribe","_mbox="+urlencode(a),b)}};this.get_folder_row_id=function(a){for(var b in this.env.subscriptionrows)if(this.env.subscriptionrows[b]&&
+this.env.subscriptionrows[b][0]==a)break;return b};this.clone_table_row=function(a){for(var b,d,e=document.createElement("tr"),f=0;f<a.cells.length;f++){b=a.cells[f];d=document.createElement("td");if(b.className)d.className=b.className;b.align&&d.setAttribute("align",b.align);d.innerHTML=b.innerHTML;e.appendChild(d)}return e};this.show_folder=function(a,b,d){var e=window;a="&_action=edit-folder&_mbox="+urlencode(a);if(b)a+="&_path="+urlencode(b);if(this.env.contentframe&&window.frames&&window.frames[this.env.contentframe]){e=
+window.frames[this.env.contentframe];a+="&_framed=1"}if(String(e.location.href).indexOf(a)>=0&&!d)this.show_contentframe(true);else{if(!this.env.frame_lock)(parent.rcmail?parent.rcmail:this).env.frame_lock=this.set_busy(true,"loading");e.location.href=this.env.comm_path+a}};this.folder_size=function(a){var b=this.set_busy(true,"loading");this.http_post("folder-size","_mbox="+urlencode(a),b)};this.folder_size_update=function(a){$("#folder-size").replaceWith(a)};this.set_page_buttons=function(){this.enable_command("nextpage",
+"lastpage",this.env.pagecount>this.env.current_page);this.enable_command("previouspage","firstpage",this.env.current_page>1)};this.init_buttons=function(){for(var a in this.buttons)if(typeof a=="string")for(var b=0;b<this.buttons[a].length;b++){var d=this.buttons[a][b],e=document.getElementById(d.id);if(e){var f=false;if(d.type=="image"){e=e.parentNode;f=true}e._command=a;e._id=d.id;if(d.sel){e.onmousedown=function(){return rcmail.button_sel(this._command,this._id)};e.onmouseup=function(){return rcmail.button_out(this._command,
+this._id)};if(f)(new Image).src=d.sel}if(d.over){e.onmouseover=function(){return rcmail.button_over(this._command,this._id)};e.onmouseout=function(){return rcmail.button_out(this._command,this._id)};if(f)(new Image).src=d.over}}}};this.set_button=function(a,b){var d,e,f=this.buttons[a];if(!f||!f.length)return false;for(var g=0;g<f.length;g++){d=f[g];if((e=document.getElementById(d.id))&&d.type=="image"&&!d.status){d.pas=e._original_src?e._original_src:e.src;if(e.runtimeStyle&&e.runtimeStyle.filter&&
+e.runtimeStyle.filter.match(/src=['"]([^'"]+)['"]/))d.pas=RegExp.$1}else if(e&&!d.status)d.pas=String(e.className);if(e&&d.type=="image"&&d[b]){d.status=b;e.src=d[b]}else if(e&&typeof d[b]!="undefined"){d.status=b;e.className=d[b]}if(e&&d.type=="input"){d.status=b;e.disabled=!b}}};this.set_alttext=function(a,b){if(this.buttons[a]&&this.buttons[a].length)for(var d,e,f,g=0;g<this.buttons[a].length;g++){d=this.buttons[a][g];e=document.getElementById(d.id);if(d.type=="image"&&e){e.setAttribute("alt",
+this.get_label(b));if((f=e.parentNode)&&f.tagName.toLowerCase()=="a")f.setAttribute("title",this.get_label(b))}else e&&e.setAttribute("title",this.get_label(b))}};this.button_over=function(a,b){var d,e,f=this.buttons[a];if(!f||!f.length)return false;for(var g=0;g<f.length;g++){d=f[g];if(d.id==b&&d.status=="act")if((e=document.getElementById(d.id))&&d.over)if(d.type=="image")e.src=d.over;else e.className=d.over}};this.button_sel=function(a,b){var d,e,f=this.buttons[a];if(f&&f.length)for(var g=0;g<
+f.length;g++){d=f[g];if(d.id==b&&d.status=="act"){if((e=document.getElementById(d.id))&&d.sel)if(d.type=="image")e.src=d.sel;else e.className=d.sel;this.buttons_sel[b]=a}}};this.button_out=function(a,b){var d,e,f=this.buttons[a];if(f&&f.length)for(var g=0;g<f.length;g++){d=f[g];if(d.id==b&&d.status=="act")if((e=document.getElementById(d.id))&&d.act)if(d.type=="image")e.src=d.act;else e.className=d.act}};this.set_pagetitle=function(a){if(a&&document.title)document.title=a};this.display_message=function(a,
+b){if(this.is_framed())return parent.rcmail.display_message(a,b);if(!this.gui_objects.message){if(b!="loading")this.pending_message=[a,b];return false}b=b?b:"notice";var d=this,e=a,f=b+(new Date).getTime(),g=this.message_time*(b=="error"||b=="warning"?2:1);if(b=="loading"){e="loading";g=this.env.request_timeout*1E3;a||(a=this.get_label("loading"))}if(this.messages[e]){this.messages[e].obj&&this.messages[e].obj.html(a);b=="loading"&&this.messages[e].labels.push({id:f,msg:a});this.messages[e].elements.push(f);
+window.setTimeout(function(){d.hide_message(f,b=="loading")},g);return f}var h=$("<div>").addClass(b).html(a).data("key",e);$(this.gui_objects.message).append(h).show();this.messages[e]={obj:h,elements:[f]};if(b=="loading")this.messages[e].labels=[{id:f,msg:a}];else h.click(function(){return d.hide_message(h)});window.setTimeout(function(){d.hide_message(f,b=="loading")},g);return f};this.hide_message=function(a,b){if(this.is_framed())return parent.rcmail.hide_message(a,b);var d,e,f,g,h=this.messages;
+if(typeof a=="object"){$(a)[b?"fadeOut":"hide"]();g=$(a).data("key");this.messages[g]&&delete this.messages[g]}else for(d in h)for(e in h[d].elements)if(h[d]&&h[d].elements[e]==a){h[d].elements.splice(e,1);if(h[d].elements.length){if(d=="loading")for(f in h[d].labels){if(h[d].labels[f].id==a)delete h[d].labels[f];else g=h[d].labels[f].msg;h[d].obj.html(g)}}else{h[d].obj[b?"fadeOut":"hide"]();delete h[d]}}};this.select_folder=function(a,b,d){if(this.gui_objects.folderlist){var e;if(e=this.get_folder_li(b,
+d))$(e).removeClass("selected").removeClass("unfocused");if(e=this.get_folder_li(a,d))$(e).removeClass("unfocused").addClass("selected");this.triggerEvent("selectfolder",{folder:a,old:b,prefix:d})}};this.get_folder_li=function(a,b){b||(b="rcmli");if(this.gui_objects.folderlist){a=String(a).replace(this.identifier_expr,"_");return document.getElementById(b+a)}return null};this.set_message_coltypes=function(a,b){this.env.coltypes=a;var d=this.gui_objects.messagelist?this.gui_objects.messagelist.tHead:
+null,e,f,g,h;if(d){if(b){f=document.createElement("thead");g=document.createElement("tr");c=0;for(h=b.length;c<h;c++){e=document.createElement("td");e.innerHTML=b[c].html;if(b[c].id)e.id=b[c].id;if(b[c].className)e.className=b[c].className;g.appendChild(e)}f.appendChild(g);d.parentNode.replaceChild(f,d)}g=0;for(h=this.env.coltypes.length;g<h;g++){f=this.env.coltypes[g];if((e=d.rows[0].cells[g])&&(f=="from"||f=="to")){e.id="rcm"+f;if(e.firstChild&&e.firstChild.tagName.toLowerCase()=="a"){e=e.firstChild;
+e.onclick=function(){return rcmail.command("sort",this.__col,this)};e.__col=f}e.innerHTML=this.get_label(f)}}}this.env.subject_col=null;this.env.flagged_col=null;this.env.status_col=null;if((g=$.inArray("subject",this.env.coltypes))>=0){this.set_env("subject_col",g);if(this.message_list)this.message_list.subject_col=g}if((g=$.inArray("flag",this.env.coltypes))>=0)this.set_env("flagged_col",g);if((g=$.inArray("status",this.env.coltypes))>=0)this.set_env("status_col",g);this.message_list.init_header()};
+this.set_rowcount=function(a){$(this.gui_objects.countdisplay).html(a);this.set_page_buttons()};this.set_mailboxname=function(a){if(this.gui_objects.mailboxname&&a)this.gui_objects.mailboxname.innerHTML=a};this.set_quota=function(a){if(a&&this.gui_objects.quotadisplay)typeof a=="object"&&a.type=="image"?this.percent_indicator(this.gui_objects.quotadisplay,a):$(this.gui_objects.quotadisplay).html(a)};this.set_unread_count=function(a,b,d){if(!this.gui_objects.mailboxlist)return false;this.env.unread_counts[a]=
+b;this.set_unread_count_display(a,d)};this.set_unread_count_display=function(a,b){var d,e,f,g,h,k;if(f=this.get_folder_li(a)){g=this.env.unread_counts[a]?this.env.unread_counts[a]:0;e=f.getElementsByTagName("a")[0];d=/\s+\([0-9]+\)$/i;h=0;if((k=f.getElementsByTagName("div")[0])&&k.className.match(/collapsed/))for(var j in this.env.unread_counts)if(j.indexOf(a+this.env.delimiter)==0)h+=this.env.unread_counts[j];if(g&&e.innerHTML.match(d))e.innerHTML=e.innerHTML.replace(d," ("+g+")");else if(g)e.innerHTML+=
+" ("+g+")";else e.innerHTML=e.innerHTML.replace(d,"");d=RegExp(RegExp.escape(this.env.delimiter)+"[^"+RegExp.escape(this.env.delimiter)+"]+$");a.match(d)&&this.set_unread_count_display(a.replace(d,""),false);g+h>0?$(f).addClass("unread"):$(f).removeClass("unread")}d=/^\([0-9]+\)\s+/i;if(b&&document.title){e="";e=String(document.title);e=g&&e.match(d)?e.replace(d,"("+g+") "):g?"("+g+") "+e:e.replace(d,"");this.set_pagetitle(e)}};this.new_message_focus=function(){this.env.framed&&window.parent?window.parent.focus():
+window.focus()};this.toggle_prefer_html=function(a){var b;if(b=document.getElementById("rcmfd_addrbook_show_images"))b.disabled=!a.checked};this.toggle_preview_pane=function(a){var b;if(b=document.getElementById("rcmfd_preview_pane_mark_read"))b.disabled=!a.checked};this.set_headers=function(a){this.gui_objects.all_headers_row&&this.gui_objects.all_headers_box&&a&&$(this.gui_objects.all_headers_box).html(a).show()};this.load_headers=function(a){if(!(!this.gui_objects.all_headers_row||!this.gui_objects.all_headers_box||
+!this.env.uid)){$(a).removeClass("show-headers").addClass("hide-headers");$(this.gui_objects.all_headers_row).show();a.onclick=function(){rcmail.hide_headers(a)};this.gui_objects.all_headers_box.innerHTML||this.http_post("headers","_uid="+this.env.uid,this.display_message(this.get_label("loading"),"loading"))}};this.hide_headers=function(a){if(this.gui_objects.all_headers_row&&this.gui_objects.all_headers_box){$(a).removeClass("hide-headers").addClass("show-headers");$(this.gui_objects.all_headers_row).hide();
+a.onclick=function(){rcmail.load_headers(a)}}};this.percent_indicator=function(a,b){if(!b||!a)return false;var d=b.width?b.width:this.env.indicator_width?this.env.indicator_width:100,e=b.height?b.height:this.env.indicator_height?this.env.indicator_height:14,f=b.percent?Math.abs(parseInt(b.percent)):0,g=parseInt(f/100*d),h=$(a).position();h.top=Math.max(0,h.top);this.env.indicator_width=d;this.env.indicator_height=e;if(g>d){g=d;f=100}if(b.title)b.title=this.get_label("quota")+": "+b.title;var k=$("<div>");
+k.css({position:"absolute",top:h.top,left:h.left,width:d+"px",height:e+"px",zIndex:100,lineHeight:e+"px"}).attr("title",b.title).addClass("quota_text").html(f+"%");var j=$("<div>");j.css({position:"absolute",top:h.top+1,left:h.left+1,width:g+"px",height:e+"px",zIndex:99});g=$("<div>");g.css({position:"absolute",top:h.top+1,left:h.left+1,width:d+"px",height:e+"px",zIndex:98}).addClass("quota_bg");if(f>=80){k.addClass(" quota_text_high");j.addClass("quota_high")}else if(f>=55){k.addClass(" quota_text_mid");
+j.addClass("quota_mid")}else{k.addClass(" quota_text_normal");j.addClass("quota_low")}$(a).html("").append(j).append(g).append(k);$("#quotaimg").attr("title",b.title)};this.html2plain=function(a,b){var d=this,e=this.set_busy(true,"converting");console.log("HTTP POST: ?_task=utils&_action=html2text");$.ajax({type:"POST",url:"?_task=utils&_action=html2text",data:a,contentType:"application/octet-stream",error:function(f,g,h){d.http_error(f,g,h,e)},success:function(f){d.set_busy(false,null,e);$(document.getElementById(b)).val(f);
+console.log(f)}})};this.plain2html=function(a,b){var d=this.set_busy(true,"converting");$(document.getElementById(b)).val("<pre>"+a+"</pre>");this.set_busy(false,null,d)};this.redirect=function(a,b){if(b||b===null)this.set_busy(true);if(this.env.framed&&window.parent)parent.location.href=a;else location.href=a};this.goto_url=function(a,b,d){var e=this.env.comm_path;b=b?"&"+b:"";if(a.match(/([a-z]+)\/([a-z-_]+)/)){a=RegExp.$2;e=e.replace(/\_task=[a-z]+/,"_task="+RegExp.$1)}this.redirect(e+"&_action="+
+a+b,d)};this.http_request=function(a,b,d){var e=this.env.comm_path;if(a.match(/([a-z]+)\/([a-z-_]+)/)){a=RegExp.$2;e=e.replace(/\_task=[a-z]+/,"_task="+RegExp.$1)}var f=this.triggerEvent("request"+a,b);if(typeof f!="undefined")if(f===false)return false;else b=f;e+="&_remote=1&_action="+a+(b?"&":"")+b;console.log("HTTP GET: "+e);$.ajax({type:"GET",url:e,data:{_unlock:d?d:0},dataType:"json",success:function(g){l.http_response(g)},error:function(g,h,k){rcmail.http_error(g,h,k,d)}})};this.http_post=function(a,
+b,d){var e=this.env.comm_path;if(a.match(/([a-z]+)\/([a-z-_]+)/)){a=RegExp.$2;e=e.replace(/\_task=[a-z]+/,"_task="+RegExp.$1)}e+="&_action="+a;if(b&&typeof b=="object"){b._remote=1;b._unlock=d?d:0}else b+=(b?"&":"")+"_remote=1"+(d?"&_unlock="+d:"");a=this.triggerEvent("request"+a,b);if(typeof a!="undefined")if(a===false)return false;else b=a;console.log("HTTP POST: "+e);$.ajax({type:"POST",url:e,data:b,dataType:"json",success:function(f){l.http_response(f)},error:function(f,g,h){rcmail.http_error(f,
+g,h,d)}})};this.http_response=function(a){if(a){a.unlock&&this.set_busy(false);this.triggerEvent("responsebefore",{response:a});this.triggerEvent("responsebefore"+a.action,{response:a});a.env&&this.set_env(a.env);if(typeof a.texts=="object")for(var b in a.texts)typeof a.texts[b]=="string"&&this.add_label(b,a.texts[b]);if(a.exec){console.log(a.exec);eval(a.exec)}if(a.callbacks&&a.callbacks.length)for(b=0;b<a.callbacks.length;b++)this.triggerEvent(a.callbacks[b][0],a.callbacks[b][1]);switch(a.action){case "delete":if(this.task==
+"addressbook"){b=this.contact_list.get_selection();this.enable_command("compose",b&&this.contact_list.rows[b]);this.enable_command("delete","edit",b&&this.contact_list.rows[b]&&this.env.address_sources&&!this.env.address_sources[this.env.source].readonly);this.enable_command("export",this.contact_list&&this.contact_list.rowcount>0)}case "moveto":if(this.env.action=="show"){this.enable_command(this.env.message_commands,true);this.env.list_post||this.enable_command("reply-list",false)}else this.task==
+"addressbook"&&this.triggerEvent("listupdate",{folder:this.env.source,rowcount:this.contact_list.rowcount});case "purge":case "expunge":if(this.task=="mail"){if(!this.env.messagecount){this.env.contentframe&&this.show_contentframe(false);this.enable_command(this.env.message_commands,"purge","expunge","select-all","select-none","sort","expand-all","expand-unread","collapse-all",false)}this.message_list&&this.triggerEvent("listupdate",{folder:this.env.mailbox,rowcount:this.message_list.rowcount})}break;
+case "check-recent":case "getunread":case "search":case "list":if(this.task=="mail"){this.enable_command("show","expunge","select-all","select-none","sort",this.env.messagecount>0);this.enable_command("purge",this.purge_mailbox_test());this.enable_command("expand-all","expand-unread","collapse-all",this.env.threading&&this.env.messagecount);if(a.action=="list"||a.action=="search"){this.msglist_select(this.message_list);this.triggerEvent("listupdate",{folder:this.env.mailbox,rowcount:this.message_list.rowcount})}}else if(this.task==
+"addressbook"){this.enable_command("export",this.contact_list&&this.contact_list.rowcount>0);if(a.action=="list"||a.action=="search"){this.enable_command("group-create",this.env.address_sources[this.env.source].groups&&!this.env.address_sources[this.env.source].readonly);this.enable_command("group-rename","group-delete",this.env.address_sources[this.env.source].groups&&this.env.group&&!this.env.address_sources[this.env.source].readonly);this.triggerEvent("listupdate",{folder:this.env.source,rowcount:this.contact_list.rowcount})}}}a.unlock&&
+this.hide_message(a.unlock);this.triggerEvent("responseafter",{response:a});this.triggerEvent("responseafter"+a.action,{response:a})}};this.http_error=function(a,b,d,e){b=a.statusText;this.set_busy(false,null,e);a.abort();b&&this.display_message(this.get_label("servererror")+" ("+b+")","error")};this.start_keepalive=function(){this._int&&clearInterval(this._int);if(this.env.keep_alive&&!this.env.framed&&this.task=="mail"&&this.gui_objects.mailboxlist)this._int=setInterval(function(){l.check_for_recent(false)},
+this.env.keep_alive*1E3);else if(this.env.keep_alive&&!this.env.framed&&this.task!="login"&&this.env.action!="print")this._int=setInterval(function(){l.send_keep_alive()},this.env.keep_alive*1E3)};this.send_keep_alive=function(){this.http_request("keep-alive","_t="+(new Date).getTime())};this.check_for_recent=function(a){if(!this.busy){var b,d="_t="+(new Date).getTime()+"&_mbox="+urlencode(this.env.mailbox);if(a){b=this.set_busy(true,"checkingmail");d+="&_refresh=1";this.start_keepalive()}if(this.gui_objects.messagelist)d+=
+"&_list=1";if(this.gui_objects.quotadisplay)d+="&_quota=1";if(this.env.search_request)d+="&_search="+this.env.search_request;this.http_request("check-recent",d,b)}};this.get_single_uid=function(){return this.env.uid?this.env.uid:this.message_list?this.message_list.get_single_selection():null};this.get_single_cid=function(){return this.env.cid?this.env.cid:this.contact_list?this.contact_list.get_single_selection():null};this.get_caret_pos=function(a){if(typeof a.selectionEnd!="undefined")return a.selectionEnd;
+else if(document.selection&&document.selection.createRange){var b=document.selection.createRange();if(b.parentElement()!=a)return 0;var d=b.duplicate();a.tagName=="TEXTAREA"?d.moveToElementText(a):d.expand("textedit");d.setEndPoint("EndToStart",b);b=d.text.length;return b<=a.value.length?b:-1}else return a.value.length};this.set_caret_pos=function(a,b){if(a.setSelectionRange)a.setSelectionRange(b,b);else if(a.createTextRange){var d=a.createTextRange();d.collapse(true);d.moveEnd("character",b);d.moveStart("character",
+b);d.select()}};this.lock_form=function(a,b){if(a&&a.elements){var d,e,f;if(b)this.disabled_form_elements=[];d=0;for(e=a.elements.length;d<e;d++){f=a.elements[d];if(f.type!="hidden")if(b&&f.disabled)this.disabled_form_elements.push(f);else if(b||$.inArray(f,this.disabled_form_elements)<0)f.disabled=b}}}}rcube_webmail.prototype.addEventListener=rcube_event_engine.prototype.addEventListener;rcube_webmail.prototype.removeEventListener=rcube_event_engine.prototype.removeEventListener;
 rcube_webmail.prototype.triggerEvent=rcube_event_engine.prototype.triggerEvent;
-
index da9238b4c5ac6fd0d047420a5dbd73e77082f2f1..4379b21b1dbbfb839cf9c0d385114ff9b9142ab4 100644 (file)
 /*
  +-----------------------------------------------------------------------+
- | RoundCube Webmail Client Script                                       |
+ | Roundcube Webmail Client Script                                       |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev, - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev, - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Authors: Thomas Bruederli <roundcube@gmail.com>                       |
+ |          Aleksander 'A.L.E.C' Machniak <alec@alec.pl>                 |
  |          Charles McNulty <charles@charlesmcnulty.com>                 |
  +-----------------------------------------------------------------------+
  | Requires: jquery.js, common.js, list.js                               |
  +-----------------------------------------------------------------------+
 
-  $Id: app.js 3059 2009-10-24 19:18:35Z alec $
+  $Id: app.js 4400 2011-01-09 08:24:39Z alec $
 */
 
 
 function rcube_webmail()
 {
-  this.env = new Object();
-  this.labels = new Object();
-  this.buttons = new Object();
-  this.buttons_sel = new Object();
-  this.gui_objects = new Object();
-  this.gui_containers = new Object();
-  this.commands = new Object();
-  this.command_handlers = new Object();
-  this.onloads = new Array();
+  this.env = {};
+  this.labels = {};
+  this.buttons = {};
+  this.buttons_sel = {};
+  this.gui_objects = {};
+  this.gui_containers = {};
+  this.commands = {};
+  this.command_handlers = {};
+  this.onloads = [];
+  this.messages = {};
 
   // create protected reference to myself
   this.ref = 'rcmail';
   var ref = this;
+
   // webmail client settings
   this.dblclick_time = 500;
-  this.message_time = 3000;
-  
+  this.message_time = 2000;
+
   this.identifier_expr = new RegExp('[^0-9a-z\-_]', 'gi');
-  
+
   // mimetypes supported by the browser (default settings)
   this.mimetypes = new Array('text/plain', 'text/html', 'text/xml',
-                             'image/jpeg', 'image/gif', 'image/png',
-                             'application/x-javascript', 'application/pdf',
-                             'application/x-shockwave-flash');
+    'image/jpeg', 'image/gif', 'image/png',
+    'application/x-javascript', 'application/pdf', 'application/x-shockwave-flash');
 
   // default environment vars
   this.env.keep_alive = 60;        // seconds
   this.env.request_timeout = 180;  // seconds
   this.env.draft_autosave = 0;     // seconds
   this.env.comm_path = './';
-  this.env.bin_path = './bin/';
   this.env.blankpage = 'program/blank.gif';
 
   // set jQuery ajax options
-  jQuery.ajaxSetup({ cache:false,
+  $.ajaxSetup({
+    cache:false,
     error:function(request, status, err){ ref.http_error(request, status, err); },
-    beforeSend:function(xmlhttp){ xmlhttp.setRequestHeader('X-RoundCube-Request', ref.env.request_token); }
+    beforeSend:function(xmlhttp){ xmlhttp.setRequestHeader('X-Roundcube-Request', ref.env.request_token); }
   });
 
   // set environment variable(s)
   this.set_env = function(p, value)
-    {
+  {
     if (p != null && typeof(p) == 'object' && !value)
       for (var n in p)
         this.env[n] = p[n];
     else
       this.env[p] = value;
-    };
+  };
 
   // add a localized label to the client environment
   this.add_label = function(key, value)
-    {
+  {
     this.labels[key] = value;
-    };
+  };
 
   // add a button to the button list
   this.register_button = function(command, id, type, act, sel, over)
-    {
+  {
     if (!this.buttons[command])
-      this.buttons[command] = new Array();
-      
+      this.buttons[command] = [];
+
     var button_prop = {id:id, type:type};
     if (act) button_prop.act = act;
     if (sel) button_prop.sel = sel;
     if (over) button_prop.over = over;
 
-    this.buttons[command][this.buttons[command].length] = button_prop;    
-    };
+    this.buttons[command].push(button_prop);
+  };
 
   // register a specific gui object
   this.gui_object = function(name, id)
-    {
+  {
     this.gui_objects[name] = id;
-    };
-  
+  };
+
   // register a container object
   this.gui_container = function(name, id)
   {
     this.gui_containers[name] = id;
   };
-  
+
   // add a GUI element (html node) to a specified container
   this.add_element = function(elm, container)
   {
@@ -112,29 +113,28 @@ function rcube_webmail()
   this.register_command = function(command, callback, enable)
   {
     this.command_handlers[command] = callback;
-    
+
     if (enable)
       this.enable_command(command, true);
   };
-  
+
   // execute the given script on load
   this.add_onload = function(f)
   {
-    this.onloads[this.onloads.length] = f;
+    this.onloads.push(f);
   };
 
   // initialize webmail client
   this.init = function()
-    {
+  {
     var p = this;
     this.task = this.env.task;
-    
+
     // check browser
-    if (!bw.dom || !bw.xmlhttp_test())
-      {
+    if (!bw.dom || !bw.xmlhttp_test()) {
       this.goto_url('error', '_code=0x199');
       return;
-      }
+    }
 
     // find all registered gui containers
     for (var n in this.gui_containers)
@@ -143,129 +143,124 @@ function rcube_webmail()
     // find all registered gui objects
     for (var n in this.gui_objects)
       this.gui_objects[n] = rcube_find_object(this.gui_objects[n]);
-      
+
     // init registered buttons
     this.init_buttons();
 
     // tell parent window that this frame is loaded
-    if (this.env.framed && parent.rcmail && parent.rcmail.set_busy)
-      parent.rcmail.set_busy(false);
+    if (this.is_framed()) {
+      parent.rcmail.set_busy(false, null, parent.rcmail.env.frame_lock);
+      parent.rcmail.env.frame_lock = null;
+    }
 
     // enable general commands
     this.enable_command('logout', 'mail', 'addressbook', 'settings', true);
-    
+
     if (this.env.permaurl)
       this.enable_command('permaurl', true);
 
-    switch (this.task)
-      {
+    switch (this.task) {
+
       case 'mail':
-        if (this.gui_objects.messagelist)
-          {
-          this.message_list = new rcube_list_widget(this.gui_objects.messagelist, {multiselect:true, draggable:true, keyboard:true, dblclick_time:this.dblclick_time});
+        // enable mail commands
+        this.enable_command('list', 'checkmail', 'compose', 'add-contact', 'search', 'reset-search', 'collapse-folder', true);
+
+        if (this.gui_objects.messagelist) {
+
+          this.message_list = new rcube_list_widget(this.gui_objects.messagelist, {
+            multiselect:true, multiexpand:true, draggable:true, keyboard:true,
+            column_movable:this.env.col_movable, dblclick_time:this.dblclick_time
+            });
           this.message_list.row_init = function(o){ p.init_message_row(o); };
           this.message_list.addEventListener('dblclick', function(o){ p.msglist_dbl_click(o); });
+          this.message_list.addEventListener('click', function(o){ p.msglist_click(o); });
           this.message_list.addEventListener('keypress', function(o){ p.msglist_keypress(o); });
           this.message_list.addEventListener('select', function(o){ p.msglist_select(o); });
           this.message_list.addEventListener('dragstart', function(o){ p.drag_start(o); });
           this.message_list.addEventListener('dragmove', function(e){ p.drag_move(e); });
           this.message_list.addEventListener('dragend', function(e){ p.drag_end(e); });
+          this.message_list.addEventListener('expandcollapse', function(e){ p.msglist_expand(e); });
+          this.message_list.addEventListener('column_replace', function(e){ p.msglist_set_coltypes(e); });
+
           document.onmouseup = function(e){ return p.doc_mouse_up(e); };
+          this.gui_objects.messagelist.parentNode.onmousedown = function(e){ return p.click_on_list(e); };
 
           this.message_list.init();
-          this.enable_command('toggle_status', 'toggle_flag', true);
-          
-          if (this.gui_objects.mailcontframe)
-            this.gui_objects.mailcontframe.onmousedown = function(e){ return p.click_on_list(e); };
-          else
-            this.message_list.focus();
+          this.enable_command('toggle_status', 'toggle_flag', 'menu-open', 'menu-save', true);
+
+          // load messages
+          this.command('list');
+        }
+
+        if (this.gui_objects.qsearchbox) {
+          if (this.env.search_text != null) {
+            this.gui_objects.qsearchbox.value = this.env.search_text;
           }
-          
-        if (this.env.coltypes)
-          this.set_message_coltypes(this.env.coltypes);
+          $(this.gui_objects.qsearchbox).focusin(function() { rcmail.message_list.blur(); });
+        }
 
-        // enable mail commands
-        this.enable_command('list', 'checkmail', 'compose', 'add-contact', 'search', 'reset-search', 'collapse-folder', true);
+        if (this.env.trash_mailbox && this.env.mailbox != this.env.trash_mailbox)
+          this.set_alttext('delete', 'movemessagetotrash');
 
-        if (this.env.search_text != null && document.getElementById('quicksearchbox') != null)
-          document.getElementById('quicksearchbox').value = this.env.search_text;
-        
-        if (this.env.action=='show' || this.env.action=='preview')
-          {
-          this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete',
-            'open', 'mark', 'edit', 'viewsource', 'download', 'print', 'load-attachment', 'load-headers', true);
-
-          if (this.env.next_uid)
-            {
-            this.enable_command('nextmessage', true);
-            this.enable_command('lastmessage', true);
-            }
-          if (this.env.prev_uid)
-            {
-            this.enable_command('previousmessage', true);
-            this.enable_command('firstmessage', true);
-            }
-        
-          if (this.env.blockedobjects)
-            {
+        this.env.message_commands = ['show', 'reply', 'reply-all', 'reply-list', 'forward',
+          'moveto', 'copy', 'delete', 'open', 'mark', 'edit', 'viewsource', 'download',
+          'print', 'load-attachment', 'load-headers'];
+
+        if (this.env.action=='show' || this.env.action=='preview') {
+          this.enable_command(this.env.message_commands, this.env.uid);
+          this.enable_command('reply-list', this.env.list_post);
+
+          if (this.env.action == 'show') {
+            this.http_request('pagenav', '_uid='+this.env.uid+'&_mbox='+urlencode(this.env.mailbox),
+              this.display_message('', 'loading'));
+          }
+
+          if (this.env.blockedobjects) {
             if (this.gui_objects.remoteobjectsmsg)
               this.gui_objects.remoteobjectsmsg.style.display = 'block';
             this.enable_command('load-images', 'always-load', true);
-            }
           }
 
-        if (this.env.trash_mailbox && this.env.mailbox != this.env.trash_mailbox)
-          this.set_alttext('delete', 'movemessagetotrash');
-        
-        // make preview/message frame visible
-        if (this.env.action == 'preview' && this.env.framed && parent.rcmail)
-          {
-          this.enable_command('compose', 'add-contact', false);
-          parent.rcmail.show_contentframe(true);
+          // make preview/message frame visible
+          if (this.env.action == 'preview' && this.is_framed()) {
+            this.enable_command('compose', 'add-contact', false);
+            parent.rcmail.show_contentframe(true);
           }
+        }
+        else if (this.env.action == 'compose') {
+          this.env.compose_commands = ['send-attachment', 'remove-attachment', 'send', 'toggle-editor'];
+
+          if (this.env.drafts_mailbox)
+            this.env.compose_commands.push('savedraft')
 
-        if (this.env.action=='compose')
-          {
-          this.enable_command('add-attachment', 'send-attachment', 'remove-attachment', 'send', true);
-          if (this.env.spellcheck)
-            {
+          this.enable_command(this.env.compose_commands, 'identities', true);
+
+          if (this.env.spellcheck) {
             this.env.spellcheck.spelling_state_observer = function(s){ ref.set_spellcheck_state(s); };
+            this.env.compose_commands.push('spellcheck')
             this.set_spellcheck_state('ready');
             if ($("input[name='_is_html']").val() == '1')
               this.display_spellcheck_controls(false);
-            }
-          if (this.env.drafts_mailbox)
-            this.enable_command('savedraft', true);
-            
+          }
+
           document.onmouseup = function(e){ return p.doc_mouse_up(e); };
 
           // init message compose form
           this.init_messageform();
-          }
-
-        if (this.env.messagecount)
-          this.enable_command('select-all', 'select-none', 'expunge', true);
-
-        if (this.purge_mailbox_test())
-          this.enable_command('purge', true);
-
-        this.set_page_buttons();
-
+        }
         // show printing dialog
-        if (this.env.action=='print')
+        else if (this.env.action == 'print' && this.env.uid)
           window.print();
 
         // get unread count for each mailbox
-        if (this.gui_objects.mailboxlist)
-        {
+        if (this.gui_objects.mailboxlist) {
           this.env.unread_counts = {};
           this.gui_objects.folderlist = this.gui_objects.mailboxlist;
           this.http_request('getunread', '');
         }
-        
+
         // ask user to send MDN
-        if (this.env.mdn_request && this.env.uid)
-        {
+        if (this.env.mdn_request && this.env.uid) {
           var mdnurl = '_uid='+this.env.uid+'&_mbox='+urlencode(this.env.mailbox);
           if (confirm(this.get_label('mdnrequest')))
             this.http_post('sendmdn', mdnurl);
@@ -277,9 +272,13 @@ function rcube_webmail()
 
 
       case 'addressbook':
-        if (this.gui_objects.contactslist)
-          {
-          this.contact_list = new rcube_list_widget(this.gui_objects.contactslist, {multiselect:true, draggable:true, keyboard:true});
+        if (this.gui_objects.folderlist)
+          this.env.contactfolders = $.extend($.extend({}, this.env.address_sources), this.env.contactgroups);
+
+        if (this.gui_objects.contactslist) {
+
+          this.contact_list = new rcube_list_widget(this.gui_objects.contactslist,
+            {multiselect:true, draggable:this.gui_objects.folderlist?true:false, keyboard:true});
           this.contact_list.row_init = function(row){ p.triggerEvent('insertrow', { cid:row.uid, row:row }); };
           this.contact_list.addEventListener('keypress', function(o){ p.contactlist_keypress(o); });
           this.contact_list.addEventListener('select', function(o){ p.contactlist_select(o); });
@@ -291,52 +290,70 @@ function rcube_webmail()
           if (this.env.cid)
             this.contact_list.highlight_row(this.env.cid);
 
-          if (this.gui_objects.contactslist.parentNode)
-            {
-            this.gui_objects.contactslist.parentNode.onmousedown = function(e){ return p.click_on_list(e); };
-            document.onmouseup = function(e){ return p.doc_mouse_up(e); };
-            }
-          else
-            this.contact_list.focus();
-            
-          this.gui_objects.folderlist = this.gui_objects.contactslist;
+          this.gui_objects.contactslist.parentNode.onmousedown = function(e){ return p.click_on_list(e); };
+          document.onmouseup = function(e){ return p.doc_mouse_up(e); };
+          if (this.gui_objects.qsearchbox) {
+            $(this.gui_objects.qsearchbox).focusin(function() { rcmail.contact_list.blur(); });
           }
+        }
 
         this.set_page_buttons();
-        
-        if (this.env.address_sources && this.env.address_sources[this.env.source] && !this.env.address_sources[this.env.source].readonly)
-          this.enable_command('add', true);
-        
-        if (this.env.cid)
+
+        if (this.env.address_sources && this.env.address_sources[this.env.source] && !this.env.address_sources[this.env.source].readonly) {
+          this.enable_command('add', 'import', true);
+          this.enable_command('group-create', this.env.address_sources[this.env.source].groups);
+        }
+
+        if (this.env.cid) {
           this.enable_command('show', 'edit', true);
+          // register handlers for group assignment via checkboxes
+          if (this.gui_objects.editform) {
+            $('input.groupmember').change(function(){
+              var cmd = this.checked ? 'group-addmembers' : 'group-delmembers';
+              ref.http_post(cmd, '_cid='+urlencode(ref.env.cid)
+                + '&_source='+urlencode(ref.env.source)
+                + '&_gid='+urlencode(this.value));
+            });
+          }
+        }
 
-        if ((this.env.action=='add' || this.env.action=='edit') && this.gui_objects.editform)
+        if ((this.env.action=='add' || this.env.action=='edit') && this.gui_objects.editform) {
           this.enable_command('save', true);
-        else
-          this.enable_command('search', 'reset-search', 'moveto', 'import', true);
-          
+          $("input[type='text']").first().select();
+        }
+        else if (this.gui_objects.qsearchbox) {
+          this.enable_command('search', 'reset-search', 'moveto', true);
+          $(this.gui_objects.qsearchbox).select();
+        }
+
         if (this.contact_list && this.contact_list.rowcount > 0)
           this.enable_command('export', true);
 
-        this.enable_command('list', true);
+        this.enable_command('list', 'listgroup', true);
         break;
 
 
       case 'settings':
         this.enable_command('preferences', 'identities', 'save', 'folders', true);
-        
+
         if (this.env.action=='identities') {
           this.enable_command('add', this.env.identities_level < 2);
         }
         else if (this.env.action=='edit-identity' || this.env.action=='add-identity') {
           this.enable_command('add', this.env.identities_level < 2);
-          this.enable_command('save', 'delete', 'edit', true);
+          this.enable_command('save', 'delete', 'edit', 'toggle-editor', true);
+        }
+        else if (this.env.action=='folders') {
+          this.enable_command('subscribe', 'unsubscribe', 'create-folder', 'rename-folder', true);
+        }
+        else if (this.env.action == 'edit-folder' && this.gui_objects.editform) {
+          this.enable_command('save', 'folder-size', true);
+          parent.rcmail.env.messagecount = this.env.messagecount;
+          parent.rcmail.enable_command('purge', this.env.messagecount);
+          $("input[type='text']").first().select();
         }
-        else if (this.env.action=='folders')
-          this.enable_command('subscribe', 'unsubscribe', 'create-folder', 'rename-folder', 'delete-folder', true);
 
-        if (this.gui_objects.identitieslist)
-          {
+        if (this.gui_objects.identitieslist) {
           this.identity_list = new rcube_list_widget(this.gui_objects.identitieslist, {multiselect:false, draggable:false, keyboard:false});
           this.identity_list.addEventListener('select', function(o){ p.identity_select(o); });
           this.identity_list.init();
@@ -344,14 +361,12 @@ function rcube_webmail()
 
           if (this.env.iid)
             this.identity_list.highlight_row(this.env.iid);
-          }
-        else if (this.gui_objects.sectionslist)
-          {
+        }
+        else if (this.gui_objects.sectionslist) {
           this.sections_list = new rcube_list_widget(this.gui_objects.sectionslist, {multiselect:false, draggable:false, keyboard:false});
           this.sections_list.addEventListener('select', function(o){ p.section_select(o); });
           this.sections_list.init();
           this.sections_list.focus();
-          this.sections_list.select_first();  // open first section by default
         }
         else if (this.gui_objects.subscriptionlist)
           this.init_subscription_list();
@@ -361,7 +376,7 @@ function rcube_webmail()
       case 'login':
         var input_user = $('#rcmloginuser');
         input_user.bind('keyup', function(e){ return rcmail.login_user_keyup(e); });
-        
+
         if (input_user.val() == '')
           input_user.focus();
         else
@@ -370,9 +385,15 @@ function rcube_webmail()
         // detect client timezone
         $('#rcmlogintz').val(new Date().getTimezoneOffset() / -60);
 
+        // display 'loading' message on form submit, lock submit button
+        $('form').submit(function () {
+          $('input[type=submit]', this).attr('disabled', true);
+          rcmail.display_message('', 'loading');
+        });
+
         this.enable_command('login', true);
         break;
-      
+
       default:
         break;
       }
@@ -383,18 +404,17 @@ function rcube_webmail()
     // show message
     if (this.pending_message)
       this.display_message(this.pending_message[0], this.pending_message[1]);
-      
+
     // map implicit containers
     if (this.gui_objects.folderlist)
       this.gui_containers.foldertray = $(this.gui_objects.folderlist);
 
     // trigger init event hook
     this.triggerEvent('init', { task:this.task, action:this.env.action });
-    
+
     // execute all foreign onload scripts
     // @deprecated
-    for (var i=0; i<this.onloads.length; i++)
-      {
+    for (var i in this.onloads) {
       if (typeof(this.onloads[i]) == 'string')
         eval(this.onloads[i]);
       else if (typeof(this.onloads[i]) == 'function')
@@ -405,101 +425,6 @@ function rcube_webmail()
     this.start_keepalive();
   };
 
-  // start interval for keep-alive/recent_check signal
-  this.start_keepalive = function()
-    {
-    if (this.env.keep_alive && !this.env.framed && this.task=='mail' && this.gui_objects.mailboxlist)
-      this._int = setInterval(function(){ ref.check_for_recent(false); }, this.env.keep_alive * 1000);
-    else if (this.env.keep_alive && !this.env.framed && this.task!='login')
-      this._int = setInterval(function(){ ref.send_keep_alive(); }, this.env.keep_alive * 1000);
-    }
-
-  this.init_message_row = function(row)
-  {
-    var uid = row.uid;
-    if (uid && this.env.messages[uid])
-      {
-      row.deleted = this.env.messages[uid].deleted ? true : false;
-      row.unread = this.env.messages[uid].unread ? true : false;
-      row.replied = this.env.messages[uid].replied ? true : false;
-      row.flagged = this.env.messages[uid].flagged ? true : false;
-      row.forwarded = this.env.messages[uid].forwarded ? true : false;
-      }
-
-    // set eventhandler to message icon
-    if (row.icon = row.obj.getElementsByTagName('td')[0].getElementsByTagName('img')[0])
-      {
-      var p = this;
-      row.icon.id = 'msgicn_'+row.uid;
-      row.icon._row = row.obj;
-      row.icon.onmousedown = function(e) { p.command('toggle_status', this); };
-      }
-
-    // global variable 'flagged_col' may be not defined yet
-    if (!this.env.flagged_col && this.env.coltypes)
-      {
-      var found;
-      if((found = find_in_array('flag', this.env.coltypes)) >= 0)
-        this.set_env('flagged_col', found+1);
-      }
-
-    // set eventhandler to flag icon, if icon found
-    if (this.env.flagged_col && (row.flagged_icon = row.obj.getElementsByTagName('td')[this.env.flagged_col].getElementsByTagName('img')[0]))
-      {
-      var p = this;
-      row.flagged_icon.id = 'flaggedicn_'+row.uid;
-      row.flagged_icon._row = row.obj;
-      row.flagged_icon.onmousedown = function(e) { p.command('toggle_flag', this); };
-      }
-      
-    this.triggerEvent('insertrow', { uid:uid, row:row });
-  };
-
-  // init message compose form: set focus and eventhandlers
-  this.init_messageform = function()
-    {
-    if (!this.gui_objects.messageform)
-      return false;
-    
-    //this.messageform = this.gui_objects.messageform;
-    var input_from = $("[name='_from']");
-    var input_to = $("[name='_to']");
-    var input_subject = $("input[name='_subject']");
-    var input_message = $("[name='_message']").get(0);
-    var html_mode = $("input[name='_is_html']").val() == '1';
-
-    // init live search events
-    this.init_address_input_events(input_to);
-    this.init_address_input_events($("[name='_cc']"));
-    this.init_address_input_events($("[name='_bcc']"));
-
-    // add signature according to selected identity
-    if (input_from.attr('type') == 'select-one' && $("input[name='_draft_saveid']").val() == ''
-        && !html_mode) {  // if we have HTML editor, signature is added in callback
-      this.change_identity(input_from[0]);
-    }
-
-    if (input_to.val() == '')
-      input_to.focus();
-    else if (input_subject.val() == '')
-      input_subject.focus();
-    else if (input_message && !html_mode)
-      input_message.focus();
-
-    // get summary of all field values
-    this.compose_field_hash(true);
-    // start the auto-save timer
-    this.auto_save_start();
-    };
-
-  this.init_address_input_events = function(obj)
-    {
-    var handler = function(e){ return ref.ksearch_keypress(e,this); };
-    obj.bind((bw.safari || bw.ie ? 'keydown' : 'keypress'), handler);
-    obj.attr('autocomplete', 'off');
-    };
-
 
   /*********************************************************/
   /*********       client command interface        *********/
@@ -507,7 +432,7 @@ function rcube_webmail()
 
   // execute a specific command on the web client
   this.command = function(command, props, obj)
-    {
+  {
     if (obj && obj.blur)
       obj.blur();
 
@@ -515,35 +440,32 @@ function rcube_webmail()
       return false;
 
     // command not supported or allowed
-    if (!this.commands[command])
-      {
+    if (!this.commands[command]) {
       // pass command to parent window
-      if (this.env.framed && parent.rcmail && parent.rcmail.command)
+      if (this.is_framed())
         parent.rcmail.command(command, props);
 
       return false;
-      }
-      
-   // check input before leaving compose step
-   if (this.task=='mail' && this.env.action=='compose' && (command=='list' || command=='mail' || command=='addressbook' || command=='settings'))
-     {
-     if (this.cmp_hash != this.compose_field_hash() && !confirm(this.get_label('notsentwarning')))
+    }
+
+    // check input before leaving compose step
+    if (this.task=='mail' && this.env.action=='compose' && $.inArray(command, this.env.compose_commands)<0) {
+      if (this.cmp_hash != this.compose_field_hash() && !confirm(this.get_label('notsentwarning')))
         return false;
-     }
+    }
 
     // process external commands
-    if (typeof this.command_handlers[command] == 'function')
-    {
+    if (typeof this.command_handlers[command] == 'function') {
       var ret = this.command_handlers[command](props, obj);
       return ret !== null ? ret : (obj ? false : true);
     }
-    else if (typeof this.command_handlers[command] == 'string')
-    {
+    else if (typeof this.command_handlers[command] == 'string') {
       var ret = window[this.command_handlers[command]](props, obj);
       return ret !== null ? ret : (obj ? false : true);
     }
-    
-    // trigger plugin hook
+
+    // trigger plugin hooks
+    this.triggerEvent('actionbefore', {props:props, action:command});
     var event_ret = this.triggerEvent('before'+command, props);
     if (typeof event_ret != 'undefined') {
       // abort if one the handlers returned false
@@ -554,8 +476,8 @@ function rcube_webmail()
     }
 
     // process internal command
-    switch (command)
-      {
+    switch (command) {
+
       case 'login':
         if (this.gui_objects.loginform)
           this.gui_objects.loginform.submit();
@@ -576,58 +498,52 @@ function rcube_webmail()
           parent.location.href = this.env.permaurl;
         break;
 
+      case 'menu-open':
+      case 'menu-save':
+        this.triggerEvent(command, {props:props});
+        return false;
+
       case 'open':
         var uid;
-        if (uid = this.get_single_uid())
-        {
+        if (uid = this.get_single_uid()) {
           obj.href = '?_task='+this.env.task+'&_action=show&_mbox='+urlencode(this.env.mailbox)+'&_uid='+uid;
           return true;
         }
         break;
 
-      // misc list commands
       case 'list':
-        if (this.task=='mail')
-          {
-          if (this.env.search_request<0 || (props != '' && (this.env.search_request && props != this.env.mailbox)))
+        if (this.task=='mail') {
+          if (!this.env.search_request || (props && props != this.env.mailbox))
             this.reset_qsearch();
 
           this.list_mailbox(props);
 
           if (this.env.trash_mailbox)
             this.set_alttext('delete', this.env.mailbox != this.env.trash_mailbox ? 'movemessagetotrash' : 'deletemessage');
-          }
-        else if (this.task=='addressbook')
-          {
-          if (this.env.search_request<0 || (this.env.search_request && props != this.env.source))
+        }
+        else if (this.task=='addressbook') {
+          if (!this.env.search_request || (props != this.env.source))
             this.reset_qsearch();
 
           this.list_contacts(props);
-          this.enable_command('add', (this.env.address_sources && !this.env.address_sources[props].readonly));
-          }
+          this.enable_command('add', 'import', (this.env.address_sources && !this.env.address_sources[this.env.source].readonly));
+        }
         break;
 
-
       case 'load-headers':
         this.load_headers(obj);
         break;
 
-
       case 'sort':
         var sort_order, sort_col = props;
 
         if (this.env.sort_col==sort_col)
           sort_order = this.env.sort_order=='ASC' ? 'DESC' : 'ASC';
         else
-         sort_order = 'ASC';
-       
-        // set table header class
-        $('#rcm'+this.env.sort_col).removeClass('sorted'+(this.env.sort_order.toUpperCase()));
-        $('#rcm'+sort_col).addClass('sorted'+sort_order);
+          sort_order = 'ASC';
 
-        // save new sort properties
-        this.env.sort_col = sort_col;
-        this.env.sort_order = sort_order;
+        // set table header and update env
+        this.set_list_sorting(sort_col, sort_order);
 
         // reload message list
         this.list_mailbox('', '', sort_col+'_'+sort_order);
@@ -660,36 +576,31 @@ function rcube_webmail()
           this.purge_mailbox(this.env.mailbox);
         break;
 
-
       // common commands used in multiple tasks
       case 'show':
-        if (this.task=='mail')
-          {
+        if (this.task=='mail') {
           var uid = this.get_single_uid();
-          if (uid && (!this.env.uid || uid != this.env.uid))
-            {
+          if (uid && (!this.env.uid || uid != this.env.uid)) {
             if (this.env.mailbox == this.env.drafts_mailbox)
               this.goto_url('compose', '_draft_uid='+uid+'&_mbox='+urlencode(this.env.mailbox), true);
             else
               this.show_message(uid);
-            }
           }
-        else if (this.task=='addressbook')
-          {
+        }
+        else if (this.task=='addressbook') {
           var cid = props ? props : this.get_single_cid();
           if (cid && !(this.env.action=='show' && cid==this.env.cid))
             this.load_contact(cid, 'show');
-          }
+        }
         break;
 
       case 'add':
         if (this.task=='addressbook')
           this.load_contact(0, 'add');
-        else if (this.task=='settings')
-          {
+        else if (this.task=='settings') {
           this.identity_list.clear_selection();
           this.load_identity(0, 'add-identity');
-          }
+        }
         break;
 
       case 'edit':
@@ -704,40 +615,34 @@ function rcube_webmail()
         }
         break;
 
-      case 'save-identity':
       case 'save':
-        if (this.gui_objects.editform)
-          {
+        if (this.gui_objects.editform) {
           var input_pagesize = $("input[name='_pagesize']");
           var input_name  = $("input[name='_name']");
           var input_email = $("input[name='_email']");
 
           // user prefs
-          if (input_pagesize.length && isNaN(parseInt(input_pagesize.val())))
-            {
+          if (input_pagesize.length && isNaN(parseInt(input_pagesize.val()))) {
             alert(this.get_label('nopagesizewarning'));
             input_pagesize.focus();
             break;
-            }
+          }
           // contacts/identities
-          else
-            {
-            if (input_name.length && input_name.val() == '')
-              {
+          else {
+            if (input_name.length && input_name.val() == '') {
               alert(this.get_label('nonamewarning'));
               input_name.focus();
               break;
-              }
-            else if (input_email.length && !rcube_check_email(input_email.val()))
-              {
+            }
+            else if (input_email.length && !rcube_check_email(input_email.val())) {
               alert(this.get_label('noemailwarning'));
               input_email.focus();
               break;
-              }
             }
+          }
 
           this.gui_objects.editform.submit();
-          }
+        }
         break;
 
       case 'delete':
@@ -752,7 +657,6 @@ function rcube_webmail()
           this.delete_identity();
         break;
 
-
       // mail task commands
       case 'move':
       case 'moveto':
@@ -762,41 +666,43 @@ function rcube_webmail()
           this.copy_contact(null, props);
         break;
 
+      case 'copy':
+        if (this.task == 'mail')
+          this.copy_messages(props);
+        break;
+
       case 'mark':
         if (props)
           this.mark_message(props);
         break;
-      
+
       case 'toggle_status':
         if (props && !props._row)
           break;
-        
-        var uid;
-        var flag = 'read';
-        
-        if (props._row.uid)
-          {
+
+        var uid, flag = 'read';
+
+        if (props._row.uid) {
           uid = props._row.uid;
-          
+
           // toggle read/unread
           if (this.message_list.rows[uid].deleted) {
             flag = 'undelete';
-          } else if (!this.message_list.rows[uid].unread)
-            flag = 'unread';
           }
-          
+          else if (!this.message_list.rows[uid].unread)
+            flag = 'unread';
+        }
+
         this.mark_message(flag, uid);
         break;
-        
+
       case 'toggle_flag':
         if (props && !props._row)
           break;
 
-        var uid;
-        var flag = 'flagged';
+        var uid, flag = 'flagged';
 
-        if (props._row.uid)
-          {
+        if (props._row.uid) {
           uid = props._row.uid;
           // toggle flagged/unflagged
           if (this.message_list.rows[uid].flagged)
@@ -811,7 +717,7 @@ function rcube_webmail()
           window.setTimeout(function(){ ref.command('load-images'); }, 300);
           break;
         }
-        
+
       case 'load-images':
         if (this.env.uid)
           this.show_message(this.env.uid, true, this.env.action=='preview');
@@ -819,34 +725,52 @@ function rcube_webmail()
 
       case 'load-attachment':
         var qstring = '_mbox='+urlencode(this.env.mailbox)+'&_uid='+this.env.uid+'&_part='+props.part;
-        
+
         // open attachment in frame if it's of a supported mimetype
-        if (this.env.uid && props.mimetype && find_in_array(props.mimetype, this.mimetypes)>=0)
-          {
+        if (this.env.uid && props.mimetype && $.inArray(props.mimetype, this.mimetypes)>=0) {
           if (props.mimetype == 'text/html')
             qstring += '&_safe=1';
           this.attachment_win = window.open(this.env.comm_path+'&_action=get&'+qstring+'&_frame=1', 'rcubemailattachment');
-          if (this.attachment_win)
-            {
+          if (this.attachment_win) {
             window.setTimeout(function(){ ref.attachment_win.focus(); }, 10);
             break;
-            }
           }
+        }
 
         this.goto_url('get', qstring+'&_download=1', false);
         break;
-        
+
       case 'select-all':
+        this.select_all_mode = props ? false : true;
+        this.dummy_select = true; // prevent msg opening if there's only one msg on the list
         if (props == 'invert')
           this.message_list.invert_selection();
         else
-          this.message_list.select_all(props);
+          this.message_list.select_all(props == 'page' ? '' : props);
+        this.dummy_select = null;
         break;
 
       case 'select-none':
+        this.select_all_mode = false;
         this.message_list.clear_selection();
         break;
 
+      case 'expand-all':
+        this.env.autoexpand_threads = 1;
+        this.message_list.expand_all();
+        break;
+
+      case 'expand-unread':
+        this.env.autoexpand_threads = 2;
+        this.message_list.collapse_all();
+        this.expand_unread();
+        break;
+
+      case 'collapse-all':
+        this.env.autoexpand_threads = 0;
+        this.message_list.collapse_all();
+        break;
+
       case 'nextmessage':
         if (this.env.next_uid)
           this.show_message(this.env.next_uid, false, this.env.action=='preview');
@@ -866,20 +790,18 @@ function rcube_webmail()
         if (this.env.first_uid)
           this.show_message(this.env.first_uid);
         break;
-      
+
       case 'checkmail':
         this.check_for_recent(true);
         break;
-      
+
       case 'compose':
         var url = this.env.comm_path+'&_action=compose';
-       
-        if (this.task=='mail')
-        {
+
+        if (this.task=='mail') {
           url += '&_mbox='+urlencode(this.env.mailbox);
-          
-          if (this.env.mailbox==this.env.drafts_mailbox)
-          {
+
+          if (this.env.mailbox==this.env.drafts_mailbox) {
             var uid;
             if (uid = this.get_single_uid())
               url += '&_draft_uid='+uid;
@@ -888,40 +810,37 @@ function rcube_webmail()
              url += '&_to='+urlencode(props);
         }
         // modify url if we're in addressbook
-        else if (this.task=='addressbook')
-          {
+        else if (this.task=='addressbook') {
           // switch to mail compose step directly
-          if (props && props.indexOf('@') > 0)
-            {
+          if (props && props.indexOf('@') > 0) {
             url = this.get_task_url('mail', url);
             this.redirect(url + '&_to='+urlencode(props));
             break;
-            }
-          
+          }
+
           // use contact_id passed as command parameter
-          var a_cids = new Array();
+          var a_cids = [];
           if (props)
-            a_cids[a_cids.length] = props;
+            a_cids.push(props);
           // get selected contacts
-          else if (this.contact_list)
-            {
+          else if (this.contact_list) {
             var selection = this.contact_list.get_selection();
             for (var n=0; n<selection.length; n++)
-              a_cids[a_cids.length] = selection[n];
-            }
-            
+              a_cids.push(selection[n]);
+          }
+
           if (a_cids.length)
             this.http_request('mailto', '_cid='+urlencode(a_cids.join(','))+'&_source='+urlencode(this.env.source), true);
 
           break;
-          }
+        }
 
         // don't know if this is necessary...
-        url = url.replace(/&_framed=1/, "");
+        url = url.replace(/&_framed=1/, '');
 
         this.redirect(url);
         break;
-        
+
       case 'spellcheck':
         if (window.tinyMCE && tinyMCE.get(this.env.composebody)) {
           tinyMCE.execCommand('mceSpellCheck', true);
@@ -944,10 +863,12 @@ function rcube_webmail()
         if (!this.env.drafts_mailbox || this.cmp_hash == this.compose_field_hash())
           break;
 
-        this.set_busy(true, 'savingmessage');
-        var form = this.gui_objects.messageform;
+        var form = this.gui_objects.messageform,
+          msgid = this.set_busy(true, 'savingmessage');
+
         form.target = "savetarget";
         form._draft.value = '1';
+        form.action = this.add_url(form.action, '_unlock', msgid);
         form.submit();
         break;
 
@@ -962,50 +883,56 @@ function rcube_webmail()
         self.clearTimeout(this.save_timer);
 
         // all checks passed, send message
-        this.set_busy(true, 'sendingmessage');
-        var form = this.gui_objects.messageform;
-        form.target = "savetarget";     
+        var form = this.gui_objects.messageform,
+          msgid = this.set_busy(true, 'sendingmessage');
+
+        form.target = 'savetarget';
         form._draft.value = '';
+        form.action = this.add_url(form.action, '_unlock', msgid);
         form.submit();
-        
+
         // clear timeout (sending could take longer)
         clearTimeout(this.request_timer);
         break;
 
-      case 'add-attachment':
-        this.show_attachment_form(true);
-        
       case 'send-attachment':
         // Reset the auto-save timer
         self.clearTimeout(this.save_timer);
 
-        this.upload_file(props)      
+        this.upload_file(props)
         break;
-      
-      case 'remove-attachment':
-        this.remove_attachment(props);
+
+      case 'insert-sig':
+        this.change_identity($("[name='_from']")[0], true);
         break;
 
       case 'reply-all':
+      case 'reply-list':
       case 'reply':
         var uid;
-        if (uid = this.get_single_uid())
-          this.goto_url('compose', '_reply_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)+(command=='reply-all' ? '&_all=1' : ''), true);
-        break;      
+        if (uid = this.get_single_uid()) {
+          var url = '_reply_uid='+uid+'&_mbox='+urlencode(this.env.mailbox);
+          if (command == 'reply-all')
+            // do reply-list, when list is detected and popup menu wasn't used 
+            url += '&_all=' + (!props && this.commands['reply-list'] ? 'list' : 'all');
+          else if (command == 'reply-list')
+            url += '&_all=list';
+
+          this.goto_url('compose', url, true);
+        }
+        break;
 
       case 'forward':
         var uid;
         if (uid = this.get_single_uid())
           this.goto_url('compose', '_forward_uid='+uid+'&_mbox='+urlencode(this.env.mailbox), true);
         break;
-        
+
       case 'print':
         var uid;
-        if (uid = this.get_single_uid())
-        {
+        if (uid = this.get_single_uid()) {
           ref.printwin = window.open(this.env.comm_path+'&_action=print&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)+(this.env.safemode ? '&_safe=1' : ''));
-          if (this.printwin)
-          {
+          if (this.printwin) {
             window.setTimeout(function(){ ref.printwin.focus(); }, 20);
             if (this.env.action != 'show')
               this.mark_message('read', uid);
@@ -1015,8 +942,7 @@ function rcube_webmail()
 
       case 'viewsource':
         var uid;
-        if (uid = this.get_single_uid())
-          {
+        if (uid = this.get_single_uid()) {
           ref.sourcewin = window.open(this.env.comm_path+'&_action=viewsource&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox));
           if (this.sourcewin)
             window.setTimeout(function(){ ref.sourcewin.focus(); }, 20);
@@ -1029,16 +955,11 @@ function rcube_webmail()
           this.goto_url('viewsource', '&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)+'&_save=1');
         break;
 
-      case 'add-contact':
-        this.add_contact(props);
-        break;
-      
       // quicksearch
       case 'search':
         if (!props && this.gui_objects.qsearchbox)
           props = this.gui_objects.qsearchbox.value;
-        if (props)
-        {
+        if (props) {
           this.qsearch(props);
           break;
         }
@@ -1047,11 +968,15 @@ function rcube_webmail()
       case 'reset-search':
         var s = this.env.search_request;
         this.reset_qsearch();
-        
+
         if (s && this.env.mailbox)
           this.list_mailbox(this.env.mailbox);
         else if (s && this.task == 'addressbook')
-          this.list_contacts(this.env.source);
+          this.list_contacts(this.env.source, this.env.group);
+        break;
+
+      case 'listgroup':
+        this.list_contacts(props.source, props.id);
         break;
 
       case 'import':
@@ -1066,106 +991,87 @@ function rcube_webmail()
           this.lock_form(this.gui_objects.importform, true);
         }
         else
-          this.goto_url('import');
+          this.goto_url('import', (this.env.source ? '_target='+urlencode(this.env.source)+'&' : ''));
         break;
-        
+
       case 'export':
         if (this.contact_list.rowcount > 0) {
           var add_url = (this.env.source ? '_source='+urlencode(this.env.source)+'&' : '');
           if (this.env.search_request)
             add_url += '_search='+this.env.search_request;
-        
+
           this.goto_url('export', add_url);
         }
         break;
 
-      // collapse/expand folder
-      case 'collapse-folder':
-        if (props)
-          this.collapse_folder(props);
-        break;
-
       // user settings commands
       case 'preferences':
         this.goto_url('');
         break;
 
       case 'identities':
-        this.goto_url('identities');
+        this.goto_url('settings/identities');
         break;
-          
-      case 'delete-identity':
-        this.delete_identity();
-        
+
       case 'folders':
-        this.goto_url('folders');
+        this.goto_url('settings/folders');
         break;
 
-      case 'subscribe':
-        this.subscribe_folder(props);
-        break;
-
-      case 'unsubscribe':
-        this.unsubscribe_folder(props);
-        break;
-        
-      case 'create-folder':
-        this.create_folder(props);
-        break;
-
-      case 'rename-folder':
-        this.rename_folder(props);
-        break;
-
-      case 'delete-folder':
-        this.delete_folder(props);
+      // unified command call (command name == function name)
+      default:
+        var func = command.replace(/-/g, '_');
+        if (this[func] && typeof this[func] == 'function')
+          this[func](props);
         break;
+    }
 
-      }
-      
     this.triggerEvent('after'+command, props);
+    this.triggerEvent('actionafter', {props:props, action:command});
 
     return obj ? false : true;
-    };
+  };
 
-  // set command enabled or disabled
+  // set command(s) enabled or disabled
   this.enable_command = function()
-    {
-    var args = arguments;
-    if(!args.length) return -1;
-
-    var command;
-    var enable = args[args.length-1];
-    
-    for(var n=0; n<args.length-1; n++)
-      {
-      command = args[n];
-      this.commands[command] = enable;
-      this.set_button(command, (enable ? 'act' : 'pas'));
+  {
+    var args = Array.prototype.slice.call(arguments),
+      enable = args.pop(), cmd;
+
+    for (var n=0; n<args.length; n++) {
+      cmd = args[n];
+      // argument of type array
+      if (typeof cmd === 'string') {
+        this.commands[cmd] = enable;
+        this.set_button(cmd, (enable ? 'act' : 'pas'));
       }
-      return true;
-    };
+      // push array elements into commands array
+      else {
+        for (var i in cmd)
+          args.push(cmd[i]);
+      }
+    }
+  };
 
   // lock/unlock interface
-  this.set_busy = function(a, message)
-    {
-    if (a && message)
-      {
+  this.set_busy = function(a, message, id)
+  {
+    if (a && message) {
       var msg = this.get_label(message);
-      if (msg==message)        
+      if (msg == message)
         msg = 'Loading...';
 
-      this.display_message(msg, 'loading', true);
-      }
-    else if (!a)
-      this.hide_message();
+      id = this.display_message(msg, 'loading');
+    }
+    else if (!a && id) {
+      this.hide_message(id);
+    }
 
     this.busy = a;
     //document.body.style.cursor = a ? 'wait' : 'default';
-    
+
     if (this.gui_objects.editform)
       this.lock_form(this.gui_objects.editform, a);
-      
+
     // clear pending timer
     if (this.request_timer)
       clearTimeout(this.request_timer);
@@ -1173,25 +1079,27 @@ function rcube_webmail()
     // set timer for requests
     if (a && this.env.request_timeout)
       this.request_timer = window.setTimeout(function(){ ref.request_timed_out(); }, this.env.request_timeout * 1000);
-    };
+
+    return id;
+  };
 
   // return a localized string
   this.get_label = function(name, domain)
-    {
+  {
     if (domain && this.labels[domain+'.'+name])
       return this.labels[domain+'.'+name];
     else if (this.labels[name])
       return this.labels[name];
     else
       return name;
-    };
-  
+  };
+
   // alias for convenience reasons
   this.gettext = this.get_label;
 
   // switch to another application task
   this.switch_task = function(task)
-    {
+  {
     if (this.task===task && task!='mail')
       return;
 
@@ -1200,31 +1108,57 @@ function rcube_webmail()
       url += '&_mbox=INBOX';
 
     this.redirect(url);
-    };
+  };
 
   this.get_task_url = function(task, url)
-    {
+  {
     if (!url)
       url = this.env.comm_path;
 
     return url.replace(/_task=[a-z]+/, '_task='+task);
-    };
-    
+  };
+
   // called when a request timed out
   this.request_timed_out = function()
-    {
+  {
     this.set_busy(false);
     this.display_message('Request timed out!', 'error');
-    };
-  
+  };
+
   this.reload = function(delay)
   {
-    if (this.env.framed && parent.rcmail)
+    if (this.is_framed())
       parent.rcmail.reload(delay);
     else if (delay)
       window.setTimeout(function(){ rcmail.reload(); }, delay);
     else if (window.location)
-      location.href = this.env.comm_path;
+      location.href = this.env.comm_path + (this.env.action ? '&_action='+this.env.action : '');
+  };
+
+  // Add variable to GET string, replace old value if exists
+  this.add_url = function(url, name, value)
+  {
+    value = urlencode(value);
+
+    if (/(\?.*)$/.test(url)) {
+      var urldata = RegExp.$1,
+        datax = RegExp('((\\?|&)'+RegExp.escape(name)+'=[^&]*)');
+
+      if (datax.test(urldata)) {
+        urldata = urldata.replace(datax, RegExp.$2 + name + '=' + value);
+      }
+      else
+        urldata += '&' + name + '=' + value
+
+      return url.replace(/(\?.*)$/, urldata);
+    }
+    else
+      return url + '?' + name + '=' + value;
+  };
+
+  this.is_framed = function()
+  {
+    return (this.env.framed && parent.rcmail);
   };
 
 
@@ -1232,54 +1166,44 @@ function rcube_webmail()
   /*********        event handling methods         *********/
   /*********************************************************/
 
-  this.doc_mouse_up = function(e)
+  this.drag_menu = function(e, target)
   {
-    var model, list, li;
+    var modkey = rcube_event.get_modifier(e),
+      menu = $('#'+this.gui_objects.message_dragmenu);
 
-    if (this.message_list) {
-      if (!rcube_mouse_is_over(e, this.message_list.list))
-        this.message_list.blur();
-      list = this.message_list;
-      model = this.env.mailboxes;
-    }
-    else if (this.contact_list) {
-      if (!rcube_mouse_is_over(e, this.contact_list.list))
-        this.contact_list.blur();
-      list = this.contact_list;
-      model = this.env.address_sources;
-    }
-    else if (this.ksearch_value) {
-      this.ksearch_blur();
+    if (menu && modkey == SHIFT_KEY && this.commands['copy']) {
+      var pos = rcube_event.get_mouse_pos(e);
+      this.env.drag_target = target;
+      menu.css({top: (pos.y-10)+'px', left: (pos.x-10)+'px'}).show();
+      return true;
     }
 
-    // handle mouse release when dragging
-    if (this.drag_active && model && this.env.last_folder_target) {
-      $(this.get_folder_li(this.env.last_folder_target)).removeClass('droptarget');
-      this.command('moveto', model[this.env.last_folder_target].id);
-      this.env.last_folder_target = null;
-      list.draglayer.hide();
-    }
-    
-    // reset 'pressed' buttons
-    if (this.buttons_sel) {
-      for (var id in this.buttons_sel)
-        if (typeof id != 'function')
-          this.button_out(this.buttons_sel[id], id);
-      this.buttons_sel = {};
+    return false;
+  };
+
+  this.drag_menu_action = function(action)
+  {
+    var menu = $('#'+this.gui_objects.message_dragmenu);
+    if (menu) {
+      menu.hide();
     }
+    this.command(action, this.env.drag_target);
+    this.env.drag_target = null;
   };
 
   this.drag_start = function(list)
   {
-    var model = this.task == 'mail' ? this.env.mailboxes : this.env.address_sources;
+    var model = this.task == 'mail' ? this.env.mailboxes : this.env.contactfolders;
 
     this.drag_active = true;
+
     if (this.preview_timer)
       clearTimeout(this.preview_timer);
-    
+    if (this.preview_read_timer)
+      clearTimeout(this.preview_read_timer);
+
     // save folderlist and folders location/sizes for droptarget calculation in drag_move()
-    if (this.gui_objects.folderlist && model)
-      {
+    if (this.gui_objects.folderlist && model) {
       this.initialBodyScrollTop = bw.ie ? 0 : window.pageYOffset;
       this.initialListScrollTop = this.gui_objects.folderlist.parentNode.scrollTop;
 
@@ -1288,7 +1212,7 @@ function rcube_webmail()
       pos = list.offset();
       this.env.folderlist_coords = { x1:pos.left, y1:pos.top, x2:pos.left + list.width(), y2:pos.top + list.height() };
 
-      this.env.folder_coords = new Array();
+      this.env.folder_coords = [];
       for (var k in model) {
         if (li = this.get_folder_li(k)) {
           // only visible folders
@@ -1306,7 +1230,7 @@ function rcube_webmail()
   {
     this.drag_active = false;
     this.env.last_folder_target = null;
-    
+
     if (this.folder_auto_timer) {
       window.clearTimeout(this.folder_auto_timer);
       this.folder_auto_timer = null;
@@ -1321,7 +1245,7 @@ function rcube_webmail()
       }
     }
   };
-  
+
   this.drag_move = function(e)
   {
     if (this.gui_objects.folderlist && this.env.folder_coords) {
@@ -1329,8 +1253,12 @@ function rcube_webmail()
       var boffset = bw.ie ? -document.documentElement.scrollTop : this.initialBodyScrollTop;
       var moffset = this.initialListScrollTop-this.gui_objects.folderlist.parentNode.scrollTop;
       var toffset = -moffset-boffset;
+      var li, div, pos, mouse, check, oldclass,
+        layerclass = 'draglayernormal';
+      
+      if (this.contact_list && this.contact_list.draglayer)
+        oldclass = this.contact_list.draglayer.attr('class');
 
-      var li, div, pos, mouse;
       mouse = rcube_event.get_mouse_pos(e);
       pos = this.env.folderlist_coords;
       mouse.y += toffset;
@@ -1342,90 +1270,140 @@ function rcube_webmail()
           this.env.folder_coords[this.env.last_folder_target].on = 0;
           this.env.last_folder_target = null;
         }
+        if (layerclass != oldclass && this.contact_list && this.contact_list.draglayer)
+          this.contact_list.draglayer.attr('class', layerclass);
         return;
       }
-    
+
       // over the folders
       for (var k in this.env.folder_coords) {
         pos = this.env.folder_coords[k];
-        if (mouse.x >= pos.x1 && mouse.x < pos.x2 && mouse.y >= pos.y1 && mouse.y < pos.y2
-            && this.check_droptarget(k)) {
-
-          li = this.get_folder_li(k);
-          div = $(li.getElementsByTagName("div")[0]);
-
-          // if the folder is collapsed, expand it after 1sec and restart the drag & drop process.
-          if (div.hasClass('collapsed')) {
-            if (this.folder_auto_timer)
+        if (mouse.x >= pos.x1 && mouse.x < pos.x2 && mouse.y >= pos.y1 && mouse.y < pos.y2){
+         if ((check = this.check_droptarget(k))) {
+            li = this.get_folder_li(k);
+            div = $(li.getElementsByTagName('div')[0]);
+
+            // if the folder is collapsed, expand it after 1sec and restart the drag & drop process.
+            if (div.hasClass('collapsed')) {
+              if (this.folder_auto_timer)
+                window.clearTimeout(this.folder_auto_timer);
+
+              this.folder_auto_expand = k;
+              this.folder_auto_timer = window.setTimeout(function() {
+                  rcmail.command('collapse-folder', rcmail.folder_auto_expand);
+                  rcmail.drag_start(null);
+                }, 1000);
+            } else if (this.folder_auto_timer) {
               window.clearTimeout(this.folder_auto_timer);
-            
-            this.folder_auto_expand = k;
-            this.folder_auto_timer = window.setTimeout(function() {
-                rcmail.command("collapse-folder", rcmail.folder_auto_expand);
-                rcmail.drag_start(null);
-              }, 1000);
-          } else if (this.folder_auto_timer) {
-            window.clearTimeout(this.folder_auto_timer);
-            this.folder_auto_timer = null;
-            this.folder_auto_expand = null;
+              this.folder_auto_timer = null;
+              this.folder_auto_expand = null;
+            }
+
+            $(li).addClass('droptarget');
+            this.env.folder_coords[k].on = 1;
+            this.env.last_folder_target = k;
+            layerclass = 'draglayer' + (check > 1 ? 'copy' : 'normal');
+          } else { // Clear target, otherwise drag end will trigger move into last valid droptarget
+            this.env.last_folder_target = null;
           }
-          
-          $(li).addClass('droptarget');
-          this.env.last_folder_target = k;
-          this.env.folder_coords[k].on = 1;
         }
         else if (pos.on) {
           $(this.get_folder_li(k)).removeClass('droptarget');
           this.env.folder_coords[k].on = 0;
         }
       }
+
+      if (layerclass != oldclass && this.contact_list && this.contact_list.draglayer)
+        this.contact_list.draglayer.attr('class', layerclass);
     }
   };
 
   this.collapse_folder = function(id)
-    {
-    var div;
-    if ((li = this.get_folder_li(id)) &&
-        (div = $(li.getElementsByTagName("div")[0])) &&
-        (div.hasClass('collapsed') || div.hasClass('expanded')))
-      {
-      var ul = $(li.getElementsByTagName("ul")[0]);
-      if (div.hasClass('collapsed'))
-        {
-        ul.show();
-        div.removeClass('collapsed').addClass('expanded');
-        var reg = new RegExp('&'+urlencode(id)+'&');
-        this.set_env('collapsed_folders', this.env.collapsed_folders.replace(reg, ''));
-        }
-      else
-        {
-        ul.hide();
-        div.removeClass('expanded').addClass('collapsed');
-        this.set_env('collapsed_folders', this.env.collapsed_folders+'&'+urlencode(id)+'&');
+  {
+    var li = this.get_folder_li(id),
+      div = $(li.getElementsByTagName('div')[0]);
 
-        // select parent folder if one of its childs is currently selected
-        if (this.env.mailbox.indexOf(id + this.env.delimiter) == 0)
-          this.command('list', id);
-        }
+    if (!div || (!div.hasClass('collapsed') && !div.hasClass('expanded')))
+      return;
 
-      // Work around a bug in IE6 and IE7, see #1485309
-      if ((bw.ie6 || bw.ie7) &&
-          li.nextSibling &&
-          (li.nextSibling.getElementsByTagName("ul").length>0) &&
-          li.nextSibling.getElementsByTagName("ul")[0].style &&
-          (li.nextSibling.getElementsByTagName("ul")[0].style.display!='none'))
-        {
-          li.nextSibling.getElementsByTagName("ul")[0].style.display = 'none';
-          li.nextSibling.getElementsByTagName("ul")[0].style.display = '';
-        }
+    var ul = $(li.getElementsByTagName('ul')[0]);
 
-      this.http_post('save-pref', '_name=collapsed_folders&_value='+urlencode(this.env.collapsed_folders));
-      this.set_unread_count_display(id, false);
+    if (div.hasClass('collapsed')) {
+      ul.show();
+      div.removeClass('collapsed').addClass('expanded');
+      var reg = new RegExp('&'+urlencode(id)+'&');
+      this.set_env('collapsed_folders', this.env.collapsed_folders.replace(reg, ''));
+    }
+    else {
+      ul.hide();
+      div.removeClass('expanded').addClass('collapsed');
+      this.set_env('collapsed_folders', this.env.collapsed_folders+'&'+urlencode(id)+'&');
+
+      // select parent folder if one of its childs is currently selected
+      if (this.env.mailbox.indexOf(id + this.env.delimiter) == 0)
+        this.command('list', id);
+    }
+
+    // Work around a bug in IE6 and IE7, see #1485309
+    if (bw.ie6 || bw.ie7) {
+      var siblings = li.nextSibling ? li.nextSibling.getElementsByTagName('ul') : null;
+      if (siblings && siblings.length && (li = siblings[0]) && li.style && li.style.display != 'none') {
+        li.style.display = 'none';
+        li.style.display = '';
       }
     }
 
+    this.http_post('save-pref', '_name=collapsed_folders&_value='+urlencode(this.env.collapsed_folders));
+    this.set_unread_count_display(id, false);
+  };
+
+  this.doc_mouse_up = function(e)
+  {
+    var model, list, li;
+
+    if (this.message_list) {
+      if (!rcube_mouse_is_over(e, this.message_list.list.parentNode))
+        this.message_list.blur();
+      else
+        this.message_list.focus();
+      list = this.message_list;
+      model = this.env.mailboxes;
+    }
+    else if (this.contact_list) {
+      if (!rcube_mouse_is_over(e, this.contact_list.list.parentNode))
+        this.contact_list.blur();
+      else
+        this.contact_list.focus();
+      list = this.contact_list;
+      model = this.env.contactfolders;
+    }
+    else if (this.ksearch_value) {
+      this.ksearch_blur();
+    }
+
+    // handle mouse release when dragging
+    if (this.drag_active && model && this.env.last_folder_target) {
+      var target = model[this.env.last_folder_target];
+
+      $(this.get_folder_li(this.env.last_folder_target)).removeClass('droptarget');
+      this.env.last_folder_target = null;
+      list.draglayer.hide();
+
+      if (!this.drag_menu(e, target))
+        this.command('moveto', target);
+    }
+
+    // reset 'pressed' buttons
+    if (this.buttons_sel) {
+      for (var id in this.buttons_sel)
+        if (typeof id != 'function')
+          this.button_out(this.buttons_sel[id], id);
+      this.buttons_sel = {};
+    }
+  };
+
   this.click_on_list = function(e)
-    {
+  {
     if (this.gui_objects.qsearchbox)
       this.gui_objects.qsearchbox.blur();
 
@@ -1434,59 +1412,91 @@ function rcube_webmail()
     else if (this.contact_list)
       this.contact_list.focus();
 
-    return rcube_event.get_button(e) == 2 ? true : rcube_event.cancel(e);
-    };
+    return true;
+  };
 
   this.msglist_select = function(list)
-    {
+  {
     if (this.preview_timer)
       clearTimeout(this.preview_timer);
-
-    var selected = list.selection.length==1;
-
-    // Hide certain command buttons when Drafts folder is selected
-    if (this.env.mailbox == this.env.drafts_mailbox)
-      {
-      this.enable_command('reply', 'reply-all', 'forward', false);
-      this.enable_command('show', 'print', 'open', 'edit', 'download', 'viewsource', selected);
-      this.enable_command('delete', 'moveto', 'mark', (list.selection.length > 0 ? true : false));
-      }
-    else
-      {
-      this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', 'edit', 'open', 'download', 'viewsource', selected);
-      this.enable_command('delete', 'moveto', 'mark', (list.selection.length > 0 ? true : false));
+    if (this.preview_read_timer)
+      clearTimeout(this.preview_read_timer);
+
+    var selected = list.get_single_selection() != null;
+
+    this.enable_command(this.env.message_commands, selected);
+    if (selected) {
+      // Hide certain command buttons when Drafts folder is selected
+      if (this.env.mailbox == this.env.drafts_mailbox)
+        this.enable_command('reply', 'reply-all', 'reply-list', 'forward', false);
+      // Disable reply-list when List-Post header is not set
+      else {
+        var msg = this.env.messages[list.get_single_selection()];
+        if (!msg.ml)
+          this.enable_command('reply-list', false);
       }
+    }
+    // Multi-message commands
+    this.enable_command('delete', 'moveto', 'copy', 'mark', (list.selection.length > 0 ? true : false));
+
+    // reset all-pages-selection
+    if (selected || (list.selection.length && list.selection.length != list.rowcount))
+      this.select_all_mode = false;
 
     // start timer for message preview (wait for double click)
-    if (selected && this.env.contentframe && !list.multi_selecting)
+    if (selected && this.env.contentframe && !list.multi_selecting && !this.dummy_select)
       this.preview_timer = window.setTimeout(function(){ ref.msglist_get_preview(); }, 200);
     else if (this.env.contentframe)
       this.show_contentframe(false);
-    };
+  };
+
+  // This allow as to re-select selected message and display it in preview frame
+  this.msglist_click = function(list)
+  {
+    if (list.multi_selecting || !this.env.contentframe)
+      return;
+
+    if (list.get_single_selection() && window.frames && window.frames[this.env.contentframe]) {
+      if (window.frames[this.env.contentframe].location.href.indexOf(this.env.blankpage)>=0) {
+        if (this.preview_timer)
+          clearTimeout(this.preview_timer);
+        if (this.preview_read_timer)
+          clearTimeout(this.preview_read_timer);
+        this.preview_timer = window.setTimeout(function(){ ref.msglist_get_preview(); }, 200);
+      }
+    }
+  };
 
   this.msglist_dbl_click = function(list)
-    {
-      if (this.preview_timer)
-        clearTimeout(this.preview_timer);
+  {
+    if (this.preview_timer)
+      clearTimeout(this.preview_timer);
+
+    if (this.preview_read_timer)
+      clearTimeout(this.preview_read_timer);
 
     var uid = list.get_single_selection();
     if (uid && this.env.mailbox == this.env.drafts_mailbox)
       this.goto_url('compose', '_draft_uid='+uid+'&_mbox='+urlencode(this.env.mailbox), true);
     else if (uid)
       this.show_message(uid, false, false);
-    };
+  };
 
   this.msglist_keypress = function(list)
-    {
+  {
     if (list.key_pressed == list.ENTER_KEY)
       this.command('show');
     else if (list.key_pressed == list.DELETE_KEY)
       this.command('delete');
     else if (list.key_pressed == list.BACKSPACE_KEY)
       this.command('delete');
+    else if (list.key_pressed == 33)
+      this.command('previouspage');
+    else if (list.key_pressed == 34)
+      this.command('nextpage');
     else
       list.shiftkey = false;
-    };
+  };
 
   this.msglist_get_preview = function()
   {
@@ -1496,15 +1506,57 @@ function rcube_webmail()
     else if (this.env.contentframe)
       this.show_contentframe(false);
   };
-  
+
+  this.msglist_expand = function(row)
+  {
+    if (this.env.messages[row.uid])
+      this.env.messages[row.uid].expanded = row.expanded;
+  };
+
+  this.msglist_set_coltypes = function(list)
+  {
+    var i, found, name, cols = list.list.tHead.rows[0].cells;
+
+    this.env.coltypes = [];
+
+    for (i=0; i<cols.length; i++)
+      if (cols[i].id && cols[i].id.match(/^rcm/)) {
+        name = cols[i].id.replace(/^rcm/, '');
+        this.env.coltypes.push(name == 'to' ? 'from' : name);
+      }
+
+    if ((found = $.inArray('flag', this.env.coltypes)) >= 0)
+      this.set_env('flagged_col', found);
+
+    if ((found = $.inArray('subject', this.env.coltypes)) >= 0)
+      this.set_env('subject_col', found);
+
+    this.http_post('save-pref', { '_name':'list_cols', '_value':this.env.coltypes, '_session':'list_attrib/columns' });
+  };
+
   this.check_droptarget = function(id)
   {
+    var allow = false, copy = false;
+
     if (this.task == 'mail')
-      return (this.env.mailboxes[id] && this.env.mailboxes[id].id != this.env.mailbox && !this.env.mailboxes[id].virtual);
-    else if (this.task == 'addressbook')
-      return (id != this.env.source && this.env.address_sources[id] && !this.env.address_sources[id].readonly);
+      allow = (this.env.mailboxes[id] && this.env.mailboxes[id].id != this.env.mailbox && !this.env.mailboxes[id].virtual);
     else if (this.task == 'settings')
-      return (id != this.env.folder);
+      allow = (id != this.env.mailbox);
+    else if (this.task == 'addressbook') {
+      if (id != this.env.source && this.env.contactfolders[id]) {
+        if (this.env.contactfolders[id].type == 'group') {
+          var target_abook = this.env.contactfolders[id].source;
+          allow = this.env.contactfolders[id].id != this.env.group && !this.env.contactfolders[target_abook].readonly;
+          copy = target_abook != this.env.source;
+        }
+        else {
+          allow = !this.env.contactfolders[id].readonly;
+          copy = true;
+        }
+      }
+    }
+
+    return allow ? (copy ? 2 : 1) : 0;
   };
 
 
@@ -1512,454 +1564,987 @@ function rcube_webmail()
   /*********     (message) list functionality      *********/
   /*********************************************************/
 
+  this.init_message_row = function(row)
+  {
+    var expando, self = this, uid = row.uid,
+      status_icon = (this.env.status_col != null ? 'status' : 'msg') + 'icn' + row.uid;
+
+    if (uid && this.env.messages[uid])
+      $.extend(row, this.env.messages[uid]);
+
+    // set eventhandler to status icon
+    if (row.icon = document.getElementById(status_icon)) {
+      row.icon._row = row.obj;
+      row.icon.onmousedown = function(e) { self.command('toggle_status', this); rcube_event.cancel(e); };
+    }
+
+    // save message icon position too
+    if (this.env.status_col != null)
+      row.msgicon = document.getElementById('msgicn'+row.uid);
+    else
+      row.msgicon = row.icon;
+
+    // set eventhandler to flag icon, if icon found
+    if (this.env.flagged_col != null && (row.flagicon = document.getElementById('flagicn'+row.uid))) {
+      row.flagicon._row = row.obj;
+      row.flagicon.onmousedown = function(e) { self.command('toggle_flag', this); rcube_event.cancel(e); };
+    }
+
+    if (!row.depth && row.has_children && (expando = document.getElementById('rcmexpando'+row.uid))) {
+      row.expando = expando;
+      expando.onmousedown = function(e) { return self.expand_message_row(e, uid); };
+    }
+
+    this.triggerEvent('insertrow', { uid:uid, row:row });
+  };
+
+  // create a table row in the message list
+  this.add_message_row = function(uid, cols, flags, attop)
+  {
+    if (!this.gui_objects.messagelist || !this.message_list)
+      return false;
+
+    if (!this.env.messages[uid])
+      this.env.messages[uid] = {};
+
+    // merge flags over local message object
+    $.extend(this.env.messages[uid], {
+      deleted: flags.deleted?1:0,
+      replied: flags.replied?1:0,
+      unread: flags.unread?1:0,
+      forwarded: flags.forwarded?1:0,
+      flagged: flags.flagged?1:0,
+      has_children: flags.has_children?1:0,
+      depth: flags.depth?flags.depth:0,
+      unread_children: flags.unread_children?flags.unread_children:0,
+      parent_uid: flags.parent_uid?flags.parent_uid:0,
+      selected: this.select_all_mode || this.message_list.in_selection(uid),
+      ml: flags.ml?1:0,
+      ctype: flags.ctype,
+      // flags from plugins
+      flags: flags.extra_flags
+    });
+
+    var c, html, tree = expando = '',
+      list = this.message_list,
+      rows = list.rows,
+      tbody = this.gui_objects.messagelist.tBodies[0],
+      rowcount = tbody.rows.length,
+      even = rowcount%2,
+      message = this.env.messages[uid],
+      css_class = 'message'
+        + (even ? ' even' : ' odd')
+        + (flags.unread ? ' unread' : '')
+        + (flags.deleted ? ' deleted' : '')
+        + (flags.flagged ? ' flagged' : '')
+        + (flags.unread_children && !flags.unread && !this.env.autoexpand_threads ? ' unroot' : '')
+        + (message.selected ? ' selected' : ''),
+      // for performance use DOM instead of jQuery here
+      row = document.createElement('tr'),
+      col = document.createElement('td');
+
+    row.id = 'rcmrow'+uid;
+    row.className = css_class;
+
+    // message status icons
+    css_class = 'msgicon';
+    if (this.env.status_col === null) {
+      css_class += ' status';
+      if (flags.deleted)
+        css_class += ' deleted';
+      else if (flags.unread)
+        css_class += ' unread';
+      else if (flags.unread_children > 0)
+        css_class += ' unreadchildren';
+    }
+    if (flags.replied)
+      css_class += ' replied';
+    if (flags.forwarded)
+      css_class += ' forwarded';
+
+    // update selection
+    if (message.selected && !list.in_selection(uid))
+      list.selection.push(uid);
+
+    // threads
+    if (this.env.threading) {
+      // This assumes that div width is hardcoded to 15px,
+      var width = message.depth * 15;
+      if (message.depth) {
+        if ((rows[message.parent_uid] && rows[message.parent_uid].expanded === false)
+          || ((this.env.autoexpand_threads == 0 || this.env.autoexpand_threads == 2) &&
+            (!rows[message.parent_uid] || !rows[message.parent_uid].expanded))
+        ) {
+          row.style.display = 'none';
+          message.expanded = false;
+        }
+        else
+          message.expanded = true;
+      }
+      else if (message.has_children) {
+        if (typeof(message.expanded) == 'undefined' && (this.env.autoexpand_threads == 1 || (this.env.autoexpand_threads == 2 && message.unread_children))) {
+          message.expanded = true;
+        }
+      }
+
+      if (width)
+        tree += '<span id="rcmtab' + uid + '" class="branch" style="width:' + width + 'px;">&nbsp;&nbsp;</span>';
+
+      if (message.has_children && !message.depth)
+        expando = '<div id="rcmexpando' + uid + '" class="' + (message.expanded ? 'expanded' : 'collapsed') + '">&nbsp;&nbsp;</div>';
+    }
+
+    tree += '<span id="msgicn'+uid+'" class="'+css_class+'">&nbsp;</span>';
+
+    // build subject link 
+    if (!bw.ie && cols.subject) {
+      var action = flags.mbox == this.env.drafts_mailbox ? 'compose' : 'show';
+      var uid_param = flags.mbox == this.env.drafts_mailbox ? '_draft_uid' : '_uid';
+      cols.subject = '<a href="./?_task=mail&_action='+action+'&_mbox='+urlencode(flags.mbox)+'&'+uid_param+'='+uid+'"'+
+        ' onclick="return rcube_event.cancel(event)">'+cols.subject+'</a>';
+    }
+
+    // add each submitted col
+    for (var n in this.env.coltypes) {
+      c = this.env.coltypes[n];
+      col = document.createElement('td');
+      col.className = String(c).toLowerCase();
+
+      if (c == 'flag') {
+        css_class = (flags.flagged ? 'flagged' : 'unflagged');
+        html = '<span id="flagicn'+uid+'" class="'+css_class+'">&nbsp;</span>';
+      }
+      else if (c == 'attachment') {
+        if (/application\/|multipart\/m/.test(flags.ctype))
+          html = '<span class="attachment">&nbsp;</span>';
+        else if (/multipart\/report/.test(flags.ctype))
+          html = '<span class="report">&nbsp;</span>';
+        else
+          html = '&nbsp;';
+      }
+      else if (c == 'status') {
+        if (flags.deleted)
+          css_class = 'deleted';
+        else if (flags.unread)
+          css_class = 'unread';
+        else if (flags.unread_children > 0)
+          css_class = 'unreadchildren';
+        else
+          css_class = 'msgicon';
+        html = '<span id="statusicn'+uid+'" class="'+css_class+'">&nbsp;</span>';
+      }
+      else if (c == 'threads')
+        html = expando;
+      else if (c == 'subject')
+        html = tree + cols[c];
+      else
+        html = cols[c];
+
+      col.innerHTML = html;
+
+      row.appendChild(col);
+    }
+
+    list.insert_row(row, attop);
+
+    // remove 'old' row
+    if (attop && this.env.pagesize && list.rowcount > this.env.pagesize) {
+      var uid = list.get_last_row();
+      list.remove_row(uid);
+      list.clear_selection(uid);
+    }
+  };
+
+  this.set_list_sorting = function(sort_col, sort_order)
+  {
+    // set table header class
+    $('#rcm'+this.env.sort_col).removeClass('sorted'+(this.env.sort_order.toUpperCase()));
+    if (sort_col)
+      $('#rcm'+sort_col).addClass('sorted'+sort_order);
+
+    this.env.sort_col = sort_col;
+    this.env.sort_order = sort_order;
+  };
+
+  this.set_list_options = function(cols, sort_col, sort_order, threads)
+  {
+    var update, add_url = '';
+
+    if (typeof sort_col == 'undefined')
+      sort_col = this.env.sort_col;
+    if (!sort_order)
+      sort_order = this.env.sort_order;
+
+    if (this.env.sort_col != sort_col || this.env.sort_order != sort_order) {
+      update = 1;
+      this.set_list_sorting(sort_col, sort_order);
+    }
+
+    if (this.env.threading != threads) {
+      update = 1;
+      add_url += '&_threads=' + threads;
+    }
+
+    if (cols && cols.length) {
+      // make sure new columns are added at the end of the list
+      var i, idx, name, newcols = [], oldcols = this.env.coltypes;
+      for (i=0; i<oldcols.length; i++) {
+        name = oldcols[i] == 'to' ? 'from' : oldcols[i];
+        idx = $.inArray(name, cols);
+        if (idx != -1) {
+          newcols.push(name);
+          delete cols[idx];
+        }
+      }
+      for (i=0; i<cols.length; i++)
+        if (cols[i])
+          newcols.push(cols[i]);
+
+      if (newcols.join() != oldcols.join()) {
+        update = 1;
+        add_url += '&_cols=' + newcols.join(',');
+      }
+    }
+
+    if (update)
+      this.list_mailbox('', '', sort_col+'_'+sort_order, add_url);
+  };
+
   // when user doble-clicks on a row
   this.show_message = function(id, safe, preview)
-    {
-    if (!id) return;
-    
-    var add_url = '';
-    var action = preview ? 'preview': 'show';
-    var target = window;
-    
-    if (preview && this.env.contentframe && window.frames && window.frames[this.env.contentframe])
-      {
+  {
+    if (!id)
+      return;
+
+    var target = window,
+      action = preview ? 'preview': 'show',
+      url = '&_action='+action+'&_uid='+id+'&_mbox='+urlencode(this.env.mailbox);
+
+    if (preview && this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
       target = window.frames[this.env.contentframe];
-      add_url = '&_framed=1';
-      }
+      url += '&_framed=1';
+    }
 
     if (safe)
-      add_url = '&_safe=1';
+      url += '&_safe=1';
 
     // also send search request to get the right messages
     if (this.env.search_request)
-      add_url += '&_search='+this.env.search_request;
+      url += '&_search='+this.env.search_request;
 
-    var url = '&_action='+action+'&_uid='+id+'&_mbox='+urlencode(this.env.mailbox)+add_url;
     if (action == 'preview' && String(target.location.href).indexOf(url) >= 0)
       this.show_contentframe(true);
-    else
-      {
-      this.set_busy(true, 'loading');
+    else {
+      if (!this.env.frame_lock) {
+        (this.is_framed() ? parent.rcmail : this).env.frame_lock = this.set_busy(true, 'loading');
+      }
       target.location.href = this.env.comm_path+url;
 
       // mark as read and change mbox unread counter
-      if (action == 'preview' && this.message_list && this.message_list.rows[id] && this.message_list.rows[id].unread)
-        {
-        this.set_message(id, 'unread', false);
-        if (this.env.unread_counts[this.env.mailbox])
-          {
-          this.env.unread_counts[this.env.mailbox] -= 1;
-          this.set_unread_count(this.env.mailbox, this.env.unread_counts[this.env.mailbox], this.env.mailbox == 'INBOX');
+      if (action == 'preview' && this.message_list && this.message_list.rows[id] && this.message_list.rows[id].unread && this.env.preview_pane_mark_read >= 0) {
+        this.preview_read_timer = window.setTimeout(function() {
+          ref.set_message(id, 'unread', false);
+          ref.update_thread_root(id, 'read');
+          if (ref.env.unread_counts[ref.env.mailbox]) {
+            ref.env.unread_counts[ref.env.mailbox] -= 1;
+            ref.set_unread_count(ref.env.mailbox, ref.env.unread_counts[ref.env.mailbox], ref.env.mailbox == 'INBOX');
           }
-        }
+          if (ref.env.preview_pane_mark_read > 0)
+            ref.http_post('mark', '_uid='+id+'&_flag=read&_quiet=1');
+        }, this.env.preview_pane_mark_read * 1000);
       }
-    };
+    }
+  };
 
   this.show_contentframe = function(show)
-    {
-    var frm;
-    if (this.env.contentframe && (frm = $('#'+this.env.contentframe)) && frm.length)
-      {
-      if (!show && window.frames[this.env.contentframe])
-        {
-        if (window.frames[this.env.contentframe].location.href.indexOf(this.env.blankpage)<0)
-          window.frames[this.env.contentframe].location.href = this.env.blankpage;
-        }
+  {
+    var frm, win;
+    if (this.env.contentframe && (frm = $('#'+this.env.contentframe)) && frm.length) {
+      if (!show && (win = window.frames[this.env.contentframe])) {
+        if (win.location && win.location.href.indexOf(this.env.blankpage)<0)
+          win.location.href = this.env.blankpage;
+      }
       else if (!bw.safari && !bw.konq)
         frm[show ? 'show' : 'hide']();
       }
 
     if (!show && this.busy)
-      this.set_busy(false);
-    };
+      this.set_busy(false, null, this.env.frame_lock);
+  };
 
   // list a specific page
   this.list_page = function(page)
-    {
-    if (page=='next')
+  {
+    if (page == 'next')
       page = this.env.current_page+1;
-    if (page=='last')
+    else if (page == 'last')
       page = this.env.pagecount;
-    if (page=='prev' && this.env.current_page>1)
+    else if (page == 'prev' && this.env.current_page > 1)
       page = this.env.current_page-1;
-    if (page=='first' && this.env.current_page>1)
+    else if (page == 'first' && this.env.current_page > 1)
       page = 1;
-      
-    if (page > 0 && page <= this.env.pagecount)
-      {
+
+    if (page > 0 && page <= this.env.pagecount) {
       this.env.current_page = page;
-      
-      if (this.task=='mail')
+
+      if (this.task == 'mail')
         this.list_mailbox(this.env.mailbox, page);
-      else if (this.task=='addressbook')
-        this.list_contacts(this.env.source, page);
-      }
-    };
+      else if (this.task == 'addressbook')
+        this.list_contacts(this.env.source, this.env.group, page);
+    }
+  };
 
   // list messages of a specific mailbox using filter
   this.filter_mailbox = function(filter)
-    {
-      var search;
-      if (this.gui_objects.qsearchbox)
-        search = this.gui_objects.qsearchbox.value;
-      
-      this.message_list.clear();
+  {
+    var search, lock = this.set_busy(true, 'searching');
 
-      // reset vars
-      this.env.current_page = 1;
-      this.set_busy(true, 'searching');
-      this.http_request('search', '_filter='+filter
-           + (search ? '&_q='+urlencode(search) : '')
-           + (this.env.mailbox ? '&_mbox='+urlencode(this.env.mailbox) : ''), true);
-    }
+    if (this.gui_objects.qsearchbox)
+      search = this.gui_objects.qsearchbox.value;
 
+    this.clear_message_list();
+
+    // reset vars
+    this.env.current_page = 1;
+    this.http_request('search', '_filter='+filter
+        + (search ? '&_q='+urlencode(search) : '')
+        + (this.env.mailbox ? '&_mbox='+urlencode(this.env.mailbox) : ''), lock);
+  };
 
   // list messages of a specific mailbox
-  this.list_mailbox = function(mbox, page, sort)
-    {
-    var add_url = '';
-    var target = window;
+  this.list_mailbox = function(mbox, page, sort, add_url)
+  {
+    var url = '', target = window;
 
     if (!mbox)
-      mbox = this.env.mailbox;
+      mbox = this.env.mailbox ? this.env.mailbox : 'INBOX';
+
+    if (add_url)
+      url += add_url;
 
     // add sort to url if set
     if (sort)
-      add_url += '&_sort=' + sort;
+      url += '&_sort=' + sort;
 
     // also send search request to get the right messages
     if (this.env.search_request)
-      add_url += '&_search='+this.env.search_request;
+      url += '&_search='+this.env.search_request;
 
     // set page=1 if changeing to another mailbox
-    if (!page && this.env.mailbox != mbox)
-      {
+    if (this.env.mailbox != mbox) {
       page = 1;
       this.env.current_page = page;
-      this.show_contentframe(false);
-      }
+      this.select_all_mode = false;
+    }
+
+    // unselect selected messages and clear the list and message data
+    this.clear_message_list();
 
     if (mbox != this.env.mailbox || (mbox == this.env.mailbox && !page && !sort))
-      add_url += '&_refresh=1';
+      url += '&_refresh=1';
 
-    // unselect selected messages
-    this.last_selected = 0;
-    if (this.message_list)
-      this.message_list.clear_selection();
-    
     this.select_folder(mbox, this.env.mailbox);
     this.env.mailbox = mbox;
 
     // load message list remotely
-    if (this.gui_objects.messagelist)
-      {
-      this.list_mailbox_remote(mbox, page, add_url);
+    if (this.gui_objects.messagelist) {
+      this.list_mailbox_remote(mbox, page, url);
       return;
-      }
-    
-    if (this.env.contentframe && window.frames && window.frames[this.env.contentframe])
-      {
+    }
+
+    if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
       target = window.frames[this.env.contentframe];
-      add_url += '&_framed=1';
-      }
+      url += '&_framed=1';
+    }
 
     // load message list to target frame/window
-    if (mbox)
-      {
+    if (mbox) {
       this.set_busy(true, 'loading');
-      target.location.href = this.env.comm_path+'&_mbox='+urlencode(mbox)+(page ? '&_page='+page : '')+add_url;
-      }
-    };
+      target.location.href = this.env.comm_path+'&_mbox='+urlencode(mbox)+(page ? '&_page='+page : '')+url;
+    }
+  };
+
+  this.clear_message_list = function()
+  {
+      this.env.messages = {};
+      this.last_selected = 0;
+
+      this.show_contentframe(false);
+      if (this.message_list)
+        this.message_list.clear(true);
+  };
 
   // send remote request to load message list
   this.list_mailbox_remote = function(mbox, page, add_url)
-    {
+  {
     // clear message list first
     this.message_list.clear();
 
     // send request to server
-    var url = '_mbox='+urlencode(mbox)+(page ? '&_page='+page : '');
-    this.set_busy(true, 'loading');
-    this.http_request('list', url+add_url, true);
-    };
+    var url = '_mbox='+urlencode(mbox)+(page ? '&_page='+page : ''),
+      lock = this.set_busy(true, 'loading');
+    this.http_request('list', url+add_url, lock);
+  };
 
-  this.expunge_mailbox = function(mbox)
-    {
-    var lock = false;
-    var add_url = '';
-    
-    // lock interface if it's the active mailbox
-    if (mbox == this.env.mailbox)
-       {
-       lock = true;
-       this.set_busy(true, 'loading');
-       add_url = '&_reload=1';
-       }
+  // removes messages that doesn't exists from list selection array
+  this.update_selection = function()
+  {
+    var selected = this.message_list.selection,
+      rows = this.message_list.rows,
+      i, selection = [];
 
-    // send request to server
-    var url = '_mbox='+urlencode(mbox);
-    this.http_post('expunge', url+add_url, lock);
-    };
+    for (i in selected)
+      if (rows[selected[i]])
+        selection.push(selected[i]);
 
-  this.purge_mailbox = function(mbox)
-    {
-    var lock = false;
-    var add_url = '';
-    
-    if (!confirm(this.get_label('purgefolderconfirm')))
-      return false;
-    
-    // lock interface if it's the active mailbox
-    if (mbox == this.env.mailbox)
-       {
-       lock = true;
-       this.set_busy(true, 'loading');
-       add_url = '&_reload=1';
-       }
+    this.message_list.selection = selection;
+  }
 
-    // send request to server
-    var url = '_mbox='+urlencode(mbox);
-    this.http_post('purge', url+add_url, lock);
-    return true;
-    };
+  // expand all threads with unread children
+  this.expand_unread = function()
+  {
+    var r, tbody = this.gui_objects.messagelist.tBodies[0],
+      new_row = tbody.firstChild;
+
+    while (new_row) {
+      if (new_row.nodeType == 1 && (r = this.message_list.rows[new_row.uid])
+           && r.unread_children) {
+           this.message_list.expand_all(r);
+           this.set_unread_children(r.uid);
+      }
+      new_row = new_row.nextSibling;
+    }
+    return false;
+  };
 
-  // test if purge command is allowed
-  this.purge_mailbox_test = function()
+  // thread expanding/collapsing handler
+  this.expand_message_row = function(e, uid)
   {
-    return (this.env.messagecount && (this.env.mailbox == this.env.trash_mailbox || this.env.mailbox == this.env.junk_mailbox 
-      || this.env.mailbox.match('^' + RegExp.escape(this.env.trash_mailbox) + RegExp.escape(this.env.delimiter)) 
-      || this.env.mailbox.match('^' + RegExp.escape(this.env.junk_mailbox) + RegExp.escape(this.env.delimiter))));
+    var row = this.message_list.rows[uid];
+
+    // handle unread_children mark
+    row.expanded = !row.expanded;
+    this.set_unread_children(uid);
+    row.expanded = !row.expanded;
+
+    this.message_list.expand_row(e, uid);
+  };
+
+  // message list expanding
+  this.expand_threads = function()
+  {
+    if (!this.env.threading || !this.env.autoexpand_threads || !this.message_list)
+      return;
+
+    switch (this.env.autoexpand_threads) {
+      case 2: this.expand_unread(); break;
+      case 1: this.message_list.expand_all(); break;
+    }
+  };
+
+  // Initializes threads indicators/expanders after list update
+  this.init_threads = function(roots)
+  {
+    for (var n=0, len=roots.length; n<len; n++)
+      this.add_tree_icons(roots[n]);
+    this.expand_threads();
+  };
+
+  // adds threads tree icons to the list (or specified thread)
+  this.add_tree_icons = function(root)
+  {
+    var i, l, r, n, len, pos, tmp = [], uid = [],
+      row, rows = this.message_list.rows;
+
+    if (root)
+      row = rows[root] ? rows[root].obj : null;
+    else
+      row = this.message_list.list.tBodies[0].firstChild;
+
+    while (row) {
+      if (row.nodeType == 1 && (r = rows[row.uid])) {
+        if (r.depth) {
+          for (i=tmp.length-1; i>=0; i--) {
+            len = tmp[i].length;
+            if (len > r.depth) {
+              pos = len - r.depth;
+              if (!(tmp[i][pos] & 2))
+                tmp[i][pos] = tmp[i][pos] ? tmp[i][pos]+2 : 2;
+            }
+            else if (len == r.depth) {
+              if (!(tmp[i][0] & 2))
+                tmp[i][0] += 2;
+            }
+            if (r.depth > len)
+              break;
+          }
+
+          tmp.push(new Array(r.depth));
+          tmp[tmp.length-1][0] = 1;
+          uid.push(r.uid);
+        }
+        else {
+          if (tmp.length) {
+            for (i in tmp) {
+              this.set_tree_icons(uid[i], tmp[i]);
+            }
+            tmp = [];
+            uid = [];
+          }
+          if (root && row != rows[root].obj)
+            break;
+        }
+      }
+      row = row.nextSibling;
+    }
+
+    if (tmp.length) {
+      for (i in tmp) {
+        this.set_tree_icons(uid[i], tmp[i]);
+      }
+    }
+  };
+
+  // adds tree icons to specified message row
+  this.set_tree_icons = function(uid, tree)
+  {
+    var i, divs = [], html = '', len = tree.length;
+
+    for (i=0; i<len; i++) {
+      if (tree[i] > 2)
+        divs.push({'class': 'l3', width: 15});
+      else if (tree[i] > 1)
+        divs.push({'class': 'l2', width: 15});
+      else if (tree[i] > 0)
+        divs.push({'class': 'l1', width: 15});
+      // separator div
+      else if (divs.length && !divs[divs.length-1]['class'])
+        divs[divs.length-1].width += 15;
+      else
+        divs.push({'class': null, width: 15});
+    }
+
+    for (i=divs.length-1; i>=0; i--) {
+      if (divs[i]['class'])
+        html += '<div class="tree '+divs[i]['class']+'" />';
+      else
+        html += '<div style="width:'+divs[i].width+'px" />';
+    }
+
+    if (html)
+      $('#rcmtab'+uid).html(html);
+  };
+
+  // update parent in a thread
+  this.update_thread_root = function(uid, flag)
+  {
+    if (!this.env.threading)
+      return;
+
+    var root = this.message_list.find_root(uid);
+
+    if (uid == root)
+      return;
+
+    var p = this.message_list.rows[root];
+
+    if (flag == 'read' && p.unread_children) {
+      p.unread_children--;
+    }
+    else if (flag == 'unread' && p.has_children) {
+      // unread_children may be undefined
+      p.unread_children = p.unread_children ? p.unread_children + 1 : 1;
+    }
+    else {
+      return;
+    }
+
+    this.set_message_icon(root);
+    this.set_unread_children(root);
+  };
+
+  // update thread indicators for all messages in a thread below the specified message
+  // return number of removed/added root level messages
+  this.update_thread = function (uid)
+  {
+    if (!this.env.threading)
+      return 0;
+
+    var r, parent, count = 0,
+      rows = this.message_list.rows,
+      row = rows[uid],
+      depth = rows[uid].depth,
+      roots = [];
+
+    if (!row.depth) // root message: decrease roots count
+      count--;
+    else if (row.unread) {
+      // update unread_children for thread root
+      parent = this.message_list.find_root(uid);
+      rows[parent].unread_children--;
+      this.set_unread_children(parent);
+    }
+
+    parent = row.parent_uid;
+
+    // childrens
+    row = row.obj.nextSibling;
+    while (row) {
+      if (row.nodeType == 1 && (r = rows[row.uid])) {
+           if (!r.depth || r.depth <= depth)
+             break;
+
+           r.depth--; // move left
+        // reset width and clear the content of a tab, icons will be added later
+           $('#rcmtab'+r.uid).width(r.depth * 15).html('');
+        if (!r.depth) { // a new root
+             count++; // increase roots count
+             r.parent_uid = 0;
+             if (r.has_children) {
+               // replace 'leaf' with 'collapsed'
+               $('#rcmrow'+r.uid+' '+'.leaf:first')
+              .attr('id', 'rcmexpando' + r.uid)
+                 .attr('class', (r.obj.style.display != 'none' ? 'expanded' : 'collapsed'))
+             .bind('mousedown', {uid:r.uid, p:this},
+                   function(e) { return e.data.p.expand_message_row(e, e.data.uid); });
+
+               r.unread_children = 0;
+               roots.push(r);
+             }
+             // show if it was hidden
+             if (r.obj.style.display == 'none')
+               $(r.obj).show();
+           }
+           else {
+             if (r.depth == depth)
+               r.parent_uid = parent;
+             if (r.unread && roots.length)
+               roots[roots.length-1].unread_children++;
+           }
+         }
+         row = row.nextSibling;
+    }
+
+    // update unread_children for roots
+    for (var i=0; i<roots.length; i++)
+      this.set_unread_children(roots[i].uid);
+
+    return count;
+  };
+
+  this.delete_excessive_thread_rows = function()
+  {
+    var rows = this.message_list.rows,
+      tbody = this.message_list.list.tBodies[0],
+      row = tbody.firstChild,
+      cnt = this.env.pagesize + 1;
+
+    while (row) {
+      if (row.nodeType == 1 && (r = rows[row.uid])) {
+           if (!r.depth && cnt)
+             cnt--;
+
+        if (!cnt)
+             this.message_list.remove_row(row.uid);
+         }
+         row = row.nextSibling;
+    }
   };
 
   // set message icon
   this.set_message_icon = function(uid)
   {
-    var icn_src;
-    var rows = this.message_list.rows;
+    var css_class,
+      row = this.message_list.rows[uid];
 
-    if (!rows[uid])
+    if (!row)
       return false;
 
-    if (rows[uid].deleted && this.env.deletedicon)
-      icn_src = this.env.deletedicon;
-    else if (rows[uid].replied && this.env.repliedicon)
-      {
-      if (rows[uid].forwarded && this.env.forwardedrepliedicon)
-        icn_src = this.env.forwardedrepliedicon;
-      else
-        icn_src = this.env.repliedicon;
+    if (row.icon) {
+      css_class = 'msgicon';
+      if (row.deleted)
+        css_class += ' deleted';
+      else if (row.unread)
+        css_class += ' unread';
+      else if (row.unread_children)
+        css_class += ' unreadchildren';
+      if (row.msgicon == row.icon) {
+        if (row.replied)
+          css_class += ' replied';
+        if (row.forwarded)
+          css_class += ' forwarded';
+        css_class += ' status';
       }
-    else if (rows[uid].forwarded && this.env.forwardedicon)
-      icn_src = this.env.forwardedicon;
-    else if (rows[uid].unread && this.env.unreadicon)
-      icn_src = this.env.unreadicon;
-    else if (this.env.messageicon)
-      icn_src = this.env.messageicon;
-      
-    if (icn_src && rows[uid].icon)
-      rows[uid].icon.src = icn_src;
-
-    icn_src = '';
-    
-    if (rows[uid].flagged && this.env.flaggedicon)
-      icn_src = this.env.flaggedicon;
-    else if (!rows[uid].flagged && this.env.unflaggedicon)
-      icn_src = this.env.unflaggedicon;
-
-    if (rows[uid].flagged_icon && icn_src)
-      rows[uid].flagged_icon.src = icn_src;
-  }
+
+      row.icon.className = css_class;
+    }
+
+    if (row.msgicon && row.msgicon != row.icon) {
+      css_class = 'msgicon';
+      if (!row.unread && row.unread_children)
+        css_class += ' unreadchildren';
+      if (row.replied)
+        css_class += ' replied';
+      if (row.forwarded)
+        css_class += ' forwarded';
+
+      row.msgicon.className = css_class;
+    }
+
+    if (row.flagicon) {
+      css_class = (row.flagged ? 'flagged' : 'unflagged');
+      row.flagicon.className = css_class;
+    }
+  };
 
   // set message status
   this.set_message_status = function(uid, flag, status)
-    {
-    var rows = this.message_list.rows;
+  {
+    var row = this.message_list.rows[uid];
 
-    if (!rows[uid]) return false;
+    if (!row)
+      return false;
 
     if (flag == 'unread')
-      rows[uid].unread = status;
+      row.unread = status;
     else if(flag == 'deleted')
-      rows[uid].deleted = status;
+      row.deleted = status;
     else if (flag == 'replied')
-      rows[uid].replied = status;
+      row.replied = status;
     else if (flag == 'forwarded')
-      rows[uid].forwarded = status;
+      row.forwarded = status;
     else if (flag == 'flagged')
-      rows[uid].flagged = status;
-
-    this.env.messages[uid] = rows[uid];
-    }
+      row.flagged = status;
+  };
 
   // set message row status, class and icon
   this.set_message = function(uid, flag, status)
-    {
-    var rows = this.message_list.rows;
+  {
+    var row = this.message_list.rows[uid];
+
+    if (!row)
+      return false;
+
+    if (flag)
+      this.set_message_status(uid, flag, status);
+
+    var rowobj = $(row.obj);
+
+    if (row.unread && !rowobj.hasClass('unread'))
+      rowobj.addClass('unread');
+    else if (!row.unread && rowobj.hasClass('unread'))
+      rowobj.removeClass('unread');
+
+    if (row.deleted && !rowobj.hasClass('deleted'))
+      rowobj.addClass('deleted');
+    else if (!row.deleted && rowobj.hasClass('deleted'))
+      rowobj.removeClass('deleted');
+
+    if (row.flagged && !rowobj.hasClass('flagged'))
+      rowobj.addClass('flagged');
+    else if (!row.flagged && rowobj.hasClass('flagged'))
+      rowobj.removeClass('flagged');
+
+    this.set_unread_children(uid);
+    this.set_message_icon(uid);
+  };
+
+  // sets unroot (unread_children) class of parent row
+  this.set_unread_children = function(uid)
+  {
+    var row = this.message_list.rows[uid];
+
+    if (row.parent_uid)
+      return;
+
+    if (!row.unread && row.unread_children && !row.expanded)
+      $(row.obj).addClass('unroot');
+    else
+      $(row.obj).removeClass('unroot');
+  };
+
+  // copy selected messages to the specified mailbox
+  this.copy_messages = function(mbox)
+  {
+    if (mbox && typeof mbox == 'object')
+      mbox = mbox.id;
+
+    // exit if current or no mailbox specified or if selection is empty
+    if (!mbox || mbox == this.env.mailbox || (!this.env.uid && (!this.message_list || !this.message_list.get_selection().length)))
+      return;
+
+    var a_uids = [],
+      lock = this.display_message(this.get_label('copyingmessage'), 'loading'),
+      add_url = '&_target_mbox='+urlencode(mbox)+'&_from='+(this.env.action ? this.env.action : '');
 
-    if (!rows[uid]) return false;
-    
-    if (flag)
-      this.set_message_status(uid, flag, status);
-    
-    var rowobj = $(rows[uid].obj);
-    if (rows[uid].unread && rows[uid].classname.indexOf('unread')<0)
-      {
-      rows[uid].classname += ' unread';
-      rowobj.addClass('unread');
-      }
-    else if (!rows[uid].unread && rows[uid].classname.indexOf('unread')>=0)
-      {
-      rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
-      rowobj.removeClass('unread');
-      }
-    
-    if (rows[uid].deleted && rows[uid].classname.indexOf('deleted')<0)
-      {
-      rows[uid].classname += ' deleted';
-      rowobj.addClass('deleted');
-      }
-    else if (!rows[uid].deleted && rows[uid].classname.indexOf('deleted')>=0)
-      {
-      rows[uid].classname = rows[uid].classname.replace(/\s*deleted/, '');
-      rowobj.removeClass('deleted');
+    if (this.env.uid)
+      a_uids[0] = this.env.uid;
+    else {
+      var selection = this.message_list.get_selection();
+      for (var n in selection) {
+        a_uids.push(selection[n]);
       }
+    }
 
-    if (rows[uid].flagged && rows[uid].classname.indexOf('flagged')<0)
-      {
-      rows[uid].classname += ' flagged';
-      rowobj.addClass('flagged');
-      }
-    else if (!rows[uid].flagged && rows[uid].classname.indexOf('flagged')>=0)
-      {
-      rows[uid].classname = rows[uid].classname.replace(/\s*flagged/, '');
-      rowobj.removeClass('flagged');
-      }
+    add_url += '&_uid='+this.uids_to_list(a_uids);
 
-    this.set_message_icon(uid);
-    }
+    // send request to server
+    this.http_post('copy', '_mbox='+urlencode(this.env.mailbox)+add_url, lock);
+  };
 
   // move selected messages to the specified mailbox
   this.move_messages = function(mbox)
-    {
+  {
+    if (mbox && typeof mbox == 'object')
+      mbox = mbox.id;
+
     // exit if current or no mailbox specified or if selection is empty
     if (!mbox || mbox == this.env.mailbox || (!this.env.uid && (!this.message_list || !this.message_list.get_selection().length)))
       return;
 
-    var lock = false;
-    var add_url = '&_target_mbox='+urlencode(mbox)+'&_from='+(this.env.action ? this.env.action : '');
+    var lock = false,
+      add_url = '&_target_mbox='+urlencode(mbox)+'&_from='+(this.env.action ? this.env.action : '');
 
     // show wait message
-    if (this.env.action=='show')
-      {
-      lock = true;
-      this.set_busy(true, 'movingmessage');
-      }
+    if (this.env.action == 'show') {
+      lock = this.set_busy(true, 'movingmessage');
+    }
     else
       this.show_contentframe(false);
 
     // Hide message command buttons until a message is selected
-    this.enable_command('reply', 'reply-all', 'forward', 'delete', 'mark', 'print', 'open', 'edit', 'viewsource', 'download', false);
+    this.enable_command(this.env.message_commands, false);
 
     this._with_selected_messages('moveto', lock, add_url);
-    };
+  };
 
   // delete selected messages from the current mailbox
   this.delete_messages = function()
-    {
-    var selection = this.message_list ? this.message_list.get_selection() : new Array();
+  {
+    var selection = this.message_list ? $.merge([], this.message_list.get_selection()) : [];
 
     // exit if no mailbox specified or if selection is empty
     if (!this.env.uid && !selection.length)
       return;
 
+    // also select childs of collapsed rows
+    for (var uid, i=0, len=selection.length; i<len; i++) {
+      uid = selection[i];
+      if (this.message_list.rows[uid].has_children && !this.message_list.rows[uid].expanded)
+        this.message_list.select_childs(uid);
+    }
+
     // if config is set to flag for deletion
-    if (this.env.flag_for_deletion)
+    if (this.env.flag_for_deletion) {
       this.mark_message('delete');
+      return false;
+    }
     // if there isn't a defined trash mailbox or we are in it
-    else if (!this.env.trash_mailbox || String(this.env.mailbox).toLowerCase() == String(this.env.trash_mailbox).toLowerCase()) 
+    else if (!this.env.trash_mailbox || this.env.mailbox == this.env.trash_mailbox)
       this.permanently_remove_messages();
     // if there is a trash mailbox defined and we're not currently in it
     else {
       // if shift was pressed delete it immediately
-      if (this.message_list && this.message_list.shiftkey)
-        {
+      if (this.message_list && this.message_list.shiftkey) {
         if (confirm(this.get_label('deletemessagesconfirm')))
           this.permanently_remove_messages();
-        }
+      }
       else
         this.move_messages(this.env.trash_mailbox);
-      }
+    }
+
+    return true;
   };
 
   // delete the selected messages permanently
   this.permanently_remove_messages = function()
-    {
+  {
     // exit if no mailbox specified or if selection is empty
     if (!this.env.uid && (!this.message_list || !this.message_list.get_selection().length))
       return;
-      
+
     this.show_contentframe(false);
     this._with_selected_messages('delete', false, '&_from='+(this.env.action ? this.env.action : ''));
-    };
+  };
 
-  // Send a specifc request with UIDs of all selected messages
+  // Send a specifc moveto/delete request with UIDs of all selected messages
   // @private
-  this._with_selected_messages = function(action, lock, add_url, remove)
+  this._with_selected_messages = function(action, lock, add_url)
   {
-    var a_uids = new Array();
+    var a_uids = [], count = 0, msg;
 
     if (this.env.uid)
       a_uids[0] = this.env.uid;
-    else
-    {
-      var selection = this.message_list.get_selection();
-      var rows = this.message_list.rows;
-      var id;
-      for (var n=0; n<selection.length; n++) {
+    else {
+      var n, id, root, roots = [],
+        selection = this.message_list.get_selection();
+
+      for (n=0, len=selection.length; n<len; n++) {
         id = selection[n];
-        a_uids[a_uids.length] = id;
+        a_uids.push(id);
+
+        if (this.env.threading) {
+          count += this.update_thread(id);
+          root = this.message_list.find_root(id);
+          if (root != id && $.inArray(root, roots) < 0) {
+            roots.push(root);
+          }
+        }
         this.message_list.remove_row(id, (this.env.display_next && n == selection.length-1));
       }
       // make sure there are no selected rows
       if (!this.env.display_next)
         this.message_list.clear_selection();
+      // update thread tree icons
+      for (n=0, len=roots.length; n<len; n++) {
+        this.add_tree_icons(roots[n]);
+      }
     }
 
-    // also send search request to get the right messages 
-    if (this.env.search_request) 
+    // also send search request to get the right messages
+    if (this.env.search_request)
       add_url += '&_search='+this.env.search_request;
 
     if (this.env.display_next && this.env.next_uid)
       add_url += '&_next_uid='+this.env.next_uid;
 
+    if (count < 0)
+      add_url += '&_count='+(count*-1);
+    else if (count > 0) 
+      // remove threads from the end of the list
+      this.delete_excessive_thread_rows();
+
+    add_url += '&_uid='+this.uids_to_list(a_uids);
+
+    if (!lock) {
+      msg = action == 'moveto' ? 'movingmessage' : 'deletingmessage';
+      lock = this.display_message(this.get_label(msg), 'loading');
+    }
+
     // send request to server
-    this.http_post(action, '_uid='+a_uids.join(',')+'&_mbox='+urlencode(this.env.mailbox)+add_url, lock);
+    this.http_post(action, '_mbox='+urlencode(this.env.mailbox)+add_url, lock);
   };
 
   // set a specific flag to one or more messages
   this.mark_message = function(flag, uid)
-    {
-    var a_uids = new Array();
-    var r_uids = new Array();
-    var selection = this.message_list ? this.message_list.get_selection() : new Array();
+  {
+    var a_uids = [], r_uids = [], len, n, id,
+      selection = this.message_list ? this.message_list.get_selection() : [];
 
     if (uid)
       a_uids[0] = uid;
     else if (this.env.uid)
       a_uids[0] = this.env.uid;
-    else if (this.message_list)
-      {
-      for (var n=0; n<selection.length; n++)
-        {
-          a_uids[a_uids.length] = selection[n];
-        }
+    else if (this.message_list) {
+      for (n=0, len=selection.length; n<len; n++) {
+          a_uids.push(selection[n]);
       }
+    }
 
     if (!this.message_list)
       r_uids = a_uids;
     else
-      for (var id, n=0; n<a_uids.length; n++)
-      {
+      for (n=0, len=a_uids.length; n<len; n++) {
         id = a_uids[n];
         if ((flag=='read' && this.message_list.rows[id].unread) 
             || (flag=='unread' && !this.message_list.rows[id].unread)
@@ -1968,16 +2553,15 @@ function rcube_webmail()
             || (flag=='flagged' && !this.message_list.rows[id].flagged)
             || (flag=='unflagged' && this.message_list.rows[id].flagged))
         {
-          r_uids[r_uids.length] = id;
+          r_uids.push(id);
         }
       }
 
     // nothing to do
-    if (!r_uids.length)
+    if (!r_uids.length && !this.select_all_mode)
       return;
 
-    switch (flag)
-      {
+    switch (flag) {
         case 'read':
         case 'unread':
           this.toggle_read_status(flag, r_uids);
@@ -1990,8 +2574,8 @@ function rcube_webmail()
         case 'unflagged':
           this.toggle_flagged_status(flag, a_uids);
           break;
-      }
-    };
+    }
+  };
 
   // set class to read/unread
   this.toggle_read_status = function(flag, a_uids)
@@ -2000,7 +2584,17 @@ function rcube_webmail()
     for (var i=0; i<a_uids.length; i++)
       this.set_message(a_uids[i], 'unread', (flag=='unread' ? true : false));
 
-    this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
+    var url = '_uid='+this.uids_to_list(a_uids)+'&_flag='+flag,
+      lock = this.display_message(this.get_label('markingmessage'), 'loading');
+
+    // also send search request to get the right messages
+    if (this.env.search_request)
+      url += '&_search='+this.env.search_request;
+
+    this.http_post('mark', url, lock);
+
+    for (var i=0; i<a_uids.length; i++)
+      this.update_thread_root(a_uids[i], flag);
   };
 
   // set image to flagged or unflagged
@@ -2010,16 +2604,22 @@ function rcube_webmail()
     for (var i=0; i<a_uids.length; i++)
       this.set_message(a_uids[i], 'flagged', (flag=='flagged' ? true : false));
 
-    this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
+    var url = '_uid='+this.uids_to_list(a_uids)+'&_flag='+flag,
+      lock = this.display_message(this.get_label('markingmessage'), 'loading');
+
+    // also send search request to get the right messages
+    if (this.env.search_request)
+      url += '&_search='+this.env.search_request;
+
+    this.http_post('mark', url, lock);
   };
-  
+
   // mark all message rows as deleted/undeleted
   this.toggle_delete_status = function(a_uids)
   {
-    var rows = this.message_list ? this.message_list.rows : new Array();
-    
-    if (a_uids.length==1)
-    {
+    var rows = this.message_list ? this.message_list.rows : [];
+
+    if (a_uids.length==1) {
       if (!rows.length || (rows[a_uids[0]] && !rows[a_uids[0]].deleted))
         this.flag_as_deleted(a_uids);
       else
@@ -2027,99 +2627,163 @@ function rcube_webmail()
 
       return true;
     }
-    
-    var all_deleted = true;
-    for (var i=0; i<a_uids.length; i++)
-    {
+
+    var uid, all_deleted = true;
+    for (var i=0, len=a_uids.length; i<len; i++) {
       uid = a_uids[i];
-      if (rows[uid]) {
-        if (!rows[uid].deleted)
-        {
-          all_deleted = false;
-          break;
-        }
+      if (rows[uid] && !rows[uid].deleted) {
+        all_deleted = false;
+        break;
       }
     }
-    
+
     if (all_deleted)
       this.flag_as_undeleted(a_uids);
     else
       this.flag_as_deleted(a_uids);
-    
+
     return true;
   };
 
   this.flag_as_undeleted = function(a_uids)
   {
-    for (var i=0; i<a_uids.length; i++)
+    for (var i=0, len=a_uids.length; i<len; i++)
       this.set_message(a_uids[i], 'deleted', false);
 
-    this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag=undelete');
+    var url = '_uid='+this.uids_to_list(a_uids)+'&_flag=undelete',
+      lock = this.display_message(this.get_label('markingmessage'), 'loading');
+
+    // also send search request to get the right messages
+    if (this.env.search_request)
+      url += '&_search='+this.env.search_request;
+
+    this.http_post('mark', url, lock);
     return true;
   };
 
   this.flag_as_deleted = function(a_uids)
   {
-    var add_url = '';
-    var r_uids = new Array();
-    var rows = this.message_list ? this.message_list.rows : new Array();
-    
-    for (var i=0; i<a_uids.length; i++)
-      {
+    var add_url = '',
+      r_uids = [],
+      rows = this.message_list ? this.message_list.rows : [],
+      count = 0;
+
+    for (var i=0, len=a_uids.length; i<len; i++) {
       uid = a_uids[i];
-      if (rows[uid])
-        {
+      if (rows[uid]) {
         if (rows[uid].unread)
           r_uids[r_uids.length] = uid;
 
-       if (this.env.skip_deleted)
+           if (this.env.skip_deleted) {
+             count += this.update_thread(uid);
           this.message_list.remove_row(uid, (this.env.display_next && i == this.message_list.selection.length-1));
-       else
-         this.set_message(uid, 'deleted', true);
-        }
+           }
+           else
+             this.set_message(uid, 'deleted', true);
       }
+    }
 
     // make sure there are no selected rows
-    if (this.env.skip_deleted && !this.env.display_next && this.message_list)
-      this.message_list.clear_selection();
+    if (this.env.skip_deleted && this.message_list) {
+      if(!this.env.display_next)
+        this.message_list.clear_selection();
+      if (count < 0)
+        add_url += '&_count='+(count*-1);
+      else if (count > 0) 
+        // remove threads from the end of the list
+        this.delete_excessive_thread_rows();
+    }
 
-    add_url = '&_from='+(this.env.action ? this.env.action : '');
-    
+    add_url = '&_from='+(this.env.action ? this.env.action : ''),
+      lock = this.display_message(this.get_label('markingmessage'), 'loading');
+
+    // ??
     if (r_uids.length)
-      add_url += '&_ruid='+r_uids.join(',');
+      add_url += '&_ruid='+this.uids_to_list(r_uids);
 
     if (this.env.skip_deleted) {
-      // also send search request to get the right messages 
-      if (this.env.search_request) 
-        add_url += '&_search='+this.env.search_request;
       if (this.env.display_next && this.env.next_uid)
         add_url += '&_next_uid='+this.env.next_uid;
     }
-    
-    this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag=delete'+add_url);
-    return true;  
+
+    // also send search request to get the right messages
+    if (this.env.search_request)
+      add_url += '&_search='+this.env.search_request;
+
+    this.http_post('mark', '_uid='+this.uids_to_list(a_uids)+'&_flag=delete'+add_url, lock);
+    return true;
   };
 
   // flag as read without mark request (called from backend)
   // argument should be a coma-separated list of uids
   this.flag_deleted_as_read = function(uids)
   {
-    var icn_src;
-    var rows = this.message_list ? this.message_list.rows : new Array();
-    var str = String(uids);
-    var a_uids = new Array();
-
-    a_uids = str.split(',');
+    var icn_src, uid,
+      rows = this.message_list ? this.message_list.rows : [],
+      str = String(uids),
+      a_uids = str.split(',');
 
-    for (var uid, i=0; i<a_uids.length; i++)
-      {
+    for (var i=0; i<a_uids.length; i++) {
       uid = a_uids[i];
       if (rows[uid])
         this.set_message(uid, 'unread', false);
-      }
+    }
+  };
+
+  // Converts array of message UIDs to comma-separated list for use in URL
+  // with select_all mode checking
+  this.uids_to_list = function(uids)
+  {
+    return this.select_all_mode ? '*' : uids.join(',');
+  };
+
+
+  /*********************************************************/
+  /*********       mailbox folders methods         *********/
+  /*********************************************************/
+
+  this.expunge_mailbox = function(mbox)
+  {
+    var lock = false,
+      url = '_mbox='+urlencode(mbox);
+
+    // lock interface if it's the active mailbox
+    if (mbox == this.env.mailbox) {
+       lock = this.set_busy(true, 'loading');
+       url += '&_reload=1';
+     }
+
+    // send request to server
+    this.http_post('expunge', url, lock);
+  };
+
+  this.purge_mailbox = function(mbox)
+  {
+    var lock = false,
+      url = '_mbox='+urlencode(mbox);
+
+    if (!confirm(this.get_label('purgefolderconfirm')))
+      return false;
+
+    // lock interface if it's the active mailbox
+    if (mbox == this.env.mailbox) {
+       lock = this.set_busy(true, 'loading');
+       url += '&_reload=1';
+     }
+
+    // send request to server
+    this.http_post('purge', url, lock);
+  };
+
+  // test if purge command is allowed
+  this.purge_mailbox_test = function()
+  {
+    return (this.env.messagecount && (this.env.mailbox == this.env.trash_mailbox || this.env.mailbox == this.env.junk_mailbox
+      || this.env.mailbox.match('^' + RegExp.escape(this.env.trash_mailbox) + RegExp.escape(this.env.delimiter))
+      || this.env.mailbox.match('^' + RegExp.escape(this.env.junk_mailbox) + RegExp.escape(this.env.delimiter))));
   };
-  
-  
+
+
   /*********************************************************/
   /*********           login form methods          *********/
   /*********************************************************/
@@ -2135,7 +2799,7 @@ function rcube_webmail()
       passwd.focus();
       return rcube_event.cancel(e);
     }
-    
+
     return true;
   };
 
@@ -2143,34 +2807,82 @@ function rcube_webmail()
   /*********************************************************/
   /*********        message compose methods        *********/
   /*********************************************************/
-  
+
+  // init message compose form: set focus and eventhandlers
+  this.init_messageform = function()
+  {
+    if (!this.gui_objects.messageform)
+      return false;
+
+    var input_from = $("[name='_from']"),
+      input_to = $("[name='_to']"),
+      input_subject = $("input[name='_subject']"),
+      input_message = $("[name='_message']").get(0),
+      html_mode = $("input[name='_is_html']").val() == '1',
+      ac_fields = ['cc', 'bcc', 'replyto', 'followupto'];
+
+    // init live search events
+    this.init_address_input_events(input_to);
+    for (var i in ac_fields) {
+      this.init_address_input_events($("[name='_"+ac_fields[i]+"']"));
+    }
+
+    if (!html_mode) {
+      this.set_caret_pos(input_message, this.env.top_posting ? 0 : $(input_message).val().length);
+      // add signature according to selected identity
+      // if we have HTML editor, signature is added in callback
+      if (input_from.attr('type') == 'select-one' && $("input[name='_draft_saveid']").val() == '') {
+        this.change_identity(input_from[0]);
+      }
+    }
+
+    if (input_to.val() == '')
+      input_to.focus();
+    else if (input_subject.val() == '')
+      input_subject.focus();
+    else if (input_message)
+      input_message.focus();
+
+    this.env.compose_focus_elem = document.activeElement;
+
+    // get summary of all field values
+    this.compose_field_hash(true);
+
+    // start the auto-save timer
+    this.auto_save_start();
+  };
+
+  this.init_address_input_events = function(obj)
+  {
+    obj[bw.ie || bw.safari || bw.chrome ? 'keydown' : 'keypress'](function(e){ return ref.ksearch_keydown(e, this); })
+      .attr('autocomplete', 'off');
+  };
+
   // checks the input fields before sending a message
   this.check_compose_input = function()
-    {
+  {
     // check input fields
-    var input_to = $("[name='_to']");
-    var input_cc = $("[name='_cc']");
-    var input_bcc = $("[name='_bcc']");
-    var input_from = $("[name='_from']");
-    var input_subject = $("[name='_subject']");
-    var input_message = $("[name='_message']");
+    var ed, input_to = $("[name='_to']"),
+      input_cc = $("[name='_cc']"),
+      input_bcc = $("[name='_bcc']"),
+      input_from = $("[name='_from']"),
+      input_subject = $("[name='_subject']"),
+      input_message = $("[name='_message']");
 
     // check sender (if have no identities)
-    if (input_from.attr('type') == 'text' && !rcube_check_email(input_from.val(), true))
-      {
+    if (input_from.attr('type') == 'text' && !rcube_check_email(input_from.val(), true)) {
       alert(this.get_label('nosenderwarning'));
       input_from.focus();
       return false;
-      }
+    }
 
     // check for empty recipient
     var recipients = input_to.val() ? input_to.val() : (input_cc.val() ? input_cc.val() : input_bcc.val());
-    if (!rcube_check_email(recipients.replace(/^\s+/, '').replace(/[\s,;]+$/, ''), true))
-      {
+    if (!rcube_check_email(recipients.replace(/^\s+/, '').replace(/[\s,;]+$/, ''), true)) {
       alert(this.get_label('norecipientwarning'));
       input_to.focus();
       return false;
-      }
+    }
 
     // check if all files has been uploaded
     for (var key in this.env.attachments) {
@@ -2179,97 +2891,121 @@ function rcube_webmail()
         return false;
       }
     }
-    
+
     // display localized warning for missing subject
-    if (input_subject.val() == '')
-      {
+    if (input_subject.val() == '') {
       var subject = prompt(this.get_label('nosubjectwarning'), this.get_label('nosubject'));
 
       // user hit cancel, so don't send
-      if (!subject && subject !== '')
-        {
+      if (!subject && subject !== '') {
         input_subject.focus();
         return false;
-        }
+      }
       else
-        {
         input_subject.val((subject ? subject : this.get_label('nosubject')));
-        }
-      }
+    }
+
+    // Apply spellcheck changes if spell checker is active
+    this.stop_spellchecking();
+
+    if (window.tinyMCE)
+      ed = tinyMCE.get(this.env.composebody);
 
     // check for empty body
-    if ((!window.tinyMCE || !tinyMCE.get(this.env.composebody))
-       && input_message.val() == '' && !confirm(this.get_label('nobodywarning')))
-      {
+    if (!ed && input_message.val() == '' && !confirm(this.get_label('nobodywarning'))) {
       input_message.focus();
       return false;
+    }
+    else if (ed) {
+      if (!ed.getContent() && !confirm(this.get_label('nobodywarning'))) {
+        ed.focus();
+        return false;
       }
-    else if (window.tinyMCE && tinyMCE.get(this.env.composebody)
-       && !tinyMCE.get(this.env.composebody).getContent()
-       && !confirm(this.get_label('nobodywarning')))
-      {
-      tinyMCE.get(this.env.composebody).focus();
-      return false;
-      }
+      // move body from html editor to textarea (just to be sure, #1485860)
+      tinyMCE.triggerSave();
+    }
 
-    // Apply spellcheck changes if spell checker is active
-    this.stop_spellchecking();
+    return true;
+  };
 
-    // move body from html editor to textarea (just to be sure, #1485860)
-    if (window.tinyMCE && tinyMCE.get(this.env.composebody))
-      tinyMCE.triggerSave();
+  this.toggle_editor = function(props)
+  {
+    if (props.mode == 'html') {
+      this.display_spellcheck_controls(false);
+      this.plain2html($('#'+props.id).val(), props.id);
+      tinyMCE.execCommand('mceAddControl', false, props.id);
+    }
+    else {
+      var thisMCE = tinyMCE.get(props.id), existingHtml;
+      if (thisMCE.plugins.spellchecker && thisMCE.plugins.spellchecker.active)
+        thisMCE.execCommand('mceSpellCheck', false);
+
+      if (existingHtml = thisMCE.getContent()) {
+        if (!confirm(this.get_label('editorwarning'))) {
+          return false;
+        }
+        this.html2plain(existingHtml, props.id);
+      }
+      tinyMCE.execCommand('mceRemoveControl', false, props.id);
+      this.display_spellcheck_controls(true);
+    }
 
     return true;
-    };
+  };
 
   this.stop_spellchecking = function()
-    {
-    if (this.env.spellcheck && !this.spellcheck_ready) {
-      $(this.env.spellcheck.spell_span).trigger('click');
+  {
+    var ed;
+    if (window.tinyMCE && (ed = tinyMCE.get(this.env.composebody))) {
+      if (ed.plugins.spellchecker && ed.plugins.spellchecker.active)
+        ed.execCommand('mceSpellCheck');
+    }
+    else if ((ed = this.env.spellcheck) && !this.spellcheck_ready) {
+      $(ed.spell_span).trigger('click');
       this.set_spellcheck_state('ready');
-      }
-    };
+    }
+  };
 
   this.display_spellcheck_controls = function(vis)
-    {
+  {
     if (this.env.spellcheck) {
       // stop spellchecking process
       if (!vis)
-       this.stop_spellchecking();
+        this.stop_spellchecking();
 
       $(this.env.spellcheck.spell_container).css('visibility', vis ? 'visible' : 'hidden');
-      }
-    };
+    }
+  };
 
   this.set_spellcheck_state = function(s)
-    {
+  {
     this.spellcheck_ready = (s == 'ready' || s == 'no_error_found');
     this.enable_command('spellcheck', this.spellcheck_ready);
-    };
+  };
 
   this.set_draft_id = function(id)
-    {
+  {
     $("input[name='_draft_saveid']").val(id);
-    };
+  };
 
   this.auto_save_start = function()
-    {
+  {
     if (this.env.draft_autosave)
       this.save_timer = self.setTimeout(function(){ ref.command("savedraft"); }, this.env.draft_autosave * 1000);
 
     // Unlock interface now that saving is complete
     this.busy = false;
-    };
+  };
 
   this.compose_field_hash = function(save)
-    {
+  {
     // check input fields
     var value_to = $("[name='_to']").val();
     var value_cc = $("[name='_cc']").val();
     var value_bcc = $("[name='_bcc']").val();
     var value_subject = $("[name='_subject']").val();
     var str = '';
-    
+
     if (value_to)
       str += value_to+':';
     if (value_cc)
@@ -2278,7 +3014,7 @@ function rcube_webmail()
       str += value_bcc+':';
     if (value_subject)
       str += value_subject+':';
-    
+
     var editor = tinyMCE.get(this.env.composebody);
     if (editor)
       str += editor.getContent();
@@ -2293,167 +3029,164 @@ function rcube_webmail()
       this.cmp_hash = str;
 
     return str;
-    };
-    
-  this.change_identity = function(obj)
-    {
+  };
+
+  this.change_identity = function(obj, show_sig)
+  {
     if (!obj || !obj.options)
       return false;
 
-    var id = obj.options[obj.selectedIndex].value;
-    var input_message = $("[name='_message']");
-    var message = input_message.val();
-    var is_html = ($("input[name='_is_html']").val() == '1');
-    var sig, p, len;
-
-    if (!this.env.identity)
-      this.env.identity = id
-  
-    if (!is_html)
-      {
+    if (!show_sig)
+      show_sig = this.env.show_sig;
+
+    var cursor_pos, p = -1,
+      id = obj.options[obj.selectedIndex].value,
+      input_message = $("[name='_message']"),
+      message = input_message.val(),
+      is_html = ($("input[name='_is_html']").val() == '1'),
+      sig = this.env.identity,
+      sig_separator = this.env.sig_above && (this.env.compose_mode == 'reply' || this.env.compose_mode == 'forward') ? '---' : '-- ';
+
+    // enable manual signature insert
+    if (this.env.signatures && this.env.signatures[id]) {
+      this.enable_command('insert-sig', true);
+      this.env.compose_commands.push('insert-sig');
+    }
+    else
+      this.enable_command('insert-sig', false);
+
+    if (!is_html) {
       // remove the 'old' signature
-      if (this.env.identity && this.env.signatures && this.env.signatures[this.env.identity])
-        {
-        if (this.env.signatures[this.env.identity]['is_html'])
-          sig = this.env.signatures[this.env.identity]['plain_text'];
-        else
-          sig = this.env.signatures[this.env.identity]['text'];
-        
-        if (sig.indexOf('-- ')!=0)
-          sig = '-- \n'+sig;
-
-        p = message.lastIndexOf(sig);
-        if (p>=0)
-          message = message.substring(0, p-1) + message.substring(p+sig.length, message.length);
-        }
+      if (show_sig && sig && this.env.signatures && this.env.signatures[sig]) {
+
+        sig = this.env.signatures[sig].is_html ? this.env.signatures[sig].plain_text : this.env.signatures[sig].text;
+        sig = sig.replace(/\r\n/g, '\n');
 
-      message = message.replace(/[\r\n]+$/, '');
-      len = message.length;
+        if (!sig.match(/^--[ -]\n/))
+          sig = sig_separator + '\n' + sig;
 
+        p = this.env.sig_above ? message.indexOf(sig) : message.lastIndexOf(sig);
+        if (p >= 0)
+          message = message.substring(0, p) + message.substring(p+sig.length, message.length);
+      }
       // add the new signature string
-      if (this.env.signatures && this.env.signatures[id])
-        {
-        sig = this.env.signatures[id]['text'];
-        if (this.env.signatures[id]['is_html'])
-          {
-          sig = this.env.signatures[id]['plain_text'];
+      if (show_sig && this.env.signatures && this.env.signatures[id]) {
+        sig = this.env.signatures[id]['is_html'] ? this.env.signatures[id]['plain_text'] : this.env.signatures[id]['text'];
+        sig = sig.replace(/\r\n/g, '\n');
+
+        if (!sig.match(/^--[ -]\n/))
+          sig = sig_separator + '\n' + sig;
+
+        if (this.env.sig_above) {
+          if (p >= 0) { // in place of removed signature
+            message = message.substring(0, p) + sig + message.substring(p, message.length);
+            cursor_pos = p - 1;
+          }
+          else if (pos = this.get_caret_pos(input_message.get(0))) { // at cursor position
+            message = message.substring(0, pos) + '\n' + sig + '\n\n' + message.substring(pos, message.length);
+            cursor_pos = pos;
+          }
+          else { // on top
+            cursor_pos = 0;
+            message = '\n\n' + sig + '\n\n' + message.replace(/^[\r\n]+/, '');
           }
-        if (sig.indexOf('-- ')!=0)
-          sig = '-- \n'+sig;
-        message += '\n\n'+sig;
-       if (len) len += 1;
+        }
+        else {
+          message = message.replace(/[\r\n]+$/, '');
+          cursor_pos = !this.env.top_posting && message.length ? message.length+1 : 0;
+          message += '\n\n' + sig;
         }
       }
-    else
-      {
-      var editor = tinyMCE.get(this.env.composebody);
+      else
+        cursor_pos = this.env.top_posting ? 0 : message.length;
 
-      if (this.env.signatures)
-        {
-        // Append the signature as a div within the body
-        var sigElem = editor.dom.get('_rc_sig');
-        var newsig = '';
-        var htmlsig = true;
-
-        if (!sigElem)
-          {
-          // add empty line before signature on IE
-          if (bw.ie)
-            editor.getBody().appendChild(editor.getDoc().createElement('br'));
-
-          sigElem = editor.getDoc().createElement('div');
-          sigElem.setAttribute('id', '_rc_sig');
-          editor.getBody().appendChild(sigElem);
-          }
+      input_message.val(message);
 
-        if (this.env.signatures[id])
-        {
-          newsig = this.env.signatures[id]['text'];
-          htmlsig = this.env.signatures[id]['is_html'];
-
-          if (newsig) {
-            if (htmlsig && this.env.signatures[id]['plain_text'].indexOf('-- ')!=0)
-              newsig = '<p>-- </p>' + newsig;
-            else if (!htmlsig && newsig.indexOf('-- ')!=0)
-              newsig = '-- \n' + newsig;
+      // move cursor before the signature
+      this.set_caret_pos(input_message.get(0), cursor_pos);
+    }
+    else if (show_sig && this.env.signatures) {  // html
+      var editor = tinyMCE.get(this.env.composebody),
+        sigElem = editor.dom.get('_rc_sig');
+
+      // Append the signature as a div within the body
+      if (!sigElem) {
+        var body = editor.getBody(),
+          doc = editor.getDoc();
+
+        sigElem = doc.createElement('div');
+        sigElem.setAttribute('id', '_rc_sig');
+
+        if (this.env.sig_above) {
+          // if no existing sig and top posting then insert at caret pos
+          editor.getWin().focus(); // correct focus in IE & Chrome
+
+          var node = editor.selection.getNode();
+          if (node.nodeName == 'BODY') {
+            // no real focus, insert at start
+            body.insertBefore(sigElem, body.firstChild);
+            body.insertBefore(doc.createElement('br'), body.firstChild);
+          }
+          else {
+            body.insertBefore(sigElem, node.nextSibling);
+            body.insertBefore(doc.createElement('br'), node.nextSibling);
           }
         }
+        else {
+          if (bw.ie)  // add empty line before signature on IE
+            body.appendChild(doc.createElement('br'));
 
-        if (htmlsig)
-          sigElem.innerHTML = newsig;
-        else
-          sigElem.innerHTML = '<pre>' + newsig + '</pre>';
+          body.appendChild(sigElem);
         }
       }
 
-    input_message.val(message);
-
-    // move cursor before the signature
-    if (!is_html)
-      this.set_caret_pos(input_message.get(0), len);
-
-    this.env.identity = id;
-    return true;
-    };
-
-  this.show_attachment_form = function(a)
-    {
-    if (!this.gui_objects.uploadbox)
-      return false;
-      
-    var elm, list;
-    if (elm = this.gui_objects.uploadbox)
-      {
-      if (a && (list = this.gui_objects.attachmentlist))
-        {
-        var pos = $(list).offset();
-        elm.style.top = (pos.top + list.offsetHeight + 10) + 'px';
-        elm.style.left = pos.left + 'px';
+      if (this.env.signatures[id]) {
+        if (this.env.signatures[id].is_html) {
+          sig = this.env.signatures[id].text;
+          if (!this.env.signatures[id].plain_text.match(/^--[ -]\r?\n/))
+            sig = sig_separator + '<br />' + sig;
         }
-      
-      elm.style.visibility = a ? 'visible' : 'hidden';
+        else {
+          sig = this.env.signatures[id].text;
+          if (!sig.match(/^--[ -]\r?\n/))
+            sig = sig_separator + '\n' + sig;
+          sig = '<pre>' + sig + '</pre>';
+        }
+
+        sigElem.innerHTML = sig;
       }
-      
-    // clear upload form
-    try {
-      if (!a && this.gui_objects.attachmentform != this.gui_objects.messageform)
-        this.gui_objects.attachmentform.reset();
     }
-    catch(e){}  // ignore errors
-    
+
+    this.env.identity = id;
     return true;
-    };
+  };
 
   // upload attachment file
   this.upload_file = function(form)
-    {
+  {
     if (!form)
       return false;
-      
+
     // get file input fields
     var send = false;
     for (var n=0; n<form.elements.length; n++)
-      if (form.elements[n].type=='file' && form.elements[n].value)
-        {
+      if (form.elements[n].type=='file' && form.elements[n].value) {
         send = true;
         break;
-        }
-    
+      }
+
     // create hidden iframe and post upload form
-    if (send)
-      {
+    if (send) {
       var ts = new Date().getTime();
       var frame_name = 'rcmupload'+ts;
 
       // have to do it this way for IE
       // otherwise the form will be posted to a new window
-      if(document.all)
-        {
+      if (document.all) {
         var html = '<iframe name="'+frame_name+'" src="program/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>';
         document.body.insertAdjacentHTML('BeforeEnd',html);
-        }
-      else  // for standards-compilant browsers
-        {
+      }
+      else { // for standards-compilant browsers
         var frame = document.createElement('iframe');
         frame.name = frame_name;
         frame.style.border = 'none';
@@ -2461,23 +3194,23 @@ function rcube_webmail()
         frame.style.height = 0;
         frame.style.visibility = 'hidden';
         document.body.appendChild(frame);
-        }
+      }
 
       // handle upload errors, parsing iframe content in onload
-      var fr = document.getElementsByName(frame_name)[0];
-      $(fr).bind('load', {ts:ts}, function(e) {
-        var content = '';
+      $(frame_name).bind('load', {ts:ts}, function(e) {
+        var d, content = '';
         try {
           if (this.contentDocument) {
-            var d = this.contentDocument;
+            d = this.contentDocument;
           } else if (this.contentWindow) {
-            var d = this.contentWindow.document;
+            d = this.contentWindow.document;
           }
           content = d.childNodes[0].innerHTML;
         } catch (e) {}
 
-        if (!String(content).match(/add2attachment/) && (!bw.opera || (rcmail.env.uploadframe && rcmail.env.uploadframe == e.data.ts))) {
-          rcmail.display_message(rcmail.get_label('fileuploaderror'), 'error');
+        if (!content.match(/add2attachment/) && (!bw.opera || (rcmail.env.uploadframe && rcmail.env.uploadframe == e.data.ts))) {
+          if (!content.match(/display_message/))
+            rcmail.display_message(rcmail.get_label('fileuploaderror'), 'error');
           rcmail.remove_from_attachment_list(e.data.ts);
         }
         // Opera hack: handle double onload
@@ -2489,9 +3222,7 @@ function rcube_webmail()
       form.action = this.env.comm_path+'&_action=upload&_uploadid='+ts;
       form.setAttribute('enctype', 'multipart/form-data');
       form.submit();
-      
-      // hide upload form
-      this.show_attachment_form(false);
+
       // display upload indicator and cancel button
       var content = this.get_label('uploading');
       if (this.env.loadingicon)
@@ -2499,12 +3230,12 @@ function rcube_webmail()
       if (this.env.cancelicon)
         content = '<a title="'+this.get_label('cancel')+'" onclick="return rcmail.cancel_attachment_upload(\''+ts+'\', \''+frame_name+'\');" href="#cancelupload"><img src="'+this.env.cancelicon+'" alt="" /></a>'+content;
       this.add2attachment_list(ts, { name:'', html:content, complete:false });
-      }
-    
+    }
+
     // set reference to the form object
     this.gui_objects.attachmentform = form;
     return true;
-    };
+  };
 
   // add file name to attachment list
   // called from upload page
@@ -2512,10 +3243,10 @@ function rcube_webmail()
   {
     if (!this.gui_objects.attachmentlist)
       return false;
-    
+
     var li = $('<li>').attr('id', name).html(att.html);
     var indicator;
-    
+
     // replace indicator's li
     if (upload_id && (indicator = document.getElementById(upload_id))) {
       li.replaceAll(indicator);
@@ -2523,12 +3254,12 @@ function rcube_webmail()
     else { // add new li
       li.appendTo(this.gui_objects.attachmentlist);
     }
-    
+
     if (upload_id && this.env.attachments[upload_id])
       delete this.env.attachments[upload_id];
-    
+
     this.env.attachments[name] = att;
-    
+
     return true;
   };
 
@@ -2536,7 +3267,7 @@ function rcube_webmail()
   {
     if (this.env.attachments[name])
       delete this.env.attachments[name];
-    
+
     if (!this.gui_objects.attachmentlist)
       return false;
 
@@ -2547,80 +3278,84 @@ function rcube_webmail()
   };
 
   this.remove_attachment = function(name)
-    {
+  {
     if (name && this.env.attachments[name])
       this.http_post('remove-attachment', '_file='+urlencode(name));
 
     return true;
-    };
+  };
 
   this.cancel_attachment_upload = function(name, frame_name)
-    {
+  {
     if (!name || !frame_name)
       return false;
 
     this.remove_from_attachment_list(name);
     $("iframe[name='"+frame_name+"']").remove();
     return false;
-    };
+  };
 
   // send remote request to add a new contact
   this.add_contact = function(value)
-    {
+  {
     if (value)
       this.http_post('addcontact', '_address='+value);
-    
+
     return true;
-    };
+  };
 
   // send remote request to search mail or contacts
   this.qsearch = function(value)
-    {
-    if (value != '')
-      {
+  {
+    if (value != '') {
       var addurl = '';
       if (this.message_list) {
-        this.message_list.clear();
+        this.clear_message_list();
         if (this.env.search_mods) {
-          var head_arr = new Array();
-          for (var n in this.env.search_mods)
-            head_arr.push(n);
-          addurl += '&_headers='+head_arr.join(',');
+          var mods = this.env.search_mods[this.env.mailbox] ? this.env.search_mods[this.env.mailbox] : this.env.search_mods['*'];
+          if (mods) {
+            var head_arr = [];
+            for (var n in mods)
+              head_arr.push(n);
+            addurl += '&_headers='+head_arr.join(',');
           }
-        } else if (this.contact_list) {
+        }
+      } else if (this.contact_list) {
         this.contact_list.clear(true);
         this.show_contentframe(false);
-        }
+      }
 
       if (this.gui_objects.search_filter)
         addurl += '&_filter=' + this.gui_objects.search_filter.value;
 
       // reset vars
       this.env.current_page = 1;
-      this.set_busy(true, 'searching');
+      var lock = this.set_busy(true, 'searching');
       this.http_request('search', '_q='+urlencode(value)
         + (this.env.mailbox ? '&_mbox='+urlencode(this.env.mailbox) : '')
         + (this.env.source ? '&_source='+urlencode(this.env.source) : '')
-        + (addurl ? addurl : ''), true);
-      }
+        + (this.env.group ? '&_gid='+urlencode(this.env.group) : '')
+        + (addurl ? addurl : ''), lock);
+    }
     return true;
-    };
+  };
 
   // reset quick-search form
   this.reset_qsearch = function()
-    {
+  {
     if (this.gui_objects.qsearchbox)
       this.gui_objects.qsearchbox.value = '';
-      
+
     this.env.search_request = null;
     return true;
-    };
+  };
 
   this.sent_successfully = function(type, msg)
-    {
-    this.list_mailbox();
-    this.display_message(msg, type, true);
-    }
+  {
+    this.display_message(msg, type);
+    // before redirect we need to wait some time for Chrome (#1486177)
+    window.setTimeout(function(){ ref.list_mailbox(); }, 500);
+  };
 
 
   /*********************************************************/
@@ -2628,7 +3363,7 @@ function rcube_webmail()
   /*********************************************************/
 
   // handler for keyboard events on address-fields
-  this.ksearch_keypress = function(e, obj)
+  this.ksearch_keydown = function(e, obj)
   {
     if (this.ksearch_timer)
       clearTimeout(this.ksearch_timer);
@@ -2637,29 +3372,28 @@ function rcube_webmail()
     var key = rcube_event.get_keycode(e);
     var mod = rcube_event.get_modifier(e);
 
-    switch (key)
-      {
+    switch (key) {
       case 38:  // key up
       case 40:  // key down
         if (!this.ksearch_pane)
           break;
-          
+
         var dir = key==38 ? 1 : 0;
-        
+
         highlight = document.getElementById('rcmksearchSelected');
         if (!highlight)
           highlight = this.ksearch_pane.__ul.firstChild;
-        
+
         if (highlight)
           this.ksearch_select(dir ? highlight.previousSibling : highlight.nextSibling);
 
         return rcube_event.cancel(e);
 
       case 9:  // tab
-        if(mod == SHIFT_KEY)
+        if (mod == SHIFT_KEY)
           break;
 
-      case 13:  // enter
+     case 13:  // enter
         if (this.ksearch_selected===null || !this.ksearch_input || !this.ksearch_value)
           break;
 
@@ -2672,20 +3406,20 @@ function rcube_webmail()
       case 27:  // escape
         this.ksearch_hide();
         break;
-      
+
       case 37:  // left
       case 39:  // right
         if (mod != SHIFT_KEY)
-         return;
-      }
+             return;
+    }
 
     // start timer
     this.ksearch_timer = window.setTimeout(function(){ ref.ksearch_get_results(); }, 200);
     this.ksearch_input = obj;
-    
+
     return true;
   };
-  
+
   this.ksearch_select = function(node)
   {
     var current = $('#rcmksearchSelected');
@@ -2703,16 +3437,27 @@ function rcube_webmail()
   {
     if (!this.env.contacts[id] || !this.ksearch_input)
       return;
-    
+
     // get cursor pos
-    var inp_value = this.ksearch_input.value;
-    var cpos = this.get_caret_pos(this.ksearch_input);
-    var p = inp_value.lastIndexOf(this.ksearch_value, cpos);
-
-    // replace search string with full address
-    var pre = this.ksearch_input.value.substring(0, p);
-    var end = this.ksearch_input.value.substring(p+this.ksearch_value.length, this.ksearch_input.value.length);
-    var insert  = this.env.contacts[id]+', ';
+    var inp_value = this.ksearch_input.value,
+      cpos = this.get_caret_pos(this.ksearch_input),
+      p = inp_value.lastIndexOf(this.ksearch_value, cpos),
+      insert = '',
+
+      // replace search string with full address
+      pre = inp_value.substring(0, p),
+      end = inp_value.substring(p+this.ksearch_value.length, inp_value.length);
+
+    // insert all members of a group
+    if (typeof this.env.contacts[id] == 'object' && this.env.contacts[id].id) {
+      insert += this.env.contacts[id].name + ', ';
+      this.group2expand = $.extend({}, this.env.contacts[id]);
+      this.group2expand.input = this.ksearch_input;
+      this.http_request('group-expand', '_source='+urlencode(this.env.contacts[id].source)+'&_gid='+urlencode(this.env.contacts[id].id), false);
+    }
+    else if (typeof this.env.contacts[id] == 'string')
+      insert = this.env.contacts[id] + ', ';
+
     this.ksearch_input.value = pre + insert + end;
 
     // set caret to insert pos
@@ -2721,31 +3466,53 @@ function rcube_webmail()
       this.ksearch_input.setSelectionRange(cpos, cpos);
   };
 
+  this.replace_group_recipients = function(id, recipients)
+  {
+    if (this.group2expand && this.group2expand.id == id) {
+      this.group2expand.input.value = this.group2expand.input.value.replace(this.group2expand.name, recipients);
+      this.group2expand = null;
+    }
+  };
+
   // address search processor
   this.ksearch_get_results = function()
   {
     var inp_value = this.ksearch_input ? this.ksearch_input.value : null;
+
     if (inp_value === null)
       return;
-      
+
     if (this.ksearch_pane && this.ksearch_pane.is(":visible"))
       this.ksearch_pane.hide();
 
     // get string from current cursor pos to last comma
-    var cpos = this.get_caret_pos(this.ksearch_input);
-    var p = inp_value.lastIndexOf(',', cpos-1);
-    var q = inp_value.substring(p+1, cpos);
+    var cpos = this.get_caret_pos(this.ksearch_input),
+      p = inp_value.lastIndexOf(',', cpos-1),
+      q = inp_value.substring(p+1, cpos),
+      min = this.env.autocomplete_min_length;
 
     // trim query string
-    q = q.replace(/(^\s+|\s+$)/g, '');
+    q = $.trim(q);
 
     // Don't (re-)search if the last results are still active
     if (q == this.ksearch_value)
       return;
-    
+
+    if (q.length < min) {
+      if (!this.env.acinfo) {
+        var label = this.get_label('autocompletechars');
+        label = label.replace('$min', min);
+        this.env.acinfo = this.display_message(label);
+      }
+      return;
+    }
+    else if (this.env.acinfo && q.length == min) {
+      this.hide_message(this.env.acinfo);
+    }
+
     var old_value = this.ksearch_value;
     this.ksearch_value = q;
-    
+
     // ...string is empty
     if (!q.length)
       return;
@@ -2753,9 +3520,9 @@ function rcube_webmail()
     // ...new search value contains old one and previous search result was empty
     if (old_value && old_value.length && this.env.contacts && !this.env.contacts.length && q.indexOf(old_value) == 0)
       return;
-    
-    this.display_message(this.get_label('searching'), 'loading', true);
-    this.http_post('autocomplete', '_search='+urlencode(q));
+
+    var lock = this.display_message(this.get_label('searching'), 'loading');
+    this.http_post('autocomplete', '_search='+urlencode(q), lock);
   };
 
   this.ksearch_query_results = function(results, search)
@@ -2763,8 +3530,7 @@ function rcube_webmail()
     // ignore this outdated search response
     if (this.ksearch_value && search != this.ksearch_value)
       return;
-      
-    this.hide_message();
+
     this.env.contacts = results ? results : [];
     this.ksearch_display_results(this.env.contacts);
   };
@@ -2772,9 +3538,9 @@ function rcube_webmail()
   this.ksearch_display_results = function (a_results)
   {
     // display search results
-    if (a_results.length && this.ksearch_input) {
-      var p, ul, li;
-      
+    if (a_results.length && this.ksearch_input && this.ksearch_value) {
+      var p, ul, li, text, s_val = this.ksearch_value;
+
       // create results pane if not present
       if (!this.ksearch_pane) {
         ul = $('<ul>');
@@ -2785,11 +3551,12 @@ function rcube_webmail()
       // remove all search results
       ul = this.ksearch_pane.__ul;
       ul.innerHTML = '';
-            
+
       // add each result line to list
-      for (i=0; i<a_results.length; i++) {
+      for (i=0; i < a_results.length; i++) {
+        text = typeof a_results[i] == 'object' ? a_results[i].name : a_results[i];
         li = document.createElement('LI');
-        li.innerHTML = a_results[i].replace(new RegExp('('+this.ksearch_value+')', 'ig'), '##$1%%').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/##([^%]+)%%/g, '<b>$1</b>');
+        li.innerHTML = text.replace(new RegExp('('+RegExp.escape(s_val)+')', 'ig'), '##$1%%').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/##([^%]+)%%/g, '<b>$1</b>');
         li.onmouseover = function(){ ref.ksearch_select(this); };
         li.onmouseup = function(){ ref.ksearch_click(this) };
         li._rcm_id = i;
@@ -2808,7 +3575,7 @@ function rcube_webmail()
     else
       this.ksearch_hide();
   };
-  
+
   this.ksearch_click = function(node)
   {
     if (this.ksearch_input)
@@ -2819,24 +3586,23 @@ function rcube_webmail()
   };
 
   this.ksearch_blur = function()
-    {
+  {
     if (this.ksearch_timer)
       clearTimeout(this.ksearch_timer);
 
     this.ksearch_value = '';
     this.ksearch_input = null;
-    
     this.ksearch_hide();
-    };
+  };
 
 
   this.ksearch_hide = function()
-    {
+  {
     this.ksearch_selected = null;
-    
+
     if (this.ksearch_pane)
       this.ksearch_pane.hide();
-    };
+  };
 
 
   /*********************************************************/
@@ -2844,150 +3610,172 @@ function rcube_webmail()
   /*********************************************************/
 
   this.contactlist_keypress = function(list)
-    {
-      if (list.key_pressed == list.DELETE_KEY)
-        this.command('delete');
-    };
+  {
+    if (list.key_pressed == list.DELETE_KEY)
+      this.command('delete');
+  };
 
   this.contactlist_select = function(list)
-    {
-      if (this.preview_timer)
-        clearTimeout(this.preview_timer);
-
-      var id, frame, ref = this;
-      if (id = list.get_single_selection())
-        this.preview_timer = window.setTimeout(function(){ ref.load_contact(id, 'show'); }, 200);
-      else if (this.env.contentframe)
-        this.show_contentframe(false);
+  {
+    if (this.preview_timer)
+      clearTimeout(this.preview_timer);
 
-      this.enable_command('compose', list.selection.length > 0);
-      this.enable_command('edit', (id && this.env.address_sources && !this.env.address_sources[this.env.source].readonly) ? true : false);
-      this.enable_command('delete', list.selection.length && this.env.address_sources && !this.env.address_sources[this.env.source].readonly);
+    var id, frame, ref = this;
+    if (id = list.get_single_selection())
+      this.preview_timer = window.setTimeout(function(){ ref.load_contact(id, 'show'); }, 200);
+    else if (this.env.contentframe)
+      this.show_contentframe(false);
 
-      return false;
-    };
+    this.enable_command('compose', list.selection.length > 0);
+    this.enable_command('edit', (id && this.env.address_sources && !this.env.address_sources[this.env.source].readonly) ? true : false);
+    this.enable_command('delete', list.selection.length && this.env.address_sources && !this.env.address_sources[this.env.source].readonly);
+
+    return false;
+  };
+
+  this.list_contacts = function(src, group, page)
+  {
+    var add_url = '',
+      target = window;
 
-  this.list_contacts = function(src, page)
-    {
-    var add_url = '';
-    var target = window;
-    
     if (!src)
       src = this.env.source;
-    
-    if (page && this.current_page==page && src == this.env.source)
+
+    if (page && this.current_page == page && src == this.env.source && group == this.env.group)
       return false;
-      
-    if (src != this.env.source)
-      {
-      page = 1;
-      this.env.current_page = page;
+
+    if (src != this.env.source) {
+      page = this.env.current_page = 1;
       this.reset_qsearch();
-      }
+    }
+    else if (group != this.env.group)
+      page = this.env.current_page = 1;
+
+    this.select_folder((group ? 'G'+src+group : src), (this.env.group ? 'G'+this.env.source+this.env.group : this.env.source));
 
-    this.select_folder(src, this.env.source);
     this.env.source = src;
+    this.env.group = group;
 
     // load contacts remotely
-    if (this.gui_objects.contactslist)
-      {
-      this.list_contacts_remote(src, page);
+    if (this.gui_objects.contactslist) {
+      this.list_contacts_remote(src, group, page);
       return;
-      }
+    }
 
-    if (this.env.contentframe && window.frames && window.frames[this.env.contentframe])
-      {
+    if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
       target = window.frames[this.env.contentframe];
       add_url = '&_framed=1';
-      }
+    }
+
+    if (group)
+      add_url += '&_gid='+group;
+    if (page)
+      add_url += '&_page='+page;
 
     // also send search request to get the correct listing
     if (this.env.search_request)
       add_url += '&_search='+this.env.search_request;
 
     this.set_busy(true, 'loading');
-    target.location.href = this.env.comm_path+(src ? '&_source='+urlencode(src) : '')+(page ? '&_page='+page : '')+add_url;
-    };
+    target.location.href = this.env.comm_path + (src ? '&_source='+urlencode(src) : '') + add_url;
+  };
 
   // send remote request to load contacts list
-  this.list_contacts_remote = function(src, page)
-    {
+  this.list_contacts_remote = function(src, group, page)
+  {
     // clear message list first
     this.contact_list.clear(true);
     this.show_contentframe(false);
     this.enable_command('delete', 'compose', false);
 
     // send request to server
-    var url = (src ? '_source='+urlencode(src) : '') + (page ? (src?'&':'') + '_page='+page : '');
+    var url = (src ? '_source='+urlencode(src) : '') + (page ? (src?'&':'') + '_page='+page : ''),
+      lock = this.set_busy(true, 'loading');
+
     this.env.source = src;
-    
+    this.env.group = group;
+
+    if (group)
+      url += '&_gid='+group;
+
     // also send search request to get the right messages 
     if (this.env.search_request) 
       url += '&_search='+this.env.search_request;
 
-    this.set_busy(true, 'loading');
-    this.http_request('list', url, true);
-    };
+    this.http_request('list', url, lock);
+  };
 
   // load contact record
   this.load_contact = function(cid, action, framed)
-    {
-    var add_url = '';
-    var target = window;
-    if (this.env.contentframe && window.frames && window.frames[this.env.contentframe])
-      {
+  {
+    var add_url = '', target = window;
+
+    if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
       add_url = '&_framed=1';
       target = window.frames[this.env.contentframe];
       this.show_contentframe(true);
-      }
+    }
     else if (framed)
       return false;
-      
-    if (action && (cid || action=='add') && !this.drag_active)
-      {
+
+    if (action && (cid || action=='add') && !this.drag_active) {
+      if (this.env.group)
+        add_url += '&_gid='+urlencode(this.env.group);
+
       this.set_busy(true);
       target.location.href = this.env.comm_path+'&_action='+action+'&_source='+urlencode(this.env.source)+'&_cid='+urlencode(cid) + add_url;
-      }
+    }
     return true;
-    };
+  };
 
   // copy a contact to the specified target (group or directory)
   this.copy_contact = function(cid, to)
-    {
+  {
     if (!cid)
       cid = this.contact_list.get_selection().join(',');
 
-    if (to != this.env.source && cid && this.env.address_sources[to] && !this.env.address_sources[to].readonly)
-      this.http_post('copy', '_cid='+urlencode(cid)+'&_source='+urlencode(this.env.source)+'&_to='+urlencode(to));
-    };
-
+    if (to.type == 'group' && to.source == this.env.source) {
+      this.http_post('group-addmembers', '_cid='+urlencode(cid)
+        + '&_source='+urlencode(this.env.source)
+        + '&_gid='+urlencode(to.id));
+    }
+    else if (to.type == 'group' && !this.env.address_sources[to.source].readonly) {
+      this.http_post('copy', '_cid='+urlencode(cid)
+        + '&_source='+urlencode(this.env.source)
+        + '&_to='+urlencode(to.source)
+        + '&_togid='+urlencode(to.id)
+        + (this.env.group ? '&_gid='+urlencode(this.env.group) : ''));
+    }
+    else if (to.id != this.env.source && cid && this.env.address_sources[to.id] && !this.env.address_sources[to.id].readonly) {
+      this.http_post('copy', '_cid='+urlencode(cid)
+        + '&_source='+urlencode(this.env.source)
+        + '&_to='+urlencode(to.id)
+        + (this.env.group ? '&_gid='+urlencode(this.env.group) : ''));
+    }
+  };
 
   this.delete_contacts = function()
-    {
+  {
     // exit if no mailbox specified or if selection is empty
     var selection = this.contact_list.get_selection();
     if (!(selection.length || this.env.cid) || !confirm(this.get_label('deletecontactconfirm')))
       return;
-      
-    var a_cids = new Array();
-    var qs = '';
+
+    var id, a_cids = [], qs = '';
 
     if (this.env.cid)
-      a_cids[a_cids.length] = this.env.cid;
-    else
-      {
-      var id;
-      for (var n=0; n<selection.length; n++)
-        {
+      a_cids.push(this.env.cid);
+    else {
+      for (var n=0; n<selection.length; n++) {
         id = selection[n];
-        a_cids[a_cids.length] = id;
+        a_cids.push(id);
         this.contact_list.remove_row(id, (n == selection.length-1));
-        }
+      }
 
       // hide content frame if we delete the currently displayed contact
       if (selection.length == 1)
         this.show_contentframe(false);
-      }
+    }
 
     // also send search request to get the right records from the next page
     if (this.env.search_request) 
@@ -2995,8 +3783,9 @@ function rcube_webmail()
 
     // send request to server
     this.http_post('delete', '_cid='+urlencode(a_cids.join(','))+'&_source='+urlencode(this.env.source)+'&_from='+(this.env.action ? this.env.action : '')+qs);
+
     return true;
-    };
+  };
 
   // update a contact record in the list
   this.update_contact_row = function(cid, cols_arr, newcid)
@@ -3009,11 +3798,11 @@ function rcube_webmail()
 
       // cid change
       if (newcid) {
-       row.id = 'rcmrow' + newcid;
+        row.id = 'rcmrow' + newcid;
         this.contact_list.remove_row(cid);
         this.contact_list.init_row(row);
-       this.contact_list.selection[0] = newcid;
-       row.style.display = '';
+        this.contact_list.selection[0] = newcid;
+        row.style.display = '';
       }
 
       return true;
@@ -3024,18 +3813,18 @@ function rcube_webmail()
 
   // add row to contacts list
   this.add_contact_row = function(cid, cols, select)
-    {
+  {
     if (!this.gui_objects.contactslist || !this.gui_objects.contactslist.tBodies[0])
       return false;
-    
-    var tbody = this.gui_objects.contactslist.tBodies[0];
-    var rowcount = tbody.rows.length;
-    var even = rowcount%2;
-    
-    var row = document.createElement('tr');
+
+    var tbody = this.gui_objects.contactslist.tBodies[0],
+      rowcount = tbody.rows.length,
+      even = rowcount%2,
+      row = document.createElement('tr');
+
     row.id = 'rcmrow'+cid;
     row.className = 'contact '+(even ? 'even' : 'odd');
-           
+
     if (this.contact_list.in_selection(cid))
       row.className += ' selected';
 
@@ -3046,11 +3835,148 @@ function rcube_webmail()
       col.innerHTML = cols[c];
       row.appendChild(col);
     }
-    
-    this.contact_list.insert_row(row);
-    
-    this.enable_command('export', (this.contact_list.rowcount > 0));
-    };
+
+    this.contact_list.insert_row(row);
+
+    this.enable_command('export', (this.contact_list.rowcount > 0));
+  };
+
+  this.group_create = function()
+  {
+    if (!this.gui_objects.folderlist || !this.env.address_sources[this.env.source].groups)
+      return;
+
+    if (!this.name_input) {
+      this.name_input = $('<input>').attr('type', 'text');
+      this.name_input.bind('keydown', function(e){ return rcmail.add_input_keydown(e); });
+      this.name_input_li = $('<li>').addClass('contactgroup').append(this.name_input);
+
+      var li = this.get_folder_li(this.env.source)
+      this.name_input_li.insertAfter(li);
+    }
+
+    this.name_input.select().focus();
+  };
+
+  this.group_rename = function()
+  {
+    if (!this.env.group || !this.gui_objects.folderlist)
+      return;
+
+    if (!this.name_input) {
+      this.enable_command('list', 'listgroup', false);
+      this.name_input = $('<input>').attr('type', 'text').val(this.env.contactgroups['G'+this.env.source+this.env.group].name);
+      this.name_input.bind('keydown', function(e){ return rcmail.add_input_keydown(e); });
+      this.env.group_renaming = true;
+
+      var link, li = this.get_folder_li(this.env.source+this.env.group, 'rcmliG');
+      if (li && (link = li.firstChild)) {
+        $(link).hide().before(this.name_input);
+      }
+    }
+
+    this.name_input.select().focus();
+  };
+
+  this.group_delete = function()
+  {
+    if (this.env.group)
+      this.http_post('group-delete', '_source='+urlencode(this.env.source)+'&_gid='+urlencode(this.env.group), true);
+  };
+
+  // callback from server upon group-delete command
+  this.remove_group_item = function(prop)
+  {
+    var li, key = 'G'+prop.source+prop.id;
+    if ((li = this.get_folder_li(key))) {
+      this.triggerEvent('group_delete', { source:prop.source, id:prop.id, li:li });
+
+      li.parentNode.removeChild(li);
+      delete this.env.contactfolders[key];
+      delete this.env.contactgroups[key];
+    }
+
+    this.list_contacts(prop.source, 0);
+  };
+
+  // handler for keyboard events on the input field
+  this.add_input_keydown = function(e)
+  {
+    var key = rcube_event.get_keycode(e);
+
+    // enter
+    if (key == 13) {
+      var newname = this.name_input.val();
+
+      if (newname) {
+        var lock = this.set_busy(true, 'loading');
+        if (this.env.group_renaming)
+          this.http_post('group-rename', '_source='+urlencode(this.env.source)+'&_gid='+urlencode(this.env.group)+'&_name='+urlencode(newname), lock);
+        else
+          this.http_post('group-create', '_source='+urlencode(this.env.source)+'&_name='+urlencode(newname), lock);
+      }
+      return false;
+    }
+    // escape
+    else if (key == 27)
+      this.reset_add_input();
+
+    return true;
+  };
+
+  this.reset_add_input = function()
+  {
+    if (this.name_input) {
+      if (this.env.group_renaming) {
+        var li = this.name_input.parent();
+        li.children().last().show();
+        this.env.group_renaming = false;
+      }
+
+      this.name_input.remove();
+
+      if (this.name_input_li)
+        this.name_input_li.remove();
+
+      this.name_input = this.name_input_li = null;
+    }
+
+    this.enable_command('list', 'listgroup', true);
+  };
+
+  // callback for creating a new contact group
+  this.insert_contact_group = function(prop)
+  {
+    this.reset_add_input();
+
+    prop.type = 'group';
+    var key = 'G'+prop.source+prop.id;
+    this.env.contactfolders[key] = this.env.contactgroups[key] = prop;
+
+    var link = $('<a>').attr('href', '#')
+      .bind('click', function() { return rcmail.command('listgroup', prop, this);})
+      .html(prop.name);
+    var li = $('<li>').attr('id', 'rcmli'+key)
+      .addClass('contactgroup')
+      .append(link)
+      .insertAfter(this.get_folder_li(prop.source));
+
+    this.triggerEvent('group_insert', { id:prop.id, source:prop.source, name:prop.name, li:li[0] });
+  };
+
+  // callback for renaming a contact group
+  this.update_contact_group = function(prop)
+  {
+    this.reset_add_input();
+
+    var key = 'G'+prop.source+prop.id, link, li = this.get_folder_li(key);
+
+    if (li && (link = li.firstChild) && link.tagName.toLowerCase() == 'a')
+      link.innerHTML = prop.name;
+
+    this.env.contactfolders[key].name = this.env.contactgroups[key].name = prop.name;
+    this.triggerEvent('group_update', { id:prop.id, source:prop.source, name:prop.name, li:li[0] });
+  };
 
 
   /*********************************************************/
@@ -3058,342 +3984,229 @@ function rcube_webmail()
   /*********************************************************/
 
   this.init_subscription_list = function()
-    {
+  {
     var p = this;
-    this.subscription_list = new rcube_list_widget(this.gui_objects.subscriptionlist, {multiselect:false, draggable:true, keyboard:false, toggleselect:true});
+    this.subscription_list = new rcube_list_widget(this.gui_objects.subscriptionlist,
+      {multiselect:false, draggable:true, keyboard:false, toggleselect:true});
     this.subscription_list.addEventListener('select', function(o){ p.subscription_select(o); });
     this.subscription_list.addEventListener('dragstart', function(o){ p.drag_active = true; });
     this.subscription_list.addEventListener('dragend', function(o){ p.subscription_move_folder(o); });
-    this.subscription_list.row_init = function (row)
-      {
-      var anchors = row.obj.getElementsByTagName('a');
-      if (anchors[0])
-        anchors[0].onclick = function() { p.rename_folder(row.id); return false; };
-      if (anchors[1])
-        anchors[1].onclick = function() { p.delete_folder(row.id); return false; };
+    this.subscription_list.row_init = function (row) {
       row.obj.onmouseover = function() { p.focus_subscription(row.id); };
       row.obj.onmouseout = function() { p.unfocus_subscription(row.id); };
-      }
+    };
     this.subscription_list.init();
-    }
+  };
 
   // preferences section select and load options frame
   this.section_select = function(list)
-    {
+  {
     var id = list.get_single_selection();
-    
+
     if (id) {
-      var add_url = '';
-      var target = window;
+      var add_url = '', target = window;
       this.set_busy(true);
 
       if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
         add_url = '&_framed=1';
         target = window.frames[this.env.contentframe];
-        }
-      target.location.href = this.env.comm_path+'&_action=edit-prefs&_section='+id+add_url;
       }
+      target.location.href = this.env.comm_path+'&_action=edit-prefs&_section='+id+add_url;
+    }
 
     return true;
-    };
+  };
 
   this.identity_select = function(list)
-    {
+  {
     var id;
     if (id = list.get_single_selection())
       this.load_identity(id, 'edit-identity');
-    };
+  };
 
   // load identity record
   this.load_identity = function(id, action)
-    {
+  {
     if (action=='edit-identity' && (!id || id==this.env.iid))
       return false;
 
-    var add_url = '';
-    var target = window;
-    if (this.env.contentframe && window.frames && window.frames[this.env.contentframe])
-      {
+    var add_url = '', target = window;
+
+    if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
       add_url = '&_framed=1';
       target = window.frames[this.env.contentframe];
       document.getElementById(this.env.contentframe).style.visibility = 'inherit';
-      }
+    }
 
-    if (action && (id || action=='add-identity'))
-      {
+    if (action && (id || action=='add-identity')) {
       this.set_busy(true);
       target.location.href = this.env.comm_path+'&_action='+action+'&_iid='+id+add_url;
-      }
+    }
+
     return true;
-    };
+  };
 
   this.delete_identity = function(id)
-    {
+  {
     // exit if no mailbox specified or if selection is empty
     var selection = this.identity_list.get_selection();
     if (!(selection.length || this.env.iid))
       return;
-    
+
     if (!id)
       id = this.env.iid ? this.env.iid : selection[0];
 
     // append token to request
     this.goto_url('delete-identity', '_iid='+id+'&_token='+this.env.request_token, true);
-    
+
     return true;
-    };
+  };
 
   this.focus_subscription = function(id)
-    {
-    var row, folder;
-    var reg = RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$');
+  {
+    var row, folder,
+      delim = RegExp.escape(this.env.delimiter),
+      reg = RegExp('['+delim+']?[^'+delim+']+$');
 
-    if (this.drag_active && this.env.folder && (row = document.getElementById(id)))
+    if (this.drag_active && this.env.mailbox && (row = document.getElementById(id)))
       if (this.env.subscriptionrows[id] &&
-          (folder = this.env.subscriptionrows[id][0]))
-        {
+          (folder = this.env.subscriptionrows[id][0])) {
         if (this.check_droptarget(folder) &&
-            !this.env.subscriptionrows[this.get_folder_row_id(this.env.folder)][2] &&
-            (folder != this.env.folder.replace(reg, '')) &&
-            (!folder.match(new RegExp('^'+RegExp.escape(this.env.folder+this.env.delimiter)))))
-          {
+            !this.env.subscriptionrows[this.get_folder_row_id(this.env.mailbox)][2] &&
+            (folder != this.env.mailbox.replace(reg, '')) &&
+            (!folder.match(new RegExp('^'+RegExp.escape(this.env.mailbox+this.env.delimiter))))) {
           this.set_env('dstfolder', folder);
           $(row).addClass('droptarget');
-          }
         }
-      else if (this.env.folder.match(new RegExp(RegExp.escape(this.env.delimiter))))
-        {
+      }
+      else if (this.env.mailbox.match(new RegExp(delim))) {
         this.set_env('dstfolder', this.env.delimiter);
         $(this.subscription_list.frame).addClass('droptarget');
-        }
-    }
+      }
+  };
 
   this.unfocus_subscription = function(id)
-    {
-      var row = $('#'+id);
-      this.set_env('dstfolder', null);
-      if (this.env.subscriptionrows[id] && row[0])
-        row.removeClass('droptarget');
-      else
-        $(this.subscription_list.frame).removeClass('droptarget');
-    }
+  {
+    var row = $('#'+id);
+
+    this.set_env('dstfolder', null);
+    if (this.env.subscriptionrows[id] && row[0])
+      row.removeClass('droptarget');
+    else
+      $(this.subscription_list.frame).removeClass('droptarget');
+  };
 
   this.subscription_select = function(list)
-    {
+  {
     var id, folder;
-    if ((id = list.get_single_selection()) &&
-        this.env.subscriptionrows['rcmrow'+id] &&
-        (folder = this.env.subscriptionrows['rcmrow'+id][0]))
-      this.set_env('folder', folder);
-    else
-      this.set_env('folder', null);
-      
-    if (this.gui_objects.createfolderhint)
-      $(this.gui_objects.createfolderhint).html(this.env.folder ? this.get_label('addsubfolderhint') : '');
-    };
+
+    if (list && (id = list.get_single_selection()) &&
+        (folder = this.env.subscriptionrows['rcmrow'+id])
+    ) {
+      this.set_env('mailbox', folder[0]);
+      this.show_folder(folder[0]);
+      this.enable_command('delete-folder', !folder[2]);
+    }
+    else {
+      this.env.mailbox = null;
+      this.show_contentframe(false);
+      this.enable_command('delete-folder', 'purge', false);
+    }
+  };
 
   this.subscription_move_folder = function(list)
-    {
-    var reg = RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$');
-    if (this.env.folder && this.env.dstfolder && (this.env.dstfolder != this.env.folder) &&
-        (this.env.dstfolder != this.env.folder.replace(reg, '')))
-      {
-      var reg = new RegExp('[^'+RegExp.escape(this.env.delimiter)+']*['+RegExp.escape(this.env.delimiter)+']', 'g');
-      var basename = this.env.folder.replace(reg, '');
-      var newname = this.env.dstfolder==this.env.delimiter ? basename : this.env.dstfolder+this.env.delimiter+basename;
-
-      this.set_busy(true, 'foldermoving');
-      this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.folder)+'&_folder_newname='+urlencode(newname), true);
-      }
+  {
+    var delim = RegExp.escape(this.env.delimiter),
+      reg = RegExp('['+delim+']?[^'+delim+']+$');
+
+    if (this.env.mailbox && this.env.dstfolder && (this.env.dstfolder != this.env.mailbox) &&
+        (this.env.dstfolder != this.env.mailbox.replace(reg, ''))
+    ) {
+      reg = new RegExp('[^'+delim+']*['+delim+']', 'g');
+      var lock = this.set_busy(true, 'foldermoving'),
+        basename = this.env.mailbox.replace(reg, ''),
+        newname = this.env.dstfolder==this.env.delimiter ? basename : this.env.dstfolder+this.env.delimiter+basename;
+
+      this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.mailbox)+'&_folder_newname='+urlencode(newname), lock);
+    }
     this.drag_active = false;
     this.unfocus_subscription(this.get_folder_row_id(this.env.dstfolder));
-    };
+  };
 
   // tell server to create and subscribe a new mailbox
-  this.create_folder = function(name)
-    {
-    if (this.edit_folder)
-      this.reset_folder_rename();
-
-    var form;
-    if ((form = this.gui_objects.editform) && form.elements['_folder_name'])
-      {
-      name = form.elements['_folder_name'].value;
-
-      if (name.indexOf(this.env.delimiter)>=0)
-        {
-        alert(this.get_label('forbiddencharacter')+' ('+this.env.delimiter+')');
-        return false;
-        }
-
-      if (this.env.folder && name != '')
-        name = this.env.folder+this.env.delimiter+name;
-
-      this.set_busy(true, 'foldercreating');
-      this.http_post('create-folder', '_name='+urlencode(name), true);
-      }
-    else if (form.elements['_folder_name'])
-      form.elements['_folder_name'].focus();
-    };
-
-  // start renaming the mailbox name.
-  // this will replace the name string with an input field
-  this.rename_folder = function(id)
-    {
-    var temp, row, form;
-
-    // reset current renaming
-    if (temp = this.edit_folder)
-      {
-      this.reset_folder_rename();
-      if (temp == id)
-        return;
-      }
-
-    if (id && this.env.subscriptionrows[id] && (row = document.getElementById(id)))
-      {
-      var reg = new RegExp('.*['+RegExp.escape(this.env.delimiter)+']');
-      this.name_input = document.createElement('input');
-      this.name_input.type = 'text';
-      this.name_input.value = this.env.subscriptionrows[id][0].replace(reg, '');
-
-      reg = new RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$');
-      this.name_input.__parent = this.env.subscriptionrows[id][0].replace(reg, '');
-      this.name_input.onkeypress = function(e){ rcmail.name_input_keypress(e); };
-      
-      row.cells[0].replaceChild(this.name_input, row.cells[0].firstChild);
-      this.edit_folder = id;
-      this.name_input.select();
-      
-      if (form = this.gui_objects.editform)
-        form.onsubmit = function(){ return false; };
-      }
-    };
-
-  // remove the input field and write the current mailbox name to the table cell
-  this.reset_folder_rename = function()
-    {
-    var cell = this.name_input ? this.name_input.parentNode : null;
-
-    if (cell && this.edit_folder && this.env.subscriptionrows[this.edit_folder])
-      $(cell).html(this.env.subscriptionrows[this.edit_folder][1]);
-      
-    this.edit_folder = null;
-    };
-
-  // handler for keyboard events on the input field
-  this.name_input_keypress = function(e)
-    {
-    var key = rcube_event.get_keycode(e);
-
-    // enter
-    if (key==13)
-      {
-      var newname = this.name_input ? this.name_input.value : null;
-      if (this.edit_folder && newname)
-        {
-        if (newname.indexOf(this.env.delimiter)>=0)
-          {
-          alert(this.get_label('forbiddencharacter')+' ('+this.env.delimiter+')');
-          return false;
-          }
-
-        if (this.name_input.__parent)
-          newname = this.name_input.__parent + this.env.delimiter + newname;
-
-        this.set_busy(true, 'folderrenaming');
-        this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.subscriptionrows[this.edit_folder][0])+'&_folder_newname='+urlencode(newname), true);
-        }
-      }
-    // escape
-    else if (key==27)
-      this.reset_folder_rename();
-    };
+  this.create_folder = function()
+  {
+    this.show_folder('', this.env.mailbox);
+  };
 
   // delete a specific mailbox with all its messages
-  this.delete_folder = function(id)
-    {
-    var folder = this.env.subscriptionrows[id][0];
-
-    if (this.edit_folder)
-      this.reset_folder_rename();
-
-    if (folder && confirm(this.get_label('deletefolderconfirm')))
-      {
-      this.set_busy(true, 'folderdeleting');
-      this.http_post('delete-folder', '_mboxes='+urlencode(folder), true);
-      this.set_env('folder', null);
+  this.delete_folder = function(name)
+  {
+    var id = this.get_folder_row_id(name ? name : this.env.mailbox),
+      folder = this.env.subscriptionrows[id][0];
 
-      $(this.gui_objects.createfolderhint).html('');
-      }
-    };
+    if (folder && confirm(this.get_label('deletefolderconfirm'))) {
+      var lock = this.set_busy(true, 'folderdeleting');
+      this.http_post('delete-folder', '_mbox='+urlencode(folder), lock);
+    }
+  };
 
   // add a new folder to the subscription list by cloning a folder row
   this.add_folder_row = function(name, display_name, replace, before)
-    {
+  {
     if (!this.gui_objects.subscriptionlist)
       return false;
 
-    // find not protected folder    
-    for (var refid in this.env.subscriptionrows)
-      if (this.env.subscriptionrows[refid]!=null && !this.env.subscriptionrows[refid][2])
+    // find not protected folder
+    var refid;
+    for (var rid in this.env.subscriptionrows) {
+      if (this.env.subscriptionrows[rid]!=null && !this.env.subscriptionrows[rid][2]) {
+        refid = rid;
         break;
+      }
+    }
 
-    var refrow, form;
-    var tbody = this.gui_objects.subscriptionlist.tBodies[0];
-    var id = 'rcmrow'+(tbody.childNodes.length+1);
-    var selection = this.subscription_list.get_single_selection();
-    
-    if (replace && replace.id)
-    {
+    var refrow, form,
+      tbody = this.gui_objects.subscriptionlist.tBodies[0],
+      id = 'rcmrow'+(tbody.childNodes.length+1),
+      selection = this.subscription_list.get_single_selection();
+
+    if (replace && replace.id) {
       id = replace.id;
       refid = replace.id;
     }
 
-    if (!id || !(refrow = document.getElementById(refid)))
-      {
+    if (!id || !refid || !(refrow = document.getElementById(refid))) {
       // Refresh page if we don't have a table row to clone
       this.goto_url('folders');
-      }
+      return false;
+    }
+
+    // clone a table row if there are existing rows
+    var row = this.clone_table_row(refrow);
+    row.id = id;
+
+    if (before && (before = this.get_folder_row_id(before)))
+      tbody.insertBefore(row, document.getElementById(before));
     else
-      {
-      // clone a table row if there are existing rows
-      var row = this.clone_table_row(refrow);
-      row.id = id;
+      tbody.appendChild(row);
 
-      if (before && (before = this.get_folder_row_id(before)))
-        tbody.insertBefore(row, document.getElementById(before));
-      else
-        tbody.appendChild(row);
-      
-      if (replace)
-        tbody.removeChild(replace);
-      }
+    if (replace)
+      tbody.removeChild(replace);
 
     // add to folder/row-ID map
     this.env.subscriptionrows[row.id] = [name, display_name, 0];
 
     // set folder name
     row.cells[0].innerHTML = display_name;
-    
-    // set messages count to zero
-    if (!replace)
+
+    if (!replace) {
+      // set messages count to zero
       row.cells[1].innerHTML = '*';
-    
-    if (!replace && row.cells[2] && row.cells[2].firstChild.tagName.toLowerCase()=='input')
-      {
-      row.cells[2].firstChild.value = name;
-      row.cells[2].firstChild.checked = true;
-      }
-    
-    // add new folder to rename-folder list and clear input field
-    if (!replace && (form = this.gui_objects.editform))
-      {
-      if (form.elements['_folder_oldname'])
-        form.elements['_folder_oldname'].options[form.elements['_folder_oldname'].options.length] = new Option(name,name);
-      if (form.elements['_folder_name'])
-        form.elements['_folder_name'].value = ''; 
-      }
+
+      // update subscription checkbox
+      $('input[name="_subscribed[]"]', row).val(name).attr('checked', true);
+    }
 
     this.init_subscription_list();
     if (selection && document.getElementById('rcmrow'+selection))
@@ -3401,91 +4214,61 @@ function rcube_webmail()
 
     if (document.getElementById(id).scrollIntoView)
       document.getElementById(id).scrollIntoView();
-    };
+  };
 
   // replace an existing table row with a new folder line
   this.replace_folder_row = function(oldfolder, newfolder, display_name, before)
-    {
-    var id = this.get_folder_row_id(oldfolder);
-    var row = document.getElementById(id);
-    
+  {
+    var id = this.get_folder_row_id(oldfolder),
+      row = document.getElementById(id);
+
     // replace an existing table row (if found)
     this.add_folder_row(newfolder, display_name, row, before);
-    
-    // rename folder in rename-folder dropdown
-    var form, elm;
-    if ((form = this.gui_objects.editform) && (elm = form.elements['_folder_oldname']))
-      {
-      for (var i=0;i<elm.options.length;i++)
-        {
-        if (elm.options[i].value == oldfolder)
-          {
-          elm.options[i].text = display_name;
-          elm.options[i].value = newfolder;
-          break;
-          }
-        }
-
-      form.elements['_folder_newname'].value = '';
-      }
-    };
+  };
 
   // remove the table row of a specific mailbox from the table
   // (the row will not be removed, just hidden)
   this.remove_folder_row = function(folder)
-    {
-    var row;
-    var id = this.get_folder_row_id(folder);
+  {
+    var row, id = this.get_folder_row_id(folder);
+
     if (id && (row = document.getElementById(id)))
       row.style.display = 'none';
+  };
 
-    // remove folder from rename-folder list
-    var form;
-    if ((form = this.gui_objects.editform) && form.elements['_folder_oldname'])
-      {
-      for (var i=0;i<form.elements['_folder_oldname'].options.length;i++)
-        {
-        if (form.elements['_folder_oldname'].options[i].value == folder) 
-          {
-          form.elements['_folder_oldname'].options[i] = null;
-          break;
-          }
-        }
-      }
-    
-    if (form && form.elements['_folder_newname'])
-      form.elements['_folder_newname'].value = '';
-    };
+  this.subscribe = function(folder)
+  {
+    if (folder) {
+      var lock = this.display_message(this.get_label('foldersubscribing'), 'loading');
+      this.http_post('subscribe', '_mbox='+urlencode(folder), lock);
+    }
+  };
 
-  this.subscribe_folder = function(folder)
-    {
-    if (folder)
-      this.http_post('subscribe', '_mbox='+urlencode(folder));
-    };
+  this.unsubscribe = function(folder)
+  {
+    if (folder) {
+      var lock = this.display_message(this.get_label('folderunsubscribing'), 'loading');
+      this.http_post('unsubscribe', '_mbox='+urlencode(folder), lock);
+    }
+  };
 
-  this.unsubscribe_folder = function(folder)
-    {
-    if (folder)
-      this.http_post('unsubscribe', '_mbox='+urlencode(folder));
-    };
-    
   // helper method to find a specific mailbox row ID
   this.get_folder_row_id = function(folder)
-    {
+  {
     for (var id in this.env.subscriptionrows)
       if (this.env.subscriptionrows[id] && this.env.subscriptionrows[id][0] == folder)
         break;
-        
+
     return id;
-    };
+  };
 
   // duplicate a specific table row
   this.clone_table_row = function(row)
-    {
-    var cell, td;
-    var new_row = document.createElement('tr');
-    for(var n=0; n<row.cells.length; n++)
-      {
+  {
+    var cell, td,
+      new_row = document.createElement('tr');
+
+    for (var n=0; n<row.cells.length; n++) {
       cell = row.cells[n];
       td = document.createElement('td');
 
@@ -3493,35 +4276,69 @@ function rcube_webmail()
         td.className = cell.className;
       if (cell.align)
         td.setAttribute('align', cell.align);
-        
+
       td.innerHTML = cell.innerHTML;
       new_row.appendChild(td);
-      }
-    
+    }
+
     return new_row;
-    };
+  };
+
+  // when user select a folder in manager
+  this.show_folder = function(folder, path, force)
+  {
+    var target = window,
+      url = '&_action=edit-folder&_mbox='+urlencode(folder);
+
+    if (path)
+      url += '&_path='+urlencode(path);
+
+    if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
+      target = window.frames[this.env.contentframe];
+      url += '&_framed=1';
+    }
+
+    if (String(target.location.href).indexOf(url) >= 0 && !force) {
+      this.show_contentframe(true);
+    }
+    else {
+      if (!this.env.frame_lock) {
+        (parent.rcmail ? parent.rcmail : this).env.frame_lock = this.set_busy(true, 'loading');
+      }
+      target.location.href = this.env.comm_path+url;
+    }
+  };
+
+  this.folder_size = function(folder)
+  {
+    var lock = this.set_busy(true, 'loading');
+    this.http_post('folder-size', '_mbox='+urlencode(folder), lock);
+  };
+
+  this.folder_size_update = function(size)
+  {
+    $('#folder-size').replaceWith(size);
+  };
 
 
   /*********************************************************/
   /*********           GUI functionality           *********/
   /*********************************************************/
 
-  // eable/disable buttons for page shifting
+  // enable/disable buttons for page shifting
   this.set_page_buttons = function()
   {
-    this.enable_command('nextpage', (this.env.pagecount > this.env.current_page));
-    this.enable_command('lastpage', (this.env.pagecount > this.env.current_page));
-    this.enable_command('previouspage', (this.env.current_page > 1));
-    this.enable_command('firstpage', (this.env.current_page > 1));
+    this.enable_command('nextpage', 'lastpage', (this.env.pagecount > this.env.current_page));
+    this.enable_command('previouspage', 'firstpage', (this.env.current_page > 1));
   };
-  
+
   // set event handlers on registered buttons
   this.init_buttons = function()
   {
     for (var cmd in this.buttons) {
       if (typeof cmd != 'string')
         continue;
-      
+
       for (var i=0; i< this.buttons[cmd].length; i++) {
         var prop = this.buttons[cmd][i];
         var elm = document.getElementById(prop.id);
@@ -3533,7 +4350,7 @@ function rcube_webmail()
           elm = elm.parentNode;
           preload = true;
         }
-        
+
         elm._command = cmd;
         elm._id = prop.id;
         if (prop.sel) {
@@ -3554,15 +4371,13 @@ function rcube_webmail()
 
   // set button to a specific state
   this.set_button = function(command, state)
-    {
-    var a_buttons = this.buttons[command];
-    var button, obj;
+  {
+    var button, obj, a_buttons = this.buttons[command];
 
-    if(!a_buttons || !a_buttons.length)
+    if (!a_buttons || !a_buttons.length)
       return false;
 
-    for(var n=0; n<a_buttons.length; n++)
-      {
+    for (var n=0; n<a_buttons.length; n++) {
       button = a_buttons[n];
       obj = document.getElementById(button.id);
 
@@ -3577,63 +4392,55 @@ function rcube_webmail()
         button.pas = String(obj.className);
 
       // set image according to button state
-      if (obj && button.type=='image' && button[state])
-        {
-        button.status = state;        
+      if (obj && button.type=='image' && button[state]) {
+        button.status = state;
         obj.src = button[state];
-        }
+      }
       // set class name according to button state
-      else if (obj && typeof(button[state])!='undefined')
-        {
-        button.status = state;        
-        obj.className = button[state];        
-        }
+      else if (obj && typeof(button[state])!='undefined') {
+        button.status = state;
+        obj.className = button[state];
+      }
       // disable/enable input buttons
-      if (obj && button.type=='input')
-        {
+      if (obj && button.type=='input') {
         button.status = state;
         obj.disabled = !state;
-        }
       }
-    };
+    }
+  };
 
   // display a specific alttext
   this.set_alttext = function(command, label)
-    {
-      if (!this.buttons[command] || !this.buttons[command].length)
-        return;
-      
-      var button, obj, link;
-      for (var n=0; n<this.buttons[command].length; n++)
-      {
-        button = this.buttons[command][n];
-        obj = document.getElementById(button.id);
-        
-        if (button.type=='image' && obj)
-        {
-          obj.setAttribute('alt', this.get_label(label));
-          if ((link = obj.parentNode) && link.tagName.toLowerCase() == 'a')
-            link.setAttribute('title', this.get_label(label));
-        }
-        else if (obj)
-          obj.setAttribute('title', this.get_label(label));
+  {
+    if (!this.buttons[command] || !this.buttons[command].length)
+      return;
+
+    var button, obj, link;
+    for (var n=0; n<this.buttons[command].length; n++) {
+      button = this.buttons[command][n];
+      obj = document.getElementById(button.id);
+
+      if (button.type=='image' && obj) {
+        obj.setAttribute('alt', this.get_label(label));
+        if ((link = obj.parentNode) && link.tagName.toLowerCase() == 'a')
+          link.setAttribute('title', this.get_label(label));
       }
-    };
+      else if (obj)
+        obj.setAttribute('title', this.get_label(label));
+    }
+  };
 
   // mouse over button
   this.button_over = function(command, id)
   {
-    var a_buttons = this.buttons[command];
-    var button, elm;
+    var button, elm, a_buttons = this.buttons[command];
 
-    if(!a_buttons || !a_buttons.length)
+    if (!a_buttons || !a_buttons.length)
       return false;
 
-    for(var n=0; n<a_buttons.length; n++)
-    {
+    for (var n=0; n<a_buttons.length; n++) {
       button = a_buttons[n];
-      if(button.id==id && button.status=='act')
-      {
+      if (button.id == id && button.status == 'act') {
         elm = document.getElementById(button.id);
         if (elm && button.over) {
           if (button.type == 'image')
@@ -3648,17 +4455,14 @@ function rcube_webmail()
   // mouse down on button
   this.button_sel = function(command, id)
   {
-    var a_buttons = this.buttons[command];
-    var button, elm;
+    var button, elm, a_buttons = this.buttons[command];
 
-    if(!a_buttons || !a_buttons.length)
+    if (!a_buttons || !a_buttons.length)
       return;
 
-    for(var n=0; n<a_buttons.length; n++)
-    {
+    for (var n=0; n<a_buttons.length; n++) {
       button = a_buttons[n];
-      if(button.id==id && button.status=='act')
-      {
+      if (button.id == id && button.status == 'act') {
         elm = document.getElementById(button.id);
         if (elm && button.sel) {
           if (button.type == 'image')
@@ -3674,17 +4478,14 @@ function rcube_webmail()
   // mouse out of button
   this.button_out = function(command, id)
   {
-    var a_buttons = this.buttons[command];
-    var button, elm;
+    var button, elm, a_buttons = this.buttons[command];
 
-    if(!a_buttons || !a_buttons.length)
+    if (!a_buttons || !a_buttons.length)
       return;
 
-    for(var n=0; n<a_buttons.length; n++)
-    {
+    for (var n=0; n<a_buttons.length; n++) {
       button = a_buttons[n];
-      if(button.id==id && button.status=='act')
-      {
+      if (button.id == id && button.status == 'act') {
         elm = document.getElementById(button.id);
         if (elm && button.act) {
           if (button.type == 'image')
@@ -3696,261 +4497,264 @@ function rcube_webmail()
     }
   };
 
-  // write to the document/window title
-  this.set_pagetitle = function(title)
+  // write to the document/window title
+  this.set_pagetitle = function(title)
+  {
+    if (title && document.title)
+      document.title = title;
+  };
+
+  // display a system message, list of types in common.css (below #message definition)
+  this.display_message = function(msg, type)
+  {
+    // pass command to parent window
+    if (this.is_framed())
+      return parent.rcmail.display_message(msg, type);
+
+    if (!this.gui_objects.message) {
+      // save message in order to display after page loaded
+      if (type != 'loading')
+        this.pending_message = new Array(msg, type);
+      return false;
+    }
+
+    type = type ? type : 'notice';
+
+    var ref = this,
+      key = msg,
+      date = new Date(),
+      id = type + date.getTime(),
+      timeout = this.message_time * (type == 'error' || type == 'warning' ? 2 : 1);
+      
+    if (type == 'loading') {
+      key = 'loading';
+      timeout = this.env.request_timeout * 1000;
+      if (!msg)
+        msg = this.get_label('loading');
+    }
+
+    // The same message is already displayed
+    if (this.messages[key]) {
+      // replace label
+      if (this.messages[key].obj)
+        this.messages[key].obj.html(msg);
+      // store label in stack
+      if (type == 'loading') {
+        this.messages[key].labels.push({'id': id, 'msg': msg});
+      }
+      // add element and set timeout
+      this.messages[key].elements.push(id);
+      window.setTimeout(function() { ref.hide_message(id, type == 'loading'); }, timeout);
+      return id;
+    }
+
+    // create DOM object and display it
+    var obj = $('<div>').addClass(type).html(msg).data('key', key),
+      cont = $(this.gui_objects.message).append(obj).show();
+
+    this.messages[key] = {'obj': obj, 'elements': [id]};
+
+    if (type == 'loading') {
+      this.messages[key].labels = [{'id': id, 'msg': msg}];
+    }
+    else {
+      obj.click(function() { return ref.hide_message(obj); });
+    }
+
+    window.setTimeout(function() { ref.hide_message(id, type == 'loading'); }, timeout);
+    return id;
+  };
+
+  // make a message to disapear
+  this.hide_message = function(obj, fade)
   {
-    if (title && document.title)
-      document.title = title;
-  }
-
-  // display a system message
-  this.display_message = function(msg, type, hold)
-    {
-    if (!this.loaded)  // save message in order to display after page loaded
-      {
-      this.pending_message = new Array(msg, type);
-      return true;
-      }
-
     // pass command to parent window
-    if (this.env.framed && parent.rcmail)
-      return parent.rcmail.display_message(msg, type, hold);
-
-    if (!this.gui_objects.message)
-      return false;
+    if (this.is_framed())
+      return parent.rcmail.hide_message(obj, fade);
 
-    if (this.message_timer)
-      clearTimeout(this.message_timer);
-    
-    var cont = msg;
-    if (type)
-      cont = '<div class="'+type+'">'+cont+'</div>';
-
-    var obj = $(this.gui_objects.message).html(cont).show();
-    
-    if (type!='loading')
-      obj.bind('mousedown', function(){ ref.hide_message(); return true; });
-    
-    if (!hold)
-      this.message_timer = window.setTimeout(function(){ ref.hide_message(true); }, this.message_time);
-    };
+    var k, n, i, msg, m = this.messages;
 
-  // make a message row disapear
-  this.hide_message = function(fade)
-    {
-    if (this.gui_objects.message)
-      $(this.gui_objects.message).unbind()[(fade?'fadeOut':'hide')]();
-    };
+    // Hide message by object, don't use for 'loading'!
+    if (typeof(obj) == 'object') {
+      $(obj)[fade?'fadeOut':'hide']();
+      msg = $(obj).data('key');
+      if (this.messages[msg])
+        delete this.messages[msg];
+    }
+    // Hide message by id
+    else {
+      for (k in m) {
+        for (n in m[k].elements) {
+          if (m[k] && m[k].elements[n] == obj) {
+            m[k].elements.splice(n, 1);
+            // hide DOM element if last instance is removed
+            if (!m[k].elements.length) {
+              m[k].obj[fade?'fadeOut':'hide']();
+              delete m[k];
+            }
+            // set pending action label for 'loading' message
+            else if (k == 'loading') {
+              for (i in m[k].labels) {
+                if (m[k].labels[i].id == obj) {
+                  delete m[k].labels[i];
+                }
+                else {
+                  msg = m[k].labels[i].msg;
+                }
+                m[k].obj.html(msg);
+              }
+            }
+          }
+        }
+      }
+    }
+  };
 
   // mark a mailbox as selected and set environment variable
-  this.select_folder = function(name, old)
+  this.select_folder = function(name, old, prefix)
   {
-    if (this.gui_objects.folderlist)
-    {
+    if (this.gui_objects.folderlist) {
       var current_li, target_li;
-      
-      if ((current_li = this.get_folder_li(old))) {
+
+      if ((current_li = this.get_folder_li(old, prefix))) {
         $(current_li).removeClass('selected').removeClass('unfocused');
       }
-      if ((target_li = this.get_folder_li(name))) {
+      if ((target_li = this.get_folder_li(name, prefix))) {
         $(target_li).removeClass('unfocused').addClass('selected');
       }
-      
+
       // trigger event hook
-      this.triggerEvent('selectfolder', { folder:name, old:old });
+      this.triggerEvent('selectfolder', { folder:name, old:old, prefix:prefix });
     }
   };
 
   // helper method to find a folder list item
-  this.get_folder_li = function(name)
+  this.get_folder_li = function(name, prefix)
   {
-    if (this.gui_objects.folderlist)
-    {
+    if (!prefix)
+      prefix = 'rcmli';
+
+    if (this.gui_objects.folderlist) {
       name = String(name).replace(this.identifier_expr, '_');
-      return document.getElementById('rcmli'+name);
+      return document.getElementById(prefix+name);
     }
 
     return null;
   };
 
-  // for reordering column array, Konqueror workaround
-  this.set_message_coltypes = function(coltypes) 
-  { 
-    this.coltypes = coltypes;
-    
-    // set correct list titles
-    var cell, col;
-    var thead = this.gui_objects.messagelist ? this.gui_objects.messagelist.tHead : null;
-    for (var n=0; thead && n<this.coltypes.length; n++) 
-      {
-      col = this.coltypes[n];
-      if ((cell = thead.rows[0].cells[n+1]) && (col=='from' || col=='to'))
-        {
-        // if we have links for sorting, it's a bit more complicated...
-        if (cell.firstChild && cell.firstChild.tagName.toLowerCase()=='a')
-          {
-          cell.firstChild.innerHTML = this.get_label(this.coltypes[n]);
-          cell.firstChild.onclick = function(){ return rcmail.command('sort', this.__col, this); };
-          cell.firstChild.__col = col;
-          }
-        else
-          cell.innerHTML = this.get_label(this.coltypes[n]);
+  // for reordering column array (Konqueror workaround)
+  // and for setting some message list global variables
+  this.set_message_coltypes = function(coltypes, repl)
+  {
+    this.env.coltypes = coltypes;
 
-        cell.id = 'rcm'+col;
+    // set correct list titles
+    var thead = this.gui_objects.messagelist ? this.gui_objects.messagelist.tHead : null,
+      cell, col, n, len;
+
+    // replace old column headers
+    if (thead) {
+      if (repl) {
+        var th = document.createElement('thead'),
+          tr = document.createElement('tr');
+        for (c=0, len=repl.length; c < len; c++) {
+          cell = document.createElement('td');
+          cell.innerHTML = repl[c].html;
+          if (repl[c].id) cell.id = repl[c].id;
+          if (repl[c].className) cell.className = repl[c].className;
+          tr.appendChild(cell);
         }
-      else if (col == 'subject' && this.message_list)
-        this.message_list.subject_col = n+1;
+        th.appendChild(tr);
+        thead.parentNode.replaceChild(th, thead);
       }
-  };
-
-  // create a table row in the message list
-  this.add_message_row = function(uid, cols, flags, attachment, attop)
-    {
-    if (!this.gui_objects.messagelist || !this.message_list)
-      return false;
-
-    if (this.message_list.background)
-      var tbody = this.message_list.background;
-    else
-      var tbody = this.gui_objects.messagelist.tBodies[0];
-    
-    var rowcount = tbody.rows.length;
-    var even = rowcount%2;
-    
-    this.env.messages[uid] = {
-      deleted: flags.deleted?1:0,
-      replied: flags.replied?1:0,
-      unread: flags.unread?1:0,
-      forwarded: flags.forwarded?1:0,
-      flagged:flags.flagged?1:0
-    };
-
-    var css_class = 'message'
-        + (even ? ' even' : ' odd')
-        + (flags.unread ? ' unread' : '')
-        + (flags.deleted ? ' deleted' : '')
-        + (flags.flagged ? ' flagged' : '')
-        + (this.message_list.in_selection(uid) ? ' selected' : '');
 
-    // for performance use DOM instead of jQuery here
-    var row = document.createElement('tr');
-    row.id = 'rcmrow'+uid;
-    row.className = css_class;
-    
-    var icon = this.env.messageicon;
-    if (flags.deleted && this.env.deletedicon)
-      icon = this.env.deletedicon;
-    else if (flags.replied && this.env.repliedicon)
-      {
-      if (flags.forwarded && this.env.forwardedrepliedicon)
-        icon = this.env.forwardedrepliedicon;
-      else
-        icon = this.env.repliedicon;
-      }
-    else if (flags.forwarded && this.env.forwardedicon)
-      icon = this.env.forwardedicon;
-    else if(flags.unread && this.env.unreadicon)
-      icon = this.env.unreadicon;
-    
-    // add icon col
-    var col = document.createElement('td');
-    col.className = 'icon';
-    col.innerHTML = icon ? '<img src="'+icon+'" alt="" />' : '';
-    row.appendChild(col);
-                 
-    // add each submitted col
-    for (var n = 0; n < this.coltypes.length; n++) {
-      var c = this.coltypes[n];
-      col = document.createElement('td');
-      col.className = String(c).toLowerCase();
-            
-      if (c=='flag') {
-        if (flags.flagged && this.env.flaggedicon)
-          col.innerHTML = '<img src="'+this.env.flaggedicon+'" alt="" />';
-        else if(!flags.flagged && this.env.unflaggedicon)
-          col.innerHTML = '<img src="'+this.env.unflaggedicon+'" alt="" />';
+      for (n=0, len=this.env.coltypes.length; n<len; n++) {
+        col = this.env.coltypes[n];
+        if ((cell = thead.rows[0].cells[n]) && (col=='from' || col=='to')) {
+          cell.id = 'rcm'+col;
+          // if we have links for sorting, it's a bit more complicated...
+          if (cell.firstChild && cell.firstChild.tagName.toLowerCase()=='a') {
+            cell = cell.firstChild;
+            cell.onclick = function(){ return rcmail.command('sort', this.__col, this); };
+            cell.__col = col;
+          }
+          cell.innerHTML = this.get_label(col);
         }
-      else if (c=='attachment')
-        col.innerHTML = (attachment && this.env.attachmenticon ? '<img src="'+this.env.attachmenticon+'" alt="" />' : '&nbsp;');
-      else
-        col.innerHTML = cols[c];
-
-      row.appendChild(col);
       }
+    }
 
-    this.message_list.insert_row(row, attop);
-
-    // remove 'old' row
-    if (attop && this.env.pagesize && this.message_list.rowcount > this.env.pagesize) {
-      var uid = this.message_list.get_last_row();
-      this.message_list.remove_row(uid);
-      this.message_list.clear_selection(uid);
-      }
-    };
+    this.env.subject_col = null;
+    this.env.flagged_col = null;
+    this.env.status_col = null;
 
-  // messages list handling in background (for performance)
-  this.offline_message_list = function(flag)
-    {
+    if ((n = $.inArray('subject', this.env.coltypes)) >= 0) {
+      this.set_env('subject_col', n);
       if (this.message_list)
-       this.message_list.set_background_mode(flag);
-    };
+        this.message_list.subject_col = n;
+    }
+    if ((n = $.inArray('flag', this.env.coltypes)) >= 0)
+      this.set_env('flagged_col', n);
+    if ((n = $.inArray('status', this.env.coltypes)) >= 0)
+      this.set_env('status_col', n);
+
+    this.message_list.init_header();
+  };
 
   // replace content of row count display
   this.set_rowcount = function(text)
-    {
+  {
     $(this.gui_objects.countdisplay).html(text);
 
     // update page navigation buttons
     this.set_page_buttons();
-    };
+  };
 
   // replace content of mailboxname display
   this.set_mailboxname = function(content)
-    {
+  {
     if (this.gui_objects.mailboxname && content)
       this.gui_objects.mailboxname.innerHTML = content;
-    };
+  };
 
   // replace content of quota display
   this.set_quota = function(content)
-    {
+  {
     if (content && this.gui_objects.quotadisplay) {
-      if (typeof(content) == 'object')
+      if (typeof(content) == 'object' && content.type == 'image')
         this.percent_indicator(this.gui_objects.quotadisplay, content);
       else
         $(this.gui_objects.quotadisplay).html(content);
-      }
-    };
+    }
+  };
 
   // update the mailboxlist
   this.set_unread_count = function(mbox, count, set_title)
-    {
+  {
     if (!this.gui_objects.mailboxlist)
       return false;
 
     this.env.unread_counts[mbox] = count;
     this.set_unread_count_display(mbox, set_title);
-    }
+  };
 
   // update the mailbox count display
   this.set_unread_count_display = function(mbox, set_title)
-    {
+  {
     var reg, text_obj, item, mycount, childcount, div;
-    if (item = this.get_folder_li(mbox))
-      {
+
+    if (item = this.get_folder_li(mbox)) {
       mycount = this.env.unread_counts[mbox] ? this.env.unread_counts[mbox] : 0;
       text_obj = item.getElementsByTagName('a')[0];
       reg = /\s+\([0-9]+\)$/i;
 
       childcount = 0;
       if ((div = item.getElementsByTagName('div')[0]) &&
-          div.className.match(/collapsed/))
-        {
+          div.className.match(/collapsed/)) {
         // add children's counters
         for (var k in this.env.unread_counts) 
           if (k.indexOf(mbox + this.env.delimiter) == 0)
             childcount += this.env.unread_counts[k];
-        }
+      }
 
       if (mycount && text_obj.innerHTML.match(reg))
         text_obj.innerHTML = text_obj.innerHTML.replace(reg, ' ('+mycount+')');
@@ -3969,14 +4773,13 @@ function rcube_webmail()
         $(item).addClass('unread');
       else
         $(item).removeClass('unread');
-      }
+    }
 
     // set unread count to window title
     reg = /^\([0-9]+\)\s+/i;
-    if (set_title && document.title)
-      {
-      var doc_title = String(document.title);
-      var new_title = "";
+    if (set_title && document.title) {
+      var new_title = '',
+        doc_title = String(document.title);
 
       if (mycount && doc_title.match(reg))
         new_title = doc_title.replace(reg, '('+mycount+') ');
@@ -3984,150 +4787,157 @@ function rcube_webmail()
         new_title = '('+mycount+') '+doc_title;
       else
         new_title = doc_title.replace(reg, '');
-        
+
       this.set_pagetitle(new_title);
-      }
-    };
+    }
+  };
 
   // notifies that a new message(s) has hit the mailbox
   this.new_message_focus = function()
-    {
+  {
     // focus main window
     if (this.env.framed && window.parent)
       window.parent.focus();
     else
       window.focus();
-    }
+  };
 
   this.toggle_prefer_html = function(checkbox)
-    {
-    var addrbook_show_images;
-    if (addrbook_show_images = document.getElementById('rcmfd_addrbook_show_images'))
-      addrbook_show_images.disabled = !checkbox.checked;
-    }
+  {
+    var elem;
+    if (elem = document.getElementById('rcmfd_addrbook_show_images'))
+      elem.disabled = !checkbox.checked;
+  };
+
+  this.toggle_preview_pane = function(checkbox)
+  {
+    var elem;
+    if (elem = document.getElementById('rcmfd_preview_pane_mark_read'))
+      elem.disabled = !checkbox.checked;
+  };
 
   // display fetched raw headers
   this.set_headers = function(content)
   {
-    if (this.gui_objects.all_headers_row && this.gui_objects.all_headers_box && content) {
+    if (this.gui_objects.all_headers_row && this.gui_objects.all_headers_box && content)
       $(this.gui_objects.all_headers_box).html(content).show();
-
-      if (this.env.framed && parent.rcmail)
-        parent.rcmail.set_busy(false);
-      else
-        this.set_busy(false);
-    }
   };
 
   // display all-headers row and fetch raw message headers
   this.load_headers = function(elem)
-    {
+  {
     if (!this.gui_objects.all_headers_row || !this.gui_objects.all_headers_box || !this.env.uid)
       return;
-    
+
     $(elem).removeClass('show-headers').addClass('hide-headers');
     $(this.gui_objects.all_headers_row).show();
-    elem.onclick = function() { rcmail.hide_headers(elem); }
+    elem.onclick = function() { rcmail.hide_headers(elem); };
 
     // fetch headers only once
-    if (!this.gui_objects.all_headers_box.innerHTML)
-      {
-      this.display_message(this.get_label('loading'), 'loading', true);
-      this.http_post('headers', '_uid='+this.env.uid);
-      }
+    if (!this.gui_objects.all_headers_box.innerHTML) {
+      var lock = this.display_message(this.get_label('loading'), 'loading');
+      this.http_post('headers', '_uid='+this.env.uid, lock);
     }
+  };
 
   // hide all-headers row
   this.hide_headers = function(elem)
-    {
+  {
     if (!this.gui_objects.all_headers_row || !this.gui_objects.all_headers_box)
       return;
 
     $(elem).removeClass('hide-headers').addClass('show-headers');
     $(this.gui_objects.all_headers_row).hide();
-    elem.onclick = function() { rcmail.load_headers(elem); }
-    }
+    elem.onclick = function() { rcmail.load_headers(elem); };
+  };
 
   // percent (quota) indicator
   this.percent_indicator = function(obj, data)
-    {
+  {
     if (!data || !obj)
       return false;
 
-    var limit_high = 80;
-    var limit_mid  = 55;
-    var width = data.width ? data.width : this.env.indicator_width ? this.env.indicator_width : 100;
-    var height = data.height ? data.height : this.env.indicator_height ? this.env.indicator_height : 14;
-    var quota = data.percent ? Math.abs(parseInt(data.percent)) : 0;
-    var quota_width = parseInt(quota / 100 * width);
-    var pos = $(obj).position();
+    var limit_high = 80,
+      limit_mid  = 55,
+      width = data.width ? data.width : this.env.indicator_width ? this.env.indicator_width : 100,
+      height = data.height ? data.height : this.env.indicator_height ? this.env.indicator_height : 14,
+      quota = data.percent ? Math.abs(parseInt(data.percent)) : 0,
+      quota_width = parseInt(quota / 100 * width),
+      pos = $(obj).position();
+
+    // Opera bug?
+    pos.top = Math.max(0, pos.top);
 
     this.env.indicator_width = width;
     this.env.indicator_height = height;
-    
+
     // overlimit
     if (quota_width > width) {
       quota_width = width;
       quota = 100; 
-      }
-  
+    }
+
+    if (data.title)
+      data.title = this.get_label('quota') + ': ' +  data.title;
+
     // main div
     var main = $('<div>');
     main.css({position: 'absolute', top: pos.top, left: pos.left,
-       width: width + 'px', height: height + 'px', zIndex: 100, lineHeight: height + 'px'})
-       .attr('title', data.title).addClass('quota_text').html(quota + '%');
+           width: width + 'px', height: height + 'px', zIndex: 100, lineHeight: height + 'px'})
+         .attr('title', data.title).addClass('quota_text').html(quota + '%');
     // used bar
     var bar1 = $('<div>');
     bar1.css({position: 'absolute', top: pos.top + 1, left: pos.left + 1,
-       width: quota_width + 'px', height: height + 'px', zIndex: 99});
+           width: quota_width + 'px', height: height + 'px', zIndex: 99});
     // background
     var bar2 = $('<div>');
     bar2.css({position: 'absolute', top: pos.top + 1, left: pos.left + 1,
-       width: width + 'px', height: height + 'px', zIndex: 98})
-       .addClass('quota_bg');
+           width: width + 'px', height: height + 'px', zIndex: 98})
+         .addClass('quota_bg');
 
     if (quota >= limit_high) {
       main.addClass(' quota_text_high');
       bar1.addClass('quota_high');
-      }
+    }
     else if(quota >= limit_mid) {
       main.addClass(' quota_text_mid');
       bar1.addClass('quota_mid');
-      }
+    }
     else {
       main.addClass(' quota_text_normal');
       bar1.addClass('quota_low');
-      }
+    }
 
     // replace quota image
-    obj.innerHTML = '';
-    $(obj).append(bar1).append(bar2).append(main);
-    }
+    $(obj).html('').append(bar1).append(bar2).append(main);
+    // update #quotaimg title
+    $('#quotaimg').attr('title', data.title);
+  };
 
   /********************************************************/
   /*********  html to text conversion functions   *********/
   /********************************************************/
 
   this.html2plain = function(htmlText, id)
-    {
-    var url = this.env.bin_path+'html2text.php';
-    var rcmail = this;
+  {
+    var rcmail = this,
+      url = '?_task=utils&_action=html2text',
+      lock = this.set_busy(true, 'converting');
 
-    this.set_busy(true, 'converting');
-    console.log('HTTP POST: '+url);
+    console.log('HTTP POST: ' + url);
 
     $.ajax({ type: 'POST', url: url, data: htmlText, contentType: 'application/octet-stream',
-      error: function(o) { rcmail.http_error(o); },
-      success: function(data) { rcmail.set_busy(false); $(document.getElementById(id)).val(data); console.log(data); }
-      });
-    }
+      error: function(o, status, err) { rcmail.http_error(o, status, err, lock); },
+      success: function(data) { rcmail.set_busy(false, null, lock); $(document.getElementById(id)).val(data); console.log(data); }
+    });
+  };
 
   this.plain2html = function(plainText, id)
-    {
-    this.set_busy(true, 'converting');
+  {
+    var lock = this.set_busy(true, 'converting');
     $(document.getElementById(id)).val('<pre>'+plainText+'</pre>');
-    this.set_busy(false);
-    }
+    this.set_busy(false, null, lock);
+  };
 
 
   /********************************************************/
@@ -4135,58 +4945,114 @@ function rcube_webmail()
   /********************************************************/
 
   this.redirect = function(url, lock)
-    {
+  {
     if (lock || lock === null)
       this.set_busy(true);
 
     if (this.env.framed && window.parent)
       parent.location.href = url;
-    else  
+    else
       location.href = url;
-    };
+  };
 
   this.goto_url = function(action, query, lock)
-    {
-    var querystring = query ? '&'+query : '';
-    this.redirect(this.env.comm_path+'&_action='+action+querystring, lock);
-    };
+  {
+    var url = this.env.comm_path,
+     querystring = query ? '&'+query : '';
+
+    // overwrite task name
+    if (action.match(/([a-z]+)\/([a-z-_]+)/)) {
+      action = RegExp.$2;
+      url = url.replace(/\_task=[a-z]+/, '_task='+RegExp.$1);
+    }
+
+    this.redirect(url+'&_action='+action+querystring, lock);
+  };
 
   // send a http request to the server
-  this.http_request = function(action, querystring, lock)
+  this.http_request = function(action, query, lock)
   {
-    querystring += (querystring ? '&' : '') + '_remote=1';
-    var url = this.env.comm_path + '&_action=' + action + '&' + querystring
-    
+    var url = this.env.comm_path;
+
+    // overwrite task name
+    if (action.match(/([a-z]+)\/([a-z-_]+)/)) {
+      action = RegExp.$2;
+      url = url.replace(/\_task=[a-z]+/, '_task='+RegExp.$1);
+    }
+
+    // trigger plugin hook
+    var result = this.triggerEvent('request'+action, query);
+
+    if (typeof result != 'undefined') {
+      // abort if one the handlers returned false
+      if (result === false)
+        return false;
+      else
+        query = result;
+    }
+
+    url += '&_remote=1&_action=' + action + (query ? '&' : '') + query;
+
     // send request
-    console.log('HTTP POST: ' + url);
-    jQuery.get(url, { _unlock:(lock?1:0) }, function(data){ ref.http_response(data); }, 'json');
+    console.log('HTTP GET: ' + url);
+    $.ajax({
+      type: 'GET', url: url, data: { _unlock:(lock?lock:0) }, dataType: 'json',
+      success: function(data){ ref.http_response(data); },
+      error: function(o, status, err) { rcmail.http_error(o, status, err, lock); }
+    });
   };
 
   // send a http POST request to the server
   this.http_post = function(action, postdata, lock)
   {
-    var url = this.env.comm_path+'&_action=' + action;
-    
+    var url = this.env.comm_path;
+
+    // overwrite task name
+    if (action.match(/([a-z]+)\/([a-z-_]+)/)) {
+      action = RegExp.$2;
+      url = url.replace(/\_task=[a-z]+/, '_task='+RegExp.$1);
+    }
+
+    url += '&_action=' + action;
+
     if (postdata && typeof(postdata) == 'object') {
       postdata._remote = 1;
-      postdata._unlock = (lock ? 1 : 0);
+      postdata._unlock = (lock ? lock : 0);
     }
     else
-      postdata += (postdata ? '&' : '') + '_remote=1' + (lock ? '&_unlock=1' : '');
+      postdata += (postdata ? '&' : '') + '_remote=1' + (lock ? '&_unlock='+lock : '');
+
+    // trigger plugin hook
+    var result = this.triggerEvent('request'+action, postdata);
+    if (typeof result != 'undefined') {
+      // abort if one the handlers returned false
+      if (result === false)
+        return false;
+      else
+        postdata = result;
+    }
 
     // send request
     console.log('HTTP POST: ' + url);
-    jQuery.post(url, postdata, function(data){ ref.http_response(data); }, 'json');
+    $.ajax({
+      type: 'POST', url: url, data: postdata, dataType: 'json',
+      success: function(data){ ref.http_response(data); },
+      error: function(o, status, err) { rcmail.http_error(o, status, err, lock); }
+    });
   };
 
   // handle HTTP response
   this.http_response = function(response)
   {
-    var console_msg = '';
-    
+    if (!response)
+      return;
+
     if (response.unlock)
       this.set_busy(false);
 
+    this.triggerEvent('responsebefore', {response: response});
+    this.triggerEvent('responsebefore'+response.action, {response: response});
+
     // set env vars
     if (response.env)
       this.set_env(response.env);
@@ -4203,13 +5069,13 @@ function rcube_webmail()
       console.log(response.exec);
       eval(response.exec);
     }
-    
+
     // execute callback functions of plugins
     if (response.callbacks && response.callbacks.length) {
       for (var i=0; i < response.callbacks.length; i++)
         this.triggerEvent(response.callbacks[i][0], response.callbacks[i][1]);
     }
+
     // process the response data according to the sent action
     switch (response.action) {
       case 'delete':
@@ -4219,79 +5085,114 @@ function rcube_webmail()
           this.enable_command('delete', 'edit', (uid && this.contact_list.rows[uid] && this.env.address_sources && !this.env.address_sources[this.env.source].readonly));
           this.enable_command('export', (this.contact_list && this.contact_list.rowcount > 0));
         }
-      
+
       case 'moveto':
         if (this.env.action == 'show') {
-         // re-enable commands on move/delete error
-         this.enable_command('reply', 'reply-all', 'forward', 'delete', 'mark', 'print', 'open', 'edit', 'viewsource', 'download', true);
-        } else if (this.message_list)
-          this.message_list.init();
-        break;
-        
+          // re-enable commands on move/delete error
+          this.enable_command(this.env.message_commands, true);
+          if (!this.env.list_post)
+            this.enable_command('reply-list', false);
+        }
+        else if (this.task == 'addressbook') {
+          this.triggerEvent('listupdate', { folder:this.env.source, rowcount:this.contact_list.rowcount });
+        }
+
       case 'purge':
       case 'expunge':
-        if (!this.env.messagecount && this.task == 'mail') {
-          // clear preview pane content
-          if (this.env.contentframe)
-            this.show_contentframe(false);
-          // disable commands useless when mailbox is empty
-          this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', 
-           'mark', 'viewsource', 'open', 'edit', 'download', 'print', 'load-attachment', 
-           'purge', 'expunge', 'select-all', 'select-none', 'sort', false);
+        if (this.task == 'mail') {
+          if (!this.env.messagecount) {
+            // clear preview pane content
+            if (this.env.contentframe)
+              this.show_contentframe(false);
+            // disable commands useless when mailbox is empty
+            this.enable_command(this.env.message_commands, 'purge', 'expunge',
+              'select-all', 'select-none', 'sort', 'expand-all', 'expand-unread', 'collapse-all', false);
+          }
+          if (this.message_list)
+            this.triggerEvent('listupdate', { folder:this.env.mailbox, rowcount:this.message_list.rowcount });
         }
         break;
 
       case 'check-recent':
       case 'getunread':
+      case 'search':
       case 'list':
         if (this.task == 'mail') {
-          if (this.message_list && response.action == 'list')
-            this.msglist_select(this.message_list);
           this.enable_command('show', 'expunge', 'select-all', 'select-none', 'sort', (this.env.messagecount > 0));
           this.enable_command('purge', this.purge_mailbox_test());
-          
-          if (response.action == 'list')
+          this.enable_command('expand-all', 'expand-unread', 'collapse-all', this.env.threading && this.env.messagecount);
+
+          if (response.action == 'list' || response.action == 'search') {
+            this.msglist_select(this.message_list);
             this.triggerEvent('listupdate', { folder:this.env.mailbox, rowcount:this.message_list.rowcount });
+          }
         }
         else if (this.task == 'addressbook') {
           this.enable_command('export', (this.contact_list && this.contact_list.rowcount > 0));
-          
-          if (response.action == 'list')
+
+          if (response.action == 'list' || response.action == 'search') {
+            this.enable_command('group-create',
+              (this.env.address_sources[this.env.source].groups && !this.env.address_sources[this.env.source].readonly));
+            this.enable_command('group-rename', 'group-delete',
+              (this.env.address_sources[this.env.source].groups && this.env.group && !this.env.address_sources[this.env.source].readonly));
             this.triggerEvent('listupdate', { folder:this.env.source, rowcount:this.contact_list.rowcount });
+          }
         }
         break;
     }
+
+    if (response.unlock)
+      this.hide_message(response.unlock);
+
+    this.triggerEvent('responseafter', {response: response});
+    this.triggerEvent('responseafter'+response.action, {response: response});
   };
 
   // handle HTTP request errors
-  this.http_error = function(request, status, err)
-    {
+  this.http_error = function(request, status, err, lock)
+  {
     var errmsg = request.statusText;
 
-    this.set_busy(false);
+    this.set_busy(false, null, lock);
     request.abort();
-    
+
     if (errmsg)
       this.display_message(this.get_label('servererror') + ' (' + errmsg + ')', 'error');
-    };
+  };
+
+  // starts interval for keep-alive/check-recent signal
+  this.start_keepalive = function()
+  {
+    if (this._int)
+      clearInterval(this._int);
+
+    if (this.env.keep_alive && !this.env.framed && this.task == 'mail' && this.gui_objects.mailboxlist)
+      this._int = setInterval(function(){ ref.check_for_recent(false); }, this.env.keep_alive * 1000);
+    else if (this.env.keep_alive && !this.env.framed && this.task != 'login' && this.env.action != 'print')
+      this._int = setInterval(function(){ ref.send_keep_alive(); }, this.env.keep_alive * 1000);
+  };
 
-  // use an image to send a keep-alive siganl to the server
+  // sends keep-alive signal to the server
   this.send_keep_alive = function()
-    {
+  {
     var d = new Date();
     this.http_request('keep-alive', '_t='+d.getTime());
-    };
+  };
 
-  // send periodic request to check for recent messages
-  this.check_for_recent = function(setbusy)
-    {
+  // sends request to check for recent messages
+  this.check_for_recent = function(refresh)
+  {
     if (this.busy)
       return;
 
-    if (setbusy)
-      this.set_busy(true, 'checkingmail');
+    var lock, addurl = '_t=' + (new Date().getTime()) + '&_mbox=' + urlencode(this.env.mailbox);
 
-    var addurl = '_t=' + (new Date().getTime());
+    if (refresh) {
+      lock = this.set_busy(true, 'checkingmail');
+      addurl += '&_refresh=1';
+      // reset check-recent interval
+      this.start_keepalive();
+    }
 
     if (this.gui_objects.messagelist)
       addurl += '&_list=1';
@@ -4300,88 +5201,95 @@ function rcube_webmail()
     if (this.env.search_request)
       addurl += '&_search=' + this.env.search_request;
 
-    this.http_request('check-recent', addurl, true);
-    };
+    this.http_request('check-recent', addurl, lock);
+  };
 
 
   /********************************************************/
   /*********            helper methods            *********/
   /********************************************************/
-  
+
   // check if we're in show mode or if we have a unique selection
   // and return the message uid
   this.get_single_uid = function()
-    {
+  {
     return this.env.uid ? this.env.uid : (this.message_list ? this.message_list.get_single_selection() : null);
-    };
+  };
 
   // same as above but for contacts
   this.get_single_cid = function()
-    {
+  {
     return this.env.cid ? this.env.cid : (this.contact_list ? this.contact_list.get_single_selection() : null);
-    };
-
+  };
 
+  // gets cursor position
   this.get_caret_pos = function(obj)
-    {
+  {
     if (typeof(obj.selectionEnd)!='undefined')
       return obj.selectionEnd;
-    else if (document.selection && document.selection.createRange)
-      {
+    else if (document.selection && document.selection.createRange) {
       var range = document.selection.createRange();
       if (range.parentElement()!=obj)
         return 0;
 
       var gm = range.duplicate();
-      if (obj.tagName=='TEXTAREA')
+      if (obj.tagName == 'TEXTAREA')
         gm.moveToElementText(obj);
       else
         gm.expand('textedit');
-      
+
       gm.setEndPoint('EndToStart', range);
       var p = gm.text.length;
 
       return p<=obj.value.length ? p : -1;
-      }
+    }
     else
       return obj.value.length;
-    };
+  };
 
+  // moves cursor to specified position
   this.set_caret_pos = function(obj, pos)
-    {
+  {
     if (obj.setSelectionRange)
       obj.setSelectionRange(pos, pos);
-    else if (obj.createTextRange)
-      {
+    else if (obj.createTextRange) {
       var range = obj.createTextRange();
       range.collapse(true);
       range.moveEnd('character', pos);
       range.moveStart('character', pos);
       range.select();
-      }
     }
+  };
 
-  // set all fields of a form disabled
+  // disable/enable all fields of a form
   this.lock_form = function(form, lock)
-    {
+  {
     if (!form || !form.elements)
       return;
-    
-    var type;
-    for (var n=0; n<form.elements.length; n++)
-      {
-      type = form.elements[n];
-      if (type=='hidden')
+
+    var n, len, elm;
+
+    if (lock)
+      this.disabled_form_elements = [];
+
+    for (n=0, len=form.elements.length; n<len; n++) {
+      elm = form.elements[n];
+
+      if (elm.type == 'hidden')
         continue;
-        
-      form.elements[n].disabled = lock;
-      }
-    };
-    
-}  // end object rcube_webmail
 
+      // remember which elem was disabled before lock
+      if (lock && elm.disabled)
+        this.disabled_form_elements.push(elm);
+      else if (lock || $.inArray(elm, this.disabled_form_elements)<0)
+        elm.disabled = lock;
+    }
+  };
+
+}  // end object rcube_webmail
 
 // copy event engine prototype
 rcube_webmail.prototype.addEventListener = rcube_event_engine.prototype.addEventListener;
 rcube_webmail.prototype.removeEventListener = rcube_event_engine.prototype.removeEventListener;
 rcube_webmail.prototype.triggerEvent = rcube_event_engine.prototype.triggerEvent;
+
index f9573a4c09a1f8642d5195e1446ffd37f5a0f1a9..0f32b4bd6821802d6ee5e4fee6dbd1eda8325108 100644 (file)
-var CONTROL_KEY=1;
-var SHIFT_KEY=2;
-var CONTROL_SHIFT_KEY=3;
-function roundcube_browser(){
-this.ver=parseFloat(navigator.appVersion);
-this.appver=navigator.appVersion;
-this.agent=navigator.userAgent;
-this.name=navigator.appName;
-this.vendor=navigator.vendor?navigator.vendor:"";
-this.vendver=navigator.vendorSub?parseFloat(navigator.vendorSub):0;
-this.product=navigator.product?navigator.product:"";
-this.platform=String(navigator.platform).toLowerCase();
-this.lang=(navigator.language)?navigator.language.substring(0,2):(navigator.browserLanguage)?navigator.browserLanguage.substring(0,2):(navigator.systemLanguage)?navigator.systemLanguage.substring(0,2):"en";
-this.win=(this.platform.indexOf("win")>=0)?true:false;
-this.mac=(this.platform.indexOf("mac")>=0)?true:false;
-this.linux=(this.platform.indexOf("linux")>=0)?true:false;
-this.unix=(this.platform.indexOf("unix")>=0)?true:false;
-this.dom=document.getElementById?true:false;
-this.dom2=(document.addEventListener&&document.removeEventListener);
-this.ie=(document.all)?true:false;
-this.ie4=(this.ie&&!this.dom);
-this.ie5=(this.dom&&this.appver.indexOf("MSIE 5")>0);
-this.ie8=(this.dom&&this.appver.indexOf("MSIE 8")>0);
-this.ie7=(this.dom&&this.appver.indexOf("MSIE 7")>0);
-this.ie6=(this.dom&&!this.ie8&&!this.ie7&&this.appver.indexOf("MSIE 6")>0);
-this.mz=(this.dom&&this.ver>=5);
-this.ns=((this.ver<5&&this.name=="Netscape")||(this.ver>=5&&this.vendor.indexOf("Netscape")>=0));
-this.ns6=(this.ns&&parseInt(this.vendver)==6);
-this.ns7=(this.ns&&parseInt(this.vendver)==7);
-this.safari=(this.agent.toLowerCase().indexOf("safari")>0||this.agent.toLowerCase().indexOf("applewebkit")>0);
-this.konq=(this.agent.toLowerCase().indexOf("konqueror")>0);
-this.opera=(window.opera)?true:false;
-if(this.opera&&window.RegExp){
-this.vendver=(/opera(\s|\/)([0-9\.]+)/i.test(navigator.userAgent))?parseFloat(RegExp.$2):-1;
-}else{
-if(!this.vendver&&this.safari){
-this.vendver=(/(safari|applewebkit)\/([0-9]+)/i.test(this.agent))?parseInt(RegExp.$2):0;
-}else{
-if((!this.vendver&&this.mz)||this.agent.indexOf("Camino")>0){
-this.vendver=(/rv:([0-9\.]+)/.test(this.agent))?parseFloat(RegExp.$1):0;
-}else{
-if(this.ie&&window.RegExp){
-this.vendver=(/msie\s+([0-9\.]+)/i.test(this.agent))?parseFloat(RegExp.$1):0;
-}else{
-if(this.konq&&window.RegExp){
-this.vendver=(/khtml\/([0-9\.]+)/i.test(this.agent))?parseFloat(RegExp.$1):0;
-}
-}
-}
-}
-}
-if(this.safari&&(/;\s+([a-z]{2})-[a-z]{2}\)/i.test(this.agent))){
-this.lang=RegExp.$1;
-}
-this.dhtml=((this.ie4&&this.win)||this.ie5||this.ie6||this.ns4||this.mz);
-this.vml=(this.win&&this.ie&&this.dom&&!this.opera);
-this.pngalpha=(this.mz||(this.opera&&this.vendver>=6)||(this.ie&&this.mac&&this.vendver>=5)||(this.ie&&this.win&&this.vendver>=5.5)||this.safari);
-this.opacity=(this.mz||(this.ie&&this.vendver>=5.5&&!this.opera)||(this.safari&&this.vendver>=100));
-this.cookies=navigator.cookieEnabled;
-this.xmlhttp_test=function(){
-var _1=new Function("try{var o=new ActiveXObject('Microsoft.XMLHTTP');return true;}catch(err){return false;}");
-this.xmlhttp=(window.XMLHttpRequest||(window.ActiveXObject&&_1()))?true:false;
-return this.xmlhttp;
-};
-};
-var rcube_event={get_target:function(e){
-e=e||window.event;
-return e&&e.target?e.target:e.srcElement;
-},get_keycode:function(e){
-e=e||window.event;
-return e&&e.keyCode?e.keyCode:(e&&e.which?e.which:0);
-},get_button:function(e){
-e=e||window.event;
-return e&&(typeof e.button!="undefined")?e.button:(e&&e.which?e.which:0);
-},get_modifier:function(e){
-var _6=0;
-e=e||window.event;
-if(bw.mac&&e){
-_6+=(e.metaKey&&CONTROL_KEY)+(e.shiftKey&&SHIFT_KEY);
-return _6;
-}
-if(e){
-_6+=(e.ctrlKey&&CONTROL_KEY)+(e.shiftKey&&SHIFT_KEY);
-return _6;
-}
-},get_mouse_pos:function(e){
-if(!e){
-e=window.event;
-}
-var mX=(e.pageX)?e.pageX:e.clientX;
-var mY=(e.pageY)?e.pageY:e.clientY;
-if(document.body&&document.all){
-mX+=document.body.scrollLeft;
-mY+=document.body.scrollTop;
-}
-if(e._offset){
-mX+=e._offset.left;
-mY+=e._offset.top;
-}
-return {x:mX,y:mY};
-},add_listener:function(p){
-if(!p.object||!p.method){
-return;
-}
-if(!p.element){
-p.element=document;
-}
-if(!p.object._rc_events){
-p.object._rc_events=[];
-}
-var _b=p.event+"*"+p.method;
-if(!p.object._rc_events[_b]){
-p.object._rc_events[_b]=function(e){
-return p.object[p.method](e);
-};
-}
-if(p.element.addEventListener){
-p.element.addEventListener(p.event,p.object._rc_events[_b],false);
-}else{
-if(p.element.attachEvent){
-p.element.detachEvent("on"+p.event,p.object._rc_events[_b]);
-p.element.attachEvent("on"+p.event,p.object._rc_events[_b]);
-}else{
-p.element["on"+p.event]=p.object._rc_events[_b];
-}
-}
-},remove_listener:function(p){
-if(!p.element){
-p.element=document;
-}
-var _e=p.event+"*"+p.method;
-if(p.object&&p.object._rc_events&&p.object._rc_events[_e]){
-if(p.element.removeEventListener){
-p.element.removeEventListener(p.event,p.object._rc_events[_e],false);
-}else{
-if(p.element.detachEvent){
-p.element.detachEvent("on"+p.event,p.object._rc_events[_e]);
-}else{
-p.element["on"+p.event]=null;
-}
-}
-}
-},cancel:function(_f){
-var e=_f?_f:window.event;
-if(e.preventDefault){
-e.preventDefault();
-}
-if(e.stopPropagation){
-e.stopPropagation();
-}
-e.cancelBubble=true;
-e.returnValue=false;
-return false;
-}};
-function rcube_event_engine(){
-this._events={};
-};
-rcube_event_engine.prototype={addEventListener:function(evt,_12,obj){
-if(!this._events){
-this._events={};
-}
-if(!this._events[evt]){
-this._events[evt]=[];
-}
-var e={func:_12,obj:obj?obj:window};
-this._events[evt][this._events[evt].length]=e;
-},removeEventListener:function(evt,_16,obj){
-if(typeof obj=="undefined"){
-obj=window;
-}
-for(var h,i=0;this._events&&this._events[evt]&&i<this._events[evt].length;i++){
-if((h=this._events[evt][i])&&h.func==_16&&h.obj==obj){
-this._events[evt][i]=null;
-}
-}
-},triggerEvent:function(evt,e){
-var ret,h;
-if(typeof e=="undefined"){
-e=this;
-}else{
-if(typeof e=="object"){
-e.event=evt;
-}
-}
-if(this._events&&this._events[evt]&&!this._event_exec){
-this._event_exec=true;
-for(var i=0;i<this._events[evt].length;i++){
-if((h=this._events[evt][i])){
-if(typeof h.func=="function"){
-ret=h.func.call?h.func.call(h.obj,e):h.func(e);
-}else{
-if(typeof h.obj[h.func]=="function"){
-ret=h.obj[h.func](e);
-}
-}
-if(typeof ret!="undefined"&&!ret){
-break;
-}
-}
-}
-}
-this._event_exec=false;
-return ret;
-}};
-function rcube_layer(id,_20){
-this.name=id;
-this.create=function(arg){
-var l=(arg.x)?arg.x:0;
-var t=(arg.y)?arg.y:0;
-var w=arg.width;
-var h=arg.height;
-var z=arg.zindex;
-var vis=arg.vis;
-var _28=arg.parent;
-var obj;
-obj=document.createElement("DIV");
-with(obj){
-id=this.name;
-with(style){
-position="absolute";
-visibility=(vis)?(vis==2)?"inherit":"visible":"hidden";
-left=l+"px";
-top=t+"px";
-if(w){
-width=w.toString().match(/\%$/)?w:w+"px";
-}
-if(h){
-height=h.toString().match(/\%$/)?h:h+"px";
-}
-if(z){
-zIndex=z;
-}
-}
-}
-if(_28){
-_28.appendChild(obj);
-}else{
-document.body.appendChild(obj);
-}
-this.elm=obj;
-};
-if(_20!=null){
-this.create(_20);
-this.name=this.elm.id;
-}else{
-this.elm=document.getElementById(id);
-}
-if(!this.elm){
-return false;
-}
-this.css=this.elm.style;
-this.event=this.elm;
-this.width=this.elm.offsetWidth;
-this.height=this.elm.offsetHeight;
-this.x=parseInt(this.elm.offsetLeft);
-this.y=parseInt(this.elm.offsetTop);
-this.visible=(this.css.visibility=="visible"||this.css.visibility=="show"||this.css.visibility=="inherit")?true:false;
-this.move=function(x,y){
-this.x=x;
-this.y=y;
-this.css.left=Math.round(this.x)+"px";
-this.css.top=Math.round(this.y)+"px";
-};
-this.resize=function(w,h){
-this.css.width=w+"px";
-this.css.height=h+"px";
-this.width=w;
-this.height=h;
-};
-this.show=function(a){
-if(a==1){
-this.css.visibility="visible";
-this.visible=true;
-}else{
-if(a==2){
-this.css.visibility="inherit";
-this.visible=true;
-}else{
-this.css.visibility="hidden";
-this.visible=false;
-}
-}
-};
-this.write=function(_2f){
-this.elm.innerHTML=_2f;
-};
-};
-function rcube_check_email(_30,_31){
-if(_30&&window.RegExp){
-var _32="[^\\x0d\\x22\\x5c\\x80-\\xff]";
-var _33="[^\\x0d\\x5b-\\x5d\\x80-\\xff]";
-var _34="[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+";
-var _35="\\x5c[\\x00-\\x7f]";
-var _36="\\x5b("+_33+"|"+_35+")*\\x5d";
-var _37="\\x22("+_32+"|"+_35+")*\\x22";
-var _38="("+_34+"|"+_36+")";
-var _39="("+_34+"|"+_37+")";
-var _3a=_38+"(\\x2e"+_38+")*";
-var _3b=_39+"(\\x2e"+_39+")*";
-var _3c=_3b+"\\x40"+_3a;
-var _3d="[,;s\n]";
-var _3e=_31?new RegExp("(^|<|"+_3d+")"+_3c+"($|>|"+_3d+")","i"):new RegExp("^"+_3c+"$","i");
-return _3e.test(_30)?true:false;
-}
-return false;
-};
-function find_in_array(){
-var _3f=find_in_array.arguments;
-if(!_3f.length){
-return -1;
-}
-var _40=typeof (_3f[0])=="object"?_3f[0]:_3f.length>1&&typeof (_3f[1])=="object"?_3f[1]:new Array();
-var _41=typeof (_3f[0])!="object"?_3f[0]:_3f.length>1&&typeof (_3f[1])!="object"?_3f[1]:"";
-var _42=_3f.length==3?_3f[2]:false;
-if(!_40.length){
-return -1;
-}
-for(var i=0;i<_40.length;i++){
-if(_42&&_40[i].toLowerCase()==_41.toLowerCase()){
-return i;
-}else{
-if(_40[i]==_41){
-return i;
-}
-}
-}
-return -1;
-};
-function urlencode(str){
-return window.encodeURIComponent?encodeURIComponent(str):escape(str);
-};
-function rcube_find_object(id,d){
-var n,f,obj,e;
-if(!d){
-d=document;
-}
-if(d.getElementsByName&&(e=d.getElementsByName(id))){
-obj=e[0];
-}
-if(!obj&&d.getElementById){
-obj=d.getElementById(id);
-}
-if(!obj&&d.all){
-obj=d.all[id];
-}
-if(!obj&&d.images.length){
-obj=d.images[id];
-}
-if(!obj&&d.forms.length){
-for(f=0;f<d.forms.length;f++){
-if(d.forms[f].name==id){
-obj=d.forms[f];
-}else{
-if(d.forms[f].elements[id]){
-obj=d.forms[f].elements[id];
-}
-}
-}
-}
-if(!obj&&d.layers){
-if(d.layers[id]){
-obj=d.layers[id];
-}
-for(n=0;!obj&&n<d.layers.length;n++){
-obj=rcube_find_object(id,d.layers[n].document);
-}
-}
-return obj;
-};
-function rcube_mouse_is_over(ev,obj){
-var _4d=rcube_event.get_mouse_pos(ev);
-var pos=$(obj).offset();
-return ((_4d.x>=pos.left)&&(_4d.x<(pos.left+obj.offsetWidth))&&(_4d.y>=pos.top)&&(_4d.y<(pos.top+obj.offsetHeight)));
-};
-function setCookie(_4f,_50,_51,_52,_53,_54){
-var _55=_4f+"="+escape(_50)+(_51?"; expires="+_51.toGMTString():"")+(_52?"; path="+_52:"")+(_53?"; domain="+_53:"")+(_54?"; secure":"");
-document.cookie=_55;
-};
-roundcube_browser.prototype.set_cookie=setCookie;
-function getCookie(_56){
-var dc=document.cookie;
-var _58=_56+"=";
-var _59=dc.indexOf("; "+_58);
-if(_59==-1){
-_59=dc.indexOf(_58);
-if(_59!=0){
-return null;
-}
-}else{
-_59+=2;
-}
-var end=document.cookie.indexOf(";",_59);
-if(end==-1){
-end=dc.length;
-}
-return unescape(dc.substring(_59+_58.length,end));
-};
-roundcube_browser.prototype.get_cookie=getCookie;
-function rcube_console(){
-this.log=function(msg){
-var box=rcube_find_object("dbgconsole");
-if(box){
-if(msg.charAt(msg.length-1)=="\n"){
-msg+="--------------------------------------\n";
-}else{
-msg+="\n--------------------------------------\n";
-}
-if(bw.konq){
-box.innerText+=msg;
-box.value=box.innerText;
-}else{
-box.value+=msg;
-}
-}
-};
-this.reset=function(){
-var box=rcube_find_object("dbgconsole");
-if(box){
-box.innerText=box.value="";
-}
-};
-};
-var bw=new roundcube_browser();
-if(!window.console){
-console=new rcube_console();
-}
-RegExp.escape=function(str){
-return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1");
-};
-if(bw.ie){
-document._getElementById=document.getElementById;
-document.getElementById=function(id){
-var i=0;
-var o=document._getElementById(id);
-if(!o||o.id!=id){
-while((o=document.all[i])&&o.id!=id){
-i++;
-}
-}
-return o;
-};
-}
-
+var CONTROL_KEY=1,SHIFT_KEY=2,CONTROL_SHIFT_KEY=3;
+function roundcube_browser(){var a=navigator;this.ver=parseFloat(a.appVersion);this.appver=a.appVersion;this.agent=a.userAgent;this.agent_lc=a.userAgent.toLowerCase();this.name=a.appName;this.vendor=a.vendor?a.vendor:"";this.vendver=a.vendorSub?parseFloat(a.vendorSub):0;this.product=a.product?a.product:"";this.platform=String(a.platform).toLowerCase();this.lang=a.language?a.language.substring(0,2):a.browserLanguage?a.browserLanguage.substring(0,2):a.systemLanguage?a.systemLanguage.substring(0,2):
+"en";this.win=this.platform.indexOf("win")>=0;this.mac=this.platform.indexOf("mac")>=0;this.linux=this.platform.indexOf("linux")>=0;this.unix=this.platform.indexOf("unix")>=0;this.dom=document.getElementById?true:false;this.dom2=document.addEventListener&&document.removeEventListener;this.ie4=(this.ie=document.all&&!window.opera)&&!this.dom;this.ie5=this.dom&&this.appver.indexOf("MSIE 5")>0;this.ie8=this.dom&&this.appver.indexOf("MSIE 8")>0;this.ie7=this.dom&&this.appver.indexOf("MSIE 7")>0;this.ie6=
+this.dom&&!this.ie8&&!this.ie7&&this.appver.indexOf("MSIE 6")>0;this.mz=this.dom&&this.ver>=5;this.ns6=(this.ns=this.ver<5&&this.name=="Netscape"||this.ver>=5&&this.vendor.indexOf("Netscape")>=0)&&parseInt(this.vendver)==6;this.ns7=this.ns&&parseInt(this.vendver)==7;this.chrome=this.agent_lc.indexOf("chrome")>0;this.safari=!this.chrome&&(this.agent_lc.indexOf("safari")>0||this.agent_lc.indexOf("applewebkit")>0);this.konq=this.agent_lc.indexOf("konqueror")>0;this.iphone=this.safari&&this.agent_lc.indexOf("iphone")>
+0;this.ipad=this.safari&&this.agent_lc.indexOf("ipad")>0;if((this.opera=window.opera?true:false)&&window.RegExp)this.vendver=/opera(\s|\/)([0-9\.]+)/.test(this.agent_lc)?parseFloat(RegExp.$2):-1;else if(this.chrome&&window.RegExp)this.vendver=/chrome\/([0-9\.]+)/.test(this.agent_lc)?parseFloat(RegExp.$1):0;else if(!this.vendver&&this.safari)this.vendver=/(safari|applewebkit)\/([0-9]+)/.test(this.agent_lc)?parseInt(RegExp.$2):0;else if(!this.vendver&&this.mz||this.agent.indexOf("Camino")>0)this.vendver=
+/rv:([0-9\.]+)/.test(this.agent)?parseFloat(RegExp.$1):0;else if(this.ie&&window.RegExp)this.vendver=/msie\s+([0-9\.]+)/.test(this.agent_lc)?parseFloat(RegExp.$1):0;else if(this.konq&&window.RegExp)this.vendver=/khtml\/([0-9\.]+)/.test(this.agent_lc)?parseFloat(RegExp.$1):0;if(this.safari&&/;\s+([a-z]{2})-[a-z]{2}\)/.test(this.agent_lc))this.lang=RegExp.$1;this.dhtml=this.ie4&&this.win||this.ie5||this.ie6||this.ns4||this.mz;this.vml=this.win&&this.ie&&this.dom&&!this.opera;this.pngalpha=this.mz||
+this.opera&&this.vendver>=6||this.ie&&this.mac&&this.vendver>=5||this.ie&&this.win&&this.vendver>=5.5||this.safari;this.opacity=this.mz||this.ie&&this.vendver>=5.5&&!this.opera||this.safari&&this.vendver>=100;this.cookies=a.cookieEnabled;this.xmlhttp_test=function(){var b=new Function("try{var o=new ActiveXObject('Microsoft.XMLHTTP');return true;}catch(err){return false;}");return this.xmlhttp=window.XMLHttpRequest||window.ActiveXObject&&b()};this.set_html_class=function(){var b=" js";if(this.ie){b+=
+" ie";if(this.ie5)b+=" ie5";else if(this.ie6)b+=" ie6";else if(this.ie7)b+=" ie7";else if(this.ie8)b+=" ie8"}else if(this.opera)b+=" opera";else if(this.konq)b+=" konqueror";else if(this.safari)b+=" safari";if(this.chrome)b+=" chrome";else if(this.iphone)b+=" iphone";else if(this.ipad)b+=" ipad";else if(this.ns6)b+=" netscape6";else if(this.ns7)b+=" netscape7";if(document.documentElement)document.documentElement.className+=b}}
+var rcube_event={get_target:function(a){return(a=a||window.event)&&a.target?a.target:a.srcElement},get_keycode:function(a){return(a=a||window.event)&&a.keyCode?a.keyCode:a&&a.which?a.which:0},get_button:function(a){return(a=a||window.event)&&typeof a.button!="undefined"?a.button:a&&a.which?a.which:0},get_modifier:function(a){var b=0;a=a||window.event;if(bw.mac&&a){b+=(a.metaKey&&CONTROL_KEY)+(a.shiftKey&&SHIFT_KEY);return b}if(a){b+=(a.ctrlKey&&CONTROL_KEY)+(a.shiftKey&&SHIFT_KEY);return b}},get_mouse_pos:function(a){if(!a)a=
+window.event;var b=a.pageX?a.pageX:a.clientX,c=a.pageY?a.pageY:a.clientY;if(document.body&&document.all){b+=document.body.scrollLeft;c+=document.body.scrollTop}if(a._offset){b+=a._offset.left;c+=a._offset.top}return{x:b,y:c}},add_listener:function(a){if(a.object&&a.method){if(!a.element)a.element=document;if(!a.object._rc_events)a.object._rc_events=[];var b=a.event+"*"+a.method;a.object._rc_events[b]||(a.object._rc_events[b]=function(c){return a.object[a.method](c)});if(a.element.addEventListener)a.element.addEventListener(a.event,
+a.object._rc_events[b],false);else if(a.element.attachEvent){a.element.detachEvent("on"+a.event,a.object._rc_events[b]);a.element.attachEvent("on"+a.event,a.object._rc_events[b])}else a.element["on"+a.event]=a.object._rc_events[b]}},remove_listener:function(a){if(!a.element)a.element=document;var b=a.event+"*"+a.method;if(a.object&&a.object._rc_events&&a.object._rc_events[b])if(a.element.removeEventListener)a.element.removeEventListener(a.event,a.object._rc_events[b],false);else if(a.element.detachEvent)a.element.detachEvent("on"+
+a.event,a.object._rc_events[b]);else a.element["on"+a.event]=null},cancel:function(a){a=a?a:window.event;a.preventDefault&&a.preventDefault();a.stopPropagation&&a.stopPropagation();a.cancelBubble=true;return a.returnValue=false},touchevent:function(a){return{pageX:a.pageX,pageY:a.pageY,offsetX:a.pageX-a.target.offsetLeft,offsetY:a.pageY-a.target.offsetTop,target:a.target,istouch:true}}};function rcube_event_engine(){this._events={}}
+rcube_event_engine.prototype={addEventListener:function(a,b,c){if(!this._events)this._events={};this._events[a]||(this._events[a]=[]);this._events[a][this._events[a].length]={func:b,obj:c?c:window}},removeEventListener:function(a,b,c){if(typeof c=="undefined")c=window;for(var d,e=0;this._events&&this._events[a]&&e<this._events[a].length;e++)if((d=this._events[a][e])&&d.func==b&&d.obj==c)this._events[a][e]=null},triggerEvent:function(a,b){var c,d;if(typeof b=="undefined")b=this;else if(typeof b=="object")b.event=
+a;if(this._events&&this._events[a]&&!this._event_exec){this._event_exec=true;for(var e=0;e<this._events[a].length;e++)if(d=this._events[a][e]){if(typeof d.func=="function")c=d.func.call?d.func.call(d.obj,b):d.func(b);else if(typeof d.obj[d.func]=="function")c=d.obj[d.func](b);if(typeof c!="undefined"&&!c)break}}this._event_exec=false;return c}};
+function rcube_layer(a,b){this.name=a;this.create=function(c){var d=c.x?c.x:0,e=c.y?c.y:0,f=c.width,g=c.height,i=c.zindex,j=c.vis;c=c.parent;var h=document.createElement("DIV");with(h){a=this.name;with(style){position="absolute";visibility=j?j==2?"inherit":"visible":"hidden";left=d+"px";top=e+"px";if(f)width=f.toString().match(/\%$/)?f:f+"px";if(g)height=g.toString().match(/\%$/)?g:g+"px";if(i)zIndex=i}}c?c.appendChild(h):document.body.appendChild(h);this.elm=h};if(b!=null){this.create(b);this.name=
+this.elm.id}else this.elm=document.getElementById(a);if(!this.elm)return false;this.css=this.elm.style;this.event=this.elm;this.width=this.elm.offsetWidth;this.height=this.elm.offsetHeight;this.x=parseInt(this.elm.offsetLeft);this.y=parseInt(this.elm.offsetTop);this.visible=this.css.visibility=="visible"||this.css.visibility=="show"||this.css.visibility=="inherit"?true:false;this.move=function(c,d){this.x=c;this.y=d;this.css.left=Math.round(this.x)+"px";this.css.top=Math.round(this.y)+"px"};this.resize=
+function(c,d){this.css.width=c+"px";this.css.height=d+"px";this.width=c;this.height=d};this.show=function(c){if(c==1){this.css.visibility="visible";this.visible=true}else if(c==2){this.css.visibility="inherit";this.visible=true}else{this.css.visibility="hidden";this.visible=false}};this.write=function(c){this.elm.innerHTML=c}}
+function rcube_check_email(a,b){if(a&&window.RegExp)return(b?RegExp("(^|<|[,;s\n])([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22))*\\x40([^@\\x2e]+\\x2e)+[a-z]{2,}($|>|[,;s\n])","i"):RegExp("^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22))*\\x40([^@\\x2e]+\\x2e)+[a-z]{2,}$",
+"i")).test(a)?true:false;return false}function rcube_clone_object(a){var b={},c;for(c in a)b[c]=a[c]&&typeof a[c]=="object"?clone_object(a[c]):a[c];return b}function urlencode(a){return window.encodeURIComponent?encodeURIComponent(a):escape(a)}
+function rcube_find_object(a,b){var c,d;b||(b=document);if(b.getElementsByName&&(c=b.getElementsByName(a)))d=c[0];if(!d&&b.getElementById)d=b.getElementById(a);if(!d&&b.all)d=b.all[a];if(!d&&b.images.length)d=b.images[a];if(!d&&b.forms.length)for(c=0;c<b.forms.length;c++)if(b.forms[c].name==a)d=b.forms[c];else if(b.forms[c].elements[a])d=b.forms[c].elements[a];if(!d&&b.layers){if(b.layers[a])d=b.layers[a];for(c=0;!d&&c<b.layers.length;c++)d=rcube_find_object(a,b.layers[c].document)}return d}
+function rcube_mouse_is_over(a,b){var c=rcube_event.get_mouse_pos(a),d=$(b).offset();return c.x>=d.left&&c.x<d.left+b.offsetWidth&&c.y>=d.top&&c.y<d.top+b.offsetHeight}function setCookie(a,b,c,d,e,f){a=a+"="+escape(b)+(c?"; expires="+c.toGMTString():"")+(d?"; path="+d:"")+(e?"; domain="+e:"")+(f?"; secure":"");document.cookie=a}
+function getCookie(a){var b=document.cookie;a=a+"=";var c=b.indexOf("; "+a);if(c==-1){c=b.indexOf(a);if(c!=0)return null}else c+=2;var d=document.cookie.indexOf(";",c);if(d==-1)d=b.length;return unescape(b.substring(c+a.length,d))}roundcube_browser.prototype.set_cookie=setCookie;roundcube_browser.prototype.get_cookie=getCookie;
+function rcube_console(){this.log=function(a){var b=rcube_find_object("dbgconsole");if(b){a+=a.charAt(a.length-1)=="\n"?"--------------------------------------\n":"\n--------------------------------------\n";if(bw.konq){b.innerText+=a;b.value=b.innerText}else b.value+=a}};this.reset=function(){var a=rcube_find_object("dbgconsole");if(a)a.innerText=a.value=""}}var bw=new roundcube_browser;bw.set_html_class();window.console||(console=new rcube_console);
+RegExp.escape=function(a){return String(a).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")};if(bw.ie){document._getElementById=document.getElementById;document.getElementById=function(a){var b=0,c=document._getElementById(a);if(c&&c.id!=a)for(;(c=document.all[b])&&c.id!=a;)b++;return c}};
index ba872468ccda76dd9b12eabc7862d2aec78c2570..5bc2ae62f4eec52f8672bf0bab2dd476c51207e1 100644 (file)
@@ -1,16 +1,16 @@
 /*
  +-----------------------------------------------------------------------+
- | RoundCube common js library                                           |
+ | Roundcube common js library                                           |
  |                                                                       |
- | This file is part of the RoundCube web development suite              |
- | Copyright (C) 2005-2007, RoundCube Dev, - Switzerland                 |
+ | This file is part of the Roundcube web development suite              |
+ | Copyright (C) 2005-2007, Roundcube Dev, - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
  
- $Id: common.js 2971 2009-09-20 06:53:11Z alec $
+ $Id: common.js 4166 2010-11-02 09:27:03Z alec $
 */
 
 // Constants
@@ -21,77 +21,123 @@ var CONTROL_SHIFT_KEY = 3;
 
 /**
  * Default browser check class
- * @construcotr
+ * @constructor
  */
 function roundcube_browser()
-  {
-  this.ver = parseFloat(navigator.appVersion);
-  this.appver = navigator.appVersion;
-  this.agent = navigator.userAgent;
-  this.name = navigator.appName;
-  this.vendor = navigator.vendor ? navigator.vendor : '';
-  this.vendver = navigator.vendorSub ? parseFloat(navigator.vendorSub) : 0;
-  this.product = navigator.product ? navigator.product : '';
-  this.platform = String(navigator.platform).toLowerCase();
-  this.lang = (navigator.language) ? navigator.language.substring(0,2) :
-              (navigator.browserLanguage) ? navigator.browserLanguage.substring(0,2) :
-              (navigator.systemLanguage) ? navigator.systemLanguage.substring(0,2) : 'en';
-
-  this.win = (this.platform.indexOf('win')>=0) ? true : false;
-  this.mac = (this.platform.indexOf('mac')>=0) ? true : false;
-  this.linux = (this.platform.indexOf('linux')>=0) ? true : false;
-  this.unix = (this.platform.indexOf('unix')>=0) ? true : false;
+{
+  var n = navigator;
+
+  this.ver = parseFloat(n.appVersion);
+  this.appver = n.appVersion;
+  this.agent = n.userAgent;
+  this.agent_lc = n.userAgent.toLowerCase();
+  this.name = n.appName;
+  this.vendor = n.vendor ? n.vendor : '';
+  this.vendver = n.vendorSub ? parseFloat(n.vendorSub) : 0;
+  this.product = n.product ? n.product : '';
+  this.platform = String(n.platform).toLowerCase();
+  this.lang = (n.language) ? n.language.substring(0,2) :
+              (n.browserLanguage) ? n.browserLanguage.substring(0,2) :
+              (n.systemLanguage) ? n.systemLanguage.substring(0,2) : 'en';
+
+  this.win = (this.platform.indexOf('win') >= 0);
+  this.mac = (this.platform.indexOf('mac') >= 0);
+  this.linux = (this.platform.indexOf('linux') >= 0);
+  this.unix = (this.platform.indexOf('unix') >= 0);
 
   this.dom = document.getElementById ? true : false;
   this.dom2 = (document.addEventListener && document.removeEventListener);
 
-  this.ie = (document.all) ? true : false;
+  this.ie = (document.all && !window.opera);
   this.ie4 = (this.ie && !this.dom);
   this.ie5 = (this.dom && this.appver.indexOf('MSIE 5')>0);
   this.ie8 = (this.dom && this.appver.indexOf('MSIE 8')>0);
   this.ie7 = (this.dom && this.appver.indexOf('MSIE 7')>0);
   this.ie6 = (this.dom && !this.ie8 && !this.ie7 && this.appver.indexOf('MSIE 6')>0);
 
-  this.mz = (this.dom && this.ver>=5);  // (this.dom && this.product=='Gecko')
-  this.ns = ((this.ver<5 && this.name=='Netscape') || (this.ver>=5 && this.vendor.indexOf('Netscape')>=0));
-  this.ns6 = (this.ns && parseInt(this.vendver)==6);  // (this.mz && this.ns) ? true : false;
-  this.ns7 = (this.ns && parseInt(this.vendver)==7);  // this.agent.indexOf('Netscape/7')>0);
-  this.safari = (this.agent.toLowerCase().indexOf('safari')>0 || this.agent.toLowerCase().indexOf('applewebkit')>0);
-  this.konq   = (this.agent.toLowerCase().indexOf('konqueror')>0);
-
-  this.opera = (window.opera) ? true : false;
-
-  if(this.opera && window.RegExp)
-    this.vendver = (/opera(\s|\/)([0-9\.]+)/i.test(navigator.userAgent)) ? parseFloat(RegExp.$2) : -1;
-  else if(!this.vendver && this.safari)
-    this.vendver = (/(safari|applewebkit)\/([0-9]+)/i.test(this.agent)) ? parseInt(RegExp.$2) : 0;
-  else if((!this.vendver && this.mz) || this.agent.indexOf('Camino')>0)
+  this.mz = (this.dom && this.ver >= 5);  // (this.dom && this.product=='Gecko')
+  this.ns = ((this.ver < 5 && this.name == 'Netscape') || (this.ver >= 5 && this.vendor.indexOf('Netscape') >= 0));
+  this.ns6 = (this.ns && parseInt(this.vendver) == 6);  // (this.mz && this.ns) ? true : false;
+  this.ns7 = (this.ns && parseInt(this.vendver) == 7);  // this.agent.indexOf('Netscape/7')>0);
+  this.chrome = (this.agent_lc.indexOf('chrome') > 0);
+  this.safari = (!this.chrome && (this.agent_lc.indexOf('safari') > 0 || this.agent_lc.indexOf('applewebkit') > 0));
+  this.konq   = (this.agent_lc.indexOf('konqueror') > 0);
+  this.iphone = (this.safari && this.agent_lc.indexOf('iphone') > 0);
+  this.ipad = (this.safari && this.agent_lc.indexOf('ipad') > 0);
+
+  this.opera = window.opera ? true : false;
+
+  if (this.opera && window.RegExp)
+    this.vendver = (/opera(\s|\/)([0-9\.]+)/.test(this.agent_lc)) ? parseFloat(RegExp.$2) : -1;
+  else if (this.chrome && window.RegExp)
+    this.vendver = (/chrome\/([0-9\.]+)/.test(this.agent_lc)) ? parseFloat(RegExp.$1) : 0;
+  else if (!this.vendver && this.safari)
+    this.vendver = (/(safari|applewebkit)\/([0-9]+)/.test(this.agent_lc)) ? parseInt(RegExp.$2) : 0;
+  else if ((!this.vendver && this.mz) || this.agent.indexOf('Camino')>0)
     this.vendver = (/rv:([0-9\.]+)/.test(this.agent)) ? parseFloat(RegExp.$1) : 0;
-  else if(this.ie && window.RegExp)
-    this.vendver = (/msie\s+([0-9\.]+)/i.test(this.agent)) ? parseFloat(RegExp.$1) : 0;
-  else if(this.konq && window.RegExp)
-    this.vendver = (/khtml\/([0-9\.]+)/i.test(this.agent)) ? parseFloat(RegExp.$1) : 0;
-
+  else if (this.ie && window.RegExp)
+    this.vendver = (/msie\s+([0-9\.]+)/.test(this.agent_lc)) ? parseFloat(RegExp.$1) : 0;
+  else if (this.konq && window.RegExp)
+    this.vendver = (/khtml\/([0-9\.]+)/.test(this.agent_lc)) ? parseFloat(RegExp.$1) : 0;
 
   // get real language out of safari's user agent
-  if(this.safari && (/;\s+([a-z]{2})-[a-z]{2}\)/i.test(this.agent)))
+  if(this.safari && (/;\s+([a-z]{2})-[a-z]{2}\)/.test(this.agent_lc)))
     this.lang = RegExp.$1;
 
   this.dhtml = ((this.ie4 && this.win) || this.ie5 || this.ie6 || this.ns4 || this.mz);
   this.vml = (this.win && this.ie && this.dom && !this.opera);
-  this.pngalpha = (this.mz || (this.opera && this.vendver>=6) || (this.ie && this.mac && this.vendver>=5) ||
-                   (this.ie && this.win && this.vendver>=5.5) || this.safari);
-  this.opacity = (this.mz || (this.ie && this.vendver>=5.5 && !this.opera) || (this.safari && this.vendver>=100));
-  this.cookies = navigator.cookieEnabled;
-  
+  this.pngalpha = (this.mz || (this.opera && this.vendver >= 6) || (this.ie && this.mac && this.vendver >= 5) ||
+                   (this.ie && this.win && this.vendver >= 5.5) || this.safari);
+  this.opacity = (this.mz || (this.ie && this.vendver >= 5.5 && !this.opera) || (this.safari && this.vendver >= 100));
+  this.cookies = n.cookieEnabled;
+
   // test for XMLHTTP support
   this.xmlhttp_test = function()
-    {
+  {
     var activeX_test = new Function("try{var o=new ActiveXObject('Microsoft.XMLHTTP');return true;}catch(err){return false;}");
-    this.xmlhttp = (window.XMLHttpRequest || (window.ActiveXObject && activeX_test())) ? true : false;
+    this.xmlhttp = (window.XMLHttpRequest || (window.ActiveXObject && activeX_test()));
     return this.xmlhttp;
+  };
+
+  // set class names to html tag according to the current user agent detection
+  // this allows browser-specific css selectors like "html.chrome .someclass"
+  this.set_html_class = function()
+  {
+    var classname = ' js';
+
+    if (this.ie) {
+      classname += ' ie';
+      if (this.ie5)
+        classname += ' ie5';
+      else if (this.ie6)
+        classname += ' ie6';
+      else if (this.ie7)
+        classname += ' ie7';
+      else if (this.ie8)
+        classname += ' ie8';
     }
-  }
+    else if (this.opera)
+      classname += ' opera';
+    else if (this.konq)
+      classname += ' konqueror';
+    else if (this.safari)
+      classname += ' safari';
+
+    if (this.chrome)
+      classname += ' chrome';
+    else if (this.iphone)
+      classname += ' iphone';
+    else if (this.ipad)
+      classname += ' ipad';
+    else if (this.ns6)
+      classname += ' netscape6';
+    else if (this.ns7)
+      classname += ' netscape7';
+
+    if (document.documentElement)
+      document.documentElement.className += classname;
+  };
+};
 
 
 // static functions for DOM event handling
@@ -132,16 +178,14 @@ get_modifier: function(e)
   var opcode = 0;
   e = e || window.event;
 
-  if (bw.mac && e)
-    {
+  if (bw.mac && e) {
     opcode += (e.metaKey && CONTROL_KEY) + (e.shiftKey && SHIFT_KEY);
-    return opcode;    
-    }
-  if (e)
-    {
+    return opcode;
+  }
+  if (e) {
     opcode += (e.ctrlKey && CONTROL_KEY) + (e.shiftKey && SHIFT_KEY);
     return opcode;
-    }
+  }
 },
 
 /**
@@ -150,11 +194,10 @@ get_modifier: function(e)
 get_mouse_pos: function(e)
 {
   if (!e) e = window.event;
-  var mX = (e.pageX) ? e.pageX : e.clientX;
-  var mY = (e.pageY) ? e.pageY : e.clientY;
+  var mX = (e.pageX) ? e.pageX : e.clientX,
+    mY = (e.pageY) ? e.pageY : e.clientY;
 
-  if (document.body && document.all)
-  {
+  if (document.body && document.all) {
     mX += document.body.scrollLeft;
     mY += document.body.scrollTop;
   }
@@ -179,20 +222,19 @@ add_listener: function(p)
 
   if (!p.object._rc_events)
     p.object._rc_events = [];
-  
+
   var key = p.event + '*' + p.method;
   if (!p.object._rc_events[key])
     p.object._rc_events[key] = function(e){ return p.object[p.method](e); };
 
   if (p.element.addEventListener)
     p.element.addEventListener(p.event, p.object._rc_events[key], false);
-  else if (p.element.attachEvent)
-    {
+  else if (p.element.attachEvent) {
     // IE allows multiple events with the same function to be applied to the same object
     // forcibly detach the event, then attach
     p.element.detachEvent('on'+p.event, p.object._rc_events[key]);
     p.element.attachEvent('on'+p.event, p.object._rc_events[key]);
-    }
+  }
   else
     p.element['on'+p.event] = p.object._rc_events[key];
 },
@@ -230,6 +272,11 @@ cancel: function(evt)
   e.cancelBubble = true;
   e.returnValue = false;
   return false;
+},
+
+touchevent: function(e)
+{
+  return { pageX:e.pageX, pageY:e.pageY, offsetX:e.pageX - e.target.offsetLeft, offsetY:e.pageY - e.target.offsetTop, target:e.target, istouch:true };
 }
 
 };
@@ -241,7 +288,7 @@ cancel: function(evt)
 function rcube_event_engine()
 {
   this._events = {};
-}
+};
 
 rcube_event_engine.prototype = {
 
@@ -258,7 +305,7 @@ addEventListener: function(evt, func, obj)
     this._events = {};
   if (!this._events[evt])
     this._events[evt] = [];
-    
+
   var e = {func:func, obj:obj ? obj : window};
   this._events[evt][this._events[evt].length] = e;
 },
@@ -273,7 +320,7 @@ removeEventListener: function(evt, func, obj)
 {
   if (typeof obj == 'undefined')
     obj = window;
-    
+
   for (var h,i=0; this._events && this._events[evt] && i < this._events[evt].length; i++)
     if ((h = this._events[evt][i]) && h.func == func && h.obj == obj)
       this._events[evt][i] = null;
@@ -292,7 +339,7 @@ triggerEvent: function(evt, e)
     e = this;
   else if (typeof e == 'object')
     e.event = evt;
-  
+
   if (this._events && this._events[evt] && !this._event_exec) {
     this._event_exec = true;
     for (var i=0; i < this._events[evt].length; i++) {
@@ -301,7 +348,7 @@ triggerEvent: function(evt, e)
           ret = h.func.call ? h.func.call(h.obj, e) : h.func(e);
         else if (typeof h.obj[h.func] == 'function')
           ret = h.obj[h.func](e);
-              
+
         // cancel event execution
         if (typeof ret != 'undefined' && !ret)
           break;
@@ -313,49 +360,46 @@ triggerEvent: function(evt, e)
   return ret;
 }
 
-}  // end rcube_event_engine.prototype
+};  // end rcube_event_engine.prototype
 
 
 
 /**
- * RoundCube generic layer (floating box) class
+ * Roundcube generic layer (floating box) class
  *
  * @constructor
  */
 function rcube_layer(id, attributes)
 {
   this.name = id;
-  
+
   // create a new layer in the current document
   this.create = function(arg)
-    {
-    var l = (arg.x) ? arg.x : 0;
-    var t = (arg.y) ? arg.y : 0;
-    var w = arg.width;
-    var h = arg.height;
-    var z = arg.zindex;
-    var vis = arg.vis;
-    var parent = arg.parent;
-    var obj;
-
-    obj = document.createElement('DIV');
-
-    with(obj)
-      {
+  {
+    var l = (arg.x) ? arg.x : 0,
+      t = (arg.y) ? arg.y : 0,
+      w = arg.width,
+      h = arg.height,
+      z = arg.zindex,
+      vis = arg.vis,
+      parent = arg.parent,
+      obj = document.createElement('DIV');
+
+    with (obj) {
       id = this.name;
-      with(style)
-        {
-       position = 'absolute';
+      with (style) {
+           position = 'absolute';
         visibility = (vis) ? (vis==2) ? 'inherit' : 'visible' : 'hidden';
         left = l+'px';
         top = t+'px';
         if (w)
-         width = w.toString().match(/\%$/) ? w : w+'px';
+             width = w.toString().match(/\%$/) ? w : w+'px';
         if (h)
-         height = h.toString().match(/\%$/) ? h : h+'px';
-        if(z) zIndex = z;
-       }
-      }
+             height = h.toString().match(/\%$/) ? h : h+'px';
+        if (z)
+          zIndex = z;
+         }
+    }
 
     if (parent)
       parent.appendChild(obj);
@@ -363,20 +407,17 @@ function rcube_layer(id, attributes)
       document.body.appendChild(obj);
 
     this.elm = obj;
-    };
-
+  };
 
   // create new layer
-  if(attributes!=null)
-    {
+  if (attributes != null) {
     this.create(attributes);
     this.name = this.elm.id;
-    }
+  }
   else  // just refer to the object
     this.elm = document.getElementById(id);
 
-
-  if(!this.elm)
+  if (!this.elm)
     return false;
 
 
@@ -393,109 +434,99 @@ function rcube_layer(id, attributes)
 
   // ********* layer object methods *********
 
-
   // move the layer to a specific position
   this.move = function(x, y)
-    {
+  {
     this.x = x;
     this.y = y;
     this.css.left = Math.round(this.x)+'px';
     this.css.top = Math.round(this.y)+'px';
-    }
+  };
 
   // change the layers width and height
   this.resize = function(w,h)
-    {
+  {
     this.css.width  = w+'px';
     this.css.height = h+'px';
     this.width = w;
     this.height = h;
-    }
-
+  };
 
   // show or hide the layer
   this.show = function(a)
-    {
-    if(a==1)
-      {
+  {
+    if(a == 1) {
       this.css.visibility = 'visible';
       this.visible = true;
-      }
-    else if(a==2)
-      {
+    }
+    else if(a == 2) {
       this.css.visibility = 'inherit';
       this.visible = true;
-      }
-    else
-      {
+    }
+    else {
       this.css.visibility = 'hidden';
       this.visible = false;
-      }
     }
-
+  };
 
   // write new content into a Layer
   this.write = function(cont)
-    {
+  {
     this.elm.innerHTML = cont;
-    }
+  };
 
-}
+};
 
 
 // check if input is a valid email address
 // By Cal Henderson <cal@iamcal.com>
 // http://code.iamcal.com/php/rfc822/
 function rcube_check_email(input, inline)
-  {
-  if (input && window.RegExp)
-    {
-    var qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
-    var dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
-    var atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
-    var quoted_pair = '\\x5c[\\x00-\\x7f]';
-    var domain_literal = '\\x5b('+dtext+'|'+quoted_pair+')*\\x5d';
-    var quoted_string = '\\x22('+qtext+'|'+quoted_pair+')*\\x22';
-    var sub_domain = '('+atom+'|'+domain_literal+')';
-    var word = '('+atom+'|'+quoted_string+')';
-    var domain = sub_domain+'(\\x2e'+sub_domain+')*';
-    var local_part = word+'(\\x2e'+word+')*';
-    var addr_spec = local_part+'\\x40'+domain;
-    var delim = '[,;\s\n]';
-    var reg1 = inline ? new RegExp('(^|<|'+delim+')'+addr_spec+'($|>|'+delim+')', 'i') : new RegExp('^'+addr_spec+'$', 'i');
+{
+  if (input && window.RegExp) {
+    var qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]',
+      dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]',
+      atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+',
+      quoted_pair = '\\x5c[\\x00-\\x7f]',
+      quoted_string = '\\x22('+qtext+'|'+quoted_pair+')*\\x22',
+      // Use simplified domain matching, because we need to allow Unicode characters here
+      // So, e-mail address should be validated also on server side after idn_to_ascii() use
+      //domain_literal = '\\x5b('+dtext+'|'+quoted_pair+')*\\x5d',
+      //sub_domain = '('+atom+'|'+domain_literal+')',
+      domain = '([^@\\x2e]+\\x2e)+[a-z]{2,}',
+      word = '('+atom+'|'+quoted_string+')',
+      delim = '[,;\s\n]',
+      local_part = word+'(\\x2e'+word+')*',
+      addr_spec = local_part+'\\x40'+domain,
+      reg1 = inline ? new RegExp('(^|<|'+delim+')'+addr_spec+'($|>|'+delim+')', 'i') : new RegExp('^'+addr_spec+'$', 'i');
+
     return reg1.test(input) ? true : false;
-    }
-  return false;
   }
-  
-
-// find a value in a specific array and returns the index
-function find_in_array()
-  {
-  var args = find_in_array.arguments;
-  if(!args.length) return -1;
 
-  var haystack = typeof(args[0])=='object' ? args[0] : args.length>1 && typeof(args[1])=='object' ? args[1] : new Array();
-  var needle = typeof(args[0])!='object' ? args[0] : args.length>1 && typeof(args[1])!='object' ? args[1] : '';
-  var nocase = args.length==3 ? args[2] : false;
+  return false;
+};
 
-  if(!haystack.length) return -1;
 
-  for(var i=0; i<haystack.length; i++)
-    if(nocase && haystack[i].toLowerCase()==needle.toLowerCase())
-      return i;
-    else if(haystack[i]==needle)
-      return i;
+// recursively copy an object
+function rcube_clone_object(obj)
+{
+  var out = {};
 
-  return -1;
+  for (var key in obj) {
+    if (obj[key] && typeof obj[key] == 'object')
+      out[key] = clone_object(obj[key]);
+    else
+      out[key] = obj[key];
   }
 
+  return out;
+};
 
 // make a string URL safe
 function urlencode(str)
 {
   return window.encodeURIComponent ? encodeURIComponent(str) : escape(str);
-}
+};
 
 
 // get any type of html objects by id/name
@@ -530,7 +561,7 @@ function rcube_find_object(id, d)
   }
 
   return obj;
-}
+};
 
 // determine whether the mouse is over the given object or not
 function rcube_mouse_is_over(ev, obj)
@@ -540,40 +571,38 @@ function rcube_mouse_is_over(ev, obj)
 
   return ((mouse.x >= pos.left) && (mouse.x < (pos.left + obj.offsetWidth)) &&
     (mouse.y >= pos.top) && (mouse.y < (pos.top + obj.offsetHeight)));
-}
+};
 
 
 // cookie functions by GoogieSpell
 function setCookie(name, value, expires, path, domain, secure)
-  {
+{
   var curCookie = name + "=" + escape(value) +
       (expires ? "; expires=" + expires.toGMTString() : "") +
       (path ? "; path=" + path : "") +
       (domain ? "; domain=" + domain : "") +
       (secure ? "; secure" : "");
   document.cookie = curCookie;
-  }
-
-roundcube_browser.prototype.set_cookie = setCookie;
+};
 
 function getCookie(name)
-  {
+{
   var dc = document.cookie;
   var prefix = name + "=";
   var begin = dc.indexOf("; " + prefix);
-  if (begin == -1)
-    {
+  if (begin == -1) {
     begin = dc.indexOf(prefix);
     if (begin != 0) return null;
-    }
+  }
   else
     begin += 2;  
   var end = document.cookie.indexOf(";", begin);
   if (end == -1)
     end = dc.length;
   return unescape(dc.substring(begin + prefix.length, end));
-  }
+};
 
+roundcube_browser.prototype.set_cookie = setCookie;
 roundcube_browser.prototype.get_cookie = getCookie;
 
 // tiny replacement for Firebox functionality
@@ -604,9 +633,11 @@ function rcube_console()
     if (box)
       box.innerText = box.value = '';
   };
-}
+};
 
 var bw = new roundcube_browser();
+bw.set_html_class();
+
 if (!window.console) 
   console = new rcube_console();
 
@@ -614,24 +645,23 @@ if (!window.console)
 // Add escape() method to RegExp object
 // http://dev.rubyonrails.org/changeset/7271
 RegExp.escape = function(str)
-  {
+{
   return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
-  }
+};
 
 
 // Make getElementById() case-sensitive on IE
 if (bw.ie)
-  {
+{
   document._getElementById = document.getElementById;
   document.getElementById = function(id)
-    {
-    var i = 0;
-    var o = document._getElementById(id);
+  {
+    var i = 0, obj = document._getElementById(id);
 
-    if (!o || o.id != id)
-      while ((o = document.all[i]) && o.id != id)
+    if (obj && obj.id != id)
+      while ((obj = document.all[i]) && obj.id != id)
         i++;
 
-    return o;
-    }
+    return obj;
   }
+}
index eeb16ec96eae9244ecd7cd27fc580b8678bbf0e6..3845e3de459714209748d5161a408b41cb91baf4 100644 (file)
@@ -1,9 +1,9 @@
 /*
  +-----------------------------------------------------------------------+
- | RoundCube editor js library                                           |
+ | Roundcube editor js library                                           |
  |                                                                       |
- | This file is part of the RoundCube web development suite              |
- | Copyright (C) 2006, RoundCube Dev, - Switzerland                      |
+ | This file is part of the Roundcube web development suite              |
+ | Copyright (C) 2006, Roundcube Dev, - Switzerland                      |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -18,96 +18,112 @@ function rcmail_editor_init(skin_path, editor_lang, spellcheck, mode)
 {
   if (mode == 'identity')
     tinyMCE.init({
-      mode : 'textareas',
-      editor_selector : 'mce_editor',
-      apply_source_formatting : true,
-      theme : 'advanced',
-      language : editor_lang,
-      content_css : skin_path + '/editor_content.css',
-      theme_advanced_toolbar_location : 'top',
-      theme_advanced_toolbar_align : 'left',
-      theme_advanced_buttons1 : 'bold,italic,underline,strikethrough,justifyleft,justifycenter,justifyright,justifyfull,separator,outdent,indent,charmap,hr,link,unlink,code,forecolor',
-      theme_advanced_buttons2 : ',fontselect,fontsizeselect',
-      theme_advanced_buttons3 : '',
-      relative_urls : false,
-      remove_script_host : false,
-      gecko_spellcheck : true
+      mode: 'textareas',
+      editor_selector: 'mce_editor',
+      apply_source_formatting: true,
+      theme: 'advanced',
+      language: editor_lang,
+      content_css: skin_path + '/editor_content.css',
+      plugins: 'paste,tabfocus',
+      theme_advanced_toolbar_location: 'top',
+      theme_advanced_toolbar_align: 'left',
+      theme_advanced_buttons1: 'bold,italic,underline,strikethrough,justifyleft,justifycenter,justifyright,justifyfull,separator,outdent,indent,charmap,hr,link,unlink,code,forecolor',
+      theme_advanced_buttons2: ',fontselect,fontsizeselect',
+      theme_advanced_buttons3: '',
+      relative_urls: false,
+      remove_script_host: false,
+      gecko_spellcheck: true
     });
   else // mail compose
-    tinyMCE.init({ 
-      mode : 'textareas',
-      editor_selector : 'mce_editor',
-      accessibility_focus : false,
-      apply_source_formatting : true,
-      theme : 'advanced',
-      language : editor_lang,
-      plugins : 'emotions,media,nonbreaking,table,searchreplace,visualchars,directionality' + (spellcheck ? ',spellchecker' : ''),
-      theme_advanced_buttons1 : 'bold,italic,underline,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,bullist,numlist,outdent,indent,separator,link,unlink,emotions,charmap,code,forecolor,backcolor,fontselect,fontsizeselect, separator' + (spellcheck ? ',spellchecker' : '') + ',undo,redo,image,media,ltr,rtl',
-      theme_advanced_buttons2 : '',
-      theme_advanced_buttons3 : '',
-      theme_advanced_toolbar_location : 'top',
-      theme_advanced_toolbar_align : 'left',
-      extended_valid_elements : 'font[face|size|color|style],span[id|class|align|style]',
-      content_css : skin_path + '/editor_content.css',
-      external_image_list_url : 'program/js/editor_images.js',
-      spellchecker_languages : (rcmail.env.spellcheck_langs ? rcmail.env.spellcheck_langs : 'Dansk=da,Deutsch=de,+English=en,Espanol=es,Francais=fr,Italiano=it,Nederlands=nl,Polski=pl,Portugues=pt,Suomi=fi,Svenska=sv'),
-      gecko_spellcheck : true,
-      relative_urls : false,
-      remove_script_host : false,
+    tinyMCE.init({
+      mode: 'textareas',
+      editor_selector: 'mce_editor',
+      accessibility_focus: false,
+      apply_source_formatting: true,
+      theme: 'advanced',
+      language: editor_lang,
+      plugins: 'paste,emotions,media,nonbreaking,table,searchreplace,visualchars,directionality,tabfocus' + (spellcheck ? ',spellchecker' : ''),
+      theme_advanced_buttons1: 'bold,italic,underline,|,justifyleft,justifycenter,justifyright,justifyfull,|,bullist,numlist,outdent,indent,ltr,rtl,blockquote,|,forecolor,backcolor,fontselect,fontsizeselect',
+      theme_advanced_buttons2: 'link,unlink,code,|,emotions,charmap,image,media,|,search' + (spellcheck ? ',spellchecker' : '') + ',undo,redo',
+      theme_advanced_buttons3: '',
+      theme_advanced_toolbar_location: 'top',
+      theme_advanced_toolbar_align: 'left',
+      extended_valid_elements: 'font[face|size|color|style],span[id|class|align|style]',
+      content_css: skin_path + '/editor_content.css',
+      external_image_list_url: 'program/js/editor_images.js',
+      spellchecker_languages: (rcmail.env.spellcheck_langs ? rcmail.env.spellcheck_langs : 'Dansk=da,Deutsch=de,+English=en,Espanol=es,Francais=fr,Italiano=it,Nederlands=nl,Polski=pl,Portugues=pt,Suomi=fi,Svenska=sv'),
+      spellchecker_rpc_url: '?_task=utils&_action=spell&tiny=1',
+      gecko_spellcheck: true,
+      remove_script_host: false,
+      relative_urls: false,
+      convert_urls: false, // #1486944
       rc_client: rcmail,
-      oninit : 'rcmail_editor_callback'
+      oninit: 'rcmail_editor_callback'
     });
 }
 
 // react to real individual tinyMCE editor init
-function rcmail_editor_callback(editor)
+function rcmail_editor_callback()
 {
-  var input_from = rcube_find_object('_from');
-  if (input_from && input_from.type=='select-one')
-    rcmail.change_identity(input_from);
-  // set tabIndex
-  rcmail_editor_tabindex()
+  var elem = rcube_find_object('_from'),
+    fe = rcmail.env.compose_focus_elem;
+
+  if (elem && elem.type == 'select-one') {
+    rcmail.change_identity(elem);
+    // Focus previously focused element
+    if (fe && fe.id != rcmail.env.composebody) {
+      window.focus(); // for WebKit (#1486674)
+      fe.focus();
+    }
+  }
+
+  // set tabIndex and set focus to element that was focused before
+  rcmail_editor_tabindex(fe && fe.id == rcmail.env.composebody);
+  // Trigger resize (needed for proper editor resizing in some browsers using default skin)
+  $(window).resize();
 }
 
 // set tabIndex on tinyMCE editor
-function rcmail_editor_tabindex()
+function rcmail_editor_tabindex(focus)
 {
   if (rcmail.env.task == 'mail') {
     var editor = tinyMCE.get(rcmail.env.composebody);
-    var textarea = editor.getElement();
-    var node = editor.getContentAreaContainer().childNodes[0];
-    if (textarea && node)
-      node.tabIndex = textarea.tabIndex;
+    if (editor) {
+      var textarea = editor.getElement();
+      var node = editor.getContentAreaContainer().childNodes[0];
+      if (textarea && node)
+        node.tabIndex = textarea.tabIndex;
+      if (focus)
+        editor.getWin().focus();
+    }
   }
 }
 
 // switch html/plain mode
-function rcmail_toggle_editor(ishtml, textAreaId, flagElement)
+function rcmail_toggle_editor(select, textAreaId, flagElement)
 {
-  var composeElement = document.getElementById(textAreaId);
-  var flag;
+  var flag, ishtml;
+
+  if (select.tagName != 'SELECT')
+    ishtml = select.checked;
+  else
+    ishtml = select.value == 'html';
 
-  if (ishtml)
-    {
-    rcmail.display_spellcheck_controls(false);
+  var res = rcmail.command('toggle-editor', {id:textAreaId, mode:ishtml?'html':'plain'});
 
-    rcmail.plain2html(composeElement.value, textAreaId);
-    tinyMCE.execCommand('mceAddControl', true, textAreaId);
-    rcmail_editor_tabindex();
+  if (ishtml) {
+    // #1486593
+    setTimeout("rcmail_editor_tabindex(true);", 500);
     if (flagElement && (flag = rcube_find_object(flagElement)))
       flag.value = '1';
-    }
-  else
-    {
-    if (!confirm(rcmail.get_label('editorwarning')))
-      return false;
-
-    var thisMCE = tinyMCE.get(textAreaId);
-    var existingHtml = thisMCE.getContent();
-    rcmail.html2plain(existingHtml, textAreaId);
-    tinyMCE.execCommand('mceRemoveControl', true, textAreaId);
-    rcmail.display_spellcheck_controls(true);
+  }
+  else {
+    if (!res && select.tagName == 'SELECT')
+      select.value = 'html';
     if (flagElement && (flag = rcube_find_object(flagElement)))
       flag.value = '0';
-    }
-};
+
+    if (rcmail.env.composebody)
+      rcube_find_object(rcmail.env.composebody).focus();
+  }
+}
index 48e8407fcb7e670e9c630d625c8a5e3d12037dc3..c0f53b194ac3d60e5c423d523879055a83b6b9bd 100644 (file)
-var SPELL_CUR_LANG=null;
-var GOOGIE_DEFAULT_LANG="en";
-function GoogieSpell(_1,_2){
-var _3=this;
-this.array_keys=function(_4){
-var _5=[];
-for(var _6 in _4){
-_5.push([_6]);
-}
-return _5;
-};
-var _7=getCookie("language");
-GOOGIE_CUR_LANG=_7!=null?_7:GOOGIE_DEFAULT_LANG;
-this.img_dir=_1;
-this.server_url=_2;
-this.org_lang_to_word={"da":"Dansk","de":"Deutsch","en":"English","es":"Espa&#241;ol","fr":"Fran&#231;ais","it":"Italiano","nl":"Nederlands","pl":"Polski","pt":"Portugu&#234;s","fi":"Suomi","sv":"Svenska"};
-this.lang_to_word=this.org_lang_to_word;
-this.langlist_codes=this.array_keys(this.lang_to_word);
-this.show_change_lang_pic=true;
-this.change_lang_pic_placement="right";
-this.report_state_change=true;
-this.ta_scroll_top=0;
-this.el_scroll_top=0;
-this.lang_chck_spell="Check spelling";
-this.lang_revert="Revert to";
-this.lang_close="Close";
-this.lang_rsm_edt="Resume editing";
-this.lang_no_error_found="No spelling errors found";
-this.lang_no_suggestions="No suggestions";
-this.show_spell_img=false;
-this.decoration=true;
-this.use_close_btn=true;
-this.edit_layer_dbl_click=true;
-this.report_ta_not_found=true;
-this.custom_ajax_error=null;
-this.custom_no_spelling_error=null;
-this.custom_menu_builder=[];
-this.custom_item_evaulator=null;
-this.extra_menu_items=[];
-this.custom_spellcheck_starter=null;
-this.main_controller=true;
-this.lang_state_observer=null;
-this.spelling_state_observer=null;
-this.show_menu_observer=null;
-this.all_errors_fixed_observer=null;
-this.use_focus=false;
-this.focus_link_t=null;
-this.focus_link_b=null;
-this.cnt_errors=0;
-this.cnt_errors_fixed=0;
-$(document).bind("click",function(e){
-if($(e.target).attr("googie_action_btn")!="1"&&_3.isLangWindowShown()){
-_3.hideLangWindow();
-}
-if($(e.target).attr("googie_action_btn")!="1"&&_3.isErrorWindowShown()){
-_3.hideErrorWindow();
-}
-});
-this.decorateTextarea=function(id){
-this.text_area=typeof (id)=="string"?document.getElementById(id):id;
-if(this.text_area){
-if(!this.spell_container&&this.decoration){
-var _a=document.createElement("table");
-var _b=document.createElement("tbody");
-var tr=document.createElement("tr");
-var _d=document.createElement("td");
-var _e=this.isDefined(this.force_width)?this.force_width:this.text_area.offsetWidth;
-var _f=this.isDefined(this.force_height)?this.force_height:16;
-tr.appendChild(_d);
-_b.appendChild(tr);
-$(_a).append(_b).insertBefore(this.text_area).width("100%").height(_f);
-$(_d).height(_f).width(_e).css("text-align","right");
-this.spell_container=_d;
-}
-this.checkSpellingState();
-}else{
-if(this.report_ta_not_found){
-alert("Text area not found");
-}
-}
-};
-this.setSpellContainer=function(id){
-this.spell_container=typeof (id)=="string"?document.getElementById(id):id;
-};
-this.setLanguages=function(_11){
-this.lang_to_word=_11;
-this.langlist_codes=this.array_keys(_11);
-};
-this.setCurrentLanguage=function(_12){
-GOOGIE_CUR_LANG=_12;
-var now=new Date();
-now.setTime(now.getTime()+365*24*60*60*1000);
-setCookie("language",_12,now);
-};
-this.setForceWidthHeight=function(_14,_15){
-this.force_width=_14;
-this.force_height=_15;
-};
-this.setDecoration=function(_16){
-this.decoration=_16;
-};
-this.dontUseCloseButtons=function(){
-this.use_close_btn=false;
-};
-this.appendNewMenuItem=function(_17,_18,_19){
-this.extra_menu_items.push([_17,_18,_19]);
-};
-this.appendCustomMenuBuilder=function(_1a,_1b){
-this.custom_menu_builder.push([_1a,_1b]);
-};
-this.setFocus=function(){
-try{
-this.focus_link_b.focus();
-this.focus_link_t.focus();
-return true;
-}
-catch(e){
-return false;
-}
-};
-this.setStateChanged=function(_1c){
-this.state=_1c;
-if(this.spelling_state_observer!=null&&this.report_state_change){
-this.spelling_state_observer(_1c,this);
-}
-};
-this.setReportStateChange=function(_1d){
-this.report_state_change=_1d;
-};
-this.getUrl=function(){
-return this.server_url+GOOGIE_CUR_LANG;
-};
-this.escapeSpecial=function(val){
-return val.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
-};
-this.createXMLReq=function(_1f){
-return "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"+"<spellrequest textalreadyclipped=\"0\" ignoredups=\"0\" ignoredigits=\"1\" ignoreallcaps=\"1\">"+"<text>"+_1f+"</text></spellrequest>";
-};
-this.spellCheck=function(_20){
-this.cnt_errors_fixed=0;
-this.cnt_errors=0;
-this.setStateChanged("checking_spell");
-if(this.main_controller){
-this.appendIndicator(this.spell_span);
-}
-this.error_links=[];
-this.ta_scroll_top=this.text_area.scrollTop;
-this.ignore=_20;
-this.hideLangWindow();
-if($(this.text_area).val()==""||_20){
-if(!this.custom_no_spelling_error){
-this.flashNoSpellingErrorState();
-}else{
-this.custom_no_spelling_error(this);
-}
-this.removeIndicator();
-return;
-}
-this.createEditLayer(this.text_area.offsetWidth,this.text_area.offsetHeight);
-this.createErrorWindow();
-$("body").append(this.error_window);
-try{
-netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
-}
-catch(e){
-}
-if(this.main_controller){
-$(this.spell_span).unbind("click");
-}
-this.orginal_text=$(this.text_area).val();
-var _21=this.escapeSpecial(this.orginal_text);
-var ref=this;
-$.ajax({type:"POST",url:this.getUrl(),data:this.createXMLReq(_21),dataType:"text",error:function(o){
-if(ref.custom_ajax_error){
-ref.custom_ajax_error(ref);
-}else{
-alert("An error was encountered on the server. Please try again later.");
-}
-if(ref.main_controller){
-$(ref.spell_span).remove();
-ref.removeIndicator();
-}
-ref.checkSpellingState();
-},success:function(_24){
-var _25=_24;
-ref.results=ref.parseResult(_25);
-if(_25.match(/<c.*>/)!=null){
-ref.showErrorsInIframe();
-ref.resumeEditingState();
-}else{
-if(!ref.custom_no_spelling_error){
-ref.flashNoSpellingErrorState();
-}else{
-ref.custom_no_spelling_error(ref);
-}
-}
-ref.removeIndicator();
-}});
-};
-this.parseResult=function(_26){
-var _27=/\w+="(\d+|true)"/g;
-var _28=/\t/g;
-var _29=_26.match(/<c[^>]*>[^<]*<\/c>/g);
-var _2a=new Array();
-if(_29==null){
-return _2a;
-}
-for(var i=0;i<_29.length;i++){
-var _2c=new Array();
-this.errorFound();
-_2c["attrs"]=new Array();
-var _2d=_29[i].match(_27);
-for(var j=0;j<_2d.length;j++){
-var _2f=_2d[j].split(/=/);
-var val=_2f[1].replace(/"/g,"");
-_2c["attrs"][_2f[0]]=val!="true"?parseInt(val):val;
-}
-_2c["suggestions"]=new Array();
-var _31=_29[i].replace(/<[^>]*>/g,"");
-var _32=_31.split(_28);
-for(var k=0;k<_32.length;k++){
-if(_32[k]!=""){
-_2c["suggestions"].push(_32[k]);
-}
-}
-_2a.push(_2c);
-}
-return _2a;
-};
-this.createErrorWindow=function(){
-this.error_window=document.createElement("div");
-$(this.error_window).addClass("googie_window").attr("googie_action_btn","1");
-};
-this.isErrorWindowShown=function(){
-return $(this.error_window).is(":visible");
-};
-this.hideErrorWindow=function(){
-$(this.error_window).css("visibility","hidden");
-$(this.error_window_iframe).css("visibility","hidden");
-};
-this.updateOrginalText=function(_34,_35,_36,id){
-var _38=this.orginal_text.substring(0,_34);
-var _39=this.orginal_text.substring(_34+_35.length);
-this.orginal_text=_38+_36+_39;
-$(this.text_area).val(this.orginal_text);
-var _3a=_36.length-_35.length;
-for(var j=0;j<this.results.length;j++){
-if(j!=id&&j>id){
-this.results[j]["attrs"]["o"]+=_3a;
-}
-}
-};
-this.saveOldValue=function(elm,_3d){
-elm.is_changed=true;
-elm.old_value=_3d;
-};
-this.createListSeparator=function(){
-var td=document.createElement("td");
-var tr=document.createElement("tr");
-$(td).html(" ").attr("googie_action_btn","1").css({"cursor":"default","font-size":"3px","border-top":"1px solid #ccc","padding-top":"3px"});
-tr.appendChild(td);
-return tr;
-};
-this.correctError=function(id,elm,_42,_43){
-var _44=elm.innerHTML;
-var _45=_42.nodeType==3?_42.nodeValue:_42.innerHTML;
-var _46=this.results[id]["attrs"]["o"];
-if(_43){
-var _47=elm.previousSibling.innerHTML;
-elm.previousSibling.innerHTML=_47.slice(0,_47.length-1);
-_44=" "+_44;
-_46--;
-}
-this.hideErrorWindow();
-this.updateOrginalText(_46,_44,_45,id);
-$(elm).html(_45).css("color","green").attr("is_corrected",true);
-this.results[id]["attrs"]["l"]=_45.length;
-if(!this.isDefined(elm.old_value)){
-this.saveOldValue(elm,_44);
-}
-this.errorFixed();
-};
-this.showErrorWindow=function(elm,id){
-if(this.show_menu_observer){
-this.show_menu_observer(this);
-}
-var ref=this;
-var pos=$(elm).offset();
-pos.top-=this.edit_layer.scrollTop;
-$(this.error_window).css({"visibility":"visible","top":(pos.top+20)+"px","left":(pos.left)+"px"}).html("");
-var _4c=document.createElement("table");
-var _4d=document.createElement("tbody");
-$(_4c).addClass("googie_list").attr("googie_action_btn","1");
-var _4e=false;
-if(this.custom_menu_builder!=[]){
-for(var k=0;k<this.custom_menu_builder.length;k++){
-var eb=this.custom_menu_builder[k];
-if(eb[0]((this.results[id]))){
-_4e=eb[1](this,_4d,elm);
-break;
-}
-}
-}
-if(!_4e){
-var _51=this.results[id]["suggestions"];
-var _52=this.results[id]["attrs"]["o"];
-var len=this.results[id]["attrs"]["l"];
-if(_51.length==0){
-var row=document.createElement("tr");
-var _55=document.createElement("td");
-var _56=document.createElement("span");
-$(_56).text(this.lang_no_suggestions);
-$(_55).attr("googie_action_btn","1").css("cursor","default");
-_55.appendChild(_56);
-row.appendChild(_55);
-_4d.appendChild(row);
-}
-for(i=0;i<_51.length;i++){
-var row=document.createElement("tr");
-var _55=document.createElement("td");
-var _56=document.createElement("span");
-$(_56).html(_51[i]);
-$(_55).bind("mouseover",this.item_onmouseover).bind("mouseout",this.item_onmouseout).bind("click",function(e){
-ref.correctError(id,elm,e.target.firstChild);
-});
-_55.appendChild(_56);
-row.appendChild(_55);
-_4d.appendChild(row);
-}
-if(elm.is_changed&&elm.innerHTML!=elm.old_value){
-var _58=elm.old_value;
-var _59=document.createElement("tr");
-var _5a=document.createElement("td");
-var _5b=document.createElement("span");
-$(_5b).addClass("googie_list_revert").html(this.lang_revert+" "+_58);
-$(_5a).bind("mouseover",this.item_onmouseover).bind("mouseout",this.item_onmouseout).bind("click",function(e){
-ref.updateOrginalText(_52,elm.innerHTML,_58,id);
-$(elm).attr("is_corrected",true).css("color","#b91414").html(_58);
-ref.hideErrorWindow();
-});
-_5a.appendChild(_5b);
-_59.appendChild(_5a);
-_4d.appendChild(_59);
-}
-var _5d=document.createElement("tr");
-var _5e=document.createElement("td");
-var _5f=document.createElement("input");
-var _60=document.createElement("img");
-var _61=document.createElement("form");
-var _62=function(){
-if(_5f.value!=""){
-if(!ref.isDefined(elm.old_value)){
-ref.saveOldValue(elm,elm.innerHTML);
-}
-ref.updateOrginalText(_52,elm.innerHTML,_5f.value,id);
-$(elm).attr("is_corrected",true).css("color","green").html(_5f.value);
-ref.hideErrorWindow();
-}
-return false;
-};
-$(_5f).width(120).css({"margin":0,"padding":0});
-$(_5f).val(elm.innerHTML).attr("googie_action_btn","1");
-$(_5e).css("cursor","default").attr("googie_action_btn","1");
-$(_60).attr("src",this.img_dir+"ok.gif").width(32).height(16).css({"cursor":"pointer","margin-left":"2px","margin-right":"2px"}).bind("click",_62);
-$(_61).attr("googie_action_btn","1").css({"margin":0,"padding":0,"cursor":"default","white-space":"nowrap"}).bind("submit",_62);
-_61.appendChild(_5f);
-_61.appendChild(_60);
-_5e.appendChild(_61);
-_5d.appendChild(_5e);
-_4d.appendChild(_5d);
-if(this.extra_menu_items.length>0){
-_4d.appendChild(this.createListSeparator());
-}
-var _63=function(i){
-if(i<ref.extra_menu_items.length){
-var _65=ref.extra_menu_items[i];
-if(!_65[2]||_65[2](elm,ref)){
-var _66=document.createElement("tr");
-var _67=document.createElement("td");
-$(_67).html(_65[0]).bind("mouseover",ref.item_onmouseover).bind("mouseout",ref.item_onmouseout).bind("click",function(){
-return _65[1](elm,ref);
-});
-_66.appendChild(_67);
-_4d.appendChild(_66);
-}
-_63(i+1);
-}
-};
-_63(0);
-_63=null;
-if(this.use_close_btn){
-_4d.appendChild(this.createCloseButton(this.hideErrorWindow));
-}
-}
-_4c.appendChild(_4d);
-this.error_window.appendChild(_4c);
-if($.browser.msie){
-if(!this.error_window_iframe){
-var _68=$("<iframe>").css("position","absolute").css("z-index",0);
-$("body").append(_68);
-this.error_window_iframe=_68;
-}
-$(this.error_window_iframe).css({"visibility":"visible","top":this.error_window.offsetTop,"left":this.error_window.offsetLeft,"width":this.error_window.offsetWidth,"height":this.error_window.offsetHeight});
-}
-};
-this.createEditLayer=function(_69,_6a){
-this.edit_layer=document.createElement("div");
-$(this.edit_layer).addClass("googie_edit_layer").width(_69-10).height(_6a);
-if(this.text_area.nodeName.toLowerCase()!="input"||$(this.text_area).val()==""){
-$(this.edit_layer).css("overflow","auto").height(_6a-4);
-}else{
-$(this.edit_layer).css("overflow","hidden");
-}
-var ref=this;
-if(this.edit_layer_dbl_click){
-$(this.edit_layer).bind("click",function(e){
-if(e.target.className!="googie_link"&&!ref.isErrorWindowShown()){
-ref.resumeEditing();
-var fn1=function(){
-$(ref.text_area).focus();
-fn1=null;
-};
-window.setTimeout(fn1,10);
-}
-return false;
-});
-}
-};
-this.resumeEditing=function(){
-this.setStateChanged("ready");
-if(this.edit_layer){
-this.el_scroll_top=this.edit_layer.scrollTop;
-}
-this.hideErrorWindow();
-if(this.main_controller){
-$(this.spell_span).removeClass().addClass("googie_no_style");
-}
-if(!this.ignore){
-if(this.use_focus){
-$(this.focus_link_t).remove();
-$(this.focus_link_b).remove();
-}
-$(this.edit_layer).remove();
-$(this.text_area).show();
-if(this.el_scroll_top!=undefined){
-this.text_area.scrollTop=this.el_scroll_top;
-}
-}
-this.checkSpellingState(false);
-};
-this.createErrorLink=function(_6e,id){
-var elm=document.createElement("span");
-var ref=this;
-var d=function(e){
-ref.showErrorWindow(elm,id);
-d=null;
-return false;
-};
-$(elm).html(_6e).addClass("googie_link").bind("click",d).attr({"googie_action_btn":"1","g_id":id,"is_corrected":false});
-return elm;
-};
-this.createPart=function(_74){
-if(_74==" "){
-return document.createTextNode(" ");
-}
-_74=this.escapeSpecial(_74);
-_74=_74.replace(/\n/g,"<br>");
-_74=_74.replace(/    /g," &nbsp;");
-_74=_74.replace(/^ /g,"&nbsp;");
-_74=_74.replace(/ $/g,"&nbsp;");
-var _75=document.createElement("span");
-$(_75).html(_74);
-return _75;
-};
-this.showErrorsInIframe=function(){
-var _76=document.createElement("div");
-var _77=0;
-var _78=this.results;
-if(_78.length>0){
-for(var i=0;i<_78.length;i++){
-var _7a=_78[i]["attrs"]["o"];
-var len=_78[i]["attrs"]["l"];
-var _7c=this.orginal_text.substring(_77,_7a);
-var _7d=this.createPart(_7c);
-_76.appendChild(_7d);
-_77+=_7a-_77;
-var _7e=this.createErrorLink(this.orginal_text.substr(_7a,len),i);
-this.error_links.push(_7e);
-_76.appendChild(_7e);
-_77+=len;
-}
-var _7f=this.orginal_text.substr(_77,this.orginal_text.length);
-var _80=this.createPart(_7f);
-_76.appendChild(_80);
-}else{
-_76.innerHTML=this.orginal_text;
-}
-$(_76).css("text-align","left");
-var me=this;
-if(this.custom_item_evaulator){
-$.map(this.error_links,function(elm){
-me.custom_item_evaulator(me,elm);
-});
-}
-$(this.edit_layer).append(_76);
-$(this.text_area).hide();
-$(this.edit_layer).insertBefore(this.text_area);
-if(this.use_focus){
-this.focus_link_t=this.createFocusLink("focus_t");
-this.focus_link_b=this.createFocusLink("focus_b");
-$(this.focus_link_t).insertBefore(this.edit_layer);
-$(this.focus_link_b).insertAfter(this.edit_layer);
-}
-};
-this.createLangWindow=function(){
-this.language_window=document.createElement("div");
-$(this.language_window).addClass("googie_window").width(100).attr("googie_action_btn","1");
-var _83=document.createElement("table");
-var _84=document.createElement("tbody");
-var ref=this;
-$(_83).addClass("googie_list").width("100%");
-this.lang_elms=new Array();
-for(i=0;i<this.langlist_codes.length;i++){
-var row=document.createElement("tr");
-var _87=document.createElement("td");
-var _88=document.createElement("span");
-$(_88).text(this.lang_to_word[this.langlist_codes[i]]);
-this.lang_elms.push(_87);
-$(_87).attr("googieId",this.langlist_codes[i]).bind("click",function(e){
-ref.deHighlightCurSel();
-ref.setCurrentLanguage($(this).attr("googieId"));
-if(ref.lang_state_observer!=null){
-ref.lang_state_observer();
-}
-ref.highlightCurSel();
-ref.hideLangWindow();
-}).bind("mouseover",function(e){
-if(this.className!="googie_list_selected"){
-this.className="googie_list_onhover";
-}
-}).bind("mouseout",function(e){
-if(this.className!="googie_list_selected"){
-this.className="googie_list_onout";
-}
-});
-_87.appendChild(_88);
-row.appendChild(_87);
-_84.appendChild(row);
-}
-if(this.use_close_btn){
-_84.appendChild(this.createCloseButton(function(){
-ref.hideLangWindow.apply(ref);
-}));
-}
-this.highlightCurSel();
-_83.appendChild(_84);
-this.language_window.appendChild(_83);
-};
-this.isLangWindowShown=function(){
-return $(this.language_window).is(":hidden");
-};
-this.hideLangWindow=function(){
-$(this.language_window).css("visibility","hidden");
-$(this.switch_lan_pic).removeClass().addClass("googie_lang_3d_on");
-};
-this.deHighlightCurSel=function(){
-$(this.lang_cur_elm).removeClass().addClass("googie_list_onout");
-};
-this.highlightCurSel=function(){
-if(GOOGIE_CUR_LANG==null){
-GOOGIE_CUR_LANG=GOOGIE_DEFAULT_LANG;
-}
-for(var i=0;i<this.lang_elms.length;i++){
-if($(this.lang_elms[i]).attr("googieId")==GOOGIE_CUR_LANG){
-this.lang_elms[i].className="googie_list_selected";
-this.lang_cur_elm=this.lang_elms[i];
-}else{
-this.lang_elms[i].className="googie_list_onout";
-}
-}
-};
-this.showLangWindow=function(elm){
-if(this.show_menu_observer){
-this.show_menu_observer(this);
-}
-this.createLangWindow();
-$("body").append(this.language_window);
-var pos=$(elm).offset();
-var top=pos.top+$(elm).height();
-var _90=this.change_lang_pic_placement=="right"?pos.left-100+$(elm).width():pos.left+$(elm).width();
-$(this.language_window).css({"visibility":"visible","top":top+"px","left":_90+"px"});
-this.highlightCurSel();
-};
-this.createChangeLangPic=function(){
-var img=$("<img>").attr({src:this.img_dir+"change_lang.gif","alt":"Change language","googie_action_btn":"1"});
-var _92=document.createElement("span");
-var ref=this;
-$(_92).addClass("googie_lang_3d_on").append(img).bind("click",function(e){
-var elm=this.tagName.toLowerCase()=="img"?this.parentNode:this;
-if($(elm).hasClass("googie_lang_3d_click")){
-elm.className="googie_lang_3d_on";
-ref.hideLangWindow();
-}else{
-elm.className="googie_lang_3d_click";
-ref.showLangWindow(elm);
-}
-});
-return _92;
-};
-this.createSpellDiv=function(){
-var _96=document.createElement("span");
-$(_96).addClass("googie_check_spelling_link").text(this.lang_chck_spell);
-if(this.show_spell_img){
-$(_96).append(" ").append($("<img>").attr("src",this.img_dir+"spellc.gif"));
-}
-return _96;
-};
-this.flashNoSpellingErrorState=function(_97){
-this.setStateChanged("no_error_found");
-var ref=this;
-if(this.main_controller){
-var _99;
-if(_97){
-var fn=function(){
-_97();
-ref.checkSpellingState();
-};
-_99=fn;
-}else{
-_99=function(){
-ref.checkSpellingState();
-};
-}
-var rsm=$("<span>").text(this.lang_no_error_found);
-$(this.switch_lan_pic).hide();
-$(this.spell_span).empty().append(rsm).removeClass().addClass("googie_check_spelling_ok");
-window.setTimeout(_99,1000);
-}
-};
-this.resumeEditingState=function(){
-this.setStateChanged("resume_editing");
-if(this.main_controller){
-var rsm=$("<span>").text(this.lang_rsm_edt);
-var ref=this;
-$(this.switch_lan_pic).hide();
-$(this.spell_span).empty().unbind().append(rsm).bind("click",function(){
-ref.resumeEditing();
-}).removeClass().addClass("googie_resume_editing");
-}
-try{
-this.edit_layer.scrollTop=this.ta_scroll_top;
-}
-catch(e){
-}
-};
-this.checkSpellingState=function(_9e){
-if(_9e){
-this.setStateChanged("ready");
-}
-if(this.show_change_lang_pic){
-this.switch_lan_pic=this.createChangeLangPic();
-}else{
-this.switch_lan_pic=document.createElement("span");
-}
-var _9f=this.createSpellDiv();
-var ref=this;
-if(this.custom_spellcheck_starter){
-$(_9f).bind("click",function(e){
-ref.custom_spellcheck_starter();
-});
-}else{
-$(_9f).bind("click",function(e){
-ref.spellCheck();
-});
-}
-if(this.main_controller){
-if(this.change_lang_pic_placement=="left"){
-$(this.spell_container).empty().append(this.switch_lan_pic).append(" ").append(_9f);
-}else{
-$(this.spell_container).empty().append(_9f).append(" ").append(this.switch_lan_pic);
-}
-}
-this.spell_span=_9f;
-};
-this.isDefined=function(o){
-return (o!="undefined"&&o!=null);
-};
-this.errorFixed=function(){
-this.cnt_errors_fixed++;
-if(this.all_errors_fixed_observer){
-if(this.cnt_errors_fixed==this.cnt_errors){
-this.hideErrorWindow();
-this.all_errors_fixed_observer();
-}
-}
-};
-this.errorFound=function(){
-this.cnt_errors++;
-};
-this.createCloseButton=function(_a4){
-return this.createButton(this.lang_close,"googie_list_close",_a4);
-};
-this.createButton=function(_a5,_a6,_a7){
-var _a8=document.createElement("tr");
-var btn=document.createElement("td");
-var _aa;
-if(_a6){
-_aa=document.createElement("span");
-$(_aa).addClass(_a6).html(_a5);
-}else{
-_aa=document.createTextNode(_a5);
-}
-$(btn).bind("click",_a7).bind("mouseover",this.item_onmouseover).bind("mouseout",this.item_onmouseout);
-btn.appendChild(_aa);
-_a8.appendChild(btn);
-return _a8;
-};
-this.removeIndicator=function(elm){
-if(window.rcmail){
-rcmail.set_busy(false);
-}
-};
-this.appendIndicator=function(elm){
-if(window.rcmail){
-rcmail.set_busy(true,"checking");
-}
-};
-this.createFocusLink=function(_ad){
-var _ae=document.createElement("a");
-$(_ae).attr({"href":"javascript:;","name":_ad});
-return _ae;
-};
-this.item_onmouseover=function(e){
-if(this.className!="googie_list_revert"&&this.className!="googie_list_close"){
-this.className="googie_list_onhover";
-}else{
-this.parentNode.className="googie_list_onhover";
-}
-};
-this.item_onmouseout=function(e){
-if(this.className!="googie_list_revert"&&this.className!="googie_list_close"){
-this.className="googie_list_onout";
-}else{
-this.parentNode.className="googie_list_onout";
-}
-};
-};
-
+var SPELL_CUR_LANG=null,GOOGIE_DEFAULT_LANG="en";
+function GoogieSpell(x,y){var m=this,u=getCookie("language");GOOGIE_CUR_LANG=u!=null?u:GOOGIE_DEFAULT_LANG;this.array_keys=function(a){var c=[],b;for(b in a)c.push([b]);return c};this.img_dir=x;this.server_url=y;this.lang_to_word=this.org_lang_to_word={da:"Dansk",de:"Deutsch",en:"English",es:"Espa&#241;ol",fr:"Fran&#231;ais",it:"Italiano",nl:"Nederlands",pl:"Polski",pt:"Portugu&#234;s",fi:"Suomi",sv:"Svenska"};this.langlist_codes=this.array_keys(this.lang_to_word);this.show_change_lang_pic=true;this.change_lang_pic_placement=
+"right";this.report_state_change=true;this.el_scroll_top=this.ta_scroll_top=0;this.lang_chck_spell="Check spelling";this.lang_revert="Revert to";this.lang_close="Close";this.lang_rsm_edt="Resume editing";this.lang_no_error_found="No spelling errors found";this.lang_no_suggestions="No suggestions";this.show_spell_img=false;this.decoration=true;this.use_close_btn=false;this.report_ta_not_found=this.edit_layer_dbl_click=true;this.custom_no_spelling_error=this.custom_ajax_error=null;this.custom_menu_builder=
+[];this.custom_item_evaulator=null;this.extra_menu_items=[];this.custom_spellcheck_starter=null;this.main_controller=true;this.all_errors_fixed_observer=this.show_menu_observer=this.spelling_state_observer=this.lang_state_observer=null;this.use_focus=false;this.focus_link_b=this.focus_link_t=null;this.cnt_errors_fixed=this.cnt_errors=0;$(document).bind("click",function(a){a=$(a.target);a.attr("googie_action_btn")!="1"&&m.isLangWindowShown()&&m.hideLangWindow();a.attr("googie_action_btn")!="1"&&m.isErrorWindowShown()&&
+m.hideErrorWindow()});this.decorateTextarea=function(a){if(this.text_area=typeof a=="string"?document.getElementById(a):a){if(!this.spell_container&&this.decoration){a=document.createElement("table");var c=document.createElement("tbody"),b=document.createElement("tr"),d=document.createElement("td"),e=this.isDefined(this.force_width)?this.force_width:this.text_area.offsetWidth,f=this.isDefined(this.force_height)?this.force_height:16;b.appendChild(d);c.appendChild(b);$(a).append(c).insertBefore(this.text_area).width("100%").height(f);
+$(d).height(f).width(e).css("text-align","right");this.spell_container=d}this.checkSpellingState()}else this.report_ta_not_found&&alert("Text area not found")};this.setSpellContainer=function(a){this.spell_container=typeof a=="string"?document.getElementById(a):a};this.setLanguages=function(a){this.lang_to_word=a;this.langlist_codes=this.array_keys(a)};this.setCurrentLanguage=function(a){GOOGIE_CUR_LANG=a;var c=new Date;c.setTime(c.getTime()+31536E6);setCookie("language",a,c)};this.setForceWidthHeight=
+function(a,c){this.force_width=a;this.force_height=c};this.setDecoration=function(a){this.decoration=a};this.dontUseCloseButtons=function(){this.use_close_btn=false};this.appendNewMenuItem=function(a,c,b){this.extra_menu_items.push([a,c,b])};this.appendCustomMenuBuilder=function(a,c){this.custom_menu_builder.push([a,c])};this.setFocus=function(){try{this.focus_link_b.focus();this.focus_link_t.focus();return true}catch(a){return false}};this.setStateChanged=function(a){this.state=a;this.spelling_state_observer!=
+null&&this.report_state_change&&this.spelling_state_observer(a,this)};this.setReportStateChange=function(a){this.report_state_change=a};this.getUrl=function(){return this.server_url+GOOGIE_CUR_LANG};this.escapeSpecial=function(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")};this.createXMLReq=function(a){return'<?xml version="1.0" encoding="utf-8" ?><spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1"><text>'+a+"</text></spellrequest>"};
+this.spellCheck=function(a){this.cnt_errors=this.cnt_errors_fixed=0;this.setStateChanged("checking_spell");this.main_controller&&this.appendIndicator(this.spell_span);this.error_links=[];this.ta_scroll_top=this.text_area.scrollTop;this.ignore=a;this.hideLangWindow();if($(this.text_area).val()==""||a){this.custom_no_spelling_error?this.custom_no_spelling_error(this):this.flashNoSpellingErrorState();this.removeIndicator()}else{this.createEditLayer(this.text_area.offsetWidth,this.text_area.offsetHeight);
+this.createErrorWindow();$("body").append(this.error_window);try{netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead")}catch(c){}this.main_controller&&$(this.spell_span).unbind("click");this.orginal_text=$(this.text_area).val();a=this.escapeSpecial(this.orginal_text);var b=this;$.ajax({type:"POST",url:this.getUrl(),data:this.createXMLReq(a),dataType:"text",error:function(){b.custom_ajax_error?b.custom_ajax_error(b):alert("An error was encountered on the server. Please try again later.");
+if(b.main_controller){$(b.spell_span).remove();b.removeIndicator()}b.checkSpellingState()},success:function(d){b.results=b.parseResult(d);if(d.match(/<c.*>/)!=null){b.showErrorsInIframe();b.resumeEditingState()}else b.custom_no_spelling_error?b.custom_no_spelling_error(b):b.flashNoSpellingErrorState();b.removeIndicator()}})}};this.parseResult=function(a){var c=/\w+="(\d+|true)"/g,b=/\t/g;a=a.match(/<c[^>]*>[^<]*<\/c>/g);var d=[];if(a==null)return d;for(var e=0,f=a.length;e<f;e++){var j=[];this.errorFound();
+j.attrs=[];for(var g,h,n=a[e].match(c),k=0;k<n.length;k++){g=n[k].split(/=/);h=g[1].replace(/"/g,"");j.attrs[g[0]]=h!="true"?parseInt(h):h}j.suggestions=[];g=a[e].replace(/<[^>]*>/g,"").split(b);for(h=0;h<g.length;h++)g[h]!=""&&j.suggestions.push(g[h]);d.push(j)}return d};this.createErrorWindow=function(){this.error_window=document.createElement("div");$(this.error_window).addClass("googie_window popupmenu").attr("googie_action_btn","1")};this.isErrorWindowShown=function(){return $(this.error_window).is(":visible")};
+this.hideErrorWindow=function(){$(this.error_window).hide();$(this.error_window_iframe).hide()};this.updateOrginalText=function(a,c,b,d){var e=this.orginal_text.substring(0,a);a=this.orginal_text.substring(a+c.length);c=b.length-c.length;this.orginal_text=e+b+a;$(this.text_area).val(this.orginal_text);b=0;for(e=this.results.length;b<e;b++)if(b!=d&&b>d)this.results[b].attrs.o+=c};this.saveOldValue=function(a,c){a.is_changed=true;a.old_value=c};this.createListSeparator=function(){var a=document.createElement("td"),
+c=document.createElement("tr");$(a).html(" ").attr("googie_action_btn","1").css({cursor:"default","font-size":"3px","border-top":"1px solid #ccc","padding-top":"3px"});c.appendChild(a);return c};this.correctError=function(a,c,b,d){var e=c.innerHTML;b=b.nodeType==3?b.nodeValue:b.innerHTML;var f=this.results[a].attrs.o;if(d){d=c.previousSibling.innerHTML;c.previousSibling.innerHTML=d.slice(0,d.length-1);e=" "+e;f--}this.hideErrorWindow();this.updateOrginalText(f,e,b,a);$(c).html(b).css("color","green").attr("is_corrected",
+true);this.results[a].attrs.l=b.length;this.isDefined(c.old_value)||this.saveOldValue(c,e);this.errorFixed()};this.showErrorWindow=function(a,c){this.show_menu_observer&&this.show_menu_observer(this);var b=this,d=$(a).offset(),e=document.createElement("table"),f=document.createElement("tbody");$(this.error_window).html("");$(e).addClass("googie_list").attr("googie_action_btn","1");for(var j=false,g=0;g<this.custom_menu_builder.length;g++){var h=this.custom_menu_builder[g];if(h[0](this.results[c])){j=
+h[1](this,f,a);break}}if(!j){j=this.results[c].suggestions;var n=this.results[c].attrs.o;g=this.results[c].attrs.l;var k,l;if(j.length==0){h=document.createElement("tr");k=document.createElement("td");l=document.createElement("span");$(l).text(this.lang_no_suggestions);$(k).attr("googie_action_btn","1").css("cursor","default");k.appendChild(l);h.appendChild(k);f.appendChild(h)}var r=0;for(g=j.length;r<g;r++){h=document.createElement("tr");k=document.createElement("td");l=document.createElement("span");
+$(l).html(j[r]);$(k).bind("mouseover",this.item_onmouseover).bind("mouseout",this.item_onmouseout).bind("click",function(p){b.correctError(c,a,p.target.firstChild)});k.appendChild(l);h.appendChild(k);f.appendChild(h)}if(a.is_changed&&a.innerHTML!=a.old_value){var s=a.old_value;j=document.createElement("tr");g=document.createElement("td");h=document.createElement("span");$(h).addClass("googie_list_revert").html(this.lang_revert+" "+s);$(g).bind("mouseover",this.item_onmouseover).bind("mouseout",this.item_onmouseout).bind("click",
+function(){b.updateOrginalText(n,a.innerHTML,s,c);$(a).attr("is_corrected",true).css("color","#b91414").html(s);b.hideErrorWindow()});g.appendChild(h);j.appendChild(g);f.appendChild(j)}j=document.createElement("tr");g=document.createElement("td");var o=document.createElement("input");h=document.createElement("img");k=document.createElement("form");l=function(){if(o.value!=""){b.isDefined(a.old_value)||b.saveOldValue(a,a.innerHTML);b.updateOrginalText(n,a.innerHTML,o.value,c);$(a).attr("is_corrected",
+true).css("color","green").html(o.value);b.hideErrorWindow()}return false};$(o).width(120).css({margin:0,padding:0});$(o).val(a.innerHTML).attr("googie_action_btn","1");$(g).css("cursor","default").attr("googie_action_btn","1");$(h).attr("src",this.img_dir+"ok.gif").width(32).height(16).css({cursor:"pointer","margin-left":"2px","margin-right":"2px"}).bind("click",l);$(k).attr("googie_action_btn","1").css({margin:0,padding:0,cursor:"default","white-space":"nowrap"}).bind("submit",l);k.appendChild(o);
+k.appendChild(h);g.appendChild(k);j.appendChild(g);f.appendChild(j);this.extra_menu_items.length>0&&f.appendChild(this.createListSeparator());var t=function(p){if(p<b.extra_menu_items.length){var q=b.extra_menu_items[p];if(!q[2]||q[2](a,b)){var v=document.createElement("tr"),w=document.createElement("td");$(w).html(q[0]).bind("mouseover",b.item_onmouseover).bind("mouseout",b.item_onmouseout).bind("click",function(){return q[1](a,b)});v.appendChild(w);f.appendChild(v)}t(p+1)}};t(0);t=null;this.use_close_btn&&
+f.appendChild(this.createCloseButton(this.hideErrorWindow))}e.appendChild(f);this.error_window.appendChild(e);g=$(this.error_window).height();e=$(this.error_window).width();h=$(document).height();j=$(document).width();g=d.top+g+20<h?d.top+20:d.top-g;d=d.left+e<j?d.left:d.left-e;$(this.error_window).css({top:g+"px",left:d+"px"}).show();if($.browser.msie){if(!this.error_window_iframe){d=$("<iframe>").css({position:"absolute","z-index":-1});$("body").append(d);this.error_window_iframe=d}$(this.error_window_iframe).css({top:this.error_window.offsetTop,
+left:this.error_window.offsetLeft,width:this.error_window.offsetWidth,height:this.error_window.offsetHeight}).show()}};this.createEditLayer=function(a,c){this.edit_layer=document.createElement("div");$(this.edit_layer).addClass("googie_edit_layer").attr("id","googie_edit_layer").width("auto").height(c);this.text_area.nodeName.toLowerCase()!="input"||$(this.text_area).val()==""?$(this.edit_layer).css("overflow","auto").height(c-4):$(this.edit_layer).css("overflow","hidden");var b=this;this.edit_layer_dbl_click&&
+$(this.edit_layer).dblclick(function(d){if(d.target.className!="googie_link"&&!b.isErrorWindowShown()){b.resumeEditing();var e=function(){$(b.text_area).focus();e=null};window.setTimeout(e,10)}return false})};this.resumeEditing=function(){this.setStateChanged("ready");if(this.edit_layer)this.el_scroll_top=this.edit_layer.scrollTop;this.hideErrorWindow();this.main_controller&&$(this.spell_span).removeClass().addClass("googie_no_style");if(!this.ignore){if(this.use_focus){$(this.focus_link_t).remove();
+$(this.focus_link_b).remove()}$(this.edit_layer).remove();$(this.text_area).show();if(this.el_scroll_top!=undefined)this.text_area.scrollTop=this.el_scroll_top}this.checkSpellingState(false)};this.createErrorLink=function(a,c){var b=document.createElement("span"),d=this,e=function(){d.showErrorWindow(b,c);e=null;return false};$(b).html(a).addClass("googie_link").bind("click",e).attr({googie_action_btn:"1",g_id:c,is_corrected:false});return b};this.createPart=function(a){if(a==" ")return document.createTextNode(" ");
+a=this.escapeSpecial(a);a=a.replace(/\n/g,"<br>");a=a.replace(/    /g," &nbsp;");a=a.replace(/^ /g,"&nbsp;");a=a.replace(/ $/g,"&nbsp;");var c=document.createElement("span");$(c).html(a);return c};this.showErrorsInIframe=function(){var a=document.createElement("div"),c=0,b=this.results;if(b.length>0){for(var d=0,e=b.length;d<e;d++){var f=b[d].attrs.o,j=b[d].attrs.l,g=this.createPart(this.orginal_text.substring(c,f));a.appendChild(g);c+=f-c;f=this.createErrorLink(this.orginal_text.substr(f,j),d);this.error_links.push(f);
+a.appendChild(f);c+=j}c=this.createPart(this.orginal_text.substr(c,this.orginal_text.length));a.appendChild(c)}else a.innerHTML=this.orginal_text;$(a).css("text-align","left");var h=this;this.custom_item_evaulator&&$.map(this.error_links,function(n){h.custom_item_evaulator(h,n)});$(this.edit_layer).append(a);$(this.text_area).hide();$(this.edit_layer).insertBefore(this.text_area);if(this.use_focus){this.focus_link_t=this.createFocusLink("focus_t");this.focus_link_b=this.createFocusLink("focus_b");
+$(this.focus_link_t).insertBefore(this.edit_layer);$(this.focus_link_b).insertAfter(this.edit_layer)}};this.createLangWindow=function(){this.language_window=document.createElement("div");$(this.language_window).addClass("googie_window popupmenu").width(100).attr("googie_action_btn","1");var a=document.createElement("table"),c=document.createElement("tbody"),b=this,d,e,f;$(a).addClass("googie_list").width("100%");this.lang_elms=[];for(i=0;i<this.langlist_codes.length;i++){d=document.createElement("tr");
+e=document.createElement("td");f=document.createElement("span");$(f).text(this.lang_to_word[this.langlist_codes[i]]);this.lang_elms.push(e);$(e).attr("googieId",this.langlist_codes[i]).bind("click",function(){b.deHighlightCurSel();b.setCurrentLanguage($(this).attr("googieId"));b.lang_state_observer!=null&&b.lang_state_observer();b.highlightCurSel();b.hideLangWindow()}).bind("mouseover",function(){if(this.className!="googie_list_selected")this.className="googie_list_onhover"}).bind("mouseout",function(){if(this.className!=
+"googie_list_selected")this.className="googie_list_onout"});e.appendChild(f);d.appendChild(e);c.appendChild(d)}this.use_close_btn&&c.appendChild(this.createCloseButton(function(){b.hideLangWindow.apply(b)}));this.highlightCurSel();a.appendChild(c);this.language_window.appendChild(a)};this.isLangWindowShown=function(){return $(this.language_window).is(":visible")};this.hideLangWindow=function(){$(this.language_window).hide();$(this.switch_lan_pic).removeClass().addClass("googie_lang_3d_on")};this.showLangWindow=
+function(a){this.show_menu_observer&&this.show_menu_observer(this);this.createLangWindow();$("body").append(this.language_window);var c=$(a).offset(),b=$(a).height(),d=$(a).width();a=$(this.language_window).height();var e=$(document).height();d=this.change_lang_pic_placement=="right"?c.left-100+d:c.left+d;c=c.top+a<e?c.top+b:c.top-a-4;$(this.language_window).css({top:c+"px",left:d+"px"}).show();this.highlightCurSel()};this.deHighlightCurSel=function(){$(this.lang_cur_elm).removeClass().addClass("googie_list_onout")};
+this.highlightCurSel=function(){if(GOOGIE_CUR_LANG==null)GOOGIE_CUR_LANG=GOOGIE_DEFAULT_LANG;for(var a=0;a<this.lang_elms.length;a++)if($(this.lang_elms[a]).attr("googieId")==GOOGIE_CUR_LANG){this.lang_elms[a].className="googie_list_selected";this.lang_cur_elm=this.lang_elms[a]}else this.lang_elms[a].className="googie_list_onout"};this.createChangeLangPic=function(){var a=$("<img>").attr({src:this.img_dir+"change_lang.gif",alt:"Change language",googie_action_btn:"1"}),c=document.createElement("span");
+m=this;$(c).addClass("googie_lang_3d_on").append(a).bind("click",function(){var b=this.tagName.toLowerCase()=="img"?this.parentNode:this;if($(b).hasClass("googie_lang_3d_click")){b.className="googie_lang_3d_on";m.hideLangWindow()}else{b.className="googie_lang_3d_click";m.showLangWindow(b)}});return c};this.createSpellDiv=function(){var a=document.createElement("span");$(a).addClass("googie_check_spelling_link").text(this.lang_chck_spell);this.show_spell_img&&$(a).append(" ").append($("<img>").attr("src",
+this.img_dir+"spellc.gif"));return a};this.flashNoSpellingErrorState=function(a){this.setStateChanged("no_error_found");var c=this;if(this.main_controller){var b;b=a?function(){a();c.checkSpellingState()}:function(){c.checkSpellingState()};var d=$("<span>").text(this.lang_no_error_found);$(this.switch_lan_pic).hide();$(this.spell_span).empty().append(d).removeClass().addClass("googie_check_spelling_ok");window.setTimeout(b,1E3)}};this.resumeEditingState=function(){this.setStateChanged("resume_editing");
+if(this.main_controller){var a=$("<span>").text(this.lang_rsm_edt),c=this;$(this.switch_lan_pic).hide();$(this.spell_span).empty().unbind().append(a).bind("click",function(){c.resumeEditing()}).removeClass().addClass("googie_resume_editing")}try{this.edit_layer.scrollTop=this.ta_scroll_top}catch(b){}};this.checkSpellingState=function(a){a&&this.setStateChanged("ready");this.switch_lan_pic=this.show_change_lang_pic?this.createChangeLangPic():document.createElement("span");a=this.createSpellDiv();var c=
+this;this.custom_spellcheck_starter?$(a).bind("click",function(){c.custom_spellcheck_starter()}):$(a).bind("click",function(){c.spellCheck()});if(this.main_controller)this.change_lang_pic_placement=="left"?$(this.spell_container).empty().append(this.switch_lan_pic).append(" ").append(a):$(this.spell_container).empty().append(a).append(" ").append(this.switch_lan_pic);this.spell_span=a};this.isDefined=function(a){return a!="undefined"&&a!=null};this.errorFixed=function(){this.cnt_errors_fixed++;if(this.all_errors_fixed_observer)if(this.cnt_errors_fixed==
+this.cnt_errors){this.hideErrorWindow();this.all_errors_fixed_observer()}};this.errorFound=function(){this.cnt_errors++};this.createCloseButton=function(a){return this.createButton(this.lang_close,"googie_list_close",a)};this.createButton=function(a,c,b){var d=document.createElement("tr"),e=document.createElement("td"),f;if(c){f=document.createElement("span");$(f).addClass(c).html(a)}else f=document.createTextNode(a);$(e).bind("click",b).bind("mouseover",this.item_onmouseover).bind("mouseout",this.item_onmouseout);
+e.appendChild(f);d.appendChild(e);return d};this.removeIndicator=function(){window.rcmail&&rcmail.set_busy(false,null,this.rc_msg_id)};this.appendIndicator=function(){if(window.rcmail)this.rc_msg_id=rcmail.set_busy(true,"checking")};this.createFocusLink=function(a){var c=document.createElement("a");$(c).attr({href:"javascript:;",name:a});return c};this.item_onmouseover=function(){if(this.className!="googie_list_revert"&&this.className!="googie_list_close")this.className="googie_list_onhover";else this.parentNode.className=
+"googie_list_onhover"};this.item_onmouseout=function(){if(this.className!="googie_list_revert"&&this.className!="googie_list_close")this.className="googie_list_onout";else this.parentNode.className="googie_list_onout"}};
index abd3462ecd267cb9f0b143529369631f14150460..428d7f0dc1a8cbb1610a7912c4243bd13d0b52c9 100644 (file)
@@ -7,29 +7,29 @@
          GPL
      AUTHORS
          4mir Salihefendic (http://amix.dk) - amix@amix.dk
-        Aleksander Machniak - alec [at] alec.pl
+           Aleksander Machniak - alec [at] alec.pl
 */
 
 var SPELL_CUR_LANG = null;
 var GOOGIE_DEFAULT_LANG = 'en';
 
 function GoogieSpell(img_dir, server_url) {
-    var ref = this;
+    var ref = this,
+        cookie_value = getCookie('language');
+
+    GOOGIE_CUR_LANG = cookie_value != null ? cookie_value : GOOGIE_DEFAULT_LANG;
 
     this.array_keys = function(arr) {
-       var res = [];
-       for (var key in arr) { res.push([key]); }
-       return res;
+           var res = [];
+           for (var key in arr) { res.push([key]); }
+           return res;
     }
-    
-    var cookie_value = getCookie('language');
-    GOOGIE_CUR_LANG = cookie_value != null ? cookie_value : GOOGIE_DEFAULT_LANG;
 
     this.img_dir = img_dir;
     this.server_url = server_url;
 
     this.org_lang_to_word = {
-       "da": "Dansk", "de": "Deutsch", "en": "English",
+           "da": "Dansk", "de": "Deutsch", "en": "English",
         "es": "Espa&#241;ol", "fr": "Fran&#231;ais", "it": "Italiano", 
         "nl": "Nederlands", "pl": "Polski", "pt": "Portugu&#234;s",
         "fi": "Suomi", "sv": "Svenska"
@@ -49,42 +49,43 @@ function GoogieSpell(img_dir, server_url) {
     this.lang_rsm_edt = "Resume editing";
     this.lang_no_error_found = "No spelling errors found";
     this.lang_no_suggestions = "No suggestions";
-    
+
     this.show_spell_img = false; // roundcube mod.
     this.decoration = true;
-    this.use_close_btn = true;
+    this.use_close_btn = false;
     this.edit_layer_dbl_click = true;
     this.report_ta_not_found = true;
 
-    //Extensions
+    // Extensions
     this.custom_ajax_error = null;
     this.custom_no_spelling_error = null;
-    this.custom_menu_builder = []; //Should take an eval function and a build menu function
-    this.custom_item_evaulator = null; //Should take an eval function and a build menu function
+    this.custom_menu_builder = []; // Should take an eval function and a build menu function
+    this.custom_item_evaulator = null; // Should take an eval function and a build menu function
     this.extra_menu_items = [];
     this.custom_spellcheck_starter = null;
     this.main_controller = true;
 
-    //Observers
+    // Observers
     this.lang_state_observer = null;
     this.spelling_state_observer = null;
     this.show_menu_observer = null;
     this.all_errors_fixed_observer = null;
 
-    //Focus links - used to give the text box focus
+    // Focus links - used to give the text box focus
     this.use_focus = false;
     this.focus_link_t = null;
     this.focus_link_b = null;
 
-    //Counters
+    // Counters
     this.cnt_errors = 0;
     this.cnt_errors_fixed = 0;
-    
-    //Set document on click to hide the language and error menu
+
+    // Set document's onclick to hide the language and error menu
     $(document).bind('click', function(e) {
-        if($(e.target).attr('googie_action_btn') != '1' && ref.isLangWindowShown())
-           ref.hideLangWindow();
-       if($(e.target).attr('googie_action_btn') != '1' && ref.isErrorWindowShown())
+        var target = $(e.target);
+        if(target.attr('googie_action_btn') != '1' && ref.isLangWindowShown())
+               ref.hideLangWindow();
+           if(target.attr('googie_action_btn') != '1' && ref.isErrorWindowShown())
             ref.hideErrorWindow();
     });
 
@@ -94,13 +95,12 @@ this.decorateTextarea = function(id) {
 
     if (this.text_area) {
         if (!this.spell_container && this.decoration) {
-            var table = document.createElement('table');
-            var tbody = document.createElement('tbody');
-            var tr = document.createElement('tr');
-            var spell_container = document.createElement('td');
-
-            var r_width = this.isDefined(this.force_width) ? this.force_width : this.text_area.offsetWidth;
-            var r_height = this.isDefined(this.force_height) ? this.force_height : 16;
+            var table = document.createElement('table'),
+                tbody = document.createElement('tbody'),
+                tr = document.createElement('tr'),
+                spell_container = document.createElement('td'),
+                r_width = this.isDefined(this.force_width) ? this.force_width : this.text_area.offsetWidth,
+                r_height = this.isDefined(this.force_height) ? this.force_height : 16;
 
             tr.appendChild(spell_container);
             tbody.appendChild(tr);
@@ -112,23 +112,21 @@ this.decorateTextarea = function(id) {
 
         this.checkSpellingState();
     }
-    else 
-        if (this.report_ta_not_found)
-            alert('Text area not found');
-}
+    else if (this.report_ta_not_found)
+        alert('Text area not found');
+};
 
 //////
 // API Functions (the ones that you can call)
 /////
 this.setSpellContainer = function(id) {
     this.spell_container = typeof(id) == 'string' ? document.getElementById(id) : id;
-
-}
+};
 
 this.setLanguages = function(lang_dict) {
     this.lang_to_word = lang_dict;
     this.langlist_codes = this.array_keys(lang_dict);
-}
+};
 
 this.setCurrentLanguage = function(lan_code) {
     GOOGIE_CUR_LANG = lan_code;
@@ -137,29 +135,29 @@ this.setCurrentLanguage = function(lan_code) {
     var now = new Date();
     now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000);
     setCookie('language', lan_code, now);
-}
+};
 
 this.setForceWidthHeight = function(width, height) {
     // Set to null if you want to use one of them
     this.force_width = width;
     this.force_height = height;
-}
+};
 
 this.setDecoration = function(bool) {
     this.decoration = bool;
-}
+};
 
 this.dontUseCloseButtons = function() {
     this.use_close_btn = false;
-}
+};
 
 this.appendNewMenuItem = function(name, call_back_fn, checker) {
     this.extra_menu_items.push([name, call_back_fn, checker]);
-}
+};
 
 this.appendCustomMenuBuilder = function(eval, builder) {
     this.custom_menu_builder.push([eval, builder]);
-}
+};
 
 this.setFocus = function() {
     try {
@@ -170,7 +168,7 @@ this.setFocus = function() {
     catch(e) {
         return false;
     }
-}
+};
 
 
 //////
@@ -180,11 +178,11 @@ this.setStateChanged = function(current_state) {
     this.state = current_state;
     if (this.spelling_state_observer != null && this.report_state_change)
         this.spelling_state_observer(current_state, this);
-}
+};
 
 this.setReportStateChange = function(bool) {
     this.report_state_change = bool;
-}
+};
 
 
 //////
@@ -192,17 +190,17 @@ this.setReportStateChange = function(bool) {
 /////
 this.getUrl = function() {
     return this.server_url + GOOGIE_CUR_LANG;
-}
+};
 
 this.escapeSpecial = function(val) {
     return val.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
-}
+};
 
 this.createXMLReq = function (text) {
     return '<?xml version="1.0" encoding="utf-8" ?>'
        + '<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1">'
        + '<text>' + text + '</text></spellrequest>';
-}
+};
 
 this.spellCheck = function(ignore) {
     this.cnt_errors_fixed = 0;
@@ -225,12 +223,12 @@ this.spellCheck = function(ignore) {
         this.removeIndicator();
         return;
     }
-    
+
     this.createEditLayer(this.text_area.offsetWidth, this.text_area.offsetHeight);
     this.createErrorWindow();
     $('body').append(this.error_window);
 
-    try { netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); } 
+    try { netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); }
     catch (e) { }
 
     if (this.main_controller)
@@ -242,34 +240,34 @@ this.spellCheck = function(ignore) {
 
     $.ajax({ type: 'POST', url: this.getUrl(),
        data: this.createXMLReq(req_text), dataType: 'text',
-       error: function(o) {
-           if (ref.custom_ajax_error)
-               ref.custom_ajax_error(ref);
-           else
-               alert('An error was encountered on the server. Please try again later.');
-           if (ref.main_controller) {
-               $(ref.spell_span).remove();
-               ref.removeIndicator();
-           }
-           ref.checkSpellingState();
-       },
+           error: function(o) {
+            if (ref.custom_ajax_error)
+                   ref.custom_ajax_error(ref);
+            else
+                   alert('An error was encountered on the server. Please try again later.');
+            if (ref.main_controller) {
+                   $(ref.spell_span).remove();
+                   ref.removeIndicator();
+            }
+            ref.checkSpellingState();
+           },
         success: function(data) {
-           var r_text = data;
+               var r_text = data;
            ref.results = ref.parseResult(r_text);
            if (r_text.match(/<c.*>/) != null) {
-               //Before parsing be sure that errors were found
-               ref.showErrorsInIframe();
-               ref.resumeEditingState();
+                   // Before parsing be sure that errors were found
+                   ref.showErrorsInIframe();
+                   ref.resumeEditingState();
            } else {
-               if (!ref.custom_no_spelling_error)
-                   ref.flashNoSpellingErrorState();
+                   if (!ref.custom_no_spelling_error)
+                       ref.flashNoSpellingErrorState();
                else
-                   ref.custom_no_spelling_error(ref);
+               ref.custom_no_spelling_error(ref);
            }
            ref.removeIndicator();
-       }
+           }
     });
-}
+};
 
 
 //////
@@ -277,40 +275,41 @@ this.spellCheck = function(ignore) {
 /////
 this.parseResult = function(r_text) {
     // Returns an array: result[item] -> ['attrs'], ['suggestions']
-    var re_split_attr_c = /\w+="(\d+|true)"/g;
-    var re_split_text = /\t/g;
-
-    var matched_c = r_text.match(/<c[^>]*>[^<]*<\/c>/g);
-    var results = new Array();
+    var re_split_attr_c = /\w+="(\d+|true)"/g,
+        re_split_text = /\t/g,
+        matched_c = r_text.match(/<c[^>]*>[^<]*<\/c>/g),
+        results = [];
 
     if (matched_c == null)
         return results;
-    
-    for (var i=0; i < matched_c.length; i++) {
-        var item = new Array();
+
+    for (var i=0, len=matched_c.length; i < len; i++) {
+        var item = [];
         this.errorFound();
 
-        //Get attributes
-        item['attrs'] = new Array();
-        var split_c = matched_c[i].match(re_split_attr_c);
+        // Get attributes
+        item['attrs'] = [];
+        var c_attr, val,
+            split_c = matched_c[i].match(re_split_attr_c);
         for (var j=0; j < split_c.length; j++) {
-            var c_attr = split_c[j].split(/=/);
-            var val = c_attr[1].replace(/"/g, '');
+            c_attr = split_c[j].split(/=/);
+            val = c_attr[1].replace(/"/g, '');
             item['attrs'][c_attr[0]] = val != 'true' ? parseInt(val) : val;
         }
 
-        //Get suggestions
-        item['suggestions'] = new Array();
-        var only_text = matched_c[i].replace(/<[^>]*>/g, '');
-        var split_t = only_text.split(re_split_text);
+        // Get suggestions
+        item['suggestions'] = [];
+        var only_text = matched_c[i].replace(/<[^>]*>/g, ''),
+            split_t = only_text.split(re_split_text);
         for (var k=0; k < split_t.length; k++) {
            if(split_t[k] != '')
                item['suggestions'].push(split_t[k]);
        }
         results.push(item);
     }
+
     return results;
-}
+};
 
 
 //////
@@ -318,51 +317,52 @@ this.parseResult = function(r_text) {
 /////
 this.createErrorWindow = function() {
     this.error_window = document.createElement('div');
-    $(this.error_window).addClass('googie_window').attr('googie_action_btn', '1');
-}
+    $(this.error_window).addClass('googie_window popupmenu').attr('googie_action_btn', '1');
+};
 
 this.isErrorWindowShown = function() {
     return $(this.error_window).is(':visible');
-}
+};
 
 this.hideErrorWindow = function() {
-    $(this.error_window).css('visibility', 'hidden');
-    $(this.error_window_iframe).css('visibility', 'hidden');
-}
+    $(this.error_window).hide();
+    $(this.error_window_iframe).hide();
+};
 
 this.updateOrginalText = function(offset, old_value, new_value, id) {
-    var part_1 = this.orginal_text.substring(0, offset);
-    var part_2 = this.orginal_text.substring(offset+old_value.length);
+    var part_1 = this.orginal_text.substring(0, offset),
+        part_2 = this.orginal_text.substring(offset+old_value.length),
+        add_2_offset = new_value.length - old_value.length;
+
     this.orginal_text = part_1 + new_value + part_2;
     $(this.text_area).val(this.orginal_text);
-    var add_2_offset = new_value.length - old_value.length;
-    for (var j=0; j < this.results.length; j++) {
-        //Don't edit the offset of the current item
+    for (var j=0, len=this.results.length; j<len; j++) {
+        // Don't edit the offset of the current item
         if (j != id && j > id)
             this.results[j]['attrs']['o'] += add_2_offset;
     }
-}
+};
 
 this.saveOldValue = function(elm, old_value) {
     elm.is_changed = true;
     elm.old_value = old_value;
-}
+};
 
 this.createListSeparator = function() {
-    var td = document.createElement('td');
-    var tr = document.createElement('tr');
+    var td = document.createElement('td'),
+        tr = document.createElement('tr');
 
     $(td).html(' ').attr('googie_action_btn', '1')
        .css({'cursor': 'default', 'font-size': '3px', 'border-top': '1px solid #ccc', 'padding-top': '3px'});
     tr.appendChild(td);
 
     return tr;
-}
+};
 
 this.correctError = function(id, elm, l_elm, rm_pre_space) {
-    var old_value = elm.innerHTML;
-    var new_value = l_elm.nodeType == 3 ? l_elm.nodeValue : l_elm.innerHTML;
-    var offset = this.results[id]['attrs']['o'];
+    var old_value = elm.innerHTML,
+        new_value = l_elm.nodeType == 3 ? l_elm.nodeValue : l_elm.innerHTML,
+        offset = this.results[id]['attrs']['o'];
 
     if (rm_pre_space) {
         var pre_length = elm.previousSibling.innerHTML;
@@ -380,47 +380,42 @@ this.correctError = function(id, elm, l_elm, rm_pre_space) {
 
     if (!this.isDefined(elm.old_value))
         this.saveOldValue(elm, old_value);
-    
+
     this.errorFixed();
-}
+};
 
 this.showErrorWindow = function(elm, id) {
     if (this.show_menu_observer)
         this.show_menu_observer(this);
 
-    var ref = this;
-    var pos = $(elm).offset();
-    pos.top -= this.edit_layer.scrollTop;
-
-    $(this.error_window).css({'visibility': 'visible',
-       'top': (pos.top+20)+'px', 'left': (pos.left)+'px'}).html('');
-
-    var table = document.createElement('table');
-    var list = document.createElement('tbody');
+    var ref = this,
+        pos = $(elm).offset(),
+        table = document.createElement('table'),
+        list = document.createElement('tbody');
 
+    $(this.error_window).html('');
     $(table).addClass('googie_list').attr('googie_action_btn', '1');
 
-    //Check if we should use custom menu builder, if not we use the default
+    // Check if we should use custom menu builder, if not we use the default
     var changed = false;
-    if (this.custom_menu_builder != []) {
-        for (var k=0; k<this.custom_menu_builder.length; k++) {
-            var eb = this.custom_menu_builder[k];
-            if(eb[0]((this.results[id]))){
-                changed = eb[1](this, list, elm);
-                break;
-            }
+    for (var k=0; k<this.custom_menu_builder.length; k++) {
+        var eb = this.custom_menu_builder[k];
+        if(eb[0]((this.results[id]))){
+            changed = eb[1](this, list, elm);
+            break;
         }
     }
     if (!changed) {
-        //Build up the result list
-        var suggestions = this.results[id]['suggestions'];
-        var offset = this.results[id]['attrs']['o'];
-        var len = this.results[id]['attrs']['l'];
+        // Build up the result list
+        var suggestions = this.results[id]['suggestions'],
+            offset = this.results[id]['attrs']['o'],
+            len = this.results[id]['attrs']['l'],
+            row, item, dummy;
 
         if (suggestions.length == 0) {
-            var row = document.createElement('tr');
-            var item = document.createElement('td');
-            var dummy = document.createElement('span');
+            row = document.createElement('tr'),
+            item = document.createElement('td'),
+            dummy = document.createElement('span');
 
             $(dummy).text(this.lang_no_suggestions);
             $(item).attr('googie_action_btn', '1').css('cursor', 'default');
@@ -430,16 +425,16 @@ this.showErrorWindow = function(elm, id) {
             list.appendChild(row);
         }
 
-        for (i=0; i < suggestions.length; i++) {
-            var row = document.createElement('tr');
-            var item = document.createElement('td');
-            var dummy = document.createElement('span');
+        for (var i=0, len=suggestions.length; i < len; i++) {
+            row = document.createElement('tr'),
+            item = document.createElement('td'),
+            dummy = document.createElement('span');
 
             $(dummy).html(suggestions[i]);
-            
+
             $(item).bind('mouseover', this.item_onmouseover)
-               .bind('mouseout', this.item_onmouseout)
-               .bind('click', function(e) { ref.correctError(id, elm, e.target.firstChild) });
+                   .bind('mouseout', this.item_onmouseout)
+                   .bind('click', function(e) { ref.correctError(id, elm, e.target.firstChild) });
 
             item.appendChild(dummy);
             row.appendChild(item);
@@ -448,32 +443,32 @@ this.showErrorWindow = function(elm, id) {
 
         //The element is changed, append the revert
         if (elm.is_changed && elm.innerHTML != elm.old_value) {
-            var old_value = elm.old_value;
-            var revert_row = document.createElement('tr');
-            var revert = document.createElement('td');
-            var rev_span = document.createElement('span');
-           
-           $(rev_span).addClass('googie_list_revert').html(this.lang_revert + ' ' + old_value);
+            var old_value = elm.old_value,
+                revert_row = document.createElement('tr'),
+                revert = document.createElement('td'),
+                rev_span = document.createElement('span');
+
+               $(rev_span).addClass('googie_list_revert').html(this.lang_revert + ' ' + old_value);
 
             $(revert).bind('mouseover', this.item_onmouseover)
-               .bind('mouseout', this.item_onmouseout)
-               .bind('click', function(e) {
+                   .bind('mouseout', this.item_onmouseout)
+                   .bind('click', function(e) {
                    ref.updateOrginalText(offset, elm.innerHTML, old_value, id);
                    $(elm).attr('is_corrected', true).css('color', '#b91414').html(old_value);
                    ref.hideErrorWindow();
-               });
+                   });
 
             revert.appendChild(rev_span);
             revert_row.appendChild(revert);
             list.appendChild(revert_row);
         }
-        
-        //Append the edit box
-        var edit_row = document.createElement('tr');
-        var edit = document.createElement('td');
-        var edit_input = document.createElement('input');
-        var ok_pic = document.createElement('img');
-       var edit_form = document.createElement('form');
+
+        // Append the edit box
+        var edit_row = document.createElement('tr'),
+            edit = document.createElement('td'),
+            edit_input = document.createElement('input'),
+            ok_pic = document.createElement('img'),
+               edit_form = document.createElement('form');
 
         var onsub = function () {
             if (edit_input.value != '') {
@@ -481,55 +476,55 @@ this.showErrorWindow = function(elm, id) {
                     ref.saveOldValue(elm, elm.innerHTML);
 
                 ref.updateOrginalText(offset, elm.innerHTML, edit_input.value, id);
-               $(elm).attr('is_corrected', true).css('color', 'green').html(edit_input.value);
+                       $(elm).attr('is_corrected', true).css('color', 'green').html(edit_input.value);
                 ref.hideErrorWindow();
             }
             return false;
         };
 
-       $(edit_input).width(120).css({'margin': 0, 'padding': 0});
-       $(edit_input).val(elm.innerHTML).attr('googie_action_btn', '1');
-       $(edit).css('cursor', 'default').attr('googie_action_btn', '1');
+           $(edit_input).width(120).css({'margin': 0, 'padding': 0});
+           $(edit_input).val(elm.innerHTML).attr('googie_action_btn', '1');
+           $(edit).css('cursor', 'default').attr('googie_action_btn', '1');
 
-       $(ok_pic).attr('src', this.img_dir + 'ok.gif')
-           .width(32).height(16)
-           .css({'cursor': 'pointer', 'margin-left': '2px', 'margin-right': '2px'})
-           .bind('click', onsub);
+           $(ok_pic).attr('src', this.img_dir + 'ok.gif')
+               .width(32).height(16)
+           .css({'cursor': 'pointer', 'margin-left': '2px', 'margin-right': '2px'})
+               .bind('click', onsub);
 
         $(edit_form).attr('googie_action_btn', '1')
-           .css({'margin': 0, 'padding': 0, 'cursor': 'default', 'white-space': 'nowrap'})
-           .bind('submit', onsub);
-        
-       edit_form.appendChild(edit_input);
-       edit_form.appendChild(ok_pic);
+               .css({'margin': 0, 'padding': 0, 'cursor': 'default', 'white-space': 'nowrap'})
+               .bind('submit', onsub);
+
+           edit_form.appendChild(edit_input);
+           edit_form.appendChild(ok_pic);
         edit.appendChild(edit_form);
         edit_row.appendChild(edit);
         list.appendChild(edit_row);
 
-        //Append extra menu items
+        // Append extra menu items
         if (this.extra_menu_items.length > 0)
-           list.appendChild(this.createListSeparator());
-       
+               list.appendChild(this.createListSeparator());
+
         var loop = function(i) {
-                if (i < ref.extra_menu_items.length) {
-                    var e_elm = ref.extra_menu_items[i];
-
-                    if (!e_elm[2] || e_elm[2](elm, ref)) {
-                        var e_row = document.createElement('tr');
-                        var e_col = document.createElement('td');
-
-                       $(e_col).html(e_elm[0])
-                           .bind('mouseover', ref.item_onmouseover)
-                           .bind('mouseout', ref.item_onmouseout)
-                           .bind('click', function() { return e_elm[1](elm, ref) });
-                       
-                       e_row.appendChild(e_col);
-                        list.appendChild(e_row);
-                    }
-                    loop(i+1);
+            if (i < ref.extra_menu_items.length) {
+                var e_elm = ref.extra_menu_items[i];
+
+                if (!e_elm[2] || e_elm[2](elm, ref)) {
+                    var e_row = document.createElement('tr'),
+                      e_col = document.createElement('td');
+
+                               $(e_col).html(e_elm[0])
+                        .bind('mouseover', ref.item_onmouseover)
+                       .bind('mouseout', ref.item_onmouseout)
+                                   .bind('click', function() { return e_elm[1](elm, ref) });
+
+                               e_row.appendChild(e_col);
+                    list.appendChild(e_row);
                 }
-        }
-       
+                loop(i+1);
+            }
+        };
+
         loop(0);
         loop = null;
 
@@ -542,19 +537,30 @@ this.showErrorWindow = function(elm, id) {
     table.appendChild(list);
     this.error_window.appendChild(table);
 
-    //Dummy for IE - dropdown bug fix
+    // calculate and set position
+    var height = $(this.error_window).height(),
+        width = $(this.error_window).width(),
+        pageheight = $(document).height(),
+        pagewidth = $(document).width(),
+        top = pos.top + height + 20 < pageheight ? pos.top + 20 : pos.top - height,
+        left = pos.left + width < pagewidth ? pos.left : pos.left - width;
+
+    $(this.error_window).css({'top': top+'px', 'left': left+'px'}).show();
+
+    // Dummy for IE - dropdown bug fix
     if ($.browser.msie) {
-       if (!this.error_window_iframe) {
-            var iframe = $('<iframe>').css('position', 'absolute').css('z-index', 0);
-           $('body').append(iframe);
+           if (!this.error_window_iframe) {
+            var iframe = $('<iframe>').css({'position': 'absolute', 'z-index': -1});
+               $('body').append(iframe);
            this.error_window_iframe = iframe;
         }
-       
-       $(this.error_window_iframe).css({'visibility': 'visible',
-           'top': this.error_window.offsetTop, 'left': this.error_window.offsetLeft,
-           'width': this.error_window.offsetWidth, 'height': this.error_window.offsetHeight});
+
+           $(this.error_window_iframe)
+               .css({'top': this.error_window.offsetTop, 'left': this.error_window.offsetLeft,
+               'width': this.error_window.offsetWidth, 'height': this.error_window.offsetHeight})
+           .show();
     }
-}
+};
 
 
 //////
@@ -562,7 +568,8 @@ this.showErrorWindow = function(elm, id) {
 //////
 this.createEditLayer = function(width, height) {
     this.edit_layer = document.createElement('div');
-    $(this.edit_layer).addClass('googie_edit_layer').width(width-10).height(height);
+    $(this.edit_layer).addClass('googie_edit_layer').attr('id', 'googie_edit_layer')
+        .width('auto').height(height);
 
     if (this.text_area.nodeName.toLowerCase() != 'input' || $(this.text_area).val() == '') {
         $(this.edit_layer).css('overflow', 'auto').height(height-4);
@@ -571,8 +578,9 @@ this.createEditLayer = function(width, height) {
     }
 
     var ref = this;
+
     if (this.edit_layer_dbl_click) {
-        $(this.edit_layer).bind('click', function(e) {
+        $(this.edit_layer).dblclick(function(e) {
             if (e.target.className != 'googie_link' && !ref.isErrorWindowShown()) {
                 ref.resumeEditing();
                 var fn1 = function() {
@@ -584,7 +592,7 @@ this.createEditLayer = function(width, height) {
             return false;
         });
     }
-}
+};
 
 this.resumeEditing = function() {
     this.setStateChanged('ready');
@@ -610,22 +618,22 @@ this.resumeEditing = function() {
             this.text_area.scrollTop = this.el_scroll_top;
     }
     this.checkSpellingState(false);
-}
+};
 
 this.createErrorLink = function(text, id) {
-    var elm = document.createElement('span');
-    var ref = this;
-    var d = function (e) {
+    var elm = document.createElement('span'),
+        ref = this,
+        d = function (e) {
            ref.showErrorWindow(elm, id);
            d = null;
            return false;
-    };
-    
+        };
+
     $(elm).html(text).addClass('googie_link').bind('click', d)
-       .attr({'googie_action_btn' : '1', 'g_id' : id, 'is_corrected' : false});
+           .attr({'googie_action_btn' : '1', 'g_id' : id, 'is_corrected' : false});
 
     return elm;
-}
+};
 
 this.createPart = function(txt_part) {
     if (txt_part == " ")
@@ -636,36 +644,37 @@ this.createPart = function(txt_part) {
     txt_part = txt_part.replace(/    /g, " &nbsp;");
     txt_part = txt_part.replace(/^ /g, "&nbsp;");
     txt_part = txt_part.replace(/ $/g, "&nbsp;");
-    
+
     var span = document.createElement('span');
     $(span).html(txt_part);
     return span;
-}
+};
 
 this.showErrorsInIframe = function() {
-    var output = document.createElement('div')
-    var pointer = 0;
-    var results = this.results;
+    var output = document.createElement('div'),
+        pointer = 0,
+        results = this.results;
 
     if (results.length > 0) {
-        for (var i=0; i < results.length; i++) {
-            var offset = results[i]['attrs']['o'];
-            var len = results[i]['attrs']['l'];
-            var part_1_text = this.orginal_text.substring(pointer, offset);
-            var part_1 = this.createPart(part_1_text);
-    
+        for (var i=0, length=results.length; i < length; i++) {
+            var offset = results[i]['attrs']['o'],
+                len = results[i]['attrs']['l'],
+                part_1_text = this.orginal_text.substring(pointer, offset),
+                part_1 = this.createPart(part_1_text);
+
             output.appendChild(part_1);
             pointer += offset - pointer;
-            
-            //If the last child was an error, then insert some space
+
+            // If the last child was an error, then insert some space
             var err_link = this.createErrorLink(this.orginal_text.substr(offset, len), i);
             this.error_links.push(err_link);
             output.appendChild(err_link);
             pointer += len;
         }
-        //Insert the rest of the orginal text
-        var part_2_text = this.orginal_text.substr(pointer, this.orginal_text.length);
-        var part_2 = this.createPart(part_2_text);
+
+        // Insert the rest of the orginal text
+        var part_2_text = this.orginal_text.substr(pointer, this.orginal_text.length),
+            part_2 = this.createPart(part_2_text);
 
         output.appendChild(part_2);
     }
@@ -677,10 +686,10 @@ this.showErrorsInIframe = function() {
     var me = this;
     if (this.custom_item_evaulator)
         $.map(this.error_links, function(elm){me.custom_item_evaulator(me, elm)});
-    
+
     $(this.edit_layer).append(output);
 
-    //Hide text area and show edit layer
+    // Hide text area and show edit layer
     $(this.text_area).hide();
     $(this.edit_layer).insertBefore(this.text_area);
 
@@ -693,7 +702,7 @@ this.showErrorsInIframe = function() {
     }
 
 //    this.edit_layer.scrollTop = this.ta_scroll_top;
-}
+};
 
 
 //////
@@ -701,52 +710,53 @@ this.showErrorsInIframe = function() {
 //////
 this.createLangWindow = function() {
     this.language_window = document.createElement('div');
-    $(this.language_window).addClass('googie_window')
-       .width(100).attr('googie_action_btn', '1');
+    $(this.language_window).addClass('googie_window popupmenu')
+           .width(100).attr('googie_action_btn', '1');
 
-    //Build up the result list
-    var table = document.createElement('table');
-    var list = document.createElement('tbody');
-    var ref = this;
+    // Build up the result list
+    var table = document.createElement('table'),
+        list = document.createElement('tbody'),
+        ref = this,
+        row, item, span;
 
     $(table).addClass('googie_list').width('100%');
-    this.lang_elms = new Array();
+    this.lang_elms = [];
 
     for (i=0; i < this.langlist_codes.length; i++) {
-        var row = document.createElement('tr');
-        var item = document.createElement('td');
-        var span = document.createElement('span');
-       
-       $(span).text(this.lang_to_word[this.langlist_codes[i]]);
+        row = document.createElement('tr');
+        item = document.createElement('td');
+        span = document.createElement('span');
+
+           $(span).text(this.lang_to_word[this.langlist_codes[i]]);
         this.lang_elms.push(item);
 
         $(item).attr('googieId', this.langlist_codes[i])
            .bind('click', function(e) {
-               ref.deHighlightCurSel();
-               ref.setCurrentLanguage($(this).attr('googieId'));
+                   ref.deHighlightCurSel();
+                   ref.setCurrentLanguage($(this).attr('googieId'));
 
-               if (ref.lang_state_observer != null) {
+                   if (ref.lang_state_observer != null) {
                    ref.lang_state_observer();
-               }
+                   }
 
-               ref.highlightCurSel();
-               ref.hideLangWindow();
+                   ref.highlightCurSel();
+                   ref.hideLangWindow();
            })
-           .bind('mouseover', function(e) { 
-               if (this.className != "googie_list_selected")
+           .bind('mouseover', function(e) {
+                   if (this.className != "googie_list_selected")
                    this.className = "googie_list_onhover";
            })
-           .bind('mouseout', function(e) { 
-               if (this.className != "googie_list_selected")
-                   this.className = "googie_list_onout"; 
+           .bind('mouseout', function(e) {
+                   if (this.className != "googie_list_selected")
+                   this.className = "googie_list_onout";
            });
 
-       item.appendChild(span);
+           item.appendChild(span);
         row.appendChild(item);
         list.appendChild(row);
     }
 
-    //Close button
+    // Close button
     if (this.use_close_btn) {
         list.appendChild(this.createCloseButton(function () { ref.hideLangWindow.apply(ref) }));
     }
@@ -755,75 +765,78 @@ this.createLangWindow = function() {
 
     table.appendChild(list);
     this.language_window.appendChild(table);
-}
+};
 
 this.isLangWindowShown = function() {
-    return $(this.language_window).is(':hidden');
-}
+    return $(this.language_window).is(':visible');
+};
 
 this.hideLangWindow = function() {
-    $(this.language_window).css('visibility', 'hidden');
+    $(this.language_window).hide();
     $(this.switch_lan_pic).removeClass().addClass('googie_lang_3d_on');
-}
+};
+
+this.showLangWindow = function(elm) {
+    if (this.show_menu_observer)
+        this.show_menu_observer(this);
+
+    this.createLangWindow();
+    $('body').append(this.language_window);
+
+    var pos = $(elm).offset(),
+        height = $(elm).height(),
+        width = $(elm).width(),
+        h = $(this.language_window).height(),
+        pageheight = $(document).height(),
+        left = this.change_lang_pic_placement == 'right' ?
+               pos.left - 100 + width : pos.left + width,
+        top = pos.top + h < pageheight ? pos.top + height : pos.top - h - 4;
+
+    $(this.language_window).css({'top' : top+'px','left' : left+'px'}).show();
+
+    this.highlightCurSel();
+};
 
 this.deHighlightCurSel = function() {
     $(this.lang_cur_elm).removeClass().addClass('googie_list_onout');
-}
+};
 
 this.highlightCurSel = function() {
     if (GOOGIE_CUR_LANG == null)
         GOOGIE_CUR_LANG = GOOGIE_DEFAULT_LANG;
     for (var i=0; i < this.lang_elms.length; i++) {
         if ($(this.lang_elms[i]).attr('googieId') == GOOGIE_CUR_LANG) {
-            this.lang_elms[i].className = "googie_list_selected";
+            this.lang_elms[i].className = 'googie_list_selected';
             this.lang_cur_elm = this.lang_elms[i];
         }
         else {
-            this.lang_elms[i].className = "googie_list_onout";
+            this.lang_elms[i].className = 'googie_list_onout';
         }
     }
-}
-
-this.showLangWindow = function(elm) {
-    if (this.show_menu_observer)
-        this.show_menu_observer(this);
-
-    this.createLangWindow();
-    $('body').append(this.language_window);
-
-    var pos = $(elm).offset();
-    var top = pos.top + $(elm).height();
-    var left = this.change_lang_pic_placement == 'right' ? 
-       pos.left - 100 + $(elm).width() : pos.left + $(elm).width();
-
-    $(this.language_window).css({'visibility': 'visible', 'top' : top+'px','left' : left+'px'});
-
-    this.highlightCurSel();
-}
+};
 
 this.createChangeLangPic = function() {
     var img = $('<img>')
-       .attr({src: this.img_dir + 'change_lang.gif', 'alt': 'Change language', 'googie_action_btn': '1'});
-
-    var switch_lan = document.createElement('span');
-    var ref = this;
+           .attr({src: this.img_dir + 'change_lang.gif', 'alt': 'Change language', 'googie_action_btn': '1'}),
+        switch_lan = document.createElement('span');
+        ref = this;
 
     $(switch_lan).addClass('googie_lang_3d_on')
-       .append(img)
-       .bind('click', function(e) {
+           .append(img)
+           .bind('click', function(e) {
            var elm = this.tagName.toLowerCase() == 'img' ? this.parentNode : this;
            if($(elm).hasClass('googie_lang_3d_click')) {
-               elm.className = 'googie_lang_3d_on';
-               ref.hideLangWindow();
+               elm.className = 'googie_lang_3d_on';
+                   ref.hideLangWindow();
            }
            else {
-               elm.className = 'googie_lang_3d_click';
-               ref.showLangWindow(elm);
+                   elm.className = 'googie_lang_3d_click';
+                   ref.showLangWindow(elm);
            }
-       });
+           });
 
     return switch_lan;
-}
+};
 
 this.createSpellDiv = function() {
     var span = document.createElement('span');
@@ -831,10 +844,10 @@ this.createSpellDiv = function() {
     $(span).addClass('googie_check_spelling_link').text(this.lang_chck_spell);
 
     if (this.show_spell_img) {
-       $(span).append(' ').append($('<img>').attr('src', this.img_dir + 'spellc.gif'));
+           $(span).append(' ').append($('<img>').attr('src', this.img_dir + 'spellc.gif'));
     }
     return span;
-}
+};
 
 
 //////
@@ -845,26 +858,26 @@ this.flashNoSpellingErrorState = function(on_finish) {
 
     var ref = this;
     if (this.main_controller) {
-       var no_spell_errors;
-       if (on_finish) {
+           var no_spell_errors;
+           if (on_finish) {
            var fn = function() {
-               on_finish();
-               ref.checkSpellingState();
+               on_finish();
+                   ref.checkSpellingState();
            };
            no_spell_errors = fn;
-       }
-       else
+           }
+           else
            no_spell_errors = function () { ref.checkSpellingState() };
 
         var rsm = $('<span>').text(this.lang_no_error_found);
-        
+
         $(this.switch_lan_pic).hide();
-       $(this.spell_span).empty().append(rsm)
+           $(this.spell_span).empty().append(rsm)
            .removeClass().addClass('googie_check_spelling_ok');
 
         window.setTimeout(no_spell_errors, 1000);
     }
-}
+};
 
 this.resumeEditingState = function() {
     this.setStateChanged('resume_editing');
@@ -882,7 +895,7 @@ this.resumeEditingState = function() {
 
     try { this.edit_layer.scrollTop = this.ta_scroll_top; }
     catch (e) {};
-}
+};
 
 this.checkSpellingState = function(fire) {
     if (fire)
@@ -893,8 +906,8 @@ this.checkSpellingState = function(fire) {
     else
         this.switch_lan_pic = document.createElement('span');
 
-    var span_chck = this.createSpellDiv();
-    var ref = this;
+    var span_chck = this.createSpellDiv(),
+        ref = this;
 
     if (this.custom_spellcheck_starter)
         $(span_chck).bind('click', function(e) { ref.custom_spellcheck_starter() });
@@ -904,14 +917,14 @@ this.checkSpellingState = function(fire) {
 
     if (this.main_controller) {
         if (this.change_lang_pic_placement == 'left') {
-           $(this.spell_container).empty().append(this.switch_lan_pic).append(' ').append(span_chck);
+               $(this.spell_container).empty().append(this.switch_lan_pic).append(' ').append(span_chck);
         } else {
-           $(this.spell_container).empty().append(span_chck).append(' ').append(this.switch_lan_pic);
-       }
+               $(this.spell_container).empty().append(span_chck).append(' ').append(this.switch_lan_pic);
+           }
     }
 
     this.spell_span = span_chck;
-}
+};
 
 
 //////
@@ -919,7 +932,7 @@ this.checkSpellingState = function(fire) {
 /////
 this.isDefined = function(o) {
     return (o != 'undefined' && o != null)
-}
+};
 
 this.errorFixed = function() { 
     this.cnt_errors_fixed++; 
@@ -928,79 +941,79 @@ this.errorFixed = function() {
             this.hideErrorWindow();
             this.all_errors_fixed_observer();
         }
-}
+};
 
 this.errorFound = function() {
     this.cnt_errors++;
-}
+};
 
 this.createCloseButton = function(c_fn) {
     return this.createButton(this.lang_close, 'googie_list_close', c_fn);
-}
+};
 
 this.createButton = function(name, css_class, c_fn) {
-    var btn_row = document.createElement('tr');
-    var btn = document.createElement('td');
-    var spn_btn;
+    var btn_row = document.createElement('tr'),
+        btn = document.createElement('td'),
+        spn_btn;
 
     if (css_class) {
         spn_btn = document.createElement('span');
-       $(spn_btn).addClass(css_class).html(name);
+           $(spn_btn).addClass(css_class).html(name);
     } else {
         spn_btn = document.createTextNode(name);
     }
 
     $(btn).bind('click', c_fn)
-       .bind('mouseover', this.item_onmouseover)
-       .bind('mouseout', this.item_onmouseout);
+           .bind('mouseover', this.item_onmouseover)
+           .bind('mouseout', this.item_onmouseout);
 
     btn.appendChild(spn_btn);
     btn_row.appendChild(btn);
 
     return btn_row;
-}
+};
 
 this.removeIndicator = function(elm) {
     //$(this.indicator).remove();
     // roundcube mod.
     if (window.rcmail)
-       rcmail.set_busy(false);
-}
+        rcmail.set_busy(false, null, this.rc_msg_id);
+};
 
 this.appendIndicator = function(elm) {
     // modified by roundcube
     if (window.rcmail)
-       rcmail.set_busy(true, 'checking');
-/*    
+           this.rc_msg_id = rcmail.set_busy(true, 'checking');
+/*
     this.indicator = document.createElement('img');
     $(this.indicator).attr('src', this.img_dir + 'indicator.gif')
-       .css({'margin-right': '5px', 'text-decoration': 'none'}).width(16).height(16);
-    
+           .css({'margin-right': '5px', 'text-decoration': 'none'}).width(16).height(16);
+
     if (elm)
-       $(this.indicator).insertBefore(elm);
+           $(this.indicator).insertBefore(elm);
     else
-       $('body').append(this.indicator);
-*/                                 
+       $('body').append(this.indicator);
+*/
 }
 
 this.createFocusLink = function(name) {
     var link = document.createElement('a');
     $(link).attr({'href': 'javascript:;', 'name': name});
     return link;
-}
+};
 
 this.item_onmouseover = function(e) {
-    if (this.className != "googie_list_revert" && this.className != "googie_list_close")
-        this.className = "googie_list_onhover";
+    if (this.className != 'googie_list_revert' && this.className != 'googie_list_close')
+        this.className = 'googie_list_onhover';
     else
-        this.parentNode.className = "googie_list_onhover";
-}
+        this.parentNode.className = 'googie_list_onhover';
+};
 this.item_onmouseout = function(e) {
-    if (this.className != "googie_list_revert" && this.className != "googie_list_close")
-        this.className = "googie_list_onout";
+    if (this.className != 'googie_list_revert' && this.className != 'googie_list_close')
+        this.className = 'googie_list_onout';
     else
-        this.parentNode.className = "googie_list_onout";
-}
+        this.parentNode.className = 'googie_list_onout';
+};
 
 
 };
diff --git a/program/js/jquery-1.3.min.js b/program/js/jquery-1.3.min.js
deleted file mode 100644 (file)
index b1ae21d..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * jQuery JavaScript Library v1.3.2
- * http://jquery.com/
- *
- * Copyright (c) 2009 John Resig
- * Dual licensed under the MIT and GPL licenses.
- * http://docs.jquery.com/License
- *
- * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
- * Revision: 6246
- */
-(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
-/*
- * Sizzle CSS Selector Engine - v0.9.3
- *  Copyright 2009, The Dojo Foundation
- *  Released under the MIT, BSD, and GPL Licenses.
- *  More information: http://sizzlejs.com/
- */
-(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.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\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
\ No newline at end of file
diff --git a/program/js/jquery-1.4.min.js b/program/js/jquery-1.4.min.js
new file mode 100644 (file)
index 0000000..8f3ca2e
--- /dev/null
@@ -0,0 +1,167 @@
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
+h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
+h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
+"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
+e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
+"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
+s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
+j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
+toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
+-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
+if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
+if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
+b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
+!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
+l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
+z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
+s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
+s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
+[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
+false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
+k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
+scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
+1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
+"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
+c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
+else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
+a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
+c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
+a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
+colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
+1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
+l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
+"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
+if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
+a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
+attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
+b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
+c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
+arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
+d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
+c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
+w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
+8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
+"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
+Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
+c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
+var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
+"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
+xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
+B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
+"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
+0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
+a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
+1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
+"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
+c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
+[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
+break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
+q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
+l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
+return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
+B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.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\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
+i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
+i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
+"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
+m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
+true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
+g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
+0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
+"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
+i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
+if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
+g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
+for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
+i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
+n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
+function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
+p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
+t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
+function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
+c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
+not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
+h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
+c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
+2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
+b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
+e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
+"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
+else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
+c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
+b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
+this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
+prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
+b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
+1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
+d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
+jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
+zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
+h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
+if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
+d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
+e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
+"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
+!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
+getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
+script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
+!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
+false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
+A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
+b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
+c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
+c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
+encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
+[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
+e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
+if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
+3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
+d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
+d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
+"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
+1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
+d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
+Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
+var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
+this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
+this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
+c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
+b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
+h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
+for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
+parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
+height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
+f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
+"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
+e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
+c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
+c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
+b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
index 8bd9aac88e876d45195aa989262a5073a70f42c5..5792ff907c20234e79c07607dc7e5211eff9f803 100644 (file)
-function rcube_list_widget(_1,p){
-this.ENTER_KEY=13;
-this.DELETE_KEY=46;
-this.BACKSPACE_KEY=8;
-this.list=_1?_1:null;
-this.frame=null;
-this.rows=[];
-this.selection=[];
-this.rowcount=0;
-this.subject_col=-1;
-this.shiftkey=false;
-this.multiselect=false;
-this.multi_selecting=false;
-this.draggable=false;
-this.keyboard=false;
-this.toggleselect=false;
-this.dont_select=false;
-this.drag_active=false;
-this.last_selected=0;
-this.shift_start=0;
-this.in_selection_before=false;
-this.focused=false;
-this.drag_mouse_start=null;
-this.dblclick_time=600;
-this.row_init=function(){
-};
-if(p&&typeof (p)=="object"){
-for(var n in p){
-this[n]=p[n];
-}
-}
-};
-rcube_list_widget.prototype={init:function(){
-if(this.list&&this.list.tBodies[0]){
-this.rows=new Array();
-this.rowcount=0;
-var _4;
-for(var r=0;r<this.list.tBodies[0].childNodes.length;r++){
-_4=this.list.tBodies[0].childNodes[r];
-while(_4&&(_4.nodeType!=1||_4.style.display=="none")){
-_4=_4.nextSibling;
-r++;
-}
-this.init_row(_4);
-this.rowcount++;
-}
-this.frame=this.list.parentNode;
-if(this.keyboard){
-rcube_event.add_listener({element:document,event:bw.opera?"keypress":"keydown",object:this,method:"key_press"});
-rcube_event.add_listener({element:document,event:"keydown",object:this,method:"key_down"});
-}
-}
-},init_row:function(_6){
-if(_6&&String(_6.id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i)){
-var p=this;
-var _8=RegExp.$1;
-_6.uid=_8;
-this.rows[_8]={uid:_8,id:_6.id,obj:_6,classname:_6.className};
-_6.onmousedown=function(e){
-return p.drag_row(e,this.uid);
-};
-_6.onmouseup=function(e){
-return p.click_row(e,this.uid);
-};
-if(document.all){
-_6.onselectstart=function(){
-return false;
-};
-}
-this.row_init(this.rows[_8]);
-}
-},clear:function(_b){
-var _c=document.createElement("tbody");
-this.list.insertBefore(_c,this.list.tBodies[0]);
-this.list.removeChild(this.list.tBodies[1]);
-this.rows=new Array();
-this.rowcount=0;
-if(_b){
-this.clear_selection();
-}
-},remove_row:function(_d,_e){
-if(this.rows[_d].obj){
-this.rows[_d].obj.style.display="none";
-}
-if(_e){
-this.select_next();
-}
-this.rows[_d]=null;
-this.rowcount--;
-},insert_row:function(_f,_10){
-if(this.background){
-var _11=this.background;
-}else{
-var _11=this.list.tBodies[0];
-}
-if(_10&&_11.rows.length){
-_11.insertBefore(_f,_11.firstChild);
-}else{
-_11.appendChild(_f);
-}
-this.init_row(_f);
-this.rowcount++;
-},focus:function(e){
-this.focused=true;
-for(var n=0;n<this.selection.length;n++){
-id=this.selection[n];
-if(this.rows[id]&&this.rows[id].obj){
-$(this.rows[id].obj).addClass("selected").removeClass("unfocused");
-}
-}
-if(e||(e=window.event)){
-rcube_event.cancel(e);
-}
-},blur:function(){
-var id;
-this.focused=false;
-for(var n=0;n<this.selection.length;n++){
-id=this.selection[n];
-if(this.rows[id]&&this.rows[id].obj){
-$(this.rows[id].obj).removeClass("selected").addClass("unfocused");
-}
-}
-},drag_row:function(e,id){
-var _18=rcube_event.get_target(e);
-var _19=_18.tagName.toLowerCase();
-if(this.dont_select||(_18&&(_19=="input"||_19=="img"))){
-return true;
-}
-if(rcube_event.get_button(e)==2){
-return true;
-}
-this.in_selection_before=this.in_selection(id)?id:false;
-if(!this.in_selection_before){
-var _1a=rcube_event.get_modifier(e);
-this.select_row(id,_1a,false);
-}
-if(this.draggable&&this.selection.length){
-this.drag_start=true;
-this.drag_mouse_start=rcube_event.get_mouse_pos(e);
-rcube_event.add_listener({element:document,event:"mousemove",object:this,method:"drag_mouse_move"});
-rcube_event.add_listener({element:document,event:"mouseup",object:this,method:"drag_mouse_up"});
-var _1b=document.getElementsByTagName("iframe");
-this.iframe_events=Object();
-for(var n in _1b){
-var _1d=null;
-if(_1b[n].contentDocument){
-_1d=_1b[n].contentDocument;
-}else{
-if(_1b[n].contentWindow){
-_1d=_1b[n].contentWindow.document;
-}else{
-if(_1b[n].document){
-_1d=_1b[n].document;
-}
-}
-}
-if(_1d){
-var _1e=this;
-var pos=$("#"+_1b[n].id).offset();
-this.iframe_events[n]=function(e){
-e._offset=pos;
-return _1e.drag_mouse_move(e);
-};
-if(_1d.addEventListener){
-_1d.addEventListener("mousemove",this.iframe_events[n],false);
-}else{
-if(_1b[n].attachEvent){
-_1d.attachEvent("onmousemove",this.iframe_events[n]);
-}else{
-_1d["onmousemove"]=this.iframe_events[n];
-}
-}
-rcube_event.add_listener({element:_1d,event:"mouseup",object:this,method:"drag_mouse_up"});
-}
-}
-}
-return false;
-},click_row:function(e,id){
-var now=new Date().getTime();
-var _24=rcube_event.get_modifier(e);
-var _25=rcube_event.get_target(e);
-var _26=_25.tagName.toLowerCase();
-if((_25&&(_26=="input"||_26=="img"))){
-return true;
-}
-if(this.dont_select){
-this.dont_select=false;
-return false;
-}
-var _27=now-this.rows[id].clicked<this.dblclick_time;
-if(!this.drag_active&&this.in_selection_before==id&&!_27){
-this.select_row(id,_24,false);
-}
-this.drag_start=false;
-this.in_selection_before=false;
-if(this.rows&&_27&&this.in_selection(id)){
-this.triggerEvent("dblclick");
-}else{
-this.triggerEvent("click");
-}
-if(!this.drag_active){
-rcube_event.cancel(e);
-}
-this.rows[id].clicked=now;
-return false;
-},get_next_row:function(){
-if(!this.rows){
-return false;
-}
-var _28=this.rows[this.last_selected];
-var _29=_28?_28.obj.nextSibling:null;
-while(_29&&(_29.nodeType!=1||_29.style.display=="none")){
-_29=_29.nextSibling;
-}
-return _29;
-},get_prev_row:function(){
-if(!this.rows){
-return false;
-}
-var _2a=this.rows[this.last_selected];
-var _2b=_2a?_2a.obj.previousSibling:null;
-while(_2b&&(_2b.nodeType!=1||_2b.style.display=="none")){
-_2b=_2b.previousSibling;
-}
-return _2b;
-},get_first_row:function(){
-if(this.rowcount){
-var _2c=this.list.tBodies[0].rows;
-for(var i=0;i<_2c.length-1;i++){
-if(_2c[i].id&&String(_2c[i].id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i)&&this.rows[RegExp.$1]!=null){
-return RegExp.$1;
-}
-}
-}
-return null;
-},get_last_row:function(){
-if(this.rowcount){
-var _2e=this.list.tBodies[0].rows;
-for(var i=_2e.length-1;i>=0;i--){
-if(_2e[i].id&&String(_2e[i].id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i)&&this.rows[RegExp.$1]!=null){
-return RegExp.$1;
-}
-}
-}
-return null;
-},select_row:function(id,_31,_32){
-var _33=this.selection.join(",");
-if(!this.multiselect){
-_31=0;
-}
-if(!this.shift_start){
-this.shift_start=id;
-}
-if(!_31){
-this.shift_start=id;
-this.highlight_row(id,false);
-this.multi_selecting=false;
-}else{
-switch(_31){
-case SHIFT_KEY:
-this.shift_select(id,false);
-break;
-case CONTROL_KEY:
-if(!_32){
-this.highlight_row(id,true);
-}
-break;
-case CONTROL_SHIFT_KEY:
-this.shift_select(id,true);
-break;
-default:
-this.highlight_row(id,false);
-break;
-}
-this.multi_selecting=true;
-}
-if(this.selection.join(",")!=_33){
-this.triggerEvent("select");
-}
-if(this.last_selected!=0&&this.rows[this.last_selected]){
-$(this.rows[this.last_selected].obj).removeClass("focused");
-}
-if(this.toggleselect&&this.last_selected==id){
-this.clear_selection();
-id=null;
-}else{
-$(this.rows[id].obj).addClass("focused");
-}
-if(!this.selection.length){
-this.shift_start=null;
-}
-this.last_selected=id;
-},select:function(id){
-this.select_row(id,false);
-this.scrollto(id);
-},select_next:function(){
-var _35=this.get_next_row();
-var _36=this.get_prev_row();
-var _37=(_35)?_35:_36;
-if(_37){
-this.select_row(_37.uid,false,false);
-}
-},select_first:function(){
-var _38=this.get_first_row();
-if(_38){
-this.select_row(_38,false,false);
-}
-},shift_select:function(id,_3a){
-if(!this.rows[this.shift_start]||!this.selection.length){
-this.shift_start=id;
-}
-var _3b=this.rows[this.shift_start].obj.rowIndex;
-var _3c=this.rows[id].obj.rowIndex;
-var i=((_3b<_3c)?_3b:_3c);
-var j=((_3b>_3c)?_3b:_3c);
-for(var n in this.rows){
-if((this.rows[n].obj.rowIndex>=i)&&(this.rows[n].obj.rowIndex<=j)){
-if(!this.in_selection(n)){
-this.highlight_row(n,true);
-}
-}else{
-if(this.in_selection(n)&&!_3a){
-this.highlight_row(n,true);
-}
-}
-}
-},in_selection:function(id){
-for(var n in this.selection){
-if(this.selection[n]==id){
-return true;
-}
-}
-return false;
-},select_all:function(_42){
-if(!this.rows||!this.rows.length){
-return false;
-}
-var _43=this.selection.join(",");
-this.selection=new Array();
-for(var n in this.rows){
-if(!_42||(this.rows[n]&&this.rows[n][_42]==true)){
-this.last_selected=n;
-this.highlight_row(n,true);
-}else{
-if(this.rows[n]){
-$(this.rows[n].obj).removeClass("selected").removeClass("unfocused");
-}
-}
-}
-if(this.selection.join(",")!=_43){
-this.triggerEvent("select");
-}
-this.focus();
-return true;
-},invert_selection:function(){
-if(!this.rows||!this.rows.length){
-return false;
-}
-var _45=this.selection.join(",");
-for(var n in this.rows){
-this.highlight_row(n,true);
-}
-if(this.selection.join(",")!=_45){
-this.triggerEvent("select");
-}
-this.focus();
-return true;
-},clear_selection:function(id){
-var _48=this.selection.length;
-if(id){
-for(var n=0;n<this.selection.length;n++){
-if(this.selection[n]==id){
-this.selection.splice(n,1);
-break;
-}
-}
-}else{
-for(var n=0;n<this.selection.length;n++){
-if(this.rows[this.selection[n]]){
-$(this.rows[this.selection[n]].obj).removeClass("selected").removeClass("unfocused");
-}
-}
-this.selection=new Array();
-}
-if(_48&&!this.selection.length){
-this.triggerEvent("select");
-}
-},get_selection:function(){
-return this.selection;
-},get_single_selection:function(){
-if(this.selection.length==1){
-return this.selection[0];
-}else{
-return null;
-}
-},highlight_row:function(id,_4b){
-if(this.rows[id]&&!_4b){
-if(this.selection.length>1||!this.in_selection(id)){
-this.clear_selection();
-this.selection[0]=id;
-$(this.rows[id].obj).addClass("selected");
-}
-}else{
-if(this.rows[id]){
-if(!this.in_selection(id)){
-this.selection[this.selection.length]=id;
-$(this.rows[id].obj).addClass("selected");
-}else{
-var p=find_in_array(id,this.selection);
-var _4d=this.selection.slice(0,p);
-var _4e=this.selection.slice(p+1,this.selection.length);
-this.selection=_4d.concat(_4e);
-$(this.rows[id].obj).removeClass("selected").removeClass("unfocused");
-}
-}
-}
-},key_press:function(e){
-if(this.focused!=true){
-return true;
-}
-var _50=rcube_event.get_keycode(e);
-var _51=rcube_event.get_modifier(e);
-switch(_50){
-case 40:
-case 38:
-case 63233:
-case 63232:
-rcube_event.cancel(e);
-return this.use_arrow_key(_50,_51);
-default:
-this.shiftkey=e.shiftKey;
-this.key_pressed=_50;
-this.triggerEvent("keypress");
-if(this.key_pressed==this.BACKSPACE_KEY){
-return rcube_event.cancel(e);
-}
-}
-return true;
-},key_down:function(e){
-switch(rcube_event.get_keycode(e)){
-case 27:
-if(this.drag_active){
-return this.drag_mouse_up(e);
-}
-case 40:
-case 38:
-case 63233:
-case 63232:
-if(!rcube_event.get_modifier(e)&&this.focused){
-return rcube_event.cancel(e);
-}
-default:
-}
-return true;
-},use_arrow_key:function(_53,_54){
-var _55;
-if(_53==40||_53==63233){
-_55=this.get_next_row();
-}else{
-if(_53==38||_53==63232){
-_55=this.get_prev_row();
-}
-}
-if(_55){
-this.select_row(_55.uid,_54,true);
-this.scrollto(_55.uid);
-}
-return false;
-},scrollto:function(id){
-var row=this.rows[id].obj;
-if(row&&this.frame){
-var _58=Number(row.offsetTop);
-if(_58<Number(this.frame.scrollTop)){
-this.frame.scrollTop=_58;
-}else{
-if(_58+Number(row.offsetHeight)>Number(this.frame.scrollTop)+Number(this.frame.offsetHeight)){
-this.frame.scrollTop=(_58+Number(row.offsetHeight))-Number(this.frame.offsetHeight);
-}
-}
-}
-},drag_mouse_move:function(e){
-if(this.drag_start){
-var m=rcube_event.get_mouse_pos(e);
-if(!this.drag_mouse_start||(Math.abs(m.x-this.drag_mouse_start.x)<3&&Math.abs(m.y-this.drag_mouse_start.y)<3)){
-return false;
-}
-if(!this.draglayer){
-this.draglayer=$("<div>").attr("id","rcmdraglayer").css({position:"absolute",display:"none","z-index":2000}).appendTo(document.body);
-}
-var _5b="";
-var c,i,_5e,_5f,obj;
-for(var n=0;n<this.selection.length;n++){
-if(n>12){
-_5b+="...";
-break;
-}
-if(this.rows[this.selection[n]].obj){
-obj=this.rows[this.selection[n]].obj;
-_5f="";
-for(c=0,i=0;i<obj.childNodes.length;i++){
-if(obj.childNodes[i].nodeName=="TD"){
-if(((_5e=obj.childNodes[i].firstChild)&&(_5e.nodeType==3||_5e.nodeName=="A"))&&(this.subject_col<0||(this.subject_col>=0&&this.subject_col==c))){
-if(n==0){
-if(_5e.nodeType==3){
-this.drag_start_pos=$(obj.childNodes[i]).offset();
-}else{
-this.drag_start_pos=$(_5e).offset();
-}
-}
-_5f=_5e.nodeType==3?_5e.data:_5e.innerHTML;
-_5f=_5f.replace(/^\s+/i,"");
-_5b+=(_5f.length>50?_5f.substring(0,50)+"...":_5f)+"<br />";
-break;
-}
-c++;
-}
-}
-}
-}
-this.draglayer.html(_5b);
-this.draglayer.show();
-this.drag_active=true;
-this.triggerEvent("dragstart");
-}
-if(this.drag_active&&this.draglayer){
-var pos=rcube_event.get_mouse_pos(e);
-this.draglayer.css({left:(pos.x+20)+"px",top:(pos.y-5+(bw.ie?document.documentElement.scrollTop:0))+"px"});
-this.triggerEvent("dragmove",e?e:window.event);
-}
-this.drag_start=false;
-return false;
-},drag_mouse_up:function(e){
-document.onmousemove=null;
-if(this.draglayer&&this.draglayer.is(":visible")){
-if(this.drag_start_pos){
-this.draglayer.animate(this.drag_start_pos,300,"swing").hide(20);
-}else{
-this.draglayer.hide();
-}
-}
-this.drag_active=false;
-this.triggerEvent("dragend");
-rcube_event.remove_listener({element:document,event:"mousemove",object:this,method:"drag_mouse_move"});
-rcube_event.remove_listener({element:document,event:"mouseup",object:this,method:"drag_mouse_up"});
-var _64=document.getElementsByTagName("iframe");
-for(var n in _64){
-var _66;
-if(_64[n].contentDocument){
-_66=_64[n].contentDocument;
-}else{
-if(_64[n].contentWindow){
-_66=_64[n].contentWindow.document;
-}else{
-if(_64[n].document){
-_66=_64[n].document;
-}
-}
-}
-if(_66){
-if(this.iframe_events[n]){
-if(_66.removeEventListener){
-_66.removeEventListener("mousemove",this.iframe_events[n],false);
-}else{
-if(_66.detachEvent){
-_66.detachEvent("onmousemove",this.iframe_events[n]);
-}else{
-_66["onmousemove"]=null;
-}
-}
-}
-rcube_event.remove_listener({element:_66,event:"mouseup",object:this,method:"drag_mouse_up"});
-}
-}
-return rcube_event.cancel(e);
-},set_background_mode:function(_67){
-if(_67){
-this.background=document.createElement("tbody");
-}else{
-if(this.background){
-this.list.replaceChild(this.background,this.list.tBodies[0]);
-this.background=null;
-}
-}
-}};
-rcube_list_widget.prototype.addEventListener=rcube_event_engine.prototype.addEventListener;
-rcube_list_widget.prototype.removeEventListener=rcube_event_engine.prototype.removeEventListener;
+function rcube_list_widget(a,b){this.ENTER_KEY=13;this.DELETE_KEY=46;this.BACKSPACE_KEY=8;this.list=a?a:null;this.frame=null;this.rows=[];this.selection=[];this.colcount=this.rowcount=0;this.subject_col=-1;this.col_drag_active=this.drag_active=this.dont_select=this.toggleselect=this.keyboard=this.column_movable=this.draggable=this.multi_selecting=this.multiexpand=this.multiselect=this.shiftkey=false;this.column_fixed=null;this.shift_start=this.last_selected=0;this.focused=this.in_selection_before=
+false;this.drag_mouse_start=null;this.dblclick_time=600;this.row_init=function(){};if(b&&typeof b=="object")for(var c in b)this[c]=b[c]}
+rcube_list_widget.prototype={init:function(){if(this.list&&this.list.tBodies[0]){this.rows=[];this.rowcount=0;var a,b,c=this.list.tBodies[0].rows;a=0;for(b=c.length;a<b;a++){this.init_row(c[a]);this.rowcount++}this.init_header();this.frame=this.list.parentNode;if(this.keyboard){rcube_event.add_listener({event:bw.opera?"keypress":"keydown",object:this,method:"key_press"});rcube_event.add_listener({event:"keydown",object:this,method:"key_down"})}}},init_row:function(a){if(a&&String(a.id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i)){var b=
+this,c=RegExp.$1;a.uid=c;this.rows[c]={uid:c,id:a.id,obj:a};a.onmousedown=function(d){return b.drag_row(d,this.uid)};a.onmouseup=function(d){return b.click_row(d,this.uid)};if(bw.iphone||bw.ipad){a.addEventListener("touchstart",function(d){if(d.touches.length==1)b.drag_row(rcube_event.touchevent(d.touches[0]),this.uid)||d.preventDefault()},false);a.addEventListener("touchend",function(d){if(d.changedTouches.length==1)b.click_row(rcube_event.touchevent(d.changedTouches[0]),this.uid)||d.preventDefault()},
+false)}if(document.all)a.onselectstart=function(){return false};this.row_init(this.rows[c])}},init_header:function(){if(this.list&&this.list.tHead){this.colcount=0;var a,b,c=this;if(this.column_movable&&this.list.tHead&&this.list.tHead.rows)for(b=0;b<this.list.tHead.rows[0].cells.length;b++)if(this.column_fixed!=b){a=this.list.tHead.rows[0].cells[b];a.onmousedown=function(d){return c.drag_column(d,this)};this.colcount++}}},clear:function(a){this.list.insertBefore(document.createElement("tbody"),this.list.tBodies[0]);
+this.list.removeChild(this.list.tBodies[1]);this.rows=[];this.rowcount=0;a&&this.clear_selection()},remove_row:function(a,b){if(this.rows[a].obj)this.rows[a].obj.style.display="none";b&&this.select_next();delete this.rows[a];this.rowcount--},insert_row:function(a,b){var c=this.list.tBodies[0];b&&c.rows.length?c.insertBefore(a,c.firstChild):c.appendChild(a);this.init_row(a);this.rowcount++},focus:function(a){var b;this.focused=true;for(var c in this.selection){b=this.selection[c];this.rows[b]&&this.rows[b].obj&&
+$(this.rows[b].obj).addClass("selected").removeClass("unfocused")}$("*:focus",window).blur();$("iframe").each(function(){this.blur()});if(a||(a=window.event))rcube_event.cancel(a)},blur:function(){var a;this.focused=false;for(var b in this.selection){a=this.selection[b];this.rows[a]&&this.rows[a].obj&&$(this.rows[a].obj).removeClass("selected").addClass("unfocused")}},drag_column:function(a,b){if(this.colcount>1){this.drag_start=true;this.drag_mouse_start=rcube_event.get_mouse_pos(a);rcube_event.add_listener({event:"mousemove",
+object:this,method:"column_drag_mouse_move"});rcube_event.add_listener({event:"mouseup",object:this,method:"column_drag_mouse_up"});this.add_dragfix();for(var c=0;c<this.list.tHead.rows[0].cells.length;c++)if(b==this.list.tHead.rows[0].cells[c]){this.selected_column=c;break}}return false},drag_row:function(a,b){var c=rcube_event.get_target(a),d=c.tagName.toLowerCase();if(this.dont_select||c&&(d=="input"||d=="img"))return true;if(rcube_event.get_button(a)==2)return true;this.in_selection_before=this.in_selection(b)?
+b:false;if(!this.in_selection_before){c=rcube_event.get_modifier(a);this.select_row(b,c,false)}if(this.draggable&&this.selection.length){this.drag_start=true;this.drag_mouse_start=rcube_event.get_mouse_pos(a);rcube_event.add_listener({event:"mousemove",object:this,method:"drag_mouse_move"});rcube_event.add_listener({event:"mouseup",object:this,method:"drag_mouse_up"});if(bw.iphone||bw.ipad){rcube_event.add_listener({event:"touchmove",object:this,method:"drag_mouse_move"});rcube_event.add_listener({event:"touchend",
+object:this,method:"drag_mouse_up"})}this.add_dragfix()}return false},click_row:function(a,b){var c=(new Date).getTime(),d=rcube_event.get_modifier(a),e=rcube_event.get_target(a),f=e.tagName.toLowerCase();if(e&&(f=="input"||f=="img"))return true;if(this.dont_select)return this.dont_select=false;e=c-this.rows[b].clicked<this.dblclick_time;!this.drag_active&&this.in_selection_before==b&&!e&&this.select_row(b,d,false);this.in_selection_before=this.drag_start=false;this.rows&&e&&this.in_selection(b)?
+this.triggerEvent("dblclick"):this.triggerEvent("click");if(!this.drag_active){this.del_dragfix();rcube_event.cancel(a)}this.rows[b].clicked=c;return false},find_root:function(a){var b=this.rows[a];return b&&b.parent_uid?this.find_root(b.parent_uid):a},expand_row:function(a,b){var c=this.rows[b],d=rcube_event.get_target(a),e=rcube_event.get_modifier(a);this.dont_select=true;c.clicked=0;if(c.expanded){d.className="collapsed";e==CONTROL_KEY||this.multiexpand?this.collapse_all(c):this.collapse(c)}else{d.className=
+"expanded";e==CONTROL_KEY||this.multiexpand?this.expand_all(c):this.expand(c)}},collapse:function(a){a.expanded=false;this.triggerEvent("expandcollapse",{uid:a.uid,expanded:a.expanded});var b=a.depth;a=a?a.obj.nextSibling:null;for(var c;a;){if(a.nodeType==1){if((c=this.rows[a.uid])&&c.depth<=b)break;$(a).css("display","none");if(c.expanded){c.expanded=false;this.triggerEvent("expandcollapse",{uid:c.uid,expanded:c.expanded})}}a=a.nextSibling}return false},expand:function(a){var b,c,d;if(a){a.expanded=
+true;b=a.depth;c=a.obj.nextSibling;this.update_expando(a.uid,true);this.triggerEvent("expandcollapse",{uid:a.uid,expanded:a.expanded})}else{c=this.list.tBodies[0].firstChild;d=b=0}for(;c;){if(c.nodeType==1){var e=this.rows[c.uid];if(e){if(a&&(!e.depth||e.depth<=b))break;if(e.parent_uid){var f=this.rows[e.parent_uid];if(f&&f.expanded){if(a&&f==a||d>=f.depth-1){d=f.depth;$(c).css("display","");e.expanded=true;this.triggerEvent("expandcollapse",{uid:e.uid,expanded:e.expanded})}}else if(a&&(!f||f.depth<=
+b))break}}}c=c.nextSibling}return false},collapse_all:function(a){var b,c,d;if(a){a.expanded=false;b=a.depth;c=a.obj.nextSibling;this.update_expando(a.uid);this.triggerEvent("expandcollapse",{uid:a.uid,expanded:a.expanded});if(b&&this.multiexpand)return false}else{c=this.list.tBodies[0].firstChild;b=0}for(;c;){if(c.nodeType==1)if(d=this.rows[c.uid]){if(a&&(!d.depth||d.depth<=b))break;if(a||d.depth)$(c).css("display","none");if(d.has_children&&d.expanded){d.expanded=false;this.update_expando(d.uid,
+false);this.triggerEvent("expandcollapse",{uid:d.uid,expanded:d.expanded})}}c=c.nextSibling}return false},expand_all:function(a){var b,c,d;if(a){a.expanded=true;b=a.depth;c=a.obj.nextSibling;this.update_expando(a.uid,true);this.triggerEvent("expandcollapse",{uid:a.uid,expanded:a.expanded})}else{c=this.list.tBodies[0].firstChild;b=0}for(;c;){if(c.nodeType==1)if(d=this.rows[c.uid]){if(a&&d.depth<=b)break;$(c).css("display","");if(d.has_children&&!d.expanded){d.expanded=true;this.update_expando(d.uid,
+true);this.triggerEvent("expandcollapse",{uid:d.uid,expanded:d.expanded})}}c=c.nextSibling}return false},update_expando:function(a,b){var c=document.getElementById("rcmexpando"+a);if(c)c.className=b?"expanded":"collapsed"},get_next_row:function(){if(!this.rows)return false;var a=this.rows[this.last_selected];for(a=a?a.obj.nextSibling:null;a&&(a.nodeType!=1||a.style.display=="none");)a=a.nextSibling;return a},get_prev_row:function(){if(!this.rows)return false;var a=this.rows[this.last_selected];for(a=
+a?a.obj.previousSibling:null;a&&(a.nodeType!=1||a.style.display=="none");)a=a.previousSibling;return a},get_first_row:function(){if(this.rowcount){var a,b,c=this.list.tBodies[0].rows;a=0;for(b=c.length-1;a<b;a++)if(c[a].id&&String(c[a].id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i)&&this.rows[RegExp.$1]!=null)return RegExp.$1}return null},get_last_row:function(){if(this.rowcount){var a,b=this.list.tBodies[0].rows;for(a=b.length-1;a>=0;a--)if(b[a].id&&String(b[a].id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i)&&
+this.rows[RegExp.$1]!=null)return RegExp.$1}return null},select_row:function(a,b,c){var d=this.selection.join(",");this.multiselect||(b=0);if(!this.shift_start)this.shift_start=a;if(b){switch(b){case SHIFT_KEY:this.shift_select(a,false);break;case CONTROL_KEY:c||this.highlight_row(a,true);break;case CONTROL_SHIFT_KEY:this.shift_select(a,true);break;default:this.highlight_row(a,false)}this.multi_selecting=true}else{this.shift_start=a;this.highlight_row(a,false);this.multi_selecting=false}this.selection.join(",")!=
+d&&this.triggerEvent("select");this.last_selected!=0&&this.rows[this.last_selected]&&$(this.rows[this.last_selected].obj).removeClass("focused");if(this.toggleselect&&this.last_selected==a){this.clear_selection();a=null}else $(this.rows[a].obj).addClass("focused");if(!this.selection.length)this.shift_start=null;this.last_selected=a},select:function(a){this.select_row(a,false);this.scrollto(a)},select_next:function(){var a=this.get_next_row(),b=this.get_prev_row();(a=a?a:b)&&this.select_row(a.uid,
+false,false)},select_first:function(a){var b=this.get_first_row();if(b&&a){this.shift_select(b,a);this.triggerEvent("select");this.scrollto(b)}else b&&this.select(b)},select_last:function(a){var b=this.get_last_row();if(b&&a){this.shift_select(b,a);this.triggerEvent("select");this.scrollto(b)}else b&&this.select(b)},select_childs:function(a){if(this.rows[a]&&this.rows[a].has_children){var b=this.rows[a].depth;for(a=this.rows[a].obj.nextSibling;a;){if(a.nodeType==1)if(r=this.rows[a.uid]){if(!r.depth||
+r.depth<=b)break;this.in_selection(r.uid)||this.select_row(r.uid,CONTROL_KEY)}a=a.nextSibling}}},shift_select:function(a,b){if(!this.rows[this.shift_start]||!this.selection.length)this.shift_start=a;var c=this.rows[this.shift_start].obj.rowIndex,d=this.rows[a].obj.rowIndex,e=c<d?c:d;c=c>d?c:d;for(var f in this.rows)if(this.rows[f].obj.rowIndex>=e&&this.rows[f].obj.rowIndex<=c)this.in_selection(f)||this.highlight_row(f,true);else this.in_selection(f)&&!b&&this.highlight_row(f,true)},in_selection:function(a){for(var b in this.selection)if(this.selection[b]==
+a)return true;return false},select_all:function(a){if(!this.rows||!this.rows.length)return false;var b=this.selection.join(",");this.selection=[];for(var c in this.rows)if(!a||this.rows[c][a]==true){this.last_selected=c;this.highlight_row(c,true)}else $(this.rows[c].obj).removeClass("selected").removeClass("unfocused");this.selection.join(",")!=b&&this.triggerEvent("select");this.focus();return true},invert_selection:function(){if(!this.rows||!this.rows.length)return false;var a=this.selection.join(","),
+b;for(b in this.rows)this.highlight_row(b,true);this.selection.join(",")!=a&&this.triggerEvent("select");this.focus();return true},clear_selection:function(a){var b=this.selection.length;if(a)for(var c in this.selection){if(this.selection[c]==a){this.selection.splice(c,1);break}}else{for(c in this.selection)this.rows[this.selection[c]]&&$(this.rows[this.selection[c]].obj).removeClass("selected").removeClass("unfocused");this.selection=[]}b&&!this.selection.length&&this.triggerEvent("select")},get_selection:function(){return this.selection},
+get_single_selection:function(){return this.selection.length==1?this.selection[0]:null},highlight_row:function(a,b){if(this.rows[a]&&!b){if(this.selection.length>1||!this.in_selection(a)){this.clear_selection();this.selection[0]=a;$(this.rows[a].obj).addClass("selected")}}else if(this.rows[a])if(this.in_selection(a)){var c=$.inArray(a,this.selection),d=this.selection.slice(0,c);c=this.selection.slice(c+1,this.selection.length);this.selection=d.concat(c);$(this.rows[a].obj).removeClass("selected").removeClass("unfocused")}else{this.selection[this.selection.length]=
+a;$(this.rows[a].obj).addClass("selected")}},key_press:function(a){if(this.focused!=true)return true;var b=rcube_event.get_keycode(a),c=rcube_event.get_modifier(a);switch(b){case 40:case 38:case 63233:case 63232:rcube_event.cancel(a);return this.use_arrow_key(b,c);case 61:case 107:case 109:case 32:rcube_event.cancel(a);a=this.use_plusminus_key(b,c);this.key_pressed=b;this.triggerEvent("keypress");return a;case 36:this.select_first(c);return rcube_event.cancel(a);case 35:this.select_last(c);return rcube_event.cancel(a);
+default:this.shiftkey=a.shiftKey;this.key_pressed=b;this.triggerEvent("keypress");if(this.key_pressed==this.BACKSPACE_KEY)return rcube_event.cancel(a)}return true},key_down:function(a){switch(rcube_event.get_keycode(a)){case 27:if(this.drag_active)return this.drag_mouse_up(a);if(this.col_drag_active){this.selected_column=null;return this.column_drag_mouse_up(a)}case 40:case 38:case 63233:case 63232:case 61:case 107:case 109:case 32:if(!rcube_event.get_modifier(a)&&this.focused)return rcube_event.cancel(a)}return true},
+use_arrow_key:function(a,b){var c;if(a==40||a==63233)c=this.get_next_row();else if(a==38||a==63232)c=this.get_prev_row();if(c){this.select_row(c.uid,b,true);this.scrollto(c.uid)}return false},use_plusminus_key:function(a,b){var c=this.rows[this.last_selected];if(c){if(a==32)a=c.expanded?109:61;if(a==61||a==107)b==CONTROL_KEY||this.multiexpand?this.expand_all(c):this.expand(c);else b==CONTROL_KEY||this.multiexpand?this.collapse_all(c):this.collapse(c);this.update_expando(c.uid,c.expanded);return false}},
+scrollto:function(a){var b=this.rows[a].obj;if(b&&this.frame){var c=Number(b.offsetTop);if(!c&&this.rows[a].parent_uid){this.expand_all(this.rows[this.find_root(this.rows[a].uid)]);c=Number(b.offsetTop)}if(c<Number(this.frame.scrollTop))this.frame.scrollTop=c;else if(c+Number(b.offsetHeight)>Number(this.frame.scrollTop)+Number(this.frame.offsetHeight))this.frame.scrollTop=c+Number(b.offsetHeight)-Number(this.frame.offsetHeight)}},drag_mouse_move:function(a){if(a.type=="touchmove")if(a.changedTouches.length==
+1)a=rcube_event.touchevent(a.changedTouches[0]);else return rcube_event.cancel(a);if(this.drag_start){var b=rcube_event.get_mouse_pos(a);if(!this.drag_mouse_start||Math.abs(b.x-this.drag_mouse_start.x)<3&&Math.abs(b.y-this.drag_mouse_start.y)<3)return false;if(!this.draglayer)this.draglayer=$("<div>").attr("id","rcmdraglayer").css({position:"absolute",display:"none","z-index":2E3}).appendTo(document.body);var c,d,e=$.merge([],this.selection);for(c in e){d=e[c];this.rows[d].has_children&&!this.rows[d].expanded&&
+this.select_childs(d)}this.draglayer.html("");for(c=0;c<this.selection.length;c++){if(c>12){this.draglayer.append("...");break}if(e=this.rows[this.selection[c]].obj)for(d=b=0;d<e.childNodes.length;d++)if(e.childNodes[d].nodeName=="TD"){if(c==0)this.drag_start_pos=$(e.childNodes[d]).offset();if(this.subject_col<0||this.subject_col>=0&&this.subject_col==b){var f,g,h=e.childNodes[d].childNodes;for(b=0;b<h.length;b++)if((g=e.childNodes[d].childNodes[b])&&(g.nodeType==3||g.nodeName=="A"))f=g;if(!f)break;
+d=$(f).text();d=$.trim(d);d=d.length>50?d.substring(0,50)+"...":d;this.draglayer.append($("<div>").text(d));break}b++}}this.draglayer.show();this.drag_active=true;this.triggerEvent("dragstart")}if(this.drag_active&&this.draglayer){c=rcube_event.get_mouse_pos(a);this.draglayer.css({left:c.x+20+"px",top:c.y-5+(bw.ie?document.documentElement.scrollTop:0)+"px"});this.triggerEvent("dragmove",a?a:window.event)}return this.drag_start=false},drag_mouse_up:function(a){document.onmousemove=null;if(a.type==
+"touchend")if(a.changedTouches.length!=1)return rcube_event.cancel(a);if(this.draglayer&&this.draglayer.is(":visible"))this.drag_start_pos?this.draglayer.animate(this.drag_start_pos,300,"swing").hide(20):this.draglayer.hide();this.drag_active&&this.focus();this.drag_active=false;rcube_event.remove_listener({event:"mousemove",object:this,method:"drag_mouse_move"});rcube_event.remove_listener({event:"mouseup",object:this,method:"drag_mouse_up"});if(bw.iphone||bw.ipad){rcube_event.remove_listener({event:"touchmove",
+object:this,method:"drag_mouse_move"});rcube_event.remove_listener({event:"touchend",object:this,method:"drag_mouse_up"})}this.del_dragfix();this.triggerEvent("dragend");return rcube_event.cancel(a)},column_drag_mouse_move:function(a){if(this.drag_start){var b;b=rcube_event.get_mouse_pos(a);if(!this.drag_mouse_start||Math.abs(b.x-this.drag_mouse_start.x)<3&&Math.abs(b.y-this.drag_mouse_start.y)<3)return false;if(!this.col_draglayer){b=$(this.list).offset();var c=this.list.tHead.rows[0].cells;this.col_draglayer=
+$("<div>").attr("id","rcmcoldraglayer").css(b).css({position:"absolute","z-index":2001,"background-color":"white",opacity:0.75,height:this.frame.offsetHeight-2+"px",width:this.frame.offsetWidth-2+"px"}).appendTo(document.body).append($("<div>").attr("id","rcmcolumnindicator").css({position:"absolute","border-right":"2px dotted #555","z-index":2002,height:this.frame.offsetHeight-2+"px"}));this.cols=[];this.list_pos=this.list_min_pos=b.left;for(b=0;b<c.length;b++){this.cols[b]=c[b].offsetWidth;if(this.column_fixed!==
+null&&b<=this.column_fixed)this.list_min_pos+=this.cols[b]}}this.col_draglayer.show();this.col_drag_active=true;this.triggerEvent("column_dragstart")}if(this.col_drag_active&&this.col_draglayer){c=0;var d=rcube_event.get_mouse_pos(a);for(b=0;b<this.cols.length;b++)if(d.x>=this.cols[b]/2+this.list_pos+c)c+=this.cols[b];else break;if(b==0&&this.list_min_pos>d.x)c=this.list_min_pos-this.list_pos;else if(!this.list.rowcount&&b==this.cols.length)c-=2;$("#rcmcolumnindicator").css({width:c+"px"});this.triggerEvent("column_dragmove",
+a?a:window.event)}return this.drag_start=false},column_drag_mouse_up:function(a){document.onmousemove=null;if(this.col_draglayer){this.col_draglayer.remove();this.col_draglayer=null}this.col_drag_active&&this.focus();this.col_drag_active=false;rcube_event.remove_listener({event:"mousemove",object:this,method:"column_drag_mouse_move"});rcube_event.remove_listener({event:"mouseup",object:this,method:"column_drag_mouse_up"});this.del_dragfix();if(this.selected_column!==null&&this.cols&&this.cols.length){var b,
+c=0,d=rcube_event.get_mouse_pos(a);for(b=0;b<this.cols.length;b++)if(d.x>=this.cols[b]/2+this.list_pos+c)c+=this.cols[b];else break;b!=this.selected_column&&b!=this.selected_column+1&&this.column_replace(this.selected_column,b)}this.triggerEvent("column_dragend");return rcube_event.cancel(a)},add_dragfix:function(){$("iframe").each(function(){$('<div class="iframe-dragdrop-fix"></div>').css({background:"#fff",width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",
+zIndex:1E3}).css($(this).offset()).appendTo(document.body)})},del_dragfix:function(){$("div.iframe-dragdrop-fix").each(function(){this.parentNode.removeChild(this)})},column_replace:function(a,b){var c=this.list.tHead.rows[0].cells,d=c[a],e=c[b],f=document.createElement("td");e?c[0].parentNode.insertBefore(f,e):c[0].parentNode.appendChild(f);c[0].parentNode.replaceChild(d,f);for(r=0;r<this.list.tBodies[0].rows.length;r++){row=this.list.tBodies[0].rows[r];d=row.cells[a];e=row.cells[b];f=document.createElement("td");
+e?row.insertBefore(f,e):row.appendChild(f);row.replaceChild(d,f)}if(this.subject_col==a)this.subject_col=b>a?b-1:b;else if(this.subject_col<a&&b<=this.subject_col)this.subject_col++;else this.subject_col>a&&b>=this.subject_col&&this.subject_col--;this.triggerEvent("column_replace")}};rcube_list_widget.prototype.addEventListener=rcube_event_engine.prototype.addEventListener;rcube_list_widget.prototype.removeEventListener=rcube_event_engine.prototype.removeEventListener;
 rcube_list_widget.prototype.triggerEvent=rcube_event_engine.prototype.triggerEvent;
-
index 6f7fe66dc2858e5a2f7f80981cd496b375f810b0..b0288758beff64b7195078af4e5f6463dbbdafa6 100644 (file)
@@ -1,9 +1,9 @@
 /*
  +-----------------------------------------------------------------------+
- | RoundCube List Widget                                                 |
+ | Roundcube List Widget                                                 |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2006-2009, RoundCube Dev, - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2006-2009, Roundcube Dev, - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Requires: common.js                                                   |
  +-----------------------------------------------------------------------+
 
-  $Id: list.js 3055 2009-10-23 18:11:41Z alec $
+  $Id: list.js 4343 2010-12-16 09:26:30Z alec $
 */
 
 
 /**
- * RoundCube List Widget class
+ * Roundcube List Widget class
  * @contructor
  */
 function rcube_list_widget(list, p)
-  {
+{
   // static contants
   this.ENTER_KEY = 13;
   this.DELETE_KEY = 46;
   this.BACKSPACE_KEY = 8;
-  
+
   this.list = list ? list : null;
   this.frame = null;
   this.rows = [];
   this.selection = [];
   this.rowcount = 0;
-  
+  this.colcount = 0;
+
   this.subject_col = -1;
   this.shiftkey = false;
   this.multiselect = false;
+  this.multiexpand = false;
   this.multi_selecting = false;
   this.draggable = false;
+  this.column_movable = false;
   this.keyboard = false;
   this.toggleselect = false;
-  
+
   this.dont_select = false;
   this.drag_active = false;
+  this.col_drag_active = false;
+  this.column_fixed = null;
   this.last_selected = 0;
   this.shift_start = 0;
   this.in_selection_before = false;
@@ -51,12 +56,12 @@ function rcube_list_widget(list, p)
   this.drag_mouse_start = null;
   this.dblclick_time = 600;
   this.row_init = function(){};
-  
+
   // overwrite default paramaters
-  if (p && typeof(p)=='object')
+  if (p && typeof(p) == 'object')
     for (var n in p)
       this[n] = p[n];
-  }
+};
 
 
 rcube_list_widget.prototype = {
@@ -67,31 +72,24 @@ rcube_list_widget.prototype = {
  */
 init: function()
 {
-  if (this.list && this.list.tBodies[0])
-  {
-    this.rows = new Array();
+  if (this.list && this.list.tBodies[0]) {
+    this.rows = [];
     this.rowcount = 0;
 
-    var row;
-    for(var r=0; r<this.list.tBodies[0].childNodes.length; r++)
-    {
-      row = this.list.tBodies[0].childNodes[r];
-      while (row && (row.nodeType != 1 || row.style.display == 'none'))
-      {
-        row = row.nextSibling;
-        r++;
-      }
+    var r, len, rows = this.list.tBodies[0].rows;
 
-      this.init_row(row);
+    for (r=0, len=rows.length; r<len; r++) {
+      this.init_row(rows[r]);
       this.rowcount++;
     }
 
+    this.init_header();
     this.frame = this.list.parentNode;
 
     // set body events
     if (this.keyboard) {
-      rcube_event.add_listener({element:document, event:bw.opera?'keypress':'keydown', object:this, method:'key_press'});
-      rcube_event.add_listener({element:document, event:'keydown', object:this, method:'key_down'});
+      rcube_event.add_listener({event:bw.opera?'keypress':'keydown', object:this, method:'key_press'});
+      rcube_event.add_listener({event:'keydown', object:this, method:'key_down'});
     }
   }
 },
@@ -103,16 +101,29 @@ init: function()
 init_row: function(row)
 {
   // make references in internal array and set event handlers
-  if (row && String(row.id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i))
-  {
-    var p = this;
+  if (row && String(row.id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i)) {
+    var self = this;
     var uid = RegExp.$1;
     row.uid = uid;
-    this.rows[uid] = {uid:uid, id:row.id, obj:row, classname:row.className};
+    this.rows[uid] = {uid:uid, id:row.id, obj:row};
 
     // set eventhandlers to table row
-    row.onmousedown = function(e){ return p.drag_row(e, this.uid); };
-    row.onmouseup = function(e){ return p.click_row(e, this.uid); };
+    row.onmousedown = function(e){ return self.drag_row(e, this.uid); };
+    row.onmouseup = function(e){ return self.click_row(e, this.uid); };
+
+    if (bw.iphone || bw.ipad) {
+      row.addEventListener('touchstart', function(e) {
+        if (e.touches.length == 1) {
+          if (!self.drag_row(rcube_event.touchevent(e.touches[0]), this.uid))
+            e.preventDefault();
+        }
+      }, false);
+      row.addEventListener('touchend', function(e) {
+        if (e.changedTouches.length == 1)
+          if (!self.click_row(rcube_event.touchevent(e.changedTouches[0]), this.uid))
+            e.preventDefault();
+      }, false);
+    }
 
     if (document.all)
       row.onselectstart = function() { return false; };
@@ -122,18 +133,43 @@ init_row: function(row)
 },
 
 
+/**
+ * Init list column headers and set mouse events on them
+ */
+init_header: function()
+{
+  if (this.list && this.list.tHead) {
+    this.colcount = 0;
+
+    var col, r, p = this;
+    // add events for list columns moving
+    if (this.column_movable && this.list.tHead && this.list.tHead.rows) {
+      for (r=0; r<this.list.tHead.rows[0].cells.length; r++) {
+        if (this.column_fixed == r)
+          continue;
+        col = this.list.tHead.rows[0].cells[r];
+        col.onmousedown = function(e){ return p.drag_column(e, this); };
+        this.colcount++;
+      }
+    }
+  }
+},
+
+
 /**
  * Remove all list rows
  */
 clear: function(sel)
 {
   var tbody = document.createElement('tbody');
+
   this.list.insertBefore(tbody, this.list.tBodies[0]);
   this.list.removeChild(this.list.tBodies[1]);
-  this.rows = new Array();
+  this.rows = [];
   this.rowcount = 0;
-  
-  if (sel) this.clear_selection();
+
+  if (sel)
+    this.clear_selection();
 },
 
 
@@ -148,7 +184,7 @@ remove_row: function(uid, sel_next)
   if (sel_next)
     this.select_next();
 
-  this.rows[uid] = null;
+  delete this.rows[uid];
   this.rowcount--;
 },
 
@@ -158,10 +194,7 @@ remove_row: function(uid, sel_next)
  */
 insert_row: function(row, attop)
 {
-  if (this.background)
-    var tbody = this.background;
-  else
-    var tbody = this.list.tBodies[0];
+  var tbody = this.list.tBodies[0];
 
   if (attop && tbody.rows.length)
     tbody.insertBefore(row, tbody.firstChild);
@@ -179,15 +212,20 @@ insert_row: function(row, attop)
  */
 focus: function(e)
 {
+  var id;
   this.focused = true;
-  for (var n=0; n<this.selection.length; n++)
-  {
+
+  for (var n in this.selection) {
     id = this.selection[n];
     if (this.rows[id] && this.rows[id].obj) {
       $(this.rows[id].obj).addClass('selected').removeClass('unfocused');
     }
   }
 
+  // Un-focus already focused elements
+  $('*:focus', window).blur();
+  $('iframe').each(function() { this.blur(); });
+
   if (e || (e = window.event))
     rcube_event.cancel(e);
 },
@@ -200,8 +238,7 @@ blur: function()
 {
   var id;
   this.focused = false;
-  for (var n=0; n<this.selection.length; n++)
-  {
+  for (var n in this.selection) {
     id = this.selection[n];
     if (this.rows[id] && this.rows[id].obj) {
       $(this.rows[id].obj).removeClass('selected').addClass('unfocused');
@@ -210,66 +247,70 @@ blur: function()
 },
 
 
+/**
+ * onmousedown-handler of message list column
+ */
+drag_column: function(e, col)
+{
+  if (this.colcount > 1) {
+    this.drag_start = true;
+    this.drag_mouse_start = rcube_event.get_mouse_pos(e);
+
+    rcube_event.add_listener({event:'mousemove', object:this, method:'column_drag_mouse_move'});
+    rcube_event.add_listener({event:'mouseup', object:this, method:'column_drag_mouse_up'});
+
+    // enable dragging over iframes
+    this.add_dragfix();
+
+    // find selected column number
+    for (var i=0; i<this.list.tHead.rows[0].cells.length; i++) {
+      if (col == this.list.tHead.rows[0].cells[i]) {
+        this.selected_column = i;
+        break;
+      }
+    }
+  }
+
+  return false;
+},
+
+
 /**
  * onmousedown-handler of message list row
  */
 drag_row: function(e, id)
 {
   // don't do anything (another action processed before)
-  var evtarget = rcube_event.get_target(e);
-  var tagname = evtarget.tagName.toLowerCase();
+  var evtarget = rcube_event.get_target(e),
+    tagname = evtarget.tagName.toLowerCase();
+
   if (this.dont_select || (evtarget && (tagname == 'input' || tagname == 'img')))
     return true;
-    
+
   // accept right-clicks
   if (rcube_event.get_button(e) == 2)
     return true;
-  
+
   this.in_selection_before = this.in_selection(id) ? id : false;
 
   // selects currently unselected row
-  if (!this.in_selection_before)
-  {
+  if (!this.in_selection_before) {
     var mod_key = rcube_event.get_modifier(e);
     this.select_row(id, mod_key, false);
   }
 
-  if (this.draggable && this.selection.length)
-  {
+  if (this.draggable && this.selection.length) {
     this.drag_start = true;
     this.drag_mouse_start = rcube_event.get_mouse_pos(e);
-    rcube_event.add_listener({element:document, event:'mousemove', object:this, method:'drag_mouse_move'});
-    rcube_event.add_listener({element:document, event:'mouseup', object:this, method:'drag_mouse_up'});
-
-    // add listener for iframes
-    var iframes = document.getElementsByTagName('iframe');
-    this.iframe_events = Object();
-    for (var n in iframes)
-    {
-      var iframedoc = null;
-      if (iframes[n].contentDocument)
-        iframedoc = iframes[n].contentDocument;
-      else if (iframes[n].contentWindow)
-        iframedoc = iframes[n].contentWindow.document;
-      else if (iframes[n].document)
-        iframedoc = iframes[n].document;
-
-      if (iframedoc)
-      {
-        var list = this;
-        var pos = $('#'+iframes[n].id).offset();
-        this.iframe_events[n] = function(e) { e._offset = pos; return list.drag_mouse_move(e); }
-
-        if (iframedoc.addEventListener)
-          iframedoc.addEventListener('mousemove', this.iframe_events[n], false);
-        else if (iframes[n].attachEvent)
-          iframedoc.attachEvent('onmousemove', this.iframe_events[n]);
-        else
-          iframedoc['onmousemove'] = this.iframe_events[n];
-
-        rcube_event.add_listener({element:iframedoc, event:'mouseup', object:this, method:'drag_mouse_up'});
-      }
+    rcube_event.add_listener({event:'mousemove', object:this, method:'drag_mouse_move'});
+    rcube_event.add_listener({event:'mouseup', object:this, method:'drag_mouse_up'});
+    if (bw.iphone || bw.ipad) {
+      rcube_event.add_listener({event:'touchmove', object:this, method:'drag_mouse_move'});
+      rcube_event.add_listener({event:'touchend', object:this, method:'drag_mouse_up'});
     }
+
+    // enable dragging over iframes
+    this.add_dragfix();
   }
 
   return false;
@@ -281,21 +322,20 @@ drag_row: function(e, id)
  */
 click_row: function(e, id)
 {
-  var now = new Date().getTime();
-  var mod_key = rcube_event.get_modifier(e);
-  var evtarget = rcube_event.get_target(e);
-  var tagname = evtarget.tagName.toLowerCase();
+  var now = new Date().getTime(),
+    mod_key = rcube_event.get_modifier(e),
+    evtarget = rcube_event.get_target(e),
+    tagname = evtarget.tagName.toLowerCase();
 
   if ((evtarget && (tagname == 'input' || tagname == 'img')))
     return true;
 
   // don't do anything (another action processed before)
-  if (this.dont_select)
-    {
+  if (this.dont_select) {
     this.dont_select = false;
     return false;
-    }
-    
+  }
+
   var dblclicked = now - this.rows[id].clicked < this.dblclick_time;
 
   // unselects currently selected row
@@ -311,14 +351,216 @@ click_row: function(e, id)
   else
     this.triggerEvent('click');
 
-  if (!this.drag_active)
+  if (!this.drag_active) {
+    // remove temp divs
+    this.del_dragfix();
     rcube_event.cancel(e);
+  }
 
   this.rows[id].clicked = now;
   return false;
 },
 
 
+/*
+ * Returns thread root ID for specified row ID
+ */
+find_root: function(uid)
+{
+   var r = this.rows[uid];
+
+   if (r && r.parent_uid)
+     return this.find_root(r.parent_uid);
+   else
+     return uid;
+},
+
+
+expand_row: function(e, id)
+{
+  var row = this.rows[id],
+    evtarget = rcube_event.get_target(e),
+    mod_key = rcube_event.get_modifier(e);
+
+  // Don't select this message
+  this.dont_select = true;
+  // Don't treat double click on the expando as double click on the message.
+  row.clicked = 0;
+
+  if (row.expanded) {
+    evtarget.className = 'collapsed';
+    if (mod_key == CONTROL_KEY || this.multiexpand)
+      this.collapse_all(row);
+    else
+      this.collapse(row);
+  }
+  else {
+    evtarget.className = 'expanded';
+    if (mod_key == CONTROL_KEY || this.multiexpand)
+      this.expand_all(row);
+    else
+     this.expand(row);
+  }
+},
+
+collapse: function(row)
+{
+  row.expanded = false;
+  this.triggerEvent('expandcollapse', { uid:row.uid, expanded:row.expanded });
+  var depth = row.depth;
+  var new_row = row ? row.obj.nextSibling : null;
+  var r;
+
+  while (new_row) {
+    if (new_row.nodeType == 1) {
+      var r = this.rows[new_row.uid];
+      if (r && r.depth <= depth)
+        break;
+      $(new_row).css('display', 'none');
+      if (r.expanded) {
+        r.expanded = false;
+        this.triggerEvent('expandcollapse', { uid:r.uid, expanded:r.expanded });
+      }
+    }
+    new_row = new_row.nextSibling;
+  }
+
+  return false;
+},
+
+expand: function(row)
+{
+  var depth, new_row;
+  var last_expanded_parent_depth;
+
+  if (row) {
+    row.expanded = true;
+    depth = row.depth;
+    new_row = row.obj.nextSibling;
+    this.update_expando(row.uid, true);
+    this.triggerEvent('expandcollapse', { uid:row.uid, expanded:row.expanded });
+  }
+  else {
+    var tbody = this.list.tBodies[0];
+    new_row = tbody.firstChild;
+    depth = 0;
+    last_expanded_parent_depth = 0;
+  }
+
+  while (new_row) {
+    if (new_row.nodeType == 1) {
+      var r = this.rows[new_row.uid];
+      if (r) {
+        if (row && (!r.depth || r.depth <= depth))
+          break;
+
+        if (r.parent_uid) {
+          var p = this.rows[r.parent_uid];
+          if (p && p.expanded) {
+            if ((row && p == row) || last_expanded_parent_depth >= p.depth - 1) {
+              last_expanded_parent_depth = p.depth;
+              $(new_row).css('display', '');
+              r.expanded = true;
+              this.triggerEvent('expandcollapse', { uid:r.uid, expanded:r.expanded });
+            }
+          }
+          else
+            if (row && (! p || p.depth <= depth))
+              break;
+        }
+      }
+    }
+    new_row = new_row.nextSibling;
+  }
+
+  return false;
+},
+
+
+collapse_all: function(row)
+{
+  var depth, new_row, r;
+
+  if (row) {
+    row.expanded = false;
+    depth = row.depth;
+    new_row = row.obj.nextSibling;
+    this.update_expando(row.uid);
+    this.triggerEvent('expandcollapse', { uid:row.uid, expanded:row.expanded });
+
+    // don't collapse sub-root tree in multiexpand mode 
+    if (depth && this.multiexpand)
+      return false;
+  }
+  else {
+    new_row = this.list.tBodies[0].firstChild;
+    depth = 0;
+  }
+
+  while (new_row) {
+    if (new_row.nodeType == 1) {
+      if (r = this.rows[new_row.uid]) {
+        if (row && (!r.depth || r.depth <= depth))
+          break;
+
+        if (row || r.depth)
+          $(new_row).css('display', 'none');
+        if (r.has_children && r.expanded) {
+          r.expanded = false;
+          this.update_expando(r.uid, false);
+          this.triggerEvent('expandcollapse', { uid:r.uid, expanded:r.expanded });
+        }
+      }
+    }
+    new_row = new_row.nextSibling;
+  }
+
+  return false;
+},
+
+expand_all: function(row)
+{
+  var depth, new_row, r;
+
+  if (row) {
+    row.expanded = true;
+    depth = row.depth;
+    new_row = row.obj.nextSibling;
+    this.update_expando(row.uid, true);
+    this.triggerEvent('expandcollapse', { uid:row.uid, expanded:row.expanded });
+  }
+  else {
+    new_row = this.list.tBodies[0].firstChild;
+    depth = 0;
+  }
+
+  while (new_row) {
+    if (new_row.nodeType == 1) {
+      if (r = this.rows[new_row.uid]) {
+        if (row && r.depth <= depth)
+          break;
+
+        $(new_row).css('display', '');
+        if (r.has_children && !r.expanded) {
+          r.expanded = true;
+          this.update_expando(r.uid, true);
+          this.triggerEvent('expandcollapse', { uid:r.uid, expanded:r.expanded });
+        }
+      }
+    }
+    new_row = new_row.nextSibling;
+  }
+  return false;
+},
+
+update_expando: function(uid, expanded)
+{
+  var expando = document.getElementById('rcmexpando' + uid);
+  if (expando)
+    expando.className = expanded ? 'expanded' : 'collapsed';
+},
+
+
 /**
  * get first/next/previous/last rows that are not hidden
  */
@@ -327,8 +569,9 @@ get_next_row: function()
   if (!this.rows)
     return false;
 
-  var last_selected_row = this.rows[this.last_selected];
-  var new_row = last_selected_row ? last_selected_row.obj.nextSibling : null;
+  var last_selected_row = this.rows[this.last_selected],
+    new_row = last_selected_row ? last_selected_row.obj.nextSibling : null;
+
   while (new_row && (new_row.nodeType != 1 || new_row.style.display == 'none'))
     new_row = new_row.nextSibling;
 
@@ -340,8 +583,9 @@ get_prev_row: function()
   if (!this.rows)
     return false;
 
-  var last_selected_row = this.rows[this.last_selected];
-  var new_row = last_selected_row ? last_selected_row.obj.previousSibling : null;
+  var last_selected_row = this.rows[this.last_selected],
+    new_row = last_selected_row ? last_selected_row.obj.previousSibling : null;
+
   while (new_row && (new_row.nodeType != 1 || new_row.style.display == 'none'))
     new_row = new_row.previousSibling;
 
@@ -350,28 +594,26 @@ get_prev_row: function()
 
 get_first_row: function()
 {
-  if (this.rowcount)
-    {
-    var rows = this.list.tBodies[0].rows;
+  if (this.rowcount) {
+    var i, len, rows = this.list.tBodies[0].rows;
 
-    for(var i=0; i<rows.length-1; i++)
-      if(rows[i].id && String(rows[i].id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i) && this.rows[RegExp.$1] != null)
-       return RegExp.$1;
-    }
+    for (i=0, len=rows.length-1; i<len; i++)
+      if (rows[i].id && String(rows[i].id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i) && this.rows[RegExp.$1] != null)
+           return RegExp.$1;
+  }
 
   return null;
 },
 
 get_last_row: function()
 {
-  if (this.rowcount)
-    {
-    var rows = this.list.tBodies[0].rows;
+  if (this.rowcount) {
+    var i, rows = this.list.tBodies[0].rows;
 
-    for(var i=rows.length-1; i>=0; i--)
-      if(rows[i].id && String(rows[i].id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i) && this.rows[RegExp.$1] != null)
-       return RegExp.$1;
-    }
+    for (i=rows.length-1; i>=0; i--)
+      if (rows[i].id && String(rows[i].id).match(/rcmrow([a-z0-9\-_=\+\/]+)/i) && this.rows[RegExp.$1] != null)
+        return RegExp.$1;
+  }
 
   return null;
 },
@@ -385,20 +627,17 @@ select_row: function(id, mod_key, with_mouse)
   var select_before = this.selection.join(',');
   if (!this.multiselect)
     mod_key = 0;
-    
+
   if (!this.shift_start)
     this.shift_start = id
 
-  if (!mod_key)
-  {
+  if (!mod_key) {
     this.shift_start = id;
     this.highlight_row(id, false);
     this.multi_selecting = false;
   }
-  else
-  {
-    switch (mod_key)
-    {
+  else {
+    switch (mod_key) {
       case SHIFT_KEY:
         this.shift_select(id, false);
         break;
@@ -427,8 +666,7 @@ select_row: function(id, mod_key, with_mouse)
     $(this.rows[this.last_selected].obj).removeClass('focused');
 
   // unselect if toggleselect is active and the same row was clicked again
-  if (this.toggleselect && this.last_selected == id)
-  {
+  if (this.toggleselect && this.last_selected == id) {
     this.clear_selection();
     id = null;
   }
@@ -462,17 +700,63 @@ select_next: function()
   var prev_row = this.get_prev_row();
   var new_row = (next_row) ? next_row : prev_row;
   if (new_row)
-    this.select_row(new_row.uid, false, false);  
+    this.select_row(new_row.uid, false, false);
 },
 
+
 /**
  * Select first row 
  */
-select_first: function()
+select_first: function(mod_key)
 {
-  var first_row = this.get_first_row();
-  if (first_row)
-    this.select_row(first_row, false, false);  
+  var row = this.get_first_row();
+  if (row && mod_key) {
+    this.shift_select(row, mod_key);
+    this.triggerEvent('select');
+    this.scrollto(row);
+  }
+  else if (row)
+    this.select(row);
+},
+
+
+/**
+ * Select last row 
+ */
+select_last: function(mod_key)
+{
+  var row = this.get_last_row();
+  if (row && mod_key) {
+    this.shift_select(row, mod_key);
+    this.triggerEvent('select');
+    this.scrollto(row);
+  }
+  else if (row)
+    this.select(row);
+},
+
+
+/**
+ * Add all childs of the given row to selection
+ */
+select_childs: function(uid)
+{
+  if (!this.rows[uid] || !this.rows[uid].has_children)
+    return;
+
+  var depth = this.rows[uid].depth;
+  var row = this.rows[uid].obj.nextSibling;
+  while (row) {
+    if (row.nodeType == 1) {
+      if ((r = this.rows[row.uid])) {
+        if (!r.depth || r.depth <= depth)
+          break;
+        if (!this.in_selection(r.uid))
+          this.select_row(r.uid, CONTROL_KEY);
+      }
+    }
+    row = row.nextSibling;
+  }
 },
 
 
@@ -484,24 +768,22 @@ shift_select: function(id, control)
   if (!this.rows[this.shift_start] || !this.selection.length)
     this.shift_start = id;
 
-  var from_rowIndex = this.rows[this.shift_start].obj.rowIndex;
-  var to_rowIndex = this.rows[id].obj.rowIndex;
-
-  var i = ((from_rowIndex < to_rowIndex)? from_rowIndex : to_rowIndex);
-  var j = ((from_rowIndex > to_rowIndex)? from_rowIndex : to_rowIndex);
+  var from_rowIndex = this.rows[this.shift_start].obj.rowIndex,
+    to_rowIndex = this.rows[id].obj.rowIndex,
+    i = ((from_rowIndex < to_rowIndex)? from_rowIndex : to_rowIndex),
+    j = ((from_rowIndex > to_rowIndex)? from_rowIndex : to_rowIndex);
 
   // iterate through the entire message list
-  for (var n in this.rows)
-  {
-    if ((this.rows[n].obj.rowIndex >= i) && (this.rows[n].obj.rowIndex <= j))
-    {
-      if (!this.in_selection(n))
+  for (var n in this.rows) {
+    if (this.rows[n].obj.rowIndex >= i && this.rows[n].obj.rowIndex <= j) {
+      if (!this.in_selection(n)) {
         this.highlight_row(n, true);
+      }
     }
-    else
-    {
-      if  (this.in_selection(n) && !control)
+    else {
+      if  (this.in_selection(n) && !control) {
         this.highlight_row(n, true);
+      }
     }
   }
 },
@@ -516,7 +798,7 @@ in_selection: function(id)
     if (this.selection[n]==id)
       return true;
 
-  return false;    
+  return false;
 },
 
 
@@ -530,17 +812,14 @@ select_all: function(filter)
 
   // reset but remember selection first
   var select_before = this.selection.join(',');
-  this.selection = new Array();
-  
-  for (var n in this.rows)
-  {
-    if (!filter || (this.rows[n] && this.rows[n][filter] == true))
-    {
+  this.selection = [];
+
+  for (var n in this.rows) {
+    if (!filter || this.rows[n][filter] == true) {
       this.last_selected = n;
       this.highlight_row(n, true);
     }
-    else if (this.rows[n])
-    {
+    else {
       $(this.rows[n].obj).removeClass('selected').removeClass('unfocused');
     }
   }
@@ -565,9 +844,9 @@ invert_selection: function()
 
   // remember old selection
   var select_before = this.selection.join(',');
-  
+
   for (var n in this.rows)
-    this.highlight_row(n, true);    
+    this.highlight_row(n, true);
 
   // trigger event if selection changed
   if (this.selection.join(',') != select_before)
@@ -587,24 +866,22 @@ clear_selection: function(id)
   var num_select = this.selection.length;
 
   // one row
-  if (id)
-    {
-    for (var n=0; n<this.selection.length; n++)
+  if (id) {
+    for (var n in this.selection)
       if (this.selection[n] == id) {
         this.selection.splice(n,1);
         break;
       }
-    }
+  }
   // all rows
-  else
-    {
-    for (var n=0; n<this.selection.length; n++)
+  else {
+    for (var n in this.selection)
       if (this.rows[this.selection[n]]) {
         $(this.rows[this.selection[n]].obj).removeClass('selected').removeClass('unfocused');
-        }
-    
-    this.selection = new Array();
-    }
+      }
+
+    this.selection = [];
+  }
 
   if (num_select && !this.selection.length)
     this.triggerEvent('select');
@@ -637,25 +914,20 @@ get_single_selection: function()
  */
 highlight_row: function(id, multiple)
 {
-  if (this.rows[id] && !multiple)
-  {
-    if (this.selection.length > 1 || !this.in_selection(id))
-    {
+  if (this.rows[id] && !multiple) {
+    if (this.selection.length > 1 || !this.in_selection(id)) {
       this.clear_selection();
       this.selection[0] = id;
       $(this.rows[id].obj).addClass('selected');
     }
   }
-  else if (this.rows[id])
-  {
-    if (!this.in_selection(id))  // select row
-    {
+  else if (this.rows[id]) {
+    if (!this.in_selection(id)) { // select row
       this.selection[this.selection.length] = id;
       $(this.rows[id].obj).addClass('selected');
     }
-    else  // unselect row
-    {
-      var p = find_in_array(id, this.selection);
+    else { // unselect row
+      var p = $.inArray(id, this.selection);
       var a_pre = this.selection.slice(0, p);
       var a_post = this.selection.slice(p+1, this.selection.length);
       this.selection = a_pre.concat(a_post);
@@ -676,8 +948,7 @@ key_press: function(e)
   var keyCode = rcube_event.get_keycode(e);
   var mod_key = rcube_event.get_modifier(e);
 
-  switch (keyCode)
-  {
+  switch (keyCode) {
     case 40:
     case 38: 
     case 63233: // "down", in safari keypress
@@ -685,15 +956,31 @@ key_press: function(e)
       // Stop propagation so that the browser doesn't scroll
       rcube_event.cancel(e);
       return this.use_arrow_key(keyCode, mod_key);
+    case 61:
+    case 107: // Plus sign on a numeric keypad (fc11 + firefox 3.5.2)
+    case 109:
+    case 32:
+      // Stop propagation
+      rcube_event.cancel(e);
+      var ret = this.use_plusminus_key(keyCode, mod_key);
+      this.key_pressed = keyCode;
+      this.triggerEvent('keypress');
+      return ret;
+    case 36: // Home
+      this.select_first(mod_key);
+      return rcube_event.cancel(e);
+    case 35: // End
+      this.select_last(mod_key);
+      return rcube_event.cancel(e);
     default:
       this.shiftkey = e.shiftKey;
       this.key_pressed = keyCode;
       this.triggerEvent('keypress');
-      
+
       if (this.key_pressed == this.BACKSPACE_KEY)
         return rcube_event.cancel(e);
   }
-  
+
   return true;
 },
 
@@ -702,22 +989,29 @@ key_press: function(e)
  */
 key_down: function(e)
 {
-  switch (rcube_event.get_keycode(e))
-  {
+  switch (rcube_event.get_keycode(e)) {
     case 27:
       if (this.drag_active)
-       return this.drag_mouse_up(e);
-       
+           return this.drag_mouse_up(e);
+      if (this.col_drag_active) {
+        this.selected_column = null;
+           return this.column_drag_mouse_up(e);
+      }
+
     case 40:
     case 38: 
     case 63233:
     case 63232:
+    case 61:
+    case 107:
+    case 109:
+    case 32:
       if (!rcube_event.get_modifier(e) && this.focused)
         return rcube_event.cancel(e);
-        
+
     default:
   }
-  
+
   return true;
 },
 
@@ -735,8 +1029,7 @@ use_arrow_key: function(keyCode, mod_key)
   else if (keyCode == 38 || keyCode == 63232) // up arrow key pressed
     new_row = this.get_prev_row();
 
-  if (new_row)
-  {
+  if (new_row) {
     this.select_row(new_row.uid, mod_key, true);
     this.scrollto(new_row.uid);
   }
@@ -745,16 +1038,50 @@ use_arrow_key: function(keyCode, mod_key)
 },
 
 
+/**
+ * Special handling method for +/- keys
+ */
+use_plusminus_key: function(keyCode, mod_key)
+{
+  var selected_row = this.rows[this.last_selected];
+  if (!selected_row)
+    return;
+
+  if (keyCode == 32)
+    keyCode = selected_row.expanded ? 109 : 61;
+  if (keyCode == 61 || keyCode == 107)
+    if (mod_key == CONTROL_KEY || this.multiexpand)
+      this.expand_all(selected_row);
+    else
+     this.expand(selected_row);
+  else
+    if (mod_key == CONTROL_KEY || this.multiexpand)
+      this.collapse_all(selected_row);
+    else
+      this.collapse(selected_row);
+
+  this.update_expando(selected_row.uid, selected_row.expanded);
+
+  return false;
+},
+
+
 /**
  * Try to scroll the list to make the specified row visible
  */
 scrollto: function(id)
 {
   var row = this.rows[id].obj;
-  if (row && this.frame)
-  {
+  if (row && this.frame) {
     var scroll_to = Number(row.offsetTop);
 
+    // expand thread if target row is hidden (collapsed)
+    if (!scroll_to && this.rows[id].parent_uid) {
+      var parent = this.find_root(this.rows[id].uid);
+      this.expand_all(this.rows[parent]);
+      scroll_to = Number(row.offsetTop);
+    }
+
     if (scroll_to < Number(this.frame.scrollTop))
       this.frame.scrollTop = scroll_to;
     else if (scroll_to + Number(row.offsetHeight) > Number(this.frame.scrollTop) + Number(this.frame.offsetHeight))
@@ -768,51 +1095,73 @@ scrollto: function(id)
  */
 drag_mouse_move: function(e)
 {
-  if (this.drag_start)
-  {
+  // convert touch event
+  if (e.type == 'touchmove') {
+    if (e.changedTouches.length == 1)
+      e = rcube_event.touchevent(e.changedTouches[0]);
+    else
+      return rcube_event.cancel(e);
+  }
+  
+  if (this.drag_start) {
     // check mouse movement, of less than 3 pixels, don't start dragging
     var m = rcube_event.get_mouse_pos(e);
 
     if (!this.drag_mouse_start || (Math.abs(m.x - this.drag_mouse_start.x) < 3 && Math.abs(m.y - this.drag_mouse_start.y) < 3))
       return false;
-  
+
     if (!this.draglayer)
-      this.draglayer = $('<div>').attr('id', 'rcmdraglayer').css({ position:'absolute', display:'none', 'z-index':2000 }).appendTo(document.body);
-
-    // get subjects of selectedd messages
-    var names = '';
-    var c, i, node, subject, obj;
-    for(var n=0; n<this.selection.length; n++)
-    {
-      if (n>12)  // only show 12 lines
-      {
-        names += '...';
+      this.draglayer = $('<div>').attr('id', 'rcmdraglayer')
+        .css({ position:'absolute', display:'none', 'z-index':2000 })
+        .appendTo(document.body);
+
+    // also select childs of (collapsed) threads for dragging
+    var n, uid, selection = $.merge([], this.selection);
+    for (n in selection) {
+      uid = selection[n];
+      if (this.rows[uid].has_children && !this.rows[uid].expanded)
+        this.select_childs(uid);
+    }
+
+    // reset content
+    this.draglayer.html('');
+
+    // get subjects of selected messages
+    var c, i, n, subject, obj;
+    for (n=0; n<this.selection.length; n++) {
+      // only show 12 lines
+      if (n>12) {
+        this.draglayer.append('...');
         break;
       }
 
-      if (this.rows[this.selection[n]].obj)
-      {
-        obj = this.rows[this.selection[n]].obj;
+      if (obj = this.rows[this.selection[n]].obj) {
         subject = '';
 
-        for(c=0, i=0; i<obj.childNodes.length; i++)
-        {
-          if (obj.childNodes[i].nodeName == 'TD')
-          {
-            if (((node = obj.childNodes[i].firstChild) && (node.nodeType==3 || node.nodeName=='A')) &&
-              (this.subject_col < 0 || (this.subject_col >= 0 && this.subject_col == c)))
-            {
-             if (n == 0) {
-               if (node.nodeType == 3)
-                 this.drag_start_pos = $(obj.childNodes[i]).offset();
-               else
-                  this.drag_start_pos = $(node).offset();
-             }
-              subject = node.nodeType==3 ? node.data : node.innerHTML;
-             // remove leading spaces
-             subject = subject.replace(/^\s+/i, '');
+        for (c=0, i=0; i<obj.childNodes.length; i++) {
+             if (obj.childNodes[i].nodeName == 'TD') {
+            if (n == 0)
+                 this.drag_start_pos = $(obj.childNodes[i]).offset();
+
+               if (this.subject_col < 0 || (this.subject_col >= 0 && this.subject_col == c)) {
+                 var entry, node, tmp_node, nodes = obj.childNodes[i].childNodes;
+                 // find text node
+                 for (m=0; m<nodes.length; m++) {
+                   if ((tmp_node = obj.childNodes[i].childNodes[m]) && (tmp_node.nodeType==3 || tmp_node.nodeName=='A'))
+                     node = tmp_node;
+                 }
+
+                 if (!node)
+                   break;
+
+              subject = $(node).text();
+                 // remove leading spaces
+              subject = $.trim(subject);
               // truncate line to 50 characters
-             names += (subject.length > 50 ? subject.substring(0, 50)+'...' : subject) + '<br />';
+              subject = (subject.length > 50 ? subject.substring(0, 50) + '...' : subject);
+
+              entry = $('<div>').text(subject);
+                 this.draglayer.append(entry);
               break;
             }
             c++;
@@ -821,15 +1170,12 @@ drag_mouse_move: function(e)
       }
     }
 
-    this.draglayer.html(names);
     this.draglayer.show();
-
     this.drag_active = true;
     this.triggerEvent('dragstart');
   }
 
-  if (this.drag_active && this.draglayer)
-  {
+  if (this.drag_active && this.draglayer) {
     var pos = rcube_event.get_mouse_pos(e);
     this.draglayer.css({ left:(pos.x+20)+'px', top:(pos.y-5 + (bw.ie ? document.documentElement.scrollTop : 0))+'px' });
     this.triggerEvent('dragmove', e?e:window.event);
@@ -847,6 +1193,11 @@ drag_mouse_move: function(e)
 drag_mouse_up: function(e)
 {
   document.onmousemove = null;
+  
+  if (e.type == 'touchend') {
+    if (e.changedTouches.length != 1)
+      return rcube_event.cancel(e);
+  }
 
   if (this.draglayer && this.draglayer.is(':visible')) {
     if (this.drag_start_pos)
@@ -855,51 +1206,207 @@ drag_mouse_up: function(e)
       this.draglayer.hide();
   }
 
+  if (this.drag_active)
+    this.focus();
   this.drag_active = false;
+
+  rcube_event.remove_listener({event:'mousemove', object:this, method:'drag_mouse_move'});
+  rcube_event.remove_listener({event:'mouseup', object:this, method:'drag_mouse_up'});
+  
+  if (bw.iphone || bw.ipad) {
+    rcube_event.remove_listener({event:'touchmove', object:this, method:'drag_mouse_move'});
+    rcube_event.remove_listener({event:'touchend', object:this, method:'drag_mouse_up'});
+  }
+
+  // remove temp divs
+  this.del_dragfix();
+
   this.triggerEvent('dragend');
 
-  rcube_event.remove_listener({element:document, event:'mousemove', object:this, method:'drag_mouse_move'});
-  rcube_event.remove_listener({element:document, event:'mouseup', object:this, method:'drag_mouse_up'});
-
-  var iframes = document.getElementsByTagName('iframe');
-  for (var n in iframes) {
-    var iframedoc;
-    
-    if (iframes[n].contentDocument)
-      iframedoc = iframes[n].contentDocument;
-    else if (iframes[n].contentWindow)
-      iframedoc = iframes[n].contentWindow.document;
-    else if (iframes[n].document)
-      iframedoc = iframes[n].document;
-
-    if (iframedoc) {
-      if (this.iframe_events[n]) {
-       if (iframedoc.removeEventListener)
-         iframedoc.removeEventListener('mousemove', this.iframe_events[n], false);
-       else if (iframedoc.detachEvent)
-         iframedoc.detachEvent('onmousemove', this.iframe_events[n]);
-       else
-         iframedoc['onmousemove'] = null;
-       }
-      rcube_event.remove_listener({element:iframedoc, event:'mouseup', object:this, method:'drag_mouse_up'});
+  return rcube_event.cancel(e);
+},
+
+
+/**
+ * Handler for mouse move events for dragging list column
+ */
+column_drag_mouse_move: function(e)
+{
+  if (this.drag_start) {
+    // check mouse movement, of less than 3 pixels, don't start dragging
+    var i, m = rcube_event.get_mouse_pos(e);
+
+    if (!this.drag_mouse_start || (Math.abs(m.x - this.drag_mouse_start.x) < 3 && Math.abs(m.y - this.drag_mouse_start.y) < 3))
+      return false;
+
+    if (!this.col_draglayer) {
+      var lpos = $(this.list).offset(),
+        cells = this.list.tHead.rows[0].cells;
+
+      // create dragging layer
+      this.col_draglayer = $('<div>').attr('id', 'rcmcoldraglayer')
+        .css(lpos).css({ position:'absolute', 'z-index':2001,
+           'background-color':'white', opacity:0.75,
+           height: (this.frame.offsetHeight-2)+'px', width: (this.frame.offsetWidth-2)+'px' })
+        .appendTo(document.body)
+        // ... and column position indicator
+       .append($('<div>').attr('id', 'rcmcolumnindicator')
+          .css({ position:'absolute', 'border-right':'2px dotted #555', 
+          'z-index':2002, height: (this.frame.offsetHeight-2)+'px' }));
+
+      this.cols = [];
+      this.list_pos = this.list_min_pos = lpos.left;
+      // save columns positions
+      for (i=0; i<cells.length; i++) {
+        this.cols[i] = cells[i].offsetWidth;
+        if (this.column_fixed !== null && i <= this.column_fixed) {
+          this.list_min_pos += this.cols[i];
+        }
       }
     }
 
+    this.col_draglayer.show();
+    this.col_drag_active = true;
+    this.triggerEvent('column_dragstart');
+  }
+
+  // set column indicator position
+  if (this.col_drag_active && this.col_draglayer) {
+    var i, cpos = 0, pos = rcube_event.get_mouse_pos(e);
+
+    for (i=0; i<this.cols.length; i++) {
+      if (pos.x >= this.cols[i]/2 + this.list_pos + cpos)
+        cpos += this.cols[i];
+      else
+        break;
+    }
+
+    // handle fixed columns on left
+    if (i == 0 && this.list_min_pos > pos.x)
+      cpos = this.list_min_pos - this.list_pos;
+    // empty list needs some assignment
+    else if (!this.list.rowcount && i == this.cols.length)
+      cpos -= 2;
+    $('#rcmcolumnindicator').css({ width: cpos+'px'});
+    this.triggerEvent('column_dragmove', e?e:window.event);
+  }
+
+  this.drag_start = false;
+
+  return false;
+},
+
+
+/**
+ * Handler for mouse up events for dragging list columns
+ */
+column_drag_mouse_up: function(e)
+{
+  document.onmousemove = null;
+
+  if (this.col_draglayer) {
+    (this.col_draglayer).remove();
+    this.col_draglayer = null;
+  }
+
+  if (this.col_drag_active)
+    this.focus();
+  this.col_drag_active = false;
+
+  rcube_event.remove_listener({event:'mousemove', object:this, method:'column_drag_mouse_move'});
+  rcube_event.remove_listener({event:'mouseup', object:this, method:'column_drag_mouse_up'});
+  // remove temp divs
+  this.del_dragfix();
+
+  if (this.selected_column !== null && this.cols && this.cols.length) {
+    var i, cpos = 0, pos = rcube_event.get_mouse_pos(e);
+
+    // find destination position
+    for (i=0; i<this.cols.length; i++) {
+      if (pos.x >= this.cols[i]/2 + this.list_pos + cpos)
+        cpos += this.cols[i];
+      else
+        break;
+    }
+
+    if (i != this.selected_column && i != this.selected_column+1) {
+      this.column_replace(this.selected_column, i);
+    }
+  }
+
+  this.triggerEvent('column_dragend');
+
   return rcube_event.cancel(e);
 },
 
 
 /**
- * Creating the list in background
+ * Creates a layer for drag&drop over iframes
+ */
+add_dragfix: function()
+{
+  $('iframe').each(function() {
+    $('<div class="iframe-dragdrop-fix"></div>')
+      .css({background: '#fff',
+        width: this.offsetWidth+'px', height: this.offsetHeight+'px',
+        position: 'absolute', opacity: '0.001', zIndex: 1000
+      })
+      .css($(this).offset())
+      .appendTo(document.body);
+  });
+},
+
+
+/**
+ * Removes the layer for drag&drop over iframes
+ */
+del_dragfix: function()
+{
+  $('div.iframe-dragdrop-fix').each(function() { this.parentNode.removeChild(this); });
+},
+
+
+/**
+ * Replaces two columns
  */
-set_background_mode: function(flag)
+column_replace: function(from, to)
 {
-  if (flag) {
-    this.background = document.createElement('tbody');
-  } else if (this.background) {
-    this.list.replaceChild(this.background, this.list.tBodies[0]);
-    this.background = null;
+  var cells = this.list.tHead.rows[0].cells,
+    elem = cells[from],
+    before = cells[to],
+    td = document.createElement('td');
+
+  // replace header cells
+  if (before)
+    cells[0].parentNode.insertBefore(td, before);
+  else
+    cells[0].parentNode.appendChild(td);
+  cells[0].parentNode.replaceChild(elem, td);
+
+  // replace list cells
+  for (r=0; r<this.list.tBodies[0].rows.length; r++) {
+    row = this.list.tBodies[0].rows[r];
+
+    elem = row.cells[from];
+    before = row.cells[to];
+    td = document.createElement('td');
+
+    if (before)
+      row.insertBefore(td, before);
+    else
+      row.appendChild(td);
+    row.replaceChild(elem, td);
   }
+
+  // update subject column position
+  if (this.subject_col == from)
+    this.subject_col = to > from ? to - 1 : to;
+  else if (this.subject_col < from && to <= this.subject_col)
+    this.subject_col++;
+  else if (this.subject_col > from && to >= this.subject_col)
+    this.subject_col--;
+
+  this.triggerEvent('column_replace');
 }
 
 };
index 6df7358f67d8a68071b1e883a7d3fc5d0ececf88..d0bb76077fcaeb56d5647f7fa8ef618c5407127b 100755 (executable)
 tinyMCE.addI18n({ar:{\r
 common:{\r
-edit_confirm:"\u0647\u0644 \u062A\u0631\u064A\u062F \u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u0645\u062D\u0631\u0631 \u0644\u0645\u0631\u0628\u0639 \u0627\u0644\u0646\u0635 \u0647\u0630\u0627?",\r
-apply:"\u062A\u0637\u0628\u064A\u0642",\r
-insert:"\u0627\u062F\u0631\u0627\u062C",\r
-update:"\u062A\u062D\u062F\u064A\u062B",\r
-cancel:"\u0627\u0644\u063A\u0627\u0621 \u0627\u0644\u0623\u0645\u0631",\r
-close:"\u0627\u063A\u0644\u0627\u0642",\r
-browse:"\u0627\u0633\u062A\u0639\u0631\u0627\u0636",\r
-class_name:"\u0643\u0644\u0627\u0633",\r
-not_set:"-- \u0628\u062F\u0648\u0646 \u062A\u062D\u062F\u064A\u062F --",\r
-clipboard_msg:"\u0646\u0633\u062E/\u0642\u0635/\u0644\u0635\u0642 \u063A\u064A\u0631 \u0645\u062A\u0648\u0641\u0631\u0629 \u0644\u0645\u062A\u0635\u0641\u062D Mozilla \u0648 Firefox.\n\u0647\u0644 \u062A\u0631\u064A\u062F \u0645\u0639\u0631\u0641\u0629 \u0627\u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u062D\u0648\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u0648\u0636\u0648\u0639?",\r
-clipboard_no_support:"\u062D\u0627\u0644\u064A\u0627 \u063A\u064A\u0631 \u0645\u062F\u0639\u0645\u0648\u0645 \u0645\u0646 \u0642\u0628\u0644 \u0645\u062A\u0635\u0641\u062D\u0643, \u0627\u0633\u062A\u062E\u062F\u0645 \u0627\u062E\u062A\u0635\u0627\u0631\u0627\u062A \u0644\u0648\u062D\u0629 \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D \u0628\u062F\u0644\u0627 \u0645\u0646 \u0630\u0644\u0643.",\r
+edit_confirm:"Do you want to use the WYSIWYG mode for this textarea?",\r
+apply:"Apply",\r
+insert:"Insert",\r
+update:"Update",\r
+cancel:"Cancel",\r
+close:"Close",\r
+browse:"Browse",\r
+class_name:"Class",\r
+not_set:"-- Not set --",\r
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?",\r
+clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.",\r
 popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.",\r
-invalid_data:"\u062E\u0637\u0623: \u0627\u0644\u0642\u064A\u0645\u0629 \u0627\u0644\u0645\u062F\u062E\u0644\u0629 \u062E\u0627\u0637\u0626\u0629, \u062A\u0645 \u062A\u062D\u062F\u064A\u062F\u0647\u0627 \u0628\u0627\u0644\u0644\u0648\u0646 \u0627\u0644\u0623\u062D\u0645\u0631.",\r
-more_colors:"\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0623\u0644\u0648\u0627\u0646"\r
+invalid_data:"Error: Invalid values entered, these are marked in red.",\r
+more_colors:"More colors"\r
 },\r
 contextmenu:{\r
-align:"\u0645\u062D\u0627\u0630\u0627\u0629",\r
-left:"\u064A\u0633\u0627\u0631",\r
-center:"\u0648\u0633\u0637",\r
-right:"\u064A\u0645\u064A\u0646",\r
-full:"\u0636\u0628\u0637"\r
+align:"Alignment",\r
+left:"Left",\r
+center:"Center",\r
+right:"Right",\r
+full:"Full"\r
 },\r
 insertdatetime:{\r
 date_fmt:"%Y-%m-%d",\r
 time_fmt:"%H:%M:%S",\r
-insertdate_desc:"\u0625\u062F\u0631\u0627\u062C \u0627\u0644\u062A\u0627\u0631\u064A\u062E",\r
-inserttime_desc:"\u0625\u062F\u0631\u0627\u062C \u0627\u0644\u0648\u0642\u062A",\r
-months_long:"\u064A\u0646\u0627\u064A\u0631,\u0641\u0628\u0631\u0627\u064A\u0631,\u0645\u0627\u0631\u0633,\u0627\u0628\u0631\u064A\u0644,\u0645\u0627\u064A\u0648,\u064A\u0648\u0646\u064A\u0648,\u064A\u0648\u0644\u064A\u0648,\u0627\u063A\u0633\u0637\u0633,\u0633\u0628\u062A\u0645\u0628\u0631,\u0627\u0643\u062A\u0648\u0628\u0631,\u0646\u0648\u0641\u0645\u0628\u0631,\u062F\u064A\u0633\u0645\u0628\u0631",\r
-months_short:"\u064A\u0646\u0627\u064A\u0631,\u0641\u0628\u0631\u0627\u064A\u0631,\u0645\u0627\u0631\u0633,\u0627\u0628\u0631\u064A\u0644,\u0645\u0627\u064A\u0648,\u064A\u0648\u0646\u064A\u0648,\u064A\u0648\u0644\u064A\u0648,\u0627\u063A\u0633\u0637\u0633,\u0633\u0628\u062A\u0645\u0628\u0631,\u0627\u0643\u062A\u0648\u0628\u0631,\u0646\u0648\u0641\u0645\u0628\u0631,\u062F\u064A\u0633\u0645\u0628\u0631",\r
-day_long:"\u0627\u0644\u0623\u062D\u062F,\u0627\u0644\u0625\u062B\u0646\u064A\u0646,\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621,\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621,\u0627\u0644\u062E\u0645\u064A\u0633,\u0627\u0644\u062C\u0645\u0639\u0629,\u0627\u0644\u0633\u0628\u062A,\u0627\u0644\u0623\u062D\u062F",\r
-day_short:"\u0627\u0644\u0623\u062D\u062F,\u0627\u0644\u0625\u062B\u0646\u064A\u0646,\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621,\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621,\u0627\u0644\u062E\u0645\u064A\u0633,\u0627\u0644\u062C\u0645\u0639\u0629,\u0627\u0644\u0633\u0628\u062A,\u0627\u0644\u0623\u062D\u062F"\r
+insertdate_desc:"Insert date",\r
+inserttime_desc:"Insert time",\r
+months_long:"January,February,March,April,May,June,July,August,September,October,November,December",\r
+months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",\r
+day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday",\r
+day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"\r
 },\r
 print:{\r
-print_desc:"\u0637\u0628\u0627\u0639\u0629"\r
+print_desc:"Print"\r
 },\r
 preview:{\r
-preview_desc:"\u0645\u0639\u0627\u064A\u0646\u0629"\r
+preview_desc:"Preview"\r
 },\r
 directionality:{\r
-ltr_desc:"\u0645\u0646 \u0627\u0644\u064A\u0633\u0627\u0631 \u0627\u0644\u0649 \u0627\u0644\u064A\u0645\u064A\u0646",\r
-rtl_desc:"\u0645\u0646 \u0627\u0644\u064A\u0645\u064A\u0646 \u0627\u0644\u0649 \u0627\u0644\u064A\u0633\u0627\u0631"\r
+ltr_desc:"Direction left to right",\r
+rtl_desc:"Direction right to left"\r
 },\r
 layer:{\r
-insertlayer_desc:"\u0625\u062F\u0631\u0627\u062C \u0637\u0628\u0642\u0629 \u062C\u062F\u064A\u062F\u0629",\r
-forward_desc:"\u062A\u062D\u0631\u064A\u0643 \u0644\u0644\u0645\u0642\u062F\u0645\u0629",\r
-backward_desc:"\u062A\u062D\u0631\u064A\u0643 \u0644\u0644\u0645\u0624\u062E\u0631\u0629",\r
+insertlayer_desc:"Insert new layer",\r
+forward_desc:"Move forward",\r
+backward_desc:"Move backward",\r
 absolute_desc:"Toggle absolute positioning",\r
-content:"\u0637\u0628\u0642\u0629 \u062C\u062F\u064A\u062F\u0629..."\r
+content:"New layer..."\r
 },\r
 save:{\r
-save_desc:"\u062D\u0641\u0638",\r
-cancel_desc:"\u0627\u0644\u063A\u0627\u0621 \u062C\u0645\u064A\u0639 \u0627\u0644\u062A\u0639\u062F\u064A\u0644\u0627\u062A"\r
+save_desc:"Save",\r
+cancel_desc:"Cancel all changes"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"\u0625\u062F\u0631\u0627\u062C non-breaking space character"\r
+nonbreaking_desc:"Insert non-breaking space character"\r
 },\r
 iespell:{\r
 iespell_desc:"Run spell checking",\r
 download:"ieSpell not detected. Do you want to install it now?"\r
 },\r
 advhr:{\r
-advhr_desc:"\u062E\u0637 \u0627\u0641\u0642\u064A"\r
+advhr_desc:"Horizontal rule"\r
 },\r
 emotions:{\r
-emotions_desc:"\u0627\u0644\u0625\u0628\u062A\u0633\u0627\u0645\u0627\u062A"\r
+emotions_desc:"Emotions"\r
 },\r
 searchreplace:{\r
-search_desc:"\u0628\u062D\u062B",\r
-replace_desc:"\u0628\u062D\u062B/\u0627\u0633\u062A\u0628\u062F\u0627\u0644"\r
+search_desc:"Find",\r
+replace_desc:"Find/Replace"\r
 },\r
 advimage:{\r
-image_desc:"\u0625\u062F\u0631\u0627\u062C/\u062A\u062D\u0631\u064A\u0631 \u0635\u0648\u0631\u0629"\r
+image_desc:"Insert/edit image"\r
 },\r
 advlink:{\r
-link_desc:"\u0625\u062F\u0631\u0627\u062C/\u062A\u062D\u0631\u064A\u0631 \u0631\u0627\u0628\u0637"\r
+link_desc:"Insert/edit link"\r
 },\r
 xhtmlxtras:{\r
 cite_desc:"Citation",\r
 abbr_desc:"Abbreviation",\r
 acronym_desc:"Acronym",\r
 del_desc:"Deletion",\r
-ins_desc:"\u0625\u062F\u0631\u0627\u062Cion",\r
-attribs_desc:"\u0625\u062F\u0631\u0627\u062C/\u062A\u062D\u0631\u064A\u0631 Attributes"\r
+ins_desc:"Insertion",\r
+attribs_desc:"Insert/Edit Attributes"\r
 },\r
 style:{\r
 desc:"Edit CSS Style"\r
 },\r
 paste:{\r
-paste_text_desc:"\u0644\u0635\u0642 \u0643\u0646\u0635 \u0639\u0627\u062F\u064A",\r
-paste_word_desc:"\u0644\u0635\u0642 \u0645\u0646 \u0645\u0633\u062A\u0646\u062F \u0648\u0648\u0631\u062F",\r
-selectall_desc:"\u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0643\u0644"\r
+paste_text_desc:"Paste as Plain Text",\r
+paste_word_desc:"Paste from Word",\r
+selectall_desc:"Select All",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
-text_title:"\u0627\u0633\u062A\u062E\u062F\u0645 CTRL+V \u0641\u064A \u0644\u0648\u062D\u0629 \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D \u0644\u0644\u0635\u0642 \u0627\u0644\u0646\u0635\u0641 \u0641\u064A \u0627\u0644\u0646\u0627\u0641\u0630\u0629.",\r
-text_linebreaks:"\u0627\u0628\u0642\u064A \u0641\u0648\u0627\u0635\u0644 \u0627\u0644\u0623\u0633\u0637\u0631",\r
-word_title:"\u0633\u062A\u062E\u062F\u0645 CTRL+V \u0641\u064A \u0644\u0648\u062D\u0629 \u0627\u0644\u0645\u0641\u0627\u062A\u064A\u062D \u0644\u0644\u0635\u0642 \u0627\u0644\u0646\u0635\u0641 \u0641\u064A \u0627\u0644\u0646\u0627\u0641\u0630\u0629."\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
 },\r
 table:{\r
-desc:"\u0625\u062F\u0631\u0627\u062C \u062C\u062F\u0648\u0644 \u062C\u062F\u064A\u062F",\r
-row_before_desc:"\u0627\u062F\u0631\u0627\u062C \u0635\u0641 \u0642\u0628\u0644",\r
-row_after_desc:"\u0627\u062F\u0631\u0627\u062C \u0635\u0641 \u0628\u0639\u062F",\r
-delete_row_desc:"\u062D\u0630\u0641 \u0635\u0641",\r
-col_before_desc:"\u0625\u062F\u0631\u0627\u062C \u0639\u0645\u0648\u062F \u0642\u0628\u0644",\r
-col_after_desc:"\u0625\u062F\u0631\u0627\u062C \u0639\u0645\u0648\u062F \u0628\u0639\u062F",\r
-delete_col_desc:"\u062D\u0630\u0641 \u0639\u0645\u0648\u062F",\r
-split_cells_desc:"\u062A\u0642\u0633\u064A\u0645 \u0627\u0644\u062E\u0644\u0627\u064A\u0627 \u0627\u0644\u0645\u062F\u0645\u0648\u062C\u0629",\r
-merge_cells_desc:"\u062F\u0645\u062C \u062E\u0644\u0627\u064A\u0627 \u0627\u0644\u062C\u062F\u0648\u0644",\r
-row_desc:"\u062E\u0635\u0627\u0626\u0635 \u0635\u0641 \u0627\u0644\u062C\u062F\u0648\u0644",\r
-cell_desc:"\u062E\u0635\u0627\u0626\u0635 \u062E\u0644\u064A\u0629 \u0627\u0644\u062C\u062F\u0648\u0644",\r
-props_desc:"\u062E\u0635\u0627\u0626\u0635 \u0627\u0644\u062C\u062F\u0648\u0644",\r
-paste_row_before_desc:"\u0644\u0635\u0642 table row before",\r
-paste_row_after_desc:"\u0644\u0635\u0642 table row after",\r
-cut_row_desc:"\u0642\u0635 \u0635\u0641",\r
-copy_row_desc:"\u0646\u0633\u062E \u0635\u0641",\r
-del:"\u062D\u0630\u0641 \u062C\u062F\u0648\u0644",\r
-row:"\u0635\u0641",\r
-col:"\u0639\u0645\u0648\u062F",\r
-cell:"\u062E\u0644\u064A\u0629"\r
+desc:"Inserts a new table",\r
+row_before_desc:"Insert row before",\r
+row_after_desc:"Insert row after",\r
+delete_row_desc:"Delete row",\r
+col_before_desc:"Insert column before",\r
+col_after_desc:"Insert column after",\r
+delete_col_desc:"Remove column",\r
+split_cells_desc:"Split merged table cells",\r
+merge_cells_desc:"Merge table cells",\r
+row_desc:"Table row properties",\r
+cell_desc:"Table cell properties",\r
+props_desc:"Table properties",\r
+paste_row_before_desc:"Paste table row before",\r
+paste_row_after_desc:"Paste table row after",\r
+cut_row_desc:"Cut table row",\r
+copy_row_desc:"Copy table row",\r
+del:"Delete table",\r
+row:"Row",\r
+col:"Column",\r
+cell:"Cell"\r
 },\r
 autosave:{\r
-unload_msg:"The changes you made will be lost if you navigate away from this page."\r
+unload_msg:"The changes you made will be lost if you navigate away from this page.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Toggle fullscreen mode"\r
 },\r
 media:{\r
-desc:"\u0625\u062F\u0631\u0627\u062C / edit embedded media",\r
+desc:"Insert / edit embedded media",\r
 edit:"Edit embedded media"\r
 },\r
 fullpage:{\r
-desc:"\u062E\u0635\u0627\u0626\u0635 \u0627\u0644\u0645\u0633\u062A\u0646\u062F"\r
+desc:"Document properties"\r
 },\r
 template:{\r
-desc:"\u0625\u062F\u0631\u0627\u062C predefined template content"\r
+desc:"Insert predefined template content"\r
 },\r
 visualchars:{\r
-desc:"Visual control characters \u062A\u0634\u063A\u064A\u0644/\u0627\u064A\u0642\u0627\u0641."\r
+desc:"Visual control characters on/off."\r
 },\r
 spellchecker:{\r
-desc:"\u0627\u0644\u0645\u062F\u0642\u0642 \u0627\u0644\u0625\u0645\u0644\u0627\u0626\u064A",\r
-menu:"\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u0645\u062F\u0642\u0642 \u0627\u0644\u0625\u0645\u0644\u0627\u0626\u064A",\r
-ignore_word:"\u062A\u062C\u0627\u0647\u0644 \u0627\u0644\u0643\u0644\u0645\u0629",\r
-ignore_words:"\u062A\u062C\u0627\u0647\u0644 \u0627\u0644\u0643\u0644",\r
-langs:"\u0627\u0644\u0644\u063A\u0627\u062A",\r
-wait:"\u0627\u0644\u0631\u062C\u0627\u0621 \u0627\u0644\u0625\u0646\u062A\u0638\u0627\u0631...",\r
-sug:"\u0627\u0644\u0625\u0642\u062A\u0631\u0627\u062D\u0627\u062A",\r
-no_sug:"\u0644\u0627 \u064A\u0648\u062C\u062F \u0627\u0642\u062A\u0631\u0627\u062D\u0627\u062A",\r
-no_mpell:"\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 \u0623\u062E\u0637\u0627\u0621 \u0625\u0645\u0644\u0627\u0626\u064A\u0629."\r
+desc:"Toggle spellchecker",\r
+menu:"Spellchecker settings",\r
+ignore_word:"Ignore word",\r
+ignore_words:"Ignore all",\r
+langs:"Languages",\r
+wait:"Please wait...",\r
+sug:"Suggestions",\r
+no_sug:"No suggestions",\r
+no_mpell:"No misspellings found."\r
 },\r
 pagebreak:{\r
-desc:"\u0625\u062F\u0631\u0627\u062C \u0641\u0627\u0635\u0644 \u0627\u0644\u0635\u0641\u062D\u0627\u062A"\r
+desc:"Insert page break."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/az.js b/program/js/tiny_mce/langs/az.js
new file mode 100644 (file)
index 0000000..c2eff3c
--- /dev/null
@@ -0,0 +1,171 @@
+tinyMCE.addI18n({az:{\r
+common:{\r
+edit_confirm:"Siz haz\u0131rki m\u0259tn sah\u0259si \u00FC\u00E7\u00FCn WYSIWYG rejimi istifad\u0259 etm\u0259k ist\u0259yirsiniz?",\r
+apply:"T\u0259tbiq et",\r
+insert:"\u018Flav\u0259 et",\r
+update:"Yenil\u0259",\r
+cancel:"L\u0259\u011Fv et",\r
+close:"Ba\u011Fla",\r
+browse:"G\u00F6zd\u0259n ke\u00E7ir",\r
+class_name:"Sinif",\r
+not_set:"-- M\u00FC\u0259yy\u0259n edilm\u0259yib --",\r
+clipboard_msg:"Kopyalama/\u018Flav\u0259 et Mozilla v\u0259 Firefox-da i\u015Fl\u0259mir.\nN\u0259 ba\u015F verdiyi haqda daha \u0259trafl\u0131 \u00F6yr\u0259nm\u0259k ist\u0259yirsiniz?",\r
+clipboard_no_support:"Hal-haz\u0131rda b\u0259l\u0259d\u00E7iniz t\u0259r\u0259find\u0259n d\u0259st\u0259kl\u0259nmir. Klaviatura q\u0131saldmas\u0131ndan istifad\u0259 edin.",\r
+popup_blocked:"Ba\u011F\u0131\u015Flay\u0131n, lakin sizin \u00FCz\u0259 \u00E7\u0131xan p\u0259nc\u0259r\u0259l\u0259riniz funksiya p\u0259nc\u0259r\u0259sinin qar\u015F\u0131s\u0131n\u0131 ald\u0131. G\u0259r\u0259k \u00FCz\u0259 \u00E7\u0131xan p\u0259nc\u0259r\u0259l\u0259rin bloklama nizamlamas\u0131n\u0131 l\u0259\u011Fv ed\u0259siniz ki, al\u0259td\u0259n tam istifad\u0259 ed\u0259 bil\u0259siniz.",\r
+invalid_data:"X\u0259ta: Q\u0131rm\u0131z\u0131 il\u0259 qeyd edilmi\u015Fl\u0259r s\u0259hv daxil edilib.",\r
+more_colors:"Daha \u00E7ox r\u0259ng"\r
+},\r
+contextmenu:{\r
+align:"Tarazla\u015Fd\u0131r",\r
+left:"Sola",\r
+center:"M\u0259rk\u0259z il\u0259",\r
+right:"Sa\u011Fa",\r
+full:"Tam"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%d-%m-%Y",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Tarix \u0259lav\u0259 et",\r
+inserttime_desc:"Vaxt \u0259lav\u0259 et",\r
+months_long:"Yanvar,Fevral,Mart,Aprel,May,\u0130yun,\u0130yul,Avqust,Sentyabr,Oktyabr,Noyabr,Dekabr",\r
+months_short:"Yan,Fev,Mar,Apr,May,\u0130yu,\u0130yl,Avq,Sen,Okt,Noy,Dek",\r
+day_long:"Bazar,Bazar ert\u0259si,\u00C7\u0259r\u015F\u0259nb\u0259 ax\u015Fam\u0131,\u00C7\u0259r\u015F\u0259nb\u0259,C\u00FCm\u0259 ax\u015Fam\u0131,C\u00FCm\u0259,\u015E\u0259nb\u0259,Bazar",\r
+day_short:"B,Be,\u00C7a,\u00C7,Ca,C,\u015E,B"\r
+},\r
+print:{\r
+print_desc:"\u00C7ap et"\r
+},\r
+preview:{\r
+preview_desc:"\u0130lkin bax\u0131\u015F"\r
+},\r
+directionality:{\r
+ltr_desc:"\u0130stiqam\u0259t soldan-sa\u011Fa",\r
+rtl_desc:"\u0130stiqam\u0259t sa\u011Fdan-sola"\r
+},\r
+layer:{\r
+insertlayer_desc:"Yeni qat \u0259lav\u0259 et",\r
+forward_desc:"\u0130r\u0259li k\u00F6\u00E7\u00FCr",\r
+backward_desc:"Geri k\u00F6\u00E7\u00FCr",\r
+absolute_desc:"M\u00FCtl\u0259q m\u00F6vqeni yand\u0131r/s\u00F6nd\u00FCr",\r
+content:"Yeni qat..."\r
+},\r
+save:{\r
+save_desc:"Yadda saxla",\r
+cancel_desc:"B\u00FCt\u00FCn d\u0259yi\u015Fiklikl\u0259ri l\u0259\u011Fv et"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"Q\u0131r\u0131lmaz bo\u015Fluq \u0259lav\u0259 et"\r
+},\r
+iespell:{\r
+iespell_desc:"Orfoqrafiyan\u0131 yoxla",\r
+download:"ieSpell a\u015Fkar edilm\u0259yib. Y\u00FCkl\u0259nilsin?"\r
+},\r
+advhr:{\r
+advhr_desc:"\u00DCf\u00FCqi x\u0259tt"\r
+},\r
+emotions:{\r
+emotions_desc:"Smayllar"\r
+},\r
+searchreplace:{\r
+search_desc:"Axtar",\r
+replace_desc:"Axtar/D\u0259yi\u015F"\r
+},\r
+advimage:{\r
+image_desc:"\u015E\u0259kli \u0259lav\u0259/redakt\u0259 et"\r
+},\r
+advlink:{\r
+link_desc:"Ke\u00E7idi \u0259lav\u0259/redakt\u0259 et"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Sitat",\r
+abbr_desc:"Abbreviatura",\r
+acronym_desc:"Akronim",\r
+del_desc:"Silinmi\u015F m\u0259tn",\r
+ins_desc:"\u018Flav\u0259 edilmi\u015F m\u0259tn",\r
+attribs_desc:"Atribut \u0259lav\u0259/redakt\u0259 et"\r
+},\r
+style:{\r
+desc:"CSS stili redakt\u0259 et",\r
+delta_width:"35"\r
+},\r
+paste:{\r
+paste_text_desc:"Sad\u0259 m\u0259tn kimi \u0259lav\u0259 et",\r
+paste_word_desc:"Word-d\u0259n \u0259lav\u0259 et",\r
+selectall_desc:"Ham\u0131s\u0131n\u0131 se\u00E7",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"P\u0259nc\u0259r\u0259y\u0259 m\u0259tn \u0259lav\u0259 etm\u0259k \u00FC\u00E7\u00FCn CTRL+V klavi\u015F birl\u0259\u015Fm\u0259sini istifad\u0259 edin.",\r
+text_linebreaks:"S\u0259tr s\u0131nmalar\u0131n\u0131 saxla",\r
+word_title:"P\u0259nc\u0259r\u0259y\u0259 s\u00F6z \u0259lav\u0259 etm\u0259k \u00FC\u00E7\u00FCn CTRL+V klavi\u015F birl\u0259\u015Fm\u0259sini istifad\u0259 edin."\r
+},\r
+table:{\r
+desc:"Yeni c\u0259dv\u0259l \u0259lav\u0259 et",\r
+row_before_desc:"S\u0259tri \u0259vv\u0259l \u0259lav\u0259 et:",\r
+row_after_desc:"S\u0259tri sonra \u0259vv\u0259l et:",\r
+delete_row_desc:"S\u0259tri sil",\r
+col_before_desc:"S\u00FCtunu \u0259vv\u0259l \u0259lav\u0259 et:",\r
+col_after_desc:"S\u00FCtunu sonra \u0259lav\u0259 et:",\r
+delete_col_desc:"S\u00FCtunu sil",\r
+split_cells_desc:"S\u00FCz\u00FClm\u00FC\u015F \u00F6z\u0259kl\u0259ri ay\u0131r",\r
+merge_cells_desc:"\u00D6z\u0259kl\u0259ri s\u00FCz",\r
+row_desc:"S\u0259tr x\u00FCsusiyy\u0259tl\u0259ri",\r
+cell_desc:"\u00D6z\u0259k x\u00FCsusiyy\u0259tl\u0259ri",\r
+props_desc:"C\u0259dv\u0259l x\u00FCsusiyy\u0259tl\u0259ri",\r
+paste_row_before_desc:"S\u0259tr c\u0259dv\u0259lini \u0259vv\u0259l \u0259lav\u0259 et:",\r
+paste_row_after_desc:"S\u0259tr c\u0259dv\u0259lini sonra \u0259lav\u0259 et:",\r
+cut_row_desc:"S\u0259tri k\u0259s",\r
+copy_row_desc:"S\u0259tri kopyala",\r
+del:"C\u0259dv\u0259li sil",\r
+row:"S\u0259tr",\r
+col:"S\u00FCtun",\r
+cell:"\u00D6z\u0259k"\r
+},\r
+autosave:{\r
+unload_msg:"\u018Fg\u0259r s\u0259hif\u0259d\u0259n gets\u0259niz b\u00FCt\u00FCn d\u0259yi\u015Fiklikl\u0259r itiril\u0259c\u0259k.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"Tamekran rejimini yand\u0131r/s\u00F6nd\u00FCr"\r
+},\r
+media:{\r
+desc:"mediya-obyekti \u0259lav\u0259/redakt\u0259 et",\r
+edit:"Mediya-obyekti redakt\u0259 et"\r
+},\r
+fullpage:{\r
+desc:"S\u0259n\u0259d nizamlamalar\u0131"\r
+},\r
+template:{\r
+desc:"\u018Fvv\u0259ld\u0259n m\u00FC\u0259yy\u0259n edil\u0259n \u015Fablon daxil et"\r
+},\r
+visualchars:{\r
+desc:"Vizual idar\u0259 xarakterl\u0259rini yand\u0131r/s\u00F6nd\u00FCr."\r
+},\r
+spellchecker:{\r
+desc:"Orfoqraf\u0131 yoxla",\r
+menu:"Orfoqrafiya nizamlamas\u0131n\u0131",\r
+ignore_word:"S\u00F6zl\u00FC iqnor et",\r
+ignore_words:"H\u0259r \u015Feyi iqnor et",\r
+langs:"Dill\u0259r",\r
+wait:"Z\u0259hm\u0259t olmasa, g\u00F6zl\u0259yin...",\r
+sug:"Variantlar",\r
+no_sug:"Variantlar yoxdur",\r
+no_mpell:"X\u0259ta a\u015Fkar edilm\u0259di."\r
+},\r
+pagebreak:{\r
+desc:"S\u0259hif\u0259 b\u00F6l\u0259nini \u0259lav\u0259 et."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
index d964f99a356d4f0c4f9a78f82baf20e4f8ea5905..64f73e923f17c880f1821f840dc4fe5998f41816 100755 (executable)
@@ -1,7 +1,7 @@
 tinyMCE.addI18n({bg:{\r
 common:{\r
 edit_confirm:"\u0418\u0441\u043A\u0430\u0442\u0435 \u043B\u0438 \u0434\u0430 \u0438\u0437\u043F\u043E\u043B\u0437\u0432\u0430\u0442\u0435 WYSIWYG \u0440\u0435\u0436\u0438\u043C \u0437\u0430 \u0442\u043E\u0432\u0430 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u043E \u043F\u043E\u043B\u0435?",\r
-apply:"\u041F\u043E\u044A\u0432\u044A\u0440\u0434\u0438",\r
+apply:"\u041F\u043E\u0442\u0432\u044A\u0440\u0434\u0438",\r
 insert:"\u0412\u043C\u044A\u043A\u043D\u0438",\r
 update:"\u041E\u0431\u043D\u043E\u0432\u0438",\r
 cancel:"\u041E\u0442\u043A\u0430\u0436\u0438",\r
@@ -90,7 +90,9 @@ desc:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u0430\u0439 CSS \u0441\u0
 paste:{\r
 paste_text_desc:"\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u043A\u0430\u0442\u043E \u0442\u0435\u043A\u0441\u0442",\r
 paste_word_desc:"\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u043E\u0442 Word",\r
-selectall_desc:"\u0418\u0437\u0431\u0435\u0440\u0438 \u0432\u0441\u0438\u0447\u043A\u0438"\r
+selectall_desc:"\u0418\u0437\u0431\u0435\u0440\u0438 \u0432\u0441\u0438\u0447\u043A\u0438",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"\u0418\u0437\u043F\u043E\u043B\u0437\u0432\u0430\u0439\u0442\u0435 CTRL+V \u043D\u0430 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430\u0442\u0430 \u0437\u0430 \u0434\u0430 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u043F\u0440\u043E\u0437\u043E\u0440\u0435\u0446\u0430.",\r
@@ -120,7 +122,9 @@ col:"\u041A\u043E\u043B\u043E\u043D\u0430",
 cell:"\u041A\u043B\u0435\u0442\u043A\u0430"\r
 },\r
 autosave:{\r
-unload_msg:"\u041F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u043A\u043E\u0438\u0442\u043E \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0445\u0442\u0435 \u0449\u0435 \u0441\u0435 \u0437\u0430\u0433\u0443\u0431\u044F\u0442 \u0430\u043A\u043E \u043E\u0442\u0438\u0434\u0435\u0442\u0435 \u043D\u0430 \u0434\u0440\u0443\u0433\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430."\r
+unload_msg:"\u041F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u043A\u043E\u0438\u0442\u043E \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0445\u0442\u0435 \u0449\u0435 \u0441\u0435 \u0437\u0430\u0433\u0443\u0431\u044F\u0442 \u0430\u043A\u043E \u043E\u0442\u0438\u0434\u0435\u0442\u0435 \u043D\u0430 \u0434\u0440\u0443\u0433\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"\u0412\u043A\u043B./\u0418\u0437\u043A\u043B. \u0446\u044F\u043B \u0435\u043A\u0440\u0430\u043D"\r
@@ -151,4 +155,16 @@ no_mpell:"\u041D\u044F\u043C\u0430 \u0433\u0440\u0435\u0448\u043D\u043E \u043D\u
 },\r
 pagebreak:{\r
 desc:"\u0412\u043C\u044A\u043A\u043D\u0438 \u043D\u043E\u0432\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/bn.js b/program/js/tiny_mce/langs/bn.js
new file mode 100644 (file)
index 0000000..701b39e
--- /dev/null
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({bn:{\r
+common:{\r
+edit_confirm:"\u0986\u09AA\u09A8\u09BF \u0995\u09BF \u098F\u0987 textarea\u099F\u09BF\u09B0 \u099C\u09A8\u09CD\u09AF WYSIWYG \u09AE\u09CB\u09A1 \u09AC\u09CD\u09AF\u09AC\u09B9\u09BE\u09B0 \u0995\u09B0\u09A4\u09C7 \u099A\u09BE\u09A8?",\r
+apply:"\u098F\u09AA\u09CD\u09B2\u09CD\u09AF\u09BE\u0987",\r
+insert:"\u0987\u09A8\u09B8\u09BE\u09B0\u09CD\u099F",\r
+update:"\u0986\u09AA\u09A1\u09C7\u099F",\r
+cancel:"\u0995\u09CD\u09AF\u09BE\u09A8\u09B8\u09C7\u09B2",\r
+close:"\u09AC\u09A8\u09CD\u09A7",\r
+browse:"\u09AC\u09CD\u09B0\u09BE\u0989\u099C",\r
+class_name:"\u0995\u09CD\u09B2\u09BE\u09B8",\r
+not_set:"-- \u09B8\u09C7\u099F \u09A8\u09DF --",\r
+clipboard_msg:"\u0995\u09AA\u09BF/\u0995\u09BE\u099F/\u09AA\u09C7\u09B7\u09CD\u099F \u09AE\u099C\u09BF\u09B2\u09BE \u098F\u09AC\u0982 \u09AB\u09BE\u09DF\u09BE\u09B0\u09AB\u0995\u09CD\u09B8 \u098F \u09B8\u09AE\u09CD\u09AD\u09AC \u09A8\u09DF\n\u0986\u09AA\u09A8\u09BF \u0995\u09BF \u098F\u0987 \u09AC\u09BF\u09B7\u09DF\u099F\u09BF\u09B0 \u09B8\u09AE\u09CD\u09AC\u09A8\u09CD\u09A7\u09C7 \u0986\u09B0\u0993 \u09AC\u09C7\u09B6\u09BF \u09A4\u09A5\u09CD\u09AF \u099A\u09BE\u09A8",\r
+clipboard_no_support:"\u0986\u09AA\u09A8\u09BE\u09B0 \u09AC\u09CD\u09B0\u09BE\u0989\u099C\u09BE\u09B0\u09C7\u09B0 \u09A6\u09CD\u09AC\u09BE\u09B0\u09BE \u09AC\u09B0\u09CD\u09A4\u09AE\u09BE\u09A8\u09C7 \u09B8\u09AE\u09B0\u09CD\u09A5\u09BF\u09A4 \u09A8\u09BE, \u09AA\u09B0\u09BF\u09AC\u09B0\u09CD\u09A4\u09C7 \u0995\u09C0\u09AC\u09CB\u09B0\u09CD\u09A1 \u09B6\u09B0\u09CD\u099F\u0995\u09BE\u099F  \u09AC\u09CD\u09AF\u09AC\u09B9\u09BE\u09B0 \u0995\u09B0\u09C1\u09A8\u0964",\r
+popup_blocked:"\u09A6\u09C1\u0983\u0996\u09BF\u09A4, \u0995\u09BF\u09A8\u09CD\u09A4\u09C1 \u0986\u09AE\u09B0\u09BE \u09B2\u0995\u09CD\u09B7\u09CD\u09AF \u0995\u09B0\u09C7\u099B\u09BF \u09AF\u09C7 \u0986\u09AA\u09A8\u09BE\u09B0 \u09AA\u09AA-\u0986\u09AA \u09AC\u09CD\u09B2\u0995\u09BE\u09B0 \u098F\u0995\u099F\u09BF \u0989\u0987\u09A8\u09CD\u09A1\u09CB \u09A8\u09BF\u09B7\u09CD\u0995\u09CD\u09B0\u09BF\u09DF \u0995\u09B0\u09C7\u099B\u09C7 \u09AF\u09BE \u0985\u09CD\u09AF\u09BE\u09AA\u09B2\u09BF\u0995\u09C7\u09B6\u09A8 \u098F\u09B0 \u09AB\u09BE\u0982\u09B6\u09A8\u09BE\u09B2\u09BF\u099F\u09BF\u09B0 \u099C\u09A8\u09CD\u09AF \u09AA\u09CD\u09B0\u09DF\u09CB\u099C\u09A8\u09C0\u09DF\u0964\u0986\u09AA\u09A8\u09BF \u098F\u0987 \u099F\u09C1\u09B2\u099F\u09BF \u09B8\u09AE\u09CD\u09AA\u09C2\u09B0\u09CD\u09A3\u09AD\u09BE\u09AC\u09C7 \u09AC\u09CD\u09AF\u09BE\u09AC\u09B9\u09BE\u09B0 \u0995\u09B0\u09A4\u09C7 \u099A\u09BE\u0987\u09B2\u09C7 \u098F\u0987 \u09B8\u09BE\u0987\u099F\u099F\u09BF \u09A5\u09C7\u0995\u09C7 \u09AA\u09AA-\u0986\u09AA \u09AC\u09CD\u09B2\u0995\u09BF\u0982 \u09A8\u09BF\u09B7\u09CD\u0995\u09CD\u09B0\u09BF\u09DF \u0995\u09B0\u09A4\u09C7 \u09B9\u09AC\u09C7\u0964",\r
+invalid_data:"\u09A4\u09CD\u09B0\u09C1\u099F\u09BF: \u09AC\u09C7\u09A0\u09BF\u0995 \u09AE\u09BE\u09A8 \u09A2\u09C1\u0995\u09BE\u09A8\u09CB \u09B9\u09DF\u09C7\u099B\u09C7, \u098F\u0987\u0997\u09C1\u09B2\u09BF \u09B2\u09BE\u09B2 \u099A\u09BF\u09B9\u09CD\u09A8\u09BF\u09A4 \u0995\u09B0\u09BE \u09B9\u09B2\u0964",\r
+more_colors:"\u0986\u09B0\u0993 \u09AC\u09C7\u09B6\u09BF \u09B0\u0982"\r
+},\r
+contextmenu:{\r
+align:"Alignment",\r
+left:"Left",\r
+center:"Center",\r
+right:"Right",\r
+full:"Full"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%Y-%m-%d",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Insert date",\r
+inserttime_desc:"Insert time",\r
+months_long:"January,February,March,April,May,June,July,August,September,October,November,December",\r
+months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",\r
+day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday",\r
+day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"\r
+},\r
+print:{\r
+print_desc:"Print"\r
+},\r
+preview:{\r
+preview_desc:"Preview"\r
+},\r
+directionality:{\r
+ltr_desc:"Direction left to right",\r
+rtl_desc:"Direction right to left"\r
+},\r
+layer:{\r
+insertlayer_desc:"Insert new layer",\r
+forward_desc:"Move forward",\r
+backward_desc:"Move backward",\r
+absolute_desc:"Toggle absolute positioning",\r
+content:"New layer..."\r
+},\r
+save:{\r
+save_desc:"Save",\r
+cancel_desc:"Cancel all changes"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"Insert non-breaking space character"\r
+},\r
+iespell:{\r
+iespell_desc:"Run spell checking",\r
+download:"ieSpell not detected. Do you want to install it now?"\r
+},\r
+advhr:{\r
+advhr_desc:"Horizontal rule"\r
+},\r
+emotions:{\r
+emotions_desc:"Emotions"\r
+},\r
+searchreplace:{\r
+search_desc:"Find",\r
+replace_desc:"Find/Replace"\r
+},\r
+advimage:{\r
+image_desc:"Insert/edit image"\r
+},\r
+advlink:{\r
+link_desc:"Insert/edit link"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Citation",\r
+abbr_desc:"Abbreviation",\r
+acronym_desc:"Acronym",\r
+del_desc:"Deletion",\r
+ins_desc:"Insertion",\r
+attribs_desc:"Insert/Edit Attributes"\r
+},\r
+style:{\r
+desc:"Edit CSS Style"\r
+},\r
+paste:{\r
+paste_text_desc:"Paste as Plain Text",\r
+paste_word_desc:"Paste from Word",\r
+selectall_desc:"Select All",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+},\r
+table:{\r
+desc:"Inserts a new table",\r
+row_before_desc:"Insert row before",\r
+row_after_desc:"Insert row after",\r
+delete_row_desc:"Delete row",\r
+col_before_desc:"Insert column before",\r
+col_after_desc:"Insert column after",\r
+delete_col_desc:"Remove column",\r
+split_cells_desc:"Split merged table cells",\r
+merge_cells_desc:"Merge table cells",\r
+row_desc:"Table row properties",\r
+cell_desc:"Table cell properties",\r
+props_desc:"Table properties",\r
+paste_row_before_desc:"Paste table row before",\r
+paste_row_after_desc:"Paste table row after",\r
+cut_row_desc:"Cut table row",\r
+copy_row_desc:"Copy table row",\r
+del:"Delete table",\r
+row:"Row",\r
+col:"Column",\r
+cell:"Cell"\r
+},\r
+autosave:{\r
+unload_msg:"The changes you made will be lost if you navigate away from this page.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"Toggle fullscreen mode"\r
+},\r
+media:{\r
+desc:"Insert / edit embedded media",\r
+edit:"Edit embedded media"\r
+},\r
+fullpage:{\r
+desc:"Document properties"\r
+},\r
+template:{\r
+desc:"Insert predefined template content"\r
+},\r
+visualchars:{\r
+desc:"Visual control characters on/off."\r
+},\r
+spellchecker:{\r
+desc:"Toggle spellchecker",\r
+menu:"Spellchecker settings",\r
+ignore_word:"Ignore word",\r
+ignore_words:"Ignore all",\r
+langs:"Languages",\r
+wait:"Please wait...",\r
+sug:"Suggestions",\r
+no_sug:"No suggestions",\r
+no_mpell:"No misspellings found."\r
+},\r
+pagebreak:{\r
+desc:"Insert page break."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/br.js b/program/js/tiny_mce/langs/br.js
new file mode 100644 (file)
index 0000000..7d3ca64
--- /dev/null
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({br:{\r
+common:{\r
+edit_confirm:"Deseja usar o modo de edi\u00E7\u00E3o avan\u00E7ado neste campo de texto?",\r
+apply:"Aplicar",\r
+insert:"Inserir",\r
+update:"Atualizar",\r
+cancel:"Cancelar",\r
+close:"Fechar",\r
+browse:"Procurar",\r
+class_name:"Classe",\r
+not_set:"-- N\u00E3o especificado --",\r
+clipboard_msg:"Copiar/cortar/colar n\u00E3o est\u00E1 dispon\u00EDvel no Mozilla/Firefox.\nDeseja mais informa\u00E7\u00F5es sobre este problema?",\r
+clipboard_no_support:"O seu navegador n\u00E3o tem suporte para esta fun\u00E7\u00E3o, use os atalhos do teclado.",\r
+popup_blocked:"Detectamos que o seu bloqueador de popups bloqueou uma janela que \u00E9 essencial para o aplicativo. Voc\u00EA precisa desativar o bloqueador de popups para utilizar esta ferramenta.",\r
+invalid_data:"Erro: Valores inv\u00E1lidos est\u00E3o marcados em vermelho.",\r
+more_colors:"Mais Cores"\r
+},\r
+contextmenu:{\r
+align:"Alinhamento",\r
+left:"Esquerda",\r
+center:"Centro",\r
+right:"Direita",\r
+full:"Justificar"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%d-%m-%Y",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Inserir data",\r
+inserttime_desc:"Inserir hora",\r
+months_long:"Janeiro,Fevereiro,Mar\u00E7o,Abril,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro",\r
+months_short:"Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez",\r
+day_long:"Domingo,Segunda-Feira,Ter\u00E7a-Feira,Quarta-Feira,Quinta-Feira,Sexta-Feira,S\u00E1bado,Domingo",\r
+day_short:"Dom,Seg,Ter,Qua,Qui,Sex,Sab,Dom"\r
+},\r
+print:{\r
+print_desc:"Imprimir"\r
+},\r
+preview:{\r
+preview_desc:"Pr\u00E9-Visualizar"\r
+},\r
+directionality:{\r
+ltr_desc:"Da esquerda para direita",\r
+rtl_desc:"Da direita para esquerda"\r
+},\r
+layer:{\r
+insertlayer_desc:"Inserir nova camada",\r
+forward_desc:"Mover para frente",\r
+backward_desc:"Mover para tr\u00E1s",\r
+absolute_desc:"Alternar posicionamento absoluto",\r
+content:"Nova camada..."\r
+},\r
+save:{\r
+save_desc:"Salvar",\r
+cancel_desc:"Cancelar todas as altera\u00E7\u00F5es"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"Inserir um espa\u00E7o"\r
+},\r
+iespell:{\r
+iespell_desc:"Verificar ortografia",\r
+download:"Aplicativo de ortografia n\u00E3o-detectado. Deseja instal\u00E1-lo agora?"\r
+},\r
+advhr:{\r
+advhr_desc:"Separador horizontal"\r
+},\r
+emotions:{\r
+emotions_desc:"Emoticons"\r
+},\r
+searchreplace:{\r
+search_desc:"Localizar",\r
+replace_desc:"Localizar/substituir"\r
+},\r
+advimage:{\r
+image_desc:"Inserir/editar imagem"\r
+},\r
+advlink:{\r
+link_desc:"Inserir/editar hyperlink"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Cita\u00E7\u00E3o",\r
+abbr_desc:"Abrevia\u00E7\u00E3o",\r
+acronym_desc:"Acr\u00F4nimo",\r
+del_desc:"Apagar",\r
+ins_desc:"Inserir",\r
+attribs_desc:"Inserir/Editar atributos"\r
+},\r
+style:{\r
+desc:"Editar CSS"\r
+},\r
+paste:{\r
+paste_text_desc:"Colar como texto simples",\r
+paste_word_desc:"Colar (copiado do WORD)",\r
+selectall_desc:"Selecionar tudo",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"Use CTRL+V para colar o texto na janela.",\r
+text_linebreaks:"Manter quebras de linha",\r
+word_title:"Use CTRL+V para colar o texto na janela."\r
+},\r
+table:{\r
+desc:"Inserir nova tabela",\r
+row_before_desc:"Inserir linha antes",\r
+row_after_desc:"Inserir linha depois",\r
+delete_row_desc:"Apagar linha",\r
+col_before_desc:"Inserir coluna antes",\r
+col_after_desc:"Inserir coluna depois",\r
+delete_col_desc:"Remover coluna",\r
+split_cells_desc:"Dividir c\u00E9lulas",\r
+merge_cells_desc:"Unir c\u00E9lulas",\r
+row_desc:"Propriedades das linhas",\r
+cell_desc:"Propriedades das c\u00E9lulas",\r
+props_desc:"Propriedades da tabela",\r
+paste_row_before_desc:"Colar linha antes",\r
+paste_row_after_desc:"Colar linha depois",\r
+cut_row_desc:"Cortar linha",\r
+copy_row_desc:"Copiar linha",\r
+del:"Apagar tabela",\r
+row:"Linha",\r
+col:"Coluna",\r
+cell:"C\u00E9lula"\r
+},\r
+autosave:{\r
+unload_msg:"As mudan\u00E7as efetuadas ser\u00E3o perdidas se sair desta p\u00E1gina.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"Tela Inteira"\r
+},\r
+media:{\r
+desc:"Inserir/Editar m\u00EDdia incorporada",\r
+edit:"Editar m\u00EDdia incorporada"\r
+},\r
+fullpage:{\r
+desc:"Propriedades do Documento"\r
+},\r
+template:{\r
+desc:"Inserir template"\r
+},\r
+visualchars:{\r
+desc:"Caracteres de controle visual ligado/desligado"\r
+},\r
+spellchecker:{\r
+desc:"Alternar verifica\u00E7\u00E3o ortogr\u00E1fica",\r
+menu:"Configura\u00E7\u00F5es de ortografia",\r
+ignore_word:"Ignorar palavra",\r
+ignore_words:"Ignorar tudo",\r
+langs:"Linguagens",\r
+wait:"Aguarde...",\r
+sug:"Sugest\u00F5es",\r
+no_sug:"Sem sugest\u00F5es",\r
+no_mpell:"N\u00E3o foram detectados erros de ortografia."\r
+},\r
+pagebreak:{\r
+desc:"Inserir quebra de p\u00E1gina."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
index d0ad5e02d54b28619bc419deb9e487a8fabfda79..6a22bcc6e6be2d8718a87d2a26481ae7d291ba0e 100755 (executable)
@@ -90,7 +90,9 @@ desc:"Uredi CSS"
 paste:{\r
 paste_text_desc:"Zalijepi kao obi\u010Dni tekst",\r
 paste_word_desc:"Zalijepi iz Worda",\r
-selectall_desc:"Odaberi sve"\r
+selectall_desc:"Odaberi sve",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Koristite CTRL+V na tipkovnici da zalijepite tekst u prozor.",\r
@@ -120,7 +122,9 @@ col:"Stupac",
 cell:"\u0106elija"\r
 },\r
 autosave:{\r
-unload_msg:"Promjene u dokumentu \u0107e biti izgubljene ako iza\u0111ete s ove stranice."\r
+unload_msg:"Promjene u dokumentu \u0107e biti izgubljene ako iza\u0111ete s ove stranice.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Uklju\u010Di/isklju\u010Di prikaz preko cijelog ekrana"\r
@@ -151,4 +155,16 @@ no_mpell:"Nije prona\u0111ena nijedna pravopisna gre\u0161ke."
 },\r
 pagebreak:{\r
 desc:"Umetni prijelom."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index 323bdf66620b5d3fa04dafeffb5cf0828daf3fa3..d78a8fa0125d869041a45bcf4cea68c777e81c66 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n({ca:{\r
 common:{\r
-edit_confirm:"Vols utilitzar el mode visible (WYSIWYG) per a aquesta \u00E0rea de text?",\r
+edit_confirm:"Voleu utilitzar el mode WYSIWYG?",\r
 apply:"Aplica",\r
 insert:"Insereix",\r
 update:"Actualitza",\r
@@ -8,17 +8,17 @@ cancel:"Cancel\u00B7la",
 close:"Tanca",\r
 browse:"Explora",\r
 class_name:"Classe",\r
-not_set:"-- Sense establir --",\r
-clipboard_msg:"Copia/Retalla/Enganxa no est\u00E0 disponible en Mozilla/Firefox.\nVols m\u00E9s informaci\u00F3 sobre aquest tema?",\r
-clipboard_no_support:"Actualment no est\u00E0 suportat pel teu navegador, utilitza les dreceres de teclat en lloc seu.",\r
-popup_blocked:"Ho sentim, per\u00F2 ens hem adonat que el teu bloquejador de finestres emergents ha desactivat una finestra que proporciona funcionalitat a l'aplicaci\u00F3. Haur\u00E0s de desactivar el blocatge de finestres emergents en aquest lloc per tal d'utilitzar plenament aquesta eina.",\r
-invalid_data:"Error: Has introdu\u00EFt valors incorrectes, te'ls marquem en vermell.",\r
+not_set:"-- No definit --",\r
+clipboard_msg:"Copia/Retalla/Enganxa no es troba disponible al Mozilla ni al Firefox.\nVoleu m\u00E9s informaci\u00F3 sobre aquesta q\u00FCesti\u00F3?",\r
+clipboard_no_support:"El vostre navegador actualment no ho admet, utilitzeu les dreceres de teclat.",\r
+popup_blocked:"El bloqueig de finestres emergents ha inhabilitat una finestra que proporciona funcionalitat a l\'aplicaci\u00F3. Cal que desactiveu el bloqueig de finestres emergents en aquest lloc per tal de poder utilitzar de forma completa aquesta eina.",\r
+invalid_data:"Error: heu introdu\u00EFt valors no v\u00E0lids, els marcats en vermell.",\r
 more_colors:"M\u00E9s colors"\r
 },\r
 contextmenu:{\r
 align:"Alineaci\u00F3",\r
 left:"Esquerra",\r
-center:"Centrat",\r
+center:"Centre",\r
 right:"Dreta",\r
 full:"Justificat"\r
 },\r
@@ -26,129 +26,145 @@ insertdatetime:{
 date_fmt:"%d-%m-%Y",\r
 time_fmt:"%H:%M:%S",\r
 insertdate_desc:"Insereix la data",\r
-inserttime_desc:"Insereix l'hora",\r
-months_long:"Gener,Febrer,Mar\u00E7,Abril,Maig,Juny,Juliol,Agost,Setembre,Octubre,Novembre,Desembre",\r
-months_short:"Gen,Feb,Mar,Abr,Mai,Jun,Jul,Ago,Set,Oct,Nov,Des",\r
-day_long:"Diumenge,Dilluns,Dimarts,Dimecres,Dijous,Divendres,Dissabte,Diumenge",\r
-day_short:"Dmg,Dll,Dmt,Dmc,Djs,Dvs,Dss,Dmg"\r
+inserttime_desc:"Insereix l\'hora",\r
+months_long:"Jgener,febrer,mar\u00E7,abril,maig,juny,juliol,agost,setembre,octubre,novembre,desembre",\r
+months_short:"gen.,febr.,mar\u00E7,abr.,maig,juny,jul.,ag.,set.,oct.,nov.,des.",\r
+day_long:"diumenge,dilluns,dimarts,dimecres,dijous,divendres,dissabte,diumenge",\r
+day_short:"dg.,dl.,dt.,dc.,dj.,dv.,ds.,dg."\r
 },\r
 print:{\r
 print_desc:"Imprimeix"\r
 },\r
 preview:{\r
-preview_desc:"Vista pr\u00E8via"\r
+preview_desc:"Previsualitzaci\u00F3"\r
 },\r
 directionality:{\r
-ltr_desc:"Direcci\u00F3 d'esquerra a dreta",\r
-rtl_desc:"Direcci\u00F3 de dreta a esquerra"\r
+ltr_desc:"Direcci\u00F3 esquerra a dreta",\r
+rtl_desc:"Direcci\u00F3 dreta a esquerra"\r
 },\r
 layer:{\r
-insertlayer_desc:"Insereix capa nova",\r
-forward_desc:"Despla\u00E7a endavant",\r
-backward_desc:"Despla\u00E7a endarrere",\r
-absolute_desc:"Canvia el posicionament absolut",\r
-content:"Nova capa..."\r
+insertlayer_desc:"Insereix una nova capa",\r
+forward_desc:"Mou endavant",\r
+backward_desc:"Mou endarrera",\r
+absolute_desc:"Conmuta el posicionament absolut",\r
+content:"Nova Capa..."\r
 },\r
 save:{\r
 save_desc:"Desa",\r
 cancel_desc:"Cancel\u00B7la tots els canvis"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"Insereix espai no separable"\r
+nonbreaking_desc:"Insereix un car\u00E0cter espai en blanc"\r
 },\r
 iespell:{\r
-iespell_desc:"Comprovaci\u00F3 ortogr\u00E0fica",\r
-download:"No s'ha detectat ieSpell. Vols instal\u00B7lar-lo ara?"\r
+iespell_desc:"Executa la correcci\u00F3 ortogr\u00E0fica",\r
+download:"no he detectat l\'ieSpell. Voleu instal\u00B7lar-ho?"\r
 },\r
 advhr:{\r
-advhr_desc:"Regle horitzontal"\r
+advhr_desc:"Filet horitzontal"\r
 },\r
 emotions:{\r
 emotions_desc:"Emoticones"\r
 },\r
 searchreplace:{\r
-search_desc:"Busca",\r
-replace_desc:"Busca/Substitueix"\r
+search_desc:"Cerca",\r
+replace_desc:"Cerca/Reempla\u00E7a"\r
 },\r
 advimage:{\r
 image_desc:"Insereix/edita imatge"\r
 },\r
 advlink:{\r
-link_desc:"Insereix/edita enlla\u00E7"\r
+link_desc:"Insert/edit link"\r
 },\r
 xhtmlxtras:{\r
 cite_desc:"Citaci\u00F3",\r
-abbr_desc:"Abreujament",\r
+abbr_desc:"Abreviaci\u00F3",\r
 acronym_desc:"Acr\u00F2nim",\r
-del_desc:"Supressi\u00F3",\r
+del_desc:"Eliminaci\u00F3",\r
 ins_desc:"Inserci\u00F3",\r
-attribs_desc:"Insereix/Edita Atributs"\r
+attribs_desc:"Insereix/edita atributs"\r
 },\r
 style:{\r
-desc:"Edita l'Estil CSS"\r
+desc:"Edita l\'estil CSS"\r
 },\r
 paste:{\r
-paste_text_desc:"Enganxa com a Text Planer",\r
-paste_word_desc:"Enganxa des de Word",\r
-selectall_desc:"Selecciona-ho Tot"\r
+paste_text_desc:"Enganxa com a text pla",\r
+paste_word_desc:"Enganxa des del Word",\r
+selectall_desc:"Selecciona-ho tot",\r
+plaintext_mode_sticky:"Enganxa est\u00E0 ara configurat en mode text pla. Clica de nou per tornar al mode normal d'enganxar. Despr\u00E9s d'enganxar quelcom ser\u00E0s retornat al mode normal d'enganxar.",\r
+plaintext_mode:"Enganxa est\u00E0 ara configurat en mode text pla. Clica de nou per tornar al mode normal d'enganxar."\r
 },\r
 paste_dlg:{\r
-text_title:"Utilitza CTRL+V al teclat per enganxar el text a la finestra.",\r
-text_linebreaks:"Mantingues els salts de l\u00EDnia",\r
-word_title:"Utilitza CTRL+V al teclat per enganxar el text a la finestra."\r
+text_title:"Amb el teclat utilitzeu CTRL+V per a enganxar el text dins la finestra.",\r
+text_linebreaks:"Conserva els salts de l\u00EDnia",\r
+word_title:"Amb el teclat utilitzeu CTRL+V per a enganxar el text dins la finestra."\r
 },\r
 table:{\r
 desc:"Insereix una nova taula",\r
-row_before_desc:"Insereix fila abans",\r
-row_after_desc:"Insereix fila despr\u00E9s",\r
-delete_row_desc:"Suprimeix fila",\r
-col_before_desc:"Insereix columna abans",\r
-col_after_desc:"Insereix columna despr\u00E9s",\r
-delete_col_desc:"Elimina columna",\r
-split_cells_desc:"Parteix les cel\u00B7les refoses de la taula",\r
-merge_cells_desc:"Refon les cel\u00B7les de la taula",\r
-row_desc:"Propietats de la fila de la taula",\r
-cell_desc:"Propietats de la cel\u00B7la de la taula",\r
+row_before_desc:"Insereix una fila abans",\r
+row_after_desc:"Insereix una fila despr\u00E9s",\r
+delete_row_desc:"Elimina la fila",\r
+col_before_desc:"Insereix una columna abans",\r
+col_after_desc:"Insereix una columna despr\u00E9s",\r
+delete_col_desc:"Elimina la columna",\r
+split_cells_desc:"Divideix les cel\u00B7les fusionades",\r
+merge_cells_desc:"Fusiona les cel\u00B7les",\r
+row_desc:"Propietats de la fila",\r
+cell_desc:"Propietats de la cel\u00B7la",\r
 props_desc:"Propietats de la taula",\r
-paste_row_before_desc:"Enganxa la fila de la taula abans",\r
-paste_row_after_desc:"Enganxa la fila de la taula despr\u00E9s",\r
-cut_row_desc:"Retalla la fila de la taula",\r
-copy_row_desc:"Copia la fila de la taula",\r
-del:"Suprimeix la taula",\r
+paste_row_before_desc:"Enganxa la fila abans",\r
+paste_row_after_desc:"Enganxa la fila despr\u00E9s",\r
+cut_row_desc:"Retalla la fila",\r
+copy_row_desc:"Copia la fila",\r
+del:"Elimina la taula",\r
 row:"Fila",\r
 col:"Columna",\r
 cell:"Cel\u00B7la"\r
 },\r
 autosave:{\r
-unload_msg:"Els canvis que has fet es perdran si surts d'aquesta p\u00E0gina."\r
+unload_msg:"Els canvis que heu fet es perdran si navegueu a fora d\'aquesta p\u00E0gina.",\r
+restore_content:"Restaura el contingut guardat autom\u00E0ticament.",\r
+warning_message:"Si restaures el contingut guardat, perdr\u00E0s tot el contingut actual de l'editor. Est\u00E0s segur de voler continuar?"\r
 },\r
 fullscreen:{\r
-desc:"Mode de pantalla completa"\r
+desc:"Commuta a mode de pantalla completa"\r
 },\r
 media:{\r
-desc:"Insereix / edita mitj\u00E0 encastat",\r
-edit:"Edita mitj\u00E0 encastat"\r
+desc:"Insereix / edita multim\u00E8dia incrustat",\r
+edit:"Edita multim\u00E8dia incrustat"\r
 },\r
 fullpage:{\r
 desc:"Propietats del document"\r
 },\r
 template:{\r
-desc:"Insereix contingut predefinit de plantilla"\r
+desc:"Insereix un contingut predefinit"\r
 },\r
 visualchars:{\r
-desc:"Car\u00E0cters de control visual des/activats."\r
+desc:"Activa/desactiva els car\u00E0cters de control visual."\r
 },\r
 spellchecker:{\r
-desc:"Des/activa el corrector ortogr\u00E0fic",\r
+desc:"Corrector ortogr\u00E0fic",\r
 menu:"Configuraci\u00F3 del corrector",\r
-ignore_word:"Ignora",\r
-ignore_words:"Ignora-les totes",\r
+ignore_word:"Ignora el mot",\r
+ignore_words:"Ignora\'ls tots",\r
 langs:"Idiomes",\r
-wait:"Espera, si et plau...",\r
+wait:"Espereu...",\r
 sug:"Suggeriments",\r
-no_sug:"No hi ha cap suggeriment",\r
-no_mpell:"No s'ha trobat cap incorrecci\u00F3."\r
+no_sug:"Cap suggeriment",\r
+no_mpell:"No s\'ha trobat cap falta d\'ortografia."\r
 },\r
 pagebreak:{\r
-desc:"Insereix salt de p\u00E0gina."\r
+desc:"Insereix un salt de p\u00E0gina."\r
+},\r
+advlist:{\r
+types:"Tipus",\r
+def:"Per defecte",\r
+lower_alpha:"Lletres",\r
+lower_greek:"Lletres gregues (min\u00FAscules)",\r
+lower_roman:"Nombres romans (min\u00FAscules)",\r
+upper_alpha:"Lletres (maj\u00FAscules)",\r
+upper_roman:"Nombres romans (maj\u00FAscules)",\r
+circle:"Cercle",\r
+disc:"Disc",\r
+square:"Quadrat"\r
 }}});
\ No newline at end of file
index c2d3e42da77de16f64a4b3f95f7d81b35a42cc36..d33d5c7426329f1246fb6183c17db71c09eca129 100755 (executable)
@@ -1,19 +1,19 @@
 tinyMCE.addI18n({cs:{\r
 common:{\r
-edit_confirm:"Chcete pou\u017E\u00EDt pro tento text WYSIWYG editaci?",\r
+edit_confirm:"Chcete pou\u017E\u00EDt WYSIWYG m\u00F3d pro tento text?",\r
 apply:"Pou\u017E\u00EDt",\r
 insert:"Vlo\u017Eit",\r
 update:"Aktualizovat",\r
-cancel:"Zru\u0161it",\r
+cancel:"Storno",\r
 close:"Zav\u0159\u00EDt",\r
 browse:"Proch\u00E1zet",\r
 class_name:"T\u0159\u00EDda",\r
 not_set:"- Nenastaveno -",\r
-clipboard_msg:"Funkce kop\u00EDrovat/vyjmout/vlo\u017Eit nejsou pou\u017Eiteln\u00E9 v Mozille a Firefoxu.\nChcete v\u00EDce informac\u00ED?",\r
-clipboard_no_support:"Tato funkce nen\u00ED va\u0161\u00EDm prohl\u00ED\u017Ee\u010Dem podporov\u00E1na. Pou\u017Eijte kl\u00E1vesov\u00E9 zkratky.",\r
-popup_blocked:"Blokov\u00E1n\u00ED vyskakovac\u00EDch oken neumo\u017Enilo otev\u0159\u00EDt okno, nutn\u00E9 pro funkci aplikace. Pro pln\u00E9 vyu\u017Eit\u00ED mo\u017Enost\u00ED vypn\u00C4\u009Bte blokov\u00E1n\u00ED vyskakovac\u00EDch oken pro tento web.",\r
-invalid_data:"Chyba: Vlo\u017Een\u00E1 chybn\u00E1 data jsou ozna\u010Dena \u010Derven\u011B.",\r
-more_colors:"V\u00EDce barev"\r
+clipboard_msg:"Funkce kop\u00EDrovat/vyjmout/vlo\u017Eit nejsou podporovan\u00E9 v prohl\u00ED\u017Ee\u010D\u00EDch Mozilla a Firefox.\nChcete v\u00EDce informac\u00ED o tomto probl\u00E9mu?",\r
+clipboard_no_support:"Tato funkce nen\u00ED va\u0161\u00EDm prohl\u00ED\u017Ee\u010Dem podporov\u00E1na. Pou\u017Eijte m\u00EDsto toho kl\u00E1vesov\u00E9 zkratky.",\r
+popup_blocked:"Omlouv\u00E1me se, ale blokov\u00E1n\u00ED vyskakovac\u00EDch oken neumo\u017Enilo otev\u0159\u00EDt okno, kter\u00E9 poskytuje funk\u010Dnost aplikace. Pro pln\u00E9 vyu\u017Eit\u00ED mo\u017Enost\u00ED aplikace mus\u00EDte vypnout blokov\u00E1n\u00ED vyskakovac\u00EDch oken pro tento web.",\r
+invalid_data:"Chyba: Byly zad\u00E1ny neplatn\u00E9 hodnoty a tyto byly ozna\u010Deny \u010Derven\u011B.",\r
+more_colors:"Dal\u0161\u00ED barvy"\r
 },\r
 contextmenu:{\r
 align:"Zarovn\u00E1n\u00ED",\r
@@ -33,7 +33,7 @@ day_long:"Ned\u011Ble,Pond\u011Bl\u00ED,\u00DAter\u00FD,St\u0159eda,\u010Ctvrtek
 day_short:"Ne,Po,\u00DAt,St,\u010Ct,P\u00E1,So,Ne"\r
 },\r
 print:{\r
-print_desc:"Tisknout"\r
+print_desc:"Tisk"\r
 },\r
 preview:{\r
 preview_desc:"N\u00E1hled"\r
@@ -44,9 +44,9 @@ rtl_desc:"Sm\u011Br zprava doleva"
 },\r
 layer:{\r
 insertlayer_desc:"Vlo\u017Eit novou vrstvu",\r
-forward_desc:"P\u0159esunout doP\u0159edu",\r
+forward_desc:"P\u0159esunout dop\u0159edu",\r
 backward_desc:"P\u0159esunout dozadu",\r
-absolute_desc:"P\u0159epnout absolutn\u00ED pozici",\r
+absolute_desc:"P\u0159epnout na absolutn\u00ED pozicov\u00E1n\u00ED",\r
 content:"Nov\u00E1 vrstva..."\r
 },\r
 save:{\r
@@ -54,11 +54,11 @@ save_desc:"Ulo\u017Eit",
 cancel_desc:"Zru\u0161it v\u0161echny zm\u011Bny"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"Vlo\u017Eit pevnou mezeru"\r
+nonbreaking_desc:"Vlo\u017Eit ned\u011Blitelnou mezeru"\r
 },\r
 iespell:{\r
-iespell_desc:"Kontrolovat pravopis",\r
-download:"ieSpell nebyl detekov\u00E1n. Chcete ho nainstalovat?"\r
+iespell_desc:"Spustit kontrolu pravopisu",\r
+download:"Slovn\u00EDk ieSpell nebyl detekov\u00E1n. Chcete ho nainstalovat?"\r
 },\r
 advhr:{\r
 advhr_desc:"Vodorovn\u00FD odd\u011Blova\u010D"\r
@@ -67,11 +67,12 @@ emotions:{
 emotions_desc:"Emotikony"\r
 },\r
 searchreplace:{\r
-search_desc:"Hledat",\r
+search_desc:"Naj\u00EDt",\r
 replace_desc:"Naj\u00EDt/nahradit"\r
 },\r
 advimage:{\r
-image_desc:"Vlo\u017Eit/upravit obr\u00E1zek"\r
+image_desc:"Vlo\u017Eit/upravit obr\u00E1zek",\r
+delta_width:"20"\r
 },\r
 advlink:{\r
 link_desc:"Vlo\u017Eit/upravit odkaz"\r
@@ -80,75 +81,96 @@ xhtmlxtras:{
 cite_desc:"Citace",\r
 abbr_desc:"Zkratka",\r
 acronym_desc:"Akronym",\r
-del_desc:"Vymaz\u00E1n\u00ED",\r
-ins_desc:"Vlo\u017Een\u00ED",\r
+del_desc:"Odstran\u011Bn\u00FD text",\r
+ins_desc:"P\u0159idan\u00FD text",\r
 attribs_desc:"Vlo\u017Eit/upravit atributy"\r
 },\r
 style:{\r
-desc:"Upravit CSS styl"\r
+desc:"Upravit CSS styl",\r
+delta_width:"25"\r
 },\r
 paste:{\r
-paste_text_desc:"Vlo\u017Eit prost\u00FD text",\r
+paste_text_desc:"Vlo\u017Eit jako prost\u00FD text",\r
 paste_word_desc:"Vlo\u017Eit z Wordu",\r
-selectall_desc:"Vybrat v\u0161e"\r
+selectall_desc:"Vybrat v\u0161e",\r
+plaintext_mode_sticky:"Funkce vlo\u017Eit je nyn\u00ED v re\u017Eimu prost\u00FD text. Op\u011Btovn\u00E9 kliknut\u00ED p\u0159epne tuto funkci zp\u011Bt do norm\u00E1ln\u00EDho re\u017Eimu. Po vlo\u017Een\u00ED \u010Dehokoli bude tato funkce vr\u00E1cena zp\u011Bt do norm\u00E1ln\u00EDho re\u017Eimu.",\r
+plaintext_mode:"Funkce vlo\u017Eit je nyn\u00ED v re\u017Eimu prost\u00FD text. Op\u011Btovn\u00E9 kliknut\u00ED p\u0159epne tuto funkci zp\u011Bt do norm\u00E1ln\u00EDho re\u017Eimu."\r
 },\r
 paste_dlg:{\r
 text_title:"Pou\u017Eijte CTRL+V pro vlo\u017Een\u00ED textu do okna.",\r
-text_linebreaks:"Zachovat \u0159\u00E1dkov\u00E1n\u00ED",\r
+text_linebreaks:"Zachovat zalamov\u00E1n\u00ED \u0159\u00E1dk\u016F",\r
 word_title:"Pou\u017Eijte CTRL+V pro vlo\u017Een\u00ED textu do okna."\r
 },\r
 table:{\r
 desc:"Vlo\u017Eit novou tabulku",\r
-row_before_desc:"Vlo\u017Eit \u0159\u00E1dek P\u0159ed",\r
+row_before_desc:"Vlo\u017Eit \u0159\u00E1dek p\u0159ed",\r
 row_after_desc:"Vlo\u017Eit \u0159\u00E1dek za",\r
-delete_row_desc:"Vymazat \u0159\u00E1dek",\r
-col_before_desc:"Vlo\u017Eit sloupec P\u0159ed",\r
+delete_row_desc:"Odstranit \u0159\u00E1dek tabulky",\r
+col_before_desc:"Vlo\u017Eit sloupec p\u0159ed",\r
 col_after_desc:"Vlo\u017Eit sloupec za",\r
-delete_col_desc:"Vymazat sloupec",\r
+delete_col_desc:"Odstranit sloupec tabulky",\r
 split_cells_desc:"Rozd\u011Blit bu\u0148ky",\r
 merge_cells_desc:"Slou\u010Dit bu\u0148ky",\r
-row_desc:"Vlastnosti \u0159\u00E1dku",\r
+row_desc:"Vlastnosti \u0159\u00E1dku tabulky",\r
 cell_desc:"Vlastnosti bu\u0148ky",\r
 props_desc:"Vlastnosti tabulky",\r
-paste_row_before_desc:"Vlo\u017Eit \u0159\u00E1dek P\u0159ed",\r
+paste_row_before_desc:"Vlo\u017Eit \u0159\u00E1dek p\u0159ed",\r
 paste_row_after_desc:"Vlo\u017Eit \u0159\u00E1dek za",\r
-cut_row_desc:"Vyjmout \u0159\u00E1dek",\r
-copy_row_desc:"Kop\u00EDrovat \u0159\u00E1dek",\r
-del:"Vymazat tabulku",\r
+cut_row_desc:"Vyjmout \u0159\u00E1dek tabulky",\r
+copy_row_desc:"Kop\u00EDrovat \u0159\u00E1dek tabulky",\r
+del:"Odstranit tabulku",\r
 row:"\u0158\u00E1dek",\r
 col:"Sloupec",\r
-cell:"Bu\u0148ka"\r
+cell:"Bu\u0148ka",\r
+cellprops_delta_width:"100",\r
+table_delta_width:"50"\r
 },\r
 autosave:{\r
-unload_msg:"Proveden\u00E9 zm\u011Bny mohou b\u00FDt ztraceny, jestli\u017Ee opust\u00EDte tuto str\u00E1nku."\r
+unload_msg:"Proveden\u00E9 zm\u011Bny mohou b\u00FDt ztraceny, jestli\u017Ee opust\u00EDte tuto str\u00E1nku.",\r
+restore_content:"Obnovit automaticky ulo\u017Een\u00FD obsah.",\r
+warning_message:"Pokud obnov\u00EDte ulo\u017Een\u00FD obsah, ztrat\u00EDte t\u00EDm ve\u0161ker\u00FD obsah, kter\u00FD je pr\u00E1v\u011B v okn\u011B editoru.\n\nOpravdu chcete obnovit ulo\u017Een\u00FD obsah?."\r
 },\r
 fullscreen:{\r
 desc:"P\u0159epnout na celostr\u00E1nkov\u00E9 zobrazen\u00ED"\r
 },\r
 media:{\r
-desc:"Vlo\u017Eit/editovat m\u00E9dia",\r
-edit:"Editovat m\u00E9dia"\r
+desc:"Vlo\u017Eit/upravit m\u00E9dia",\r
+edit:"Upravit m\u00E9dia",\r
+delta_width:"130"\r
 },\r
 fullpage:{\r
-desc:"Vlastnosti dokumentu"\r
+desc:"Vlastnosti dokumentu",\r
+delta_width:"110"\r
 },\r
 template:{\r
-desc:"Vlo\u017Eit P\u0159eddefinovan\u00FD obsah ze \u0161ablony"\r
+desc:"Vlo\u017Eit p\u0159eddefinovan\u00FD obsah ze \u0161ablony"\r
 },\r
 visualchars:{\r
 desc:"Zobrazen\u00ED skryt\u00FDch znak\u016F zap/vyp"\r
 },\r
 spellchecker:{\r
-desc:"Zapnout kontrolu textu",\r
-menu:"Nastaven\u00ED kontroly textu",\r
+desc:"P\u0159epnout kontrolu pravopisu",\r
+menu:"Nastaven\u00ED kontroly pravopisu",\r
 ignore_word:"Ignorovat slovo",\r
 ignore_words:"Ignorovat v\u0161e",\r
 langs:"Jazyky",\r
 wait:"\u010Cekejte pros\u00EDm...",\r
 sug:"N\u00E1pov\u011Bda",\r
-no_sug:"\u0139\u02DD\u00E1dn\u00E1 n\u00E1pov\u011Bda",\r
+no_sug:"\u017D\u00E1dn\u00E1 n\u00E1pov\u011Bda",\r
 no_mpell:"Nebyly nalezeny \u017E\u00E1dn\u00E9 chyby."\r
 },\r
 pagebreak:{\r
 desc:"Vlo\u017Eit konec str\u00E1nky"\r
+},\r
+advlist:{\r
+types:"Typ",\r
+def:"V\u00FDchoz\u00ED",\r
+lower_alpha:"Mal\u00E1 p\u00EDsmena",\r
+lower_greek:"Mal\u00E1 \u0159eck\u00E1 p\u00EDsmena",\r
+lower_roman:"Mal\u00E9 \u0159\u00EDmsk\u00E9 \u010D\u00EDslice",\r
+upper_alpha:"Velk\u00E1 p\u00EDsmena",\r
+upper_roman:"Velk\u00E9 \u0159\u00EDmsk\u00E9 \u010D\u00EDslice",\r
+circle:"Kole\u010Dko",\r
+disc:"Punt\u00EDk",\r
+square:"\u010Ctvere\u010Dek"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/cy.js b/program/js/tiny_mce/langs/cy.js
new file mode 100644 (file)
index 0000000..9da21a4
--- /dev/null
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({cy:{\r
+common:{\r
+edit_confirm:"Ydych chi eisiau defnyddio'r modd WYSIWYG ar gyfer y textarea yma?",\r
+apply:"Gosod",\r
+insert:"Mewnosod",\r
+update:"Diweddaru",\r
+cancel:"Diddymu",\r
+close:"Cau",\r
+browse:"Pori",\r
+class_name:"Dosbarth",\r
+not_set:"-- Nid wedi osod --",\r
+clipboard_msg:"Nid yw Cop\u00EFo/Torri/Gludo ar gael mewn Mozilla a Firefox.\nYdych chi eisiau mwy o wybodaeth am y mater yma?",\r
+clipboard_no_support:"Dim wedi'i gynnal gan eich porwr, defnyddiwch Currently not supported by your browser, use keyboard shortcuts instead.",\r
+popup_blocked:"Rydym wedi sylwi fod eich popup-blocker wedi analluogi ffenest sy'n darparu swyddogaeth cymhwysiad. Bydd rhaid i chi analluogi blocio popups ar gyfer y safle yma i ddefnyddio'r offeryn yma.",\r
+invalid_data:"Gwall: Gwerthau allilys wedi mewnbynnu, mae'r gwerthau yma wedi eu marcio mewn coch.",\r
+more_colors:"Mwy o liwiau"\r
+},\r
+contextmenu:{\r
+align:"Aliniad",\r
+left:"Chwith",\r
+center:"Canol",\r
+right:"De",\r
+full:"Llawn"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%Y-%m-%d",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Mewnosod dyddiad",\r
+inserttime_desc:"Mewnosod amser",\r
+months_long:"Ionawr,Chwefror,Mawrth,Ebrill,Mai,Mehefin,Goffennaf,Awst,Medi,Hydref,Tachwedd,Rhagfyr",\r
+months_short:"Ion,Chw,Maw,Ebr,Mai,Meh,Gor,Aws,Med,Hyd,Tac,Rha",\r
+day_long:"Sul,Llun,Mawrth,Mercher,Iau,Gwener,Sadwrn,Sul",\r
+day_short:"Sul,Llu,Maw,Mer,Iau,Gwe,Sad,Sul"\r
+},\r
+print:{\r
+print_desc:"Argraffu"\r
+},\r
+preview:{\r
+preview_desc:"Rhagolygu"\r
+},\r
+directionality:{\r
+ltr_desc:"Cyfeiriad chwith i'r dde",\r
+rtl_desc:"Cyfeiriad de i'r chwith"\r
+},\r
+layer:{\r
+insertlayer_desc:"Mewnosod haen newydd",\r
+forward_desc:"Symud ymlaen",\r
+backward_desc:"Symud n\u00F4l",\r
+absolute_desc:"Toglu lleoli absoliwt",\r
+content:"Haen newydd..."\r
+},\r
+save:{\r
+save_desc:"Cadw",\r
+cancel_desc:"Cadw pob newidiad"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"Mewnosod n\u00F4d bwlch do-doriad"\r
+},\r
+iespell:{\r
+iespell_desc:"Rhedeg gwirio sillafu",\r
+download:"ieSpell dim wedi'i canfod. A ydych eisiau ei gosod rwan?"\r
+},\r
+advhr:{\r
+advhr_desc:"Mesurydd llorweddol"\r
+},\r
+emotions:{\r
+emotions_desc:"Emosiwn"\r
+},\r
+searchreplace:{\r
+search_desc:"Canfod",\r
+replace_desc:"Canfod/Amnewid"\r
+},\r
+advimage:{\r
+image_desc:"Mewnosod/golygu delwedd"\r
+},\r
+advlink:{\r
+link_desc:"Mewnosod/Golygu cyswllt"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Dyfyniad",\r
+abbr_desc:"Talfyriad",\r
+acronym_desc:"Acronym",\r
+del_desc:"Dilead",\r
+ins_desc:"Mewnosodiad",\r
+attribs_desc:"Mewnosod/Golygu Priodoleddau"\r
+},\r
+style:{\r
+desc:"Golygu Arddull CSS"\r
+},\r
+paste:{\r
+paste_text_desc:"Gludo fel Testun Plaen",\r
+paste_word_desc:"Gludo o Word",\r
+selectall_desc:"Dewis Pobpeth",\r
+plaintext_mode_sticky:"Gludo rwan mewn modd testun plaen. Cliciwch eto i doglu n\u00F4l i fodd gludo normal. Byddwch yn cael eich dychwelyd i fodd gludo normal ar \u00F4l gludo rhywbeth.",\r
+plaintext_mode:"Gludo rwan mewn modd testun plaen. Cliciwch eto i doglu n\u00F4l i fodd gludo normal."\r
+},\r
+paste_dlg:{\r
+text_title:"Defnyddiwch CTRL+V ar eich bysellfwrdd i ludo'r testun i fewn i'r ffenest.",\r
+text_linebreaks:"Cadw toriadau llinell",\r
+word_title:"Defnyddiwch CTRL+V ar eich bysellfwrdd i ludo'r testun i fewn i'r ffenest."\r
+},\r
+table:{\r
+desc:"Mewnosod tabl newydd",\r
+row_before_desc:"Mewnosod rhes cyn",\r
+row_after_desc:"Mewnosod rhes ar \u00F4l",\r
+delete_row_desc:"Dileu rhes",\r
+col_before_desc:"Mewnosod colofn cyn",\r
+col_after_desc:"Mewnosod colofn ar \u00F4l",\r
+delete_col_desc:"Tynnu colofn",\r
+split_cells_desc:"Hollti celloedd tabl cyfuniedig",\r
+merge_cells_desc:"Cyfuno celloedd tabl",\r
+row_desc:"Priodweddau rhes tabl",\r
+cell_desc:"Priodweddau cell tabl",\r
+props_desc:"Priodweddau tabl",\r
+paste_row_before_desc:"Gludo rhes tabl cyn",\r
+paste_row_after_desc:"Gludo rhes tabl ar \u00F4l",\r
+cut_row_desc:"Torri rhes tabl",\r
+copy_row_desc:"Cop\u00EFo rhes tabl",\r
+del:"Dileu tabl",\r
+row:"Rhes",\r
+col:"Colofn",\r
+cell:"Cell"\r
+},\r
+autosave:{\r
+unload_msg:"Bydd eich newidiadau yn cael eu colli os byddwch yn llywio i ffwrdd o'r tudalen yma.",\r
+restore_content:"Adfer cynnwys awto-cadwedig.",\r
+warning_message:"Os adferwch chi'r cynnwys cadwedig, byddwch yn colli'r holl cynnwys sydd yn bresennol yn y golygydd.\n\nA ydych chi'n si\u0175r eich bod eisiau adfer y cynnwys cadwedig?."\r
+},\r
+fullscreen:{\r
+desc:"Toglu modd sgrin llawn"\r
+},\r
+media:{\r
+desc:"Mewnosod / golygu cyfrwng planedig",\r
+edit:"Golygu cyfrwng planedig"\r
+},\r
+fullpage:{\r
+desc:"Priodweddau dogfen"\r
+},\r
+template:{\r
+desc:"Mewnosod cynnwys templed rhagosodol"\r
+},\r
+visualchars:{\r
+desc:"Nodau rheolaeth ymlaen/i ffwrdd."\r
+},\r
+spellchecker:{\r
+desc:"Toglu cywiriadau",\r
+menu:"Gosodiadau cywiriadau",\r
+ignore_word:"Anwybyddu gair",\r
+ignore_words:"Anwybyddu pob un",\r
+langs:"Ieithoedd",\r
+wait:"Aroswch, os gwelwch yn dda...",\r
+sug:"Awgrymiadau",\r
+no_sug:"Dim awgrymiadau",\r
+no_mpell:"Dim camsillafiadau wedi'i canfod."\r
+},\r
+pagebreak:{\r
+desc:"Mewnosod toriad tudalen."\r
+},\r
+advlist:{\r
+types:"Mathau",\r
+def:"Rhagosodedig",\r
+lower_alpha:"Alffa is",\r
+lower_greek:"Groegaiddd is",\r
+lower_roman:"Rhufeinig is",\r
+upper_alpha:"Alffa uwch",\r
+upper_roman:"Rhufeinig uwch",\r
+circle:"Cylch",\r
+disc:"Disg",\r
+square:"Sgw\u00E2r"\r
+}}});
\ No newline at end of file
index 3733f2f85e1308f119ebcb65ade98134c1072ee4..7fdce82754465243592e4b39d6b5f1d92510e684 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n({da:{\r
 common:{\r
-edit_confirm:"Vil du bruge den avancerede tekst redigering?",\r
+edit_confirm:"Vil du bruge den avancerede tekstredigering?",\r
 apply:"Anvend",\r
 insert:"Inds\u00E6t",\r
 update:"Opdater",\r
@@ -10,8 +10,8 @@ browse:"Gennemse",
 class_name:"Klasse",\r
 not_set:"-- Ikke sat --",\r
 clipboard_msg:"Kopier/Klip/inds\u00E6t er ikke muligt i Mozilla eller Firefox.\nVil du have mere information om dette emne?",\r
-clipboard_no_support:"P\u00E5 nuv\u00E6rende tidspunkt ikke supporteret af din browser. Anvend istedet genvejene p\u00E5 tastaturet.",\r
-popup_blocked:"Undskyld, men vi har noteret os at din popup-blocker har forhindret et vindue, der giver programmet funktionalitet, at \u00E5bne op. Hvis du vil have  den fulde funktionalitet m\u00E5 du sl\u00E5 popup-blockeren fra for dette websted.",\r
+clipboard_no_support:"P\u00E5 nuv\u00E6rende tidspunkt ikke supporteret af din browser. Anvend i stedet genvejene p\u00E5 tastaturet.",\r
+popup_blocked:"Undskyld, men vi har noteret os, at din popup-blocker har forhindret et vindue, der giver programmet funktionalitet, at \u00E5bne op. Hvis du vil have  den fulde funktionalitet, m\u00E5 du sl\u00E5 popup-blockeren fra for dette websted.",\r
 invalid_data:"Fejl: Forkerte v\u00E6rdier indtastet i felter markeret med r\u00F8d.",\r
 more_colors:"Flere farver"\r
 },\r
@@ -43,7 +43,7 @@ ltr_desc:"Retning venstre mod h\u00F8jre",
 rtl_desc:"Retning h\u00F8jre mod venstre"\r
 },\r
 layer:{\r
-insertlayer_desc:"Inds\u00E6t ny lag",\r
+insertlayer_desc:"Inds\u00E6t nyt lag",\r
 forward_desc:"Flyt fremad",\r
 backward_desc:"Flyt bagud",\r
 absolute_desc:"Sl\u00E5 absolut positionering til/fra",\r
@@ -68,13 +68,14 @@ emotions_desc:"Hum\u00F8rikoner"
 },\r
 searchreplace:{\r
 search_desc:"S\u00F8g",\r
-replace_desc:"S\u00F8g/Erstat"\r
+replace_desc:"S\u00F8g/erstat"\r
 },\r
 advimage:{\r
 image_desc:"Inds\u00E6t/rediger billede"\r
 },\r
 advlink:{\r
-link_desc:"Inds\u00E6t/rediger link"\r
+link_desc:"Inds\u00E6t/rediger link",\r
+delta_width:"40"\r
 },\r
 xhtmlxtras:{\r
 cite_desc:"Citat",\r
@@ -90,7 +91,9 @@ desc:"Rediger CSS stil"
 paste:{\r
 paste_text_desc:"Inds\u00E6t ikke-formatteret tekst",\r
 paste_word_desc:"Inds\u00E6t fra  Word",\r
-selectall_desc:"V\u00E6lg alle"\r
+selectall_desc:"V\u00E6lg alle",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Anvend CTRL+V p\u00E5 tastaturet for at inds\u00E6tte teksten.",\r
@@ -120,7 +123,9 @@ col:"Kolonne",
 cell:"Celle"\r
 },\r
 autosave:{\r
-unload_msg:"Har du foretaget nogle \u00E6ndringer vil de g\u00E5 tabt hvis du navigerer v\u00E6k fra denne side."\r
+unload_msg:"Har du foretaget nogle \u00E6ndringer, vil de g\u00E5 tabt, hvis du navigerer v\u00E6k fra denne side.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Vis/skjul fuldsk\u00E6rmstilstand"\r
@@ -130,7 +135,7 @@ desc:"Inds\u00E6t/rediger indlejret mediefil",
 edit:"Rediger indlejret mediefil"\r
 },\r
 fullpage:{\r
-desc:"Dokument egenskaber"\r
+desc:"Dokumentegenskaber"\r
 },\r
 template:{\r
 desc:"Inds\u00E6t pr\u00E6defineret skabelonindhold"\r
@@ -151,4 +156,16 @@ no_mpell:"Ingen stavefejl fundet."
 },\r
 pagebreak:{\r
 desc:"Inds\u00E6t sideskift."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index b80d19b994283dce250f9cd3e3337cfc048e8d73..ce7512dd66c1a73558434e77c2d8662c00beb5d1 100755 (executable)
@@ -7,19 +7,19 @@ update:"Aktualisieren",
 cancel:"Abbrechen",\r
 close:"Schlie\u00DFen",\r
 browse:"Durchsuchen",\r
-class_name:"Klasse",\r
-not_set:"-- Nicht gesetzt --",\r
+class_name:"CSS-Klasse",\r
+not_set:"- unbestimmt -",\r
 clipboard_msg:"Kopieren, Ausschneiden und Einf\u00FCgen sind im Mozilla Firefox nicht m\u00F6glich.\nM\u00F6chten Sie mehr \u00FCber dieses Problem erfahren?",\r
 clipboard_no_support:"Wird derzeit in Ihrem Browser nicht unterst\u00FCtzt. Bitte benutzen Sie stattdessen die Tastenk\u00FCrzel.",\r
-popup_blocked:"Leider hat Ihr Popup-Blocker ein Fenster unterbunden, das f\u00FCr den Betrieb dieses Programms n\u00F6tig ist. Bitte deaktivieren Sie den Popup-Blocker, um die volle Funktionalit\u00E4t zu erlangen.",\r
+popup_blocked:"Leider hat Ihr Popup-Blocker ein Fenster unterbunden, das f\u00FCr den Betrieb dieses Programms n\u00F6tig ist. Bitte deaktivieren Sie den Popup-Blocker f\u00FCr diese Seite.",\r
 invalid_data:"Fehler: Sie haben ung\u00FCltige Werte eingegeben (rot markiert).",\r
 more_colors:"Weitere Farben"\r
 },\r
 contextmenu:{\r
 align:"Ausrichtung",\r
-left:"Links",\r
-center:"Mittig",\r
-right:"Rechts",\r
+left:"Linksb\u00FCndig",\r
+center:"Zentriert",\r
+right:"Rechtsb\u00FCndig",\r
 full:"Blocksatz"\r
 },\r
 insertdatetime:{\r
@@ -28,7 +28,7 @@ time_fmt:"%H:%M:%S",
 insertdate_desc:"Datum einf\u00FCgen",\r
 inserttime_desc:"Zeit einf\u00FCgen",\r
 months_long:"Januar,Februar,M\u00E4rz,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember",\r
-months_short:"Jan,Feb,M\u00E4rz,Apr,Mai,Juni,Juli,Aug,Sept,Okt,Nov,Dez",\r
+months_short:"Jan,Feb,M\u00E4r,Apr,Mai,Juni,Juli,Aug,Sept,Okt,Nov,Dez",\r
 day_long:"Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag",\r
 day_short:"So,Mo,Di,Mi,Do,Fr,Sa,So"\r
 },\r
@@ -44,8 +44,8 @@ rtl_desc:"Schrift von rechts nach links"
 },\r
 layer:{\r
 insertlayer_desc:"Neue Ebene einf\u00FCgen",\r
-forward_desc:"Vor verschieben",\r
-backward_desc:"Zur\u00FCck verschieben",\r
+forward_desc:"Nach vorne holen",\r
+backward_desc:"Nach hinten legen",\r
 absolute_desc:"Absolute Positionierung",\r
 content:"Neue Ebene..."\r
 },\r
@@ -88,9 +88,11 @@ style:{
 desc:"CSS-Styles bearbeiten"\r
 },\r
 paste:{\r
-paste_text_desc:"Als normalen Text einf\u00FCgen",\r
+paste_text_desc:"Als einfachen Text einf\u00FCgen",\r
 paste_word_desc:"Mit Formatierungen (aus Word) einf\u00FCgen",\r
-selectall_desc:"Alles ausw\u00E4hlen"\r
+selectall_desc:"Alles ausw\u00E4hlen",\r
+plaintext_mode_sticky:"Einf\u00FCgemodus ist nun \"Nur Text\". Erneut klicken (oder das Einf\u00FCgen aus der Zwischenablage) stellt den Normalmodus wieder her.",\r
+plaintext_mode:"Einf\u00FCgemodus ist nun \"Nur Text\". Erneut klicken stellt den Normalmodus wieder her."\r
 },\r
 paste_dlg:{\r
 text_title:"Dr\u00FCcken Sie auf Ihrer Tastatur Strg+V, um den Text einzuf\u00FCgen.",\r
@@ -98,15 +100,15 @@ text_linebreaks:"Zeilenumbr\u00FCche beibehalten",
 word_title:"Dr\u00FCcken Sie auf Ihrer Tastatur Strg+V, um den Text einzuf\u00FCgen."\r
 },\r
 table:{\r
-desc:"Tabelle erstellen",\r
+desc:"Tabelle erstellen/bearbeiten",\r
 row_before_desc:"Zeile oberhalb einf\u00FCgen",\r
 row_after_desc:"Zeile unterhalb einf\u00FCgen",\r
-delete_row_desc:"Zeile entfernen",\r
+delete_row_desc:"Zeile l\u00F6schen",\r
 col_before_desc:"Spalte links einf\u00FCgen",\r
 col_after_desc:"Spalte rechts einf\u00FCgen",\r
 delete_col_desc:"Spalte l\u00F6schen",\r
-split_cells_desc:"Vereinte Zellen trennen",\r
-merge_cells_desc:"Zellen vereinen",\r
+split_cells_desc:"Verbundene Zellen trennen",\r
+merge_cells_desc:"Zellen verbinden",\r
 row_desc:"Eigenschaften der Zeile",\r
 cell_desc:"Eigenschaften der Zelle",\r
 props_desc:"Eigenschaften der Tabelle",\r
@@ -114,13 +116,16 @@ paste_row_before_desc:"Zeile oberhalb aus der Zwischenablage einf\u00FCgen",
 paste_row_after_desc:"Zeile unterhalb aus der Zwischenablage einf\u00FCgen",\r
 cut_row_desc:"Zeile ausschneiden",\r
 copy_row_desc:"Zeile kopieren",\r
-del:"Tabelle entfernen",\r
+del:"Tabelle l\u00F6schen",\r
 row:"Zeile",\r
 col:"Spalte",\r
-cell:"Zelle"\r
+cell:"Zelle",\r
+cellprops_delta_width:"150"\r
 },\r
 autosave:{\r
-unload_msg:"Ihre \u00C4nderungen werden verloren gehen, wenn Sie die Seite verlassen."\r
+unload_msg:"Ihre \u00C4nderungen werden verloren gehen, wenn Sie die Seite verlassen.",\r
+restore_content:"Automatisch gespeicherten Inhalt wiederherstellen.",\r
+warning_message:"Wenn Sie den Inhalt wiederherstellen, gehen die aktuellen Daten im Editor verloren.\n\nSind sie sicher, dass Sie den Inhalt wiederherstellen m\u00F6chten?"\r
 },\r
 fullscreen:{\r
 desc:"Vollbildschirm"\r
@@ -133,10 +138,10 @@ fullpage:{
 desc:"Dokument-Eigenschaften"\r
 },\r
 template:{\r
-desc:"Vorgefertigten Vorlageninhalt einf\u00FCgen"\r
+desc:"Inhalt aus Vorlage einf\u00FCgen"\r
 },\r
 visualchars:{\r
-desc:"Sichtbarkeit der Steuerzeichen an/aus."\r
+desc:"Sichtbarkeit der Steuerzeichen an/aus"\r
 },\r
 spellchecker:{\r
 desc:"Rechtschreibpr\u00FCfung an/aus",\r
@@ -150,5 +155,17 @@ no_sug:"Keine Vorschl\u00E4ge",
 no_mpell:"Keine Rechtschreibfehler gefunden."\r
 },\r
 pagebreak:{\r
-desc:"Seitenumbruch Einf\u00FCgen."\r
+desc:"Seitenumbruch einf\u00FCgen"\r
+},\r
+advlist:{\r
+types:"Typen",\r
+def:"Standard",\r
+lower_alpha:"a. b. c.",\r
+lower_greek:"1. 2. 3.",\r
+lower_roman:"i. ii. iii.",\r
+upper_alpha:"A. B. C.",\r
+upper_roman:"I. II. III.",\r
+circle:"Kreis",\r
+disc:"Punkt",\r
+square:"Quadrat"\r
 }}});
\ No newline at end of file
index 8f2e8a33cfbcb62f12aa69ad85ae11b233320cb8..61b8438a3bb6cb27df783cae8a5780bc1af39406 100755 (executable)
@@ -91,7 +91,9 @@ desc:"\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03A3\
 paste:{\r
 paste_text_desc:"\u0395\u03C0\u03B9\u03BA\u03CC\u03BB\u03BB\u03B7\u03C3\u03B7 \u03C9\u03C2 \u03B1\u03C0\u03BB\u03CC \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF",\r
 paste_word_desc:"\u0395\u03C0\u03B9\u03BA\u03CC\u03BB\u03BB\u03B7\u03C3\u03B7 \u03B1\u03C0\u03CC \u03C4\u03BF Word",\r
-selectall_desc:"\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03CC\u03BB\u03C9\u03BD"\r
+selectall_desc:"\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03CC\u03BB\u03C9\u03BD",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03C4\u03B5 CTRL+V \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BA\u03AC\u03BD\u03B5\u03C4\u03B5 \u03B5\u03C0\u03B9\u03BA\u03CC\u03BB\u03BB\u03B7\u03C3\u03B7 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C3\u03C4\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF.",\r
@@ -122,7 +124,9 @@ cell:"\u039A\u03B5\u03BB\u03AF",
 cellprops_delta_width:"60"\r
 },\r
 autosave:{\r
-unload_msg:"\u039F\u03B9 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AD\u03C2 \u03C0\u03BF\u03C5 \u03BA\u03AC\u03BD\u03B1\u03C4\u03B5 \u03B8\u03B1 \u03C7\u03B1\u03B8\u03BF\u03CD\u03BD \u03B1\u03BD \u03C6\u03CD\u03B3\u03B5\u03C4\u03B5 \u03C3\u03B5 \u03AC\u03BB\u03BB\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1."\r
+unload_msg:"\u039F\u03B9 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AD\u03C2 \u03C0\u03BF\u03C5 \u03BA\u03AC\u03BD\u03B1\u03C4\u03B5 \u03B8\u03B1 \u03C7\u03B1\u03B8\u03BF\u03CD\u03BD \u03B1\u03BD \u03C6\u03CD\u03B3\u03B5\u03C4\u03B5 \u03C3\u03B5 \u03AC\u03BB\u03BB\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"\u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03C0\u03BB\u03AE\u03C1\u03BF\u03C5\u03C2 \u03BF\u03B8\u03CC\u03BD\u03B7\u03C2"\r
@@ -155,4 +159,16 @@ no_mpell:"\u03A3\u03C9\u03C3\u03C4\u03AE \u03BF\u03C1\u03B8\u03BF\u03B3\u03C1\u0
 },\r
 pagebreak:{\r
 desc:"\u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03B1\u03BB\u03BB\u03B1\u03B3\u03AE\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index 8519b4de75e69ceb98867f5dc951f00509927815..ea4a1b0e1426134d417c66db72fa180635c79ef4 100644 (file)
@@ -90,7 +90,9 @@ desc:"Edit CSS Style"
 paste:{\r
 paste_text_desc:"Paste as Plain Text",\r
 paste_word_desc:"Paste from Word",\r
-selectall_desc:"Select All"\r
+selectall_desc:"Select All",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
@@ -120,7 +122,9 @@ col:"Column",
 cell:"Cell"\r
 },\r
 autosave:{\r
-unload_msg:"The changes you made will be lost if you navigate away from this page."\r
+unload_msg:"The changes you made will be lost if you navigate away from this page.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Toggle fullscreen mode"\r
@@ -151,4 +155,16 @@ no_mpell:"No misspellings found."
 },\r
 pagebreak:{\r
 desc:"Insert page break."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index f4fab6690f2d5293357ac3c1239a1c8aa5730273..d9ab9a6918d1db2e62c51d3781d28f83e2835571 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n({es:{\r
 common:{\r
-edit_confirm:"\u00BFDesea utilizar el modo WYSIWYG para esta caja de texto?",\r
+edit_confirm:" \u00BFDesea utilizar el modo WYSIWYG para esta caja de texto?",\r
 apply:"Aplicar",\r
 insert:"Insertar",\r
 update:"Actualizar",\r
@@ -9,7 +9,7 @@ close:"Cerrar",
 browse:"Examinar",\r
 class_name:"Clase",\r
 not_set:"-- Ninguno --",\r
-clipboard_msg:"Copiar/Cortar/Pegar no se encuentra disponible en Mozilla y Firefox.\n\u00BFDesea obtener m\u00E1s informaci\u00F3n acerca de este tema?",\r
+clipboard_msg:"Copiar/Cortar/Pegar no se encuentra disponible en Mozilla y Firefox.\n \u00BFDesea obtener m\u00E1s informaci\u00F3n acerca de este tema?",\r
 clipboard_no_support:"Su navegador no soporta las funciones de cortapapeles, use los accesos por teclado.",\r
 popup_blocked:"Lo sentimos, su bloqueo de ventanas emergentes ha deshabilitado una ventana que provee funcionalidades a la aplicaci\u00F3n. Necesita deshabilitar este bloqueo en este sitio para poder utilizar todas las funciones.",\r
 invalid_data:"Error: Introdujo un valor no v\u00E1lido, est\u00E1n marcados en rojo.",\r
@@ -58,7 +58,7 @@ nonbreaking_desc:"Insertar caracter de espacio 'non-breaking'"
 },\r
 iespell:{\r
 iespell_desc:"Corrector ortogr\u00E1fico",\r
-download:"No se detect\u00F3 'ieSpell'. \u00BFDesea instalarlo ahora?"\r
+download:"No se detect\u00F3 'ieSpell'.  \u00BFDesea instalarlo ahora?"\r
 },\r
 advhr:{\r
 advhr_desc:"Regla horizontal"\r
@@ -90,7 +90,9 @@ desc:"Editar Estilo CSS"
 paste:{\r
 paste_text_desc:"Pegar como texto plano",\r
 paste_word_desc:"Pegar desde Word",\r
-selectall_desc:"Seleccionar todo"\r
+selectall_desc:"Elegir todo",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Use CTRL+V en su teclado para pegar el texto en la ventana.",\r
@@ -120,7 +122,9 @@ col:"Columna",
 cell:"Celda"\r
 },\r
 autosave:{\r
-unload_msg:"Los cambios realizados se perder\u00E1n si sale de esta p\u00E1gina."\r
+unload_msg:"Los cambios realizados se perder\u00E1n si sale de esta p\u00E1gina.",\r
+restore_content:"Reestablecer contenido guardado autom\u00E1ticamente",\r
+warning_message:"Se reestablece en contenido guardado, perder\u00E1 todo el contenido que est\u00E1 actualmente en el editor.\n\nEst\u00E1 seguro de que quiere reestablecer el contenido guardado."\r
 },\r
 fullscreen:{\r
 desc:"Cambiar a modo Pantalla Completa"\r
@@ -130,7 +134,9 @@ desc:"Insertar/editar medio embebido",
 edit:"Editar medio embebido"\r
 },\r
 fullpage:{\r
-desc:"Propiedades del documento"\r
+desc:"Propiedades del documento",\r
+delta_width:"Ancho",\r
+delta_height:"Alto"\r
 },\r
 template:{\r
 desc:"Insertar contenido de plantilla predefinida"\r
@@ -151,4 +157,16 @@ no_mpell:"No se encontraron errores."
 },\r
 pagebreak:{\r
 desc:"Insertar fin de p\u00E1gina"\r
+},\r
+advlist:{\r
+types:"Tipo",\r
+def:"Preestablecido",\r
+lower_alpha:"Menos opaco",\r
+lower_greek:"Menos greek",\r
+lower_roman:"Menos roman",\r
+upper_alpha:"M\u00E1s opaco",\r
+upper_roman:"M\u00E1s roman",\r
+circle:"Circulo",\r
+disc:"Disc",\r
+square:"Cuadro"\r
 }}});
\ No newline at end of file
index 0fd6e98f8b7bd363a1523097f3e9dd2fefc6abfa..43686727dfcf58411db36d7cc6166da689cf6ca3 100755 (executable)
@@ -77,12 +77,12 @@ advlink:{
 link_desc:"Sisesta/redigeeri link"\r
 },\r
 xhtmlxtras:{\r
-cite_desc:"Citation",\r
-abbr_desc:"Abbreviation",\r
-acronym_desc:"Acronym",\r
-del_desc:"Deletion",\r
-ins_desc:"Insertion",\r
-attribs_desc:"Insert/Edit Attributes"\r
+cite_desc:"Tsitaat",\r
+abbr_desc:"L\u00FChend",\r
+acronym_desc:"Akron\u00FC\u00FCm",\r
+del_desc:"Kustutus",\r
+ins_desc:"Lisandus",\r
+attribs_desc:"Sisesta muuda atribuute"\r
 },\r
 style:{\r
 desc:"Redigeeri CSS stiili"\r
@@ -90,7 +90,9 @@ desc:"Redigeeri CSS stiili"
 paste:{\r
 paste_text_desc:"Kleebi tavalise tekstina",\r
 paste_word_desc:"Kleebi Wordist",\r
-selectall_desc:"Vali k\u00F5ik"\r
+selectall_desc:"Vali k\u00F5ik",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Vajuta CTRL+V oma klaviatuuril teksti aknasse kleepimiseks.",\r
@@ -120,7 +122,9 @@ col:"Veerg",
 cell:"Lahter"\r
 },\r
 autosave:{\r
-unload_msg:"Tehtud muudatused kaovad, kui lahkute siit lehelt."\r
+unload_msg:"Tehtud muudatused kaovad, kui lahkute siit lehelt.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"L\u00FClita \u00FCmber t\u00E4isekraani re\u017Eiim"\r
@@ -151,4 +155,16 @@ no_mpell:"Valesti kirjutamisi ei leitud."
 },\r
 pagebreak:{\r
 desc:"Sisesta lehevahetus."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/eu.js b/program/js/tiny_mce/langs/eu.js
new file mode 100644 (file)
index 0000000..7a0ceba
--- /dev/null
@@ -0,0 +1,206 @@
+tinyMCE.addI18n({eu:{\r
+common:{\r
+edit_confirm:"Testu-kutxa honek WYSIWYG editorea izatea nahi duzu?",\r
+apply:"Aplikatu",\r
+insert:"Txertatu",\r
+update:"Eguneratu",\r
+cancel:"Utzi",\r
+close:"Itxi",\r
+browse:"Arakatu",\r
+class_name:"Kalsea",\r
+not_set:"-- Ezarri gabe --",\r
+clipboard_msg:"Kopiatu/Ebaki/Itsatsi ez dago Mozilla eta Firefoxen.\nHonen inguruko informazioa nahi duzu??",\r
+clipboard_no_support:"Zure nabigatzailean ez dabil, erabili teklatuko laster-teklak honetarako..",\r
+popup_blocked:"Ups, zure popup blokeatzaileak funtzionalitate bat eskaintzen duen leihoa blokeatu du. Blokeatzailea desgaitu beharko duzu tresna hau erabiltzeko.",\r
+invalid_data:"Errorea: baliogabeak diren aukerak sartu dituzu, gorriz agertzen dira.",\r
+more_colors:"Kolore gehiago"\r
+},\r
+contextmenu:{\r
+align:"Alineazioa",\r
+left:"Ezkerrean",\r
+center:"Zentratuta",\r
+right:"Eskuinean",\r
+full:"Justifikatuta"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%Y-%m-%d",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Data txertatu",\r
+inserttime_desc:"Ordua txertatu",\r
+months_long:"Urtarrila,Otsaila,Martxoa,Apirila,Maiatza,Ekaina,Uztaila,Abuztua,Iraila,Urria,Azaroa,Abendua",\r
+months_short:"Urt,Ots,Mar,Api,Mai,Eka,Uzt,Abu,Ira,Urr,Aza,Abe",\r
+day_long:"Igandea,Astelehena,Asteartea,Asteazkena,Osteguna,Ostirala,Larunbata,Igandea",\r
+day_short:"Ig,Al,As,Az,Og,Or,Lr,Ig"\r
+},\r
+print:{\r
+print_desc:"Inprimatu"\r
+},\r
+preview:{\r
+preview_desc:"Aurreikusi"\r
+},\r
+directionality:{\r
+ltr_desc:"Ezkerretik eskumara",\r
+rtl_desc:"Eskuinatik ezkerrera"\r
+},\r
+layer:{\r
+insertlayer_desc:"Kapa berria txertatu",\r
+forward_desc:"Aurrera joan",\r
+backward_desc:"Atzera joan",\r
+absolute_desc:"Posizionatze-absolutua aktibatu/desaktibatu",\r
+content:"Kapa berria..."\r
+},\r
+save:{\r
+save_desc:"Gorde",\r
+cancel_desc:"Aldaketak bertan behera utzi"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"Espazioa txertatu"\r
+},\r
+iespell:{\r
+iespell_desc:"Hizkuntza zuzendu",\r
+download:"ieSpell ez da aurkitu. Instalatu egin nahi duzu?"\r
+},\r
+advhr:{\r
+advhr_desc:"Marra horizontala",\r
+delta_width:"Zabalera",\r
+delta_height:"Altuera"\r
+},\r
+emotions:{\r
+emotions_desc:"Ikonotxoak",\r
+delta_width:"Zabalera",\r
+delta_height:"Altuera"\r
+},\r
+searchreplace:{\r
+search_desc:"Bilatu",\r
+replace_desc:"Bilatu/Ordeztu",\r
+delta_width:"Zabalera",\r
+delta_height:"Altuera"\r
+},\r
+advimage:{\r
+image_desc:"Irudia txertatu/editatu",\r
+delta_width:"Zabalera",\r
+delta_height:"Altuera"\r
+},\r
+advlink:{\r
+link_desc:"Lotura txertatu/editatu",\r
+delta_width:"Zabalera",\r
+delta_height:"Altuera"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Zita",\r
+abbr_desc:"Laburdura",\r
+acronym_desc:"Akronimoa",\r
+del_desc:"Ezabaketa",\r
+ins_desc:"Txertaketa",\r
+attribs_desc:"Atributuak txertatu/editatu",\r
+cite_delta_width:"Ziten zabalera",\r
+cite_delta_height:"Ziten altuera",\r
+abbr_delta_width:"Laburduren zabalera",\r
+abbr_delta_height:"Laburduren altuera",\r
+acronym_delta_width:"Akronimoen zabalera",\r
+acronym_delta_height:"Akronimoen altuera",\r
+del_delta_width:"Ezabaketaren zabalera",\r
+del_delta_height:"Ezabaketaren altuera",\r
+ins_delta_width:"Txertaketaren zabalera",\r
+ins_delta_height:"Txertaketaren altuera",\r
+attribs_delta_width:"Atributuen zabalera",\r
+attribs_delta_height:"Atributuen altuera"\r
+},\r
+style:{\r
+desc:"Aldatu CSS estiloa",\r
+delta_width:"Zabalera",\r
+delta_height:"Altuera"\r
+},\r
+paste:{\r
+paste_text_desc:"Testu gisa itsatsi",\r
+paste_word_desc:"Word-etik itsatsi",\r
+selectall_desc:"Aukeratu guztia",\r
+plaintext_mode_sticky:"Itsasketa testu moduan dago orain. Egin klik itsasketa arruntera itzultzeko. Zerbait itsatsi ostean, modu arruntera pasatuko zara automatikoki.",\r
+plaintext_mode:"Itsasketa testu moduan dago orain. Egin klik itsasketa arruntera itzultzeko."\r
+},\r
+paste_dlg:{\r
+text_title:"Erabili CTRL+V testua lehioan itsasteko.",\r
+text_linebreaks:"Mantendu lerro-jauziak",\r
+word_title:"Erabili CTRL+V testua lehioan itsasteko.."\r
+},\r
+table:{\r
+desc:"Taula berri bat txertatu",\r
+row_before_desc:"Txertatu lerroa aurretik",\r
+row_after_desc:"Txertatu lerroa ondoren",\r
+delete_row_desc:"Ezabatu lerroa",\r
+col_before_desc:"Txertatu zutabea aurretik",\r
+col_after_desc:"Txertatu zutabea ondoren",\r
+delete_col_desc:"Ezabatu zutabea",\r
+split_cells_desc:"Banatu bateratutako gelaxkak",\r
+merge_cells_desc:"Bateratu gelaxkak",\r
+row_desc:"Lerro ezaugarriak",\r
+cell_desc:"Gelaxka ezaugarriak",\r
+props_desc:"Taula ezaugarriak",\r
+paste_row_before_desc:"Itsatsi lerroa aurretik",\r
+paste_row_after_desc:"Itsatsi lerroa ondoren",\r
+cut_row_desc:"Moztu lerroa",\r
+copy_row_desc:"Kopiatu lerroa",\r
+del:"Ezabatu taula",\r
+row:"Lerroa",\r
+col:"Zutabea",\r
+cell:"Gelaxka",\r
+rowprops_delta_width:"Lerroen propietateen zabalera",\r
+rowprops_delta_height:"Lerroen propietateen altuera",\r
+cellprops_delta_width:"Gelaxken propietateen zabalera",\r
+cellprops_delta_height:"Gelaxken propietateen altuera",\r
+table_delta_width:"Taularen zabalera",\r
+table_delta_height:"Taularen altuera",\r
+merge_cells_delta_width:"Gelaxkak batzearen zabalera",\r
+merge_cells_delta_height:"Gelaxkak batzearen altuera"\r
+},\r
+autosave:{\r
+unload_msg:"Egindako aldaketak galdu egingo dira orri honetatik kanpona nabigatzen baldin baduzu.",\r
+restore_content:"Automatikoki gordetako edukia errekuperatu.",\r
+warning_message:"Gordetako edukia errekuperatzen baduzu, orain editorean dagoena galdu egingo duzu.\n\nZiur zaude gordetakoa errekuperatzea nahi duzula?"\r
+},\r
+fullscreen:{\r
+desc:"Aldatu pantaila osoko modura"\r
+},\r
+media:{\r
+desc:"Insert / edit embedded media",\r
+edit:"Edit embedded media",\r
+delta_width:"Zabalera",\r
+delta_height:"Altuera"\r
+},\r
+fullpage:{\r
+desc:"Dokumentuaren ezaugarriak",\r
+delta_width:"Zabalera",\r
+delta_height:"Altuera"\r
+},\r
+template:{\r
+desc:"Txertatu aurredefinitutako txantiloiaren edukia"\r
+},\r
+visualchars:{\r
+desc:"Begi kontrol karaktereak gaitu/ezgaitu."\r
+},\r
+spellchecker:{\r
+desc:"Toggle spellchecker",\r
+menu:"Spellchecker settings",\r
+ignore_word:"Ezikusi hitza",\r
+ignore_words:"Ezikusi guztiak",\r
+langs:"Hizkuntzak",\r
+wait:"Itxaron mesedez...",\r
+sug:"Gomendioa",\r
+no_sug:"Gomendiorik ez",\r
+no_mpell:"Ez da akatsik aurkitu."\r
+},\r
+pagebreak:{\r
+desc:"Txertatu orri jauzia."\r
+},\r
+advlist:{\r
+types:"Motak",\r
+def:"Defektuzkoa",\r
+lower_alpha:"Hizki xeheak",\r
+lower_greek:"Hizki greko xeheak",\r
+lower_roman:"Zenbaki erromatar xeheak",\r
+upper_alpha:"Hizki larriak",\r
+upper_roman:"Zenbaki erromatar larriak",\r
+circle:"Borobila",\r
+disc:"Diskoa",\r
+square:"Karratua"\r
+}}});
\ No newline at end of file
index 73d262ab2b42562fedc6db2bf01778cbe219df16..5e933f92992ad23b79f3f70a5d578d622d4a2298 100755 (executable)
@@ -1,36 +1,36 @@
 tinyMCE.addI18n({fa:{\r
 common:{\r
-edit_confirm:"\u0622\u06CC\u0627 \u0645\u0627\u06CC\u0644\u06CC\u062F \u0627\u0632 \u062D\u0627\u0644\u062A \u0628\u0635\u0631\u06CC \u0628\u0631\u0627\u06CC \u0627\u06CC\u0646 \u062C\u0639\u0628\u0647 \u0645\u062A\u0646 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u06A9\u0646\u06CC\u062F\u061F",\r
-apply:"Apply",\r
+edit_confirm:"\u0622\u06CC\u0627 \u0634\u0645\u0627 \u0645\u0627\u06CC\u0644\u06CC\u062F \u062A\u0627 \u0627\u0632 \u062D\u0627\u0644\u062A \u0648\u06CC\u0631\u0627\u06CC\u0634\u06AF\u0631 WYSIWYG \u0628\u0631\u0627\u06CC \u0627\u06CC\u0646 \u0646\u0627\u062D\u06CC\u0647 \u0645\u062A\u0646\u06CC \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0646\u0645\u0627\u0626\u06CC\u062F\u061F",\r
+apply:"\u0628\u0643\u0627\u0631\u06AF\u06CC\u0631\u06CC",\r
 insert:"\u062F\u0631\u062C",\r
 update:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC",\r
 cancel:"\u0627\u0646\u0635\u0631\u0627\u0641",\r
 close:"\u0628\u0633\u062A\u0646",\r
-browse:"Browse",\r
-class_name:"\u062F\u0633\u062A\u0647",\r
-not_set:"-- \u062A\u0646\u0638\u064A\u0645 \u0646\u0634\u062F\u0647 --",\r
-clipboard_msg:"\u0631\u0648\u0646\u0648\u0634\u062A/\u0628\u0631\u0634/\u062C\u0627\u06CC\u06AF\u0630\u0627\u0631\u06CC \u062F\u0631 \u0645\u0631\u0648\u0631\u06AF\u0631\u0647\u0627\u06CC \u0645\u0648\u0632\u06CC\u0644\u0627 \u0648 \u0641\u0627\u06CC\u0631\u0641\u0627\u06A9\u0633 \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u0646\u062F.\n\u0622\u06CC\u0627 \u0628\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062A \u0628\u06CC\u0634\u062A\u0631\u06CC \u062F\u0631 \u0627\u06CC\u0646 \u0632\u0645\u06CC\u0646\u0647 \u0646\u06CC\u0627\u0632 \u062F\u0627\u0631\u06CC\u062F\u061F",\r
-clipboard_no_support:"\u062F\u0631 \u062D\u0627\u0644 \u062D\u0627\u0636\u0631 \u062A\u0648\u0633\u0637 \u0645\u0631\u0648\u0631\u06AF\u0631 \u0634\u0645\u0627 \u067E\u0634\u062A\u06CC\u0628\u0627\u0646\u06CC \u0646\u0645\u06CC\u200C\u0634\u0648\u062F\u060C \u062F\u0631 \u0639\u0648\u0634 \u0627\u0632 \u0645\u0627\u0646\u0628\u0631\u0647\u0627\u06CC \u0635\u0641\u062D\u0647 \u06A9\u0644\u06CC\u062F \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u06A9\u0646\u06CC\u062F.",\r
-popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.",\r
-invalid_data:"\u062E\u0637\u0627: \u0645\u0642\u0627\u062F\u06CC\u0631 \u0646\u0627\u062F\u0631\u0633\u062A \u0648\u0627\u0631\u062F \u0634\u062F\u0647 \u0627\u0633\u062A, \u06A9\u0647 \u0628\u0627 \u0631\u0646\u06AF \u0642\u0631\u0645\u0632 \u0645\u0634\u062E\u0635 \u0634\u062F\u0647 \u0627\u0646\u062F.",\r
-more_colors:"\u0631\u0646\u06AF\u200C\u0647\u0627\u06CC \u0628\u06CC\u0634\u062A\u0631"\r
+browse:"\u0627\u0646\u062A\u062E\u0627\u0628 \u0627\u0632 \u0633\u0631\u0648\u0631",\r
+class_name:"\u0643\u0644\u0627\u0633",\r
+not_set:"-- \u062A\u0646\u0638\u06CC\u0645 \u0646\u0634\u062F\u0647 --",\r
+clipboard_msg:"\u0643\u067E\u06CC/\u0628\u0631\u0634 (Cut)/\u0686\u0633\u0628\u0627\u0646\u062F\u0646 (Paste) \u062F\u0631 Mozilla \u0648 Firefox \u0642\u0627\u0628\u0644 \u062F\u0633\u062A\u0631\u0633 \u0646\u0645\u06CC \u0628\u0627\u0634\u062F.\n\u0622\u06CC\u0627 \u0634\u0645\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062A \u0628\u06CC\u0634\u062A\u0631\u06CC \u062F\u0631\u0628\u0627\u0631\u0647 \u0627\u06CC\u0646 \u0645\u0648\u0636\u0648\u0639 \u0645\u06CC \u062E\u0648\u0627\u0647\u06CC\u062F\u061F",\r
+clipboard_no_support:"\u062F\u0631 \u062D\u0627\u0644 \u062D\u0627\u0636\u0631 \u062A\u0648\u0633\u0637 \u0645\u0631\u0648\u0631\u06AF\u0631 \u0634\u0645\u0627 \u067E\u0634\u062A\u06CC\u0628\u0627\u0646\u06CC \u0646\u0645\u06CC \u0634\u0648\u062F \u060C \u0628\u0647 \u062C\u0627\u06CC \u0622\u0646 \u0627\u0632 \u0645\u06CC\u0627\u0646\u0628\u0631\u0647\u0627\u06CC (Shortcut) \u0635\u0641\u062D\u0647 \u0643\u0644\u06CC\u062F \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0646\u0645\u0627\u0626\u06CC\u062F.",\r
+popup_blocked:"\u0628\u0627 \u0639\u0631\u0636 \u067E\u0648\u0632\u0634 \u060C \u0645\u0627 \u0627\u0637\u0644\u0627\u0639 \u062F\u0627\u062F\u0647 \u0628\u0648\u062F\u06CC\u0645 \u0643\u0647 \u0645\u062F\u0627\u0641\u0639 \u067E\u0646\u062C\u0631\u0647 \u0628\u0627\u0632 \u0634\u0648\u06CC (Popup) \u0634\u0645\u0627 \u060C \u067E\u0646\u062C\u0631\u0647 \u0627\u06CC \u0631\u0627 \u0643\u0647 \u0642\u0627\u0628\u0644\u06CC\u062A \u0628\u0631\u0646\u0627\u0645\u0647 \u0643\u0627\u0631\u0628\u0631\u062F\u06CC \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06CC \u0643\u0631\u062F \u060C \u063A\u06CC\u0631 \u0641\u0639\u0627\u0644 \u0643\u0631\u062F\u0647 \u0627\u0633\u062A. \u0634\u0645\u0627 \u0646\u06CC\u0627\u0632 \u0628\u0647 \u063A\u06CC\u0631 \u0641\u0639\u0627\u0644 \u0643\u0631\u062F\u0646 \u0645\u062F\u0627\u0641\u0639 \u067E\u0646\u062C\u0631\u0647 \u0628\u0627\u0632 \u0634\u0648 (Popup) \u062F\u0631 \u0627\u06CC\u0646 \u0633\u0627\u06CC\u062A \u0631\u0627 \u062F\u0627\u0631\u06CC\u062F \u062A\u0627 \u0627\u0632 \u0627\u06CC\u0646 \u0627\u0628\u0632\u0627\u0631 \u0628\u0647 \u0635\u0648\u0631\u062A \u0643\u0627\u0645\u0644 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0646\u0645\u0627\u0626\u06CC\u062F.",\r
+invalid_data:"\u062E\u0637\u0627: \u0645\u0642\u0627\u062F\u06CC\u0631 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u0648\u0627\u0631\u062F \u0634\u062F \u060C \u0622\u0646\u0647\u0627 \u0628\u0647 \u0631\u0646\u06AF \u0642\u0631\u0645\u0632 \u0639\u0644\u0627\u0645\u062A \u062E\u0648\u0631\u062F\u0647 \u0627\u0646\u062F.",\r
+more_colors:"\u0631\u0646\u06AF \u0647\u0627\u06CC \u0628\u06CC\u0634\u062A\u0631"\r
 },\r
 contextmenu:{\r
 align:"\u062A\u0631\u0627\u0632",\r
 left:"\u0686\u067E",\r
-center:"\u0645\u0631\u06A9\u0632",\r
+center:"\u0648\u0633\u0637",\r
 right:"\u0631\u0627\u0633\u062A",\r
-full:"\u06A9\u0627\u0645\u0644"\r
+full:"\u0643\u0627\u0645\u0644"\r
 },\r
 insertdatetime:{\r
 date_fmt:"%Y-%m-%d",\r
 time_fmt:"%H:%M:%S",\r
 insertdate_desc:"\u062F\u0631\u062C \u062A\u0627\u0631\u06CC\u062E",\r
-inserttime_desc:"\u062F\u0631\u062C \u0633\u0627\u0639\u062A",\r
-months_long:"\u0698\u0627\u0646\u0648\u06CC\u0647,\u0641\u0648\u0631\u06CC\u0647,\u0645\u0627\u0631\u0633,\u0622\u0648\u0631\u06CC\u0644,\u0645\u06CC,\u0698\u0648\u0626\u0646,\u062C\u0648\u0644\u0627\u06CC,\u0622\u06AF\u0648\u0633\u062A,\u0633\u067E\u062A\u0627\u0645\u0628\u0631,\u0627\u06A9\u062A\u0628\u0631,\u0646\u0648\u0627\u0645\u0628\u0631,\u062F\u0633\u0627\u0645\u0628\u0631",\r
-months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",\r
-day_long:"\u06CC\u06A9\u200C\u0634\u0646\u0628\u0647,\u062F\u0648\u0634\u0646\u0628\u0647,\u0633\u0647\u200C\u0634\u0646\u0628\u0647,\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647,\u067E\u0646\u062C\u200C\u0634\u0646\u0628\u0647,\u062C\u0645\u0639\u0647,\u0634\u0646\u0628\u0647,\u06CC\u06A9\u200C\u0634\u0646\u0628\u0647",\r
-day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"\r
+inserttime_desc:"\u062F\u0631\u062C \u0632\u0645\u0627\u0646",\r
+months_long:"\u0698\u0627\u0646\u0648\u06CC\u0647,\u0641\u0648\u0631\u06CC\u0647,\u0645\u0627\u0631\u0633,\u0622\u0648\u0631\u06CC\u0644,\u0645\u0647,\u0698\u0648\u0626\u0646,\u0698\u0648\u0626\u06CC\u0647,\u0627\u0648\u062A,\u0633\u067E\u062A\u0627\u0645\u0628\u0631,\u0627\u0643\u062A\u0628\u0631,\u0646\u0648\u0627\u0645\u0628\u0631,\u062F\u0633\u0627\u0645\u0628\u0631",\r
+months_short:"\u0698\u0627\u0646\u0648\u06CC\u0647,\u0641\u0648\u0631\u06CC\u0647,\u0645\u0627\u0631\u0633,\u0622\u0648\u0631\u06CC\u0644,\u0645\u0647,\u0698\u0648\u0626\u0646,\u0698\u0648\u0626\u06CC\u0647,\u0627\u0648\u062A,\u0633\u067E\u062A\u0627\u0645\u0628\u0631,\u0627\u0643\u062A\u0628\u0631,\u0646\u0648\u0627\u0645\u0628\u0631,\u062F\u0633\u0627\u0645\u0628\u0631",\r
+day_long:"\u06CC\u0643\u0634\u0646\u0628\u0647,\u062F\u0648\u0634\u0646\u0628\u0647,\u0633\u0647 \u0634\u0646\u0628\u0647,\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647,\u067E\u0646\u062C \u0634\u0646\u0628\u0647,\u062C\u0645\u0639\u0647,\u0634\u0646\u0628\u0647,\u06CC\u0643\u0634\u0646\u0628\u0647",\r
+day_short:"\u06CC\u0643\u0634\u0646\u0628\u0647,\u062F\u0648\u0634\u0646\u0628\u0647,\u0633\u0647 \u0634\u0646\u0628\u0647,\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647,\u067E\u0646\u062C \u0634\u0646\u0628\u0647,\u062C\u0645\u0639\u0647,\u0634\u0646\u0628\u0647,\u06CC\u0643\u0634\u0646\u0628\u0647"\r
 },\r
 print:{\r
 print_desc:"\u0686\u0627\u067E"\r
@@ -44,111 +44,127 @@ rtl_desc:"\u062C\u0647\u062A \u0631\u0627\u0633\u062A \u0628\u0647 \u0686\u067E"
 },\r
 layer:{\r
 insertlayer_desc:"\u062F\u0631\u062C \u0644\u0627\u06CC\u0647 \u062C\u062F\u06CC\u062F",\r
-forward_desc:"\u062D\u0631\u06A9\u062A \u0628\u0647 \u062C\u0644\u0648",\r
-backward_desc:"\u062D\u0631\u06A9\u062A \u0628\u0647 \u0639\u0642\u0628",\r
-absolute_desc:"\u062A\u063A\u06CC\u06CC\u0631 \u0648\u0636\u0639\u06CC\u062A \u0645\u06A9\u0627\u0646 \u062F\u0642\u06CC\u0642",\r
-content:"...\u0644\u0627\u06CC\u0647 \u062C\u062F\u06CC\u062F"\r
+forward_desc:"\u0627\u0646\u062A\u0642\u0627\u0644 \u0628\u0647 \u062C\u0644\u0648",\r
+backward_desc:"\u0627\u0646\u062A\u0642\u0627\u0644 \u0628\u0647 \u067E\u0634\u062A",\r
+absolute_desc:"\u062A\u0639\u0648\u06CC\u0636 \u0645\u0648\u0642\u0639\u06CC\u062A \u0645\u0637\u0644\u0642",\r
+content:"\u0644\u0627\u06CC\u0647 \u062C\u062F\u06CC\u062F..."\r
 },\r
 save:{\r
 save_desc:"\u0630\u062E\u06CC\u0631\u0647",\r
-cancel_desc:"Cancel all changes"\r
+cancel_desc:"\u0644\u063A\u0648 \u062A\u0645\u0627\u0645\u06CC \u062A\u063A\u06CC\u06CC\u0631\u0627\u062A"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"\u062F\u0631\u062C \u06A9\u0627\u0631\u0627\u06A9\u062A\u0631 non-breaking \u0641\u0627\u0635\u0644\u0647"\r
+nonbreaking_desc:"\u062F\u0631\u062C \u0643\u0627\u0631\u0627\u0643\u062A\u0631 \u0641\u0627\u0635\u0644\u0647 \u0628\u062F\u0648\u0646 \u0642\u0637\u0639 \u0634\u062F\u06AF\u06CC"\r
 },\r
 iespell:{\r
-iespell_desc:"\u0627\u062C\u0631\u0627\u06CC \u063A\u0644\u0637 \u06AF\u06CC\u0631 \u0627\u0645\u0644\u0627\u06CC\u06CC",\r
-download:"ieSpell not detected. Do you want to install it now?"\r
+iespell_desc:"\u0627\u062C\u0631\u0627\u06CC \u0628\u0631\u0631\u0633\u06CC \u0627\u0645\u0644\u0627\u0621",\r
+download:"ieSpell \u062A\u0634\u062E\u06CC\u0635 \u062F\u0627\u062F\u0647 \u0646\u0634\u062F. \u0622\u06CC\u0627 \u0634\u0645\u0627 \u0645\u0627\u06CC\u0644 \u0628\u0647 \u0646\u0635\u0628 \u0622\u0646 \u0647\u0633\u062A\u06CC\u062F\u061F"\r
 },\r
 advhr:{\r
 advhr_desc:"\u062E\u0637 \u0627\u0641\u0642\u06CC"\r
 },\r
 emotions:{\r
-emotions_desc:"\u0634\u06A9\u0644\u06A9\u200C\u0647\u0627"\r
+emotions_desc:"\u0634\u0643\u0644\u0643"\r
 },\r
 searchreplace:{\r
-search_desc:"\u06CC\u0627\u0641\u062A\u0646",\r
-replace_desc:"\u06CC\u0627\u0641\u062A\u0646/\u062C\u0627\u06CC\u06AF\u0632\u06CC\u0646 \u06A9\u0631\u062F\u0646"\r
+search_desc:"\u062C\u0633\u062A\u062C\u0648",\r
+replace_desc:"\u062C\u0633\u062A\u062C\u0648/\u062A\u0639\u0648\u06CC\u0636"\r
 },\r
 advimage:{\r
 image_desc:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u062A\u0635\u0648\u06CC\u0631"\r
 },\r
 advlink:{\r
-link_desc:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0644\u06CC\u0646\u06A9"\r
+link_desc:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0644\u06CC\u0646\u0643"\r
 },\r
 xhtmlxtras:{\r
-cite_desc:"Citation",\r
+cite_desc:"\u0646\u0642\u0644 \u0642\u0648\u0644",\r
 abbr_desc:"\u0627\u062E\u062A\u0635\u0627\u0631",\r
 acronym_desc:"\u0645\u062E\u0641\u0641",\r
 del_desc:"\u062D\u0630\u0641",\r
 ins_desc:"\u062F\u0631\u062C",\r
-attribs_desc:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0645\u0634\u062E\u0635\u0647"\r
+attribs_desc:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0635\u0641\u0627\u062A"\r
 },\r
 style:{\r
-desc:"\u0648\u06CC\u0631\u0627\u06CC\u0634 CSS \u0633\u0628\u06A9"\r
+desc:"\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0627\u0633\u062A\u06CC\u0644 CSS"\r
 },\r
 paste:{\r
-paste_text_desc:"\u0686\u0633\u0628\u0627\u0646\u062F\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062A\u0646 \u0633\u0627\u062F\u0647",\r
-paste_word_desc:"Word \u0686\u0633\u0628\u0627\u0646\u062F\u0646 \u0627\u0632 ",\r
-selectall_desc:"\u0627\u0646\u062A\u062E\u0627\u0628 \u0647\u0645\u0647"\r
+paste_text_desc:"\u0686\u0633\u0628\u0627\u0646\u062F\u0646 (Paste) \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062A\u0646 \u0633\u0627\u062F\u0647",\r
+paste_word_desc:"\u0686\u0633\u0628\u0627\u0646\u062F\u0646 (Paste) \u0627\u0632 Word",\r
+selectall_desc:"\u0627\u0646\u062A\u062E\u0627\u0628 \u0647\u0645\u0647",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
-text_title:"\u0627\u0632 \u062A\u0631\u06A9\u06CC\u0628 CTRL+V \u0631\u0648\u06CC \u06A9\u06CC\u200C\u0628\u0631\u062F \u0628\u0631\u0627\u06CC \u0686\u0633\u0628\u0627\u0646\u062F\u0646 \u0645\u062A\u0646 \u062F\u0631 \u067E\u0646\u0686\u0631\u0647 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u06A9\u0646\u06CC\u062F.",\r
-text_linebreaks:"Keep linebreaks",\r
-word_title:"\u0627\u0632 \u062A\u0631\u06A9\u06CC\u0628 CTRL+V \u0631\u0648\u06CC \u06A9\u06CC\u200C\u0628\u0631\u062F \u0628\u0631\u0627\u06CC \u0686\u0633\u0628\u0627\u0646\u062F\u0646 \u0645\u062A\u0646 \u062F\u0631 \u067E\u0646\u0686\u0631\u0647 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u06A9\u0646\u06CC\u062F."\r
+text_title:"\u062C\u0647\u062A \u0686\u0633\u0628\u0627\u0646\u062F\u0646 (Paste) \u0643\u0631\u062F\u0646 \u0645\u062A\u0646 \u062F\u0631 \u067E\u0646\u062C\u0631\u0647 \u0627\u0632 CTRL+V \u0628\u0631 \u0631\u0648\u06CC \u0635\u0641\u062D\u0647 \u0643\u0644\u06CC\u062F \u062E\u0648\u062F \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0646\u0645\u0627\u0626\u06CC\u062F.",\r
+text_linebreaks:"\u062D\u0641\u0638 \u0642\u0637\u0639 \u062E\u0637\u0648\u0637",\r
+word_title:"\u062C\u0647\u062A \u0686\u0633\u0628\u0627\u0646\u062F\u0646 (Paste) \u0643\u0631\u062F\u0646 \u0645\u062A\u0646 \u062F\u0631 \u067E\u0646\u062C\u0631\u0647 \u0627\u0632 CTRL+V \u0628\u0631 \u0631\u0648\u06CC \u0635\u0641\u062D\u0647 \u0643\u0644\u06CC\u062F \u062E\u0648\u062F \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0646\u0645\u0627\u0626\u06CC\u062F."\r
 },\r
 table:{\r
-desc:"\u062F\u0631\u062C \u062C\u062F\u0648\u0644 \u062C\u062F\u06CC\u062F",\r
-row_before_desc:"\u062F\u0631\u062C \u0633\u0637\u0631 \u0628\u0639\u062F \u0627\u0632",\r
-row_after_desc:"\u062F\u0631\u062C \u0633\u0637\u0631 \u0642\u0628\u0644 \u0627\u0632",\r
+desc:"\u06CC\u0643 \u062C\u062F\u0648\u0644 \u062C\u062F\u06CC\u062F \u062F\u0631\u062C \u0645\u06CC \u0643\u0646\u062F",\r
+row_before_desc:"\u062F\u0631\u062C \u0633\u0637\u0631 \u062F\u0631 \u0642\u0628\u0644",\r
+row_after_desc:"\u062F\u0631\u062C \u0633\u0637\u0631 \u062F\u0631 \u0628\u0639\u062F",\r
 delete_row_desc:"\u062D\u0630\u0641 \u0633\u0637\u0631",\r
-col_before_desc:"\u062F\u0631\u062C \u0633\u062A\u0648\u0646 \u0642\u0628\u0644 \u0627\u0632",\r
-col_after_desc:"\u062F\u0631\u062C \u0633\u062A\u0648\u0646 \u0628\u0639\u062F \u0627\u0632",\r
+col_before_desc:"\u062F\u0631\u062C \u0633\u062A\u0648\u0646 \u062F\u0631 \u0642\u0628\u0644",\r
+col_after_desc:"\u062F\u0631\u062C \u0633\u062A\u0648\u0646 \u062F\u0631 \u0628\u0639\u062F",\r
 delete_col_desc:"\u062D\u0630\u0641 \u0633\u062A\u0648\u0646",\r
-split_cells_desc:"Split merged table cells",\r
-merge_cells_desc:"\u0627\u062F\u063A\u0627\u0645 \u0633\u0644\u0648\u0644\u200C\u0647\u0627\u06CC \u062C\u062F\u0648\u0644",\r
+split_cells_desc:"\u062A\u0642\u0633\u06CC\u0645 \u0633\u0644\u0648\u0644 \u0647\u0627\u06CC \u062C\u062F\u0648\u0644 \u0627\u062F\u063A\u0627\u0645 \u0634\u062F\u0647",\r
+merge_cells_desc:"\u0627\u062F\u063A\u0627\u0645 \u0633\u0644\u0648\u0644 \u0647\u0627\u06CC \u062C\u062F\u0648\u0644",\r
 row_desc:"\u0645\u0634\u062E\u0635\u0627\u062A \u0633\u0637\u0631 \u062C\u062F\u0648\u0644",\r
 cell_desc:"\u0645\u0634\u062E\u0635\u0627\u062A \u0633\u0644\u0648\u0644 \u062C\u062F\u0648\u0644",\r
 props_desc:"\u0645\u0634\u062E\u0635\u0627\u062A \u062C\u062F\u0648\u0644",\r
-paste_row_before_desc:"\u0686\u0633\u0628\u0627\u0646\u062F\u0646 \u0631\u062F\u06CC\u0641 \u062C\u062F\u0648\u0644 \u0642\u0628\u0644 \u0627\u0632",\r
-paste_row_after_desc:"\u0686\u0633\u0628\u0627\u0646\u062F\u0646 \u0631\u062F\u06CC\u0641 \u062C\u062F\u0648\u0644 \u0628\u0639\u062F \u0627\u0632",\r
-cut_row_desc:"\u0628\u0631\u06CC\u062F\u0646 \u0633\u0637\u0631 \u062C\u062F\u0648\u0644",\r
-copy_row_desc:"\u0631\u0648\u0646\u0648\u0634\u062A \u06A9\u0631\u062F\u0646 \u0633\u0637\u0631 \u062C\u062F\u0648\u0644",\r
+paste_row_before_desc:"\u0686\u0633\u0628\u0627\u0646\u062F\u0646 (Paste) \u0633\u0637\u0631 \u062C\u062F\u0648\u0644 \u062F\u0631 \u0642\u0628\u0644",\r
+paste_row_after_desc:"\u0686\u0633\u0628\u0627\u0646\u062F\u0646 (Paste) \u0633\u0637\u0631 \u062C\u062F\u0648\u0644 \u062F\u0631 \u0628\u0639\u062F",\r
+cut_row_desc:"\u0628\u0631\u0634 (Cut) \u0633\u0637\u0631 \u062C\u062F\u0648\u0644",\r
+copy_row_desc:"\u0643\u067E\u06CC  \u0633\u0637\u0631 \u062C\u062F\u0648\u0644",\r
 del:"\u062D\u0630\u0641 \u062C\u062F\u0648\u0644",\r
 row:"\u0633\u0637\u0631",\r
 col:"\u0633\u062A\u0648\u0646",\r
 cell:"\u0633\u0644\u0648\u0644"\r
 },\r
 autosave:{\r
-unload_msg:"The changes you made will be lost if you navigate away from this page."\r
+unload_msg:"\u062F\u0631 \u0635\u0648\u0631\u062A\u06CC \u0643\u0647 \u0634\u0645\u0627 \u0627\u0632 \u0627\u06CC\u0646 \u0635\u0641\u062D\u0647 \u0628\u0647 \u062C\u0627\u06CC \u062F\u06CC\u06AF\u0631\u06CC \u0646\u0627\u0648\u0628\u0631\u06CC (Navigate) \u0643\u0646\u06CC\u062F \u060C \u062A\u063A\u06CC\u06CC\u0631\u0627\u062A\u06CC \u0643\u0647 \u0627\u06CC\u062C\u0627\u062F \u0646\u0645\u0648\u062F\u0647 \u0627\u06CC\u062F \u0627\u0632 \u062F\u0633\u062A \u062E\u0648\u0627\u0647\u062F \u0631\u0641\u062A.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
-desc:"\u062A\u063A\u06CC\u06CC\u0631 \u0648\u0636\u0639\u06CC\u062A \u062D\u0627\u0644\u062A \u062A\u0645\u0627\u0645 \u0635\u0641\u062D\u0647"\r
+desc:"\u062A\u0639\u0648\u06CC\u0636 \u0628\u0647 \u062D\u0627\u0644\u062A \u0635\u0641\u062D\u0647 \u0643\u0627\u0645\u0644"\r
 },\r
 media:{\r
-desc:"embedded media \u062F\u0631\u062C / \u0648\u06CC\u0631\u0627\u06CC\u0634",\r
-edit:"embedded media \u0648\u06CC\u0631\u0627\u06CC\u0634"\r
+desc:"\u062F\u0631\u062C / \u0648\u06CC\u0631\u0627\u06CC\u0634 \u0631\u0633\u0627\u0646\u0647 \u062C\u0627\u0633\u0627\u0632\u06CC \u0634\u062F\u0647 (Embeded Media)",\r
+edit:"\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0631\u0633\u0627\u0646\u0647 \u062C\u0627\u0633\u0627\u0632\u06CC \u0634\u062F\u0647 (Embeded Media)"\r
 },\r
 fullpage:{\r
 desc:"\u0645\u0634\u062E\u0635\u0627\u062A \u0633\u0646\u062F"\r
 },\r
 template:{\r
-desc:"Insert predefined template content"\r
+desc:"\u062F\u0631\u062C \u0645\u062D\u062A\u0648\u0627\u06CC \u0642\u0627\u0644\u0628 \u0627\u0632 \u067E\u06CC\u0634 \u062A\u0639\u0631\u06CC\u0641 \u0634\u062F\u0647"\r
 },\r
 visualchars:{\r
-desc:"Visual control characters on/off."\r
+desc:"\u0631\u0648\u0634\u0646/\u062E\u0627\u0645\u0648\u0634 \u0643\u0631\u062F\u0646 \u0643\u0627\u0631\u0627\u0643\u062A\u0631 \u0647\u0627\u06CC \u0643\u0646\u062A\u0631\u0644 \u0628\u0635\u0631\u06CC (Visual)."\r
 },\r
 spellchecker:{\r
-desc:"\u062A\u063A\u06CC\u06CC\u0631 \u0648\u0636\u0639\u06CC\u062A \u063A\u0644\u0637 \u06CC\u0627\u0628 \u0627\u0645\u0644\u0627\u06CC\u06CC",\r
-menu:"\u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u063A\u0644\u0637 \u06CC\u0627\u0628 \u0627\u0645\u0644\u0627\u06CC\u06CC",\r
-ignore_word:"\u0646\u0627\u062F\u06CC\u062F\u0647 \u06AF\u0631\u0641\u062A\u0646 \u06A9\u0644\u0645\u0647",\r
-ignore_words:"\u0646\u0627\u062F\u06CC\u062F\u0647 \u06AF\u0631\u0641\u062A\u0646 \u0647\u0645\u0647",\r
-langs:"\u0632\u0628\u0627\u0646\u200C\u0647\u0627",\r
-wait:"...\u0644\u0637\u0641\u0627 \u0635\u0628\u0631 \u06A9\u0646\u06CC\u062F",\r
+desc:"\u062A\u0639\u0648\u06CC\u0636 \u0628\u0631\u0631\u0633\u06CC \u0643\u0646\u0646\u062F\u0647 \u0627\u0645\u0644\u0627\u0621",\r
+menu:"\u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u0628\u0631\u0631\u0633\u06CC \u0643\u0646\u0646\u062F\u0647 \u0627\u0645\u0644\u0627\u0621",\r
+ignore_word:"\u0686\u0634\u0645 \u067E\u0648\u0634\u06CC \u0627\u0632 \u0643\u0644\u0645\u0647",\r
+ignore_words:"\u0686\u0634\u0645 \u067E\u0648\u0634\u06CC \u0627\u0632 \u0647\u0645\u0647",\r
+langs:"\u0632\u0628\u0627\u0646 \u0647\u0627",\r
+wait:"\u0644\u0637\u0641\u0627 \u0645\u0646\u062A\u0638\u0631 \u0628\u0645\u0627\u0646\u06CC\u062F...",\r
 sug:"\u067E\u06CC\u0634\u0646\u0647\u0627\u062F\u0627\u062A",\r
-no_sug:"No suggestions",\r
-no_mpell:"No misspellings found."\r
+no_sug:"\u0628\u062F\u0648\u0646 \u067E\u06CC\u0634\u0646\u0647\u0627\u062F",\r
+no_mpell:"\u0647\u06CC\u0686 \u062E\u0637\u0627\u06CC \u0627\u0645\u0644\u0627\u0626\u06CC \u06CC\u0627\u0641\u062A\u0647 \u0646\u0634\u062F."\r
 },\r
 pagebreak:{\r
-desc:".\u062F\u0631\u062C \u062C\u062F\u0627\u06A9\u0646\u0646\u062F\u0647 \u0635\u0641\u062D\u0647"\r
+desc:"\u062F\u0631\u062C \u0642\u0637\u0639 \u0635\u0641\u062D\u0647."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index 90420ffb5b7c99567cc50512ddb219b6fe68ec74..e313468b3e78a546a2440f2bc8b9f30f24ef41bb 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n({fi:{\r
 common:{\r
-edit_confirm:"Haluatko k\u00E4ytt\u00E4\u00E4 WYSIWYG tilaa t\u00E4ss\u00E4 tekstikent\u00E4ss\u00E4?",\r
+edit_confirm:"Haluatko k\u00E4ytt\u00E4\u00E4 WYSIWYG-tilaa t\u00E4ss\u00E4 tekstikent\u00E4ss\u00E4?",\r
 apply:"K\u00E4yt\u00E4",\r
 insert:"Lis\u00E4\u00E4",\r
 update:"P\u00E4ivit\u00E4",\r
@@ -9,8 +9,8 @@ close:"Sulje",
 browse:"Selaa",\r
 class_name:"Luokka",\r
 not_set:"-- Ei m\u00E4\u00E4ritetty --",\r
-clipboard_msg:"Kopioi/Leikkaa/Liit\u00E4 ei ole k\u00E4ytett\u00E4viss\u00E4 Mozilla ja Firefox selaimilla.\nHaluatko lis\u00E4tietoa t\u00E4st\u00E4 ongelmasta?",\r
-clipboard_no_support:"Selaimesi ei ole tuettu, k\u00E4yt\u00E4 sen sijaan n\u00E4pp\u00E4in oikoteit\u00E4.",\r
+clipboard_msg:"Kopioi/Leikkaa/Liit\u00E4 ei ole k\u00E4ytett\u00E4viss\u00E4 Mozilla ja Firefox -selaimilla.\nHaluatko lis\u00E4tietoa t\u00E4st\u00E4 ongelmasta?",\r
+clipboard_no_support:"Selaimesi ei ole tuettu, k\u00E4yt\u00E4 sen sijaan n\u00E4pp\u00E4inoikoteit\u00E4.",\r
 popup_blocked:"Sinulla on k\u00E4yt\u00F6ss\u00E4si ohjelma, joka est\u00E4\u00E4 ponnahdusikkunoiden n\u00E4yt\u00F6n. Sinun t\u00E4ytyy kytke\u00E4 ponnahdusikkunoiden esto pois p\u00E4\u00E4lt\u00E4 voidaksesi hy\u00F6dynt\u00E4\u00E4 t\u00E4ysin t\u00E4t\u00E4 ty\u00F6kalua.",\r
 invalid_data:"Virhe: Sy\u00F6tit virheellisi\u00E4 arvoja, ne n\u00E4kyv\u00E4t punaisina.",\r
 more_colors:"Enemm\u00E4n v\u00E4rej\u00E4"\r
@@ -27,8 +27,8 @@ date_fmt:"%d.%m.%Y",
 time_fmt:"%H:%M:%S",\r
 insertdate_desc:"Lis\u00E4\u00E4 p\u00E4iv\u00E4m\u00E4\u00E4r\u00E4",\r
 inserttime_desc:"Lis\u00E4\u00E4 kellonaika",\r
-months_long:"Tammikuu,Helmikuu,Maaliskuu,Huhtikuu,Toukokuu,Kes\u00E4kuu,Hein\u00E4kuu,Elokuu,Syyskuu,Lokakuu,Marraskuu,Joulukuu",\r
-months_short:"Tammi,Helmi,Maalis,Huhti,Touko,Kes\u00E4,Hein\u00E4,Elo,Syys,Loka,Marras,Joulu",\r
+months_long:"tammikuu,helmikuu,maaliskuu,huhtikuu,toukokuu,kes\u00E4kuu,hein\u00E4kuu,elokuu,syyskuu,lokakuu,marraskuu,joulukuu",\r
+months_short:"tammi,helmi,maalis,huhti,touko,kes\u00E4,hein\u00E4,elo,syys,loka,marras,joulu",\r
 day_long:"sunnuntai,maanantai,tiistai,keskiviikko,torstai,perjantai,lauantai,sunnuntai",\r
 day_short:"su,ma,ti,ke,to,pe,la,su"\r
 },\r
@@ -57,11 +57,11 @@ nonbreaking:{
 nonbreaking_desc:"Lis\u00E4\u00E4 tyhj\u00E4 merkki (nbsp)"\r
 },\r
 iespell:{\r
-iespell_desc:"Oikeinkirjoituksetn tarkistus",\r
-download:"ieSpell ohjelmaa ei havaittu. Haluatko asentaa sen nyt?"\r
+iespell_desc:"Oikeinkirjoituksen tarkistus",\r
+download:"ieSpell-ohjelmaa ei havaittu. Haluatko asentaa sen nyt?"\r
 },\r
 advhr:{\r
-advhr_desc:"Vaakataso viivain"\r
+advhr_desc:"Vaakatasoviivain"\r
 },\r
 emotions:{\r
 emotions_desc:"Hymi\u00F6t"\r
@@ -85,17 +85,19 @@ ins_desc:"Lis\u00E4ys",
 attribs_desc:"Lis\u00E4\u00E4/muokkaa attribuutteja"\r
 },\r
 style:{\r
-desc:"Muokkaa CSS tyylej\u00E4"\r
+desc:"Muokkaa CSS-tyylej\u00E4"\r
 },\r
 paste:{\r
 paste_text_desc:"Liit\u00E4 pelkk\u00E4n\u00E4 tekstin\u00E4",\r
 paste_word_desc:"Liit\u00E4 Wordist\u00E4",\r
-selectall_desc:"Valitse kaikki"\r
+selectall_desc:"Valitse kaikki",\r
+plaintext_mode_sticky:"Liitt\u00E4minen on nyt pelkk\u00E4n\u00E4 tekstin\u00E4. Klikkaa uudelleen vaihtaaksesi takaisin tavalliseen tilaan. Palaat takaisin tavalliseen tilaan liitetty\u00E4si jotakin.",\r
+plaintext_mode:"Liitt\u00E4minen on nyt pelkk\u00E4n\u00E4 tekstin\u00E4. Klikkaa uudelleen vaihtaaksesi takaisin tavalliseen tilaan."\r
 },\r
 paste_dlg:{\r
-text_title:"Paina CTRL+V liitt\u00E4\u00E4ksesi teksti ikkunaan.",\r
+text_title:"Paina CTRL+V liitt\u00E4\u00E4ksesi sis\u00E4ll\u00F6n ikkunaan.",\r
 text_linebreaks:"S\u00E4ilyt\u00E4 rivinvaihdot",\r
-word_title:"Paina CTRL+V liitt\u00E4\u00E4ksesi teksti ikkunaan."\r
+word_title:"Paina CTRL+V liitt\u00E4\u00E4ksesi sis\u00E4ll\u00F6n ikkunaan."\r
 },\r
 table:{\r
 desc:"Lis\u00E4\u00E4 uusi taulukko",\r
@@ -117,10 +119,13 @@ copy_row_desc:"Kopioi taulukon rivi",
 del:"Poista taulukko",\r
 row:"Rivi",\r
 col:"Sarake",\r
-cell:"Solu"\r
+cell:"Solu",\r
+cellprops_delta_width:"80"\r
 },\r
 autosave:{\r
-unload_msg:"Tekem\u00E4si muutokset menetet\u00E4\u00E4n jos poistut t\u00E4lt\u00E4 sivulta."\r
+unload_msg:"Tekem\u00E4si muutokset menetet\u00E4\u00E4n jos poistut t\u00E4lt\u00E4 sivulta.",\r
+restore_content:"Palauta automaattisesti tallennettu sis\u00E4lt\u00F6.",\r
+warning_message:"Jos palautat automaattisesti tallennetun sis\u00E4ll\u00F6n, menet\u00E4t t\u00E4ll\u00E4 hetkell\u00E4 editorissa olevan sis\u00E4ll\u00F6n.\n\nHaluatko varmasti palauttaa tallennetun sis\u00E4ll\u00F6n?"\r
 },\r
 fullscreen:{\r
 desc:"Kokoruututila"\r
@@ -133,10 +138,10 @@ fullpage:{
 desc:"Tiedoston asetukset"\r
 },\r
 template:{\r
-desc:"Lis\u00E4\u00E4 esim\u00E4\u00E4ritetty\u00E4 sivupohja sis\u00E4lt\u00F6\u00E4"\r
+desc:"Lis\u00E4\u00E4 esim\u00E4\u00E4ritetty\u00E4 sivupohjasis\u00E4lt\u00F6\u00E4"\r
 },\r
 visualchars:{\r
-desc:"Visual control characters on/off."\r
+desc:"N\u00E4yt\u00E4/piilota muotoilumerkit."\r
 },\r
 spellchecker:{\r
 desc:"Oikeinkirjoituksen tarkistus",\r
@@ -151,4 +156,16 @@ no_mpell:"Virheit\u00E4 ei l\u00F6ytynyt."
 },\r
 pagebreak:{\r
 desc:"Lis\u00E4\u00E4 sivunvaihto."\r
+},\r
+advlist:{\r
+types:"Tyypit",\r
+def:"Oletus",\r
+lower_alpha:"pienet kirjaimet: a, b, c",\r
+lower_greek:"pienet kirjaimet: \u03B1, \u03B2, \u03B3",\r
+lower_roman:"pienet kirjaimet: i, ii, iii",\r
+upper_alpha:"isot kirjaimet: A, B, C",\r
+upper_roman:"isot kirjaimet: I, II, III",\r
+circle:"Pallo",\r
+disc:"Ympyr\u00E4",\r
+square:"Neli\u00F6"\r
 }}});
\ No newline at end of file
index 6025941b142f4b2ea6ba23cb1affefc42c710bec..64421488a6423e338bda7b24c94a110c3a2ac858 100755 (executable)
@@ -1,18 +1,18 @@
 tinyMCE.addI18n({fr:{\r
 common:{\r
-edit_confirm:"Voulez-vous utiliser le mode WYSIWYG pour cette zone de texte\u00A0?",\r
+edit_confirm:"Souhaitez-vous utiliser le mode WYSIWYG pour cette zone de texte ?",\r
 apply:"Appliquer",\r
 insert:"Ins\u00E9rer",\r
 update:"Mettre \u00E0 jour",\r
 cancel:"Annuler",\r
 close:"Fermer",\r
-browse:"Naviguer",\r
+browse:"parcourir",\r
 class_name:"Classe",\r
-not_set:"-- Non init. --",\r
-clipboard_msg:"Copier/Couper/Coller n'est pas disponible sous Mozilla et sous Firefox.\nVoulez-vous plus d'information sur ce probl\u00E8me\u00A0?",\r
-clipboard_no_support:"Actuellement non support\u00E9 par votre navigateur, utilisez les raccourcis clavier \u00E0 ma place.",\r
+not_set:"-- non d\u00E9fini --",\r
+clipboard_msg:"Les fonctions Copier/Couper/Coller ne sont pas valables sur Mozilla et Firefox.\nSouhaitez-vous avoir plus d'informations sur ce sujet ?",\r
+clipboard_no_support:"Actuellement non support\u00E9 par votre navigateur.\n Veuillez utiliser les raccourcis clavier \u00E0 la place.",\r
 popup_blocked:"D\u00E9sol\u00E9, nous avons d\u00E9tect\u00E9 que votre bloqueur de popup a bloqu\u00E9 une fen\u00EAtre dont l'application a besoin. Vous devez d\u00E9sactiver votre bloqueur de popup pour pouvoir utiliser cet outil.",\r
-invalid_data:"Erreur : Valeurs incorrectes entr\u00E9es, elles sont marqu\u00E9es en rouge.",\r
+invalid_data:"Erreur : saisie de valeurs incorrectes. Elles sont mises en \u00E9vidence en rouge.",\r
 more_colors:"Plus de couleurs"\r
 },\r
 contextmenu:{\r
@@ -25,8 +25,8 @@ full:"Justifi\u00E9"
 insertdatetime:{\r
 date_fmt:"%d-%m-%Y",\r
 time_fmt:"%H:%M:%S",\r
-insertdate_desc:"Ins\u00E9rer date",\r
-inserttime_desc:"Ins\u00E9rer heure",\r
+insertdate_desc:"Ins\u00E9rer la date",\r
+inserttime_desc:"Ins\u00E9rer l'heure",\r
 months_long:"Janvier,F\u00E9vrier,Mars,Avril,Mai,Juin,Juillet,Ao\u00FBt,Septembre,Octobre,Novembre,D\u00E9cembre",\r
 months_short:"Jan,F\u00E9v,Mar,Avr,Mai,Juin,Juil,Ao\u00FBt,Sep,Oct,Nov,D\u00E9c",\r
 day_long:"Dimanche,Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi,Dimanche",\r
@@ -47,64 +47,66 @@ insertlayer_desc:"Ins\u00E9rer une nouvelle couche",
 forward_desc:"D\u00E9placer vers l'avant",\r
 backward_desc:"D\u00E9placer vers l'arri\u00E8re",\r
 absolute_desc:"Activer le positionnement absolu",\r
-content:"Nouvelle couche..."\r
+content:"Nouvelle couche\u2026"\r
 },\r
 save:{\r
-save_desc:"Sauver",\r
-cancel_desc:"Annuler tous les changements"\r
+save_desc:"Enregistrer",\r
+cancel_desc:"Annuler toutes les modifications"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"Ins\u00E9rer un espace ins\u00E9cable"\r
+nonbreaking_desc:"Ins\u00E9rer une espace ins\u00E9cable"\r
 },\r
 iespell:{\r
 iespell_desc:"Lancer le v\u00E9rificateur d'orthographe",\r
-download:"ieSpell non install\u00E9, voulez-vous l'installer maintenant\u00A0?"\r
+download:"ieSpell n'est pas install\u00E9. Souhaitez-vous l'installer maintenant ?"\r
 },\r
 advhr:{\r
-advhr_desc:"Ins\u00E9rer trait horizontal"\r
+advhr_desc:"Ins\u00E9rer un trait horizontal"\r
 },\r
 emotions:{\r
-emotions_desc:"\u00C9motions"\r
+emotions_desc:"\u00C9motic\u00F4nes"\r
 },\r
 searchreplace:{\r
-search_desc:"Chercher",\r
-replace_desc:"Chercher/Remplacer"\r
+search_desc:"Rechercher",\r
+replace_desc:"Rechercher / remplacer"\r
 },\r
 advimage:{\r
-image_desc:"Ins\u00E9rer/\u00C9diter image"\r
+image_desc:"Ins\u00E9rer / \u00E9diter une image"\r
 },\r
 advlink:{\r
-link_desc:"Ins\u00E9rer/\u00C9diter lien"\r
+link_desc:"Ins\u00E9rer / \u00E9diter un lien"\r
 },\r
 xhtmlxtras:{\r
 cite_desc:"Citation",\r
 abbr_desc:"Abr\u00E9viation",\r
 acronym_desc:"Acronyme",\r
-del_desc:"Effacement",\r
-ins_desc:"Insertion",\r
-attribs_desc:"Ins\u00E9rer/\u00C9diter les attributs"\r
+del_desc:"Barr\u00E9",\r
+ins_desc:"Ins\u00E9r\u00E9",\r
+attribs_desc:"Ins\u00E9rer / \u00E9diter les attributs"\r
 },\r
 style:{\r
-desc:"\u00C9diter la feuille de style CSS"\r
+desc:"\u00C9diter la feuille de style (CSS)"\r
 },\r
 paste:{\r
-paste_text_desc:"Coller en tant que texte brut",\r
-paste_word_desc:"Coller au d\u00E9part d'un texte cr\u00E9\u00E9 sous Word",\r
-selectall_desc:"Selectioner tout"\r
+paste_text_desc:"Coller comme texte brut",\r
+paste_word_desc:"Coller un texte cr\u00E9\u00E9 sous Word",\r
+selectall_desc:"Tout s\u00E9lectionner",\r
+plaintext_mode_sticky:"Le collage est actuellement en mode texte non format\u00E9. Cliquez \u00E0 nouveau pour revenir en mode de collage ordinaire. Apr\u00E8s avoir coll\u00E9 quelque chose, vous retournerez en mode de collage ordinaire.",\r
+plaintext_mode:"Le collage est actuellement en mode texte non format\u00E9. Cliquez \u00E0 nouveau pour revenir en mode de collage ordinaire."\r
 },\r
 paste_dlg:{\r
 text_title:"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00EAtre.",\r
-text_linebreaks:"Conserver les sauts de ligne",\r
+text_linebreaks:"Conserver les retours \u00E0 la ligne",\r
 word_title:"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00EAtre."\r
 },\r
 table:{\r
 desc:"Ins\u00E9rer un nouveau tableau",\r
-row_before_desc:"Ins\u00E9rer ligne avant",\r
-row_after_desc:"Ins\u00E9rer ligne apr\u00E8s",\r
-delete_row_desc:"Effacer ligne",\r
-col_before_desc:"Ins\u00E9rer colonne avant",\r
-col_after_desc:"Ins\u00E9rer colonne apr\u00E8s",\r
-delete_col_desc:"Effacer colonne",\r
+row_before_desc:"Ins\u00E9rer une ligne avant",\r
+row_after_desc:"Ins\u00E9rer une ligne apr\u00E8s",\r
+delete_row_desc:"Effacer la ligne",\r
+col_before_desc:"Ins\u00E9rer une colonne avant",\r
+col_after_desc:"Ins\u00E9rer une colonne apr\u00E8s",\r
+delete_col_desc:"Effacer la colonne",\r
 split_cells_desc:"Scinder les cellules fusionn\u00E9es",\r
 merge_cells_desc:"Fusionner les cellules",\r
 row_desc:"Propri\u00E9t\u00E9s de la ligne",\r
@@ -114,20 +116,22 @@ paste_row_before_desc:"Coller la ligne avant",
 paste_row_after_desc:"Coller la ligne apr\u00E8s",\r
 cut_row_desc:"Couper la ligne",\r
 copy_row_desc:"Copier la ligne",\r
-del:"Effacer tableau",\r
+del:"Effacer le tableau",\r
 row:"Ligne",\r
 col:"Colonne",\r
 cell:"Cellule"\r
 },\r
 autosave:{\r
-unload_msg:"Les changements que vous avez faits seront perdus si vous changez de page."\r
+unload_msg:"Les modifications apport\u00E9es seront perdus si vous quittez cette page.",\r
+restore_content:"Restaurer le contenu auto-sauvegard\u00E9.",\r
+warning_message:"Si vous restaurez le contenu sauv\u00E9, vous perdrez le contenu qui est actuellement dans l'\u00E9diteur.\n\n\u00CAtes-vous s\u00FBr de vouloir restaurer le contenu sauv\u00E9 ?"\r
 },\r
 fullscreen:{\r
 desc:"Passer en mode plein \u00E9cran"\r
 },\r
 media:{\r
-desc:"Ins\u00E9rer/\u00C9diter un fichier m\u00E9dia",\r
-edit:"\u00C9diter un fichier m\u00E9dia"\r
+desc:"Ins\u00E9rer / \u00E9diter un m\u00E9dia incorpor\u00E9",\r
+edit:"\u00C9diter un m\u00E9dia incorpor\u00E9"\r
 },\r
 fullpage:{\r
 desc:"Propri\u00E9t\u00E9s du document"\r
@@ -141,14 +145,26 @@ desc:"Activer les caract\u00E8res de mise en page."
 spellchecker:{\r
 desc:"Activer le v\u00E9rificateur d'orthographe",\r
 menu:"Param\u00E8tres du v\u00E9rificateur d'orthographe",\r
-ignore_word:"Ignorer mot",\r
-ignore_words:"Ignorer tout",\r
+ignore_word:"Ignorer le mot",\r
+ignore_words:"Tout ignorer",\r
 langs:"Langues",\r
-wait:"Patientez svp...",\r
+wait:"Veuillez patienter\u2026",\r
 sug:"Suggestions",\r
-no_sug:"Aucune suggestions",\r
+no_sug:"Aucune suggestion",\r
 no_mpell:"Aucune erreur trouv\u00E9e."\r
 },\r
 pagebreak:{\r
-desc:"Ins\u00E9rer saut de page."\r
+desc:"Ins\u00E9rer un saut de page."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Defaut",\r
+lower_alpha:"Alpha minuscule",\r
+lower_greek:"Grec minuscule",\r
+lower_roman:"Romain minuscule",\r
+upper_alpha:"Alpha majuscule",\r
+upper_roman:"Romain majuscule",\r
+circle:"Cercle",\r
+disc:"Disque",\r
+square:"Carr\u00E9"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/gl.js b/program/js/tiny_mce/langs/gl.js
new file mode 100644 (file)
index 0000000..9e70a7c
--- /dev/null
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({gl:{\r
+common:{\r
+edit_confirm:"\u00BFDesexa utiliza-lo modo WYSIWYG pra esta caixa de texto?",\r
+apply:"Apricar",\r
+insert:"Insertar",\r
+update:"Actualizar",\r
+cancel:"Cancelar",\r
+close:"Cerrar",\r
+browse:"Examinar",\r
+class_name:"Clase",\r
+not_set:"-- Ning\u00FAn --",\r
+clipboard_msg:"Copiar/Cortar/Pegar non est\u00E1 disponible en Mozilla e Firefox.\n\u00BFDesexa obter mais informaci\u00F3n sobre de este asunto?",\r
+clipboard_no_support:"O seu navegador non soporta estas funci\u00F3ns, use os atallos de teclado.",\r
+popup_blocked:"O seu bloqueador de vent\u00E1s emerxentes deshabilitou unha vent\u00E1 que precisa pra o funcionamento da aplicaci\u00F3n. Precisa deshabilita-lo bloqueo de `popups` neste sitio pra utilizar \u00F3 m\u00E1ximo esta ferramenta.",\r
+invalid_data:"Error: Introducidos valores non v\u00E1lidos, est\u00E1n marcados en vermello.",\r
+more_colors:"Mais cores"\r
+},\r
+contextmenu:{\r
+align:"Ali\u00F1amento",\r
+left:"Esquerda",\r
+center:"Centrado",\r
+right:"Dereita",\r
+full:"Xustificado"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%d-%m-%Y",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Insertar data",\r
+inserttime_desc:"Insertar hora",\r
+months_long:"Xaneito,Febreiro,Marzo,Abril,Maio,Xu\u00F1o,Xullo,Agosto,Setembro,Outubro,Novembro,Decembro",\r
+months_short:"Xan,Feb,Mar,Abr,Mai,Xu\u00F1,Xul,Ago,Set,Out,Nov,Dec",\r
+day_long:"Domingo,Luns,Martes,M\u00E9rcores,Xoves,Venres,S\u00E1bado,Domingo",\r
+day_short:"Dom,Lun,Mar,M\u00E9r,Xov,Ver,S\u00E1b,Dom"\r
+},\r
+print:{\r
+print_desc:"Imprimir"\r
+},\r
+preview:{\r
+preview_desc:"Vista previa"\r
+},\r
+directionality:{\r
+ltr_desc:"Direcci\u00F3n esquerda a dereita",\r
+rtl_desc:"Direcci\u00F3n dereita a esquerda"\r
+},\r
+layer:{\r
+insertlayer_desc:"Insertar nova capa",\r
+forward_desc:"Avanzar",\r
+backward_desc:"Recuar",\r
+absolute_desc:"Posici\u00F3n absoluta",\r
+content:"Nova capa..."\r
+},\r
+save:{\r
+save_desc:"Gardar",\r
+cancel_desc:"Cancelar todo-los cambios"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"Insertar espacio non colapsable"\r
+},\r
+iespell:{\r
+iespell_desc:"Corrector ortogr\u00E1fico",\r
+download:"Non se detectou 'ieSpell'. \u00BFDesexa instala-lo agora?"\r
+},\r
+advhr:{\r
+advhr_desc:"Regra horizontal"\r
+},\r
+emotions:{\r
+emotions_desc:"Emoticones"\r
+},\r
+searchreplace:{\r
+search_desc:"Buscar",\r
+replace_desc:"Buscar/Reemplazar"\r
+},\r
+advimage:{\r
+image_desc:"Insertar/editar imaxe"\r
+},\r
+advlink:{\r
+link_desc:"Insertar/editar hiperv\u00EDnculo"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Cita",\r
+abbr_desc:"Abreviatura",\r
+acronym_desc:"Acr\u00F3nimo",\r
+del_desc:"Borrado",\r
+ins_desc:"Inserci\u00F3n",\r
+attribs_desc:"Insertar/Editar atributos"\r
+},\r
+style:{\r
+desc:"Editar Estilo CSS"\r
+},\r
+paste:{\r
+paste_text_desc:"Pegar como texto simple",\r
+paste_word_desc:"Pegar desde Word",\r
+selectall_desc:"Seleccionar todo",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"Use CTRL+V no teclado pra pega-lo texto na vent\u00E1.",\r
+text_linebreaks:"Manter salto de li\u00F1as",\r
+word_title:"Use CTRL+V no teclado pra pega-lo texto na vent\u00E1."\r
+},\r
+table:{\r
+desc:"Inserta unha nova t\u00E1boa",\r
+row_before_desc:"Insertar fila (antes)",\r
+row_after_desc:"Insertar fila (desp\u00F3is)",\r
+delete_row_desc:"Suprimir fila",\r
+col_before_desc:"Insertar columna (antes)",\r
+col_after_desc:"Insertar columna (desp\u00F3is)",\r
+delete_col_desc:"Suprimir columna",\r
+split_cells_desc:"Dividir celdas",\r
+merge_cells_desc:"Vincular celdas",\r
+row_desc:"Propiedades da fila",\r
+cell_desc:"Propiedades da celda",\r
+props_desc:"Propiedades da t\u00E1boa",\r
+paste_row_before_desc:"Pegar filas (antes)",\r
+paste_row_after_desc:"Pegar filas (desp\u00F3is)",\r
+cut_row_desc:"Cortar fila",\r
+copy_row_desc:"Copiar fila",\r
+del:"Eliminar t\u00E1boa",\r
+row:"Fila",\r
+col:"Columna",\r
+cell:"Celda"\r
+},\r
+autosave:{\r
+unload_msg:"Os cambios realizados perderanse se sae desta p\u00E1xina.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"Cambiar a modo Pantalla Completa"\r
+},\r
+media:{\r
+desc:"Insertar/editar medio embebido",\r
+edit:"Editar medio embebido"\r
+},\r
+fullpage:{\r
+desc:"Propiedades do documento"\r
+},\r
+template:{\r
+desc:"Insertar contido de plantilla predefinida"\r
+},\r
+visualchars:{\r
+desc:"Caracteres de control ON/OFF."\r
+},\r
+spellchecker:{\r
+desc:"Conmutar corrector ortogr\u00E1fico",\r
+menu:"Configuraci\u00F3n de corrector ortogr\u00E1fico",\r
+ignore_word:"Ignorar verba",\r
+ignore_words:"Ignorar todo",\r
+langs:"Idiomas",\r
+wait:"Agarde...",\r
+sug:"Suxerencias",\r
+no_sug:"Sen suxerencias",\r
+no_mpell:"Non se atoparon erros."\r
+},\r
+pagebreak:{\r
+desc:"Insertar fin de p\u00E1xina"\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
index 4b40c3cb41d8056673f696c502ac63ff32d9f9c8..bd955c22d2cd034457640465a6281c059e22ffbf 100755 (executable)
@@ -12,7 +12,7 @@ not_set:"-- \u05DC\u05D0 \u05D4\u05D5\u05D2\u05D3\u05E8 --",
 clipboard_msg:"\r\n        \u05D4\u05E2\u05EA\u05E7\u05D4/\u05D2\u05D6\u05D9\u05E8\u05D4 \u05D5\u05D4\u05D3\u05D1\u05E7\u05D4 \u05D0\u05D9\u05E0\u05DD \u05D6\u05DE\u05D9\u05E0\u05D9\u05DD \u05D1 Mozilla \u05D5\u05D1-Firefox.\r\n        \u05D4\u05D0\u05DD \u05D1\u05E8\u05E6\u05D5\u05E0\u05DA \u05DC\u05E7\u05D1\u05DC \u05DE\u05D9\u05D3\u05E2 \u05E0\u05D5\u05E1\u05E3 \u05E2\u05DC \u05D4\u05E0\u05D5\u05E9\u05D0?\r\n      ",\r
 clipboard_no_support:"\u05DB\u05E8\u05D2\u05E2 \u05DC\u05D0 \u05E0\u05EA\u05DE\u05DA \u05E2\u05DC \u05D9\u05D3\u05D9 \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05E9\u05DC\u05DA. \u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05E7\u05D9\u05E6\u05D5\u05E8\u05D9 \u05D4\u05DE\u05E7\u05DC\u05D3\u05EA.",\r
 popup_blocked:"\u05D7\u05D5\u05E1\u05DD \u05E4\u05E8\u05D9\u05D8\u05D9\u05DD \u05DE\u05D5\u05E7\u05E4\u05E6\u05D9\u05DD \u05DE\u05E0\u05E2 \u05DE\u05D7\u05DC\u05D5\u05DF \u05D7\u05E9\u05D5\u05D1 \u05DE\u05DC\u05D4\u05E4\u05EA\u05D7,\u05D0\u05DD \u05D1\u05E8\u05E6\u05D5\u05E0\u05DA \u05DC\u05D4\u05E9\u05EA\u05DE\u05E9 \u05D1\u05DB\u05DC\u05D9 \u05D6\u05D4 \u05E2\u05DC\u05D9\u05DA \u05DC\u05D1\u05D8\u05DC \u05D0\u05EA \u05D7\u05D5\u05E1\u05DD \u05D4\u05E4\u05E8\u05D9\u05D8\u05D9\u05DD",\r
-invalid_data:"Error: Invalid values entered, these are marked in red.",\r
+invalid_data:"\u05E9\u05D2\u05D9\u05D0\u05D4: \u05D4\u05D5\u05E7\u05DC\u05D3 \u05DE\u05D9\u05D3\u05E2 \u05DC\u05D0 \u05EA\u05E7\u05E0\u05D9. \u05D4\u05DE\u05D9\u05D3\u05E2 \u05E1\u05D5\u05DE\u05DF \u05D1\u05D0\u05D3\u05D5\u05DD.",\r
 more_colors:"\u05E2\u05D5\u05D3 \u05E6\u05D1\u05E2\u05D9\u05DD"\r
 },\r
 contextmenu:{\r
@@ -57,7 +57,7 @@ nonbreaking:{
 nonbreaking_desc:"\u05D4\u05D5\u05E1\u05E4\u05EA \u05E8\u05D5\u05D5\u05D7"\r
 },\r
 iespell:{\r
-iespell_desc:"\u05D1\u05D3\u05D9\u05E7\u05EA \u05D0\u05D9\u05D5\u05EA",\r
+iespell_desc:"\u05D1\u05D3\u05D9\u05E7\u05EA \u05D0\u05D9\u05D5\u05EA \u05D1\u05D0\u05E0\u05D2\u05DC\u05D9\u05EA",\r
 download:" \u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0 ieSpell. \u05D4\u05D0\u05DD \u05D1\u05E8\u05E6\u05D5\u05E0\u05DA \u05DC\u05D4\u05EA\u05E7\u05D9\u05DF?"\r
 },\r
 advhr:{\r
@@ -74,36 +74,38 @@ advimage:{
 image_desc:"\u05D4\u05D5\u05E1\u05E4\u05D4/\u05E2\u05E8\u05D9\u05DB\u05EA \u05EA\u05DE\u05D5\u05E0\u05D4"\r
 },\r
 advlink:{\r
-link_desc:"\u05D4\u05D5\u05E1\u05E4\u05D4/\u05E2\u05E8\u05D9\u05DB\u05EA \u05D4\u05D9\u05E4\u05E8-\u05E7\u05D9\u05E9\u05D5\u05E8"\r
+link_desc:"\u05D4\u05D5\u05E1\u05E4\u05EA/\u05E2\u05E8\u05D9\u05DB\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8"\r
 },\r
 xhtmlxtras:{\r
-cite_desc:"Citation",\r
-abbr_desc:"Abbreviation",\r
-acronym_desc:"Acronym",\r
-del_desc:"Deletion",\r
-ins_desc:"Insertion",\r
-attribs_desc:"Insert/Edit Attributes"\r
+cite_desc:"\u05E6\u05D9\u05D8\u05D5\u05D8",\r
+abbr_desc:"\u05E7\u05D9\u05E6\u05D5\u05E8",\r
+acronym_desc:"\u05E8\u05D0\u05E9\u05D9 \u05EA\u05D9\u05D1\u05D5\u05EA",\r
+del_desc:"\u05DE\u05D7\u05D9\u05E7\u05D4",\r
+ins_desc:"\u05D4\u05DB\u05E0\u05E1\u05D4",\r
+attribs_desc:"\u05D4\u05DB\u05E0\u05E1/\u05E2\u05E8\u05D5\u05DA \u05EA\u05DB\u05D5\u05E0\u05D5\u05EA"\r
 },\r
 style:{\r
 desc:"\u05E2\u05D3\u05DB\u05D5\u05DF \u05D4\u05D2\u05D3\u05E8\u05D5\u05EA CSS"\r
 },\r
 paste:{\r
-paste_text_desc:"Paste as Plain Text",\r
-paste_word_desc:"Paste from Word",\r
-selectall_desc:"Select All"\r
+paste_text_desc:"\u05D4\u05D3\u05D1\u05E7\u05D4 \u05DB\u05D8\u05E7\u05E1\u05D8 \u05D1\u05DC\u05D1\u05D3",\r
+paste_word_desc:"\u05D4\u05D3\u05D1\u05E7\u05D4 \u05DE-WORD",\r
+selectall_desc:"\u05D1\u05D7\u05E8 \u05D4\u05DB\u05DC",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
-text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
-text_linebreaks:"Keep linebreaks",\r
-word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+text_title:"\u05D4\u05D3\u05D1\u05D9\u05E7\u05D5 \u05D1\u05D7\u05DC\u05D5\u05DF \u05D6\u05D4 \u05D0\u05EA \u05D4\u05D8\u05E7\u05E1\u05D8 \u05D1\u05D0\u05DE\u05E6\u05E2\u05D5\u05EA \u05D4\u05DE\u05E7\u05E9\u05D9\u05DD CTRL+V.",\r
+text_linebreaks:"\u05D4\u05E9\u05D0\u05E8 \u05D0\u05EA \u05E9\u05D5\u05E8\u05D5\u05EA \u05D4\u05E8\u05D5\u05D5\u05D7",\r
+word_title:"\u05D4\u05D3\u05D1\u05D9\u05E7\u05D5 \u05D1\u05D7\u05DC\u05D5\u05DF \u05D6\u05D4 \u05D0\u05EA \u05D4\u05D8\u05E7\u05E1\u05D8 \u05D1\u05D0\u05DE\u05E6\u05E2\u05D5\u05EA \u05D4\u05DE\u05E7\u05E9\u05D9\u05DD CTRL+V."\r
 },\r
 table:{\r
 desc:"\u05D4\u05DB\u05E0\u05E1\u05EA \u05D8\u05D1\u05DC\u05D4 \u05D7\u05D3\u05E9\u05D4",\r
-row_before_desc:"\u05D4\u05DB\u05E0\u05E1\u05EA \u05E9\u05D5\u05E8\u05D4 \u05DC\u05E4\u05E0\u05D9",\r
-row_after_desc:"\u05D4\u05DB\u05E0\u05E1\u05EA \u05E9\u05D5\u05E8\u05D4 \u05D0\u05D7\u05E8\u05D9",\r
-delete_row_desc:"\u05DE\u05D7\u05E7/\u05D9 \u05E9\u05D5\u05E8\u05D4",\r
-col_before_desc:"\u05D4\u05DB\u05E0\u05E1\u05EA \u05E2\u05DE\u05D5\u05D3\u05D4 \u05DC\u05E4\u05E0\u05D9",\r
-col_after_desc:"\u05D4\u05DB\u05E0\u05E1\u05EA \u05E2\u05DE\u05D5\u05D3\u05D4 \u05D0\u05D7\u05E8\u05D9",\r
+row_before_desc:"\u05D4\u05DB\u05E0\u05E1\u05EA \u05E9\u05D5\u05E8\u05D4 \u05DE\u05E2\u05DC",\r
+row_after_desc:"\u05D4\u05DB\u05E0\u05E1\u05EA \u05E9\u05D5\u05E8\u05D4 \u05DE\u05EA\u05D7\u05EA",\r
+delete_row_desc:"\u05DE\u05D7\u05D9\u05E7\u05EA \u05E9\u05D5\u05E8\u05D4",\r
+col_before_desc:"\u05D4\u05DB\u05E0\u05E1\u05EA \u05E2\u05DE\u05D5\u05D3\u05D4 \u05DE\u05D9\u05DE\u05D9\u05DF",\r
+col_after_desc:"\u05D4\u05DB\u05E0\u05E1\u05EA \u05E2\u05DE\u05D5\u05D3\u05D4 \u05DE\u05E9\u05DE\u05D0\u05DC",\r
 delete_col_desc:"\u05D4\u05E1\u05E8\u05EA \u05E2\u05DE\u05D5\u05D3\u05D4",\r
 split_cells_desc:"\u05E4\u05D9\u05E6\u05D5\u05DC \u05EA\u05D0\u05D9\u05DD \u05D1\u05D8\u05D1\u05DC\u05D4",\r
 merge_cells_desc:"\u05D0\u05D9\u05D7\u05D5\u05D3 \u05EA\u05D0\u05D9\u05DD \u05D1\u05D8\u05D1\u05DC\u05D4",\r
@@ -120,17 +122,19 @@ col:"\u05E2\u05DE\u05D5\u05D3\u05D4",
 cell:"\u05EA\u05D0"\r
 },\r
 autosave:{\r
-unload_msg:"\u05D4\u05E9\u05D9\u05E0\u05D5\u05D9\u05D9\u05DD \u05E9\u05D1\u05D9\u05E6\u05E2\u05EA \u05DC\u05D0 \u05D9\u05E9\u05DE\u05E8\u05D5 \u05D0\u05DD \u05EA\u05E2\u05D1\u05D5\u05E8 \u05DE\u05D3\u05E3 \u05D6\u05D4"\r
+unload_msg:"\u05D4\u05E9\u05D9\u05E0\u05D5\u05D9\u05D9\u05DD \u05E9\u05D1\u05D9\u05E6\u05E2\u05EA \u05DC\u05D0 \u05D9\u05E9\u05DE\u05E8\u05D5 \u05D0\u05DD \u05EA\u05E2\u05D1\u05D5\u05E8 \u05DE\u05D3\u05E3 \u05D6\u05D4",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
-desc:"Toggle fullscreen mode"\r
+desc:"\u05DE\u05E2\u05D1\u05E8 \u05DC\u05DE\u05E1\u05DA \u05DE\u05DC\u05D0/\u05D7\u05DC\u05E7\u05D9"\r
 },\r
 media:{\r
-desc:"Insert / edit embedded media",\r
-edit:"Edit embedded media"\r
+desc:"\u05D4\u05D5\u05E1\u05E4\u05EA/\u05E2\u05E8\u05D9\u05DB\u05EA \u05E1\u05E8\u05D8\u05D5\u05DF",\r
+edit:"\u05E2\u05E8\u05D9\u05DB\u05EA \u05E1\u05E8\u05D8\u05D5\u05DF"\r
 },\r
 fullpage:{\r
-desc:"Document properties"\r
+desc:"\u05DE\u05D0\u05E4\u05D9\u05D9\u05E0\u05D9 \u05E2\u05DE\u05D5\u05D3"\r
 },\r
 template:{\r
 desc:"Insert predefined template content"\r
@@ -139,16 +143,28 @@ visualchars:{
 desc:"Visual control characters on/off."\r
 },\r
 spellchecker:{\r
-desc:"Toggle spellchecker",\r
-menu:"Spellchecker settings",\r
-ignore_word:"Ignore word",\r
-ignore_words:"Ignore all",\r
+desc:"\u05D4\u05E4\u05E2\u05DC\u05EA \u05D1\u05D5\u05D3\u05E7 \u05D0\u05D9\u05D5\u05EA",\r
+menu:"\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D1\u05D5\u05D3\u05E7 \u05D0\u05D9\u05D5\u05EA",\r
+ignore_word:"\u05DC\u05D4\u05EA\u05E2\u05DC\u05DD \u05DE\u05D4\u05DE\u05D9\u05DC\u05D4",\r
+ignore_words:"\u05DC\u05D4\u05EA\u05E2\u05DC\u05DD \u05DE\u05D4\u05DB\u05DC",\r
 langs:"\u05E9\u05E4\u05D5\u05EA",\r
-wait:"Please wait...",\r
-sug:"Suggestions",\r
-no_sug:"No suggestions",\r
-no_mpell:"No misspellings found."\r
+wait:"\u05E0\u05D0 \u05DC\u05D4\u05DE\u05EA\u05D9\u05DF..",\r
+sug:"\u05D4\u05E6\u05E2\u05D5\u05EA",\r
+no_sug:"\u05D0\u05D9\u05DF \u05D4\u05E6\u05E2\u05D5\u05EA",\r
+no_mpell:"\u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0\u05D5 \u05E9\u05D2\u05D9\u05D0\u05D5\u05EA \u05D0\u05D9\u05D5\u05EA"\r
 },\r
 pagebreak:{\r
-desc:"Insert page break."\r
+desc:"\u05D4\u05D5\u05E1\u05E4\u05EA \u05DE\u05E2\u05D1\u05E8 \u05D3\u05E3"\r
+},\r
+advlist:{\r
+types:"\u05E1\u05D5\u05D2\u05D9\u05DD",\r
+def:"\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"\u05E2\u05D2\u05D5\u05DC",\r
+disc:"\u05D3\u05D9\u05E1\u05E7",\r
+square:"\u05DE\u05E8\u05D5\u05D1\u05E2"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/hi.js b/program/js/tiny_mce/langs/hi.js
new file mode 100644 (file)
index 0000000..e2fe567
--- /dev/null
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({hi:{\r
+common:{\r
+edit_confirm:"Do you want to use the WYSIWYG mode for this textarea?",\r
+apply:"Apply",\r
+insert:"Insert",\r
+update:"Update",\r
+cancel:"Cancel",\r
+close:"Close",\r
+browse:"Browse",\r
+class_name:"Class",\r
+not_set:"-- Not set --",\r
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?",\r
+clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.",\r
+popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.",\r
+invalid_data:"Error: Invalid values entered, these are marked in red.",\r
+more_colors:"More colors"\r
+},\r
+contextmenu:{\r
+align:"Alignment",\r
+left:"Left",\r
+center:"Center",\r
+right:"Right",\r
+full:"Full"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%Y-%m-%d",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Insert date",\r
+inserttime_desc:"Insert time",\r
+months_long:"January,February,March,April,May,June,July,August,September,October,November,December",\r
+months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",\r
+day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday",\r
+day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"\r
+},\r
+print:{\r
+print_desc:"Print"\r
+},\r
+preview:{\r
+preview_desc:"Preview"\r
+},\r
+directionality:{\r
+ltr_desc:"Direction left to right",\r
+rtl_desc:"Direction right to left"\r
+},\r
+layer:{\r
+insertlayer_desc:"Insert new layer",\r
+forward_desc:"Move forward",\r
+backward_desc:"Move backward",\r
+absolute_desc:"Toggle absolute positioning",\r
+content:"New layer..."\r
+},\r
+save:{\r
+save_desc:"Save",\r
+cancel_desc:"Cancel all changes"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"Insert non-breaking space character"\r
+},\r
+iespell:{\r
+iespell_desc:"Run spell checking",\r
+download:"ieSpell not detected. Do you want to install it now?"\r
+},\r
+advhr:{\r
+advhr_desc:"Horizontal rule"\r
+},\r
+emotions:{\r
+emotions_desc:"Emotions"\r
+},\r
+searchreplace:{\r
+search_desc:"Find",\r
+replace_desc:"Find/Replace"\r
+},\r
+advimage:{\r
+image_desc:"Insert/edit image"\r
+},\r
+advlink:{\r
+link_desc:"Insert/edit link"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Citation",\r
+abbr_desc:"Abbreviation",\r
+acronym_desc:"Acronym",\r
+del_desc:"Deletion",\r
+ins_desc:"Insertion",\r
+attribs_desc:"Insert/Edit Attributes"\r
+},\r
+style:{\r
+desc:"Edit CSS Style"\r
+},\r
+paste:{\r
+paste_text_desc:"Paste as Plain Text",\r
+paste_word_desc:"Paste from Word",\r
+selectall_desc:"Select All",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+},\r
+table:{\r
+desc:"Inserts a new table",\r
+row_before_desc:"Insert row before",\r
+row_after_desc:"Insert row after",\r
+delete_row_desc:"Delete row",\r
+col_before_desc:"Insert column before",\r
+col_after_desc:"Insert column after",\r
+delete_col_desc:"Remove column",\r
+split_cells_desc:"Split merged table cells",\r
+merge_cells_desc:"Merge table cells",\r
+row_desc:"Table row properties",\r
+cell_desc:"Table cell properties",\r
+props_desc:"Table properties",\r
+paste_row_before_desc:"Paste table row before",\r
+paste_row_after_desc:"Paste table row after",\r
+cut_row_desc:"Cut table row",\r
+copy_row_desc:"Copy table row",\r
+del:"Delete table",\r
+row:"Row",\r
+col:"Column",\r
+cell:"Cell"\r
+},\r
+autosave:{\r
+unload_msg:"The changes you made will be lost if you navigate away from this page.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"Toggle fullscreen mode"\r
+},\r
+media:{\r
+desc:"Insert / edit embedded media",\r
+edit:"Edit embedded media"\r
+},\r
+fullpage:{\r
+desc:"Document properties"\r
+},\r
+template:{\r
+desc:"Insert predefined template content"\r
+},\r
+visualchars:{\r
+desc:"Visual control characters on/off."\r
+},\r
+spellchecker:{\r
+desc:"Toggle spellchecker",\r
+menu:"Spellchecker settings",\r
+ignore_word:"Ignore word",\r
+ignore_words:"Ignore all",\r
+langs:"Languages",\r
+wait:"Please wait...",\r
+sug:"Suggestions",\r
+no_sug:"No suggestions",\r
+no_mpell:"No misspellings found."\r
+},\r
+pagebreak:{\r
+desc:"Insert page break."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
index 18c7d18e02ecd15cca4229266952bc33b59c5b41..c8019793d06b0014c64428859f65ccd8866576f4 100755 (executable)
@@ -74,7 +74,8 @@ advimage:{
 image_desc:"Umetni/uredi sliku"\r
 },\r
 advlink:{\r
-link_desc:"Insert/edit link"\r
+link_desc:"Insert/edit link",\r
+delta_width:"100"\r
 },\r
 xhtmlxtras:{\r
 cite_desc:"Citat",\r
@@ -90,7 +91,9 @@ desc:"Uredi CSS"
 paste:{\r
 paste_text_desc:"Zalijepi kao obi\u010Dni tekst",\r
 paste_word_desc:"Zalijepi iz Worda",\r
-selectall_desc:"Odaberi sve"\r
+selectall_desc:"Odaberi sve",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Koristite CTRL+V na tipkovnici da zalijepite tekst u prozor.",\r
@@ -120,7 +123,9 @@ col:"Stupac",
 cell:"\u0106elija"\r
 },\r
 autosave:{\r
-unload_msg:"Promjene u dokumentu \u0107e biti izgubljene ako iza\u0111ete s ove stranice."\r
+unload_msg:"Promjene u dokumentu \u0107e biti izgubljene ako iza\u0111ete s ove stranice.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Uklju\u010Di/isklju\u010Di prikaz preko cijelog ekrana"\r
@@ -151,4 +156,16 @@ no_mpell:"Nije prona\u0111ena nijedna pravopisna gre\u0161ke."
 },\r
 pagebreak:{\r
 desc:"Umetni prijelom."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index 45247185d82aea39a37b8e60cb78ea9d5c685686..ca39617dc9666c6889106459b56fc1c6841c072a 100755 (executable)
@@ -1,17 +1,17 @@
 tinyMCE.addI18n({hu:{\r
 common:{\r
-edit_confirm:"Haszn\u00E1lni akarja a WYSIWYG m\u00F3dot ebben a sz\u00F6vegdobozban?",\r
-apply:"Alkalmaz",\r
-insert:"Besz\u00FAr",\r
-update:"Friss\u00EDt",\r
-cancel:"M\u00E9gse",\r
-close:"Bez\u00E1r",\r
-browse:"Tall\u00F3z",\r
+edit_confirm:"Haszn\u00E1lni k\u00EDv\u00E1nja a WYSIWYG m\u00F3dot ebben a sz\u00F6vegdobozban?",\r
+apply:"Alkalmaz\u00E1s",\r
+insert:"Besz\u00FAr\u00E1s",\r
+update:"Friss\u00EDt\u00E9s",\r
+cancel:"M\u00E9gsem",\r
+close:"Bez\u00E1r\u00E1s",\r
+browse:"Tall\u00F3z\u00E1s",\r
 class_name:"Oszt\u00E1ly",\r
 not_set:"-- Nincs megadva --",\r
-clipboard_msg:"A M\u00E1sol\u00E1s/Kiv\u00E1g\u00E1s/Besz\u00FAr\u00E1s funkci\u00F3k nem el\u00E9rhet\u0151k Mozilla \u00E9s Firefox alatt.\nK\u00EDv\u00E1n t\u00F6bbet tudni err\u0151l a t\u00E9m\u00E1r\u00F3l?",\r
+clipboard_msg:"A M\u00E1sol\u00E1s/Kiv\u00E1g\u00E1s/Besz\u00FAr\u00E1s funkci\u00F3k nem \u00E9rhet\u0151ek el Mozilla \u00E9s Firefox alatt.\nK\u00EDv\u00E1n t\u00F6bbet tudni err\u0151l a t\u00E9m\u00E1r\u00F3l?",\r
 clipboard_no_support:"Jelenleg nem t\u00E1mogatja a b\u00F6ng\u00E9sz\u0151je, haszn\u00E1lja a billenty\u0171kombin\u00E1ci\u00F3kat helyette.",\r
-popup_blocked:"A felugr\u00F3 ablakok tilt\u00E1sa miatt nem tudtunk megjelen\u00EDteni egy, az alkalmaz\u00E1shoz sz\u00FCks\u00E9ges ablakot. Enged\u00E9lyezze a b\u00F6ng\u00E9sz\u0151j\u00E9ben a felugr\u00F3 ablakokat, hogy minden funkci\u00F3t haszn\u00E1lhasson.",\r
+popup_blocked:"A felugr\u00F3 ablakok tilt\u00E1sa miatt nem siker\u00FClt megjelen\u00EDteni egy, az alkalmaz\u00E1shoz sz\u00FCks\u00E9ges ablakot. Enged\u00E9lyezze a b\u00F6ng\u00E9sz\u0151j\u00E9ben a felugr\u00F3 ablakokat, hogy minden funkci\u00F3t haszn\u00E1lhasson.",\r
 invalid_data:"Hiba: \u00C9rv\u00E9nytelen adatok, pirossal jel\u00F6lve.",\r
 more_colors:"T\u00F6bb sz\u00EDn"\r
 },\r
@@ -28,7 +28,7 @@ time_fmt:"%H:%M:%S",
 insertdate_desc:"D\u00E1tum besz\u00FAr\u00E1sa",\r
 inserttime_desc:"Id\u0151 besz\u00FAr\u00E1sa",\r
 months_long:"janu\u00E1r,febru\u00E1r,m\u00E1rcius,\u00E1prilis,m\u00E1jus,j\u00FAnius,j\u00FAlius,augusztus,szeptember,okt\u00F3ber,november,december",\r
-months_short:"jan,feb,m\u00E1r,\u00E1pr,m\u00E1j,j\u00FAn,j\u00FAl,aug,szep,okt,nov,dec",\r
+months_short:"jan,feb,m\u00E1r,\u00E1pr,m\u00E1j,j\u00FAn,j\u00FAl,aug,szept,okt,nov,dec",\r
 day_long:"vas\u00E1rnap,h\u00E9tf\u0151,kedd,szerda,cs\u00FCt\u00F6rt\u00F6k,p\u00E9ntek,szombat,vas\u00E1rnap",\r
 day_short:"V,H,K,Sze,Cs,P,Szo,V"\r
 },\r
@@ -90,7 +90,9 @@ desc:"CSS st\u00EDlus szerkeszt\u00E9se"
 paste:{\r
 paste_text_desc:"Besz\u00FAr\u00E1s sz\u00F6vegk\u00E9nt",\r
 paste_word_desc:"Besz\u00FAr\u00E1s Wordb\u0151l",\r
-selectall_desc:"Mindent kijel\u00F6l"\r
+selectall_desc:"Mindent kijel\u00F6l",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Haszn\u00E1lja a Ctrl+V-t a billenty\u0171zet\u00E9n a beilleszt\u00E9shez.",\r
@@ -120,7 +122,9 @@ col:"Oszlop",
 cell:"Cella"\r
 },\r
 autosave:{\r
-unload_msg:"A m\u00F3dos\u00EDt\u00E1sok nem lesznek mentve, ha elhagyja az oldalt."\r
+unload_msg:"A m\u00F3dos\u00EDt\u00E1sok nem lesznek mentve, ha elhagyja az oldalt.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Teljesk\u00E9perny\u0151s m\u00F3d ki-/bekapcsol\u00E1sa"\r
@@ -151,4 +155,16 @@ no_mpell:"Nem tal\u00E1ltam helyes\u00EDr\u00E1si hib\u00E1t."
 },\r
 pagebreak:{\r
 desc:"Oldalt\u00F6r\u00E9s besz\u00FAr\u00E1sa."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"K\u00F6r",\r
+disc:"Lemez",\r
+square:"Square"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/hy.js b/program/js/tiny_mce/langs/hy.js
new file mode 100644 (file)
index 0000000..64578b8
--- /dev/null
@@ -0,0 +1,173 @@
+tinyMCE.addI18n({hy:{\r
+common:{\r
+edit_confirm:"\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C WYSIWYG \u0440\u0435\u0436\u0438\u043C \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u043F\u043E\u043B\u044F?",\r
+apply:"\u0540\u0561\u057D\u057F\u0561\u057F\u0565\u056C",\r
+insert:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C",\r
+update:"\u0539\u0561\u0580\u0574\u0561\u0581\u0576\u0565\u056C",\r
+cancel:"\u0549\u0565\u0572\u0575\u0561\u056C",\r
+close:"\u0553\u0561\u056F\u0565\u056C",\r
+browse:"\u0534\u056B\u057F\u0565\u056C",\r
+class_name:"\u0534\u0561\u057D",\r
+not_set:"- \u0568\u0576\u057F\u0580\u0565\u056C -",\r
+clipboard_msg:"\u054A\u0561\u057F\u0573\u0565\u0576\u0565\u056C / \u053F\u057F\u0580\u0565\u056C / \u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C (\u0574\u0561\u057F\u0579\u0565\u056C\u056B \u0579\u0567 Mozilla \u0587 Firefox \u0562\u0580\u0561\u0578\u0582\u0566\u0565\u0580\u0576\u0565\u0580\u0578\u0582\u0574) \ n \u0541\u0565\u0566 \u0570\u0565\u057F\u0561\u0584\u0580\u0584\u056B\u055E\u0580 \u0567 \u0561\u0575\u0564 \u056B\u0576\u0586\u0578\u0580\u0574\u0561\u0581\u056B\u0561\u0576",\r
+clipboard_no_support:"\u054F\u057E\u0575\u0561\u056C \u057A\u0561\u0570\u056B\u0576 \u0579\u056B \u0568\u0576\u0564\u0578\u0582\u0576\u057E\u0578\u0582\u0574 \u0541\u0565\u0580 \u0562\u0580\u0561\u0578\u0582\u0566\u0565\u0580\u056B \u056F\u0578\u0572\u0574\u056B\u0581, \u0585\u0563\u057F\u0561\u0563\u0578\u0580\u056E\u0565\u0584 \u0570\u0561\u057A\u0561\u057E\u0578\u0582\u0574\u0576\u0565\u0580",\r
+popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool",\r
+invalid_data:"\u054D\u056D\u0561\u056C: \u0546\u0565\u0580\u0561\u056E\u057E\u0561\u056E \u0567 \u057D\u056D\u0561\u056C \u0561\u0580\u056A\u0565\u0584, \u0563\u0578\u0582\u0576\u0561\u0576\u0577\u057E\u0561\u056E \u0567 \u056F\u0561\u0580\u0574\u056B\u0580\u0578\u057E",\r
+more_colors:"\u0547\u0561\u057F \u0563\u0578\u0582\u0575\u0576\u0565\u0580"\r
+},\r
+contextmenu:{\r
+align:"\u0540\u0561\u057E\u0561\u057D\u0561\u0580\u0565\u0581\u0578\u0582\u0574",\r
+left:"\u0538\u057D\u057F \u0571\u0561\u056D \u0565\u0566\u0580\u056B",\r
+center:"\u053F\u0565\u0576\u057F\u0580\u0578\u0576\u0561\u0581\u0576\u0565\u056C",\r
+right:"\u0538\u057D\u057F \u0561\u057B \u0565\u0566\u0580\u056B",\r
+full:"\u0538\u057D\u057F \u056C\u0561\u0575\u0576\u0578\u0582\u0569\u0575\u0561\u0576"\r
+},\r
+insertdatetime:{\r
+date_fmt:"% d.% m.% Y",\r
+time_fmt:"% H:% M:% S",\r
+insertdate_desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C \u0561\u0574\u057D\u0561\u0569\u056B\u057E",\r
+inserttime_desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C \u056A\u0561\u0574\u0561\u0576\u0561\u056F",\r
+months_long:"\u0570\u0578\u0582\u0576\u057E\u0561\u0580, \u0583\u0565\u057F\u0580\u057E\u0561\u0580, \u0574\u0561\u0580\u057F, \u0561\u057A\u0580\u056B\u056C, \u0574\u0561\u0575\u056B\u057D, \u0570\u0578\u0582\u0576\u056B\u057D, \u0570\u0578\u0582\u056C\u056B\u057D, \u0585\u0563\u0578\u057D\u057F\u0578\u057D, \u057D\u0565\u057A\u057F\u0565\u0574\u0562\u0565\u0580, \u0570\u0578\u056F\u057F\u0565\u0574\u0562\u0565\u0580, \u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580, \u0564\u0565\u056F\u057F\u0565\u0574\u0562\u0565\u0580",\r
+months_short:"\u0570\u0578\u0582\u0576, \u0583\u0565\u057F, \u0574\u0561\u0580\u057F, \u0561\u057A\u0580, \u0574\u0561\u0575\u056B\u057D, \u0570\u0578\u0582\u0576, \u0570\u0578\u0582\u056C, \u0585\u0563\u057D\u057F, \u057D\u0565\u057A\u057F, \u0570\u0578\u056F\u057F, \u0576\u0578\u0575, \u0564\u0565\u056F",\r
+day_long:"\u056F\u056B\u0580\u0561\u056F\u056B, \u0565\u0580\u056F\u0578\u0582\u0577\u0561\u0562\u0569\u056B, \u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056B, \u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056B, \u0570\u056B\u0576\u0563\u0577\u0561\u0562\u0569\u056B, \u0578\u0582\u0580\u0562\u0561\u0569, \u0577\u0561\u0562\u0561\u0569, \u056F\u056B\u0580\u0561\u056F\u056B",\r
+day_short:"\u053F\u056B\u0580, \u0535\u0580\u056F, \u0535\u0580\u0584, \u0549\u0580\u0584, \u0540\u0576\u0563, \u0548\u0582\u0580\u0562, \u0547\u0562\u0569, \u053F\u056B\u0580"\r
+},\r
+print:{\r
+print_desc:"\u054F\u057A\u0565\u056C"\r
+},\r
+preview:{\r
+preview_desc:"\u0534\u056B\u057F\u0565\u056C"\r
+},\r
+directionality:{\r
+ltr_desc:"\u0548\u0582\u0572\u0572\u0578\u0582\u0569\u0575\u0578\u0582\u0576\u0568\u055D \u0571\u0561\u056D\u056B\u0581 \u0561\u057B",\r
+rtl_desc:"\u0548\u0582\u0572\u0572\u0578\u0582\u0569\u0575\u0578\u0582\u0576\u0568\u055D \u0561\u057B\u056B\u0581 \u0571\u0561\u056D"\r
+},\r
+layer:{\r
+insertlayer_desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C \u0576\u0578\u0580 \u0577\u0565\u0580\u057F",\r
+forward_desc:"\u054E\u0565\u0580\u0587",\r
+backward_desc:"\u054F\u0565\u0572\u0561\u0583\u0578\u056D\u0565\u056C \u0565\u057F",\r
+absolute_desc:"\u053F\u056B\u0580\u0561\u057C\u0565\u056C \u0562\u0561\u0581\u0561\u0580\u0571\u0561\u056F \u057F\u0565\u0572\u0561\u056F\u0561\u0575\u0578\u0582\u0574",\r
+content:"\u0546\u0578\u0580 \u0577\u0565\u0580\u057F ..."\r
+},\r
+save:{\r
+save_desc:"\u054A\u0561\u0570\u057A\u0561\u0576\u0565\u056C",\r
+cancel_desc:"\u0549\u0565\u0572\u0561\u0580\u056F\u0565\u056C \u0562\u0561\u056C\u0561\u0580 \u0583\u0578\u0583\u0578\u056D\u0578\u0582\u0569\u0575\u0578\u0582\u0576\u0576\u0565\u0580\u0568"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C \u0562\u0561\u0581\u0561\u0580\u056F"\r
+},\r
+iespell:{\r
+iespell_desc:"\u054F\u0561\u057C\u0561\u057D\u056D\u0561\u056C\u0576\u0565\u0580\u056B \u057D\u057F\u0578\u0582\u0563\u0578\u0582\u0574",\r
+download:"ieSpell \u057A\u056C\u0561\u0563\u056B\u0576\u0568 \u0579\u056B \u0563\u057F\u0576\u057E\u0565\u056C\u0589 \u0551\u0561\u0576\u056F\u0561\u0576\u0578\u0582\u055E\u0574 \u0565\u0584 \u057F\u0565\u0572\u0561\u0564\u0580\u0565\u056C"\r
+},\r
+advhr:{\r
+advhr_desc:"\u0540\u0561\u0580\u056B\u0566\u0578\u0576\u0561\u056F\u0561\u0576 \u0562\u0561\u056A\u0561\u0576\u056B\u0579"\r
+},\r
+emotions:{\r
+emotions_desc:"\u054D\u0574\u0561\u0575\u056C\u056B\u056F\u0576\u0565\u0580"\r
+},\r
+searchreplace:{\r
+search_desc:"\u0548\u0580\u0578\u0576\u0565\u056C",\r
+replace_desc:"\u0548\u0580\u0578\u0576\u0565\u056C / \u0553\u0578\u0583\u0578\u056D\u0565\u056C"\r
+},\r
+advimage:{\r
+image_desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C / \u0583\u0578\u0583\u0578\u056D\u0565\u056C \u0576\u056F\u0561\u0580",\r
+delta_width:"200"\r
+},\r
+advlink:{\r
+link_desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C / \u0583\u0578\u0583\u0578\u056D\u0565\u056C \u0570\u0572\u0578\u0582\u0574",\r
+delta_width:"200"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Citation",\r
+abbr_desc:"Abbreviation",\r
+acronym_desc:"Acronym",\r
+del_desc:"Deletion",\r
+ins_desc:"Insertion",\r
+attribs_desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C / \u0583\u0578\u0583\u0578\u056D\u0565\u056C \u0561\u057F\u0580\u056B\u0562\u0578\u0582\u057F\u0576\u0565\u0580\u0568"\r
+},\r
+style:{\r
+desc:"\u053D\u0574\u0562\u0561\u0563\u0580\u0565\u056C CSS \u0578\u0573\u0565\u0580\u0568"\r
+},\r
+paste:{\r
+paste_text_desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C \u0578\u0580\u057A\u0565\u057D \u057F\u0565\u0584\u057D\u057F",\r
+paste_word_desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C Word \u056E\u0580\u0561\u0563\u0580\u056B\u0581",\r
+selectall_desc:"\u0538\u0576\u057F\u0580\u0565\u056C \u0562\u0578\u056C\u0578\u0580\u0568",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"\u0555\u0563\u057F\u0561\u0563\u0578\u0580\u056E\u0565\u0584 CTRL + V \u057A\u0561\u057F\u0573\u0565\u0576\u057E\u0561\u056E \u057F\u0565\u0584\u057D\u057F\u056B \u057F\u0565\u0572\u0561\u0564\u0580\u0574\u0561\u0576 \u0570\u0561\u0574\u0561\u0580",\r
+text_linebreaks:"\u054A\u0561\u0570\u057A\u0561\u0576\u0565\u056C \u057F\u0578\u0572\u0561\u0564\u0561\u0580\u0571\u0565\u0580\u0568",\r
+word_title:"\u0555\u0563\u057F\u0561\u0563\u0578\u0580\u056E\u0565\u0584 CTRL + V \u057A\u0561\u057F\u0573\u0565\u0576\u057E\u0561\u056E \u057F\u0565\u0584\u057D\u057F\u056B \u057F\u0565\u0572\u0561\u0564\u0580\u0574\u0561\u0576 \u0570\u0561\u0574\u0561\u0580"\r
+},\r
+table:{\r
+desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C \u0576\u0578\u0580 \u0561\u0572\u0575\u0578\u0582\u057D\u0561\u056F",\r
+row_before_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0434\u043E",\r
+row_after_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u0441\u043B\u0435",\r
+delete_row_desc:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443",\r
+col_before_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u043E\u043B\u0431\u0435\u0446 \u0434\u043E",\r
+col_after_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u043E\u043B\u0431\u0435\u0446 \u043F\u043E\u0441\u043B\u0435",\r
+delete_col_desc:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u0442\u043E\u043B\u0431\u0435\u0446",\r
+split_cells_desc:"\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u044C \u044F\u0447\u0435\u0439\u043A\u0438",\r
+merge_cells_desc:"\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u044F\u0447\u0435\u0439\u043A\u0438",\r
+row_desc:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043E\u043A\u0435 \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
+cell_desc:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u044F\u0447\u0435\u0439\u043A\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
+props_desc:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
+paste_row_before_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0434\u043E",\r
+paste_row_after_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u0441\u043B\u0435",\r
+cut_row_desc:"\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
+copy_row_desc:"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
+del:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u0443",\r
+row:"\u0421\u0442\u0440\u043E\u043A\u0430",\r
+col:"\u041F\u043E\u043B\u0435",\r
+cell:"\u042F\u0447\u0435\u0439\u043A\u0430",\r
+cellprops_delta_width:"30"\r
+},\r
+autosave:{\r
+unload_msg:"\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0432\u044B \u0441\u0434\u0435\u043B\u0430\u043B\u0438, \u0431\u0443\u0434\u0443\u0442 \u043F\u043E\u0442\u0435\u0440\u044F\u043D\u044B, \u0435\u0441\u043B\u0438 \u0432\u044B \u043F\u0435\u0440\u0435\u0439\u0434\u0435\u0442\u0435 \u0441 \u044D\u0442\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u0432\u0435\u0441\u044C \u044D\u043A\u0440\u0430\u043D"\r
+},\r
+media:{\r
+desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C / \u0583\u0578\u0583\u0578\u056D\u0565\u056C \u0574\u0565\u0564\u056B\u0561",\r
+edit:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C embedded media"\r
+},\r
+fullpage:{\r
+desc:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430"\r
+},\r
+template:{\r
+desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0448\u0430\u0431\u043B\u043E\u043D\u043D\u044B\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442"\r
+},\r
+visualchars:{\r
+desc:"Visual control characters on / off"\r
+},\r
+spellchecker:{\r
+desc:"\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443",\r
+menu:"\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438",\r
+ignore_word:"\u0418\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u043B\u043E\u0432\u043E",\r
+ignore_words:"\u0418\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u0441\u0435",\r
+langs:"\u042F\u0437\u044B\u043A\u0438",\r
+wait:"\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u043E\u0434\u043E\u0436\u0434\u0438\u0442\u0435 ...",\r
+sug:"\u0412\u0430\u0440\u0438\u0430\u043D\u0442\u044B",\r
+no_sug:"\u041D\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432",\r
+no_mpell:"\u041E\u0448\u0438\u0431\u043E\u043A \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E"\r
+},\r
+pagebreak:{\r
+desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B"\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/ia.js b/program/js/tiny_mce/langs/ia.js
new file mode 100644 (file)
index 0000000..a2f0f09
--- /dev/null
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({ia:{\r
+common:{\r
+edit_confirm:"\u662F\u5426\u5728\u8BE5text area\u5185\u542F\u7528\u6240\u89C1\u5373\u6240\u5F97\u6A21\u5F0F\uFF1F",\r
+apply:"\u5E94\u7528",\r
+insert:"\u63D2\u5165",\r
+update:"\u66F4\u65B0",\r
+cancel:"\u53D6\u6D88",\r
+close:"\u5173\u95ED",\r
+browse:"\u6D4F\u89C8",\r
+class_name:"\u6837\u5F0F\u7C7B\u540D",\r
+not_set:"-- \u672A\u8BBE\u7F6E --",\r
+clipboard_msg:"\u590D\u5236\u3001\u526A\u5207\u548C\u7C98\u8D34\u529F\u80FD\u5728Mozilla \u548C Firefox\u4E2D\u65E0\u6CD5\u4F7F\u7528",\r
+clipboard_no_support:"\u5C1A\u4E0D\u652F\u6301\u60A8\u6240\u4F7F\u7528\u7684\u6D4F\u89C8\u5668\uFF0C\u8BF7\u4F7F\u7528\u952E\u76D8\u65B9\u5F0F\u64CD\u4F5C",\r
+popup_blocked:"\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u5FEB\u663E\u7A97\u53E3\u963B\u6B62\u7A0B\u5E8F\u5DF2\u7ECF\u963B\u6B62\u4E86\u672C\u5FEB\u663E\u7A97\u53E3\uFF0C\u8BF7\u8C03\u6574\u4F60\u7684\u6D4F\u89C8\u5668\u8BBE\u7F6E\uFF0C\u5141\u8BB8\u672C\u7F51\u7AD9\u5F39\u51FA\u65B0\u7A97\u53E3\uFF0C\u4EE5\u4FBF\u4F7F\u7528\u6B64\u529F\u80FD",\r
+invalid_data:"\u9519\u8BEF\uFF1A\u8F93\u5165\u4E86\u65E0\u6548\u7684\u503C\uFF0C\u5DF2\u6807\u8BB0\u4E3A\u7EA2\u8272\u3002",\r
+more_colors:"\u66F4\u591A\u989C\u8272"\r
+},\r
+contextmenu:{\r
+align:"\u5BF9\u9F50\u65B9\u5F0F",\r
+left:"\u5DE6\u5BF9\u9F50",\r
+center:"\u5C45\u4E2D",\r
+right:"\u53F3\u5BF9\u9F50",\r
+full:"\u4E24\u7AEF\u5BF9\u9F50"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%Y-%m-%d",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"\u63D2\u5165\u4ECA\u5929\u65E5\u671F",\r
+inserttime_desc:"\u63D2\u5165\u73B0\u5728\u65F6\u95F4",\r
+months_long:"\u4E00\u6708,\u4E8C\u6708,\u4E09\u6708,\u56DB\u6708,\u4E94\u6708,\u516D\u6708,\u4E03\u6708,\u516B\u6708,\u4E5D\u6708,\u5341\u6708,\u5341\u4E00\u6708,\u5341\u4E8C\u6708",\r
+months_short:"1\u6708,2\u6708,3\u6708,4\u6708,5\u6708,6\u6708,7\u6708,8\u6708,9\u6708,10\u6708,11\u6708,12\u6708",\r
+day_long:"\u661F\u671F\u65E5,\u661F\u671F\u4E00,\u661F\u671F\u4E8C,\u661F\u671F\u4E09,\u661F\u671F\u56DB,\u661F\u671F\u4E94,\u661F\u671F\u516D,\u661F\u671F\u65E5",\r
+day_short:"\u5468\u65E5,\u5468\u4E00,\u5468\u4E8C,\u5468\u4E09,\u5468\u56DB,\u5468\u4E94,\u5468\u516D,\u5468\u65E5"\r
+},\r
+print:{\r
+print_desc:"\u6253\u5370"\r
+},\r
+preview:{\r
+preview_desc:"\u9884\u89C8"\r
+},\r
+directionality:{\r
+ltr_desc:"\u6587\u5B57\u4ECE\u5DE6\u5230\u53F3",\r
+rtl_desc:"\u6587\u5B57\u4ECE\u53F3\u5230\u5DE6"\r
+},\r
+layer:{\r
+insertlayer_desc:"\u63D2\u5165\u5C42",\r
+forward_desc:"\u524D\u7F6E",\r
+backward_desc:"\u540E\u7F6E",\r
+absolute_desc:"\u7EDD\u5BF9\u4F4D\u7F6E",\r
+content:"\u65B0\u589E\u5C42..."\r
+},\r
+save:{\r
+save_desc:"\u4FDD\u5B58",\r
+cancel_desc:"\u653E\u5F03\u6240\u6709\u66F4\u6539"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"\u63D2\u5165\u7A7A\u683C\u7B26"\r
+},\r
+iespell:{\r
+iespell_desc:"\u6267\u884C\u62FC\u5199\u68C0\u67E5",\r
+download:"\u672A\u68C0\u6D4B\u5230ieSpell\u7EC4\u4EF6\uFF0C\u662F\u5426\u73B0\u5728\u5B89\u88C5 ?"\r
+},\r
+advhr:{\r
+advhr_desc:"\u5206\u9694\u7EBF"\r
+},\r
+emotions:{\r
+emotions_desc:"\u8868\u60C5"\r
+},\r
+searchreplace:{\r
+search_desc:"\u67E5\u627E",\r
+replace_desc:"\u67E5\u627E/\u66FF\u6362"\r
+},\r
+advimage:{\r
+image_desc:"\u63D2\u5165/\u7F16\u8F91 \u56FE\u7247"\r
+},\r
+advlink:{\r
+link_desc:"\u63D2\u5165/\u7F16\u8F91 \u8FDE\u7ED3"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"\u5F15\u7528",\r
+abbr_desc:"\u7F29\u5199",\r
+acronym_desc:"\u9996\u5B57\u6BCD\u7F29\u5199",\r
+del_desc:"\u5220\u9664",\r
+ins_desc:"\u63D2\u5165",\r
+attribs_desc:"\u63D2\u5165/\u7F16\u8F91 \u5C5E\u6027"\r
+},\r
+style:{\r
+desc:"\u7F16\u8F91 CSS \u6837\u5F0F\u8868"\r
+},\r
+paste:{\r
+paste_text_desc:"\u7C98\u8D34\u4E3A\u7EAF\u6587\u5B57",\r
+paste_word_desc:"\u7C98\u8D34\u4E3AWord\u683C\u5F0F",\r
+selectall_desc:"\u5168\u9009",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"\u5C06\u590D\u5236(CTRL + C)\u7684\u5185\u5BB9\u7C98\u8D34(CTRL + V)\u5230\u7A97\u53E3\u3002",\r
+text_linebreaks:"\u4FDD\u7559\u5206\u884C\u7B26\u53F7\u53F7",\r
+word_title:"\u5C06\u590D\u5236(CTRL + C)\u7684\u5185\u5BB9\u7C98\u8D34(CTRL + V)\u5230\u7A97\u53E3\u3002"\r
+},\r
+table:{\r
+desc:"\u63D2\u5165\u65B0\u8868\u683C",\r
+row_before_desc:"\u5728\u4E0A\u65B9\u63D2\u5165\u884C",\r
+row_after_desc:"\u5728\u4E0B\u65B9\u63D2\u5165\u884C",\r
+delete_row_desc:"\u5220\u9664\u5F53\u524D\u884C",\r
+col_before_desc:"\u5728\u5DE6\u4FA7\u63D2\u5165\u5217",\r
+col_after_desc:"\u5728\u53F3\u4FA7\u63D2\u5165\u5217",\r
+delete_col_desc:"\u5220\u9664\u5F53\u524D\u5217",\r
+split_cells_desc:"\u62C6\u5206\u50A8\u5B58\u683C",\r
+merge_cells_desc:"\u5408\u5E76\u50A8\u5B58\u683C",\r
+row_desc:"\u5217 \u5C5E\u6027",\r
+cell_desc:"\u50A8\u5B58\u683C \u5C5E\u6027",\r
+props_desc:"\u8868\u683C \u5C5E\u6027",\r
+paste_row_before_desc:"\u7C98\u8D34\u884C\u5230\u4E0A\u65B9",\r
+paste_row_after_desc:"\u7C98\u8D34\u884C\u5230\u4E0B\u65B9",\r
+cut_row_desc:"\u526A\u5207\u5F53\u524D\u5217",\r
+copy_row_desc:"\u590D\u5236\u5F53\u524D\u5217",\r
+del:"\u5220\u9664\u8868\u683C",\r
+row:"\u884C",\r
+col:"\u5217",\r
+cell:"\u50A8\u5B58\u683C"\r
+},\r
+autosave:{\r
+unload_msg:"\u5982\u679C\u79BB\u5F00\u8BE5\u9875\u5C06\u5BFC\u81F4\u6240\u6709\u4FEE\u6539\u5168\u90E8\u4E22\u5931\u3002",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"\u5168\u5C4F\u6A21\u5F0F"\r
+},\r
+media:{\r
+desc:"\u63D2\u5165/\u7F16\u8F91 \u5A92\u4F53",\r
+edit:"\u7F16\u8F91 \u5A92\u4F53"\r
+},\r
+fullpage:{\r
+desc:"\u6587\u4EF6"\r
+},\r
+template:{\r
+desc:"\u63D2\u5165\u9009\u5B9A\u7684\u8303\u672C"\r
+},\r
+visualchars:{\r
+desc:"\u663E\u793A\u63A7\u5236\u7B26\u53F7\u3002"\r
+},\r
+spellchecker:{\r
+desc:"\u62FC\u5199\u68C0\u67E5",\r
+menu:"\u62FC\u5199\u68C0\u67E5 \u8BBE\u7F6E",\r
+ignore_word:"\u5FFD\u7565",\r
+ignore_words:"\u5168\u90E8\u5FFD\u7565",\r
+langs:"\u8BED\u8A00\u6E05\u5355",\r
+wait:"\u8BF7\u7A0D\u5019...",\r
+sug:"\u5EFA\u8BAE\u8BCD",\r
+no_sug:"\u65E0\u62FC\u5199\u5EFA\u8BAE",\r
+no_mpell:"\u65E0\u62FC\u5199\u9519\u8BEF"\r
+},\r
+pagebreak:{\r
+desc:"\u63D2\u5165\u5206\u9875\u7B26\u53F7"\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/id.js b/program/js/tiny_mce/langs/id.js
new file mode 100644 (file)
index 0000000..9515688
--- /dev/null
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({id:{\r
+common:{\r
+edit_confirm:"Gunakan mode WYSIWYG untuk textarea ini?",\r
+apply:"Apply",\r
+insert:"Insert",\r
+update:"Update",\r
+cancel:"Cancel",\r
+close:"Close",\r
+browse:"Browse",\r
+class_name:"Class",\r
+not_set:"-- Not set --",\r
+clipboard_msg:"Copy/Cut/Paste tidak tersedia pada Mozilla dan Firefox.\nButuh info selengkapnya?",\r
+clipboard_no_support:"Tidak didukung Browser, gunakan shortcut dari keyboard.",\r
+popup_blocked:"Maaf, popup-blocker anda telah menonaktifkan jendela aplikasi yang menyediakan fungsionalitas. Nonaktifkan popup-blocker untuk sepenuhnya memanfaatkan alat ini.",\r
+invalid_data:"Error: nilai invalid, ditandai dengan dengan warna merah",\r
+more_colors:"More colors"\r
+},\r
+contextmenu:{\r
+align:"Alignment",\r
+left:"Kiri",\r
+center:"Tengah",\r
+right:"Kanan",\r
+full:"Penuh"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%Y-%m-%d",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"sisipkan tanggal",\r
+inserttime_desc:"sisipkan waktu",\r
+months_long:"Januari,Februari,Maren,April,Mei,Juni,Juli,Agustus,September,Oktober,November,Desember",\r
+months_short:"Jan,Feb,Mar,Apr,Mei,Jun,Jul,Ags,Sep,Okt,Nov,Des",\r
+day_long:"Minggu,Senin,Selasa,Rabu,Kamis,Jumat,Sabtu,Minggu",\r
+day_short:"Min,Sen,Sel,Rab,Kam,Jum,Sab,Min"\r
+},\r
+print:{\r
+print_desc:"Cetak"\r
+},\r
+preview:{\r
+preview_desc:"Preview"\r
+},\r
+directionality:{\r
+ltr_desc:"Arah kiri ke kanan",\r
+rtl_desc:"Arah kanan ke kiri"\r
+},\r
+layer:{\r
+insertlayer_desc:"sisipkan layer Baru",\r
+forward_desc:"Pindah ke depan",\r
+backward_desc:"Pindah ke belakang",\r
+absolute_desc:"Beralih posisi absolut",\r
+content:"Layer baru..."\r
+},\r
+save:{\r
+save_desc:"Simpan",\r
+cancel_desc:"Batalkan semua perubahan"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"sisipkan karakter non-breaking space"\r
+},\r
+iespell:{\r
+iespell_desc:"Jalankan spell checking",\r
+download:"ieSpell tidak terdeteksi. Instal sekarang?"\r
+},\r
+advhr:{\r
+advhr_desc:"Horizontal rule"\r
+},\r
+emotions:{\r
+emotions_desc:"Emotions"\r
+},\r
+searchreplace:{\r
+search_desc:"Cari",\r
+replace_desc:"Cari/Ganti"\r
+},\r
+advimage:{\r
+image_desc:"sisipkan/Ubah Gambar"\r
+},\r
+advlink:{\r
+link_desc:"Sisipkan/Ubah link"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Kutipan",\r
+abbr_desc:"Singkatan/Kependekan Kata",\r
+acronym_desc:"Akronim",\r
+del_desc:"Penghapusan",\r
+ins_desc:"Penyisipan",\r
+attribs_desc:"Sisip/Ubah Atribut"\r
+},\r
+style:{\r
+desc:"Ubah CSS Style"\r
+},\r
+paste:{\r
+paste_text_desc:"Paste as Plain Text",\r
+paste_word_desc:"Paste from Word",\r
+selectall_desc:"Select All",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"Gunakan CTRL+V pada keyboard untuk paste.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Gunakan CTRL+V pada keyboard untuk paste."\r
+},\r
+table:{\r
+desc:"Sisipkan tabel baru",\r
+row_before_desc:"Sisipkan row sebelum",\r
+row_after_desc:"Sisipkan row sesudah",\r
+delete_row_desc:"Hapus row",\r
+col_before_desc:"Sisipkan column sebelum",\r
+col_after_desc:"Sisipkan column setelah",\r
+delete_col_desc:"Hapus column",\r
+split_cells_desc:"Pisahkan cell tabel yang di-merge",\r
+merge_cells_desc:"Merge cell tabel",\r
+row_desc:"Properti row tabel",\r
+cell_desc:"Properti cell tabel",\r
+props_desc:"Properti tabel",\r
+paste_row_before_desc:"Paste row tabel sebelum",\r
+paste_row_after_desc:"Paste row tabel sesudah",\r
+cut_row_desc:"Cut row tabel",\r
+copy_row_desc:"Copy row tabel",\r
+del:"Hapus Tabel",\r
+row:"Row",\r
+col:"Column",\r
+cell:"Cell"\r
+},\r
+autosave:{\r
+unload_msg:"Perubahan yang dilakukan akan hilang jika Anda pindah dari halaman ini.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"Toggle fullscreen mode"\r
+},\r
+media:{\r
+desc:"Insert / edit embedded media",\r
+edit:"Edit embedded media"\r
+},\r
+fullpage:{\r
+desc:"Properti Dokumen"\r
+},\r
+template:{\r
+desc:"Menyisipkan template standar isi"\r
+},\r
+visualchars:{\r
+desc:"Pengendalian visual karakter on/off"\r
+},\r
+spellchecker:{\r
+desc:"Toggle spellchecker",\r
+menu:"Pengaturan Spellchecker ",\r
+ignore_word:"Abaikan kata",\r
+ignore_words:"Abaikan semua",\r
+langs:"Bahasa",\r
+wait:"Harap tunggu...",\r
+sug:"Saran",\r
+no_sug:"Tidak ada saran",\r
+no_mpell:"Tidak ada misspellings ditemukan."\r
+},\r
+pagebreak:{\r
+desc:"Sisipkan page break."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
index 9f78100bc511087fcb27bb412330543396fcc4d0..c032d0e5b026a033ff8960cc85987ea01a1e9292 100755 (executable)
@@ -90,7 +90,9 @@ desc:"Edit CSS Style"
 paste:{\r
 paste_text_desc:"Paste as Plain Text",\r
 paste_word_desc:"Paste from Word",\r
-selectall_desc:"Select All"\r
+selectall_desc:"Select All",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
@@ -120,7 +122,9 @@ col:"Column",
 cell:"Cell"\r
 },\r
 autosave:{\r
-unload_msg:"The changes you made will be lost if you navigate away from this page."\r
+unload_msg:"The changes you made will be lost if you navigate away from this page.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Toggle fullscreen mode"\r
@@ -151,4 +155,16 @@ no_mpell:"No misspellings found."
 },\r
 pagebreak:{\r
 desc:"Insert page break."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index bfdb5a4fc3dc1c1c0dbbf16ee06d2a6b3c137048..255e52bf89072ae42fb2454dc2aa98218fcb49a9 100755 (executable)
@@ -11,7 +11,7 @@ class_name:"Classe",
 not_set:"-- Non impostato --",\r
 clipboard_msg:"Copia/Taglia/Incolla non \u00E8 disponibile in Mozilla e Firefox.\nSi desidera avere maggiori informazioni su questo problema?",\r
 clipboard_no_support:"Attualmente non supportato dal  browser in uso, usare le scorciatoie da tastiera.",\r
-popup_blocked:"Spiacente, ma il blocco delle popup ha disabilitato una finestra che fornisce funzionalit\u00E0 dell'applicazione. Si deve disabilitare il blocco delle popup per questo sito per poter utlizzare appieno questo strumento.",\r
+popup_blocked:"Spiacente, ma il blocco popup ha disabilitato una finestra che fornisce funzionalit\u00E0 dell'applicazione. Si deve disabilitare il blocco popup per questo sito per poter utlizzare appieno questo strumento.",\r
 invalid_data:"Errore: valori inseriti non validi, sono marcati in rosso.",\r
 more_colors:"Colori aggiuntivi"\r
 },\r
@@ -50,7 +50,7 @@ absolute_desc:"Attiva/Disattiva posizionamento assoluto",
 content:"Nuovo layer..."\r
 },\r
 save:{\r
-save_desc:"Save",\r
+save_desc:"Salva",\r
 cancel_desc:"Cancella tutte le modifiche"\r
 },\r
 nonbreaking:{\r
@@ -61,20 +61,30 @@ iespell_desc:"Esegui controllo ortografico",
 download:"ieSpell non rilevato. Installarlo ora?"\r
 },\r
 advhr:{\r
-advhr_desc:"Riga orizzontale"\r
+advhr_desc:"Riga orizzontale",\r
+delta_width:"Larghezza",\r
+delta_height:"Altezza"\r
 },\r
 emotions:{\r
-emotions_desc:"Faccine"\r
+emotions_desc:"Faccine",\r
+delta_width:"Larghezza",\r
+delta_height:"Altezza"\r
 },\r
 searchreplace:{\r
 search_desc:"Trova",\r
-replace_desc:"Trova/Sostituisci"\r
+replace_desc:"Trova/Sostituisci",\r
+delta_width:"Larghezza",\r
+delta_height:"Altezza"\r
 },\r
 advimage:{\r
-image_desc:"Inserisci/modifica immagine"\r
+image_desc:"Inserisci/modifica immagine",\r
+delta_width:"Larghezza",\r
+delta_height:"Altezza"\r
 },\r
 advlink:{\r
-link_desc:"Inserisci/modifica collegamento"\r
+link_desc:"Inserisci/modifica collegamento",\r
+delta_width:"Larghezza",\r
+delta_height:"Altezza"\r
 },\r
 xhtmlxtras:{\r
 cite_desc:"Citazione",\r
@@ -82,15 +92,31 @@ abbr_desc:"Abbreviazione",
 acronym_desc:"Acronimo",\r
 del_desc:"Cancellamento",\r
 ins_desc:"Inserimento",\r
-attribs_desc:"Inserisci/modifica attributi"\r
+attribs_desc:"Inserisci/modifica attributi",\r
+cite_delta_width:"Larghezza",\r
+cite_delta_height:"Altezza",\r
+abbr_delta_width:"Larghezza",\r
+abbr_delta_height:"Altezza",\r
+acronym_delta_width:"Larghezza",\r
+acronym_delta_height:"Altezza",\r
+del_delta_width:"Larghezza",\r
+del_delta_height:"Altezza",\r
+ins_delta_width:"Larghezza",\r
+ins_delta_height:"Altezza",\r
+attribs_delta_width:"Larghezza",\r
+attribs_delta_height:"Altezza"\r
 },\r
 style:{\r
-desc:"Modifica stile CSS"\r
+desc:"Modifica stile CSS",\r
+delta_width:"Larghezza",\r
+delta_height:"Altezza"\r
 },\r
 paste:{\r
 paste_text_desc:"Incolla come testo semplice",\r
 paste_word_desc:"Incolla da Word",\r
-selectall_desc:"Seleziona tutto"\r
+selectall_desc:"Seleziona tutto",\r
+plaintext_mode_sticky:"Incolla adesso e in modalit\u00E0 testo. Clicca nuovamente per tornare alla modalit\u00E0 normale. Dopo che avrai incollato qualcosa tornerai alla modalit\u00E0 normale",\r
+plaintext_mode:"Incolla adesso e in modalit\u00E0 testo. Clicca nuovamente per tornare alla modalit\u00E0 normale."\r
 },\r
 paste_dlg:{\r
 text_title:"Premere CTRL+V sulla tastiera per incollare il testo nella finestra.",\r
@@ -117,20 +143,34 @@ copy_row_desc:"Copia riga",
 del:"Elimina tabella",\r
 row:"Riga",\r
 col:"Colonna",\r
-cell:"Cella"\r
+cell:"Cella",\r
+rowprops_delta_width:"Larghezza",\r
+rowprops_delta_height:"Altezza",\r
+cellprops_delta_width:"Larghezza",\r
+cellprops_delta_height:"Altezza",\r
+table_delta_width:"Larghezza",\r
+table_delta_height:"Altezza",\r
+merge_cells_delta_width:"Larghezza",\r
+merge_cells_delta_height:"Altezza"\r
 },\r
 autosave:{\r
-unload_msg:"I cambiamenti effettuati saranno persi se si abbandona la pagina corrente."\r
+unload_msg:"I cambiamenti effettuati saranno persi se si abbandona la pagina corrente.",\r
+restore_content:"Ripristina i dati salvati automaticamente",\r
+warning_message:"Se ripristini i dati salvati automaticamente perderai i dati attuali dell'editor\n\nSei sicuro di voler ripristinare i dati?."\r
 },\r
 fullscreen:{\r
 desc:"Attiva/disattiva modalit\u00E0 a tutto schermo"\r
 },\r
 media:{\r
 desc:"Inserisci/modifica file multimediale",\r
-edit:"Modifica file multimediale"\r
+edit:"Modifica file multimediale",\r
+delta_width:"Larghezza",\r
+delta_height:"Altezza"\r
 },\r
 fullpage:{\r
-desc:"Propriet\u00E0 Documento"\r
+desc:"Propriet\u00E0 Documento",\r
+delta_width:"Larghezza",\r
+delta_height:"Altezza"\r
 },\r
 template:{\r
 desc:"Inserisci contenuto da modello predefinito"\r
@@ -151,4 +191,16 @@ no_mpell:"Nessun errore rilevato."
 },\r
 pagebreak:{\r
 desc:"Inserisci intterruzione di pagina."\r
+},\r
+advlist:{\r
+types:"Tipi",\r
+def:"Default",\r
+lower_alpha:"Minuscolo alfanumerico",\r
+lower_greek:"Minuscolo lettera greca",\r
+lower_roman:"Minuscolo lettere romane",\r
+upper_alpha:"Maiuscolo alfanumerico",\r
+upper_roman:"Maiuscolo lettere romane",\r
+circle:"Cerchio",\r
+disc:"Punto",\r
+square:"Quadrato"\r
 }}});
\ No newline at end of file
index f2ea0776beac9c2b06dd6682c42fa94f3cebf331..ddce5e29a1746a8156ca6040acbabdc91810897d 100755 (executable)
@@ -7,9 +7,9 @@ update:"\u66F4\u65B0",
 cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB",\r
 close:"\u9589\u3058\u308B",\r
 browse:"\u53C2\u7167",\r
-class_name:"\u30AF\u30E9\u30B9",\r
+class_name:"class\u5C5E\u6027",\r
 not_set:"-- \u672A\u8A2D\u5B9A --",\r
-clipboard_msg:"\u30B3\u30D4\u30FC/\u5207\u308A\u53D6\u308A/\u8CBC\u308A\u4ED8\u3051\u306FMozilla\u53CA\u3073Firefox\u3067\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002\n\u8A73\u7D30\u306F\u3053\u3061\u3089",\r
+clipboard_msg:"\u3053\u306E\u30B3\u30DE\u30F3\u30C9\u306FFirefox\u3067\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002",\r
 clipboard_no_support:"\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u64CD\u4F5C\u306F\u304A\u4F7F\u3044\u306E\u30D6\u30E9\u30A6\u30B6\u306B\u306F\u5BFE\u5FDC\u3057\u3066\u304A\u308A\u307E\u305B\u3093\u3002\u4EE3\u308F\u308A\u306B\u30AD\u30FC\u30DC\u30FC\u30C9\u306E\u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8\u30AD\u30FC\u3092\u304A\u4F7F\u3044\u4E0B\u3055\u3044\u3002",\r
 popup_blocked:"\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u304C\u30D6\u30ED\u30C3\u30AF\u3055\u308C\u307E\u3057\u305F\u3002\u3059\u3079\u3066\u306E\u6A5F\u80FD\u3092\u3054\u5229\u7528\u306B\u306A\u308B\u306B\u306F\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u3092\u8A31\u53EF\u3057\u3066\u4E0B\u3055\u3044\u3002",\r
 invalid_data:"\u30A8\u30E9\u30FC: \u5165\u529B\u306B\u8AA4\u308A\u304C\u3042\u308A\u307E\u3059\u3002\uFF08\u8D64\u5B57\u306E\u9805\u76EE\uFF09",\r
@@ -90,12 +90,14 @@ desc:"CSS\u7DE8\u96C6"
 paste:{\r
 paste_text_desc:"\u30C6\u30AD\u30B9\u30C8\u3068\u3057\u3066\u8CBC\u308A\u4ED8\u3051",\r
 paste_word_desc:"Word\u304B\u3089\u8CBC\u308A\u4ED8\u3051",\r
-selectall_desc:"\u5168\u3066\u9078\u629E"\r
+selectall_desc:"\u5168\u3066\u9078\u629E",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"\u30D7\u30EC\u30FC\u30F3\u30C6\u30AD\u30B9\u30C8\u30E2\u30FC\u30C9\u306B\u5909\u66F4\u3057\u307E\u3057\u305F\u3002\u8CBC\u308A\u4ED8\u3051\u5F8C\u306F\u66F8\u5F0F\u4ED8\u304D\u30E2\u30FC\u30C9\u306B\u623B\u308A\u307E\u3059\u3002"\r
 },\r
 paste_dlg:{\r
-text_title:"\u30AD\u30FC\u30DC\u30FC\u30C9\u3067CTRL+V\u3068\u5165\u529B\u3057\u30C6\u30AD\u30B9\u30C8\u3092\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002",\r
+text_title:"\u30AD\u30FC\u30DC\u30FC\u30C9\u3067CTRL+V\u3092\u62BC\u3057\u3066\u30C6\u30AD\u30B9\u30C8\u3092\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002",\r
 text_linebreaks:"\u6539\u884C\u3092\u4FDD\u6301\u3059\u308B",\r
-word_title:"\u30AD\u30FC\u30DC\u30FC\u30C9\u3067CTRL+V\u3068\u5165\u529B\u3057\u30C6\u30AD\u30B9\u30C8\u3092\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002"\r
+word_title:"\u30AD\u30FC\u30DC\u30FC\u30C9\u3067CTRL+V\u3092\u62BC\u3057\u3066\u30C6\u30AD\u30B9\u30C8\u3092\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002"\r
 },\r
 table:{\r
 desc:"\u8868\u3092\u633F\u5165",\r
@@ -120,7 +122,9 @@ col:"\u5217",
 cell:"\u30BB\u30EB"\r
 },\r
 autosave:{\r
-unload_msg:"\u4ED6\u306E\u30DA\u30FC\u30B8\u3078\u79FB\u52D5\u3059\u308B\u3068\u7DE8\u96C6\u30C7\u30FC\u30BF\u306F\u3059\u3079\u3066\u7834\u68C4\u3055\u308C\u307E\u3059\u3002"\r
+unload_msg:"\u4ED6\u306E\u30DA\u30FC\u30B8\u3078\u79FB\u52D5\u3059\u308B\u3068\u7DE8\u96C6\u30C7\u30FC\u30BF\u306F\u3059\u3079\u3066\u7834\u68C4\u3055\u308C\u307E\u3059\u3002",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"\u30D5\u30EB\u30B9\u30AF\u30EA\u30FC\u30F3"\r
@@ -151,4 +155,16 @@ no_mpell:"\u30B9\u30DA\u30EB\u30DF\u30B9\u306F\u898B\u3064\u304B\u308A\u307E\u30
 },\r
 pagebreak:{\r
 desc:"\u6539\u30DA\u30FC\u30B8\u633F\u5165"\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/ka.js b/program/js/tiny_mce/langs/ka.js
new file mode 100644 (file)
index 0000000..4e194e4
--- /dev/null
@@ -0,0 +1,173 @@
+tinyMCE.addI18n({ka:{\r
+common:{\r
+edit_confirm:"\u10D2\u10D0\u10DB\u10DD\u10D5\u10D8\u10E7\u10D4\u10DC\u10DD\u10D7 \u10D0\u10DB \u10D5\u10D4\u10DA\u10D8\u10E1\u10D7\u10D5\u10D8\u10E1 WYSIWYG \u10E0\u10D4\u10DF\u10D8\u10DB\u10D8?",\r
+apply:"\u10D2\u10D0\u10DB\u10DD\u10E7\u10D4\u10DC\u10D4\u10D1\u10D0",\r
+insert:"\u10E9\u10D0\u10E1\u10DB\u10D0",\r
+update:"\u10D2\u10D0\u10DC\u10D0\u10EE\u10DA\u10D4\u10D1\u10D0",\r
+cancel:"\u10D2\u10D0\u10E3\u10E5\u10DB\u10D4\u10D1\u10D0",\r
+close:"\u10D3\u10D0\u10EE\u10E3\u10E0\u10D5\u10D0",\r
+browse:"\u10D3\u10D0\u10D7\u10D5\u10D0\u10DA\u10D8\u10D4\u10E0\u10D4\u10D1\u10D0",\r
+class_name:"\u10D9\u10DA\u10D0\u10E1\u10D8",\r
+not_set:"- \u10D0\u10E0 \u10D0\u10E0\u10D8\u10E1 \u10D3\u10D0\u10E7\u10D4\u10DC\u10D4\u10D1\u10E3\u10DA\u10D8 -",\r
+clipboard_msg:"\u10D9\u10DD\u10DE\u10D8\u10E0\u10D4\u10D1\u10D0, \u10D0\u10DB\u10DD\u10ED\u10E0\u10D0 \u10D3\u10D0 \u10E9\u10D0\u10E1\u10DB\u10D0 Firefox-\u10E8\u10D8 \u10D0\u10E0 \u10DB\u10E3\u10E8\u10D0\u10DD\u10D1\u10E1.\r\n\u10D2\u10E1\u10E3\u10E0\u10D7 \u10DB\u10D8\u10D8\u10E6\u10DD\u10D7 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D8\u10D7\u10D8 \u10D8\u10DC\u10E4\u10DD\u10E0\u10DB\u10D0\u10EA\u10D8\u10D0?",\r
+clipboard_no_support:"\u10D0\u10E0 \u10D0\u10E5\u10D5\u10E1 \u10D7\u10E5\u10D5\u10D4\u10DC\u10D8 \u10D1\u10E0\u10D0\u10E3\u10D6\u10D4\u10E0\u10D8\u10E1 \u10DB\u10EE\u10D0\u10E0\u10D3\u10D0\u10ED\u10D4\u10E0\u10D0. \u10D2\u10D0\u10DB\u10DD\u10D8\u10E7\u10D4\u10DC\u10D4\u10D7 \u10D9\u10DA\u10D0\u10D5\u10D8\u10D0\u10E2\u10E3\u10E0\u10E3\u10DA\u10D8 \u10E8\u10D4\u10DB\u10DD\u10D9\u10DA\u10D4\u10D1\u10D4\u10D1\u10D8.",\r
+popup_blocked:"\u0411\u043B\u043E\u043A\u0438\u0440\u0430\u0442\u043E\u0440 \u0432\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0449\u0438\u0445 \u043E\u043A\u043E\u043D \u0437\u0430\u043A\u0440\u044B\u043B \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0435 \u043E\u043A\u043D\u043E. \u0414\u043B\u044F \u043F\u043E\u043B\u043D\u043E\u0446\u0435\u043D\u043D\u043E\u0439 \u0440\u0430\u0431\u043E\u0442\u044B, \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0443 \u043D\u0430 \u044D\u0442\u043E\u043C \u0441\u0430\u0439\u0442\u0435.",\r
+invalid_data:"\u10E8\u10D4\u10EA\u10D3\u10DD\u10DB\u10D0: \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D8\u10DA\u10D8\u10D0 \u10D0\u10E0\u10D0 \u10E1\u10EC\u10DD\u10E0\u10D8 \u10DB\u10DC\u10D8\u10E8\u10D5\u10DC\u10DA\u10D4\u10DD\u10D1\u10D0, \u10D8\u10E1 \u10DB\u10DD\u10DC\u10D8\u10E1\u10DC\u10E3\u10DA\u10D8\u10D0 \u10EC\u10D8\u10D7\u10DA\u10D0\u10D3.",\r
+more_colors:"\u10E1\u10EE\u10D5\u10D0 \u10E4\u10D4\u10E0\u10D4\u10D1\u10D8..."\r
+},\r
+contextmenu:{\r
+align:"\u10D2\u10D0\u10E1\u10EC\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+left:"\u10DB\u10D0\u10E0\u10EA\u10EE\u10D4\u10DC\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+center:"\u10EA\u10D4\u10DC\u10E2\u10E0\u10D6\u10D4",\r
+right:"\u10DB\u10D0\u10E0\u10EF\u10D5\u10D4\u10DC\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+full:"\u10E1\u10D8\u10D2\u10D0\u10DC\u10D4\u10D6\u10D4"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%d.%m.%Y",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"\u10D7\u10D0\u10E0\u10D8\u10E6\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0",\r
+inserttime_desc:"\u10D3\u10E0\u10DD\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0",\r
+months_long:"\u10D8\u10D0\u10DC\u10D5\u10D0\u10E0\u10D8,\u10D7\u10D4\u10D1\u10D4\u10E0\u10D5\u10D0\u10DA\u10D8,\u10DB\u10D0\u10E0\u10E2\u10D8,\u10D0\u10DE\u10E0\u10D8\u10DA\u10D8,\u10DB\u10D0\u10D8\u10E1\u10D8,\u10D8\u10D5\u10DC\u10D8\u10E1\u10D8,\u10D8\u10D5\u10DA\u10D8\u10E1\u10D8,\u10D0\u10D2\u10D5\u10D8\u10E1\u10E2\u10DD,\u10E1\u10D4\u10E5\u10E2\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8,\u10DD\u10E5\u10E2\u10DD\u10DB\u10D1\u10D4\u10E0\u10D8,\u10DC\u10DD\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8,\u10D3\u10D4\u10D9\u10D4\u10DB\u10D1\u10D4\u10E0\u10D8",\r
+months_short:"\u10D8\u10D0\u10DC,\u10D7\u10D4\u10D1,\u10DB\u10D0\u10E0\u10E2,\u10D0\u10DE\u10E0,\u10DB\u10D0\u10D8\u10E1\u10D8,\u10D8\u10D5\u10DC,\u10D8\u10D5\u10DA,\u10D0\u10D2\u10D5,\u10E1\u10D4\u10E5,\u10DD\u10E5\u10E2,\u10DC\u10DD\u10D4\u10DB,\u10D3\u10D4\u10D9",\r
+day_long:"\u10D9\u10D5\u10D8\u10E0\u10D0,\u10DD\u10E0\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8,\u10E1\u10D0\u10DB\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8,\u10DD\u10D7\u10EE\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8,\u10EE\u10E3\u10D7\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8,\u10DE\u10D0\u10E0\u10D0\u10E1\u10D9\u10D4\u10D5\u10D8,\u10E8\u10D0\u10D1\u10D0\u10D7\u10D8,\u10D9\u10D5\u10D8\u10E0\u10D0",\r
+day_short:"\u10D9\u10D5,\u10DD\u10E0\u10E8,\u10E1\u10D0\u10DB\u10E8,\u10DD\u10D7\u10EE\u10E8,\u10EE\u10E3\u10D7,\u10DE\u10D0\u10E0,\u10E8\u10D0\u10D1,\u10D9\u10D5"\r
+},\r
+print:{\r
+print_desc:"\u10D1\u10D4\u10ED\u10D3\u10D5\u10D0"\r
+},\r
+preview:{\r
+preview_desc:"\u10EC\u10D8\u10DC\u10D0\u10E1\u10EC\u10D0\u10E0\u10D8 \u10D3\u10D0\u10D7\u10D5\u10D0\u10DA\u10D8\u10D4\u10E0\u10D4\u10D1\u10D0"\r
+},\r
+directionality:{\r
+ltr_desc:"\u10DB\u10D8\u10DB\u10D0\u10E0\u10D7\u10E3\u10DA\u10D4\u10D1\u10D0 \u10DB\u10D0\u10E0\u10EA\u10EE\u10DC\u10D8\u10D3\u10D0\u10DC \u10DB\u10D0\u10E0\u10EF\u10D5\u10DC\u10D8\u10D5",\r
+rtl_desc:"\u10DB\u10D8\u10DB\u10D0\u10E0\u10D7\u10E3\u10DA\u10D4\u10D1\u10D0 \u10DB\u10D0\u10E0\u10EF\u10D5\u10DC\u10D8\u10D3\u10D0\u10DC \u10DB\u10D0\u10E0\u10EA\u10EE\u10DC\u10D8\u10D5"\r
+},\r
+layer:{\r
+insertlayer_desc:"\u10E8\u10E0\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0",\r
+forward_desc:"\u10EC\u10D8\u10DC\u10D0 \u10DE\u10DA\u10D0\u10DC\u10D6\u10D4",\r
+backward_desc:"\u10E3\u10D9\u10D0\u10DC\u10D0 \u10DE\u10DA\u10D0\u10DC\u10D6\u10D4",\r
+absolute_desc:"\u10D0\u10D1\u10E1\u10DD\u10DA\u10E3\u10E2\u10E3\u10E0\u10D8 \u10DE\u10DD\u10D6\u10D8\u10EA\u10D8\u10E0\u10D4\u10D1\u10D0",\r
+content:"\u10D0\u10EE\u10D0\u10DA\u10D8 \u10E8\u10E0\u10D4"\r
+},\r
+save:{\r
+save_desc:"\u10E8\u10D4\u10DC\u10D0\u10EE\u10D5\u10D0",\r
+cancel_desc:"\u10E7\u10D5\u10D4\u10DA\u10D0 \u10EA\u10D5\u10DA\u10D8\u10DA\u10D4\u10D1\u10D8\u10E1 \u10D2\u10D0\u10E3\u10E5\u10DB\u10D4\u10D1\u10D0"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"\u10E3\u10EC\u10E7\u10D5\u10D4\u10E2\u10D8 \u10D3\u10D0\u10E8\u10DD\u10E0\u10D4\u10D1\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0"\r
+},\r
+iespell:{\r
+iespell_desc:"\u10DD\u10E0\u10D7\u10DD\u10D2\u10E0\u10D0\u10E4\u10D8\u10D8\u10E1 \u10E8\u10D4\u10DB\u10DD\u10EC\u10DB\u10D4\u10D1\u10D0",\r
+download:"ieSpell \u10D0\u10E0 \u10D0\u10E0\u10D8\u10E1 \u10DC\u10D0\u10DE\u10DD\u10D5\u10DC\u10D8. \u10D2\u10E1\u10E3\u10E0\u10D7 \u10D3\u10D0\u10E7\u10D4\u10DC\u10D4\u10D1\u10D0?"\r
+},\r
+advhr:{\r
+advhr_desc:"\u10D2\u10D0\u10DB\u10E7\u10DD\u10E4\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0"\r
+},\r
+emotions:{\r
+emotions_desc:"\u10E1\u10DB\u10D0\u10D8\u10DA\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0"\r
+},\r
+searchreplace:{\r
+search_desc:"\u10DE\u10DD\u10D5\u10DC\u10D0",\r
+replace_desc:"\u10E8\u10D4\u10EA\u10D5\u10DA\u10D0"\r
+},\r
+advimage:{\r
+image_desc:"\u10D2\u10D0\u10DB\u10DD\u10E1\u10D0\u10EE\u10E3\u10DA\u10D4\u10D1\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0/\u10E0\u10D4\u10D3\u10D0\u10E5\u10E2\u10D8\u10E0\u10D4\u10D1\u10D0",\r
+delta_width:"200"\r
+},\r
+advlink:{\r
+link_desc:"\u10D1\u10DB\u10E3\u10DA\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0/\u10E0\u10D4\u10D3\u10D0\u10E5\u10E2\u10D8\u10E0\u10D4\u10D1\u10D0",\r
+delta_width:"200"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"\u10EA\u10D8\u10E2\u10D8\u10E0\u10D4\u10D1\u10D0",\r
+abbr_desc:"\u10E8\u10D4\u10DB\u10DD\u10D9\u10DA\u10D4\u10D1\u10D0",\r
+acronym_desc:"\u10D0\u10D1\u10E0\u10D4\u10D5\u10D8\u10D0\u10EA\u10D8\u10D0",\r
+del_desc:"\u10EC\u10D0\u10E8\u10DA\u10D0",\r
+ins_desc:"\u10E8\u10D4\u10EA\u10D5\u10DA\u10D0",\r
+attribs_desc:"\u10D4\u10DA\u10D4\u10DB\u10D4\u10DC\u10E2\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0/\u10E8\u10D4\u10EA\u10D5\u10DA\u10D0"\r
+},\r
+style:{\r
+desc:"CSS \u10E1\u10E2\u10D8\u10DA\u10D8\u10E1 \u10E0\u10D4\u10D3\u10D0\u10E5\u10E2\u10D8\u10E0\u10D4\u10D1\u10D0"\r
+},\r
+paste:{\r
+paste_text_desc:"\u10E9\u10D0\u10E1\u10D5\u10D8 \u10E0\u10DD\u10D2\u10DD\u10E0\u10EA \u10E2\u10D4\u10E5\u10E1\u10E2\u10D8",\r
+paste_word_desc:"Word-\u10D8\u10D3\u10DC \u10E9\u10D0\u10E1\u10DB\u10D0",\r
+selectall_desc:"\u10E2\u10D5\u10D4\u10DA\u10D0\u10E4\u10E0\u10D8\u10E1 \u10DB\u10DD\u10DC\u10D8\u10E8\u10D5\u10DC\u10D0",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"\u10E2\u10D4\u10E5\u10E1\u10E2\u10D8\u10E1 \u10E9\u10D0\u10E1\u10D0\u10E1\u10DB\u10D4\u10DA\u10D0\u10D3 \u10D2\u10D0\u10DB\u10DD\u10D8\u10E7\u10D4\u10DC\u10D4\u10D7 \u10D9\u10DA\u10D0\u10D5\u10D8\u10D0\u10E2\u10E3\u10E0\u10E3\u10DA\u10D8 \u10D9\u10DD\u10DB\u10D1\u10D8\u10DC\u10D0\u10EA\u10D8\u10D0 CTRL+V.",\r
+text_linebreaks:"\u10D2\u10D0\u10D3\u10D0\u10E2\u10D0\u10DC\u10D8\u10DA\u10D8 \u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D4\u10D1\u10D8\u10E1 \u10E8\u10D4\u10DC\u10D0\u10EE\u10D5\u10D0",\r
+word_title:"\u0418\u10E2\u10D4\u10E5\u10E1\u10E2\u10D8\u10E1 \u10E9\u10D0\u10E1\u10D0\u10E1\u10DB\u10D4\u10DA\u10D0\u10D3 \u10D2\u10D0\u10DB\u10DD\u10D8\u10E7\u10D4\u10DC\u10D4\u10D7 \u10D9\u10DA\u10D0\u10D5\u10D8\u10D0\u10E2\u10E3\u10E0\u10E3\u10DA\u10D8 \u10D9\u10DD\u10DB\u10D1\u10D8\u10DC\u10D0\u10EA\u10D8\u10D0 CTRL+V."\r
+},\r
+table:{\r
+desc:"\u10EA\u10EE\u10E0\u10D8\u10DA\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0/\u10E0\u10D4\u10D3\u10D0\u10E5\u10E2\u10D8\u10E0\u10D4\u10D1\u10D0",\r
+row_before_desc:"\u10E1\u10E2\u10D8\u10E5\u10DD\u10DC\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0 \u10D6\u10D4\u10DB\u10DD\u10D7",\r
+row_after_desc:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0 \u10E5\u10D5\u10D4\u10DB\u10DD\u10D7",\r
+delete_row_desc:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8\u10E1 \u10EC\u10D0\u10E8\u10DA\u10D0",\r
+col_before_desc:"\u10E1\u10D5\u10D4\u10E2\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0 \u10DB\u10D0\u10E0\u10EA\u10EE\u10DC\u10D8\u10D5",\r
+col_after_desc:"\u10E1\u10D5\u10D4\u10E2\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0 \u10DB\u10D0\u10E0\u10EF\u10D5\u10DC\u10D8\u10D5",\r
+delete_col_desc:"\u10E1\u10D5\u10D4\u10E2\u10D8\u10E1 \u10EC\u10D0\u10E8\u10DA\u10D0",\r
+split_cells_desc:"\u10E3\u10EF\u10E0\u10D8\u10E1 \u10D2\u10D0\u10E7\u10DD\u10E4\u10D0",\r
+merge_cells_desc:"\u10E3\u10EF\u10E0\u10D4\u10D1\u10D8\u10E1 \u10D2\u10D0\u10D4\u10E0\u10D7\u10D8\u10D0\u10DC\u10D4\u10D1\u10D0",\r
+row_desc:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8\u10E1 \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+cell_desc:"\u10E3\u10EF\u10E0\u10D8\u10E1 \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+props_desc:"\u10EA\u10EE\u10E0\u10D8\u10DA\u10D8\u10E1 \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D8\u10D4\u10D1\u10D8",\r
+paste_row_before_desc:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8\u10E1 \u10D6\u10D4\u10DB\u10DD\u10D7 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0",\r
+paste_row_after_desc:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8\u10E1 \u10E5\u10D5\u10D4\u10DB\u10DD\u10D7 \u10D3\u10D0\u10DB\u10D4\u10E2\u10D4\u10D1\u10D0",\r
+cut_row_desc:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8\u10E1 \u10D0\u10DB\u10DD\u10ED\u10E0\u10D0",\r
+copy_row_desc:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8\u10E1 \u10D9\u10DD\u10DE\u10D8\u10E0\u10D4\u10D1\u10D0",\r
+del:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8\u10E1 \u10EC\u10D0\u10E8\u10DA\u10D0",\r
+row:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8",\r
+col:"\u10E1\u10D5\u10D4\u10E2\u10D8",\r
+cell:"\u10E3\u10EF\u10E0\u10D0",\r
+cellprops_delta_width:"30"\r
+},\r
+autosave:{\r
+unload_msg:"\u10D7\u10E3 \u10D7\u10E5\u10D5\u10D4\u10DC \u10D3\u10D0\u10E2\u10DD\u10D5\u10D4\u10D1\u10D7 \u10DB\u10DD\u10EA\u10D4\u10DB\u10E3\u10DA \u10D2\u10D5\u10D4\u10E0\u10D3\u10E1, \u10E7\u10D5\u10D4\u10DA\u10D0 \u10EA\u10D5\u10DA\u10D8\u10DA\u10D4\u10D1\u10D0 \u10D8\u10E5\u10DC\u10D4\u10D1\u10D0 \u10D3\u10D0\u10D9\u10D0\u10E0\u10D2\u10E3\u10DA\u10D8.",\r
+restore_content:"\u10D0\u10D5\u10E2\u10DD\u10DB\u10D0\u10E2\u10E3\u10E0\u10D0\u10D3 \u10D3\u10D0\u10DB\u10D0\u10EE\u10E1\u10DD\u10D5\u10E0\u10D4\u10D1\u10E3\u10DA\u10D8\u10E1 \u10D0\u10E6\u10D3\u10D2\u10D4\u10DC\u10D0",\r
+warning_message:"\u10E7\u10D5\u10D4\u10DA\u10D0 \u10EA\u10D5\u10DA\u10D8\u10DA\u10D4\u10D1\u10D0 \u10D8\u10E5\u10DC\u10D4\u10D1\u10D0 \u10D3\u10D0\u10D9\u10D0\u10E0\u10D2\u10E3\u10DA\u10D8.\n\n\u10D2\u10D0\u10DC\u10D5\u10D0\u10D2\u10E0\u10EB\u10DD\u10D7 \u10D0\u10D5\u10E0\u10DD\u10DB\u10D0\u10E2\u10E3\u10E0\u10D0\u10D3 \u10D3\u10D0\u10DB\u10D0\u10EE\u10E1\u10DD\u10D5\u10E0\u10D4\u10D1\u10E3\u10DA\u10D8\u10E1 \u10D0\u10E6\u10D3\u10D2\u10D4\u10DC\u10D0?"\r
+},\r
+fullscreen:{\r
+desc:"\u10E1\u10E0\u10E3\u10DA\u10D4\u10D9\u10E0\u10D0\u10DC\u10D8\u10D0\u10DC\u10D8 \u10E0\u10D4\u10DF\u10D8\u10DB\u10D8"\r
+},\r
+media:{\r
+desc:"\u10D9\u10DA\u10D8\u10DE\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0/\u10E0\u10D4\u10D3\u10D0\u10E5\u10E2\u10D8\u10E0\u10D4\u10D1\u10D0",\r
+edit:"\u10D9\u10DA\u10D8\u10D9\u10D8\u10E1 \u10DB\u10D0\u10EE\u10D0\u10E1\u10D8\u10D0\u10D7\u10D4\u10D1\u10DA\u10D4\u10D1\u10D8"\r
+},\r
+fullpage:{\r
+desc:"\u10D3\u10DD\u10D9\u10E3\u10DB\u10D4\u10DC\u10E2\u10D8\u10E1 \u10DB\u10D0\u10EE\u10D0\u10E1\u10D8\u10D0\u10D7\u10D4\u10D1\u10DA\u10D4\u10D1\u10D8"\r
+},\r
+template:{\r
+desc:"\u10E8\u10D0\u10D1\u10DA\u10DD\u10DC\u10D8\u10E1 \u10D2\u10D0\u10DB\u10DD\u10E7\u10D4\u10DC\u10D4\u10D1\u10D0"\r
+},\r
+visualchars:{\r
+desc:"\u10E7\u10D5\u10D4\u10DA\u10D0 \u10DC\u10D8\u10E8\u10D0\u10DC\u10D8"\r
+},\r
+spellchecker:{\r
+desc:"\u10DB\u10D0\u10E0\u10D7\u10DA\u10EC\u10D4\u10E0\u10D0",\r
+menu:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043F\u0440\u0430\u0432\u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F",\r
+ignore_word:"\u041F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u0442\u044C",\r
+ignore_words:"\u041F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0432\u0441\u0435",\r
+langs:"\u042F\u0437\u044B\u043A\u0438",\r
+wait:"\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u043E\u0434\u043E\u0436\u0434\u0438\u0442\u0435...",\r
+sug:"\u0412\u0430\u0440\u0438\u0430\u043D\u0442\u044B",\r
+no_sug:"\u041D\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432",\r
+no_mpell:"\u041E\u0448\u0438\u0431\u043E\u043A \u043D\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E."\r
+},\r
+pagebreak:{\r
+desc:"\u10D2\u10D5\u10D4\u10E0\u10D3\u10D8\u10E1 \u10D2\u10D0\u10DB\u10E7\u10DD\u10E4\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0"\r
+},\r
+advlist:{\r
+types:"\u10E1\u10D8\u10DB\u10D1\u10DD\u10DA\u10DD\u10D4\u10D1\u10D8",\r
+def:"\u10E1\u10E2\u10D0\u10DC\u10D3\u10D0\u10E0\u10E2\u10E3\u10DA\u10D8",\r
+lower_alpha:"\u0421\u0442\u0440\u043E\u0447\u043D\u044B\u0435 \u043B\u0430\u0442\u0438\u043D\u0441\u043A\u0438\u0435 \u0431\u0443\u043A\u0432\u044B",\r
+lower_greek:"\u0421\u0442\u0440\u043E\u0447\u043D\u044B\u0435 \u0433\u0440\u0435\u0447\u0435\u0441\u043A\u0438\u0435 \u0431\u0443\u043A\u0432\u044B",\r
+lower_roman:"\u0421\u0442\u0440\u043E\u0447\u043D\u044B\u0435 \u0440\u0438\u043C\u0441\u043A\u0438\u0435 \u0446\u0438\u0444\u0440\u044B",\r
+upper_alpha:"\u0417\u0430\u0433\u043B\u0430\u0432\u043D\u044B\u0435 \u043B\u0430\u0442\u0438\u043D\u0441\u043A\u0438\u0435 \u0431\u0443\u043A\u0432\u044B",\r
+upper_roman:"\u0417\u0430\u0433\u043B\u0430\u0432\u043D\u044B\u0435 \u0440\u0438\u043C\u0441\u043A\u0438\u0435 \u0446\u0438\u0444\u0440\u044B",\r
+circle:"\u10EC\u10E0\u10D4\u10D4\u10D1\u10D8",\r
+disc:"\u10EC\u10E0\u10D4\u10EC\u10D8\u10E0\u10D4\u10D1\u10D8",\r
+square:"\u10D9\u10D5\u10D0\u10D3\u10E0\u10D0\u10E2\u10D4\u10D1\u10D8"\r
+}}});
\ No newline at end of file
index 7d96c4ecff8ad747a62d451faf30074e6f2590be..79acdd1d18b528ac43d9b90c4bc56537fdfa2022 100755 (executable)
@@ -90,7 +90,9 @@ desc:"CSS\uD3B8\uC9D1"
 paste:{\r
 paste_text_desc:"\uD14D\uC2A4\uD2B8\uCC98\uB7FC \uBD99\uC5EC\uB123\uAE30",\r
 paste_word_desc:"Word\uB85C\uBD80\uD130 \uBD99\uC5EC\uB123\uAE30",\r
-selectall_desc:"\uBAA8\uB450 \uC120\uD0DD"\r
+selectall_desc:"\uBAA8\uB450 \uC120\uD0DD",\r
+plaintext_mode_sticky:"\uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uBAA8\uB4DC\uC5D0\uC11C \uBD99\uC5EC\uB123\uAE30. \uD074\uB9AD\uD558\uBA74 \uC77C\uBC18 \uBD99\uC5EC\uB123\uAE30 \uBAA8\uB4DC\uB85C \uB2E4\uC2DC \uBCC0\uACBD\uB429\uB2C8\uB2E4. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"\uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uBAA8\uB4DC\uC5D0\uC11C \uBD99\uC5EC\uB123\uAE30. \uD074\uB9AD\uD558\uBA74 \uC77C\uBC18 \uBD99\uC5EC\uB123\uAE30 \uBAA8\uB4DC\uB85C \uB2E4\uC2DC \uBCC0\uACBD\uB429\uB2C8\uB2E4."\r
 },\r
 paste_dlg:{\r
 text_title:"\uC708\uB3C4\uC6B0\uC5D0 \uD14D\uC2A4\uD2B8\uB97C \uBD99\uC774\uB824\uBA74 \uD0A4\uBCF4\uB4DC\uB85C Ctrl+V\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694.",\r
@@ -120,7 +122,9 @@ col:"\uC5F4",
 cell:"\uC140"\r
 },\r
 autosave:{\r
-unload_msg:"\uB2E4\uB978 \uD398\uC774\uC9C0\uB85C \uC774\uB3D9\uD558\uBA74 \uD3B8\uC9D1\uD55C \uB0B4\uC6A9\uC774 \uCDE8\uC18C\uB429\uB2C8\uB2E4."\r
+unload_msg:"\uB2E4\uB978 \uD398\uC774\uC9C0\uB85C \uC774\uB3D9\uD558\uBA74 \uD3B8\uC9D1\uD55C \uB0B4\uC6A9\uC774 \uCDE8\uC18C\uB429\uB2C8\uB2E4.",\r
+restore_content:"\uC790\uB3D9 \uC800\uC7A5\uB41C \uB0B4\uC6A9 \uBCF5\uAD6C",\r
+warning_message:"\uC800\uC7A5\uB41C \uB0B4\uC6A9\uC744 \uBCF5\uAD6C\uD558\uBA74 \uD604\uC7AC\uC758 \uB0B4\uC6A9\uC740 \uC0AD\uC81C\uB429\uB2C8\uB2E4.\n\n\uC815\uB9D0 \uC800\uC7A5\uB41C \uB0B4\uC6A9\uC744 \uBCF5\uAD6C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?"\r
 },\r
 fullscreen:{\r
 desc:"\uC804\uCCB4\uD654\uBA74"\r
@@ -151,4 +155,16 @@ no_mpell:"\uC624\uD0C8\uC790\uAC00 \uBC1C\uACAC\uB418\uC9C0 \uC54A\uC558\uC2B5\u
 },\r
 pagebreak:{\r
 desc:"\uC0C8\uD398\uC774\uC9C0 \uC0BD\uC785"\r
+},\r
+advlist:{\r
+types:"\uD0C0\uC785",\r
+def:"\uAE30\uBCF8",\r
+lower_alpha:"\uC54C\uD30C\uBCB3 \uC18C\uBB38\uC790",\r
+lower_greek:"\uADF8\uB9AC\uC2A4\uC5B4 \uC18C\uBB38\uC790",\r
+lower_roman:"\uB85C\uB9C8 \uC18C\uBB38\uC790",\r
+upper_alpha:"\uB300\uBB38\uC790 \uC54C\uD30C\uBCB3",\r
+upper_roman:"\uB300\uBB38\uC790 \uB85C\uB9C8",\r
+circle:"\uC6D0",\r
+disc:"\uC6D0\uD615",\r
+square:"\uC0AC\uACA9\uD615"\r
 }}});
\ No newline at end of file
index 34190a59df20511797004828be23de8438f58fb6..32e8e7d9a3e9236da72f03d2e6ffef19fb378568 100755 (executable)
@@ -4,14 +4,14 @@ edit_confirm:"Ar norite naudoti tekst\u0173 redaktoriaus re\u017Eim\u0105 \u0161
 apply:"Taikyti",\r
 insert:"\u012Eterpti",\r
 update:"Atnaujinti",\r
-cancel:"At\u0161aukti",\r
-close:"U\u017Edaryti",\r
+cancel:"Atsisakyti",\r
+close:"U\u017Everti",\r
 browse:"Nar\u0161yti",\r
 class_name:"Klas\u0117",\r
 not_set:"-- Nenurodyta --",\r
-clipboard_msg:"Kopijavimas/I\u0161kirpimas/\u012Eklijavimas negalimas Mozilla ir Firefox nar\u0161ykl\u0117se.\nAr norite daugiau informacijos apie \u0161i\u0105 problem\u0105?",\r
+clipboard_msg:"Kopijavimas/i\u0161kirpimas/\u012Fd\u0117jimas paspaudus \u0161\u012F mygtuk\u0105 negalimas Mozilla ir Firefox nar\u0161ykl\u0117se.\nNukopijuoti galima paspaudus: Ctrl + C, i\u0161kirpti: Ctrl + X, \u012Fd\u0117ti: Ctrl + V.\nAr norite daugiau informacijos apie \u0161i\u0105 problem\u0105?",\r
 clipboard_no_support:"\u0160i nar\u0161ykl\u0117 nepalaiko \u0161io veikimo, tod\u0117l naudokite klaviat\u016Bros spar\u010Diuosius klavi\u0161us.",\r
-popup_blocked:"Atsipra\u0161ome, ta\u010Diau pasteb\u0117jome, kad j\u016Bs\u0173 i\u0161\u0161okan\u010Di\u0173 lang\u0173 blokuotojas i\u0161jung\u0117 lang\u0105, kuris teikia aplikacijai funkcionalum\u0105. Tur\u0117tum\u0117te atjungti i\u0161\u0161okan\u010Di\u0173 lang\u0173 blokavim\u0105 \u0161iam tinklapiui, kad pilnai i\u0161naudoti visas galimybes.",\r
+popup_blocked:"Atsipra\u0161ome, ta\u010Diau pasteb\u0117jome, kad j\u016Bs\u0173 i\u0161kylan\u010Di\u0173 lang\u0173 blokavimo programa i\u0161jung\u0117 lang\u0105, kuris teikia aplikacijai funkcionalum\u0105. Tur\u0117tum\u0117te atjungti i\u0161kylan\u010Di\u0173 lang\u0173 blokavim\u0105 \u0161iam tinklalapiui, kad i\u0161naudotum\u0117te visas galimybes.",\r
 invalid_data:"Klaida: Blogai \u012Fvestos reik\u0161m\u0117s, kurios pa\u017Eym\u0117tos raudonai.",\r
 more_colors:"Daugiau spalv\u0173"\r
 },\r
@@ -44,20 +44,20 @@ rtl_desc:"Kryptis i\u0161 de\u0161in\u0117s \u012F kair\u0119"
 },\r
 layer:{\r
 insertlayer_desc:"\u012Eterpti nauj\u0105 sluoksn\u012F",\r
-forward_desc:"Pastumti \u012F priek\u012F",\r
-backward_desc:"Pastumpti atgal",\r
-absolute_desc:"Kaitalioti absoliut\u0173 pozicionavim\u0105",\r
+forward_desc:"Perkelti \u012F priek\u012F",\r
+backward_desc:"Perkelti atgal",\r
+absolute_desc:"Perjungti absoliut\u0173 pozicionavim\u0105",\r
 content:"Naujas sluoksnis..."\r
 },\r
 save:{\r
 save_desc:"I\u0161saugoti",\r
-cancel_desc:"At\u0161aukti visus pakeitimus"\r
+cancel_desc:"Atsisakyti vis\u0173 pakeitim\u0173"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"\u012Eterpti nelau\u017Eiam\u0105 tarpo simbol\u012F"\r
+nonbreaking_desc:"\u012Eterpti jungiamojo tarpo simbol\u012F"\r
 },\r
 iespell:{\r
-iespell_desc:"\u012Ejungti klaid\u0173 tikrinim\u0105",\r
+iespell_desc:"Paleisti ra\u0161ybos tikrintuv\u0119",\r
 download:"ieSpell neaptiktas. Ar norite dabar j\u012F \u012Fdiegti?"\r
 },\r
 advhr:{\r
@@ -65,7 +65,7 @@ advhr_desc:"Horizontali linija",
 delta_width:"10"\r
 },\r
 emotions:{\r
-emotions_desc:"Emotikonai"\r
+emotions_desc:"Jaustukai"\r
 },\r
 searchreplace:{\r
 search_desc:"Ie\u0161koti",\r
@@ -100,46 +100,50 @@ desc:"Redaguoti CSS stili\u0173",
 delta_width:"40"\r
 },\r
 paste:{\r
-paste_text_desc:"\u012Eklijuoti kaip paprast\u0105 tekst\u0105",\r
-paste_word_desc:"\u012Eklijuoti i\u0161 Word",\r
-selectall_desc:"Visk\u0105 pa\u017Eym\u0117ti"\r
+paste_text_desc:"\u012Ed\u0117ti kaip paprast\u0105 tekst\u0105",\r
+paste_word_desc:"\u012Ed\u0117ti i\u0161 Word",\r
+selectall_desc:"Visk\u0105 pa\u017Eym\u0117ti",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
-text_title:"Naudokite CTRL+V, kad \u012Fklijuoti tekst\u0105 \u012F \u0161\u012F lang\u0105.",\r
+text_title:"Naudokite CTRL+V tekstui \u012Fd\u0117ti \u012F \u0161\u012F lang\u0105.",\r
 text_linebreaks:"Palikti eilu\u010Di\u0173 l\u016B\u017Eius",\r
-word_title:"Naudokite CTRL+V, kad \u012Fklijuoti tekst\u0105 \u012F \u0161\u012F lang\u0105."\r
+word_title:"Naudokite CTRL+V tekstui \u012Fd\u0117ti \u012F \u0161\u012F lang\u0105."\r
 },\r
 table:{\r
-desc:"\u012Eterpia nauj\u0105 lentel\u0119",\r
+desc:"\u012Eterpti/Redaguoti lentel\u0119",\r
 row_before_desc:"\u012Eterpti eilut\u0119 prie\u0161",\r
 row_after_desc:"\u012Eterpti eilut\u0119 po",\r
-delete_row_desc:"I\u0161trinti eilut\u0119",\r
+delete_row_desc:"\u0160alinti eilut\u0119",\r
 col_before_desc:"\u012Eterpti stulpel\u012F prie\u0161",\r
 col_after_desc:"\u012Eterpti stulpel\u012F po",\r
-delete_col_desc:"I\u0161trinti stulpel\u012F",\r
-split_cells_desc:"I\u0161skaidyti sulietas lentel\u0117s l\u0105steles",\r
-merge_cells_desc:"Sulieti lentel\u0117s l\u0105steles",\r
+delete_col_desc:"\u0160alinti stulpel\u012F",\r
+split_cells_desc:"Skaidyti sulietus lentel\u0117s langelius",\r
+merge_cells_desc:"Sujungti lentel\u0117s langelius",\r
 row_desc:"Lentel\u0117s eilut\u0117s nustatymai",\r
-cell_desc:"Lentel\u0117s l\u0105stel\u0117s nustatymai",\r
+cell_desc:"Lentel\u0117s langelio nustatymai",\r
 props_desc:"Lentel\u0117s nustatymai",\r
-paste_row_before_desc:"\u012Eklijuoti lentel\u0117s eilut\u0119 prie\u0161",\r
-paste_row_after_desc:"\u012Eklijuoti lentel\u0117s eilut\u0119 po",\r
+paste_row_before_desc:"\u012Ed\u0117ti lentel\u0117s eilut\u0119 prie\u0161",\r
+paste_row_after_desc:"\u012Ed\u0117ti lentel\u0117s eilut\u0119 po",\r
 cut_row_desc:"I\u0161kirpti lentel\u0117s eilut\u0119",\r
 copy_row_desc:"Kopijuoti lentel\u0117s eilut\u0119",\r
-del:"I\u0161trinti eilut\u0119",\r
+del:"\u0160alinti lentel\u0119",\r
 row:"Eilut\u0117",\r
 col:"Stulpelis",\r
-cell:"L\u0105stel\u0117",\r
+cell:"Langelis",\r
 rowprops_delta_width:"10",\r
 cellprops_delta_width:"10",\r
 table_delta_width:"10",\r
 merge_cells_delta_width:"10"\r
 },\r
 autosave:{\r
-unload_msg:"Visi pakeitimai bus prarasti jei i\u0161eisite \u0161iuo langu i\u0161 esamo puslapio."\r
+unload_msg:"Visi pakeitimai bus prarasti, jei i\u0161eisite i\u0161 \u0161io puslapio.",\r
+restore_content:"Atstatyti automati\u0161kai i\u0161saugot\u0105 turin\u012F.",\r
+warning_message:"Jei atstatysite i\u0161saugot\u0105 turin\u012F, prarasite esam\u0105 turin\u012F redaktoriaus lange.\n\nAr tikrai norite atstatyti i\u0161saugot\u0105 turin\u012F?"\r
 },\r
 fullscreen:{\r
-desc:"Kaitalioti viso ekrano re\u017Eim\u0105"\r
+desc:"Perjungti viso ekrano re\u017Eim\u0105"\r
 },\r
 media:{\r
 desc:"\u012Eterpti/redaguoti integruot\u0105 daugialyp\u0119 terp\u0119",\r
@@ -151,14 +155,14 @@ desc:"Dokumento nustatymai",
 delta_width:"10"\r
 },\r
 template:{\r
-desc:"\u012Eterpti jau nustatyt\u0105 \u0161ablonin\u012F turin\u012F"\r
+desc:"\u012Eterpti numatyt\u0105 \u0161ablono turin\u012F"\r
 },\r
 visualchars:{\r
-desc:"Visualiniai valdymo simboliai \u012Fjungti/i\u0161jungti."\r
+desc:"Vizualiniai valdymo simboliai \u012Fjungti/i\u0161jungti."\r
 },\r
 spellchecker:{\r
-desc:"Kaitalioti klaid\u0173 tikrinim\u0105",\r
-menu:"Klaid\u0173 tikrinimo nustatymai",\r
+desc:"Perjungti ra\u0161ybos tikrintuv\u0119",\r
+menu:"Ra\u0161ybos tikrintuv\u0117s nustatymai",\r
 ignore_word:"Ignoruoti \u017Eod\u012F",\r
 ignore_words:"Ignoruoti visk\u0105",\r
 langs:"Kalbos",\r
@@ -169,4 +173,16 @@ no_mpell:"Klaid\u0173 nerasta."
 },\r
 pagebreak:{\r
 desc:"\u012Eterpti puslapio pabaigos \u017Eym\u0119."\r
+},\r
+advlist:{\r
+types:"Tipai",\r
+def:"Numatytasis",\r
+lower_alpha:"Ma\u017Eosiomis raid\u0117mis",\r
+lower_greek:"Ma\u017Eaisiais graik\u0173",\r
+lower_roman:"Ma\u017Eaisiais rom\u0117n\u0173",\r
+upper_alpha:"Did\u017Eiosiomis raid\u0117mis",\r
+upper_roman:"Did\u017Eiaisiais rom\u0117n\u0173",\r
+circle:"Apskritimas",\r
+disc:"Diskas",\r
+square:"Kvadratas"\r
 }}});
\ No newline at end of file
index 52ee03c5ed8df8623c7ab15b1cf5b7984145417a..dac800919af23286679fe0ec983e10102c6261fc 100755 (executable)
@@ -77,50 +77,54 @@ advlink:{
 link_desc:"Ievietot/Redi\u0123\u0113t saiti"\r
 },\r
 xhtmlxtras:{\r
-cite_desc:"Citation",\r
-abbr_desc:"Abbreviation",\r
+cite_desc:"Cit\u0101ts",\r
+abbr_desc:"Sa\u012Bsin\u0101jums",\r
 acronym_desc:"Acronym",\r
 del_desc:"Deletion",\r
 ins_desc:"Insertion",\r
-attribs_desc:"Insert/Edit Attributes"\r
+attribs_desc:"Pielikt/redi\u0123\u0113t \u012Bpa\u0161\u012Bbas"\r
 },\r
 style:{\r
 desc:"Edit CSS Style"\r
 },\r
 paste:{\r
-paste_text_desc:"Paste as Plain Text",\r
-paste_word_desc:"Paste from Word",\r
-selectall_desc:"Select All"\r
+paste_text_desc:"Iekop\u0113t ka parasto tekstu",\r
+paste_word_desc:"Iekop\u0113t no Word",\r
+selectall_desc:"Iez\u012Bm\u0113t visu",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
-text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
-text_linebreaks:"Keep linebreaks",\r
-word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+text_title:"Izmantojiet CTRL+V uz j\u016Bsu tastat\u016Bras lai iekop\u0113t tekstu log\u0101.",\r
+text_linebreaks:"Sagl\u0101b\u0101t l\u012Bniju sadal\u012Bt\u0101jus",\r
+word_title:"Izmantojiet CTRL+V uz j\u016Bsu tastat\u016Bras lai iekop\u0113t tekstu log\u0101."\r
 },\r
 table:{\r
-desc:"Inserts a new table",\r
-row_before_desc:"Insert row before",\r
-row_after_desc:"Insert row after",\r
-delete_row_desc:"Delete row",\r
-col_before_desc:"Insert column before",\r
-col_after_desc:"Insert column after",\r
-delete_col_desc:"Remove column",\r
-split_cells_desc:"Split merged table cells",\r
-merge_cells_desc:"Merge table cells",\r
-row_desc:"Table row properties",\r
-cell_desc:"Table cell properties",\r
-props_desc:"Table properties",\r
-paste_row_before_desc:"Paste table row before",\r
-paste_row_after_desc:"Paste table row after",\r
-cut_row_desc:"Cut table row",\r
-copy_row_desc:"Copy table row",\r
-del:"Delete table",\r
-row:"Row",\r
-col:"Column",\r
-cell:"Cell"\r
+desc:"Ielikt jaunu tabulu",\r
+row_before_desc:"Ielikt jaunu rindu priek\u0161\u0101",\r
+row_after_desc:"Ielikt jaunu rindu aiz",\r
+delete_row_desc:"Izdz\u0113st rindu",\r
+col_before_desc:"Ielikt jaunu stabu priek\u0161\u0101",\r
+col_after_desc:"Ielikt jaunu stabu aiz",\r
+delete_col_desc:"Izdz\u0113st stabu",\r
+split_cells_desc:"Sadal\u012Bt apvienotas tabules ailes",\r
+merge_cells_desc:"Apvienot tabulas ailes",\r
+row_desc:"Tabulas rindas \u012Bpa\u0161\u012Bbas",\r
+cell_desc:"Tabulas ailes \u012Bpa\u0161\u012Bbas",\r
+props_desc:"Tabulas \u012Bpa\u0161\u012Bbas",\r
+paste_row_before_desc:"Ielikt tabulas rindu priek\u0161\u0101",\r
+paste_row_after_desc:"Ielikt tabulas rindu aiz",\r
+cut_row_desc:"Izgriezt tabulas rindu",\r
+copy_row_desc:"Kop\u0113t tabulas rindu",\r
+del:"Izdz\u0113st tabulu",\r
+row:"Rinda",\r
+col:"St\u0101bs",\r
+cell:"Aile"\r
 },\r
 autosave:{\r
-unload_msg:"The changes you made will be lost if you navigate away from this page."\r
+unload_msg:"The changes you made will be lost if you navigate away from this page.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Toggle fullscreen mode"\r
@@ -151,4 +155,16 @@ no_mpell:"No misspellings found."
 },\r
 pagebreak:{\r
 desc:"Insert page break."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index 08e693655b29b4542eef748e4103b8e02fc74d5b..63ef4289e979841758027a34cb4b382a35ff9f7b 100755 (executable)
@@ -90,7 +90,9 @@ desc:"Uredi CSS"
 paste:{\r
 paste_text_desc:"Zalepi kao obi\u010Dni tekst",\r
 paste_word_desc:"Zalepi iz Worda",\r
-selectall_desc:"Odaberi sve"\r
+selectall_desc:"Odaberi sve",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Koristite CTRL+V na tipkovnici da zalepite tekst u prozor.",\r
@@ -120,7 +122,9 @@ col:"Stupac",
 cell:"\u0106elija"\r
 },\r
 autosave:{\r
-unload_msg:"Promjene u dokumentu \u0107e biti izgubljene ako iza\u0111ete s ove stranice."\r
+unload_msg:"Promjene u dokumentu \u0107e biti izgubljene ako iza\u0111ete s ove stranice.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Uklju\u010Di/isklju\u010Di prikaz preko celog ekrana"\r
@@ -151,4 +155,16 @@ no_mpell:"Nije prona\u0111ena nijedna pravopisna gre\u0161ka."
 },\r
 pagebreak:{\r
 desc:"\u0412\u043C\u0435\u0442\u043D\u0438 prelom."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index 54729332e4b4b1684b0a9d710edc9ae5ba3c95be..1ef0b6437236779a6fdaa7c53cd00fe58c0b481b 100755 (executable)
@@ -90,7 +90,9 @@ desc:"Sunting Gaya CSS"
 paste:{\r
 paste_text_desc:"Tempel sebagai teks",\r
 paste_word_desc:"Tempel dari Word",\r
-selectall_desc:"Pilih semua"\r
+selectall_desc:"Pilih semua",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Guna CTRL+V pada papan kekunci anda untuk Tempel teks ke dalam tetingkap.",\r
@@ -120,7 +122,9 @@ col:"Kolum",
 cell:"Sel"\r
 },\r
 autosave:{\r
-unload_msg:"Pertukaran akan terbatal sekiranya anda meninggalkan halaman ini."\r
+unload_msg:"Pertukaran akan terbatal sekiranya anda meninggalkan halaman ini.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Alih mod skrin penuh"\r
@@ -151,4 +155,16 @@ no_mpell:"Tiada kesalahan ejaan."
 },\r
 pagebreak:{\r
 desc:"Masukkan penghenti-halaman."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index cd6a08c82775d7357b0085b3354ac3549a1b4bbd..76ee11e30f679a88ad48f555f34b94c2ae177168 100755 (executable)
@@ -90,7 +90,9 @@ desc:"Rediger CSS-stil"
 paste:{\r
 paste_text_desc:"Lim inn som vanlig tekst",\r
 paste_word_desc:"Lim inn fra Word",\r
-selectall_desc:"Marker al"\r
+selectall_desc:"Marker al",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Bruk CTRL+V p\u00E5 tastaturet for \u00E5 lime inn i dette vinduet.",\r
@@ -120,7 +122,9 @@ col:"Kolonne",
 cell:"Celle"\r
 },\r
 autosave:{\r
-unload_msg:"Endringene du gjorde g\u00E5r tapt dersom du velger \u00E5 forlate denne siden!"\r
+unload_msg:"Endringene du gjorde g\u00E5r tapt dersom du velger \u00E5 forlate denne siden!",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Skift til/fra fullskjermmodus"\r
@@ -151,4 +155,16 @@ no_mpell:"Ingen stavefeil funnet"
 },\r
 pagebreak:{\r
 desc:"Sett inn sideskift"\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index baffb61caac4d95f449771421b89f36581ed14e9..9901525dc91ef06a2acf3c0bd0931990fdd621ba 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n({nl:{\r
 common:{\r
-edit_confirm:"Weet je zeker dat je tekst in WYSIWYG mode wilt bewerken in dit tekstveld?",\r
+edit_confirm:"Weet u zeker dat u tekst in WYSIWYG mode wilt bewerken in dit tekstveld?",\r
 apply:"Toepassen",\r
 insert:"Invoegen",\r
 update:"Bijwerken",\r
@@ -10,8 +10,8 @@ browse:"Bladeren",
 class_name:"Klasse",\r
 not_set:"- Standaard -",\r
 clipboard_msg:"Kopi\u00EBren/knippen/plakken is niet beschikbaar in Mozilla en Firefox.\nWilt u meer informatie over deze beperking?",\r
-clipboard_no_support:"Kopi\u00EBren/knippen/plakken is niet ondersteund door uw browser, gebruik hiervoor de sneltoetsen.",\r
-popup_blocked:"U zult uw popup-blocker tijdelijk moeten uitschakelen voor deze website om gebruik te kunnen maken van alle fucties van deze teksteditor.",\r
+clipboard_no_support:"Kopi\u00EBren/knippen/plakken wordt niet ondersteund door uw browser, gebruik hiervoor de sneltoetsen.",\r
+popup_blocked:"U zult uw popup-blocker tijdelijk moeten uitschakelen voor deze website om gebruik te kunnen maken van alle functies van deze teksteditor.",\r
 invalid_data:"Fout: Er zijn ongeldige waardes ingevoerd, deze zijn rood gemarkeerd.",\r
 more_colors:"Meer kleuren"\r
 },\r
@@ -30,7 +30,7 @@ inserttime_desc:"Tijd invoegen",
 months_long:"Januari,Februari,Maart,April,Mei,Juni,Juli,Augustus,September,Oktober,November,December",\r
 months_short:"Jan,Feb,Mar,Apr,Mei,Jun,Jul,Aug,Sep,Okt,Nov,Dec",\r
 day_long:"Zondag,Maandag,Dinsdag,Woensdag,Donderdag,Vrijdag,Zaterdag,Zondag",\r
-day_short:"Zo,Ma,Di,Wo,Do,Vr,Zat,Zon"\r
+day_short:"zo,ma,di,wo,do,vr,za,zo"\r
 },\r
 print:{\r
 print_desc:"Afdrukken"\r
@@ -90,7 +90,9 @@ desc:"CSS Stijl bewerken"
 paste:{\r
 paste_text_desc:"Als platte tekst plakken",\r
 paste_word_desc:"Vanuit Word plakken",\r
-selectall_desc:"Alles selecteren"\r
+selectall_desc:"Alles selecteren",\r
+plaintext_mode_sticky:"Plakken is nu in plattetekstmodus. Klik nog een keer om terug te gaan naar normaal plakken. Nadat u iets plakt, keert u terug naar normaal plakken.",\r
+plaintext_mode:"Plakken is nu in plattetekstmoduse. Klik nog een keer om terug te gaan naar normaal plakken."\r
 },\r
 paste_dlg:{\r
 text_title:"Gebruik Ctrl+V om tekst in het venster te plakken.",\r
@@ -120,7 +122,9 @@ col:"Kolom",
 cell:"Cel"\r
 },\r
 autosave:{\r
-unload_msg:"De wijzigingen zullen verloren gaan als u nu deze pagina verlaat."\r
+unload_msg:"De wijzigingen zullen verloren gaan als u nu deze pagina verlaat.",\r
+restore_content:"Automatisch opgeslagen inhoud laden.",\r
+warning_message:"Als u de opgeslagen inhoud laadt, verliest u de inhoud die zich momenteel in de editor bevindt.\n\nWeet u zeker dat u de opgeslagen inhoud wilt laden?"\r
 },\r
 fullscreen:{\r
 desc:"Volledig scherm"\r
@@ -133,7 +137,7 @@ fullpage:{
 desc:"Documenteigenschappen"\r
 },\r
 template:{\r
-desc:"Voorgedefineerd sjabloon invoegen"\r
+desc:"Voorgedefinieerd sjabloon invoegen"\r
 },\r
 visualchars:{\r
 desc:"Zichtbare symbolen"\r
@@ -144,11 +148,23 @@ menu:"Instellingen spellingcontrole",
 ignore_word:"Woord negeren",\r
 ignore_words:"Alles negeren",\r
 langs:"Talen",\r
-wait:"Een ogenblik geduld...",\r
+wait:"Een ogenblik geduld\u2026",\r
 sug:"Suggesties",\r
 no_sug:"Geen suggesties",\r
 no_mpell:"Geen spelfouten gevonden."\r
 },\r
 pagebreak:{\r
 desc:"Pagina-einde invoegen"\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Standaard",\r
+lower_alpha:"Alfa (klein)",\r
+lower_greek:"Griekse letters (klein)",\r
+lower_roman:"Romeinse letters (klein)",\r
+upper_alpha:"Alfa (groot)",\r
+upper_roman:"Romeinse letters (groot)",\r
+circle:"Cirkel",\r
+disc:"Schijf",\r
+square:"Vierkant"\r
 }}});
\ No newline at end of file
index 8106a4d6275757352f464afe7413001ac5522567..4f80e45a75c1e702dde84fbb42f82c7004c46d7e 100755 (executable)
@@ -90,7 +90,9 @@ desc:"Rediger CSS-stil"
 paste:{\r
 paste_text_desc:"Lim inn som vanleg tekst",\r
 paste_word_desc:"Lim inn fr\u00E5 Word",\r
-selectall_desc:"Marker al"\r
+selectall_desc:"Marker al",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Bruk CTRL+V p\u00E5 tastaturet for \u00E5 lime inn i dette vindauget.",\r
@@ -120,7 +122,9 @@ col:"Kolonne",
 cell:"Celle"\r
 },\r
 autosave:{\r
-unload_msg:"Endringane du gjorde g\u00E5r tapt om du forl\u00E8t denne sida!"\r
+unload_msg:"Endringane du gjorde g\u00E5r tapt om du forl\u00E8t denne sida!",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Skift til/fr\u00E5 fullskjermmodus"\r
@@ -151,4 +155,16 @@ no_mpell:"Inga stavefeil funne."
 },\r
 pagebreak:{\r
 desc:"Set inn sideskift"\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/no.js b/program/js/tiny_mce/langs/no.js
new file mode 100644 (file)
index 0000000..f02a6a5
--- /dev/null
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({no:{\r
+common:{\r
+edit_confirm:"Vil du bruke WYSIWYG-editoren for dette tekstfeltet?",\r
+apply:"Legg til",\r
+insert:"Sett inn",\r
+update:"Oppdater",\r
+cancel:"Avbryt",\r
+close:"Stopp",\r
+browse:"Bla gjennom",\r
+class_name:"Klasse",\r
+not_set:"--ikke sett--",\r
+clipboard_msg:"Klipp ut / Kopier /Lim inn fungerer ikke i Mozilla og Firefox. Vil du vite mer om dette?",\r
+clipboard_no_support:"For tiden ikke st\u00F8ttet av nettleseren din, bruk tastatursnarveier i stedet.",\r
+popup_blocked:"Beklager, det er registrert at du har popup-sperre aktivert i nettleseren. Du m\u00E5 oppheve popup-sperren for nettstedet for \u00E5 f\u00E5 tilgang til dette verkt\u00F8yet",\r
+invalid_data:"Feil: Ugyldige verdier er skrevet inn, disse er merket med r\u00F8dt",\r
+more_colors:"Flere farger"\r
+},\r
+contextmenu:{\r
+align:"Justering",\r
+left:"Venstre",\r
+center:"Midtstill",\r
+right:"H\u00F8yre",\r
+full:"Full"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%d-%m-%Y",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Lim inn dato",\r
+inserttime_desc:"Lim inn tid",\r
+months_long:"januar,februar,mars,april,mai,juni,juli,august,september,oktober,november,desember",\r
+months_short:"jan,feb,mar,apr,mai,jun,jul,aug,sep,oct,nov,des",\r
+day_long:"s\u00F8ndag,mandag,tirsdag,onsdag,torsdag,fredag,l\u00F8rdag,s\u00F8ndag",\r
+day_short:"s\u00F8n,man,tir,ons,tor,fre,l\u00F8r,s\u00F8n"\r
+},\r
+print:{\r
+print_desc:"Skriv ut"\r
+},\r
+preview:{\r
+preview_desc:"Forh\u00E5ndsvisning"\r
+},\r
+directionality:{\r
+ltr_desc:"Retning venstre mot h\u00F8yre",\r
+rtl_desc:"Retning h\u00F8yre mot venstre"\r
+},\r
+layer:{\r
+insertlayer_desc:"Sett inn nytt lag",\r
+forward_desc:"Flytt framover",\r
+backward_desc:"Flytt bakover",\r
+absolute_desc:"Sl\u00E5 p\u00E5/av absolutt plassering",\r
+content:"Nytt lag..."\r
+},\r
+save:{\r
+save_desc:"Lagre",\r
+cancel_desc:"Kanseller alle endringer"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"Sett inn hardt mellomrom"\r
+},\r
+iespell:{\r
+iespell_desc:"Kontroller rettskriving",\r
+download:"ieSpell ikke funnet. \u00D8nsker du \u00E5 installere ieSpell?"\r
+},\r
+advhr:{\r
+advhr_desc:"Horisontal linje"\r
+},\r
+emotions:{\r
+emotions_desc:"Hum\u00F8rfjes"\r
+},\r
+searchreplace:{\r
+search_desc:"S\u00F8k",\r
+replace_desc:"S\u00F8k/Erstatt"\r
+},\r
+advimage:{\r
+image_desc:"Sett inn / endre bilde"\r
+},\r
+advlink:{\r
+link_desc:"Sett inn / endre lenke"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Sitat",\r
+abbr_desc:"Forkortning",\r
+acronym_desc:"Akronym",\r
+del_desc:"Sletting",\r
+ins_desc:"Innsetting",\r
+attribs_desc:"Sett inn / Endre egenskaper"\r
+},\r
+style:{\r
+desc:"Rediger CSS-stil"\r
+},\r
+paste:{\r
+paste_text_desc:"Lim inn som vanlig tekst",\r
+paste_word_desc:"Lim inn fra Word",\r
+selectall_desc:"Marker alt",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"Bruk CTRL+V p\u00E5 tastaturet for \u00E5 lime inn i dette vinduet.",\r
+text_linebreaks:"Behold tekstbryting",\r
+word_title:"Bruk CTRL+V p\u00E5 tastaturet for \u00E5 lime inn i dette vinduet."\r
+},\r
+table:{\r
+desc:"Sett inn en ny tabell",\r
+row_before_desc:"Sett inn rad framfor",\r
+row_after_desc:"Sett inn rad etter",\r
+delete_row_desc:"Fjern rad",\r
+col_before_desc:"Sett inn kolonne framfor",\r
+col_after_desc:"Sett inn kolonne etter",\r
+delete_col_desc:"Fjern kolonne",\r
+split_cells_desc:"Del celler",\r
+merge_cells_desc:"Sl\u00E5 sammen celler",\r
+row_desc:"Radegenskaper",\r
+cell_desc:"Celleegenskaper",\r
+props_desc:"Tabellegenskaper",\r
+paste_row_before_desc:"Lim inn rad framfor",\r
+paste_row_after_desc:"Lim inn rad etter",\r
+cut_row_desc:"Fjern rad",\r
+copy_row_desc:"Kopier rad",\r
+del:"Slett tabell",\r
+row:"Rad",\r
+col:"Kolonne",\r
+cell:"Celle"\r
+},\r
+autosave:{\r
+unload_msg:"Endringene du gjorde g\u00E5r tapt om du forlater denne siden!",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"Skift til/fra fullskjermmodus"\r
+},\r
+media:{\r
+desc:"Sett inn / rediger inkludert objekt",\r
+edit:"Endre innsatt objekt"\r
+},\r
+fullpage:{\r
+desc:"Dokumentegenskaper"\r
+},\r
+template:{\r
+desc:"Sett inn forh\u00E5ndsdefinert malinnhold"\r
+},\r
+visualchars:{\r
+desc:"Visuelle konktrolltegn p\u00E5/av"\r
+},\r
+spellchecker:{\r
+desc:"Stavekontroll p\u00E5/av",\r
+menu:"Vis meny",\r
+ignore_word:"Ignorer ord",\r
+ignore_words:"Ignorer alt",\r
+langs:"Spr\u00E5k",\r
+wait:"Vennligst vent...",\r
+sug:"Framlegg",\r
+no_sug:"Ingen framlegg",\r
+no_mpell:"Ingen stavefeil funnet."\r
+},\r
+pagebreak:{\r
+desc:"Sett inn sideskift"\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
index 59be99b252485268cba7bbd2cf1c383af8efab41..044c6ddd06113cf31f923bdbd1b237e6595e02a4 100755 (executable)
@@ -8,7 +8,7 @@ cancel:"Anuluj",
 close:"Zamknij",\r
 browse:"Przegl\u0105daj",\r
 class_name:"Klasa",\r
-not_set:"-- Nie ustawiony --",\r
+not_set:"-- Brak --",\r
 clipboard_msg:"Akcje Kopiuj/Wytnij/Wklej nie s\u0105 dost\u0119pne w Mozilli i Firefox.\nCzy chcesz wi\u0119cej informacji o tym problemie?",\r
 clipboard_no_support:"Aktualnie nie jest wspomagany przez Twoj\u0105 przegl\u0105dark\u0119, u\u017Cyj skr\u00F3t\u00F3w klawiaturowych w zamian.",\r
 popup_blocked:"Zauwa\u017Cyli\u015Bmy, \u017Ce Twoje blokowanie wyskakuj\u0105cych okienek wy\u0142\u0105czy\u0142o okno, kt\u00F3re dostarcza funkcjonalno\u015B\u0107 aplikacji. B\u0119dziesz potrzebowa\u0142 wy\u0142\u0105czy\u0107 blokowanie wyskakuj\u0105cych okienek na tej stronie aby w pe\u0142ni wykorzysta\u0107 to narz\u0119dzie.",\r
@@ -20,7 +20,7 @@ align:"Wyr\u00F3wnanie",
 left:"Lewy",\r
 center:"\u015Arodkowy",\r
 right:"Prawy",\r
-full:"Wype\u0142niony"\r
+full:"Wyjustuj"\r
 },\r
 insertdatetime:{\r
 date_fmt:"%Y-%m-%d",\r
@@ -28,9 +28,9 @@ time_fmt:"%H:%M:%S",
 insertdate_desc:"Wstaw dat\u0119",\r
 inserttime_desc:"Wstaw czas",\r
 months_long:"Stycze\u0144, Luty, Marzec, Kwiecie\u0144, Maj, Czerwiec, Lipiec, Sierpie\u0144, Wrzesie\u0144, Pa\u017Adziernik, Listopad, Grudzie\u0144",\r
-months_short:"Sty,Lut,Mar,Kw,Maj,Cze,Lip,Sier,Wrz,Pa\u017A,Lis,Gru",\r
+months_short:"Sty,Lut,Mar,Kwi,Maj,Cze,Lip,Sie,Wrz,Pa\u017A,Lis,Gru",\r
 day_long:"Niedziela, Poniedzia\u0142ek, Wtorek, \u015Aroda, Czwartek, Pi\u0105tek, Sobota, Niedziela",\r
-day_short:"Niedz,Pon,Wt,\u015Ar,Czw,Pt,Sob,Niedz"\r
+day_short:"N,Pn,Wt,\u015Ar,Cz,Pt,So,N"\r
 },\r
 print:{\r
 print_desc:"Drukuj"\r
@@ -50,7 +50,7 @@ absolute_desc:"Prze\u0142\u0105cz pozycjonowanie absolutne",
 content:"Nowa warstwa..."\r
 },\r
 save:{\r
-save_desc:"Zachowaj",\r
+save_desc:"Zachowaj\u015B\u017A\u0142",\r
 cancel_desc:"Anuluj wszystkie zmiany"\r
 },\r
 nonbreaking:{\r
@@ -58,7 +58,7 @@ nonbreaking_desc:"Wklej tward\u0105 spacj\u0119"
 },\r
 iespell:{\r
 iespell_desc:"Sprawd\u017A pisowni\u0119",\r
-download:"ieSpell nie wykryte. Czy chcesz to teraz zainstalowa\u0107?"\r
+download:"ieSpell nie wykryte. Czy przeprowadzi\u0107 instalacj\u0119 tego komponentu?"\r
 },\r
 advhr:{\r
 advhr_desc:"Pozioma linia"\r
@@ -88,9 +88,11 @@ style:{
 desc:"Edytuj Style CSS"\r
 },\r
 paste:{\r
-paste_text_desc:"Wklej jako Zwyk\u0142y Tekst",\r
+paste_text_desc:"Wklej jako zwyk\u0142y tekst",\r
 paste_word_desc:"Wklej z Worda",\r
-selectall_desc:"Zaznacz wszystko"\r
+selectall_desc:"Zaznacz wszystko",\r
+plaintext_mode_sticky:"Wklejanie jest teraz dost\u0119pne w trybie tekstowym. Kliknij ponownie, aby prze\u0142\u0105czy\u0107 si\u0119 z powrotem do trybu wklejania sformatowanego tekstu. Po wklejeniu tekstu nast\u0105pi powr\u00F3t do trybu wklejania zformatowanego tekstu.",\r
+plaintext_mode:"Wklejanie jest teraz dost\u0119pne w trybie tekstowym. Kliknij ponownie, aby prze\u0142\u0105czy\u0107 si\u0119 z powrotem do trybu wklejania sformatowanego tekstu."\r
 },\r
 paste_dlg:{\r
 text_title:"U\u017Cyj CTRL+V na swojej klawiaturze \u017Ceby wklei\u0107 tekst do okna.",\r
@@ -99,20 +101,20 @@ word_title:"U\u017Cyj CTRL+V na swojej klawiaturze \u017Ceby wklei\u0107 tekst d
 },\r
 table:{\r
 desc:"Wstaw now\u0105 tabel\u0119",\r
-row_before_desc:"Wstaw nowy wierdz przed...",\r
+row_before_desc:"Wstaw nowy wiersz przed...",\r
 row_after_desc:"Wstaw nowy wiersz po...",\r
 delete_row_desc:"Usu\u0144 wiersz",\r
-col_before_desc:"Wstaw kolumne przed...",\r
-col_after_desc:"Wstaw kolumne po...",\r
+col_before_desc:"Wstaw kolumn\u0119 przed...",\r
+col_after_desc:"Wstaw kolumn\u0119 po...",\r
 delete_col_desc:"Usu\u0144 kolumn\u0119",\r
 split_cells_desc:"Podziel kom\u00F3rk\u0119",\r
 merge_cells_desc:"Po\u0142\u0105cz kom\u00F3rki",\r
 row_desc:"W\u0142a\u015Bciwo\u015Bci wiersza",\r
 cell_desc:"W\u0142a\u015Bciwo\u015Bci kom\u00F3rki",\r
-props_desc:"Table properties",\r
+props_desc:"W\u0142a\u015Bciwo\u015Bci tabeli",\r
 paste_row_before_desc:"Wklej wiersz przed...",\r
 paste_row_after_desc:"Wklej wiersz po...",\r
-cut_row_desc:"Wynij wiersz...",\r
+cut_row_desc:"Wytnij wiersz...",\r
 copy_row_desc:"Kopiuj wiersz...",\r
 del:"Usu\u0144 tabel\u0119",\r
 row:"Wiersz",\r
@@ -120,23 +122,25 @@ col:"Kolumna",
 cell:"Kom\u00F3rka"\r
 },\r
 autosave:{\r
-unload_msg:"Zmiany, kt\u00F3re zrobi\u0142e\u015B zostan\u0105 utracone je\u015Bli opu\u015Bcisz t\u0119 stron\u0119."\r
+unload_msg:"Zmiany, kt\u00F3re zrobi\u0142e\u015B zostan\u0105 utracone je\u015Bli opu\u015Bcisz t\u0119 stron\u0119.",\r
+restore_content:"Przywr\u00F3\u0107 automatycznie zapisan\u0105 tre\u015B\u0107.",\r
+warning_message:"Je\u015Bli przywr\u00F3cisz zapisan\u0105 tre\u015B\u0107, stracisz ca\u0142\u0105 tre\u015B\u0107, kt\u00F3ra teraz si\u0119 znajduje w edytorze.\n\nJeste\u015B pewien, \u017Ce chcesz przywr\u00F3ci\u0107 zapisan\u0105 tre\u015B\u0107?."\r
 },\r
 fullscreen:{\r
 desc:"Prze\u0142\u0105cz tryb pe\u0142noekranowy"\r
 },\r
 media:{\r
-desc:"Insert / edit embedded media",\r
-edit:"Edit embedded media"\r
+desc:"Wstaw/Edytuj wbudowane media",\r
+edit:"Edytuj wbudowane media"\r
 },\r
 fullpage:{\r
-desc:"Document properties"\r
+desc:"W\u0142a\u015Bciwo\u015Bci dokumentu"\r
 },\r
 template:{\r
 desc:"Wstaw szablon dokumentu"\r
 },\r
 visualchars:{\r
-desc:"Visual control characters on/off."\r
+desc:"Graficzna kontrola pisma w\u0142\u0105cz/wy\u0142\u0105cz."\r
 },\r
 spellchecker:{\r
 desc:"Sprawdzanie pisowni",\r
@@ -146,9 +150,21 @@ ignore_words:"Ignoruj wszystkie",
 langs:"J\u0119zyki",\r
 wait:"Prosz\u0119 poczeka\u0107...",\r
 sug:"Sugestie",\r
-no_sug:"Nie ma sugestii",\r
+no_sug:"Brak sugestii",\r
 no_mpell:"\u017Badnych brakuj\u0105cych nie znaleziono."\r
 },\r
 pagebreak:{\r
 desc:"Wstaw lini\u0119."\r
+},\r
+advlist:{\r
+types:"Typy",\r
+def:"Domy\u015Blny",\r
+lower_alpha:"Ma\u0142e alfabetu",\r
+lower_greek:"Ma\u0142e greckie",\r
+lower_roman:"Ma\u0142e rzymskie",\r
+upper_alpha:"Du\u017Ce alfabetu",\r
+upper_roman:"Du\u017Ce rzymskie",\r
+circle:"Ko\u0142o",\r
+disc:"Elipsa",\r
+square:"Kwadrat"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/ps.js b/program/js/tiny_mce/langs/ps.js
new file mode 100644 (file)
index 0000000..036f7e5
--- /dev/null
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({ps:{\r
+common:{\r
+edit_confirm:"Do you want to use the WYSIWYG mode for this textarea?",\r
+apply:"Apply",\r
+insert:"Insert",\r
+update:"Update",\r
+cancel:"Cancel",\r
+close:"Close",\r
+browse:"Browse",\r
+class_name:"Class",\r
+not_set:"-- Not set --",\r
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?",\r
+clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.",\r
+popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.",\r
+invalid_data:"Error: Invalid values entered, these are marked in red.",\r
+more_colors:"More colors"\r
+},\r
+contextmenu:{\r
+align:"Alignment",\r
+left:"Left",\r
+center:"Center",\r
+right:"Right",\r
+full:"Full"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%Y-%m-%d",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Insert date",\r
+inserttime_desc:"Insert time",\r
+months_long:"January,February,March,April,May,June,July,August,September,October,November,December",\r
+months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",\r
+day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday",\r
+day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"\r
+},\r
+print:{\r
+print_desc:"Print"\r
+},\r
+preview:{\r
+preview_desc:"Preview"\r
+},\r
+directionality:{\r
+ltr_desc:"Direction left to right",\r
+rtl_desc:"Direction right to left"\r
+},\r
+layer:{\r
+insertlayer_desc:"Insert new layer",\r
+forward_desc:"Move forward",\r
+backward_desc:"Move backward",\r
+absolute_desc:"Toggle absolute positioning",\r
+content:"New layer..."\r
+},\r
+save:{\r
+save_desc:"Save",\r
+cancel_desc:"Cancel all changes"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"Insert non-breaking space character"\r
+},\r
+iespell:{\r
+iespell_desc:"Run spell checking",\r
+download:"ieSpell not detected. Do you want to install it now?"\r
+},\r
+advhr:{\r
+advhr_desc:"Horizontal rule"\r
+},\r
+emotions:{\r
+emotions_desc:"Emotions"\r
+},\r
+searchreplace:{\r
+search_desc:"Find",\r
+replace_desc:"Find/Replace"\r
+},\r
+advimage:{\r
+image_desc:"Insert/edit image"\r
+},\r
+advlink:{\r
+link_desc:"Insert/edit link"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Citation",\r
+abbr_desc:"Abbreviation",\r
+acronym_desc:"Acronym",\r
+del_desc:"Deletion",\r
+ins_desc:"Insertion",\r
+attribs_desc:"Insert/Edit Attributes"\r
+},\r
+style:{\r
+desc:"Edit CSS Style"\r
+},\r
+paste:{\r
+paste_text_desc:"Paste as Plain Text",\r
+paste_word_desc:"Paste from Word",\r
+selectall_desc:"Select All",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+},\r
+table:{\r
+desc:"Inserts a new table",\r
+row_before_desc:"Insert row before",\r
+row_after_desc:"Insert row after",\r
+delete_row_desc:"Delete row",\r
+col_before_desc:"Insert column before",\r
+col_after_desc:"Insert column after",\r
+delete_col_desc:"Remove column",\r
+split_cells_desc:"Split merged table cells",\r
+merge_cells_desc:"Merge table cells",\r
+row_desc:"Table row properties",\r
+cell_desc:"Table cell properties",\r
+props_desc:"Table properties",\r
+paste_row_before_desc:"Paste table row before",\r
+paste_row_after_desc:"Paste table row after",\r
+cut_row_desc:"Cut table row",\r
+copy_row_desc:"Copy table row",\r
+del:"Delete table",\r
+row:"Row",\r
+col:"Column",\r
+cell:"Cell"\r
+},\r
+autosave:{\r
+unload_msg:"The changes you made will be lost if you navigate away from this page.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"Toggle fullscreen mode"\r
+},\r
+media:{\r
+desc:"Insert / edit embedded media",\r
+edit:"Edit embedded media"\r
+},\r
+fullpage:{\r
+desc:"Document properties"\r
+},\r
+template:{\r
+desc:"Insert predefined template content"\r
+},\r
+visualchars:{\r
+desc:"Visual control characters on/off."\r
+},\r
+spellchecker:{\r
+desc:"Toggle spellchecker",\r
+menu:"Spellchecker settings",\r
+ignore_word:"Ignore word",\r
+ignore_words:"Ignore all",\r
+langs:"Languages",\r
+wait:"Please wait...",\r
+sug:"Suggestions",\r
+no_sug:"No suggestions",\r
+no_mpell:"No misspellings found."\r
+},\r
+pagebreak:{\r
+desc:"Insert page break."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
index 2875efdb70126e13aa452e7c30d62cdd7c5b9939..65d4a59f82e957ca9bb7e3c17e80f66713965b1a 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n({pt:{\r
 common:{\r
-edit_confirm:"Deseja usar o modo de edi\u00E7\u00E3o avan\u00E7ado nesse campo de texto?",\r
+edit_confirm:"Deseja usar o modo de edi\u00E7\u00E3o avan\u00E7ado neste campo de texto?",\r
 apply:"Aplicar",\r
 insert:"Inserir",\r
 update:"Atualizar",\r
@@ -8,11 +8,11 @@ cancel:"Cancelar",
 close:"Fechar",\r
 browse:"Procurar",\r
 class_name:"Classe",\r
-not_set:"-- N\u00E3o especificado --",\r
-clipboard_msg:"Copiar/cortar/colar n\u00E3o est\u00E1 dispon\u00EDvel no Mozilla/Firefox.\nDeseja maiores informa\u00E7\u00F5es sobre esse problema?",\r
-clipboard_no_support:"Seu navegador n\u00E3o tem suporte para esta fun\u00E7\u00E3o, use os atalhos de teclado.",\r
-popup_blocked:"Detectamos que o seu bloqueador de popups desabilitou uma janela que \u00E9 essencial para o aplicativo. Voc\u00EA precisa desabilitar o bloqueador de popups para utilizar esta ferramenta.",\r
-invalid_data:"Erro: Valores inv\u00E1lidos est\u00E3o marcados em vermelho.",\r
+not_set:"-- N/A --",\r
+clipboard_msg:"Copiar/recortar/colar n\u00E3o est\u00E1 dispon\u00EDvel no Mozilla e Firefox.\nDeseja mais informa\u00E7\u00F5es sobre este problema?",\r
+clipboard_no_support:"O seu browser n\u00E3o suporta esta fun\u00E7\u00E3o, use os atalhos do teclado.",\r
+popup_blocked:"Detectamos que o seu bloqueador de popups bloqueou uma janela que \u00E9 essencial para a aplica\u00E7\u00E3o. Voc\u00EA precisa desativar o bloqueador de janelas de popups para utilizar esta ferramenta.",\r
+invalid_data:"Erro: Valores inv\u00E1lidos marcados em vermelho.",\r
 more_colors:"Mais Cores"\r
 },\r
 contextmenu:{\r
@@ -20,45 +20,45 @@ align:"Alinhamento",
 left:"Esquerda",\r
 center:"Centro",\r
 right:"Direita",\r
-full:"Justificar"\r
+full:"Justificado"\r
 },\r
 insertdatetime:{\r
 date_fmt:"%d-%m-%Y",\r
 time_fmt:"%H:%M:%S",\r
 insertdate_desc:"Inserir data",\r
-inserttime_desc:"Inserir hor\u00E1rio",\r
+inserttime_desc:"Inserir hora",\r
 months_long:"Janeiro,Fevereiro,Mar\u00E7o,Abril,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro",\r
 months_short:"Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez",\r
-day_long:"Domingo,Segunda-Feira,Ter\u00E7a-Feira,Quarta-Feira,Quinta-Feira,Sexta-Feira,S\u00E1bado,Domingo",\r
+day_long:"Domingo,Segunda-feira,Ter\u00E7a-feira,Quarta-feira,Quinta-feira,Sexta-feira,S\u00E1bado,Domingo",\r
 day_short:"Dom,Seg,Ter,Qua,Qui,Sex,Sab,Dom"\r
 },\r
 print:{\r
 print_desc:"Imprimir"\r
 },\r
 preview:{\r
-preview_desc:"Previs\u00E3o"\r
+preview_desc:"Pr\u00E9-visualizar"\r
 },\r
 directionality:{\r
-ltr_desc:"Esquerda para direita",\r
-rtl_desc:"Direita para esquerda"\r
+ltr_desc:"Da esquerda para direita",\r
+rtl_desc:"Da direita para esquerda"\r
 },\r
 layer:{\r
 insertlayer_desc:"Inserir nova camada",\r
 forward_desc:"Mover para frente",\r
 backward_desc:"Mover para tr\u00E1s",\r
-absolute_desc:"Alternar posicionamento absoluto",\r
+absolute_desc:"Alternar posicionamento absoluto",\r
 content:"Nova camada..."\r
 },\r
 save:{\r
 save_desc:"Salvar",\r
-cancel_desc:"Cancelar todas altera\u00E7\u00F5es"\r
+cancel_desc:"Cancelar todas as altera\u00E7\u00F5es"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"Inserir espa\u00E7o"\r
+nonbreaking_desc:"Inserir um espa\u00E7o \"sem quebra\""\r
 },\r
 iespell:{\r
 iespell_desc:"Verificar ortografia",\r
-download:"Aplicativo de ortografia n\u00E3o-detectado. Deseja instal\u00E1-lo agora?"\r
+download:"Plugin de ortografia n\u00E3o-detectado. Deseja instalar agora?"\r
 },\r
 advhr:{\r
 advhr_desc:"Separador horizontal"\r
@@ -80,7 +80,7 @@ xhtmlxtras:{
 cite_desc:"Cita\u00E7\u00E3o",\r
 abbr_desc:"Abrevia\u00E7\u00E3o",\r
 acronym_desc:"Acr\u00F4nimo",\r
-del_desc:"Deletar",\r
+del_desc:"Apagar",\r
 ins_desc:"Inserir",\r
 attribs_desc:"Inserir/Editar atributos"\r
 },\r
@@ -90,7 +90,9 @@ desc:"Editar CSS"
 paste:{\r
 paste_text_desc:"Colar como texto simples",\r
 paste_word_desc:"Colar (copiado do WORD)",\r
-selectall_desc:"Selecionar tudo"\r
+selectall_desc:"Selecionar tudo",\r
+plaintext_mode_sticky:"Comando colar est\u00E1 em modo texto simples. Clique novamente para voltar para o modo normal. Depois de colar alguma coisa retornar\u00E1 para o modo normal.",\r
+plaintext_mode:"Comando colar est\u00E1 em modo texto simples. Clique novamente para voltar para o modo normal."\r
 },\r
 paste_dlg:{\r
 text_title:"Use CTRL+V para colar o texto na janela.",\r
@@ -101,33 +103,35 @@ table:{
 desc:"Inserir nova tabela",\r
 row_before_desc:"Inserir linha antes",\r
 row_after_desc:"Inserir linha depois",\r
-delete_row_desc:"Deletar linha",\r
+delete_row_desc:"Apagar linha",\r
 col_before_desc:"Inserir coluna antes",\r
 col_after_desc:"Inserir coluna depois",\r
 delete_col_desc:"Remover coluna",\r
-split_cells_desc:"Quebrar c\u00E9lulas",\r
+split_cells_desc:"Dividir c\u00E9lulas",\r
 merge_cells_desc:"Unir c\u00E9lulas",\r
 row_desc:"Propriedades das linhas",\r
 cell_desc:"Propriedades das c\u00E9lulas",\r
 props_desc:"Propriedades da tabela",\r
 paste_row_before_desc:"Colar linha antes",\r
 paste_row_after_desc:"Colar linha depois",\r
-cut_row_desc:"Cortar linha",\r
+cut_row_desc:"Recortar linha",\r
 copy_row_desc:"Copiar linha",\r
-del:"Deletar tabela",\r
+del:"Apagar tabela",\r
 row:"Linha",\r
 col:"Coluna",\r
 cell:"C\u00E9lula"\r
 },\r
 autosave:{\r
-unload_msg:"As mudan\u00E7as efetuadas ser\u00E3o perdidas se voc\u00EA sair desta p\u00E1gina."\r
+unload_msg:"As mudan\u00E7as efetuadas ser\u00E3o perdidas se sair desta p\u00E1gina.",\r
+restore_content:"Restaura conte\u00FAdo salvo automaticamente.",\r
+warning_message:"Se restaurar o conte\u00FAdo, voc\u00EA ir\u00E1 perder tudo que est\u00E1 atualmente no editor.\n\nTem certeza que quer restaurar o conte\u00FAdo salvo?"\r
 },\r
 fullscreen:{\r
 desc:"Tela Inteira"\r
 },\r
 media:{\r
-desc:"Inserir/editar m\u00EDdia embutida",\r
-edit:"Editar m\u00EDdia embutida"\r
+desc:"Inserir/Editar m\u00EDdia incorporada",\r
+edit:"Editar m\u00EDdia incorporada"\r
 },\r
 fullpage:{\r
 desc:"Propriedades do Documento"\r
@@ -147,8 +151,20 @@ langs:"Linguagens",
 wait:"Aguarde...",\r
 sug:"Sugest\u00F5es",\r
 no_sug:"Sem sugest\u00F5es",\r
-no_mpell:"N\u00E3o h\u00E1 erros de ortografia."\r
+no_mpell:"N\u00E3o foram detectados erros de ortografia."\r
 },\r
 pagebreak:{\r
 desc:"Inserir quebra de p\u00E1gina."\r
+},\r
+advlist:{\r
+types:"Tipos",\r
+def:"Padr\u00E3o",\r
+lower_alpha:"Alfabeto min\u00FAsculo",\r
+lower_greek:"Alfabeto grego",\r
+lower_roman:"Num. romanos min\u00FAsculos",\r
+upper_alpha:"Alfabeto mai\u00FAsculos",\r
+upper_roman:"Num. romanos mai\u00FAsculos",\r
+circle:"C\u00EDrculo",\r
+disc:"Disco",\r
+square:"Quadrado"\r
 }}});
\ No newline at end of file
index 325d5e5e7dea89527257a3f24f07fe60edd9154b..dddf718fd31d269d56f824c2fb0b82825e763eb5 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n({ro:{\r
 common:{\r
-edit_confirm:"Dori\u0163i s\u0103 folosi\u0163i un editor avansat pentru aceast\u0103 zona de text?",\r
+edit_confirm:"Dori\u0163i s\u0103 folosi\u0163i un editor avansat pentru aceast\u0103 zon\u0103d de text?",\r
 apply:"Aplic\u0103",\r
 insert:"Insereaz\u0103",\r
 update:"Actualizeaz\u0103",\r
@@ -54,17 +54,17 @@ save_desc:"Salveaz\u0103",
 cancel_desc:"Anuleaz\u0103 toate schimb\u0103rile"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"Insert non-breaking space character"\r
+nonbreaking_desc:"Insereaz\u0103 caracterul spa\u0163iu"\r
 },\r
 iespell:{\r
-iespell_desc:"Ruleaz\u0103 corector de limb\u0103",\r
+iespell_desc:"Ruleaz\u0103 corectorul de limb\u0103",\r
 download:"ieSpell nu a fost detectat. Dori\u0163i s\u0103-l instala\u0163i?"\r
 },\r
 advhr:{\r
 advhr_desc:"Linie orizontal\u0103"\r
 },\r
 emotions:{\r
-emotions_desc:"Emoticoane"\r
+emotions_desc:"Figurine"\r
 },\r
 searchreplace:{\r
 search_desc:"Caut\u0103",\r
@@ -74,7 +74,7 @@ advimage:{
 image_desc:"Inserare/editare imagine"\r
 },\r
 advlink:{\r
-link_desc:"Insereaz\u0103/editeaz\u0103 link"\r
+link_desc:"Inserare/editare leg\u0103tur\u0103"\r
 },\r
 xhtmlxtras:{\r
 cite_desc:"Citat",\r
@@ -82,7 +82,7 @@ abbr_desc:"Abreviere",
 acronym_desc:"Acronim",\r
 del_desc:"\u015Etergere",\r
 ins_desc:"Inserare",\r
-attribs_desc:"Insereaz\u0103/Editeaz\u0103 atribute"\r
+attribs_desc:"Insereaz\u0103/editeaz\u0103 atribute"\r
 },\r
 style:{\r
 desc:"Editare CSS"\r
@@ -90,11 +90,13 @@ desc:"Editare CSS"
 paste:{\r
 paste_text_desc:"Lipire ca text simplu",\r
 paste_word_desc:"Lipire din Word",\r
-selectall_desc:"Selecteaz\u0103 tot"\r
+selectall_desc:"Selecteaz\u0103 tot",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Folosi\u0163i CTRL+V pentru a lipi \u00EEn aceast\u0103 zon\u0103.",\r
-text_linebreaks:"Pastreaza linii noi.",\r
+text_linebreaks:"P\u0103streaz\u0103 separatoarele de linii.",\r
 word_title:"Folosi\u0163i CTRL+V pentru a lipi \u00EEn aceast\u0103 zon\u0103."\r
 },\r
 table:{\r
@@ -120,7 +122,9 @@ col:"Coloan\u0103",
 cell:"Celul\u0103"\r
 },\r
 autosave:{\r
-unload_msg:"Modific\u0103rile nu vor fi salvate."\r
+unload_msg:"Modific\u0103rile nu vor fi salvate.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Mod ecran complet"\r
@@ -136,7 +140,7 @@ template:{
 desc:"Insereaz\u0103 un \u015Fablon predefinit"\r
 },\r
 visualchars:{\r
-desc:"Visual control characters on/off."\r
+desc:"Comut\u0103 caracterele vizuale de control"\r
 },\r
 spellchecker:{\r
 desc:"Activare/dezactivare dic\u0163ionar",\r
@@ -150,5 +154,17 @@ no_sug:"Nu sunt sugestii.",
 no_mpell:"Nu sunt gre\u015Feli."\r
 },\r
 pagebreak:{\r
-desc:"Insereaz\u0103 page break."\r
+desc:"Insereaz\u0103 un separator de pagin\u0103"\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index f0d7fd8ed72e90a899c28a2c50a6a1ab3e539ed5..62eea520a9059a614ea578223cafe262175f4362 100755 (executable)
@@ -1,36 +1,36 @@
 tinyMCE.addI18n({ru:{\r
 common:{\r
-edit_confirm:"\u0412\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0434\u043B\u044F \u044D\u0442\u043E\u0439 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u043E\u0439 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0440\u0435\u0436\u0438\u043C WYSIWYG?",\r
+edit_confirm:"\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C WYSIWYG \u0440\u0435\u0436\u0438\u043C \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u043F\u043E\u043B\u044F?",\r
 apply:"\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C",\r
 insert:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C",\r
 update:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C",\r
 cancel:"\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C",\r
 close:"\u0417\u0430\u043A\u0440\u044B\u0442\u044C",\r
-browse:"\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C",\r
+browse:"\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440",\r
 class_name:"\u041A\u043B\u0430\u0441\u0441",\r
-not_set:"-- \u041D\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E --",\r
-clipboard_msg:"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435/\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0432 Mozilla \u0438 Firefox.\n\u0425\u043E\u0442\u0438\u0442\u0435 \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435 \u0443\u0437\u043D\u0430\u0442\u044C, \u0432 \u0447\u0451\u043C \u0434\u0435\u043B\u043E?",\r
-clipboard_no_support:"\u041D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432\u0430\u0448\u0438\u043C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043E\u043C \u0432 \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0438\u0439 \u043C\u043E\u043C\u0435\u043D\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u043D\u044B\u0435 \u0441\u043E\u043A\u0440\u0430\u0449\u0435\u043D\u0438\u044F.",\r
-popup_blocked:"\u0418\u0437\u0432\u0438\u043D\u0438\u0442\u0435, \u043D\u043E \u0432\u0430\u0448 \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0449\u0438\u043A \u0432\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0449\u0438\u0445 \u043E\u043A\u043E\u043D \u0437\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043B \u043E\u043A\u043D\u043E, \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u044E\u0449\u0435\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0438 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F. \u0412\u0430\u043C \u043D\u0443\u0436\u043D\u043E \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u043A\u0443 \u0432\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0449\u0438\u0445 \u043E\u043A\u043E\u043D \u043D\u0430 \u044D\u0442\u043E\u043C \u0441\u0430\u0439\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043D\u0430\u043F\u043E\u043B\u043D\u0443\u044E \u0432\u043E\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u044D\u0442\u0438\u043C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u043C.",\r
-invalid_data:"\u041E\u0448\u0438\u0431\u043A\u0430: \u041E\u0442\u043C\u0435\u0447\u0435\u043D\u043D\u044B\u0435 \u043A\u0440\u0430\u0441\u043D\u044B\u043C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0432\u0432\u0435\u0434\u0435\u043D\u044B \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E.",\r
-more_colors:"\u0411\u043E\u043B\u044C\u0448\u0435 \u0446\u0432\u0435\u0442\u043E\u0432"\r
+not_set:"- \u041D\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E -",\r
+clipboard_msg:"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435, \u0432\u044B\u0440\u0435\u0437\u043A\u0430 \u0438 \u0432\u0441\u0442\u0430\u0432\u043A\u0430 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u0432 Firefox.\r\n\u0425\u043E\u0442\u0438\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0431\u043E\u043B\u0435\u0435 \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E?",\r
+clipboard_no_support:"\u041D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0412\u0430\u0448\u0438\u043C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043E\u043C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0433\u043E\u0440\u044F\u0447\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0438.",\r
+popup_blocked:"\u0411\u043B\u043E\u043A\u0438\u0440\u0430\u0442\u043E\u0440 \u0432\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0449\u0438\u0445 \u043E\u043A\u043E\u043D \u0437\u0430\u043A\u0440\u044B\u043B \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0435 \u043E\u043A\u043D\u043E. \u0414\u043B\u044F \u043F\u043E\u043B\u043D\u043E\u0446\u0435\u043D\u043D\u043E\u0439 \u0440\u0430\u0431\u043E\u0442\u044B, \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0443 \u043D\u0430 \u044D\u0442\u043E\u043C \u0441\u0430\u0439\u0442\u0435.",\r
+invalid_data:"\u041E\u0448\u0438\u0431\u043A\u0430: \u0412\u0432\u0435\u0434\u0435\u043D\u043E \u043D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435, \u043E\u043D\u043E \u043E\u0442\u043C\u0435\u0447\u0435\u043D\u043E \u043A\u0440\u0430\u0441\u043D\u044B\u043C.",\r
+more_colors:"\u0414\u0440\u0443\u0433\u0438\u0435 \u0446\u0432\u0435\u0442\u0430..."\r
 },\r
 contextmenu:{\r
 align:"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435",\r
-left:"\u0412\u043B\u0435\u0432\u043E",\r
+left:"\u041F\u043E \u043B\u0435\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
 center:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443",\r
-right:"\u0412\u043F\u0440\u0430\u0432\u043E",\r
-full:"\u041F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E"\r
+right:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+full:"\u041F\u043E \u0448\u0438\u0440\u0438\u043D\u0435"\r
 },\r
 insertdatetime:{\r
 date_fmt:"%d.%m.%Y",\r
 time_fmt:"%H:%M:%S",\r
-insertdate_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0434\u0430\u0442\u0443",\r
-inserttime_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0432\u0440\u0435\u043C\u044F",\r
-months_long:"\u042F\u043D\u0432\u0430\u0440\u044C,\u0424\u0435\u0432\u0440\u0430\u043B\u044C,\u041C\u0430\u0440\u0442,\u0410\u043F\u0440\u0435\u043B\u044C,\u041C\u0430\u0439,\u0418\u044E\u043D\u044C,\u0418\u044E\u043D\u044C,\u0418\u044E\u043B\u044C,\u0410\u0432\u0433\u0443\u0441\u0442,\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C,\u041E\u043A\u0442\u044F\u0431\u0440\u044C,\u041D\u043E\u044F\u0431\u0440\u044C,\u0414\u0435\u043A\u0430\u0431\u0440\u044C",\r
-months_short:"\u042F\u043D\u0432,\u0424\u0435\u0432,\u041C\u0430\u0440,\u0410\u043F\u0440,\u041C\u0430\u0439,\u0418\u044E\u043D,\u0418\u044E\u043B,\u0410\u0432\u0433,\u0421\u0435\u043F,\u041E\u043A\u0442,\u041D\u043E\u0432,\u0414\u0435\u043A",\r
-day_long:"\u0412\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435,\u041F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A,\u0412\u0442\u043E\u0440\u043D\u0438\u043A,\u0421\u0440\u0435\u0434\u0430,\u0427\u0435\u0442\u0432\u0435\u0440\u0433,\u041F\u044F\u0442\u043D\u0438\u0446\u0430,\u0421\u0443\u0431\u0431\u043E\u0442\u0430,\u0412\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435",\r
-day_short:"\u0412\u0441,\u041F\u043D,\u0412\u0442,\u0421\u0440,\u0427\u0442,\u041F\u0442,\u0421\u0431,\u0412\u0441"\r
+insertdate_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0434\u0430\u0442\u0443",\r
+inserttime_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432\u0440\u0435\u043C\u044F",\r
+months_long:"\u044F\u043D\u0432\u0430\u0440\u044C,\u0444\u0435\u0432\u0440\u0430\u043B\u044C,\u043C\u0430\u0440\u0442,\u0430\u043F\u0440\u0435\u043B\u044C,\u043C\u0430\u0439,\u0438\u044E\u043D\u044C,\u0438\u044E\u043B\u044C,\u0430\u0432\u0433\u0443\u0441\u0442,\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C,\u043E\u043A\u0442\u044F\u0431\u0440\u044C,\u043D\u043E\u044F\u0431\u0440\u044C,\u0434\u0435\u043A\u0430\u0431\u0440\u044C",\r
+months_short:"\u044F\u043D\u0432,\u0444\u0435\u0432,\u043C\u0430\u0440\u0442,\u0430\u043F\u0440,\u043C\u0430\u0439,\u0438\u044E\u043D\u044C,\u0438\u044E\u043B\u044C,\u0430\u0432\u0433,\u0441\u0435\u043D,\u043E\u043A\u0442,\u043D\u043E\u044F,\u0434\u0435\u043A",\r
+day_long:"\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435,\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A,\u0432\u0442\u043E\u0440\u043D\u0438\u043A,\u0441\u0440\u0435\u0434\u0430,\u0447\u0435\u0442\u0432\u0435\u0440\u0433,\u043F\u044F\u0442\u043D\u0438\u0446\u0443,\u0441\u0443\u0431\u0431\u043E\u0442\u0430,\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435",\r
+day_short:"\u0432\u0441,\u043F\u043D,\u0432\u0442,\u0441\u0440,\u0447\u0442,\u043F\u0442,\u0441\u0431,\u0432\u0441"\r
 },\r
 print:{\r
 print_desc:"\u041F\u0435\u0447\u0430\u0442\u044C"\r
@@ -43,113 +43,131 @@ ltr_desc:"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0
 rtl_desc:"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0441\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0435\u0432\u043E"\r
 },\r
 layer:{\r
-insertlayer_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u0441\u043B\u043E\u0439",\r
-forward_desc:"\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0442\u0438 \u0432\u043F\u0435\u0440\u0451\u0434",\r
-backward_desc:"\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0442\u0438 \u043D\u0430\u0437\u0430\u0434",\r
-absolute_desc:"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C/\u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u043E\u0435 \u043F\u043E\u0437\u0438\u0446\u0438\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435",\r
-content:"\u041D\u043E\u0432\u044B\u0439 \u0441\u043B\u043E\u0439\u2026"\r
+insertlayer_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u043B\u043E\u0439",\r
+forward_desc:"\u041D\u0430 \u043F\u0435\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u043B\u0430\u043D",\r
+backward_desc:"\u041D\u0430 \u0437\u0430\u0434\u043D\u0438\u0439 \u043F\u043B\u0430\u043D",\r
+absolute_desc:"\u0410\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u043E\u0435 \u043F\u043E\u0437\u0438\u0446\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435",\r
+content:"\u041D\u043E\u0432\u044B\u0439 \u0441\u043B\u043E\u0439"\r
 },\r
 save:{\r
 save_desc:"\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C",\r
 cancel_desc:"\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043D\u0435\u0440\u0430\u0437\u0440\u044B\u0432\u043D\u044B\u0439 \u043F\u0440\u043E\u0431\u0435\u043B"\r
+nonbreaking_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u0435\u0440\u0430\u0437\u0440\u044B\u0432\u043D\u044B\u0439 \u043F\u0440\u043E\u0431\u0435\u043B"\r
 },\r
 iespell:{\r
 iespell_desc:"\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u043E\u0440\u0444\u043E\u0433\u0440\u0430\u0444\u0438\u044E",\r
-download:"ieSpell \u043D\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D. \u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C?"\r
+download:"ieSpell \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D. \u0416\u0435\u043B\u0430\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C?"\r
 },\r
 advhr:{\r
-advhr_desc:"\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u043B\u0438\u043D\u0438\u044F"\r
+advhr_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C"\r
 },\r
 emotions:{\r
-emotions_desc:"\u0421\u043C\u0430\u0439\u043B\u0438\u043A\u0438"\r
+emotions_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u043C\u0430\u0439\u043B"\r
 },\r
 searchreplace:{\r
 search_desc:"\u041D\u0430\u0439\u0442\u0438",\r
-replace_desc:"\u041D\u0430\u0439\u0442\u0438/\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C"\r
+replace_desc:"\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C"\r
 },\r
 advimage:{\r
-image_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C/\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435"\r
+image_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C/\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435",\r
+delta_width:"200"\r
 },\r
 advlink:{\r
-link_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C/\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443"\r
+link_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C/\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443",\r
+delta_width:"200"\r
 },\r
 xhtmlxtras:{\r
-cite_desc:"\u0426\u0438\u0442\u0430\u0442\u0430",\r
-abbr_desc:"\u0410\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u0430",\r
-acronym_desc:"\u0410\u043A\u0440\u043E\u043D\u0438\u043C",\r
-del_desc:"\u0423\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442",\r
-ins_desc:"\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442",\r
-attribs_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C/\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044B"\r
+cite_desc:"\u0426\u0438\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435",\r
+abbr_desc:"\u0421\u043E\u043A\u0440\u0430\u0449\u0435\u043D\u0438\u0435",\r
+acronym_desc:"\u0410\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0446\u0438\u044F",\r
+del_desc:"\u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435",\r
+ins_desc:"\u0417\u0430\u043C\u0435\u043D\u0430",\r
+attribs_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C/\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442"\r
 },\r
 style:{\r
-desc:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0438\u043B\u044C CSS",\r
-delta_width:"35"\r
+desc:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C CSS \u0441\u0442\u0438\u043B\u044C"\r
 },\r
 paste:{\r
-paste_text_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u0430\u043A \u043F\u0440\u043E\u0441\u0442\u043E\u0439 \u0442\u0435\u043A\u0441\u0442",\r
+paste_text_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u0430\u043A \u0442\u0435\u043A\u0441\u0442",\r
 paste_word_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0438\u0437 Word",\r
-selectall_desc:"\u0412\u044B\u0434\u0435\u043B\u0438\u0442\u044C \u0432\u0441\u0451"\r
+selectall_desc:"\u0412\u044B\u0434\u0435\u043B\u0438\u0442\u044C \u0432\u0441\u0435",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
-text_title:"\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 CTRL+V \u0447\u0442\u043E\u0431\u044B \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u0432 \u043E\u043A\u043D\u043E.",\r
-text_linebreaks:"\u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u0440\u0430\u0437\u0440\u044B\u0432\u044B \u0441\u0442\u0440\u043E\u043A",\r
-word_title:"\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 CTRL+V \u0447\u0442\u043E\u0431\u044B \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u0432 \u043E\u043A\u043D\u043E."\r
+text_title:"\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u043E\u043A\u043D\u043E.",\r
+text_linebreaks:"\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u044B \u0441\u0442\u0440\u043E\u043A",\r
+word_title:"\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u043E\u043A\u043D\u043E."\r
 },\r
 table:{\r
-desc:"\u0412\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u043D\u043E\u0432\u0443\u044E \u0442\u0430\u0431\u043B\u0438\u0446\u0443",\r
-row_before_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u0435\u0440\u0435\u0434",\r
-row_after_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u0441\u043B\u0435",\r
+desc:"\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435/\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
+row_before_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0441\u0432\u0435\u0440\u0445\u0443",\r
+row_after_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0441\u043D\u0438\u0437\u0443",\r
 delete_row_desc:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443",\r
-col_before_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u043E\u043B\u0431\u0435\u0446 \u043F\u0435\u0440\u0435\u0434",\r
-col_after_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u043E\u043B\u0431\u0435\u0446 \u043F\u043E\u0441\u043B\u0435",\r
+col_before_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u043E\u043B\u0431\u0435\u0446 \u0441\u043B\u0435\u0432\u0430",\r
+col_after_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u043E\u043B\u0431\u0435\u0446 \u0441\u043F\u0440\u0430\u0432\u0430",\r
 delete_col_desc:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u0442\u043E\u043B\u0431\u0435\u0446",\r
-split_cells_desc:"\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u044C \u0441\u043B\u0438\u0442\u044B\u0435 \u044F\u0447\u0435\u0439\u043A\u0438",\r
-merge_cells_desc:"\u0421\u043B\u0438\u0442\u044C \u044F\u0447\u0435\u0439\u043A\u0438",\r
-row_desc:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043E\u043A\u0438",\r
-cell_desc:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u044F\u0447\u0435\u0439\u043A\u0438",\r
-props_desc:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
-paste_row_before_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u043F\u0435\u0440\u0435\u0434",\r
-paste_row_after_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u043F\u043E\u0441\u043B\u0435",\r
+split_cells_desc:"\u0420\u0430\u0437\u0431\u0438\u0442\u044C \u044F\u0447\u0435\u0439\u043A\u0443",\r
+merge_cells_desc:"\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u044F\u0447\u0435\u0439\u043A\u0438",\r
+row_desc:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0441\u0442\u0440\u043E\u043A\u0438",\r
+cell_desc:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u044F\u0447\u0435\u0439\u043A\u0438",\r
+props_desc:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
+paste_row_before_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0441\u0432\u0435\u0440\u0445\u0443",\r
+paste_row_after_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0441\u043D\u0438\u0437\u0443",\r
 cut_row_desc:"\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443",\r
 copy_row_desc:"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443",\r
 del:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u0443",\r
 row:"\u0421\u0442\u0440\u043E\u043A\u0430",\r
 col:"\u0421\u0442\u043E\u043B\u0431\u0435\u0446",\r
-cell:"\u042F\u0447\u0435\u0439\u043A\u0430"\r
+cell:"\u042F\u0447\u0435\u0439\u043A\u0430",\r
+cellprops_delta_width:"30"\r
 },\r
 autosave:{\r
-unload_msg:"\u0412\u043D\u0435\u0441\u0451\u043D\u043D\u044B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0431\u0443\u0434\u0443\u0442 \u043F\u043E\u0442\u0435\u0440\u044F\u043D\u044B, \u0435\u0441\u043B\u0438 \u0432\u044B \u0443\u0439\u0434\u0451\u0442\u0435 \u0441 \u044D\u0442\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B."\r
+unload_msg:"\u041F\u0440\u043E\u0438\u0437\u0432\u0435\u0434\u0435\u043D\u043D\u044B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0431\u0443\u0434\u0443\u0442 \u0443\u0442\u0435\u0440\u044F\u043D\u044B, \u0435\u0441\u043B\u0438 \u0412\u044B \u0443\u0439\u0434\u0435\u0442\u0435 \u0441 \u044D\u0442\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B.",\r
+restore_content:"\u0412\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435",\r
+warning_message:"\u0412\u0441\u0435 \u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0434\u0435\u043D\u043D\u044B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0431\u0443\u0434\u0443\u0442 \u0443\u0442\u0435\u0440\u044F\u043D\u044B.\n\n\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F?"\r
 },\r
 fullscreen:{\r
-desc:"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C/\u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u043E\u043B\u043D\u043E\u044D\u043A\u0440\u0430\u043D\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C"\r
+desc:"\u041F\u043E\u043B\u043D\u043E\u044D\u043A\u0440\u0430\u043D\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C"\r
 },\r
 media:{\r
-desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C/\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043C\u0435\u0434\u0438\u0430-\u043E\u0431\u044A\u0435\u043A\u0442",\r
-edit:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043C\u0435\u0434\u0438\u0430-\u043E\u0431\u044A\u0435\u043A\u0442"\r
+desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C/\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043A\u043B\u0438",\r
+edit:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u043A\u043B\u0438\u043F\u0430"\r
 },\r
 fullpage:{\r
-desc:"Document properties"\r
+desc:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430"\r
 },\r
 template:{\r
-desc:"Insert predefined template content"\r
+desc:"\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0448\u0430\u0431\u043B\u043E\u043D"\r
 },\r
 visualchars:{\r
-desc:"Visual control characters on/off."\r
+desc:"\u0412\u0441\u0435 \u0437\u043D\u0430\u043A\u0438"\r
 },\r
 spellchecker:{\r
-desc:"Toggle spellchecker",\r
-menu:"Spellchecker settings",\r
-ignore_word:"Ignore word",\r
-ignore_words:"Ignore all",\r
-langs:"Languages",\r
-wait:"Please wait...",\r
-sug:"Suggestions",\r
-no_sug:"No suggestions",\r
-no_mpell:"No misspellings found."\r
+desc:"\u041F\u0440\u0430\u0432\u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435",\r
+menu:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043F\u0440\u0430\u0432\u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F",\r
+ignore_word:"\u041F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u0442\u044C",\r
+ignore_words:"\u041F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0432\u0441\u0435",\r
+langs:"\u042F\u0437\u044B\u043A\u0438",\r
+wait:"\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u043E\u0434\u043E\u0436\u0434\u0438\u0442\u0435...",\r
+sug:"\u0412\u0430\u0440\u0438\u0430\u043D\u0442\u044B",\r
+no_sug:"\u041D\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432",\r
+no_mpell:"\u041E\u0448\u0438\u0431\u043E\u043A \u043D\u0435 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E."\r
 },\r
 pagebreak:{\r
-desc:"Insert page break."\r
+desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u0440\u044B\u0432 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B"\r
+},\r
+advlist:{\r
+types:"\u0421\u0438\u043C\u0432\u043E\u043B\u044B",\r
+def:"\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0435",\r
+lower_alpha:"\u0421\u0442\u0440\u043E\u0447\u043D\u044B\u0435 \u043B\u0430\u0442\u0438\u043D\u0441\u043A\u0438\u0435 \u0431\u0443\u043A\u0432\u044B",\r
+lower_greek:"\u0421\u0442\u0440\u043E\u0447\u043D\u044B\u0435 \u0433\u0440\u0435\u0447\u0435\u0441\u043A\u0438\u0435 \u0431\u0443\u043A\u0432\u044B",\r
+lower_roman:"\u0421\u0442\u0440\u043E\u0447\u043D\u044B\u0435 \u0440\u0438\u043C\u0441\u043A\u0438\u0435 \u0446\u0438\u0444\u0440\u044B",\r
+upper_alpha:"\u0417\u0430\u0433\u043B\u0430\u0432\u043D\u044B\u0435 \u043B\u0430\u0442\u0438\u043D\u0441\u043A\u0438\u0435 \u0431\u0443\u043A\u0432\u044B",\r
+upper_roman:"\u0417\u0430\u0433\u043B\u0430\u0432\u043D\u044B\u0435 \u0440\u0438\u043C\u0441\u043A\u0438\u0435 \u0446\u0438\u0444\u0440\u044B",\r
+circle:"\u041A\u0440\u0443\u0433\u0438",\r
+disc:"\u041E\u043A\u0440\u0443\u0436\u043D\u043E\u0441\u0442\u0438",\r
+square:"\u041A\u0432\u0430\u0434\u0440\u0430\u0442\u044B"\r
 }}});
\ No newline at end of file
index ea1c8c311e88aaa0739d767934c8a7408668ba23..578d2c3d56d8d5f01f13115bb1144b6ed3fb2868 100755 (executable)
@@ -1,64 +1,64 @@
 tinyMCE.addI18n({si:{\r
 common:{\r
-edit_confirm:"Do you want to use the WYSIWYG mode for this textarea?",\r
-apply:"Apply",\r
-insert:"Insert",\r
-update:"Update",\r
-cancel:"Cancel",\r
-close:"Close",\r
+edit_confirm:"\u0D94\u0DB6\u0DA7 \u0DB8\u0DD9\u0DB8 \u0DB4\u0DCF\u0DA8\u0DBA\u0DB1\u0DCA \u0DC3\u0DB3\u0DC4\u0DCF WYSIWYG \u0D86\u0D9A\u0DCF\u0DBB\u0DBA?",\r
+apply:"\u0DBA\u0DDC\u0DAF\u0DB1\u0DCA\u0DB1",\r
+insert:"\u0D87\u0DAD\u0DD4\u0DC5\u0DAD\u0DCA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+update:"\u0D85\u0DBD\u0DD4\u0DAD\u0DCA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+cancel:"\u0D85\u0DC0\u0DBD\u0D82\u0D9C\u0DD4 \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+close:"\u0D89\u0DC0\u0DAD\u0DCA\u0DC0\u0DB1\u0DCA\u0DB1",\r
 browse:"Browse",\r
-class_name:"Class",\r
+class_name:"\u0DC3\u0DB8\u0DD6\u0DC4\u0DBA",\r
 not_set:"-- Not set --",\r
-clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?",\r
-clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.",\r
-popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.",\r
-invalid_data:"Error: Invalid values entered, these are marked in red.",\r
-more_colors:"More colors"\r
+clipboard_msg:"\u0DB4\u0DD2\u0DA7\u0DB4\u0DAD\u0DCA \u0D9A\u0DD2\u0DBB\u0DD3\u0DB8/\u0D89\u0DC0\u0DAD\u0DCA \u0D9A\u0DD2\u0DBB\u0DD3\u0DB8/\u0D87\u0DBD\u0DC0\u0DD3\u0DB8 \u0DB8\u0DDC\u0DC3\u0DD2\u0DBD\u0DCA\u0DBD\u0DCF \u0DC4\u0DCF \u0DC6\u0DBA\u0DBB\u0DCA \u0DC6\u0DDC\u0D9A\u0DCA\u0DC3\u0DCA \u0DC4\u0DD2 \u0D87\u0DAD\u0DD4\u0DC5\u0DAD\u0DCA \u0DB1\u0DDC\u0DC0\u0DDA.\n\u0D94\u0DB6\u0DA7 \u0DB8\u0DDA \u0DB4\u0DD2\u0DC5\u0DD2\u0DB6\u0DB3\u0DC0 \u0DAD\u0DA0\u0DAF\u0DD4\u0DBB\u0DA7\u0DAD\u0DCA \u0DAD\u0DDC\u0DBB\u0DAD\u0DD4\u0DBB\u0DD4 \u0D85\u0DC0\u0DC1\u0DCA\u200D\u0DBA \u0DC0\u0DDA\u0DAF?",\r
+clipboard_no_support:"\u0DAF\u0DD0\u0DB1\u0DA7 \u0DB4\u0DCA\u200D\u0DBB\u0DAF\u0DBB\u0DCA\u0DC1\u0D9A\u0DBA \u0DB8\u0D9F\u0DD2\u0DB1\u0DCA \u0DB8\u0DD9\u0DB8 \u0DC3\u0DDA\u0DC0\u0DBA \u0DC3\u0DB4\u0DBA\u0DCF \u0DB1\u0DD0\u0DAD,\u0D91\u0DB6\u0DD0\u0DC0\u0DD2\u0DB1\u0DCA \u0DBA\u0DAD\u0DD4\u0DBB\u0DD4\u0DB4\u0DD4\u0DC0\u0DBB\u0DD4\u0DC0 \u0DB7\u0DCF\u0DC0\u0DD2\u0DAD\u0DCF \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1.",\r
+popup_blocked:"\u0D94\u0DB6\u0D9C\u0DDA popup-blocker \u0DB8\u0D9F\u0DD2\u0DB1\u0DCA \u0D8B\u0DB4\u0DBA\u0DDD\u0D9C\u0DD2 \u0DC3\u0DDA\u0DC0\u0DCF\u0DC0\u0DB1\u0DCA \u0DC3\u0DB4\u0DBA\u0DB1 \u0D9A\u0DC0\u0DD4\u0DBD\u0DD4\u0DC0\u0D9A\u0DCA \u0D85\u0DB6\u0DBD \u0D9A\u0DBB \u0D87\u0DAD.\u0D91\u0DB6\u0DD0\u0DC0\u0DD2\u0DB1\u0DCA \u0D94\u0DB6\u0DA7 popup-blocker \u0DBA \u0D85\u0D9A\u0DCA\u200D\u0DBB\u0DD3\u0DBA \u0D9A\u0DD2\u0DBB\u0DD3\u0DB8\u0DA7 \u0DC3\u0DD2\u0DAF\u0DD4\u0DC0\u0DDA. ",\r
+invalid_data:"\u0DC0\u0DBB\u0DAF: \u0DC0\u0DBD\u0D82\u0D9C\u0DD4 \u0DB1\u0DDC\u0DB8\u0DD0\u0DAD\u0DD2 \u0D85\u0D9C\u0DBA\u0DB1\u0DCA \u0D87\u0DAD\u0DD4\u0DC5\u0DAD\u0DCA \u0D9A\u0DBB \u0D87\u0DAD,\u0D91\u0DB8 \u0D85\u0D9C\u0DBA\u0DB1\u0DCA \u0DBB\u0DAD\u0DD4 \u0DB4\u0DCF\u0DA7\u0DD2\u0DB1\u0DCA \u0DC3\u0DC5\u0D9A\u0DD4\u0DAB\u0DD4 \u0D9A\u0DBB \u0D87\u0DAD.",\r
+more_colors:"\u0DAD\u0DC0\u0DAD\u0DCA \u0DC0\u0DBB\u0DCA\u0DAB"\r
 },\r
 contextmenu:{\r
-align:"Alignment",\r
-left:"Left",\r
-center:"Center",\r
-right:"Right",\r
-full:"Full"\r
+align:"\u0DB4\u0DD9\u0DC5 \u0D9C\u0DD0\u0DB1\u0DCA\u0DC0\u0DD4\u0DB8",\r
+left:"\u0DC0\u0DB8\u0DA7",\r
+center:"\u0DB8\u0DD0\u0DAF\u0DA7",\r
+right:"\u0DAF\u0D9A\u0DD4\u0DAB\u0DA7",\r
+full:"\u0DB4\u0DD6\u0DBB\u0DCA\u0DAB\u0DC0"\r
 },\r
 insertdatetime:{\r
-date_fmt:"%Y-%m-%d",\r
-time_fmt:"%H:%M:%S",\r
-insertdate_desc:"Insert date",\r
-inserttime_desc:"Insert time",\r
-months_long:"January,February,March,April,May,June,July,August,September,October,November,December",\r
-months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",\r
-day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday",\r
-day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"\r
+date_fmt:"%\u0D85\u0DC0\u0DD4-%\u0DB8\u0DCF\u0DC3-%\u0DAF\u0DD2\u0DB1",\r
+time_fmt:"%\u0DB4\u0DD0\u0DBA:%\u0DB8\u0DD2\u0DC3:%\u0DAD\u0DAD\u0DCA",\r
+insertdate_desc:"\u0DAF\u0DD2\u0DB1\u0DBA \u0D87\u0DAD\u0DD4\u0DC5\u0DAD\u0DCA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+inserttime_desc:"\u0DC0\u0DDA\u0DBD\u0DCF\u0DC0 \u0D87\u0DAD\u0DD4\u0DC5\u0DAD\u0DCA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+months_long:"\u0DA2\u0DB1\u0DC0\u0DCF\u0DBB\u0DD2,\u0DB4\u0DD9\u0DB6\u0DBB\u0DC0\u0DCF\u0DBB\u0DD2,\u0DB8\u0DCF\u0DBB\u0DCA\u0DAD\u0DD4,\u0D85\u0DB4\u0DCA\u200D\u0DBB\u0DDA\u0DBD\u0DCA,\u0DB8\u0DD0\u0DBA\u0DD2,\u0DA2\u0DD6\u0DB1\u0DD2,\u0DA2\u0DD6\u0DBD\u0DD2,\u0D85\u0D9C\u0DDD\u0DC3\u0DCA\u0DAD\u0DD4,\u0DC3\u0DD0\u0DCA\u0DAD\u0DD0\u0DB8\u0DCA\u0DB6\u0DBB\u0DCA,\u0D94\u0D9A\u0DCA\u0DAD\u0DDD\u0DB6\u0DBB\u0DCA,\u200D\u0DB1\u0DDC\u0DC0\u0DD0\u0DB8\u0DCA\u0DB6\u0DBB\u0DCA,\u0DAF\u0DD9\u0DC3\u0DD0\u0DB8\u0DCA\u0DB6\u0DBB\u0DCA",\r
+months_short:"\u0DA2\u0DB1.,\u0DB4\u0DD9\u0DB6.,\u0DB8\u0DCF\u0DBB\u0DCA\u0DAD\u0DD4,\u0D85\u0DB4\u0DCA\u200D\u0DBB\u0DDA\u0DBD\u0DCA,\u0DB8\u0DD0\u0DBA\u0DD2,\u0DA2\u0DD6\u0DB1\u0DD2,\u0DA2\u0DD6\u0DBD\u0DD2,\u0D85\u0D9C\u0DDD.,\u0DC3\u0DD0\u0DCA.,\u0D94\u0D9A\u0DCA.,\u200D\u0DB1\u0DDC\u0DC0\u0DD0.,\u0DAF\u0DD9\u0DC3\u0DD0.",\r
+day_long:"\u0D89\u0DBB\u0DD2\u0DAF\u0DCF,\u0DC3\u0DB3\u0DD4\u0DAF\u0DCF,\u0D85\u0D9F\u0DC4\u0DBB\u0DD0\u0DC0\u0DCF\u0DAF\u0DCF,\u0DB6\u0DAF\u0DCF\u0DAF\u0DCF,\u0DB6\u0DCA\u200D\u0DBB\u0DC4\u0DC3\u0DCA\u0DB4\u0DAD\u0DD2\u0DB1\u0DCA\u0DAF\u0DCF,\u0DC3\u0DD2\u0D9A\u0DD4\u0DBB\u0DCF\u0DAF\u0DCF,\u0DC3\u0DD9\u0DB1\u0DC3\u0DD4\u0DBB\u0DCF\u0DAF\u0DCF",\r
+day_short:"\u0D89\u0DBB\u0DD2\u0DAF\u0DCF,\u0DC3\u0DB3\u0DD4\u0DAF\u0DCF,\u0D85\u0D9F.,\u0DB6\u0DAF\u0DCF\u0DAF\u0DCF,\u0DB6\u0DCA\u200D\u0DBB\u0DC4\u0DC3\u0DCA.,\u0DC3\u0DD2\u0D9A\u0DD4.,\u0DC3\u0DD9\u0DB1."\r
 },\r
 print:{\r
-print_desc:"Print"\r
+print_desc:"\u0DB8\u0DD4\u0DAF\u0DCA\u200D\u0DBB\u0DAB\u0DBA \u0D9A\u0DBB\u0DB1\u0DC0\u0DCF"\r
 },\r
 preview:{\r
-preview_desc:"Preview"\r
+preview_desc:"\u0DB4\u0DD6\u0DBB\u0DCA\u0DC0 \u0DAF\u0DBB\u0DCA\u0DC1\u0DB1\u0DBA"\r
 },\r
 directionality:{\r
-ltr_desc:"Direction left to right",\r
-rtl_desc:"Direction right to left"\r
+ltr_desc:"\u0DC0\u0DB8\u0DDA \u0DC3\u0DD2\u0DA7 \u0DAF\u0D9A\u0DD4\u0DAB\u0DA7 \u0DAF\u0DD2\u0DC1\u0DCF\u0DC0",\r
+rtl_desc:"\u0DAF\u0D9A\u0DD4\u0DAB\u0DDA \u0DC3\u0DD2\u0DA7 \u0DC0\u0DB8\u0DA7 \u0DAF\u0DD2\u0DC1\u0DCF\u0DC0"\r
 },\r
 layer:{\r
-insertlayer_desc:"Insert new layer",\r
-forward_desc:"Move forward",\r
-backward_desc:"Move backward",\r
+insertlayer_desc:"\u0D85\u0DB5\u0DAD\u0DCA \u0DC3\u0DCA\u0DAE\u0DBB\u0DBA\u0D9A\u0DCA \u0D87\u0DAD\u0DD4\u0DC5\u0DAD\u0DCA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+forward_desc:"\u0D89\u0DAF\u0DD2\u0DBB\u0DD2\u0DBA\u0DA7 \u0D9C\u0DD9\u0DB1\u0DBA\u0DB1\u0DCA\u0DB1",\r
+backward_desc:"\u0DB4\u0DC3\u0DD4\u0DB4\u0DC3\u0DA7 \u0D9C\u0DD9\u0DB1\u0DBA\u0DB1\u0DCA\u0DB1",\r
 absolute_desc:"Toggle absolute positioning",\r
-content:"New layer..."\r
+content:"\u0D85\u0DBD\u0DD4\u0DAD\u0DCA \u0DC3\u0DCA\u0DAE\u0DBB\u0DBA\u0D9A\u0DCA..."\r
 },\r
 save:{\r
-save_desc:"Save",\r
-cancel_desc:"Cancel all changes"\r
+save_desc:"\u0DC3\u0DD4\u0DBB\u0D9A\u0DD2\u0DB1\u0DCA\u0DB1",\r
+cancel_desc:"\u0D85\u0DC0\u0DBD\u0D82\u0D9C\u0DD4 \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1"\r
 },\r
 nonbreaking:{\r
 nonbreaking_desc:"Insert non-breaking space character"\r
 },\r
 iespell:{\r
-iespell_desc:"Run spell checking",\r
-download:"ieSpell not detected. Do you want to install it now?"\r
+iespell_desc:"\u0D85\u0D9A\u0DCA\u0DC2\u0DBB \u0DC0\u0DD2\u0DB1\u0DCA\u200D\u0DBA\u0DCF\u0DC3\u0DBA \u0DB4\u0DBB\u0DD3\u0D9A\u0DC2\u0DCF \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+download:"ieSpell \u0D85\u0DB1\u0DCF\u0DC0\u0DBB\u0DB1\u0DBA \u0DC0\u0DD6\u0DBA\u0DDA \u0DB1\u0DD0\u0DAD. \u0D94\u0DB6\u0DA7 \u0D91\u0DBA \u0DB4\u0DD2\u0DC4\u0DD2\u0DA7\u0DD4\u0DC0\u0DD3\u0DB8\u0DA7 \u0D85\u0DC0\u0DC1\u0DCA\u200D\u0DBA \u0DAF?"\r
 },\r
 advhr:{\r
 advhr_desc:"Horizontale rule"\r
@@ -90,7 +90,9 @@ desc:"Edit CSS Style"
 paste:{\r
 paste_text_desc:"Paste as Plain Text",\r
 paste_word_desc:"Paste from Word",\r
-selectall_desc:"Select All"\r
+selectall_desc:"Select All",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
@@ -120,7 +122,9 @@ col:"Column",
 cell:"Cell"\r
 },\r
 autosave:{\r
-unload_msg:"The changes you made will be lost if you navigate away from this page."\r
+unload_msg:"The changes you made will be lost if you navigate away from this page.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Toggle fullscreen mode"\r
@@ -151,4 +155,16 @@ no_mpell:"No misspellings found."
 },\r
 pagebreak:{\r
 desc:"Insert page break."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index a07de046390b420133a9c9e79f700156de9c1f8c..4f6c2f274819c6b161549cd47dadbe2031a6fbe7 100755 (executable)
@@ -1,51 +1,51 @@
 tinyMCE.addI18n({sk:{\r
 common:{\r
-edit_confirm:"Chce\u0161 pou\u017Ei\u0165 WYSIWYG m\u00F3d pre tento text?",\r
+edit_confirm:"Chcete pou\u017Ei\u0165 WYSIWYG re\u017Eim pre tento text?",\r
 apply:"Pou\u017Ei\u0165",\r
 insert:"Vlo\u017Ei\u0165",\r
 update:"Aktualizova\u0165",\r
-cancel:"Zru\u0161i\u0165",\r
+cancel:"Storno",\r
 close:"Zavrie\u0165",\r
 browse:"Prech\u00E1dza\u0165",\r
 class_name:"Trieda",\r
 not_set:"-- Nezadan\u00E9 --",\r
-clipboard_msg:"Funkcie Kop\u00EDrova\u0165/vysrihn\u00FA\u0165/vlo\u017Ei\u0165 nie su podporovan\u00E9 prehliada\u010Dmi Mozilla a Firefox.\nChce\u0161 viac inform\u00E1ci\u00ED o tomto probl\u00E9me?",\r
-clipboard_no_support:"Moment\u00E1lne nie je podporovan\u00E9 tvoj\u00EDm prehliada\u010Dom. Miesto toho pou\u017Ei kl\u00E1vesov\u00FA skratku.",\r
-popup_blocked:"Ospravedl\u0148ujeme sa, ale blokova\u010D vyskakovac\u00EDch okien neumo\u017Enil otvori\u0165 okno, ktor\u00E9 zprostredkov\u00E1va funk\u010Dnos\u0165 aplik\u00E1ce. Mus\u00ED\u0161 vypnu\u0165 blokovanie vyskakovac\u00EDch okien na tomto webe, aby bolo mo\u017En\u00E9 vyu\u017Ei\u0165 jeho pln\u00FA funk\u010Dnos\u0165.",\r
-invalid_data:"Chyba: Zadan\u00E9 neplatn\u00E9 hodnoty (zv\u00FDraznen\u00E9 \u010Dervenou)",\r
-more_colors:"Viac farieb"\r
+clipboard_msg:"Funkcie kop\u00EDrova\u0165/vystrihn\u00FA\u0165/vlo\u017Ei\u0165 nie s\u00FA podporovan\u00E9 v prehliada\u010Doch Mozilla a Firefox.\nChcete viac inform\u00E1ci\u00ED o tomto probl\u00E9me?",\r
+clipboard_no_support:"T\u00E1to funkcia nie je va\u0161\u00EDm prehliada\u010Dom podporovan\u00E1. Pou\u017Eite namiesto toho kl\u00E1vesov\u00FA skratku.",\r
+popup_blocked:"Blokovanie vyskakovac\u00EDch okien neumo\u017Enilo otvori\u0165 okno, ktor\u00E9 poskytuje funk\u010Dnos\u0165 aplik\u00E1cie. Pre pln\u00E9 vyu\u017Eitie mo\u017Enost\u00ED aplik\u00E1cie mus\u00EDte vypn\u00FA\u0165 blokovanie vyskakovac\u00EDch okien pre tento web.",\r
+invalid_data:"Chyba: Boli zadan\u00E9 neplatn\u00E9 hodnoty a tieto boli ozna\u010Den\u00E9 \u010Dervenou farbou.",\r
+more_colors:"\u010Eal\u0161ie farby"\r
 },\r
 contextmenu:{\r
-align:"Umietnenie",\r
-left:"V\u013Eavo",\r
+align:"Zarovnanie",\r
+left:"Do\u013Eava",\r
 center:"Na stred",\r
-right:"Vpravo",\r
+right:"Doprava",\r
 full:"Do bloku"\r
 },\r
 insertdatetime:{\r
-date_fmt:"%Y-%m-%d",\r
+date_fmt:"%d.%m.%Y",\r
 time_fmt:"%H:%M:%S",\r
 insertdate_desc:"Vlo\u017Ei\u0165 d\u00E1tum",\r
 inserttime_desc:"Vlo\u017Ei\u0165 \u010Das",\r
 months_long:"Janu\u00E1r,Febru\u00E1r,Marec,Apr\u00EDl,M\u00E1j,J\u00FAn,J\u00FAl,August,September,Okt\u00F3ber,November,December",\r
 months_short:"Jan,Feb,Mar,Apr,M\u00E1j,J\u00FAn,J\u00FAl,Aug,Sep,Okt,Nov,Dec",\r
 day_long:"Nede\u013Ea,Pondelok,Utorok,Streda,\u0160tvrtok,Piatok,Sobota,Nede\u013Ea",\r
-day_short:"Ned,Pon,Ut,Str,\u0160tvr,Pia,Sob,Ned"\r
+day_short:"Ne,Po,Ut,St,\u0160t,Pi,So,Ne"\r
 },\r
 print:{\r
-print_desc:"Vytla\u010Di\u0165"\r
+print_desc:"Tla\u010D"\r
 },\r
 preview:{\r
 preview_desc:"N\u00E1h\u013Ead"\r
 },\r
 directionality:{\r
-ltr_desc:"Smer z \u013Eava do prava",\r
-rtl_desc:"Smer z prava do \u013Eava"\r
+ltr_desc:"Smer z\u013Eava doprava",\r
+rtl_desc:"Smer sprava do\u013Eava"\r
 },\r
 layer:{\r
 insertlayer_desc:"Vlo\u017Ei\u0165 nov\u00FA vrstvu",\r
-forward_desc:"Posun\u00FA\u0165 dopredu",\r
-backward_desc:"Posun\u00FA\u0165 dozadu",\r
+forward_desc:"Presun\u00FA\u0165 dopredu",\r
+backward_desc:"Presun\u00FA\u0165 dozadu",\r
 absolute_desc:"Prepn\u00FA\u0165 na absol\u00FAtne poziciovanie",\r
 content:"Nov\u00E1 vrstva..."\r
 },\r
@@ -54,101 +54,123 @@ save_desc:"Ulo\u017Ei\u0165",
 cancel_desc:"Zru\u0161i\u0165 v\u0161etky zmeny"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"Vlo\u017Ei\u0165 znak non-breaking space"\r
+nonbreaking_desc:"Vlo\u017Ei\u0165 nerozdelite\u013En\u00FA medzeru"\r
 },\r
 iespell:{\r
 iespell_desc:"Spusti\u0165 kontrolu pravopisu",\r
-download:"ieSpell nebol n\u00E1jden\u00FD. Chce\u0161 ho nain\u0161talova\u0165?"\r
+download:"Slovn\u00EDk ieSpell nebol detekovan\u00FD. Chcete ho nain\u0161talova\u0165?"\r
 },\r
 advhr:{\r
-advhr_desc:"Horizont\u00E1lny odde\u013Eova\u010D"\r
+advhr_desc:"Vodorovn\u00FD odde\u013Eova\u010D"\r
 },\r
 emotions:{\r
 emotions_desc:"Emotikony"\r
 },\r
 searchreplace:{\r
-search_desc:"N\u00E1jdi",\r
-replace_desc:"N\u00E1jdi/Nahra\u010F"\r
+search_desc:"H\u013Eada\u0165",\r
+replace_desc:"H\u013Eada\u0165 a nahradi\u0165"\r
 },\r
 advimage:{\r
-image_desc:"Vlo\u017Ei\u0165/editova\u0165 obr\u00E1zok"\r
+image_desc:"Vlo\u017Ei\u0165/upravi\u0165 obr\u00E1zok",\r
+delta_width:"40"\r
 },\r
 advlink:{\r
-link_desc:"Vlo\u017Ei\u0165/editova\u0165 odkaz"\r
+link_desc:"Vlo\u017Ei\u0165/upravi\u0165 odkaz"\r
 },\r
 xhtmlxtras:{\r
 cite_desc:"Cit\u00E1cia",\r
 abbr_desc:"Skratka",\r
-acronym_desc:"Acronym",\r
-del_desc:"Zru\u0161enie",\r
-ins_desc:"Vlo\u017Eenie",\r
-attribs_desc:"Vlo\u017Ei\u0165/editova\u0165 atrib\u00FAty"\r
+acronym_desc:"Akronym",\r
+del_desc:"Odstr\u00E1nen\u00FD text",\r
+ins_desc:"Pridan\u00FD text",\r
+attribs_desc:"Vlo\u017Ei\u0165/upravi\u0165 atrib\u00FAty"\r
 },\r
 style:{\r
-desc:"Editova\u0165 CSS \u0160t\u00FDl"\r
+desc:"Upravi\u0165 CSS \u0161t\u00FDl",\r
+delta_width:"35"\r
 },\r
 paste:{\r
-paste_text_desc:"Vlo\u017Ei\u0165 ako neformatovan\u00FD text",\r
-paste_word_desc:"Vlo\u017Ei\u0165 text z aplik\u00E1ce Word",\r
-selectall_desc:"Ozna\u010Di\u0165 v\u0161etko"\r
+paste_text_desc:"Vlo\u017Ei\u0165 ako prost\u00FD text",\r
+paste_word_desc:"Vlo\u017Ei\u0165 z Wordu",\r
+selectall_desc:"Ozna\u010Di\u0165 v\u0161etko",\r
+plaintext_mode_sticky:"Funkcia vlo\u017Ei\u0165 je teraz v re\u017Eime prost\u00FD text. Op\u00E4tovn\u00E9 kliknutie prepne t\u00FAto funkciu nasp\u00E4\u0165 do norm\u00E1lneho re\u017Eimu. Po vlo\u017Een\u00ED \u010Dohoko\u013Evek bude t\u00E1to funkcia navr\u00E1ten\u00E1 sp\u00E4\u0165 do norm\u00E1lneho re\u017Eimu.",\r
+plaintext_mode:"Funkcia vlo\u017Ei\u0165 je teraz v re\u017Eime prost\u00FD text. Op\u00E4tovn\u00E9 kliknutie prepne t\u00FAto funkciu nasp\u00E4\u0165 do norm\u00E1lneho re\u017Eimu."\r
 },\r
 paste_dlg:{\r
-text_title:"Pou\u017Ei CTRL+V na kl\u00E1vesnici pre vlo\u017Eenie textu do okna.",\r
+text_title:"Pou\u017Eite CTRL+V pre vlo\u017Eenie textu do okna.",\r
 text_linebreaks:"Zachova\u0165 zalamovanie riadkov",\r
-word_title:"Pou\u017Ei CTRL+V na kl\u00E1vesnici pre vlo\u017Eenie textu do okna."\r
+word_title:"Pou\u017Eite CTRL+V pre vlo\u017Eenie textu do okna."\r
 },\r
 table:{\r
 desc:"Vlo\u017Ei\u0165 nov\u00FA tabu\u013Eku",\r
 row_before_desc:"Vlo\u017Ei\u0165 riadok pred",\r
 row_after_desc:"Vlo\u017Ei\u0165 riadok za",\r
-delete_row_desc:"Odstr\u00E1ni\u0165 riadok",\r
+delete_row_desc:"Odstr\u00E1ni\u0165 riadok tabu\u013Eky",\r
 col_before_desc:"Vlo\u017Ei\u0165 st\u013Apec pred",\r
 col_after_desc:"Vlo\u017Ei\u0165 st\u013Apec za",\r
-delete_col_desc:"Odstr\u00E1ni\u0165 st\u013Apec",\r
-split_cells_desc:"Rozdeli\u0165 zl\u00FAcen\u00E9 bunky",\r
+delete_col_desc:"Odstr\u00E1ni\u0165 st\u013Apec tabu\u013Eky",\r
+split_cells_desc:"Rozdeli\u0165 bunky",\r
 merge_cells_desc:"Zl\u00FA\u010Di\u0165 bunky",\r
 row_desc:"Vlastnosti riadky tabu\u013Eky",\r
-cell_desc:"Vlastnosti bunky tabu\u013Eky",\r
+cell_desc:"Vlastnosti bunky",\r
 props_desc:"Vlastnosti tabu\u013Eky",\r
 paste_row_before_desc:"Vlo\u017Ei\u0165 riadok pred",\r
 paste_row_after_desc:"Vlo\u017Ei\u0165 riadok za",\r
-cut_row_desc:"Vystrihn\u00FA\u0165 riadok",\r
-copy_row_desc:"Kop\u00EDrova\u0165 riadok",\r
-del:"Zmaza\u0165 tabu\u013Eku",\r
+cut_row_desc:"Vystrihn\u00FA\u0165 riadok tabu\u013Eky",\r
+copy_row_desc:"Kop\u00EDrova\u0165 riadok tabu\u013Eky",\r
+del:"Odstr\u00E1ni\u0165 tabu\u013Eku",\r
 row:"Riadok",\r
 col:"St\u013Apec",\r
-cell:"Bunka"\r
+cell:"Bunka",\r
+cellprops_delta_width:"105",\r
+table_delta_width:"50"\r
 },\r
 autosave:{\r
-unload_msg:"Vykonan\u00E9 zmeny bud\u00FA straten\u00E9, ak opust\u00ED\u0161 t\u00FAto str\u00E1nku."\r
+unload_msg:"Preveden\u00E9 zmeny m\u00F4\u017Eu by\u0165 straten\u00E9, ak opust\u00EDte t\u00FAto str\u00E1nku.",\r
+restore_content:"Obnovi\u0165 automaticky ulo\u017Een\u00FD obsah.",\r
+warning_message:"Pokia\u013E obnov\u00EDte ulo\u017Een\u00FD obsah, strat\u00EDte t\u00FDm v\u0161etok obsah, ktor\u00FD je pr\u00E1ve v okne editora.\n\nSkuto\u010Dne chcete obnovi\u0165 ulo\u017Een\u00FD obsah?."\r
 },\r
 fullscreen:{\r
-desc:"Prepn\u00FA\u0165 zobrazenie na celej obrazovke"\r
+desc:"Prepn\u00FA\u0165 na celostr\u00E1nkov\u00E9 zobrazenie"\r
 },\r
 media:{\r
-desc:"Vlo\u017Ei\u0165 / editova\u0165 vnoren\u00E9 m\u00E9di\u00E1",\r
-edit:"Editova\u0165 vnoren\u00E9 m\u00E9di\u00E1"\r
+desc:"Vlo\u017Ei\u0165/upravi\u0165 m\u00E9di\u00E1",\r
+edit:"Upravi\u0165 m\u00E9di\u00E1",\r
+delta_width:"180"\r
 },\r
 fullpage:{\r
-desc:"Vlastnosti dokumentu"\r
+desc:"Vlastnosti dokumentu",\r
+delta_width:"115"\r
 },\r
 template:{\r
-desc:"Vlo\u017Ei\u0165 obsah z preddefinovanej \u0161abl\u00F3ny"\r
+desc:"Vlo\u017Ei\u0165 preddefinovan\u00FD obsah zo \u0161abl\u00F3ny"\r
 },\r
 visualchars:{\r
-desc:"Vizu\u00E1lne ovl\u00E1dacie znaky zap/vyp."\r
+desc:"Zobrazenie skryt\u00FDch znakov zap/vyp"\r
 },\r
 spellchecker:{\r
-desc:"Prepn\u00FA\u0165 na kontrolu pravopisu",\r
-menu:"Nastavenia kontroly pravopisu",\r
+desc:"Prepn\u00FA\u0165 kontrolu pravopisu",\r
+menu:"Nastavenie kontroly pravopisu",\r
 ignore_word:"Vynecha\u0165 slovo",\r
 ignore_words:"Vynecha\u0165 v\u0161etky",\r
 langs:"Jazyky",\r
-wait:"\u010Cakaj pros\u00EDm...",\r
+wait:"\u010Cakajte pros\u00EDm...",\r
 sug:"Ponuky",\r
 no_sug:"\u017Diadne ponuky",\r
 no_mpell:"Bez pravopisn\u00FDch ch\u00FDb."\r
 },\r
 pagebreak:{\r
 desc:"Vlo\u017Ei\u0165 zalomenie str\u00E1nky."\r
+},\r
+advlist:{\r
+types:"Typ",\r
+def:"Predvolen\u00FD",\r
+lower_alpha:"Mal\u00E9 p\u00EDsmen\u00E1",\r
+lower_greek:"Mal\u00E9 gr\u00E9cke p\u00EDsmen\u00E1",\r
+lower_roman:"Mal\u00E9 r\u00EDmske \u010D\u00EDslice",\r
+upper_alpha:"Ve\u013Ek\u00E9 p\u00EDsmen\u00E1",\r
+upper_roman:"Ve\u013Ek\u00E9 r\u00EDmske \u010D\u00EDslice",\r
+circle:"Kr\u00FA\u017Eok",\r
+disc:"Pln\u00E9 koliesko",\r
+square:"\u0160tvor\u010Dek"\r
 }}});
\ No newline at end of file
index a58608c622ec801c9afd18de47436644be0d74b6..92f67057d432a9c3a4b2f2c10a9b18c061ac6476 100755 (executable)
@@ -90,7 +90,9 @@ desc:"Uredi sloge CSS"
 paste:{\r
 paste_text_desc:"Prilepi kot golo besedilo",\r
 paste_word_desc:"Prilepi iz Word-a",\r
-selectall_desc:"Izberi vse"\r
+selectall_desc:"Izberi vse",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Uporabite kombinacijo tipk CTRL+V, da prilepite vsebino v okno.",\r
@@ -121,7 +123,9 @@ cell:"Celica",
 cellprops_delta_width:"100"\r
 },\r
 autosave:{\r
-unload_msg:"Ce se premaknete na drugo stran, bodo narejene spremembe izgubljene!"\r
+unload_msg:"Ce se premaknete na drugo stran, bodo narejene spremembe izgubljene!",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Preklopi celozaslonski na\u010Din"\r
@@ -152,4 +156,16 @@ no_mpell:"Napa\u010Dnega \u010Drkovanja nisem na\u0161el."
 },\r
 pagebreak:{\r
 desc:"Vstavi lom strani."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/sq.js b/program/js/tiny_mce/langs/sq.js
new file mode 100644 (file)
index 0000000..9837ac0
--- /dev/null
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({sq:{\r
+common:{\r
+edit_confirm:"Doni t\u00EB p\u00EBrdorni m\u00EBnyr\u00EBn WYSIWYG p\u00EBr k\u00EBt\u00EB tekst?",\r
+apply:"Zbato",\r
+insert:"Fut",\r
+update:"Rifresko",\r
+cancel:"Anulo",\r
+close:"Mbyll",\r
+browse:"Shfleto",\r
+class_name:"Klasa",\r
+not_set:"-- pa v\u00EBn\u00EB --",\r
+clipboard_msg:"Kopja/Prerja/Ngjitja nuk suportohen n\u00EB Mozilla dhe Firefox.\nD\u00EBshironi m\u00EB shum\u00EB informacione p\u00EBr k\u00EBt\u00EB \u00E7\u00EBshtje?",\r
+clipboard_no_support:"Aktualisht nuk suportohet nga Shfletuesi juaj, p\u00EBrdorni tastjer\u00EBn.",\r
+popup_blocked:"Ju k\u00EBrkojm\u00EB ndjes\u00EB, por bllokuesi i popup-eve ka bllokuar nj\u00EB dritare q\u00EB ofron funksjonalitet p\u00EBr programin. Duhet t'a \u00E7aktivizoni bllokuesin e popup-eve n\u00EB m\u00EBnyr\u00EB q\u00EB t'i p\u00EBrdorni opsionet.",\r
+invalid_data:"Gabim: Keni futur vlera t\u00EB pavlefshme, t\u00EB cilat jan\u00EB sh\u00EBnuar me t\u00EB kuqe.",\r
+more_colors:"M\u00EB shum\u00EB ngjyra"\r
+},\r
+contextmenu:{\r
+align:"Drejtimi",\r
+left:"Majtas",\r
+center:"Qend\u00EBr",\r
+right:"Djathtas",\r
+full:"I Plot\u00EB"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%d-%m-%y",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Fut dat\u00EBn",\r
+inserttime_desc:"Fut or\u00EBn",\r
+months_long:"Janar,Shkurt,Mars,Prill,Maj,Qershor,Korrik,Gusht,Shtator,Tetor,N\u00EBntor,Dhjetor",\r
+months_short:"Jan,Shk,Mar,Pri,Maj,Qer,Kor,Gus,Sht,Tet,N\u00EBn,Dhj",\r
+day_long:"E Djel\u00EB,E H\u00EBn\u00EB,E Mart\u00EB,E M\u00EBrkur\u00EB,E Enjte,E Premte,E Shtun\u00EB,E Djel\u00EB",\r
+day_short:"Dje,H\u00EBn,Mar,M\u00EBr,Enj,Pre,Sht,Dje"\r
+},\r
+print:{\r
+print_desc:"Printo"\r
+},\r
+preview:{\r
+preview_desc:"Paraqitje"\r
+},\r
+directionality:{\r
+ltr_desc:"Drejtimi majtas-djathtas",\r
+rtl_desc:"Drejtimi djathtas-majtas"\r
+},\r
+layer:{\r
+insertlayer_desc:"Fut shtres\u00EB t\u00EB re",\r
+forward_desc:"L\u00EBviz para",\r
+backward_desc:"L\u00EBviz prapa",\r
+absolute_desc:"Aktivizo/\u00E7aktivizo pozicionimin absolut",\r
+content:"Shtres\u00EB e re..."\r
+},\r
+save:{\r
+save_desc:"Ruaj",\r
+cancel_desc:"Anuloji t\u00EB gjitha ndryshimet"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"Fut hap\u00EBsir\u00EB"\r
+},\r
+iespell:{\r
+iespell_desc:"Kontrollo p\u00EBr gabime drejt\u00EBshkrimore",\r
+download:"ieSpell nuk u detektua. D\u00EBshironi ta instaloni?"\r
+},\r
+advhr:{\r
+advhr_desc:"Linj\u00EB horizontale"\r
+},\r
+emotions:{\r
+emotions_desc:"Emocionet"\r
+},\r
+searchreplace:{\r
+search_desc:"K\u00EBrko",\r
+replace_desc:"K\u00EBrko/Z\u00EBvend\u00EBso"\r
+},\r
+advimage:{\r
+image_desc:"Fut/edito foto"\r
+},\r
+advlink:{\r
+link_desc:"Fut/edito lidhje"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Citat",\r
+abbr_desc:"Shkurtim",\r
+acronym_desc:"Akronim",\r
+del_desc:"Fshirje",\r
+ins_desc:"Futje",\r
+attribs_desc:"Fut/Edito Tipare"\r
+},\r
+style:{\r
+desc:"Edito Stilet CSS"\r
+},\r
+paste:{\r
+paste_text_desc:"Ngjit si Tekst",\r
+paste_word_desc:"Ngjit nga Word",\r
+selectall_desc:"Zgjidhi t\u00EB gjitha",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"P\u00EBrdor CTRL+V p\u00EBr t\u00EB ngjitur tekstin.",\r
+text_linebreaks:"Ruaj linjat e reja",\r
+word_title:"P\u00EBrdor CTRL+V p\u00EBr t\u00EB ngjitur tekstin."\r
+},\r
+table:{\r
+desc:"Fut nj\u00EB tabel\u00EB t\u00EB re",\r
+row_before_desc:"Fut rresht p\u00EBrpara",\r
+row_after_desc:"Fut rresht pas",\r
+delete_row_desc:"Fshi rreshtin",\r
+col_before_desc:"Fut kolon\u00EB p\u00EBrpara",\r
+col_after_desc:"Fut kolon\u00EB pas",\r
+delete_col_desc:"Fshi kolon\u00EBn",\r
+split_cells_desc:"Ndaji qelizat e bashkuara",\r
+merge_cells_desc:"Bashkoji qelizat",\r
+row_desc:"Tiparet e rreshtit",\r
+cell_desc:"Tiparet e qeliz\u00EBs",\r
+props_desc:"Tiparet e tabel\u00EBs",\r
+paste_row_before_desc:"Ngjite rreshtin p\u00EBrpara",\r
+paste_row_after_desc:"Ngjite rreshtin pas",\r
+cut_row_desc:"Prit rreshtin",\r
+copy_row_desc:"Kopjo rreshtin",\r
+del:"Fshi tabel\u00EBn",\r
+row:"Rresht",\r
+col:"Kolon\u00EB",\r
+cell:"Qeliz\u00EB"\r
+},\r
+autosave:{\r
+unload_msg:"Ndryshimet q\u00EB keni b\u00EBr\u00EB do t\u00EB humbasin n\u00EBse largoheni nga kjo faqe.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"Aktivizo/\u00E7aktivizo pamjen e plot\u00EB"\r
+},\r
+media:{\r
+desc:"Fut / edito media",\r
+edit:"Edito media"\r
+},\r
+fullpage:{\r
+desc:"Tiparet e dokumentit"\r
+},\r
+template:{\r
+desc:"Fut p\u00EBrmbajtje shabllon"\r
+},\r
+visualchars:{\r
+desc:"Karakteret e kontrollit vizual: on/off."\r
+},\r
+spellchecker:{\r
+desc:"Aktivizo/\u00E7aktivizo kontrolluesin e gabimeve",\r
+menu:"Tiparet e kontrolluesit t\u00EB gabimeve",\r
+ignore_word:"Injoro fjal\u00EBn",\r
+ignore_words:"Injoroji t\u00EB gjitha",\r
+langs:"Gjuh\u00EBt",\r
+wait:"Ju lutem prisni...",\r
+sug:"Sygjerimet",\r
+no_sug:"Asnj\u00EB sygjerim",\r
+no_mpell:"Nuk u gjet asnj\u00EB gabim."\r
+},\r
+pagebreak:{\r
+desc:"Fut thyerje faqeje."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
index 73cbb2d405908473c65a8a865ef979ceda66704c..6079f3b493c87f8fbfb3268391cf14f4c403ff84 100755 (executable)
@@ -2,7 +2,7 @@ tinyMCE.addI18n({sr:{
 common:{\r
 edit_confirm:"\u017Delite li koristiti WYSIWYG na\u010Din rada za ovo tekstualno polje?",\r
 apply:"Primjeni",\r
-insert:"Umetni",\r
+insert:"Ubaci",\r
 update:"Obnovi",\r
 cancel:"Odustani",\r
 close:"Zatvori",\r
@@ -90,7 +90,9 @@ desc:"Uredi CSS"
 paste:{\r
 paste_text_desc:"Zalepi kao obi\u010Dni tekst",\r
 paste_word_desc:"Zalepi iz Worda",\r
-selectall_desc:"Odaberi sve"\r
+selectall_desc:"Odaberi sve",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
 text_title:"Koristite CTRL+V na tipkovnici da zalepite tekst u prozor.",\r
@@ -120,7 +122,9 @@ col:"Stupac",
 cell:"\u0106elija"\r
 },\r
 autosave:{\r
-unload_msg:"Promjene u dokumentu \u0107e biti izgubljene ako iza\u0111ete s ove stranice."\r
+unload_msg:"Promjene u dokumentu \u0107e biti izgubljene ako iza\u0111ete s ove stranice.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
 desc:"Uklju\u010Di/isklju\u010Di prikaz preko celog ekrana"\r
@@ -151,4 +155,16 @@ no_mpell:"Nije prona\u0111ena nijedna pravopisna gre\u0161ka."
 },\r
 pagebreak:{\r
 desc:"Umetni prelom."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
index 97af5628fff4b88b5f98b1df3662147e3d91c723..2e96b24243de83856d9c66e4fef2e6adde127bf7 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n({sv:{\r
 common:{\r
-edit_confirm:"Vill du anv\u00E4nda WYSIWYG l\u00E4get f\u00F6r denna textarea.",\r
+edit_confirm:"Vill du anv\u00E4nda WYSIWYG f\u00F6r denna textarea?",\r
 apply:"Applicera",\r
 insert:"Infoga",\r
 update:"Uppdatera",\r
@@ -90,7 +90,9 @@ desc:"Redigera inline CSS"
 paste:{\r
 paste_text_desc:"Klistra in som text",\r
 paste_word_desc:"Klistra in fr\u00E5n Word",\r
-selectall_desc:"Markera allt"\r
+selectall_desc:"Markera allt",\r
+plaintext_mode_sticky:"Inklistring \u00E4r nu i textl\u00E4ge. Efter att du klistrat in kommer den att \u00E5terg\u00E5 till normall\u00E4ge.",\r
+plaintext_mode:"Inklistring \u00E4r nu i textl\u00E4ge."\r
 },\r
 paste_dlg:{\r
 text_title:"Anv\u00E4nd ctrl-v p\u00E5 ditt tangentbord f\u00F6r att klistra in i detta f\u00F6nster.",\r
@@ -120,7 +122,9 @@ col:"Kolumn",
 cell:"Cell"\r
 },\r
 autosave:{\r
-unload_msg:"F\u00F6r\u00E4ndringarna du gjorde kommer att g\u00E5 f\u00F6rlorade om du v\u00E4ljer att l\u00E4mna denna sida."\r
+unload_msg:"De f\u00F6r\u00E4ndringar som du gjort kommer att g\u00E5 f\u00F6rlorade om du l\u00E4mnar sidan.",\r
+restore_content:"\u00C5terskapa automatiskt sparat inneh\u00E5ll.",\r
+warning_message:"Om du \u00E5terskapar inneh\u00E5ll s\u00E5 kommer det nuvarande inneh\u00E5llet i f\u00E4ltet att raderas.\n\n\u00C4r du s\u00E4ker p\u00E5 att du vill g\u00F6ra detta?"\r
 },\r
 fullscreen:{\r
 desc:"Sl\u00E5 av/p\u00E5 fullsk\u00E4rmsl\u00E4ge"\r
@@ -147,8 +151,20 @@ langs:"Spr\u00E5k",
 wait:"Var god v\u00E4nta...",\r
 sug:"F\u00F6rslag",\r
 no_sug:"Inga f\u00F6rslag",\r
-no_mpell:"Kunde inte finna n\u00E5gra felstavningar."\r
+no_mpell:"Inga felstavningar funna."\r
 },\r
 pagebreak:{\r
 desc:"Infoga sidbrytning"\r
+},\r
+advlist:{\r
+types:"Typer",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Cirkel",\r
+disc:"Disc",\r
+square:"Fyrkant"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/ta.js b/program/js/tiny_mce/langs/ta.js
new file mode 100644 (file)
index 0000000..4b286b9
--- /dev/null
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({ta:{\r
+common:{\r
+edit_confirm:"Do you want to use the WYSIWYG mode for this textarea?",\r
+apply:"Apply",\r
+insert:"Insert",\r
+update:"Update",\r
+cancel:"Cancel",\r
+close:"Close",\r
+browse:"Browse",\r
+class_name:"Class",\r
+not_set:"-- Not set --",\r
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?",\r
+clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.",\r
+popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.",\r
+invalid_data:"Error: Invalid values entered, these are marked in red.",\r
+more_colors:"More colors"\r
+},\r
+contextmenu:{\r
+align:"Alignment",\r
+left:"Left",\r
+center:"Center",\r
+right:"Right",\r
+full:"Full"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%Y-%m-%d",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Insert date",\r
+inserttime_desc:"Insert time",\r
+months_long:"January,February,March,April,May,June,July,August,September,October,November,December",\r
+months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",\r
+day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday",\r
+day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"\r
+},\r
+print:{\r
+print_desc:"Print"\r
+},\r
+preview:{\r
+preview_desc:"Preview"\r
+},\r
+directionality:{\r
+ltr_desc:"Direction left to right",\r
+rtl_desc:"Direction right to left"\r
+},\r
+layer:{\r
+insertlayer_desc:"Insert new layer",\r
+forward_desc:"Move forward",\r
+backward_desc:"Move backward",\r
+absolute_desc:"Toggle absolute positioning",\r
+content:"New layer..."\r
+},\r
+save:{\r
+save_desc:"Save",\r
+cancel_desc:"Cancel all changes"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"Insert non-breaking space character"\r
+},\r
+iespell:{\r
+iespell_desc:"Run spell checking",\r
+download:"ieSpell not detected. Do you want to install it now?"\r
+},\r
+advhr:{\r
+advhr_desc:"Horizontal rule"\r
+},\r
+emotions:{\r
+emotions_desc:"Emotions"\r
+},\r
+searchreplace:{\r
+search_desc:"Find",\r
+replace_desc:"Find/Replace"\r
+},\r
+advimage:{\r
+image_desc:"Insert/edit image"\r
+},\r
+advlink:{\r
+link_desc:"Insert/edit link"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Citation",\r
+abbr_desc:"Abbreviation",\r
+acronym_desc:"Acronym",\r
+del_desc:"Deletion",\r
+ins_desc:"Insertion",\r
+attribs_desc:"Insert/Edit Attributes"\r
+},\r
+style:{\r
+desc:"Edit CSS Style"\r
+},\r
+paste:{\r
+paste_text_desc:"Paste as Plain Text",\r
+paste_word_desc:"Paste from Word",\r
+selectall_desc:"Select All",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+},\r
+table:{\r
+desc:"Inserts a new table",\r
+row_before_desc:"Insert row before",\r
+row_after_desc:"Insert row after",\r
+delete_row_desc:"Delete row",\r
+col_before_desc:"Insert column before",\r
+col_after_desc:"Insert column after",\r
+delete_col_desc:"Remove column",\r
+split_cells_desc:"Split merged table cells",\r
+merge_cells_desc:"Merge table cells",\r
+row_desc:"Table row properties",\r
+cell_desc:"Table cell properties",\r
+props_desc:"Table properties",\r
+paste_row_before_desc:"Paste table row before",\r
+paste_row_after_desc:"Paste table row after",\r
+cut_row_desc:"Cut table row",\r
+copy_row_desc:"Copy table row",\r
+del:"Delete table",\r
+row:"Row",\r
+col:"Column",\r
+cell:"Cell"\r
+},\r
+autosave:{\r
+unload_msg:"The changes you made will be lost if you navigate away from this page.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"Toggle fullscreen mode"\r
+},\r
+media:{\r
+desc:"Insert / edit embedded media",\r
+edit:"Edit embedded media"\r
+},\r
+fullpage:{\r
+desc:"Document properties"\r
+},\r
+template:{\r
+desc:"Insert predefined template content"\r
+},\r
+visualchars:{\r
+desc:"Visual control characters on/off."\r
+},\r
+spellchecker:{\r
+desc:"Toggle spellchecker",\r
+menu:"Spellchecker settings",\r
+ignore_word:"Ignore word",\r
+ignore_words:"Ignore all",\r
+langs:"Languages",\r
+wait:"Please wait...",\r
+sug:"Suggestions",\r
+no_sug:"No suggestions",\r
+no_mpell:"No misspellings found."\r
+},\r
+pagebreak:{\r
+desc:"Insert page break."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/te.js b/program/js/tiny_mce/langs/te.js
new file mode 100644 (file)
index 0000000..acb1372
--- /dev/null
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({te:{\r
+common:{\r
+edit_confirm:"Do you want to use the WYSIWYG mode for this textarea?",\r
+apply:"Apply",\r
+insert:"Insert",\r
+update:"Update",\r
+cancel:"Cancel",\r
+close:"Close",\r
+browse:"Browse",\r
+class_name:"Class",\r
+not_set:"-- Not set --",\r
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?",\r
+clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.",\r
+popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.",\r
+invalid_data:"Error: Invalid values entered, these are marked in red.",\r
+more_colors:"More colors"\r
+},\r
+contextmenu:{\r
+align:"Alignment",\r
+left:"Left",\r
+center:"Center",\r
+right:"Right",\r
+full:"Full"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%Y-%m-%d",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Insert date",\r
+inserttime_desc:"Insert time",\r
+months_long:"January,February,March,April,May,June,July,August,September,October,November,December",\r
+months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",\r
+day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday",\r
+day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"\r
+},\r
+print:{\r
+print_desc:"Print"\r
+},\r
+preview:{\r
+preview_desc:"Preview"\r
+},\r
+directionality:{\r
+ltr_desc:"Direction left to right",\r
+rtl_desc:"Direction right to left"\r
+},\r
+layer:{\r
+insertlayer_desc:"Insert new layer",\r
+forward_desc:"Move forward",\r
+backward_desc:"Move backward",\r
+absolute_desc:"Toggle absolute positioning",\r
+content:"New layer..."\r
+},\r
+save:{\r
+save_desc:"Save",\r
+cancel_desc:"Cancel all changes"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"Insert non-breaking space character"\r
+},\r
+iespell:{\r
+iespell_desc:"Run spell checking",\r
+download:"ieSpell not detected. Do you want to install it now?"\r
+},\r
+advhr:{\r
+advhr_desc:"Horizontal rule"\r
+},\r
+emotions:{\r
+emotions_desc:"Emotions"\r
+},\r
+searchreplace:{\r
+search_desc:"Find",\r
+replace_desc:"Find/Replace"\r
+},\r
+advimage:{\r
+image_desc:"Insert/edit image"\r
+},\r
+advlink:{\r
+link_desc:"Insert/edit link"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"Citation",\r
+abbr_desc:"Abbreviation",\r
+acronym_desc:"Acronym",\r
+del_desc:"Deletion",\r
+ins_desc:"Insertion",\r
+attribs_desc:"Insert/Edit Attributes"\r
+},\r
+style:{\r
+desc:"Edit CSS Style"\r
+},\r
+paste:{\r
+paste_text_desc:"Paste as Plain Text",\r
+paste_word_desc:"Paste from Word",\r
+selectall_desc:"Select All",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+},\r
+table:{\r
+desc:"Inserts a new table",\r
+row_before_desc:"Insert row before",\r
+row_after_desc:"Insert row after",\r
+delete_row_desc:"Delete row",\r
+col_before_desc:"Insert column before",\r
+col_after_desc:"Insert column after",\r
+delete_col_desc:"Remove column",\r
+split_cells_desc:"Split merged table cells",\r
+merge_cells_desc:"Merge table cells",\r
+row_desc:"Table row properties",\r
+cell_desc:"Table cell properties",\r
+props_desc:"Table properties",\r
+paste_row_before_desc:"Paste table row before",\r
+paste_row_after_desc:"Paste table row after",\r
+cut_row_desc:"Cut table row",\r
+copy_row_desc:"Copy table row",\r
+del:"Delete table",\r
+row:"Row",\r
+col:"Column",\r
+cell:"Cell"\r
+},\r
+autosave:{\r
+unload_msg:"The changes you made will be lost if you navigate away from this page.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"Toggle fullscreen mode"\r
+},\r
+media:{\r
+desc:"Insert / edit embedded media",\r
+edit:"Edit embedded media"\r
+},\r
+fullpage:{\r
+desc:"Document properties"\r
+},\r
+template:{\r
+desc:"Insert predefined template content"\r
+},\r
+visualchars:{\r
+desc:"Visual control characters on/off."\r
+},\r
+spellchecker:{\r
+desc:"Toggle spellchecker",\r
+menu:"Spellchecker settings",\r
+ignore_word:"Ignore word",\r
+ignore_words:"Ignore all",\r
+langs:"Languages",\r
+wait:"Please wait...",\r
+sug:"Suggestions",\r
+no_sug:"No suggestions",\r
+no_mpell:"No misspellings found."\r
+},\r
+pagebreak:{\r
+desc:"Insert page break."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/th.js b/program/js/tiny_mce/langs/th.js
new file mode 100644 (file)
index 0000000..ba6486d
--- /dev/null
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({th:{\r
+common:{\r
+edit_confirm:"\u0E04\u0E38\u0E13\u0E15\u0E49\u0E2D\u0E07\u0E01\u0E32\u0E23\u0E43\u0E0A\u0E49\u0E42\u0E2B\u0E21\u0E14 WYSIWYG \u0E43\u0E19\u0E01\u0E32\u0E23\u0E40\u0E02\u0E35\u0E22\u0E19\u0E1A\u0E17\u0E04\u0E27\u0E32\u0E21\u0E2B\u0E23\u0E37\u0E2D\u0E44\u0E21\u0E48 ?",\r
+apply:"\u0E43\u0E0A\u0E49\u0E07\u0E32\u0E19",\r
+insert:"\u0E40\u0E1E\u0E34\u0E48\u0E21",\r
+update:"\u0E2D\u0E31\u0E1E\u0E40\u0E14\u0E15",\r
+cancel:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",\r
+close:"\u0E1B\u0E34\u0E14",\r
+browse:"\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E44\u0E1F\u0E25\u0E4C",\r
+class_name:"css \u0E04\u0E25\u0E32\u0E2A",\r
+not_set:"-- \u0E44\u0E21\u0E48\u0E44\u0E14\u0E49\u0E15\u0E31\u0E49\u0E07\u0E04\u0E48\u0E32 --",\r
+clipboard_msg:"\u0E04\u0E31\u0E14\u0E25\u0E2D\u0E01 / \u0E15\u0E31\u0E14 / \u0E27\u0E32\u0E07\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E21\u0E35\u0E43\u0E2B\u0E49\u0E1A\u0E23\u0E34\u0E01\u0E32\u0E23\u0E43\u0E19 Mozilla \u0E41\u0E25\u0E30 Firefox.\nDo \u0E04\u0E38\u0E13\u0E15\u0E49\u0E2D\u0E07\u0E01\u0E32\u0E23\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E40\u0E15\u0E34\u0E21\u0E40\u0E01\u0E35\u0E48\u0E22\u0E27\u0E01\u0E31\u0E1A\u0E1B\u0E31\u0E0D\u0E2B\u0E32\u0E19\u0E35\u0E49\u0E2B\u0E23\u0E37\u0E2D\u0E44\u0E21\u0E48?",\r
+clipboard_no_support:"\u0E02\u0E13\u0E30\u0E19\u0E35\u0E49\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E2A\u0E19\u0E31\u0E1A\u0E2A\u0E19\u0E38\u0E19\u0E40\u0E1A\u0E23\u0E32\u0E40\u0E0B\u0E2D\u0E23\u0E4C\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13 \u0E43\u0E2B\u0E49\u0E43\u0E0A\u0E49\u0E41\u0E1B\u0E49\u0E19\u0E1E\u0E34\u0E21\u0E1E\u0E4C\u0E25\u0E31\u0E14\u0E41\u0E17\u0E19",\r
+popup_blocked:"\u0E02\u0E2D\u0E2D\u0E20\u0E31\u0E22\u0E41\u0E15\u0E48\u0E40\u0E23\u0E32\u0E1E\u0E1A\u0E27\u0E48\u0E32\u0E04\u0E38\u0E13\u0E21\u0E35\u0E23\u0E30\u0E1A\u0E1A\u0E1B\u0E49\u0E2D\u0E07\u0E01\u0E31\u0E19\u0E1B\u0E4A\u0E2D\u0E1B\u0E2D\u0E31\u0E1B \u0E04\u0E38\u0E13\u0E08\u0E30\u0E15\u0E49\u0E2D\u0E07\u0E1B\u0E34\u0E14\u0E01\u0E32\u0E23\u0E43\u0E0A\u0E49\u0E07\u0E32\u0E19\u0E01\u0E32\u0E23\u0E1A\u0E25\u0E47\u0E2D\u0E04\u0E1B\u0E4A\u0E2D\u0E1B\u0E2D\u0E31\u0E1B",\r
+invalid_data:"\u0E02\u0E49\u0E2D\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14: \u0E1B\u0E49\u0E2D\u0E19\u0E04\u0E48\u0E32\u0E43\u0E19\u0E0A\u0E49\u0E2D\u0E07\u0E2A\u0E35\u0E41\u0E14\u0E07\u0E43\u0E2B\u0E49\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07",\r
+more_colors:"\u0E2A\u0E35\u0E2D\u0E37\u0E48\u0E19\u0E46"\r
+},\r
+contextmenu:{\r
+align:"\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07\u0E08\u0E31\u0E14\u0E27\u0E32\u0E07",\r
+left:"\u0E0B\u0E49\u0E32\u0E22",\r
+center:"\u0E01\u0E25\u0E32\u0E07",\r
+right:"\u0E02\u0E27\u0E32",\r
+full:"\u0E40\u0E15\u0E47\u0E21"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%Y-%m-%d",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"Insert date",\r
+inserttime_desc:"Insert time",\r
+months_long:"\u0E21\u0E01\u0E23\u0E32\u0E04\u0E21,\u0E01\u0E38\u0E21\u0E20\u0E32\u0E1E\u0E31\u0E19\u0E18\u0E4C,\u0E21\u0E35\u0E19\u0E32\u0E04\u0E21,\u0E40\u0E21\u0E29\u0E32\u0E22\u0E19,\u0E1E\u0E24\u0E29\u0E20\u0E32\u0E04\u0E21,\u0E21\u0E34\u0E16\u0E38\u0E19\u0E32\u0E22\u0E19,\u0E01\u0E23\u0E01\u0E0E\u0E32\u0E04\u0E21,\u0E2A\u0E34\u0E07\u0E2B\u0E32\u0E04\u0E21,\u0E01\u0E31\u0E19\u0E22\u0E32\u0E22\u0E19,\u0E15\u0E38\u0E25\u0E32\u0E04\u0E21,\u0E1E\u0E24\u0E28\u0E08\u0E34\u0E01\u0E32\u0E22\u0E19,\u0E18\u0E31\u0E19\u0E27\u0E32\u0E04\u0E21",\r
+months_short:"\u0E21.\u0E04.,\u0E01.\u0E1E.,\u0E21\u0E35.\u0E04.,\u0E40\u0E21.\u0E22.,\u0E1E.\u0E04.,\u0E21\u0E34.\u0E22.,\u0E01.\u0E04.,\u0E2A.\u0E04.,\u0E01.\u0E22.,\u0E15.\u0E04.,\u0E1E.\u0E22.,\u0E18.\u0E04.",\r
+day_long:"\u0E27\u0E31\u0E19\u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C,\u0E27\u0E31\u0E19\u0E08\u0E31\u0E19\u0E17\u0E23\u0E4C,\u0E27\u0E31\u0E19\u0E2D\u0E31\u0E07\u0E04\u0E32\u0E23,\u0E27\u0E31\u0E19\u0E1E\u0E38\u0E18,\u0E27\u0E31\u0E19\u0E1E\u0E24\u0E2B\u0E31\u0E2A\u0E1A\u0E14\u0E35,\u0E27\u0E31\u0E19\u0E28\u0E38\u0E01\u0E23\u0E4C,\u0E27\u0E31\u0E19\u0E40\u0E2A\u0E32\u0E23\u0E4C,\u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C",\r
+day_short:"\u0E2D\u0E32,\u0E08,\u0E2D\u0E31\u0E07,\u0E1E,\u0E1E\u0E24,\u0E28,\u0E2A,\u0E2D"\r
+},\r
+print:{\r
+print_desc:"\u0E1E\u0E34\u0E21\u0E1E\u0E4C"\r
+},\r
+preview:{\r
+preview_desc:"\u0E14\u0E39\u0E15\u0E31\u0E27\u0E2D\u0E22\u0E48\u0E32\u0E07"\r
+},\r
+directionality:{\r
+ltr_desc:"\u0E2D\u0E48\u0E32\u0E19\u0E08\u0E32\u0E01\u0E0B\u0E49\u0E32\u0E22\u0E44\u0E1B\u0E02\u0E27\u0E32",\r
+rtl_desc:"\u0E2D\u0E48\u0E32\u0E19\u0E08\u0E32\u0E01\u0E02\u0E27\u0E32\u0E44\u0E1B\u0E0B\u0E49\u0E32\u0E22"\r
+},\r
+layer:{\r
+insertlayer_desc:"\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E40\u0E25\u0E40\u0E22\u0E2D\u0E23\u0E4C\u0E43\u0E2B\u0E21\u0E48",\r
+forward_desc:"\u0E22\u0E49\u0E32\u0E22\u0E44\u0E1B\u0E02\u0E49\u0E32\u0E07\u0E2B\u0E19\u0E49\u0E32",\r
+backward_desc:"\u0E22\u0E49\u0E32\u0E22\u0E44\u0E1B\u0E02\u0E49\u0E32\u0E07\u0E2B\u0E25\u0E31\u0E07",\r
+absolute_desc:"\u0E2A\u0E25\u0E31\u0E1A\u0E01\u0E32\u0E23\u0E27\u0E32\u0E07",\r
+content:"\u0E40\u0E25\u0E40\u0E22\u0E2D\u0E23\u0E4C\u0E43\u0E2B\u0E21\u0E48..."\r
+},\r
+save:{\r
+save_desc:"\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01",\r
+cancel_desc:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\u0E17\u0E38\u0E01\u0E2D\u0E22\u0E48\u0E32\u0E07"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"\u0E41\u0E17\u0E23\u0E01\u0E2D\u0E31\u0E01\u0E02\u0E23\u0E30\u0E27\u0E48\u0E32\u0E07"\r
+},\r
+iespell:{\r
+iespell_desc:"\u0E40\u0E23\u0E35\u0E22\u0E01\u0E43\u0E0A\u0E49\u0E15\u0E23\u0E27\u0E08\u0E01\u0E32\u0E23\u0E2A\u0E30\u0E01\u0E14",\r
+download:"\u0E2B\u0E32\u0E01\u0E23\u0E30\u0E1A\u0E1A\u0E15\u0E23\u0E27\u0E08\u0E2A\u0E2D\u0E1A\u0E04\u0E33\u0E1C\u0E34\u0E14\u0E44\u0E21\u0E48\u0E1E\u0E1A \u0E04\u0E38\u0E13\u0E15\u0E49\u0E2D\u0E07\u0E01\u0E32\u0E23\u0E15\u0E34\u0E14\u0E15\u0E31\u0E49\u0E07\u0E40\u0E14\u0E35\u0E4B\u0E22\u0E27\u0E19\u0E35\u0E49 ?"\r
+},\r
+advhr:{\r
+advhr_desc:"\u0E40\u0E2A\u0E49\u0E19\u0E1A\u0E23\u0E23\u0E17\u0E31\u0E14"\r
+},\r
+emotions:{\r
+emotions_desc:"Emotions"\r
+},\r
+searchreplace:{\r
+search_desc:"\u0E04\u0E49\u0E19\u0E2B\u0E32",\r
+replace_desc:"\u0E04\u0E49\u0E19\u0E2B\u0E32/\u0E41\u0E17\u0E19\u0E17\u0E35\u0E48"\r
+},\r
+advimage:{\r
+image_desc:"\u0E40\u0E1E\u0E34\u0E48\u0E21/\u0E41\u0E01\u0E49\u0E44\u0E02 \u0E23\u0E39\u0E1B"\r
+},\r
+advlink:{\r
+link_desc:"\u0E40\u0E1E\u0E34\u0E48\u0E21/\u0E41\u0E01\u0E49\u0E44\u0E02 \u0E25\u0E34\u0E49\u0E07\u0E04\u0E4C"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"\u0E01\u0E32\u0E23\u0E2D\u0E49\u0E32\u0E07\u0E2D\u0E34\u0E07",\r
+abbr_desc:"\u0E15\u0E31\u0E27\u0E22\u0E48\u0E2D",\r
+acronym_desc:"\u0E2D\u0E31\u0E01\u0E29\u0E23\u0E22\u0E48\u0E2D",\r
+del_desc:"\u0E25\u0E1A",\r
+ins_desc:"\u0E40\u0E1E\u0E34\u0E48\u0E21",\r
+attribs_desc:"\u0E40\u0E1E\u0E34\u0E48\u0E21/\u0E41\u0E01\u0E49\u0E44\u0E02 \u0E41\u0E2D\u0E17\u0E17\u0E23\u0E34\u0E1A\u0E34\u0E27"\r
+},\r
+style:{\r
+desc:"\u0E41\u0E01\u0E49\u0E44\u0E02 CSS"\r
+},\r
+paste:{\r
+paste_text_desc:"\u0E27\u0E32\u0E07\u0E42\u0E14\u0E22\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E18\u0E23\u0E23\u0E21\u0E14\u0E32",\r
+paste_word_desc:"\u0E27\u0E32\u0E07\u0E08\u0E32\u0E01\u0E42\u0E1B\u0E23\u0E41\u0E01\u0E23\u0E21 Word",\r
+selectall_desc:"\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
+},\r
+paste_dlg:{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+},\r
+table:{\r
+desc:"Inserts a new table",\r
+row_before_desc:"Insert row before",\r
+row_after_desc:"Insert row after",\r
+delete_row_desc:"Delete row",\r
+col_before_desc:"Insert column before",\r
+col_after_desc:"Insert column after",\r
+delete_col_desc:"Remove column",\r
+split_cells_desc:"Split merged table cells",\r
+merge_cells_desc:"Merge table cells",\r
+row_desc:"Table row properties",\r
+cell_desc:"Table cell properties",\r
+props_desc:"Table properties",\r
+paste_row_before_desc:"Paste table row before",\r
+paste_row_after_desc:"Paste table row after",\r
+cut_row_desc:"Cut table row",\r
+copy_row_desc:"Copy table row",\r
+del:"Delete table",\r
+row:"Row",\r
+col:"Column",\r
+cell:"Cell"\r
+},\r
+autosave:{\r
+unload_msg:"\u0E01\u0E32\u0E23\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E41\u0E1B\u0E25\u0E07\u0E17\u0E35\u0E48\u0E04\u0E38\u0E13\u0E17\u0E33\u0E08\u0E30\u0E2B\u0E32\u0E22\u0E44\u0E1B\u0E2B\u0E32\u0E01\u0E04\u0E38\u0E13\u0E2D\u0E2D\u0E01\u0E08\u0E32\u0E01\u0E2B\u0E19\u0E49\u0E32\u0E19\u0E35\u0E49",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
+},\r
+fullscreen:{\r
+desc:"\u0E2A\u0E25\u0E31\u0E1A\u0E44\u0E1B\u0E41\u0E2A\u0E14\u0E07\u0E41\u0E1A\u0E1A\u0E40\u0E15\u0E47\u0E21\u0E2B\u0E19\u0E49\u0E32"\r
+},\r
+media:{\r
+desc:"\u0E40\u0E1E\u0E34\u0E48\u0E21 / \u0E41\u0E01\u0E49\u0E44\u0E02 \u0E21\u0E35\u0E40\u0E14\u0E35\u0E22",\r
+edit:"\u0E41\u0E01\u0E49\u0E44\u0E02\u0E21\u0E35\u0E40\u0E14\u0E35\u0E22"\r
+},\r
+fullpage:{\r
+desc:"\u0E04\u0E38\u0E13\u0E2A\u0E21\u0E1A\u0E31\u0E15\u0E34\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23"\r
+},\r
+template:{\r
+desc:"\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E41\u0E21\u0E48\u0E41\u0E1A\u0E1A\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23"\r
+},\r
+visualchars:{\r
+desc:"\u0E01\u0E32\u0E23\u0E04\u0E27\u0E1A\u0E04\u0E38\u0E21\u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23 \u0E40\u0E1B\u0E34\u0E14/\u0E1B\u0E34\u0E14"\r
+},\r
+spellchecker:{\r
+desc:"\u0E1B\u0E34\u0E14\u0E01\u0E32\u0E23\u0E2A\u0E30\u0E01\u0E14\u0E04\u0E33",\r
+menu:"\u0E15\u0E31\u0E49\u0E07\u0E04\u0E48\u0E32\u0E01\u0E32\u0E23\u0E2A\u0E30\u0E01\u0E14\u0E04\u0E33",\r
+ignore_word:"\u0E25\u0E30\u0E40\u0E27\u0E49\u0E19\u0E1A\u0E32\u0E07\u0E04\u0E33",\r
+ignore_words:"\u0E25\u0E30\u0E40\u0E27\u0E49\u0E19\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14",\r
+langs:"\u0E20\u0E32\u0E29\u0E32",\r
+wait:"\u0E42\u0E1B\u0E23\u0E14\u0E23\u0E2D...",\r
+sug:"\u0E04\u0E33\u0E41\u0E19\u0E30\u0E19\u0E33",\r
+no_sug:"\u0E44\u0E21\u0E48\u0E21\u0E35\u0E04\u0E33\u0E41\u0E19\u0E30\u0E19\u0E33",\r
+no_mpell:"\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E23\u0E30\u0E1A\u0E1A\u0E2A\u0E30\u0E01\u0E14\u0E04\u0E33\u0E1C\u0E34\u0E14"\r
+},\r
+pagebreak:{\r
+desc:"\u0E43\u0E2A\u0E48\u0E40\u0E2A\u0E49\u0E19\u0E41\u0E1A\u0E48\u0E07\u0E2B\u0E19\u0E49\u0E32"\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
+}}});
\ No newline at end of file
index b41ef168383aaab0788c6764f8ceac0a5467f0cf..5716e94eaa7f1a59bded2de9f01487eb3dbbec39 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n({tr:{\r
 common:{\r
-edit_confirm:"Bu metin b\u00F6lgesi i\u00E7in WYSIWYG modunu kullanmak istiyor musunuz?",\r
+edit_confirm:"Metin giri\u015Fi i\u00E7in WYSIWYG modunu kullanmak ister misiniz?",\r
 apply:"Uygula",\r
 insert:"Ekle",\r
 update:"G\u00FCncelle",\r
@@ -8,29 +8,29 @@ cancel:"\u0130ptal",
 close:"Kapat",\r
 browse:"G\u00F6zat",\r
 class_name:"S\u0131n\u0131f",\r
-not_set:"-- se\u00E7iniz --",\r
-clipboard_msg:"Kopyala/Kes/Yap\u0131\u015Ft\u0131r Mozilla ve Firefox'ta kullan\u0131lamaz.\nBu konuda daha fazla bilgi edinmek ister misiniz?",\r
-clipboard_no_support:"\u015Eimdilik taray\u0131c\u0131n\u0131z taraf\u0131ndan desteklenmemektedir, bunun yerine k\u0131sayol tu\u015Flar\u0131n\u0131 kullan\u0131n\u0131z.",\r
-popup_blocked:"\u00DCzg\u00FCn\u00FCz, fakat popup-engelleyiciniz uygulama i\u00E7in gerekli bir pencerenin a\u00E7\u0131lmas\u0131na izin vermedi. Bu arac\u0131 tam olarak kullanabilmek i\u00E7in popup engelleyicinizi kapatman\u0131z gerekebilir.",\r
-invalid_data:"Hata: Ge\u00E7ersiz de\u011Ferler girildi, bunlar k\u0131rm\u0131z\u0131yla i\u015Faretlendi.",\r
+not_set:"-- Ayarlanmad\u0131 --",\r
+clipboard_msg:"Mozilla Firefox da Kes/Kopyala/Yap\u0131\u015Ft\u0131r \u00F6zelli\u011Fi kullan\u0131lmamaktad\u0131r. \nBu konu hakk\u0131nda bilgi almak ister misiniz?",\r
+clipboard_no_support:"\u015Eu an kulland\u0131\u011F\u0131n\u0131z taray\u0131c\u0131n\u0131z klavye k\u0131sayollar\u0131n\u0131 desteklememektedir.",\r
+popup_blocked:"\u00DCzg\u00FCn\u00FCz, a\u00E7\u0131l\u0131r pencere engelleyiciniz uygulama i\u00E7in gerekli bir pencereyi engelledi. Bu arac\u0131 tam olarak kullanabilmek i\u00E7in a\u00E7\u0131l\u0131r pencere engelleyicisini kapat\u0131n\u0131z.",\r
+invalid_data:"Hata: Invalid values entered, these are marked in red.",\r
 more_colors:"Daha fazla renk"\r
 },\r
 contextmenu:{\r
 align:"Hizalama",\r
-left:"Sola",\r
-center:"Ortala",\r
-right:"Sa\u011Fa",\r
-full:"\u0130ki yana"\r
+left:"Sol",\r
+center:"Orta",\r
+right:"Sa\u011F",\r
+full:"Tam"\r
 },\r
 insertdatetime:{\r
 date_fmt:"%d-%m-%Y",\r
 time_fmt:"%H:%M:%S",\r
 insertdate_desc:"Tarih ekle",\r
-inserttime_desc:"Zaman ekle",\r
+inserttime_desc:"Saat ekle",\r
 months_long:"Ocak,\u015Eubat,Mart,Nisan,May\u0131s,Haziran,Temmuz,A\u011Fustos,Eyl\u00FCl,Ekim,Kas\u0131m,Aral\u0131k",\r
 months_short:"Oca,\u015Eub,Mar,Nis,May,Haz,Tem,A\u011Fu,Eyl,Eki,Kas,Ara",\r
-day_long:"Pazar,Pazartesi,Sal\u0131,\u00C7ar\u015Famba,Per\u015Fembe,Cuma,Cumartesi,Pazar",\r
-day_short:"Paz,Pzt,Sal,\u00C7r\u015F,Per,Cum,Cts,Paz"\r
+day_long:"Pazar,Pazartesi,Sal\u0131,\u00C7ar\u015Famba,Per\u015Fembe,Cuma,Cumartesi",\r
+day_short:"Paz,Pzt,Sal,\u00C7r\u015F,Per,Cum,Cts"\r
 },\r
 print:{\r
 print_desc:"Yazd\u0131r"\r
@@ -39,14 +39,14 @@ preview:{
 preview_desc:"\u00D6nizleme"\r
 },\r
 directionality:{\r
-ltr_desc:"Sa\u011Fdan sola y\u00F6nelimli",\r
-rtl_desc:"Soldan sa\u011Fa y\u00F6nelimli"\r
+ltr_desc:"Sa\u011Fdan sola y\u00F6nlendir",\r
+rtl_desc:"Soldan sa\u011Fa y\u00F6nlendir"\r
 },\r
 layer:{\r
 insertlayer_desc:"Yeni katman ekle",\r
-forward_desc:"\u00D6ne al",\r
+forward_desc:"\u00D6ne getir",\r
 backward_desc:"Arkaya al",\r
-absolute_desc:"Mutlak konumland\u0131rmay\u0131 a\u00E7/kapa",\r
+absolute_desc:"Mutlaka konumu de\u011Fi\u015Ftir",\r
 content:"Yeni katman..."\r
 },\r
 save:{\r
@@ -54,10 +54,10 @@ save_desc:"Kaydet",
 cancel_desc:"T\u00FCm de\u011Fi\u015Fiklikleri iptal et"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"K\u0131r\u0131l\u0131ms\u0131z bo\u015Fluk karakteri ekle"\r
+nonbreaking_desc:"B\u00F6l\u00FCnemez bo\u015Fluk karakteri ekle"\r
 },\r
 iespell:{\r
-iespell_desc:"\u0130mla kontrol\u00FCn\u00FC \u00E7al\u0131\u015Ft\u0131r",\r
+iespell_desc:"\u0130mla kontrol\u00FCn\u00FC ba\u015Flat",\r
 download:"ieSpell bulunamad\u0131. \u015Eimdi kurmak ister misiniz?"\r
 },\r
 advhr:{\r
@@ -77,7 +77,7 @@ advlink:{
 link_desc:"Ba\u011Flant\u0131 ekle/d\u00FCzenle"\r
 },\r
 xhtmlxtras:{\r
-cite_desc:"Kaynak",\r
+cite_desc:"Al\u0131nt\u0131",\r
 abbr_desc:"K\u0131saltma",\r
 acronym_desc:"K\u0131sa ad",\r
 del_desc:"Silme",\r
@@ -85,70 +85,86 @@ ins_desc:"Ekleme",
 attribs_desc:"Nitelik ekle/d\u00FCzenle"\r
 },\r
 style:{\r
-desc:"CSS Stili D\u00FCzenle"\r
+desc:"CSS Stilini D\u00FCzenle"\r
 },\r
 paste:{\r
-paste_text_desc:"Sade Metin olarak yap\u0131\u015Ft\u0131r",\r
+paste_text_desc:"D\u00FCz metin olarak yap\u0131\u015Ft\u0131r",\r
 paste_word_desc:"Word'den yap\u0131\u015Ft\u0131r",\r
-selectall_desc:"T\u00FCm\u00FCn\u00FC Se\u00E7"\r
+selectall_desc:"T\u00FCm\u00FCn\u00FC se\u00E7",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
-text_title:"Pencereye metin yap\u0131\u015Ft\u0131rmak i\u00E7in CTRL+V tu\u015Funu kullan\u0131n\u0131z.",\r
-text_linebreaks:"Sat\u0131r k\u0131r\u0131l\u0131mlar\u0131n\u0131 koru",\r
-word_title:"Pencereye metin yap\u0131\u015Ft\u0131rmak i\u00E7in CTRL+V tu\u015Funu kullan\u0131n\u0131z."\r
+text_title:"Pencereye metin yap\u0131\u015Ft\u0131rmak i\u00E7in klavyeden CTRL+V i kullan\u0131n.",\r
+text_linebreaks:"Sat\u0131r kesmelerini tut",\r
+word_title:"Pencereye metin yap\u0131\u015Ft\u0131rmak i\u00E7in klavyeden CTRL+V i kullan\u0131n."\r
 },\r
 table:{\r
-desc:"Yeni bir tablo ekler",\r
-row_before_desc:"\u00DCst\u00FCne bir sat\u0131r ekle",\r
-row_after_desc:"Alt\u0131na bir sat\u0131r ekle",\r
-delete_row_desc:"Sat\u0131r\u0131 sil",\r
-col_before_desc:"Soluna bir kolon ekle",\r
-col_after_desc:"Sa\u011F\u0131na bir kolon ekle",\r
-delete_col_desc:"Kolonu sil",\r
-split_cells_desc:"Birle\u015Fitirilmi\u015F tablo h\u00FCcrelerini ay\u0131r",\r
+desc:"Yeni tablo ekle",\r
+row_before_desc:"\u00DCst\u00FCne sat\u0131r ekle",\r
+row_after_desc:"Alt\u0131na sat\u0131r ekle",\r
+delete_row_desc:"Sat\u0131r sil",\r
+col_before_desc:"Soluna s\u00FCtun ekle",\r
+col_after_desc:"Sa\u011F\u0131na s\u00FCtun ekle",\r
+delete_col_desc:"S\u00FCtun sil",\r
+split_cells_desc:"Birle\u015Ftirilmi\u015F tablo h\u00FCcrelerini b\u00F6l",\r
 merge_cells_desc:"Tablo h\u00FCcrelerini birle\u015Ftir",\r
 row_desc:"Tablo sat\u0131r \u00F6zellikleri",\r
-cell_desc:"Tablo h\u00FCcre \u00F6zellikler",\r
+cell_desc:"Tablo h\u00FCcre \u00F6zellikleri",\r
 props_desc:"Tablo \u00F6zellikleri",\r
-paste_row_before_desc:"\u00DCst\u00FCne tablo sat\u0131r\u0131n\u0131 yap\u0131\u015Ft\u0131r",\r
-paste_row_after_desc:"Alt\u0131na tablo sat\u0131r\u0131n\u0131 yap\u0131\u015Ft\u0131r",\r
+paste_row_before_desc:"\u00DCst\u00FCne tablo sat\u0131r\u0131 yap\u0131\u015Ft\u0131r",\r
+paste_row_after_desc:"Alt\u0131na tablo sat\u0131r\u0131 yap\u0131\u015Ft\u0131r",\r
 cut_row_desc:"Tablo sat\u0131r\u0131n\u0131 kes",\r
 copy_row_desc:"Tablo sat\u0131r\u0131n\u0131 kopyala",\r
-del:"Tabloyu sil",\r
+del:"Tablo sil",\r
 row:"Sat\u0131r",\r
-col:"Kolon",\r
+col:"S\u00FCtun",\r
 cell:"H\u00FCcre"\r
 },\r
 autosave:{\r
-unload_msg:"Bu sayfadan \u00E7\u0131karsan\u0131z yapt\u0131\u011F\u0131n\u0131z de\u011Fi\u015Fiklikler kaybedilecek."\r
+unload_msg:"Bu sayfadan \u00E7\u0131karsan\u0131z yapt\u0131\u011F\u0131n\u0131z de\u011Fi\u015Fiklikler kaybolabilir.",\r
+restore_content:"Restore auto-saved content.",\r
+warning_message:"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?."\r
 },\r
 fullscreen:{\r
-desc:"Tam ekran modunu a\u00E7/kapa"\r
+desc:"Tam ekran modunu a\u00E7/kapat"\r
 },\r
 media:{\r
-desc:"T\u00FCmle\u015Fik medya ekle/d\u00FCzenle",\r
+desc:"T\u00FCmle\u015Fik medya ekle / d\u00FCzenle",\r
 edit:"T\u00FCmle\u015Fik medya d\u00FCzenle"\r
 },\r
 fullpage:{\r
 desc:"Belge \u00F6zellikleri"\r
 },\r
 template:{\r
-desc:"\u00D6ntan\u0131ml\u0131 \u015Fablon i\u00E7eri\u011Fi ekle"\r
+desc:"\u00D6ntan\u0131ml\u0131 i\u00E7erik \u015Fablonu kullan"\r
 },\r
 visualchars:{\r
-desc:"G\u00F6rsel kontrol karakterleri a\u00E7\u0131k/kapal\u0131."\r
+desc:"G\u00F6rsel karakter kontrol\u00FC a\u00E7\u0131k/kapal\u0131."\r
 },\r
 spellchecker:{\r
-desc:"\u0130mla kontrol\u00FCn\u00FC a\u00E7/kapa",\r
-menu:"\u0130mla kontrol ayarlar\u0131",\r
-ignore_word:"S\u00F6zc\u00FC\u011F\u00FC \u00F6nemseme",\r
-ignore_words:"Hi\u00E7birini \u00F6nemseme",\r
+desc:"\u0130mla kontrol\u00FCn\u00FC a\u00E7/kapat",\r
+menu:"\u0130mla kontrol\u00FC ayarlar\u0131",\r
+ignore_word:"S\u00F6zc\u00FC\u011F\u00FC yoksay",\r
+ignore_words:"T\u00FCm\u00FCn\u00FC yoksay",\r
 langs:"Diller",\r
-wait:"L\u00FCtfen bekleyiniz...",\r
+wait:"L\u00FCtfen bekleyin...",\r
 sug:"\u00D6neriler",\r
 no_sug:"\u00D6neri yok",\r
-no_mpell:"Bir imla hatas\u0131 bulunamad\u0131."\r
+no_mpell:"\u0130mla hatas\u0131 bulunamad\u0131."\r
 },\r
 pagebreak:{\r
-desc:"Sayfa k\u0131r\u0131l\u0131m\u0131 ekle."\r
+desc:"Sayfa sonu ekle."\r
+},\r
+advlist:{\r
+types:"Types",\r
+def:"Default",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"Circle",\r
+disc:"Disc",\r
+square:"Square"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/langs/tw.js b/program/js/tiny_mce/langs/tw.js
new file mode 100644 (file)
index 0000000..bd7eff5
--- /dev/null
@@ -0,0 +1,178 @@
+tinyMCE.addI18n({tw:{\r
+common:{\r
+edit_confirm:"\u662F\u5426\u9700\u8981\u958B\u555F\u6587\u672C\u7DE8\u8F2F\u5668? ",\r
+apply:"\u61C9\u7528",\r
+insert:"\u63D2\u5165",\r
+update:"\u66F4\u65B0",\r
+cancel:"\u53D6\u6D88",\r
+close:"\u95DC\u9589",\r
+browse:"\u9810\u89BD",\r
+class_name:"\u6A23\u5F0F",\r
+not_set:"--\u672A\u8A2D\u7F6E--",\r
+clipboard_msg:"\u5F88\u62B1\u6B49\uFF0C\u60A8\u7684\u700F\u89BD\u5668\u4E0D\u652F\u63F4\u8907\u88FD\u529F\u80FD\u3002 ",\r
+clipboard_no_support:"\u60A8\u7684\u700F\u89BD\u5668\u7576\u524D\u4E0D\u652F\u63F4\u6B64\u529F\u80FD\uFF0C\u8ACB\u6309Ctrl + C\u5FEB\u6377\u9375\u4EE3\u66FF",\r
+popup_blocked:"\u60A8\u7684\u700F\u89BD\u5668\u963B\u6B62\u4E86\u6253\u958B\u65B0\u8996\u7A97\u3002\u60A8\u9700\u8981\u53D6\u6D88\u700F\u89BD\u5668\u6B64\u529F\u80FD\u4EE5\u66F4\u597D\u5730\u4F7F\u7528\u6B64\u63D2\u4EF6\u3002 ",\r
+invalid_data:"\u60A8\u8F38\u5165\u7684\u8CC7\u8A0A\u6709\u932F\u8AA4\u3002 (\u8ACB\u898B\u7D05\u8272\u90E8\u5206)",\r
+more_colors:"\u66F4\u591A\u984F\u8272"\r
+},\r
+contextmenu:{\r
+align:"\u5C0D\u9F4A\u65B9\u5F0F",\r
+left:"\u9760\u5DE6\u5C0D\u9F4A",\r
+center:"\u7F6E\u4E2D\u5C0D\u9F4A",\r
+right:"\u9760\u53F3\u5C0D\u9F4A",\r
+full:"\u5DE6\u53F3\u5C0D\u9F4A"\r
+},\r
+insertdatetime:{\r
+date_fmt:"%Y-%m-%d",\r
+time_fmt:"%H:%M:%S",\r
+insertdate_desc:"\u63D2\u5165\u65E5\u671F",\r
+inserttime_desc:"\u63D2\u5165\u6642\u9593",\r
+months_long:"\u4E00\u6708,\u4E8C\u6708,\u4E09\u6708,\u56DB\u6708,\u4E94\u6708,\u516D\u6708,\u4E03\u6708,\u516B\u6708,\u4E5D\u6708,\u5341\u6708,\u5341\u4E00\u6708,\u5341\u4E8C\u6708",\r
+months_short:"1\u6708,2\u6708,3\u6708,4\u6708,5\u6708,6\u6708,7\u6708,8\u6708,9\u6708,10\u6708,11\u6708,12\u6708",\r
+day_long:"\u661F\u671F\u65E5,\u661F\u671F\u4E00,\u661F\u671F\u4E8C,\u661F\u671F\u4E09,\u661F\u671F\u56DB,\u661F\u671F\u4E94,\u661F\u671F\u516D,\u661F\u671F\u65E5",\r
+day_short:"\u5468\u65E5,\u9031\u4E00,\u9031\u4E8C,\u9031\u4E09,\u9031\u56DB,\u9031\u4E94,\u9031\u516D,\u5468\u65E5"\r
+},\r
+print:{\r
+print_desc:"\u5217\u5370"\r
+},\r
+preview:{\r
+preview_desc:"\u9810\u89BD"\r
+},\r
+directionality:{\r
+ltr_desc:"\u7531\u5DE6\u5230\u53F3",\r
+rtl_desc:"\u7531\u53F3\u5230\u5DE6"\r
+},\r
+layer:{\r
+insertlayer_desc:"\u63D2\u5165DIV\u5716\u5C64",\r
+forward_desc:"\u7F6E\u524D",\r
+backward_desc:"\u7F6E\u5F8C",\r
+absolute_desc:"\u6539\u8B8A\u5C64\u7D55\u5C0D\u4F4D\u7F6E",\r
+content:"\u65B0\u589EDIV\u5716\u5C64"\r
+},\r
+save:{\r
+save_desc:"\u4FDD\u5B58",\r
+cancel_desc:"\u53D6\u6D88\u6240\u6709\u66F4\u6539"\r
+},\r
+nonbreaking:{\r
+nonbreaking_desc:"\u63D2\u5165\u7A7A\u767D\u683C"\r
+},\r
+iespell:{\r
+iespell_desc:"\u62FC\u5B57\u8207\u8A9E\u6CD5\u6AA2\u67E5",\r
+download:"\u63D2\u4EF6\u5C1A\u672A\u5B89\u88DD\uFF0C\u662F\u5426\u9700\u8981\u7ACB\u5373\u5B89\u88DD\uFF1F "\r
+},\r
+advhr:{\r
+advhr_desc:"\u6C34\u5E73\u7DDA"\r
+},\r
+emotions:{\r
+emotions_desc:"\u8868\u60C5"\r
+},\r
+searchreplace:{\r
+search_desc:"\u5C0B\u627E",\r
+replace_desc:"\u5C0B\u627E/\u53D6\u4EE3"\r
+},\r
+advimage:{\r
+image_desc:"\u63D2\u5165/\u7DE8\u8F2F\u5716\u7247"\r
+},\r
+advlink:{\r
+link_desc:"\u63D2\u5165/\u7DE8\u8F2F\u93C8\u7D50"\r
+},\r
+xhtmlxtras:{\r
+cite_desc:"\u5F15\u7528",\r
+abbr_desc:"\u7E2E\u7565\u8A5E ",\r
+acronym_desc:"\u9996\u5B57\u7E2E\u7565\u8A5E",\r
+del_desc:"\u522A\u9664",\r
+ins_desc:"\u63D2\u5165",\r
+attribs_desc:"\u63D2\u5165/\u7DE8\u8F2F\u5C6C\u6027",\r
+attribs_delta_width:"40",\r
+attribs_delta_height:"60"\r
+},\r
+style:{\r
+desc:"\u7DE8\u8F2F CSS"\r
+},\r
+paste:{\r
+paste_text_desc:"\u4EE5\u7D14\u6587\u672C\u8CBC\u4E0A\u8CC7\u6599",\r
+paste_word_desc:"\u5F9EWord \u8CBC\u4E0A\u8CC7\u6599",\r
+selectall_desc:"\u5168\u9078",\r
+plaintext_mode_sticky:"\u7576\u524D\u70BA\u7C21\u55AE\u6587\u672C\u8CBC\u4E0A\u6A21\u5F0F\uFF0C\u518D\u9EDE\u64CA\u4E00\u6B21\u5207\u63DB\u56DE\u4E00\u822C\u8CBC\u4E0A\u6A21\u5F0F\u3002\u5728\u4F60\u8CBC\u4E0A\u5F8C\u6703\u56DE\u5230\u4E00\u822C\u8CBC\u4E0A\u6A21\u5F0F\u3002 ",\r
+plaintext_mode:"\u7576\u524D\u70BA\u7C21\u55AE\u6587\u672C\u8CBC\u4E0A\u6A21\u5F0F\uFF0C\u518D\u9EDE\u64CA\u4E00\u6B21\u5207\u63DB\u56DE\u4E00\u822C\u8CBC\u4E0A\u6A21\u5F0F\u3002 "\r
+},\r
+paste_dlg:{\r
+text_title:"\u5728\u9375\u76E4\u4E0A\u540C\u6642\u6309\u4E0BCtrl \u548CV \u9375\uFF0C\u5C07\u6587\u5B57\u8CBC\u4E0A\u5230\u6B64\u8996\u7A97\u3002 ",\r
+text_linebreaks:"\u4FDD\u7559\u63DB\u884C\u7B26",\r
+word_title:"\u5728\u9375\u76E4\u4E0A\u540C\u6642\u6309\u4E0BCtrl \u548CV \u9375\uFF0C\u5C07\u6587\u5B57\u8CBC\u4E0A\u5230\u6B64\u8996\u7A97\u3002 "\r
+},\r
+table:{\r
+desc:"\u63D2\u5165\u8868\u683C",\r
+row_before_desc:"\u4E0A\u65B9\u63D2\u5165\u4E00\u6B04",\r
+row_after_desc:"\u4E0B\u65B9\u63D2\u5165\u4E00\u6B04",\r
+delete_row_desc:"\u522A\u9664\u4E00\u6B04",\r
+col_before_desc:"\u5DE6\u65B9\u63D2\u5165\u4E00\u5217",\r
+col_after_desc:"\u53F3\u65B9\u63D2\u5165\u4E00\u5217",\r
+delete_col_desc:"\u522A\u9664\u4E00\u5217",\r
+split_cells_desc:"\u5206\u5272\u8868\u683C",\r
+merge_cells_desc:"\u5408\u4F75\u8868\u683C",\r
+row_desc:"\u5217\u5C6C\u6027",\r
+cell_desc:"\u8868\u683C\u5C6C\u6027",\r
+props_desc:"\u6B04\u5C6C\u6027",\r
+paste_row_before_desc:"\u7C98\u8CBC\u5230\u4E0A\u65B9",\r
+paste_row_after_desc:"\u7C98\u8CBC\u5230\u4E0B\u65B9",\r
+cut_row_desc:"\u526A\u5207\u7576\u524D\u8868\u683C",\r
+copy_row_desc:"\u8907\u88FD\u7576\u524D\u8868\u683C",\r
+del:"\u522A\u9664\u8868\u683C",\r
+row:"\u6B04",\r
+col:"\u5217",\r
+cell:"\u8868\u683C",\r
+cellprops_delta_width:"10",\r
+cellprops_delta_height:"10",\r
+table_delta_width:"40",\r
+table_delta_height:"60",\r
+merge_cells_delta_width:"40",\r
+merge_cells_delta_height:"40"\r
+},\r
+autosave:{\r
+unload_msg:"\u60A8\u5C1A\u672A\u4FDD\u5B58\u8CC7\u6599\uFF0C\u60A8\u8F38\u5165\u7684\u8CC7\u6599\u6709\u53EF\u80FD\u6703\u6D88\u5931\u2026",\r
+restore_content:"\u6062\u5FA9\u81EA\u52D5\u4FDD\u5B58\u7684\u5167\u5BB9\u3002 ",\r
+warning_message:"\u5982\u679C\u6062\u5FA9\u5148\u524D\u4FDD\u5B58\u7684\u5167\u5BB9\uFF0C\u4F60\u5C07\u5931\u53BB\u7DE8\u8F2F\u5668\u4E2D\u73FE\u6709\u7684\u5167\u5BB9\u3002 \n\n\u4F60\u78BA\u5B9A\u8981\u6062\u5FA9\u5148\u524D\u4FDD\u5B58\u7684\u5167\u5BB9\u55CE\uFF1F "\r
+},\r
+fullscreen:{\r
+desc:"\u5168\u5C4F\u986F\u793A"\r
+},\r
+media:{\r
+desc:"\u63D2\u5165/\u7DE8\u8F2F\u591A\u5A92\u9AD4",\r
+edit:"\u7DE8\u8F2F\u591A\u5A92\u9AD4"\r
+},\r
+fullpage:{\r
+desc:"\u6A94\u5C6C\u6027"\r
+},\r
+template:{\r
+desc:"\u4F7F\u7528\u7BC4\u672C"\r
+},\r
+visualchars:{\r
+desc:"\u986F\u793A\u63A7\u5236\u7B26\u865F"\r
+},\r
+spellchecker:{\r
+desc:"\u82F1\u6587\u62FC\u5B57\u6AA2\u67E5",\r
+menu:"\u8A2D\u5B9A",\r
+ignore_word:"\u5FFD\u7565",\r
+ignore_words:"\u5168\u90E8\u5FFD\u7565",\r
+langs:"\u8A9E\u8A00",\r
+wait:"\u8ACB\u7A0D\u5019\u3002 ",\r
+sug:"\u5EFA\u8B70",\r
+no_sug:"\u6C92\u6709\u5EFA\u8B70\u2026",\r
+no_mpell:"\u672A\u767C\u73FE\u932F\u8AA4"\r
+},\r
+pagebreak:{\r
+desc:"\u63D2\u5165\u5206\u9801\u7B26\u865F"\r
+},\r
+advlist:{\r
+types:"\u6A23\u5F0F",\r
+def:"\u9810\u8A2D",\r
+lower_alpha:"\u5C0F\u5BEB\u7684\u82F1\u6587\u5B57",\r
+lower_greek:"\u5C0F\u5BEB\u7684\u5E0C\u81D8\u6587",\r
+lower_roman:"\u5C0F\u5BEB\u7684\u7F85\u99AC\u6578\u5B57",\r
+upper_alpha:"\u5927\u5BEB\u7684\u82F1\u6587\u5B57",\r
+upper_roman:"\u5927\u5BEB\u7684\u7F85\u99AC\u6578\u5B57",\r
+circle:"\u5713\u5708",\r
+disc:"\u9ED1\u9EDE",\r
+square:"\u65B9\u584A"\r
+}}});
\ No newline at end of file
index deb92f7ba79c9535e9e9cd9713e9a0e9c8b7ace5..136fcd9a5efc8b3e59eb31aceeab2524d3e45ccf 100755 (executable)
@@ -10,8 +10,8 @@ browse:"\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434",
 class_name:"\u041A\u043B\u0430\u0441",\r
 not_set:"-- \u043D\u0435 \u0432\u0438\u0431\u0440\u0430\u043D\u043E --",\r
 clipboard_msg:"\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438/\u0412\u0438\u0440\u0456\u0437\u0430\u0442\u0438/\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0432 Mozilla \u0442\u0430 Firefox.\n\u0412\u0430\u043C \u0446\u0456\u043A\u0430\u0432\u0430 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F \u043F\u0440\u043E \u0446\u0435?",\r
-clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.",\r
-popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.",\r
+clipboard_no_support:"\u041D\u0430\u0440\u0430\u0437\u0456 \u0446\u044F \u0444\u0443\u043D\u043A\u0446\u0456\u044F \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0432 \u0432\u0430\u0448\u043E\u043C\u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0456, \u0430\u043B\u0435 \u0432\u0438 \u043C\u043E\u0436\u0435\u0442\u0435 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u043A\u043B\u0430\u0432\u0456\u0430\u0442\u0443\u0440\u0443 \u0437\u0430\u043C\u0456\u0441\u0442\u044C \u0446\u044C\u043E\u0433\u043E.",\r
+popup_blocked:"\u0414\u0443\u0436\u0435 \u043F\u0440\u0438\u043A\u0440\u043E, \u0430\u043B\u0435 \u0432\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0437\u0430\u0431\u043B\u043E\u043A\u0443\u0432\u0430\u0432 \u0432\u0438\u0440\u0438\u043D\u0430\u044E\u0447\u0435 \u0432\u0456\u043A\u043D\u043E. \u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0439\u0442\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0442\u0430\u043A, \u0449\u043E\u0431 \u0432\u0456\u043D \u0434\u043E\u0437\u0432\u043E\u043B\u044F\u0432 \u0432\u0438\u0440\u0438\u043D\u0430\u044E\u0447\u0456 \u0432\u0456\u043A\u043D\u0430 \u0437 \u0446\u044C\u043E\u0433\u043E \u0441\u0430\u0439\u0442\u0443.",\r
 invalid_data:"\u041F\u043E\u043C\u0438\u043B\u043A\u0430: \u0412\u0432\u0435\u0434\u0435\u043D\u043E \u043F\u043E\u043C\u0438\u043B\u043A\u043E\u0432\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F, \u0432\u0456\u0434\u043C\u0456\u0447\u0435\u043D\u0435 \u0447\u0435\u0440\u0432\u043E\u043D\u0438\u043C.",\r
 more_colors:"\u0411\u0456\u043B\u044C\u0448\u0435 \u043A\u043E\u043B\u044C\u043E\u0440\u0456\u0432"\r
 },\r
@@ -33,32 +33,32 @@ day_long:"\u041D\u0435\u0434\u0456\u043B\u044F,\u041F\u043E\u043D\u0435\u0434\u0
 day_short:"\u041D\u0434,\u041F\u043D,\u0412\u0442,\u0421\u0440,\u0427\u0442,\u041F\u0442,\u0421\u0431,\u041D\u0434"\r
 },\r
 print:{\r
-print_desc:"\u0414\u0440\u0443\u043A"\r
+print_desc:"\u0414\u0440\u0443\u043A\u0443\u0432\u0430\u0442\u0438"\r
 },\r
 preview:{\r
 preview_desc:"\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434"\r
 },\r
 directionality:{\r
-ltr_desc:"\u041D\u0430\u043F\u0440\u044F\u043C \u0437\u043B\u0456\u0432\u0430 \u043F\u0440\u0430\u0432\u043E\u0440\u0443\u0447",\r
-rtl_desc:"\u041D\u0430\u043F\u0440\u044F\u043C \u0441\u043F\u0440\u0430\u0432\u0430 \u043B\u0456\u0432\u043E\u0440\u0443\u0447"\r
+ltr_desc:"\u041D\u0430\u043F\u0440\u044F\u043C \u0437\u043B\u0456\u0432\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u043E",\r
+rtl_desc:"\u041D\u0430\u043F\u0440\u044F\u043C \u0441\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0456\u0432\u043E"\r
 },\r
 layer:{\r
-insertlayer_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043D\u043E\u0432\u0438\u0439 \u0441\u043B\u043E\u0439",\r
-forward_desc:"\u041F\u0435\u0440\u0435\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u0432\u0433\u043E\u0440\u0443",\r
+insertlayer_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043D\u043E\u0432\u0438\u0439 \u043F\u0440\u043E\u0448\u0430\u0440\u043E\u043A",\r
+forward_desc:"\u041F\u0435\u0440\u0435\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u0432\u043F\u0435\u0440\u0435\u0434",\r
 backward_desc:"\u041F\u0435\u0440\u0435\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u043D\u0430\u0437\u0430\u0434",\r
-absolute_desc:"Toggle absolute positioning",\r
-content:"\u041D\u043E\u0432\u0438\u0439 \u0441\u043B\u043E\u0439..."\r
+absolute_desc:"\u041F\u0435\u0440\u0435\u043C\u0438\u043A\u043D\u0443\u0442\u0438 \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u0435 \u043F\u043E\u0437\u0438\u0446\u0456\u044E\u0432\u0430\u043D\u043D\u044F",\r
+content:"\u041D\u043E\u0432\u0438\u0439 \u043F\u0440\u043E\u0448\u0430\u0440\u043E\u043A..."\r
 },\r
 save:{\r
 save_desc:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438",\r
 cancel_desc:"\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438 \u0432\u0441\u0456 \u0437\u043C\u0456\u043D\u0438"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043D\u0435\u0440\u043E\u0437\u0440\u0438\u0432\u043D\u0438\u0439 \u043F\u0440\u043E\u0431\u0456\u043B"\r
+nonbreaking_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043D\u0435\u0440\u043E\u0437\u0440\u0438\u0432\u043D\u0438\u0439 \u043F\u0440\u043E\u043C\u0456\u0436\u043E\u043A"\r
 },\r
 iespell:{\r
-iespell_desc:"\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0438 \u043E\u0440\u0444\u043E\u0433\u0440\u0430\u0444\u0456\u044E",\r
-download:"ieSpell \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E. \u0411\u0430\u0436\u0430\u0454\u0442\u0435 \u043F\u0440\u043E\u0456\u043D\u0441\u0442\u0430\u043B\u044E\u0432\u0430\u0442\u0438?"\r
+iespell_desc:"\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0438 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 \u043E\u0440\u0444\u043E\u0433\u0440\u0430\u0444\u0456\u0457",\r
+download:"\u0414\u043E\u0434\u0430\u0442\u043E\u043A ieSpell \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E. \u0411\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438?"\r
 },\r
 advhr:{\r
 advhr_desc:"\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0438\u0439 \u0440\u043E\u0437\u0434\u0456\u043B\u044C\u043D\u0438\u043A"\r
@@ -67,8 +67,8 @@ emotions:{
 emotions_desc:"\u0421\u043C\u0430\u0439\u043B\u0438"\r
 },\r
 searchreplace:{\r
-search_desc:"\u0417\u043D\u0430\u0439\u0442\u0438",\r
-replace_desc:"\u0417\u043D\u0430\u0439\u0442\u0438/\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438"\r
+search_desc:"\u0428\u0443\u043A\u0430\u0442\u0438",\r
+replace_desc:"\u0428\u0443\u043A\u0430\u0442\u0438/\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438"\r
 },\r
 advimage:{\r
 image_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438/\u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F",\r
@@ -79,11 +79,11 @@ link_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438/\u0437\u043C\u0456\u
 delta_width:"200"\r
 },\r
 xhtmlxtras:{\r
-cite_desc:"Citation",\r
-abbr_desc:"Abbreviation",\r
-acronym_desc:"Acronym",\r
-del_desc:"Deletion",\r
-ins_desc:"Insertion",\r
+cite_desc:"\u0426\u0438\u0442\u0430\u0442\u0430",\r
+abbr_desc:"\u0410\u0431\u0440\u0435\u0432\u0456\u0430\u0442\u0443\u0440\u0430",\r
+acronym_desc:"\u0410\u043A\u0440\u043E\u043D\u0456\u043C",\r
+del_desc:"\u0412\u0438\u0434\u0430\u043B\u0435\u043D\u043D\u044F",\r
+ins_desc:"\u0412\u0441\u0442\u0430\u0432\u043A\u0430",\r
 attribs_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438/\u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438"\r
 },\r
 style:{\r
@@ -92,11 +92,13 @@ desc:"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 CSS \u0441\u0
 paste:{\r
 paste_text_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u044F\u043A \u0442\u0435\u043A\u0441\u0442",\r
 paste_word_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0437 Word",\r
-selectall_desc:"\u0412\u0438\u0434\u0456\u043B\u0438\u0442\u0438 \u0432\u0441\u0435"\r
+selectall_desc:"\u0412\u0438\u0434\u0456\u043B\u0438\u0442\u0438 \u0432\u0441\u0435",\r
+plaintext_mode_sticky:"\u0412 \u0434\u0430\u043D\u0438\u0439 \u0447\u0430\u0441 \u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u0432 \u0440\u0435\u0436\u0438\u043C\u0456 \u0437\u0432\u0438\u0447\u0430\u0439\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0443. \u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C \u0437\u043D\u043E\u0432\u0443 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u043C\u0438\u043A\u0430\u043D\u043D\u044F \u043D\u0430\u0437\u0430\u0434 \u0432 \u0437\u0432\u0438\u0447\u0430\u0439\u043D\u0438\u0439 \u0440\u0435\u0436\u0438\u043C \u0412\u0441\u0442\u0430\u0432\u043A\u0438.. \u041F\u0456\u0441\u043B\u044F \u0442\u043E\u0433\u043E, \u044F\u043A \u0412\u0438 \u0449\u043E-\u043D\u0435\u0431\u0443\u0434\u044C \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0435, \u0412\u0438 \u043F\u043E\u0432\u0435\u0440\u043D\u0435\u0442\u0435\u0441\u044C \u0432 \u0437\u0432\u0438\u0447\u0430\u0439\u043D\u043C\u0439 \u0440\u0435\u0436\u0438\u043C \u0412\u0441\u0442\u0430\u0432\u043A\u0438.",\r
+plaintext_mode:"\u0412 \u0434\u0430\u043D\u0438\u0439 \u0447\u0430\u0441 \u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u0432 \u0440\u0435\u0436\u0438\u043C\u0456 \u0437\u0432\u0438\u0447\u0430\u0439\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0443. \u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C \u0437\u043D\u043E\u0432\u0443 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u043C\u0438\u043A\u0430\u043D\u043D\u044F \u043D\u0430\u0437\u0430\u0434 \u0432 \u0437\u0432\u0438\u0447\u0430\u0439\u043D\u0438\u0439 \u0440\u0435\u0436\u0438\u043C \u0412\u0441\u0442\u0430\u0432\u043A\u0438."\r
 },\r
 paste_dlg:{\r
 text_title:"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u0443 \u0443 \u0432\u0456\u043A\u043D\u043E.",\r
-text_linebreaks:"\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u044B \u0441\u0442\u0440\u043E\u043A",\r
+text_linebreaks:"\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438 \u0440\u044F\u0434\u043A\u0456\u0432",\r
 word_title:"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u0443 \u0443 \u0432\u0456\u043A\u043D\u043E."\r
 },\r
 table:{\r
@@ -104,9 +106,9 @@ desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043D\u043E\u0432\u0443
 row_before_desc:"\u0414\u043E\u0434\u0430\u0442\u0438 \u0440\u044F\u0434\u043E\u043A \u0434\u043E",\r
 row_after_desc:"\u0414\u043E\u0434\u0430\u0442\u0438 \u0440\u044F\u0434\u043E\u043A \u043F\u0456\u0441\u043B\u044F",\r
 delete_row_desc:"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0440\u044F\u0434\u043E\u043A",\r
-col_before_desc:"\u0414\u043E\u0434\u0430\u0442\u0438 \u0441\u0442\u043E\u0432\u0431\u0435\u0446\u044C \u0434\u043E",\r
-col_after_desc:"\u0414\u043E\u0434\u0430\u0442\u0438 \u0441\u0442\u043E\u0432\u0431\u0435\u0446\u044C \u043F\u0456\u0441\u043B\u044F",\r
-delete_col_desc:"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0441\u0442\u043E\u0432\u0431\u0435\u0446\u044C",\r
+col_before_desc:"\u0414\u043E\u0434\u0430\u0442\u0438 \u0441\u0442\u043E\u0432\u043F\u0435\u0446\u044C \u0434\u043E",\r
+col_after_desc:"\u0414\u043E\u0434\u0430\u0442\u0438 \u0441\u0442\u043E\u0432\u043F\u0435\u0446\u044C \u043F\u0456\u0441\u043B\u044F",\r
+delete_col_desc:"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0441\u0442\u043E\u0432\u043F\u0435\u0446\u044C",\r
 split_cells_desc:"\u0420\u043E\u0437\u0434\u0456\u043B\u0438\u0442\u0438 \u043A\u043E\u043C\u0456\u0440\u043A\u0438",\r
 merge_cells_desc:"\u041E\u0431'\u0454\u0434\u043D\u0430\u0442\u0438 \u043A\u043E\u043C\u0456\u0440\u043A\u0438",\r
 row_desc:"\u0412\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456 \u0440\u044F\u0434\u043A\u0443 \u0442\u0430\u0431\u043B\u0438\u0446\u0456",\r
@@ -118,19 +120,21 @@ cut_row_desc:"\u0412\u0438\u0440\u0456\u0437\u0430\u0442\u0438 \u0440\u044F\u043
 copy_row_desc:"\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u0440\u044F\u0434\u043E\u043A \u0442\u0430\u0431\u043B\u0438\u0446\u0456",\r
 del:"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044E",\r
 row:"\u0420\u044F\u0434\u043E\u043A",\r
-col:"\u0421\u0442\u043E\u0432\u0431\u0435\u0446\u044C",\r
+col:"\u0421\u0442\u043E\u0432\u043F\u0435\u0446\u044C",\r
 cell:"\u041A\u043E\u043C\u0456\u0440\u043A\u0430",\r
 cellprops_delta_width:"30"\r
 },\r
 autosave:{\r
-unload_msg:"\u0417\u043C\u0456\u043D\u0438, \u044F\u043A\u0456 \u0432\u0438 \u0437\u0440\u043E\u0431\u0438\u043B\u0438, \u0431\u0443\u0434\u0443\u0442\u044C \u0432\u0442\u0440\u0430\u0447\u0435\u043D\u0456, \u044F\u043A\u0449\u043E \u0432\u0438 \u043F\u0435\u0440\u0435\u0439\u0434\u0435\u0442\u0435 \u0437 \u0446\u0456\u0454\u0457 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438."\r
+unload_msg:"\u0417\u043C\u0456\u043D\u0438, \u044F\u043A\u0456 \u0432\u0438 \u0437\u0440\u043E\u0431\u0438\u043B\u0438, \u0431\u0443\u0434\u0443\u0442\u044C \u0432\u0442\u0440\u0430\u0447\u0435\u043D\u0456, \u044F\u043A\u0449\u043E \u0432\u0438 \u043F\u0435\u0440\u0435\u0439\u0434\u0435\u0442\u0435 \u0437 \u0446\u0456\u0454\u0457 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438.",\r
+restore_content:"\u0412\u0456\u0434\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043E\u0433\u043E \u0432\u043C\u0456\u0441\u0442\u0443.",\r
+warning_message:"\u042F\u043A\u0449\u043E \u0432\u0456\u0434\u043D\u043E\u0432\u0438\u0442\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0438\u0439 \u0432\u043C\u0456\u0441\u0442, \u0442\u043E \u0432\u0438 \u0432\u0442\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u0435\u0441\u044C \u0432\u043C\u0456\u0441\u0442, \u044F\u043A\u0438\u0439 \u0432 \u0434\u0430\u043D\u0438\u0439 \u0447\u0430\u0441 \u0437\u043D\u0430\u0445\u043E\u0434\u0438\u0442\u044C\u0441\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0456. \n\n\u0412\u0438 \u0432\u043F\u0435\u0432\u043D\u0435\u043D\u0456, \u0449\u043E \u0445\u043E\u0447\u0435\u0442\u0435 \u0432\u0456\u0434\u043D\u043E\u0432\u0438\u0442\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0438\u0439 \u0437\u043C\u0456\u0441\u0442?."\r
 },\r
 fullscreen:{\r
-desc:"\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u043D\u0430 \u0432\u0435\u0441\u044C \u0435\u043A\u0440\u0430\u043D"\r
+desc:"\u041F\u0435\u0440\u0435\u043C\u043A\u043D\u0443\u0442\u0438 \u043D\u0430 \u0432\u0435\u0441\u044C \u0435\u043A\u0440\u0430\u043D"\r
 },\r
 media:{\r
-desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 / \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 embedded media",\r
-edit:"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 embedded media"\r
+desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 / \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0432\u0431\u0443\u0434\u043E\u0432\u0430\u043D\u0456 \u043C\u0435\u0434\u0456\u0430",\r
+edit:"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0432\u0431\u0443\u0434\u043E\u0432\u0430\u043D\u0456 \u043C\u0435\u0434\u0456\u0430"\r
 },\r
 fullpage:{\r
 desc:"\u0412\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430"\r
@@ -139,19 +143,31 @@ template:{
 desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0448\u0430\u0431\u043B\u043E\u043D\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442"\r
 },\r
 visualchars:{\r
-desc:"Visual control characters on/off."\r
+desc:"\u0412\u0456\u0437\u0443\u0430\u043B\u044C\u043D\u0438\u0439 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432 \u0432\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043D\u044F / \u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043D\u044F."\r
 },\r
 spellchecker:{\r
 desc:"\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443",\r
-menu:"\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438",\r
+menu:"\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438",\r
 ignore_word:"\u0406\u0433\u043D\u043E\u0440\u0443\u0432\u0430\u0442\u0438 \u0441\u043B\u043E\u0432\u043E",\r
 ignore_words:"\u0406\u0433\u043D\u043E\u0440\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0435",\r
 langs:"\u041C\u043E\u0432\u0438",\r
-wait:"\u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430 \u0437\u0430\u0447\u0435\u043A\u0430\u0439\u0442\u0435...",\r
+wait:"\u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u0437\u0430\u0447\u0435\u043A\u0430\u0439\u0442\u0435...",\r
 sug:"\u0412\u0430\u0440\u0456\u0430\u043D\u0442\u0438",\r
 no_sug:"\u041D\u0435\u043C\u0430\u0454 \u0432\u0430\u0440\u0456\u0430\u043D\u0442\u0456\u0432",\r
 no_mpell:"\u041F\u043E\u043C\u0438\u043B\u043E\u043A \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E."\r
 },\r
 pagebreak:{\r
 desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0440\u043E\u0437\u0434\u0456\u043B\u044C\u043D\u0438\u043A \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438."\r
+},\r
+advlist:{\r
+types:"\u0422\u0438\u043F\u0438",\r
+def:"\u0417\u0430 \u0437\u0430\u043C\u043E\u0432\u0447\u0430\u043D\u043D\u044F\u043C",\r
+lower_alpha:"Lower alpha",\r
+lower_greek:"Lower greek",\r
+lower_roman:"Lower roman",\r
+upper_alpha:"Upper alpha",\r
+upper_roman:"Upper roman",\r
+circle:"\u041A\u043E\u043B\u043E",\r
+disc:"\u0414\u0438\u0441\u043A",\r
+square:"\u041A\u0432\u0430\u0434\u0440\u0430\u0442"\r
 }}});
\ No newline at end of file
index 303b2f77e1a7a622ceeb965dc0083b526054d57d..5bcee0e9b5fe9871c4da96bf68ede4bc61bc7a3e 100755 (executable)
@@ -1,36 +1,36 @@
 tinyMCE.addI18n({vi:{\r
 common:{\r
-edit_confirm:"B\u1EA1n c\u00F3 mu\u1ED1n s\u1EED d\u1EE5ng ch\u1EBF \u0111\u1ED9 nh\u1EADp li\u1EC7u WYSIWYG cho \u00F4 d\u1EEF li\u1EC7u n\u00E0y kh\u00F4ng?",\r
-apply:"\u00C1p d\u1EE5ng",\r
-insert:"Ch\u00E8n",\r
+edit_confirm:"B\u1EA1n c\u00F3 mu\u1ED1n s\u1EED d\u1EE5ng ch\u1EBF \u0111\u1ED9 WYSIWYG cho textarea n\u00E0y?",\r
+apply:"Thay \u0111\u1ED5i",\r
+insert:"Th\u00EAm",\r
 update:"C\u1EADp nh\u1EADt",\r
-cancel:"H\u1EE7y",\r
-close:"\u0110\u00F3ng",\r
-browse:"M\u1EDF",\r
+cancel:"H\u1EE7y b\u1ECF",\r
+close:"Tho\u00E1t",\r
+browse:"T\u00ECm",\r
 class_name:"L\u1EDBp",\r
-not_set:"-- mac dinh ch\u1ECDn --",\r
-clipboard_msg:"Sao ch\u00E9p/C\u1EAFt/D\u00E1n kh\u00F4ng ho\u1EA1t \u0111\u1ED9ng tr\u00EAn Mozilla v\u00E0 Firefox.\nB\u1EA1n mu\u1ED1n xem th\u00EAm th\u00F4ng tin v\u1EC1 v\u1EA5n \u0111\u1EC1 n\u00E0y?",\r
-clipboard_no_support:"Hi\u1EC7n kh\u00F4ng h\u1ED5 tr\u1EE3 cho tr\u00ECnh duy\u1EC7t c\u1EE7a b\u1EA1n, vui l\u00F2ng s\u1EED d\u1EE5ng b\u00E0n ph\u00EDm.",\r
-popup_blocked:"Xin l\u1ED7i, nh\u01B0ng tr\u00ECnh duy\u1EC7t c\u1EE7a b\u1EA1n kh\u00F4ng cho ph\u00E9p m\u1EDF c\u1EEDa s\u1ED5 m\u1EDBi (popup). B\u1EA1n c\u1EA7n ph\u1EA3i \u0111i\u1EC1u ch\u1EC9nh tr\u00ECnh duy\u1EC7t cho ph\u00E9p m\u1EDF c\u1EEDa s\u1ED5 m\u1EDBi \u0111\u1EC3 t\u1EADn h\u01B0\u1EDFng \u0111\u1EA7y \u0111\u1EE7 ch\u1EE9c n\u0103ng c\u1EE7a c\u00F4ng c\u1EE5 n\u00E0y.",\r
-invalid_data:"L\u1ED7i: D\u1EEF li\u1EC7u kh\u00F4ng h\u1EE3p l\u1EC7, ch\u00FAng \u0111\u00E3 \u0111\u01B0\u1EE3c \u0111\u00E1nh d\u1EA5u m\u00E0u \u0111\u1ECF.",\r
-more_colors:"Nhi\u1EC1u m\u00E0u h\u01A1n"\r
+not_set:"-- Ch\u01B0a \u0111\u1EB7t --",\r
+clipboard_msg:"Copy/Cut/Paste kh\u00F4ng \u0111\u01B0\u1EE3c h\u1ED7 tr\u1EE3 trong tr\u00ECnh duy\u1EC7t web n\u00E0y.\nB\u1EA1n c\u00F3 mu\u1ED1n bi\u1EBFt th\u00EAm th\u00F4ng tin v\u1EC1 v\u1EA5n \u0111\u1EC1 n\u00E0y kh\u00F4ng??",\r
+clipboard_no_support:"S\u1EED d\u1EE5ng ph\u00EDm t\u1EAFt kh\u00F4ng \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng trong tr\u00ECnh duy\u1EC7t hi\u1EC7n t\u1EA1i.",\r
+popup_blocked:"Xin l\u1ED7i, Nh\u01B0ng ch\u1EBF \u0111\u1ED9 c\u1EEDa s\u1ED5 popup \u0111\u00E3 b\u1ECB v\u00F4 hi\u1EC7u ho\u00E1. B\u1EA1n s\u1EBD c\u1EA7n ph\u1EA3i t\u1EAFt ch\u1EE9c n\u0103ng ch\u1EB7n popup tr\u00EAn trang web n\u00E0y \u0111\u1EC3 s\u1EED d\u1EE5ng c\u00F4ng c\u1EE5 n\u00E0y ho\u00E0n to\u00E0n.",\r
+invalid_data:"L\u1ED7i: Gi\u00E1 tr\u1ECB nh\u1EADp v\u00E0o kh\u00F4ng h\u1EE3p l\u1EC7. (\u0110\u01B0\u1EE3c \u0111\u00E1nh d\u1EA5u \u0111\u1ECF)",\r
+more_colors:"M\u00E0u kh\u00E1c"\r
 },\r
 contextmenu:{\r
-align:"C\u0103n l\u1EC1",\r
+align:"Canh l\u1EC1",\r
 left:"Tr\u00E1i",\r
 center:"Gi\u1EEFa",\r
 right:"Ph\u1EA3i",\r
-full:"\u0110\u1EC1u"\r
+full:"\u0110\u1EA7y"\r
 },\r
 insertdatetime:{\r
-date_fmt:"%d/%m/%Y",\r
+date_fmt:"%Y-%m-%d",\r
 time_fmt:"%H:%M:%S",\r
 insertdate_desc:"Ch\u00E8n ng\u00E0y",\r
 inserttime_desc:"Ch\u00E8n gi\u1EDD",\r
 months_long:"Th\u00E1ng M\u1ED9t,Th\u00E1ng Hai,Th\u00E1ng Ba,Th\u00E1ng T\u01B0,Th\u00E1ng N\u0103m,Th\u00E1ng S\u00E1u,Th\u00E1ng B\u1EA3y,Th\u00E1ng T\u00E1m,Th\u00E1ng Ch\u00EDn,Th\u00E1ng M\u01B0\u1EDDi,Th\u00E1ng M\u01B0\u1EDDi M\u1ED9t,Th\u00E1ng M\u01B0\u1EDDi Hai",\r
-months_short:"M\u1ED9t,Hai,Ba,T\u01B0,N\u0103m,S\u00E1u,B\u1EA3y,T\u00E1m,Ch\u00EDn,M\u01B0\u1EDDi,M.M\u1ED9t,M.Hai",\r
+months_short:"Thg1,Thg2,Thg3,Thg4,Thg5,Thg6,Thg7,Thg8,Thg9,Th10,Th11,Th12",\r
 day_long:"Ch\u1EE7 Nh\u1EADt,Th\u1EE9 Hai,Th\u1EE9 Ba,Th\u1EE9 T\u01B0,Th\u1EE9 N\u0103m,Th\u1EE9 S\u00E1u,Th\u1EE9 B\u1EA3y,Ch\u1EE7 Nh\u1EADt",\r
-day_short:"CN,Hai,Ba,T\u01B0,N\u0103m,S\u00E1u,B\u1EA3y,CN"\r
+day_short:"CN,T2,T3,T4,T5,T6,T7,CN"\r
 },\r
 print:{\r
 print_desc:"In"\r
@@ -39,116 +39,132 @@ preview:{
 preview_desc:"Xem tr\u01B0\u1EDBc"\r
 },\r
 directionality:{\r
-ltr_desc:"Direction left to right",\r
-rtl_desc:"Direction right to left"\r
+ltr_desc:"H\u01B0\u1EDBng tr\u00E1i qua ph\u1EA3i",\r
+rtl_desc:"H\u01B0\u1EDBng ph\u1EA3i qua tr\u00E1i"\r
 },\r
 layer:{\r
 insertlayer_desc:"Ch\u00E8n l\u1EDBp m\u1EDBi",\r
-forward_desc:"Chuy\u1EC3n \u0111\u1EBFn tr\u01B0\u1EDBc",\r
-backward_desc:"Chuy\u1EC3n ra sau",\r
-absolute_desc:"Toggle absolute positioning",\r
+forward_desc:"Di chuy\u1EC3n v\u1EC1 tr\u01B0\u1EDBc",\r
+backward_desc:"Di chuy\u1EC3n v\u1EC1 sau",\r
+absolute_desc:"\u0110\u1EA3o v\u1ECB tr\u00ED c\u1ED1 \u0111\u1ECBnh",\r
 content:"L\u1EDBp m\u1EDBi..."\r
 },\r
 save:{\r
-save_desc:"Save",\r
-cancel_desc:"Hu\u1EF7 t\u1EA5t c\u1EA3 thay \u0111\u1ED5i"\r
+save_desc:"L\u01B0u",\r
+cancel_desc:"H\u1EE7y b\u1ECF t\u1EA5t c\u1EA3 thay \u0111\u1ED5i"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"Insert non-breaking space character"\r
+nonbreaking_desc:"Ch\u00E8n k\u00FD t\u1EF1 kho\u1EA3ng c\u00E1ch kh\u00F4ng b\u1ECB ng\u1EAFt"\r
 },\r
 iespell:{\r
-iespell_desc:"Ki\u1EC3m tra ch\u00EDnh t\u1EA3",\r
-download:"ieSpell not detected. Do you want to install it now?"\r
+iespell_desc:"Ch\u1EA1y tr\u00ECnh ki\u1EC3m tra ch\u00EDnh t\u1EA3",\r
+download:"ieSpell kh\u00F4ng \u0111\u01B0\u1EE3c ph\u00E1t hi\u1EC7n. B\u1EA1n c\u00F3 mu\u1ED1n c\u00E0i \u0111\u1EB7t n\u00F3 b\u00E2y gi\u1EDD?"\r
 },\r
 advhr:{\r
-advhr_desc:"Horizontale rule"\r
+advhr_desc:"Th\u01B0\u1EDBc ngang"\r
 },\r
 emotions:{\r
-emotions_desc:"Bi\u1EC3u t\u01B0\u1EE3ng c\u1EA3m x\u00FAc"\r
+emotions_desc:"Bi\u1EC3u T\u01B0\u1EE3ng C\u1EA3m X\u00FAc"\r
 },\r
 searchreplace:{\r
-search_desc:"T\u00ECm ki\u1EBFm",\r
+search_desc:"T\u00ECm",\r
 replace_desc:"T\u00ECm/Thay th\u1EBF"\r
 },\r
 advimage:{\r
-image_desc:"Ch\u00E8n/thay \u0111\u1ED5i h\u00ECnh \u1EA3nh"\r
+image_desc:"Ch\u00E8n/s\u1EEDa \u1EA3nh"\r
 },\r
 advlink:{\r
-link_desc:"Ch\u00E8n/thay \u0111\u1ED5i li\u00EAn k\u1EBFt"\r
+link_desc:"Th\u00EAm/S\u1EEDa Link"\r
 },\r
 xhtmlxtras:{\r
-cite_desc:"Citation",\r
-abbr_desc:"Abbreviation",\r
-acronym_desc:"Acronym",\r
-del_desc:"Deletion",\r
-ins_desc:"Insertion",\r
-attribs_desc:"Insert/Edit Attributes"\r
+cite_desc:"Bi\u00EA\u0309u ch\u01B0\u01A1ng",\r
+abbr_desc:"T\u00EAn vi\u1EBFt t\u1EAFt",\r
+acronym_desc:"T\u1EEB vi\u1EBFt t\u1EAFt",\r
+del_desc:"X\u00F3a",\r
+ins_desc:"Ch\u00E8n",\r
+attribs_desc:"Ch\u00E8n/S\u1EEDa c\u00E1c thu\u1ED9c t\u00EDnh"\r
 },\r
 style:{\r
-desc:"Edit CSS Style"\r
+desc:"S\u1EEDa ki\u1EC3u d\u00E1ng CSS"\r
 },\r
 paste:{\r
-paste_text_desc:"D\u00E1n n\u1ED9i dung v\u00E0 b\u1ECF \u0111i \u0111\u1ECBnh d\u1EA1ng",\r
-paste_word_desc:"D\u00E1n n\u1ED9i dung sao ch\u00E9p t\u1EEB Word",\r
-selectall_desc:"Ch\u1ECDn t\u1EA5t c\u1EA3"\r
+paste_text_desc:"D\u00E1nh nh\u01B0 Plain Text",\r
+paste_word_desc:"D\u00E1n t\u1EEB Word",\r
+selectall_desc:"Ch\u1ECDn t\u1EA5t",\r
+plaintext_mode_sticky:"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.",\r
+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."\r
 },\r
 paste_dlg:{\r
-text_title:"S\u1EED d\u1EE5ng t\u1ED5 h\u1EE3p ph\u00EDm CTRL+V \u0111\u1EC3 d\u00E1n n\u1ED9i dung v\u00E0o khung b\u00EAn d\u01B0\u1EDBi.",\r
-text_linebreaks:"Gi\u1EEF nguy\u00EAn nh\u1EEFng ch\u1ED7 xu\u1ED1ng h\u00E0ng",\r
-word_title:"S\u1EED d\u1EE5ng t\u1ED5 h\u1EE3p ph\u00EDm CTRL+V \u0111\u1EC3 d\u00E1n n\u1ED9i dung v\u00E0o khung b\u00EAn d\u01B0\u1EDBi."\r
+text_title:"S\u1EED d\u1EE5ng CTRL+V tr\u00EAn b\u00E0n ph\u00EDm \u0111\u1EC3 d\u00E1n v\u0103n b\u1EA3n v\u00E0o c\u1EEDa s\u1ED5.",\r
+text_linebreaks:"Gi\u1EEF ng\u1EAFt d\u00F2ng",\r
+word_title:"S\u1EED d\u1EE5ng CTRL+V tr\u00EAn b\u00E0n ph\u00EDm \u0111\u1EC3 d\u00E1n v\u0103n b\u1EA3n v\u00E0o c\u1EEDa s\u1ED5."\r
 },\r
 table:{\r
-desc:"Ch\u00E8n b\u1EA3ng m\u1EDBi",\r
-row_before_desc:"Ch\u00E8n d\u00F2ng v\u00E0o tr\u01B0\u1EDBc v\u1ECB tr\u00ED hi\u1EC7n t\u1EA1i",\r
-row_after_desc:"Ch\u00E8n d\u00F2ng v\u00E0o sau v\u1ECB tr\u00ED hi\u1EC7n t\u1EA1i",\r
+desc:"Ch\u00E8n m\u1ED9t b\u1EA3ng m\u1EDBi",\r
+row_before_desc:"Ch\u00E8n h\u00E0ng v\u00E0o tr\u01B0\u1EDBc",\r
+row_after_desc:"Ch\u00E8n h\u00E0ng v\u00E0o sau",\r
 delete_row_desc:"X\u00F3a d\u00F2ng",\r
-col_before_desc:"Ch\u00E8n c\u1ED9t v\u00E0o sau v\u1ECB tr\u00ED hi\u1EC7n t\u1EA1i",\r
-col_after_desc:"Ch\u00E8n c\u1ED9t v\u00E0o sau v\u1ECB tr\u00ED hi\u1EC7n t\u1EA1i",\r
-delete_col_desc:"X\u00F3a c\u1ED9t",\r
-split_cells_desc:"T\u00E1ch \u00F4",\r
-merge_cells_desc:"G\u1ED9p \u00F4",\r
-row_desc:"Thay \u0111\u1ED5i thu\u1ED9c t\u00EDnh d\u00F2ng",\r
-cell_desc:"Thay \u0111\u1ED5i thu\u1ED9c t\u00EDnh \u00F4",\r
-props_desc:"Thay \u0111\u1ED5i thu\u1ED9c t\u00EDnh b\u1EA3ng",\r
-paste_row_before_desc:"D\u00E1n d\u00F2ng v\u00E0o tr\u01B0\u1EDBc v\u1ECB tr\u00ED hi\u1EC7n t\u1EA1i",\r
-paste_row_after_desc:"D\u00E1n d\u00F2ng v\u00E0o sau v\u1ECB tr\u00ED hi\u1EC7n t\u1EA1i",\r
-cut_row_desc:"C\u1EAFt d\u00F2ng",\r
-copy_row_desc:"Sao ch\u00E9p d\u00F2ng",\r
+col_before_desc:"Ch\u00E8n c\u1ED9t v\u00E0o tr\u01B0\u1EDBc",\r
+col_after_desc:"Ch\u00E8n c\u1ED9t v\u00E0o sau",\r
+delete_col_desc:"Lo\u1EA1i b\u1ECF c\u1ED9t",\r
+split_cells_desc:"T\u00E1ch c\u00E1c \u00F4 \u0111\u00E3 k\u1EBFt h\u1EE3p c\u1EE7a b\u1EA3ng",\r
+merge_cells_desc:"K\u1EBFt h\u1EE3p c\u00E1c \u00F4 c\u1EE7a b\u1EA3ng",\r
+row_desc:"Thu\u1ED9c t\u00EDnh h\u00E0ng",\r
+cell_desc:"Thu\u1ED9c t\u00EDnh \u00F4",\r
+props_desc:"Thu\u1ED9c t\u00EDnh b\u1EA3ng",\r
+paste_row_before_desc:"D\u00E1n hang v\u00E0o tr\u01B0\u1EDBc",\r
+paste_row_after_desc:"D\u00E1n hang v\u00E0o sau",\r
+cut_row_desc:"C\u1EAFt h\u00E0ng",\r
+copy_row_desc:"Sao ch\u00E9p h\u00E0ng",\r
 del:"X\u00F3a b\u1EA3ng",\r
-row:"D\u00F2ng",\r
+row:"H\u00E0ng",\r
 col:"C\u1ED9t",\r
 cell:"\u00D4"\r
 },\r
 autosave:{\r
-unload_msg:"The changes you made will be lost if you navigate away from this page."\r
+unload_msg:"Nh\u1EEFng thay \u0111\u1ED5i b\u1EA1n \u0111\u00E3 th\u1EF1c hi\u1EC7n s\u1EBD b\u1ECB m\u1EA5t n\u1EBFu b\u1EA1n \u0111i\u1EC1u h\u01B0\u1EDBng \u0111i t\u1EEB trang n\u00E0y.",\r
+restore_content:"Kh\u00F4i ph\u1EE5c n\u1ED9i dung t\u1EF1 \u0111\u1ED9ng l\u01B0u l\u1EA1i.",\r
+warning_message:"N\u1EBFu b\u1EA1n kh\u00F4i ph\u1EE5c l\u1EA1i n\u1ED9i dung \u0111\u00E3 l\u01B0u, b\u1EA1n s\u1EBD m\u1EA5t t\u1EA5t c\u1EA3 c\u00E1c n\u1ED9i dung m\u00E0 hi\u1EC7n \u0111ang trong tr\u00ECnh so\u1EA1n th\u1EA3o.\n\nB\u1EA1n c\u00F3 ch\u1EAFc l\u00E0 b\u1EA1n mu\u1ED1n kh\u00F4i ph\u1EE5c l\u1EA1i n\u1ED9i dung \u0111\u00E3 l\u01B0u?."\r
 },\r
 fullscreen:{\r
 desc:"B\u1EADt/t\u1EAFt ch\u1EBF \u0111\u1ED9 to\u00E0n m\u00E0n h\u00ECnh"\r
 },\r
 media:{\r
-desc:"Ch\u00E8n/thay \u0111\u1ED5i media(flash, nh\u1EA1c, video ...)",\r
-edit:"Thay \u0111\u1ED5i media"\r
+desc:"Ch\u00E8n / s\u1EEDa ph\u01B0\u01A1ng ti\u1EC7n truy\u1EC1n th\u00F4ng nh\u00FAng",\r
+edit:"S\u1EEDa ph\u01B0\u01A1ng ti\u1EC7n truy\u1EC1n th\u00F4ng nh\u00FAng"\r
 },\r
 fullpage:{\r
-desc:"Document properties"\r
+desc:"Thu\u1ED9c t\u00EDnh v\u0103n b\u1EA3n"\r
 },\r
 template:{\r
-desc:"Insert predefined template content"\r
+desc:"Ch\u00E8n m\u1ED9t n\u1ED9i dung m\u1EABu \u0111\u1ECBnh ngh\u0129a tr\u01B0\u1EDBc"\r
 },\r
 visualchars:{\r
-desc:"Visual control characters on/off."\r
+desc:"B\u1EB7t/T\u1EAFt c\u00E1c k\u00FD t\u1EF1 \u0111i\u1EC1u khi\u1EC3n tr\u1EF1c quan."\r
 },\r
 spellchecker:{\r
-desc:"Ki\u1EC3m tra ch\u00EDnh t\u1EA3",\r
-menu:"T\u00F9y ch\u1ECDn ki\u1EC3m tra ch\u00EDnh t\u1EA3",\r
-ignore_word:"B\u1ECF qua m\u1ED9t t\u1EEB n\u00E0y",\r
-ignore_words:"B\u1ECF qua t\u1EA5t c\u1EA3 t\u1EEB n\u00E0y",\r
+desc:"B\u1EADt/T\u1EAFt ki\u1EC3m tra ch\u00EDnh t\u1EA3",\r
+menu:"Thi\u1EBFt l\u1EADp ki\u1EC3m tra ch\u00EDnh t\u1EA3",\r
+ignore_word:"B\u1ECF qua t\u1EEB ng\u1EEF",\r
+ignore_words:"B\u1ECF qua t\u1EA5t c\u1EA3",\r
 langs:"Ng\u00F4n ng\u1EEF",\r
-wait:"Vui l\u00F2ng \u0111\u1EE3i trong gi\u00E2y l\u00E1t...",\r
-sug:"C\u00E1c t\u1EEB t\u01B0\u01A1ng t\u1EF1",\r
-no_sug:"Kh\u00F4ng c\u00F3 t\u1EEB t\u01B0\u01A1ng t\u1EF1",\r
-no_mpell:"Kh\u00F4ng c\u00F3 l\u1ED7i ch\u00EDnh t\u1EA3"\r
+wait:"Vui l\u00F2ng ch\u1EDD...",\r
+sug:"G\u1EE3i \u00FD",\r
+no_sug:"Kh\u00F4ng c\u00F3 g\u1EE3i \u00FD",\r
+no_mpell:"Kh\u00F4ng c\u00F3 l\u1ED7i ch\u00EDnh t\u1EA3 \u0111\u01B0\u1EE3c t\u00ECm th\u1EA5y."\r
 },\r
 pagebreak:{\r
-desc:"Insert page break."\r
+desc:"Ch\u00E8n ng\u1EAFt trang."\r
+},\r
+advlist:{\r
+types:"Ki\u1EC3u",\r
+def:"M\u1EB7c \u0111\u1ECBnh",\r
+lower_alpha:"K\u00FD hi\u1EC7u alpha th\u01B0\u1EDDng",\r
+lower_greek:"K\u00FD hi\u1EC7u Hy-l\u1EA1p th\u01B0\u1EDDng",\r
+lower_roman:"K\u00FD hi\u1EC7u La m\u00E3 th\u01B0\u1EDDng",\r
+upper_alpha:"K\u00FD hi\u1EC7u alpha cao",\r
+upper_roman:"K\u00FD hi\u1EC7u La m\u00E3 hoa",\r
+circle:"Tr\u00F2ng",\r
+disc:"\u0110\u0129a",\r
+square:"Vu\u00F4ng"\r
 }}});
\ No newline at end of file
index 21994452b9ed91f42ba226b4d2d0335330a5b780..c8c4be8d5dee77ba79e42245650d5f32e48818f0 100755 (executable)
@@ -1,32 +1,32 @@
 tinyMCE.addI18n({zh:{\r
 common:{\r
-edit_confirm:"\u4F60\u8981\u5728\u6B64\u6587\u5B57\u7F16\u8F91\u533A\u542F\u7528\u6240\u89C1\u5373\u6240\u5F97(WYSIWYG)\u6A21\u5F0F\uFF1F ",\r
+edit_confirm:"\u662F\u5426\u9700\u8981\u5F00\u542F\u6587\u5B57\u7F16\u8F91\u5668? ",\r
 apply:"\u5E94\u7528",\r
 insert:"\u63D2\u5165",\r
 update:"\u66F4\u65B0",\r
 cancel:"\u53D6\u6D88",\r
 close:"\u5173\u95ED",\r
 browse:"\u9884\u89C8",\r
-class_name:"\u7C7B\u522B",\r
+class_name:"\u6837\u5F0F",\r
 not_set:"--\u672A\u8BBE\u5B9A--",\r
-clipboard_msg:"\u7C98\u8D34\u590D\u5236\u3001\u526A\u4E0B\u548C\u8D34\u4E0A\u529F\u80FD\u5728Mozilla\u548CFirefox\u4E2D\u65E0\u6CD5\u4F7F\u7528\u3002 \n\u4F60\u9700\u8981\u4E86\u89E3\u66F4\u591A\u76F8\u5173\u4FE1\u606F\u5417\uFF1F ",\r
-clipboard_no_support:"\u76EE\u524D\u4F60\u7684\u6D4F\u89C8\u5668\u65E0\u6CD5\u652F\u6301\uFF0C\u8BF7\u7528\u952E\u76D8\u5FEB\u6377\u952E\u3002 ",\r
-popup_blocked:"\u62B1\u6B49\uFF0C\u5FEB\u6377\u529F\u80FD\u5728\u4F60\u7684\u7CFB\u7EDF\u4E0A\u88AB\u5C01\u9501\uFF0C\u4F7F\u7A0B\u5E8F\u65E0\u6CD5\u6B63\u5E38\u4F7F\u7528\uFF0C\u4F60\u9700\u8981\u6682\u65F6\u89E3\u9664\u5FEB\u6377\u5C01\u9501\uFF0C\u4F7F\u5DE5\u5177\u80FD\u6B63\u5E38\u4F7F\u7528\u3002 ",\r
-invalid_data:"\u9519\u8BEF\uFF1A\u8F93\u5165\u65E0\u6548\u7684\u503C\uFF0C\u4EE5\u7EA2\u8272\u5B57\u8868\u793A\u3002 ",\r
+clipboard_msg:"\u5F88\u62B1\u6B49\uFF0C\u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u63F4\u8907\u5236\u529F\u80FD\u3002 ",\r
+clipboard_no_support:"\u60A8\u7684\u6D4F\u89C8\u5668\u5F53\u524D\u4E0D\u652F\u63F4\u6B64\u529F\u80FD\uFF0C\u8BF7\u6309Ctrl + C\u5FEB\u6377\u952E\u4EE3\u66FF",\r
+popup_blocked:"\u60A8\u7684\u6D4F\u89C8\u5668\u963B\u6B62\u4E86\u6253\u5F00\u65B0\u89C6\u7A97\u3002\u60A8\u9700\u8981\u53D6\u6D88\u6D4F\u89C8\u5668\u6B64\u529F\u80FD\u4EE5\u66F4\u597D\u5730\u4F7F\u7528\u6B64\u5916\u6302\u7A0B\u5F0F\u3002 ",\r
+invalid_data:"\u60A8\u8F93\u5165\u7684\u8D44\u8BAF\u6709\u9519\u8BEF\u3002 (\u8BF7\u89C1\u7EA2\u8272\u90E8\u5206)",\r
 more_colors:"\u66F4\u591A\u989C\u8272"\r
 },\r
 contextmenu:{\r
 align:"\u5BF9\u9F50\u65B9\u5F0F",\r
 left:"\u9760\u5DE6\u5BF9\u9F50",\r
-center:"\u7F6E\u4E2D",\r
+center:"\u7F6E\u4E2D\u5BF9\u9F50",\r
 right:"\u9760\u53F3\u5BF9\u9F50",\r
 full:"\u5DE6\u53F3\u5BF9\u9F50"\r
 },\r
 insertdatetime:{\r
 date_fmt:"%Y-%m-%d",\r
 time_fmt:"%H:%M:%S",\r
-insertdate_desc:"\u63D2\u5165\u4ECA\u5929\u65E5\u671F",\r
-inserttime_desc:"\u63D2\u5165\u73B0\u5728\u65F6\u95F4",\r
+insertdate_desc:"\u63D2\u5165\u65E5\u671F",\r
+inserttime_desc:"\u63D2\u5165\u65F6\u95F4",\r
 months_long:"\u4E00\u6708,\u4E8C\u6708,\u4E09\u6708,\u56DB\u6708,\u4E94\u6708,\u516D\u6708,\u4E03\u6708,\u516B\u6708,\u4E5D\u6708,\u5341\u6708,\u5341\u4E00\u6708,\u5341\u4E8C\u6708",\r
 months_short:"1\u6708,2\u6708,3\u6708,4\u6708,5\u6708,6\u6708,7\u6708,8\u6708,9\u6708,10\u6708,11\u6708,12\u6708",\r
 day_long:"\u661F\u671F\u65E5,\u661F\u671F\u4E00,\u661F\u671F\u4E8C,\u661F\u671F\u4E09,\u661F\u671F\u56DB,\u661F\u671F\u4E94,\u661F\u671F\u516D,\u661F\u671F\u65E5",\r
@@ -39,116 +39,140 @@ preview:{
 preview_desc:"\u9884\u89C8"\r
 },\r
 directionality:{\r
-ltr_desc:"\u6587\u5B57\u4ECE\u5DE6\u5230\u53F3",\r
-rtl_desc:"\u6587\u5B57\u4ECE\u53F3\u5230\u5DE6"\r
+ltr_desc:"\u7531\u5DE6\u5230\u53F3",\r
+rtl_desc:"\u7531\u53F3\u5230\u5DE6"\r
 },\r
 layer:{\r
-insertlayer_desc:"\u63D2\u5165\u56FE\u5C42",\r
-forward_desc:"\u524D\u79FB",\r
-backward_desc:"\u540E\u79FB",\r
-absolute_desc:"\u5207\u6362\u7EDD\u5BF9\u5BFB\u5740",\r
-content:"\u65B0\u589E\u56FE\u5C42..."\r
+insertlayer_desc:"\u63D2\u5165DIV\u56FE\u5C42",\r
+forward_desc:"\u7F6E\u524D",\r
+backward_desc:"\u7F6E\u540E",\r
+absolute_desc:"\u6539\u53D8\u5C42\u7EDD\u5BF9\u4F4D\u7F6E",\r
+content:"\u65B0\u589EDIV\u56FE\u5C42"\r
 },\r
 save:{\r
-save_desc:"\u4FDD\u5B58",\r
-cancel_desc:"\u53D6\u6D88\u6240\u6709\u53D8\u66F4"\r
+save_desc:"\u50A8\u5B58",\r
+cancel_desc:"\u53D6\u6D88\u6240\u6709\u66F4\u6539"\r
 },\r
 nonbreaking:{\r
-nonbreaking_desc:"\u63D2\u5165\u975E\u622A\u65AD\u7684\u7A7A\u683C\u7B26"\r
+nonbreaking_desc:"\u63D2\u5165\u7A7A\u767D\u683C"\r
 },\r
 iespell:{\r
-iespell_desc:"\u6267\u884C\u62FC\u5B57\u68C0\u67E5",\r
-download:"\u4FA6\u6D4B\u4E0D\u5230ieSpell\u5957\u4EF6\uFF0C\u662F\u5426\u7ACB\u5373\u5B89\u88C5\uFF1F "\r
+iespell_desc:"\u62FC\u5B57\u4E0E\u8BED\u6CD5\u68C0\u67E5",\r
+download:"\u5916\u6302\u7A0B\u5F0F\u5C1A\u672A\u5B89\u88C5\uFF0C\u662F\u5426\u9700\u8981\u7ACB\u5373\u5B89\u88C5\uFF1F "\r
 },\r
 advhr:{\r
-advhr_desc:"\u6C34\u5E73\u5206\u9694\u7EBF"\r
+advhr_desc:"\u6C34\u5E73\u7EBF"\r
 },\r
 emotions:{\r
 emotions_desc:"\u8868\u60C5"\r
 },\r
 searchreplace:{\r
-search_desc:"\u641C\u5BFB",\r
-replace_desc:"\u641C\u5BFB/\u53D6\u4EE3"\r
+search_desc:"\u5BFB\u627E",\r
+replace_desc:"\u5BFB\u627E/\u53D6\u4EE3"\r
 },\r
 advimage:{\r
-image_desc:"\u63D2\u5165/\u7F16\u8F91\u56FE\u6863"\r
+image_desc:"\u63D2\u5165/\u7F16\u8F91\u56FE\u7247"\r
 },\r
 advlink:{\r
-link_desc:"\u63D2\u5165/\u7F16\u8F91\u94FE\u63A5"\r
+link_desc:"\u63D2\u5165/\u7F16\u8F91\u8FDE\u7ED3"\r
 },\r
 xhtmlxtras:{\r
 cite_desc:"\u5F15\u7528",\r
-abbr_desc:"\u7F29\u5199",\r
-acronym_desc:"\u9996\u5B57\u6BCD\u7F29\u5199",\r
+abbr_desc:"\u7F29\u7565\u8BCD ",\r
+acronym_desc:"\u9996\u5B57\u7F29\u7565\u8BCD",\r
 del_desc:"\u5220\u9664",\r
 ins_desc:"\u63D2\u5165",\r
-attribs_desc:"\u63D2\u5165/\u7F16\u8F91\u5C5E\u6027"\r
+attribs_desc:"\u63D2\u5165/\u7F16\u8F91\u5C5E\u6027",\r
+attribs_delta_width:"40",\r
+attribs_delta_height:"60"\r
 },\r
 style:{\r
-desc:"\u7F16\u8F91CSS\u6837\u5F0F\u8868\u5355"\r
+desc:"\u7F16\u8F91 CSS"\r
 },\r
 paste:{\r
-paste_text_desc:"\u8D34\u4E0A\u4E3A\u7EAF\u6587\u672C",\r
-paste_word_desc:"\u8D34\u4E0A\u4E3AWord\u683C\u5F0F",\r
-selectall_desc:"\u5168\u9009"\r
+paste_text_desc:"\u4EE5\u7EAF\u6587\u5B57\u8D34\u4E0A\u8D44\u6599",\r
+paste_word_desc:"\u4ECEWord \u8D34\u4E0A\u8D44\u6599",\r
+selectall_desc:"\u5168\u9009",\r
+plaintext_mode_sticky:"\u5F53\u524D\u4E3A\u7B80\u5355\u6587\u5B57\u8D34\u4E0A\u6A21\u5F0F\uFF0C\u518D\u70B9\u9605\u4E00\u6B21\u5207\u6362\u56DE\u4E00\u822C\u8D34\u4E0A\u6A21\u5F0F\u3002\u5728\u4F60\u8D34\u4E0A\u540E\u4F1A\u56DE\u5230\u4E00\u822C\u8D34\u4E0A\u6A21\u5F0F\u3002 ",\r
+plaintext_mode:"\u5F53\u524D\u4E3A\u7B80\u5355\u6587\u5B57\u8D34\u4E0A\u6A21\u5F0F\uFF0C\u518D\u70B9\u9605\u4E00\u6B21\u5207\u6362\u56DE\u4E00\u822C\u8D34\u4E0A\u6A21\u5F0F\u3002 "\r
 },\r
 paste_dlg:{\r
-text_title:"\u7528Ctrl+V\u7EC4\u5408\u952E\u5C06\u6587\u5B57\u8D34\u5165\u7A97\u53E3\u4E2D\u3002 ",\r
-text_linebreaks:"\u4FDD\u7559\u6362\u884C\u7B26\u53F7",\r
-word_title:"\u7528Ctrl+V\u7EC4\u5408\u952E\u5C06\u6587\u5B57\u8D34\u5165\u7A97\u53E3\u4E2D\u3002 "\r
+text_title:"\u5728\u952E\u76D8\u4E0A\u540C\u65F6\u6309\u4E0BCtrl \u548CV \u952E\uFF0C\u5C06\u6587\u5B57\u8D34\u4E0A\u5230\u6B64\u89C6\u7A97\u3002 ",\r
+text_linebreaks:"\u4FDD\u7559\u6362\u884C\u7B26",\r
+word_title:"\u5728\u952E\u76D8\u4E0A\u540C\u65F6\u6309\u4E0BCtrl \u548CV \u952E\uFF0C\u5C06\u6587\u5B57\u8D34\u4E0A\u5230\u6B64\u89C6\u7A97\u3002 "\r
 },\r
 table:{\r
-desc:"\u63D2\u5165\u65B0\u8868\u683C",\r
-row_before_desc:"\u63D2\u5165\u5217\u4E8E\u524D",\r
-row_after_desc:"\u63D2\u5165\u5217\u4E8E\u540E",\r
-delete_row_desc:"\u5220\u9664\u672C\u5217",\r
-col_before_desc:"\u63D2\u5165\u680F\u4E8E\u524D",\r
-col_after_desc:"\u63D2\u5165\u680F\u4E8E\u540E",\r
-delete_col_desc:"\u5220\u9664\u672C\u680F",\r
-split_cells_desc:"\u5206\u5272\u5355\u5143\u683C",\r
-merge_cells_desc:"\u5408\u5E76\u5355\u5143\u683C",\r
-row_desc:"\u8868\u683C\u5217\u5C5E\u6027",\r
-cell_desc:"\u5355\u5143\u683C\u5C5E\u6027",\r
-props_desc:"\u8868\u683C\u5C5E\u6027",\r
-paste_row_before_desc:"\u8D34\u5165\u5217\u4E8E\u524D",\r
-paste_row_after_desc:"\u8D34\u5165\u5217\u4E8E\u540E",\r
-cut_row_desc:"\u526A\u4E0B\u6B64\u5217",\r
-copy_row_desc:"\u590D\u5236\u6B64\u5217",\r
+desc:"\u63D2\u5165\u8868\u683C",\r
+row_before_desc:"\u4E0A\u65B9\u63D2\u5165\u4E00\u680F",\r
+row_after_desc:"\u4E0B\u65B9\u63D2\u5165\u4E00\u680F",\r
+delete_row_desc:"\u5220\u9664\u4E00\u680F",\r
+col_before_desc:"\u5DE6\u65B9\u63D2\u5165\u4E00\u5217",\r
+col_after_desc:"\u53F3\u65B9\u63D2\u5165\u4E00\u5217",\r
+delete_col_desc:"\u5220\u9664\u4E00\u5217",\r
+split_cells_desc:"\u5206\u5272\u8868\u683C",\r
+merge_cells_desc:"\u5408\u5E76\u8868\u683C",\r
+row_desc:"\u5217\u5C5E\u6027",\r
+cell_desc:"\u8868\u683C\u5C5E\u6027",\r
+props_desc:"\u680F\u5C5E\u6027",\r
+paste_row_before_desc:"\u7C98\u8D34\u5230\u4E0A\u65B9",\r
+paste_row_after_desc:"\u7C98\u8D34\u5230\u4E0B\u65B9",\r
+cut_row_desc:"\u526A\u5207\u5F53\u524D\u8868\u683C",\r
+copy_row_desc:"\u8907\u5236\u5F53\u524D\u8868\u683C",\r
 del:"\u5220\u9664\u8868\u683C",\r
-row:"\u5217",\r
-col:"\u680F",\r
-cell:"\u5355\u5143\u683C"\r
+row:"\u680F",\r
+col:"\u5217",\r
+cell:"\u8868\u683C",\r
+cellprops_delta_width:"10",\r
+cellprops_delta_height:"10",\r
+table_delta_width:"40",\r
+table_delta_height:"60",\r
+merge_cells_delta_width:"40",\r
+merge_cells_delta_height:"40"\r
 },\r
 autosave:{\r
-unload_msg:"\u5982\u679C\u79BB\u5F00\u8BE5\u9875\uFF0C\u5C06\u5BFC\u81F4\u6240\u6709\u4FEE\u6539\u5168\u90E8\u9057\u5931\u3002 "\r
+unload_msg:"\u60A8\u5C1A\u672A\u50A8\u5B58\u8D44\u6599\uFF0C\u60A8\u8F93\u5165\u7684\u8D44\u6599\u6709\u53EF\u80FD\u4F1A\u6D88\u5931\u2026",\r
+restore_content:"\u6062\u8907\u81EA\u52A8\u50A8\u5B58\u7684\u5185\u5BB9\u3002 ",\r
+warning_message:"\u5982\u679C\u6062\u8907\u5148\u524D\u50A8\u5B58\u7684\u5185\u5BB9\uFF0C\u4F60\u5C06\u5931\u53BB\u7F16\u8F91\u5668\u4E2D\u73B0\u6709\u7684\u5185\u5BB9\u3002 \n\n\u4F60\u786E\u5B9A\u8981\u6062\u8907\u5148\u524D\u50A8\u5B58\u7684\u5185\u5BB9\u5417\uFF1F "\r
 },\r
 fullscreen:{\r
-desc:"\u5207\u6362\u5168\u5C4F\u5E55\u6A21\u5F0F"\r
+desc:"\u5168\u5C4F\u663E\u793A"\r
 },\r
 media:{\r
-desc:"\u63D2\u5165/\u7F16\u8F91\u5F71\u7247",\r
-edit:"\u7F16\u8F91\u5F71\u7247"\r
+desc:"\u63D2\u5165/\u7F16\u8F91\u591A\u5A92\u4F53",\r
+edit:"\u7F16\u8F91\u591A\u5A92\u4F53"\r
 },\r
 fullpage:{\r
-desc:"\u6587\u4EF6\u5C5E\u6027"\r
+desc:"\u6863\u5C5E\u6027"\r
 },\r
 template:{\r
-desc:"\u63D2\u5165\u9884\u5148\u5B9A\u4E49\u7684\u6A21\u677F\u5185\u5BB9"\r
+desc:"\u4F7F\u7528\u8303\u672C"\r
 },\r
 visualchars:{\r
-desc:"\u53EF\u89C1\u63A7\u5236\u5B57\u7B26\u5F00/\u5173\u3002 "\r
+desc:"\u663E\u793A\u63A7\u5236\u7B26\u53F7"\r
 },\r
 spellchecker:{\r
-desc:"\u5207\u6362\u62FC\u5199\u68C0\u67E5",\r
-menu:"\u62FC\u5199\u68C0\u67E5\u8BBE\u5B9A",\r
-ignore_word:"\u5FFD\u7565\u5B57",\r
+desc:"\u82F1\u6587\u62FC\u5B57\u68C0\u67E5",\r
+menu:"\u8BBE\u5B9A",\r
+ignore_word:"\u5FFD\u7565",\r
 ignore_words:"\u5168\u90E8\u5FFD\u7565",\r
 langs:"\u8BED\u8A00",\r
-wait:"\u8BF7\u7A0D\u540E...",\r
+wait:"\u8BF7\u7A0D\u5019\u3002 ",\r
 sug:"\u5EFA\u8BAE",\r
-no_sug:"\u65E0\u5EFA\u8BAE",\r
-no_mpell:"\u65E0\u62FC\u5199\u9519\u8BEF\u3002 "\r
+no_sug:"\u6CA1\u6709\u5EFA\u8BAE\u2026",\r
+no_mpell:"\u672A\u53D1\u73B0\u9519\u8BEF"\r
 },\r
 pagebreak:{\r
-desc:"\u63D2\u5165\u5206\u9875\u7B26\u3002 "\r
+desc:"\u63D2\u5165\u5206\u9875\u7B26\u53F7"\r
+},\r
+advlist:{\r
+types:"\u6837\u5F0F",\r
+def:"\u9884\u8BBE",\r
+lower_alpha:"\u5C0F\u5199\u7684\u82F1\u6587\u5B57",\r
+lower_greek:"\u5C0F\u5199\u7684\u5E0C\u814A\u6587",\r
+lower_roman:"\u5C0F\u5199\u7684\u7F57\u9A6C\u6570\u5B57",\r
+upper_alpha:"\u5927\u5199\u7684\u82F1\u6587\u5B57",\r
+upper_roman:"\u5927\u5199\u7684\u7F57\u9A6C\u6570\u5B57",\r
+circle:"\u5706\u5708",\r
+disc:"\u9ED1\u70B9",\r
+square:"\u65B9\u5757"\r
 }}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/compat2x/editor_plugin.js b/program/js/tiny_mce/plugins/compat2x/editor_plugin.js
deleted file mode 100644 (file)
index d921728..0000000
+++ /dev/null
@@ -1 +0,0 @@
-(function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.is;tinymce.create("tinymce.plugins.Compat2x",{getInfo:function(){return{longname:"Compat2x",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/compat2x",version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}}});(function(){tinymce.extend(tinyMCE,{addToLang:function(f,e){d(e,function(h,g){tinyMCE.i18n[(tinyMCE.settings.language||"en")+"."+(f?f+"_":"")+g]=h})},getInstanceById:function(e){return this.get(e)}})})();(function(){var e=tinymce.EditorManager;tinyMCE.instances={};tinyMCE.plugins={};tinymce.PluginManager.onAdd.add(function(f,h,g){tinyMCE.plugins[h]=g});tinyMCE.majorVersion=tinymce.majorVersion;tinyMCE.minorVersion=tinymce.minorVersion;tinyMCE.releaseDate=tinymce.releaseDate;tinyMCE.baseURL=tinymce.baseURL;tinyMCE.isIE=tinyMCE.isMSIE=tinymce.isIE||tinymce.isOpera;tinyMCE.isMSIE5=tinymce.isIE;tinyMCE.isMSIE5_0=tinymce.isIE;tinyMCE.isMSIE7=tinymce.isIE;tinyMCE.isGecko=tinymce.isGecko;tinyMCE.isSafari=tinymce.isWebKit;tinyMCE.isOpera=tinymce.isOpera;tinyMCE.isMac=false;tinyMCE.isNS7=false;tinyMCE.isNS71=false;tinyMCE.compat=true;TinyMCE_Engine=tinyMCE;tinymce.extend(tinyMCE,{getParam:function(g,f){return this.activeEditor.getParam(g,f)},addEvent:function(i,g,h,j){tinymce.dom.Event.add(i,g,h,j||this)},getControlHTML:function(f){return e.activeEditor.controlManager.createControl(f)},loadCSS:function(f){tinymce.DOM.loadCSS(f)},importCSS:function(g,f){if(g==document){this.loadCSS(f)}else{new tinymce.dom.DOMUtils(g).loadCSS(f)}},log:function(){console.debug.apply(console,arguments)},getLang:function(h,g){var f=e.activeEditor.getLang(h.replace(/^lang_/g,""),g);if(/^[0-9\-.]+$/g.test(f)){return parseInt(f)}return f},isInstance:function(f){return f!=null&&typeof(f)=="object"&&f.execCommand},triggerNodeChange:function(){e.activeEditor.nodeChanged()},regexpReplace:function(j,f,h,i){var g;if(j==null){return j}if(typeof(i)=="undefined"){i="g"}g=new RegExp(f,i);return j.replace(g,h)},trim:function(f){return tinymce.trim(f)},xmlEncode:function(f){return tinymce.DOM.encode(f)},explode:function(f,h){var g=[];tinymce.each(f.split(h),function(i){if(i!=""){g.push(i)}});return g},switchClass:function(h,g){var f;if(/^mceButton/.test(g)){f=e.activeEditor.controlManager.get(h);if(!f){return}switch(g){case"mceButtonNormal":f.setDisabled(false);f.setActive(false);return;case"mceButtonDisabled":f.setDisabled(true);return;case"mceButtonSelected":f.setActive(true);f.setDisabled(false);return}}},addCSSClass:function(g,h,f){return tinymce.DOM.addClass(g,h,f)},hasCSSClass:function(f,g){return tinymce.DOM.hasClass(f,g)},removeCSSClass:function(f,g){return tinymce.DOM.removeClass(f,g)},getCSSClasses:function(){var f=e.activeEditor.dom.getClasses(),g=[];d(f,function(h){g.push(h["class"])});return g},setWindowArg:function(g,f){e.activeEditor.windowManager.params[g]=f},getWindowArg:function(i,g){var h=e.activeEditor.windowManager,f;f=h.getParam(i);if(f===""){return""}return f||h.getFeature(i)||g},getParentNode:function(h,g){return this._getDOM().getParent(h,g)},selectElements:function(o,k,m){var l,j=[],h,g;for(g=0,k=k.split(",");g<k.length;g++){for(l=0,h=o.getElementsByTagName(k[g]);l<h.length;l++){(!m||m(h[l]))&&j.push(h[l])}}return j},getNodeTree:function(i,f,g,h){return this.selectNodes(i,function(j){return(!g||j.nodeType==g)&&(!h||j.nodeName==h)},f?f:[])},getAttrib:function(g,h,f){return this._getDOM().getAttrib(g,h,f)},setAttrib:function(g,h,f){return this._getDOM().setAttrib(g,h,f)},getElementsByAttributeValue:function(m,k,g,h){var j,f=m.getElementsByTagName(k),l=[];for(j=0;j<f.length;j++){if(tinyMCE.getAttrib(f[j],g).indexOf(h)!=-1){l[l.length]=f[j]}}return l},selectNodes:function(k,j,g){var h;if(!g){g=[]}if(j(k)){g[g.length]=k}if(k.hasChildNodes()){for(h=0;h<k.childNodes.length;h++){tinyMCE.selectNodes(k.childNodes[h],j,g)}}return g},getContent:function(){return e.activeEditor.getContent()},getParentElement:function(i,g,h){if(g){g=new RegExp("^("+g.toUpperCase().replace(/,/g,"|")+")$","g")}return this._getDOM().getParent(i,function(f){return f.nodeType==1&&(!g||g.test(f.nodeName))&&(!h||h(f))},this.activeEditor.getBody())},importPluginLanguagePack:function(f){tinymce.PluginManager.requireLangPack(f)},getButtonHTML:function(l,j,h,k,i,g){var f=e.activeEditor;h=h.replace(/\{\$pluginurl\}/g,tinyMCE.pluginURL);h=h.replace(/\{\$themeurl\}/g,tinyMCE.themeURL);j=j.replace(/^lang_/g,"");return f.controlManager.createButton(l,{title:j,command:k,ui:i,value:g,scope:this,"class":"compat",image:h})},addSelectAccessibility:function(h,g,f){if(!g._isAccessible){g.onkeydown=tinyMCE.accessibleEventHandler;g.onblur=tinyMCE.accessibleEventHandler;g._isAccessible=true;g._win=f}return false},accessibleEventHandler:function(g){var h,f=this._win;g=tinymce.isIE?f.event:g;h=tinymce.isIE?g.srcElement:g.target;if(g.type=="blur"){if(h.oldonchange){h.onchange=h.oldonchange;h.oldonchange=null}return true}if(h.nodeName=="SELECT"&&!h.oldonchange){h.oldonchange=h.onchange;h.onchange=null}if(g.keyCode==13||g.keyCode==32){h.onchange=h.oldonchange;h.onchange();h.oldonchange=null;tinyMCE.cancelEvent(g);return false}return true},cancelEvent:function(f){return tinymce.dom.Event.cancel(f)},handleVisualAid:function(f){e.activeEditor.addVisual(f)},getAbsPosition:function(g,f){return tinymce.DOM.getPos(g,f)},cleanupEventStr:function(f){f=""+f;f=f.replace("function anonymous()\n{\n","");f=f.replace("\n}","");f=f.replace(/^return true;/gi,"");return f},getVisualAidClass:function(f){return f},parseStyle:function(f){return this._getDOM().parseStyle(f)},serializeStyle:function(f){return this._getDOM().serializeStyle(f)},openWindow:function(h,g){var f=e.activeEditor,i={},j;for(j in h){i[j]=h[j]}h=i;g=g||{};h.url=new tinymce.util.URI(tinymce.ThemeManager.themeURLs[f.settings.theme]).toAbsolute(h.file);h.inline=h.inline||g.inline;f.windowManager.open(h,g)},closeWindow:function(f){e.activeEditor.windowManager.close(f)},getOuterHTML:function(f){return tinymce.DOM.getOuterHTML(f)},setOuterHTML:function(g,f,i){return tinymce.DOM.setOuterHTML(g,f,i)},hasPlugin:function(f){return tinymce.PluginManager.get(f)!=null},_setEventsEnabled:function(){},addPlugin:function(g,i){var h=this;function j(f){tinyMCE.selectedInstance=f;f.onInit.add(function(){h.settings=f.settings;h.settings.base_href=tinyMCE.documentBasePath;tinyMCE.settings=h.settings;tinyMCE.documentBasePath=f.documentBasePath;if(i.initInstance){i.initInstance(f)}f.contentDocument=f.getDoc();f.contentWindow=f.getWin();f.undoRedo=f.undoManager;f.startContent=f.getContent({format:"raw"});tinyMCE.instances[f.id]=f;tinyMCE.loadedFiles=[]});f.onActivate.add(function(){tinyMCE.settings=f.settings;tinyMCE.selectedInstance=f});if(i.handleNodeChange){f.onNodeChange.add(function(l,k,m){i.handleNodeChange(l.id,m,0,0,false,!l.selection.isCollapsed())})}if(i.onChange){f.onChange.add(function(k,l){return i.onChange(k)})}if(i.cleanup){f.onGetContent.add(function(){})}this.getInfo=function(){return i.getInfo()};this.createControl=function(k){tinyMCE.pluginURL=tinymce.baseURL+"/plugins/"+g;tinyMCE.themeURL=tinymce.baseURL+"/themes/"+tinyMCE.activeEditor.settings.theme;if(i.getControlHTML){return i.getControlHTML(k)}return null};this.execCommand=function(l,k,m){if(i.execCommand){return i.execCommand(f.id,f.getBody(),l,k,m)}return false}}tinymce.PluginManager.add(g,j)},_getDOM:function(){return tinyMCE.activeEditor?tinyMCE.activeEditor.dom:tinymce.DOM},convertRelativeToAbsoluteURL:function(f,g){return new tinymce.util.URI(f).toAbsolute(g)},convertAbsoluteURLToRelativeURL:function(f,g){return new tinymce.util.URI(f).toRelative(g)}});tinymce.extend(tinymce.Editor.prototype,{getFocusElement:function(){return this.selection.getNode()},getData:function(f){if(!this.data){this.data=[]}if(!this.data[f]){this.data[f]=[]}return this.data[f]},hasPlugin:function(f){return this.plugins[f]!=null},getContainerWin:function(){return window},getHTML:function(f){return this.getContent({format:f?"raw":"html"})},setHTML:function(f){this.setContent(f)},getSel:function(){return this.selection.getSel()},getRng:function(){return this.selection.getRng()},isHidden:function(){var f;if(!tinymce.isGecko){return false}f=this.getSel();return(!f||!f.rangeCount||f.rangeCount==0)},translate:function(f){var h=this.settings.language,g;if(!f){return f}g=tinymce.EditorManager.i18n[h+"."+f]||f.replace(/{\#([^}]+)\}/g,function(j,i){return tinymce.EditorManager.i18n[h+"."+i]||"{#"+i+"}"});g=g.replace(/{\$lang_([^}]+)\}/g,function(j,i){return tinymce.EditorManager.i18n[h+"."+i]||"{$lang_"+i+"}"});return g},repaint:function(){this.execCommand("mceRepaint")}});tinymce.extend(tinymce.dom.Selection.prototype,{getSelectedText:function(){return this.getContent({format:"text"})},getSelectedHTML:function(){return this.getContent({format:"html"})},getFocusElement:function(){return this.getNode()},selectNode:function(i,j,g,f){var h=this;h.select(i,g||0);if(!b(j)){j=true}if(j){if(!b(f)){f=true}h.collapse(f)}}})}).call(this);tinymce.PluginManager.add("compat2x",tinymce.plugins.Compat2x)})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/compat2x/editor_plugin_src.js b/program/js/tiny_mce/plugins/compat2x/editor_plugin_src.js
deleted file mode 100644 (file)
index 60d4f2d..0000000
+++ /dev/null
@@ -1,616 +0,0 @@
-/**\r
- * $Id: editor_plugin_src.js 264 2007-04-26 20:53:09Z spocke $\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-(function() {\r
-       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is;\r
-\r
-       tinymce.create('tinymce.plugins.Compat2x', {\r
-               getInfo : function() {\r
-                       return {\r
-                               longname : 'Compat2x',\r
-                               author : 'Moxiecode Systems AB',\r
-                               authorurl : 'http://tinymce.moxiecode.com',\r
-                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/compat2x',\r
-                               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
-                       };\r
-               }\r
-       });\r
-\r
-       (function() {\r
-               // Extend tinyMCE/EditorManager\r
-               tinymce.extend(tinyMCE, {\r
-                       addToLang : function(p, l) {\r
-                               each(l, function(v, k) {\r
-                                       tinyMCE.i18n[(tinyMCE.settings.language || 'en') + '.' + (p ? p + '_' : '') + k] = v;\r
-                               });\r
-                       },\r
-\r
-                       getInstanceById : function(n) {\r
-                               return this.get(n);\r
-                       }\r
-               });\r
-       })();\r
-\r
-       (function() {\r
-               var EditorManager = tinymce.EditorManager;\r
-\r
-               tinyMCE.instances = {};\r
-               tinyMCE.plugins = {};\r
-               tinymce.PluginManager.onAdd.add(function(pm, n, p) {\r
-                       tinyMCE.plugins[n] = p;\r
-               });\r
-\r
-               tinyMCE.majorVersion = tinymce.majorVersion;\r
-               tinyMCE.minorVersion = tinymce.minorVersion;\r
-               tinyMCE.releaseDate = tinymce.releaseDate;\r
-               tinyMCE.baseURL = tinymce.baseURL;\r
-               tinyMCE.isIE = tinyMCE.isMSIE = tinymce.isIE || tinymce.isOpera;\r
-               tinyMCE.isMSIE5 = tinymce.isIE;\r
-               tinyMCE.isMSIE5_0 = tinymce.isIE;\r
-               tinyMCE.isMSIE7 = tinymce.isIE;\r
-               tinyMCE.isGecko = tinymce.isGecko;\r
-               tinyMCE.isSafari = tinymce.isWebKit;\r
-               tinyMCE.isOpera = tinymce.isOpera;\r
-               tinyMCE.isMac = false;\r
-               tinyMCE.isNS7 = false;\r
-               tinyMCE.isNS71 = false;\r
-               tinyMCE.compat = true;\r
-\r
-               // Extend tinyMCE class\r
-               TinyMCE_Engine = tinyMCE;\r
-               tinymce.extend(tinyMCE, {\r
-                       getParam : function(n, dv) {\r
-                               return this.activeEditor.getParam(n, dv);\r
-                       },\r
-\r
-                       addEvent : function(e, na, f, sc) {\r
-                               tinymce.dom.Event.add(e, na, f, sc || this);\r
-                       },\r
-\r
-                       getControlHTML : function(n) {\r
-                               return EditorManager.activeEditor.controlManager.createControl(n);\r
-                       },\r
-\r
-                       loadCSS : function(u) {\r
-                               tinymce.DOM.loadCSS(u);\r
-                       },\r
-\r
-                       importCSS : function(doc, u) {\r
-                               if (doc == document)\r
-                                       this.loadCSS(u);\r
-                               else\r
-                                       new tinymce.dom.DOMUtils(doc).loadCSS(u);\r
-                       },\r
-\r
-                       log : function() {\r
-                               console.debug.apply(console, arguments);\r
-                       },\r
-\r
-                       getLang : function(n, dv) {\r
-                               var v = EditorManager.activeEditor.getLang(n.replace(/^lang_/g, ''), dv);\r
-\r
-                               // Is number\r
-                               if (/^[0-9\-.]+$/g.test(v))\r
-                                       return parseInt(v);\r
-\r
-                               return v;\r
-                       },\r
-\r
-                       isInstance : function(o) {\r
-                               return o != null && typeof(o) == "object" && o.execCommand;\r
-                       },\r
-\r
-                       triggerNodeChange : function() {\r
-                               EditorManager.activeEditor.nodeChanged();\r
-                       },\r
-\r
-                       regexpReplace : function(in_str, reg_exp, replace_str, opts) {\r
-                               var re;\r
-\r
-                               if (in_str == null)\r
-                                       return in_str;\r
-\r
-                               if (typeof(opts) == "undefined")\r
-                                       opts = 'g';\r
-\r
-                               re = new RegExp(reg_exp, opts);\r
-\r
-                               return in_str.replace(re, replace_str);\r
-                       },\r
-\r
-                       trim : function(s) {\r
-                               return tinymce.trim(s);\r
-                       },\r
-\r
-                       xmlEncode : function(s) {\r
-                               return tinymce.DOM.encode(s);\r
-                       },\r
-\r
-                       explode : function(s, d) {\r
-                               var o = [];\r
-\r
-                               tinymce.each(s.split(d), function(v) {\r
-                                       if (v != '')\r
-                                               o.push(v);\r
-                               });\r
-\r
-                               return o;\r
-                       },\r
-\r
-                       switchClass : function(id, cls) {\r
-                               var b;\r
-\r
-                               if (/^mceButton/.test(cls)) {\r
-                                       b = EditorManager.activeEditor.controlManager.get(id);\r
-\r
-                                       if (!b)\r
-                                               return;\r
-\r
-                                       switch (cls) {\r
-                                               case "mceButtonNormal":\r
-                                                       b.setDisabled(false);\r
-                                                       b.setActive(false);\r
-                                                       return;\r
-\r
-                                               case "mceButtonDisabled":\r
-                                                       b.setDisabled(true);\r
-                                                       return;\r
-\r
-                                               case "mceButtonSelected":\r
-                                                       b.setActive(true);\r
-                                                       b.setDisabled(false);\r
-                                                       return;\r
-                                       }\r
-                               }\r
-                       },\r
-\r
-                       addCSSClass : function(e, n, b) {\r
-                               return tinymce.DOM.addClass(e, n, b);\r
-                       },\r
-\r
-                       hasCSSClass : function(e, n) {\r
-                               return tinymce.DOM.hasClass(e, n);\r
-                       },\r
-\r
-                       removeCSSClass : function(e, n) {\r
-                               return tinymce.DOM.removeClass(e, n);\r
-                       },\r
-\r
-                       getCSSClasses : function() {\r
-                               var cl = EditorManager.activeEditor.dom.getClasses(), o = [];\r
-\r
-                               each(cl, function(c) {\r
-                                       o.push(c['class']);\r
-                               });\r
-\r
-                               return o;\r
-                       },\r
-\r
-                       setWindowArg : function(n, v) {\r
-                               EditorManager.activeEditor.windowManager.params[n] = v;\r
-                       },\r
-\r
-                       getWindowArg : function(n, dv) {\r
-                               var wm = EditorManager.activeEditor.windowManager, v;\r
-\r
-                               v = wm.getParam(n);\r
-                               if (v === '')\r
-                                       return '';\r
-\r
-                               return v || wm.getFeature(n) || dv;\r
-                       },\r
-\r
-                       getParentNode : function(n, f) {\r
-                               return this._getDOM().getParent(n, f);\r
-                       },\r
-\r
-                       selectElements : function(n, na, f) {\r
-                               var i, a = [], nl, x;\r
-\r
-                               for (x=0, na = na.split(','); x<na.length; x++)\r
-                                       for (i=0, nl = n.getElementsByTagName(na[x]); i<nl.length; i++)\r
-                                               (!f || f(nl[i])) && a.push(nl[i]);\r
-\r
-                               return a;\r
-                       },\r
-\r
-                       getNodeTree : function(n, na, t, nn) {\r
-                               return this.selectNodes(n, function(n) {\r
-                                       return (!t || n.nodeType == t) && (!nn || n.nodeName == nn);\r
-                               }, na ? na : []);\r
-                       },\r
-\r
-                       getAttrib : function(e, n, dv) {\r
-                               return this._getDOM().getAttrib(e, n, dv);\r
-                       },\r
-\r
-                       setAttrib : function(e, n, v) {\r
-                               return this._getDOM().setAttrib(e, n, v);\r
-                       },\r
-\r
-                       getElementsByAttributeValue : function(n, e, a, v) {\r
-                               var i, nl = n.getElementsByTagName(e), o = [];\r
-\r
-                               for (i=0; i<nl.length; i++) {\r
-                                       if (tinyMCE.getAttrib(nl[i], a).indexOf(v) != -1)\r
-                                               o[o.length] = nl[i];\r
-                               }\r
-\r
-                               return o;\r
-                       },\r
-\r
-                       selectNodes : function(n, f, a) {\r
-                               var i;\r
-\r
-                               if (!a)\r
-                                       a = [];\r
-\r
-                               if (f(n))\r
-                                       a[a.length] = n;\r
-\r
-                               if (n.hasChildNodes()) {\r
-                                       for (i=0; i<n.childNodes.length; i++)\r
-                                               tinyMCE.selectNodes(n.childNodes[i], f, a);\r
-                               }\r
-\r
-                               return a;\r
-                       },\r
-\r
-                       getContent : function() {\r
-                               return EditorManager.activeEditor.getContent();\r
-                       },\r
-\r
-                       getParentElement : function(n, na, f) {\r
-                               if (na)\r
-                                       na = new RegExp('^(' + na.toUpperCase().replace(/,/g, '|') + ')$', 'g');\r
-\r
-                               return this._getDOM().getParent(n, function(n) {\r
-                                       return n.nodeType == 1 && (!na || na.test(n.nodeName)) && (!f || f(n));\r
-                               }, this.activeEditor.getBody());\r
-                       },\r
-\r
-                       importPluginLanguagePack : function(n) {\r
-                               tinymce.PluginManager.requireLangPack(n);\r
-                       },\r
-\r
-                       getButtonHTML : function(cn, lang, img, c, u, v) {\r
-                               var ed = EditorManager.activeEditor;\r
-\r
-                               img = img.replace(/\{\$pluginurl\}/g, tinyMCE.pluginURL);\r
-                               img = img.replace(/\{\$themeurl\}/g, tinyMCE.themeURL);\r
-                               lang = lang.replace(/^lang_/g, '');\r
-\r
-                               return ed.controlManager.createButton(cn, {\r
-                                       title : lang,\r
-                                       command : c,\r
-                                       ui : u,\r
-                                       value : v,\r
-                                       scope : this,\r
-                                       'class' : 'compat',\r
-                                       image : img\r
-                               });\r
-                       },\r
-\r
-                       addSelectAccessibility : function(e, s, w) {\r
-                               // Add event handlers \r
-                               if (!s._isAccessible) {\r
-                                       s.onkeydown = tinyMCE.accessibleEventHandler;\r
-                                       s.onblur = tinyMCE.accessibleEventHandler;\r
-                                       s._isAccessible = true;\r
-                                       s._win = w;\r
-                               }\r
-\r
-                               return false;\r
-                       },\r
-\r
-                       accessibleEventHandler : function(e) {\r
-                               var elm, win = this._win;\r
-\r
-                               e = tinymce.isIE ? win.event : e;\r
-                               elm = tinymce.isIE ? e.srcElement : e.target;\r
-\r
-                               // Unpiggyback onchange on blur\r
-                               if (e.type == "blur") {\r
-                                       if (elm.oldonchange) {\r
-                                               elm.onchange = elm.oldonchange;\r
-                                               elm.oldonchange = null;\r
-                                       }\r
-\r
-                                       return true;\r
-                               }\r
-\r
-                               // Piggyback onchange\r
-                               if (elm.nodeName == "SELECT" && !elm.oldonchange) {\r
-                                       elm.oldonchange = elm.onchange;\r
-                                       elm.onchange = null;\r
-                               }\r
-\r
-                               // Execute onchange and remove piggyback\r
-                               if (e.keyCode == 13 || e.keyCode == 32) {\r
-                                       elm.onchange = elm.oldonchange;\r
-                                       elm.onchange();\r
-                                       elm.oldonchange = null;\r
-\r
-                                       tinyMCE.cancelEvent(e);\r
-                                       return false;\r
-                               }\r
-\r
-                               return true;\r
-                       },\r
-\r
-                       cancelEvent : function(e) {\r
-                               return tinymce.dom.Event.cancel(e);\r
-                       },\r
-\r
-                       handleVisualAid : function(e) {\r
-                               EditorManager.activeEditor.addVisual(e);\r
-                       },\r
-\r
-                       getAbsPosition : function(n, r) {\r
-                               return tinymce.DOM.getPos(n, r);\r
-                       },\r
-\r
-                       cleanupEventStr : function(s) {\r
-                               s = "" + s;\r
-                               s = s.replace('function anonymous()\n{\n', '');\r
-                               s = s.replace('\n}', '');\r
-                               s = s.replace(/^return true;/gi, ''); // Remove event blocker\r
-\r
-                               return s;\r
-                       },\r
-\r
-                       getVisualAidClass : function(s) {\r
-                               // TODO: Implement\r
-                               return s;\r
-                       },\r
-\r
-                       parseStyle : function(s) {\r
-                               return this._getDOM().parseStyle(s);\r
-                       },\r
-\r
-                       serializeStyle : function(s) {\r
-                               return this._getDOM().serializeStyle(s);\r
-                       },\r
-\r
-                       openWindow : function(tpl, args) {\r
-                               var ed = EditorManager.activeEditor, o = {}, n;\r
-\r
-                               // Convert name/value array to object\r
-                               for (n in tpl)\r
-                                       o[n] = tpl[n];\r
-\r
-                               tpl = o;\r
-\r
-                               args = args || {};\r
-                               tpl.url = new tinymce.util.URI(tinymce.ThemeManager.themeURLs[ed.settings.theme]).toAbsolute(tpl.file);\r
-                               tpl.inline = tpl.inline || args.inline;\r
-\r
-                               ed.windowManager.open(tpl, args);\r
-                       },\r
-\r
-                       closeWindow : function(win) {\r
-                               EditorManager.activeEditor.windowManager.close(win);\r
-                       },\r
-\r
-                       getOuterHTML : function(e) {\r
-                               return tinymce.DOM.getOuterHTML(e);\r
-                       },\r
-\r
-                       setOuterHTML : function(e, h, d) {\r
-                               return tinymce.DOM.setOuterHTML(e, h, d);\r
-                       },\r
-\r
-                       hasPlugin : function(n) {\r
-                               return tinymce.PluginManager.get(n) != null;\r
-                       },\r
-\r
-                       _setEventsEnabled : function() {\r
-                               // Ignore it!!\r
-                       },\r
-\r
-                       addPlugin : function(pn, f) {\r
-                               var t = this;\r
-\r
-                               function PluginWrapper(ed) {\r
-                                       tinyMCE.selectedInstance = ed;\r
-\r
-                                       ed.onInit.add(function() {\r
-                                               t.settings = ed.settings;\r
-                                               t.settings['base_href'] = tinyMCE.documentBasePath;\r
-                                               tinyMCE.settings = t.settings;\r
-                                               tinyMCE.documentBasePath = ed.documentBasePath;\r
-                                               //ed.formElement = DOM.get(ed.id);\r
-\r
-                                               if (f.initInstance)\r
-                                                       f.initInstance(ed);\r
-\r
-                                               ed.contentDocument = ed.getDoc();\r
-                                               ed.contentWindow = ed.getWin();\r
-                                               ed.undoRedo = ed.undoManager;\r
-                                               ed.startContent = ed.getContent({format : 'raw'});\r
-\r
-                                               tinyMCE.instances[ed.id] = ed;\r
-                                               tinyMCE.loadedFiles = [];\r
-                                       });\r
-\r
-                                       ed.onActivate.add(function() {\r
-                                               tinyMCE.settings = ed.settings;\r
-                                               tinyMCE.selectedInstance = ed;\r
-                                       });\r
-\r
-                               /*      if (f.removeInstance) {\r
-                                               ed.onDestroy.add(function() {\r
-                                                       return f.removeInstance(ed.id);\r
-                                               });\r
-                                       }*/\r
-\r
-                                       if (f.handleNodeChange) {\r
-                                               ed.onNodeChange.add(function(ed, cm, n) {\r
-                                                       f.handleNodeChange(ed.id, n, 0, 0, false, !ed.selection.isCollapsed());\r
-                                               });\r
-                                       }\r
-\r
-                                       if (f.onChange) {\r
-                                               ed.onChange.add(function(ed, n) {\r
-                                                       return f.onChange(ed);\r
-                                               });\r
-                                       }\r
-\r
-                                       if (f.cleanup) {\r
-                                               ed.onGetContent.add(function() {\r
-                                                       //f.cleanup(type, content, inst);\r
-                                               });\r
-                                       }\r
-\r
-                                       this.getInfo = function() {\r
-                                               return f.getInfo();\r
-                                       };\r
-\r
-                                       this.createControl = function(n) {\r
-                                               tinyMCE.pluginURL = tinymce.baseURL + '/plugins/' + pn;\r
-                                               tinyMCE.themeURL = tinymce.baseURL + '/themes/' + tinyMCE.activeEditor.settings.theme;\r
-\r
-                                               if (f.getControlHTML)\r
-                                                       return f.getControlHTML(n);\r
-\r
-                                               return null;\r
-                                       };\r
-\r
-                                       this.execCommand = function(cmd, ui, val) {\r
-                                               if (f.execCommand)\r
-                                                       return f.execCommand(ed.id, ed.getBody(), cmd, ui, val);\r
-\r
-                                               return false;\r
-                                       };\r
-                               };\r
-\r
-                               tinymce.PluginManager.add(pn, PluginWrapper);\r
-                       },\r
-\r
-                       _getDOM : function() {\r
-                               return tinyMCE.activeEditor ? tinyMCE.activeEditor.dom : tinymce.DOM;\r
-                       },\r
-\r
-                       convertRelativeToAbsoluteURL : function(b, u) {\r
-                               return new tinymce.util.URI(b).toAbsolute(u);\r
-                       },\r
-\r
-                       convertAbsoluteURLToRelativeURL : function(b, u) {\r
-                               return new tinymce.util.URI(b).toRelative(u);\r
-                       }\r
-               });\r
-\r
-               // Extend Editor class\r
-               tinymce.extend(tinymce.Editor.prototype, {\r
-                       getFocusElement : function() {\r
-                               return this.selection.getNode();\r
-                       },\r
-\r
-                       getData : function(n) {\r
-                               if (!this.data)\r
-                                       this.data = [];\r
-\r
-                               if (!this.data[n])\r
-                                       this.data[n] = [];\r
-\r
-                               return this.data[n];\r
-                       },\r
-\r
-                       hasPlugin : function(n) {\r
-                               return this.plugins[n] != null;\r
-                       },\r
-\r
-                       getContainerWin : function() {\r
-                               return window;\r
-                       },\r
-\r
-                       getHTML : function(raw) {\r
-                               return this.getContent({ format : raw ? 'raw' : 'html'});\r
-                       },\r
-\r
-                       setHTML : function(h) {\r
-                               this.setContent(h);\r
-                       },\r
-\r
-                       getSel : function() {\r
-                               return this.selection.getSel();\r
-                       },\r
-\r
-                       getRng : function() {\r
-                               return this.selection.getRng();\r
-                       },\r
-\r
-                       isHidden : function() {\r
-                               var s;\r
-\r
-                               if (!tinymce.isGecko)\r
-                                       return false;\r
-\r
-                               s = this.getSel();\r
-\r
-                               // Weird, wheres that cursor selection?\r
-                               return (!s || !s.rangeCount || s.rangeCount == 0);\r
-                       },\r
-\r
-                       translate : function(s) {\r
-                               var c = this.settings.language, o;\r
-\r
-                               if (!s)\r
-                                       return s;\r
-\r
-                               o = tinymce.EditorManager.i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) {\r
-                                       return tinymce.EditorManager.i18n[c + '.' + b] || '{#' + b + '}';\r
-                               });\r
-\r
-                               o = o.replace(/{\$lang_([^}]+)\}/g, function(a, b) {\r
-                                       return tinymce.EditorManager.i18n[c + '.' + b] || '{$lang_' + b + '}';\r
-                               });\r
-\r
-                               return o;\r
-                       },\r
-\r
-                       repaint : function() {\r
-                               this.execCommand('mceRepaint');\r
-                       }\r
-               });\r
-\r
-               // Extend selection\r
-               tinymce.extend(tinymce.dom.Selection.prototype, {\r
-                       getSelectedText : function() {\r
-                               return this.getContent({format : 'text'});\r
-                       },\r
-\r
-                       getSelectedHTML : function() {\r
-                               return this.getContent({format : 'html'});\r
-                       },\r
-\r
-                       getFocusElement : function() {\r
-                               return this.getNode();\r
-                       },\r
-\r
-                       selectNode : function(node, collapse, select_text_node, to_start) {\r
-                               var t = this;\r
-\r
-                               t.select(node, select_text_node || 0);\r
-\r
-                               if (!is(collapse))\r
-                                       collapse = true;\r
-\r
-                               if (collapse) {\r
-                                       if (!is(to_start))\r
-                                               to_start = true;\r
-\r
-                                       t.collapse(to_start);\r
-                               }\r
-                       }\r
-               });\r
-       }).call(this);\r
-\r
-       // Register plugin\r
-       tinymce.PluginManager.add('compat2x', tinymce.plugins.Compat2x);\r
-})();\r
-\r
index 24ee2eb4a0b60d20c7685e1bba3e5584747ab312..9749e5164cf1ac14bf24d2360dcc00e5f5033fb5 100644 (file)
@@ -1 +1 @@
-(function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(d){var f=this;f.editor=d;f.onContextMenu=new tinymce.util.Dispatcher(this);d.onContextMenu.add(function(g,h){if(!h.ctrlKey){f._getMenu(g).showMenu(h.clientX,h.clientY);a.add(g.getDoc(),"click",e);a.cancel(h)}});function e(){if(f._menu){f._menu.removeAll();f._menu.destroy();a.remove(d.getDoc(),"click",e)}}d.onMouseDown.add(e);d.onKeyDown.add(e)},getInfo:function(){return{longname:"Contextmenu",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getMenu:function(h){var l=this,f=l._menu,i=h.selection,e=i.isCollapsed(),d=i.getNode()||h.getBody(),g,k,j;if(f){f.removeAll();f.destroy()}k=b.getPos(h.getContentAreaContainer());j=b.getPos(h.getContainer());f=h.controlManager.createDropMenu("contextmenu",{offset_x:k.x+h.getParam("contextmenu_offset_x",0),offset_y:k.y+h.getParam("contextmenu_offset_y",0),constrain:1});l._menu=f;f.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(e);f.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(e);f.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((d.nodeName=="A"&&!h.dom.getAttrib(d,"name"))||!e){f.addSeparator();f.add({title:"advanced.link_desc",icon:"link",cmd:h.plugins.advlink?"mceAdvLink":"mceLink",ui:true});f.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}f.addSeparator();f.add({title:"advanced.image_desc",icon:"image",cmd:h.plugins.advimage?"mceAdvImage":"mceImage",ui:true});f.addSeparator();g=f.addMenu({title:"contextmenu.align"});g.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});g.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});g.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});g.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});l.onContextMenu.dispatch(l,f,d,e);return f}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})();
\ No newline at end of file
+(function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(d){var f=this,g;f.editor=d;f.onContextMenu=new tinymce.util.Dispatcher(this);d.onContextMenu.add(function(h,i){if(!i.ctrlKey){if(g){h.selection.setRng(g)}f._getMenu(h).showMenu(i.clientX,i.clientY);a.add(h.getDoc(),"click",function(j){e(h,j)});a.cancel(i)}});d.onRemove.add(function(){if(f._menu){f._menu.removeAll()}});function e(h,i){g=null;if(i&&i.button==2){g=h.selection.getRng();return}if(f._menu){f._menu.removeAll();f._menu.destroy();a.remove(h.getDoc(),"click",e)}}d.onMouseDown.add(e);d.onKeyDown.add(e)},getInfo:function(){return{longname:"Contextmenu",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getMenu:function(h){var l=this,f=l._menu,i=h.selection,e=i.isCollapsed(),d=i.getNode()||h.getBody(),g,k,j;if(f){f.removeAll();f.destroy()}k=b.getPos(h.getContentAreaContainer());j=b.getPos(h.getContainer());f=h.controlManager.createDropMenu("contextmenu",{offset_x:k.x+h.getParam("contextmenu_offset_x",0),offset_y:k.y+h.getParam("contextmenu_offset_y",0),constrain:1});l._menu=f;f.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(e);f.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(e);f.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((d.nodeName=="A"&&!h.dom.getAttrib(d,"name"))||!e){f.addSeparator();f.add({title:"advanced.link_desc",icon:"link",cmd:h.plugins.advlink?"mceAdvLink":"mceLink",ui:true});f.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}f.addSeparator();f.add({title:"advanced.image_desc",icon:"image",cmd:h.plugins.advimage?"mceAdvImage":"mceImage",ui:true});f.addSeparator();g=f.addMenu({title:"contextmenu.align"});g.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});g.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});g.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});g.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});l.onContextMenu.dispatch(l,f,d,e);return f}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})();
\ No newline at end of file
index a2c1866ba56d00fea8796f57c95dfc03a7340407..13813a64e4630df01ed620a1d04554c00c4ad939 100644 (file)
@@ -1,29 +1,74 @@
 /**\r
- * $Id: editor_plugin_src.js 848 2008-05-15 11:54:40Z spocke $\r
+ * editor_plugin_src.js\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 (function() {\r
        var Event = tinymce.dom.Event, each = tinymce.each, DOM = tinymce.DOM;\r
 \r
+       /**\r
+        * This plugin a context menu to TinyMCE editor instances.\r
+        *\r
+        * @class tinymce.plugins.ContextMenu\r
+        */\r
        tinymce.create('tinymce.plugins.ContextMenu', {\r
+               /**\r
+                * Initializes the plugin, this will be executed after the plugin has been created.\r
+                * This call is done before the editor instance has finished it's initialization so use the onInit event\r
+                * of the editor instance to intercept that event.\r
+                *\r
+                * @method init\r
+                * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.\r
+                * @param {string} url Absolute URL to where the plugin is located.\r
+                */\r
                init : function(ed) {\r
-                       var t = this;\r
+                       var t = this, lastRng;\r
 \r
                        t.editor = ed;\r
+\r
+                       /**\r
+                        * This event gets fired when the context menu is shown.\r
+                        *\r
+                        * @event onContextMenu\r
+                        * @param {tinymce.plugins.ContextMenu} sender Plugin instance sending the event.\r
+                        * @param {tinymce.ui.DropMenu} menu Drop down menu to fill with more items if needed.\r
+                        */\r
                        t.onContextMenu = new tinymce.util.Dispatcher(this);\r
 \r
                        ed.onContextMenu.add(function(ed, e) {\r
                                if (!e.ctrlKey) {\r
+                                       // Restore the last selection since it was removed\r
+                                       if (lastRng)\r
+                                               ed.selection.setRng(lastRng);\r
+\r
                                        t._getMenu(ed).showMenu(e.clientX, e.clientY);\r
-                                       Event.add(ed.getDoc(), 'click', hide);\r
+                                       Event.add(ed.getDoc(), 'click', function(e) {\r
+                                               hide(ed, e);\r
+                                       });\r
                                        Event.cancel(e);\r
                                }\r
                        });\r
 \r
-                       function hide() {\r
+                       ed.onRemove.add(function() {\r
+                               if (t._menu)\r
+                                       t._menu.removeAll();\r
+                       });\r
+\r
+                       function hide(ed, e) {\r
+                               lastRng = null;\r
+\r
+                               // Since the contextmenu event moves\r
+                               // the selection we need to store it away\r
+                               if (e && e.button == 2) {\r
+                                       lastRng = ed.selection.getRng();\r
+                                       return;\r
+                               }\r
+\r
                                if (t._menu) {\r
                                        t._menu.removeAll();\r
                                        t._menu.destroy();\r
                        ed.onKeyDown.add(hide);\r
                },\r
 \r
+               /**\r
+                * Returns information about the plugin as a name/value array.\r
+                * The current keys are longname, author, authorurl, infourl and version.\r
+                *\r
+                * @method getInfo\r
+                * @return {Object} Name/value array containing information about the plugin.\r
+                */\r
                getInfo : function() {\r
                        return {\r
                                longname : 'Contextmenu',\r
index 81818e37ca211de530a6be0a45b5aac5e0422285..4444959bf31bb3a7a22b947305fafdbd5d446939 100644 (file)
@@ -1,8 +1,11 @@
 /**\r
- * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $\r
+ * editor_plugin_src.js\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 (function() {\r
index 4783bc371677400b356f6a29622c9aafdd4497cd..dbdd8ffb58e18bb673bd3ffce5fafe6959f1e229 100644 (file)
@@ -1 +1 @@
-(function(){tinymce.create("tinymce.plugins.EmotionsPlugin",{init:function(a,b){a.addCommand("mceEmotion",function(){a.windowManager.open({file:b+"/emotions.htm",width:250+parseInt(a.getLang("emotions.delta_width",0)),height:160+parseInt(a.getLang("emotions.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("emotions",{title:"emotions.emotions_desc",cmd:"mceEmotion"})},getInfo:function(){return{longname:"Emotions",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("emotions",tinymce.plugins.EmotionsPlugin)})();
\ No newline at end of file
+(function(a){a.create("tinymce.plugins.EmotionsPlugin",{init:function(b,c){b.addCommand("mceEmotion",function(){b.windowManager.open({file:c+"/emotions.htm",width:250+parseInt(b.getLang("emotions.delta_width",0)),height:160+parseInt(b.getLang("emotions.delta_height",0)),inline:1},{plugin_url:c})});b.addButton("emotions",{title:"emotions.emotions_desc",cmd:"mceEmotion"})},getInfo:function(){return{longname:"Emotions",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("emotions",a.plugins.EmotionsPlugin)})(tinymce);
\ No newline at end of file
index df0d370aeab690245bf03bb35623dd7b180720d0..71d5416972366df4916c848dd1fc271f8f3ffd55 100644 (file)
@@ -1,11 +1,14 @@
 /**\r
- * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $\r
+ * editor_plugin_src.js\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
-(function() {\r
+(function(tinymce) {\r
        tinymce.create('tinymce.plugins.EmotionsPlugin', {\r
                init : function(ed, url) {\r
                        // Register commands\r
@@ -37,4 +40,4 @@
 \r
        // Register plugin\r
        tinymce.PluginManager.add('emotions', tinymce.plugins.EmotionsPlugin);\r
-})();
\ No newline at end of file
+})(tinymce);
\ No newline at end of file
index 98c794e26781d8252978481e5ff65cc059f20852..95e1fd5d934177e8996f8a6034e153a028f7a850 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n('ar.emotions_dlg',{\r
-title:"\u0625\u062F\u0631\u0627\u062C \u0627\u0628\u062A\u0633\u0627\u0645\u0629",\r
-desc:"\u0627\u0644\u0625\u0628\u062A\u0633\u0627\u0645\u0627\u062A",\r
+title:"Insert emotion",\r
+desc:"Emotions",\r
 cool:"Cool",\r
 cry:"Cry",\r
 embarassed:"Embarassed",\r
diff --git a/program/js/tiny_mce/plugins/emotions/langs/az_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/az_dlg.js
new file mode 100644 (file)
index 0000000..74a46a0
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('az.emotions_dlg',{\r
+title:"Smayl \u0259lav\u0259 et",\r
+desc:"Smayllar",\r
+cool:"Bomba",\r
+cry:"A\u011Flay\u0131r",\r
+embarassed:"Mat qalm\u0131\u015F",\r
+foot_in_mouth:"Ayaqlar_m\u0259nim_a\u011Fz\u0131ma!",\r
+frown:"Qa\u015Fqabaql\u0131",\r
+innocent:"G\u00FCnahs\u0131z",\r
+kiss:"\u00D6p\u00FC\u015F",\r
+laughing:"G\u00FCl\u00FCr",\r
+money_mouth:"\u00C7oxlu pul",\r
+sealed:"M\u00F6h\u00FCrl\u0259nib",\r
+smile:"G\u00FCl\u00FCms\u0259yir",\r
+surprised:"T\u0259\u0259c\u00FCbl\u0259nib",\r
+tongue_out:"Dil g\u00F6st\u0259rir",\r
+undecided:"Q\u0259rars\u0131zl\u0131qda",\r
+wink:"G\u00F6z vurur",\r
+yell:"Ba\u011F\u0131r\u0131r"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/be_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/be_dlg.js
new file mode 100644 (file)
index 0000000..fff987e
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('be.emotions_dlg',{\r
+title:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044C \u0441\u043C\u0430\u0439\u043B\u0456\u043A",\r
+desc:"\u0421\u043C\u0430\u0439\u043B\u0456\u043A\u0456",\r
+cool:"\u041A\u043B\u0451\u0432\u044B",\r
+cry:"\u041F\u043B\u0430\u0447\u0430",\r
+embarassed:"\u0410\u0447\u043C\u0443\u0440\u044D\u045E",\r
+foot_in_mouth:"\u0423_\u0440\u043E\u0442_\u043C\u043D\u0435_\u043D\u043E\u0433\u0456!",\r
+frown:"\u0425\u043C\u0443\u0440\u043D\u044B",\r
+innocent:"\u041D\u044F\u0432\u0456\u043D\u043D\u0430\u0441\u0446\u044C",\r
+kiss:"\u041F\u0430\u0446\u0430\u043B\u0443\u043D\u0430\u043A",\r
+laughing:"\u0421\u043C\u044F\u0435\u0446\u0446\u0430",\r
+money_mouth:"\u0428\u043C\u0430\u0442 \u0433\u0440\u043E\u0448\u0430\u0439",\r
+sealed:"\u0417\u0430\u043F\u044F\u0447\u0430\u0442\u0430\u043D\u0430",\r
+smile:"\u0423\u0441\u043C\u0456\u0445\u0430\u0435\u0446\u0446\u0430",\r
+surprised:"\u0417\u0434\u0437\u0456\u045E\u043B\u0435\u043D\u044B",\r
+tongue_out:"\u041F\u0430\u043A\u0430\u0437\u0432\u0430\u0435 \u044F\u0437\u044B\u043A",\r
+undecided:"\u0423 \u043D\u0435\u0440\u0430\u0448\u0443\u0447\u0430\u0441\u0446\u0456",\r
+wink:"\u041F\u0430\u0434\u043C\u043E\u0440\u0433\u0432\u0430\u0435",\r
+yell:"\u041B\u044F\u043C\u0430\u043D\u0442\u0443\u0435"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/bn_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/bn_dlg.js
new file mode 100644 (file)
index 0000000..a87ad47
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('bn.emotions_dlg',{\r
+title:"Insert emotion",\r
+desc:"Emotions",\r
+cool:"Cool",\r
+cry:"Cry",\r
+embarassed:"Embarassed",\r
+foot_in_mouth:"Foot in mouth",\r
+frown:"Frown",\r
+innocent:"Innocent",\r
+kiss:"Kiss",\r
+laughing:"Laughing",\r
+money_mouth:"Money mouth",\r
+sealed:"Sealed",\r
+smile:"Smile",\r
+surprised:"Surprised",\r
+tongue_out:"Tongue out",\r
+undecided:"Undecided",\r
+wink:"Wink",\r
+yell:"Yell"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/br_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/br_dlg.js
new file mode 100644 (file)
index 0000000..3004d09
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('br.emotions_dlg',{\r
+title:"Inserir emoticon",\r
+desc:"Emoticons",\r
+cool:"Fixe",\r
+cry:"Chor\u00E3o",\r
+embarassed:"Embara\u00E7ado",\r
+foot_in_mouth:"Disse asneira",\r
+frown:"Decep\u00E7\u00E3o",\r
+innocent:"Inocente",\r
+kiss:"Beijo",\r
+laughing:"Riso",\r
+money_mouth:"Avarez",\r
+sealed:"Boca Fechada",\r
+smile:"Sorriso",\r
+surprised:"Surpresa",\r
+tongue_out:"L\u00EDngua de fora",\r
+undecided:"Indeciso",\r
+wink:"Piscadela",\r
+yell:"Irado"\r
+});
\ No newline at end of file
index 684455105ce5b878d69304f85e69ff12f9b022e2..e54064b6b35691341ba14f8b6d40fdbe80ac4a52 100755 (executable)
@@ -1,20 +1,20 @@
 tinyMCE.addI18n('ca.emotions_dlg',{\r
-title:"Insereix emoticona",\r
+title:"Insereix una emoticona",\r
 desc:"Emoticones",\r
-cool:"Ben parit",\r
-cry:"Plor",\r
-embarassed:"Vergonya",\r
-foot_in_mouth:"Muts i a la g\u00E0bia",\r
-frown:"Indiferent",\r
+cool:"Guai",\r
+cry:"Plorant",\r
+embarassed:"Avergonyit",\r
+foot_in_mouth:"Amb un peu a la boca",\r
+frown:"Arrufant les celles",\r
 innocent:"Innocent",\r
 kiss:"Pet\u00F3",\r
-laughing:"Rialla",\r
-money_mouth:"Boca de diner",\r
-sealed:"Segellada",\r
+laughing:"Rient",\r
+money_mouth:"Amb fam de diners",\r
+sealed:"Censurat",\r
 smile:"Somriure",\r
-surprised:"Sorpresa",\r
-tongue_out:"Treu la llengua",\r
-undecided:"Indecisa",\r
-wink:"Pica l'ullet",\r
-yell:"Crit"\r
+surprised:"Sorpr\u00E8s",\r
+tongue_out:"Llengua a fora",\r
+undecided:"Indec\u00EDs",\r
+wink:"Fent l\'ullet",\r
+yell:"Cridant"\r
 });
\ No newline at end of file
index 7ce422da013191b8268bac84eeab16c48e4136fd..71bc620e333a1a844e966dfd412f462812b8479b 100755 (executable)
@@ -1,20 +1,20 @@
 tinyMCE.addI18n('cs.emotions_dlg',{\r
-title:"Vlo\u017Eit emotikon",\r
+title:"Vlo\u017Eit emotikonu",\r
 desc:"Emotikony",\r
-cool:"Cool",\r
-cry:"Cry",\r
-embarassed:"Embarassed",\r
-foot_in_mouth:"Foot in mouth",\r
-frown:"Frown",\r
-innocent:"Innocent",\r
-kiss:"Kiss",\r
-laughing:"Laughing",\r
-money_mouth:"Money mouth",\r
-sealed:"Sealed",\r
-smile:"Smile",\r
-surprised:"Surprised",\r
-tongue_out:"Tongue out",\r
-undecided:"Undecided",\r
-wink:"Wink",\r
-yell:"Yell"\r
+cool:"\u00DA\u017Easn\u00FD",\r
+cry:"Pla\u010D\u00EDc\u00ED",\r
+embarassed:"Rozpa\u010Dit\u00FD",\r
+foot_in_mouth:"\u0160l\u00E1pnul vedle",\r
+frown:"Zamra\u010Den\u00FD",\r
+innocent:"Nevinn\u00FD",\r
+kiss:"L\u00EDbaj\u00EDc\u00ED",\r
+laughing:"Sm\u011Bj\u00EDc\u00ED se",\r
+money_mouth:"Je na prachy",\r
+sealed:"Ml\u010D\u00EDc\u00ED",\r
+smile:"Usm\u00EDvaj\u00EDc\u00ED se",\r
+surprised:"P\u0159ekvapen\u00FD",\r
+tongue_out:"S vyplazen\u00FDm jazykem",\r
+undecided:"Nerozhodn\u00FD",\r
+wink:"Mrkaj\u00EDc\u00ED",\r
+yell:"K\u0159i\u010D\u00EDc\u00ED"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/cy_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/cy_dlg.js
new file mode 100644 (file)
index 0000000..73de092
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('cy.emotions_dlg',{\r
+title:"Mewnosod emosiwn",\r
+desc:"Emosiynau",\r
+cool:"Iawn",\r
+cry:"Crio",\r
+embarassed:"Rhwystrus",\r
+foot_in_mouth:"Troed yn ceg",\r
+frown:"Cuchio",\r
+innocent:"Dieuog",\r
+kiss:"Sws",\r
+laughing:"Chwerthin",\r
+money_mouth:"Ceg arian",\r
+sealed:"Wedi'i selio",\r
+smile:"Gw\u00EAn",\r
+surprised:"Wedi synnu",\r
+tongue_out:"Tafod allan",\r
+undecided:"Heb penderfynu",\r
+wink:"Wincio",\r
+yell:"Gweiddi"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/eu_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/eu_dlg.js
new file mode 100644 (file)
index 0000000..a96d6f5
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('eu.emotions_dlg',{\r
+title:"Ikonotxoa sartu",\r
+desc:"Ikonotsoak",\r
+cool:"Ondo",\r
+cry:"Negarrez",\r
+embarassed:"Lotsatuta",\r
+foot_in_mouth:"Hanka ahoan",\r
+frown:"Desadostasuna",\r
+innocent:"Ni ez naiz izan",\r
+kiss:"Muxua",\r
+laughing:"Barrez",\r
+money_mouth:"Ahoa diruz beteta",\r
+sealed:"Ixilik",\r
+smile:"Irriparra",\r
+surprised:"Harrituta",\r
+tongue_out:"Mihia atera",\r
+undecided:"Zalantzan",\r
+wink:"Keinua",\r
+yell:"Ohiua"\r
+});
\ No newline at end of file
index 0550d25b547424861c08d1a1b5c6989b2d521abf..9c29a18b19d1d36e6354dbc17f688eb737d701cc 100755 (executable)
@@ -1,20 +1,20 @@
 tinyMCE.addI18n('fa.emotions_dlg',{\r
-title:"\u062F\u0631\u062C \u0634\u06A9\u0644\u06A9",\r
-desc:"\u0634\u06A9\u0644\u06A9\u200C\u0647\u0627",\r
-cool:"\u062E\u0648\u0646\u0633\u0631\u062F",\r
-cry:"Cry",\r
-embarassed:"Embarassed",\r
-foot_in_mouth:"Foot in mouth",\r
-frown:"Frown",\r
-innocent:"Innocent",\r
-kiss:"Kiss",\r
-laughing:"Laughing",\r
-money_mouth:"Money mouth",\r
-sealed:"Sealed",\r
-smile:"Smile",\r
-surprised:"Surprised",\r
-tongue_out:"Tongue out",\r
-undecided:"Undecided",\r
-wink:"\u0686\u0634\u0645\u06A9",\r
-yell:"Yell"\r
+title:"\u062F\u0631\u062C \u0634\u0643\u0644\u0643",\r
+desc:"\u0634\u0643\u0644\u0643 \u0647\u0627",\r
+cool:"\u0622\u0631\u0627\u0645",\r
+cry:"\u06AF\u0631\u06CC\u0647",\r
+embarassed:"\u062E\u062C\u0627\u0644\u062A\u06CC",\r
+foot_in_mouth:"\u067E\u0627 \u062F\u0631 \u062F\u0647\u0627\u0646",\r
+frown:"\u0627\u062E\u0645",\r
+innocent:"\u0628\u06CC \u062A\u0642\u0635\u06CC\u0631",\r
+kiss:"\u0628\u0648\u0633\u0647",\r
+laughing:"\u062E\u0646\u062F\u0647",\r
+money_mouth:"\u067E\u0648\u0644 \u062F\u0631 \u062F\u0647\u0627\u0646",\r
+sealed:"\u0645\u0647\u0631 \u0634\u062F\u0647",\r
+smile:"\u0644\u0628\u062E\u0646\u062F",\r
+surprised:"\u0645\u062A\u0639\u062C\u0628",\r
+tongue_out:"\u0632\u0628\u0627\u0646 \u062F\u0631\u0627\u0632\u06CC",\r
+undecided:"\u0645\u0631\u062F\u062F",\r
+wink:"\u0686\u0634\u0645\u0643",\r
+yell:"\u0641\u0631\u06CC\u0627\u062F"\r
 });
\ No newline at end of file
index b47571864dfeb925768657742ddf8f95ce519c53..e9ba93d8c9c1c5630d040846b0ff28c92bb2b262 100755 (executable)
@@ -1,9 +1,9 @@
 tinyMCE.addI18n('fr.emotions_dlg',{\r
-title:"Ins\u00E9rer \u00E9motion",\r
-desc:"\u00C9motions",\r
+title:"Ins\u00E9rer une \u00E9motic\u00F4ne",\r
+desc:"\u00C9motic\u00F4nes",\r
 cool:"Cool",\r
 cry:"En pleurs",\r
-embarassed:"Embarass\u00E9",\r
+embarassed:"Embarrass\u00E9",\r
 foot_in_mouth:"Pied de nez",\r
 frown:"D\u00E9\u00E7u",\r
 innocent:"Innocent",\r
@@ -14,7 +14,7 @@ sealed:"Bouche cousue",
 smile:"Sourire",\r
 surprised:"Surpris",\r
 tongue_out:"Langue tir\u00E9e",\r
-undecided:"Non d\u00E9cid\u00E9",\r
-wink:"Clin d'oeil",\r
+undecided:"Incertain",\r
+wink:"Clin d'\u0153il",\r
 yell:"Criant"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/gl_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/gl_dlg.js
new file mode 100644 (file)
index 0000000..20c507d
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('gl.emotions_dlg',{\r
+title:"Insertar emoticon",\r
+desc:"Emoticones",\r
+cool:"Guay",\r
+cry:"Chora",\r
+embarassed:"Vergo\u00F1a",\r
+foot_in_mouth:"A que dixen",\r
+frown:"Triste",\r
+innocent:"Inocente",\r
+kiss:"Beso",\r
+laughing:"Risa",\r
+money_mouth:"Cartos",\r
+sealed:"Selado",\r
+smile:"Sorriso",\r
+surprised:"Sorprendido",\r
+tongue_out:"Canso",\r
+undecided:"Indeciso",\r
+wink:"Gui\u00F1o",\r
+yell:"Anoxado"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/hi_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/hi_dlg.js
new file mode 100644 (file)
index 0000000..63ad7cc
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('hi.emotions_dlg',{\r
+title:"Insert emotion",\r
+desc:"Emotions",\r
+cool:"Cool",\r
+cry:"Cry",\r
+embarassed:"Embarassed",\r
+foot_in_mouth:"Foot in mouth",\r
+frown:"Frown",\r
+innocent:"Innocent",\r
+kiss:"Kiss",\r
+laughing:"Laughing",\r
+money_mouth:"Money mouth",\r
+sealed:"Sealed",\r
+smile:"Smile",\r
+surprised:"Surprised",\r
+tongue_out:"Tongue out",\r
+undecided:"Undecided",\r
+wink:"Wink",\r
+yell:"Yell"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/hy_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/hy_dlg.js
new file mode 100644 (file)
index 0000000..c605ede
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('hy.emotions_dlg',{\r
+title:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C \u057D\u0574\u0561\u0575\u056C\u056B\u056F",\r
+desc:"\u054D\u0574\u0561\u0575\u056C\u056B\u056F\u0576\u0565\u0580",\r
+cool:"Cool",\r
+cry:"Cry",\r
+embarassed:"Embarassed",\r
+foot_in_mouth:"Foot in mouth",\r
+frown:"Frown",\r
+innocent:"Innocent",\r
+kiss:"Kiss",\r
+laughing:"Laughing",\r
+money_mouth:"Money mouth",\r
+sealed:"Sealed",\r
+smile:"Smile",\r
+surprised:"Surprised",\r
+tongue_out:"Tongue out",\r
+undecided:"Undecided",\r
+wink:"Wink",\r
+yell:"Yell"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/ia_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/ia_dlg.js
new file mode 100644 (file)
index 0000000..bea24eb
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('ia.emotions_dlg',{\r
+title:"\u63D2\u5165\u8868\u60C5",\r
+desc:"\u8868\u60C5\u5217\u8868",\r
+cool:"\u51B7\u9177",\r
+cry:"\u54ED\u6CE3",\r
+embarassed:"\u5C34\u5C2C",\r
+foot_in_mouth:"\u54A7\u5634",\r
+frown:"\u76B1\u7709",\r
+innocent:"\u5929\u771F",\r
+kiss:"\u543B",\r
+laughing:"\u5927\u7B11",\r
+money_mouth:"\u53D1\u8D22",\r
+sealed:"\u4FDD\u5BC6",\r
+smile:"\u5FAE\u7B11",\r
+surprised:"\u60CA\u5413",\r
+tongue_out:"\u5410\u820C\u5934",\r
+undecided:"\u601D\u8003",\r
+wink:"\u7728\u773C",\r
+yell:"\u53EB\u56B7"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/id_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/id_dlg.js
new file mode 100644 (file)
index 0000000..de275d5
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('id.emotions_dlg',{\r
+title:"sisipkan emotion",\r
+desc:"Emotions",\r
+cool:"Cool",\r
+cry:"Cry",\r
+embarassed:"Embarassed",\r
+foot_in_mouth:"Foot in mouth",\r
+frown:"Frown",\r
+innocent:"Innocent",\r
+kiss:"Kiss",\r
+laughing:"Laughing",\r
+money_mouth:"Money mouth",\r
+sealed:"Sealed",\r
+smile:"Smile",\r
+surprised:"Surprised",\r
+tongue_out:"Tongue out",\r
+undecided:"Undecided",\r
+wink:"Wink",\r
+yell:"Yell"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/ka_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/ka_dlg.js
new file mode 100644 (file)
index 0000000..41d0b19
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('ka.emotions_dlg',{\r
+title:"\u10E1\u10DB\u10D0\u10D8\u10DA\u10D8\u10E1 \u10D0\u10E0\u10E9\u10D4\u10D5\u10D0",\r
+desc:"\u10E1\u10DB\u10D0\u10D8\u10DA\u10D4\u10D1\u10D8",\r
+cool:"Cool",\r
+cry:"Cry",\r
+embarassed:"Embarassed",\r
+foot_in_mouth:"Foot in mouth",\r
+frown:"Frown",\r
+innocent:"Innocent",\r
+kiss:"Kiss",\r
+laughing:"Laughing",\r
+money_mouth:"Money mouth",\r
+sealed:"Sealed",\r
+smile:"Smile",\r
+surprised:"Surprised",\r
+tongue_out:"Tongue out",\r
+undecided:"Undecided",\r
+wink:"Wink",\r
+yell:"Yell"\r
+});
\ No newline at end of file
index f52877d0717c30a9b9f9a8e039a8878149126964..e3b958e203ec389de868af6af78627b8e34d2b49 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n('lt.emotions_dlg',{\r
-title:"\u012Eterpti emotikon\u0105",\r
-desc:"Emotikonai",\r
+title:"\u012Eterpti jaustuk\u0105",\r
+desc:"Jaustukai",\r
 cool:"J\u0117ga",\r
 cry:"Verksmas",\r
 embarassed:"Susig\u0117d\u0119s",\r
index f98e1da70134f655381db1bf1f643217e649aa06..39f797d943ddc89cb2afcb534575792259197896 100755 (executable)
@@ -5,7 +5,7 @@ cool:"Stoer",
 cry:"Huilen",\r
 embarassed:"Schamen",\r
 foot_in_mouth:"Verstomd",\r
-frown:"Wenkbrouw ophalen",\r
+frown:"Wenkbrauw ophalen",\r
 innocent:"Onschuldig",\r
 kiss:"Zoenen",\r
 laughing:"Lachen",\r
diff --git a/program/js/tiny_mce/plugins/emotions/langs/no_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/no_dlg.js
new file mode 100644 (file)
index 0000000..698a8d8
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('no.emotions_dlg',{\r
+title:"Sett inn hum\u00F8rfjes",\r
+desc:"Hum\u00F8rfjes",\r
+cool:"Cool",\r
+cry:"Gret",\r
+embarassed:"Flau",\r
+foot_in_mouth:"Fot i munnen",\r
+frown:"Skuffa",\r
+innocent:"Uskyldig",\r
+kiss:"Kyss",\r
+laughing:"Ler",\r
+money_mouth:"Pengar i munnen",\r
+sealed:"Hemmelig",\r
+smile:"Glad",\r
+surprised:"Overraska",\r
+tongue_out:"Rekke tunge",\r
+undecided:"Skeptisk",\r
+wink:"Blunke",\r
+yell:"Skrik"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/ps_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/ps_dlg.js
new file mode 100644 (file)
index 0000000..918d1e1
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('ps.emotions_dlg',{\r
+title:"Insert emotion",\r
+desc:"Emotions",\r
+cool:"Cool",\r
+cry:"Cry",\r
+embarassed:"Embarassed",\r
+foot_in_mouth:"Foot in mouth",\r
+frown:"Frown",\r
+innocent:"Innocent",\r
+kiss:"Kiss",\r
+laughing:"Laughing",\r
+money_mouth:"Money mouth",\r
+sealed:"Sealed",\r
+smile:"Smile",\r
+surprised:"Surprised",\r
+tongue_out:"Tongue out",\r
+undecided:"Undecided",\r
+wink:"Wink",\r
+yell:"Yell"\r
+});
\ No newline at end of file
index 3199893f2705eaac24b028b6c54984053cc7cc8b..c79cec8e4d7318dbb1d24853e4c26685b61e1bb3 100755 (executable)
@@ -1,20 +1,20 @@
 tinyMCE.addI18n('pt.emotions_dlg',{\r
 title:"Inserir emoticon",\r
 desc:"Emoticons",\r
-cool:"Legal",\r
+cool:"Fixe",\r
 cry:"Chor\u00E3o",\r
 embarassed:"Embara\u00E7ado",\r
-foot_in_mouth:"Falei bobagem",\r
+foot_in_mouth:"Disse asneira",\r
 frown:"Decep\u00E7\u00E3o",\r
 innocent:"Inocente",\r
 kiss:"Beijo",\r
 laughing:"Riso",\r
-money_mouth:"Olho no dinheiro",\r
-sealed:"Bico calado",\r
+money_mouth:"Avarez",\r
+sealed:"Boca Fechada",\r
 smile:"Sorriso",\r
 surprised:"Surpresa",\r
 tongue_out:"L\u00EDngua de fora",\r
 undecided:"Indeciso",\r
 wink:"Piscadela",\r
-yell:"Ira"\r
+yell:"Irado"\r
 });
\ No newline at end of file
index 18e1bc7586474eb2920e7d469f9c69102d6264b8..223ee6bdc1ec012d6c1a9dc7e5da6497122544ca 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n('ro.emotions_dlg',{\r
-title:"Insereaz\u0103 emoticon",\r
-desc:"Emo\u0163ii",\r
+title:"Insereaz\u0103 o figurin\u0103",\r
+desc:"Figurine emotive",\r
 cool:"Cool",\r
 cry:"Trist",\r
 embarassed:"Ru\u015Finat",\r
@@ -16,5 +16,5 @@ surprised:"Surprins",
 tongue_out:"Cu limba afar\u0103",\r
 undecided:"Indecis",\r
 wink:"Face cu ochiul",\r
-yell:"\u0162ipa"\r
+yell:"\u0162ip\u0103"\r
 });
\ No newline at end of file
index e0bcf36eb4a2868d46094bde9c340120cbb76f9e..5186e0a351e97f8a34d51857fb2cd001f61dd56a 100755 (executable)
@@ -1,20 +1,20 @@
 tinyMCE.addI18n('ru.emotions_dlg',{\r
-title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u043C\u0430\u0439\u043B\u0438\u043A",\r
-desc:"\u0421\u043C\u0430\u0439\u043B\u0438\u043A\u0438",\r
-cool:"\u041A\u043B\u0451\u0432\u044B\u0439",\r
-cry:"\u041F\u043B\u0430\u0447\u0435\u0442",\r
-embarassed:"\u041E\u0431\u0430\u043B\u0434\u0435\u043B",\r
-foot_in_mouth:"\u041D\u043E\u0433\u0430 \u0432\u043E \u0440\u0442\u0443",\r
-frown:"\u0425\u043C\u0443\u0440\u044B\u0439",\r
-innocent:"\u041D\u0435\u0432\u0438\u043D\u043D\u043E\u0441\u0442\u044C",\r
-kiss:"\u041F\u043E\u0446\u0435\u043B\u0443\u0439",\r
-laughing:"\u0421\u043C\u0435\u0451\u0442\u0441\u044F",\r
-money_mouth:"\u041C\u043D\u043E\u0433\u043E \u0434\u0435\u043D\u0435\u0433",\r
-sealed:"\u0417\u0430\u043F\u0435\u0447\u0430\u0442\u0430\u043D\u043E",\r
-smile:"\u0423\u043B\u044B\u0431\u0430\u0435\u0442\u0441\u044F",\r
-surprised:"\u0423\u0434\u0438\u0432\u043B\u0451\u043D",\r
-tongue_out:"\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u044F\u0437\u044B\u043A",\r
-undecided:"\u0412 \u043D\u0435\u0440\u0435\u0448\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438",\r
-wink:"\u041F\u043E\u0434\u043C\u0438\u0433\u0438\u0432\u0430\u0435\u0442",\r
-yell:"\u0412\u043E\u043F\u0438\u0442"\r
+title:"\u0412\u044B\u0431\u043E\u0440 \u0441\u043C\u0430\u0439\u043B\u0430",\r
+desc:"\u0421\u043C\u0430\u0439\u043B\u044B",\r
+cool:"Cool",\r
+cry:"Cry",\r
+embarassed:"Embarassed",\r
+foot_in_mouth:"Foot in mouth",\r
+frown:"Frown",\r
+innocent:"Innocent",\r
+kiss:"Kiss",\r
+laughing:"Laughing",\r
+money_mouth:"Money mouth",\r
+sealed:"Sealed",\r
+smile:"Smile",\r
+surprised:"Surprised",\r
+tongue_out:"Tongue out",\r
+undecided:"Undecided",\r
+wink:"Wink",\r
+yell:"Yell"\r
 });
\ No newline at end of file
index 8cdd1c190857953acbf2fa43fa585d5d9ab81b2c..b160f7398f687c58ffb998ea5d05ff50b1000aa3 100755 (executable)
@@ -1,20 +1,20 @@
 tinyMCE.addI18n('sk.emotions_dlg',{\r
-title:"Vlo\u017Ei\u0165 emotikon",\r
+title:"Vlo\u017Ei\u0165 emotikonu",\r
 desc:"Emotikony",\r
-cool:"Cool",\r
-cry:"Cry",\r
-embarassed:"Embarassed",\r
-foot_in_mouth:"Foot in mouth",\r
-frown:"Frown",\r
-innocent:"Innocent",\r
-kiss:"Kiss",\r
-laughing:"Laughing",\r
-money_mouth:"Money mouth",\r
-sealed:"Sealed",\r
-smile:"Smile",\r
-surprised:"Surprised",\r
-tongue_out:"Tongue out",\r
-undecided:"Undecided",\r
-wink:"Wink",\r
-yell:"Yell"\r
+cool:"\u00DA\u017Easn\u00FD",\r
+cry:"Pla\u010D\u00FAci",\r
+embarassed:"Zahanben\u00FD",\r
+foot_in_mouth:"\u0160liapol ved\u013Ea",\r
+frown:"Zamra\u010Den\u00FD",\r
+innocent:"Nevinn\u00FD",\r
+kiss:"Bozkaj\u00FAci",\r
+laughing:"Smej\u00FAci sa",\r
+money_mouth:"Je na prachy",\r
+sealed:"Ml\u010Diaci",\r
+smile:"Usmiaty",\r
+surprised:"Prekvapen\u00FD",\r
+tongue_out:"S vyplazen\u00FDm jazykom",\r
+undecided:"Nerozhodn\u00FD",\r
+wink:"\u017Dmurkaj\u00FAci",\r
+yell:"Kri\u010Diaci"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/sq_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/sq_dlg.js
new file mode 100644 (file)
index 0000000..05349ec
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('sq.emotions_dlg',{\r
+title:"Fut emocion",\r
+desc:"Emocionet",\r
+cool:"I/e lezetsh\u00EBm",\r
+cry:"Qaj",\r
+embarassed:"Turp",\r
+foot_in_mouth:"K\u00EBmba n\u00EB goj\u00EB",\r
+frown:"Rrudh vetullat",\r
+innocent:"I/e pafajsh\u00EBm",\r
+kiss:"Puth",\r
+laughing:"Qesh",\r
+money_mouth:"Lek\u00EB n\u00EB goj\u00EB",\r
+sealed:"Dh\u00EBmb\u00EBt e mbyllur",\r
+smile:"Buz\u00EBqesh",\r
+surprised:"I/e \u00E7uditur",\r
+tongue_out:"Gjuha jasht\u00EB",\r
+undecided:"I/e pavendosur",\r
+wink:"Shkel syrin",\r
+yell:"B\u00EBrtit"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/ta_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/ta_dlg.js
new file mode 100644 (file)
index 0000000..f6ec9f7
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('ta.emotions_dlg',{\r
+title:"Insert emotion",\r
+desc:"Emotions",\r
+cool:"Cool",\r
+cry:"Cry",\r
+embarassed:"Embarassed",\r
+foot_in_mouth:"Foot in mouth",\r
+frown:"Frown",\r
+innocent:"Innocent",\r
+kiss:"Kiss",\r
+laughing:"Laughing",\r
+money_mouth:"Money mouth",\r
+sealed:"Sealed",\r
+smile:"Smile",\r
+surprised:"Surprised",\r
+tongue_out:"Tongue out",\r
+undecided:"Undecided",\r
+wink:"Wink",\r
+yell:"Yell"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/te_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/te_dlg.js
new file mode 100644 (file)
index 0000000..9068d26
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('te.emotions_dlg',{\r
+title:"Insert emotion",\r
+desc:"Emotions",\r
+cool:"Cool",\r
+cry:"Cry",\r
+embarassed:"Embarassed",\r
+foot_in_mouth:"Foot in mouth",\r
+frown:"Frown",\r
+innocent:"Innocent",\r
+kiss:"Kiss",\r
+laughing:"Laughing",\r
+money_mouth:"Money mouth",\r
+sealed:"Sealed",\r
+smile:"Smile",\r
+surprised:"Surprised",\r
+tongue_out:"Tongue out",\r
+undecided:"Undecided",\r
+wink:"Wink",\r
+yell:"Yell"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/th_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/th_dlg.js
new file mode 100644 (file)
index 0000000..46ae498
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('th.emotions_dlg',{\r
+title:"\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E23\u0E39\u0E1B\u0E41\u0E2A\u0E14\u0E07\u0E2D\u0E32\u0E23\u0E21\u0E13\u0E4C",\r
+desc:"\u0E41\u0E2A\u0E14\u0E07\u0E2D\u0E32\u0E23\u0E21\u0E13\u0E4C",\r
+cool:"\u0E40\u0E08\u0E4B\u0E07",\r
+cry:"\u0E23\u0E49\u0E2D\u0E07\u0E44\u0E2B\u0E49",\r
+embarassed:"\u0E2D\u0E32\u0E22",\r
+foot_in_mouth:"\u0E1B\u0E34\u0E14\u0E1B\u0E32\u0E01",\r
+frown:"\u0E1A\u0E36\u0E49\u0E07\u0E15\u0E36\u0E07",\r
+innocent:"\u0E44\u0E23\u0E49\u0E40\u0E14\u0E35\u0E22\u0E07\u0E2A\u0E32",\r
+kiss:"\u0E08\u0E39\u0E1A",\r
+laughing:"\u0E2B\u0E31\u0E27\u0E40\u0E23\u0E32\u0E30",\r
+money_mouth:"\u0E40\u0E07\u0E34\u0E19\u0E46\u0E46\u0E46",\r
+sealed:"\u0E1B\u0E34\u0E14\u0E1B\u0E32\u0E01",\r
+smile:"Smile",\r
+surprised:"\u0E1B\u0E23\u0E30\u0E2B\u0E25\u0E32\u0E14\u0E43\u0E08",\r
+tongue_out:"\u0E41\u0E25\u0E1A\u0E25\u0E34\u0E49\u0E19",\r
+undecided:"\u0E25\u0E31\u0E07\u0E40\u0E25",\r
+wink:"\u0E02\u0E22\u0E34\u0E1A\u0E15\u0E32",\r
+yell:"\u0E42\u0E27\u0E22\u0E27\u0E32\u0E22"\r
+});
\ No newline at end of file
index 4af690cf8411f5f5fd03e5129a35cfe8981a594a..5f3bedd3915d07d6fbdd9313f27f76f9d7df4d34 100755 (executable)
@@ -1,20 +1,20 @@
 tinyMCE.addI18n('tr.emotions_dlg',{\r
 title:"\u0130fade ekle",\r
 desc:"\u0130fadeler",\r
-cool:"Haval\u0131",\r
-cry:"A\u011Fla",\r
-embarassed:"Mah\u00E7up",\r
-foot_in_mouth:"A\u011Fz\u0131 kulaklar\u0131nda",\r
-frown:"Ka\u015F \u00E7atm\u0131\u015F",\r
+cool:"Sakin",\r
+cry:"A\u011Flayan",\r
+embarassed:"Utanga\u00E7",\r
+foot_in_mouth:"Pot k\u0131rm\u0131\u015F",\r
+frown:"As\u0131k",\r
 innocent:"Masum",\r
 kiss:"\u00D6p\u00FCc\u00FCk",\r
 laughing:"Kahkaha",\r
-money_mouth:"Parag\u00F6z",\r
-sealed:"T\u0131p",\r
-smile:"G\u00FCl\u00FCmse",\r
-surprised:"\u015Ea\u015F\u0131rm\u0131\u015F",\r
-tongue_out:"Dil \u00E7\u0131kar",\r
+money_mouth:"Para g\u00F6z",\r
+sealed:"Gizli",\r
+smile:"G\u00FCl\u00FCmseme",\r
+surprised:"\u015Ea\u015F\u0131rma",\r
+tongue_out:"Dil \u00E7\u0131karma",\r
 undecided:"Karars\u0131z",\r
-wink:"G\u00F6z k\u0131rp",\r
-yell:"Esne"\r
+wink:"G\u00F6z k\u0131rpma",\r
+yell:"Ba\u011F\u0131rma"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/langs/tw_dlg.js b/program/js/tiny_mce/plugins/emotions/langs/tw_dlg.js
new file mode 100644 (file)
index 0000000..10bdccf
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('tw.emotions_dlg',{\r
+title:"\u63D2\u5165\u8868\u60C5",\r
+desc:"\u8868\u60C5",\r
+cool:"\u51B7\u9177",\r
+cry:"\u54ED\u6CE3",\r
+embarassed:"\u5C37\u5C2C",\r
+foot_in_mouth:"\u54A7\u5634",\r
+frown:"\u76BA\u7709",\r
+innocent:"\u5929\u771F",\r
+kiss:"\u543B",\r
+laughing:"\u5927\u7B11",\r
+money_mouth:"\u767C\u8CA1",\r
+sealed:"\u4FDD\u5BC6",\r
+smile:"\u5FAE\u7B11",\r
+surprised:"\u9A5A\u8A1D",\r
+tongue_out:"\u5410\u820C\u982D",\r
+undecided:"\u601D\u7D22",\r
+wink:"\u7728\u773C",\r
+yell:"\u5927\u53EB"\r
+});
\ No newline at end of file
index bedb694fb22e60f66b022af5181f20e8c3117cf2..94f3043a7d8db04545cc421daf68a830cde96661 100755 (executable)
@@ -1,20 +1,20 @@
 tinyMCE.addI18n('uk.emotions_dlg',{\r
-title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0441\u043C\u0430\u0439\u043B",\r
-desc:"\u0421\u043C\u0430\u0439\u043B\u0438",\r
+title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043F\u043E\u0441\u043C\u0456\u0448\u043A\u0443",\r
+desc:"\u041F\u043E\u0441\u043C\u0456\u0448\u043A\u0438",\r
 cool:"Cool",\r
-cry:"Cry",\r
-embarassed:"Embarassed",\r
-foot_in_mouth:"Foot in mouth",\r
-frown:"Frown",\r
-innocent:"Innocent",\r
-kiss:"Kiss",\r
-laughing:"Laughing",\r
-money_mouth:"Money mouth",\r
+cry:"\u041F\u043B\u0430\u0447",\r
+embarassed:"\u0417\u0431\u0435\u043D\u0442\u0435\u0436\u0435\u043D\u043D\u044F",\r
+foot_in_mouth:"\u041D\u043E\u0433\u0430 \u0432 \u0440\u043E\u0442\u0456",\r
+frown:"\u041D\u0430\u0441\u0443\u043F\u043B\u0435\u043D\u043D\u0456\u0441\u0442\u044C",\r
+innocent:"\u041D\u0435\u0432\u0438\u043D\u043D\u0456\u0441\u0442\u044C",\r
+kiss:"\u041F\u043E\u0446\u0456\u043B\u0443\u043D\u043E\u043A",\r
+laughing:"\u0421\u043C\u0456\u0445",\r
+money_mouth:"\u0413\u0440\u043E\u0449\u0456 \u0432 \u0440\u043E\u0442\u0456",\r
 sealed:"Sealed",\r
-smile:"Smile",\r
-surprised:"Surprised",\r
-tongue_out:"Tongue out",\r
-undecided:"Undecided",\r
-wink:"Wink",\r
-yell:"Yell"\r
+smile:"\u041F\u043E\u0441\u043C\u0456\u0448\u043A\u0430",\r
+surprised:"\u0417\u0434\u0438\u0432\u043E\u0432\u0430\u043D\u0456\u0441\u0442\u044C",\r
+tongue_out:"\u041F\u043E\u043A\u0430\u0437\u0443\u0454 \u044F\u0437\u0438\u043A\u0430",\r
+undecided:"\u041D\u0435\u0440\u0456\u0448\u0443\u0447\u0456\u0441\u0442\u044C",\r
+wink:"\u041F\u0456\u0434\u043C\u043E\u0440\u0433\u0443\u0454",\r
+yell:"\u0417\u043E\u0439\u043A"\r
 });
\ No newline at end of file
index 6cd56f17d0934a1c28bce92488f9f2524874d2bb..b40a96ae99082cf7e81029d87ff3f46a43ef1ad5 100755 (executable)
@@ -1,20 +1,20 @@
 tinyMCE.addI18n('vi.emotions_dlg',{\r
-title:"Ch\u00E8n bi\u1EC3u t\u01B0\u1EE3ng c\u1EA3m x\u00FAc",\r
-desc:"Bi\u1EC3u t\u01B0\u1EE3ng c\u1EA3m x\u00FAc",\r
-cool:"Cool",\r
-cry:"Cry",\r
-embarassed:"Embarassed",\r
-foot_in_mouth:"Foot in mouth",\r
-frown:"Frown",\r
-innocent:"Innocent",\r
-kiss:"Kiss",\r
-laughing:"Laughing",\r
-money_mouth:"Money mouth",\r
-sealed:"Sealed",\r
-smile:"Smile",\r
-surprised:"Surprised",\r
-tongue_out:"Tongue out",\r
-undecided:"Undecided",\r
-wink:"Wink",\r
-yell:"Yell"\r
+title:"Bi\u1EC3u T\u01B0\u1EE3ng C\u1EA3m X\u00FAc",\r
+desc:"Bi\u1EC3u T\u01B0\u1EE3ng C\u1EA3m X\u00FAc",\r
+cool:"Kh\u00F4ng bi\u1EBFt ng\u01B0\u1EE3ng",\r
+cry:"Kh\u00F3c",\r
+embarassed:"X\u1EA5u h\u1ED5",\r
+foot_in_mouth:"L\u1EE1 l\u1EDDi",\r
+frown:"Cau m\u00E0y",\r
+innocent:"Ng\u00E2y th\u01A1",\r
+kiss:"N\u1EE5 h\u00F4n",\r
+laughing:"C\u01B0\u1EDDi nh\u0103n r\u0103ng",\r
+money_mouth:"S\u00E1ng m\u1EAFt v\u00EC $",\r
+sealed:"K\u00EDn mi\u1EC7ng",\r
+smile:"M\u1EC9m c\u01B0\u1EDDi",\r
+surprised:"Ng\u1EA1c nhi\u00EAn",\r
+tongue_out:"L\u00E8 l\u01B0\u1EE1i",\r
+undecided:"L\u01B0\u1EE1ng l\u1EF1",\r
+wink:"Nh\u00E1y m\u1EAFt",\r
+yell:"La h\u00E9t"\r
 });
\ No newline at end of file
index 0499ac73e820821ded8944b4154e2cace23205fb..6a7e1c58e94ef1131abdc65e038371b759024065 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n('zh.emotions_dlg',{\r
 title:"\u63D2\u5165\u8868\u60C5",\r
-desc:"\u8868\u60C5\u6E05\u5355",\r
+desc:"\u8868\u60C5",\r
 cool:"\u51B7\u9177",\r
 cry:"\u54ED\u6CE3",\r
 embarassed:"\u5C34\u5C2C",\r
@@ -12,9 +12,9 @@ laughing:"\u5927\u7B11",
 money_mouth:"\u53D1\u8D22",\r
 sealed:"\u4FDD\u5BC6",\r
 smile:"\u5FAE\u7B11",\r
-surprised:"\u60CA\u5413",\r
+surprised:"\u60CA\u8BB6",\r
 tongue_out:"\u5410\u820C\u5934",\r
-undecided:"\u601D\u8003",\r
+undecided:"\u601D\u7D22",\r
 wink:"\u7728\u773C",\r
-yell:"\u53EB\u56B7"\r
+yell:"\u5927\u53EB"\r
 });
\ No newline at end of file
index 951d1e43ad23534230e458a5b0c6a1fd44eaddb8..4bbe367e36c3a9548a7f7a7e30d7cf8cf6535573 100644 (file)
@@ -1 +1 @@
-(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.MediaPlugin",{init:function(b,c){var e=this;e.editor=b;e.url=c;function f(g){return/^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(g.className)}b.onPreInit.add(function(){b.serializer.addRules("param[name|value|_mce_value]")});b.addCommand("mceMedia",function(){b.windowManager.open({file:c+"/media.htm",width:430+parseInt(b.getLang("media.delta_width",0)),height:470+parseInt(b.getLang("media.delta_height",0)),inline:1},{plugin_url:c})});b.addButton("media",{title:"media.desc",cmd:"mceMedia"});b.onNodeChange.add(function(h,g,i){g.setActive("media",i.nodeName=="IMG"&&f(i))});b.onInit.add(function(){var g={mceItemFlash:"flash",mceItemShockWave:"shockwave",mceItemWindowsMedia:"windowsmedia",mceItemQuickTime:"quicktime",mceItemRealMedia:"realmedia"};b.selection.onSetContent.add(function(){e._spansToImgs(b.getBody())});b.selection.onBeforeSetContent.add(e._objectsToSpans,e);if(b.settings.content_css!==false){b.dom.loadCSS(c+"/css/content.css")}if(b.theme.onResolveName){b.theme.onResolveName.add(function(h,i){if(i.name=="img"){a(g,function(l,j){if(b.dom.hasClass(i.node,j)){i.name=l;i.title=b.dom.getAttrib(i.node,"title");return false}})}})}if(b&&b.plugins.contextmenu){b.plugins.contextmenu.onContextMenu.add(function(i,h,j){if(j.nodeName=="IMG"&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(j.className)){h.add({title:"media.edit",icon:"media",cmd:"mceMedia"})}})}});b.onBeforeSetContent.add(e._objectsToSpans,e);b.onSetContent.add(function(){e._spansToImgs(b.getBody())});b.onPreProcess.add(function(g,i){var h=g.dom;if(i.set){e._spansToImgs(i.node);a(h.select("IMG",i.node),function(k){var j;if(f(k)){j=e._parse(k.title);h.setAttrib(k,"width",h.getAttrib(k,"width",j.width||100));h.setAttrib(k,"height",h.getAttrib(k,"height",j.height||100))}})}if(i.get){a(h.select("IMG",i.node),function(m){var l,j,k;if(g.getParam("media_use_script")){if(f(m)){m.className=m.className.replace(/mceItem/g,"mceTemp")}return}switch(m.className){case"mceItemFlash":l="d27cdb6e-ae6d-11cf-96b8-444553540000";j="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0";k="application/x-shockwave-flash";break;case"mceItemShockWave":l="166b1bca-3f9c-11cf-8075-444553540000";j="http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0";k="application/x-director";break;case"mceItemWindowsMedia":l=g.getParam("media_wmp6_compatible")?"05589fa1-c356-11ce-bf01-00aa0055595a":"6bf52a52-394a-11d3-b153-00c04f79faa6";j="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701";k="application/x-mplayer2";break;case"mceItemQuickTime":l="02bf25d5-8c17-4b23-bc80-d3488abddc6b";j="http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0";k="video/quicktime";break;case"mceItemRealMedia":l="cfcdaa03-8be4-11cf-b84b-0020afbbccfa";j="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0";k="audio/x-pn-realaudio-plugin";break}if(l){h.replace(e._buildObj({classid:l,codebase:j,type:k},m),m)}})}});b.onPostProcess.add(function(g,h){h.content=h.content.replace(/_mce_value=/g,"value=")});function d(g,h){h=new RegExp(h+'="([^"]+)"',"g").exec(g);return h?b.dom.decode(h[1]):""}b.onPostProcess.add(function(g,h){if(g.getParam("media_use_script")){h.content=h.content.replace(/<img[^>]+>/g,function(j){var i=d(j,"class");if(/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(i)){at=e._parse(d(j,"title"));at.width=d(j,"width");at.height=d(j,"height");j='<script type="text/javascript">write'+i.substring(7)+"({"+e._serialize(at)+"});<\/script>"}return j})}})},getInfo:function(){return{longname:"Media",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_objectsToSpans:function(b,e){var c=this,d=e.content;d=d.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi,function(g,f,i){var h=c._parse(i);return'<img class="mceItem'+f+'" title="'+b.dom.encode(i)+'" src="'+c.url+'/img/trans.gif" width="'+h.width+'" height="'+h.height+'" />'});d=d.replace(/<object([^>]*)>/gi,'<span class="mceItemObject" $1>');d=d.replace(/<embed([^>]*)\/?>/gi,'<span class="mceItemEmbed" $1></span>');d=d.replace(/<embed([^>]*)>/gi,'<span class="mceItemEmbed" $1>');d=d.replace(/<\/(object)([^>]*)>/gi,"</span>");d=d.replace(/<\/embed>/gi,"");d=d.replace(/<param([^>]*)>/gi,function(g,f){return"<span "+f.replace(/value=/gi,"_mce_value=")+' class="mceItemParam"></span>'});d=d.replace(/\/ class=\"mceItemParam\"><\/span>/gi,'class="mceItemParam"></span>');e.content=d},_buildObj:function(g,h){var d,c=this.editor,f=c.dom,e=this._parse(h.title),b;b=c.getParam("media_strict",true)&&g.type=="application/x-shockwave-flash";e.width=g.width=f.getAttrib(h,"width")||100;e.height=g.height=f.getAttrib(h,"height")||100;if(e.src){e.src=c.convertURL(e.src,"src",h)}if(b){d=f.create("span",{id:e.id,mce_name:"object",type:"application/x-shockwave-flash",data:e.src,style:f.getAttrib(h,"style"),width:g.width,height:g.height})}else{d=f.create("span",{id:e.id,mce_name:"object",classid:"clsid:"+g.classid,style:f.getAttrib(h,"style"),codebase:g.codebase,width:g.width,height:g.height})}a(e,function(j,i){if(!/^(width|height|codebase|classid|id|_cx|_cy)$/.test(i)){if(g.type=="application/x-mplayer2"&&i=="src"&&!e.url){i="url"}if(j){f.add(d,"span",{mce_name:"param",name:i,_mce_value:j})}}});if(!b){f.add(d,"span",tinymce.extend({mce_name:"embed",type:g.type,style:f.getAttrib(h,"style")},e))}return d},_spansToImgs:function(e){var d=this,f=d.editor.dom,b,c;a(f.select("span",e),function(g){if(f.getAttrib(g,"class")=="mceItemObject"){c=f.getAttrib(g,"classid").toLowerCase().replace(/\s+/g,"");switch(c){case"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000":f.replace(d._createImg("mceItemFlash",g),g);break;case"clsid:166b1bca-3f9c-11cf-8075-444553540000":f.replace(d._createImg("mceItemShockWave",g),g);break;case"clsid:6bf52a52-394a-11d3-b153-00c04f79faa6":case"clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95":case"clsid:05589fa1-c356-11ce-bf01-00aa0055595a":f.replace(d._createImg("mceItemWindowsMedia",g),g);break;case"clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b":f.replace(d._createImg("mceItemQuickTime",g),g);break;case"clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa":f.replace(d._createImg("mceItemRealMedia",g),g);break;default:f.replace(d._createImg("mceItemFlash",g),g)}return}if(f.getAttrib(g,"class")=="mceItemEmbed"){switch(f.getAttrib(g,"type")){case"application/x-shockwave-flash":f.replace(d._createImg("mceItemFlash",g),g);break;case"application/x-director":f.replace(d._createImg("mceItemShockWave",g),g);break;case"application/x-mplayer2":f.replace(d._createImg("mceItemWindowsMedia",g),g);break;case"video/quicktime":f.replace(d._createImg("mceItemQuickTime",g),g);break;case"audio/x-pn-realaudio-plugin":f.replace(d._createImg("mceItemRealMedia",g),g);break;default:f.replace(d._createImg("mceItemFlash",g),g)}}})},_createImg:function(c,h){var b,g=this.editor.dom,f={},e="",d;d=["id","name","width","height","bgcolor","align","flashvars","src","wmode","allowfullscreen","quality"];b=g.create("img",{src:this.url+"/img/trans.gif",width:g.getAttrib(h,"width")||100,height:g.getAttrib(h,"height")||100,style:g.getAttrib(h,"style"),"class":c});a(d,function(i){var j=g.getAttrib(h,i);if(j){f[i]=j}});a(g.select("span",h),function(i){if(g.hasClass(i,"mceItemParam")){f[g.getAttrib(i,"name")]=g.getAttrib(i,"_mce_value")}});if(f.movie){f.src=f.movie;delete f.movie}h=g.select(".mceItemEmbed",h)[0];if(h){a(d,function(i){var j=g.getAttrib(h,i);if(j&&!f[i]){f[i]=j}})}delete f.width;delete f.height;b.title=this._serialize(f);return b},_parse:function(b){return tinymce.util.JSON.parse("{"+b+"}")},_serialize:function(b){return tinymce.util.JSON.serialize(b).replace(/[{}]/g,"")}});tinymce.PluginManager.add("media",tinymce.plugins.MediaPlugin)})();
\ No newline at end of file
+(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.MediaPlugin",{init:function(b,c){var e=this;e.editor=b;e.url=c;function f(g){return/^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(g.className)}b.onPreInit.add(function(){b.serializer.addRules("param[name|value|_mce_value]")});b.addCommand("mceMedia",function(){b.windowManager.open({file:c+"/media.htm",width:430+parseInt(b.getLang("media.delta_width",0)),height:470+parseInt(b.getLang("media.delta_height",0)),inline:1},{plugin_url:c})});b.addButton("media",{title:"media.desc",cmd:"mceMedia"});b.onNodeChange.add(function(h,g,i){g.setActive("media",i.nodeName=="IMG"&&f(i))});b.onInit.add(function(){var g={mceItemFlash:"flash",mceItemShockWave:"shockwave",mceItemWindowsMedia:"windowsmedia",mceItemQuickTime:"quicktime",mceItemRealMedia:"realmedia"};b.selection.onSetContent.add(function(){e._spansToImgs(b.getBody())});b.selection.onBeforeSetContent.add(e._objectsToSpans,e);if(b.settings.content_css!==false){b.dom.loadCSS(c+"/css/content.css")}if(b.theme&&b.theme.onResolveName){b.theme.onResolveName.add(function(h,i){if(i.name=="img"){a(g,function(l,j){if(b.dom.hasClass(i.node,j)){i.name=l;i.title=b.dom.getAttrib(i.node,"title");return false}})}})}if(b&&b.plugins.contextmenu){b.plugins.contextmenu.onContextMenu.add(function(i,h,j){if(j.nodeName=="IMG"&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(j.className)){h.add({title:"media.edit",icon:"media",cmd:"mceMedia"})}})}});b.onBeforeSetContent.add(e._objectsToSpans,e);b.onSetContent.add(function(){e._spansToImgs(b.getBody())});b.onPreProcess.add(function(g,i){var h=g.dom;if(i.set){e._spansToImgs(i.node);a(h.select("IMG",i.node),function(k){var j;if(f(k)){j=e._parse(k.title);h.setAttrib(k,"width",h.getAttrib(k,"width",j.width||100));h.setAttrib(k,"height",h.getAttrib(k,"height",j.height||100))}})}if(i.get){a(h.select("IMG",i.node),function(m){var l,j,k;if(g.getParam("media_use_script")){if(f(m)){m.className=m.className.replace(/mceItem/g,"mceTemp")}return}switch(m.className){case"mceItemFlash":l="d27cdb6e-ae6d-11cf-96b8-444553540000";j="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0";k="application/x-shockwave-flash";break;case"mceItemShockWave":l="166b1bca-3f9c-11cf-8075-444553540000";j="http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0";k="application/x-director";break;case"mceItemWindowsMedia":l=g.getParam("media_wmp6_compatible")?"05589fa1-c356-11ce-bf01-00aa0055595a":"6bf52a52-394a-11d3-b153-00c04f79faa6";j="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701";k="application/x-mplayer2";break;case"mceItemQuickTime":l="02bf25d5-8c17-4b23-bc80-d3488abddc6b";j="http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0";k="video/quicktime";break;case"mceItemRealMedia":l="cfcdaa03-8be4-11cf-b84b-0020afbbccfa";j="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0";k="audio/x-pn-realaudio-plugin";break}if(l){h.replace(e._buildObj({classid:l,codebase:j,type:k},m),m)}})}});b.onPostProcess.add(function(g,h){h.content=h.content.replace(/_mce_value=/g,"value=")});function d(g,h){h=new RegExp(h+'="([^"]+)"',"g").exec(g);return h?b.dom.decode(h[1]):""}b.onPostProcess.add(function(g,h){if(g.getParam("media_use_script")){h.content=h.content.replace(/<img[^>]+>/g,function(j){var i=d(j,"class");if(/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(i)){at=e._parse(d(j,"title"));at.width=d(j,"width");at.height=d(j,"height");j='<script type="text/javascript">write'+i.substring(7)+"({"+e._serialize(at)+"});<\/script>"}return j})}})},getInfo:function(){return{longname:"Media",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_objectsToSpans:function(b,e){var c=this,d=e.content;d=d.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi,function(g,f,i){var h=c._parse(i);return'<img class="mceItem'+f+'" title="'+b.dom.encode(i)+'" src="'+c.url+'/img/trans.gif" width="'+h.width+'" height="'+h.height+'" />'});d=d.replace(/<object([^>]*)>/gi,'<span class="mceItemObject" $1>');d=d.replace(/<embed([^>]*)\/?>/gi,'<span class="mceItemEmbed" $1></span>');d=d.replace(/<embed([^>]*)>/gi,'<span class="mceItemEmbed" $1>');d=d.replace(/<\/(object)([^>]*)>/gi,"</span>");d=d.replace(/<\/embed>/gi,"");d=d.replace(/<param([^>]*)>/gi,function(g,f){return"<span "+f.replace(/value=/gi,"_mce_value=")+' class="mceItemParam"></span>'});d=d.replace(/\/ class=\"mceItemParam\"><\/span>/gi,'class="mceItemParam"></span>');e.content=d},_buildObj:function(g,h){var d,c=this.editor,f=c.dom,e=this._parse(h.title),b;b=c.getParam("media_strict",true)&&g.type=="application/x-shockwave-flash";e.width=g.width=f.getAttrib(h,"width")||100;e.height=g.height=f.getAttrib(h,"height")||100;if(e.src){e.src=c.convertURL(e.src,"src",h)}if(b){d=f.create("span",{id:e.id,_mce_name:"object",type:"application/x-shockwave-flash",data:e.src,style:f.getAttrib(h,"style"),width:g.width,height:g.height})}else{d=f.create("span",{id:e.id,_mce_name:"object",classid:"clsid:"+g.classid,style:f.getAttrib(h,"style"),codebase:g.codebase,width:g.width,height:g.height})}a(e,function(j,i){if(!/^(width|height|codebase|classid|id|_cx|_cy)$/.test(i)){if(g.type=="application/x-mplayer2"&&i=="src"&&!e.url){i="url"}if(j){f.add(d,"span",{_mce_name:"param",name:i,_mce_value:j})}}});if(!b){f.add(d,"span",tinymce.extend({_mce_name:"embed",type:g.type,style:f.getAttrib(h,"style")},e))}return d},_spansToImgs:function(e){var d=this,f=d.editor.dom,b,c;a(f.select("span",e),function(g){if(f.getAttrib(g,"class")=="mceItemObject"){c=f.getAttrib(g,"classid").toLowerCase().replace(/\s+/g,"");switch(c){case"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000":f.replace(d._createImg("mceItemFlash",g),g);break;case"clsid:166b1bca-3f9c-11cf-8075-444553540000":f.replace(d._createImg("mceItemShockWave",g),g);break;case"clsid:6bf52a52-394a-11d3-b153-00c04f79faa6":case"clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95":case"clsid:05589fa1-c356-11ce-bf01-00aa0055595a":f.replace(d._createImg("mceItemWindowsMedia",g),g);break;case"clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b":f.replace(d._createImg("mceItemQuickTime",g),g);break;case"clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa":f.replace(d._createImg("mceItemRealMedia",g),g);break;default:f.replace(d._createImg("mceItemFlash",g),g)}return}if(f.getAttrib(g,"class")=="mceItemEmbed"){switch(f.getAttrib(g,"type")){case"application/x-shockwave-flash":f.replace(d._createImg("mceItemFlash",g),g);break;case"application/x-director":f.replace(d._createImg("mceItemShockWave",g),g);break;case"application/x-mplayer2":f.replace(d._createImg("mceItemWindowsMedia",g),g);break;case"video/quicktime":f.replace(d._createImg("mceItemQuickTime",g),g);break;case"audio/x-pn-realaudio-plugin":f.replace(d._createImg("mceItemRealMedia",g),g);break;default:f.replace(d._createImg("mceItemFlash",g),g)}}})},_createImg:function(c,h){var b,g=this.editor.dom,f={},e="",d;d=["id","name","width","height","bgcolor","align","flashvars","src","wmode","allowfullscreen","quality","data"];b=g.create("img",{src:this.url+"/img/trans.gif",width:g.getAttrib(h,"width")||100,height:g.getAttrib(h,"height")||100,style:g.getAttrib(h,"style"),"class":c});a(d,function(i){var j=g.getAttrib(h,i);if(j){f[i]=j}});a(g.select("span",h),function(i){if(g.hasClass(i,"mceItemParam")){f[g.getAttrib(i,"name")]=g.getAttrib(i,"_mce_value")}});if(f.movie){f.src=f.movie;delete f.movie}if(!f.src){f.src=f.data;delete f.data}h=g.select(".mceItemEmbed",h)[0];if(h){a(d,function(i){var j=g.getAttrib(h,i);if(j&&!f[i]){f[i]=j}})}delete f.width;delete f.height;b.title=this._serialize(f);return b},_parse:function(b){return tinymce.util.JSON.parse("{"+b+"}")},_serialize:function(b){return tinymce.util.JSON.serialize(b).replace(/[{}]/g,"")}});tinymce.PluginManager.add("media",tinymce.plugins.MediaPlugin)})();
\ No newline at end of file
index faa0cf73032ffb58f4f166316a26923e82e7f2ee..fc84e5b6c5bfcd31ab44a21f3e541b4836b000a5 100644 (file)
@@ -1,8 +1,11 @@
 /**\r
- * $Id: editor_plugin_src.js 1037 2009-03-02 16:41:15Z spocke $\r
+ * editor_plugin_src.js\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 (function() {\r
@@ -61,7 +64,7 @@
                                if (ed.settings.content_css !== false)\r
                                        ed.dom.loadCSS(url + "/css/content.css");\r
 \r
-                               if (ed.theme.onResolveName) {\r
+                               if (ed.theme && ed.theme.onResolveName) {\r
                                        ed.theme.onResolveName.add(function(th, o) {\r
                                                if (o.name == 'img') {\r
                                                        each(lo, function(v, k) {\r
                        if (stc) {\r
                                ob = dom.create('span', {\r
                                        id : p.id,\r
-                                       mce_name : 'object',\r
+                                       _mce_name : 'object',\r
                                        type : 'application/x-shockwave-flash',\r
                                        data : p.src,\r
                                        style : dom.getAttrib(n, 'style'),\r
                        } else {\r
                                ob = dom.create('span', {\r
                                        id : p.id,\r
-                                       mce_name : 'object',\r
+                                       _mce_name : 'object',\r
                                        classid : "clsid:" + o.classid,\r
                                        style : dom.getAttrib(n, 'style'),\r
                                        codebase : o.codebase,\r
                                                k = 'url';\r
 \r
                                        if (v)\r
-                                               dom.add(ob, 'span', {mce_name : 'param', name : k, '_mce_value' : v});\r
+                                               dom.add(ob, 'span', {_mce_name : 'param', name : k, '_mce_value' : v});\r
                                }\r
                        });\r
 \r
                        if (!stc)\r
-                               dom.add(ob, 'span', tinymce.extend({mce_name : 'embed', type : o.type, style : dom.getAttrib(n, 'style')}, p));\r
+                               dom.add(ob, 'span', tinymce.extend({_mce_name : 'embed', type : o.type, style : dom.getAttrib(n, 'style')}, p));\r
 \r
                        return ob;\r
                },\r
                _createImg : function(cl, n) {\r
                        var im, dom = this.editor.dom, pa = {}, ti = '', args;\r
 \r
-                       args = ['id', 'name', 'width', 'height', 'bgcolor', 'align', 'flashvars', 'src', 'wmode', 'allowfullscreen', 'quality'];        \r
+                       args = ['id', 'name', 'width', 'height', 'bgcolor', 'align', 'flashvars', 'src', 'wmode', 'allowfullscreen', 'quality', 'data'];        \r
 \r
                        // Create image\r
                        im = dom.create('img', {\r
                                delete pa.movie;\r
                        }\r
 \r
+                       // No src try data\r
+                       if (!pa.src) {\r
+                               pa.src = pa.data;\r
+                               delete pa.data;\r
+                       }\r
+\r
                        // Merge with embed args\r
                        n = dom.select('.mceItemEmbed', n)[0];\r
                        if (n) {\r
index 104019189cbe31c8370f41abfa6070831f13b377..9802db1b8ab7697e7cb6789d5749f0a737ffadf9 100755 (executable)
@@ -1,10 +1,10 @@
 tinyMCE.addI18n('ar.media_dlg',{\r
-title:"\u0625\u062F\u0631\u0627\u062C / edit embedded media",\r
-general:"\u0639\u0627\u0645",\r
-advanced:"\u0645\u062A\u0642\u062F\u0645",\r
+title:"Insert / edit embedded media",\r
+general:"General",\r
+advanced:"Advanced",\r
 file:"File/URL",\r
 list:"List",\r
-size:"\u0627\u0644\u0623\u0628\u0639\u0627\u062F",\r
+size:"Dimensions",\r
 preview:"Preview",\r
 constrain_proportions:"Constrain proportions",\r
 type:"Type",\r
@@ -31,14 +31,14 @@ hidden:"Hidden",
 controller:"Controller",\r
 kioskmode:"Kiosk mode",\r
 playeveryframe:"Play every frame",\r
-targetcache:"\u0627\u0644\u0645\u0633\u0627\u0631 cache",\r
+targetcache:"Target cache",\r
 correction:"No correction",\r
 enablejavascript:"Enable JavaScript",\r
 starttime:"Start time",\r
 endtime:"End time",\r
 href:"Href",\r
 qtsrcchokespeed:"Choke speed",\r
-target:"\u0627\u0644\u0645\u0633\u0627\u0631",\r
+target:"Target",\r
 volume:"Volume",\r
 autostart:"Auto start",\r
 enabled:"Enabled",\r
@@ -79,15 +79,15 @@ sound:"Sound",
 progress:"Progress",\r
 qtsrc:"QT Src",\r
 qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
-align_top:"\u0623\u0639\u0644\u0649",\r
-align_right:"\u064A\u0645\u064A\u0646",\r
-align_bottom:"\u0623\u0633\u0641\u0644",\r
-align_left:"\u064A\u0633\u0627\u0631",\r
+align_top:"Top",\r
+align_right:"Right",\r
+align_bottom:"Bottom",\r
+align_left:"Left",\r
 align_center:"Center",\r
-align_top_left:"\u0623\u0639\u0644\u0649 \u064A\u0633\u0627\u0631",\r
-align_top_right:"\u0623\u0639\u0644\u0649 \u064A\u0645\u064A\u0646",\r
-align_bottom_left:"\u0623\u0633\u0641\u0644 \u064A\u0633\u0627\u0631",\r
-align_bottom_right:"\u0623\u0633\u0641\u0644 \u064A\u0645\u064A\u0646",\r
+align_top_left:"Top left",\r
+align_top_right:"Top right",\r
+align_bottom_left:"Bottom left",\r
+align_bottom_right:"Bottom right",\r
 flv_options:"Flash video options",\r
 flv_scalemode:"Scale mode",\r
 flv_buffer:"Buffer",\r
diff --git a/program/js/tiny_mce/plugins/media/langs/az_dlg.js b/program/js/tiny_mce/plugins/media/langs/az_dlg.js
new file mode 100644 (file)
index 0000000..69272c6
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('az.media_dlg',{\r
+title:"Mediya-obyekti \u0259lav\u0259/redakt\u0259 et",\r
+general:"\u00DCmumi",\r
+advanced:"\u018Flav\u0259l\u0259r",\r
+file:"Fayl/\u00FCnvan",\r
+list:"Siyah\u0131",\r
+size:"\u00D6\u00E7\u00FCl\u0259ri",\r
+preview:"\u0130lkin bax\u0131\u015F",\r
+constrain_proportions:"Proporsiyalar\u0131 saxla",\r
+type:"N\u00F6v",\r
+id:"\u0130dentifikator",\r
+name:"Ad\u0131",\r
+class_name:"Sinif",\r
+vspace:"\u015Eaquli f\u0259za",\r
+hspace:"\u00DCf\u00FCqi f\u0259za",\r
+play:"Avtomatik oynat",\r
+loop:"\u0130lm\u0259k",\r
+menu:"Menyunu g\u00F6st\u0259r",\r
+quality:"Keyfiyy\u0259t",\r
+scale:"Miqyas",\r
+align:"Tarazla\u015Fmaq",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"Fon",\r
+base:"T\u0259m\u0259l",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Ke\u015F",\r
+hidden:"Gizli",\r
+controller:"\u0130dar\u0259\u00E7i",\r
+kioskmode:"Kiosk \u00FCsulu",\r
+playeveryframe:"H\u0259r \u00E7\u0259r\u00E7iv\u0259ni oynat",\r
+targetcache:"H\u0259d\u0259f ke\u015F",\r
+correction:"D\u0259yi\u015Fiklik yoxdur",\r
+enablejavascript:"JavaScript-i yand\u0131r",\r
+starttime:"Ba\u015Flan\u011F\u0131c zaman",\r
+endtime:"Bit\u0259c\u0259k zaman",\r
+href:"Href",\r
+qtsrcchokespeed:"Drossel s\u00FCr\u0259ti",\r
+target:"H\u0259d\u0259f",\r
+volume:"S\u0259s",\r
+autostart:"Avtomatik ba\u015Flat",\r
+enabled:"Yan\u0131l\u0131b",\r
+fullscreen:"Tam ekran",\r
+invokeurls:"\u00C7a\u011F\u0131r\u0131lacaq URL \u00FCnvanlar",\r
+mute:"S\u0259ssiz",\r
+stretchtofit:"S\u0131\u011Facaq q\u0259d\u0259r \u00F6l\u00E7\u00FCl\u0259ndir",\r
+windowlessvideo:"P\u0259nc\u0259r\u0259siz vide",\r
+balance:"Balans",\r
+baseurl:"Baza URL",\r
+captioningid:"Ba\u015Fl\u0131qland\u0131rma id",\r
+currentmarker:"Haz\u0131rki marker",\r
+currentposition:"Haz\u0131rki m\u00F6vqe",\r
+defaultframe:"Susmaya g\u00F6r\u0259 \u00E7\u0259r\u00E7iv\u0259",\r
+playcount:"Oynatma say\u0131",\r
+rate:"Norma",\r
+uimode:"UI \u00DCsulu",\r
+flash_options:"Flash nizamlamalar\u0131",\r
+qt_options:"Quicktime nizamlamalar\u0131",\r
+wmp_options:"Windows media player nizamlamalar\u0131",\r
+rmp_options:"Real media player nizamlamalar\u0131",\r
+shockwave_options:"Shockwave nizamlamalar\u0131",\r
+autogotourl:"Avtomatik gedil\u0259c\u0259k URL",\r
+center:"M\u0259rk\u0259z",\r
+imagestatus:"\u015E\u0259kil statusu",\r
+maintainaspect:"Aspekti qoru",\r
+nojava:"Java yox",\r
+prefetch:"\u00D6n-g\u0259tirm\u0259",\r
+shuffle:"Qar\u0131\u015Fd\u0131r",\r
+console:"Konsol",\r
+numloop:"R\u0259q\u0259mli ilm\u0259l\u0259r",\r
+controls:"Kontroller",\r
+scriptcallbacks:"Skript \u00E7a\u011F\u0131r\u0131mlar\u0131",\r
+swstretchstyle:"Uzatma stili",\r
+swstretchhalign:"Uzat Y-D\u00FCzl\u0259ndir",\r
+swstretchvalign:"Uzat D-D\u00FCzl\u0259ndir",\r
+sound:"S\u0259s",\r
+progress:"\u0130l\u0259rl\u0259yi\u015F",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Haz\u0131rki ax\u0131lan rtsp m\u0259nb\u0259l\u0259ri QT Src sah\u0259sin\u0259 \u0259lav\u0259 edilm\u0259lidir.\nSiz h\u0259m\u00E7inin Src sah\u0259sin\u0259 qeyri-ax\u0131lan versiyan\u0131 da \u0259lav\u0259 etm\u0259lisiniz..",\r
+align_top:"\u00DCst",\r
+align_right:"Sa\u011F",\r
+align_bottom:"Alt",\r
+align_left:"Sol",\r
+align_center:"M\u0259tk\u0259z",\r
+align_top_left:"\u00DCst sol",\r
+align_top_right:"\u00DCst sa\u011F",\r
+align_bottom_left:"A\u015Fa\u011F\u0131 sol",\r
+align_bottom_right:"A\u015Fa\u011F\u0131 sa\u011F",\r
+flv_options:"Fla\u015F video nizamlamalar\u0131",\r
+flv_scalemode:"Miqyas \u00FCsulu",\r
+flv_buffer:"Bufer",\r
+flv_startimage:"Ba\u015Flan\u011F\u0131c \u015F\u0259kil",\r
+flv_starttime:"Ba\u015Flan\u011F\u0131c zaman",\r
+flv_defaultvolume:"Susmaya g\u00F6r\u0259 s\u0259s",\r
+flv_hiddengui:"Gizli GUI",\r
+flv_autostart:"Avtomatik ba\u015Flat",\r
+flv_loop:"\u0130lm\u0259",\r
+flv_showscalemodes:"\u00D6l\u00E7\u0259k rejiml\u0259ri g\u00F6st\u0259r",\r
+flv_smoothvideo:"Videonu yum\u015Falt",\r
+flv_jscallback:"JS \u00C7a\u011F\u0131r\u0131mlar\u0131"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/be_dlg.js b/program/js/tiny_mce/plugins/media/langs/be_dlg.js
new file mode 100644 (file)
index 0000000..8595184
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('be.media_dlg',{\r
+title:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044C/\u0440\u044D\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044C \u043C\u0435\u0434\u044B\u044F-\u0430\u0431'\u0435\u043A\u0442",\r
+general:"\u0410\u0433\u0443\u043B\u044C\u043D\u044B\u044F",\r
+advanced:"\u0414\u0430\u0434\u0430\u0442\u043A\u043E\u0432\u044B\u044F",\r
+file:"\u0424\u0430\u0439\u043B/\u0430\u0434\u0440\u0430\u0441",\r
+list:"\u0421\u043F\u0456\u0441",\r
+size:"\u041F\u0430\u043C\u0435\u0440\u044B",\r
+preview:"\u041F\u0430\u043F\u044F\u0440\u044D\u0434\u043D\u0456 \u043F\u0440\u0430\u0433\u043B\u044F\u0434",\r
+constrain_proportions:"\u0417\u0430\u0445\u043E\u045E\u0432\u0430\u0446\u044C \u043F\u0440\u0430\u043F\u043E\u0440\u0446\u044B\u0456",\r
+type:"\u0422\u044B\u043F",\r
+id:"\u0406\u0434\u044D\u043D\u0442\u044B\u0444\u0456\u043A\u0430\u0442\u0430\u0440",\r
+name:"\u041D\u0430\u0437\u043E\u045E",\r
+class_name:"\u041A\u043B\u0430\u0441",\r
+vspace:"\u0412\u0435\u0440\u0442\u044B\u043A\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u0440\u0430\u0441\u0442\u043E\u0440\u0430",\r
+hspace:"\u0413\u0430\u0440\u044B\u0437\u0430\u043D\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u0440\u0430\u0441\u0442\u043E\u0440\u0430",\r
+play:"\u041F\u0440\u0430\u0439\u0433\u0440\u0430\u0432\u0430\u0446\u044C \u0430\u045E\u0442\u0430\u043C\u0430\u0442\u044B\u0447\u043D\u0430",\r
+loop:"\u0417\u0430\u0446\u044B\u043A\u043B\u0456\u0446\u044C",\r
+menu:"\u0410\u0434\u043B\u044E\u0441\u0442\u0440\u0430\u0432\u0430\u0446\u044C \u043C\u0435\u043D\u044E",\r
+quality:"\u042F\u043A\u0430\u0441\u0446\u044C",\r
+scale:"\u041C\u0430\u0448\u0442\u0430\u0431",\r
+align:"\u0412\u044B\u0440\u0430\u045E\u043D\u043E\u045E\u0432\u0430\u043D\u043D\u0435",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"\u0424\u043E\u043D",\r
+base:"\u0410\u0441\u043D\u043E\u0432\u0430",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"\u041A\u044D\u0448",\r
+hidden:"\u0421\u043A\u0440\u044B\u0442\u043E\u0435",\r
+controller:"Controller",\r
+kioskmode:"Kiosk mode",\r
+playeveryframe:"Play every frame",\r
+targetcache:"Target cache",\r
+correction:"No correction",\r
+enablejavascript:"Enable JavaScript",\r
+starttime:"Start time",\r
+endtime:"End time",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"Target",\r
+volume:"Volume",\r
+autostart:"Auto start",\r
+enabled:"Enabled",\r
+fullscreen:"Fullscreen",\r
+invokeurls:"Invoke URLs",\r
+mute:"Mute",\r
+stretchtofit:"Stretch to fit",\r
+windowlessvideo:"Windowless video",\r
+balance:"Balance",\r
+baseurl:"Base URL",\r
+captioningid:"Captioning id",\r
+currentmarker:"Current marker",\r
+currentposition:"Current position",\r
+defaultframe:"Default frame",\r
+playcount:"Play count",\r
+rate:"Rate",\r
+uimode:"UI Mode",\r
+flash_options:"Flash options",\r
+qt_options:"Quicktime options",\r
+wmp_options:"Windows media player options",\r
+rmp_options:"Real media player options",\r
+shockwave_options:"Shockwave options",\r
+autogotourl:"Auto goto URL",\r
+center:"Center",\r
+imagestatus:"Image status",\r
+maintainaspect:"Maintain aspect",\r
+nojava:"No java",\r
+prefetch:"Prefetch",\r
+shuffle:"Shuffle",\r
+console:"Console",\r
+numloop:"Num loops",\r
+controls:"Controls",\r
+scriptcallbacks:"Script callbacks",\r
+swstretchstyle:"Stretch style",\r
+swstretchhalign:"Stretch H-Align",\r
+swstretchvalign:"Stretch V-Align",\r
+sound:"Sound",\r
+progress:"Progress",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
+align_top:"Top",\r
+align_right:"Right",\r
+align_bottom:"Bottom",\r
+align_left:"Left",\r
+align_center:"Center",\r
+align_top_left:"Top left",\r
+align_top_right:"Top right",\r
+align_bottom_left:"Bottom left",\r
+align_bottom_right:"Bottom right",\r
+flv_options:"Flash video options",\r
+flv_scalemode:"Scale mode",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Start image",\r
+flv_starttime:"Start time",\r
+flv_defaultvolume:"Default volumne",\r
+flv_hiddengui:"Hidden GUI",\r
+flv_autostart:"Auto start",\r
+flv_loop:"Loop",\r
+flv_showscalemodes:"Show scale modes",\r
+flv_smoothvideo:"Smooth video",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/bn_dlg.js b/program/js/tiny_mce/plugins/media/langs/bn_dlg.js
new file mode 100644 (file)
index 0000000..9a8a957
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('bn.media_dlg',{\r
+title:"Insert / edit embedded media",\r
+general:"General",\r
+advanced:"Advanced",\r
+file:"File/URL",\r
+list:"List",\r
+size:"Dimensions",\r
+preview:"Preview",\r
+constrain_proportions:"Constrain proportions",\r
+type:"Type",\r
+id:"Id",\r
+name:"Name",\r
+class_name:"Class",\r
+vspace:"V-Space",\r
+hspace:"H-Space",\r
+play:"Auto play",\r
+loop:"Loop",\r
+menu:"Show menu",\r
+quality:"Quality",\r
+scale:"Scale",\r
+align:"Align",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"Background",\r
+base:"Base",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Cache",\r
+hidden:"Hidden",\r
+controller:"Controller",\r
+kioskmode:"Kiosk mode",\r
+playeveryframe:"Play every frame",\r
+targetcache:"Target cache",\r
+correction:"No correction",\r
+enablejavascript:"Enable JavaScript",\r
+starttime:"Start time",\r
+endtime:"End time",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"Target",\r
+volume:"Volume",\r
+autostart:"Auto start",\r
+enabled:"Enabled",\r
+fullscreen:"Fullscreen",\r
+invokeurls:"Invoke URLs",\r
+mute:"Mute",\r
+stretchtofit:"Stretch to fit",\r
+windowlessvideo:"Windowless video",\r
+balance:"Balance",\r
+baseurl:"Base URL",\r
+captioningid:"Captioning id",\r
+currentmarker:"Current marker",\r
+currentposition:"Current position",\r
+defaultframe:"Default frame",\r
+playcount:"Play count",\r
+rate:"Rate",\r
+uimode:"UI Mode",\r
+flash_options:"Flash options",\r
+qt_options:"Quicktime options",\r
+wmp_options:"Windows media player options",\r
+rmp_options:"Real media player options",\r
+shockwave_options:"Shockwave options",\r
+autogotourl:"Auto goto URL",\r
+center:"Center",\r
+imagestatus:"Image status",\r
+maintainaspect:"Maintain aspect",\r
+nojava:"No java",\r
+prefetch:"Prefetch",\r
+shuffle:"Shuffle",\r
+console:"Console",\r
+numloop:"Num loops",\r
+controls:"Controls",\r
+scriptcallbacks:"Script callbacks",\r
+swstretchstyle:"Stretch style",\r
+swstretchhalign:"Stretch H-Align",\r
+swstretchvalign:"Stretch V-Align",\r
+sound:"Sound",\r
+progress:"Progress",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
+align_top:"Top",\r
+align_right:"Right",\r
+align_bottom:"Bottom",\r
+align_left:"Left",\r
+align_center:"Center",\r
+align_top_left:"Top left",\r
+align_top_right:"Top right",\r
+align_bottom_left:"Bottom left",\r
+align_bottom_right:"Bottom right",\r
+flv_options:"Flash video options",\r
+flv_scalemode:"Scale mode",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Start image",\r
+flv_starttime:"Start time",\r
+flv_defaultvolume:"Default volumne",\r
+flv_hiddengui:"Hidden GUI",\r
+flv_autostart:"Auto start",\r
+flv_loop:"Loop",\r
+flv_showscalemodes:"Show scale modes",\r
+flv_smoothvideo:"Smooth video",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/br_dlg.js b/program/js/tiny_mce/plugins/media/langs/br_dlg.js
new file mode 100644 (file)
index 0000000..fe6e9ed
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('br.media_dlg',{\r
+title:"Inserir/Editar m\u00EDdia incorporada",\r
+general:"Geral",\r
+advanced:"Avan\u00E7ado",\r
+file:"Arquivo/URL",\r
+list:"Lista",\r
+size:"Dimens\u00F5es",\r
+preview:"Previs\u00E3o",\r
+constrain_proportions:"Manter propor\u00E7\u00F5es",\r
+type:"Tipo",\r
+id:"Id",\r
+name:"Nome",\r
+class_name:"Classe",\r
+vspace:"Espa\u00E7o vertical",\r
+hspace:"Espa\u00E7o horizontal",\r
+play:"Execu\u00E7\u00E3o autom\u00E1tica",\r
+loop:"Repeti\u00E7\u00E3o autom\u00E1tica",\r
+menu:"Mostrar menu",\r
+quality:"Qualidade",\r
+scale:"Escala",\r
+align:"Alinhamento",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"Fundo",\r
+base:"Base",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Cache",\r
+hidden:"Oculto",\r
+controller:"Controlador",\r
+kioskmode:"Modo Quiosque",\r
+playeveryframe:"Executar todas as frames",\r
+targetcache:"Cache alvo",\r
+correction:"Sem correc\u00E7\u00F5es",\r
+enablejavascript:"Disponibilizar javaScript",\r
+starttime:"Hora de in\u00EDcio",\r
+endtime:"Hora do fim",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"Alvo",\r
+volume:"Volume",\r
+autostart:"Execu\u00E7\u00E3o autom\u00E1tica",\r
+enabled:"Activado",\r
+fullscreen:"Ecr\u00E3 inteiro",\r
+invokeurls:"Invocar URLs",\r
+mute:"Mudo",\r
+stretchtofit:"Estender",\r
+windowlessvideo:"V\u00EDdeo sem janela",\r
+balance:"Stereo",\r
+baseurl:"Base URL",\r
+captioningid:"Id de legenda",\r
+currentmarker:"Marcador actual",\r
+currentposition:"Posi\u00E7\u00E3o actual",\r
+defaultframe:"Frame padr\u00E3o",\r
+playcount:"Play count",\r
+rate:"Rate",\r
+uimode:"UI Mode",\r
+flash_options:"Op\u00E7\u00F5es Flash",\r
+qt_options:"Op\u00E7\u00F5es Quicktime",\r
+wmp_options:"Op\u00E7\u00F5es Windows Media Player",\r
+rmp_options:"Op\u00E7\u00F5es Real Media Player",\r
+shockwave_options:"Op\u00E7\u00F5es Shockwave",\r
+autogotourl:"Auto goto URL",\r
+center:"Centro",\r
+imagestatus:"Image status",\r
+maintainaspect:"Maintain aspect",\r
+nojava:"No java",\r
+prefetch:"Prefetch",\r
+shuffle:"Shuffle",\r
+console:"Console",\r
+numloop:"Num loops",\r
+controls:"Controles",\r
+scriptcallbacks:"callbacks de script",\r
+swstretchstyle:"Stretch style",\r
+swstretchhalign:"Stretch H-Align",\r
+swstretchvalign:"Stretch V-Align",\r
+sound:"Som",\r
+progress:"Progresso",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Fluxos de recursos rtsp devem ser acrescentados ao campo QT Src no Modo Avan\u00E7ado.\NUma vers\u00E3o sem fluxo tamb\u00E9m deve ser acrescentada ao campo Src.",\r
+align_top:"Topo",\r
+align_right:"Direita",\r
+align_bottom:"Abaixo",\r
+align_left:"Esquerda",\r
+align_center:"Centro",\r
+align_top_left:"Topo \u00E0\u00A0 esquerda",\r
+align_top_right:"Topo \u00E0\u00A0 direita",\r
+align_bottom_left:"Abaixo \u00E0\u00A0 esquerda",\r
+align_bottom_right:"Abaixo \u00E0\u00A0 direita",\r
+flv_options:"Op\u00E7\u00F5es de Flash video",\r
+flv_scalemode:"Modo escala",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Imagem inicial",\r
+flv_starttime:"Hora inicial",\r
+flv_defaultvolume:"Volume padr\u00E3o",\r
+flv_hiddengui:"GUI oculta",\r
+flv_autostart:"Execu\u00E7\u00E3o Autom\u00E1tica",\r
+flv_loop:"Loop",\r
+flv_showscalemodes:"Mostrar modos escala",\r
+flv_smoothvideo:"Smooth video",\r
+flv_jscallback:"JS callback"\r
+});
\ No newline at end of file
index a90de1dcdeb7394c0a9673a035092c6bd6e1d6a9..130d11a2b605fabeb0b9012f2e32a54992d78ab5 100755 (executable)
 tinyMCE.addI18n('ca.media_dlg',{\r
-title:"Insereix / edita mitj\u00E0 encastat",\r
+title:"Insereix / edita multim\u00E8dia incrustada",\r
 general:"General",\r
 advanced:"Avan\u00E7at",\r
 file:"Fitxer/URL",\r
 list:"Llista",\r
 size:"Dimensions",\r
-preview:"Vista pr\u00E8via",\r
-constrain_proportions:"Constreny les proporcions",\r
+preview:"Previsualitzaci\u00F3",\r
+constrain_proportions:"Mant\u00E9 les proporcions",\r
 type:"Tipus",\r
 id:"Id",\r
 name:"Nom",\r
 class_name:"Classe",\r
-vspace:"Espaiat V",\r
-hspace:"Espaiat H",\r
-play:"Auto reprodueix",\r
-loop:"Cicle",\r
+vspace:"Espai vertical",\r
+hspace:"Espai horitzontal",\r
+play:"Reproducci\u00F3 autom\u00E0tica",\r
+loop:"Bucle",\r
 menu:"Mostra el men\u00FA",\r
 quality:"Qualitat",\r
 scale:"Escala",\r
-align:"Alineaci\u00F3",\r
-salign:"Al\u00EDniaci\u00F3",\r
-wmode:"Mode de finestra",\r
+align:"Alinea",\r
+salign:"Alinea S",\r
+wmode:"Mode W",\r
 bgcolor:"Fons",\r
 base:"Base",\r
-flashvars:"Variables Flash",\r
-liveconnect:"Connexi\u00F3 directa SW",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
 autohref:"AutoHREF",\r
-cache:"Cau",\r
+cache:"Mem\u00F2ria cau",\r
 hidden:"Ocult",\r
 controller:"Controlador",\r
-kioskmode:"Mode kiosk",\r
+kioskmode:"Mode quiosc",\r
 playeveryframe:"Reprodueix cada marc",\r
-targetcache:"Cau objectiu",\r
+targetcache:"Target cache",\r
 correction:"Sense correcci\u00F3",\r
-enablejavascript:"Activa JavaScript",\r
-starttime:"Hora inicial",\r
-endtime:"Hora final",\r
+enablejavascript:"Habilita el javascript",\r
+starttime:"Inici",\r
+endtime:"Fi",\r
 href:"Href",\r
-qtsrcchokespeed:"restringeix la velocitat",\r
-target:"Objectiu",\r
-volume:"Volum",\r
-autostart:"Auto inici",\r
-enabled:"Activat",\r
+qtsrcchokespeed:"Velocitat",\r
+target:"Dest\u00ED",\r
+volume:"Volumen",\r
+autostart:"Inici autom\u00E0tic",\r
+enabled:"Habilitat",\r
 fullscreen:"Pantalla completa",\r
-invokeurls:"Invoca URLs",\r
-mute:"Sense so",\r
-stretchtofit:"Estira per encaixar",\r
+invokeurls:"Invoca els URL",\r
+mute:"Silenci",\r
+stretchtofit:"Estirar fins a encaixar",\r
 windowlessvideo:"V\u00EDdeo sense finestra",\r
-balance:"Balan\u00E7",\r
+balance:"Equilibri",\r
 baseurl:"URL base",\r
-captioningid:"Id del t\u00EDtol",\r
-currentmarker:"Marcador actual",\r
+captioningid:"Id nominal",\r
+currentmarker:"Retolador actual",\r
 currentposition:"Posici\u00F3 actual",\r
 defaultframe:"Marc per defecte",\r
-playcount:"Recompte de reproduccions",\r
-rate:"Ritme",\r
-uimode:"Mode de la UI",\r
-flash_options:"Opcions Flash",\r
-qt_options:"Opcions Quicktime",\r
-wmp_options:"Opcions Windows Media Player",\r
-rmp_options:"Opcions Real Meedia Player",\r
-shockwave_options:"Opcions Shockwave",\r
-autogotourl:"URL Auto goto",\r
-center:"Centrat",\r
+playcount:"Compte de reproducci\u00F3",\r
+rate:"Velocitat",\r
+uimode:"Mode UI",\r
+flash_options:"Opcions del Flash",\r
+qt_options:"Opcions del Quicktime",\r
+wmp_options:"Opcions del Windows media player",\r
+rmp_options:"Opcions del Real media player",\r
+shockwave_options:"Opcions del Shockwave",\r
+autogotourl:"URL goto autom\u00E0tic",\r
+center:"Alinea al centre",\r
 imagestatus:"Estat de la imatge",\r
-maintainaspect:"Matingues l'aspecte",\r
+maintainaspect:"Mant\u00E9 l\'aspecte",\r
 nojava:"Sense java",\r
-prefetch:"Precerca",\r
-shuffle:"Barreja",\r
+prefetch:"Prec\u00E0rrega",\r
+shuffle:"Shuffle",\r
 console:"Consola",\r
-numloop:"N\u00BA de cicles",\r
+numloop:"Nre. bucles",\r
 controls:"Controls",\r
-scriptcallbacks:"Retorns a script",\r
-swstretchstyle:"Estil d'estirament",\r
-swstretchhalign:"Estirament de l'alineaci\u00F3 H",\r
-swstretchvalign:"Estirament de l'alineaci\u00F3 V",\r
-sound:"So",\r
+scriptcallbacks:"Crides de retorn a script",\r
+swstretchstyle:"Estil de l\'extensor",\r
+swstretchhalign:"Alineaci\u00F3 horitzontal de l\'extensor",\r
+swstretchvalign:"Alineaci\u00F3 vertical de l\'extensor",\r
+sound:"S\u00F2",\r
 progress:"Progr\u00E9s",\r
-qtsrc:"Font QT",\r
-qt_stream_warn:"Els recursos rtsp stream no s'han d'afegir al camp Font QT sota la pestanya Avan\u00E7ada.\nhas d'afegir tamb\u00E9 una versi\u00F3 no-stream al camp Font.",\r
-align_top:"Dalt",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Els recursos rtsp fets flux s\'haurien d\'afegir al camp QT Src sota la pestanya avan\u00E7ada.\nTamb\u00E9 haur\u00EDeu d\'afegir una versi\u00F3 no feta flux al camp Src..",\r
+align_top:"Superior",\r
 align_right:"Dreta",\r
-align_bottom:"Baix",\r
+align_bottom:"Inferior",\r
 align_left:"Esquerra",\r
-align_center:"Centrat",\r
-align_top_left:"Dalt esquerra",\r
-align_top_right:"Dalt dreta",\r
-align_bottom_left:"Baix esquerra",\r
-align_bottom_right:"Baix dreta",\r
+align_center:"Centre",\r
+align_top_left:"Superior esquerra",\r
+align_top_right:"Superior dreta",\r
+align_bottom_left:"Inferior esquerra",\r
+align_bottom_right:"Inferior dreta",\r
 flv_options:"Opcions de v\u00EDdeo Flash",\r
-flv_scalemode:"Mode d'escala",\r
-flv_buffer:"Buffer",\r
-flv_startimage:"Imatge inicial",\r
-flv_starttime:"Hora inicial",\r
-flv_defaultvolume:"Volum per defecte",\r
-flv_hiddengui:"GUI Amagada",\r
-flv_autostart:"Auto inici",\r
-flv_loop:"Cicle",\r
-flv_showscalemodes:"Mostra els modes d'escala",\r
+flv_scalemode:"Mode d'escalat",\r
+flv_buffer:"Mem\u00F2ria interm\u00E8dia",\r
+flv_startimage:"Imatge d\'inici",\r
+flv_starttime:"Hora d\'inici",\r
+flv_defaultvolume:"Volumen per defecte",\r
+flv_hiddengui:"GUI ocult",\r
+flv_autostart:"Inici autom\u00E0tic",\r
+flv_loop:"Bucle",\r
+flv_showscalemodes:"Mostra els modes d'escalat",\r
 flv_smoothvideo:"V\u00EDdeo suau",\r
-flv_jscallback:"Retorn JS"\r
+flv_jscallback:"Crida de retorn JS"\r
 });
\ No newline at end of file
index 760d2347621964b93801d4dbcb4dbf12a1ac11e3..19e6bc44752872e1419e223b4692e9a1d8b21b64 100755 (executable)
@@ -1,7 +1,7 @@
 tinyMCE.addI18n('cs.media_dlg',{\r
-title:"Vlo\u017Eit/editovat vkl\u00E1dan\u00E1 m\u00E9dia",\r
-general:"Hlavn\u00ED",\r
-advanced:"Pokro\u010Dil\u00E9",\r
+title:"Vlo\u017Eit/upravit vkl\u00E1dan\u00E1 m\u00E9dia",\r
+general:"Obecn\u00E9",\r
+advanced:"Roz\u0161\u00ED\u0159en\u00E9",\r
 file:"Soubor/URL",\r
 list:"Seznam",\r
 size:"Rozm\u011Bry",\r
@@ -11,93 +11,93 @@ type:"Typ",
 id:"ID",\r
 name:"N\u00E1zev",\r
 class_name:"T\u0159\u00EDda",\r
-vspace:"Vert. odsazen\u00ED",\r
-hspace:"Horiz. odsazen\u00ED",\r
-play:"AutoP\u0159ehr\u00E1v\u00E1n\u00ED",\r
-loop:"Smy\u010Dka",\r
-menu:"Zobrazovat menu",\r
+vspace:"Vertik\u00E1ln\u00ED odsazen\u00ED",\r
+hspace:"Horizont\u00E1ln\u00ED odsazen\u00ED",\r
+play:"Automatick\u00E9 p\u0159ehr\u00E1v\u00E1n\u00ED",\r
+loop:"Opakov\u00E1n\u00ED",\r
+menu:"Zobrazit nab\u00EDdku",\r
 quality:"Kvalita",\r
 scale:"Pom\u011Br",\r
 align:"Zarovn\u00E1n\u00ED",\r
-salign:"SAlign",\r
-wmode:"WMode",\r
+salign:"Zarovn\u00E1n\u00ED okna",\r
+wmode:"Re\u017Eim okna",\r
 bgcolor:"Pozad\u00ED",\r
-base:"Base",\r
-flashvars:"Flashvars",\r
-liveconnect:"SWLiveConnect",\r
-autohref:"AutoHREF",\r
-cache:"Cache",\r
-hidden:"Hidden",\r
-controller:"Controller",\r
-kioskmode:"Kiosk mode",\r
-playeveryframe:"Play every frame",\r
-targetcache:"Target cache",\r
-correction:"No correction",\r
-enablejavascript:"Zapnout JavaScript",\r
+base:"Z\u00E1kladn\u00ED slo\u017Eka",\r
+flashvars:"Parametry (Flashvars)",\r
+liveconnect:"Spustit Javu (SWLiveConnect)",\r
+autohref:"Automatick\u00E9 na\u010Dten\u00ED",\r
+cache:"Mezipam\u011B\u0165",\r
+hidden:"Skr\u00FDt",\r
+controller:"Ovl\u00E1dac\u00ED panel",\r
+kioskmode:"Zak\u00E1zat ukl\u00E1d\u00E1n\u00ED",\r
+playeveryframe:"P\u0159ehr\u00E1t ka\u017Ed\u00FD sn\u00EDmek",\r
+targetcache:"C\u00EDlov\u00E1 mezipam\u011B\u0165",\r
+correction:"Bez korekc\u00ED",\r
+enablejavascript:"Povolit Javascript",\r
 starttime:"Po\u010D\u00E1te\u010Dn\u00ED \u010Das",\r
 endtime:"\u010Cas ukon\u010Den\u00ED",\r
-href:"Href",\r
-qtsrcchokespeed:"Choke speed",\r
+href:"Odkaz",\r
+qtsrcchokespeed:"Sn\u00ED\u017Een\u00ED rychlosti",\r
 target:"C\u00EDl",\r
-volume:"Volume",\r
-autostart:"Auto start",\r
-enabled:"Enabled",\r
-fullscreen:"Fullscreen",\r
-invokeurls:"Invoke URLs",\r
-mute:"Mute",\r
-stretchtofit:"Stretch to fit",\r
-windowlessvideo:"Windowless video",\r
-balance:"Balance",\r
-baseurl:"Base URL",\r
-captioningid:"Captioning id",\r
-currentmarker:"Current marker",\r
-currentposition:"Current position",\r
-defaultframe:"Default frame",\r
-playcount:"Play count",\r
-rate:"Rate",\r
-uimode:"UI Mode",\r
-flash_options:"Flash options",\r
-qt_options:"Quicktime options",\r
-wmp_options:"Windows media player options",\r
-rmp_options:"Real media player options",\r
-shockwave_options:"Shockwave options",\r
-autogotourl:"Auto goto URL",\r
-center:"Center",\r
-imagestatus:"Image status",\r
-maintainaspect:"Maintain aspect",\r
-nojava:"No java",\r
-prefetch:"Prefetch",\r
-shuffle:"Opakov\u00E1n\u00ED",\r
+volume:"Hlasitost",\r
+autostart:"Automatick\u00E9 spu\u0161t\u011Bn\u00ED",\r
+enabled:"Povolit ovl\u00E1dac\u00ED panel",\r
+fullscreen:"Cel\u00E1 obrazovka",\r
+invokeurls:"Po\u017Eadovat URL",\r
+mute:"Ztlumit",\r
+stretchtofit:"Rozt\u00E1hnout do okna",\r
+windowlessvideo:"Video bez okna",\r
+balance:"Vyv\u00E1\u017Een\u00ED",\r
+baseurl:"Z\u00E1kladn\u00ED URL",\r
+captioningid:"ID popisku m\u00E9dia",\r
+currentmarker:"Aktu\u00E1ln\u00ED z\u00E1lo\u017Eka",\r
+currentposition:"Aktu\u00E1ln\u00ED pozice",\r
+defaultframe:"V\u00FDchoz\u00ED sn\u00EDmek",\r
+playcount:"Po\u010Det p\u0159ehr\u00E1n\u00ED",\r
+rate:"Relativn\u00ED rychlost",\r
+uimode:"Re\u017Eim ovl\u00E1dac\u00EDho panelu",\r
+flash_options:"Mo\u017Enosti Flashe",\r
+qt_options:"Mo\u017Enosti Quicktime",\r
+wmp_options:"Mo\u017Enosti p\u0159ehr\u00E1va\u010De Windows media",\r
+rmp_options:"Mo\u017Enosti p\u0159ehr\u00E1va\u010De Real media",\r
+shockwave_options:"Mo\u017Enosti Shockwave",\r
+autogotourl:"Automatick\u00FD p\u0159echod na URL",\r
+center:"Na st\u0159ed",\r
+imagestatus:"Stav obrazu",\r
+maintainaspect:"Zachovat pom\u011Br stran",\r
+nojava:"Nespout\u011Bt Javu",\r
+prefetch:"P\u0159edna\u010Dten\u00ED",\r
+shuffle:"N\u00E1hodn\u011B",\r
 console:"Konzola",\r
-numloop:"Num loops",\r
-controls:"Controls",\r
-scriptcallbacks:"Script callbacks",\r
-swstretchstyle:"Stretch style",\r
-swstretchhalign:"Stretch H-Align",\r
-swstretchvalign:"Stretch V-Align",\r
-sound:"Sound",\r
-progress:"Progress",\r
-qtsrc:"QT Src",\r
-qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
-align_top:"Top",\r
-align_right:"Right",\r
-align_bottom:"Bottom",\r
-align_left:"Left",\r
-align_center:"Center",\r
-align_top_left:"Top left",\r
-align_top_right:"Top right",\r
-align_bottom_left:"Bottom left",\r
-align_bottom_right:"Bottom right",\r
-flv_options:"Flash video options",\r
-flv_scalemode:"Scale mode",\r
-flv_buffer:"Buffer",\r
-flv_startimage:"Start image",\r
-flv_starttime:"Start time",\r
-flv_defaultvolume:"Default volumne",\r
-flv_hiddengui:"Skryt\u00E9 GUI",\r
-flv_autostart:"Autostart",\r
-flv_loop:"Smy\u010Dka",\r
-flv_showscalemodes:"Show scale modes",\r
+numloop:"Po\u010Det opakov\u00E1n\u00ED",\r
+controls:"Ovl\u00E1dac\u00ED panel",\r
+scriptcallbacks:"Skripty zp\u011Btn\u00FDch vol\u00E1n\u00ED",\r
+swstretchstyle:"Styl rozta\u017Een\u00ED",\r
+swstretchhalign:"Zarovn\u00E1n\u00ED horiz. rozta\u017Een\u00ED",\r
+swstretchvalign:"Zarovn\u00E1n\u00ED vert. rozta\u017Een\u00ED",\r
+sound:"Zvuk",\r
+progress:"Pr\u016Fb\u011Bh",\r
+qtsrc:"Soubor/URL streamu pro QT",\r
+qt_stream_warn:"Streamovan\u00E9 rtsp zdroje mohou b\u00FDt p\u0159id\u00E1ny do pole 'Soubor/URL streamu pro QT' na z\u00E1lo\u017Ece 'Roz\u0161\u00ED\u0159en\u00E9'.\nYM\u016F\u017Eete tak\u00E9 p\u0159idat nestreamovanou verzi do pole 'Soubor/URL'.",\r
+align_top:"Nahoru",\r
+align_right:"Vpravo",\r
+align_bottom:"Dol\u016F",\r
+align_left:"Vlevo",\r
+align_center:"Na st\u0159ed",\r
+align_top_left:"Nahoru vlevo",\r
+align_top_right:"Nahoru vpravo",\r
+align_bottom_left:"Dol\u016F vlevo",\r
+align_bottom_right:"Dol\u016F vpravo",\r
+flv_options:"Mo\u017Enosti Flash video",\r
+flv_scalemode:"Zm\u011Bna velikosti",\r
+flv_buffer:"Z\u00E1sobn\u00EDk",\r
+flv_startimage:"Po\u010D\u00E1te\u010Dn\u00ED obr\u00E1zek",\r
+flv_starttime:"Po\u010D\u00E1te\u010Dn\u00ED \u010Das",\r
+flv_defaultvolume:"V\u00FDchoz\u00ED hlasitost",\r
+flv_hiddengui:"Skryt\u00FD ovl\u00E1dac\u00ED panel",\r
+flv_autostart:"Automatick\u00E9 spu\u0161t\u011Bn\u00ED",\r
+flv_loop:"Opakov\u00E1n\u00ED",\r
+flv_showscalemodes:"Zobrazit volby zm\u011Bny velikosti",\r
 flv_smoothvideo:"Vyhlazen\u00E9 video",\r
-flv_jscallback:"JS Callback"\r
+flv_jscallback:"Zp\u011Btn\u00E9 vol\u00E1n\u00ED Javascriptu"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/cy_dlg.js b/program/js/tiny_mce/plugins/media/langs/cy_dlg.js
new file mode 100644 (file)
index 0000000..6d9e0b6
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('cy.media_dlg',{\r
+title:"Mewnosod / golygu cyfrwng planedig",\r
+general:"Cyffredinol",\r
+advanced:"Uwch",\r
+file:"Ffeil/URL",\r
+list:"Rhestr",\r
+size:"Dimensiynau",\r
+preview:"Rhagolygu",\r
+constrain_proportions:"Cynfyngu cyfraneddau",\r
+type:"Math",\r
+id:"Id",\r
+name:"Enw",\r
+class_name:"Dosbarth",\r
+vspace:"Gofod fertigol",\r
+hspace:"Gofod llorweddol",\r
+play:"Awto-chwarae",\r
+loop:"Dolen",\r
+menu:"Dangos dewislen",\r
+quality:"Ansawdd",\r
+scale:"Gradd",\r
+align:"Alinio",\r
+salign:"Alinio-S",\r
+wmode:"Modd-W",\r
+bgcolor:"Cefndir",\r
+base:"Sail",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Storfa",\r
+hidden:"Wedi'i cuddio",\r
+controller:"Rheolydd",\r
+kioskmode:"Modd ciosk",\r
+playeveryframe:"Chwarae pob ffr\u00E2m",\r
+targetcache:"Storfa targed",\r
+correction:"Dim cywiriad",\r
+enablejavascript:"Galluogi JavaScript",\r
+starttime:"Amser dechrae",\r
+endtime:"Amser gorffen",\r
+href:"Href",\r
+qtsrcchokespeed:"Tagu cyflymder",\r
+target:"Targed",\r
+volume:"Cyfrol",\r
+autostart:"Awto-cychwyn",\r
+enabled:"Wedi'i galluogi",\r
+fullscreen:"Sgrin llawn",\r
+invokeurls:"Defnyddio URLs",\r
+mute:"Mudo",\r
+stretchtofit:"Ymestun i ffitio",\r
+windowlessvideo:"Fideo heb-ffenest",\r
+balance:"Cydbwysedd",\r
+baseurl:"URL seiledig",\r
+captioningid:"Id egluro",\r
+currentmarker:"Marciwr cyfredol",\r
+currentposition:"Lleoliad cyfredol",\r
+defaultframe:"Ffr\u00E2m rhagosodedig",\r
+playcount:"Cyfrif chwarae",\r
+rate:"Cyfradd",\r
+uimode:"Modd UI",\r
+flash_options:"Dewisiadau Flash",\r
+qt_options:"Dewisiadau Quicktime",\r
+wmp_options:"Dewisiadau Windows Media Player",\r
+rmp_options:"Dewisiadau Real Media Player",\r
+shockwave_options:"Dewisiadau Shockwave",\r
+autogotourl:"URL awto-mynd-i",\r
+center:"Canol",\r
+imagestatus:"Statws delwedd",\r
+maintainaspect:"Cynnal agwedd",\r
+nojava:"Dim java",\r
+prefetch:"Cyn-n\u00F4l",\r
+shuffle:"Cymysgu",\r
+console:"Consol",\r
+numloop:"Nifer o dolenau",\r
+controls:"Rheolyddion",\r
+scriptcallbacks:"N\u00F4l-galwadau sgript",\r
+swstretchstyle:"Arddull ymestyn",\r
+swstretchhalign:"Aliniad llorweddol ymestyn",\r
+swstretchvalign:"Aliniad fertigol ymestyn",\r
+sound:"Sain",\r
+progress:"Cynnydd",\r
+qtsrc:"Fynhonell QT",\r
+qt_stream_warn:"Dylai adnoddau RTSP ffrydio cael eu ychwanegu i'r maes Fynhonell QT o dan y tab Uwch.\n Dylai chi hefyd ychwanegu fersiwn heb-ffrydio i'r maes Fynhonell.",\r
+align_top:"Pen",\r
+align_right:"De",\r
+align_bottom:"Gwaelod",\r
+align_left:"Chwith",\r
+align_center:"Canol",\r
+align_top_left:"Pen canol",\r
+align_top_right:"Pen dde",\r
+align_bottom_left:"Gwaelod chwith",\r
+align_bottom_right:"Gwaelod dde",\r
+flv_options:"Dewisiadau fideo Flash",\r
+flv_scalemode:"Modd graddfa",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Delwedd cychwyn",\r
+flv_starttime:"Amser cychwyn",\r
+flv_defaultvolume:"Cyfrol rhagosodedig",\r
+flv_hiddengui:"GUI wedi'i cuddio",\r
+flv_autostart:"Awto-cychwyn",\r
+flv_loop:"Doleni",\r
+flv_showscalemodes:"Dangos moddau graddfa",\r
+flv_smoothvideo:"Fideo llyfn",\r
+flv_jscallback:"N\u00F4l-galwad JS"\r
+});
\ No newline at end of file
index b597792be830263ae61d03fcf254303bfc853928..10e6a08b3a66fe579be236339e85c42234388768 100755 (executable)
@@ -29,15 +29,15 @@ autohref:"AutoHREF",
 cache:"Cache",\r
 hidden:"Skjul",\r
 controller:"Controller",\r
-kioskmode:"Kiosk tilstand",\r
+kioskmode:"Kiosk-tilstand",\r
 playeveryframe:"Afsplil alle rammer",\r
-targetcache:"M\u00E5l cache",\r
+targetcache:"M\u00E5l-cache",\r
 correction:"Ingen korrektion",\r
 enablejavascript:"Tillad JavaScript",\r
 starttime:"Starttidspunkt",\r
 endtime:"Sluttidspunkt",\r
 href:"Href",\r
-qtsrcchokespeed:"Choke hastighed",\r
+qtsrcchokespeed:"Choke-hastighed",\r
 target:"M\u00E5l",\r
 volume:"Lydstyrke",\r
 autostart:"Afspil automatisk",\r
@@ -55,7 +55,7 @@ currentposition:"Aktuel position",
 defaultframe:"Standard ramme",\r
 playcount:"Afspil indhold",\r
 rate:"Vurder",\r
-uimode:"UI tilstand",\r
+uimode:"UI-tilstand",\r
 flash_options:"Flash egenskaber",\r
 qt_options:"Quicktime egenskaber",\r
 wmp_options:"Windows media player egenskaber",\r
@@ -63,7 +63,7 @@ rmp_options:"Real media player egenskaber",
 shockwave_options:"Shockwave options",\r
 autogotourl:"Auto g\u00E5 til URL",\r
 center:"Center",\r
-imagestatus:"Billedestatus",\r
+imagestatus:"Billedstatus",\r
 maintainaspect:"Bevar aspekt",\r
 nojava:"Ingen java",\r
 prefetch:"Forh\u00E5ndshent",\r
@@ -91,13 +91,13 @@ align_bottom_right:"\u00D8verste h\u00F8jre hj\u00F8rne",
 flv_options:"Flash video egenskaber",\r
 flv_scalemode:"Skaleringstilstand",\r
 flv_buffer:"Buffer",\r
-flv_startimage:"Start billede",\r
+flv_startimage:"Startbillede",\r
 flv_starttime:"Starttidspunkt",\r
 flv_defaultvolume:"Standard lydstyrke",\r
 flv_hiddengui:"Skjul sk\u00E6rmbillede",\r
-flv_autostart:"Auto start",\r
+flv_autostart:"Autostart",\r
 flv_loop:"Gentag",\r
-flv_showscalemodes:"Vi skaleringstilstande",\r
+flv_showscalemodes:"Vis skaleringstilstande",\r
 flv_smoothvideo:"Smooth video",\r
 flv_jscallback:"JS Callback"\r
 });
\ No newline at end of file
index 64be0f858826886e060a334566ce20c167f5f685..4b3d7f682015be8b50bb1da4128e29e02151d416 100755 (executable)
@@ -1,5 +1,5 @@
 tinyMCE.addI18n('de.media_dlg',{\r
-title:"Multimedia-Inhalte einf\u00FCgen / bearbeiten",\r
+title:"Multimedia-Inhalte einf\u00FCgen/bearbeiten",\r
 general:"Allgemein",\r
 advanced:"Erweitert",\r
 file:"Datei/URL",\r
@@ -78,7 +78,7 @@ swstretchvalign:"Stretch V-Ausrichtung",
 sound:"Ton",\r
 progress:"Fortschritt",\r
 qtsrc:"QT Src",\r
-qt_stream_warn:"In den Erweiterten Einstellungen sollten im Feld 'QT Src' gestreamte rtsp Resourcen hinzugef\u00FCgt werden.\nzus\u00E4tzlich sollten Sie dort auch eine nicht-gestreamte Resource angeben.",\r
+qt_stream_warn:"In den Erweiterten Einstellungen sollten im Feld 'QT Src' gestreamte RTSP Resourcen hinzugef\u00FCgt werden.\nZus\u00E4tzlich sollten Sie dort auch eine nicht-gestreamte Resource angeben.",\r
 align_top:"Oben",\r
 align_right:"Rechts",\r
 align_bottom:"Unten",\r
index 7c5f0f276f508bf8333d39169d9cca80755e96cc..e3122ce56cdb50d42987401a04f46671f2f8bcad 100755 (executable)
 tinyMCE.addI18n('et.media_dlg',{\r
-title:"Insert / edit embedded media",\r
-general:"General",\r
-advanced:"Advanced",\r
-file:"File/URL",\r
-list:"List",\r
-size:"Dimensions",\r
-preview:"Preview",\r
-constrain_proportions:"Constrain proportions",\r
-type:"Type",\r
-id:"Id",\r
-name:"Name",\r
-class_name:"Class",\r
-vspace:"V-Space",\r
-hspace:"H-Space",\r
-play:"Auto play",\r
-loop:"Loop",\r
-menu:"Show menu",\r
-quality:"Quality",\r
-scale:"Scale",\r
-align:"Align",\r
-salign:"SAlign",\r
-wmode:"WMode",\r
-bgcolor:"Background",\r
-base:"Base",\r
-flashvars:"Flashvars",\r
-liveconnect:"SWLiveConnect",\r
-autohref:"AutoHREF",\r
-cache:"Cache",\r
-hidden:"Hidden",\r
-controller:"Controller",\r
-kioskmode:"Kiosk mode",\r
-playeveryframe:"Play every frame",\r
-targetcache:"Target cache",\r
-correction:"No correction",\r
-enablejavascript:"Enable JavaScript",\r
-starttime:"Start time",\r
-endtime:"End time",\r
+title:"Sisesta/muuda meediat",\r
+general:"\u00DCldine",\r
+advanced:"T\u00E4psem",\r
+file:"Fail/URL",\r
+list:"Nimekiri",\r
+size:"M\u00F5\u00F5dud",\r
+preview:"Eelvaade",\r
+constrain_proportions:"S\u00E4ilita proportsioon",\r
+type:"T\u00FC\u00FCp",\r
+id:"ID",\r
+name:"Nime",\r
+class_name:"Klass",\r
+vspace:"V-vahe",\r
+hspace:"H-vahe",\r
+play:"Auto-start",\r
+loop:"Auto-kordus",\r
+menu:"N\u00E4ita men\u00FC\u00FCd",\r
+quality:"Kvaliteet",\r
+scale:"M\u00F5\u00F5tkava",\r
+align:"Joondus",\r
+salign:"SJoondus",\r
+wmode:"WMoodus",\r
+bgcolor:"Taust",\r
+base:"Baas",\r
+flashvars:"Flashiv\u00E4rk",\r
+liveconnect:"SWLive-\u00DChendus",\r
+autohref:"Auto-HREF",\r
+cache:"Vahem\u00E4lu",\r
+hidden:"Peidetud",\r
+controller:"Kontrollija",\r
+kioskmode:"Kioski reziim",\r
+playeveryframe:"M\u00E4ngi igat raami",\r
+targetcache:"Sihtm\u00E4rgi vahem\u00E4lu",\r
+correction:"Parandust ei ole",\r
+enablejavascript:"Luba JavaScript\u2019i",\r
+starttime:"Stardi aeg",\r
+endtime:"L\u00F5pu aeg",\r
 href:"Href",\r
-qtsrcchokespeed:"Choke speed",\r
-target:"Target",\r
-volume:"Volume",\r
-autostart:"Auto start",\r
-enabled:"Enabled",\r
-fullscreen:"Fullscreen",\r
-invokeurls:"Invoke URLs",\r
-mute:"Mute",\r
-stretchtofit:"Stretch to fit",\r
-windowlessvideo:"Windowless video",\r
-balance:"Balance",\r
-baseurl:"Base URL",\r
-captioningid:"Captioning id",\r
-currentmarker:"Current marker",\r
-currentposition:"Current position",\r
-defaultframe:"Default frame",\r
-playcount:"Play count",\r
-rate:"Rate",\r
-uimode:"UI Mode",\r
-flash_options:"Flash options",\r
-qt_options:"Quicktime options",\r
-wmp_options:"Windows media player options",\r
-rmp_options:"Real media player options",\r
-shockwave_options:"Shockwave options",\r
-autogotourl:"Auto goto URL",\r
-center:"Center",\r
-imagestatus:"Image status",\r
-maintainaspect:"Maintain aspect",\r
-nojava:"No java",\r
+qtsrcchokespeed:"Kiirus",\r
+target:"Sihtm\u00E4rk",\r
+volume:"Valjudus",\r
+autostart:"Auto-start",\r
+enabled:"Lubatud",\r
+fullscreen:"T\u00E4isekraan",\r
+invokeurls:"N\u00E4ita URL\u2019e",\r
+mute:"Vaigista",\r
+stretchtofit:"Venita sobivaks",\r
+windowlessvideo:"Aknata video",\r
+balance:"Tasakaal",\r
+baseurl:"Baas URL",\r
+captioningid:"Tiitri ID",\r
+currentmarker:"Antud marker",\r
+currentposition:"Antud positioon",\r
+defaultframe:"Vaikimisi raam",\r
+playcount:"M\u00E4ngukorrad",\r
+rate:"Hinda",\r
+uimode:"UI Reziim",\r
+flash_options:"Flash\u2019i seaded",\r
+qt_options:"Quicktime\u2019 seaded",\r
+wmp_options:"Windows media player\u2019i seaded",\r
+rmp_options:"Real media player\u2019i seaded",\r
+shockwave_options:"Shockwave\u2019i seaded",\r
+autogotourl:"Auto-URL",\r
+center:"Keskel",\r
+imagestatus:"Pildi staatus",\r
+maintainaspect:"S\u00E4ilitamise aspekt",\r
+nojava:"Ilma java\u2019ta",\r
 prefetch:"Prefetch",\r
-shuffle:"Shuffle",\r
-console:"Console",\r
-numloop:"Num loops",\r
-controls:"Controls",\r
-scriptcallbacks:"Script callbacks",\r
-swstretchstyle:"Stretch style",\r
-swstretchhalign:"Stretch H-Align",\r
-swstretchvalign:"Stretch V-Align",\r
-sound:"Sound",\r
+shuffle:"Sega",\r
+console:"Konsool",\r
+numloop:"Kordused",\r
+controls:"Kontrollid",\r
+scriptcallbacks:"Skripti tagasikutse",\r
+swstretchstyle:"Venita stiili",\r
+swstretchhalign:"Venita H-joondust",\r
+swstretchvalign:"Venita V-joondust",\r
+sound:"Heli",\r
 progress:"Progress",\r
 qtsrc:"QT Src",\r
-qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
-align_top:"Top",\r
-align_right:"Right",\r
-align_bottom:"Bottom",\r
-align_left:"Left",\r
-align_center:"Center",\r
-align_top_left:"Top left",\r
-align_top_right:"Top right",\r
-align_bottom_left:"Bottom left",\r
-align_bottom_right:"Bottom right",\r
-flv_options:"Flash video options",\r
-flv_scalemode:"Scale mode",\r
-flv_buffer:"Buffer",\r
-flv_startimage:"Start image",\r
-flv_starttime:"Start time",\r
-flv_defaultvolume:"Default volumne",\r
-flv_hiddengui:"Hidden GUI",\r
-flv_autostart:"Auto start",\r
-flv_loop:"Loop",\r
+qt_stream_warn:"Striimitav variant peaks olema lisatud.",\r
+align_top:"\u00DCleval",\r
+align_right:"Paremal",\r
+align_bottom:"All",\r
+align_left:"Vasakul",\r
+align_center:"Keskel",\r
+align_top_left:"\u00DCleval vasakul",\r
+align_top_right:"Pleval paremal",\r
+align_bottom_left:"All vasakul",\r
+align_bottom_right:"All paremal",\r
+flv_options:"Flash video seaded",\r
+flv_scalemode:"Skaala reziim",\r
+flv_buffer:"Puffer",\r
+flv_startimage:"Stardi pilt",\r
+flv_starttime:"Stardi aeg",\r
+flv_defaultvolume:"Vaikimisi helitugevus",\r
+flv_hiddengui:"Peidetud GUI",\r
+flv_autostart:"Auto-start",\r
+flv_loop:"Auto.kordus",\r
 flv_showscalemodes:"Show scale modes",\r
-flv_smoothvideo:"Smooth video",\r
-flv_jscallback:"JS Callback"\r
+flv_smoothvideo:"Sujuv video",\r
+flv_jscallback:"JS tagasikutse"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/eu_dlg.js b/program/js/tiny_mce/plugins/media/langs/eu_dlg.js
new file mode 100644 (file)
index 0000000..fdd8e13
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('eu.media_dlg',{\r
+title:"Insert / edit embedded media",\r
+general:"Orokorra",\r
+advanced:"Aurreratua",\r
+file:"Fitxategia/URL",\r
+list:"Zerrenda",\r
+size:"Tamaina",\r
+preview:"Aurrebista",\r
+constrain_proportions:"Constrain proportions",\r
+type:"Mota",\r
+id:"Id",\r
+name:"Izena",\r
+class_name:"Class",\r
+vspace:"V-Space",\r
+hspace:"H-Space",\r
+play:"Auto play",\r
+loop:"Loop",\r
+menu:"Erakutsi menua",\r
+quality:"Kalitatea",\r
+scale:"Scale",\r
+align:"Lerrokatu",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"Atzea",\r
+base:"Oinarria",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Katxea",\r
+hidden:"Ezkutuan",\r
+controller:"Controller",\r
+kioskmode:"Kiosk modua",\r
+playeveryframe:"Play every frame",\r
+targetcache:"Helburu katxea",\r
+correction:"Zuzenketarik ez",\r
+enablejavascript:"Gaitu JavaScript",\r
+starttime:"Noiz hasi",\r
+endtime:"Noiz bukatu",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"Helburua",\r
+volume:"Volume",\r
+autostart:"Automatikoki hasi",\r
+enabled:"Gaituta",\r
+fullscreen:"Pantaila osoa",\r
+invokeurls:"Invoke URLs",\r
+mute:"Ixilik",\r
+stretchtofit:"Stretch to fit",\r
+windowlessvideo:"Lehiogabeko bideoa",\r
+balance:"Balance",\r
+baseurl:"Base URL",\r
+captioningid:"Captioning id",\r
+currentmarker:"Current marker",\r
+currentposition:"Uneko posizioa",\r
+defaultframe:"Default frame",\r
+playcount:"Play count",\r
+rate:"Rate",\r
+uimode:"UI Modua",\r
+flash_options:"Flash aukerak",\r
+qt_options:"Quicktime aukerak",\r
+wmp_options:"Windows media player aukerak",\r
+rmp_options:"Real media player aukerak",\r
+shockwave_options:"Shockwave aukerak",\r
+autogotourl:"Automatikoi joan URLra",\r
+center:"Erdian",\r
+imagestatus:"Irudi edoera",\r
+maintainaspect:"Maintain aspect",\r
+nojava:"Java ez",\r
+prefetch:"Prefetch",\r
+shuffle:"Shuffle",\r
+console:"Console",\r
+numloop:"Begizta kopurua",\r
+controls:"Controls",\r
+scriptcallbacks:"Script callbacks",\r
+swstretchstyle:"Stretch style",\r
+swstretchhalign:"Stretch H-Align",\r
+swstretchvalign:"Stretch V-Align",\r
+sound:"Soinua",\r
+progress:"Progress",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Streaming bidez ematen diren rtsp baliabideak aurreratuak fitxa n dagoen QT Src eremuan gehitu behar dira.\n Streaming gabeko bertsio bat ere gehitu beharko zenuke.",\r
+align_top:"Goian",\r
+align_right:"Eskuinean",\r
+align_bottom:"Behean",\r
+align_left:"Ezkerrean",\r
+align_center:"Erdian",\r
+align_top_left:"Goian ezkerran",\r
+align_top_right:"Goian eskuinean",\r
+align_bottom_left:"Behean ezkerrean",\r
+align_bottom_right:"Behean eskuinean",\r
+flv_options:"Flash video aukerak",\r
+flv_scalemode:"Scale modua",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Hasiera irudiae",\r
+flv_starttime:"Noiz hasi",\r
+flv_defaultvolume:"Default volumne",\r
+flv_hiddengui:"Ezkutuko GUI",\r
+flv_autostart:"Auto start",\r
+flv_loop:"Loop",\r
+flv_showscalemodes:"Erakutsi scale moduak",\r
+flv_smoothvideo:"Smooth video",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
index b303197a52ecfcb2b0433a78566e30c396a77a36..755eea939e8550077571c229b6c101fe30a0ec7f 100755 (executable)
 tinyMCE.addI18n('fa.media_dlg',{\r
-title:"embedded media \u062F\u0631\u062C / \u0648\u06CC\u0631\u0627\u06CC\u0634",\r
+title:"\u062F\u0631\u062C / \u0648\u06CC\u0631\u0627\u06CC\u0634 \u0631\u0633\u0627\u0646\u0647 \u062C\u0627\u0633\u0627\u0632\u06CC \u0634\u062F\u0647 (Embeded Media)",\r
 general:"\u0639\u0645\u0648\u0645\u06CC",\r
 advanced:"\u067E\u06CC\u0634\u0631\u0641\u062A\u0647",\r
-file:"File/URL",\r
+file:"\u0641\u0627\u06CC\u0644/URL",\r
 list:"\u0644\u06CC\u0633\u062A",\r
 size:"\u0627\u0628\u0639\u0627\u062F",\r
 preview:"\u067E\u06CC\u0634 \u0646\u0645\u0627\u06CC\u0634",\r
-constrain_proportions:"Constrain proportions",\r
+constrain_proportions:"\u062D\u0641\u0638 \u062A\u0646\u0627\u0633\u0628",\r
 type:"\u0646\u0648\u0639",\r
 id:"\u0634\u0646\u0627\u0633\u0647",\r
 name:"\u0646\u0627\u0645",\r
-class_name:"Class",\r
-vspace:"V-Space",\r
-hspace:"H-Space",\r
-play:"\u0627\u062C\u0631\u0627\u06CC \u062E\u0648\u062F\u06A9\u0627\u0631",\r
-loop:"Loop",\r
+class_name:"\u0643\u0644\u0627\u0633",\r
+vspace:"\u0641\u0627\u0635\u0644\u0647 \u0639\u0645\u0648\u062F\u06CC",\r
+hspace:"\u0641\u0627\u0635\u0644\u0647 \u0627\u0641\u0642\u06CC",\r
+play:"\u067E\u062E\u0634 \u0627\u062A\u0648\u0645\u0627\u062A\u06CC\u0643",\r
+loop:"\u062D\u0644\u0642\u0647 (Loop)",\r
 menu:"\u0646\u0645\u0627\u06CC\u0634 \u0645\u0646\u0648",\r
-quality:"\u06A9\u06CC\u0641\u06CC\u062A",\r
-scale:"Scale",\r
+quality:"\u0643\u06CC\u0641\u06CC\u062A",\r
+scale:"\u0645\u0642\u06CC\u0627\u0633",\r
 align:"\u062A\u0631\u0627\u0632",\r
 salign:"SAlign",\r
 wmode:"WMode",\r
-bgcolor:"\u067E\u0633 \u0632\u0645\u06CC\u0646\u0647",\r
-base:"Base",\r
-flashvars:"Flashvars",\r
-liveconnect:"SWLiveConnect",\r
-autohref:"AutoHREF",\r
-cache:"Cache",\r
-hidden:"Hidden",\r
-controller:"Controller",\r
-kioskmode:"Kiosk mode",\r
-playeveryframe:"Play every frame",\r
-targetcache:"Target cache",\r
+bgcolor:"\u0632\u0645\u06CC\u0646\u0647",\r
+base:"\u067E\u0627\u06CC\u0647 (Base)",\r
+flashvars:"\u0645\u062A\u063A\u06CC\u0631\u0647\u0627\u06CC Flash",\r
+liveconnect:"\u0627\u0631\u062A\u0628\u0627\u0637 SWLive",\r
+autohref:"HREF \u0627\u062A\u0648\u0645\u0627\u062A\u06CC\u0643",\r
+cache:"\u0643\u0634",\r
+hidden:"\u0645\u062E\u0641\u06CC",\r
+controller:"\u0643\u0646\u062A\u0631\u0644 \u0643\u0646\u0646\u062F\u0647",\r
+kioskmode:"\u062D\u0627\u0644\u062A Kiosk",\r
+playeveryframe:"\u067E\u062E\u0634 \u0647\u0631 \u0641\u0631\u06CC\u0645 (Frame)",\r
+targetcache:"\u0643\u0634 \u0645\u0642\u0635\u062F (Target Cache)",\r
 correction:"\u0628\u062F\u0648\u0646 \u062A\u0635\u062D\u06CC\u062D",\r
-enablejavascript:"Enable JavaScript",\r
+enablejavascript:"\u0641\u0639\u0627\u0644 \u0628\u0648\u062F\u0646 JavaScript",\r
 starttime:"\u0632\u0645\u0627\u0646 \u0634\u0631\u0648\u0639",\r
 endtime:"\u0632\u0645\u0627\u0646 \u067E\u0627\u06CC\u0627\u0646",\r
 href:"Href",\r
-qtsrcchokespeed:"Choke \u0633\u0631\u0639\u062A",\r
-target:"\u0647\u062F\u0641",\r
-volume:"\u062D\u062C\u0645 \u0635\u062F\u0627",\r
-autostart:"\u0634\u0631\u0648\u0639 \u062E\u0648\u062F\u06A9\u0627\u0631",\r
-enabled:"\u0641\u0639\u0627\u0644",\r
+qtsrcchokespeed:"\u0633\u0631\u0639\u062A Choke",\r
+target:"\u0645\u0642\u0635\u062F (Target)",\r
+volume:"\u0628\u0644\u0646\u062F\u06CC \u0635\u062F\u0627",\r
+autostart:"\u0634\u0631\u0648\u0639 \u0627\u062A\u0648\u0645\u0627\u062A\u06CC\u0643",\r
+enabled:"\u0641\u0639\u0627\u0644 \u0634\u062F\u0647",\r
 fullscreen:"\u062A\u0645\u0627\u0645 \u0635\u0641\u062D\u0647",\r
 invokeurls:"Invoke URLs",\r
-mute:"Mute",\r
-stretchtofit:"Stretch to fit",\r
-windowlessvideo:"Windowless video",\r
-balance:"Balance",\r
-baseurl:"Base URL",\r
-captioningid:"Captioning id",\r
-currentmarker:"Current marker",\r
-currentposition:"Current position",\r
-defaultframe:"Default frame",\r
-playcount:"Play count",\r
-rate:"Rate",\r
-uimode:"UI Mode",\r
-flash_options:"Flash options",\r
-qt_options:"Quicktime options",\r
-wmp_options:"Windows media player options",\r
-rmp_options:"Real media player options",\r
-shockwave_options:"Shockwave options",\r
-autogotourl:"Auto goto URL",\r
-center:"\u0645\u0631\u06A9\u0632",\r
+mute:"\u0628\u06CC \u0635\u062F\u0627",\r
+stretchtofit:"\u0643\u0634\u06CC\u062F\u0646 \u062C\u0647\u062A \u06AF\u0646\u062C\u0627\u0646\u062F\u0646 \u0643\u0627\u0645\u0644",\r
+windowlessvideo:"\u0648\u06CC\u062F\u0626\u0648\u06CC \u0643\u0645 \u067E\u0646\u062C\u0631\u0647",\r
+balance:"\u062A\u0648\u0627\u0632\u0646 (Balance)",\r
+baseurl:"URL \u067E\u0627\u06CC\u0647",\r
+captioningid:"\u0634\u0646\u0627\u0633\u0647 \u0639\u0646\u0648\u0627\u0646",\r
+currentmarker:"\u0646\u0634\u0627\u0646\u06AF\u0631 \u0641\u0639\u0644\u06CC",\r
+currentposition:"\u0645\u0648\u0642\u0639\u06CC\u062A \u0641\u0639\u0644\u06CC",\r
+defaultframe:"\u0641\u0631\u06CC\u0645 \u067E\u06CC\u0634\u0641\u0631\u0636",\r
+playcount:"\u062A\u0639\u062F\u0627\u062F \u067E\u062E\u0634",\r
+rate:"\u0646\u0631\u062E",\r
+uimode:"\u062D\u0627\u0644\u062A UI",\r
+flash_options:"\u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u0641\u0644\u0634",\r
+qt_options:"\u062A\u0646\u0638\u06CC\u0645\u0627\u062A Quicktime",\r
+wmp_options:"\u062A\u0646\u0638\u06CC\u0645\u0627\u062A Windows media player",\r
+rmp_options:"\u062A\u0646\u0638\u06CC\u0645\u0627\u062A Real media player",\r
+shockwave_options:"\u062A\u0646\u0638\u06CC\u0645\u0627\u062A Shockwave",\r
+autogotourl:"\u0631\u0641\u062A\u0646 \u0627\u062A\u0648\u0645\u0627\u062A\u06CC\u0643 \u0628\u0647 URL",\r
+center:"\u0648\u0633\u0637",\r
 imagestatus:"\u0648\u0636\u0639\u06CC\u062A \u062A\u0635\u0648\u06CC\u0631",\r
-maintainaspect:"Maintain aspect",\r
-nojava:"No java",\r
-prefetch:"Prefetch",\r
-shuffle:"Shuffle",\r
-console:"Console",\r
-numloop:"Num loops",\r
-controls:"Controls",\r
-scriptcallbacks:"Script callbacks",\r
-swstretchstyle:"Stretch style",\r
-swstretchhalign:"Stretch H-Align",\r
-swstretchvalign:"Stretch V-Align",\r
+maintainaspect:"\u062D\u0641\u0638 \u062A\u0646\u0627\u0633\u0628 \u0648\u062C\u0648\u0647",\r
+nojava:"\u0628\u062F\u0648\u0646 java",\r
+prefetch:"\u067E\u06CC\u0634 \u0648\u0627\u0643\u0634\u06CC",\r
+shuffle:"\u062F\u0631 \u0647\u0645 \u0622\u0645\u06CC\u062E\u062A\u0646",\r
+console:"\u0643\u0646\u0633\u0648\u0644",\r
+numloop:"\u062A\u0639\u062F\u0627\u062F \u062D\u0644\u0642\u0647 \u0647\u0627",\r
+controls:"\u0643\u0646\u062A\u0631\u0644 \u0647\u0627",\r
+scriptcallbacks:"\u0627\u0633\u0643\u0631\u06CC\u067E\u062A Callbacks",\r
+swstretchstyle:"\u0643\u0634\u06CC\u062F\u0646 \u0627\u0633\u062A\u06CC\u0644",\r
+swstretchhalign:"\u0643\u0634\u06CC\u062F\u0646 \u062A\u0631\u0627\u0632 \u0627\u0641\u0642\u06CC",\r
+swstretchvalign:"\u0643\u0634\u06CC\u062F\u0646 \u062A\u0631\u0627\u0632 \u0639\u0645\u0648\u062F\u06CC",\r
 sound:"\u0635\u062F\u0627",\r
-progress:"Progress",\r
-qtsrc:"QT Src",\r
-qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
+progress:"\u067E\u06CC\u0634\u0631\u0641\u062A",\r
+qtsrc:"\u0645\u0646\u0628\u0639 QT",\r
+qt_stream_warn:"\u0645\u0646\u0627\u0628\u0639 Streamed rtsp \u0628\u0627\u06CC\u062F \u062F\u0631 \u0628\u0631\u06AF\u0647 (Tab) \u067E\u06CC\u0634\u0631\u0641\u062A\u0647 \u062F\u0631 \u0641\u06CC\u0644\u062F \u0645\u0646\u0628\u0639 QT \u0627\u0636\u0627\u0641\u0647 \u0634\u0648\u062F.\n\u0634\u0645\u0627 \u0628\u0627\u06CC\u062F \u0647\u0645\u0686\u0646\u06CC\u0646 \u06CC\u0643 \u0646\u0633\u062E\u0647 \u063A\u06CC\u0631 streamed \u0631\u0627 \u062F\u0631 \u0641\u06CC\u0644\u062F \u0645\u0646\u0628\u0639 \u0627\u0636\u0627\u0641\u0647 \u0646\u0645\u0627\u0626\u06CC\u062F..",\r
 align_top:"\u0628\u0627\u0644\u0627",\r
 align_right:"\u0631\u0627\u0633\u062A",\r
 align_bottom:"\u067E\u0627\u06CC\u06CC\u0646",\r
 align_left:"\u0686\u067E",\r
 align_center:"\u0648\u0633\u0637",\r
-align_top_left:"\u0686\u067E \u0628\u0627\u0644\u0627",\r
-align_top_right:"\u0631\u0627\u0633\u062A \u0628\u0627\u0644\u0627",\r
-align_bottom_left:"\u0686\u067E \u067E\u0627\u06CC\u06CC\u0646",\r
-align_bottom_right:"\u0631\u0627\u0633\u062A \u067E\u0627\u06CC\u06CC\u0646",\r
-flv_options:"Flash video options",\r
-flv_scalemode:"Scale mode",\r
-flv_buffer:"Buffer",\r
+align_top_left:"\u0628\u0627\u0644\u0627 \u0686\u067E",\r
+align_top_right:"\u0628\u0627\u0644\u0627 \u0631\u0627\u0633\u062A",\r
+align_bottom_left:"\u067E\u0627\u06CC\u06CC\u0646 \u0686\u067E",\r
+align_bottom_right:"\u067E\u0627\u06CC\u06CC\u0646 \u0631\u0627\u0633\u062A",\r
+flv_options:"\u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u0648\u06CC\u062F\u0626\u0648\u06CC \u0641\u0644\u0634",\r
+flv_scalemode:"\u062D\u0627\u0644\u062A \u0645\u0642\u06CC\u0627\u0633",\r
+flv_buffer:"\u0628\u0627\u0641\u0631 (Buffer)",\r
 flv_startimage:"\u062A\u0635\u0648\u06CC\u0631 \u0634\u0631\u0648\u0639",\r
 flv_starttime:"\u0632\u0645\u0627\u0646 \u0634\u0631\u0648\u0639",\r
-flv_defaultvolume:"\u062D\u062C\u0645 \u067E\u06CC\u0634 \u0641\u0631\u0636 \u0635\u062F\u0627",\r
-flv_hiddengui:"Hidden GUI",\r
-flv_autostart:"\u0634\u0631\u0648\u0639 \u062E\u0648\u062F\u06A9\u0627\u0631",\r
-flv_loop:"Loop",\r
-flv_showscalemodes:"Show scale modes",\r
-flv_smoothvideo:"Smooth video",\r
+flv_defaultvolume:"\u0628\u0644\u0646\u062F\u06CC \u0635\u062F\u0627\u06CC \u067E\u06CC\u0634\u0641\u0631\u0636",\r
+flv_hiddengui:"GUI \u0645\u062E\u0641\u06CC",\r
+flv_autostart:"\u0634\u0631\u0648\u0639 \u0627\u062A\u0648\u0645\u0627\u062A\u06CC\u0643",\r
+flv_loop:"\u062D\u0644\u0642\u0647 (Loop)",\r
+flv_showscalemodes:"\u0646\u0645\u0627\u06CC\u0634 \u062D\u0627\u0644\u062A \u0647\u0627\u06CC \u0645\u0642\u06CC\u0627\u0633",\r
+flv_smoothvideo:"\u0648\u06CC\u062F\u0626\u0648\u06CC \u0635\u0627\u0641",\r
 flv_jscallback:"JS Callback"\r
 });
\ No newline at end of file
index fec7077903d4a0bd173265de54eb885a27e0aef5..a23f6867225918ad0e41da32dcb82350fc939b0c 100755 (executable)
@@ -9,7 +9,7 @@ preview:"Esikatselu",
 constrain_proportions:"S\u00E4ilyt\u00E4 mittasuhteet",\r
 type:"Tyyppi",\r
 id:"Id",\r
-name:"Name",\r
+name:"Nimi",\r
 class_name:"Luokka",\r
 vspace:"Pystytason tila",\r
 hspace:"Vaakatason tila",\r
@@ -22,82 +22,82 @@ align:"Tasaus",
 salign:"SAlign",\r
 wmode:"WMode",\r
 bgcolor:"Tausta",\r
-base:"Base",\r
-flashvars:"Flashvars",\r
+base:"Perusta",\r
+flashvars:"Flash-muuttujat",\r
 liveconnect:"SWLiveConnect",\r
 autohref:"AutoHREF",\r
 cache:"V\u00E4limuisti",\r
 hidden:"Piilotettu",\r
 controller:"Ohjain",\r
-kioskmode:"Kioski-tila",\r
+kioskmode:"Kioskitila",\r
 playeveryframe:"Toista jokainen ruutu",\r
 targetcache:"Kohteen v\u00E4limuisti",\r
 correction:"Ei korjausta",\r
 enablejavascript:"Salli JavaScript",\r
-starttime:"Aloitus aika",\r
-endtime:"Lopetus aika",\r
+starttime:"Aloitusaika",\r
+endtime:"Lopetusaika",\r
 href:"Href",\r
-qtsrcchokespeed:"Choke speed",\r
+qtsrcchokespeed:"Choke-nopeus",\r
 target:"Kohde",\r
 volume:"\u00C4\u00E4nen voimakkuus",\r
 autostart:"Automaattinen aloitus",\r
 enabled:"P\u00E4\u00E4ll\u00E4",\r
 fullscreen:"Kokoruutu",\r
-invokeurls:"Invoke URLs",\r
-mute:"Mute",\r
+invokeurls:"Kutsu URL-osoitteet",\r
+mute:"Hiljennys",\r
 stretchtofit:"Venyt\u00E4 sopimaan",\r
 windowlessvideo:"Ikkunaton video",\r
 balance:"Tasapaino",\r
-baseurl:"Base URL",\r
-captioningid:"Captioning id",\r
-currentmarker:"Current marker",\r
-currentposition:"Current position",\r
-defaultframe:"Default frame",\r
-playcount:"Play count",\r
+baseurl:"Perus URL-osoitteet",\r
+captioningid:"Otsikointi-id",\r
+currentmarker:"T\u00E4m\u00E4nhetkinen merkki",\r
+currentposition:"T\u00E4m\u00E4nhetkinen sijainti",\r
+defaultframe:"Oletusruutu",\r
+playcount:"Toistolaskin",\r
 rate:"Rate",\r
-uimode:"UI Mode",\r
-flash_options:"Flash options",\r
-qt_options:"Quicktime options",\r
-wmp_options:"Windows media player options",\r
-rmp_options:"Real media player options",\r
-shockwave_options:"Shockwave options",\r
-autogotourl:"Auto goto URL",\r
-center:"Center",\r
-imagestatus:"Image status",\r
-maintainaspect:"Maintain aspect",\r
-nojava:"No java",\r
-prefetch:"Prefetch",\r
-shuffle:"Shuffle",\r
-console:"Console",\r
-numloop:"Num loops",\r
-controls:"Controls",\r
-scriptcallbacks:"Script callbacks",\r
-swstretchstyle:"Stretch style",\r
-swstretchhalign:"Stretch H-Align",\r
-swstretchvalign:"Stretch V-Align",\r
-sound:"Sound",\r
-progress:"Progress",\r
+uimode:"UI-moodi",\r
+flash_options:"Flashin asetukset",\r
+qt_options:"Quicktimen asetukset",\r
+wmp_options:"Windows media playerin asetukset",\r
+rmp_options:"Real media playerin asetukset",\r
+shockwave_options:"Shockwaven asetukset",\r
+autogotourl:"Mene automaattisesti URL:iin",\r
+center:"Keskit\u00E4",\r
+imagestatus:"Kuvan tila",\r
+maintainaspect:"S\u00E4ilyt\u00E4 kuvasuhde",\r
+nojava:"Ei Javaa",\r
+prefetch:"Esinouda",\r
+shuffle:"Sekoita",\r
+console:"Konsolie",\r
+numloop:"Toistojen m\u00E4\u00E4r\u00E4",\r
+controls:"Kontrollit",\r
+scriptcallbacks:"Skriptin takaisinkutsut",\r
+swstretchstyle:"Venytystyyli",\r
+swstretchhalign:"Venyt\u00E4 horisontaalisesti",\r
+swstretchvalign:"Venyt\u00E4 vertikaalisesti",\r
+sound:"\u00C4\u00E4ni",\r
+progress:"Eteneminen",\r
 qtsrc:"QT Src",\r
-qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
-align_top:"Top",\r
-align_right:"Right",\r
-align_bottom:"Bottom",\r
-align_left:"Left",\r
-align_center:"Center",\r
-align_top_left:"Top left",\r
-align_top_right:"Top right",\r
-align_bottom_left:"Bottom left",\r
-align_bottom_right:"Bottom right",\r
-flv_options:"Flash video options",\r
-flv_scalemode:"Scale mode",\r
-flv_buffer:"Buffer",\r
-flv_startimage:"Start image",\r
-flv_starttime:"Start time",\r
-flv_defaultvolume:"Default volumne",\r
-flv_hiddengui:"Hidden GUI",\r
-flv_autostart:"Auto start",\r
-flv_loop:"Loop",\r
-flv_showscalemodes:"Show scale modes",\r
-flv_smoothvideo:"Smooth video",\r
-flv_jscallback:"JS Callback"\r
+qt_stream_warn:"Streamatut rtsp-resurssit tulisi lis\u00E4t\u00E4 QT Src -kentt\u00E4\u00E4n edistynyt-v\u00E4lilehdelle.\nSinun kannattaa lis\u00E4t\u00E4 my\u00F6s ei-streamattu versio Src-kentt\u00E4\u00E4n.",\r
+align_top:"Ylh\u00E4\u00E4ll\u00E4",\r
+align_right:"Oikealla",\r
+align_bottom:"Alhaalla",\r
+align_left:"Vasemmalla",\r
+align_center:"Keskell\u00E4",\r
+align_top_left:"Yl\u00E4-vasemmalla",\r
+align_top_right:"Yl\u00E4-oikealla",\r
+align_bottom_left:"Ala-vasemmalla",\r
+align_bottom_right:"Ala-oikealla",\r
+flv_options:"Flash videon asetukset",\r
+flv_scalemode:"Skaalausmoodi",\r
+flv_buffer:"Puskuri",\r
+flv_startimage:"Aloituskuva",\r
+flv_starttime:"Aloitusaika",\r
+flv_defaultvolume:"Oletus\u00E4\u00E4nenpaine",\r
+flv_hiddengui:"Piilotettu k\u00E4ytt\u00F6liittym\u00E4",\r
+flv_autostart:"Automaattinen aloitus",\r
+flv_loop:"Silmukka",\r
+flv_showscalemodes:"N\u00E4yt\u00E4 skaalausmoodit",\r
+flv_smoothvideo:"Smoothi video",\r
+flv_jscallback:"JS takaisinkutsu"\r
 });
\ No newline at end of file
index f3b6448ae85ef3cb4093d2c6dc5d22bb4d20f520..7e6b655c42116067ff0419abdc2749b948f12371 100755 (executable)
@@ -1,11 +1,11 @@
 tinyMCE.addI18n('fr.media_dlg',{\r
-title:"Ins\u00E9rer/\u00C9diter un fichier m\u00E9dia",\r
+title:"Ins\u00E9rer / \u00E9diter un fichier m\u00E9dia",\r
 general:"G\u00E9n\u00E9ral",\r
 advanced:"Avanc\u00E9",\r
 file:"Fichier / URL",\r
 list:"Liste",\r
 size:"Dimensions",\r
-preview:"Pr\u00E9visualiser",\r
+preview:"Pr\u00E9visualisation",\r
 constrain_proportions:"Conserver les proportions",\r
 type:"Type",\r
 id:"Id",\r
@@ -28,23 +28,23 @@ liveconnect:"SWLiveConnect",
 autohref:"AutoHREF",\r
 cache:"Cache",\r
 hidden:"Cach\u00E9",\r
-controller:"Controlleur",\r
+controller:"Contr\u00F4leur",\r
 kioskmode:"Mode kiosque",\r
 playeveryframe:"Jouer toutes les images",\r
 targetcache:"Cache cible",\r
 correction:"Pas de correction",\r
 enablejavascript:"Activer le JavaScript",\r
-starttime:"Temps de d\u00E9but",\r
-endtime:"Temps de fin",\r
+starttime:"D\u00E9but",\r
+endtime:"Fin",\r
 href:"Href",\r
-qtsrcchokespeed:"Choke speed",\r
+qtsrcchokespeed:"D\u00E9bit maximum",\r
 target:"Cible",\r
 volume:"Volume",\r
 autostart:"Lire automatiquement",\r
 enabled:"Activ\u00E9",\r
 fullscreen:"Plein \u00E9cran",\r
 invokeurls:"Invoquer URLs",\r
-mute:"Silence",\r
+mute:"Muet",\r
 stretchtofit:"\u00C9tendre pour adapter la taille",\r
 windowlessvideo:"Vid\u00E9o sans fen\u00EAtre",\r
 balance:"Balance",\r
@@ -66,7 +66,7 @@ center:"Centrer",
 imagestatus:"Statut de l'image",\r
 maintainaspect:"Maintenir l'aspect",\r
 nojava:"Pas java",\r
-prefetch:"Prefetch",\r
+prefetch:"Pr\u00E9chargement",\r
 shuffle:"Al\u00E9atoire",\r
 console:"Console",\r
 numloop:"Nombre de tours",\r
@@ -76,26 +76,26 @@ swstretchstyle:"Stretch style",
 swstretchhalign:"Stretch horizontal",\r
 swstretchvalign:"Stretch vertical",\r
 sound:"Son",\r
-progress:"Progr\u00E8s",\r
-qtsrc:"QT Src",\r
-qt_stream_warn:"Les ressources stream\u00E9es rtsp doivent \u00EAtre ajout\u00E9es au champs QT Src dans l'onglet avanc\u00E9.\nVous devriez aussi ajouter une version non stream\u00E9e au QT src.",\r
+progress:"Progression",\r
+qtsrc:"Source QT",\r
+qt_stream_warn:"Les ressources rtsp en streaming doivent \u00EAtre ajout\u00E9es au champ \u00AB Source QT \u00BB dans l'onglet avanc\u00E9.\nVous devriez aussi ajouter une version n'\u00E9tant pas en streaming au champ \u00AB source QT \u00BB.",\r
 align_top:"Haut",\r
-align_right:"Droit",\r
+align_right:"Droite",\r
 align_bottom:"Bas",\r
 align_left:"Gauche",\r
 align_center:"Centr\u00E9",\r
-align_top_left:"Haut gauche",\r
-align_top_right:"haut droit",\r
-align_bottom_left:"Bas gauche",\r
-align_bottom_right:"Bas droite",\r
+align_top_left:"En haut \u00E0 gauche",\r
+align_top_right:"En haut \u00E0 droite",\r
+align_bottom_left:"En bas \u00E0 gauche",\r
+align_bottom_right:"En bas \u00E0 droite",\r
 flv_options:"Options de la vid\u00E9o Flash",\r
-flv_scalemode:"Mode \u00E0 l'\u00E9chelle",\r
+flv_scalemode:"\u00C9chelle",\r
 flv_buffer:"Tampon",\r
-flv_startimage:"Image de d\u00E9but",\r
+flv_startimage:"Image de d\u00E9marrage",\r
 flv_starttime:"Temps au d\u00E9but",\r
 flv_defaultvolume:"Volume par d\u00E9faut",\r
 flv_hiddengui:"Interface utilisateur cach\u00E9e",\r
-flv_autostart:"D\u00E9marage automatique",\r
+flv_autostart:"D\u00E9marrage automatique",\r
 flv_loop:"En boucle",\r
 flv_showscalemodes:"Montrer les diff\u00E9rentes \u00E9chelles",\r
 flv_smoothvideo:"Vid\u00E9o adoucie",\r
diff --git a/program/js/tiny_mce/plugins/media/langs/gl_dlg.js b/program/js/tiny_mce/plugins/media/langs/gl_dlg.js
new file mode 100644 (file)
index 0000000..6ca0c97
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('gl.media_dlg',{\r
+title:"Insertar/editar medio embebido",\r
+general:"Xeral",\r
+advanced:"Avanzado",\r
+file:"Arquivo/URL",\r
+list:"Lista",\r
+size:"Tama\u00F1o",\r
+preview:"Vista Previa",\r
+constrain_proportions:"Bloquear proporci\u00F3ns",\r
+type:"Tipo",\r
+id:"Id",\r
+name:"Nome",\r
+class_name:"Clase",\r
+vspace:"Espacio V.",\r
+hspace:"Espacio H.",\r
+play:"Comezo Autom\u00E1tico",\r
+loop:"Repetitivo",\r
+menu:"Mostrar Men\u00FA",\r
+quality:"Calidade",\r
+scale:"Escala",\r
+align:"Ali\u00F1aci\u00F3n",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"Fondo",\r
+base:"Base",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Cach\u00E9",\r
+hidden:"Oculto",\r
+controller:"Controller",\r
+kioskmode:"Modo kiosco",\r
+playeveryframe:"Reproducir t\u00F3dolos frames",\r
+targetcache:"Obxetivo cache",\r
+correction:"Sen correci\u00F3n",\r
+enablejavascript:"Habilitar JavaScript",\r
+starttime:"Inicio",\r
+endtime:"Fin",\r
+href:"Href",\r
+qtsrcchokespeed:"Vel. de choque",\r
+target:"Obxetivo",\r
+volume:"Volume",\r
+autostart:"Comezo Autom\u00E1tico",\r
+enabled:"Habilitado",\r
+fullscreen:"Pantalla Completa",\r
+invokeurls:"Invocar URLs",\r
+mute:"Silencio",\r
+stretchtofit:"Estirar pra axustar",\r
+windowlessvideo:"Video sen vent\u00E1",\r
+balance:"Balance",\r
+baseurl:"URL Base",\r
+captioningid:"Id de lenda",\r
+currentmarker:"Marcador actual",\r
+currentposition:"Posici\u00F3n actual",\r
+defaultframe:"Frame predet.",\r
+playcount:"Cantas reproducci\u00F3ns",\r
+rate:"Relaci\u00F3n",\r
+uimode:"Modo UI",\r
+flash_options:"Opci\u00F3ns Flash",\r
+qt_options:"Opci\u00F3ns Quicktime",\r
+wmp_options:"Opci\u00F3ns Windows media player",\r
+rmp_options:"Opci\u00F3ns Real media player",\r
+shockwave_options:"Opci\u00F3ns Shockwave",\r
+autogotourl:"Ir a URL autom\u00E1t.",\r
+center:"Centrado",\r
+imagestatus:"Estado de imaxe",\r
+maintainaspect:"Manter aspecto",\r
+nojava:"No java",\r
+prefetch:"PreBusca",\r
+shuffle:"Aleatorio",\r
+console:"Consola",\r
+numloop:"N\u00FAm. repetici\u00F3ns",\r
+controls:"Controis",\r
+scriptcallbacks:"Script callbacks",\r
+swstretchstyle:"Estilo estiramento",\r
+swstretchhalign:"Estirar ali\u00F1. H.",\r
+swstretchvalign:"Esturar ali\u00F1. V.",\r
+sound:"Son",\r
+progress:"Progreso",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Os recursos rtsp de Streaming deber\u00EDan engadirse no campo QT Src da pesta\u00F1a avanzada.\nAdem\u00E1is deber\u00EDa engadir unha versi\u00F3n no Streaming no campo Src.",\r
+align_top:"Arriba",\r
+align_right:"Dereita",\r
+align_bottom:"Abaixo",\r
+align_left:"Esquerda",\r
+align_center:"Centrado",\r
+align_top_left:"Arriba Izda.",\r
+align_top_right:"Arriba Dta.",\r
+align_bottom_left:"Abaixo Izda.",\r
+align_bottom_right:"Abaixo Dta.",\r
+flv_options:"Opci\u00F3ns Video Flash",\r
+flv_scalemode:"Modo escalado",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Imaxe inicio",\r
+flv_starttime:"Tempo inicio",\r
+flv_defaultvolume:"Volume predet.",\r
+flv_hiddengui:"Ocultar GUI",\r
+flv_autostart:"Inicio auto.",\r
+flv_loop:"Repetitivo",\r
+flv_showscalemodes:"Mostrar modos escala",\r
+flv_smoothvideo:"Video suave",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
index 597cc5fea197b11e5c6de171e5fb1e3cfe5d0f7a..681b6fbe9c571c51e0b20394595ee9bea70cb01a 100755 (executable)
@@ -1,27 +1,27 @@
 tinyMCE.addI18n('he.media_dlg',{\r
-title:"Insert / edit embedded media",\r
+title:"\u05D4\u05D5\u05E1\u05E4\u05EA/\u05E2\u05E8\u05D9\u05DB\u05EA \u05E1\u05E8\u05D8\u05D5\u05DF",\r
 general:"\u05DB\u05DC\u05DC\u05D9",\r
-advanced:"Advanced",\r
-file:"File/URL",\r
-list:"List",\r
-size:"Dimensions",\r
-preview:"Preview",\r
-constrain_proportions:"Constrain proportions",\r
-type:"Type",\r
+advanced:"\u05DE\u05EA\u05E7\u05D3\u05DD",\r
+file:"\u05DB\u05EA\u05D5\u05D1\u05EA \u05D4\u05E7\u05D5\u05D1\u05E5",\r
+list:"\u05E8\u05E9\u05D9\u05DE\u05D4",\r
+size:"\u05E8\u05D5\u05D7\u05D1 \u05D5\u05D2\u05D5\u05D1\u05D4",\r
+preview:"\u05EA\u05E6\u05D5\u05D2\u05D4 \u05DE\u05E7\u05D3\u05D9\u05DE\u05D4",\r
+constrain_proportions:"\u05E9\u05DE\u05D5\u05E8 \u05E2\u05DC \u05E4\u05E8\u05D5\u05E4\u05D5\u05E8\u05E6\u05D9\u05D5\u05EA",\r
+type:"\u05E1\u05D5\u05D2",\r
 id:"Id",\r
 name:"Name",\r
 class_name:"Class",\r
-vspace:"V-Space",\r
-hspace:"H-Space",\r
-play:"Auto play",\r
-loop:"Loop",\r
-menu:"Show menu",\r
-quality:"Quality",\r
+vspace:"\u05E8\u05D5\u05D5\u05D7 \u05D0\u05E0\u05DB\u05D9",\r
+hspace:"\u05E8\u05D5\u05D5\u05D7 \u05D0\u05D5\u05E4\u05E7\u05D9",\r
+play:"\u05E0\u05D2\u05D9\u05E0\u05D4 \u05D0\u05D5\u05D8\u05D5\u05DE\u05D8\u05D9\u05EA \u05E2\u05DD \u05D4\u05D8\u05E2\u05D9\u05E0\u05D4",\r
+loop:"\u05E0\u05D2\u05D9\u05E0\u05D4 \u05DE\u05D7\u05D6\u05D5\u05E8\u05D9\u05EA",\r
+menu:"\u05D4\u05E6\u05D2\u05EA \u05EA\u05E4\u05E8\u05D9\u05D8",\r
+quality:"\u05D0\u05D9\u05DB\u05D5\u05EA \u05D4\u05E1\u05E8\u05D8\u05D5\u05DF",\r
 scale:"Scale",\r
 align:"Align",\r
 salign:"SAlign",\r
 wmode:"WMode",\r
-bgcolor:"Background",\r
+bgcolor:"\u05E6\u05D1\u05E2 \u05E8\u05E7\u05E2",\r
 base:"Base",\r
 flashvars:"Flashvars",\r
 liveconnect:"SWLiveConnect",\r
@@ -56,11 +56,11 @@ defaultframe:"Default frame",
 playcount:"Play count",\r
 rate:"Rate",\r
 uimode:"UI Mode",\r
-flash_options:"Flash options",\r
-qt_options:"Quicktime options",\r
-wmp_options:"Windows media player options",\r
-rmp_options:"Real media player options",\r
-shockwave_options:"Shockwave options",\r
+flash_options:"\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA \u05E4\u05DC\u05D0\u05E9",\r
+qt_options:"\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA Quicktime",\r
+wmp_options:"\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA \u05DE\u05D3\u05D9\u05D4 \u05E4\u05DC\u05D9\u05D9\u05E8",\r
+rmp_options:"\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA \u05E0\u05D2\u05DF Real Media",\r
+shockwave_options:"\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA Shockwave",\r
 autogotourl:"Auto goto URL",\r
 center:"\u05DE\u05E8\u05DB\u05D6",\r
 imagestatus:"Image status",\r
diff --git a/program/js/tiny_mce/plugins/media/langs/hi_dlg.js b/program/js/tiny_mce/plugins/media/langs/hi_dlg.js
new file mode 100644 (file)
index 0000000..0415f5d
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('hi.media_dlg',{\r
+title:"Insert / edit embedded media",\r
+general:"General",\r
+advanced:"Advanced",\r
+file:"File/URL",\r
+list:"List",\r
+size:"Dimensions",\r
+preview:"Preview",\r
+constrain_proportions:"Constrain proportions",\r
+type:"Type",\r
+id:"Id",\r
+name:"Name",\r
+class_name:"Class",\r
+vspace:"V-Space",\r
+hspace:"H-Space",\r
+play:"Auto play",\r
+loop:"Loop",\r
+menu:"Show menu",\r
+quality:"Quality",\r
+scale:"Scale",\r
+align:"Align",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"Background",\r
+base:"Base",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Cache",\r
+hidden:"Hidden",\r
+controller:"Controller",\r
+kioskmode:"Kiosk mode",\r
+playeveryframe:"Play every frame",\r
+targetcache:"Target cache",\r
+correction:"No correction",\r
+enablejavascript:"Enable JavaScript",\r
+starttime:"Start time",\r
+endtime:"End time",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"Target",\r
+volume:"Volume",\r
+autostart:"Auto start",\r
+enabled:"Enabled",\r
+fullscreen:"Fullscreen",\r
+invokeurls:"Invoke URLs",\r
+mute:"Mute",\r
+stretchtofit:"Stretch to fit",\r
+windowlessvideo:"Windowless video",\r
+balance:"Balance",\r
+baseurl:"Base URL",\r
+captioningid:"Captioning id",\r
+currentmarker:"Current marker",\r
+currentposition:"Current position",\r
+defaultframe:"Default frame",\r
+playcount:"Play count",\r
+rate:"Rate",\r
+uimode:"UI Mode",\r
+flash_options:"Flash options",\r
+qt_options:"Quicktime options",\r
+wmp_options:"Windows media player options",\r
+rmp_options:"Real media player options",\r
+shockwave_options:"Shockwave options",\r
+autogotourl:"Auto goto URL",\r
+center:"Center",\r
+imagestatus:"Image status",\r
+maintainaspect:"Maintain aspect",\r
+nojava:"No java",\r
+prefetch:"Prefetch",\r
+shuffle:"Shuffle",\r
+console:"Console",\r
+numloop:"Num loops",\r
+controls:"Controls",\r
+scriptcallbacks:"Script callbacks",\r
+swstretchstyle:"Stretch style",\r
+swstretchhalign:"Stretch H-Align",\r
+swstretchvalign:"Stretch V-Align",\r
+sound:"Sound",\r
+progress:"Progress",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
+align_top:"Top",\r
+align_right:"Right",\r
+align_bottom:"Bottom",\r
+align_left:"Left",\r
+align_center:"Center",\r
+align_top_left:"Top left",\r
+align_top_right:"Top right",\r
+align_bottom_left:"Bottom left",\r
+align_bottom_right:"Bottom right",\r
+flv_options:"Flash video options",\r
+flv_scalemode:"Scale mode",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Start image",\r
+flv_starttime:"Start time",\r
+flv_defaultvolume:"Default volumne",\r
+flv_hiddengui:"Hidden GUI",\r
+flv_autostart:"Auto start",\r
+flv_loop:"Loop",\r
+flv_showscalemodes:"Show scale modes",\r
+flv_smoothvideo:"Smooth video",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/hy_dlg.js b/program/js/tiny_mce/plugins/media/langs/hy_dlg.js
new file mode 100644 (file)
index 0000000..192f6e9
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('hy.media_dlg',{\r
+title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C / \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C embedded media",\r
+general:"\u041E\u0431\u0449\u0435\u0435",\r
+advanced:"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E",\r
+file:"\u0424\u0430\u0439\u043B / URL",\r
+list:"\u0421\u043F\u0438\u0441\u043E\u043A",\r
+size:"\u0420\u0430\u0437\u043C\u0435\u0440\u044B",\r
+preview:"\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440",\r
+constrain_proportions:"\u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043F\u0440\u043E\u043F\u043E\u0440\u0446\u0438\u0438",\r
+type:"\u0422\u0438\u043F",\r
+id:"Id",\r
+name:"\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435",\r
+class_name:"\u041A\u043B\u0430\u0441\u0441",\r
+vspace:"\u0432\u0435\u0440\u0442. \u043E\u0442\u0441\u0442\u0443\u043F",\r
+hspace:"\u0433\u043E\u0440. \u043E\u0442\u0441\u0442\u0443\u043F",\r
+play:"\u0410\u0432\u0442\u043E\u043F\u043B\u0435\u0439",\r
+loop:"\u041B\u0443\u043F",\r
+menu:"\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043C\u0435\u043D\u044E",\r
+quality:"\u041A\u0430\u0447\u0435\u0441\u0442\u0432\u043E",\r
+scale:"Scale",\r
+align:"Align",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"\u0424\u043E\u043D",\r
+base:"Base",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"\u041A\u044D\u0448",\r
+hidden:"Hidden",\r
+controller:"Controller",\r
+kioskmode:"Kiosk mode",\r
+playeveryframe:"Play every frame",\r
+targetcache:"Target cache",\r
+correction:"No correction",\r
+enablejavascript:"Enable JavaScript",\r
+starttime:"Start time",\r
+endtime:"End time",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"Target",\r
+volume:"\u0413\u0440\u043E\u043C\u043A\u043E\u0441\u0442\u044C",\r
+autostart:"\u0410\u0432\u0442\u043E\u0441\u0442\u0430\u0440\u0442",\r
+enabled:"Enabled",\r
+fullscreen:"Fullscreen",\r
+invokeurls:"Invoke URLs",\r
+mute:"Mute",\r
+stretchtofit:"Stretch to fit",\r
+windowlessvideo:"Windowless video",\r
+balance:"\u0411\u0430\u043B\u0430\u043D\u0441",\r
+baseurl:"Base URL",\r
+captioningid:"Captioning id",\r
+currentmarker:"Current marker",\r
+currentposition:"Current position",\r
+defaultframe:"Default frame",\r
+playcount:"Play count",\r
+rate:"Rate",\r
+uimode:"UI Mode",\r
+flash_options:"Flash options",\r
+qt_options:"Quicktime options",\r
+wmp_options:"Windows media player options",\r
+rmp_options:"Real media player options",\r
+shockwave_options:"Shockwave options",\r
+autogotourl:"Auto goto URL",\r
+center:"Center",\r
+imagestatus:"Image status",\r
+maintainaspect:"Maintain aspect",\r
+nojava:"No java",\r
+prefetch:"Prefetch",\r
+shuffle:"Shuffle",\r
+console:"Console",\r
+numloop:"Num loops",\r
+controls:"Controls",\r
+scriptcallbacks:"Script callbacks",\r
+swstretchstyle:"Stretch style",\r
+swstretchhalign:"Stretch H-Align",\r
+swstretchvalign:"Stretch V-Align",\r
+sound:"Sound",\r
+progress:"Progress",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab \ nYou should also add a non streamed version to the Src field ..",\r
+align_top:"Top",\r
+align_right:"Right",\r
+align_bottom:"Bottom",\r
+align_left:"Left",\r
+align_center:"Center",\r
+align_top_left:"Top left",\r
+align_top_right:"Top right",\r
+align_bottom_left:"Bottom left",\r
+align_bottom_right:"Bottom right",\r
+flv_options:"Flash video options",\r
+flv_scalemode:"Scale mode",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Start image",\r
+flv_starttime:"Start time",\r
+flv_defaultvolume:"Default volumne",\r
+flv_hiddengui:"Hidden GUI",\r
+flv_autostart:"Auto start",\r
+flv_loop:"Loop",\r
+flv_showscalemodes:"Show scale modes",\r
+flv_smoothvideo:"Smooth video",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/ia_dlg.js b/program/js/tiny_mce/plugins/media/langs/ia_dlg.js
new file mode 100644 (file)
index 0000000..23f443f
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('ia.media_dlg',{\r
+title:"\u63D2\u5165/\u7F16\u8F91 \u5A92\u4F53",\r
+general:"\u57FA\u672C",\r
+advanced:"\u9AD8\u7EA7",\r
+file:"\u6587\u4EF6/\u5730\u5740",\r
+list:"\u5217\u8868",\r
+size:"\u5927\u5C0F",\r
+preview:"\u9884\u89C8",\r
+constrain_proportions:"\u4FDD\u6301\u6BD4\u4F8B",\r
+type:"\u7C7B\u578B",\r
+id:"Id",\r
+name:"\u540D\u79F0",\r
+class_name:"\u7C7B\u540D",\r
+vspace:"\u5782\u76F4\u95F4\u8DDD",\r
+hspace:"\u6C34\u5E73\u95F4\u8DDD",\r
+play:"\u81EA\u52A8\u64AD\u653E",\r
+loop:"\u5FAA\u73AF",\r
+menu:"\u663E\u793A\u83DC\u5355",\r
+quality:"\u54C1\u8D28",\r
+scale:"\u7F29\u653E",\r
+align:"\u5BF9\u9F50",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"\u80CC\u666F\u8272",\r
+base:"\u57FA\u7EBF",\r
+flashvars:"Flash\u53D8\u6570",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"\u7F13\u5B58",\r
+hidden:"\u9690\u85CF",\r
+controller:"\u63A7\u5236\u53F0",\r
+kioskmode:"Kiosk \u6A21\u5F0F",\r
+playeveryframe:"\u9010\u5E27\u64AD\u653E",\r
+targetcache:"\u76EE\u6807\u7F13\u5B58",\r
+correction:"\u4FEE\u6B63",\r
+enablejavascript:"\u542F\u7528 JavaScript",\r
+starttime:"\u5F00\u59CB\u65F6\u95F4",\r
+endtime:"\u7ED3\u675F\u65F6\u95F4",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"\u76EE\u6807",\r
+volume:"\u97F3\u91CF",\r
+autostart:"\u81EA\u52A8\u5F00\u59CB",\r
+enabled:"\u542F\u7528",\r
+fullscreen:"\u5168\u5C4F\u5E55",\r
+invokeurls:"\u8C03\u7528\u7684URLs",\r
+mute:"\u9759\u97F3",\r
+stretchtofit:"\u7F29\u653E\u81F3\u5408\u9002\u5927\u5C0F",\r
+windowlessvideo:"\u65E0\u7A97\u53E3\u89C6\u9891",\r
+balance:"\u5E73\u8861",\r
+baseurl:"Base URL",\r
+captioningid:"\u5B57\u5E55 id",\r
+currentmarker:"\u5F53\u524D\u6807\u7B7E",\r
+currentposition:"\u5F53\u524D\u4F4D\u7F6E",\r
+defaultframe:"\u9ED8\u8BA4\u5E27",\r
+playcount:"\u64AD\u653E\u6B21\u6570",\r
+rate:"\u7801\u7387",\r
+uimode:"UI \u6A21\u5F0F",\r
+flash_options:"Flash \u9009\u9879",\r
+qt_options:"Quicktime \u9009\u9879",\r
+wmp_options:"Windows media player \u9009\u9879",\r
+rmp_options:"Real media player \u9009\u9879",\r
+shockwave_options:"Shockwave \u9009\u9879",\r
+autogotourl:"\u81EA\u52A8\u8DF3\u8F6C URL",\r
+center:"\u5C45\u4E2D",\r
+imagestatus:"\u56FE\u50CF\u72B6\u6001",\r
+maintainaspect:"\u7EF4\u62A4\u72B6\u6001",\r
+nojava:"No java",\r
+prefetch:"\u9884\u8BFB",\r
+shuffle:"\u968F\u673A",\r
+console:"\u63A7\u5236\u53F0",\r
+numloop:"\u5FAA\u73AF\u6B21\u6570",\r
+controls:"\u63A7\u5236",\r
+scriptcallbacks:"\u811A\u672C\u56DE\u6863",\r
+swstretchstyle:"\u7F29\u653E\u6837\u5F0F",\r
+swstretchhalign:"\u7F29\u653E\u81F3\u6C34\u5E73\u5BF9\u9F50",\r
+swstretchvalign:"\u7F29\u653E\u81F3\u5782\u76F4\u5BF9\u9F50",\r
+sound:"\u58F0\u97F3",\r
+progress:"\u8FDB\u5EA6",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
+align_top:"\u9876\u90E8",\r
+align_right:"\u5C45\u53F3",\r
+align_bottom:"\u5E95\u90E8",\r
+align_left:"\u5C45\u5DE6",\r
+align_center:"\u5C45\u4E2D",\r
+align_top_left:"\u9876\u90E8\u5C45\u5DE6",\r
+align_top_right:"\u9876\u90E8\u5C45\u53F3",\r
+align_bottom_left:"\u5E95\u90E8\u5C45\u5DE6",\r
+align_bottom_right:"\u5E95\u90E8\u5C45\u53F3",\r
+flv_options:"Flash \u89C6\u9891\u9009\u9879",\r
+flv_scalemode:"\u7F29\u653E\u6A21\u5F0F",\r
+flv_buffer:"\u7F13\u51B2",\r
+flv_startimage:"\u5F00\u59CB\u56FE\u50CF",\r
+flv_starttime:"\u5F00\u59CB\u65F6\u95F4",\r
+flv_defaultvolume:"\u9ED8\u8BA4\u58F0\u97F3",\r
+flv_hiddengui:"\u9690\u85CFGUI",\r
+flv_autostart:"\u81EA\u52A8\u5F00\u59CB",\r
+flv_loop:"\u5FAA\u73AF",\r
+flv_showscalemodes:"\u663E\u793A\u7F29\u653E\u6A21\u5F0F",\r
+flv_smoothvideo:"\u5E73\u6ED1\u89C6\u9891",\r
+flv_jscallback:"JS \u56DE\u6A94"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/id_dlg.js b/program/js/tiny_mce/plugins/media/langs/id_dlg.js
new file mode 100644 (file)
index 0000000..a56020f
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('id.media_dlg',{\r
+title:"Insert / edit embedded media",\r
+general:"General",\r
+advanced:"Advanced",\r
+file:"File/URL",\r
+list:"List",\r
+size:"Dimensions",\r
+preview:"Preview",\r
+constrain_proportions:"Constrain proportions",\r
+type:"Type",\r
+id:"Id",\r
+name:"Name",\r
+class_name:"Class",\r
+vspace:"V-Space",\r
+hspace:"H-Space",\r
+play:"Auto play",\r
+loop:"Loop",\r
+menu:"Show menu",\r
+quality:"Quality",\r
+scale:"Scale",\r
+align:"Align",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"Background",\r
+base:"Base",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Cache",\r
+hidden:"Hidden",\r
+controller:"Controller",\r
+kioskmode:"Kiosk mode",\r
+playeveryframe:"Play every frame",\r
+targetcache:"Target cache",\r
+correction:"No correction",\r
+enablejavascript:"Enable JavaScript",\r
+starttime:"Start time",\r
+endtime:"End time",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"Target",\r
+volume:"Volume",\r
+autostart:"Auto start",\r
+enabled:"Enabled",\r
+fullscreen:"Fullscreen",\r
+invokeurls:"Invoke URLs",\r
+mute:"Mute",\r
+stretchtofit:"Stretch to fit",\r
+windowlessvideo:"Windowless video",\r
+balance:"Balance",\r
+baseurl:"Base URL",\r
+captioningid:"Captioning id",\r
+currentmarker:"Current marker",\r
+currentposition:"Current position",\r
+defaultframe:"Default frame",\r
+playcount:"Play count",\r
+rate:"Rate",\r
+uimode:"UI Mode",\r
+flash_options:"Flash options",\r
+qt_options:"Quicktime options",\r
+wmp_options:"Windows media player options",\r
+rmp_options:"Real media player options",\r
+shockwave_options:"Shockwave options",\r
+autogotourl:"Auto goto URL",\r
+center:"Center",\r
+imagestatus:"Image status",\r
+maintainaspect:"Maintain aspect",\r
+nojava:"No java",\r
+prefetch:"Prefetch",\r
+shuffle:"Shuffle",\r
+console:"Console",\r
+numloop:"Num loops",\r
+controls:"Controls",\r
+scriptcallbacks:"Script callbacks",\r
+swstretchstyle:"Stretch style",\r
+swstretchhalign:"Stretch H-Align",\r
+swstretchvalign:"Stretch V-Align",\r
+sound:"Sound",\r
+progress:"Progress",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
+align_top:"Atas",\r
+align_right:"Kanan",\r
+align_bottom:"Bawah",\r
+align_left:"Kiri",\r
+align_center:"Tengah",\r
+align_top_left:"Atas Kiri",\r
+align_top_right:"Atas Kanan",\r
+align_bottom_left:"Bawah Kiri",\r
+align_bottom_right:"Bawah kanan",\r
+flv_options:"Opsi Flash video",\r
+flv_scalemode:"Mode Skala",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Gambar Mulai",\r
+flv_starttime:"Waktu mulai",\r
+flv_defaultvolume:"Volume suara default",\r
+flv_hiddengui:"GUI tersembunyi",\r
+flv_autostart:"Mulai otomatis",\r
+flv_loop:"Loop",\r
+flv_showscalemodes:"Show scale modes",\r
+flv_smoothvideo:"Smooth video",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
index 7fd6262e166e649b2f49cd2b71e6fabec433e44e..25525ff7baf0a12181beae5d730fa5e83cbb66a9 100755 (executable)
@@ -8,9 +8,9 @@ size:"\u30B5\u30A4\u30BA",
 preview:"\u30D7\u30EC\u30D3\u30E5\u30FC",\r
 constrain_proportions:"\u7E26\u6A2A\u6BD4\u3092\u4FDD\u5B58",\r
 type:"\u30BF\u30A4\u30D7",\r
-id:"ID",\r
+id:"ID\u5C5E\u6027",\r
 name:"\u540D\u524D",\r
-class_name:"\u30AF\u30E9\u30B9",\r
+class_name:"class\u5C5E\u6027",\r
 vspace:"\u4E0A\u4E0B\u4F59\u767D",\r
 hspace:"\u5DE6\u53F3\u4F59\u767D",\r
 play:"\u81EA\u52D5\u518D\u751F",\r
diff --git a/program/js/tiny_mce/plugins/media/langs/ka_dlg.js b/program/js/tiny_mce/plugins/media/langs/ka_dlg.js
new file mode 100644 (file)
index 0000000..c3ac2e1
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('ka.media_dlg',{\r
+title:"\u10D9\u10DA\u10D8\u10DE\u10D8\u10E1 \u10DB\u10D0\u10EE\u10D0\u10E1\u10D8\u10D0\u10D7\u10D4\u10D1\u10DA\u10D4\u10D1\u10D8",\r
+general:"\u10E1\u10D0\u10D4\u10E6\u10DD",\r
+advanced:"\u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D8\u10D7",\r
+file:"\u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8",\r
+list:"\u10E9\u10D0\u10DB\u10DD\u10DC\u10D0\u10D7\u10D5\u10D0\u10DA\u10D8",\r
+size:"\u10D6\u10DD\u10DB\u10D4\u10D1\u10D8",\r
+preview:"\u10EC\u10D8\u10DC\u10D0\u10E1\u10EC\u10D0\u10E0\u10D8 \u10D3\u10D0\u10D7\u10D5\u10D0\u10DA\u10D8\u10D4\u10E0\u10D4\u10D1\u10D0",\r
+constrain_proportions:"\u10DE\u10E0\u10DD\u10DE\u10DD\u10E0\u10EA\u10D8\u10D4\u10D1\u10D8\u10E1 \u10E8\u10D4\u10DC\u10D0\u10E0\u10E9\u10E3\u10DC\u10D4\u10D1\u10D0",\r
+type:"\u10E2\u10D8\u10DE\u10D8",\r
+id:"\u10E1\u10D0\u10EE\u10D4\u10DA\u10D8",\r
+name:"\u10E1\u10D0\u10EE\u10D4\u10DA\u10EC\u10DD\u10D3\u10D4\u10D1\u10D0",\r
+class_name:"\u10D9\u10DA\u10D0\u10E1\u10D8",\r
+vspace:"\u10D5\u10D4\u10E0\u10E2. \u10D3\u10D0\u10E8\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+hspace:"\u10F0\u10DD\u10E0\u10D8\u10D6. \u10D3\u10D0\u10E8\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+play:"\u10D0\u10D5\u10E2\u10DD\u10D2\u10D0\u10E8\u10D5\u10D4\u10D1\u10D0",\r
+loop:"\u10D2\u10D0\u10DB\u10D4\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+menu:"\u10DB\u10D4\u10DC\u10D8\u10E3\u10E1 \u10D2\u10D0\u10DB\u10DD\u10E9\u10D4\u10DC\u10D0",\r
+quality:"\u10EE\u10D0\u10E0\u10D8\u10E1\u10EE\u10D8",\r
+scale:"\u10DB\u10D8\u10D3\u10D0\u10DB\u10DD",\r
+align:"\u10D2\u10D0\u10E1\u10EC\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+salign:"\u10D2\u10D0\u10E1\u10EC\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+wmode:"\u10E4\u10D0\u10DC\u10EF\u10D0\u10E0\u10D0",\r
+bgcolor:"\u10E4\u10DD\u10DC\u10D8",\r
+base:"Base",\r
+flashvars:"Flas \u10D1\u10E0\u10EB\u10D0\u10DC\u10D4\u10D1\u10D4\u10D1\u10D8",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"\u10D0\u10D5\u10E2\u10DD \u10D1\u10DB\u10E3\u10DA\u10D8",\r
+cache:"\u10E5\u10D4\u10E8\u10D8",\r
+hidden:"\u10D3\u10D0\u10E4\u10D0\u10E0\u10E3\u10DA\u10D8",\r
+controller:"\u10DB\u10D0\u10E0\u10D7\u10D5\u10D0",\r
+kioskmode:"\u10D9\u10D8\u10DD\u10E1\u10D9\u10D8\u10E1 \u10E0\u10D4\u10DF\u10D8\u10DB\u10D8",\r
+playeveryframe:"\u10E7\u10D5\u10D4\u10DA\u10D0 \u10D9\u10D0\u10D3\u10E0\u10D8\u10E1 \u10D0\u10E1\u10D0\u10EE\u10D5\u10D0",\r
+targetcache:"\u10DB\u10D8\u10D6\u10DC\u10D8\u10E1 \u10E5\u10D4\u10E8\u10D8",\r
+correction:"\u10D9\u10DD\u10E0\u10D4\u10E5\u10E2\u10D8\u10E0\u10D4\u10D1\u10D8\u10E1 \u10D2\u10D0\u10E0\u10D4\u10E8\u10D4",\r
+enablejavascript:"JavaScript-\u10D8\u10E1 \u10E9\u10D0\u10E0\u10D7\u10D5\u10D0",\r
+starttime:"\u10D3\u10D0\u10EC\u10E7\u10D4\u10D1\u10D8\u10E1 \u10D3\u10E0\u10DD",\r
+endtime:"\u10D3\u10D0\u10E1\u10E0\u10E3\u10DA\u10D4\u10D1\u10D8\u10E1 \u10D3\u10E0\u10DD",\r
+href:"\u10D1\u10DB\u10E3\u10DA\u10D8",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"\u10DB\u10D8\u10D6\u10D0\u10DC\u10D8",\r
+volume:"\u10EE\u10DB\u10D0",\r
+autostart:"\u10D0\u10D5\u10E2\u10DD\u10D2\u10D0\u10E8\u10D5\u10D4\u10D1\u10D0",\r
+enabled:"\u10E9\u10D0\u10E0\u10D7\u10E3\u10DA\u10D8\u10D0",\r
+fullscreen:"\u10DB\u10D7\u10D4\u10DA \u10D4\u10D9\u10E0\u10D0\u10DC\u10D6\u10D4",\r
+invokeurls:"\u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8\u10E1 \u10D2\u10D0\u10DB\u10DD\u10EB\u10D0\u10EE\u10D4\u10D1\u10D0",\r
+mute:"\u10EE\u10DB\u10D8\u10E1 \u10D2\u10D0\u10E0\u10D4\u10E8\u10D4",\r
+stretchtofit:"\u10E4\u10D0\u10DC\u10EF\u10E0\u10D8\u10E1 \u10D6\u10DD\u10DB\u10D0\u10D6\u10D4",\r
+windowlessvideo:"\u10E4\u10D0\u10DC\u10EF\u10E0\u10D8\u10E1 \u10D5\u10D8\u10D3\u10D4\u10DD",\r
+balance:"\u10D1\u10D0\u10DA\u10D0\u10DC\u10E1\u10D8",\r
+baseurl:"\u10E1\u10D0\u10D1\u10D0\u10D6\u10D8\u10E1\u10DD \u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8",\r
+captioningid:"\u10E1\u10E3\u10D1\u10E2\u10D8\u10E2\u10E0\u10D4\u10D1\u10D8\u10E1 \u10E1\u10D0\u10EE\u10D4\u10DA\u10D8",\r
+currentmarker:"\u10DB\u10DD\u10EA\u10D4\u10DB\u10E3\u10DA\u10D8 \u10DB\u10D0\u10E0\u10D9\u10D4\u10E0\u10D8",\r
+currentposition:"\u10DB\u10DD\u10EA\u10D4\u10DB\u10E3\u10DA\u10D8 \u10DE\u10DD\u10D6\u10D8\u10EA\u10D8\u10D0",\r
+defaultframe:"\u10DB\u10D7\u10D0\u10D5\u10D0\u10E0\u10D8 \u10D9\u10D0\u10D3\u10E0\u10D8",\r
+playcount:"\u10DC\u10D0\u10EE\u10D5\u10D4\u10D1\u10D8\u10E1 \u10DB\u10D7\u10D5\u10DA\u10D4\u10DA\u10D8",\r
+rate:"\u10E0\u10D4\u10D8\u10E2\u10D8\u10DC\u10D2\u10D8",\r
+uimode:"\u10D8\u10DC\u10E2\u10D4\u10E0\u10E4\u10D4\u10D8\u10E1\u10D8\u10E1 \u10E0\u10D4\u10EF\u10D8\u10DB\u10D8",\r
+flash_options:"Flash \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+qt_options:"Quicktime \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+wmp_options:"Windows Media \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+rmp_options:"Real Media \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+shockwave_options:"Shockwave \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+autogotourl:"\u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D6\u10D4 \u10D0\u10D5\u10E2\u10DD \u10D2\u10D0\u10D3\u10D0\u10E1\u10D5\u10DA\u10D0",\r
+center:"\u10EA\u10D4\u10DC\u10E2\u10E0\u10D8",\r
+imagestatus:"\u10D2\u10D0\u10DB\u10DD\u10E1\u10D0\u10EE\u10E3\u10DA\u10D4\u10D1\u10D8\u10E1 \u10E1\u10E2\u10D0\u10E2\u10E3\u10E1\u10D8",\r
+maintainaspect:"\u10D6\u10DD\u10DB\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10EE\u10E1\u10DD\u10D5\u10E0\u10D4\u10D1\u10D0",\r
+nojava:"Java-\u10E1 \u10D2\u10D0\u10E0\u10D4\u10E8\u10D4",\r
+prefetch:"\u10D0\u10DB\u10DD\u10D9\u10E0\u10D4\u10E4\u10D0",\r
+shuffle:"\u0412 \u0440\u0430\u0437\u0431\u0440\u043E\u0441",\r
+console:"\u10D9\u10DD\u10DC\u10E1\u10DD\u10DA\u10D8",\r
+numloop:"\u10D2\u10D0\u10DB\u10D4\u10DD\u10E0\u10D4\u10D1\u10D4\u10D1\u10D8",\r
+controls:"\u10DB\u10D0\u10E0\u10D7\u10D5\u10D0",\r
+scriptcallbacks:"\u10E1\u10D9\u10E0\u10D8\u10DE\u10E2\u10D8\u10E1 \u10DB\u10EE\u10D0\u10E0\u10D3\u10D0\u10ED\u10D4\u10E0\u10D0",\r
+swstretchstyle:"\u10D2\u10D0\u10EC\u10D4\u10DA\u10D5\u10D8\u10E1 \u10E1\u10E2\u10D8\u10DA\u10D8",\r
+swstretchhalign:"\u10D2\u10D0\u10EC\u10D4\u10DA\u10D5\u10D8\u10E1 \u10F0\u10DD\u10E0\u10D8\u10D6. \u10D2\u10D0\u10E1\u10EC\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+swstretchvalign:"\u10D2\u10D0\u10EC\u10D4\u10DA\u10D5\u10D8\u10E1 \u10D5\u10D4\u10E0\u10E2. \u10D2\u10D0\u10E1\u10EC\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+sound:"\u10EE\u10DB\u10D0",\r
+progress:"\u10DE\u10E0\u10DD\u10D2\u10E0\u10D4\u10E1\u10D8",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"\u041F\u043E\u0442\u043E\u043A\u043E\u0432\u044B\u0435 rtsp \u0440\u0435\u0441\u0443\u0440\u0441\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u0431\u044B\u0442\u044C \u0432 \u043F\u043E\u043B\u0435 QT Src.",\r
+align_top:"\u10D6\u10D4\u10D3\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+align_right:"\u10DB\u10D0\u10E0\u10EF\u10D5\u10D4\u10DC\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+align_bottom:"\u10E5\u10D5\u10D4\u10D3\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+align_left:"\u10DB\u10D0\u10E0\u10EA\u10EE\u10D4\u10DC\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+align_center:"\u10EA\u10D4\u10DC\u10E2\u10E0\u10D8",\r
+align_top_left:"\u10DB\u10D0\u10E0\u10EA\u10EE\u10D4\u10DC\u10D0 \u10D6\u10D4\u10D3\u10D0 \u10D9\u10E3\u10D7\u10EE\u10D4",\r
+align_top_right:"\u10DB\u10D0\u10E0\u10EF\u10D5\u10D4\u10DC\u10D0 \u10D6\u10D4\u10D3\u10D0 \u10D9\u10E3\u10D7\u10EE\u10D4",\r
+align_bottom_left:"\u10DB\u10D0\u10E0\u10EA\u10EE\u10D4\u10DC\u10D0 \u10E5\u10D5\u10D4\u10D3\u10D0 \u10D9\u10E3\u10D7\u10EE\u10D4",\r
+align_bottom_right:"\u10DB\u10D0\u10E0\u10EF\u10D5\u10D4\u10DC\u10D0 \u10E5\u10D5\u10D4\u10D3\u10D0 \u10D9\u10E3\u10D7\u10EE\u10D4",\r
+flv_options:"Flash \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+flv_scalemode:"\u10DB\u10D0\u10E1\u10E8\u10E2\u10D0\u10D1\u10D8",\r
+flv_buffer:"\u10D1\u10E3\u10E4\u10D4\u10E0\u10D8",\r
+flv_startimage:"\u10E1\u10D0\u10EC\u10E7\u10D8\u10E1\u10D8 \u10D2\u10D0\u10DB\u10DD\u10E1\u10D0\u10EE\u10E3\u10DA\u10D4\u10D1\u10D0",\r
+flv_starttime:"\u10D3\u10D0\u10EC\u10E7\u10D4\u10D1\u10D8\u10E1 \u10D3\u10E0\u10DD",\r
+flv_defaultvolume:"\u10E1\u10E2\u10D0\u10DC\u10D3\u10D0\u10E0\u10E2\u10E3\u10DA\u10D8 \u10EE\u10DB\u10D0",\r
+flv_hiddengui:"\u10D3\u10D0\u10E4\u10D0\u10E0\u10E3\u10DA\u10D8 \u10D8\u10DC\u10E2\u10D4\u10E0\u10E4\u10D4\u10D8\u10E1\u10D8",\r
+flv_autostart:"\u10D0\u10D5\u10E2\u10DD \u10EE\u10DB\u10D0",\r
+flv_loop:"\u10D2\u10D0\u10DB\u10D4\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+flv_showscalemodes:"\u10DB\u10D0\u10E8\u10E2\u10D0\u10D1\u10D8\u10E1 \u10E0\u10D4\u10DF\u10D8\u10DB\u10D8",\r
+flv_smoothvideo:"\u10D7\u10D0\u10DC\u10D0\u10D5\u10D0\u10E0\u10D8 \u10D5\u10D8\u10D3\u10D4\u10DD",\r
+flv_jscallback:"JS \u10DB\u10EE\u10D0\u10E0\u10D3\u10D0\u10ED\u10D4\u10E0\u10D0"\r
+});
\ No newline at end of file
index 4919a77933be9cab62329b64c6ceb388e6f399cf..11f19b027016706e43d4e00e01f5ab1191cf6158 100755 (executable)
@@ -2,7 +2,7 @@ tinyMCE.addI18n('lt.media_dlg',{
 title:"\u012Eterpti/redaguoti integruot\u0105 daugialyp\u0119 terp\u0119",\r
 general:"Bendra",\r
 advanced:"I\u0161pl\u0117sta",\r
-file:"Byla/URL",\r
+file:"Failas/URL",\r
 list:"S\u0105ra\u0161as",\r
 size:"I\u0161matavimai",\r
 preview:"Per\u017Ei\u016Bra",\r
@@ -14,46 +14,46 @@ class_name:"Klas\u0117",
 vspace:"Vertikalus tarpas",\r
 hspace:"Horizontalus tarpas",\r
 play:"Automatinis paleidimas",\r
-loop:"Groti cikli\u0161kai",\r
+loop:"Kartoti",\r
 menu:"Rodyti meniu",\r
 quality:"Kokyb\u0117",\r
 scale:"Mastelis",\r
 align:"Lygiavimas",\r
-salign:"S-Lygiavimas",\r
-wmode:"W-Re\u017Eimas",\r
+salign:"S-lygiavimas",\r
+wmode:"W-re\u017Eimas",\r
 bgcolor:"Fono spalva",\r
 base:"Baz\u0117",\r
-flashvars:"Flash kinamieji",\r
+flashvars:"Flash kintamieji",\r
 liveconnect:"SWLiveConnect",\r
 autohref:"AutoHREF",\r
 cache:"Laikinoji talpykla",\r
 hidden:"Pasl\u0117pta",\r
 controller:"Valdiklis",\r
 kioskmode:"Kiosko re\u017Eimas",\r
-playeveryframe:"Paleisti kiekvien\u0105 freim\u0105",\r
-targetcache:"Taikinio laikinoji talpykla",\r
+playeveryframe:"Paleisti kiekvien\u0105 kadr\u0105",\r
+targetcache:"Paskirties laikinoji talpykla",\r
 correction:"Joki\u0173 korekcij\u0173",\r
 enablejavascript:"\u012Egalinti JavaScript",\r
 starttime:"Prad\u017Eios laikas",\r
 endtime:"Pabaigos laikas",\r
 href:"Href",\r
 qtsrcchokespeed:"Dusinimo greitis",\r
-target:"Taikinys",\r
-volume:"Garsas",\r
+target:"Paskirtis",\r
+volume:"Garsis",\r
 autostart:"Automatinis paleidimas",\r
 enabled:"\u012Ejungta",\r
-fullscreen:"Pilno ekrano re\u017Eimas",\r
+fullscreen:"Viso ekrano re\u017Eimas",\r
 invokeurls:"I\u0161kviesti URL adresus",\r
 mute:"Nutildyti",\r
 stretchtofit:"I\u0161tempti iki atitikimo",\r
-windowlessvideo:"Belangis vaizdas",\r
-balance:"Balancas",\r
+windowlessvideo:"Vaizdas be lango",\r
+balance:"Balansas",\r
 baseurl:"Prad\u017Eios URL adresas",\r
-captioningid:"Nuorodin\u0117s antra\u0161t\u0117s id",\r
-currentmarker:"Esamas \u017Eymeklis",\r
-currentposition:"Esama pozicija",\r
-defaultframe:"Standartinis freimas",\r
-playcount:"Groti kart\u0173",\r
+captioningid:"Antra\u0161t\u0117s id",\r
+currentmarker:"Dabartinis \u017Eymeklis",\r
+currentposition:"Dabartin\u0117 pozicija",\r
+defaultframe:"Numatytas kadras",\r
+playcount:"Grojimo kartai",\r
 rate:"Da\u017Enis",\r
 uimode:"UI re\u017Eimas",\r
 flash_options:"Flash nustatymai",\r
@@ -61,11 +61,11 @@ qt_options:"Quicktime nustatymai",
 wmp_options:"Windows media player nustatymai",\r
 rmp_options:"Real media player nustatymai",\r
 shockwave_options:"Shockwave nustatymai",\r
-autogotourl:"Atomatinis \u0117jimas URL adresu",\r
+autogotourl:"Automatinis \u0117jimas URL adresu",\r
 center:"Centre",\r
 imagestatus:"Paveiksl\u0117lio b\u016Bsena",\r
 maintainaspect:"I\u0161laikyti aspekt\u0105",\r
-nojava:"Be java",\r
+nojava:"Be Java",\r
 prefetch:"I\u0161ankstinis duom. i\u0161rinkimas",\r
 shuffle:"Atsitiktinis mai\u0161ymasis",\r
 console:"Konsol\u0117",\r
@@ -73,30 +73,30 @@ numloop:"Cikl\u0173 kiekis",
 controls:"Valdikliai",\r
 scriptcallbacks:"Scenarijaus atgalinis atsakas",\r
 swstretchstyle:"I\u0161tempti stili\u0173",\r
-swstretchhalign:"I\u0161tempti H-Lygiavimas",\r
-swstretchvalign:"I\u0161tempti V-Lygiavimas",\r
+swstretchhalign:"I\u0161tempti H-lygiavim\u0105",\r
+swstretchvalign:"I\u0161tempti V-lygiavim\u0105",\r
 sound:"Garsas",\r
 progress:"Progresas",\r
 qtsrc:"QT Src",\r
-qt_stream_warn:"Transliuojami rtsp resursai tur\u0117t\u0173 b\u016Bti prid\u0117ti prie QT Src lauko Papildom\u0173 nustatym\u0173 tabuliacijoje.\nTaip pat reikt\u0173 prid\u0117ti ir netransliuojam\u0105j\u0105 Src lauko versij\u0105.",\r
+qt_stream_warn:"Transliuojami rtsp i\u0161tekliai tur\u0117t\u0173 b\u016Bti prid\u0117ti prie QT Src lauko \u201EPapildom\u0173 nustatym\u0173\u201C kortel\u0117je.\nTaip pat reikt\u0173 prid\u0117ti ir netransliuojam\u0105j\u0105 Src lauko versij\u0105.",\r
 align_top:"Vir\u0161uje",\r
 align_right:"De\u0161in\u0117je",\r
 align_bottom:"Apa\u010Dioje",\r
 align_left:"Kair\u0117je",\r
 align_center:"Centre",\r
-align_top_left:"Vir\u0161aus kair\u0117je",\r
-align_top_right:"Vir\u0161aus de\u0161in\u0117je",\r
-align_bottom_left:"Apa\u010Dios kair\u0117je",\r
-align_bottom_right:"Apa\u010Dios de\u0161in\u0117je",\r
+align_top_left:"Vir\u0161uje, kair\u0117je",\r
+align_top_right:"Vir\u0161uje, de\u0161in\u0117je",\r
+align_bottom_left:"Apa\u010Dioje, kair\u0117je",\r
+align_bottom_right:"Apa\u010Dioje, de\u0161in\u0117je",\r
 flv_options:"Flash vaizdo nustatymai",\r
 flv_scalemode:"Mastelio re\u017Eimas",\r
 flv_buffer:"Buferis",\r
-flv_startimage:"Startavimo paveiksl\u0117lis",\r
-flv_starttime:"Startavimo laikas",\r
-flv_defaultvolume:"Pradinis garso lygis",\r
-flv_hiddengui:"Pasl\u0117ptas GUI",\r
+flv_startimage:"Prad\u017Eios paveiksl\u0117lis",\r
+flv_starttime:"Prad\u017Eios laikas",\r
+flv_defaultvolume:"Pradinis garsis",\r
+flv_hiddengui:"Pasl\u0117pta grafin\u0117 s\u0105saja",\r
 flv_autostart:"Auto grojimas",\r
-flv_loop:"Groti cikli\u0161kai",\r
+flv_loop:"Kartoti",\r
 flv_showscalemodes:"Rodyti mastelio re\u017Eimus",\r
 flv_smoothvideo:"Tolygus vaizdas",\r
 flv_jscallback:"JS atgalinis atsakas"\r
index 46ab6affb2ef48ac4a734572cf9c6486695ce3a6..b6c7939ca6575a729f6a6bffb5acc30cc7c37db4 100755 (executable)
@@ -93,7 +93,7 @@ flv_scalemode:"Schaalmodus",
 flv_buffer:"Buffer",\r
 flv_startimage:"Startafbeelding",\r
 flv_starttime:"Starttijd",\r
-flv_defaultvolume:"Standaard volumne",\r
+flv_defaultvolume:"Standaard volume",\r
 flv_hiddengui:"GUI verbergen",\r
 flv_autostart:"Automatisch afspelen",\r
 flv_loop:"Herhalen",\r
diff --git a/program/js/tiny_mce/plugins/media/langs/no_dlg.js b/program/js/tiny_mce/plugins/media/langs/no_dlg.js
new file mode 100644 (file)
index 0000000..cc32b59
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('no.media_dlg',{\r
+title:"Sett inn / rediger inkludert objekt",\r
+general:"Generelt",\r
+advanced:"Avansert",\r
+file:"Fil/URL",\r
+list:"Liste",\r
+size:"St\u00F8rrelse",\r
+preview:"Forh\u00E5ndsvis",\r
+constrain_proportions:"Behold proporsjoner",\r
+type:"Type",\r
+id:"Id",\r
+name:"Navn",\r
+class_name:"Klasse",\r
+vspace:"Vertikal avstand",\r
+hspace:"Horisontal avstand",\r
+play:"Autostart",\r
+loop:"L\u00F8kke",\r
+menu:"Vis meny",\r
+quality:"Kvalitet",\r
+scale:"Skalering",\r
+align:"Justering",\r
+salign:"S-justering",\r
+wmode:"W-modus",\r
+bgcolor:"Bakgrunn",\r
+base:"Base",\r
+flashvars:"Flash-variabler",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Cache",\r
+hidden:"Skjult",\r
+controller:"Kontroller",\r
+kioskmode:"Kiosk-modus",\r
+playeveryframe:"Spill hver ramme",\r
+targetcache:"M\u00E5l-cache",\r
+correction:"Ingen korreksjon",\r
+enablejavascript:"Tillat Javaskript",\r
+starttime:"Starttid",\r
+endtime:"Stopptid",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"M\u00E5l",\r
+volume:"Volum",\r
+autostart:"Autostart",\r
+enabled:"Kj\u00F8rbar",\r
+fullscreen:"Fullskjerm",\r
+invokeurls:"Aktiviser URL-ar",\r
+mute:"Demp",\r
+stretchtofit:"Strekk for \u00E5 passe inn",\r
+windowlessvideo:"Video uten vindu",\r
+balance:"Balanse",\r
+baseurl:"Base URL",\r
+captioningid:"Fange opp id",\r
+currentmarker:"Aktiv mark\u00F8r",\r
+currentposition:"Aktiv posisjon",\r
+defaultframe:"Standardramme",\r
+playcount:"Teller",\r
+rate:"Rangering",\r
+uimode:"UI-modus",\r
+flash_options:"Flash-egenskaper",\r
+qt_options:"Quicktime-innstillinger",\r
+wmp_options:"Windows mediaplayer-innstillinger",\r
+rmp_options:"Real mediaplayer-innstillinger",\r
+shockwave_options:"Shockwave-innstillinger",\r
+autogotourl:"Auto-g\u00E5-til-URL",\r
+center:"Midtstill",\r
+imagestatus:"Status for bilde",\r
+maintainaspect:"Behold proporsjoner",\r
+nojava:"Ikke Java",\r
+prefetch:"Registrer p\u00E5 forh\u00E5nd",\r
+shuffle:"Miks",\r
+console:"Konsoll",\r
+numloop:"Antall gjennomganger",\r
+controls:"Kontroller",\r
+scriptcallbacks:"Skript-referanser",\r
+swstretchstyle:"Strekkstil",\r
+swstretchhalign:"Strekk H-justering",\r
+swstretchvalign:"Strekk V-justering",\r
+sound:"Lyd",\r
+progress:"Framdrift",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Streama rtsp-ressurser b\u00F8r leggest til QT Src-feltet i avansert-fanen.\nDu b\u00F8r ogs\u00E5 legge til en ikke-streama versjon i src-feltet",\r
+align_top:"Topp",\r
+align_right:"H\u00F8yre",\r
+align_bottom:"Bunn",\r
+align_left:"Venstre",\r
+align_center:"Midt",\r
+align_top_left:"Topp venstre",\r
+align_top_right:"Topp h\u00F8yre",\r
+align_bottom_left:"Bunn venste",\r
+align_bottom_right:"Bunn h\u00F8gre",\r
+flv_options:"Flash video-valg",\r
+flv_scalemode:"Skalering",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Startbilde",\r
+flv_starttime:"Starttid",\r
+flv_defaultvolume:"Standardvolum",\r
+flv_hiddengui:"Skjult GUI",\r
+flv_autostart:"Autostart",\r
+flv_loop:"L\u00F8kke",\r
+flv_showscalemodes:"Vis skalering",\r
+flv_smoothvideo:"Jevn video",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
index c455d0e455b3f9a8469d84dcdef58026d1ad92af..3ff7b369a29164d1afe6b8d0109aaed72683d4c4 100755 (executable)
@@ -1,11 +1,11 @@
 tinyMCE.addI18n('pl.media_dlg',{\r
-title:"Insert / edit embedded media",\r
-general:"G\u0142owny",\r
+title:"Wstaw/Edytuj wbudowane media",\r
+general:"G\u0142\u00F3wny",\r
 advanced:"Zaawansowany",\r
 file:"Plik/URL",\r
 list:"Lista",\r
-size:"Dimensions",\r
-preview:"Preview",\r
+size:"Wymiary",\r
+preview:"Podgl\u0105d",\r
 constrain_proportions:"Zachowaj proporcje",\r
 type:"Typ",\r
 id:"Id",\r
@@ -13,12 +13,12 @@ name:"Nazwa",
 class_name:"Klasa",\r
 vspace:"V-Space",\r
 hspace:"H-Space",\r
-play:"Auto play",\r
-loop:"Loop",\r
+play:"Autoodtwarzanie",\r
+loop:"Zap\u0119tlenie",\r
 menu:"Poka\u017C menu",\r
 quality:"Jako\u015B\u0107",\r
-scale:"Scale",\r
-align:"Wyr\u00F3wna\u0107",\r
+scale:"Skala",\r
+align:"Wyr\u00F3wnaj",\r
 salign:"SAlign",\r
 wmode:"WMode",\r
 bgcolor:"T\u0142o",\r
@@ -32,20 +32,20 @@ controller:"Controller",
 kioskmode:"Kiosk mode",\r
 playeveryframe:"Play every frame",\r
 targetcache:"Target cache",\r
-correction:"No correction",\r
-enablejavascript:"Enable JavaScript",\r
+correction:"Bez korekcji",\r
+enablejavascript:"W\u0142\u0105cz JavaScript",\r
 starttime:"Start time",\r
 endtime:"End time",\r
 href:"Href",\r
 qtsrcchokespeed:"Choke speed",\r
-target:"Cel",\r
-volume:"Volume",\r
+target:"Kom\u00F3rka",\r
+volume:"G\u0142o\u015Bno\u015B\u0107",\r
 autostart:"Auto start",\r
 enabled:"Enabled",\r
 fullscreen:"Pe\u0142ny ekran",\r
-invokeurls:"Invoke URLs",\r
-mute:"Mute",\r
-stretchtofit:"Stretch to fit",\r
+invokeurls:"Odwo\u0142aj si\u0119 do URLs",\r
+mute:"Wycisz",\r
+stretchtofit:"Rozci\u0105gnij aby dopasowa\u0107",\r
 windowlessvideo:"Windowless video",\r
 balance:"Balance",\r
 baseurl:"Base URL",\r
@@ -68,14 +68,14 @@ maintainaspect:"Maintain aspect",
 nojava:"No java",\r
 prefetch:"Prefetch",\r
 shuffle:"Shuffle",\r
-console:"Console",\r
-numloop:"Num loops",\r
+console:"Konsola",\r
+numloop:"Liczba powt\u00F3rze\u0144",\r
 controls:"Controls",\r
 scriptcallbacks:"Script callbacks",\r
 swstretchstyle:"Stretch style",\r
 swstretchhalign:"Stretch H-Align",\r
 swstretchvalign:"Stretch V-Align",\r
-sound:"Sound",\r
+sound:"D\u017Awi\u0119k",\r
 progress:"Progress",\r
 qtsrc:"QT Src",\r
 qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
@@ -94,7 +94,7 @@ flv_buffer:"Buffer",
 flv_startimage:"Start image",\r
 flv_starttime:"Start time",\r
 flv_defaultvolume:"Default volumne",\r
-flv_hiddengui:"Hidden GUI",\r
+flv_hiddengui:"Ukryte GUI",\r
 flv_autostart:"Auto start",\r
 flv_loop:"Loop",\r
 flv_showscalemodes:"Show scale modes",\r
diff --git a/program/js/tiny_mce/plugins/media/langs/ps_dlg.js b/program/js/tiny_mce/plugins/media/langs/ps_dlg.js
new file mode 100644 (file)
index 0000000..d019616
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('ps.media_dlg',{\r
+title:"Insert / edit embedded media",\r
+general:"General",\r
+advanced:"Advanced",\r
+file:"File/URL",\r
+list:"List",\r
+size:"Dimensions",\r
+preview:"Preview",\r
+constrain_proportions:"Constrain proportions",\r
+type:"Type",\r
+id:"Id",\r
+name:"Name",\r
+class_name:"Class",\r
+vspace:"V-Space",\r
+hspace:"H-Space",\r
+play:"Auto play",\r
+loop:"Loop",\r
+menu:"Show menu",\r
+quality:"Quality",\r
+scale:"Scale",\r
+align:"Align",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"Background",\r
+base:"Base",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Cache",\r
+hidden:"Hidden",\r
+controller:"Controller",\r
+kioskmode:"Kiosk mode",\r
+playeveryframe:"Play every frame",\r
+targetcache:"Target cache",\r
+correction:"No correction",\r
+enablejavascript:"Enable JavaScript",\r
+starttime:"Start time",\r
+endtime:"End time",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"Target",\r
+volume:"Volume",\r
+autostart:"Auto start",\r
+enabled:"Enabled",\r
+fullscreen:"Fullscreen",\r
+invokeurls:"Invoke URLs",\r
+mute:"Mute",\r
+stretchtofit:"Stretch to fit",\r
+windowlessvideo:"Windowless video",\r
+balance:"Balance",\r
+baseurl:"Base URL",\r
+captioningid:"Captioning id",\r
+currentmarker:"Current marker",\r
+currentposition:"Current position",\r
+defaultframe:"Default frame",\r
+playcount:"Play count",\r
+rate:"Rate",\r
+uimode:"UI Mode",\r
+flash_options:"Flash options",\r
+qt_options:"Quicktime options",\r
+wmp_options:"Windows media player options",\r
+rmp_options:"Real media player options",\r
+shockwave_options:"Shockwave options",\r
+autogotourl:"Auto goto URL",\r
+center:"Center",\r
+imagestatus:"Image status",\r
+maintainaspect:"Maintain aspect",\r
+nojava:"No java",\r
+prefetch:"Prefetch",\r
+shuffle:"Shuffle",\r
+console:"Console",\r
+numloop:"Num loops",\r
+controls:"Controls",\r
+scriptcallbacks:"Script callbacks",\r
+swstretchstyle:"Stretch style",\r
+swstretchhalign:"Stretch H-Align",\r
+swstretchvalign:"Stretch V-Align",\r
+sound:"Sound",\r
+progress:"Progress",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
+align_top:"Top",\r
+align_right:"Right",\r
+align_bottom:"Bottom",\r
+align_left:"Left",\r
+align_center:"Center",\r
+align_top_left:"Top left",\r
+align_top_right:"Top right",\r
+align_bottom_left:"Bottom left",\r
+align_bottom_right:"Bottom right",\r
+flv_options:"Flash video options",\r
+flv_scalemode:"Scale mode",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Start image",\r
+flv_starttime:"Start time",\r
+flv_defaultvolume:"Default volumne",\r
+flv_hiddengui:"Hidden GUI",\r
+flv_autostart:"Auto start",\r
+flv_loop:"Loop",\r
+flv_showscalemodes:"Show scale modes",\r
+flv_smoothvideo:"Smooth video",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
index 43c5710ee37a95f637758ad174481a2e497b755d..4bc057ec4f4050bf49fa15d288df3e8df2c4baca 100755 (executable)
@@ -1,5 +1,5 @@
 tinyMCE.addI18n('pt.media_dlg',{\r
-title:"Inserir/editar m\u00EDdia embutida",\r
+title:"Inserir/Editar m\u00EDdia incorporada",\r
 general:"Geral",\r
 advanced:"Avan\u00E7ado",\r
 file:"Arquivo/URL",\r
@@ -32,10 +32,10 @@ controller:"Controlador",
 kioskmode:"Modo Quiosque",\r
 playeveryframe:"Executar todas as frames",\r
 targetcache:"Cache alvo",\r
-correction:"Sem corre\u00E7\u00F5es",\r
+correction:"Sem correc\u00E7\u00F5es",\r
 enablejavascript:"Disponibilizar javaScript",\r
-starttime:"Hora in\u00EDcio",\r
-endtime:"Hora fim",\r
+starttime:"Hora de in\u00EDcio",\r
+endtime:"Hora do fim",\r
 href:"Href",\r
 qtsrcchokespeed:"Choke speed",\r
 target:"Alvo",\r
@@ -63,9 +63,9 @@ rmp_options:"Op\u00E7\u00F5es Real Media Player",
 shockwave_options:"Op\u00E7\u00F5es Shockwave",\r
 autogotourl:"Auto goto URL",\r
 center:"Centro",\r
-imagestatus:"Image status",\r
-maintainaspect:"Maintain aspect",\r
-nojava:"No java",\r
+imagestatus:"Status da imagem",\r
+maintainaspect:"Manter aspecto",\r
+nojava:"no java",\r
 prefetch:"Prefetch",\r
 shuffle:"Shuffle",\r
 console:"Console",\r
@@ -78,21 +78,21 @@ swstretchvalign:"Stretch V-Align",
 sound:"Som",\r
 progress:"Progresso",\r
 qtsrc:"QT Src",\r
-qt_stream_warn:"Fluxos de recursos rtsp devem ser acrescentados ao campo QT Src no Modo Avan\u00E7ado.\NUma vers\u00E3o sem fluxo tamb\u00E9m deve ser acrescentada ao campo Src.",\r
+qt_stream_warn:"Fluxos de recursos rtsp devem ser acrescentados ao campo QT Src no Modo Avan\u00E7ado.\Numa vers\u00E3o sem fluxo tamb\u00E9m deve ser acrescentada ao campo Src.",\r
 align_top:"Topo",\r
 align_right:"Direita",\r
-align_bottom:"Embaixo",\r
+align_bottom:"Abaixo",\r
 align_left:"Esquerda",\r
 align_center:"Centro",\r
-align_top_left:"Topo \u00E0\u00A0 esquerda",\r
-align_top_right:"Topo \u00E0\u00A0 direita",\r
-align_bottom_left:"Embaixo \u00E0\u00A0 esquerda",\r
-align_bottom_right:"Embaixo \u00E0\u00A0 direita",\r
+align_top_left:"Topo esquerda",\r
+align_top_right:"Topo direita",\r
+align_bottom_left:"Abaixo esquerda",\r
+align_bottom_right:"Abaixo direita",\r
 flv_options:"Op\u00E7\u00F5es de Flash video",\r
 flv_scalemode:"Modo escala",\r
 flv_buffer:"Buffer",\r
 flv_startimage:"Imagem inicial",\r
-flv_starttime:"Hor\u00E1rio inicial",\r
+flv_starttime:"Hora inicial",\r
 flv_defaultvolume:"Volume padr\u00E3o",\r
 flv_hiddengui:"GUI oculta",\r
 flv_autostart:"Execu\u00E7\u00E3o Autom\u00E1tica",\r
index 7acfa02b0f88bc24440a1337197e65f8062bcee2..f51adede091a46407594e5ccc95af765c3207b9d 100755 (executable)
 tinyMCE.addI18n('ru.media_dlg',{\r
-title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C/\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043C\u0435\u0434\u0438\u0430-\u043E\u0431\u044A\u0435\u043A\u0442",\r
-general:"\u041E\u0431\u0449\u0438\u0435",\r
-advanced:"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435",\r
-file:"\u0424\u0430\u0439\u043B/\u0430\u0434\u0440\u0435\u0441",\r
+title:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u043A\u043B\u0438\u043F\u0430",\r
+general:"\u041E\u0431\u0449\u0435\u0435",\r
+advanced:"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E",\r
+file:"\u0410\u0434\u0440\u0435\u0441",\r
 list:"\u0421\u043F\u0438\u0441\u043E\u043A",\r
 size:"\u0420\u0430\u0437\u043C\u0435\u0440\u044B",\r
 preview:"\u041F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440",\r
 constrain_proportions:"\u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043F\u0440\u043E\u043F\u043E\u0440\u0446\u0438\u0438",\r
 type:"\u0422\u0438\u043F",\r
-id:"\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440",\r
+id:"\u0418\u043C\u044F",\r
 name:"\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435",\r
 class_name:"\u041A\u043B\u0430\u0441\u0441",\r
-vspace:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E",\r
-hspace:"\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E",\r
-play:"\u041F\u0440\u043E\u0438\u0433\u0440\u044B\u0432\u0430\u0442\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438",\r
-loop:"\u0417\u0430\u0446\u0438\u043A\u043B\u0438\u0442\u044C",\r
-menu:"\u041E\u0442\u043E\u0431\u0440\u0430\u0437\u0438\u0442\u044C \u043C\u0435\u043D\u044E",\r
+vspace:"\u0412\u0435\u0440\u0442. \u043E\u0442\u0441\u0442\u0443\u043F",\r
+hspace:"\u0413\u043E\u0440. \u043E\u0442\u0441\u0442\u0443\u043F",\r
+play:"\u0410\u0432\u0442\u0437\u0430\u043F\u0443\u0441\u043A",\r
+loop:"\u041F\u043E\u0432\u0442\u043E\u0440",\r
+menu:"\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043C\u0435\u043D\u044E",\r
 quality:"\u041A\u0430\u0447\u0435\u0441\u0442\u0432\u043E",\r
-scale:"\u041C\u0430\u0441\u0448\u0442\u0430\u0431",\r
+scale:"\u041E\u0431\u043B\u0430\u0441\u0442\u044C",\r
 align:"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435",\r
-salign:"SAlign",\r
-wmode:"WMode",\r
+salign:"\u0412\u044B\u0440-\u0435",\r
+wmode:"\u041E\u043A\u043D\u043E",\r
 bgcolor:"\u0424\u043E\u043D",\r
-base:"\u041E\u0441\u043D\u043E\u0432\u0430",\r
-flashvars:"Flashvars",\r
+base:"Base",\r
+flashvars:"Flas \u043A\u043E\u043C\u0430\u043D\u0434\u044B",\r
 liveconnect:"SWLiveConnect",\r
-autohref:"AutoHREF",\r
+autohref:"\u0410\u0432\u0442\u043E-\u0441\u0441\u044B\u043B\u043A\u0430",\r
 cache:"\u041A\u044D\u0448",\r
-hidden:"\u0421\u043A\u0440\u044B\u0442\u043E\u0435",\r
-controller:"Controller",\r
-kioskmode:"Kiosk mode",\r
-playeveryframe:"Play every frame",\r
-targetcache:"Target cache",\r
-correction:"No correction",\r
-enablejavascript:"Enable JavaScript",\r
-starttime:"Start time",\r
-endtime:"End time",\r
-href:"Href",\r
+hidden:"\u0421\u043A\u0440\u044B\u0442\u044B\u0439",\r
+controller:"\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435",\r
+kioskmode:"\u0420\u0435\u0436\u0438\u043C \u043A\u0438\u043E\u0441\u043A",\r
+playeveryframe:"\u0412\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043A\u0430\u0436\u0434\u044B\u0439 \u043A\u0430\u0434\u0440",\r
+targetcache:"\u041A\u044D\u0448 \u0446\u0435\u043B\u0438",\r
+correction:"\u0411\u0435\u0437 \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u0438\u0440\u043E\u0432\u043A\u0438",\r
+enablejavascript:"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C JavaScript",\r
+starttime:"\u0412\u0440\u0435\u043C\u044F \u043D\u0430\u0447\u0430\u043B\u0430",\r
+endtime:"\u0412\u0440\u0435\u043C\u044F \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F",\r
+href:"\u0421\u0441\u044B\u043B\u043A\u0430",\r
 qtsrcchokespeed:"Choke speed",\r
-target:"Target",\r
-volume:"Volume",\r
-autostart:"Auto start",\r
-enabled:"Enabled",\r
-fullscreen:"Fullscreen",\r
-invokeurls:"Invoke URLs",\r
-mute:"Mute",\r
-stretchtofit:"Stretch to fit",\r
-windowlessvideo:"Windowless video",\r
-balance:"Balance",\r
-baseurl:"Base URL",\r
-captioningid:"Captioning id",\r
-currentmarker:"Current marker",\r
-currentposition:"Current position",\r
-defaultframe:"Default frame",\r
-playcount:"Play count",\r
-rate:"Rate",\r
-uimode:"UI Mode",\r
-flash_options:"Flash options",\r
-qt_options:"Quicktime options",\r
-wmp_options:"Windows media player options",\r
-rmp_options:"Real media player options",\r
-shockwave_options:"Shockwave options",\r
-autogotourl:"Auto goto URL",\r
-center:"Center",\r
-imagestatus:"Image status",\r
-maintainaspect:"Maintain aspect",\r
-nojava:"No java",\r
-prefetch:"Prefetch",\r
-shuffle:"Shuffle",\r
-console:"Console",\r
-numloop:"Num loops",\r
-controls:"Controls",\r
-scriptcallbacks:"Script callbacks",\r
-swstretchstyle:"Stretch style",\r
-swstretchhalign:"Stretch H-Align",\r
-swstretchvalign:"Stretch V-Align",\r
-sound:"Sound",\r
-progress:"Progress",\r
+target:"\u0426\u0435\u043B\u044C",\r
+volume:"\u0413\u0440\u043E\u043C\u043A\u043E\u0441\u0442\u044C",\r
+autostart:"\u0410\u0432\u0442\u043E\u0437\u0430\u043F\u0443\u0441\u043A",\r
+enabled:"\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u043E",\r
+fullscreen:"\u041D\u0430 \u0432\u0435\u0441\u044C \u044D\u043A\u0440\u0430\u043D",\r
+invokeurls:"\u0412\u044B\u0437\u0432\u0430\u0442\u044C \u0430\u0434\u0440\u0435\u0441",\r
+mute:"\u0411\u0435\u0437 \u0437\u0432\u0443\u043A\u0430",\r
+stretchtofit:"\u041F\u043E\u0434 \u0440\u0430\u0437\u043C\u0435\u0440 \u043E\u043A\u043D\u0430",\r
+windowlessvideo:"\u041E\u043A\u043E\u043D\u043D\u043E\u0435 \u0432\u0438\u0434\u0435\u043E",\r
+balance:"\u0411\u0430\u043B\u0430\u043D\u0441",\r
+baseurl:"\u0411\u0430\u0437\u043E\u0440\u0432\u044B\u0439 \u0430\u0434\u0440\u0435\u0441",\r
+captioningid:"\u0418\u043C\u044F \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043E\u0432",\r
+currentmarker:"\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043C\u0430\u0440\u043A\u0435\u0440",\r
+currentposition:"\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u044F",\r
+defaultframe:"\u041E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u043A\u0430\u0434\u0440",\r
+playcount:"\u0429\u0435\u0442\u0447\u0438\u043A \u0432\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0434\u0435\u043D\u0438\u0439",\r
+rate:"\u0420\u0435\u0439\u0442\u0438\u043D\u0433",\r
+uimode:"\u0420\u0435\u0436\u0438\u043C \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430",\r
+flash_options:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B Flash",\r
+qt_options:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B Quicktime",\r
+wmp_options:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B Windows Media",\r
+rmp_options:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B Real Media",\r
+shockwave_options:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B Shockwave",\r
+autogotourl:"\u0410\u0432\u0442\u043E\u043F\u0435\u0440\u0435\u0445\u043E\u0434 \u043D\u0430 \u0430\u0434\u0440\u0435\u0441",\r
+center:"\u0426\u0435\u043D\u0442\u0440",\r
+imagestatus:"\u0421\u0442\u0430\u0442\u0443\u0441 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",\r
+maintainaspect:"\u0417\u0430\u043F\u043E\u043C\u043D\u0438\u0442\u044C \u0440\u0430\u0437\u043C\u0435\u0440",\r
+nojava:"\u0411\u0435\u0437 Java",\r
+prefetch:"\u0423\u043F\u0440\u0435\u0436\u0434\u0430\u044E\u0449\u0430\u044F \u0432\u044B\u0431\u043E\u0440\u043A\u0430",\r
+shuffle:"\u0412 \u0440\u0430\u0437\u0431\u0440\u043E\u0441",\r
+console:"\u041A\u043E\u043D\u0441\u043E\u043B\u044C",\r
+numloop:"\u041F\u043E\u0432\u0442\u043E\u0440\u044B",\r
+controls:"\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435",\r
+scriptcallbacks:"\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0430 \u0441\u043A\u0440\u0438\u043F\u0442\u0430",\r
+swstretchstyle:"\u0421\u0442\u0438\u043B\u044C \u0440\u0430\u0441\u0442\u044F\u0436\u0435\u043D\u0438\u0435",\r
+swstretchhalign:"\u0413\u043E\u0440. \u0432\u044B\u0440-\u0435 \u0440\u0430\u0441\u0442\u044F\u0436\u0435\u043D\u0438\u044F",\r
+swstretchvalign:"\u0412\u0435\u0440. \u0432\u044B\u0440-\u0435 \u0440\u0430\u0441\u0442\u044F\u0436\u0435\u043D\u0438\u044F",\r
+sound:"\u0417\u0432\u0443\u043A",\r
+progress:"\u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441",\r
 qtsrc:"QT Src",\r
-qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
-align_top:"Top",\r
-align_right:"Right",\r
-align_bottom:"Bottom",\r
-align_left:"Left",\r
-align_center:"Center",\r
-align_top_left:"Top left",\r
-align_top_right:"Top right",\r
-align_bottom_left:"Bottom left",\r
-align_bottom_right:"Bottom right",\r
-flv_options:"Flash video options",\r
-flv_scalemode:"Scale mode",\r
-flv_buffer:"Buffer",\r
-flv_startimage:"Start image",\r
-flv_starttime:"Start time",\r
-flv_defaultvolume:"Default volumne",\r
-flv_hiddengui:"Hidden GUI",\r
-flv_autostart:"Auto start",\r
-flv_loop:"Loop",\r
-flv_showscalemodes:"Show scale modes",\r
-flv_smoothvideo:"Smooth video",\r
-flv_jscallback:"JS Callback"\r
+qt_stream_warn:"\u041F\u043E\u0442\u043E\u043A\u043E\u0432\u044B\u0435 rtsp \u0440\u0435\u0441\u0443\u0440\u0441\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u0431\u044B\u0442\u044C \u0432 \u043F\u043E\u043B\u0435 QT Src.",\r
+align_top:"\u041F\u043E \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+align_right:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+align_bottom:"\u041F\u043E \u043D\u0438\u0436\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+align_left:"\u041F\u043E \u043B\u0435\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+align_center:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443",\r
+align_top_left:"\u041F\u043E \u043B\u0435\u0432\u043E\u043C\u0443 \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+align_top_right:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+align_bottom_left:"\u041F\u043E \u043B\u0435\u0432\u043E\u043C\u0443 \u043D\u0438\u0436\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+align_bottom_right:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043D\u0438\u0436\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+flv_options:"\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 Flash",\r
+flv_scalemode:"\u041C\u0430\u0441\u0448\u0442\u0430\u0431",\r
+flv_buffer:"\u0411\u0443\u0444\u0435\u0440",\r
+flv_startimage:"\u0421\u0442\u0430\u0440\u0442\u043E\u0432\u043E\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435",\r
+flv_starttime:"\u0421\u0442\u0430\u0440\u0442\u043E\u0432\u043E\u0435 \u0432\u0440\u0435\u043C\u044F",\r
+flv_defaultvolume:"\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0439 \u0437\u0432\u0443\u043A",\r
+flv_hiddengui:"\u0421\u043A\u0440\u044B\u0442\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441",\r
+flv_autostart:"\u0410\u0432\u0442\u043E\u0437\u0430\u043F\u0443\u0441\u043A",\r
+flv_loop:"\u041F\u043E\u0432\u0442\u043E\u0440",\r
+flv_showscalemodes:"\u0420\u0435\u0436\u0438\u043C \u043C\u0430\u0441\u0448\u0442\u0430\u0431\u0430",\r
+flv_smoothvideo:"\u041F\u043B\u0430\u0432\u043D\u043E\u0435 \u0432\u0438\u0434\u0435\u043E",\r
+flv_jscallback:"\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0430 JS"\r
 });
\ No newline at end of file
index 5848a922975e4c57de80357aa3afcfddb974c388..b33b602ce3c9951f44c57769967a449807bbc332 100755 (executable)
@@ -1,7 +1,7 @@
 tinyMCE.addI18n('sk.media_dlg',{\r
-title:"Vlo\u017Eenie / editovanie vnoren\u00FDch m\u00E9di\u00ED",\r
-general:"Z\u00E1kladn\u00E9",\r
-advanced:"Pokro\u010Dil\u00E9",\r
+title:"Vlo\u017Ei\u0165/upravi\u0165 vkladan\u00E9 m\u00E9di\u00E1",\r
+general:"Obecn\u00E9",\r
+advanced:"Roz\u0161\u00EDren\u00E9",\r
 file:"S\u00FAbor/URL",\r
 list:"Zoznam",\r
 size:"Rozmery",\r
@@ -11,93 +11,93 @@ type:"Typ",
 id:"ID",\r
 name:"N\u00E1zov",\r
 class_name:"Trieda",\r
-vspace:"Ver. medzera",\r
-hspace:"Hor. medzera",\r
-play:"Samosp\u00FA\u0161\u0165anie",\r
-loop:"Slu\u010Dka",\r
-menu:"Zobrazi\u0165 menu",\r
+vspace:"Vertik\u00E1lne odsadenie",\r
+hspace:"Horizont\u00E1lne odsadenie",\r
+play:"Automatick\u00E9 prehr\u00E1vanie",\r
+loop:"Opakovanie",\r
+menu:"Zobrazi\u0165 ponuku",\r
 quality:"Kvalita",\r
-scale:"Mierka",\r
-align:"Zarovna\u0165",\r
-salign:"SAlign",\r
-wmode:"WMode",\r
+scale:"Pomer",\r
+align:"Zarovnanie",\r
+salign:"Zarovnanie okna",\r
+wmode:"Re\u017Eim okna",\r
 bgcolor:"Pozadie",\r
-base:"Z\u00E1klad",\r
-flashvars:"Flashvars",\r
-liveconnect:"SWLiveConnect",\r
-autohref:"AutoHREF",\r
-cache:"Z\u00E1loha",\r
-hidden:"Skryt\u00FD",\r
-controller:"Controller",\r
-kioskmode:"Kiosk mode",\r
-playeveryframe:"Prehra\u0165 ka\u017Ed\u00FD frame",\r
-targetcache:"Target cache",\r
-correction:"Bez opravy",\r
+base:"Z\u00E1kladn\u00FD prie\u010Dinok",\r
+flashvars:"Parametre (Flashvars)",\r
+liveconnect:"Spusti\u0165 Javu (SWLiveConnect)",\r
+autohref:"Automatick\u00E9 na\u010D\u00EDtanie",\r
+cache:"Medzipam\u00E4\u0165",\r
+hidden:"Skry\u0165",\r
+controller:"Ovl\u00E1dac\u00ED panel",\r
+kioskmode:"Zak\u00E1za\u0165 ukladanie",\r
+playeveryframe:"Prehra\u0165 ka\u017Ed\u00FD sn\u00EDmok",\r
+targetcache:"Cie\u013Eov\u00E1 medzipam\u00E4\u0165",\r
+correction:"Bez korekci\u00ED",\r
 enablejavascript:"Povoli\u0165 JavaScript",\r
 starttime:"Po\u010Diato\u010Dn\u00FD \u010Das",\r
-endtime:"Kone\u010Dn\u00FD \u010Das",\r
-href:"Href",\r
-qtsrcchokespeed:"Choke speed",\r
+endtime:"Koncov\u00FD \u010Das",\r
+href:"Odkaz",\r
+qtsrcchokespeed:"Zn\u00ED\u017Eenie r\u00FDchlosti",\r
 target:"Cie\u013E",\r
-volume:"Hlasitos\u0165 zvuku",\r
-autostart:"Samosp\u00FA\u0161\u0165anie",\r
-enabled:"Povoli\u0165",\r
+volume:"Hlasitos\u0165",\r
+autostart:"Automatick\u00E9 spustenie",\r
+enabled:"Povoli\u0165 ovl\u00E1dac\u00ED panel",\r
 fullscreen:"Cel\u00E1 obrazovka",\r
-invokeurls:"Invoke URLs",\r
+invokeurls:"Po\u017Eadova\u0165 URL",\r
 mute:"Uml\u010Da\u0165",\r
-stretchtofit:"Stretch to fit",\r
-windowlessvideo:"Windowless video",\r
+stretchtofit:"Roztiahn\u00FA\u0165 do okna",\r
+windowlessvideo:"Video bez okna",\r
 balance:"Rovnov\u00E1ha",\r
 baseurl:"Z\u00E1kladn\u00E1 URL",\r
-captioningid:"Captioning id",\r
-currentmarker:"Current marker",\r
-currentposition:"Current position",\r
-defaultframe:"Predvolen\u00FD r\u00E1mec",\r
+captioningid:"ID popisku m\u00E9dia",\r
+currentmarker:"Aktu\u00E1lna z\u00E1lo\u017Eka",\r
+currentposition:"Aktu\u00E1lna poz\u00EDcia",\r
+defaultframe:"Predvolen\u00FD sn\u00EDmok",\r
 playcount:"Po\u010D\u00EDtadlo prehrat\u00ED",\r
-rate:"Pomer",\r
-uimode:"UI Mode",\r
-flash_options:"Vlastnosti Flash",\r
-qt_options:"Vlastnosti Quicktime",\r
-wmp_options:"Vlastnosti Windows media player",\r
-rmp_options:"Vlastnosti Real media player",\r
-shockwave_options:"Vlastnosti Shockwave",\r
-autogotourl:"Auto goto URL",\r
-center:"Center",\r
-imagestatus:"Image status",\r
-maintainaspect:"Maintain aspect",\r
-nojava:"No java",\r
-prefetch:"Prefetch",\r
-shuffle:"Shuffle",\r
+rate:"Relat\u00EDvna r\u00FDchlos\u0165",\r
+uimode:"Re\u017Eim ovl\u00E1dacieho panelu",\r
+flash_options:"Mo\u017Enosti Flashu",\r
+qt_options:"Mo\u017Enosti Quicktime",\r
+wmp_options:"Mo\u017Enosti prehr\u00E1va\u010Da Windows media",\r
+rmp_options:"Mo\u017Enosti prehr\u00E1va\u010Da Real media",\r
+shockwave_options:"Mo\u017Enosti Shockwave",\r
+autogotourl:"Automatick\u00FD prechod na URL",\r
+center:"Na stred",\r
+imagestatus:"Stav obrazu",\r
+maintainaspect:"Zachova\u0165 pomer str\u00E1n",\r
+nojava:"Nesp\u00FA\u0161\u0165a\u0165 Javu",\r
+prefetch:"Predna\u010D\u00EDtanie",\r
+shuffle:"N\u00E1hodne",\r
 console:"Konzola",\r
-numloop:"Num loops",\r
-controls:"Controls",\r
-scriptcallbacks:"Script callbacks",\r
-swstretchstyle:"Stretch style",\r
-swstretchhalign:"Stretch H-Align",\r
-swstretchvalign:"Stretch V-Align",\r
+numloop:"Po\u010Det opakovan\u00ED",\r
+controls:"Ovl\u00E1dac\u00ED panel",\r
+scriptcallbacks:"Skripty sp\u00E4tn\u00FDch volan\u00ED",\r
+swstretchstyle:"\u0160t\u00FDl roztiahnutia",\r
+swstretchhalign:"Zarovnanie horiz. roztiahnutia",\r
+swstretchvalign:"Zarovnanie vert. roztiahnutia",\r
 sound:"Zvuk",\r
-progress:"Progress",\r
-qtsrc:"QT Src",\r
-qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
-align_top:"Top",\r
-align_right:"Right",\r
-align_bottom:"Bottom",\r
-align_left:"Left",\r
-align_center:"Center",\r
-align_top_left:"Top left",\r
-align_top_right:"Top right",\r
-align_bottom_left:"Bottom left",\r
-align_bottom_right:"Bottom right",\r
-flv_options:"Flash video options",\r
-flv_scalemode:"Scale mode",\r
-flv_buffer:"Buffer",\r
-flv_startimage:"Start image",\r
-flv_starttime:"Start time",\r
-flv_defaultvolume:"Default volumne",\r
-flv_hiddengui:"Hidden GUI",\r
-flv_autostart:"Samosp\u00FA\u0161\u0165anie",\r
-flv_loop:"Slu\u010Dka",\r
-flv_showscalemodes:"Show scale modes",\r
-flv_smoothvideo:"Smooth video",\r
-flv_jscallback:"JS Callback"\r
+progress:"Priebeh",\r
+qtsrc:"S\u00FAbor/URL streamu pre QT",\r
+qt_stream_warn:"Streamovan\u00E9 rtsp zdroje m\u00F4\u017Eu by\u0165 pridan\u00E9 do polia 'S\u00FAbor/URL streamu pre QT' na z\u00E1lo\u017Eke 'Roz\u0161\u00EDren\u00E9'.\nYM\u00F4\u017Ete tie\u017E prida\u0165 nie streamovan\u00FA verziu do polia 'S\u00FAbor/URL'.",\r
+align_top:"Hore",\r
+align_right:"Vpravo",\r
+align_bottom:"Dolu",\r
+align_left:"V\u013Eavo",\r
+align_center:"Na stred",\r
+align_top_left:"Hore v\u013Eavo",\r
+align_top_right:"Hore vpravo",\r
+align_bottom_left:"Dolu v\u013Eavo",\r
+align_bottom_right:"Dolu vpravo",\r
+flv_options:"Mo\u017Enosti Flash video",\r
+flv_scalemode:"Zmena ve\u013Ekosti",\r
+flv_buffer:"Z\u00E1sobn\u00EDk",\r
+flv_startimage:"Po\u010Diato\u010Dn\u00FD obr\u00E1zok",\r
+flv_starttime:"Po\u010Diato\u010Dn\u00FD \u010Das",\r
+flv_defaultvolume:"Predvolen\u00E1 hlasitos\u0165",\r
+flv_hiddengui:"Skryt\u00FD ovl\u00E1dac\u00ED panel",\r
+flv_autostart:"Automatick\u00E9 spustenie",\r
+flv_loop:"Opakovanie",\r
+flv_showscalemodes:"Zobrazi\u0165 vo\u013Eby zmeny ve\u013Ekosti",\r
+flv_smoothvideo:"Vyhladzovan\u00FD obraz",\r
+flv_jscallback:"Sp\u00E4tn\u00E9 volanie JavaScriptu"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/sq_dlg.js b/program/js/tiny_mce/plugins/media/langs/sq_dlg.js
new file mode 100644 (file)
index 0000000..4cf3435
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('sq.media_dlg',{\r
+title:"Fut / edito media",\r
+general:"T\u00EB P\u00EBrgjithshme",\r
+advanced:"T\u00EB Avancuara",\r
+file:"Skedari/URL",\r
+list:"Lista",\r
+size:"P\u00EBrmasat",\r
+preview:"Paraqitje",\r
+constrain_proportions:"Ruaj raportet",\r
+type:"Tipi",\r
+id:"Id",\r
+name:"Emri",\r
+class_name:"Klasa",\r
+vspace:"Hap\u00EBsira-V",\r
+hspace:"Hap\u00EBsira-H",\r
+play:"Luaj automatikisht",\r
+loop:"Lak",\r
+menu:"Shfaq menu",\r
+quality:"Cil\u00EBsia",\r
+scale:"Shkalla",\r
+align:"Drejtimi",\r
+salign:"Drejtimi S",\r
+wmode:"WMode",\r
+bgcolor:"Fusha",\r
+base:"Baza",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Cache",\r
+hidden:"Fshehur",\r
+controller:"Kontrollues",\r
+kioskmode:"M\u00EBnyra Kiosk",\r
+playeveryframe:"Luaj \u00E7do kuader",\r
+targetcache:"Cache sh\u00EBnjestr\u00EBn",\r
+correction:"Pa rregullime",\r
+enablejavascript:"Aktivizo JavaScript",\r
+starttime:"Koha e nisjes",\r
+endtime:"Koha e p\u00EBrfundimit",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"Sh\u00EBnjestra",\r
+volume:"Volumi",\r
+autostart:"Nisje automatike",\r
+enabled:"Aktivizuar",\r
+fullscreen:"Pamje e plot\u00EB",\r
+invokeurls:"Th\u00EBrrit URL",\r
+mute:"Mbyll z\u00EBrin",\r
+stretchtofit:"Zmadho me p\u00EBrshtatje",\r
+windowlessvideo:"Video pa dritare",\r
+balance:"Balanci",\r
+baseurl:"URL baz\u00EB",\r
+captioningid:"Id e titullit",\r
+currentmarker:"Sh\u00EBnjuesi aktual",\r
+currentposition:"Pozicioni aktual",\r
+defaultframe:"Kuadri fillestar",\r
+playcount:"Numri i luajtjeve",\r
+rate:"Raporti",\r
+uimode:"M\u00EBnyra UI",\r
+flash_options:"Opsionet e Flash",\r
+qt_options:"Opsionet e Quicktime",\r
+wmp_options:"Opsionet e Windows media player",\r
+rmp_options:"Opsionet e Real media player",\r
+shockwave_options:"Opsionet e Shockwave",\r
+autogotourl:"Shko n\u00EB URL automatikisht",\r
+center:"Qend\u00EBr",\r
+imagestatus:"Statusi fotos",\r
+maintainaspect:"Ruaj raportet",\r
+nojava:"Pa Java",\r
+prefetch:"Para ngarko",\r
+shuffle:"Shuffle",\r
+console:"Konsola",\r
+numloop:"Numri lak\u00EBve",\r
+controls:"Kontrollet",\r
+scriptcallbacks:"Script Callbacks",\r
+swstretchstyle:"Stili i zmadhimit",\r
+swstretchhalign:"Zmadho Drejtim-H",\r
+swstretchvalign:"Zmadho Drejtim-V",\r
+sound:"Z\u00EBri",\r
+progress:"Progresi",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Risurset rtsp duhet t\u00EB shtohen n\u00EB fush\u00EBn QT Src n\u00EB opsionet e avancuara.\nDuhet t\u00EB shtoni gjithashtu nj\u00EB version jo stream n\u00EB fush\u00EBn src..",\r
+align_top:"Krye",\r
+align_right:"Djathtas",\r
+align_bottom:"Fund",\r
+align_left:"Majtas",\r
+align_center:"Qend\u00EBr",\r
+align_top_left:"Krye-majtas",\r
+align_top_right:"Krye-djathtas",\r
+align_bottom_left:"Fund-majtas",\r
+align_bottom_right:"Fund-djathtas",\r
+flv_options:"Opsionet e videos Flash",\r
+flv_scalemode:"M\u00EBnyra e shkall\u00EBs",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Foto fillestare",\r
+flv_starttime:"Foto p\u00EBrfundimtare",\r
+flv_defaultvolume:"Volumi fillestar",\r
+flv_hiddengui:"GUI e fshehur",\r
+flv_autostart:"Nis automatikisht",\r
+flv_loop:"Lak",\r
+flv_showscalemodes:"Trego shkall\u00EBt",\r
+flv_smoothvideo:"Video pa ngecje",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/ta_dlg.js b/program/js/tiny_mce/plugins/media/langs/ta_dlg.js
new file mode 100644 (file)
index 0000000..b6cc56e
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('ta.media_dlg',{\r
+title:"Insert / edit embedded media",\r
+general:"General",\r
+advanced:"Advanced",\r
+file:"File/URL",\r
+list:"List",\r
+size:"Dimensions",\r
+preview:"Preview",\r
+constrain_proportions:"Constrain proportions",\r
+type:"Type",\r
+id:"Id",\r
+name:"Name",\r
+class_name:"Class",\r
+vspace:"V-Space",\r
+hspace:"H-Space",\r
+play:"Auto play",\r
+loop:"Loop",\r
+menu:"Show menu",\r
+quality:"Quality",\r
+scale:"Scale",\r
+align:"Align",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"Background",\r
+base:"Base",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Cache",\r
+hidden:"Hidden",\r
+controller:"Controller",\r
+kioskmode:"Kiosk mode",\r
+playeveryframe:"Play every frame",\r
+targetcache:"Target cache",\r
+correction:"No correction",\r
+enablejavascript:"Enable JavaScript",\r
+starttime:"Start time",\r
+endtime:"End time",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"Target",\r
+volume:"Volume",\r
+autostart:"Auto start",\r
+enabled:"Enabled",\r
+fullscreen:"Fullscreen",\r
+invokeurls:"Invoke URLs",\r
+mute:"Mute",\r
+stretchtofit:"Stretch to fit",\r
+windowlessvideo:"Windowless video",\r
+balance:"Balance",\r
+baseurl:"Base URL",\r
+captioningid:"Captioning id",\r
+currentmarker:"Current marker",\r
+currentposition:"Current position",\r
+defaultframe:"Default frame",\r
+playcount:"Play count",\r
+rate:"Rate",\r
+uimode:"UI Mode",\r
+flash_options:"Flash options",\r
+qt_options:"Quicktime options",\r
+wmp_options:"Windows media player options",\r
+rmp_options:"Real media player options",\r
+shockwave_options:"Shockwave options",\r
+autogotourl:"Auto goto URL",\r
+center:"Center",\r
+imagestatus:"Image status",\r
+maintainaspect:"Maintain aspect",\r
+nojava:"No java",\r
+prefetch:"Prefetch",\r
+shuffle:"Shuffle",\r
+console:"Console",\r
+numloop:"Num loops",\r
+controls:"Controls",\r
+scriptcallbacks:"Script callbacks",\r
+swstretchstyle:"Stretch style",\r
+swstretchhalign:"Stretch H-Align",\r
+swstretchvalign:"Stretch V-Align",\r
+sound:"Sound",\r
+progress:"Progress",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
+align_top:"Top",\r
+align_right:"Right",\r
+align_bottom:"Bottom",\r
+align_left:"Left",\r
+align_center:"Center",\r
+align_top_left:"Top left",\r
+align_top_right:"Top right",\r
+align_bottom_left:"Bottom left",\r
+align_bottom_right:"Bottom right",\r
+flv_options:"Flash video options",\r
+flv_scalemode:"Scale mode",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Start image",\r
+flv_starttime:"Start time",\r
+flv_defaultvolume:"Default volumne",\r
+flv_hiddengui:"Hidden GUI",\r
+flv_autostart:"Auto start",\r
+flv_loop:"Loop",\r
+flv_showscalemodes:"Show scale modes",\r
+flv_smoothvideo:"Smooth video",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/te_dlg.js b/program/js/tiny_mce/plugins/media/langs/te_dlg.js
new file mode 100644 (file)
index 0000000..452e386
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('te.media_dlg',{\r
+title:"Insert / edit embedded media",\r
+general:"General",\r
+advanced:"Advanced",\r
+file:"File/URL",\r
+list:"List",\r
+size:"Dimensions",\r
+preview:"Preview",\r
+constrain_proportions:"Constrain proportions",\r
+type:"Type",\r
+id:"Id",\r
+name:"Name",\r
+class_name:"Class",\r
+vspace:"V-Space",\r
+hspace:"H-Space",\r
+play:"Auto play",\r
+loop:"Loop",\r
+menu:"Show menu",\r
+quality:"Quality",\r
+scale:"Scale",\r
+align:"Align",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"Background",\r
+base:"Base",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Cache",\r
+hidden:"Hidden",\r
+controller:"Controller",\r
+kioskmode:"Kiosk mode",\r
+playeveryframe:"Play every frame",\r
+targetcache:"Target cache",\r
+correction:"No correction",\r
+enablejavascript:"Enable JavaScript",\r
+starttime:"Start time",\r
+endtime:"End time",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"Target",\r
+volume:"Volume",\r
+autostart:"Auto start",\r
+enabled:"Enabled",\r
+fullscreen:"Fullscreen",\r
+invokeurls:"Invoke URLs",\r
+mute:"Mute",\r
+stretchtofit:"Stretch to fit",\r
+windowlessvideo:"Windowless video",\r
+balance:"Balance",\r
+baseurl:"Base URL",\r
+captioningid:"Captioning id",\r
+currentmarker:"Current marker",\r
+currentposition:"Current position",\r
+defaultframe:"Default frame",\r
+playcount:"Play count",\r
+rate:"Rate",\r
+uimode:"UI Mode",\r
+flash_options:"Flash options",\r
+qt_options:"Quicktime options",\r
+wmp_options:"Windows media player options",\r
+rmp_options:"Real media player options",\r
+shockwave_options:"Shockwave options",\r
+autogotourl:"Auto goto URL",\r
+center:"Center",\r
+imagestatus:"Image status",\r
+maintainaspect:"Maintain aspect",\r
+nojava:"No java",\r
+prefetch:"Prefetch",\r
+shuffle:"Shuffle",\r
+console:"Console",\r
+numloop:"Num loops",\r
+controls:"Controls",\r
+scriptcallbacks:"Script callbacks",\r
+swstretchstyle:"Stretch style",\r
+swstretchhalign:"Stretch H-Align",\r
+swstretchvalign:"Stretch V-Align",\r
+sound:"Sound",\r
+progress:"Progress",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
+align_top:"Top",\r
+align_right:"Right",\r
+align_bottom:"Bottom",\r
+align_left:"Left",\r
+align_center:"Center",\r
+align_top_left:"Top left",\r
+align_top_right:"Top right",\r
+align_bottom_left:"Bottom left",\r
+align_bottom_right:"Bottom right",\r
+flv_options:"Flash video options",\r
+flv_scalemode:"Scale mode",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Start image",\r
+flv_starttime:"Start time",\r
+flv_defaultvolume:"Default volumne",\r
+flv_hiddengui:"Hidden GUI",\r
+flv_autostart:"Auto start",\r
+flv_loop:"Loop",\r
+flv_showscalemodes:"Show scale modes",\r
+flv_smoothvideo:"Smooth video",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/th_dlg.js b/program/js/tiny_mce/plugins/media/langs/th_dlg.js
new file mode 100644 (file)
index 0000000..19bd8c4
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('th.media_dlg',{\r
+title:"\u0E40\u0E1E\u0E34\u0E48\u0E21 / \u0E41\u0E01\u0E49\u0E44\u0E02 \u0E21\u0E35\u0E40\u0E14\u0E35\u0E22",\r
+general:"\u0E17\u0E31\u0E48\u0E27\u0E44\u0E1B",\r
+advanced:"\u0E02\u0E31\u0E49\u0E19\u0E2A\u0E39\u0E07",\r
+file:"\u0E44\u0E1F\u0E25\u0E4C/URL",\r
+list:"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23",\r
+size:"\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07",\r
+preview:"\u0E14\u0E39\u0E15\u0E31\u0E27\u0E2D\u0E22\u0E48\u0E32\u0E07",\r
+constrain_proportions:"\u0E04\u0E07\u0E2D\u0E31\u0E15\u0E23\u0E32\u0E2A\u0E48\u0E27\u0E19",\r
+type:"\u0E0A\u0E19\u0E34\u0E14",\r
+id:"Id",\r
+name:"\u0E0A\u0E37\u0E48\u0E2D",\r
+class_name:"\u0E04\u0E25\u0E32\u0E2A",\r
+vspace:"\u0E23\u0E30\u0E22\u0E30\u0E2B\u0E48\u0E32\u0E07\u0E41\u0E19\u0E27\u0E15\u0E31\u0E49\u0E07",\r
+hspace:"\u0E23\u0E30\u0E22\u0E30\u0E2B\u0E48\u0E32\u0E07\u0E41\u0E19\u0E27\u0E19\u0E2D\u0E19",\r
+play:"\u0E40\u0E25\u0E48\u0E19\u0E2D\u0E31\u0E15\u0E42\u0E19\u0E21\u0E31\u0E15\u0E34",\r
+loop:"\u0E40\u0E25\u0E48\u0E19\u0E0B\u0E49\u0E33",\r
+menu:"\u0E41\u0E2A\u0E14\u0E07\u0E40\u0E21\u0E19\u0E39",\r
+quality:"\u0E04\u0E27\u0E32\u0E21\u0E25\u0E30\u0E40\u0E2D\u0E35\u0E22\u0E14",\r
+scale:"\u0E02\u0E19\u0E32\u0E14",\r
+align:"Align",\r
+salign:"SAlign",\r
+wmode:"WMode",\r
+bgcolor:"\u0E1E\u0E37\u0E49\u0E19\u0E2B\u0E25\u0E31\u0E07",\r
+base:"Base",\r
+flashvars:"Flashvars",\r
+liveconnect:"SWLiveConnect",\r
+autohref:"AutoHREF",\r
+cache:"Cache",\r
+hidden:"Hidden",\r
+controller:"\u0E41\u0E1C\u0E07\u0E04\u0E27\u0E1A\u0E04\u0E38\u0E21",\r
+kioskmode:"Kiosk mode",\r
+playeveryframe:"Play every frame",\r
+targetcache:"\u0E40\u0E1B\u0E49\u0E32\u0E2B\u0E21\u0E32\u0E22 cache",\r
+correction:"No correction",\r
+enablejavascript:"Enable JavaScript",\r
+starttime:"Start time",\r
+endtime:"End time",\r
+href:"Href",\r
+qtsrcchokespeed:"Choke speed",\r
+target:"\u0E40\u0E1B\u0E49\u0E32\u0E2B\u0E21\u0E32\u0E22",\r
+volume:"Volume",\r
+autostart:"\u0E40\u0E25\u0E48\u0E19\u0E2D\u0E31\u0E15\u0E42\u0E19\u0E21\u0E31\u0E15\u0E34",\r
+enabled:"Enabled",\r
+fullscreen:"Fullscreen",\r
+invokeurls:"Invoke URLs",\r
+mute:"Mute",\r
+stretchtofit:"Stretch to fit",\r
+windowlessvideo:"Windowless video",\r
+balance:"Balance",\r
+baseurl:"Base URL",\r
+captioningid:"Captioning id",\r
+currentmarker:"Current marker",\r
+currentposition:"Current position",\r
+defaultframe:"Default frame",\r
+playcount:"Play count",\r
+rate:"Rate",\r
+uimode:"UI Mode",\r
+flash_options:"Flash options",\r
+qt_options:"Quicktime options",\r
+wmp_options:"Windows media player options",\r
+rmp_options:"Real media player options",\r
+shockwave_options:"Shockwave options",\r
+autogotourl:"Auto goto URL",\r
+center:"Center",\r
+imagestatus:"Image status",\r
+maintainaspect:"Maintain aspect",\r
+nojava:"No java",\r
+prefetch:"Prefetch",\r
+shuffle:"Shuffle",\r
+console:"Console",\r
+numloop:"Num loops",\r
+controls:"Controls",\r
+scriptcallbacks:"Script callbacks",\r
+swstretchstyle:"Stretch style",\r
+swstretchhalign:"Stretch H-Align",\r
+swstretchvalign:"Stretch V-Align",\r
+sound:"Sound",\r
+progress:"Progress",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
+align_top:"\u0E1A\u0E19",\r
+align_right:"\u0E02\u0E27\u0E32",\r
+align_bottom:"\u0E25\u0E48\u0E32\u0E07",\r
+align_left:"\u0E0B\u0E49\u0E32\u0E22",\r
+align_center:"\u0E01\u0E25\u0E32\u0E07",\r
+align_top_left:"\u0E1A\u0E19 \u0E0B\u0E49\u0E32\u0E22",\r
+align_top_right:"\u0E1A\u0E19 \u0E02\u0E27\u0E32",\r
+align_bottom_left:"\u0E25\u0E48\u0E32\u0E07 \u0E0B\u0E49\u0E32\u0E22",\r
+align_bottom_right:"\u0E25\u0E48\u0E32\u0E07 \u0E02\u0E27\u0E32",\r
+flv_options:"Flash video options",\r
+flv_scalemode:"Scale mode",\r
+flv_buffer:"Buffer",\r
+flv_startimage:"Start image",\r
+flv_starttime:"Start time",\r
+flv_defaultvolume:"Default volumne",\r
+flv_hiddengui:"Hidden GUI",\r
+flv_autostart:"Auto start",\r
+flv_loop:"Loop",\r
+flv_showscalemodes:"Show scale modes",\r
+flv_smoothvideo:"Smooth video",\r
+flv_jscallback:"JS Callback"\r
+});
\ No newline at end of file
index 9212b15e690db30df0381b35fab18542e17042ef..818b77a7ea776554c6b6a85a7bec179a3b390ce4 100755 (executable)
 tinyMCE.addI18n('tr.media_dlg',{\r
-title:"T\u00FCmle\u015Fik medya ekle/d\u00FCzenle",\r
+title:"T\u00FCmle\u015Fik medya ekle / d\u00FCzenle",\r
 general:"Genel",\r
 advanced:"Geli\u015Fmi\u015F",\r
 file:"Dosya/URL",\r
-list:"Liste",\r
+list:"Listele",\r
 size:"Boyutlar",\r
 preview:"\u00D6nizleme",\r
-constrain_proportions:"Orant\u0131y\u0131 koru",\r
+constrain_proportions:"Oran\u0131 s\u0131n\u0131rla",\r
 type:"Tip",\r
 id:"Id",\r
 name:"\u0130sim",\r
 class_name:"S\u0131n\u0131f",\r
-vspace:"Dik.Bo\u015Fluk",\r
-hspace:"Yty.Bo\u015Fluk",\r
-play:"Oto.\u00C7al",\r
-loop:"D\u00F6ng\u00FC",\r
-menu:"Men\u00FC g\u00F6ster",\r
+vspace:"Dikey bo\u015Fluk",\r
+hspace:"Yatay bo\u015Fluk",\r
+play:"Otomatik oynat",\r
+loop:"D\u00F6nd\u00FCr",\r
+menu:"Men\u00FCy\u00FC g\u00F6ster",\r
 quality:"Kalite",\r
 scale:"\u00D6l\u00E7ek",\r
 align:"Hizala",\r
 salign:"SHizala",\r
-wmode:"WMode",\r
+wmode:"WModu",\r
 bgcolor:"Arkaplan",\r
 base:"Taban",\r
-flashvars:"Flash de\u011Fi\u015F.",\r
+flashvars:"Flash de\u011Fi\u015Fkeni",\r
 liveconnect:"SWLiveConnect",\r
-autohref:"Oto.HREF",\r
+autohref:"AutoHREF",\r
 cache:"\u00D6nbellek",\r
 hidden:"Gizli",\r
-controller:"Kontrolc\u00FC",\r
+controller:"Kontroller",\r
 kioskmode:"Kiosk modu",\r
-playeveryframe:"Her \u00E7er\u00E7eveyi \u00E7al",\r
+playeveryframe:"Her \u00E7er\u00E7eveyi oynat",\r
 targetcache:"Hedef \u00F6nbellek",\r
-correction:"D\u00FCzeltmesiz",\r
-enablejavascript:"JavaScript etkin",\r
-starttime:"Ba\u015Flang\u0131c zaman\u0131",\r
+correction:"D\u00FCzeltme yok",\r
+enablejavascript:"Javascript Aktif",\r
+starttime:"Ba\u015Flang\u0131\u00E7 zaman\u0131",\r
 endtime:"Biti\u015F zaman\u0131",\r
 href:"Href",\r
-qtsrcchokespeed:"T\u0131kanma h\u0131z\u0131",\r
+qtsrcchokespeed:"S\u0131k\u0131\u015Ft\u0131rma h\u0131z\u0131",\r
 target:"Hedef",\r
 volume:"Ses d\u00FCzeyi",\r
-autostart:"Oto.ba\u015Flat",\r
-enabled:"Etkin",\r
+autostart:"Otomatik ba\u015Flat",\r
+enabled:"Aktif",\r
 fullscreen:"Tam ekran",\r
-invokeurls:"\u00C7a\u011Fr\u0131lacak URL'ler",\r
+invokeurls:"Ba\u015Flatma URL'si",\r
 mute:"Sessiz",\r
 stretchtofit:"S\u0131\u011Facak \u015Fekilde boyutland\u0131r",\r
 windowlessvideo:"Penceresiz video",\r
-balance:"Balans",\r
-baseurl:"Taban URL",\r
-captioningid:"Ba\u015Fl\u0131kland\u0131rma id",\r
-currentmarker:"\u015Eimdiki i\u015Faret\u00E7i",\r
-currentposition:"\u015Eimdiki konum",\r
+balance:"Denge",\r
+baseurl:"Ge\u00E7erli URL",\r
+captioningid:"Ba\u015Fl\u0131k id",\r
+currentmarker:"Se\u00E7ili i\u015Faret\u00E7i",\r
+currentposition:"Se\u00E7ili konum",\r
 defaultframe:"Varsay\u0131lan \u00E7er\u00E7eve",\r
-playcount:"\u00C7alma say\u0131s\u0131",\r
+playcount:"Oynatma say\u0131s\u0131",\r
 rate:"Oran",\r
 uimode:"UI Modu",\r
 flash_options:"Flash se\u00E7enekleri",\r
 qt_options:"Quicktime se\u00E7enekleri",\r
 wmp_options:"Windows media player se\u00E7enekleri",\r
 rmp_options:"Real media player se\u00E7enekleri",\r
-shockwave_options:"Shockwave se\u00E7enekleri",\r
-autogotourl:"Otomatik gidilecek URL",\r
-center:"Ortala",\r
+shockwave_options:"Shockware se\u00E7enekleri",\r
+autogotourl:"URL'e otomatik git",\r
+center:"Orta",\r
 imagestatus:"Resim durumu",\r
 maintainaspect:"Orant\u0131y\u0131 koru",\r
 nojava:"Java yok",\r
-prefetch:"\u00D6n-getirme",\r
+prefetch:"\u00D6n belle\u011Fe al",\r
 shuffle:"Kar\u0131\u015Ft\u0131r",\r
 console:"Konsol",\r
 numloop:"D\u00F6ng\u00FC say\u0131s\u0131",\r
 controls:"Kontroller",\r
-scriptcallbacks:"Script \u00E7a\u011Fr\u0131mlar\u0131",\r
+scriptcallbacks:"Script \u00E7a\u011F\u0131r",\r
 swstretchstyle:"Esnetme stili",\r
 swstretchhalign:"Esnetme Y-Hiza",\r
 swstretchvalign:"Esnetme D-Hiza",\r
 sound:"Ses",\r
-progress:"\u0130lerleme",\r
+progress:"\u0130lerle",\r
 qtsrc:"QT Kay.",\r
-qt_stream_warn:"Ak\u0131nt\u0131 rtsp kaynaklar\u0131 geli\u015Fmi\u015F alt\u0131ndaki QT Kay. alan\u0131na girilmeli.\nSrc alan\u0131na ayr\u0131ca ak\u0131nt\u0131l\u0131 olmayan bir s\u00FCr\u00FCm\u00FC de girmelisiniz..",\r
+qt_stream_warn:"Ak\u0131\u015F rtsp kaynaklar\u0131 geli\u015Fmi\u015F alt\u0131ndaki QT Kay. alan\u0131na girilmeli.\nKay. alan\u0131na ayr\u0131ca ak\u0131\u015Fkan olmayan eklenir.",\r
 align_top:"\u00DCst",\r
-align_right:"Sa\u011Fa",\r
-align_bottom:"Alt",\r
-align_left:"Sola",\r
-align_center:"Ortala",\r
-align_top_left:"Sol \u00DCst",\r
+align_right:"Sa\u011F",\r
+align_bottom:"Bottom",\r
+align_left:"Sol",\r
+align_center:"Orta",\r
+align_top_left:"Sol \u00FCst",\r
 align_top_right:"Sa\u011F \u00FCst",\r
 align_bottom_left:"Sol alt",\r
 align_bottom_right:"Sa\u011F alt",\r
 flv_options:"Flash video se\u00E7enekleri",\r
-flv_scalemode:"Esnetme modu",\r
+flv_scalemode:"\u00D6l\u00E7ek modu",\r
 flv_buffer:"Tampon",\r
-flv_startimage:"Ba\u015Flang\u0131\u00E7 resmi",\r
+flv_startimage:"Resmi ba\u015Flat",\r
 flv_starttime:"Ba\u015Flang\u0131\u00E7 zaman\u0131",\r
 flv_defaultvolume:"Varsay\u0131lan ses d\u00FCzeyi",\r
 flv_hiddengui:"Gizli GUI",\r
 flv_autostart:"Otomatik ba\u015Flat",\r
-flv_loop:"D\u00F6ng\u00FC",\r
-flv_showscalemodes:"\u00D6l\u00E7ek modlar\u0131n\u0131 g\u00F6ster",\r
-flv_smoothvideo:"Video'yu yumu\u015Fat",\r
-flv_jscallback:"JS \u00C7a\u011Fr\u0131mlar\u0131"\r
+flv_loop:"D\u00F6nd\u00FCr",\r
+flv_showscalemodes:"\u00D6l\u00E7ek modunu g\u00F6ster",\r
+flv_smoothvideo:"D\u00FCzg\u00FCn video",\r
+flv_jscallback:"JS \u00C7e\u011F\u0131r"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/langs/tw_dlg.js b/program/js/tiny_mce/plugins/media/langs/tw_dlg.js
new file mode 100644 (file)
index 0000000..3e0b844
--- /dev/null
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('tw.media_dlg',{\r
+title:"\u63D2\u5165/\u7DE8\u8F2F\u591A\u5A92\u9AD4",\r
+general:"\u4E00\u822C",\r
+advanced:"\u66F4\u591A\u8A2D\u5B9A",\r
+file:"\u6587\u4EF6/\u7DB2\u5740",\r
+list:"\u5217\u8868",\r
+size:"\u5C3A\u5BF8",\r
+preview:"\u9810\u89BD",\r
+constrain_proportions:"\u4FDD\u6301\u6BD4\u4F8B",\r
+type:"\u985E\u578B",\r
+id:"ID \u8B58\u5225",\r
+name:"\u540D\u7B31",\r
+class_name:"\u985E\u578B",\r
+vspace:"\u6C34\u6E96\u9593\u8DDD",\r
+hspace:"\u5782\u76F4\u9593\u8DDD",\r
+play:"\u81EA\u52D5\u64AD\u653E",\r
+loop:"\u8FF4\u5708\u64AD\u653E",\r
+menu:"\u986F\u793A\u529F\u80FD\u8868",\r
+quality:"\u54C1\u8CEA",\r
+scale:"\u6BD4\u4F8B",\r
+align:"\u5C0D\u9F4A",\r
+salign:"SAlign",\r
+wmode:"\u8996\u7A97\u6A21\u5F0F",\r
+bgcolor:"\u80CC\u666F\u8272",\r
+base:"\u57FA\u5E95",\r
+flashvars:"\u53C3\u6578",\r
+liveconnect:"SWLive Connect",\r
+autohref:"\u81EA\u52D5 Href",\r
+cache:"\u7DE9\u5B58",\r
+hidden:"\u96B1\u85CF",\r
+controller:"\u63A7\u5236\u5668",\r
+kioskmode:"Kiosk \u6A21\u5F0F",\r
+playeveryframe:"\u64AD\u653E\u6BCF\u4E00\u5F71\u683C",\r
+targetcache:"\u76EE\u6A19\u7DE9\u5B58",\r
+correction:"\u5C1A\u672A\u4FEE\u6B63",\r
+enablejavascript:"\u958B\u555FJavaScript",\r
+starttime:"\u958B\u59CB\u6642\u9593",\r
+endtime:"\u7D50\u675F\u6642\u9593",\r
+href:"\u93C8\u7D50",\r
+qtsrcchokespeed:"\u963B\u585E\u901F\u5EA6",\r
+target:"\u76EE\u6A19",\r
+volume:"\u97F3\u91CF",\r
+autostart:"\u81EA\u52D5\u958B\u59CB",\r
+enabled:"\u555F\u7528",\r
+fullscreen:"\u5168\u5C4F\u986F\u793A",\r
+invokeurls:"\u76F8\u95DC\u7DB2\u5740",\r
+mute:"\u975C\u97F3",\r
+stretchtofit:"\u5EF6\u5C55",\r
+windowlessvideo:"\u7121\u908A\u6846",\r
+balance:"\u5E73\u8861",\r
+baseurl:"Base URL",\r
+captioningid:"Captioning ID",\r
+currentmarker:"\u6A19\u8A18\u76EE\u524D\u7684\u4F4D\u7F6E",\r
+currentposition:"\u76EE\u524D\u4F4D\u7F6E",\r
+defaultframe:"\u9810\u8A2D\u5E40",\r
+playcount:"\u64AD\u653E\u6B21\u6578",\r
+rate:"\u6BD4\u7279\u7387",\r
+uimode:"\u5916\u89C0\u6A21\u5F0F",\r
+flash_options:"Flash \u9078\u9805",\r
+qt_options:"Quick Time \u9078\u9805",\r
+wmp_options:"Windows Media Player \u9078\u9805",\r
+rmp_options:"Real Media Player \u9078\u9805",\r
+shockwave_options:"Shockwave \u9078\u9805",\r
+autogotourl:"\u81EA\u52D5\u8F49\u63DB\u6210\u7DB2\u5740",\r
+center:"\u5C45\u4E2D",\r
+imagestatus:"\u5716\u7247\u72C0\u614B",\r
+maintainaspect:"Maintain aspect",\r
+nojava:"No java",\r
+prefetch:"\u7DE9\u885D",\r
+shuffle:"Shuffle",\r
+console:"\u63A7\u5236\u81FA",\r
+numloop:"\u64AD\u653E\u6B21\u6578",\r
+controls:"\u63A7\u5236\u4ECB\u9762",\r
+scriptcallbacks:"\u56DE\u8ABFScript",\r
+swstretchstyle:"\u7E2E\u653E\u65B9\u5F0F",\r
+swstretchhalign:"\u6C34\u6E96\u7E2E\u653E",\r
+swstretchvalign:"\u5782\u76F4\u7E2E\u653E",\r
+sound:"\u97F3\u91CF",\r
+progress:"\u9032\u5EA6",\r
+qtsrc:"QT Src",\r
+qt_stream_warn:"\u7A0B\u5F0F\u932F\u8AA4\uFF0C\u53EF\u80FD\u8A2D\u5B9A\u6709\u8AA4\u3002 ",\r
+align_top:"\u4E0A\u65B9",\r
+align_right:"\u9760\u53F3",\r
+align_bottom:"\u4E0B\u65B9",\r
+align_left:"\u9760\u5DE6",\r
+align_center:"\u4E2D\u9593",\r
+align_top_left:"\u5DE6\u4E0A",\r
+align_top_right:"\u53F3\u4E0A",\r
+align_bottom_left:"\u5DE6\u4E0B",\r
+align_bottom_right:"\u53F3\u4E0B",\r
+flv_options:"Flash \u9078\u9805",\r
+flv_scalemode:"\u4FDD\u6301\u6BD4\u4F8B",\r
+flv_buffer:"\u7DE9\u885D",\r
+flv_startimage:"\u958B\u59CB\u756B\u9762",\r
+flv_starttime:"\u958B\u59CB\u6642\u9593",\r
+flv_defaultvolume:"\u9810\u8A2D\u97F3\u91CF",\r
+flv_hiddengui:"\u96B1\u85CF\u64AD\u653E\u4ECB\u9762",\r
+flv_autostart:"\u81EA\u52D5\u64AD\u653E",\r
+flv_loop:"\u91CD\u64AD",\r
+flv_showscalemodes:"Show scale modes",\r
+flv_smoothvideo:"\u5E73\u6ED1\u5316",\r
+flv_jscallback:"\u56DE\u8ABFJavascript"\r
+});
\ No newline at end of file
index 8187e350ae459c5cb9fcff2da41d5ac27e10aefb..eae7da78758e9f7f96858db2e670046b534b4bda 100755 (executable)
@@ -1,5 +1,5 @@
 tinyMCE.addI18n('uk.media_dlg',{\r
-title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 / \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 embedded media",\r
+title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 / \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0432\u0431\u0443\u0434\u043E\u0432\u0430\u043D\u0456 \u043C\u0435\u0434\u0456\u0430",\r
 general:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0435",\r
 advanced:"\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u043E",\r
 file:"\u0424\u0430\u0439\u043B/URL",\r
@@ -8,96 +8,96 @@ size:"\u0420\u043E\u0437\u043C\u0456\u0440\u0438",
 preview:"\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434",\r
 constrain_proportions:"\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u043F\u0440\u043E\u043F\u043E\u0440\u0446\u0456\u0457",\r
 type:"\u0422\u0438\u043F",\r
-id:"Id",\r
+id:"\u0406\u0434\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0430\u0442\u043E\u0440",\r
 name:"\u041D\u0430\u0437\u0432\u0430",\r
 class_name:"\u041A\u043B\u0430\u0441",\r
 vspace:"\u0432\u0435\u0440\u0442.\u0432\u0456\u0434\u0441\u0442\u0443\u043F",\r
 hspace:"\u0433\u043E\u0440.\u0432\u0456\u0434\u0441\u0442\u0443\u043F",\r
-play:"\u0410\u0432\u0442\u043E\u043F\u043B\u0435\u0439",\r
-loop:"\u041B\u0443\u043F",\r
+play:"\u0410\u0432\u0442\u043E\u043F\u0440\u043E\u0433\u0440\u0430\u0432\u043D\u043D\u044F",\r
+loop:"\u041F\u043E\u0432\u0442\u043E\u0440\u044E\u0432\u0430\u0442\u0438",\r
 menu:"\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043C\u0435\u043D\u044E",\r
 quality:"\u042F\u043A\u0456\u0441\u0442\u044C",\r
-scale:"Scale",\r
-align:"Align",\r
-salign:"SAlign",\r
-wmode:"WMode",\r
+scale:"\u041C\u0430\u0441\u0448\u0442\u0430\u0431\u0443\u0432\u0430\u043D\u043D\u044F",\r
+align:"\u0412\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F",\r
+salign:"S-\u0412\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F",\r
+wmode:"W-\u0440\u0435\u0436\u0438\u043C",\r
 bgcolor:"\u0424\u043E\u043D",\r
-base:"Base",\r
-flashvars:"Flashvars",\r
+base:"\u0411\u0430\u0437\u0430",\r
+flashvars:"Flash-\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438",\r
 liveconnect:"SWLiveConnect",\r
 autohref:"AutoHREF",\r
 cache:"\u041A\u0435\u0448",\r
-hidden:"Hidden",\r
-controller:"Controller",\r
-kioskmode:"Kiosk mode",\r
-playeveryframe:"Play every frame",\r
-targetcache:"Target cache",\r
-correction:"No correction",\r
-enablejavascript:"Enable JavaScript",\r
-starttime:"Start time",\r
-endtime:"End time",\r
-href:"Href",\r
-qtsrcchokespeed:"Choke speed",\r
-target:"Target",\r
+hidden:"\u041F\u0440\u0438\u0445\u043E\u0432\u0430\u043D\u0438\u0439",\r
+controller:"\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u0435\u0440",\r
+kioskmode:"\u041F\u043E\u0432\u043D\u043E\u0435\u043A\u0440\u0430\u043D\u043D\u0438\u0439 \u0440\u0435\u0436\u0438\u043C",\r
+playeveryframe:"\u041F\u0440\u043E\u0433\u0440\u0430\u0432\u0430\u0442\u0438 \u043A\u043E\u0436\u0435\u043D \u043A\u0430\u0434\u0440",\r
+targetcache:"\u0426\u0456\u043B\u044C\u043E\u0432\u0438\u0439 \u043A\u0435\u0448",\r
+correction:"\u0411\u0435\u0437 \u043A\u043E\u0440\u0435\u043A\u0446\u0456\u0457",\r
+enablejavascript:"\u0414\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u0438 JavaScript",\r
+starttime:"\u0427\u0430\u0441 \u043F\u043E\u0447\u0430\u0442\u043A\u0443",\r
+endtime:"\u0427\u0430\u0441 \u043A\u0456\u043D\u0446\u044F",\r
+href:"\u041F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F",\r
+qtsrcchokespeed:"\u0428\u0432\u0438\u0434\u043A\u0456\u0441\u0442\u044C \u0437\u0430\u0433\u0430\u0441\u0430\u043D\u043D\u044F",\r
+target:"\u0426\u0456\u043B\u044C",\r
 volume:"\u0413\u0443\u0447\u043D\u0456\u0441\u0442\u044C",\r
 autostart:"\u0410\u0432\u0442\u043E\u0441\u0442\u0430\u0440\u0442",\r
-enabled:"Enabled",\r
-fullscreen:"Fullscreen",\r
-invokeurls:"Invoke URLs",\r
-mute:"Mute",\r
-stretchtofit:"Stretch to fit",\r
+enabled:"\u0414\u043E\u0437\u0432\u043E\u043B\u0435\u043D\u0438\u0439",\r
+fullscreen:"\u041F\u043E\u0432\u043D\u0438\u0439 \u0435\u043A\u0440\u0430\u043D",\r
+invokeurls:"\u0412\u0438\u043A\u043B\u0438\u043A\u0430\u0442\u0438 URLs",\r
+mute:"\u0417\u0430\u0433\u043B\u0443\u0448\u0438\u0442\u0438",\r
+stretchtofit:"\u0417\u043C\u0435\u043D\u0448\u0438\u0442\u0438, \u0449\u043E\u0431 \u0432\u043C\u0456\u0441\u0442\u0438\u043B\u043E\u0441\u044C",\r
 windowlessvideo:"Windowless video",\r
 balance:"\u0411\u0430\u043B\u0430\u043D\u0441",\r
-baseurl:"Base URL",\r
-captioningid:"Captioning id",\r
-currentmarker:"Current marker",\r
-currentposition:"Current position",\r
-defaultframe:"Default frame",\r
-playcount:"Play count",\r
-rate:"Rate",\r
-uimode:"UI Mode",\r
-flash_options:"Flash options",\r
-qt_options:"Quicktime options",\r
-wmp_options:"Windows media player options",\r
-rmp_options:"Real media player options",\r
-shockwave_options:"Shockwave options",\r
-autogotourl:"Auto goto URL",\r
-center:"Center",\r
-imagestatus:"Image status",\r
-maintainaspect:"Maintain aspect",\r
-nojava:"No java",\r
-prefetch:"Prefetch",\r
-shuffle:"Shuffle",\r
-console:"Console",\r
-numloop:"Num loops",\r
-controls:"Controls",\r
-scriptcallbacks:"Script callbacks",\r
-swstretchstyle:"Stretch style",\r
-swstretchhalign:"Stretch H-Align",\r
-swstretchvalign:"Stretch V-Align",\r
-sound:"Sound",\r
-progress:"Progress",\r
-qtsrc:"QT Src",\r
+baseurl:"\u041E\u0441\u043D\u043E\u0432\u043D\u0435 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F",\r
+captioningid:"\u0406\u0434\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0430\u0442\u043E\u0440 \u043D\u0430\u0434\u043F\u0438\u0441\u0443",\r
+currentmarker:"\u041F\u043E\u0442\u043E\u0447\u043D\u0438\u0439 \u043C\u0430\u0440\u043A\u0435\u0440",\r
+currentposition:"\u041F\u043E\u0442\u043E\u0447\u043D\u0430 \u043F\u043E\u0437\u0438\u0446\u0456\u044F",\r
+defaultframe:"\u041A\u0430\u0434\u0440 \u0437\u0430 \u0437\u0430\u043C\u043E\u0432\u0447\u0430\u043D\u043D\u044F\u043C",\r
+playcount:"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u0440\u043E\u0433\u0440\u0430\u0432\u0430\u043D\u044C",\r
+rate:"\u0428\u0432\u0438\u0434\u043A\u0456\u0441\u0442\u044C",\r
+uimode:"\u0420\u0435\u0436\u0438\u043C \u0456\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443",\r
+flash_options:"\u041E\u043F\u0446\u0456\u0457 Flash",\r
+qt_options:"\u041E\u043F\u0446\u0456\u0457 Quicktime",\r
+wmp_options:"\u041E\u043F\u0446\u0456\u0457 Windows media player",\r
+rmp_options:"\u041E\u043F\u0446\u0456\u0457 Real media player",\r
+shockwave_options:"\u041E\u043F\u0446\u0456\u0457 Shockwave",\r
+autogotourl:"\u041F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0430\u0432\u0442\u043E\u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0443",\r
+center:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443",\r
+imagestatus:"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F",\r
+maintainaspect:"\u0412\u0434\u0435\u0440\u0436\u0443\u0432\u0430\u0442\u0438 \u0440\u0430\u043A\u0443\u0440\u0441",\r
+nojava:"\u0411\u0435\u0437 Java",\r
+prefetch:"\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u0454 \u0432\u0438\u043B\u0443\u0447\u0435\u043D\u043D\u044F",\r
+shuffle:"\u041F\u0435\u0440\u0435\u0442\u0430\u0441\u0443\u0432\u0430\u0442\u0438",\r
+console:"\u041A\u043E\u043D\u0441\u043E\u043B\u044C",\r
+numloop:"\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0446\u0438\u043A\u043B\u0456\u0432",\r
+controls:"\u041A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F",\r
+scriptcallbacks:"\u0417\u0432\u043E\u0440\u043E\u0442\u043D\u0456\u0439 \u0432\u0438\u043A\u043B\u0438\u043A \u0441\u0446\u0435\u043D\u0430\u0440\u0456\u044E",\r
+swstretchstyle:"\u0420\u043E\u0437\u0442\u044F\u0433\u043D\u0443\u0442\u0438\u0439 \u0441\u0442\u0438\u043B\u044C",\r
+swstretchhalign:"\u0420\u043E\u0437\u0442\u044F\u0433\u043D\u0443\u0442\u0438 \u0433\u043E\u0440\u0438\u0437. \u0432\u0438\u0440\u0456\u0432\u043D\u044E\u0430\u043D\u043D\u044F",\r
+swstretchvalign:"\u0420\u043E\u0437\u0442\u044F\u0433\u043D\u0443\u0442\u0438 \u0432\u0435\u0440\u0442. \u0432\u0438\u0440\u0456\u0432\u043D\u044E\u0430\u043D\u043D\u044F",\r
+sound:"\u0417\u0432\u0443\u043A",\r
+progress:"\u0425\u0456\u0434",\r
+qtsrc:"\u0414\u0436\u0435\u0440\u0435\u043B\u043E QT",\r
 qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
-align_top:"Top",\r
-align_right:"Right",\r
-align_bottom:"Bottom",\r
-align_left:"Left",\r
-align_center:"Center",\r
-align_top_left:"Top left",\r
-align_top_right:"Top right",\r
-align_bottom_left:"Bottom left",\r
-align_bottom_right:"Bottom right",\r
-flv_options:"Flash video options",\r
-flv_scalemode:"Scale mode",\r
-flv_buffer:"Buffer",\r
-flv_startimage:"Start image",\r
-flv_starttime:"Start time",\r
-flv_defaultvolume:"Default volumne",\r
-flv_hiddengui:"Hidden GUI",\r
-flv_autostart:"Auto start",\r
-flv_loop:"Loop",\r
-flv_showscalemodes:"Show scale modes",\r
-flv_smoothvideo:"Smooth video",\r
-flv_jscallback:"JS Callback"\r
+align_top:"\u0412\u0435\u0440\u0445",\r
+align_right:"\u041F\u0440\u0430\u0432\u043E",\r
+align_bottom:"\u041D\u0438\u0437",\r
+align_left:"\u041B\u0456\u0432\u043E",\r
+align_center:"\u0426\u0435\u043D\u0442\u0440",\r
+align_top_left:"\u0417\u0432\u0435\u0440\u0445\u0443 \u0437\u043B\u0456\u0432\u0430",\r
+align_top_right:"\u0417\u0432\u0435\u0440\u0445\u0443 \u0437\u043F\u0440\u0430\u0432\u0430",\r
+align_bottom_left:"\u0417\u043D\u0438\u0437\u0443 \u0437\u043B\u0456\u0432\u0430",\r
+align_bottom_right:"\u0417\u043D\u0438\u0437\u0443 \u0437\u043F\u0440\u0430\u0432\u0430",\r
+flv_options:"\u041E\u043F\u0446\u0456\u0457 Flash video",\r
+flv_scalemode:"\u0420\u0435\u0436\u0438\u043C \u043C\u0430\u0448\u0442\u0430\u0431\u0443\u0432\u0430\u043D\u043D\u044F",\r
+flv_buffer:"\u0411\u0443\u0444\u0435\u0440",\r
+flv_startimage:"\u041F\u043E\u0447\u0430\u0442\u043A\u043E\u0432\u0435 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F",\r
+flv_starttime:"\u041F\u043E\u0447\u0430\u0442\u043A\u043E\u0432\u0438\u0439 \u0447\u0430\u0441",\r
+flv_defaultvolume:"\u0413\u0443\u0447\u043D\u0456\u0441\u0442\u044C \u0437\u0430 \u0437\u0430\u043C\u043E\u0432\u0447\u0430\u043D\u043D\u044F\u043C",\r
+flv_hiddengui:"\u0421\u0445\u043E\u0432\u0430\u043D\u0438\u0439 \u0433\u0440\u0430\u0444\u0456\u0447\u043D\u0438\u0439 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0446\u044C\u043A\u0438\u0439 \u0456\u043D\u0444\u0435\u0440\u0444\u0435\u0439\u0441",\r
+flv_autostart:"\u0410\u0432\u0442\u043E\u043F\u043E\u0447\u0430\u0442\u043E\u043A",\r
+flv_loop:"\u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F",\r
+flv_showscalemodes:"\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0440\u0435\u0436\u0438\u043C\u0438 \u043C\u0430\u0448\u0442\u0430\u0431\u0443\u0432\u0430\u043D\u043D\u044F",\r
+flv_smoothvideo:"\u041F\u043B\u0430\u0432\u043D\u0435 \u0432\u0456\u0434\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F \u0432\u0456\u0434\u0435\u043E",\r
+flv_jscallback:"\u0417\u0432\u043E\u0440\u043E\u0442\u043D\u0456\u0439 \u0432\u0438\u043A\u043B\u0438\u043A JS"\r
 });
\ No newline at end of file
index 84414ce37d0d87b51b44b5204cf38ec4e0e323fd..fdf6645a9dcd9a205212a753dcef5714952b4d77 100755 (executable)
 tinyMCE.addI18n('vi.media_dlg',{\r
-title:"Ch\u00E8n/thay \u0111\u1ED5i media(flash, nh\u1EA1c, video ...)",\r
-general:"C\u01A1 b\u1EA3n",\r
+title:"Ch\u00E8n / s\u1EEDa ph\u01B0\u01A1ng ti\u1EC7n truy\u1EC1n th\u00F4ng nh\u00FAng",\r
+general:"Chung",\r
 advanced:"N\u00E2ng cao",\r
-file:"\u0110\u1ECBa ch\u1EC9 media",\r
-list:"List",\r
+file:"T\u1EADp tin/URL",\r
+list:"Danh s\u00E1ch",\r
 size:"K\u00EDch th\u01B0\u1EDBc",\r
 preview:"Xem tr\u01B0\u1EDBc",\r
-constrain_proportions:"Gi\u1EEF \u0111\u00FAng t\u1EC9 l\u1EC7",\r
-type:"Lo\u1EA1i",\r
+constrain_proportions:"R\u00E0ng bu\u1ED9c t\u1EC9 l\u1EC7",\r
+type:"Ki\u1EC3u",\r
 id:"Id",\r
-name:"Name",\r
-class_name:"Class",\r
+name:"T\u00EAn",\r
+class_name:"L\u1EDBp",\r
 vspace:"V-Space",\r
 hspace:"H-Space",\r
-play:"Auto play",\r
-loop:"Loop",\r
-menu:"Show menu",\r
-quality:"Quality",\r
-scale:"Scale",\r
-align:"Align",\r
+play:"T\u1EF1 \u0111\u1ED9ng ph\u00E1t",\r
+loop:"L\u1EB7p",\r
+menu:"Hi\u1EC3n th\u1ECB menu",\r
+quality:"Ch\u1EA5t l\u01B0\u1EE3ng",\r
+scale:"T\u1EC9 l\u1EC7",\r
+align:"Canh l\u1EC1",\r
 salign:"SAlign",\r
 wmode:"WMode",\r
-bgcolor:"Background",\r
-base:"Base",\r
+bgcolor:"N\u1EC1n",\r
+base:"C\u01A1 s\u1EDF",\r
 flashvars:"Flashvars",\r
 liveconnect:"SWLiveConnect",\r
 autohref:"AutoHREF",\r
-cache:"Cache",\r
-hidden:"Hidden",\r
-controller:"Controller",\r
-kioskmode:"Kiosk mode",\r
-playeveryframe:"Play every frame",\r
-targetcache:"Target cache",\r
-correction:"No correction",\r
-enablejavascript:"Enable JavaScript",\r
-starttime:"Start time",\r
-endtime:"End time",\r
+cache:"B\u1ED9 nh\u1EDB \u0111\u1EC7m",\r
+hidden:"\u1EA8n",\r
+controller:"Tr\u00ECnh \u0111i\u1EC1u khi\u1EC3n",\r
+kioskmode:"Ch\u1EBF \u0111\u1ED9 Kiosk",\r
+playeveryframe:"Ph\u00E1t t\u1EA5t c\u1EA3 khung",\r
+targetcache:"B\u1ED9 nh\u1EDB \u0111\u1EC7m \u0111\u00EDch",\r
+correction:"Kh\u00F4ng ch\u1EC9nh",\r
+enablejavascript:"Cho ph\u00E9p JavaScript",\r
+starttime:"Th\u1EDDi gian b\u1EAFt \u0111\u1EA7u",\r
+endtime:"Th\u1EDDi gian k\u1EBFt th\u00FAc",\r
 href:"Href",\r
-qtsrcchokespeed:"Choke speed",\r
-target:"Target",\r
-volume:"Volume",\r
-autostart:"Auto start",\r
-enabled:"Enabled",\r
-fullscreen:"Fullscreen",\r
-invokeurls:"Invoke URLs",\r
-mute:"Mute",\r
-stretchtofit:"Stretch to fit",\r
-windowlessvideo:"Windowless video",\r
-balance:"Balance",\r
+qtsrcchokespeed:"T\u1ED1c \u0111\u1ED9 Choke",\r
+target:"\u0110\u00EDch",\r
+volume:"\u00C2m l\u01B0\u1EE3ng",\r
+autostart:"T\u1EF1 \u0111\u1ED9ng b\u1EAFt \u0111\u1EA7u",\r
+enabled:"Cho ph\u00E9p",\r
+fullscreen:"To\u00E0n m\u00E0n h\u00ECnh",\r
+invokeurls:"URL tri\u1EC7u g\u1ECDi",\r
+mute:"T\u1EAFt \u00E2m thanh",\r
+stretchtofit:"D\u00E3n \u0111\u1EC3 ph\u00F9 h\u1EE3p",\r
+windowlessvideo:"Video kh\u00F4ng c\u1EEDa s\u1ED5",\r
+balance:"C\u00E2n b\u1EB1ng",\r
 baseurl:"Base URL",\r
-captioningid:"Captioning id",\r
-currentmarker:"Current marker",\r
-currentposition:"Current position",\r
-defaultframe:"Default frame",\r
-playcount:"Play count",\r
-rate:"Rate",\r
-uimode:"UI Mode",\r
-flash_options:"Flash options",\r
-qt_options:"Quicktime options",\r
-wmp_options:"Thi\u1EBFt l\u1EADp cho Windows media player",\r
-rmp_options:"Thi\u1EBFt l\u1EADp cho Real media player",\r
-shockwave_options:"Thi\u1EBFt l\u1EADp cho Shockwave",\r
-autogotourl:"Auto goto URL",\r
-center:"Center",\r
-imagestatus:"Image status",\r
-maintainaspect:"Maintain aspect",\r
-nojava:"No java",\r
-prefetch:"Prefetch",\r
-shuffle:"Shuffle",\r
-console:"Console",\r
-numloop:"Num loops",\r
-controls:"Controls",\r
-scriptcallbacks:"Script callbacks",\r
-swstretchstyle:"Stretch style",\r
-swstretchhalign:"Stretch H-Align",\r
-swstretchvalign:"Stretch V-Align",\r
-sound:"Sound",\r
-progress:"Progress",\r
+captioningid:"id \u0111\u1EA7u \u0111\u1EC1",\r
+currentmarker:"B\u1ED9 t\u1EA1o hi\u1EC7n th\u1EDDi",\r
+currentposition:"V\u1ECB tr\u00ED hi\u1EC7n th\u1EDDi",\r
+defaultframe:"Khung m\u1EB7c \u0111\u1ECBnh",\r
+playcount:"\u0110\u1EBFm l\u1EA7n ph\u00E1t",\r
+rate:"T\u1ED1c \u0111\u1ED9",\r
+uimode:"Ch\u1EBF \u0111\u1ED9 UI",\r
+flash_options:"T\u00F9y ch\u1ECDn Flash",\r
+qt_options:"T\u00F9y ch\u1ECDn Quicktime",\r
+wmp_options:"T\u00F9y ch\u1ECDn tr\u00ECnh ch\u01A1i media Windows",\r
+rmp_options:"T\u00F9y ch\u1ECDn tr\u00ECnh ch\u01A1i media Real",\r
+shockwave_options:"T\u00F9y ch\u1ECDn Shockwave",\r
+autogotourl:"T\u1EF1 \u0111\u1ED9ng nh\u1EA3y t\u1EDBi URL",\r
+center:"Gi\u1EEFa",\r
+imagestatus:"Tr\u1EA1ng th\u00E1i \u1EA3nh",\r
+maintainaspect:"Duy tr\u00EC c\u1EA1nh",\r
+nojava:"Kh\u00F4ng c\u00F3 java",\r
+prefetch:"T\u00ECm n\u1EA1p tr\u01B0\u1EDBc",\r
+shuffle:"Kh\u00F4ng theo tr\u1EADt t\u1EF1",\r
+console:"B\u00E0n \u0111i\u1EC1u khi\u1EC3n",\r
+numloop:"S\u1ED1 l\u1EB7p",\r
+controls:"\u0110i\u1EC1u khi\u1EC3n",\r
+scriptcallbacks:"H\u00E0m g\u1ECDi ng\u01B0\u1EE3c Script",\r
+swstretchstyle:"Ki\u1EC3u d\u00E3n",\r
+swstretchhalign:"D\u00E3n theo H-Align",\r
+swstretchvalign:"D\u00E3n theo V-Align",\r
+sound:"\u00C2m thanh",\r
+progress:"\u0110ang ti\u1EBFn tri\u1EC3n",\r
 qtsrc:"QT Src",\r
-qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
-align_top:"Top",\r
-align_right:"Right",\r
-align_bottom:"Bottom",\r
-align_left:"Left",\r
-align_center:"Center",\r
-align_top_left:"Top left",\r
-align_top_right:"Top right",\r
-align_bottom_left:"Bottom left",\r
-align_bottom_right:"Bottom right",\r
-flv_options:"Flash video options",\r
-flv_scalemode:"Scale mode",\r
-flv_buffer:"Buffer",\r
-flv_startimage:"Start image",\r
-flv_starttime:"Start time",\r
-flv_defaultvolume:"Default volumne",\r
-flv_hiddengui:"Hidden GUI",\r
-flv_autostart:"Auto start",\r
-flv_loop:"Loop",\r
-flv_showscalemodes:"Show scale modes",\r
-flv_smoothvideo:"Smooth video",\r
-flv_jscallback:"JS Callback"\r
+qt_stream_warn:"Ngu\u1ED3n rtsp theo lu\u1ED3ng n\u00EAn \u0111\u01B0\u1EE3c th\u00EAm v\u00E0o tr\u01B0\u1EDDng QT Src d\u01B0\u1EDBi th\u1EBB n\u00E2ng cao.\nB\u1EA1n c\u0169ng n\u00EAn th\u00EAm m\u1ED9t phi\u00EAn b\u1EA3n kh\u00F4ng theo lu\u1ED3ng v\u00E0o tr\u01B0\u1EDDng Src..",\r
+align_top:"Tr\u00EAn c\u00F9ng",\r
+align_right:"Ph\u1EA3i",\r
+align_bottom:"D\u01B0\u1EDBi c\u00F9ng",\r
+align_left:"Tr\u00E1i",\r
+align_center:"Gi\u1EEFa",\r
+align_top_left:"Tr\u00EAn c\u00F9ng tr\u00E1i",\r
+align_top_right:"Tr\u00EAn c\u00F9ng ph\u1EA3i",\r
+align_bottom_left:"D\u01B0\u1EDBi c\u00F9ng tr\u00E1i",\r
+align_bottom_right:"D\u01B0\u1EDBi c\u00F9ng ph\u1EA3i",\r
+flv_options:"T\u00F9y ch\u1ECDn video Flash",\r
+flv_scalemode:"Ch\u1EBF \u0111\u1ED9 thang",\r
+flv_buffer:"B\u1ED9 \u0111\u1EC7m",\r
+flv_startimage:"\u1EA2nh b\u1EAFt \u0111\u1EA7u",\r
+flv_starttime:"Th\u1EDDi gian b\u1EAFt \u0111\u1EA7u",\r
+flv_defaultvolume:"\u00C2m l\u01B0\u1EE3ng m\u1EB7c \u0111\u1ECBnh",\r
+flv_hiddengui:"\u1EA8n GUI",\r
+flv_autostart:"T\u1EF1 b\u1EAFt \u0111\u1EA7u",\r
+flv_loop:"L\u1EB7p",\r
+flv_showscalemodes:"Hi\u1EC3n th\u1ECB ch\u1EBF \u0111\u1ED9 thang",\r
+flv_smoothvideo:"Video m\u01B0\u1EE3t",\r
+flv_jscallback:"H\u00E0m g\u1ECDi ng\u01B0\u1EE3c JS"\r
 });
\ No newline at end of file
index 5ac61673fe23aa99760affec7d8e44cd60acb878..e879fcb562d3585edc4a0345377a4dfc5b4b7f5e 100755 (executable)
 tinyMCE.addI18n('zh.media_dlg',{\r
-title:"\u63D2\u5165/\u7F16\u8F91\u5F71\u7247",\r
+title:"\u63D2\u5165/\u7F16\u8F91\u591A\u5A92\u4F53",\r
 general:"\u4E00\u822C",\r
-advanced:"\u9AD8\u7EA7",\r
-file:"\u6863\u6848/URL",\r
+advanced:"\u66F4\u591A\u8BBE\u5B9A",\r
+file:"\u6863\u6849/\u7F51\u5740",\r
 list:"\u5217\u8868",\r
-size:"\u5927\u5C0F",\r
+size:"\u5C3A\u5BF8",\r
 preview:"\u9884\u89C8",\r
-constrain_proportions:"\u7EF4\u6301\u6BD4\u4F8B",\r
+constrain_proportions:"\u4FDD\u6301\u6BD4\u4F8B",\r
 type:"\u7C7B\u578B",\r
-id:"ID",\r
-name:"\u540D\u79F0",\r
-class_name:"\u7C7B\u522B",\r
-vspace:"\u5782\u76F4\u95F4\u8DDD",\r
-hspace:"\u6C34\u5E73\u95F4\u8DDD",\r
+id:"ID \u8BC6\u522B",\r
+name:"\u540D\u7B31",\r
+class_name:"\u7C7B\u578B",\r
+vspace:"\u6C34\u51C6\u95F4\u8DDD",\r
+hspace:"\u5782\u76F4\u95F4\u8DDD",\r
 play:"\u81EA\u52A8\u64AD\u653E",\r
-loop:"\u5FAA\u73AF",\r
-menu:"\u663E\u793A\u9009\u9879",\r
+loop:"\u56DE\u5708\u64AD\u653E",\r
+menu:"\u663E\u793A\u529F\u80FD\u8868",\r
 quality:"\u54C1\u8D28",\r
-scale:"\u7F29\u653E",\r
+scale:"\u6BD4\u4F8B",\r
 align:"\u5BF9\u9F50",\r
 salign:"SAlign",\r
-wmode:"WMode",\r
+wmode:"\u89C6\u7A97\u6A21\u5F0F",\r
 bgcolor:"\u80CC\u666F\u8272",\r
 base:"\u57FA\u5E95",\r
-flashvars:"Flash\u53D8\u91CF",\r
-liveconnect:"SWLiveConnect",\r
-autohref:"AutoHREF",\r
-cache:"\u6682\u5B58\u533A",\r
+flashvars:"\u53C2\u6570",\r
+liveconnect:"SWLive Connect",\r
+autohref:"\u81EA\u52A8 Href",\r
+cache:"\u6682\u5B58",\r
 hidden:"\u9690\u85CF",\r
-controller:"\u63A7\u5236\u53F0",\r
-kioskmode:"Kiosk\u6A21\u5F0F",\r
-playeveryframe:"\u9010\u5E27\u64AD\u653E",\r
+controller:"\u63A7\u5236\u5668",\r
+kioskmode:"Kiosk \u6A21\u5F0F",\r
+playeveryframe:"\u64AD\u653E\u6BCF\u4E00\u5F71\u683C",\r
 targetcache:"\u76EE\u6807\u6682\u5B58",\r
-correction:"\u4FEE\u6B63",\r
-enablejavascript:"\u542F\u7528JavaScript",\r
+correction:"\u5C1A\u672A\u4FEE\u6B63",\r
+enablejavascript:"\u5F00\u542FJavaScript",\r
 starttime:"\u5F00\u59CB\u65F6\u95F4",\r
 endtime:"\u7ED3\u675F\u65F6\u95F4",\r
-href:"Href",\r
-qtsrcchokespeed:"Choke\u901F\u5EA6",\r
+href:"\u8FDE\u7ED3",\r
+qtsrcchokespeed:"\u963B\u585E\u901F\u5EA6",\r
 target:"\u76EE\u6807",\r
 volume:"\u97F3\u91CF",\r
-autostart:"\u81EA\u52A8\u542F\u7528",\r
+autostart:"\u81EA\u52A8\u5F00\u59CB",\r
 enabled:"\u542F\u7528",\r
-fullscreen:"\u5168\u5C4F\u5E55",\r
-invokeurls:"\u6302\u7528\u7684URLs",\r
+fullscreen:"\u5168\u5C4F\u663E\u793A",\r
+invokeurls:"\u76F8\u5173\u7F51\u5740",\r
 mute:"\u9759\u97F3",\r
-stretchtofit:"\u7F29\u653E\u81F3\u9002\u5408\u5927\u5C0F",\r
-windowlessvideo:"\u65E0\u7A97\u53E3\u64AD\u653E",\r
+stretchtofit:"\u5EF6\u5C55",\r
+windowlessvideo:"\u65E0\u8FB9\u6846",\r
 balance:"\u5E73\u8861",\r
-baseurl:"\u57FA\u5E95URL",\r
-captioningid:"\u5B57\u5E55\u7F16\u53F7",\r
-currentmarker:"\u76EE\u524D\u6807\u8BB0",\r
-currentposition:"\u5F53\u524D\u4F4D\u7F6E",\r
+baseurl:"Base URL",\r
+captioningid:"Captioning ID",\r
+currentmarker:"\u6807\u8BB0\u76EE\u524D\u7684\u4F4D\u7F6E",\r
+currentposition:"\u76EE\u524D\u4F4D\u7F6E",\r
 defaultframe:"\u9884\u8BBE\u5E27",\r
 playcount:"\u64AD\u653E\u6B21\u6570",\r
-rate:"\u7801\u7387",\r
-uimode:"UI\u6A21\u5F0F",\r
-flash_options:"Flash\u9009\u9879",\r
-qt_options:"Quicktime\u9009\u9879",\r
-wmp_options:"Windows Media Player\u9009\u9879",\r
-rmp_options:"Real Media Player\u9009\u9879",\r
-shockwave_options:"Shockwave\u9009\u9879",\r
-autogotourl:"\u81EA\u52A8\u8F6C\u81F3URL",\r
+rate:"\u6BD4\u7279\u7387",\r
+uimode:"\u5916\u89C2\u6A21\u5F0F",\r
+flash_options:"Flash \u9009\u9879",\r
+qt_options:"Quick Time \u9009\u9879",\r
+wmp_options:"Windows Media Player \u9009\u9879",\r
+rmp_options:"Real Media Player \u9009\u9879",\r
+shockwave_options:"Shockwave \u9009\u9879",\r
+autogotourl:"\u81EA\u52A8\u8F6C\u6362\u6210\u7F51\u5740",\r
 center:"\u5C45\u4E2D",\r
 imagestatus:"\u56FE\u7247\u72B6\u6001",\r
-maintainaspect:"\u7EF4\u6301\u6BD4\u4F8B",\r
+maintainaspect:"Maintain aspect",\r
 nojava:"No java",\r
-prefetch:"\u9884\u8BFB",\r
-shuffle:"\u968F\u673A",\r
+prefetch:"\u7F13\u51B2",\r
+shuffle:"Shuffle",\r
 console:"\u63A7\u5236\u53F0",\r
-numloop:"\u5FAA\u73AF\u6B21\u6570",\r
-controls:"\u63A7\u5236",\r
-scriptcallbacks:"Script\u56DE\u4F20",\r
-swstretchstyle:"\u7F29\u653E\u6837\u5F0F",\r
-swstretchhalign:"\u7F29\u653E\u81F3\u6C34\u5E73\u5BF9\u9F50",\r
-swstretchvalign:"\u7F29\u653E\u81F3\u5782\u76F4\u5BF9\u9F50",\r
-sound:"\u58F0\u97F3",\r
+numloop:"\u64AD\u653E\u6B21\u6570",\r
+controls:"\u63A7\u5236\u4ECB\u9762",\r
+scriptcallbacks:"\u56DE\u8C03Script",\r
+swstretchstyle:"\u7F29\u653E\u65B9\u5F0F",\r
+swstretchhalign:"\u6C34\u51C6\u7F29\u653E",\r
+swstretchvalign:"\u5782\u76F4\u7F29\u653E",\r
+sound:"\u97F3\u91CF",\r
 progress:"\u8FDB\u5EA6",\r
 qtsrc:"QT Src",\r
-qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",\r
-align_top:"\u5C45\u9876",\r
-align_right:"\u5C45\u53F3",\r
-align_bottom:"\u5C45\u5E95",\r
-align_left:"\u5C45\u5DE6",\r
-align_center:"\u5C45\u4E2D",\r
-align_top_left:"\u5C45\u9876\u5DE6",\r
-align_top_right:"\u5C45\u9876\u53F3",\r
-align_bottom_left:"\u5C45\u5E95\u5DE6",\r
-align_bottom_right:"\u5C45\u5E95\u53F3",\r
-flv_options:"Flash\u89C6\u9891\u9009\u9879",\r
-flv_scalemode:"\u7F29\u653E\u6A21\u5F0F",\r
+qt_stream_warn:"\u7A0B\u5F0F\u9519\u8BEF\uFF0C\u53EF\u80FD\u8BBE\u5B9A\u6709\u8BEF\u3002 ",\r
+align_top:"\u4E0A\u65B9",\r
+align_right:"\u9760\u53F3",\r
+align_bottom:"\u4E0B\u65B9",\r
+align_left:"\u9760\u5DE6",\r
+align_center:"\u4E2D\u95F4",\r
+align_top_left:"\u5DE6\u4E0A",\r
+align_top_right:"\u53F3\u4E0A",\r
+align_bottom_left:"\u5DE6\u4E0B",\r
+align_bottom_right:"\u53F3\u4E0B",\r
+flv_options:"Flash \u9009\u9879",\r
+flv_scalemode:"\u4FDD\u6301\u6BD4\u4F8B",\r
 flv_buffer:"\u7F13\u51B2",\r
-flv_startimage:"\u542F\u52A8\u56FE\u7247",\r
-flv_starttime:"\u542F\u52A8\u65F6\u95F4",\r
+flv_startimage:"\u5F00\u59CB\u753B\u9762",\r
+flv_starttime:"\u5F00\u59CB\u65F6\u95F4",\r
 flv_defaultvolume:"\u9884\u8BBE\u97F3\u91CF",\r
-flv_hiddengui:"\u9690\u85CFGUI",\r
-flv_autostart:"\u81EA\u52A8\u542F\u52A8",\r
-flv_loop:"\u5FAA\u73AF",\r
-flv_showscalemodes:"\u663E\u793A\u7F29\u653E\u6A21\u5F0F",\r
-flv_smoothvideo:"\u5E73\u6ED1\u89C6\u56FE",\r
-flv_jscallback:"JS\u56DE\u4F20"\r
+flv_hiddengui:"\u9690\u85CF\u64AD\u653E\u4ECB\u9762",\r
+flv_autostart:"\u81EA\u52A8\u64AD\u653E",\r
+flv_loop:"\u91CD\u64AD",\r
+flv_showscalemodes:"Show scale modes",\r
+flv_smoothvideo:"\u5E73\u6ED1\u5316",\r
+flv_jscallback:"\u56DE\u8C03Javascript"\r
 });
\ No newline at end of file
index 911c03dcc59e4757f0cbddda361e0fa6d5a5dac4..73a903f7c3afb6d66fe12ef4bec9d8d2cc59c627 100644 (file)
                </div>\r
 \r
                <div class="mceActionPanel">\r
-                       <div style="float: left">\r
-                               <input type="submit" id="insert" name="insert" value="{#insert}" />\r
-                       </div>\r
-\r
-                       <div style="float: right">\r
-                               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-                       </div>\r
+                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
                </div>\r
        </form>\r
 </body>\r
index b72375660c317531a795b8c070c86a9c6516b4fa..e3b078bfae7f9a4372792151d8c7eb2432df2592 100644 (file)
@@ -1,8 +1,11 @@
 /**\r
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ * editor_plugin_src.js\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 (function() {\r
diff --git a/program/js/tiny_mce/plugins/paste/blank.htm b/program/js/tiny_mce/plugins/paste/blank.htm
deleted file mode 100644 (file)
index 7ba26bd..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">\r
-<head>\r
-<title>blank_page</title>\r
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
-<link href="css/blank.css" rel="stylesheet" type="text/css" />\r
-<base target="_self" />\r
-<script type="text/javascript">\r
-function init() {\r
-       if (parent.tinymce.isIE)\r
-               document.body.contentEditable = true;\r
-       else\r
-               document.designMode = 'on';\r
-\r
-       parent.initIframe(document);\r
-       window.focus();\r
-}\r
-</script>\r
-</head>\r
-<body onload="init();">\r
-\r
-</body>\r
-</html>\r
diff --git a/program/js/tiny_mce/plugins/paste/css/blank.css b/program/js/tiny_mce/plugins/paste/css/blank.css
deleted file mode 100644 (file)
index 6b16bac..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-html, body {height:98%}\r
-body {\r
-background-color: #FFFFFF;\r
-font-family: Verdana, Arial, Helvetica, sans-serif;\r
-font-size: 10px;\r
-scrollbar-3dlight-color: #F0F0EE;\r
-scrollbar-arrow-color: #676662;\r
-scrollbar-base-color: #F0F0EE;\r
-scrollbar-darkshadow-color: #DDDDDD;\r
-scrollbar-face-color: #E0E0DD;\r
-scrollbar-highlight-color: #F0F0EE;\r
-scrollbar-shadow-color: #F0F0EE;\r
-scrollbar-track-color: #F5F5F5;\r
-}\r
diff --git a/program/js/tiny_mce/plugins/paste/css/pasteword.css b/program/js/tiny_mce/plugins/paste/css/pasteword.css
deleted file mode 100644 (file)
index b3be627..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-.sourceIframe {\r
-       border: 1px solid #808080;\r
-}\r
index 93848bf787574b15efd57c8ee71d694e208fefc6..3e7b2504f19213aa8ab25af22a5843132027927f 100644 (file)
@@ -1 +1 @@
-(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.PastePlugin",{init:function(c,d){var e=this,b;e.editor=c;e.url=d;e.onPreProcess=new tinymce.util.Dispatcher(e);e.onPostProcess=new tinymce.util.Dispatcher(e);e.onPreProcess.add(e._preProcess);e.onPostProcess.add(e._postProcess);e.onPreProcess.add(function(h,i){c.execCallback("paste_preprocess",h,i)});e.onPostProcess.add(function(h,i){c.execCallback("paste_postprocess",h,i)});function g(i){var k=c.dom,j={content:i};e.onPreProcess.dispatch(e,j);j.node=k.create("div",0,j.content);e.onPostProcess.dispatch(e,j);j.content=c.serializer.serialize(j.node,{getInner:1});if(/<(p|h[1-6]|ul|ol)/.test(j.content)){e._insertBlockContent(c,k,j.content)}else{e._insert(j.content)}}c.addCommand("mceInsertClipboardContent",function(i,h){g(h)});function f(l){var p,k,i,j=c.selection,o=c.dom,h=c.getBody(),m;if(o.get("_mcePaste")){return}p=o.add(h,"div",{id:"_mcePaste"},"&nbsp;");if(h!=c.getDoc().body){m=o.getPos(c.selection.getStart(),h).y}else{m=h.scrollTop}o.setStyles(p,{position:"absolute",left:-10000,top:m,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){i=o.doc.body.createTextRange();i.moveToElementText(p);i.execCommand("Paste");o.remove(p);g(p.innerHTML);return tinymce.dom.Event.cancel(l)}else{k=c.selection.getRng();p=p.firstChild;i=c.getDoc().createRange();i.setStart(p,0);i.setEnd(p,1);j.setRng(i);window.setTimeout(function(){var r=o.get("_mcePaste"),q;r.id="_mceRemoved";o.remove(r);r=o.get("_mcePaste")||r;q=(o.select("> span.Apple-style-span div",r)[0]||o.select("> span.Apple-style-span",r)[0]||r).innerHTML;o.remove(r);if(k){j.setRng(k)}g(q)},0)}}if(c.getParam("paste_auto_cleanup_on_paste",true)){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){c.onKeyDown.add(function(h,i){if(((tinymce.isMac?i.metaKey:i.ctrlKey)&&i.keyCode==86)||(i.shiftKey&&i.keyCode==45)){f(i)}})}else{c.onPaste.addToTop(function(h,i){return f(i)})}}e._legacySupport()},getInfo:function(){return{longname:"Paste text/word",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(c,e){var b=e.content,d;function d(f){a(f,function(g){if(g.constructor==RegExp){b=b.replace(g,"")}else{b=b.replace(g[0],g[1])}})}d([/^\s*(&nbsp;)+/g,/(&nbsp;|<br[^>]*>)+\s*$/g]);if(/(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test(b)){e.wordContent=true;d([/<!--[\s\S]+?-->/gi,/<\/?(img|font|meta|link|style|span|div|v:\w+)[^>]*>/gi,/<\\?\?xml[^>]*>/gi,/<\/?o:[^>]*>/gi,/ (id|name|class|language|type|on\w+|v:\w+)=\"([^\"]*)\"/gi,/ (id|name|class|language|type|on\w+|v:\w+)=(\w+)/gi,[/<(\/?)s>/gi,"<$1strike>"],/<script[^>]+>[\s\S]*?<\/script>/gi,[/&nbsp;/g,"\u00a0"]])}e.content=b},_postProcess:function(c,e){var b=this,d=b.editor.dom;if(e.wordContent){a(d.select("a",e.node),function(f){if(!f.href||f.href.indexOf("#_Toc")!=-1){d.remove(f,1)}});if(b.editor.getParam("paste_convert_middot_lists",true)){b._convertLists(c,e)}a(d.select("*",e.node),function(f){d.setAttrib(f,"style","")})}if(tinymce.isWebKit){a(d.select("*",e.node),function(f){f.removeAttribute("mce_style")})}},_convertLists:function(e,c){var g=e.editor.dom,f,i,b=-1,d,j=[],h;a(g.select("p",c.node),function(q){var m,r="",o,n,k,l;for(m=q.firstChild;m&&m.nodeType==3;m=m.nextSibling){r+=m.nodeValue}if(/^[\u2022\u00b7\u00a7\u00d8o]\s*\u00a0\u00a0*/.test(r)){o="ul"}if(/^[\s\S]*\w+\.[\s\S]*\u00a0{2,}/.test(r)){o="ol"}if(o){d=parseFloat(q.style.marginLeft||0);if(d>b){j.push(d)}if(!f||o!=h){f=g.create(o);g.insertAfter(f,q)}else{if(d>b){f=i.appendChild(g.create(o))}else{if(d<b){k=tinymce.inArray(j,d);l=g.getParents(f.parentNode,o);f=l[l.length-1-k]||f}}}if(o=="ul"){n=q.innerHTML.replace(/^[\u2022\u00b7\u00a7\u00d8o]\s*(&nbsp;|\u00a0)+\s*/,"")}else{n=q.innerHTML.replace(/^[\s\S]*\w+\.(&nbsp;|\u00a0)+\s*/,"")}i=f.appendChild(g.create("li",0,n));g.remove(q);b=d;h=o}else{f=b=0}})},_insertBlockContent:function(h,e,i){var c,g,d=h.selection,m,j,b,k,f;function l(p){var o;if(tinymce.isIE){o=h.getDoc().body.createTextRange();o.moveToElementText(p);o.collapse(false);o.select()}else{d.select(p,1);d.collapse(false)}}this._insert('<span id="_marker">&nbsp;</span>',1);g=e.get("_marker");c=e.getParent(g,"p,h1,h2,h3,h4,h5,h6,ul,ol");if(c){g=e.split(c,g);a(e.create("div",0,i).childNodes,function(o){m=g.parentNode.insertBefore(o.cloneNode(true),g)});l(m)}else{e.setOuterHTML(g,i);d.select(h.getBody(),1);d.collapse(0)}e.remove("_marker");j=d.getStart();b=e.getViewPort(h.getWin());k=h.dom.getPos(j).y;f=j.clientHeight;if(k<b.y||k+f>b.y+b.h){h.getDoc().body.scrollTop=k<b.y?k:k-b.h+25}},_insert:function(d,b){var c=this.editor;c.execCommand("Delete");c.execCommand(tinymce.isGecko?"insertHTML":"mceInsertContent",false,d,{skip_undo:b})},_legacySupport:function(){var c=this,b=c.editor;a(["mcePasteText","mcePasteWord"],function(d){b.addCommand(d,function(){b.windowManager.open({file:c.url+(d=="mcePasteText"?"/pastetext.htm":"/pasteword.htm"),width:450,height:400,inline:1})})});b.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});b.addButton("pasteword",{title:"paste.paste_word_desc",cmd:"mcePasteWord"});b.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"})}});tinymce.PluginManager.add("paste",tinymce.plugins.PastePlugin)})();
\ No newline at end of file
+(function(){var c=tinymce.each,d=null,a={paste_auto_cleanup_on_paste:true,paste_block_drop:false,paste_retain_style_properties:"none",paste_strip_class_attributes:"mso",paste_remove_spans:false,paste_remove_styles:false,paste_remove_styles_if_webkit:true,paste_convert_middot_lists:true,paste_convert_headers_to_strong:false,paste_dialog_width:"450",paste_dialog_height:"400",paste_text_use_dialog:false,paste_text_sticky:false,paste_text_notifyalways:false,paste_text_linebreaktype:"p",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(e,f){return e.getParam(f,a[f])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(e,f){var g=this;g.editor=e;g.url=f;g.onPreProcess=new tinymce.util.Dispatcher(g);g.onPostProcess=new tinymce.util.Dispatcher(g);g.onPreProcess.add(g._preProcess);g.onPostProcess.add(g._postProcess);g.onPreProcess.add(function(j,k){e.execCallback("paste_preprocess",j,k)});g.onPostProcess.add(function(j,k){e.execCallback("paste_postprocess",j,k)});e.pasteAsPlainText=false;function i(l,j){var k=e.dom;g.onPreProcess.dispatch(g,l);l.node=k.create("div",0,l.content);g.onPostProcess.dispatch(g,l);l.content=e.serializer.serialize(l.node,{getInner:1});if((!j)&&(e.pasteAsPlainText)){g._insertPlainText(e,k,l.content);if(!b(e,"paste_text_sticky")){e.pasteAsPlainText=false;e.controlManager.setActive("pastetext",false)}}else{if(/<(p|h[1-6]|ul|ol)/.test(l.content)){g._insertBlockContent(e,k,l.content)}else{g._insert(l.content)}}}e.addCommand("mceInsertClipboardContent",function(j,k){i(k,true)});if(!b(e,"paste_text_use_dialog")){e.addCommand("mcePasteText",function(k,j){var l=tinymce.util.Cookie;e.pasteAsPlainText=!e.pasteAsPlainText;e.controlManager.setActive("pastetext",e.pasteAsPlainText);if((e.pasteAsPlainText)&&(!l.get("tinymcePasteText"))){if(b(e,"paste_text_sticky")){e.windowManager.alert(e.translate("paste.plaintext_mode_sticky"))}else{e.windowManager.alert(e.translate("paste.plaintext_mode_sticky"))}if(!b(e,"paste_text_notifyalways")){l.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}e.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});e.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function h(s){var m,q,k,l=e.selection,p=e.dom,r=e.getBody(),j;if(e.pasteAsPlainText&&(s.clipboardData||p.doc.dataTransfer)){s.preventDefault();i({content:(s.clipboardData||p.doc.dataTransfer).getData("Text")},true);return}if(p.get("_mcePaste")){return}m=p.add(r,"div",{id:"_mcePaste","class":"mcePaste"},"\uFEFF");if(r!=e.getDoc().body){j=p.getPos(e.selection.getStart(),r).y}else{j=r.scrollTop}p.setStyles(m,{position:"absolute",left:-10000,top:j,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){k=p.doc.body.createTextRange();k.moveToElementText(m);k.execCommand("Paste");p.remove(m);if(m.innerHTML==="\uFEFF"){e.execCommand("mcePasteWord");s.preventDefault();return}i({content:m.innerHTML});return tinymce.dom.Event.cancel(s)}else{function o(n){n.preventDefault()}p.bind(e.getDoc(),"mousedown",o);p.bind(e.getDoc(),"keydown",o);q=e.selection.getRng();m=m.firstChild;k=e.getDoc().createRange();k.setStart(m,0);k.setEnd(m,1);l.setRng(k);window.setTimeout(function(){var t="",n=p.select("div.mcePaste");c(n,function(u){c(p.select("div.mcePaste",u),function(v){p.remove(v,1)});c(p.select("span.Apple-style-span",u),function(v){p.remove(v,1)});t+=u.innerHTML});c(n,function(u){p.remove(u)});if(q){l.setRng(q)}i({content:t});p.unbind(e.getDoc(),"mousedown",o);p.unbind(e.getDoc(),"keydown",o)},0)}}if(b(e,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){e.onKeyDown.add(function(j,k){if(((tinymce.isMac?k.metaKey:k.ctrlKey)&&k.keyCode==86)||(k.shiftKey&&k.keyCode==45)){h(k)}})}else{e.onPaste.addToTop(function(j,k){return h(k)})}}if(b(e,"paste_block_drop")){e.onInit.add(function(){e.dom.bind(e.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(j){j.preventDefault();j.stopPropagation();return false})})}g._legacySupport()},getInfo:function(){return{longname:"Paste text/word",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(i,f){var l=this.editor,k=f.content,q=tinymce.grep,p=tinymce.explode,g=tinymce.trim,m,j;function e(h){c(h,function(o){if(o.constructor==RegExp){k=k.replace(o,"")}else{k=k.replace(o[0],o[1])}})}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(k)||f.wordContent){f.wordContent=true;e([/^\s*(&nbsp;)+/gi,/(&nbsp;|<br[^>]*>)+\s*$/gi]);if(b(l,"paste_convert_headers_to_strong")){k=k.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"<p><strong>$1</strong></p>")}if(b(l,"paste_convert_middot_lists")){e([[/<!--\[if !supportLists\]-->/gi,"$&__MCE_ITEM__"],[/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"]])}e([/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/&nbsp;/gi,"\u00a0"]]);do{m=k.length;k=k.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(m!=k.length);if(b(l,"paste_retain_style_properties").replace(/^none$/i,"").length==0){k=k.replace(/<\/?span[^>]*>/gi,"")}else{e([[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(u,h,t){var v=[],o=0,r=p(g(t).replace(/&quot;/gi,"'"),";");c(r,function(s){var w,y,z=p(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":v[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":v[o++]="text-align:"+y;return;case"vert-align":v[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":v[o++]="color:"+y;return;case"mso-background":case"mso-highlight":v[o++]="background:"+y;return;case"mso-default-height":v[o++]="min-height:"+x(y);return;case"mso-default-width":v[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":v[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){v[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){v[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}v[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+v.join(";")+'"'}else{return h}}]])}}if(b(l,"paste_convert_headers_to_strong")){e([[/<h[1-6][^>]*>/gi,"<p><strong>"],[/<\/h[1-6][^>]*>/gi,"</strong></p>"]])}j=b(l,"paste_strip_class_attributes");if(j!=="none"){function n(r,o){if(j==="all"){return""}var h=q(p(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(s){return(/^(?!mso)/i.test(s))});return h.length?' class="'+h.join(" ")+'"':""}k=k.replace(/ class="([^"]+)"/gi,n);k=k.replace(/ class=(\w+)/gi,n)}if(b(l,"paste_remove_spans")){k=k.replace(/<\/?span[^>]*>/gi,"")}f.content=k},_postProcess:function(h,j){var g=this,f=g.editor,i=f.dom,e;if(j.wordContent){c(i.select("a",j.node),function(k){if(!k.href||k.href.indexOf("#_Toc")!=-1){i.remove(k,1)}});if(b(f,"paste_convert_middot_lists")){g._convertLists(h,j)}e=b(f,"paste_retain_style_properties");if((tinymce.is(e,"string"))&&(e!=="all")&&(e!=="*")){e=tinymce.explode(e.replace(/^none$/i,""));c(i.select("*",j.node),function(n){var o={},l=0,m,p,k;if(e){for(m=0;m<e.length;m++){p=e[m];k=i.getStyle(n,p);if(k){o[p]=k;l++}}}i.setAttrib(n,"style","");if(e&&l>0){i.setStyles(n,o)}else{if(n.nodeName=="SPAN"&&!n.className){i.remove(n,true)}}})}}if(b(f,"paste_remove_styles")||(b(f,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(i.select("*[style]",j.node),function(k){k.removeAttribute("style");k.removeAttribute("_mce_style")})}else{if(tinymce.isWebKit){c(i.select("*",j.node),function(k){k.removeAttribute("_mce_style")})}}},_convertLists:function(h,f){var j=h.editor.dom,i,m,e=-1,g,n=[],l,k;c(j.select("p",f.node),function(u){var r,v="",t,s,o,q;for(r=u.firstChild;r&&r.nodeType==3;r=r.nextSibling){v+=r.nodeValue}v=u.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/&nbsp;/g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o]\s*\u00a0*/.test(v)){t="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0{2,}/.test(v)){t="ol"}if(t){g=parseFloat(u.style.marginLeft||0);if(g>e){n.push(g)}if(!i||t!=l){i=j.create(t);j.insertAfter(i,u)}else{if(g>e){i=m.appendChild(j.create(t))}else{if(g<e){o=tinymce.inArray(n,g);q=j.getParents(i.parentNode,t);i=q[q.length-1-o]||i}}}c(j.select("span",u),function(w){var p=w.innerHTML.replace(/<\/?\w+[^>]*>/gi,"");if(t=="ul"&&/^[\u2022\u00b7\u00a7\u00d8o]/.test(p)){j.remove(w)}else{if(/^[\s\S]*\w+\.(&nbsp;|\u00a0)*\s*/.test(p)){j.remove(w)}}});s=u.innerHTML;if(t=="ul"){s=u.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o]\s*(&nbsp;|\u00a0)+\s*/,"")}else{s=u.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.(&nbsp;|\u00a0)+\s*/,"")}m=i.appendChild(j.create("li",0,s));j.remove(u);e=g;l=t}else{i=e=0}});k=f.node.innerHTML;if(k.indexOf("__MCE_ITEM__")!=-1){f.node.innerHTML=k.replace(/__MCE_ITEM__/g,"")}},_insertBlockContent:function(l,h,m){var f,j,g=l.selection,q,n,e,o,i,k="mce_marker";function p(t){var s;if(tinymce.isIE){s=l.getDoc().body.createTextRange();s.moveToElementText(t);s.collapse(false);s.select()}else{g.select(t,1);g.collapse(false)}}this._insert('<span id="'+k+'">&nbsp;</span>',1);j=h.get(k);f=h.getParent(j,"p,h1,h2,h3,h4,h5,h6,ul,ol,th,td");if(f&&!/TD|TH/.test(f.nodeName)){j=h.split(f,j);c(h.create("div",0,m).childNodes,function(r){q=j.parentNode.insertBefore(r.cloneNode(true),j)});p(q)}else{h.setOuterHTML(j,m);g.select(l.getBody(),1);g.collapse(0)}while(n=h.get(k)){h.remove(n)}n=g.getStart();e=h.getViewPort(l.getWin());o=l.dom.getPos(n).y;i=n.clientHeight;if(o<e.y||o+i>e.y+e.h){l.getDoc().body.scrollTop=o<e.y?o:o-e.h+25}},_insert:function(g,e){var f=this.editor,i=f.selection.getRng();if(!f.selection.isCollapsed()&&i.startContainer!=i.endContainer){f.getDoc().execCommand("Delete",false,null)}f.execCommand(tinymce.isGecko?"insertHTML":"mceInsertContent",false,g,{skip_undo:e})},_insertPlainText:function(j,x,v){var t,u,l,k,r,e,p,f,n=j.getWin(),z=j.getDoc(),s=j.selection,m=tinymce.is,y=tinymce.inArray,g=b(j,"paste_text_linebreaktype"),o=b(j,"paste_text_replacements");function q(h){c(h,function(i){if(i.constructor==RegExp){v=v.replace(i,"")}else{v=v.replace(i[0],i[1])}})}if((typeof(v)==="string")&&(v.length>0)){if(!d){d=("34,quot,38,amp,39,apos,60,lt,62,gt,"+j.serializer.settings.entities).split(",")}if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(v)){q([/[\n\r]+/g])}else{q([/\r+/g])}q([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/<br[^>]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*<t[dh][^>]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/&nbsp;/gi," "],[/&(#\d+|[a-z0-9]{1,10});/gi,function(i,h){if(h.charAt(0)==="#"){return String.fromCharCode(h.slice(1))}else{return((i=y(d,h))>0)?String.fromCharCode(d[i-1]):" "}}],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"],[/\n{3,}/g,"\n\n"],/^\s+|\s+$/g]);v=x.encode(v);if(!s.isCollapsed()){z.execCommand("Delete",false,null)}if(m(o,"array")||(m(o,"array"))){q(o)}else{if(m(o,"string")){q(new RegExp(o,"gi"))}}if(g=="none"){q([[/\n+/g," "]])}else{if(g=="br"){q([[/\n/g,"<br />"]])}else{q([/^\s+|\s+$/g,[/\n\n/g,"</p><p>"],[/\n/g,"<br />"]])}}if((l=v.indexOf("</p><p>"))!=-1){k=v.lastIndexOf("</p><p>");r=s.getNode();e=[];do{if(r.nodeType==1){if(r.nodeName=="TD"||r.nodeName=="BODY"){break}e[e.length]=r}}while(r=r.parentNode);if(e.length>0){p=v.substring(0,l);f="";for(t=0,u=e.length;t<u;t++){p+="</"+e[t].nodeName.toLowerCase()+">";f+="<"+e[e.length-t-1].nodeName.toLowerCase()+">"}if(l==k){v=p+f+v.substring(l+7)}else{v=p+v.substring(l+4,k+4)+f+v.substring(k+7)}}}j.execCommand("mceInsertRawHTML",false,v+'<span id="_plain_text_marker">&nbsp;</span>');window.setTimeout(function(){var h=x.get("_plain_text_marker"),B,i,A,w;s.select(h,false);z.execCommand("Delete",false,null);h=null;B=s.getStart();i=x.getViewPort(n);A=x.getPos(B).y;w=B.clientHeight;if((A<i.y)||(A+w>i.y+i.h)){z.body.scrollTop=A<i.y?A:A-i.h+25}},0)}},_legacySupport:function(){var f=this,e=f.editor;e.addCommand("mcePasteWord",function(){e.windowManager.open({file:f.url+"/pasteword.htm",width:parseInt(b(e,"paste_dialog_width")),height:parseInt(b(e,"paste_dialog_height")),inline:1})});if(b(e,"paste_text_use_dialog")){e.addCommand("mcePasteText",function(){e.windowManager.open({file:f.url+"/pastetext.htm",width:parseInt(b(e,"paste_dialog_width")),height:parseInt(b(e,"paste_dialog_height")),inline:1})})}e.addButton("pasteword",{title:"paste.paste_word_desc",cmd:"mcePasteWord"})}});tinymce.PluginManager.add("paste",tinymce.plugins.PastePlugin)})();
\ No newline at end of file
index 14d86a957ab77014b99a643abdde46cf8ebeeb5f..4c3bf6542ec8643737e90c0da910f7f447c94873 100644 (file)
@@ -1,16 +1,46 @@
 /**\r
- * $Id: editor_plugin_src.js 1104 2009-04-22 12:16:47Z spocke $\r
+ * editor_plugin_src.js\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 (function() {\r
-       var each = tinymce.each;\r
+       var each = tinymce.each,\r
+               entities = null,\r
+               defs = {\r
+                       paste_auto_cleanup_on_paste : true,\r
+                       paste_block_drop : false,\r
+                       paste_retain_style_properties : "none",\r
+                       paste_strip_class_attributes : "mso",\r
+                       paste_remove_spans : false,\r
+                       paste_remove_styles : false,\r
+                       paste_remove_styles_if_webkit : true,\r
+                       paste_convert_middot_lists : true,\r
+                       paste_convert_headers_to_strong : false,\r
+                       paste_dialog_width : "450",\r
+                       paste_dialog_height : "400",\r
+                       paste_text_use_dialog : false,\r
+                       paste_text_sticky : false,\r
+                       paste_text_notifyalways : false,\r
+                       paste_text_linebreaktype : "p",\r
+                       paste_text_replacements : [\r
+                               [/\u2026/g, "..."],\r
+                               [/[\x93\x94\u201c\u201d]/g, '"'],\r
+                               [/[\x60\x91\x92\u2018\u2019]/g, "'"]\r
+                       ]\r
+               };\r
+\r
+       function getParam(ed, name) {\r
+               return ed.getParam(name, defs[name]);\r
+       }\r
 \r
        tinymce.create('tinymce.plugins.PastePlugin', {\r
                init : function(ed, url) {\r
-                       var t = this, cb;\r
+                       var t = this;\r
 \r
                        t.editor = ed;\r
                        t.url = url;\r
                                ed.execCallback('paste_postprocess', pl, o);\r
                        });\r
 \r
+                       // Initialize plain text flag\r
+                       ed.pasteAsPlainText = false;\r
+\r
                        // This function executes the process handlers and inserts the contents\r
-                       function process(h) {\r
-                               var dom = ed.dom, o = {content : h};\r
+                       // force_rich overrides plain text mode set by user, important for pasting with execCommand\r
+                       function process(o, force_rich) {\r
+                               var dom = ed.dom;\r
 \r
                                // Execute pre process handlers\r
                                t.onPreProcess.dispatch(t, o);\r
                                // Serialize content\r
                                o.content = ed.serializer.serialize(o.node, {getInner : 1});\r
 \r
-                               // Insert cleaned content. We need to handle insertion of contents containing block elements separatly\r
-                               if (/<(p|h[1-6]|ul|ol)/.test(o.content))\r
+                               // Plain text option active?\r
+                               if ((!force_rich) && (ed.pasteAsPlainText)) {\r
+                                       t._insertPlainText(ed, dom, o.content);\r
+\r
+                                       if (!getParam(ed, "paste_text_sticky")) {\r
+                                               ed.pasteAsPlainText = false;\r
+                                               ed.controlManager.setActive("pastetext", false);\r
+                                       }\r
+                               } else if (/<(p|h[1-6]|ul|ol)/.test(o.content)) {\r
+                                       // Handle insertion of contents containing block elements separately\r
                                        t._insertBlockContent(ed, dom, o.content);\r
-                               else\r
+                               } else {\r
                                        t._insert(o.content);\r
-                       };\r
+                               }\r
+                       }\r
 \r
                        // Add command for external usage\r
-                       ed.addCommand('mceInsertClipboardContent', function(u, v) {\r
-                               process(v);\r
+                       ed.addCommand('mceInsertClipboardContent', function(u, o) {\r
+                               process(o, true);\r
                        });\r
 \r
+                       if (!getParam(ed, "paste_text_use_dialog")) {\r
+                               ed.addCommand('mcePasteText', function(u, v) {\r
+                                       var cookie = tinymce.util.Cookie;\r
+\r
+                                       ed.pasteAsPlainText = !ed.pasteAsPlainText;\r
+                                       ed.controlManager.setActive('pastetext', ed.pasteAsPlainText);\r
+\r
+                                       if ((ed.pasteAsPlainText) && (!cookie.get("tinymcePasteText"))) {\r
+                                               if (getParam(ed, "paste_text_sticky")) {\r
+                                                       ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky'));\r
+                                               } else {\r
+                                                       ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky'));\r
+                                               }\r
+\r
+                                               if (!getParam(ed, "paste_text_notifyalways")) {\r
+                                                       cookie.set("tinymcePasteText", "1", new Date(new Date().getFullYear() + 1, 12, 31))\r
+                                               }\r
+                                       }\r
+                               });\r
+                       }\r
+\r
+                       ed.addButton('pastetext', {title: 'paste.paste_text_desc', cmd: 'mcePasteText'});\r
+                       ed.addButton('selectall', {title: 'paste.selectall_desc', cmd: 'selectall'});\r
+\r
                        // This function grabs the contents from the clipboard by adding a\r
                        // hidden div and placing the caret inside it and after the browser paste\r
                        // is done it grabs that contents and processes that\r
                        function grabContent(e) {\r
                                var n, or, rng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY;\r
 \r
+                               // Check if browser supports direct plaintext access\r
+                               if (ed.pasteAsPlainText && (e.clipboardData || dom.doc.dataTransfer)) {\r
+                                       e.preventDefault();\r
+                                       process({content : (e.clipboardData || dom.doc.dataTransfer).getData('Text')}, true);\r
+                                       return;\r
+                               }\r
+\r
                                if (dom.get('_mcePaste'))\r
                                        return;\r
 \r
                                // Create container to paste into\r
-                               n = dom.add(body, 'div', {id : '_mcePaste'}, '&nbsp;');\r
+                               n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste'}, '\uFEFF');\r
 \r
                                // If contentEditable mode we need to find out the position of the closest element\r
                                if (body != ed.getDoc().body)\r
                                        // Remove container\r
                                        dom.remove(n);\r
 \r
+                                       // Check if the contents was changed, if it wasn't then clipboard extraction failed probably due\r
+                                       // to IE security settings so we pass the junk though better than nothing right\r
+                                       if (n.innerHTML === '\uFEFF') {\r
+                                               ed.execCommand('mcePasteWord');\r
+                                               e.preventDefault();\r
+                                               return;\r
+                                       }\r
+\r
                                        // Process contents\r
-                                       process(n.innerHTML);\r
+                                       process({content : n.innerHTML});\r
 \r
+                                       // Block the real paste event\r
                                        return tinymce.dom.Event.cancel(e);\r
                                } else {\r
+                                       function block(e) {\r
+                                               e.preventDefault();\r
+                                       };\r
+\r
+                                       // Block mousedown and click to prevent selection change\r
+                                       dom.bind(ed.getDoc(), 'mousedown', block);\r
+                                       dom.bind(ed.getDoc(), 'keydown', block);\r
+\r
                                        or = ed.selection.getRng();\r
 \r
                                        // Move caret into hidden div\r
 \r
                                        // Wait a while and grab the pasted contents\r
                                        window.setTimeout(function() {\r
-                                               var n = dom.get('_mcePaste'), h;\r
+                                               var h = '', nl = dom.select('div.mcePaste');\r
 \r
-                                               // Webkit clones the _mcePaste div for some odd reason so this will ensure that we get the real new div not the old empty one\r
-                                               n.id = '_mceRemoved';\r
-                                               dom.remove(n);\r
-                                               n = dom.get('_mcePaste') || n;\r
+                                               // WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string\r
+                                               each(nl, function(n) {\r
+                                                       // WebKit duplicates the divs so we need to remove them\r
+                                                       each(dom.select('div.mcePaste', n), function(n) {\r
+                                                               dom.remove(n, 1);\r
+                                                       });\r
 \r
-                                               // Grab the HTML contents\r
-                                               // We need to look for a apple style wrapper on webkit it also adds a div wrapper if you copy/paste the body of the editor\r
-                                               // It's amazing how strange the contentEditable mode works in WebKit\r
-                                               h = (dom.select('> span.Apple-style-span div', n)[0] || dom.select('> span.Apple-style-span', n)[0] || n).innerHTML;\r
+                                                       // Remove apply style spans\r
+                                                       each(dom.select('span.Apple-style-span', n), function(n) {\r
+                                                               dom.remove(n, 1);\r
+                                                       });\r
 \r
-                                               // Remove hidden div and restore selection\r
-                                               dom.remove(n);\r
+                                                       h += n.innerHTML;\r
+                                               });\r
+\r
+                                               // Remove the nodes\r
+                                               each(nl, function(n) {\r
+                                                       dom.remove(n);\r
+                                               });\r
 \r
                                                // Restore the old selection\r
                                                if (or)\r
                                                        sel.setRng(or);\r
 \r
-                                               process(h);\r
+                                               process({content : h});\r
+\r
+                                               // Unblock events ones we got the contents\r
+                                               dom.unbind(ed.getDoc(), 'mousedown', block);\r
+                                               dom.unbind(ed.getDoc(), 'keydown', block);\r
                                        }, 0);\r
                                }\r
-                       };\r
+                       }\r
 \r
                        // Check if we should use the new auto process method                   \r
-                       if (ed.getParam('paste_auto_cleanup_on_paste', true)) {\r
+                       if (getParam(ed, "paste_auto_cleanup_on_paste")) {\r
                                // Is it's Opera or older FF use key handler\r
                                if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) {\r
                                        ed.onKeyDown.add(function(ed, e) {\r
                                }\r
                        }\r
 \r
+                       // Block all drag/drop events\r
+                       if (getParam(ed, "paste_block_drop")) {\r
+                               ed.onInit.add(function() {\r
+                                       ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) {\r
+                                               e.preventDefault();\r
+                                               e.stopPropagation();\r
+\r
+                                               return false;\r
+                                       });\r
+                               });\r
+                       }\r
+\r
                        // Add legacy support\r
                        t._legacySupport();\r
                },\r
                },\r
 \r
                _preProcess : function(pl, o) {\r
-                       var h = o.content, process;\r
-\r
                        //console.log('Before preprocess:' + o.content);\r
 \r
+                       var ed = this.editor,\r
+                               h = o.content,\r
+                               grep = tinymce.grep,\r
+                               explode = tinymce.explode,\r
+                               trim = tinymce.trim,\r
+                               len, stripClass;\r
+\r
                        function process(items) {\r
                                each(items, function(v) {\r
                                        // Remove or replace\r
                                        else\r
                                                h = h.replace(v[0], v[1]);\r
                                });\r
-                       };\r
-\r
-                       // Process away some basic content\r
-                       process([\r
-                               /^\s*(&nbsp;)+/g,                                                                                       // nbsp entities at the start of contents\r
-                               /(&nbsp;|<br[^>]*>)+\s*$/g                                                                      // nbsp entities at the end of contents\r
-                       ]);\r
+                       }\r
 \r
-                       // Detect Word content and process it more agressive\r
-                       if (/(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test(h)) {\r
-                               o.wordContent = true; // Mark the pasted contents as word specific content\r
+                       // Detect Word content and process it more aggressive\r
+                       if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) {\r
+                               o.wordContent = true;                   // Mark the pasted contents as word specific content\r
                                //console.log('Word contents detected.');\r
 \r
+                               // Process away some basic content\r
+                               process([\r
+                                       /^\s*(&nbsp;)+/gi,                              // &nbsp; entities at the start of contents\r
+                                       /(&nbsp;|<br[^>]*>)+\s*$/gi             // &nbsp; entities at the end of contents\r
+                               ]);\r
+\r
+                               if (getParam(ed, "paste_convert_headers_to_strong")) {\r
+                                       h = h.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>");\r
+                               }\r
+\r
+                               if (getParam(ed, "paste_convert_middot_lists")) {\r
+                                       process([\r
+                                               [/<!--\[if !supportLists\]-->/gi, '$&__MCE_ITEM__'],                                    // Convert supportLists to a list item marker\r
+                                               [/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__']              // Convert mso-list and symbol spans to item markers\r
+                                       ]);\r
+                               }\r
+\r
+                               process([\r
+                                       // Word comments like conditional comments etc\r
+                                       /<!--[\s\S]+?-->/gi,\r
+\r
+                                       // Remove comments, scripts (e.g., msoShowComment), XML tag, VML content, MS Office namespaced tags, and a few other tags\r
+                                       /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,\r
+\r
+                                       // Convert <s> into <strike> for line-though\r
+                                       [/<(\/?)s>/gi, "<$1strike>"],\r
+\r
+                                       // Replace nsbp entites to char since it's easier to handle\r
+                                       [/&nbsp;/gi, "\u00a0"]\r
+                               ]);\r
+\r
+                               // Remove bad attributes, with or without quotes, ensuring that attribute text is really inside a tag.\r
+                               // If JavaScript had a RegExp look-behind, we could have integrated this with the last process() array and got rid of the loop. But alas, it does not, so we cannot.\r
+                               do {\r
+                                       len = h.length;\r
+                                       h = h.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1");\r
+                               } while (len != h.length);\r
+\r
+                               // Remove all spans if no styles is to be retained\r
+                               if (getParam(ed, "paste_retain_style_properties").replace(/^none$/i, "").length == 0) {\r
+                                       h = h.replace(/<\/?span[^>]*>/gi, "");\r
+                               } else {\r
+                                       // We're keeping styles, so at least clean them up.\r
+                                       // CSS Reference: http://msdn.microsoft.com/en-us/library/aa155477.aspx\r
+\r
+                                       process([\r
+                                               // Convert <span style="mso-spacerun:yes">___</span> to string of alternating breaking/non-breaking spaces of same length\r
+                                               [/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,\r
+                                                       function(str, spaces) {\r
+                                                               return (spaces.length > 0)? spaces.replace(/./, " ").slice(Math.floor(spaces.length/2)).split("").join("\u00a0") : "";\r
+                                                       }\r
+                                               ],\r
+\r
+                                               // Examine all styles: delete junk, transform some, and keep the rest\r
+                                               [/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,\r
+                                                       function(str, tag, style) {\r
+                                                               var n = [],\r
+                                                                       i = 0,\r
+                                                                       s = explode(trim(style).replace(/&quot;/gi, "'"), ";");\r
+\r
+                                                               // Examine each style definition within the tag's style attribute\r
+                                                               each(s, function(v) {\r
+                                                                       var name, value,\r
+                                                                               parts = explode(v, ":");\r
+\r
+                                                                       function ensureUnits(v) {\r
+                                                                               return v + ((v !== "0") && (/\d$/.test(v)))? "px" : "";\r
+                                                                       }\r
+\r
+                                                                       if (parts.length == 2) {\r
+                                                                               name = parts[0].toLowerCase();\r
+                                                                               value = parts[1].toLowerCase();\r
+\r
+                                                                               // Translate certain MS Office styles into their CSS equivalents\r
+                                                                               switch (name) {\r
+                                                                                       case "mso-padding-alt":\r
+                                                                                       case "mso-padding-top-alt":\r
+                                                                                       case "mso-padding-right-alt":\r
+                                                                                       case "mso-padding-bottom-alt":\r
+                                                                                       case "mso-padding-left-alt":\r
+                                                                                       case "mso-margin-alt":\r
+                                                                                       case "mso-margin-top-alt":\r
+                                                                                       case "mso-margin-right-alt":\r
+                                                                                       case "mso-margin-bottom-alt":\r
+                                                                                       case "mso-margin-left-alt":\r
+                                                                                       case "mso-table-layout-alt":\r
+                                                                                       case "mso-height":\r
+                                                                                       case "mso-width":\r
+                                                                                       case "mso-vertical-align-alt":\r
+                                                                                               n[i++] = name.replace(/^mso-|-alt$/g, "") + ":" + ensureUnits(value);\r
+                                                                                               return;\r
+\r
+                                                                                       case "horiz-align":\r
+                                                                                               n[i++] = "text-align:" + value;\r
+                                                                                               return;\r
+\r
+                                                                                       case "vert-align":\r
+                                                                                               n[i++] = "vertical-align:" + value;\r
+                                                                                               return;\r
+\r
+                                                                                       case "font-color":\r
+                                                                                       case "mso-foreground":\r
+                                                                                               n[i++] = "color:" + value;\r
+                                                                                               return;\r
+\r
+                                                                                       case "mso-background":\r
+                                                                                       case "mso-highlight":\r
+                                                                                               n[i++] = "background:" + value;\r
+                                                                                               return;\r
+\r
+                                                                                       case "mso-default-height":\r
+                                                                                               n[i++] = "min-height:" + ensureUnits(value);\r
+                                                                                               return;\r
+\r
+                                                                                       case "mso-default-width":\r
+                                                                                               n[i++] = "min-width:" + ensureUnits(value);\r
+                                                                                               return;\r
+\r
+                                                                                       case "mso-padding-between-alt":\r
+                                                                                               n[i++] = "border-collapse:separate;border-spacing:" + ensureUnits(value);\r
+                                                                                               return;\r
+\r
+                                                                                       case "text-line-through":\r
+                                                                                               if ((value == "single") || (value == "double")) {\r
+                                                                                                       n[i++] = "text-decoration:line-through";\r
+                                                                                               }\r
+                                                                                               return;\r
+\r
+                                                                                       case "mso-zero-height":\r
+                                                                                               if (value == "yes") {\r
+                                                                                                       n[i++] = "display:none";\r
+                                                                                               }\r
+                                                                                               return;\r
+                                                                               }\r
+\r
+                                                                               // Eliminate all MS Office style definitions that have no CSS equivalent by examining the first characters in the name\r
+                                                                               if (/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(name)) {\r
+                                                                                       return;\r
+                                                                               }\r
+\r
+                                                                               // If it reached this point, it must be a valid CSS style\r
+                                                                               n[i++] = name + ":" + parts[1];         // Lower-case name, but keep value case\r
+                                                                       }\r
+                                                               });\r
+\r
+                                                               // If style attribute contained any valid styles the re-write it; otherwise delete style attribute.\r
+                                                               if (i > 0) {\r
+                                                                       return tag + ' style="' + n.join(';') + '"';\r
+                                                               } else {\r
+                                                                       return tag;\r
+                                                               }\r
+                                                       }\r
+                                               ]\r
+                                       ]);\r
+                               }\r
+                       }\r
+\r
+                       // Replace headers with <strong>\r
+                       if (getParam(ed, "paste_convert_headers_to_strong")) {\r
                                process([\r
-                                       /<!--[\s\S]+?-->/gi,                                                                                            // Word comments\r
-                                       /<\/?(img|font|meta|link|style|span|div|v:\w+)[^>]*>/gi,                        // Remove some tags including VML content\r
-                                       /<\\?\?xml[^>]*>/gi,                                                                                            // XML namespace declarations\r
-                                       /<\/?o:[^>]*>/gi,                                                                                                       // MS namespaced elements <o:tag>\r
-                                       / (id|name|class|language|type|on\w+|v:\w+)=\"([^\"]*)\"/gi,    // on.., class, style and language attributes with quotes\r
-                                       / (id|name|class|language|type|on\w+|v:\w+)=(\w+)/gi,                   // on.., class, style and language attributes without quotes (IE)\r
-                                       [/<(\/?)s>/gi, '<$1strike>'],                                                                           // Convert <s> into <strike> for line-though\r
-                                       /<script[^>]+>[\s\S]*?<\/script>/gi,                                                            // All scripts elements for msoShowComment for example\r
-                                       [/&nbsp;/g, '\u00a0']                                                                                           // Replace nsbp entites to char since it's easier to handle\r
+                                       [/<h[1-6][^>]*>/gi, "<p><strong>"],\r
+                                       [/<\/h[1-6][^>]*>/gi, "</strong></p>"]\r
                                ]);\r
                        }\r
 \r
+                       // Class attribute options are: leave all as-is ("none"), remove all ("all"), or remove only those starting with mso ("mso").\r
+                       // Note:-  paste_strip_class_attributes: "none", verify_css_classes: true is also a good variation.\r
+                       stripClass = getParam(ed, "paste_strip_class_attributes");\r
+\r
+                       if (stripClass !== "none") {\r
+                               function removeClasses(match, g1) {\r
+                                               if (stripClass === "all")\r
+                                                       return '';\r
+\r
+                                               var cls = grep(explode(g1.replace(/^(["'])(.*)\1$/, "$2"), " "),\r
+                                                       function(v) {\r
+                                                               return (/^(?!mso)/i.test(v));\r
+                                                       }\r
+                                               );\r
+\r
+                                               return cls.length ? ' class="' + cls.join(" ") + '"' : '';\r
+                               };\r
+\r
+                               h = h.replace(/ class="([^"]+)"/gi, removeClasses);\r
+                               h = h.replace(/ class=(\w+)/gi, removeClasses);\r
+                       }\r
+\r
+                       // Remove spans option\r
+                       if (getParam(ed, "paste_remove_spans")) {\r
+                               h = h.replace(/<\/?span[^>]*>/gi, "");\r
+                       }\r
+\r
                        //console.log('After preprocess:' + h);\r
 \r
                        o.content = h;\r
                 * Various post process items.\r
                 */\r
                _postProcess : function(pl, o) {\r
-                       var t = this, dom = t.editor.dom;\r
+                       var t = this, ed = t.editor, dom = ed.dom, styleProps;\r
 \r
                        if (o.wordContent) {\r
                                // Remove named anchors or TOC links\r
                                                dom.remove(a, 1);\r
                                });\r
 \r
-                               if (t.editor.getParam('paste_convert_middot_lists', true))\r
+                               if (getParam(ed, "paste_convert_middot_lists")) {\r
                                        t._convertLists(pl, o);\r
+                               }\r
 \r
-                               // Remove all styles\r
-                               each(dom.select('*', o.node), function(el) {\r
-                                       dom.setAttrib(el, 'style', '');\r
-                               });\r
+                               // Process styles\r
+                               styleProps = getParam(ed, "paste_retain_style_properties"); // retained properties\r
+\r
+                               // Process only if a string was specified and not equal to "all" or "*"\r
+                               if ((tinymce.is(styleProps, "string")) && (styleProps !== "all") && (styleProps !== "*")) {\r
+                                       styleProps = tinymce.explode(styleProps.replace(/^none$/i, ""));\r
+\r
+                                       // Retains some style properties\r
+                                       each(dom.select('*', o.node), function(el) {\r
+                                               var newStyle = {}, npc = 0, i, sp, sv;\r
+\r
+                                               // Store a subset of the existing styles\r
+                                               if (styleProps) {\r
+                                                       for (i = 0; i < styleProps.length; i++) {\r
+                                                               sp = styleProps[i];\r
+                                                               sv = dom.getStyle(el, sp);\r
+\r
+                                                               if (sv) {\r
+                                                                       newStyle[sp] = sv;\r
+                                                                       npc++;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Remove all of the existing styles\r
+                                               dom.setAttrib(el, 'style', '');\r
+\r
+                                               if (styleProps && npc > 0)\r
+                                                       dom.setStyles(el, newStyle); // Add back the stored subset of styles\r
+                                               else // Remove empty span tags that do not have class attributes\r
+                                                       if (el.nodeName == 'SPAN' && !el.className)\r
+                                                               dom.remove(el, true);\r
+                                       });\r
+                               }\r
                        }\r
 \r
-                       if (tinymce.isWebKit) {\r
-                               // We need to compress the styles on WebKit since if you paste <img border="0" /> it will become <img border="0" style="... lots of junk ..." />\r
-                               // Removing the mce_style that contains the real value will force the Serializer engine to compress the styles\r
-                               each(dom.select('*', o.node), function(el) {\r
-                                       el.removeAttribute('mce_style');\r
+                       // Remove all style information or only specifically on WebKit to avoid the style bug on that browser\r
+                       if (getParam(ed, "paste_remove_styles") || (getParam(ed, "paste_remove_styles_if_webkit") && tinymce.isWebKit)) {\r
+                               each(dom.select('*[style]', o.node), function(el) {\r
+                                       el.removeAttribute('style');\r
+                                       el.removeAttribute('_mce_style');\r
                                });\r
+                       } else {\r
+                               if (tinymce.isWebKit) {\r
+                                       // We need to compress the styles on WebKit since if you paste <img border="0" /> it will become <img border="0" style="... lots of junk ..." />\r
+                                       // Removing the mce_style that contains the real value will force the Serializer engine to compress the styles\r
+                                       each(dom.select('*', o.node), function(el) {\r
+                                               el.removeAttribute('_mce_style');\r
+                                       });\r
+                               }\r
                        }\r
                },\r
 \r
                 * Converts the most common bullet and number formats in Office into a real semantic UL/LI list.\r
                 */\r
                _convertLists : function(pl, o) {\r
-                       var dom = pl.editor.dom, listElm, li, lastMargin = -1, margin, levels = [], lastType;\r
+                       var dom = pl.editor.dom, listElm, li, lastMargin = -1, margin, levels = [], lastType, html;\r
 \r
-                       // Convert middot lists into real scemantic lists\r
+                       // Convert middot lists into real semantic lists\r
                        each(dom.select('p', o.node), function(p) {\r
                                var sib, val = '', type, html, idx, parents;\r
 \r
                                for (sib = p.firstChild; sib && sib.nodeType == 3; sib = sib.nextSibling)\r
                                        val += sib.nodeValue;\r
 \r
+                               val = p.innerHTML.replace(/<\/?\w+[^>]*>/gi, '').replace(/&nbsp;/g, '\u00a0');\r
+\r
                                // Detect unordered lists look for bullets\r
-                               if (/^[\u2022\u00b7\u00a7\u00d8o]\s*\u00a0\u00a0*/.test(val))\r
+                               if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o]\s*\u00a0*/.test(val))\r
                                        type = 'ul';\r
 \r
                                // Detect ordered lists 1., a. or ixv.\r
-                               if (/^[\s\S]*\w+\.[\s\S]*\u00a0{2,}/.test(val))\r
+                               if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0{2,}/.test(val))\r
                                        type = 'ol';\r
 \r
                                // Check if node value matches the list pattern: o&nbsp;&nbsp;\r
                                                }\r
                                        }\r
 \r
+                                       // Remove middot or number spans if they exists\r
+                                       each(dom.select('span', p), function(span) {\r
+                                               var html = span.innerHTML.replace(/<\/?\w+[^>]*>/gi, '');\r
+\r
+                                               // Remove span with the middot or the number\r
+                                               if (type == 'ul' && /^[\u2022\u00b7\u00a7\u00d8o]/.test(html))\r
+                                                       dom.remove(span);\r
+                                               else if (/^[\s\S]*\w+\.(&nbsp;|\u00a0)*\s*/.test(html))\r
+                                                       dom.remove(span);\r
+                                       });\r
+\r
+                                       html = p.innerHTML;\r
+\r
+                                       // Remove middot/list items\r
                                        if (type == 'ul')\r
-                                               html = p.innerHTML.replace(/^[\u2022\u00b7\u00a7\u00d8o]\s*(&nbsp;|\u00a0)+\s*/, '');\r
+                                               html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o]\s*(&nbsp;|\u00a0)+\s*/, '');\r
                                        else\r
-                                               html = p.innerHTML.replace(/^[\s\S]*\w+\.(&nbsp;|\u00a0)+\s*/, '');\r
+                                               html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^\s*\w+\.(&nbsp;|\u00a0)+\s*/, '');\r
 \r
+                                       // Create li and add paragraph data into the new li\r
                                        li = listElm.appendChild(dom.create('li', 0, html));\r
                                        dom.remove(p);\r
 \r
                                } else\r
                                        listElm = lastMargin = 0; // End list element\r
                        });\r
+\r
+                       // Remove any left over makers\r
+                       html = o.node.innerHTML;\r
+                       if (html.indexOf('__MCE_ITEM__') != -1)\r
+                               o.node.innerHTML = html.replace(/__MCE_ITEM__/g, '');\r
                },\r
 \r
                /**\r
                 * This logic can be improved so text nodes at the start/end remain in the start/end block elements\r
                 */\r
                _insertBlockContent : function(ed, dom, content) {\r
-                       var parentBlock, marker, sel = ed.selection, last, elm, vp, y, elmHeight;\r
+                       var parentBlock, marker, sel = ed.selection, last, elm, vp, y, elmHeight, markerId = 'mce_marker';\r
 \r
                        function select(n) {\r
                                var r;\r
                                        sel.select(n, 1);\r
                                        sel.collapse(false);\r
                                }\r
-                       };\r
+                       }\r
 \r
                        // Insert a marker for the caret position\r
-                       this._insert('<span id="_marker">&nbsp;</span>', 1);\r
-                       marker = dom.get('_marker');\r
-                       parentBlock = dom.getParent(marker, 'p,h1,h2,h3,h4,h5,h6,ul,ol');\r
+                       this._insert('<span id="' + markerId + '">&nbsp;</span>', 1);\r
+                       marker = dom.get(markerId);\r
+                       parentBlock = dom.getParent(marker, 'p,h1,h2,h3,h4,h5,h6,ul,ol,th,td');\r
 \r
-                       if (parentBlock) {\r
+                       // If it's a parent block but not a table cell\r
+                       if (parentBlock && !/TD|TH/.test(parentBlock.nodeName)) {\r
                                // Split parent block\r
                                marker = dom.split(parentBlock, marker);\r
 \r
                                sel.collapse(0);\r
                        }\r
 \r
-                       dom.remove('_marker'); // Remove marker if it's left\r
+                       // Remove marker if it's left\r
+                       while (elm = dom.get(markerId))\r
+                               dom.remove(elm);\r
 \r
                        // Get element, position and height\r
                        elm = sel.getStart();\r
                 * Inserts the specified contents at the caret position.\r
                 */\r
                _insert : function(h, skip_undo) {\r
-                       var ed = this.editor;\r
+                       var ed = this.editor, r = ed.selection.getRng();\r
 \r
-                       // First delete the contents seems to work better on WebKit\r
-                       ed.execCommand('Delete');\r
+                       // First delete the contents seems to work better on WebKit when the selection spans multiple list items or multiple table cells.\r
+                       if (!ed.selection.isCollapsed() && r.startContainer != r.endContainer)\r
+                               ed.getDoc().execCommand('Delete', false, null);\r
 \r
                        // It's better to use the insertHTML method on Gecko since it will combine paragraphs correctly before inserting the contents\r
                        ed.execCommand(tinymce.isGecko ? 'insertHTML' : 'mceInsertContent', false, h, {skip_undo : skip_undo});\r
                },\r
 \r
+               /**\r
+                * Instead of the old plain text method which tried to re-create a paste operation, the\r
+                * new approach adds a plain text mode toggle switch that changes the behavior of paste.\r
+                * This function is passed the same input that the regular paste plugin produces.\r
+                * It performs additional scrubbing and produces (and inserts) the plain text.\r
+                * This approach leverages all of the great existing functionality in the paste\r
+                * plugin, and requires minimal changes to add the new functionality.\r
+                * Speednet - June 2009\r
+                */\r
+               _insertPlainText : function(ed, dom, h) {\r
+                       var i, len, pos, rpos, node, breakElms, before, after,\r
+                               w = ed.getWin(),\r
+                               d = ed.getDoc(),\r
+                               sel = ed.selection,\r
+                               is = tinymce.is,\r
+                               inArray = tinymce.inArray,\r
+                               linebr = getParam(ed, "paste_text_linebreaktype"),\r
+                               rl = getParam(ed, "paste_text_replacements");\r
+\r
+                       function process(items) {\r
+                               each(items, function(v) {\r
+                                       if (v.constructor == RegExp)\r
+                                               h = h.replace(v, "");\r
+                                       else\r
+                                               h = h.replace(v[0], v[1]);\r
+                               });\r
+                       };\r
+\r
+                       if ((typeof(h) === "string") && (h.length > 0)) {\r
+                               if (!entities)\r
+                                       entities = ("34,quot,38,amp,39,apos,60,lt,62,gt," + ed.serializer.settings.entities).split(",");\r
+\r
+                               // If HTML content with line-breaking tags, then remove all cr/lf chars because only tags will break a line\r
+                               if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(h)) {\r
+                                       process([\r
+                                               /[\n\r]+/g\r
+                                       ]);\r
+                               } else {\r
+                                       // Otherwise just get rid of carriage returns (only need linefeeds)\r
+                                       process([\r
+                                               /\r+/g\r
+                                       ]);\r
+                               }\r
+\r
+                               process([\r
+                                       [/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi, "\n\n"],               // Block tags get a blank line after them\r
+                                       [/<br[^>]*>|<\/tr>/gi, "\n"],                           // Single linebreak for <br /> tags and table rows\r
+                                       [/<\/t[dh]>\s*<t[dh][^>]*>/gi, "\t"],           // Table cells get tabs betweem them\r
+                                       /<[a-z!\/?][^>]*>/gi,                                           // Delete all remaining tags\r
+                                       [/&nbsp;/gi, " "],                                                      // Convert non-break spaces to regular spaces (remember, *plain text*)\r
+                                       [\r
+                                               // HTML entity\r
+                                               /&(#\d+|[a-z0-9]{1,10});/gi,\r
+\r
+                                               // Replace with actual character\r
+                                               function(e, s) {\r
+                                                       if (s.charAt(0) === "#") {\r
+                                                               return String.fromCharCode(s.slice(1));\r
+                                                       }\r
+                                                       else {\r
+                                                               return ((e = inArray(entities, s)) > 0)? String.fromCharCode(entities[e-1]) : " ";\r
+                                                       }\r
+                                               }\r
+                                       ],\r
+                                       [/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"],    // Cool little RegExp deletes whitespace around linebreak chars.\r
+                                       [/\n{3,}/g, "\n\n"],                                                    // Max. 2 consecutive linebreaks\r
+                                       /^\s+|\s+$/g                                                                    // Trim the front & back\r
+                               ]);\r
+\r
+                               h = dom.encode(h);\r
+\r
+                               // Delete any highlighted text before pasting\r
+                               if (!sel.isCollapsed()) {\r
+                                       d.execCommand("Delete", false, null);\r
+                               }\r
+\r
+                               // Perform default or custom replacements\r
+                               if (is(rl, "array") || (is(rl, "array"))) {\r
+                                       process(rl);\r
+                               }\r
+                               else if (is(rl, "string")) {\r
+                                       process(new RegExp(rl, "gi"));\r
+                               }\r
+\r
+                               // Treat paragraphs as specified in the config\r
+                               if (linebr == "none") {\r
+                                       process([\r
+                                               [/\n+/g, " "]\r
+                                       ]);\r
+                               }\r
+                               else if (linebr == "br") {\r
+                                       process([\r
+                                               [/\n/g, "<br />"]\r
+                                       ]);\r
+                               }\r
+                               else {\r
+                                       process([\r
+                                               /^\s+|\s+$/g,\r
+                                               [/\n\n/g, "</p><p>"],\r
+                                               [/\n/g, "<br />"]\r
+                                       ]);\r
+                               }\r
+\r
+                               // This next piece of code handles the situation where we're pasting more than one paragraph of plain\r
+                               // text, and we are pasting the content into the middle of a block node in the editor.  The block\r
+                               // node gets split at the selection point into "Para A" and "Para B" (for the purposes of explaining).\r
+                               // The first paragraph of the pasted text is appended to "Para A", and the last paragraph of the\r
+                               // pasted text is prepended to "Para B".  Any other paragraphs of pasted text are placed between\r
+                               // "Para A" and "Para B".  This code solves a host of problems with the original plain text plugin and\r
+                               // now handles styles correctly.  (Pasting plain text into a styled paragraph is supposed to make the\r
+                               // plain text take the same style as the existing paragraph.)\r
+                               if ((pos = h.indexOf("</p><p>")) != -1) {\r
+                                       rpos = h.lastIndexOf("</p><p>");\r
+                                       node = sel.getNode(); \r
+                                       breakElms = [];         // Get list of elements to break \r
+\r
+                                       do {\r
+                                               if (node.nodeType == 1) {\r
+                                                       // Don't break tables and break at body\r
+                                                       if (node.nodeName == "TD" || node.nodeName == "BODY") {\r
+                                                               break;\r
+                                                       }\r
+\r
+                                                       breakElms[breakElms.length] = node;\r
+                                               }\r
+                                       } while (node = node.parentNode);\r
+\r
+                                       // Are we in the middle of a block node?\r
+                                       if (breakElms.length > 0) {\r
+                                               before = h.substring(0, pos);\r
+                                               after = "";\r
+\r
+                                               for (i=0, len=breakElms.length; i<len; i++) {\r
+                                                       before += "</" + breakElms[i].nodeName.toLowerCase() + ">";\r
+                                                       after += "<" + breakElms[breakElms.length-i-1].nodeName.toLowerCase() + ">";\r
+                                               }\r
+\r
+                                               if (pos == rpos) {\r
+                                                       h = before + after + h.substring(pos+7);\r
+                                               }\r
+                                               else {\r
+                                                       h = before + h.substring(pos+4, rpos+4) + after + h.substring(rpos+7);\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // Insert content at the caret, plus add a marker for repositioning the caret\r
+                               ed.execCommand("mceInsertRawHTML", false, h + '<span id="_plain_text_marker">&nbsp;</span>');\r
+\r
+                               // Reposition the caret to the marker, which was placed immediately after the inserted content.\r
+                               // Needs to be done asynchronously (in window.setTimeout) or else it doesn't work in all browsers.\r
+                               // The second part of the code scrolls the content up if the caret is positioned off-screen.\r
+                               // This is only necessary for WebKit browsers, but it doesn't hurt to use for all.\r
+                               window.setTimeout(function() {\r
+                                       var marker = dom.get('_plain_text_marker'),\r
+                                               elm, vp, y, elmHeight;\r
+\r
+                                       sel.select(marker, false);\r
+                                       d.execCommand("Delete", false, null);\r
+                                       marker = null;\r
+\r
+                                       // Get element, position and height\r
+                                       elm = sel.getStart();\r
+                                       vp = dom.getViewPort(w);\r
+                                       y = dom.getPos(elm).y;\r
+                                       elmHeight = elm.clientHeight;\r
+\r
+                                       // Is element within viewport if not then scroll it into view\r
+                                       if ((y < vp.y) || (y + elmHeight > vp.y + vp.h)) {\r
+                                               d.body.scrollTop = y < vp.y ? y : y - vp.h + 25;\r
+                                       }\r
+                               }, 0);\r
+                       }\r
+               },\r
+\r
                /**\r
                 * This method will open the old style paste dialogs. Some users might want the old behavior but still use the new cleanup engine.\r
                 */\r
                _legacySupport : function() {\r
                        var t = this, ed = t.editor;\r
 \r
-                       // Register commands for backwards compatibility\r
-                       each(['mcePasteText', 'mcePasteWord'], function(cmd) {\r
-                               ed.addCommand(cmd, function() {\r
+                       // Register command(s) for backwards compatibility\r
+                       ed.addCommand("mcePasteWord", function() {\r
+                               ed.windowManager.open({\r
+                                       file: t.url + "/pasteword.htm",\r
+                                       width: parseInt(getParam(ed, "paste_dialog_width")),\r
+                                       height: parseInt(getParam(ed, "paste_dialog_height")),\r
+                                       inline: 1\r
+                               });\r
+                       });\r
+\r
+                       if (getParam(ed, "paste_text_use_dialog")) {\r
+                               ed.addCommand("mcePasteText", function() {\r
                                        ed.windowManager.open({\r
-                                               file : t.url + (cmd == 'mcePasteText' ? '/pastetext.htm' : '/pasteword.htm'),\r
-                                               width : 450,\r
-                                               height : 400,\r
+                                               file : t.url + "/pastetext.htm",\r
+                                               width: parseInt(getParam(ed, "paste_dialog_width")),\r
+                                               height: parseInt(getParam(ed, "paste_dialog_height")),\r
                                                inline : 1\r
                                        });\r
                                });\r
-                       });\r
+                       }\r
 \r
-                       // Register buttons for backwards compatibility\r
-                       ed.addButton('pastetext', {title : 'paste.paste_text_desc', cmd : 'mcePasteText'});\r
-                       ed.addButton('pasteword', {title : 'paste.paste_word_desc', cmd : 'mcePasteWord'});\r
-                       ed.addButton('selectall', {title : 'paste.selectall_desc', cmd : 'selectall'});\r
+                       // Register button for backwards compatibility\r
+                       ed.addButton("pasteword", {title : "paste.paste_word_desc", cmd : "mcePasteWord"});\r
                }\r
        });\r
 \r
        // Register plugin\r
-       tinymce.PluginManager.add('paste', tinymce.plugins.PastePlugin);\r
-})();
\ No newline at end of file
+       tinymce.PluginManager.add("paste", tinymce.plugins.PastePlugin);\r
+})();\r
index 303439b336285d4c40454dd1ab7441e4567b1e97..c524f9eb033881f3c9463ff2d284dbb541454f1a 100644 (file)
@@ -19,7 +19,7 @@ var PasteTextDialog = {
                        }\r
                }\r
 \r
-               tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, h);\r
+               tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h});\r
                tinyMCEPopup.close();\r
        },\r
 \r
index fe053a7213eb9ee66c52398d46441a719c63e6a1..a52731c368e4db331e36cd11e691731d98dfc91b 100644 (file)
@@ -13,12 +13,12 @@ var PasteWordDialog = {
                css = [ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css")];\r
                css = css.concat(tinymce.explode(ed.settings.content_css) || []);\r
                tinymce.each(css, function(u) {\r
-                       cssHTML += '<link href="' + ed.documentBaseURI.toAbsolute(u) + '" rel="stylesheet" type="text/css" />';\r
+                       cssHTML += '<link href="' + ed.documentBaseURI.toAbsolute('' + u) + '" rel="stylesheet" type="text/css" />';\r
                });\r
 \r
                // Write content into iframe\r
                doc.open();\r
-               doc.write('<html><head>' + cssHTML + '</head><body spellcheck="false"></body></html>');\r
+               doc.write('<html><head>' + cssHTML + '</head><body class="mceContentBody" spellcheck="false"></body></html>');\r
                doc.close();\r
 \r
                doc.designMode = 'on';\r
@@ -32,7 +32,7 @@ var PasteWordDialog = {
        insert : function() {\r
                var h = document.getElementById('iframe').contentWindow.document.body.innerHTML;\r
 \r
-               tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, h);\r
+               tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h, wordContent : true});\r
                tinyMCEPopup.close();\r
        },\r
 \r
diff --git a/program/js/tiny_mce/plugins/paste/langs/ar_dlg.js b/program/js/tiny_mce/plugins/paste/langs/ar_dlg.js
new file mode 100644 (file)
index 0000000..c7fdc6a
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('ar.paste_dlg',{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/az_dlg.js b/program/js/tiny_mce/plugins/paste/langs/az_dlg.js
new file mode 100644 (file)
index 0000000..7f83848
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('az.paste_dlg',{\r
+text_title:"P\u0259nc\u0259r\u0259y\u0259 m\u0259tn \u0259lav\u0259 etm\u0259k \u00FC\u00E7\u00FCn CTRL+V klavi\u015F birl\u0259\u015Fm\u0259sini istifad\u0259 edin.",\r
+text_linebreaks:"S\u0259tr s\u0131nmalar\u0131n\u0131 saxla",\r
+word_title:"P\u0259nc\u0259r\u0259y\u0259 s\u00F6z \u0259lav\u0259 etm\u0259k \u00FC\u00E7\u00FCn CTRL+V klavi\u015F birl\u0259\u015Fm\u0259sini istifad\u0259 edin."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/be_dlg.js b/program/js/tiny_mce/plugins/paste/langs/be_dlg.js
new file mode 100644 (file)
index 0000000..ca285a7
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('be.paste_dlg',{\r
+text_title:"\u0412\u044B\u043A\u0430\u0440\u044B\u0441\u0442\u0430\u0439\u0446\u0435 \u0441\u043F\u0430\u043B\u0443\u0447\u044D\u043D\u043D\u0435 \u043A\u043B\u0430\u0432\u0456\u0448 CTRL+V \u043A\u0430\u0431 \u0443\u0441\u0442\u0430\u0432\u0456\u0446\u044C \u0442\u044D\u043A\u0441\u0442 \u0443 \u0430\u043A\u043D\u043E.",\r
+text_linebreaks:"\u0417\u0430\u0445\u043E\u045E\u0432\u0430\u0446\u044C \u043F\u0430\u0440\u044B\u0432\u044B \u0440\u0430\u0434\u043A\u043E\u045E",\r
+word_title:"\u0412\u044B\u043A\u0430\u0440\u044B\u0441\u0442\u0430\u0439\u0446\u0435 \u0441\u043F\u0430\u043B\u0443\u0447\u044D\u043D\u043D\u0435 \u043A\u043B\u0430\u0432\u0456\u0448 CTRL+V \u043A\u0430\u0431 \u0443\u0441\u0442\u0430\u0432\u0456\u0446\u044C \u0442\u044D\u043A\u0441\u0442 \u0443 \u0430\u043A\u043D\u043E."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/bg_dlg.js b/program/js/tiny_mce/plugins/paste/langs/bg_dlg.js
new file mode 100644 (file)
index 0000000..e45991c
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('bg.paste_dlg',{\r
+text_title:"\u0418\u0437\u043F\u043E\u043B\u0437\u0432\u0430\u0439\u0442\u0435 CTRL+V \u043D\u0430 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430\u0442\u0430 \u0437\u0430 \u0434\u0430 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u043F\u0440\u043E\u0437\u043E\u0440\u0435\u0446\u0430.",\r
+text_linebreaks:"\u0417\u0430\u043F\u0430\u0437\u0438 \u043D\u043E\u0432\u0438\u0442\u0435 \u0440\u0435\u0434\u043E\u0432\u0435",\r
+word_title:"\u0418\u0437\u043F\u043E\u043B\u0437\u0432\u0430\u0439\u0442\u0435 CTRL+V \u043D\u0430 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430\u0442\u0430 \u0437\u0430 \u0434\u0430 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u043F\u0440\u043E\u0437\u043E\u0440\u0435\u0446\u0430."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/bn_dlg.js b/program/js/tiny_mce/plugins/paste/langs/bn_dlg.js
new file mode 100644 (file)
index 0000000..d6ca645
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('bn.paste_dlg',{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/br_dlg.js b/program/js/tiny_mce/plugins/paste/langs/br_dlg.js
new file mode 100644 (file)
index 0000000..a843d5b
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('br.paste_dlg',{\r
+text_title:"Use CTRL+V para colar o texto na janela.",\r
+text_linebreaks:"Manter quebras de linha",\r
+word_title:"Use CTRL+V para colar o texto na janela."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/bs_dlg.js b/program/js/tiny_mce/plugins/paste/langs/bs_dlg.js
new file mode 100644 (file)
index 0000000..7632ecf
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('bs.paste_dlg',{\r
+text_title:"Koristite CTRL+V na tipkovnici da zalijepite tekst u prozor.",\r
+text_linebreaks:"Zadr\u017Ei prijelome",\r
+word_title:"Koristite CTRL+V na tipkovnici da zalijepite tekst u prozor."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/ca_dlg.js b/program/js/tiny_mce/plugins/paste/langs/ca_dlg.js
new file mode 100644 (file)
index 0000000..2d88748
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('ca.paste_dlg',{\r
+text_title:"Amb el teclat utilitzeu CTRL+V per a enganxar el text dins la finestra.",\r
+text_linebreaks:"Conserva els salts de l\u00EDnia",\r
+word_title:"Amb el teclat utilitzeu CTRL+V per a enganxar el text dins la finestra."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/cs_dlg.js b/program/js/tiny_mce/plugins/paste/langs/cs_dlg.js
new file mode 100644 (file)
index 0000000..e87cc38
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('cs.paste_dlg',{\r
+text_title:"Pou\u017Eijte CTRL+V pro vlo\u017Een\u00ED textu do okna.",\r
+text_linebreaks:"Zachovat zalamov\u00E1n\u00ED \u0159\u00E1dk\u016F",\r
+word_title:"Pou\u017Eijte CTRL+V pro vlo\u017Een\u00ED textu do okna."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/cy_dlg.js b/program/js/tiny_mce/plugins/paste/langs/cy_dlg.js
new file mode 100644 (file)
index 0000000..a1643ce
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('cy.paste_dlg',{\r
+text_title:"Defnyddiwch CTRL+V ar eich bysellfwrdd i ludo'r testun i fewn i'r ffenest.",\r
+text_linebreaks:"Cadw toriadau llinell",\r
+word_title:"Defnyddiwch CTRL+V ar eich bysellfwrdd i ludo'r testun i fewn i'r ffenest."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/da_dlg.js b/program/js/tiny_mce/plugins/paste/langs/da_dlg.js
new file mode 100644 (file)
index 0000000..22abfe4
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('da.paste_dlg',{\r
+text_title:"Anvend CTRL+V p\u00E5 tastaturet for at inds\u00E6tte teksten.",\r
+text_linebreaks:"Bevar linieskift",\r
+word_title:"Anvend CTRL+V p\u00E5 tastaturet for at inds\u00E6tte teksten."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/de_dlg.js b/program/js/tiny_mce/plugins/paste/langs/de_dlg.js
new file mode 100644 (file)
index 0000000..5a3f5e8
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('de.paste_dlg',{\r
+text_title:"Dr\u00FCcken Sie auf Ihrer Tastatur Strg+V, um den Text einzuf\u00FCgen.",\r
+text_linebreaks:"Zeilenumbr\u00FCche beibehalten",\r
+word_title:"Dr\u00FCcken Sie auf Ihrer Tastatur Strg+V, um den Text einzuf\u00FCgen."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/el_dlg.js b/program/js/tiny_mce/plugins/paste/langs/el_dlg.js
new file mode 100644 (file)
index 0000000..22bae02
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('el.paste_dlg',{\r
+text_title:"\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03C4\u03B5 CTRL+V \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BA\u03AC\u03BD\u03B5\u03C4\u03B5 \u03B5\u03C0\u03B9\u03BA\u03CC\u03BB\u03BB\u03B7\u03C3\u03B7 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C3\u03C4\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF.",\r
+text_linebreaks:"\u039D\u03B1 \u03BA\u03C1\u03B1\u03C4\u03B7\u03B8\u03BF\u03CD\u03BD \u03C4\u03B1 linebreaks",\r
+word_title:"\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03C4\u03B5 CTRL+V \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BA\u03AC\u03BD\u03B5\u03C4\u03B5 \u03B5\u03C0\u03B9\u03BA\u03CC\u03BB\u03BB\u03B7\u03C3\u03B7 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C3\u03C4\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/es_dlg.js b/program/js/tiny_mce/plugins/paste/langs/es_dlg.js
new file mode 100644 (file)
index 0000000..d5edb69
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('es.paste_dlg',{\r
+text_title:"Use CTRL+V en su teclado para pegar el texto en la ventana.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V en su teclado para pegar el texto en la ventana."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/et_dlg.js b/program/js/tiny_mce/plugins/paste/langs/et_dlg.js
new file mode 100644 (file)
index 0000000..6dd40f5
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('et.paste_dlg',{\r
+text_title:"Vajuta CTRL+V oma klaviatuuril teksti aknasse kleepimiseks.",\r
+text_linebreaks:"J\u00E4ta reavahetused",\r
+word_title:"Vajuta CTRL+V oma klaviatuuril teksti aknasse kleepimiseks."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/eu_dlg.js b/program/js/tiny_mce/plugins/paste/langs/eu_dlg.js
new file mode 100644 (file)
index 0000000..1e2e117
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('eu.paste_dlg',{\r
+text_title:"Erabili CTRL+V testua lehioan itsasteko.",\r
+text_linebreaks:"Mantendu lerro-jauziak",\r
+word_title:"Erabili CTRL+V testua lehioan itsasteko.."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/fa_dlg.js b/program/js/tiny_mce/plugins/paste/langs/fa_dlg.js
new file mode 100644 (file)
index 0000000..ff6993e
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('fa.paste_dlg',{\r
+text_title:"\u062C\u0647\u062A \u0686\u0633\u0628\u0627\u0646\u062F\u0646 (Paste) \u0643\u0631\u062F\u0646 \u0645\u062A\u0646 \u062F\u0631 \u067E\u0646\u062C\u0631\u0647 \u0627\u0632 CTRL+V \u0628\u0631 \u0631\u0648\u06CC \u0635\u0641\u062D\u0647 \u0643\u0644\u06CC\u062F \u062E\u0648\u062F \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0646\u0645\u0627\u0626\u06CC\u062F.",\r
+text_linebreaks:"\u062D\u0641\u0638 \u0642\u0637\u0639 \u062E\u0637\u0648\u0637",\r
+word_title:"\u062C\u0647\u062A \u0686\u0633\u0628\u0627\u0646\u062F\u0646 (Paste) \u0643\u0631\u062F\u0646 \u0645\u062A\u0646 \u062F\u0631 \u067E\u0646\u062C\u0631\u0647 \u0627\u0632 CTRL+V \u0628\u0631 \u0631\u0648\u06CC \u0635\u0641\u062D\u0647 \u0643\u0644\u06CC\u062F \u062E\u0648\u062F \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0646\u0645\u0627\u0626\u06CC\u062F."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/fi_dlg.js b/program/js/tiny_mce/plugins/paste/langs/fi_dlg.js
new file mode 100644 (file)
index 0000000..e8cde95
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('fi.paste_dlg',{\r
+text_title:"Paina CTRL+V liitt\u00E4\u00E4ksesi sis\u00E4ll\u00F6n ikkunaan.",\r
+text_linebreaks:"S\u00E4ilyt\u00E4 rivinvaihdot",\r
+word_title:"Paina CTRL+V liitt\u00E4\u00E4ksesi sis\u00E4ll\u00F6n ikkunaan."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/fr_dlg.js b/program/js/tiny_mce/plugins/paste/langs/fr_dlg.js
new file mode 100644 (file)
index 0000000..c4d43ea
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('fr.paste_dlg',{\r
+text_title:"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00EAtre.",\r
+text_linebreaks:"Conserver les retours \u00E0 la ligne",\r
+word_title:"Utilisez CTRL+V sur votre clavier pour coller le texte dans la fen\u00EAtre."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/gl_dlg.js b/program/js/tiny_mce/plugins/paste/langs/gl_dlg.js
new file mode 100644 (file)
index 0000000..3b098d1
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('gl.paste_dlg',{\r
+text_title:"Use CTRL+V no teclado pra pega-lo texto na vent\u00E1.",\r
+text_linebreaks:"Manter salto de li\u00F1as",\r
+word_title:"Use CTRL+V no teclado pra pega-lo texto na vent\u00E1."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/he_dlg.js b/program/js/tiny_mce/plugins/paste/langs/he_dlg.js
new file mode 100644 (file)
index 0000000..6465dde
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('he.paste_dlg',{\r
+text_title:"\u05D4\u05D3\u05D1\u05D9\u05E7\u05D5 \u05D1\u05D7\u05DC\u05D5\u05DF \u05D6\u05D4 \u05D0\u05EA \u05D4\u05D8\u05E7\u05E1\u05D8 \u05D1\u05D0\u05DE\u05E6\u05E2\u05D5\u05EA \u05D4\u05DE\u05E7\u05E9\u05D9\u05DD CTRL+V.",\r
+text_linebreaks:"\u05D4\u05E9\u05D0\u05E8 \u05D0\u05EA \u05E9\u05D5\u05E8\u05D5\u05EA \u05D4\u05E8\u05D5\u05D5\u05D7",\r
+word_title:"\u05D4\u05D3\u05D1\u05D9\u05E7\u05D5 \u05D1\u05D7\u05DC\u05D5\u05DF \u05D6\u05D4 \u05D0\u05EA \u05D4\u05D8\u05E7\u05E1\u05D8 \u05D1\u05D0\u05DE\u05E6\u05E2\u05D5\u05EA \u05D4\u05DE\u05E7\u05E9\u05D9\u05DD CTRL+V."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/hi_dlg.js b/program/js/tiny_mce/plugins/paste/langs/hi_dlg.js
new file mode 100644 (file)
index 0000000..6f3b0f7
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('hi.paste_dlg',{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/hr_dlg.js b/program/js/tiny_mce/plugins/paste/langs/hr_dlg.js
new file mode 100644 (file)
index 0000000..c6b3e0f
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('hr.paste_dlg',{\r
+text_title:"Koristite CTRL+V na tipkovnici da zalijepite tekst u prozor.",\r
+text_linebreaks:"Zadr\u017Ei prijelome",\r
+word_title:"Koristite CTRL+V na tipkovnici da zalijepite tekst u prozor."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/hu_dlg.js b/program/js/tiny_mce/plugins/paste/langs/hu_dlg.js
new file mode 100644 (file)
index 0000000..f7f2852
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('hu.paste_dlg',{\r
+text_title:"Haszn\u00E1lja a Ctrl+V-t a billenty\u0171zet\u00E9n a beilleszt\u00E9shez.",\r
+text_linebreaks:"Sort\u00F6r\u00E9sek megtart\u00E1sa",\r
+word_title:"Haszn\u00E1lja a Ctrl+V-t a billenty\u0171zet\u00E9n a beilleszt\u00E9shez."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/hy_dlg.js b/program/js/tiny_mce/plugins/paste/langs/hy_dlg.js
new file mode 100644 (file)
index 0000000..a2e4561
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('hy.paste_dlg',{\r
+text_title:"\u0555\u0563\u057F\u0561\u0563\u0578\u0580\u056E\u0565\u0584 CTRL + V \u057A\u0561\u057F\u0573\u0565\u0576\u057E\u0561\u056E \u057F\u0565\u0584\u057D\u057F\u056B \u057F\u0565\u0572\u0561\u0564\u0580\u0574\u0561\u0576 \u0570\u0561\u0574\u0561\u0580",\r
+text_linebreaks:"\u054A\u0561\u0570\u057A\u0561\u0576\u0565\u056C \u057F\u0578\u0572\u0561\u0564\u0561\u0580\u0571\u0565\u0580\u0568",\r
+word_title:"\u0555\u0563\u057F\u0561\u0563\u0578\u0580\u056E\u0565\u0584 CTRL + V \u057A\u0561\u057F\u0573\u0565\u0576\u057E\u0561\u056E \u057F\u0565\u0584\u057D\u057F\u056B \u057F\u0565\u0572\u0561\u0564\u0580\u0574\u0561\u0576 \u0570\u0561\u0574\u0561\u0580"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/ia_dlg.js b/program/js/tiny_mce/plugins/paste/langs/ia_dlg.js
new file mode 100644 (file)
index 0000000..30d2efe
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('ia.paste_dlg',{\r
+text_title:"\u5C06\u590D\u5236(CTRL + C)\u7684\u5185\u5BB9\u7C98\u8D34(CTRL + V)\u5230\u7A97\u53E3\u3002",\r
+text_linebreaks:"\u4FDD\u7559\u5206\u884C\u7B26\u53F7\u53F7",\r
+word_title:"\u5C06\u590D\u5236(CTRL + C)\u7684\u5185\u5BB9\u7C98\u8D34(CTRL + V)\u5230\u7A97\u53E3\u3002"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/id_dlg.js b/program/js/tiny_mce/plugins/paste/langs/id_dlg.js
new file mode 100644 (file)
index 0000000..af5434b
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('id.paste_dlg',{\r
+text_title:"Gunakan CTRL+V pada keyboard untuk paste.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Gunakan CTRL+V pada keyboard untuk paste."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/is_dlg.js b/program/js/tiny_mce/plugins/paste/langs/is_dlg.js
new file mode 100644 (file)
index 0000000..70d2a28
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('is.paste_dlg',{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/it_dlg.js b/program/js/tiny_mce/plugins/paste/langs/it_dlg.js
new file mode 100644 (file)
index 0000000..9854394
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('it.paste_dlg',{\r
+text_title:"Premere CTRL+V sulla tastiera per incollare il testo nella finestra.",\r
+text_linebreaks:"Mantieni interruzioni di riga",\r
+word_title:"Premere CTRL+V sulla tastiera per incollare il testo nella finestra."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/ja_dlg.js b/program/js/tiny_mce/plugins/paste/langs/ja_dlg.js
new file mode 100644 (file)
index 0000000..e233cde
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('ja.paste_dlg',{\r
+text_title:"\u30AD\u30FC\u30DC\u30FC\u30C9\u3067CTRL+V\u3092\u62BC\u3057\u3066\u30C6\u30AD\u30B9\u30C8\u3092\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002",\r
+text_linebreaks:"\u6539\u884C\u3092\u4FDD\u6301\u3059\u308B",\r
+word_title:"\u30AD\u30FC\u30DC\u30FC\u30C9\u3067CTRL+V\u3092\u62BC\u3057\u3066\u30C6\u30AD\u30B9\u30C8\u3092\u8CBC\u308A\u4ED8\u3051\u3066\u304F\u3060\u3055\u3044\u3002"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/ka_dlg.js b/program/js/tiny_mce/plugins/paste/langs/ka_dlg.js
new file mode 100644 (file)
index 0000000..8b9ec7b
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('ka.paste_dlg',{\r
+text_title:"\u10E2\u10D4\u10E5\u10E1\u10E2\u10D8\u10E1 \u10E9\u10D0\u10E1\u10D0\u10E1\u10DB\u10D4\u10DA\u10D0\u10D3 \u10D2\u10D0\u10DB\u10DD\u10D8\u10E7\u10D4\u10DC\u10D4\u10D7 \u10D9\u10DA\u10D0\u10D5\u10D8\u10D0\u10E2\u10E3\u10E0\u10E3\u10DA\u10D8 \u10D9\u10DD\u10DB\u10D1\u10D8\u10DC\u10D0\u10EA\u10D8\u10D0 CTRL+V.",\r
+text_linebreaks:"\u10D2\u10D0\u10D3\u10D0\u10E2\u10D0\u10DC\u10D8\u10DA\u10D8 \u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D4\u10D1\u10D8\u10E1 \u10E8\u10D4\u10DC\u10D0\u10EE\u10D5\u10D0",\r
+word_title:"\u0418\u10E2\u10D4\u10E5\u10E1\u10E2\u10D8\u10E1 \u10E9\u10D0\u10E1\u10D0\u10E1\u10DB\u10D4\u10DA\u10D0\u10D3 \u10D2\u10D0\u10DB\u10DD\u10D8\u10E7\u10D4\u10DC\u10D4\u10D7 \u10D9\u10DA\u10D0\u10D5\u10D8\u10D0\u10E2\u10E3\u10E0\u10E3\u10DA\u10D8 \u10D9\u10DD\u10DB\u10D1\u10D8\u10DC\u10D0\u10EA\u10D8\u10D0 CTRL+V."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/ko_dlg.js b/program/js/tiny_mce/plugins/paste/langs/ko_dlg.js
new file mode 100644 (file)
index 0000000..9f4b6fd
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('ko.paste_dlg',{\r
+text_title:"\uC708\uB3C4\uC6B0\uC5D0 \uD14D\uC2A4\uD2B8\uB97C \uBD99\uC774\uB824\uBA74 \uD0A4\uBCF4\uB4DC\uB85C Ctrl+V\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694.",\r
+text_linebreaks:"\uAC1C\uD589\uC744 \uBCF4\uAD00 \uC720\uC9C0",\r
+word_title:"\uC708\uB3C4\uC6B0\uC5D0 \uD14D\uC2A4\uD2B8\uB97C \uBD99\uC774\uB824\uBA74 \uD0A4\uBCF4\uB4DC\uB85CCtrl+V\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/lt_dlg.js b/program/js/tiny_mce/plugins/paste/langs/lt_dlg.js
new file mode 100644 (file)
index 0000000..628e6b6
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('lt.paste_dlg',{\r
+text_title:"Naudokite CTRL+V tekstui \u012Fd\u0117ti \u012F \u0161\u012F lang\u0105.",\r
+text_linebreaks:"Palikti eilu\u010Di\u0173 l\u016B\u017Eius",\r
+word_title:"Naudokite CTRL+V tekstui \u012Fd\u0117ti \u012F \u0161\u012F lang\u0105."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/lv_dlg.js b/program/js/tiny_mce/plugins/paste/langs/lv_dlg.js
new file mode 100644 (file)
index 0000000..a8b963e
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('lv.paste_dlg',{\r
+text_title:"Izmantojiet CTRL+V uz j\u016Bsu tastat\u016Bras lai iekop\u0113t tekstu log\u0101.",\r
+text_linebreaks:"Sagl\u0101b\u0101t l\u012Bniju sadal\u012Bt\u0101jus",\r
+word_title:"Izmantojiet CTRL+V uz j\u016Bsu tastat\u016Bras lai iekop\u0113t tekstu log\u0101."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/mk_dlg.js b/program/js/tiny_mce/plugins/paste/langs/mk_dlg.js
new file mode 100644 (file)
index 0000000..db8a6eb
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('mk.paste_dlg',{\r
+text_title:"Koristite CTRL+V na tipkovnici da zalepite tekst u prozor.",\r
+text_linebreaks:"Zadr\u017Ei prelome",\r
+word_title:"Koristite CTRL+V na tipkovnici da zalepite tekst u prozor."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/ms_dlg.js b/program/js/tiny_mce/plugins/paste/langs/ms_dlg.js
new file mode 100644 (file)
index 0000000..bc19721
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('ms.paste_dlg',{\r
+text_title:"Guna CTRL+V pada papan kekunci anda untuk Tempel teks ke dalam tetingkap.",\r
+text_linebreaks:"Biarkan garisan pemisah",\r
+word_title:"Guna CTRL+V pada papan kekunci anda untuk teks ke dalam tetingkap."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/nb_dlg.js b/program/js/tiny_mce/plugins/paste/langs/nb_dlg.js
new file mode 100644 (file)
index 0000000..92c5dad
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('nb.paste_dlg',{\r
+text_title:"Bruk CTRL+V p\u00E5 tastaturet for \u00E5 lime inn i dette vinduet.",\r
+text_linebreaks:"Behold tekstbryting",\r
+word_title:"Bruk CTRL+V p\u00E5 tastaturet for \u00E5 lime inn i dette vinduet."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/nl_dlg.js b/program/js/tiny_mce/plugins/paste/langs/nl_dlg.js
new file mode 100644 (file)
index 0000000..99e604f
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('nl.paste_dlg',{\r
+text_title:"Gebruik Ctrl+V om tekst in het venster te plakken.",\r
+text_linebreaks:"Regelafbreking bewaren",\r
+word_title:"Gebruik Ctrl+V om tekst in het venster te plakken."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/nn_dlg.js b/program/js/tiny_mce/plugins/paste/langs/nn_dlg.js
new file mode 100644 (file)
index 0000000..2231de3
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('nn.paste_dlg',{\r
+text_title:"Bruk CTRL+V p\u00E5 tastaturet for \u00E5 lime inn i dette vindauget.",\r
+text_linebreaks:"Behald tekstbryting",\r
+word_title:"Bruk CTRL+V p\u00E5 tastaturet for \u00E5 lime inn i dette vindauget."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/no_dlg.js b/program/js/tiny_mce/plugins/paste/langs/no_dlg.js
new file mode 100644 (file)
index 0000000..eba405d
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('no.paste_dlg',{\r
+text_title:"Bruk CTRL+V p\u00E5 tastaturet for \u00E5 lime inn i dette vinduet.",\r
+text_linebreaks:"Behold tekstbryting",\r
+word_title:"Bruk CTRL+V p\u00E5 tastaturet for \u00E5 lime inn i dette vinduet."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/pl_dlg.js b/program/js/tiny_mce/plugins/paste/langs/pl_dlg.js
new file mode 100644 (file)
index 0000000..110be65
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('pl.paste_dlg',{\r
+text_title:"U\u017Cyj CTRL+V na swojej klawiaturze \u017Ceby wklei\u0107 tekst do okna.",\r
+text_linebreaks:"Zachowaj ko\u0144ce linii.",\r
+word_title:"U\u017Cyj CTRL+V na swojej klawiaturze \u017Ceby wklei\u0107 tekst do okna."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/ps_dlg.js b/program/js/tiny_mce/plugins/paste/langs/ps_dlg.js
new file mode 100644 (file)
index 0000000..13990fc
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('ps.paste_dlg',{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/pt_dlg.js b/program/js/tiny_mce/plugins/paste/langs/pt_dlg.js
new file mode 100644 (file)
index 0000000..db361f3
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('pt.paste_dlg',{\r
+text_title:"Use CTRL+V para colar o texto na janela.",\r
+text_linebreaks:"Manter quebras de linha",\r
+word_title:"Use CTRL+V para colar o texto na janela."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/ro_dlg.js b/program/js/tiny_mce/plugins/paste/langs/ro_dlg.js
new file mode 100644 (file)
index 0000000..78f3112
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('ro.paste_dlg',{\r
+text_title:"Folosi\u0163i CTRL+V pentru a lipi \u00EEn aceast\u0103 zon\u0103.",\r
+text_linebreaks:"P\u0103streaz\u0103 separatoarele de linii.",\r
+word_title:"Folosi\u0163i CTRL+V pentru a lipi \u00EEn aceast\u0103 zon\u0103."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/ru_dlg.js b/program/js/tiny_mce/plugins/paste/langs/ru_dlg.js
new file mode 100644 (file)
index 0000000..91f4a40
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('ru.paste_dlg',{\r
+text_title:"\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u043E\u043A\u043D\u043E.",\r
+text_linebreaks:"\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u044B \u0441\u0442\u0440\u043E\u043A",\r
+word_title:"\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u043E\u043A\u043D\u043E."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/si_dlg.js b/program/js/tiny_mce/plugins/paste/langs/si_dlg.js
new file mode 100644 (file)
index 0000000..6842f04
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('si.paste_dlg',{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/sk_dlg.js b/program/js/tiny_mce/plugins/paste/langs/sk_dlg.js
new file mode 100644 (file)
index 0000000..828a401
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('sk.paste_dlg',{\r
+text_title:"Pou\u017Eite CTRL+V pre vlo\u017Eenie textu do okna.",\r
+text_linebreaks:"Zachova\u0165 zalamovanie riadkov",\r
+word_title:"Pou\u017Eite CTRL+V pre vlo\u017Eenie textu do okna."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/sl_dlg.js b/program/js/tiny_mce/plugins/paste/langs/sl_dlg.js
new file mode 100644 (file)
index 0000000..c16d5ce
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('sl.paste_dlg',{\r
+text_title:"Uporabite kombinacijo tipk CTRL+V, da prilepite vsebino v okno.",\r
+text_linebreaks:"Obdr\u017Ei prelome vrstic",\r
+word_title:"Uporabite kombinacijo tipk CTRL+V, da prilepite vsebino v okno."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/sq_dlg.js b/program/js/tiny_mce/plugins/paste/langs/sq_dlg.js
new file mode 100644 (file)
index 0000000..dae27be
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('sq.paste_dlg',{\r
+text_title:"P\u00EBrdor CTRL+V p\u00EBr t\u00EB ngjitur tekstin.",\r
+text_linebreaks:"Ruaj linjat e reja",\r
+word_title:"P\u00EBrdor CTRL+V p\u00EBr t\u00EB ngjitur tekstin."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/sr_dlg.js b/program/js/tiny_mce/plugins/paste/langs/sr_dlg.js
new file mode 100644 (file)
index 0000000..b43c243
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('sr.paste_dlg',{\r
+text_title:"Koristite CTRL+V na tipkovnici da zalepite tekst u prozor.",\r
+text_linebreaks:"Zadr\u017Ei prelome",\r
+word_title:"Koristite CTRL+V na tipkovnici da zalepite tekst u prozor."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/sv_dlg.js b/program/js/tiny_mce/plugins/paste/langs/sv_dlg.js
new file mode 100644 (file)
index 0000000..4cea4b2
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('sv.paste_dlg',{\r
+text_title:"Anv\u00E4nd ctrl-v p\u00E5 ditt tangentbord f\u00F6r att klistra in i detta f\u00F6nster.",\r
+text_linebreaks:"Spara radbrytningar",\r
+word_title:"Anv\u00E4nd ctrl-v p\u00E5 ditt tangentbord f\u00F6r att klistra in i detta f\u00F6nster."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/ta_dlg.js b/program/js/tiny_mce/plugins/paste/langs/ta_dlg.js
new file mode 100644 (file)
index 0000000..2ec45e3
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('ta.paste_dlg',{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/te_dlg.js b/program/js/tiny_mce/plugins/paste/langs/te_dlg.js
new file mode 100644 (file)
index 0000000..c885cc1
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('te.paste_dlg',{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/th_dlg.js b/program/js/tiny_mce/plugins/paste/langs/th_dlg.js
new file mode 100644 (file)
index 0000000..ac4969a
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('th.paste_dlg',{\r
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",\r
+text_linebreaks:"Keep linebreaks",\r
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/tr_dlg.js b/program/js/tiny_mce/plugins/paste/langs/tr_dlg.js
new file mode 100644 (file)
index 0000000..9641b9b
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('tr.paste_dlg',{\r
+text_title:"Pencereye metin yap\u0131\u015Ft\u0131rmak i\u00E7in klavyeden CTRL+V i kullan\u0131n.",\r
+text_linebreaks:"Sat\u0131r kesmelerini tut",\r
+word_title:"Pencereye metin yap\u0131\u015Ft\u0131rmak i\u00E7in klavyeden CTRL+V i kullan\u0131n."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/tw_dlg.js b/program/js/tiny_mce/plugins/paste/langs/tw_dlg.js
new file mode 100644 (file)
index 0000000..f4f0cae
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('tw.paste_dlg',{\r
+text_title:"\u5728\u9375\u76E4\u4E0A\u540C\u6642\u6309\u4E0BCtrl \u548CV \u9375\uFF0C\u5C07\u6587\u5B57\u8CBC\u4E0A\u5230\u6B64\u8996\u7A97\u3002 ",\r
+text_linebreaks:"\u4FDD\u7559\u63DB\u884C\u7B26",\r
+word_title:"\u5728\u9375\u76E4\u4E0A\u540C\u6642\u6309\u4E0BCtrl \u548CV \u9375\uFF0C\u5C07\u6587\u5B57\u8CBC\u4E0A\u5230\u6B64\u8996\u7A97\u3002 "\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/uk_dlg.js b/program/js/tiny_mce/plugins/paste/langs/uk_dlg.js
new file mode 100644 (file)
index 0000000..1266ae9
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('uk.paste_dlg',{\r
+text_title:"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u0443 \u0443 \u0432\u0456\u043A\u043D\u043E.",\r
+text_linebreaks:"\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438 \u0440\u044F\u0434\u043A\u0456\u0432",\r
+word_title:"\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 CTRL+V \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u0443 \u0443 \u0432\u0456\u043A\u043D\u043E."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/vi_dlg.js b/program/js/tiny_mce/plugins/paste/langs/vi_dlg.js
new file mode 100644 (file)
index 0000000..6caddc4
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('vi.paste_dlg',{\r
+text_title:"S\u1EED d\u1EE5ng CTRL+V tr\u00EAn b\u00E0n ph\u00EDm \u0111\u1EC3 d\u00E1n v\u0103n b\u1EA3n v\u00E0o c\u1EEDa s\u1ED5.",\r
+text_linebreaks:"Gi\u1EEF ng\u1EAFt d\u00F2ng",\r
+word_title:"S\u1EED d\u1EE5ng CTRL+V tr\u00EAn b\u00E0n ph\u00EDm \u0111\u1EC3 d\u00E1n v\u0103n b\u1EA3n v\u00E0o c\u1EEDa s\u1ED5."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/paste/langs/zh_dlg.js b/program/js/tiny_mce/plugins/paste/langs/zh_dlg.js
new file mode 100644 (file)
index 0000000..58a2e3e
--- /dev/null
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('zh.paste_dlg',{\r
+text_title:"\u5728\u952E\u76D8\u4E0A\u540C\u65F6\u6309\u4E0BCtrl \u548CV \u952E\uFF0C\u5C06\u6587\u5B57\u8D34\u4E0A\u5230\u6B64\u89C6\u7A97\u3002 ",\r
+text_linebreaks:"\u4FDD\u7559\u6362\u884C\u7B26",\r
+word_title:"\u5728\u952E\u76D8\u4E0A\u540C\u65F6\u6309\u4E0BCtrl \u548CV \u952E\uFF0C\u5C06\u6587\u5B57\u8D34\u4E0A\u5230\u6B64\u89C6\u7A97\u3002 "\r
+});
\ No newline at end of file
index 42c3d9c849fa6245a58027e128eb80d94629c00d..b6559454764eb393bc93da05768dbc451ca5ace0 100644 (file)
@@ -1,7 +1,6 @@
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
        <title>{#paste.paste_text_desc}</title>\r
-       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
        <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
        <script type="text/javascript" src="js/pastetext.js"></script>\r
 </head>\r
                <textarea id="content" name="content" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft" class="mceFocus"></textarea>\r
 \r
                <div class="mceActionPanel">\r
-                       <div style="float: left">\r
-                               <input type="submit" name="insert" value="{#insert}" id="insert" />\r
-                       </div>\r
-\r
-                       <div style="float: right">\r
-                               <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
-                       </div>\r
+                       <input type="submit" name="insert" value="{#insert}" id="insert" />\r
+                       <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
                </div>\r
        </form>\r
 </body> \r
index f4a9b3db3fa2113c899659b38f655b5f996c802f..0f6bb412104d5cb74c8da783161ab883a1ef2b5c 100644 (file)
@@ -1,6 +1,5 @@
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
        <title>{#paste.paste_word_desc}</title>\r
        <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
        <script type="text/javascript" src="js/pasteword.js"></script>\r
                <div id="iframecontainer"></div>\r
 \r
                <div class="mceActionPanel">\r
-                       <div style="float: left">\r
-                               <input type="submit" id="insert" name="insert" value="{#insert}" />\r
-                       </div>\r
-\r
-                       <div style="float: right">\r
-                               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-                       </div>\r
+                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
                </div>\r
        </form>\r
 </body>\r
index c3f8358c61dd9eccb700b64ef329d1edb1e5ac97..cd9c985b7a414df3215d7d7a3c1e9d2fc393bafe 100644 (file)
@@ -1 +1 @@
-(function(){tinymce.create("tinymce.plugins.SearchReplacePlugin",{init:function(a,c){function b(d){a.windowManager.open({file:c+"/searchreplace.htm",width:420+parseInt(a.getLang("searchreplace.delta_width",0)),height:160+parseInt(a.getLang("searchreplace.delta_height",0)),inline:1,auto_focus:0},{mode:d,search_string:a.selection.getContent({format:"text"}),plugin_url:c})}a.addCommand("mceSearch",function(){b("search")});a.addCommand("mceReplace",function(){b("replace")});a.addButton("search",{title:"searchreplace.search_desc",cmd:"mceSearch"});a.addButton("replace",{title:"searchreplace.replace_desc",cmd:"mceReplace"});a.addShortcut("ctrl+f","searchreplace.search_desc","mceSearch")},getInfo:function(){return{longname:"Search/Replace",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("searchreplace",tinymce.plugins.SearchReplacePlugin)})();
\ No newline at end of file
+(function(){tinymce.create("tinymce.plugins.SearchReplacePlugin",{init:function(a,c){function b(d){a.windowManager.open({file:c+"/searchreplace.htm",width:420+parseInt(a.getLang("searchreplace.delta_width",0)),height:170+parseInt(a.getLang("searchreplace.delta_height",0)),inline:1,auto_focus:0},{mode:d,search_string:a.selection.getContent({format:"text"}),plugin_url:c})}a.addCommand("mceSearch",function(){b("search")});a.addCommand("mceReplace",function(){b("replace")});a.addButton("search",{title:"searchreplace.search_desc",cmd:"mceSearch"});a.addButton("replace",{title:"searchreplace.replace_desc",cmd:"mceReplace"});a.addShortcut("ctrl+f","searchreplace.search_desc","mceSearch")},getInfo:function(){return{longname:"Search/Replace",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("searchreplace",tinymce.plugins.SearchReplacePlugin)})();
\ No newline at end of file
index 59edc3b25fdc8750cd75691218e1a814c2159c45..1433a06a4aef1b25ce965360a9cc3e102b61685e 100644 (file)
@@ -1,8 +1,11 @@
 /**\r
- * $Id: editor_plugin_src.js 686 2008-03-09 18:13:49Z spocke $\r
+ * editor_plugin_src.js\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 (function() {\r
@@ -12,7 +15,7 @@
                                ed.windowManager.open({\r
                                        file : url + '/searchreplace.htm',\r
                                        width : 420 + parseInt(ed.getLang('searchreplace.delta_width', 0)),\r
-                                       height : 160 + parseInt(ed.getLang('searchreplace.delta_height', 0)),\r
+                                       height : 170 + parseInt(ed.getLang('searchreplace.delta_height', 0)),\r
                                        inline : 1,\r
                                        auto_focus : 0\r
                                }, {\r
index a8585cccce9d1342ef37a3a6e40845680f906f11..c0a62432978dd4cda1343ce7a2d376692a44a886 100644 (file)
@@ -75,6 +75,10 @@ var SearchReplaceDialog = {
                                                r.select();\r
                                                replace();\r
                                                fo = 1;\r
+\r
+                                               if (b) {\r
+                                                       r.moveEnd("character", -(rs.length)); // Otherwise will loop forever\r
+                                               }\r
                                        }\r
 \r
                                        tinyMCEPopup.storeSelection();\r
index 0b9c6ffe65697dad9a847b7af7824292f5048de2..dc74b5dcfe4cac35e611901ad69ff2fd55cf0642 100755 (executable)
@@ -1,16 +1,16 @@
 tinyMCE.addI18n('ar.searchreplace_dlg',{\r
-searchnext_desc:"\u0628\u062D\u062B \u0645\u0646 \u062C\u062F\u064A\u062F",\r
-notfound:"\u0627\u0646\u062A\u0647\u0649 \u0627\u0644\u0628\u062D\u062B. \u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 \u0643\u0644\u0645\u0629 \u0627\u0644\u0628\u062D\u062B.",\r
-search_title:"\u0628\u062D\u062B",\r
-replace_title:"\u0628\u062D\u062B/\u0627\u0633\u062A\u0628\u062F\u0627\u0644",\r
+searchnext_desc:"Find again",\r
+notfound:"The search has been completed. The search string could not be found.",\r
+search_title:"Find",\r
+replace_title:"Find/Replace",\r
 allreplaced:"All occurrences of the search string were replaced.",\r
-findwhat:"\u0627\u0644\u0628\u062D\u062B \u0639\u0646",\r
-replacewith:"\u0627\u0633\u062A\u0628\u062F\u0627\u0644 \u0628\u0640",\r
-direction:"\u0627\u0644\u0625\u062A\u062C\u0627\u0647",\r
-up:"\u0627\u0639\u0644\u0649",\r
-down:"\u0627\u0633\u0641\u0644",\r
-mcase:"\u0627\u0644\u062A\u0623\u0643\u062F \u0645\u0646 \u062D\u0627\u0644\u0629 \u0627\u0644\u0623\u062D\u0631\u0641",\r
-findnext:"\u0628\u062D\u062B \u0639\u0646 \u0627\u0644\u062A\u0627\u0644\u064A",\r
-replace:"\u0627\u0633\u062A\u0628\u062F\u0627\u0644",\r
-replaceall:"\u0627\u0633\u062A\u0628\u062F\u0627\u0644 \u0627\u0644\u0643\u0644"\r
+findwhat:"Find what",\r
+replacewith:"Replace with",\r
+direction:"Direction",\r
+up:"Up",\r
+down:"Down",\r
+mcase:"Match case",\r
+findnext:"Find next",\r
+replace:"Replace",\r
+replaceall:"Replace all"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/az_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/az_dlg.js
new file mode 100644 (file)
index 0000000..47210e4
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('az.searchreplace_dlg',{\r
+searchnext_desc:"S\u00F6zl\u0259ri axtar",\r
+notfound:"Axtar\u0131\u015F bitdi. S\u0259tr tap\u0131lmad\u0131.",\r
+search_title:"Axtar",\r
+replace_title:"Axtar/D\u0259yi\u015F",\r
+allreplaced:"B\u00FCt\u00FCn qar\u015F\u0131la\u015Fm\u0131\u015F s\u0259trl\u0259r d\u0259yi\u015Fdirildi.",\r
+findwhat:"N\u0259 axtar\u0131ls\u0131n",\r
+replacewith:"N\u0259y\u0259 d\u0259yi\u015Filsin",\r
+direction:"\u0130stiqam\u0259tl\u0259ndirm\u0259",\r
+up:"Yuxar\u0131",\r
+down:"A\u015Fa\u011F\u0131",\r
+mcase:"Registr\u0131 n\u0259z\u0259r\u0259 al",\r
+findnext:"Sonrak\u0131n\u0131 axtar",\r
+replace:"D\u0259yi\u015F",\r
+replaceall:"Ham\u0131s\u0131n\u0131 d\u0259yi\u015F"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/be_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/be_dlg.js
new file mode 100644 (file)
index 0000000..387eefc
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('be.searchreplace_dlg',{\r
+searchnext_desc:"\u0417\u043D\u0430\u0439\u0441\u0446\u0456 \u0437\u043D\u043E\u045E",\r
+notfound:"\u041F\u043E\u0448\u0443\u043A \u0441\u043A\u043E\u043D\u0447\u0430\u043D\u044B. \u0420\u0430\u0434\u043E\u043A \u043D\u0435 \u0437\u043D\u043E\u0439\u0434\u0437\u0435\u043D\u0430\u044F.",\r
+search_title:"\u0417\u043D\u0430\u0439\u0441\u0446\u0456",\r
+replace_title:"\u0417\u043D\u0430\u0439\u0441\u0446\u0456/\u0417\u0430\u043C\u044F\u043D\u0456\u0446\u044C",\r
+allreplaced:"\u0423\u0441\u0435 \u0441\u0443\u0441\u0442\u0440\u0430\u043A\u0430\u0435\u043C\u044B\u044F \u0440\u0430\u0434\u043A\u0456 \u0431\u044B\u043B\u0456 \u0437\u0430\u043C\u0435\u043D\u0435\u043D\u044B\u044F.",\r
+findwhat:"\u0428\u0442\u043E \u0437\u043D\u0430\u0439\u0441\u0446\u0456",\r
+replacewith:"\u0417\u0430\u043C\u044F\u043D\u0456\u0446\u044C \u043D\u0430",\r
+direction:"\u041A\u0456\u0440\u0443\u043D\u0430\u043A",\r
+up:"\u0423\u0432\u0435\u0440\u0445",\r
+down:"\u0423\u043D\u0456\u0437",\r
+mcase:"\u0423\u043B\u0456\u0447\u0432\u0430\u0446\u044C \u0440\u044D\u0433\u0456\u0441\u0442\u0440",\r
+findnext:"\u0417\u043D\u0430\u0439\u0441\u0446\u0456 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0443\u044E",\r
+replace:"\u0417\u0430\u043C\u044F\u043D\u0456\u0446\u044C",\r
+replaceall:"\u0417\u0430\u043C\u044F\u043D\u0456\u0446\u044C \u0443\u0441\u0451"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/bn_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/bn_dlg.js
new file mode 100644 (file)
index 0000000..4fe8020
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('bn.searchreplace_dlg',{\r
+searchnext_desc:"Find again",\r
+notfound:"The search has been completed. The search string could not be found.",\r
+search_title:"Find",\r
+replace_title:"Find/Replace",\r
+allreplaced:"All occurrences of the search string were replaced.",\r
+findwhat:"Find what",\r
+replacewith:"Replace with",\r
+direction:"Direction",\r
+up:"Up",\r
+down:"Down",\r
+mcase:"Match case",\r
+findnext:"Find next",\r
+replace:"Replace",\r
+replaceall:"Replace all"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/br_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/br_dlg.js
new file mode 100644 (file)
index 0000000..22b8d32
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('br.searchreplace_dlg',{\r
+searchnext_desc:"Localizar novamente",\r
+notfound:"A pesquisa foi conclu\u00EDda sem resultados.",\r
+search_title:"Localizar",\r
+replace_title:"Localizar/substituir",\r
+allreplaced:"Todas as substitui\u00E7\u00F5es foram efetuadas.",\r
+findwhat:"Localizar",\r
+replacewith:"Substituir com",\r
+direction:"Dire\u00E7\u00E3o",\r
+up:"Acima",\r
+down:"Abaixo",\r
+mcase:"Diferenciar mai\u00FAsculas/min\u00FAsculas",\r
+findnext:"Localizar pr\u00F3ximo",\r
+replace:"Substituir",\r
+replaceall:"Substituir todos"\r
+});
\ No newline at end of file
index e504d3b007bbcf496ab27e86fe44254ca7421d00..e634ccd08125cf44b7a2dd8c92634fcd427f2993 100755 (executable)
@@ -1,16 +1,16 @@
 tinyMCE.addI18n('ca.searchreplace_dlg',{\r
-searchnext_desc:"Torna a buscar",\r
-notfound:"S'ha completat la recerca. No s'ha trobat la cadena buscada.",\r
-search_title:"Busca",\r
-replace_title:"Busca/Substitueix",\r
-allreplaced:"S'han substitu\u00EFt totes les ocurr\u00E8ncies de la cadena buscada.",\r
-findwhat:"Busca",\r
-replacewith:"Substitueix per",\r
+searchnext_desc:"Cerca de nou",\r
+notfound:"S\'ha completat la cerca. No s\'ha trobat la cadena cercada.",\r
+search_title:"Cerca",\r
+replace_title:"Cerca/Reempla\u00E7a",\r
+allreplaced:"S\'han reempla\u00E7at totes les ocurr\u00E8ncies de la cadena cercada.",\r
+findwhat:"Cerca",\r
+replacewith:"Reempla\u00E7a amb",\r
 direction:"Direcci\u00F3",\r
 up:"Amunt",\r
 down:"Avall",\r
-mcase:"Distingeix maj\u00FAscules i min\u00FAscules",\r
+mcase:"Distingeix maj\u00FAscules/min\u00FAscules",\r
 findnext:"Seg\u00FCent",\r
-replace:"Substitueix",\r
-replaceall:"Substitueix tot"\r
+replace:"Reempla\u00E7a",\r
+replaceall:"Reempla\u00E7a-ho tot"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/cy_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/cy_dlg.js
new file mode 100644 (file)
index 0000000..fe95924
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('cy.searchreplace_dlg',{\r
+searchnext_desc:"Canfod eto",\r
+notfound:"Mae'r chwiliad wedi cwblhau. Methu canfod y llinyn chwiliad.",\r
+search_title:"Canfod",\r
+replace_title:"Canfod/Amnewid",\r
+allreplaced:"Amnewidwyd pob digwyddiad o'r llinyn chwiliad.",\r
+findwhat:"Canfod beth",\r
+replacewith:"Adnewid gyda",\r
+direction:"Cyfeiriad",\r
+up:"I fyny",\r
+down:"I lawr",\r
+mcase:"Cydweddu priflythrennedd",\r
+findnext:"Canfod nesaf",\r
+replace:"Amnewid",\r
+replaceall:"Amnewid pob un"\r
+});
\ No newline at end of file
index a5065079c2da6d957a92f419ff3fdb6b77af2f8a..9c49354df3d9a42395af9e1b6c1abb9e5cf039a6 100755 (executable)
@@ -2,7 +2,7 @@ tinyMCE.addI18n('da.searchreplace_dlg',{
 searchnext_desc:"S\u00F8g igen",\r
 notfound:"S\u00F8gningen gav intet resultat.",\r
 search_title:"S\u00F8g",\r
-replace_title:"S\u00F8g / Erstate",\r
+replace_title:"S\u00F8g / erstat",\r
 allreplaced:"Alle forekomster af s\u00F8gestrengen er erstattet.",\r
 findwhat:"S\u00F8g efter",\r
 replacewith:"Erstat med",\r
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/eu_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/eu_dlg.js
new file mode 100644 (file)
index 0000000..769f5f8
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('eu.searchreplace_dlg',{\r
+searchnext_desc:"Berriz bilatu",\r
+notfound:"Bilaketa bukatu da. Bilatutakoa ez da aurkitu.",\r
+search_title:"Bilatu",\r
+replace_title:"Bilatu/Ordezkatu",\r
+allreplaced:"Bilatutakoaren agerpen guztiak ordezkatu dira.",\r
+findwhat:"Zer bilatu",\r
+replacewith:"Zerekin ordezkatu",\r
+direction:"Norabidea",\r
+up:"Gorantz",\r
+down:"Beherantz",\r
+mcase:"Maiuskulak eta minuskulak kontuan hartu",\r
+findnext:"Hurrengoa",\r
+replace:"Ordezkatu",\r
+replaceall:"Ordezkatu guztiak"\r
+});
\ No newline at end of file
index fe24743b2e76eac003e91ee81b5d43c1d1a96ca9..66f916f90d8f29921cefed1006fc405002f421ab 100755 (executable)
@@ -1,16 +1,16 @@
 tinyMCE.addI18n('fa.searchreplace_dlg',{\r
-searchnext_desc:"Find again",\r
-notfound:"\u062C\u0633\u062A\u062C\u0648 \u062A\u0645\u0627\u0645 \u0634\u062F. \u0631\u0634\u062A\u0647 \u0645\u0648\u0631\u062F \u062C\u0633\u062A\u062C\u0648 \u06CC\u0627\u0641\u062A \u0646\u0634\u062F.",\r
-search_title:"\u06CC\u0627\u0641\u062A\u0646",\r
-replace_title:"\u06CC\u0627\u0641\u062A\u0646/\u062C\u0627\u06CC\u06AF\u0632\u06CC\u0646 \u06A9\u0631\u062F\u0646",\r
-allreplaced:"All occurrences of the search string were replaced.",\r
-findwhat:"Find what",\r
-replacewith:"\u062C\u0627\u06CC\u06AF\u0632\u06CC\u0646 \u06A9\u0631\u062F\u0646 \u0628\u0627",\r
+searchnext_desc:"\u062C\u0633\u062A\u062C\u0648\u06CC \u0645\u062C\u062F\u062F",\r
+notfound:"\u062C\u0633\u062A\u062C\u0648 \u0643\u0627\u0645\u0644 \u0634\u062F. \u06A9\u0644\u0645\u0647 \u062C\u0633\u062A\u062C\u0648 \u0634\u062F\u0647 \u06CC\u0627\u0641\u062A \u0646\u0634\u062F",\r
+search_title:"\u062C\u0633\u062A\u062C\u0648",\r
+replace_title:"\u062C\u0633\u062A\u062C\u0648/\u062A\u0639\u0648\u06CC\u0636",\r
+allreplaced:"\u062A\u0645\u0627\u0645\u06CC \u06A9\u0644\u0645\u0627\u062A \u06CC\u0627\u0641\u062A \u0634\u062F\u0647 \u062A\u063A\u06CC\u06CC\u0631 \u06CC\u0627\u0641\u062A\u0646\u062F",\r
+findwhat:"\u062C\u0633\u062A\u062C\u0648\u06CC \u0686\u0647 \u0686\u06CC\u0632\u06CC",\r
+replacewith:"\u062A\u0639\u0648\u06CC\u0636 \u0628\u0627",\r
 direction:"\u062C\u0647\u062A",\r
 up:"\u0628\u0627\u0644\u0627",\r
 down:"\u067E\u0627\u06CC\u06CC\u0646",\r
-mcase:"Match case",\r
-findnext:"Find next",\r
-replace:"Replace",\r
-replaceall:"\u062C\u0627\u06CC\u06AF\u0631\u06CC\u0646 \u06A9\u0631\u062F\u0646 \u0647\u0645\u0647"\r
+mcase:"\u0647\u0645\u0633\u0627\u0646 \u0628\u0648\u062F\u0646 \u062D\u0631\u0648\u0641",\r
+findnext:"\u062C\u0633\u062A\u062C\u0648\u06CC \u0628\u0639\u062F\u06CC",\r
+replace:"\u062A\u0639\u0648\u06CC\u0636",\r
+replaceall:"\u062A\u0639\u0648\u06CC\u0636 \u0647\u0645\u0647"\r
 });
\ No newline at end of file
index fbdd1f357347a52ecdd452917aef0d3ad5a8d1f4..a151c6c394d5e7a76de32e73a2fa92e83581d75e 100755 (executable)
@@ -1,16 +1,16 @@
 tinyMCE.addI18n('fr.searchreplace_dlg',{\r
 searchnext_desc:"Suivant",\r
 notfound:"La recherche est termin\u00E9e. La cha\u00EEne recherch\u00E9e n'a pas \u00E9t\u00E9 trouv\u00E9e.",\r
-search_title:"Chercher",\r
-replace_title:"Chercher/Remplacer",\r
-allreplaced:"Toutes les occurences de la cha\u00EEne recherch\u00E9e ont \u00E9t\u00E9 remplac\u00E9es.",\r
-findwhat:"Chercher",\r
+search_title:"Rechercher",\r
+replace_title:"Rechercher / remplacer",\r
+allreplaced:"Toutes les occurrences de la cha\u00EEne recherch\u00E9e ont \u00E9t\u00E9 remplac\u00E9es.",\r
+findwhat:"Rechercher ceci",\r
 replacewith:"Remplacer par",\r
 direction:"Direction",\r
-up:"Haut",\r
-down:"Bas",\r
-mcase:"Prendre la casse en compte",\r
-findnext:"Chercher suivant",\r
+up:"Vers le haut",\r
+down:"Vers le bas",\r
+mcase:"Sensible \u00E0 la casse",\r
+findnext:"Rechercher le suivant",\r
 replace:"Remplacer",\r
-replaceall:"Rempl. tous"\r
+replaceall:"Tout remplacer"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/gl_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/gl_dlg.js
new file mode 100644 (file)
index 0000000..fefcd08
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('gl.searchreplace_dlg',{\r
+searchnext_desc:"Buscar outra vez",\r
+notfound:"A busca rematou. No se atopou o texto buscado.",\r
+search_title:"Buscar",\r
+replace_title:"Buscar/Reemplazar",\r
+allreplaced:"T\u00F3da-las coincidencias do texto buscado foron reemplazadas.",\r
+findwhat:"Localizar",\r
+replacewith:"Reemplazar por",\r
+direction:"Direcci\u00F3n",\r
+up:"Arriba",\r
+down:"Abaixo",\r
+mcase:"Min\u00FAs./Mai\u00FAs.",\r
+findnext:"Buscar seginte",\r
+replace:"Reemplazar",\r
+replaceall:"Reemplazar todo"\r
+});
\ No newline at end of file
index b205c31a28e1c1ecda04bb019d1afea0b08c9e90..475ee84833dd3532e05cd40234c1bbe2f4c8362a 100755 (executable)
@@ -9,8 +9,8 @@ replacewith:"\u05DC\u05D4\u05D7\u05DC\u05D9\u05E3 \u05D1",
 direction:"\u05DB\u05D9\u05D5\u05D5\u05DF",\r
 up:"\u05DC\u05DE\u05E2\u05DC\u05D4",\r
 down:"\u05DC\u05DE\u05D8\u05D4",\r
-mcase:"\u05D4\u05EA\u05D0\u05DD \u05E8\u05D9\u05E9\u05D9\u05D5\u05EA",\r
+mcase:"\u05D4\u05EA\u05D0\u05DD \u05D0\u05D5\u05EA\u05D9\u05D5\u05EA \u05E8\u05D9\u05E9\u05D9\u05D5\u05EA",\r
 findnext:"\u05D7\u05E4\u05E9 \u05D0\u05EA \u05D4\u05D1\u05D0",\r
-replace:"\u05D4\u05D7\u05DC\u05E3",\r
+replace:"\u05D4\u05D7\u05DC\u05E4\u05D4",\r
 replaceall:"\u05D4\u05D7\u05DC\u05E4\u05EA \u05D4\u05DB\u05DC"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/hi_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/hi_dlg.js
new file mode 100644 (file)
index 0000000..c5687c2
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('hi.searchreplace_dlg',{\r
+searchnext_desc:"Find again",\r
+notfound:"The search has been completed. The search string could not be found.",\r
+search_title:"Find",\r
+replace_title:"Find/Replace",\r
+allreplaced:"All occurrences of the search string were replaced.",\r
+findwhat:"Find what",\r
+replacewith:"Replace with",\r
+direction:"Direction",\r
+up:"Up",\r
+down:"Down",\r
+mcase:"Match case",\r
+findnext:"Find next",\r
+replace:"Replace",\r
+replaceall:"Replace all"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/hy_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/hy_dlg.js
new file mode 100644 (file)
index 0000000..6dd8034
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('hy.searchreplace_dlg',{\r
+searchnext_desc:"\u0546\u0578\u0580\u056B\u0581 \u0578\u0580\u0578\u0576\u0565\u056C",\r
+notfound:"\u0548\u0580\u0578\u0576\u0578\u0582\u0574\u0568 \u0561\u057E\u0561\u0580\u057F\u057E\u0565\u0581\u0589 \u0548\u0579\u056B\u0576\u0579 \u0579\u056B \u0563\u057F\u0576\u057E\u0565\u056C",\r
+search_title:"\u0548\u0580\u0578\u0576\u0565\u056C",\r
+replace_title:"\u0548\u0580\u0578\u0576\u0565\u056C / \u0553\u0578\u0583\u0578\u056D\u0565\u056C",\r
+allreplaced:"\u0532\u0578\u056C\u0578\u0580 \u0563\u057F\u0576\u057E\u0561\u056E\u0576\u0565\u0580\u0568 \u0583\u0578\u0583\u0578\u056D\u057E\u0565\u0581\u056B\u0576",\r
+findwhat:"\u0548\u0580\u0578\u0576\u0565\u056C",\r
+replacewith:"\u0553\u0578\u0583\u0578\u056D\u0565\u056C",\r
+direction:"\u0548\u0582\u0572\u0572\u0578\u0582\u0569\u0575\u0578\u0582\u0576",\r
+up:"\u054E\u0565\u0580\u0587 ",\r
+down:"\u0546\u0565\u0580\u0584\u0587",\r
+mcase:"\u0540\u0561\u0577\u057E\u056B \u0561\u057C\u0576\u0565\u056C \u057C\u0565\u0563\u056B\u057D\u057F\u0578\u0580\u0568",\r
+findnext:"\u0533\u057F\u0576\u0565\u056C \u0570\u0561\u057B\u0578\u0580\u0564\u0568",\r
+replace:"\u0553\u0578\u0583\u0578\u056D\u0565\u056C",\r
+replaceall:"\u0553\u0578\u0583\u0578\u056D\u0565\u056C \u0562\u0561\u056C\u0578\u0580\u0568"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/ia_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/ia_dlg.js
new file mode 100644 (file)
index 0000000..4a9bad6
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('ia.searchreplace_dlg',{\r
+searchnext_desc:"\u518D\u6B21\u67E5\u627E",\r
+notfound:"\u67E5\u627E\u5DF2\u5B8C\u6210 ! \u627E\u4E0D\u5230\u4EFB\u4F55\u76EE\u6807\u3002 ",\r
+search_title:"\u67E5\u627E",\r
+replace_title:"\u67E5\u627E/\u66FF\u6362",\r
+allreplaced:"\u5DF2\u66FF\u6362\u6240\u6709\u5339\u914D\u7684\u5B57\u7B26\u4E32.",\r
+findwhat:"\u67E5\u627E\u76EE\u6807",\r
+replacewith:"\u66FF\u6362\u4E3A",\r
+direction:"\u65B9\u5411",\r
+up:"\u5411\u4E0A",\r
+down:"\u5411\u4E0B",\r
+mcase:"\u533A\u5206\u5927\u5C0F\u5199",\r
+findnext:"\u67E5\u627E\u4E0B\u4E00\u4E2A",\r
+replace:"\u66FF\u6362",\r
+replaceall:"\u5168\u90E8\u66FF\u6362"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/id_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/id_dlg.js
new file mode 100644 (file)
index 0000000..cd4de42
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('id.searchreplace_dlg',{\r
+searchnext_desc:"Cari Lagi",\r
+notfound:"Pencarian selesai. Hasil tidak ditemukan.",\r
+search_title:"Cari",\r
+replace_title:"Cari/Ganti",\r
+allreplaced:"Seluruh kata dari string pencarian telah digantikan",\r
+findwhat:"Cari apa...",\r
+replacewith:"Ganti dengan...",\r
+direction:"Arah",\r
+up:"Atas",\r
+down:"Bawah",\r
+mcase:"Match case",\r
+findnext:"Cari selanjutnya",\r
+replace:"Ganti",\r
+replaceall:"Ganti semua"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/ka_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/ka_dlg.js
new file mode 100644 (file)
index 0000000..d4b7db3
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('ka.searchreplace_dlg',{\r
+searchnext_desc:"\u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D8\u10D7 \u10DE\u10DD\u10D5\u10DC\u10D0",\r
+notfound:"\u10EB\u10D4\u10D1\u10DC\u10D0 \u10D3\u10D0\u10E1\u10E0\u10E3\u10DA\u10D4\u10D1\u10E3\u10DA\u10D8\u10D0. \u10E8\u10D4\u10E1\u10D0\u10E2\u10E7\u10D5\u10D8\u10E1\u10D1\u10D8 \u10D0\u10E0 \u10D0\u10E0\u10D8\u10E1 \u10DC\u10D0\u10DE\u10DD\u10D5\u10DC\u10D8.",\r
+search_title:"\u10EB\u10D8\u10D4\u10D1\u10D0",\r
+replace_title:"\u10DB\u10DD\u10EB\u10D4\u10D1\u10DC\u10D0 \u10D3\u10D0 \u10E8\u10D4\u10EA\u10D5\u10DA\u10D0",\r
+allreplaced:"\u10E7\u10D5\u10D4\u10DA\u10D0 \u10DB\u10DC\u10D8\u10E8\u10DC\u10D4\u10DA\u10DD\u10D1\u10D0 \u10E8\u10D4\u10EA\u10D5\u10DA\u10D8\u10DA\u10D8\u10D0.",\r
+findwhat:"\u10EB\u10D4\u10D5\u10DC\u10D0",\r
+replacewith:"\u10E8\u10D4\u10EA\u10D5\u10DA\u10D0 ..",\r
+direction:"\u10DB\u10D8\u10DB\u10D0\u10E0\u10D7\u10E3\u10DA\u10D4\u10D1\u10D0",\r
+up:"\u10D6\u10D4\u10DB\u10DD\u10D7 ",\r
+down:"\u10E5\u10D5\u10D4\u10DB\u10DD\u10D7",\r
+mcase:"\u10E0\u10D4\u10D2\u10D8\u10E1\u10E2\u10E0\u10D8\u10E1 \u10D2\u10D0\u10D7\u10D5\u10D0\u10DA\u10D8\u10E1\u10EC\u10D8\u10DC\u10D4\u10D1\u10D0",\r
+findnext:"\u10D8\u10DE\u10DD\u10D5\u10DC\u10D4 \u10E8\u10D4\u10DB\u10D3\u10D4\u10D2",\r
+replace:"\u10E8\u10D4\u10EA\u10D5\u10DA\u10D0",\r
+replaceall:"\u10E7\u10D5\u10D4\u10DA\u10D0\u10E4\u10D4\u10E0\u10D8\u10E1 \u10E8\u10D4\u10EA\u10D5\u10DA\u10D0"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/no_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/no_dlg.js
new file mode 100644 (file)
index 0000000..416f617
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('no.searchreplace_dlg',{\r
+searchnext_desc:"S\u00F8k igjen",\r
+notfound:"S\u00F8ket avsluttet. Fant ikke s\u00F8kestrengen.",\r
+search_title:"S\u00F8k",\r
+replace_title:"S\u00F8k/Erstatt",\r
+allreplaced:"Alle forekomster av s\u00F8kestrengen er erstattet.",\r
+findwhat:"Finn hva",\r
+replacewith:"Erstatt med",\r
+direction:"Retning",\r
+up:"Oppover",\r
+down:"Nedover",\r
+mcase:"Skill mellom store og sm\u00E5 tegn",\r
+findnext:"Finn neste",\r
+replace:"Erstatt",\r
+replaceall:"Erstatt alt"\r
+});
\ No newline at end of file
index 394b6a6ba68076ab3f899b57baebf83e59b6996e..f220fc2210950d919e784b4b285edf11708d2b82 100755 (executable)
@@ -1,15 +1,15 @@
 tinyMCE.addI18n('pl.searchreplace_dlg',{\r
 searchnext_desc:"Znajd\u017A ponownie",\r
-notfound:"Wyszukiwanie zako\u0144czone. Poszukiwany \u0142a\u0144cuch nie zosta\u0142 znaleziony.",\r
+notfound:"Wyszukiwanie zako\u0144czone. Poszukiwany fragment nie zosta\u0142 znaleziony.",\r
 search_title:"Znajd\u017A",\r
 replace_title:"Znajd\u017A/Zamie\u0144",\r
-allreplaced:"Wszystkie wyst\u0105pienia szukanego \u0142a\u0144cucha zosta\u0142y zast\u0105pione.",\r
+allreplaced:"Wszystkie wyst\u0105pienia szukanego fragmentu zosta\u0142y zast\u0105pione.",\r
 findwhat:"Znajd\u017A...",\r
 replacewith:"Zamie\u0144 z...",\r
 direction:"Kierunek",\r
 up:"W g\u00F3r\u0119",\r
 down:"W d\u00F3\u0142",\r
-mcase:"Dopasuj case",\r
+mcase:"Dopasuj wielko\u015B\u0107 liter",\r
 findnext:"Znajd\u017A nast\u0119pny",\r
 replace:"Zamie\u0144",\r
 replaceall:"Zamien wszystko"\r
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/ps_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/ps_dlg.js
new file mode 100644 (file)
index 0000000..1895f4c
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('ps.searchreplace_dlg',{\r
+searchnext_desc:"Find again",\r
+notfound:"The search has been completed. The search string could not be found.",\r
+search_title:"Find",\r
+replace_title:"Find/Replace",\r
+allreplaced:"All occurrences of the search string were replaced.",\r
+findwhat:"Find what",\r
+replacewith:"Replace with",\r
+direction:"Direction",\r
+up:"Up",\r
+down:"Down",\r
+mcase:"Match case",\r
+findnext:"Find next",\r
+replace:"Replace",\r
+replaceall:"Replace all"\r
+});
\ No newline at end of file
index 403adb89500ff2c75966fc6e340d8abba535bf09..df9c0297ae10863fb2ec53c2e9117ab860046f6c 100755 (executable)
@@ -1,16 +1,16 @@
 tinyMCE.addI18n('pt.searchreplace_dlg',{\r
 searchnext_desc:"Localizar novamente",\r
-notfound:"Pesquisa conclu\u00EDda sem resultados.",\r
+notfound:"A pesquisa foi conclu\u00EDda sem resultados.",\r
 search_title:"Localizar",\r
 replace_title:"Localizar/substituir",\r
-allreplaced:"Todas substitui\u00E7\u00F5es foram efetuadas.",\r
+allreplaced:"Todas as substitui\u00E7\u00F5es foram efetuadas.",\r
 findwhat:"Localizar",\r
 replacewith:"Substituir com",\r
 direction:"Dire\u00E7\u00E3o",\r
 up:"Acima",\r
 down:"Abaixo",\r
-mcase:"Diferenciar mai\u00FAsculas/min\u00FAsculas",\r
-findnext:"Localizar o seguinte",\r
+mcase:"Diferenciar mai\u00FAsculas",\r
+findnext:"Localizar pr\u00F3ximo",\r
 replace:"Substituir",\r
 replaceall:"Substituir todos"\r
 });
\ No newline at end of file
index 76abeef7677625ec7056d2ce328cd6039952e9ed..b159afa2c5dd858fe4eeafaf19e36a185491576b 100755 (executable)
@@ -2,7 +2,7 @@ tinyMCE.addI18n('ro.searchreplace_dlg',{
 searchnext_desc:"Caut\u0103 din nou",\r
 notfound:"C\u0103utarea a fost terminat\u0103. Nu am g\u0103sit termenul c\u0103utat.",\r
 search_title:"Caut\u0103",\r
-replace_title:"Caut\u0103/\u00CEnlocuie\u015Fte",\r
+replace_title:"Caut\u0103/\u00EEnlocuie\u015Fte",\r
 allreplaced:"Toate instan\u0163ele termenului c\u0103utat au fost \u00EEnlocuite.",\r
 findwhat:"Termen c\u0103utat:",\r
 replacewith:"\u00CEnlocuie\u015Fte cu:",\r
index 9070407bfdb0ef74e351f7f4a89cb13e8efe78c9..b2ec4402c5dfe72ed29b3a1659d0ea41e261eb9b 100755 (executable)
@@ -1,16 +1,16 @@
 tinyMCE.addI18n('ru.searchreplace_dlg',{\r
-searchnext_desc:"\u041D\u0430\u0439\u0442\u0438 \u0441\u043D\u043E\u0432\u0430",\r
-notfound:"\u041F\u043E\u0438\u0441\u043A \u0437\u0430\u043A\u043E\u043D\u0447\u0435\u043D. \u0421\u0442\u0440\u043E\u043A\u0430 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430.",\r
-search_title:"\u041D\u0430\u0439\u0442\u0438",\r
-replace_title:"\u041D\u0430\u0439\u0442\u0438/\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C",\r
-allreplaced:"\u0412\u0441\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044E\u0449\u0438\u0435\u0441\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0431\u044B\u043B\u0438 \u0437\u0430\u043C\u0435\u043D\u0435\u043D\u044B.",\r
-findwhat:"\u0427\u0442\u043E \u043D\u0430\u0439\u0442\u0438",\r
+searchnext_desc:"\u041D\u0430\u0439\u0442\u0438 \u0435\u0449\u0435",\r
+notfound:"\u041F\u043E\u0438\u0441\u043A \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D. \u0421\u043E\u043E\u0442\u0432\u0435\u0441\u0442\u0432\u0438\u0439 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E.",\r
+search_title:"\u041F\u043E\u0438\u0441\u043A",\r
+replace_title:"\u041F\u043E\u0438\u0441\u043A \u0438 \u0437\u0430\u043C\u0435\u043D\u0430",\r
+allreplaced:"\u0412\u0441\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0431\u044B\u043B\u0438 \u0437\u0430\u043C\u0435\u043D\u0435\u043D\u044B.",\r
+findwhat:"\u041F\u043E\u0438\u0441\u043A",\r
 replacewith:"\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u043D\u0430",\r
 direction:"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435",\r
-up:"\u0412\u0432\u0435\u0440\u0445",\r
+up:"\u0412\u0432\u0435\u0440\u0445 ",\r
 down:"\u0412\u043D\u0438\u0437",\r
 mcase:"\u0423\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u0440\u0435\u0433\u0438\u0441\u0442\u0440",\r
-findnext:"\u041D\u0430\u0439\u0442\u0438 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E",\r
-replace:"\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C",\r
+findnext:"\u041D\u0430\u0439\u0442\u0438 \u0434\u0430\u043B\u0435\u0435",\r
+replace:"\u0417\u0430\u043C\u0435\u043D\u0430",\r
 replaceall:"\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435"\r
 });
\ No newline at end of file
index abf2f449a4f52ded15220e1d5b42b92fd1cedc80..eba8a3010153094e8b9eaae15c10f5e8ceab5ff0 100755 (executable)
@@ -1,16 +1,16 @@
 tinyMCE.addI18n('sk.searchreplace_dlg',{\r
-searchnext_desc:"N\u00E1jdi znova",\r
-notfound:"Vyh\u013Ead\u00E1vanie ukon\u010Den\u00E9. Re\u0165azec nemusel by\u0165 n\u00E1jden\u00FD.",\r
-search_title:"N\u00E1jdi",\r
-replace_title:"N\u00E1jdi/Nahra\u010F",\r
-allreplaced:"V\u0161etky v\u00FDskyty re\u0165azca boly zmenen\u00E9.",\r
-findwhat:"N\u00E1jdi v\u00FDraz",\r
-replacewith:"Nahra\u010F s",\r
+searchnext_desc:"H\u013Eada\u0165 \u010Falej",\r
+notfound:"H\u013Eadanie bolo dokon\u010Den\u00E9. H\u013Eadan\u00FD text nebol n\u00E1jden\u00FD.",\r
+search_title:"H\u013Eada\u0165",\r
+replace_title:"H\u013Eada\u0165 a nahradi\u0165",\r
+allreplaced:"V\u0161etky v\u00FDskyty boli nahraden\u00E9.",\r
+findwhat:"H\u013Eada\u0165 \u010Do",\r
+replacewith:"Nahradi\u0165 \u010D\u00EDm",\r
 direction:"Smer",\r
 up:"Nahor",\r
-down:"Dolu",\r
-mcase:"Presn\u00E1 zhoda",\r
-findnext:"N\u00E1jdi \u010Fal\u0161\u00ED",\r
-replace:"Nahra\u010F",\r
+down:"Nadol",\r
+mcase:"Rozli\u0161ova\u0165 mal\u00E9 a VE\u013DK\u00C9 p\u00EDsmen\u00E1",\r
+findnext:"H\u013Eada\u0165 dalej",\r
+replace:"Nahradi\u0165",\r
 replaceall:"Nahradi\u0165 v\u0161etko"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/sq_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/sq_dlg.js
new file mode 100644 (file)
index 0000000..7287d21
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('sq.searchreplace_dlg',{\r
+searchnext_desc:"K\u00EBrko p\u00EBrs\u00EBri",\r
+notfound:"K\u00EBrkimi p\u00EBrfundoi dhe nuk ktheu asnj\u00EB rezultat.",\r
+search_title:"K\u00EBrko",\r
+replace_title:"K\u00EBrko/Z\u00EBvend\u00EBso",\r
+allreplaced:"T\u00EB gjitha tekstet e gjetura u z\u00EBvend\u00EBsuan.",\r
+findwhat:"K\u00EBrko p\u00EBr",\r
+replacewith:"Z\u00EBvend\u00EBso me",\r
+direction:"Drejtimi",\r
+up:"Lart",\r
+down:"Posht\u00EB",\r
+mcase:"P\u00EBrshtat madh\u00EBsin\u00EB e g\u00EBrm\u00EBs",\r
+findnext:"K\u00EBrko tjetr\u00EBn",\r
+replace:"Z\u00EBvend\u00EBso",\r
+replaceall:"Z\u00EBv. t\u00EB gjitha"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/ta_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/ta_dlg.js
new file mode 100644 (file)
index 0000000..6dbae45
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('ta.searchreplace_dlg',{\r
+searchnext_desc:"Find again",\r
+notfound:"The search has been completed. The search string could not be found.",\r
+search_title:"Find",\r
+replace_title:"Find/Replace",\r
+allreplaced:"All occurrences of the search string were replaced.",\r
+findwhat:"Find what",\r
+replacewith:"Replace with",\r
+direction:"Direction",\r
+up:"Up",\r
+down:"Down",\r
+mcase:"Match case",\r
+findnext:"Find next",\r
+replace:"Replace",\r
+replaceall:"Replace all"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/te_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/te_dlg.js
new file mode 100644 (file)
index 0000000..5f7e35f
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('te.searchreplace_dlg',{\r
+searchnext_desc:"Find again",\r
+notfound:"The search has been completed. The search string could not be found.",\r
+search_title:"Find",\r
+replace_title:"Find/Replace",\r
+allreplaced:"All occurrences of the search string were replaced.",\r
+findwhat:"Find what",\r
+replacewith:"Replace with",\r
+direction:"Direction",\r
+up:"Up",\r
+down:"Down",\r
+mcase:"Match case",\r
+findnext:"Find next",\r
+replace:"Replace",\r
+replaceall:"Replace all"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/th_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/th_dlg.js
new file mode 100644 (file)
index 0000000..53b4eb8
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('th.searchreplace_dlg',{\r
+searchnext_desc:"\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E2D\u0E35\u0E01\u0E04\u0E23\u0E31\u0E49\u0E07",\r
+notfound:"\u0E01\u0E32\u0E23\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E2A\u0E34\u0E49\u0E19\u0E2A\u0E38\u0E14 \u0E40\u0E23\u0E32\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E2D\u0E30\u0E44\u0E23\u0E40\u0E25\u0E22",\r
+search_title:"\u0E04\u0E49\u0E19\u0E2B\u0E32",\r
+replace_title:"\u0E04\u0E49\u0E19\u0E2B\u0E32/\u0E41\u0E17\u0E19\u0E17\u0E35\u0E48",\r
+allreplaced:"\u0E17\u0E38\u0E01\u0E04\u0E33\u0E17\u0E35\u0E48\u0E43\u0E2A\u0E48\u0E16\u0E39\u0E01\u0E41\u0E17\u0E19\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27",\r
+findwhat:"\u0E04\u0E49\u0E19\u0E2B\u0E32",\r
+replacewith:"\u0E41\u0E17\u0E19\u0E17\u0E35\u0E48\u0E14\u0E49\u0E27\u0E22",\r
+direction:"\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07",\r
+up:"\u0E1A\u0E19",\r
+down:"\u0E25\u0E48\u0E32\u0E07",\r
+mcase:"\u0E40\u0E2B\u0E21\u0E37\u0E2D\u0E19\u0E17\u0E38\u0E01\u0E2D\u0E22\u0E48\u0E32\u0E07",\r
+findnext:"\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E15\u0E48\u0E2D\u0E44\u0E1B",\r
+replace:"\u0E41\u0E17\u0E19\u0E17\u0E35\u0E48",\r
+replaceall:"\u0E41\u0E17\u0E19\u0E17\u0E35\u0E48\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14"\r
+});
\ No newline at end of file
index 17c495eb2909f5d26e097d1f78e8143c3a5494f8..242b02e3ee1d44df3a650cb88180b31a34161f5f 100755 (executable)
@@ -1,15 +1,15 @@
 tinyMCE.addI18n('tr.searchreplace_dlg',{\r
 searchnext_desc:"Tekrar ara",\r
-notfound:"Arama tamamland\u0131. Aranan metin bulunamad\u0131.",\r
+notfound:"Arama tamamland\u0131. The search string could not be found.",\r
 search_title:"Bul",\r
 replace_title:"Bul/De\u011Fi\u015Ftir",\r
-allreplaced:"Aranan metin bulundu\u011Fu yerlerde de\u011Fi\u015Ftirildi.",\r
-findwhat:"Aranacak",\r
-replacewith:"De\u011Fi\u015Ftirilecek",\r
+allreplaced:"Aranan metin bulundu\u011Fu yerlede de\u011Fi\u015Ftirildi.",\r
+findwhat:"Aranan",\r
+replacewith:"Yeni de\u011Fer",\r
 direction:"Y\u00F6n",\r
 up:"Yukar\u0131",\r
 down:"A\u015Fa\u011F\u0131",\r
-mcase:"B\u00FCy\u00FCk/k\u00FC\u00E7\u00FCk harf e\u015Fle",\r
+mcase:"B\u00FCy\u00FCk/k\u00FC\u00E7\u00FCk duyarl\u0131",\r
 findnext:"Sonrakini bul",\r
 replace:"De\u011Fi\u015Ftir",\r
 replaceall:"T\u00FCm\u00FCn\u00FC de\u011Fi\u015Ftir"\r
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/tw_dlg.js b/program/js/tiny_mce/plugins/searchreplace/langs/tw_dlg.js
new file mode 100644 (file)
index 0000000..d91badc
--- /dev/null
@@ -0,0 +1,16 @@
+tinyMCE.addI18n('tw.searchreplace_dlg',{\r
+searchnext_desc:"\u518D\u5C0B\u627E\u4E00\u6B21",\r
+notfound:"\u672A\u627E\u5230\u5C0B\u627E\u9805\u3002 ",\r
+search_title:"\u5C0B\u627E",\r
+replace_title:"\u5C0B\u627E/\u53D6\u4EE3",\r
+allreplaced:"\u66F4\u65B0\u5B8C\u6210\u3002 ",\r
+findwhat:"\u5C0B\u627E\u5167\u5BB9",\r
+replacewith:"\u53D6\u4EE3\u6210",\r
+direction:"\u5C0B\u627E\u65B9\u5411",\r
+up:"\u5F80\u4E0A",\r
+down:"\u5F80\u4E0B",\r
+mcase:"\u5340\u5206\u5927\u5C0F\u5BEB",\r
+findnext:"\u4E0B\u4E00\u500B",\r
+replace:"\u53D6\u4EE3",\r
+replaceall:"\u5168\u90E8\u53D6\u4EE3"\r
+});
\ No newline at end of file
index 871984267348dc62dbd180d307b57ac305cc532c..6ff203cb1615643f8f10155c7736841c2d0a214c 100755 (executable)
@@ -1,15 +1,15 @@
 tinyMCE.addI18n('uk.searchreplace_dlg',{\r
 searchnext_desc:"\u0417\u043D\u0430\u0439\u0442\u0438 \u0449\u0435",\r
-notfound:"\u041F\u043E\u0448\u0443\u043A \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E. \u041F\u043E\u0448\u0443\u043A\u043E\u0432\u0438\u0439 \u0440\u044F\u0434\u043E \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E.",\r
-search_title:"\u0417\u043D\u0430\u0439\u0442\u0438",\r
-replace_title:"\u0417\u043D\u0430\u0439\u0442\u0438/\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438",\r
+notfound:"\u041F\u043E\u0448\u0443\u043A \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E. \u041F\u043E\u0448\u0443\u043A\u043E\u0432\u0438\u0439 \u0440\u044F\u0434\u043E\u043A \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E.",\r
+search_title:"\u0428\u0443\u043A\u0430\u0442\u0438",\r
+replace_title:"\u0428\u0443\u043A\u0430\u0442\u0438/\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438",\r
 allreplaced:"\u0412\u0441\u0456 \u0432\u0445\u043E\u0434\u0436\u0435\u043D\u043D\u044F \u0440\u044F\u0434\u043A\u0430 \u0431\u0443\u043B\u0438 \u0437\u0430\u043C\u0456\u043D\u0435\u043D\u0456.",\r
 findwhat:"\u0417\u043D\u0430\u0439\u0442\u0438",\r
 replacewith:"\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u043D\u0430",\r
-direction:"\u041D\u0430\u043F\u0440\u044F\u043C",\r
+direction:"\u041D\u0430\u043F\u0440\u044F\u043C\u043E\u043A \u043F\u043E\u0448\u0443\u043A\u0443",\r
 up:"\u0412\u0433\u043E\u0440\u0443",\r
 down:"\u0412\u043D\u0438\u0437",\r
-mcase:"\u0412\u0440\u0430\u0445\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440",\r
+mcase:"\u0412\u0440\u0430\u0445\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0440\u0435\u0454\u0441\u0442\u0440",\r
 findnext:"\u0417\u043D\u0430\u0439\u0442\u0438 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0435",\r
 replace:"\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438",\r
 replaceall:"\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u0432\u0441\u0435"\r
index 4134ee923b77e3c139ed22be92dd7cf7e85c5013..2ac3ca9646d415498c3f21d6bc88dc9f0cc2b796 100755 (executable)
@@ -1,16 +1,16 @@
 tinyMCE.addI18n('vi.searchreplace_dlg',{\r
 searchnext_desc:"T\u00ECm l\u1EA1i",\r
-notfound:"K\u1EBFt th\u00FAc t\u00ECm ki\u1EBFm. Kh\u00F4ng th\u1EC3 t\u00ECm th\u1EA5y chu\u1ED7i t\u1EEB c\u1EA7n t\u00ECm.",\r
+notfound:"Vi\u1EC7c t\u00ECm ki\u1EBFm \u0111\u00E3 ho\u00E0n th\u00E0nh. Chu\u1ED7i t\u00ECm ki\u1EBFm kh\u00F4ng \u0111\u01B0\u1EE3c t\u00ECm th\u1EA5y.",\r
 search_title:"T\u00ECm ki\u1EBFm",\r
-replace_title:"T\u00ECm ki\u1EBFm/Thay th\u1EBF",\r
-allreplaced:"\u0110\u00E3 thay th\u1EBF t\u1EA5t c\u1EA3 chu\u1ED7i t\u1EEB c\u1EA7n t\u00ECm.",\r
-findwhat:"Chu\u1ED7i t\u1EEB c\u1EA7n t\u00ECm",\r
-replacewith:"Thay th\u1EBF b\u1EB1ng chu\u1ED7i t\u1EEB",\r
-direction:"H\u01B0\u1EDBng t\u00ECm ki\u1EBFm",\r
+replace_title:"T\u00ECm/Thay th\u1EBF",\r
+allreplaced:"T\u1EA5t c\u1EA3 c\u00E1c l\u1EA7n xu\u1EA5t hi\u1EC7n c\u1EE7a c\u00E1c chu\u1ED7i t\u00ECm ki\u1EBFm \u0111\u01B0\u1EE3c thay th\u1EBF.",\r
+findwhat:"T\u00ECm ki\u1EBFm g\u00EC",\r
+replacewith:"Thay th\u1EBF v\u1EDBi",\r
+direction:"H\u01B0\u1EDBng",\r
 up:"L\u00EAn",\r
 down:"Xu\u1ED1ng",\r
-mcase:"Ph\u00E2n bi\u1EC7t ch\u1EEF hoa, ch\u1EEF th\u01B0\u1EDDng ",\r
-findnext:"Ti\u1EBFp t\u1EE5c t\u00ECm",\r
+mcase:"Theo c\u1EA3 ch\u1EEF hoa",\r
+findnext:"T\u00ECm k\u1EBF ti\u1EBFp",\r
 replace:"Thay th\u1EBF",\r
-replaceall:"Thay th\u1EBF t\u1EA5t c\u1EA3"\r
+replaceall:"Thay th\u1EBF t\u1EA5t"\r
 });
\ No newline at end of file
index 4fb64404bb6c56f4348a20c96d55a24f86c46bcf..3c36ccc8b931025b2489894f38c0f83d90d63237 100755 (executable)
@@ -1,16 +1,16 @@
 tinyMCE.addI18n('zh.searchreplace_dlg',{\r
-searchnext_desc:"\u518D\u6B21\u641C\u5BFB",\r
-notfound:"\u641C\u5BFB\u5B8C\u6BD5\uFF0C\u6CA1\u6709\u627E\u5230\u7B26\u5408\u7684\u5B57\u7B26\u4E32\u3002 ",\r
-search_title:"\u641C\u5BFB",\r
-replace_title:"\u641C\u5BFB/\u53D6\u4EE3",\r
-allreplaced:"\u6240\u6709\u7B26\u5408\u7684\u5B57\u7B26\u4E32\u5747\u5DF2\u53D6\u4EE3\u3002 ",\r
-findwhat:"\u641C\u5BFB\u76EE\u6807",\r
-replacewith:"\u53D6\u4EE3\u4E3A",\r
-direction:"\u65B9\u5411",\r
-up:"\u5411\u4E0A",\r
-down:"\u5411\u4E0B",\r
+searchnext_desc:"\u518D\u5BFB\u627E\u4E00\u6B21",\r
+notfound:"\u672A\u627E\u5230\u5BFB\u627E\u9879\u3002 ",\r
+search_title:"\u5BFB\u627E",\r
+replace_title:"\u5BFB\u627E/\u53D6\u4EE3",\r
+allreplaced:"\u66F4\u65B0\u5B8C\u6210\u3002 ",\r
+findwhat:"\u5BFB\u627E\u5185\u5BB9",\r
+replacewith:"\u53D6\u4EE3\u6210",\r
+direction:"\u5BFB\u627E\u65B9\u5411",\r
+up:"\u5F80\u4E0A",\r
+down:"\u5F80\u4E0B",\r
 mcase:"\u533A\u5206\u5927\u5C0F\u5199",\r
-findnext:"\u641C\u5BFB\u4E0B\u4E00\u4E2A",\r
+findnext:"\u4E0B\u4E00\u4E2A",\r
 replace:"\u53D6\u4EE3",\r
 replaceall:"\u5168\u90E8\u53D6\u4EE3"\r
 });
\ No newline at end of file
index 0b42486b6fc9045244c411de2a9868007c18f2bf..d0424cfc9bcc1b857f5a1cabb2ed33b2f1dd7204 100644 (file)
        </div>\r
 \r
        <div class="mceActionPanel">\r
-               <div style="float: left">\r
-                       <input type="submit" id="insert" name="insert" value="{#searchreplace_dlg.findnext}" />\r
-                       <input type="button" class="button" id="replaceBtn" name="replaceBtn" value="{#searchreplace_dlg.replace}" onclick="SearchReplaceDialog.searchNext('current');" />\r
-                       <input type="button" class="button" id="replaceAllBtn" name="replaceAllBtn" value="{#searchreplace_dlg.replaceall}" onclick="SearchReplaceDialog.searchNext('all');" />\r
-               </div>\r
-\r
-               <div style="float: right">      \r
-                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-               </div>\r
+               <input type="submit" id="insert" name="insert" value="{#searchreplace_dlg.findnext}" />\r
+               <input type="button" class="button" id="replaceBtn" name="replaceBtn" value="{#searchreplace_dlg.replace}" onclick="SearchReplaceDialog.searchNext('current');" />\r
+               <input type="button" class="button" id="replaceAllBtn" name="replaceAllBtn" value="{#searchreplace_dlg.replaceall}" onclick="SearchReplaceDialog.searchNext('all');" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
        </div>\r
 </form>\r
 </body>\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/EnchantSpell.php b/program/js/tiny_mce/plugins/spellchecker/classes/EnchantSpell.php
deleted file mode 100755 (executable)
index fb6e67c..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php\r
-/**\r
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
- *\r
- * This class was contributed by Michel Weimerskirch.\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-class EnchantSpell extends SpellChecker {\r
-       /**\r
-        * Spellchecks an array of words.\r
-        *\r
-        * @param String $lang Selected language code (like en_US or de_DE). Shortcodes like "en" and "de" work with enchant >= 1.4.1\r
-        * @param Array $words Array of words to check.\r
-        * @return Array of misspelled words.\r
-        */\r
-       function &checkWords($lang, $words) {\r
-               $r = enchant_broker_init();\r
-               \r
-               if (enchant_broker_dict_exists($r,$lang)) {\r
-                       $d = enchant_broker_request_dict($r, $lang);\r
-                       \r
-                       $returnData = array();\r
-                       foreach($words as $key => $value) {\r
-                               $correct = enchant_dict_check($d, $value);\r
-                               if(!$correct) {\r
-                                       $returnData[] = trim($value);\r
-                               }\r
-                       }\r
-       \r
-                       return $returnData;\r
-                       enchant_broker_free_dict($d);\r
-               } else {\r
-\r
-               }\r
-               enchant_broker_free($r);\r
-       }\r
-\r
-       /**\r
-        * Returns suggestions for a specific word.\r
-        *\r
-        * @param String $lang Selected language code (like en_US or de_DE). Shortcodes like "en" and "de" work with enchant >= 1.4.1\r
-        * @param String $word Specific word to get suggestions for.\r
-        * @return Array of suggestions for the specified word.\r
-        */\r
-       function &getSuggestions($lang, $word) {\r
-               $r = enchant_broker_init();\r
-               $suggs = array();\r
-\r
-               if (enchant_broker_dict_exists($r,$lang)) {\r
-                       $d = enchant_broker_request_dict($r, $lang);\r
-                       $suggs = enchant_dict_suggest($d, $word);\r
-\r
-                       enchant_broker_free_dict($d);\r
-               } else {\r
-\r
-               }\r
-               enchant_broker_free($r);\r
-\r
-               return $suggs;\r
-       }\r
-}\r
-\r
-?>\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/GoogleSpell.php b/program/js/tiny_mce/plugins/spellchecker/classes/GoogleSpell.php
deleted file mode 100755 (executable)
index d57dee7..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-<?php\r
-/**\r
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-class GoogleSpell extends SpellChecker {\r
-       /**\r
-        * Spellchecks an array of words.\r
-        *\r
-        * @param {String} $lang Language code like sv or en.\r
-        * @param {Array} $words Array of words to spellcheck.\r
-        * @return {Array} Array of misspelled words.\r
-        */\r
-       function &checkWords($lang, $words) {\r
-               $wordstr = implode(' ', $words);\r
-               $matches = $this->_getMatches($lang, $wordstr);\r
-               $words = array();\r
-\r
-               for ($i=0; $i<count($matches); $i++)\r
-                       $words[] = $this->_unhtmlentities(mb_substr($wordstr, $matches[$i][1], $matches[$i][2], "UTF-8"));\r
-\r
-               return $words;\r
-       }\r
-\r
-       /**\r
-        * Returns suggestions of for a specific word.\r
-        *\r
-        * @param {String} $lang Language code like sv or en.\r
-        * @param {String} $word Specific word to get suggestions for.\r
-        * @return {Array} Array of suggestions for the specified word.\r
-        */\r
-       function &getSuggestions($lang, $word) {\r
-               $sug = array();\r
-               $osug = array();\r
-               $matches = $this->_getMatches($lang, $word);\r
-\r
-               if (count($matches) > 0)\r
-                       $sug = explode("\t", $this->_unhtmlentities($matches[0][4]));\r
-\r
-               // Remove empty\r
-               foreach ($sug as $item) {\r
-                       if ($item)\r
-                               $osug[] = $item;\r
-               }\r
-\r
-               return $osug;\r
-       }\r
-\r
-       function &_getMatches($lang, $str) {\r
-               $server = "www.google.com";\r
-               $port = 443;\r
-               $path = "/tbproxy/spell?lang=" . $lang . "&hl=en";\r
-               $ssl = true;\r
-               \r
-               // spell check uri is configured (added by RoundCube)\r
-               if (!empty($this->_config['rpc_uri'])) {\r
-                       $a_uri = parse_url($this->_config['rpc_uri']);\r
-                       $ssl = ($a_uri['scheme']=='https' || $a_uri['scheme']=='ssl');\r
-                       $port = $a_uri['port'] ? $a_uri['port'] : ($ssl ? 443 : 80);\r
-                       $server = $a_uri['host'];\r
-                       $path = $a_uri['path'] . ($a_uri['query'] ? '?'.$a_uri['query'] : '') . $lang;\r
-               }\r
-\r
-               // Setup XML request\r
-               $xml = '<?xml version="1.0" encoding="utf-8" ?><spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1"><text>' . $str . '</text></spellrequest>';\r
-\r
-               $header  = "POST ".$path." HTTP/1.0 \r\n";\r
-               $header .= "MIME-Version: 1.0 \r\n";\r
-               $header .= "Content-type: application/PTI26 \r\n";\r
-               $header .= "Content-length: ".strlen($xml)." \r\n";\r
-               $header .= "Content-transfer-encoding: text \r\n";\r
-               $header .= "Request-number: 1 \r\n";\r
-               $header .= "Document-type: Request \r\n";\r
-               $header .= "Interface-Version: Test 1.4 \r\n";\r
-               $header .= "Connection: close \r\n\r\n";\r
-               $header .= $xml;\r
-\r
-               // Use curl if it exists\r
-               if (function_exists('curl_init')) {\r
-                       // Use curl\r
-                       $ch = curl_init();\r
-                       curl_setopt($ch, CURLOPT_URL, ($ssl ? "https://" : "http://") . $server);\r
-                       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\r
-                       curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);\r
-                       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);\r
-                       $xml = curl_exec($ch);\r
-                       curl_close($ch);\r
-               } else {\r
-                       // Use raw sockets\r
-                       $fp = fsockopen(($ssl ? "ssl://" : "") . $server, $port, $errno, $errstr, 30);\r
-                       if ($fp) {\r
-                               // Send request\r
-                               fwrite($fp, $header);\r
-\r
-                               // Read response\r
-                               $xml = "";\r
-                               while (!feof($fp))\r
-                                       $xml .= fgets($fp, 128);\r
-\r
-                               fclose($fp);\r
-                       } else\r
-                               echo "Could not open SSL connection to google.";\r
-               }\r
-\r
-               // Grab and parse content\r
-               $matches = array();\r
-               preg_match_all('/<c o="([^"]*)" l="([^"]*)" s="([^"]*)">([^<]*)<\/c>/', $xml, $matches, PREG_SET_ORDER);\r
-\r
-               return $matches;\r
-       }\r
-\r
-       function _unhtmlentities($string) {\r
-               $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);\r
-               $string = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $string);\r
-\r
-               $trans_tbl = get_html_translation_table(HTML_ENTITIES);\r
-               $trans_tbl = array_flip($trans_tbl);\r
-\r
-               return strtr($string, $trans_tbl);\r
-       }\r
-}\r
-\r
-// Patch in multibyte support\r
-if (!function_exists('mb_substr')) {\r
-       function mb_substr($str, $start, $len = '', $encoding="UTF-8"){\r
-               $limit = strlen($str);\r
-\r
-               for ($s = 0; $start > 0;--$start) {// found the real start\r
-                       if ($s >= $limit)\r
-                               break;\r
-\r
-                       if ($str[$s] <= "\x7F")\r
-                               ++$s;\r
-                       else {\r
-                               ++$s; // skip length\r
-\r
-                               while ($str[$s] >= "\x80" && $str[$s] <= "\xBF")\r
-                                       ++$s;\r
-                       }\r
-               }\r
-\r
-               if ($len == '')\r
-                       return substr($str, $s);\r
-               else\r
-                       for ($e = $s; $len > 0; --$len) {//found the real end\r
-                               if ($e >= $limit)\r
-                                       break;\r
-\r
-                               if ($str[$e] <= "\x7F")\r
-                                       ++$e;\r
-                               else {\r
-                                       ++$e;//skip length\r
-\r
-                                       while ($str[$e] >= "\x80" && $str[$e] <= "\xBF" && $e < $limit)\r
-                                               ++$e;\r
-                               }\r
-                       }\r
-\r
-               return substr($str, $s, $e - $s);\r
-       }\r
-}\r
-\r
-?>\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/PSpell.php b/program/js/tiny_mce/plugins/spellchecker/classes/PSpell.php
deleted file mode 100755 (executable)
index 6aa255c..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php\r
-/**\r
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-class PSpell extends SpellChecker {\r
-       /**\r
-        * Spellchecks an array of words.\r
-        *\r
-        * @param {String} $lang Language code like sv or en.\r
-        * @param {Array} $words Array of words to spellcheck.\r
-        * @return {Array} Array of misspelled words.\r
-        */\r
-       function &checkWords($lang, $words) {\r
-               $plink = $this->_getPLink($lang);\r
-\r
-               $outWords = array();\r
-               foreach ($words as $word) {\r
-                       if (!pspell_check($plink, trim($word)))\r
-                               $outWords[] = utf8_encode($word);\r
-               }\r
-\r
-               return $outWords;\r
-       }\r
-\r
-       /**\r
-        * Returns suggestions of for a specific word.\r
-        *\r
-        * @param {String} $lang Language code like sv or en.\r
-        * @param {String} $word Specific word to get suggestions for.\r
-        * @return {Array} Array of suggestions for the specified word.\r
-        */\r
-       function &getSuggestions($lang, $word) {\r
-               $words = pspell_suggest($this->_getPLink($lang), $word);\r
-\r
-               for ($i=0; $i<count($words); $i++)\r
-                       $words[$i] = $words[$i];\r
-\r
-               return $words;\r
-       }\r
-\r
-       /**\r
-        * Opens a link for pspell.\r
-        */\r
-       function &_getPLink($lang) {\r
-               // Check for native PSpell support\r
-               if (!function_exists("pspell_new"))\r
-                       $this->throwError("PSpell support not found in PHP installation.");\r
-\r
-               // Setup PSpell link\r
-               $plink = pspell_new(\r
-                       $lang,\r
-                       $this->_config['PSpell.spelling'],\r
-                       $this->_config['PSpell.jargon'],\r
-                       $this->_config['PSpell.encoding'],\r
-                       $this->_config['PSpell.mode']\r
-               );\r
-\r
-               // Setup PSpell link\r
-/*             if (!$plink) {\r
-                       $pspellConfig = pspell_config_create(\r
-                               $lang,\r
-                               $this->_config['PSpell.spelling'],\r
-                               $this->_config['PSpell.jargon'],\r
-                               $this->_config['PSpell.encoding']\r
-                       );\r
-\r
-                       $plink = pspell_new_config($pspell_config);\r
-               }*/\r
-\r
-               if (!$plink)\r
-                       $this->throwError("No PSpell link found opened.");\r
-\r
-               return $plink;\r
-       }\r
-}\r
-\r
-?>\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/PSpellShell.php b/program/js/tiny_mce/plugins/spellchecker/classes/PSpellShell.php
deleted file mode 100755 (executable)
index 0bc57de..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php\r
-/**\r
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-class PSpellShell extends SpellChecker {\r
-       /**\r
-        * Spellchecks an array of words.\r
-        *\r
-        * @param {String} $lang Language code like sv or en.\r
-        * @param {Array} $words Array of words to spellcheck.\r
-        * @return {Array} Array of misspelled words.\r
-        */\r
-       function &checkWords($lang, $words) {\r
-               $cmd = $this->_getCMD($lang);\r
-\r
-               if ($fh = fopen($this->_tmpfile, "w")) {\r
-                       fwrite($fh, "!\n");\r
-\r
-                       foreach($words as $key => $value)\r
-                               fwrite($fh, "^" . $value . "\n");\r
-\r
-                       fclose($fh);\r
-               } else\r
-                       $this->throwError("PSpell support was not found.");\r
-\r
-               $data = shell_exec($cmd);\r
-               @unlink($this->_tmpfile);\r
-\r
-               $returnData = array();\r
-               $dataArr = preg_split("/[\r\n]/", $data, -1, PREG_SPLIT_NO_EMPTY);\r
-\r
-               foreach ($dataArr as $dstr) {\r
-                       $matches = array();\r
-\r
-                       // Skip this line.\r
-                       if (strpos($dstr, "@") === 0)\r
-                               continue;\r
-\r
-                       preg_match("/\& ([^ ]+) .*/i", $dstr, $matches);\r
-\r
-                       if (!empty($matches[1]))\r
-                               $returnData[] = utf8_encode(trim($matches[1]));\r
-               }\r
-\r
-               return $returnData;\r
-       }\r
-\r
-       /**\r
-        * Returns suggestions of for a specific word.\r
-        *\r
-        * @param {String} $lang Language code like sv or en.\r
-        * @param {String} $word Specific word to get suggestions for.\r
-        * @return {Array} Array of suggestions for the specified word.\r
-        */\r
-       function &getSuggestions($lang, $word) {\r
-               $cmd = $this->_getCMD($lang);\r
-\r
-        if (function_exists("mb_convert_encoding"))\r
-            $word = mb_convert_encoding($word, "ISO-8859-1", mb_detect_encoding($word, "UTF-8"));\r
-        else\r
-            $word = utf8_encode($word);\r
-\r
-               if ($fh = fopen($this->_tmpfile, "w")) {\r
-                       fwrite($fh, "!\n");\r
-                       fwrite($fh, "^$word\n");\r
-                       fclose($fh);\r
-               } else\r
-                       $this->throwError("Error opening tmp file.");\r
-\r
-               $data = shell_exec($cmd);\r
-               @unlink($this->_tmpfile);\r
-\r
-               $returnData = array();\r
-               $dataArr = preg_split("/\n/", $data, -1, PREG_SPLIT_NO_EMPTY);\r
-\r
-               foreach($dataArr as $dstr) {\r
-                       $matches = array();\r
-\r
-                       // Skip this line.\r
-                       if (strpos($dstr, "@") === 0)\r
-                               continue;\r
-\r
-                       preg_match("/\&[^:]+:(.*)/i", $dstr, $matches);\r
-\r
-                       if (!empty($matches[1])) {\r
-                               $words = array_slice(explode(',', $matches[1]), 0, 10);\r
-\r
-                               for ($i=0; $i<count($words); $i++)\r
-                                       $words[$i] = trim($words[$i]);\r
-\r
-                               return $words;\r
-                       }\r
-               }\r
-\r
-               return array();\r
-       }\r
-\r
-       function _getCMD($lang) {\r
-               $this->_tmpfile = tempnam($this->_config['PSpellShell.tmp'], "tinyspell");\r
-\r
-               if(preg_match("#win#i", php_uname()))\r
-                       return $this->_config['PSpellShell.aspell'] . " -a --lang=". escapeshellarg($lang) . " --encoding=utf-8 -H < " . $this->_tmpfile . " 2>&1";\r
-\r
-               return "cat ". $this->_tmpfile ." | " . $this->_config['PSpellShell.aspell'] . " -a --encoding=utf-8 -H --lang=". escapeshellarg($lang);\r
-       }\r
-}\r
-\r
-?>\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/SpellChecker.php b/program/js/tiny_mce/plugins/spellchecker/classes/SpellChecker.php
deleted file mode 100755 (executable)
index d680039..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php\r
-/**\r
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-class SpellChecker {\r
-       /**\r
-        * Constructor.\r
-        *\r
-        * @param $config Configuration name/value array.\r
-        */\r
-       function SpellChecker(&$config) {\r
-               $this->_config = $config;\r
-       }\r
-\r
-       /**\r
-        * Simple loopback function everything that gets in will be send back.\r
-        *\r
-        * @param $args.. Arguments.\r
-        * @return {Array} Array of all input arguments. \r
-        */\r
-       function &loopback(/* args.. */) {\r
-               return func_get_args();\r
-       }\r
-\r
-       /**\r
-        * Spellchecks an array of words.\r
-        *\r
-        * @param {String} $lang Language code like sv or en.\r
-        * @param {Array} $words Array of words to spellcheck.\r
-        * @return {Array} Array of misspelled words.\r
-        */\r
-       function &checkWords($lang, $words) {\r
-               return $words;\r
-       }\r
-\r
-       /**\r
-        * Returns suggestions of for a specific word.\r
-        *\r
-        * @param {String} $lang Language code like sv or en.\r
-        * @param {String} $word Specific word to get suggestions for.\r
-        * @return {Array} Array of suggestions for the specified word.\r
-        */\r
-       function &getSuggestions($lang, $word) {\r
-               return array();\r
-       }\r
-\r
-       /**\r
-        * Throws an error message back to the user. This will stop all execution.\r
-        *\r
-        * @param {String} $str Message to send back to user.\r
-        */\r
-       function throwError($str) {\r
-               die('{"result":null,"id":null,"error":{"errstr":"' . addslashes($str) . '","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}');\r
-       }\r
-}\r
-\r
-?>\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/utils/JSON.php b/program/js/tiny_mce/plugins/spellchecker/classes/utils/JSON.php
deleted file mode 100755 (executable)
index 1c46116..0000000
+++ /dev/null
@@ -1,595 +0,0 @@
-<?php
-/**
- * $Id: JSON.php 40 2007-06-18 11:43:15Z spocke $
- *
- * @package MCManager.utils
- * @author Moxiecode
- * @copyright Copyright © 2007, Moxiecode Systems AB, All rights reserved.
- */
-
-define('JSON_BOOL', 1);
-define('JSON_INT', 2);
-define('JSON_STR', 3);
-define('JSON_FLOAT', 4);
-define('JSON_NULL', 5);
-define('JSON_START_OBJ', 6);
-define('JSON_END_OBJ', 7);
-define('JSON_START_ARRAY', 8);
-define('JSON_END_ARRAY', 9);
-define('JSON_KEY', 10);
-define('JSON_SKIP', 11);
-
-define('JSON_IN_ARRAY', 30);
-define('JSON_IN_OBJECT', 40);
-define('JSON_IN_BETWEEN', 50);
-
-class Moxiecode_JSONReader {
-       var $_data, $_len, $_pos;
-       var $_value, $_token;
-       var $_location, $_lastLocations;
-       var $_needProp;
-
-       function Moxiecode_JSONReader($data) {
-               $this->_data = $data;
-               $this->_len = strlen($data);
-               $this->_pos = -1;
-               $this->_location = JSON_IN_BETWEEN;
-               $this->_lastLocations = array();
-               $this->_needProp = false;
-       }
-
-       function getToken() {
-               return $this->_token;
-       }
-
-       function getLocation() {
-               return $this->_location;
-       }
-
-       function getTokenName() {
-               switch ($this->_token) {
-                       case JSON_BOOL:
-                               return 'JSON_BOOL';
-
-                       case JSON_INT:
-                               return 'JSON_INT';
-
-                       case JSON_STR:
-                               return 'JSON_STR';
-
-                       case JSON_FLOAT:
-                               return 'JSON_FLOAT';
-
-                       case JSON_NULL:
-                               return 'JSON_NULL';
-
-                       case JSON_START_OBJ:
-                               return 'JSON_START_OBJ';
-
-                       case JSON_END_OBJ:
-                               return 'JSON_END_OBJ';
-
-                       case JSON_START_ARRAY:
-                               return 'JSON_START_ARRAY';
-
-                       case JSON_END_ARRAY:
-                               return 'JSON_END_ARRAY';
-
-                       case JSON_KEY:
-                               return 'JSON_KEY';
-               }
-
-               return 'UNKNOWN';
-       }
-
-       function getValue() {
-               return $this->_value;
-       }
-
-       function readToken() {
-               $chr = $this->read();
-
-               if ($chr != null) {
-                       switch ($chr) {
-                               case '[':
-                                       $this->_lastLocation[] = $this->_location;
-                                       $this->_location = JSON_IN_ARRAY;
-                                       $this->_token = JSON_START_ARRAY;
-                                       $this->_value = null;
-                                       $this->readAway();
-                                       return true;
-
-                               case ']':
-                                       $this->_location = array_pop($this->_lastLocation);
-                                       $this->_token = JSON_END_ARRAY;
-                                       $this->_value = null;
-                                       $this->readAway();
-
-                                       if ($this->_location == JSON_IN_OBJECT)
-                                               $this->_needProp = true;
-
-                                       return true;
-
-                               case '{':
-                                       $this->_lastLocation[] = $this->_location;
-                                       $this->_location = JSON_IN_OBJECT;
-                                       $this->_needProp = true;
-                                       $this->_token = JSON_START_OBJ;
-                                       $this->_value = null;
-                                       $this->readAway();
-                                       return true;
-
-                               case '}':
-                                       $this->_location = array_pop($this->_lastLocation);
-                                       $this->_token = JSON_END_OBJ;
-                                       $this->_value = null;
-                                       $this->readAway();
-
-                                       if ($this->_location == JSON_IN_OBJECT)
-                                               $this->_needProp = true;
-
-                                       return true;
-
-                               // String
-                               case '"':
-                               case '\'':
-                                       return $this->_readString($chr);
-
-                               // Null
-                               case 'n':
-                                       return $this->_readNull();
-
-                               // Bool
-                               case 't':
-                               case 'f':
-                                       return $this->_readBool($chr);
-
-                               default:
-                                       // Is number
-                                       if (is_numeric($chr) || $chr == '-' || $chr == '.')
-                                               return $this->_readNumber($chr);
-
-                                       return true;
-                       }
-               }
-
-               return false;
-       }
-
-       function _readBool($chr) {
-               $this->_token = JSON_BOOL;
-               $this->_value = $chr == 't';
-
-               if ($chr == 't')
-                       $this->skip(3); // rue
-               else
-                       $this->skip(4); // alse
-
-               $this->readAway();
-
-               if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
-                       $this->_needProp = true;
-
-               return true;
-       }
-
-       function _readNull() {
-               $this->_token = JSON_NULL;
-               $this->_value = null;
-
-               $this->skip(3); // ull
-               $this->readAway();
-
-               if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
-                       $this->_needProp = true;
-
-               return true;
-       }
-
-       function _readString($quote) {
-               $output = "";
-               $this->_token = JSON_STR;
-               $endString = false;
-
-               while (($chr = $this->peek()) != -1) {
-                       switch ($chr) {
-                               case '\\':
-                                       // Read away slash
-                                       $this->read();
-
-                                       // Read escape code
-                                       $chr = $this->read();
-                                       switch ($chr) {
-                                                       case 't':
-                                                               $output .= "\t";
-                                                               break;
-
-                                                       case 'b':
-                                                               $output .= "\b";
-                                                               break;
-
-                                                       case 'f':
-                                                               $output .= "\f";
-                                                               break;
-
-                                                       case 'r':
-                                                               $output .= "\r";
-                                                               break;
-
-                                                       case 'n':
-                                                               $output .= "\n";
-                                                               break;
-
-                                                       case 'u':
-                                                               $output .= $this->_int2utf8(hexdec($this->read(4)));
-                                                               break;
-
-                                                       default:
-                                                               $output .= $chr;
-                                                               break;
-                                       }
-
-                                       break;
-
-                                       case '\'':
-                                       case '"':
-                                               if ($chr == $quote)
-                                                       $endString = true;
-
-                                               $chr = $this->read();
-                                               if ($chr != -1 && $chr != $quote)
-                                                       $output .= $chr;
-
-                                               break;
-
-                                       default:
-                                               $output .= $this->read();
-                       }
-
-                       // String terminated
-                       if ($endString)
-                               break;
-               }
-
-               $this->readAway();
-               $this->_value = $output;
-
-               // Needed a property
-               if ($this->_needProp) {
-                       $this->_token = JSON_KEY;
-                       $this->_needProp = false;
-                       return true;
-               }
-
-               if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
-                       $this->_needProp = true;
-
-               return true;
-       }
-
-       function _int2utf8($int) {
-               $int = intval($int);
-
-               switch ($int) {
-                       case 0:
-                               return chr(0);
-
-                       case ($int & 0x7F):
-                               return chr($int);
-
-                       case ($int & 0x7FF):
-                               return chr(0xC0 | (($int >> 6) & 0x1F)) . chr(0x80 | ($int & 0x3F));
-
-                       case ($int & 0xFFFF):
-                               return chr(0xE0 | (($int >> 12) & 0x0F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr (0x80 | ($int & 0x3F));
-
-                       case ($int & 0x1FFFFF):
-                               return chr(0xF0 | ($int >> 18)) . chr(0x80 | (($int >> 12) & 0x3F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr(0x80 | ($int & 0x3F));
-               }
-       }
-
-       function _readNumber($start) {
-               $value = "";
-               $isFloat = false;
-
-               $this->_token = JSON_INT;
-               $value .= $start;
-
-               while (($chr = $this->peek()) != -1) {
-                       if (is_numeric($chr) || $chr == '-' || $chr == '.') {
-                               if ($chr == '.')
-                                       $isFloat = true;
-
-                               $value .= $this->read();
-                       } else
-                               break;
-               }
-
-               $this->readAway();
-
-               if ($isFloat) {
-                       $this->_token = JSON_FLOAT;
-                       $this->_value = floatval($value);
-               } else
-                       $this->_value = intval($value);
-
-               if ($this->_location == JSON_IN_OBJECT && !$this->_needProp)
-                       $this->_needProp = true;
-
-               return true;
-       }
-
-       function readAway() {
-               while (($chr = $this->peek()) != null) {
-                       if ($chr != ':' && $chr != ',' && $chr != ' ')
-                               return;
-
-                       $this->read();
-               }
-       }
-
-       function read($len = 1) {
-               if ($this->_pos < $this->_len) {
-                       if ($len > 1) {
-                               $str = substr($this->_data, $this->_pos + 1, $len);
-                               $this->_pos += $len;
-
-                               return $str;
-                       } else
-                               return $this->_data[++$this->_pos];
-               }
-
-               return null;
-       }
-
-       function skip($len) {
-               $this->_pos += $len;
-       }
-
-       function peek() {
-               if ($this->_pos < $this->_len)
-                       return $this->_data[$this->_pos + 1];
-
-               return null;
-       }
-}
-
-/**
- * This class handles JSON stuff.
- *
- * @package MCManager.utils
- */
-class Moxiecode_JSON {
-       function Moxiecode_JSON() {
-       }
-
-       function decode($input) {
-               $reader = new Moxiecode_JSONReader($input);
-
-               return $this->readValue($reader);
-       }
-
-       function readValue(&$reader) {
-               $this->data = array();
-               $this->parents = array();
-               $this->cur =& $this->data;
-               $key = null;
-               $loc = JSON_IN_ARRAY;
-
-               while ($reader->readToken()) {
-                       switch ($reader->getToken()) {
-                               case JSON_STR:
-                               case JSON_INT:
-                               case JSON_BOOL:
-                               case JSON_FLOAT:
-                               case JSON_NULL:
-                                       switch ($reader->getLocation()) {
-                                               case JSON_IN_OBJECT:
-                                                       $this->cur[$key] = $reader->getValue();
-                                                       break;
-
-                                               case JSON_IN_ARRAY:
-                                                       $this->cur[] = $reader->getValue();
-                                                       break;
-
-                                               default:
-                                                       return $reader->getValue();
-                                       }
-                                       break;
-
-                               case JSON_KEY:
-                                       $key = $reader->getValue();
-                                       break;
-
-                               case JSON_START_OBJ:
-                               case JSON_START_ARRAY:
-                                       if ($loc == JSON_IN_OBJECT)
-                                               $this->addArray($key);
-                                       else
-                                               $this->addArray(null);
-
-                                       $cur =& $obj;
-
-                                       $loc = $reader->getLocation();
-                                       break;
-
-                               case JSON_END_OBJ:
-                               case JSON_END_ARRAY:
-                                       $loc = $reader->getLocation();
-
-                                       if (count($this->parents) > 0) {
-                                               $this->cur =& $this->parents[count($this->parents) - 1];
-                                               array_pop($this->parents);
-                                       }
-                                       break;
-                       }
-               }
-
-               return $this->data[0];
-       }
-
-       // This method was needed since PHP is crapy and doesn't have pointers/references
-       function addArray($key) {
-               $this->parents[] =& $this->cur;
-               $ar = array();
-
-               if ($key)
-                       $this->cur[$key] =& $ar;
-               else
-                       $this->cur[] =& $ar;
-
-               $this->cur =& $ar;
-       }
-
-       function getDelim($index, &$reader) {
-               switch ($reader->getLocation()) {
-                       case JSON_IN_ARRAY:
-                       case JSON_IN_OBJECT:
-                               if ($index > 0)
-                                       return ",";
-                               break;
-               }
-
-               return "";
-       }
-
-       function encode($input) {
-               switch (gettype($input)) {
-                       case 'boolean':
-                               return $input ? 'true' : 'false';
-
-                       case 'integer':
-                               return (int) $input;
-
-                       case 'float':
-                       case 'double':
-                               return (float) $input;
-
-                       case 'NULL':
-                               return 'null';
-
-                       case 'string':
-                               return $this->encodeString($input);
-
-                       case 'array':
-                               return $this->_encodeArray($input);
-
-                       case 'object':
-                               return $this->_encodeArray(get_object_vars($input));
-               }
-
-               return '';
-       }
-
-       function encodeString($input) {
-               // Needs to be escaped
-               if (preg_match('/[^a-zA-Z0-9]/', $input)) {
-                       $output = '';
-
-                       for ($i=0; $i<strlen($input); $i++) {
-                               switch ($input[$i]) {
-                                       case "\b":
-                                               $output .= "\\b";
-                                               break;
-
-                                       case "\t":
-                                               $output .= "\\t";
-                                               break;
-
-                                       case "\f":
-                                               $output .= "\\f";
-                                               break;
-
-                                       case "\r":
-                                               $output .= "\\r";
-                                               break;
-
-                                       case "\n":
-                                               $output .= "\\n";
-                                               break;
-
-                                       case '\\':
-                                               $output .= "\\\\";
-                                               break;
-
-                                       case '\'':
-                                               $output .= "\\'";
-                                               break;
-
-                                       case '"':
-                                               $output .= '\"';
-                                               break;
-
-                                       default:
-                                               $byte = ord($input[$i]);
-
-                                               if (($byte & 0xE0) == 0xC0) {
-                                                       $char = pack('C*', $byte, ord($input[$i + 1]));
-                                                       $i += 1;
-                                                       $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
-                                               } if (($byte & 0xF0) == 0xE0) {
-                                                       $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2]));
-                                                       $i += 2;
-                                                       $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
-                                               } if (($byte & 0xF8) == 0xF0) {
-                                                       $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3])));
-                                                       $i += 3;
-                                                       $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
-                                               } if (($byte & 0xFC) == 0xF8) {
-                                                       $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]), ord($input[$i + 4])));
-                                                       $i += 4;
-                                                       $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
-                                               } if (($byte & 0xFE) == 0xFC) {
-                                                       $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]), ord($input[$i + 4]), ord($input[$i + 5])));
-                                                       $i += 5;
-                                                       $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char)));
-                                               } else if ($byte < 128)
-                                                       $output .= $input[$i];
-                               }
-                       }
-
-                       return '"' . $output . '"';
-               }
-
-               return '"' . $input . '"';
-       }
-
-       function _utf82utf16($utf8) {
-               if (function_exists('mb_convert_encoding'))
-                       return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
-
-               switch (strlen($utf8)) {
-                       case 1:
-                               return $utf8;
-
-                       case 2:
-                               return chr(0x07 & (ord($utf8[0]) >> 2)) . chr((0xC0 & (ord($utf8[0]) << 6)) | (0x3F & ord($utf8[1])));
-
-                       case 3:
-                               return chr((0xF0 & (ord($utf8[0]) << 4)) | (0x0F & (ord($utf8[1]) >> 2))) . chr((0xC0 & (ord($utf8[1]) << 6)) | (0x7F & ord($utf8[2])));
-               }
-
-               return '';
-       }
-
-       function _encodeArray($input) {
-               $output = '';
-               $isIndexed = true;
-
-               $keys = array_keys($input);
-               for ($i=0; $i<count($keys); $i++) {
-                       if (!is_int($keys[$i])) {
-                               $output .= $this->encodeString($keys[$i]) . ':' . $this->encode($input[$keys[$i]]);
-                               $isIndexed = false;
-                       } else
-                               $output .= $this->encode($input[$keys[$i]]);
-
-                       if ($i != count($keys) - 1)
-                               $output .= ',';
-               }
-
-               return $isIndexed ? '[' . $output . ']' : '{' . $output . '}';
-       }
-}
-
-?>
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/utils/Logger.php b/program/js/tiny_mce/plugins/spellchecker/classes/utils/Logger.php
deleted file mode 100755 (executable)
index bc501ea..0000000
+++ /dev/null
@@ -1,268 +0,0 @@
-<?php\r
-/**\r
- * $Id: Logger.class.php 10 2007-05-27 10:55:12Z spocke $\r
- *\r
- * @package MCFileManager.filesystems\r
- * @author Moxiecode\r
- * @copyright Copyright © 2005, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-// File type contstants\r
-define('MC_LOGGER_DEBUG', 0);\r
-define('MC_LOGGER_INFO', 10);\r
-define('MC_LOGGER_WARN', 20);\r
-define('MC_LOGGER_ERROR', 30);\r
-define('MC_LOGGER_FATAL', 40);\r
-\r
-/**\r
- * Logging utility class. This class handles basic logging with levels, log rotation and custom log formats. It's\r
- * designed to be compact but still powerful and flexible.\r
- */\r
-class Moxiecode_Logger {\r
-       // Private fields\r
-       var $_path;\r
-       var $_filename;\r
-       var $_maxSize;\r
-       var $_maxFiles;\r
-       var $_maxSizeBytes;\r
-       var $_level;\r
-       var $_format;\r
-\r
-       /**\r
-        * Constructs a new logger instance.\r
-        */\r
-       function Moxiecode_Logger() {\r
-               $this->_path = "";\r
-               $this->_filename = "{level}.log";\r
-               $this->setMaxSize("100k");\r
-               $this->_maxFiles = 10;\r
-               $this->_level = MC_LOGGER_DEBUG;\r
-               $this->_format = "[{time}] [{level}] {message}";\r
-       }\r
-\r
-       /**\r
-        * Sets the current log level, use the MC_LOGGER constants.\r
-        *\r
-        * @param int $level Log level instance for example MC_LOGGER_DEBUG.\r
-        */\r
-       function setLevel($level) {\r
-               if (is_string($level)) {\r
-                       switch (strtolower($level)) {\r
-                               case "debug":\r
-                                       $level = MC_LOGGER_DEBUG;\r
-                                       break;\r
-\r
-                               case "info":\r
-                                       $level = MC_LOGGER_INFO;\r
-                                       break;\r
-\r
-                               case "warn":\r
-                               case "warning":\r
-                                       $level = MC_LOGGER_WARN;\r
-                                       break;\r
-\r
-                               case "error":\r
-                                       $level = MC_LOGGER_ERROR;\r
-                                       break;\r
-\r
-                               case "fatal":\r
-                                       $level = MC_LOGGER_FATAL;\r
-                                       break;\r
-\r
-                               default:\r
-                                       $level = MC_LOGGER_FATAL;\r
-                       }\r
-               }\r
-\r
-               $this->_level = $level;\r
-       }\r
-\r
-       /**\r
-        * Returns the current log level for example MC_LOGGER_DEBUG.\r
-        *\r
-        * @return int Current log level for example MC_LOGGER_DEBUG.\r
-        */\r
-       function getLevel() {\r
-               return $this->_level;\r
-       }\r
-\r
-       function setPath($path) {\r
-               $this->_path = $path;\r
-       }\r
-\r
-       function getPath() {\r
-               return $this->_path;\r
-       }\r
-\r
-       function setFileName($file_name) {\r
-               $this->_filename = $file_name;\r
-       }\r
-\r
-       function getFileName() {\r
-               return $this->_filename;\r
-       }\r
-\r
-       function setFormat($format) {\r
-               $this->_format = $format;\r
-       }\r
-\r
-       function getFormat() {\r
-               return $this->_format;\r
-       }\r
-\r
-       function setMaxSize($size) {\r
-               // Fix log max size\r
-               $logMaxSizeBytes = intval(preg_replace("/[^0-9]/", "", $size));\r
-\r
-               // Is KB\r
-               if (strpos((strtolower($size)), "k") > 0)\r
-                       $logMaxSizeBytes *= 1024;\r
-\r
-               // Is MB\r
-               if (strpos((strtolower($size)), "m") > 0)\r
-                       $logMaxSizeBytes *= (1024 * 1024);\r
-\r
-               $this->_maxSizeBytes = $logMaxSizeBytes;\r
-               $this->_maxSize = $size;\r
-       }\r
-\r
-       function getMaxSize() {\r
-               return $this->_maxSize;\r
-       }\r
-\r
-       function setMaxFiles($max_files) {\r
-               $this->_maxFiles = $max_files;\r
-       }\r
-\r
-       function getMaxFiles() {\r
-               return $this->_maxFiles;\r
-       }\r
-\r
-       function debug($msg) {\r
-               $args = func_get_args();\r
-               $this->_logMsg(MC_LOGGER_DEBUG, implode(', ', $args));\r
-       }\r
-\r
-       function info($msg) {\r
-               $args = func_get_args();\r
-               $this->_logMsg(MC_LOGGER_INFO, implode(', ', $args));\r
-       }\r
-\r
-       function warn($msg) {\r
-               $args = func_get_args();\r
-               $this->_logMsg(MC_LOGGER_WARN, implode(', ', $args));\r
-       }\r
-\r
-       function error($msg) {\r
-               $args = func_get_args();\r
-               $this->_logMsg(MC_LOGGER_ERROR, implode(', ', $args));\r
-       }\r
-\r
-       function fatal($msg) {\r
-               $args = func_get_args();\r
-               $this->_logMsg(MC_LOGGER_FATAL, implode(', ', $args));\r
-       }\r
-\r
-       function isDebugEnabled() {\r
-               return $this->_level >= MC_LOGGER_DEBUG;\r
-       }\r
-\r
-       function isInfoEnabled() {\r
-               return $this->_level >= MC_LOGGER_INFO;\r
-       }\r
-\r
-       function isWarnEnabled() {\r
-               return $this->_level >= MC_LOGGER_WARN;\r
-       }\r
-\r
-       function isErrorEnabled() {\r
-               return $this->_level >= MC_LOGGER_ERROR;\r
-       }\r
-\r
-       function isFatalEnabled() {\r
-               return $this->_level >= MC_LOGGER_FATAL;\r
-       }\r
-\r
-       function _logMsg($level, $message) {\r
-               $roll = false;\r
-\r
-               if ($level < $this->_level)\r
-                       return;\r
-\r
-               $logFile = $this->toOSPath($this->_path . "/" . $this->_filename);\r
-\r
-               switch ($level) {\r
-                       case MC_LOGGER_DEBUG:\r
-                               $levelName = "DEBUG";\r
-                               break;\r
-\r
-                       case MC_LOGGER_INFO:\r
-                               $levelName = "INFO";\r
-                               break;\r
-\r
-                       case MC_LOGGER_WARN:\r
-                               $levelName = "WARN";\r
-                               break;\r
-\r
-                       case MC_LOGGER_ERROR:\r
-                               $levelName = "ERROR";\r
-                               break;\r
-\r
-                       case MC_LOGGER_FATAL:\r
-                               $levelName = "FATAL";\r
-                               break;\r
-               }\r
-\r
-               $logFile = str_replace('{level}', strtolower($levelName), $logFile);\r
-\r
-               $text = $this->_format;\r
-               $text = str_replace('{time}', date("Y-m-d H:i:s"), $text);\r
-               $text = str_replace('{level}', strtolower($levelName), $text);\r
-               $text = str_replace('{message}', $message, $text);\r
-               $message = $text . "\r\n";\r
-\r
-               // Check filesize\r
-               if (file_exists($logFile)) {\r
-                       $size = @filesize($logFile);\r
-\r
-                       if ($size + strlen($message) > $this->_maxSizeBytes)\r
-                               $roll = true;\r
-               }\r
-\r
-               // Roll if the size is right\r
-               if ($roll) {\r
-                       for ($i=$this->_maxFiles-1; $i>=1; $i--) {\r
-                               $rfile = $this->toOSPath($logFile . "." . $i);\r
-                               $nfile = $this->toOSPath($logFile . "." . ($i+1));\r
-\r
-                               if (@file_exists($rfile))\r
-                                       @rename($rfile, $nfile);\r
-                       }\r
-\r
-                       @rename($logFile, $this->toOSPath($logFile . ".1"));\r
-\r
-                       // Delete last logfile\r
-                       $delfile = $this->toOSPath($logFile . "." . ($this->_maxFiles + 1));\r
-                       if (@file_exists($delfile))\r
-                               @unlink($delfile);\r
-               }\r
-\r
-               // Append log line\r
-               if (($fp = @fopen($logFile, "a")) != null) {\r
-                       @fputs($fp, $message);\r
-                       @fflush($fp);\r
-                       @fclose($fp);\r
-               }\r
-       }\r
-\r
-       /**\r
-        * Converts a Unix path to OS specific path.\r
-        *\r
-        * @param String $path Unix path to convert.\r
-        */\r
-       function toOSPath($path) {\r
-               return str_replace("/", DIRECTORY_SEPARATOR, $path);\r
-       }\r
-}\r
-\r
-?>
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/spellchecker/config.php b/program/js/tiny_mce/plugins/spellchecker/config.php
deleted file mode 100755 (executable)
index b653dc9..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php\r
-\r
-       /** start RoundCube specific code */\r
-       \r
-       define('INSTALL_PATH', preg_replace('/program[\\\\\/]js[\\\\\/].+$/', '', getcwd()));\r
-       require_once INSTALL_PATH . 'program/include/iniset.php';\r
-       \r
-       $rcmail_config = new rcube_config();\r
-       $config['general.engine'] = $rcmail_config->get('spellcheck_engine') == 'pspell' ? 'PSpell' : 'GoogleSpell';\r
-       $config['GoogleSpell.rpc_uri'] = $rcmail_config->get('spellcheck_uri');\r
-       \r
-       /** end RoundCube specific code */\r
-\r
-       // General settings\r
-       //$config['general.engine'] = 'GoogleSpell';\r
-       //$config['general.engine'] = 'PSpell';\r
-       //$config['general.engine'] = 'PSpellShell';\r
-       //$config['general.remote_rpc_url'] = 'http://some.other.site/some/url/rpc.php';\r
-\r
-       // PSpell settings\r
-       $config['PSpell.mode'] = PSPELL_FAST;\r
-       $config['PSpell.spelling'] = "";\r
-       $config['PSpell.jargon'] = "";\r
-       $config['PSpell.encoding'] = "";\r
-\r
-       // PSpellShell settings\r
-       $config['PSpellShell.mode'] = PSPELL_FAST;\r
-       $config['PSpellShell.aspell'] = '/usr/bin/aspell';\r
-       $config['PSpellShell.tmp'] = '/tmp';\r
-       \r
-       // Windows PSpellShell settings\r
-       //$config['PSpellShell.aspell'] = '"c:\Program Files\Aspell\bin\aspell.exe"';\r
-       //$config['PSpellShell.tmp'] = 'c:/temp';\r
-?>\r
index 915fc400daeafdd8797c76b35f61fe5b2225dc86..a9ec3b9cf0f777ec381ffe77cf0ec6dd98780f8e 100644 (file)
@@ -1 +1 @@
-(function(){var JSONRequest=tinymce.util.JSONRequest,each=tinymce.each,DOM=tinymce.DOM;tinymce.create('tinymce.plugins.SpellcheckerPlugin',{getInfo:function(){return{longname:'Spellchecker',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker',version:"2.0.2"};},init:function(ed,url){var t=this,cm;t.url=url;t.editor=ed;ed.addCommand('mceSpellCheck',function(){if(!t.active){ed.setProgressState(1);t._sendRPC('checkWords',[t.selectedLang,t._getWords()],function(r){if(r.length>0){t.active=1;t._markWords(r);ed.setProgressState(0);ed.nodeChanged();}else{ed.setProgressState(0);ed.windowManager.alert('spellchecker.no_mpell');}});}else t._done();});ed.onInit.add(function(){if(ed.settings.content_css!==false)ed.dom.loadCSS(url+'/css/content.css');});ed.onClick.add(t._showMenu,t);ed.onContextMenu.add(t._showMenu,t);ed.onBeforeGetContent.add(function(){if(t.active)t._removeWords();});ed.onNodeChange.add(function(ed,cm){cm.setActive('spellchecker',t.active);});ed.onSetContent.add(function(){t._done();});ed.onBeforeGetContent.add(function(){t._done();});ed.onBeforeExecCommand.add(function(ed,cmd){if(cmd=='mceFullScreen')t._done();});t.languages={};each(ed.getParam('spellchecker_languages','+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv','hash'),function(v,k){if(k.indexOf('+')===0){k=k.substring(1);t.selectedLang=v;}t.languages[k]=v;});},createControl:function(n,cm){var t=this,c,ed=t.editor;if(n=='spellchecker'){c=cm.createSplitButton(n,{title:'spellchecker.desc',cmd:'mceSpellCheck',scope:t});c.onRenderMenu.add(function(c,m){m.add({title:'spellchecker.langs','class':'mceMenuItemTitle'}).setDisabled(1);each(t.languages,function(v,k){var o={icon:1},mi;o.onclick=function(){mi.setSelected(1);t.selectedItem.setSelected(0);t.selectedItem=mi;t.selectedLang=v;};o.title=k;mi=m.add(o);mi.setSelected(v==t.selectedLang);if(v==t.selectedLang)t.selectedItem=mi;})});return c;}},_walk:function(n,f){var d=this.editor.getDoc(),w;if(d.createTreeWalker){w=d.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false);while((n=w.nextNode())!=null)f.call(this,n);}else tinymce.walk(n,f,'childNodes');},_getSeparators:function(){var re='',i,str=this.editor.getParam('spellchecker_word_separator_chars','\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}����������������\u201d\u201c');for(i=0;i<str.length;i++)re+='\\'+str.charAt(i);return re;},_getWords:function(){var ed=this.editor,wl=[],tx='',lo={};this._walk(ed.getBody(),function(n){if(n.nodeType==3)tx+=n.nodeValue+' ';});tx=tx.replace(new RegExp('([0-9]|['+this._getSeparators()+'])','g'),' ');tx=tinymce.trim(tx.replace(/(\s+)/g,' '));each(tx.split(' '),function(v){if(!lo[v]){wl.push(v);lo[v]=1;}});return wl;},_removeWords:function(w){var ed=this.editor,dom=ed.dom,se=ed.selection,b=se.getBookmark();each(dom.select('span').reverse(),function(n){if(n&&(dom.hasClass(n,'mceItemHiddenSpellWord')||dom.hasClass(n,'mceItemHidden'))){if(!w||dom.decode(n.innerHTML)==w)dom.remove(n,1);}});se.moveToBookmark(b);},_markWords:function(wl){var r1,r2,r3,r4,r5,w='',ed=this.editor,re=this._getSeparators(),dom=ed.dom,nl=[];var se=ed.selection,b=se.getBookmark();each(wl,function(v){w+=(w?'|':'')+v;});r1=new RegExp('(['+re+'])('+w+')(['+re+'])','g');r2=new RegExp('^('+w+')','g');r3=new RegExp('('+w+')(['+re+']?)$','g');r4=new RegExp('^('+w+')(['+re+']?)$','g');r5=new RegExp('('+w+')(['+re+'])','g');this._walk(this.editor.getBody(),function(n){if(n.nodeType==3){nl.push(n);}});each(nl,function(n){var v;if(n.nodeType==3){v=n.nodeValue;if(r1.test(v)||r2.test(v)||r3.test(v)||r4.test(v)){v=dom.encode(v);v=v.replace(r5,'<span class="mceItemHiddenSpellWord">$1</span>$2');v=v.replace(r3,'<span class="mceItemHiddenSpellWord">$1</span>$2');dom.replace(dom.create('span',{'class':'mceItemHidden'},v),n);}}});se.moveToBookmark(b);},_showMenu:function(ed,e){var t=this,ed=t.editor,m=t._menu,p1,dom=ed.dom,vp=dom.getViewPort(ed.getWin());if(!m){p1=DOM.getPos(ed.getContentAreaContainer());m=ed.controlManager.createDropMenu('spellcheckermenu',{offset_x:p1.x,offset_y:p1.y,'class':'mceNoIcons'});t._menu=m;}if(dom.hasClass(e.target,'mceItemHiddenSpellWord')){m.removeAll();m.add({title:'spellchecker.wait','class':'mceMenuItemTitle'}).setDisabled(1);t._sendRPC('getSuggestions',[t.selectedLang,dom.decode(e.target.innerHTML)],function(r){m.removeAll();if(r.length>0){m.add({title:'spellchecker.sug','class':'mceMenuItemTitle'}).setDisabled(1);each(r,function(v){m.add({title:v,onclick:function(){dom.replace(ed.getDoc().createTextNode(v),e.target);t._checkDone();}});});m.addSeparator();}else m.add({title:'spellchecker.no_sug','class':'mceMenuItemTitle'}).setDisabled(1);m.add({title:'spellchecker.ignore_word',onclick:function(){dom.remove(e.target,1);t._checkDone();}});m.add({title:'spellchecker.ignore_words',onclick:function(){t._removeWords(dom.decode(e.target.innerHTML));t._checkDone();}});m.update();});ed.selection.select(e.target);p1=dom.getPos(e.target);m.showMenu(p1.x,p1.y+e.target.offsetHeight-vp.y);return tinymce.dom.Event.cancel(e);}else m.hideMenu();},_checkDone:function(){var t=this,ed=t.editor,dom=ed.dom,o;each(dom.select('span'),function(n){if(n&&dom.hasClass(n,'mceItemHiddenSpellWord')){o=true;return false;}});if(!o)t._done();},_done:function(){var t=this,la=t.active;if(t.active){t.active=0;t._removeWords();if(t._menu)t._menu.hideMenu();if(la)t.editor.nodeChanged();}},_sendRPC:function(m,p,cb){var t=this,url=t.editor.getParam("spellchecker_rpc_url",this.url+'/rpc.php');if(url=='{backend}'){t.editor.setProgressState(0);alert('Please specify: spellchecker_rpc_url');return;}JSONRequest.sendRPC({url:url,method:m,params:p,success:cb,error:function(e,x){t.editor.setProgressState(0);t.editor.windowManager.alert(e.errstr||('Error response: '+x.responseText));}});}});tinymce.PluginManager.add('spellchecker',tinymce.plugins.SpellcheckerPlugin);})();
\ No newline at end of file
+(function(){var a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.SpellcheckerPlugin",{getInfo:function(){return{longname:"Spellchecker",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minorVersion}},init:function(e,f){var g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url","{backend}");if(g.rpcUrl=="{backend}"){if(tinymce.isIE){return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active){return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}"){g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active){e.setProgressState(1);g._sendRPC("checkWords",[g.selectedLang,g._getWords()],function(h){if(h.length>0){g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgressState(0);if(e.getParam("spellchecker_report_no_misspellings",true)){e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});e.onInit.add(function(){if(e.settings.content_css!==false){e.dom.loadCSS(f+"/css/content.css")}});e.onClick.add(g._showMenu,g);e.onContextMenu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active){g._removeWords()}});e.onNodeChange.add(function(i,h){h.setActive("spellchecker",g.active)});e.onSetContent.add(function(){g._done()});e.onBeforeGetContent.add(function(){g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen"){g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0){h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d){var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}"){if(f.hasSupport){g=d.createButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return g}g=d.createSplitButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(function(j,i){i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);c(f.languages,function(n,m){var p={icon:1},l;p.onclick=function(){l.setSelected(1);f.selectedItem.setSelected(0);f.selectedItem=l;f.selectedLang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);if(n==f.selectedLang){f.selectedItem=l}})});return g}},_walk:function(i,g){var h=this.editor.getDoc(),e;if(h.createTreeWalker){e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!=null){g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function(){var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$%&()*+,-./:;<=>?@[]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c');for(d=0;d<f.length;d++){e+="\\"+f.charAt(d)}return e},_getWords:function(){var e=this.editor,g=[],d="",f={},h=[];this._walk(e.getBody(),function(i){if(i.nodeType==3){d+=i.nodeValue+" "}});if(e.getParam("spellchecker_word_pattern")){h=d.match("("+e.getParam("spellchecker_word_pattern")+")","gi")}else{d=d.replace(new RegExp("([0-9]|["+this._getSeparators()+"])","g")," ");d=tinymce.trim(d.replace(/(\s+)/g," "));h=d.split(" ")}c(h,function(i){if(!f[i]){g.push(i);f[i]=1}});return g},_removeWords:function(e){var f=this.editor,h=f.dom,g=f.selection,d=g.getBookmark();c(h.select("span").reverse(),function(i){if(i&&(h.hasClass(i,"mceItemHiddenSpellWord")||h.hasClass(i,"mceItemHidden"))){if(!e||h.decode(i.innerHTML)==e){h.remove(i,1)}}});g.moveToBookmark(d)},_markWords:function(o){var i,h,g,f,e,n="",k=this.editor,p=this._getSeparators(),j=k.dom,d=[];var l=k.selection,m=l.getBookmark();c(o,function(q){n+=(n?"|":"")+q});i=new RegExp("(["+p+"])("+n+")(["+p+"])","g");h=new RegExp("^("+n+")","g");g=new RegExp("("+n+")(["+p+"]?)$","g");f=new RegExp("^("+n+")(["+p+"]?)$","g");e=new RegExp("("+n+")(["+p+"])","g");this._walk(this.editor.getBody(),function(q){if(q.nodeType==3){d.push(q)}});c(d,function(r){var q;if(r.nodeType==3){q=r.nodeValue;if(i.test(q)||h.test(q)||g.test(q)||f.test(q)){q=j.encode(q);q=q.replace(e,'<span class="mceItemHiddenSpellWord">$1</span>$2');q=q.replace(g,'<span class="mceItemHiddenSpellWord">$1</span>$2');j.replace(j.create("span",{"class":"mceItemHidden"},q),r)}}});l.moveToBookmark(m)},_showMenu:function(h,j){var i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if(!d){l=b.getPos(h.getContentAreaContainer());d=h.controlManager.createDropMenu("spellcheckermenu",{offset_x:l.x,offset_y:l.y,"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord")){d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDisabled(1);i._sendRPC("getSuggestions",[i.selectedLang,k.decode(f.innerHTML)],function(m){var e;d.removeAll();if(m.length>0){d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,function(n){d.add({title:n,onclick:function(){k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}else{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}e=i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.ignore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:function(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});if(i.editor.getParam("spellchecker_enable_learn_rpc")){d.add({title:"spellchecker.learn_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}})}d.update()});h.selection.select(f);l=k.getPos(f);d.showMenu(l.x,l.y+f.offsetHeight-g.y);return tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h){if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f){e._done()}},_done:function(){var d=this,e=d.active;if(d.active){d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e){d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h){f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error response: "+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.SpellcheckerPlugin)})();
\ No newline at end of file
index 84a9989f63ca2b8fe92b8d8082d8fd14848bfd00..d8680baf2cdfac60b4dc0e8624713aebdf7401f6 100644 (file)
@@ -1,8 +1,11 @@
 /**\r
- * $Id: editor_plugin_src.js 425 2007-11-21 15:17:39Z spocke $\r
+ * editor_plugin_src.js\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 (function() {\r
@@ -15,7 +18,7 @@
                                author : 'Moxiecode Systems AB',\r
                                authorurl : 'http://tinymce.moxiecode.com',\r
                                infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker',\r
-                               version : "2.0.2"\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
                        };\r
                },\r
 \r
 \r
                        t.url = url;\r
                        t.editor = ed;\r
+                       t.rpcUrl = ed.getParam("spellchecker_rpc_url", "{backend}");\r
+\r
+                       if (t.rpcUrl == '{backend}') {\r
+                               // Sniff if the browser supports native spellchecking (Don't know of a better way)\r
+                               if (tinymce.isIE)\r
+                                       return;\r
+\r
+                               t.hasSupport = true;\r
+\r
+                               // Disable the context menu when spellchecking is active\r
+                               ed.onContextMenu.addToTop(function(ed, e) {\r
+                                       if (t.active)\r
+                                               return false;\r
+                               });\r
+                       }\r
 \r
                        // Register commands\r
                        ed.addCommand('mceSpellCheck', function() {\r
+                               if (t.rpcUrl == '{backend}') {\r
+                                       // Enable/disable native spellchecker\r
+                                       t.editor.getBody().spellcheck = t.active = !t.active;\r
+                                       return;\r
+                               }\r
+\r
                                if (!t.active) {\r
                                        ed.setProgressState(1);\r
                                        t._sendRPC('checkWords', [t.selectedLang, t._getWords()], function(r) {\r
@@ -37,7 +61,9 @@
                                                        ed.nodeChanged();\r
                                                } else {\r
                                                        ed.setProgressState(0);\r
-                                                       ed.windowManager.alert('spellchecker.no_mpell');\r
+\r
+                                                       if (ed.getParam('spellchecker_report_no_misspellings', true))\r
+                                                               ed.windowManager.alert('spellchecker.no_mpell');\r
                                                }\r
                                        });\r
                                } else\r
                        var t = this, c, ed = t.editor;\r
 \r
                        if (n == 'spellchecker') {\r
+                               // Use basic button if we use the native spellchecker\r
+                               if (t.rpcUrl == '{backend}') {\r
+                                       // Create simple toggle button if we have native support\r
+                                       if (t.hasSupport)\r
+                                               c = cm.createButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t});\r
+\r
+                                       return c;\r
+                               }\r
+\r
                                c = cm.createSplitButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t});\r
 \r
                                c.onRenderMenu.add(function(c, m) {\r
                },\r
 \r
                _getWords : function() {\r
-                       var ed = this.editor, wl = [], tx = '', lo = {};\r
+                       var ed = this.editor, wl = [], tx = '', lo = {}, rawWords = [];\r
 \r
                        // Get area text\r
                        this._walk(ed.getBody(), function(n) {\r
                                        tx += n.nodeValue + ' ';\r
                        });\r
 \r
-                       // Split words by separator\r
-                       tx = tx.replace(new RegExp('([0-9]|[' + this._getSeparators() + '])', 'g'), ' ');\r
-                       tx = tinymce.trim(tx.replace(/(\s+)/g, ' '));\r
+                       // split the text up into individual words\r
+                       if (ed.getParam('spellchecker_word_pattern')) {\r
+                               // look for words that match the pattern\r
+                               rawWords = tx.match('(' + ed.getParam('spellchecker_word_pattern') + ')', 'gi');\r
+                       } else {\r
+                               // Split words by separator\r
+                               tx = tx.replace(new RegExp('([0-9]|[' + this._getSeparators() + '])', 'g'), ' ');\r
+                               tx = tinymce.trim(tx.replace(/(\s+)/g, ' '));\r
+                               rawWords = tx.split(' ');\r
+                       }\r
 \r
                        // Build word array and remove duplicates\r
-                       each(tx.split(' '), function(v) {\r
+                       each(rawWords, function(v) {\r
                                if (!lo[v]) {\r
                                        wl.push(v);\r
                                        lo[v] = 1;\r
                },\r
 \r
                _showMenu : function(ed, e) {\r
-                       var t = this, ed = t.editor, m = t._menu, p1, dom = ed.dom, vp = dom.getViewPort(ed.getWin());\r
+                       var t = this, ed = t.editor, m = t._menu, p1, dom = ed.dom, vp = dom.getViewPort(ed.getWin()), wordSpan = e.target;\r
+\r
+                       e = 0; // Fixes IE memory leak\r
 \r
                        if (!m) {\r
                                p1 = DOM.getPos(ed.getContentAreaContainer());\r
                                t._menu = m;\r
                        }\r
 \r
-                       if (dom.hasClass(e.target, 'mceItemHiddenSpellWord')) {\r
+                       if (dom.hasClass(wordSpan, 'mceItemHiddenSpellWord')) {\r
                                m.removeAll();\r
                                m.add({title : 'spellchecker.wait', 'class' : 'mceMenuItemTitle'}).setDisabled(1);\r
 \r
-                               t._sendRPC('getSuggestions', [t.selectedLang, dom.decode(e.target.innerHTML)], function(r) {\r
+                               t._sendRPC('getSuggestions', [t.selectedLang, dom.decode(wordSpan.innerHTML)], function(r) {\r
+                                       var ignoreRpc;\r
+\r
                                        m.removeAll();\r
 \r
                                        if (r.length > 0) {\r
                                                m.add({title : 'spellchecker.sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);\r
                                                each(r, function(v) {\r
                                                        m.add({title : v, onclick : function() {\r
-                                                               dom.replace(ed.getDoc().createTextNode(v), e.target);\r
+                                                               dom.replace(ed.getDoc().createTextNode(v), wordSpan);\r
                                                                t._checkDone();\r
                                                        }});\r
                                                });\r
                                        } else\r
                                                m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);\r
 \r
+                                       ignoreRpc = t.editor.getParam("spellchecker_enable_ignore_rpc", '');\r
                                        m.add({\r
                                                title : 'spellchecker.ignore_word',\r
                                                onclick : function() {\r
-                                                       dom.remove(e.target, 1);\r
+                                                       var word = wordSpan.innerHTML;\r
+\r
+                                                       dom.remove(wordSpan, 1);\r
                                                        t._checkDone();\r
+\r
+                                                       // tell the server if we need to\r
+                                                       if (ignoreRpc) {\r
+                                                               ed.setProgressState(1);\r
+                                                               t._sendRPC('ignoreWord', [t.selectedLang, word], function(r) {\r
+                                                                       ed.setProgressState(0);\r
+                                                               });\r
+                                                       }\r
                                                }\r
                                        });\r
 \r
                                        m.add({\r
                                                title : 'spellchecker.ignore_words',\r
                                                onclick : function() {\r
-                                                       t._removeWords(dom.decode(e.target.innerHTML));\r
+                                                       var word = wordSpan.innerHTML;\r
+\r
+                                                       t._removeWords(dom.decode(word));\r
                                                        t._checkDone();\r
+\r
+                                                       // tell the server if we need to\r
+                                                       if (ignoreRpc) {\r
+                                                               ed.setProgressState(1);\r
+                                                               t._sendRPC('ignoreWords', [t.selectedLang, word], function(r) {\r
+                                                                       ed.setProgressState(0);\r
+                                                               });\r
+                                                       }\r
                                                }\r
                                        });\r
 \r
+\r
+                                       if (t.editor.getParam("spellchecker_enable_learn_rpc")) {\r
+                                               m.add({\r
+                                                       title : 'spellchecker.learn_word',\r
+                                                       onclick : function() {\r
+                                                               var word = wordSpan.innerHTML;\r
+\r
+                                                               dom.remove(wordSpan, 1);\r
+                                                               t._checkDone();\r
+\r
+                                                               ed.setProgressState(1);\r
+                                                               t._sendRPC('learnWord', [t.selectedLang, word], function(r) {\r
+                                                                       ed.setProgressState(0);\r
+                                                               });\r
+                                                       }\r
+                                               });\r
+                                       }\r
+\r
                                        m.update();\r
                                });\r
 \r
-                               ed.selection.select(e.target);\r
-                               p1 = dom.getPos(e.target);\r
-                               m.showMenu(p1.x, p1.y + e.target.offsetHeight - vp.y);\r
+                               ed.selection.select(wordSpan);\r
+                               p1 = dom.getPos(wordSpan);\r
+                               m.showMenu(p1.x, p1.y + wordSpan.offsetHeight - vp.y);\r
 \r
                                return tinymce.dom.Event.cancel(e);\r
                        } else\r
                },\r
 \r
                _sendRPC : function(m, p, cb) {\r
-                       var t = this, url = t.editor.getParam("spellchecker_rpc_url", this.url+'/rpc.php');\r
-\r
-                       if (url == '{backend}') {\r
-                               t.editor.setProgressState(0);\r
-                               alert('Please specify: spellchecker_rpc_url');\r
-                               return;\r
-                       }\r
+                       var t = this;\r
 \r
                        JSONRequest.sendRPC({\r
-                               url : url,\r
+                               url : t.rpcUrl,\r
                                method : m,\r
                                params : p,\r
                                success : cb,\r
 \r
        // Register plugin\r
        tinymce.PluginManager.add('spellchecker', tinymce.plugins.SpellcheckerPlugin);\r
-})();
\ No newline at end of file
+})();\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/includes/general.php b/program/js/tiny_mce/plugins/spellchecker/includes/general.php
deleted file mode 100755 (executable)
index 9a12145..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-/**
- * general.php
- *
- * @package MCManager.includes
- * @author Moxiecode
- * @copyright Copyright © 2007, Moxiecode Systems AB, All rights reserved.
- */
-
-@error_reporting(E_ALL ^ E_NOTICE);
-$config = array();
-
-require_once(dirname(__FILE__) . "/../classes/utils/Logger.php");
-require_once(dirname(__FILE__) . "/../classes/utils/JSON.php");
-require_once(dirname(__FILE__) . "/../config.php");
-require_once(dirname(__FILE__) . "/../classes/SpellChecker.php");
-
-if (isset($config['general.engine']))
-       require_once(dirname(__FILE__) . "/../classes/" . $config["general.engine"] . ".php");
-
-/**
- * Returns an request value by name without magic quoting.
- *
- * @param String $name Name of parameter to get.
- * @param String $default_value Default value to return if value not found.
- * @return String request value by name without magic quoting or default value.
- */
-function getRequestParam($name, $default_value = false, $sanitize = false) {
-       if (!isset($_REQUEST[$name]))
-               return $default_value;
-
-       if (is_array($_REQUEST[$name])) {
-               $newarray = array();
-
-               foreach ($_REQUEST[$name] as $name => $value)
-                       $newarray[formatParam($name, $sanitize)] = formatParam($value, $sanitize);
-
-               return $newarray;
-       }
-
-       return formatParam($_REQUEST[$name], $sanitize);
-}
-
-function &getLogger() {
-       global $mcLogger, $man;
-
-       if (isset($man))
-               $mcLogger = $man->getLogger();
-
-       if (!$mcLogger) {
-               $mcLogger = new Moxiecode_Logger();
-
-               // Set logger options
-               $mcLogger->setPath(dirname(__FILE__) . "/../logs");
-               $mcLogger->setMaxSize("100kb");
-               $mcLogger->setMaxFiles("10");
-               $mcLogger->setFormat("{time} - {message}");
-       }
-
-       return $mcLogger;
-}
-
-function debug($msg) {
-       $args = func_get_args();
-
-       $log = getLogger();
-       $log->debug(implode(', ', $args));
-}
-
-function info($msg) {
-       $args = func_get_args();
-
-       $log = getLogger();
-       $log->info(implode(', ', $args));
-}
-
-function error($msg) {
-       $args = func_get_args();
-
-       $log = getLogger();
-       $log->error(implode(', ', $args));
-}
-
-function warn($msg) {
-       $args = func_get_args();
-
-       $log = getLogger();
-       $log->warn(implode(', ', $args));
-}
-
-function fatal($msg) {
-       $args = func_get_args();
-
-       $log = getLogger();
-       $log->fatal(implode(', ', $args));
-}
-
-?>
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/spellchecker/rpc.php b/program/js/tiny_mce/plugins/spellchecker/rpc.php
deleted file mode 100755 (executable)
index a0072ae..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php\r
-/**\r
- * $Id: rpc.php 822 2008-04-28 13:45:03Z spocke $\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-require_once("./includes/general.php");\r
-\r
-// Set RPC response headers\r
-header('Content-Type: text/plain');\r
-header('Content-Encoding: UTF-8');\r
-header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");\r
-header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");\r
-header("Cache-Control: no-store, no-cache, must-revalidate");\r
-header("Cache-Control: post-check=0, pre-check=0", false);\r
-header("Pragma: no-cache");\r
-\r
-$raw = "";\r
-\r
-// Try param\r
-if (isset($_POST["json_data"]))\r
-       $raw = getRequestParam("json_data");\r
-\r
-// Try globals array\r
-if (!$raw && isset($_GLOBALS) && isset($_GLOBALS["HTTP_RAW_POST_DATA"]))\r
-       $raw = $_GLOBALS["HTTP_RAW_POST_DATA"];\r
-\r
-// Try globals variable\r
-if (!$raw && isset($HTTP_RAW_POST_DATA))\r
-       $raw = $HTTP_RAW_POST_DATA;\r
-\r
-// Try stream\r
-if (!$raw) {\r
-       if (!function_exists('file_get_contents')) {\r
-               $fp = fopen("php://input", "r");\r
-               if ($fp) {\r
-                       $raw = "";\r
-\r
-                       while (!feof($fp))\r
-                               $raw = fread($fp, 1024);\r
-\r
-                       fclose($fp);\r
-               }\r
-       } else\r
-               $raw = "" . file_get_contents("php://input");\r
-}\r
-\r
-// No input data\r
-if (!$raw)\r
-       die('{"result":null,"id":null,"error":{"errstr":"Could not get raw post data.","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}');\r
-\r
-// Passthrough request to remote server\r
-if (isset($config['general.remote_rpc_url'])) {\r
-       $url = parse_url($config['general.remote_rpc_url']);\r
-\r
-       // Setup request\r
-       $req = "POST " . $url["path"] . " HTTP/1.0\r\n";\r
-       $req .= "Connection: close\r\n";\r
-       $req .= "Host: " . $url['host'] . "\r\n";\r
-       $req .= "Content-Length: " . strlen($raw) . "\r\n";\r
-       $req .= "\r\n" . $raw;\r
-\r
-       if (!isset($url['port']) || !$url['port'])\r
-               $url['port'] = 80;\r
-\r
-       $errno = $errstr = "";\r
-\r
-       $socket = fsockopen($url['host'], intval($url['port']), $errno, $errstr, 30);\r
-       if ($socket) {\r
-               // Send request headers\r
-               fputs($socket, $req);\r
-\r
-               // Read response headers and data\r
-               $resp = "";\r
-               while (!feof($socket))\r
-                               $resp .= fgets($socket, 4096);\r
-\r
-               fclose($socket);\r
-\r
-               // Split response header/data\r
-               $resp = explode("\r\n\r\n", $resp);\r
-               echo $resp[1]; // Output body\r
-       }\r
-\r
-       die();\r
-}\r
-\r
-// Get JSON data\r
-$json = new Moxiecode_JSON();\r
-$input = $json->decode($raw);\r
-\r
-// Execute RPC\r
-if (isset($config['general.engine'])) {\r
-       $spellchecker = new $config['general.engine']($config);\r
-       $result = call_user_func_array(array($spellchecker, $input['method']), $input['params']);\r
-} else\r
-       die('{"result":null,"id":null,"error":{"errstr":"You must choose an spellchecker engine in the config.php file.","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}');\r
-\r
-// Request and response id should always be the same\r
-$output = array(\r
-       "id" => $input->id,\r
-       "result" => $result,\r
-       "error" => null\r
-);\r
-\r
-// Return JSON encoded string\r
-echo $json->encode($output);\r
-\r
-?>
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/tabfocus/editor_plugin.js b/program/js/tiny_mce/plugins/tabfocus/editor_plugin.js
new file mode 100644 (file)
index 0000000..27d2440
--- /dev/null
@@ -0,0 +1 @@
+(function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.explode;tinymce.create("tinymce.plugins.TabFocusPlugin",{init:function(f,g){function e(i,j){if(j.keyCode===9){return a.cancel(j)}}function h(l,p){var j,m,o,n,k;function q(i){o=c.getParent(l.id,"form");n=o.elements;if(o){d(n,function(s,r){if(s.id==l.id){j=r;return false}});if(i>0){for(m=j+1;m<n.length;m++){if(n[m].type!="hidden"){return n[m]}}}else{for(m=j-1;m>=0;m--){if(n[m].type!="hidden"){return n[m]}}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(l=tinymce.get(n.id||n.name)){l.focus()}else{window.setTimeout(function(){window.focus();n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}f.onInit.add(function(){d(c.select("a:first,a:last",f.getContainer()),function(i){a.add(i,"focus",function(){f.focus()})})})},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/tabfocus/editor_plugin_src.js b/program/js/tiny_mce/plugins/tabfocus/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..c2be2f4
--- /dev/null
@@ -0,0 +1,112 @@
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode;\r
+\r
+       tinymce.create('tinymce.plugins.TabFocusPlugin', {\r
+               init : function(ed, url) {\r
+                       function tabCancel(ed, e) {\r
+                               if (e.keyCode === 9)\r
+                                       return Event.cancel(e);\r
+                       };\r
+\r
+                       function tabHandler(ed, e) {\r
+                               var x, i, f, el, v;\r
+\r
+                               function find(d) {\r
+                                       f = DOM.getParent(ed.id, 'form');\r
+                                       el = f.elements;\r
+\r
+                                       if (f) {\r
+                                               each(el, function(e, i) {\r
+                                                       if (e.id == ed.id) {\r
+                                                               x = i;\r
+                                                               return false;\r
+                                                       }\r
+                                               });\r
+\r
+                                               if (d > 0) {\r
+                                                       for (i = x + 1; i < el.length; i++) {\r
+                                                               if (el[i].type != 'hidden')\r
+                                                                       return el[i];\r
+                                                       }\r
+                                               } else {\r
+                                                       for (i = x - 1; i >= 0; i--) {\r
+                                                               if (el[i].type != 'hidden')\r
+                                                                       return el[i];\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       return null;\r
+                               };\r
+\r
+                               if (e.keyCode === 9) {\r
+                                       v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next')));\r
+\r
+                                       if (v.length == 1) {\r
+                                               v[1] = v[0];\r
+                                               v[0] = ':prev';\r
+                                       }\r
+\r
+                                       // Find element to focus\r
+                                       if (e.shiftKey) {\r
+                                               if (v[0] == ':prev')\r
+                                                       el = find(-1);\r
+                                               else\r
+                                                       el = DOM.get(v[0]);\r
+                                       } else {\r
+                                               if (v[1] == ':next')\r
+                                                       el = find(1);\r
+                                               else\r
+                                                       el = DOM.get(v[1]);\r
+                                       }\r
+\r
+                                       if (el) {\r
+                                               if (ed = tinymce.get(el.id || el.name))\r
+                                                       ed.focus();\r
+                                               else\r
+                                                       window.setTimeout(function() {window.focus();el.focus();}, 10);\r
+\r
+                                               return Event.cancel(e);\r
+                                       }\r
+                               }\r
+                       };\r
+\r
+                       ed.onKeyUp.add(tabCancel);\r
+\r
+                       if (tinymce.isGecko) {\r
+                               ed.onKeyPress.add(tabHandler);\r
+                               ed.onKeyDown.add(tabCancel);\r
+                       } else\r
+                               ed.onKeyDown.add(tabHandler);\r
+\r
+                       ed.onInit.add(function() {\r
+                               each(DOM.select('a:first,a:last', ed.getContainer()), function(n) {\r
+                                       Event.add(n, 'focus', function() {ed.focus();});\r
+                               });\r
+                       });\r
+               },\r
+\r
+               getInfo : function() {\r
+                       return {\r
+                               longname : 'Tabfocus',\r
+                               author : 'Moxiecode Systems AB',\r
+                               authorurl : 'http://tinymce.moxiecode.com',\r
+                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus',\r
+                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+                       };\r
+               }\r
+       });\r
+\r
+       // Register plugin\r
+       tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin);\r
+})();
\ No newline at end of file
index 1fabc8dc211e19c2a6243498894f69d382112498..d243e1d833541b6a29e2600cbcd031f68ef01a3a 100644 (file)
                                </select>\r
                        </div>\r
 \r
-                       <div style="float: left">\r
-                               <div><input type="submit" id="insert" name="insert" value="{#update}" /></div>\r
-                       </div>\r
-\r
-                       <div style="float: right">\r
-                               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-                       </div>\r
+                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
                </div>\r
        </form>\r
 </body>\r
index 95d599e90b2c8f3215769d7854028ce4a6347d36..266d7d5371de3b9b773b7a162c0a36eeef04a89e 100644 (file)
@@ -1 +1 @@
-(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.TablePlugin",{init:function(b,c){var d=this;d.editor=b;d.url=c;a([["table","table.desc","mceInsertTable",true],["delete_table","table.del","mceTableDelete"],["delete_col","table.delete_col_desc","mceTableDeleteCol"],["delete_row","table.delete_row_desc","mceTableDeleteRow"],["col_after","table.col_after_desc","mceTableInsertColAfter"],["col_before","table.col_before_desc","mceTableInsertColBefore"],["row_after","table.row_after_desc","mceTableInsertRowAfter"],["row_before","table.row_before_desc","mceTableInsertRowBefore"],["row_props","table.row_desc","mceTableRowProps",true],["cell_props","table.cell_desc","mceTableCellProps",true],["split_cells","table.split_cells_desc","mceTableSplitCells",true],["merge_cells","table.merge_cells_desc","mceTableMergeCells",true]],function(e){b.addButton(e[0],{title:e[1],cmd:e[2],ui:e[3]})});if(b.getParam("inline_styles")){b.onPreProcess.add(function(e,g){var f=e.dom;a(f.select("table",g.node),function(i){var h;if(h=f.getAttrib(i,"width")){f.setStyle(i,"width",h);f.setAttrib(i,"width")}if(h=f.getAttrib(i,"height")){f.setStyle(i,"height",h);f.setAttrib(i,"height")}})})}b.onInit.add(function(){if(b&&b.plugins.contextmenu){b.plugins.contextmenu.onContextMenu.add(function(h,f,j){var k,i=b.selection,g=i.getNode()||b.getBody();if(b.dom.getParent(j,"td")||b.dom.getParent(j,"th")){f.removeAll();if(g.nodeName=="A"&&!b.dom.getAttrib(g,"name")){f.add({title:"advanced.link_desc",icon:"link",cmd:b.plugins.advlink?"mceAdvLink":"mceLink",ui:true});f.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});f.addSeparator()}if(g.nodeName=="IMG"&&g.className.indexOf("mceItem")==-1){f.add({title:"advanced.image_desc",icon:"image",cmd:b.plugins.advimage?"mceAdvImage":"mceImage",ui:true});f.addSeparator()}f.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",ui:true,value:{action:"insert"}});f.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable",ui:true});f.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete",ui:true});f.addSeparator();k=f.addMenu({title:"table.cell"});k.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps",ui:true});k.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells",ui:true});k.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells",ui:true});k=f.addMenu({title:"table.row"});k.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps",ui:true});k.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});k.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});k.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});k.addSeparator();k.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});k.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});k.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"});k.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"});k=f.addMenu({title:"table.col"});k.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});k.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});k.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{f.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",ui:true})}})}});b.onKeyDown.add(function(f,g){if(g.keyCode==9&&f.dom.getParent(f.selection.getNode(),"TABLE")){if(!tinymce.isGecko&&!tinymce.isOpera){tinyMCE.execInstanceCommand(f.editorId,"mceTableMoveToNextRow",true);return tinymce.dom.Event.cancel(g)}f.undoManager.add()}});if(!tinymce.isIE){if(b.getParam("table_selection",true)){b.onClick.add(function(f,g){g=g.target;if(g.nodeName==="TABLE"){f.selection.select(g)}})}}b.onNodeChange.add(function(f,e,h){var g=f.dom.getParent(h,"td,th,caption");e.setActive("table",h.nodeName==="TABLE"||!!g);if(g&&g.nodeName==="CAPTION"){g=null}e.setDisabled("delete_table",!g);e.setDisabled("delete_col",!g);e.setDisabled("delete_table",!g);e.setDisabled("delete_row",!g);e.setDisabled("col_after",!g);e.setDisabled("col_before",!g);e.setDisabled("row_after",!g);e.setDisabled("row_before",!g);e.setDisabled("row_props",!g);e.setDisabled("cell_props",!g);e.setDisabled("split_cells",!g||(parseInt(f.dom.getAttrib(g,"colspan","1"))<2&&parseInt(f.dom.getAttrib(g,"rowspan","1"))<2));e.setDisabled("merge_cells",!g)});if(!tinymce.isIE){b.onBeforeSetContent.add(function(e,f){if(f.initial){f.content=f.content.replace(/<(td|th)([^>]+|)>\s*<\/(td|th)>/g,tinymce.isOpera?"<$1$2>&nbsp;</$1>":'<$1$2><br mce_bogus="1" /></$1>')}})}},execCommand:function(f,e,g){var d=this.editor,c;switch(f){case"mceTableMoveToNextRow":case"mceInsertTable":case"mceTableRowProps":case"mceTableCellProps":case"mceTableSplitCells":case"mceTableMergeCells":case"mceTableInsertRowBefore":case"mceTableInsertRowAfter":case"mceTableDeleteRow":case"mceTableInsertColBefore":case"mceTableInsertColAfter":case"mceTableDeleteCol":case"mceTableCutRow":case"mceTableCopyRow":case"mceTablePasteRowBefore":case"mceTablePasteRowAfter":case"mceTableDelete":d.execCommand("mceBeginUndoLevel");this._doExecCommand(f,e,g);d.execCommand("mceEndUndoLevel");return true}return false},getInfo:function(){return{longname:"Tables",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/table",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_doExecCommand:function(r,Z,ae){var V=this.editor,au=V,g=this.url;var n=V.selection.getNode();var W=V.dom.getParent(n,"tr");var aq=V.dom.getParent(n,"td,th");var F=V.dom.getParent(n,"table");var k=V.contentWindow.document;var av=F?F.getAttribute("border"):"";if(W&&aq==null){aq=W.cells[0]}function ap(y,x){for(var ax=0;ax<y.length;ax++){if(y[ax].length>0&&ap(y[ax],x)){return true}if(y[ax]==x){return true}}return false}function aj(x,i){var y;ad=e(F);x=x||0;i=i||0;x=Math.max(o.cellindex+x,0);i=Math.max(o.rowindex+i,0);V.execCommand("mceRepaint");y=d(ad,i,x);if(y){V.selection.select(y.firstChild||y);V.selection.collapse(1)}}function ah(){var i=k.createElement("td");if(!tinymce.isIE){i.innerHTML='<br mce_bogus="1"/>'}}function j(y){var x=V.dom.getAttrib(y,"colspan");var i=V.dom.getAttrib(y,"rowspan");x=x==""?1:parseInt(x);i=i==""?1:parseInt(i);return{colspan:x,rowspan:i}}function al(ax,az){var i,ay;for(ay=0;ay<ax.length;ay++){for(i=0;i<ax[ay].length;i++){if(ax[ay][i]==az){return{cellindex:i,rowindex:ay}}}}return null}function d(x,y,i){if(x[y]&&x[y][i]){return x[y][i]}return null}function A(aC,ax){var az=[],y=0,aA,ay,ax,aB;for(aA=0;aA<aC.rows.length;aA++){for(ay=0;ay<aC.rows[aA].cells.length;ay++,y++){az[y]=aC.rows[aA].cells[ay]}}for(aA=0;aA<az.length;aA++){if(az[aA]==ax){if(aB=az[aA+1]){return aB}}}}function e(aE){var i=[],aF=aE.rows,aC,aB,ay,az,aD,ax,aA;for(aB=0;aB<aF.length;aB++){for(aC=0;aC<aF[aB].cells.length;aC++){ay=aF[aB].cells[aC];az=j(ay);for(aD=aC;i[aB]&&i[aB][aD];aD++){}for(aA=aB;aA<aB+az.rowspan;aA++){if(!i[aA]){i[aA]=[]}for(ax=aD;ax<aD+az.colspan;ax++){i[aA][ax]=ay}}}}return i}function m(aG,aD,ay,ax){var y=e(aG),aF=al(y,ay);var aH,aC;if(ax.cells.length!=aD.childNodes.length){aH=aD.childNodes;aC=null;for(var aE=0;ay=d(y,aF.rowindex,aE);aE++){var aA=true;var aB=j(ay);if(ap(aH,ay)){ax.childNodes[aE]._delete=true}else{if((aC==null||ay!=aC)&&aB.colspan>1){for(var az=aE;az<aE+ay.colSpan;az++){ax.childNodes[az]._delete=true}}}if((aC==null||ay!=aC)&&aB.rowspan>1){ay.rowSpan=aB.rowspan+1}aC=ay}B(F)}}function O(x,i){while((x=x.previousSibling)!=null){if(x.nodeName==i){return x}}return null}function af(ax,ay){var x=ay.split(",");while((ax=ax.nextSibling)!=null){for(var y=0;y<x.length;y++){if(ax.nodeName.toLowerCase()==x[y].toLowerCase()){return ax}}}return null}function B(ax){if(ax.rows==0){return}var y=ax.rows[0];do{var x=af(y,"TR");if(y._delete){y.parentNode.removeChild(y);continue}var ay=y.cells[0];if(ay.cells>1){do{var i=af(ay,"TD,TH");if(ay._delete){ay.parentNode.removeChild(ay)}}while((ay=i)!=null)}}while((y=x)!=null)}function p(ax,aA,az){ax.rowSpan=1;var x=af(aA,"TR");for(var ay=1;ay<az&&x;ay++){var y=k.createElement("td");if(!tinymce.isIE){y.innerHTML='<br mce_bogus="1"/>'}if(tinymce.isIE){x.insertBefore(y,x.cells(ax.cellIndex))}else{x.insertBefore(y,x.cells[ax.cellIndex])}x=af(x,"TR")}}function S(aF,aH,aB){var y=e(aH);var ax=aB.cloneNode(false);var aG=al(y,aB.cells[0]);var aC=null;var aA=V.dom.getAttrib(aH,"border");var az=null;for(var aE=0;az=d(y,aG.rowindex,aE);aE++){var aD=null;if(aC!=az){for(var ay=0;ay<aB.cells.length;ay++){if(az==aB.cells[ay]){aD=az.cloneNode(true);break}}}if(aD==null){aD=aF.createElement("td");if(!tinymce.isIE){aD.innerHTML='<br mce_bogus="1"/>'}}aD.colSpan=1;aD.rowSpan=1;ax.appendChild(aD);aC=az}return ax}switch(r){case"mceTableMoveToNextRow":var L=A(F,aq);if(!L){V.execCommand("mceTableInsertRowAfter",aq);L=A(F,aq)}V.selection.select(L);V.selection.collapse(true);return true;case"mceTableRowProps":if(W==null){return true}if(Z){V.windowManager.open({url:g+"/row.htm",width:400+parseInt(V.getLang("table.rowprops_delta_width",0)),height:295+parseInt(V.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:g})}return true;case"mceTableCellProps":if(aq==null){return true}if(Z){V.windowManager.open({url:g+"/cell.htm",width:400+parseInt(V.getLang("table.cellprops_delta_width",0)),height:295+parseInt(V.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:g})}return true;case"mceInsertTable":if(Z){V.windowManager.open({url:g+"/table.htm",width:400+parseInt(V.getLang("table.table_delta_width",0)),height:320+parseInt(V.getLang("table.table_delta_height",0)),inline:1},{plugin_url:g,action:ae?ae.action:0})}return true;case"mceTableDelete":var G=V.dom.getParent(V.selection.getNode(),"table");if(G){G.parentNode.removeChild(G);V.execCommand("mceRepaint")}return true;case"mceTableSplitCells":case"mceTableMergeCells":case"mceTableInsertRowBefore":case"mceTableInsertRowAfter":case"mceTableDeleteRow":case"mceTableInsertColBefore":case"mceTableInsertColAfter":case"mceTableDeleteCol":case"mceTableCutRow":case"mceTableCopyRow":case"mceTablePasteRowBefore":case"mceTablePasteRowAfter":if(!F){return true}if(W&&F!=W.parentNode){F=W.parentNode}if(F&&W){switch(r){case"mceTableCutRow":if(!W||!aq){return true}V.tableRowClipboard=S(k,F,W);V.execCommand("mceTableDeleteRow");break;case"mceTableCopyRow":if(!W||!aq){return true}V.tableRowClipboard=S(k,F,W);break;case"mceTablePasteRowBefore":if(!W||!aq){return true}var v=V.tableRowClipboard.cloneNode(true);var h=O(W,"TR");if(h!=null){m(F,h,h.cells[0],v)}W.parentNode.insertBefore(v,W);break;case"mceTablePasteRowAfter":if(!W||!aq){return true}var X=af(W,"TR");var v=V.tableRowClipboard.cloneNode(true);m(F,W,aq,v);if(X==null){W.parentNode.appendChild(v)}else{X.parentNode.insertBefore(v,X)}break;case"mceTableInsertRowBefore":if(!W||!aq){return true}var ad=e(F);var o=al(ad,aq);var v=k.createElement("tr");var u=null;o.rowindex--;if(o.rowindex<0){o.rowindex=0}for(var ac=0;aq=d(ad,o.rowindex,ac);ac++){if(aq!=u){var E=j(aq);if(E.rowspan==1){var J=k.createElement("td");if(!tinymce.isIE){J.innerHTML='<br mce_bogus="1"/>'}J.colSpan=aq.colSpan;v.appendChild(J)}else{aq.rowSpan=E.rowspan+1}u=aq}}W.parentNode.insertBefore(v,W);aj(0,1);break;case"mceTableInsertRowAfter":if(!W||!aq){return true}var ad=e(F);var o=al(ad,aq);var v=k.createElement("tr");var u=null;for(var ac=0;aq=d(ad,o.rowindex,ac);ac++){if(aq!=u){var E=j(aq);if(E.rowspan==1){var J=k.createElement("td");if(!tinymce.isIE){J.innerHTML='<br mce_bogus="1"/>'}J.colSpan=aq.colSpan;v.appendChild(J)}else{aq.rowSpan=E.rowspan+1}u=aq}}if(v.hasChildNodes()){var X=af(W,"TR");if(X){X.parentNode.insertBefore(v,X)}else{F.appendChild(v)}}aj(0,1);break;case"mceTableDeleteRow":if(!W||!aq){return true}var ad=e(F);var o=al(ad,aq);if(ad.length==1&&F.nodeName=="TBODY"){V.dom.remove(V.dom.getParent(F,"table"));return true}var D=W.cells;var X=af(W,"TR");for(var ac=0;ac<D.length;ac++){if(D[ac].rowSpan>1){var J=D[ac].cloneNode(true);var E=j(D[ac]);J.rowSpan=E.rowspan-1;var ak=X.cells[ac];if(ak==null){X.appendChild(J)}else{X.insertBefore(J,ak)}}}var u=null;for(var ac=0;aq=d(ad,o.rowindex,ac);ac++){if(aq!=u){var E=j(aq);if(E.rowspan>1){aq.rowSpan=E.rowspan-1}else{W=aq.parentNode;if(W.parentNode){W._delete=true}}u=aq}}B(F);aj(0,-1);break;case"mceTableInsertColBefore":if(!W||!aq){return true}var ad=e(V.dom.getParent(F,"table"));var o=al(ad,aq);var u=null;for(var aa=0;aq=d(ad,aa,o.cellindex);aa++){if(aq!=u){var E=j(aq);if(E.colspan==1){var J=k.createElement(aq.nodeName);if(!tinymce.isIE){J.innerHTML='<br mce_bogus="1"/>'}J.rowSpan=aq.rowSpan;aq.parentNode.insertBefore(J,aq)}else{aq.colSpan++}u=aq}}aj();break;case"mceTableInsertColAfter":if(!W||!aq){return true}var ad=e(V.dom.getParent(F,"table"));var o=al(ad,aq);var u=null;for(var aa=0;aq=d(ad,aa,o.cellindex);aa++){if(aq!=u){var E=j(aq);if(E.colspan==1){var J=k.createElement(aq.nodeName);if(!tinymce.isIE){J.innerHTML='<br mce_bogus="1"/>'}J.rowSpan=aq.rowSpan;var ak=af(aq,"TD,TH");if(ak==null){aq.parentNode.appendChild(J)}else{ak.parentNode.insertBefore(J,ak)}}else{aq.colSpan++}u=aq}}aj(1);break;case"mceTableDeleteCol":if(!W||!aq){return true}var ad=e(F);var o=al(ad,aq);var u=null;if((ad.length>1&&ad[0].length<=1)&&F.nodeName=="TBODY"){V.dom.remove(V.dom.getParent(F,"table"));return true}for(var aa=0;aq=d(ad,aa,o.cellindex);aa++){if(aq!=u){var E=j(aq);if(E.colspan>1){aq.colSpan=E.colspan-1}else{if(aq.parentNode){aq.parentNode.removeChild(aq)}}u=aq}}aj(-1);break;case"mceTableSplitCells":if(!W||!aq){return true}var l=j(aq);var C=l.colspan;var H=l.rowspan;if(C>1||H>1){aq.colSpan=1;for(var am=1;am<C;am++){var J=k.createElement("td");if(!tinymce.isIE){J.innerHTML='<br mce_bogus="1"/>'}W.insertBefore(J,af(aq,"TD,TH"));if(H>1){p(J,W,H)}}p(aq,W,H)}F=V.dom.getParent(V.selection.getNode(),"table");break;case"mceTableMergeCells":var ao=[];var R=V.selection.getSel();var ad=e(F);if(tinymce.isIE||R.rangeCount==1){if(Z){var t=j(aq);V.windowManager.open({url:g+"/merge_cells.htm",width:240+parseInt(V.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(V.getLang("table.merge_cells_delta_height",0)),inline:1},{action:"update",numcols:t.colspan,numrows:t.rowspan,plugin_url:g});return true}else{var U=parseInt(ae.numrows);var c=parseInt(ae.numcols);var o=al(ad,aq);if((""+U)=="NaN"){U=1}if((""+c)=="NaN"){c=1}var b=F.rows;for(var aa=o.rowindex;aa<ad.length;aa++){var ag=[];for(var ac=o.cellindex;ac<ad[aa].length;ac++){var f=d(ad,aa,ac);if(f&&!ap(ao,f)&&!ap(ag,f)){var N=al(ad,f);if(N.cellindex<o.cellindex+c&&N.rowindex<o.rowindex+U){ag[ag.length]=f}}}if(ag.length>0){ao[ao.length]=ag}var f=d(ad,o.rowindex,o.cellindex);a(au.dom.select("br",f),function(y,x){if(x>0&&au.dom.getAttrib("mce_bogus")){au.dom.remove(y)}})}}}else{var D=[];var R=V.selection.getSel();var Y=null;var an=null;var z=-1,aw=-1,w,at;if(R.rangeCount<2){return true}for(var am=0;am<R.rangeCount;am++){var ai=R.getRangeAt(am);var aq=ai.startContainer.childNodes[ai.startOffset];if(!aq){break}if(aq.nodeName=="TD"||aq.nodeName=="TH"){D[D.length]=aq}}var b=F.rows;for(var aa=0;aa<b.length;aa++){var ag=[];for(var ac=0;ac<b[aa].cells.length;ac++){var f=b[aa].cells[ac];for(var am=0;am<D.length;am++){if(f==D[am]){ag[ag.length]=f}}}if(ag.length>0){ao[ao.length]=ag}}var an=[];var Y=null;for(var aa=0;aa<ad.length;aa++){for(var ac=0;ac<ad[aa].length;ac++){ad[aa][ac]._selected=false;for(var am=0;am<D.length;am++){if(ad[aa][ac]==D[am]){if(z==-1){z=ac;aw=aa}w=ac;at=aa;ad[aa][ac]._selected=true}}}}for(var aa=aw;aa<=at;aa++){for(var ac=z;ac<=w;ac++){if(!ad[aa][ac]._selected){alert("Invalid selection for merge.");return true}}}}var s=1,q=1;var T=-1;for(var aa=0;aa<ao.length;aa++){var I=0;for(var ac=0;ac<ao[aa].length;ac++){var E=j(ao[aa][ac]);I+=E.colspan;if(T!=-1&&E.rowspan!=T){alert("Invalid selection for merge.");return true}T=E.rowspan}if(I>q){q=I}T=-1}var Q=-1;for(var ac=0;ac<ao[0].length;ac++){var M=0;for(var aa=0;aa<ao.length;aa++){var E=j(ao[aa][ac]);M+=E.rowspan;if(Q!=-1&&E.colspan!=Q){alert("Invalid selection for merge.");return true}Q=E.colspan}if(M>s){s=M}Q=-1}aq=ao[0][0];aq.rowSpan=s;aq.colSpan=q;for(var aa=0;aa<ao.length;aa++){for(var ac=0;ac<ao[aa].length;ac++){var P=ao[aa][ac].innerHTML;var K=P.replace(/[ \t\r\n]/g,"");if(K!="<br/>"&&K!="<br>"&&K!='<br mce_bogus="1"/>'&&(ac+aa>0)){aq.innerHTML+=P}if(ao[aa][ac]!=aq&&!ao[aa][ac]._deleted){var o=al(ad,ao[aa][ac]);var ar=ao[aa][ac].parentNode;ar.removeChild(ao[aa][ac]);ao[aa][ac]._deleted=true;if(!ar.hasChildNodes()){ar.parentNode.removeChild(ar);var ab=null;for(var ac=0;cellElm=d(ad,o.rowindex,ac);ac++){if(cellElm!=ab&&cellElm.rowSpan>1){cellElm.rowSpan--}ab=cellElm}if(aq.rowSpan>1){aq.rowSpan--}}}}}a(au.dom.select("br",aq),function(y,x){if(x>0&&au.dom.getAttrib(y,"mce_bogus")){au.dom.remove(y)}});break}F=V.dom.getParent(V.selection.getNode(),"table");V.addVisual(F);V.nodeChanged()}return true}return false}});tinymce.PluginManager.add("table",tinymce.plugins.TablePlugin)})();
\ No newline at end of file
+(function(b){var c=b.each;function a(F,E,I){var e,J,B,n;r();n=E.getParent(I.getStart(),"th,td");if(n){J=D(n);B=G();n=v(J.x,J.y)}function w(L,K){L=L.cloneNode(K);L.removeAttribute("id");return L}function r(){var K=0;e=[];c(["thead","tbody","tfoot"],function(L){var M=E.select(L+" tr",F);c(M,function(N,O){O+=K;c(E.select("td,th",N),function(U,P){var Q,R,S,T;if(e[O]){while(e[O][P]){P++}}S=g(U,"rowspan");T=g(U,"colspan");for(R=O;R<O+S;R++){if(!e[R]){e[R]=[]}for(Q=P;Q<P+T;Q++){e[R][Q]={part:L,real:R==O&&Q==P,elm:U,rowspan:S,colspan:T}}}})});K+=M.length})}function v(K,M){var L;L=e[M];if(L){return L[K]}}function g(L,K){return parseInt(L.getAttribute(K)||1)}function h(K){return E.hasClass(K.elm,"mceSelected")||K==n}function j(){var K=[];c(F.rows,function(L){c(L.cells,function(M){if(E.hasClass(M,"mceSelected")||M==n.elm){K.push(L);return false}})});return K}function q(){var K=E.createRng();K.setStartAfter(F);K.setEndAfter(F);I.setRng(K);E.remove(F)}function d(K){var L;b.walk(K,function(N){var M;if(N.nodeType==3){c(E.getParents(N.parentNode,null,K).reverse(),function(O){O=w(O,false);if(!L){L=M=O}else{if(M){M.appendChild(O)}}M=O});if(M){M.innerHTML=b.isIE?"&nbsp;":'<br _mce_bogus="1" />'}return false}},"childNodes");K=w(K,false);K.rowSpan=K.colSpan=1;if(L){K.appendChild(L)}else{if(!b.isIE){K.innerHTML='<br _mce_bogus="1" />'}}return K}function p(){var K=E.createRng();c(E.select("tr",F),function(L){if(L.cells.length==0){E.remove(L)}});if(E.select("tr",F).length==0){K.setStartAfter(F);K.setEndAfter(F);I.setRng(K);E.remove(F);return}c(E.select("thead,tbody,tfoot",F),function(L){if(L.rows.length==0){E.remove(L)}});r();row=e[Math.min(e.length-1,J.y)];if(row){I.select(row[Math.min(row.length-1,J.x)].elm,true);I.collapse(true)}}function s(Q,O,S,P){var N,L,K,M,R;N=e[O][Q].elm.parentNode;for(K=1;K<=S;K++){N=E.getNext(N,"tr");if(N){for(L=Q;L>=0;L--){R=e[O+K][L].elm;if(R.parentNode==N){for(M=1;M<=P;M++){E.insertAfter(d(R),R)}break}}if(L==-1){for(M=1;M<=P;M++){N.insertBefore(d(N.cells[0]),N.cells[0])}}}}}function A(){c(e,function(K,L){c(K,function(N,M){var Q,P,R,O;if(h(N)){N=N.elm;Q=g(N,"colspan");P=g(N,"rowspan");if(Q>1||P>1){N.colSpan=N.rowSpan=1;for(O=0;O<Q-1;O++){E.insertAfter(d(N),N)}s(M,L,P-1,Q)}}})})}function o(S,P,V){var N,M,U,T,R,O,Q,K,S,L;if(S){pos=D(S);N=pos.x;M=pos.y;U=N+(P-1);T=M+(V-1)}else{N=J.x;M=J.y;U=B.x;T=B.y}Q=v(N,M);K=v(U,T);if(Q&&K&&Q.part==K.part){A();r();Q=v(N,M).elm;Q.colSpan=(U-N)+1;Q.rowSpan=(T-M)+1;for(O=M;O<=T;O++){for(R=N;R<=U;R++){S=e[O][R].elm;if(S!=Q){L=b.grep(S.childNodes);c(L,function(X,W){if(X.nodeName!="BR"||W!=L.length-1){Q.appendChild(X)}});E.remove(S)}}}p()}}function k(N){var K,P,M,O,Q,R,L,S;c(e,function(T,U){c(T,function(W,V){if(h(W)){W=W.elm;Q=W.parentNode;R=w(Q,false);K=U;if(N){return false}}});if(N){return !K}});for(O=0;O<e[0].length;O++){P=e[K][O].elm;if(P!=M){if(!N){rowSpan=g(P,"rowspan");if(rowSpan>1){P.rowSpan=rowSpan+1;continue}}else{if(K>0&&e[K-1][O]){S=e[K-1][O].elm;rowSpan=g(S,"rowspan");if(rowSpan>1){S.rowSpan=rowSpan+1;continue}}}L=d(P);L.colSpan=P.colSpan;R.appendChild(L);M=P}}if(R.hasChildNodes()){if(!N){E.insertAfter(R,Q)}else{Q.parentNode.insertBefore(R,Q)}}}function f(L){var M,K;c(e,function(N,O){c(N,function(Q,P){if(h(Q)){M=P;if(L){return false}}});if(L){return !M}});c(e,function(Q,R){var N=Q[M].elm,O,P;if(N!=K){P=g(N,"colspan");O=g(N,"rowspan");if(P==1){if(!L){E.insertAfter(d(N),N);s(M,R,O-1,P)}else{N.parentNode.insertBefore(d(N),N);s(M,R,O-1,P)}}else{N.colSpan++}K=N}})}function m(){var K=[];c(e,function(L,M){c(L,function(O,N){if(h(O)&&b.inArray(K,N)===-1){c(e,function(R){var P=R[N].elm,Q;Q=g(P,"colspan");if(Q>1){P.colSpan=Q-1}else{E.remove(P)}});K.push(N)}})});p()}function l(){var L;function K(O){var N,P,M;N=E.getNext(O,"tr");c(O.cells,function(Q){var R=g(Q,"rowspan");if(R>1){Q.rowSpan=R-1;P=D(Q);s(P.x,P.y,1,1)}});P=D(O.cells[0]);c(e[P.y],function(Q){var R;Q=Q.elm;if(Q!=M){R=g(Q,"rowspan");if(R<=1){E.remove(Q)}else{Q.rowSpan=R-1}M=Q}})}L=j();c(L.reverse(),function(M){K(M)});p()}function C(){var K=j();E.remove(K);p();return K}function H(){var K=j();c(K,function(M,L){K[L]=w(M,true)});return K}function z(M,L){var N=j(),K=N[L?0:N.length-1],O=K.cells.length;c(e,function(Q){var P;O=0;c(Q,function(S,R){if(S.real){O+=S.colspan}if(S.elm.parentNode==K){P=1}});if(P){return false}});if(!L){M.reverse()}c(M,function(R){var Q=R.cells.length,P;for(i=0;i<Q;i++){P=R.cells[i];P.colSpan=P.rowSpan=1}for(i=Q;i<O;i++){R.appendChild(d(R.cells[Q-1]))}for(i=O;i<Q;i++){E.remove(R.cells[i])}if(L){K.parentNode.insertBefore(R,K)}else{E.insertAfter(R,K)}})}function D(K){var L;c(e,function(M,N){c(M,function(P,O){if(P.elm==K){L={x:O,y:N};return false}});return !L});return L}function u(K){J=D(K)}function G(){var M,L,K;L=K=0;c(e,function(N,O){c(N,function(Q,P){var S,R;if(h(Q)){Q=e[O][P];if(P>L){L=P}if(O>K){K=O}if(Q.real){S=Q.colspan-1;R=Q.rowspan-1;if(S){if(P+S>L){L=P+S}}if(R){if(O+R>K){K=O+R}}}}})});return{x:L,y:K}}function t(Q){var N,M,S,R,L,K,O,P;B=D(Q);if(J&&B){N=Math.min(J.x,B.x);M=Math.min(J.y,B.y);S=Math.max(J.x,B.x);R=Math.max(J.y,B.y);L=S;K=R;for(y=M;y<=K;y++){Q=e[y][N];if(!Q.real){if(N-(Q.colspan-1)<N){N-=Q.colspan-1}}}for(x=N;x<=L;x++){Q=e[M][x];if(!Q.real){if(M-(Q.rowspan-1)<M){M-=Q.rowspan-1}}}for(y=M;y<=R;y++){for(x=N;x<=S;x++){Q=e[y][x];if(Q.real){O=Q.colspan-1;P=Q.rowspan-1;if(O){if(x+O>L){L=x+O}}if(P){if(y+P>K){K=y+P}}}}}E.removeClass(E.select("td.mceSelected,th.mceSelected"),"mceSelected");for(y=M;y<=K;y++){for(x=N;x<=L;x++){E.addClass(e[y][x].elm,"mceSelected")}}}}b.extend(this,{deleteTable:q,split:A,merge:o,insertRow:k,insertCol:f,deleteCols:m,deleteRows:l,cutRows:C,copyRows:H,pasteRows:z,getPos:D,setStartCell:u,setEndCell:t})}b.create("tinymce.plugins.TablePlugin",{init:function(e,f){var d,j;function h(m){var l=e.selection,k=e.dom.getParent(m||l.getNode(),"table");if(k){return new a(k,e.dom,l)}}function g(){e.getBody().style.webkitUserSelect="";e.dom.removeClass(e.dom.select("td.mceSelected,th.mceSelected"),"mceSelected")}c([["table","table.desc","mceInsertTable",true],["delete_table","table.del","mceTableDelete"],["delete_col","table.delete_col_desc","mceTableDeleteCol"],["delete_row","table.delete_row_desc","mceTableDeleteRow"],["col_after","table.col_after_desc","mceTableInsertColAfter"],["col_before","table.col_before_desc","mceTableInsertColBefore"],["row_after","table.row_after_desc","mceTableInsertRowAfter"],["row_before","table.row_before_desc","mceTableInsertRowBefore"],["row_props","table.row_desc","mceTableRowProps",true],["cell_props","table.cell_desc","mceTableCellProps",true],["split_cells","table.split_cells_desc","mceTableSplitCells",true],["merge_cells","table.merge_cells_desc","mceTableMergeCells",true]],function(k){e.addButton(k[0],{title:k[1],cmd:k[2],ui:k[3]})});if(!b.isIE){e.onClick.add(function(k,l){l=l.target;if(l.nodeName==="TABLE"){k.selection.select(l)}})}e.onNodeChange.add(function(l,k,o){var m;o=l.selection.getStart();m=l.dom.getParent(o,"td,th,caption");k.setActive("table",o.nodeName==="TABLE"||!!m);if(m&&m.nodeName==="CAPTION"){m=0}k.setDisabled("delete_table",!m);k.setDisabled("delete_col",!m);k.setDisabled("delete_table",!m);k.setDisabled("delete_row",!m);k.setDisabled("col_after",!m);k.setDisabled("col_before",!m);k.setDisabled("row_after",!m);k.setDisabled("row_before",!m);k.setDisabled("row_props",!m);k.setDisabled("cell_props",!m);k.setDisabled("split_cells",!m);k.setDisabled("merge_cells",!m)});e.onInit.add(function(l){var k,o,p=l.dom,m;d=l.windowManager;l.onMouseDown.add(function(q,r){if(r.button!=2){g();o=p.getParent(r.target,"td,th");k=p.getParent(o,"table")}});p.bind(l.getDoc(),"mouseover",function(t){var r,q,s=t.target;if(o&&(m||s!=o)&&(s.nodeName=="TD"||s.nodeName=="TH")){q=p.getParent(s,"table");if(q==k){if(!m){m=h(q);m.setStartCell(o);l.getBody().style.webkitUserSelect="none"}m.setEndCell(s)}r=l.selection.getSel();if(r.removeAllRanges){r.removeAllRanges()}else{r.empty()}t.preventDefault()}});l.onMouseUp.add(function(z,A){var r,t=z.selection,B,C=t.getSel(),q,u,s,w;if(o){if(m){z.getBody().style.webkitUserSelect=""}function v(D,F){var E=new b.dom.TreeWalker(D,D);do{if(D.nodeType==3&&b.trim(D.nodeValue).length!=0){if(F){r.setStart(D,0)}else{r.setEnd(D,D.nodeValue.length)}return}if(D.nodeName=="BR"){if(F){r.setStartBefore(D)}else{r.setEndBefore(D)}return}}while(D=(F?E.next():E.prev()))}B=p.select("td.mceSelected,th.mceSelected");if(B.length>0){r=p.createRng();u=B[0];w=B[B.length-1];v(u,1);q=new b.dom.TreeWalker(u,p.getParent(B[0],"table"));do{if(u.nodeName=="TD"||u.nodeName=="TH"){if(!p.hasClass(u,"mceSelected")){break}s=u}}while(u=q.next());v(s);t.setRng(r)}z.nodeChanged();o=m=k=null}});l.onKeyUp.add(function(q,r){g()});if(l&&l.plugins.contextmenu){l.plugins.contextmenu.onContextMenu.add(function(s,q,u){var v,t=l.selection,r=t.getNode()||l.getBody();if(l.dom.getParent(u,"td")||l.dom.getParent(u,"th")||l.dom.select("td.mceSelected,th.mceSelected").length){q.removeAll();if(r.nodeName=="A"&&!l.dom.getAttrib(r,"name")){q.add({title:"advanced.link_desc",icon:"link",cmd:l.plugins.advlink?"mceAdvLink":"mceLink",ui:true});q.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});q.addSeparator()}if(r.nodeName=="IMG"&&r.className.indexOf("mceItem")==-1){q.add({title:"advanced.image_desc",icon:"image",cmd:l.plugins.advimage?"mceAdvImage":"mceImage",ui:true});q.addSeparator()}q.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",value:{action:"insert"}});q.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable"});q.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});q.addSeparator();v=q.addMenu({title:"table.cell"});v.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps"});v.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells"});v.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells"});v=q.addMenu({title:"table.row"});v.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});v.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});v.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});v.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});v.addSeparator();v.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});v.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});v.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!j);v.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"}).setDisabled(!j);v=q.addMenu({title:"table.col"});v.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});v.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});v.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{q.add({title:"table.desc",icon:"table",cmd:"mceInsertTable"})}})}if(!b.isIE){function n(){var q;for(q=l.getBody().lastChild;q&&q.nodeType==3&&!q.nodeValue.length;q=q.previousSibling){}if(q&&q.nodeName=="TABLE"){l.dom.add(l.getBody(),"p",null,'<br mce_bogus="1" />')}}if(b.isGecko){l.onKeyDown.add(function(r,t){var q,s,u=r.dom;if(t.keyCode==37||t.keyCode==38){q=r.selection.getRng();s=u.getParent(q.startContainer,"table");if(s&&r.getBody().firstChild==s){if(isAtStart(q,s)){q=u.createRng();q.setStartBefore(s);q.setEndBefore(s);r.selection.setRng(q);t.preventDefault()}}}})}l.onKeyUp.add(n);l.onSetContent.add(n);l.onVisualAid.add(n);l.onPreProcess.add(function(q,s){var r=s.node.lastChild;if(r&&r.childNodes.length==1&&r.firstChild.nodeName=="BR"){q.dom.remove(r)}});n()}});c({mceTableSplitCells:function(k){k.split()},mceTableMergeCells:function(l){var m,n,k;k=e.dom.getParent(e.selection.getNode(),"th,td");if(k){m=k.rowSpan;n=k.colSpan}if(!e.dom.select("td.mceSelected,th.mceSelected").length){d.open({url:f+"/merge_cells.htm",width:240+parseInt(e.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(e.getLang("table.merge_cells_delta_height",0)),inline:1},{rows:m,cols:n,onaction:function(o){l.merge(k,o.cols,o.rows)},plugin_url:f})}else{l.merge()}},mceTableInsertRowBefore:function(k){k.insertRow(true)},mceTableInsertRowAfter:function(k){k.insertRow()},mceTableInsertColBefore:function(k){k.insertCol(true)},mceTableInsertColAfter:function(k){k.insertCol()},mceTableDeleteCol:function(k){k.deleteCols()},mceTableDeleteRow:function(k){k.deleteRows()},mceTableCutRow:function(k){j=k.cutRows()},mceTableCopyRow:function(k){j=k.copyRows()},mceTablePasteRowBefore:function(k){k.pasteRows(j,true)},mceTablePasteRowAfter:function(k){k.pasteRows(j)},mceTableDelete:function(k){k.deleteTable()}},function(l,k){e.addCommand(k,function(){var m=h();if(m){l(m);e.execCommand("mceRepaint");g()}})});c({mceInsertTable:function(k){d.open({url:f+"/table.htm",width:400+parseInt(e.getLang("table.table_delta_width",0)),height:320+parseInt(e.getLang("table.table_delta_height",0)),inline:1},{plugin_url:f,action:k?k.action:0})},mceTableRowProps:function(){d.open({url:f+"/row.htm",width:400+parseInt(e.getLang("table.rowprops_delta_width",0)),height:295+parseInt(e.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:f})},mceTableCellProps:function(){d.open({url:f+"/cell.htm",width:400+parseInt(e.getLang("table.cellprops_delta_width",0)),height:295+parseInt(e.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:f})}},function(l,k){e.addCommand(k,function(m,n){l(n)})})}});b.PluginManager.add("table",b.plugins.TablePlugin)})(tinymce);
\ No newline at end of file
index 80cf748a305b86bd6bff86a75a006ed0f048286f..c2f307f045c2a4c3c5befb0176db93a3ce40c6b1 100644 (file)
 /**\r
- * $Id: editor_plugin_src.js 953 2008-11-04 10:16:50Z spocke $\r
+ * editor_plugin_src.js\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
-(function() {\r
+(function(tinymce) {\r
        var each = tinymce.each;\r
 \r
-       tinymce.create('tinymce.plugins.TablePlugin', {\r
-               init : function(ed, url) {\r
-                       var t = this;\r
+       /**\r
+        * Table Grid class.\r
+        */\r
+       function TableGrid(table, dom, selection) {\r
+               var grid, startPos, endPos, selectedCell;\r
+\r
+               buildGrid();\r
+               selectedCell = dom.getParent(selection.getStart(), 'th,td');\r
+               if (selectedCell) {\r
+                       startPos = getPos(selectedCell);\r
+                       endPos = findEndPos();\r
+                       selectedCell = getCell(startPos.x, startPos.y);\r
+               }\r
 \r
-                       t.editor = ed;\r
-                       t.url = url;\r
+               function cloneNode(node, children) {\r
+                       node = node.cloneNode(children);\r
+                       node.removeAttribute('id');\r
 \r
-                       // Register buttons\r
-                       each([\r
-                               ['table', 'table.desc', 'mceInsertTable', true],\r
-                               ['delete_table', 'table.del', 'mceTableDelete'],\r
-                               ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'],\r
-                               ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'],\r
-                               ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'],\r
-                               ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'],\r
-                               ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'],\r
-                               ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'],\r
-                               ['row_props', 'table.row_desc', 'mceTableRowProps', true],\r
-                               ['cell_props', 'table.cell_desc', 'mceTableCellProps', true],\r
-                               ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true],\r
-                               ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true]\r
-                       ], function(c) {\r
-                               ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]});\r
-                       });\r
+                       return node;\r
+               }\r
 \r
-                       if (ed.getParam('inline_styles')) {\r
-                               // Force move of attribs to styles in strict mode\r
-                               ed.onPreProcess.add(function(ed, o) {\r
-                                       var dom = ed.dom;\r
+               function buildGrid() {\r
+                       var startY = 0;\r
 \r
-                                       each(dom.select('table', o.node), function(n) {\r
-                                               var v;\r
+                       grid = [];\r
 \r
-                                               if (v = dom.getAttrib(n, 'width')) {\r
-                                                       dom.setStyle(n, 'width', v);\r
-                                                       dom.setAttrib(n, 'width');\r
-                                               }\r
+                       each(['thead', 'tbody', 'tfoot'], function(part) {\r
+                               var rows = dom.select(part + ' tr', table);\r
 \r
-                                               if (v = dom.getAttrib(n, 'height')) {\r
-                                                       dom.setStyle(n, 'height', v);\r
-                                                       dom.setAttrib(n, 'height');\r
+                               each(rows, function(tr, y) {\r
+                                       y += startY;\r
+\r
+                                       each(dom.select('td,th', tr), function(td, x) {\r
+                                               var x2, y2, rowspan, colspan;\r
+\r
+                                               // Skip over existing cells produced by rowspan\r
+                                               if (grid[y]) {\r
+                                                       while (grid[y][x])\r
+                                                               x++;\r
                                                }\r
-                                       });\r
-                               });\r
-                       }\r
 \r
-                       ed.onInit.add(function() {\r
-                               if (ed && ed.plugins.contextmenu) {\r
-                                       ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {\r
-                                               var sm, se = ed.selection, el = se.getNode() || ed.getBody();\r
+                                               // Get col/rowspan from cell\r
+                                               rowspan = getSpanVal(td, 'rowspan');\r
+                                               colspan = getSpanVal(td, 'colspan');\r
 \r
-                                               if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th')) {\r
-                                                       m.removeAll();\r
+                                               // Fill out rowspan/colspan right and down\r
+                                               for (y2 = y; y2 < y + rowspan; y2++) {\r
+                                                       if (!grid[y2])\r
+                                                               grid[y2] = [];\r
 \r
-                                                       if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) {\r
-                                                               m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});\r
-                                                               m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});\r
-                                                               m.addSeparator();\r
+                                                       for (x2 = x; x2 < x + colspan; x2++) {\r
+                                                               grid[y2][x2] = {\r
+                                                                       part : part,\r
+                                                                       real : y2 == y && x2 == x,\r
+                                                                       elm : td,\r
+                                                                       rowspan : rowspan,\r
+                                                                       colspan : colspan\r
+                                                               };\r
                                                        }\r
+                                               }\r
+                                       });\r
+                               });\r
 \r
-                                                       if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) {\r
-                                                               m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});\r
-                                                               m.addSeparator();\r
-                                                       }\r
+                               startY += rows.length;\r
+                       });\r
+               };\r
 \r
-                                                       m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', ui : true, value : {action : 'insert'}});\r
-                                                       m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable', ui : true});\r
-                                                       m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete', ui : true});\r
-                                                       m.addSeparator();\r
+               function getCell(x, y) {\r
+                       var row;\r
 \r
-                                                       // Cell menu\r
-                                                       sm = m.addMenu({title : 'table.cell'});\r
-                                                       sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps', ui : true});\r
-                                                       sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells', ui : true});\r
-                                                       sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells', ui : true});\r
+                       row = grid[y];\r
+                       if (row)\r
+                               return row[x];\r
+               };\r
 \r
-                                                       // Row menu\r
-                                                       sm = m.addMenu({title : 'table.row'});\r
-                                                       sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps', ui : true});\r
-                                                       sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'});\r
-                                                       sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'});\r
-                                                       sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'});\r
-                                                       sm.addSeparator();\r
-                                                       sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'});\r
-                                                       sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'});\r
-                                                       sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'});\r
-                                                       sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'});\r
+               function getSpanVal(td, name) {\r
+                       return parseInt(td.getAttribute(name) || 1);\r
+               };\r
 \r
-                                                       // Column menu\r
-                                                       sm = m.addMenu({title : 'table.col'});\r
-                                                       sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'});\r
-                                                       sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'});\r
-                                                       sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'});\r
-                                               } else\r
-                                                       m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', ui : true});\r
-                                       });\r
-                               }\r
-                       });\r
+               function isCellSelected(cell) {\r
+                       return dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell;\r
+               };\r
 \r
-                       // Add undo level when new rows are created using the tab key\r
-                       ed.onKeyDown.add(function(ed, e) {\r
-                               if (e.keyCode == 9 && ed.dom.getParent(ed.selection.getNode(), 'TABLE')) {\r
-                                       if (!tinymce.isGecko && !tinymce.isOpera) {\r
-                                               tinyMCE.execInstanceCommand(ed.editorId, "mceTableMoveToNextRow", true);\r
-                                               return tinymce.dom.Event.cancel(e);\r
-                                       }\r
+               function getSelectedRows() {\r
+                       var rows = [];\r
 \r
-                                       ed.undoManager.add();\r
-                               }\r
+                       each(table.rows, function(row) {\r
+                               each(row.cells, function(cell) {\r
+                                       if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) {\r
+                                               rows.push(row);\r
+                                               return false;\r
+                                       }\r
+                               });\r
                        });\r
 \r
-                       // Select whole table is a table border is clicked\r
-                       if (!tinymce.isIE) {\r
-                               if (ed.getParam('table_selection', true)) {\r
-                                       ed.onClick.add(function(ed, e) {\r
-                                               e = e.target;\r
+                       return rows;\r
+               };\r
 \r
-                                               if (e.nodeName === 'TABLE')\r
-                                                       ed.selection.select(e);\r
-                                       });\r
-                               }\r
-                       }\r
+               function deleteTable() {\r
+                       var rng = dom.createRng();\r
 \r
-                       ed.onNodeChange.add(function(ed, cm, n) {\r
-                               var p = ed.dom.getParent(n, 'td,th,caption');\r
+                       rng.setStartAfter(table);\r
+                       rng.setEndAfter(table);\r
 \r
-                               cm.setActive('table', n.nodeName === 'TABLE' || !!p);\r
-                               if (p && p.nodeName === 'CAPTION')\r
-                                       p = null;\r
+                       selection.setRng(rng);\r
 \r
-                               cm.setDisabled('delete_table', !p);\r
-                               cm.setDisabled('delete_col', !p);\r
-                               cm.setDisabled('delete_table', !p);\r
-                               cm.setDisabled('delete_row', !p);\r
-                               cm.setDisabled('col_after', !p);\r
-                               cm.setDisabled('col_before', !p);\r
-                               cm.setDisabled('row_after', !p);\r
-                               cm.setDisabled('row_before', !p);\r
-                               cm.setDisabled('row_props', !p);\r
-                               cm.setDisabled('cell_props', !p);\r
-                               cm.setDisabled('split_cells', !p || (parseInt(ed.dom.getAttrib(p, 'colspan', '1')) < 2 && parseInt(ed.dom.getAttrib(p, 'rowspan', '1')) < 2));\r
-                               cm.setDisabled('merge_cells', !p);\r
-                       });\r
+                       dom.remove(table);\r
+               };\r
 \r
-                       // Padd empty table cells\r
-                       if (!tinymce.isIE) {\r
-                               ed.onBeforeSetContent.add(function(ed, o) {\r
-                                       if (o.initial)\r
-                                               o.content = o.content.replace(/<(td|th)([^>]+|)>\s*<\/(td|th)>/g, tinymce.isOpera ? '<$1$2>&nbsp;</$1>' : '<$1$2><br mce_bogus="1" /></$1>');\r
-                               });\r
-                       }\r
-               },\r
-\r
-               execCommand : function(cmd, ui, val) {\r
-                       var ed = this.editor, b;\r
-\r
-                       // Is table command\r
-                       switch (cmd) {\r
-                               case "mceTableMoveToNextRow":\r
-                               case "mceInsertTable":\r
-                               case "mceTableRowProps":\r
-                               case "mceTableCellProps":\r
-                               case "mceTableSplitCells":\r
-                               case "mceTableMergeCells":\r
-                               case "mceTableInsertRowBefore":\r
-                               case "mceTableInsertRowAfter":\r
-                               case "mceTableDeleteRow":\r
-                               case "mceTableInsertColBefore":\r
-                               case "mceTableInsertColAfter":\r
-                               case "mceTableDeleteCol":\r
-                               case "mceTableCutRow":\r
-                               case "mceTableCopyRow":\r
-                               case "mceTablePasteRowBefore":\r
-                               case "mceTablePasteRowAfter":\r
-                               case "mceTableDelete":\r
-                                       ed.execCommand('mceBeginUndoLevel');\r
-                                       this._doExecCommand(cmd, ui, val);\r
-                                       ed.execCommand('mceEndUndoLevel');\r
-\r
-                                       return true;\r
-                       }\r
+               function cloneCell(cell) {\r
+                       var formatNode;\r
 \r
-                       // Pass to next handler in chain\r
-                       return false;\r
-               },\r
-\r
-               getInfo : function() {\r
-                       return {\r
-                               longname : 'Tables',\r
-                               author : 'Moxiecode Systems AB',\r
-                               authorurl : 'http://tinymce.moxiecode.com',\r
-                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/table',\r
-                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
-                       };\r
-               },\r
-\r
-               // Private plugin internal methods\r
-\r
-               /**\r
-                * Executes the table commands.\r
-                */\r
-               _doExecCommand : function(command, user_interface, value) {\r
-                       var inst = this.editor, ed = inst, url = this.url;\r
-                       var focusElm = inst.selection.getNode();\r
-                       var trElm = inst.dom.getParent(focusElm, "tr");\r
-                       var tdElm = inst.dom.getParent(focusElm, "td,th");\r
-                       var tableElm = inst.dom.getParent(focusElm, "table");\r
-                       var doc = inst.contentWindow.document;\r
-                       var tableBorder = tableElm ? tableElm.getAttribute("border") : "";\r
-\r
-                       // Get first TD if no TD found\r
-                       if (trElm && tdElm == null)\r
-                               tdElm = trElm.cells[0];\r
-\r
-                       function inArray(ar, v) {\r
-                               for (var i=0; i<ar.length; i++) {\r
-                                       // Is array\r
-                                       if (ar[i].length > 0 && inArray(ar[i], v))\r
-                                               return true;\r
-\r
-                                       // Found value\r
-                                       if (ar[i] == v)\r
-                                               return true;\r
-                               }\r
+                       // Clone formats\r
+                       tinymce.walk(cell, function(node) {\r
+                               var curNode;\r
 \r
-                               return false;\r
-                       }\r
+                               if (node.nodeType == 3) {\r
+                                       each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) {\r
+                                               node = cloneNode(node, false);\r
 \r
-                       function select(dx, dy) {\r
-                               var td;\r
+                                               if (!formatNode)\r
+                                                       formatNode = curNode = node;\r
+                                               else if (curNode)\r
+                                                       curNode.appendChild(node);\r
 \r
-                               grid = getTableGrid(tableElm);\r
-                               dx = dx || 0;\r
-                               dy = dy || 0;\r
-                               dx = Math.max(cpos.cellindex + dx, 0);\r
-                               dy = Math.max(cpos.rowindex + dy, 0);\r
+                                               curNode = node;\r
+                                       });\r
 \r
-                               // Recalculate grid and select\r
-                               inst.execCommand('mceRepaint');\r
-                               td = getCell(grid, dy, dx);\r
+                                       // Add something to the inner node\r
+                                       if (curNode)\r
+                                               curNode.innerHTML = tinymce.isIE ? '&nbsp;' : '<br _mce_bogus="1" />';\r
 \r
-                               if (td) {\r
-                                       inst.selection.select(td.firstChild || td);\r
-                                       inst.selection.collapse(1);\r
+                                       return false;\r
                                }\r
-                       };\r
+                       }, 'childNodes');\r
 \r
-                       function makeTD() {\r
-                               var newTD = doc.createElement("td");\r
+                       cell = cloneNode(cell, false);\r
+                       cell.rowSpan = cell.colSpan = 1;\r
 \r
+                       if (formatNode) {\r
+                               cell.appendChild(formatNode);\r
+                       } else {\r
                                if (!tinymce.isIE)\r
-                                       newTD.innerHTML = '<br mce_bogus="1"/>';\r
+                                       cell.innerHTML = '<br _mce_bogus="1" />';\r
                        }\r
 \r
-                       function getColRowSpan(td) {\r
-                               var colspan = inst.dom.getAttrib(td, "colspan");\r
-                               var rowspan = inst.dom.getAttrib(td, "rowspan");\r
+                       return cell;\r
+               };\r
+\r
+               function cleanup() {\r
+                       var rng = dom.createRng();\r
 \r
-                               colspan = colspan == "" ? 1 : parseInt(colspan);\r
-                               rowspan = rowspan == "" ? 1 : parseInt(rowspan);\r
+                       // Empty rows\r
+                       each(dom.select('tr', table), function(tr) {\r
+                               if (tr.cells.length == 0)\r
+                                       dom.remove(tr);\r
+                       });\r
 \r
-                               return {colspan : colspan, rowspan : rowspan};\r
+                       // Empty table\r
+                       if (dom.select('tr', table).length == 0) {\r
+                               rng.setStartAfter(table);\r
+                               rng.setEndAfter(table);\r
+                               selection.setRng(rng);\r
+                               dom.remove(table);\r
+                               return;\r
                        }\r
 \r
-                       function getCellPos(grid, td) {\r
-                               var x, y;\r
+                       // Empty header/body/footer\r
+                       each(dom.select('thead,tbody,tfoot', table), function(part) {\r
+                               if (part.rows.length == 0)\r
+                                       dom.remove(part);\r
+                       });\r
 \r
-                               for (y=0; y<grid.length; y++) {\r
-                                       for (x=0; x<grid[y].length; x++) {\r
-                                               if (grid[y][x] == td)\r
-                                                       return {cellindex : x, rowindex : y};\r
-                                       }\r
-                               }\r
+                       // Restore selection to start position if it still exists\r
+                       buildGrid();\r
 \r
-                               return null;\r
+                       // Restore the selection to the closest table position\r
+                       row = grid[Math.min(grid.length - 1, startPos.y)];\r
+                       if (row) {\r
+                               selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true);\r
+                               selection.collapse(true);\r
                        }\r
+               };\r
 \r
-                       function getCell(grid, row, col) {\r
-                               if (grid[row] && grid[row][col])\r
-                                       return grid[row][col];\r
+               function fillLeftDown(x, y, rows, cols) {\r
+                       var tr, x2, r, c, cell;\r
 \r
-                               return null;\r
-                       }\r
+                       tr = grid[y][x].elm.parentNode;\r
+                       for (r = 1; r <= rows; r++) {\r
+                               tr = dom.getNext(tr, 'tr');\r
+\r
+                               if (tr) {\r
+                                       // Loop left to find real cell\r
+                                       for (x2 = x; x2 >= 0; x2--) {\r
+                                               cell = grid[y + r][x2].elm;\r
 \r
-                       function getNextCell(table, cell) {\r
-                               var cells = [], x = 0, i, j, cell, nextCell;\r
+                                               if (cell.parentNode == tr) {\r
+                                                       // Append clones after\r
+                                                       for (c = 1; c <= cols; c++)\r
+                                                               dom.insertAfter(cloneCell(cell), cell);\r
 \r
-                               for (i = 0; i < table.rows.length; i++)\r
-                                       for (j = 0; j < table.rows[i].cells.length; j++, x++)\r
-                                               cells[x] = table.rows[i].cells[j];\r
+                                                       break;\r
+                                               }\r
+                                       }\r
 \r
-                               for (i = 0; i < cells.length; i++)\r
-                                       if (cells[i] == cell)\r
-                                               if (nextCell = cells[i+1])\r
-                                                       return nextCell;\r
+                                       if (x2 == -1) {\r
+                                               // Insert nodes before first cell\r
+                                               for (c = 1; c <= cols; c++)\r
+                                                       tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]);\r
+                                       }\r
+                               }\r
                        }\r
+               };\r
 \r
-                       function getTableGrid(table) {\r
-                               var grid = [], rows = table.rows, x, y, td, sd, xstart, x2, y2;\r
+               function split() {\r
+                       each(grid, function(row, y) {\r
+                               each(row, function(cell, x) {\r
+                                       var colSpan, rowSpan, newCell, i;\r
 \r
-                               for (y=0; y<rows.length; y++) {\r
-                                       for (x=0; x<rows[y].cells.length; x++) {\r
-                                               td = rows[y].cells[x];\r
-                                               sd = getColRowSpan(td);\r
+                                       if (isCellSelected(cell)) {\r
+                                               cell = cell.elm;\r
+                                               colSpan = getSpanVal(cell, 'colspan');\r
+                                               rowSpan = getSpanVal(cell, 'rowspan');\r
 \r
-                                               // All ready filled\r
-                                               for (xstart = x; grid[y] && grid[y][xstart]; xstart++) ;\r
+                                               if (colSpan > 1 || rowSpan > 1) {\r
+                                                       cell.colSpan = cell.rowSpan = 1;\r
 \r
-                                               // Fill box\r
-                                               for (y2=y; y2<y+sd['rowspan']; y2++) {\r
-                                                       if (!grid[y2])\r
-                                                               grid[y2] = [];\r
+                                                       // Insert cells right\r
+                                                       for (i = 0; i < colSpan - 1; i++)\r
+                                                               dom.insertAfter(cloneCell(cell), cell);\r
 \r
-                                                       for (x2=xstart; x2<xstart+sd['colspan']; x2++)\r
-                                                               grid[y2][x2] = td;\r
+                                                       fillLeftDown(x, y, rowSpan - 1, colSpan);\r
+                                               }\r
+                                       }\r
+                               });\r
+                       });\r
+               };\r
+\r
+               function merge(cell, cols, rows) {\r
+                       var startX, startY, endX, endY, x, y, startCell, endCell, cell, children;\r
+\r
+                       // Use specified cell and cols/rows\r
+                       if (cell) {\r
+                               pos = getPos(cell);\r
+                               startX = pos.x;\r
+                               startY = pos.y;\r
+                               endX = startX + (cols - 1);\r
+                               endY = startY + (rows - 1);\r
+                       } else {\r
+                               // Use selection\r
+                               startX = startPos.x;\r
+                               startY = startPos.y;\r
+                               endX = endPos.x;\r
+                               endY = endPos.y;\r
+                       }\r
+\r
+                       // Find start/end cells\r
+                       startCell = getCell(startX, startY);\r
+                       endCell = getCell(endX, endY);\r
+\r
+                       // Check if the cells exists and if they are of the same part for example tbody = tbody\r
+                       if (startCell && endCell && startCell.part == endCell.part) {\r
+                               // Split and rebuild grid\r
+                               split();\r
+                               buildGrid();\r
+\r
+                               // Set row/col span to start cell\r
+                               startCell = getCell(startX, startY).elm;\r
+                               startCell.colSpan = (endX - startX) + 1;\r
+                               startCell.rowSpan = (endY - startY) + 1;\r
+\r
+                               // Remove other cells and add it's contents to the start cell\r
+                               for (y = startY; y <= endY; y++) {\r
+                                       for (x = startX; x <= endX; x++) {\r
+                                               cell = grid[y][x].elm;\r
+\r
+                                               if (cell != startCell) {\r
+                                                       // Move children to startCell\r
+                                                       children = tinymce.grep(cell.childNodes);\r
+                                                       each(children, function(node, i) {\r
+                                                               // Jump over last BR element\r
+                                                               if (node.nodeName != 'BR' || i != children.length - 1)\r
+                                                                       startCell.appendChild(node);\r
+                                                       });\r
+\r
+                                                       // Remove cell\r
+                                                       dom.remove(cell);\r
                                                }\r
                                        }\r
                                }\r
 \r
-                               return grid;\r
+                               // Remove empty rows etc and restore caret location\r
+                               cleanup();\r
                        }\r
+               };\r
+\r
+               function insertRow(before) {\r
+                       var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell;\r
+\r
+                       // Find first/last row\r
+                       each(grid, function(row, y) {\r
+                               each(row, function(cell, x) {\r
+                                       if (isCellSelected(cell)) {\r
+                                               cell = cell.elm;\r
+                                               rowElm = cell.parentNode;\r
+                                               newRow = cloneNode(rowElm, false);\r
+                                               posY = y;\r
+\r
+                                               if (before)\r
+                                                       return false;\r
+                                       }\r
+                               });\r
 \r
-                       function trimRow(table, tr, td, new_tr) {\r
-                               var grid = getTableGrid(table), cpos = getCellPos(grid, td);\r
-                               var cells, lastElm;\r
-\r
-                               // Time to crop away some\r
-                               if (new_tr.cells.length != tr.childNodes.length) {\r
-                                       cells = tr.childNodes;\r
-                                       lastElm = null;\r
-\r
-                                       for (var x=0; td = getCell(grid, cpos.rowindex, x); x++) {\r
-                                               var remove = true;\r
-                                               var sd = getColRowSpan(td);\r
-\r
-                                               // Remove due to rowspan\r
-                                               if (inArray(cells, td)) {\r
-                                                       new_tr.childNodes[x]._delete = true;\r
-                                               } else if ((lastElm == null || td != lastElm) && sd.colspan > 1) { // Remove due to colspan\r
-                                                       for (var i=x; i<x+td.colSpan; i++)\r
-                                                               new_tr.childNodes[i]._delete = true;\r
-                                               }\r
+                               if (before)\r
+                                       return !posY;\r
+                       });\r
 \r
-                                               if ((lastElm == null || td != lastElm) && sd.rowspan > 1)\r
-                                                       td.rowSpan = sd.rowspan + 1;\r
+                       for (x = 0; x < grid[0].length; x++) {\r
+                               cell = grid[posY][x].elm;\r
 \r
-                                               lastElm = td;\r
+                               if (cell != lastCell) {\r
+                                       if (!before) {\r
+                                               rowSpan = getSpanVal(cell, 'rowspan');\r
+                                               if (rowSpan > 1) {\r
+                                                       cell.rowSpan = rowSpan + 1;\r
+                                                       continue;\r
+                                               }\r
+                                       } else {\r
+                                               // Check if cell above can be expanded\r
+                                               if (posY > 0 && grid[posY - 1][x]) {\r
+                                                       otherCell = grid[posY - 1][x].elm;\r
+                                                       rowSpan = getSpanVal(otherCell, 'rowspan');\r
+                                                       if (rowSpan > 1) {\r
+                                                               otherCell.rowSpan = rowSpan + 1;\r
+                                                               continue;\r
+                                                       }\r
+                                               }\r
                                        }\r
 \r
-                                       deleteMarked(tableElm);\r
-                               }\r
-                       }\r
+                                       // Insert new cell into new row\r
+                                       newCell = cloneCell(cell)\r
+                                       newCell.colSpan = cell.colSpan;\r
+                                       newRow.appendChild(newCell);\r
 \r
-                       function prevElm(node, name) {\r
-                               while ((node = node.previousSibling) != null) {\r
-                                       if (node.nodeName == name)\r
-                                               return node;\r
+                                       lastCell = cell;\r
                                }\r
+                       }\r
 \r
-                               return null;\r
+                       if (newRow.hasChildNodes()) {\r
+                               if (!before)\r
+                                       dom.insertAfter(newRow, rowElm);\r
+                               else\r
+                                       rowElm.parentNode.insertBefore(newRow, rowElm);\r
                        }\r
+               };\r
 \r
-                       function nextElm(node, names) {\r
-                               var namesAr = names.split(',');\r
+               function insertCol(before) {\r
+                       var posX, lastCell;\r
 \r
-                               while ((node = node.nextSibling) != null) {\r
-                                       for (var i=0; i<namesAr.length; i++) {\r
-                                               if (node.nodeName.toLowerCase() == namesAr[i].toLowerCase() )\r
-                                                       return node;\r
+                       // Find first/last column\r
+                       each(grid, function(row, y) {\r
+                               each(row, function(cell, x) {\r
+                                       if (isCellSelected(cell)) {\r
+                                               posX = x;\r
+\r
+                                               if (before)\r
+                                                       return false;\r
                                        }\r
-                               }\r
+                               });\r
 \r
-                               return null;\r
-                       }\r
+                               if (before)\r
+                                       return !posX;\r
+                       });\r
 \r
-                       function deleteMarked(tbl) {\r
-                               if (tbl.rows == 0)\r
-                                       return;\r
+                       each(grid, function(row, y) {\r
+                               var cell = row[posX].elm, rowSpan, colSpan;\r
 \r
-                               var tr = tbl.rows[0];\r
-                               do {\r
-                                       var next = nextElm(tr, "TR");\r
+                               if (cell != lastCell) {\r
+                                       colSpan = getSpanVal(cell, 'colspan');\r
+                                       rowSpan = getSpanVal(cell, 'rowspan');\r
 \r
-                                       // Delete row\r
-                                       if (tr._delete) {\r
-                                               tr.parentNode.removeChild(tr);\r
-                                               continue;\r
-                                       }\r
+                                       if (colSpan == 1) {\r
+                                               if (!before) {\r
+                                                       dom.insertAfter(cloneCell(cell), cell);\r
+                                                       fillLeftDown(posX, y, rowSpan - 1, colSpan);\r
+                                               } else {\r
+                                                       cell.parentNode.insertBefore(cloneCell(cell), cell);\r
+                                                       fillLeftDown(posX, y, rowSpan - 1, colSpan);\r
+                                               }\r
+                                       } else\r
+                                               cell.colSpan++;\r
+\r
+                                       lastCell = cell;\r
+                               }\r
+                       });\r
+               };\r
+\r
+               function deleteCols() {\r
+                       var cols = [];\r
 \r
-                                       // Delete cells\r
-                                       var td = tr.cells[0];\r
-                                       if (td.cells > 1) {\r
-                                               do {\r
-                                                       var nexttd = nextElm(td, "TD,TH");\r
+                       // Get selected column indexes\r
+                       each(grid, function(row, y) {\r
+                               each(row, function(cell, x) {\r
+                                       if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) {\r
+                                               each(grid, function(row) {\r
+                                                       var cell = row[x].elm, colSpan;\r
 \r
-                                                       if (td._delete)\r
-                                                               td.parentNode.removeChild(td);\r
-                                               } while ((td = nexttd) != null);\r
+                                                       colSpan = getSpanVal(cell, 'colspan');\r
+\r
+                                                       if (colSpan > 1)\r
+                                                               cell.colSpan = colSpan - 1;\r
+                                                       else\r
+                                                               dom.remove(cell);\r
+                                               });\r
+\r
+                                               cols.push(x);\r
                                        }\r
-                               } while ((tr = next) != null);\r
-                       }\r
+                               });\r
+                       });\r
 \r
-                       function addRows(td_elm, tr_elm, rowspan) {\r
-                               // Add rows\r
-                               td_elm.rowSpan = 1;\r
-                               var trNext = nextElm(tr_elm, "TR");\r
-                               for (var i=1; i<rowspan && trNext; i++) {\r
-                                       var newTD = doc.createElement("td");\r
+                       cleanup();\r
+               };\r
 \r
-                                       if (!tinymce.isIE)\r
-                                               newTD.innerHTML = '<br mce_bogus="1"/>';\r
+               function deleteRows() {\r
+                       var rows;\r
 \r
-                                       if (tinymce.isIE)\r
-                                               trNext.insertBefore(newTD, trNext.cells(td_elm.cellIndex));\r
-                                       else\r
-                                               trNext.insertBefore(newTD, trNext.cells[td_elm.cellIndex]);\r
+                       function deleteRow(tr) {\r
+                               var nextTr, pos, lastCell;\r
 \r
-                                       trNext = nextElm(trNext, "TR");\r
-                               }\r
-                       }\r
+                               nextTr = dom.getNext(tr, 'tr');\r
 \r
-                       function copyRow(doc, table, tr) {\r
-                               var grid = getTableGrid(table);\r
-                               var newTR = tr.cloneNode(false);\r
-                               var cpos = getCellPos(grid, tr.cells[0]);\r
-                               var lastCell = null;\r
-                               var tableBorder = inst.dom.getAttrib(table, "border");\r
-                               var tdElm = null;\r
-\r
-                               for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
-                                       var newTD = null;\r
-\r
-                                       if (lastCell != tdElm) {\r
-                                               for (var i=0; i<tr.cells.length; i++) {\r
-                                                       if (tdElm == tr.cells[i]) {\r
-                                                               newTD = tdElm.cloneNode(true);\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
+                               // Move down row spanned cells\r
+                               each(tr.cells, function(cell) {\r
+                                       var rowSpan = getSpanVal(cell, 'rowspan');\r
+\r
+                                       if (rowSpan > 1) {\r
+                                               cell.rowSpan = rowSpan - 1;\r
+                                               pos = getPos(cell);\r
+                                               fillLeftDown(pos.x, pos.y, 1, 1);\r
                                        }\r
+                               });\r
 \r
-                                       if (newTD == null) {\r
-                                               newTD = doc.createElement("td");\r
+                               // Delete cells\r
+                               pos = getPos(tr.cells[0]);\r
+                               each(grid[pos.y], function(cell) {\r
+                                       var rowSpan;\r
 \r
-                                               if (!tinymce.isIE)\r
-                                                       newTD.innerHTML = '<br mce_bogus="1"/>';\r
+                                       cell = cell.elm;\r
+\r
+                                       if (cell != lastCell) {\r
+                                               rowSpan = getSpanVal(cell, 'rowspan');\r
+\r
+                                               if (rowSpan <= 1)\r
+                                                       dom.remove(cell);\r
+                                               else\r
+                                                       cell.rowSpan = rowSpan - 1;\r
+\r
+                                               lastCell = cell;\r
                                        }\r
+                               });\r
+                       };\r
 \r
-                                       // Reset col/row span\r
-                                       newTD.colSpan = 1;\r
-                                       newTD.rowSpan = 1;\r
+                       // Get selected rows and move selection out of scope\r
+                       rows = getSelectedRows();\r
 \r
-                                       newTR.appendChild(newTD);\r
+                       // Delete all selected rows\r
+                       each(rows.reverse(), function(tr) {\r
+                               deleteRow(tr);\r
+                       });\r
 \r
-                                       lastCell = tdElm;\r
-                               }\r
+                       cleanup();\r
+               };\r
 \r
-                               return newTR;\r
-                       }\r
+               function cutRows() {\r
+                       var rows = getSelectedRows();\r
 \r
-                       // ---- Commands -----\r
+                       dom.remove(rows);\r
+                       cleanup();\r
 \r
-                       // Handle commands\r
-                       switch (command) {\r
-                               case "mceTableMoveToNextRow":\r
-                                       var nextCell = getNextCell(tableElm, tdElm);\r
+                       return rows;\r
+               };\r
 \r
-                                       if (!nextCell) {\r
-                                               inst.execCommand("mceTableInsertRowAfter", tdElm);\r
-                                               nextCell = getNextCell(tableElm, tdElm);\r
-                                       }\r
+               function copyRows() {\r
+                       var rows = getSelectedRows();\r
 \r
-                                       inst.selection.select(nextCell);\r
-                                       inst.selection.collapse(true);\r
+                       each(rows, function(row, i) {\r
+                               rows[i] = cloneNode(row, true);\r
+                       });\r
 \r
-                                       return true;\r
+                       return rows;\r
+               };\r
 \r
-                               case "mceTableRowProps":\r
-                                       if (trElm == null)\r
-                                               return true;\r
+               function pasteRows(rows, before) {\r
+                       var selectedRows = getSelectedRows(),\r
+                               targetRow = selectedRows[before ? 0 : selectedRows.length - 1],\r
+                               targetCellCount = targetRow.cells.length;\r
 \r
-                                       if (user_interface) {\r
-                                               inst.windowManager.open({\r
-                                                       url : url + '/row.htm',\r
-                                                       width : 400 + parseInt(inst.getLang('table.rowprops_delta_width', 0)),\r
-                                                       height : 295 + parseInt(inst.getLang('table.rowprops_delta_height', 0)),\r
-                                                       inline : 1\r
-                                               }, {\r
-                                                       plugin_url : url\r
-                                               });\r
-                                       }\r
+                       // Calc target cell count\r
+                       each(grid, function(row) {\r
+                               var match;\r
 \r
-                                       return true;\r
+                               targetCellCount = 0;\r
+                               each(row, function(cell, x) {\r
+                                       if (cell.real)\r
+                                               targetCellCount += cell.colspan;\r
 \r
-                               case "mceTableCellProps":\r
-                                       if (tdElm == null)\r
-                                               return true;\r
+                                       if (cell.elm.parentNode == targetRow)\r
+                                               match = 1;\r
+                               });\r
 \r
-                                       if (user_interface) {\r
-                                               inst.windowManager.open({\r
-                                                       url : url + '/cell.htm',\r
-                                                       width : 400 + parseInt(inst.getLang('table.cellprops_delta_width', 0)),\r
-                                                       height : 295 + parseInt(inst.getLang('table.cellprops_delta_height', 0)),\r
-                                                       inline : 1\r
-                                               }, {\r
-                                                       plugin_url : url\r
-                                               });\r
-                                       }\r
+                               if (match)\r
+                                       return false;\r
+                       });\r
 \r
-                                       return true;\r
+                       if (!before)\r
+                               rows.reverse();\r
 \r
-                               case "mceInsertTable":\r
-                                       if (user_interface) {\r
-                                               inst.windowManager.open({\r
-                                                       url : url + '/table.htm',\r
-                                                       width : 400 + parseInt(inst.getLang('table.table_delta_width', 0)),\r
-                                                       height : 320 + parseInt(inst.getLang('table.table_delta_height', 0)),\r
-                                                       inline : 1\r
-                                               }, {\r
-                                                       plugin_url : url,\r
-                                                       action : value ? value.action : 0\r
-                                               });\r
-                                       }\r
+                       each(rows, function(row) {\r
+                               var cellCount = row.cells.length, cell;\r
 \r
-                                       return true;\r
+                               // Remove col/rowspans\r
+                               for (i = 0; i < cellCount; i++) {\r
+                                       cell = row.cells[i];\r
+                                       cell.colSpan = cell.rowSpan = 1;\r
+                               }\r
 \r
-                               case "mceTableDelete":\r
-                                       var table = inst.dom.getParent(inst.selection.getNode(), "table");\r
-                                       if (table) {\r
-                                               table.parentNode.removeChild(table);\r
-                                               inst.execCommand('mceRepaint');\r
-                                       }\r
-                                       return true;\r
-\r
-                               case "mceTableSplitCells":\r
-                               case "mceTableMergeCells":\r
-                               case "mceTableInsertRowBefore":\r
-                               case "mceTableInsertRowAfter":\r
-                               case "mceTableDeleteRow":\r
-                               case "mceTableInsertColBefore":\r
-                               case "mceTableInsertColAfter":\r
-                               case "mceTableDeleteCol":\r
-                               case "mceTableCutRow":\r
-                               case "mceTableCopyRow":\r
-                               case "mceTablePasteRowBefore":\r
-                               case "mceTablePasteRowAfter":\r
-                                       // No table just return (invalid command)\r
-                                       if (!tableElm)\r
-                                               return true;\r
-\r
-                                       // Table has a tbody use that reference\r
-                                       // Changed logic by ApTest 2005.07.12 (www.aptest.com)\r
-                                       // Now lookk at the focused element and take its parentNode.  That will be a tbody or a table.\r
-                                       if (trElm && tableElm != trElm.parentNode)\r
-                                               tableElm = trElm.parentNode;\r
-\r
-                                       if (tableElm && trElm) {\r
-                                               switch (command) {\r
-                                                       case "mceTableCutRow":\r
-                                                               if (!trElm || !tdElm)\r
-                                                                       return true;\r
-\r
-                                                               inst.tableRowClipboard = copyRow(doc, tableElm, trElm);\r
-                                                               inst.execCommand("mceTableDeleteRow");\r
-                                                               break;\r
-\r
-                                                       case "mceTableCopyRow":\r
-                                                               if (!trElm || !tdElm)\r
-                                                                       return true;\r
-\r
-                                                               inst.tableRowClipboard = copyRow(doc, tableElm, trElm);\r
-                                                               break;\r
-\r
-                                                       case "mceTablePasteRowBefore":\r
-                                                               if (!trElm || !tdElm)\r
-                                                                       return true;\r
-\r
-                                                               var newTR = inst.tableRowClipboard.cloneNode(true);\r
-\r
-                                                               var prevTR = prevElm(trElm, "TR");\r
-                                                               if (prevTR != null)\r
-                                                                       trimRow(tableElm, prevTR, prevTR.cells[0], newTR);\r
-\r
-                                                               trElm.parentNode.insertBefore(newTR, trElm);\r
-                                                               break;\r
-\r
-                                                       case "mceTablePasteRowAfter":\r
-                                                               if (!trElm || !tdElm)\r
-                                                                       return true;\r
-                                                               \r
-                                                               var nextTR = nextElm(trElm, "TR");\r
-                                                               var newTR = inst.tableRowClipboard.cloneNode(true);\r
-\r
-                                                               trimRow(tableElm, trElm, tdElm, newTR);\r
-\r
-                                                               if (nextTR == null)\r
-                                                                       trElm.parentNode.appendChild(newTR);\r
-                                                               else\r
-                                                                       nextTR.parentNode.insertBefore(newTR, nextTR);\r
-\r
-                                                               break;\r
-\r
-                                                       case "mceTableInsertRowBefore":\r
-                                                               if (!trElm || !tdElm)\r
-                                                                       return true;\r
-\r
-                                                               var grid = getTableGrid(tableElm);\r
-                                                               var cpos = getCellPos(grid, tdElm);\r
-                                                               var newTR = doc.createElement("tr");\r
-                                                               var lastTDElm = null;\r
-\r
-                                                               cpos.rowindex--;\r
-                                                               if (cpos.rowindex < 0)\r
-                                                                       cpos.rowindex = 0;\r
-\r
-                                                               // Create cells\r
-                                                               for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
-                                                                       if (tdElm != lastTDElm) {\r
-                                                                               var sd = getColRowSpan(tdElm);\r
-\r
-                                                                               if (sd['rowspan'] == 1) {\r
-                                                                                       var newTD = doc.createElement("td");\r
-\r
-                                                                                       if (!tinymce.isIE)\r
-                                                                                               newTD.innerHTML = '<br mce_bogus="1"/>';\r
-\r
-                                                                                       newTD.colSpan = tdElm.colSpan;\r
-\r
-                                                                                       newTR.appendChild(newTD);\r
-                                                                               } else\r
-                                                                                       tdElm.rowSpan = sd['rowspan'] + 1;\r
-\r
-                                                                               lastTDElm = tdElm;\r
-                                                                       }\r
-                                                               }\r
+                               // Needs more cells\r
+                               for (i = cellCount; i < targetCellCount; i++)\r
+                                       row.appendChild(cloneCell(row.cells[cellCount - 1]));\r
 \r
-                                                               trElm.parentNode.insertBefore(newTR, trElm);\r
-                                                               select(0, 1);\r
-                                                       break;\r
+                               // Needs less cells\r
+                               for (i = targetCellCount; i < cellCount; i++)\r
+                                       dom.remove(row.cells[i]);\r
 \r
-                                                       case "mceTableInsertRowAfter":\r
-                                                               if (!trElm || !tdElm)\r
-                                                                       return true;\r
+                               // Add before/after\r
+                               if (before)\r
+                                       targetRow.parentNode.insertBefore(row, targetRow);\r
+                               else\r
+                                       dom.insertAfter(row, targetRow);\r
+                       });\r
+               };\r
 \r
-                                                               var grid = getTableGrid(tableElm);\r
-                                                               var cpos = getCellPos(grid, tdElm);\r
-                                                               var newTR = doc.createElement("tr");\r
-                                                               var lastTDElm = null;\r
+               function getPos(target) {\r
+                       var pos;\r
 \r
-                                                               // Create cells\r
-                                                               for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
-                                                                       if (tdElm != lastTDElm) {\r
-                                                                               var sd = getColRowSpan(tdElm);\r
+                       each(grid, function(row, y) {\r
+                               each(row, function(cell, x) {\r
+                                       if (cell.elm == target) {\r
+                                               pos = {x : x, y : y};\r
+                                               return false;\r
+                                       }\r
+                               });\r
 \r
-                                                                               if (sd['rowspan'] == 1) {\r
-                                                                                       var newTD = doc.createElement("td");\r
+                               return !pos;\r
+                       });\r
 \r
-                                                                                       if (!tinymce.isIE)\r
-                                                                                               newTD.innerHTML = '<br mce_bogus="1"/>';\r
+                       return pos;\r
+               };\r
 \r
-                                                                                       newTD.colSpan = tdElm.colSpan;\r
+               function setStartCell(cell) {\r
+                       startPos = getPos(cell);\r
+               };\r
 \r
-                                                                                       newTR.appendChild(newTD);\r
-                                                                               } else\r
-                                                                                       tdElm.rowSpan = sd['rowspan'] + 1;\r
+               function findEndPos() {\r
+                       var pos, maxX, maxY;\r
 \r
-                                                                               lastTDElm = tdElm;\r
-                                                                       }\r
-                                                               }\r
+                       maxX = maxY = 0;\r
 \r
-                                                               if (newTR.hasChildNodes()) {\r
-                                                                       var nextTR = nextElm(trElm, "TR");\r
-                                                                       if (nextTR)\r
-                                                                               nextTR.parentNode.insertBefore(newTR, nextTR);\r
-                                                                       else\r
-                                                                               tableElm.appendChild(newTR);\r
-                                                               }\r
+                       each(grid, function(row, y) {\r
+                               each(row, function(cell, x) {\r
+                                       var colSpan, rowSpan;\r
 \r
-                                                               select(0, 1);\r
-                                                       break;\r
+                                       if (isCellSelected(cell)) {\r
+                                               cell = grid[y][x];\r
 \r
-                                                       case "mceTableDeleteRow":\r
-                                                               if (!trElm || !tdElm)\r
-                                                                       return true;\r
+                                               if (x > maxX)\r
+                                                       maxX = x;\r
 \r
-                                                               var grid = getTableGrid(tableElm);\r
-                                                               var cpos = getCellPos(grid, tdElm);\r
+                                               if (y > maxY)\r
+                                                       maxY = y;\r
 \r
-                                                               // Only one row, remove whole table\r
-                                                               if (grid.length == 1 && tableElm.nodeName == 'TBODY') {\r
-                                                                       inst.dom.remove(inst.dom.getParent(tableElm, "table"));\r
-                                                                       return true;\r
-                                                               }\r
+                                               if (cell.real) {\r
+                                                       colSpan = cell.colspan - 1;\r
+                                                       rowSpan = cell.rowspan - 1;\r
 \r
-                                                               // Move down row spanned cells\r
-                                                               var cells = trElm.cells;\r
-                                                               var nextTR = nextElm(trElm, "TR");\r
-                                                               for (var x=0; x<cells.length; x++) {\r
-                                                                       if (cells[x].rowSpan > 1) {\r
-                                                                               var newTD = cells[x].cloneNode(true);\r
-                                                                               var sd = getColRowSpan(cells[x]);\r
+                                                       if (colSpan) {\r
+                                                               if (x + colSpan > maxX)\r
+                                                                       maxX = x + colSpan;\r
+                                                       }\r
 \r
-                                                                               newTD.rowSpan = sd.rowspan - 1;\r
+                                                       if (rowSpan) {\r
+                                                               if (y + rowSpan > maxY)\r
+                                                                       maxY = y + rowSpan;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               });\r
+                       });\r
 \r
-                                                                               var nextTD = nextTR.cells[x];\r
+                       return {x : maxX, y : maxY};\r
+               };\r
 \r
-                                                                               if (nextTD == null)\r
-                                                                                       nextTR.appendChild(newTD);\r
-                                                                               else\r
-                                                                                       nextTR.insertBefore(newTD, nextTD);\r
-                                                                       }\r
-                                                               }\r
+               function setEndCell(cell) {\r
+                       var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan;\r
 \r
-                                                               // Delete cells\r
-                                                               var lastTDElm = null;\r
-                                                               for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
-                                                                       if (tdElm != lastTDElm) {\r
-                                                                               var sd = getColRowSpan(tdElm);\r
+                       endPos = getPos(cell);\r
 \r
-                                                                               if (sd.rowspan > 1) {\r
-                                                                                       tdElm.rowSpan = sd.rowspan - 1;\r
-                                                                               } else {\r
-                                                                                       trElm = tdElm.parentNode;\r
+                       if (startPos && endPos) {\r
+                               // Get start/end positions\r
+                               startX = Math.min(startPos.x, endPos.x);\r
+                               startY = Math.min(startPos.y, endPos.y);\r
+                               endX = Math.max(startPos.x, endPos.x);\r
+                               endY = Math.max(startPos.y, endPos.y);\r
 \r
-                                                                                       if (trElm.parentNode)\r
-                                                                                               trElm._delete = true;\r
-                                                                               }\r
+                               // Expand end positon to include spans\r
+                               maxX = endX;\r
+                               maxY = endY;\r
 \r
-                                                                               lastTDElm = tdElm;\r
-                                                                       }\r
-                                                               }\r
+                               // Expand startX\r
+                               for (y = startY; y <= maxY; y++) {\r
+                                       cell = grid[y][startX];\r
 \r
-                                                               deleteMarked(tableElm);\r
+                                       if (!cell.real) {\r
+                                               if (startX - (cell.colspan - 1) < startX)\r
+                                                       startX -= cell.colspan - 1;\r
+                                       }\r
+                               }\r
 \r
-                                                               select(0, -1);\r
-                                                       break;\r
+                               // Expand startY\r
+                               for (x = startX; x <= maxX; x++) {\r
+                                       cell = grid[startY][x];\r
 \r
-                                                       case "mceTableInsertColBefore":\r
-                                                               if (!trElm || !tdElm)\r
-                                                                       return true;\r
+                                       if (!cell.real) {\r
+                                               if (startY - (cell.rowspan - 1) < startY)\r
+                                                       startY -= cell.rowspan - 1;\r
+                                       }\r
+                               }\r
 \r
-                                                               var grid = getTableGrid(inst.dom.getParent(tableElm, "table"));\r
-                                                               var cpos = getCellPos(grid, tdElm);\r
-                                                               var lastTDElm = null;\r
+                               // Find max X, Y\r
+                               for (y = startY; y <= endY; y++) {\r
+                                       for (x = startX; x <= endX; x++) {\r
+                                               cell = grid[y][x];\r
 \r
-                                                               for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
-                                                                       if (tdElm != lastTDElm) {\r
-                                                                               var sd = getColRowSpan(tdElm);\r
+                                               if (cell.real) {\r
+                                                       colSpan = cell.colspan - 1;\r
+                                                       rowSpan = cell.rowspan - 1;\r
 \r
-                                                                               if (sd['colspan'] == 1) {\r
-                                                                                       var newTD = doc.createElement(tdElm.nodeName);\r
+                                                       if (colSpan) {\r
+                                                               if (x + colSpan > maxX)\r
+                                                                       maxX = x + colSpan;\r
+                                                       }\r
 \r
-                                                                                       if (!tinymce.isIE)\r
-                                                                                               newTD.innerHTML = '<br mce_bogus="1"/>';\r
+                                                       if (rowSpan) {\r
+                                                               if (y + rowSpan > maxY)\r
+                                                                       maxY = y + rowSpan;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
 \r
-                                                                                       newTD.rowSpan = tdElm.rowSpan;\r
+                               // Remove current selection\r
+                               dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');\r
 \r
-                                                                                       tdElm.parentNode.insertBefore(newTD, tdElm);\r
-                                                                               } else\r
-                                                                                       tdElm.colSpan++;\r
+                               // Add new selection\r
+                               for (y = startY; y <= maxY; y++) {\r
+                                       for (x = startX; x <= maxX; x++)\r
+                                               dom.addClass(grid[y][x].elm, 'mceSelected');\r
+                               }\r
+                       }\r
+               };\r
+\r
+               // Expose to public\r
+               tinymce.extend(this, {\r
+                       deleteTable : deleteTable,\r
+                       split : split,\r
+                       merge : merge,\r
+                       insertRow : insertRow,\r
+                       insertCol : insertCol,\r
+                       deleteCols : deleteCols,\r
+                       deleteRows : deleteRows,\r
+                       cutRows : cutRows,\r
+                       copyRows : copyRows,\r
+                       pasteRows : pasteRows,\r
+                       getPos : getPos,\r
+                       setStartCell : setStartCell,\r
+                       setEndCell : setEndCell\r
+               });\r
+       };\r
 \r
-                                                                               lastTDElm = tdElm;\r
-                                                                       }\r
-                                                               }\r
+       tinymce.create('tinymce.plugins.TablePlugin', {\r
+               init : function(ed, url) {\r
+                       var winMan, clipboardRows;\r
 \r
-                                                               select();\r
-                                                       break;\r
+                       function createTableGrid(node) {\r
+                               var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table');\r
 \r
-                                                       case "mceTableInsertColAfter":\r
-                                                               if (!trElm || !tdElm)\r
-                                                                       return true;\r
+                               if (tblElm)\r
+                                       return new TableGrid(tblElm, ed.dom, selection);\r
+                       };\r
 \r
-                                                               var grid = getTableGrid(inst.dom.getParent(tableElm, "table"));\r
-                                                               var cpos = getCellPos(grid, tdElm);\r
-                                                               var lastTDElm = null;\r
+                       function cleanup() {\r
+                               // Restore selection possibilities\r
+                               ed.getBody().style.webkitUserSelect = '';\r
+                               ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');\r
+                       };\r
 \r
-                                                               for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
-                                                                       if (tdElm != lastTDElm) {\r
-                                                                               var sd = getColRowSpan(tdElm);\r
+                       // Register buttons\r
+                       each([\r
+                               ['table', 'table.desc', 'mceInsertTable', true],\r
+                               ['delete_table', 'table.del', 'mceTableDelete'],\r
+                               ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'],\r
+                               ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'],\r
+                               ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'],\r
+                               ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'],\r
+                               ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'],\r
+                               ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'],\r
+                               ['row_props', 'table.row_desc', 'mceTableRowProps', true],\r
+                               ['cell_props', 'table.cell_desc', 'mceTableCellProps', true],\r
+                               ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true],\r
+                               ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true]\r
+                       ], function(c) {\r
+                               ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]});\r
+                       });\r
 \r
-                                                                               if (sd['colspan'] == 1) {\r
-                                                                                       var newTD = doc.createElement(tdElm.nodeName);\r
+                       // Select whole table is a table border is clicked\r
+                       if (!tinymce.isIE) {\r
+                               ed.onClick.add(function(ed, e) {\r
+                                       e = e.target;\r
 \r
-                                                                                       if (!tinymce.isIE)\r
-                                                                                               newTD.innerHTML = '<br mce_bogus="1"/>';\r
+                                       if (e.nodeName === 'TABLE')\r
+                                               ed.selection.select(e);\r
+                               });\r
+                       }\r
 \r
-                                                                                       newTD.rowSpan = tdElm.rowSpan;\r
+                       // Handle node change updates\r
+                       ed.onNodeChange.add(function(ed, cm, n) {\r
+                               var p;\r
 \r
-                                                                                       var nextTD = nextElm(tdElm, "TD,TH");\r
-                                                                                       if (nextTD == null)\r
-                                                                                               tdElm.parentNode.appendChild(newTD);\r
-                                                                                       else\r
-                                                                                               nextTD.parentNode.insertBefore(newTD, nextTD);\r
-                                                                               } else\r
-                                                                                       tdElm.colSpan++;\r
+                               n = ed.selection.getStart();\r
+                               p = ed.dom.getParent(n, 'td,th,caption');\r
+                               cm.setActive('table', n.nodeName === 'TABLE' || !!p);\r
 \r
-                                                                               lastTDElm = tdElm;\r
-                                                                       }\r
-                                                               }\r
+                               // Disable table tools if we are in caption\r
+                               if (p && p.nodeName === 'CAPTION')\r
+                                       p = 0;\r
 \r
-                                                               select(1);\r
-                                                       break;\r
+                               cm.setDisabled('delete_table', !p);\r
+                               cm.setDisabled('delete_col', !p);\r
+                               cm.setDisabled('delete_table', !p);\r
+                               cm.setDisabled('delete_row', !p);\r
+                               cm.setDisabled('col_after', !p);\r
+                               cm.setDisabled('col_before', !p);\r
+                               cm.setDisabled('row_after', !p);\r
+                               cm.setDisabled('row_before', !p);\r
+                               cm.setDisabled('row_props', !p);\r
+                               cm.setDisabled('cell_props', !p);\r
+                               cm.setDisabled('split_cells', !p);\r
+                               cm.setDisabled('merge_cells', !p);\r
+                       });\r
 \r
-                                                       case "mceTableDeleteCol":\r
-                                                               if (!trElm || !tdElm)\r
-                                                                       return true;\r
+                       ed.onInit.add(function(ed) {\r
+                               var startTable, startCell, dom = ed.dom, tableGrid;\r
 \r
-                                                               var grid = getTableGrid(tableElm);\r
-                                                               var cpos = getCellPos(grid, tdElm);\r
-                                                               var lastTDElm = null;\r
+                               winMan = ed.windowManager;\r
 \r
-                                                               // Only one col, remove whole table\r
-                                                               if ((grid.length > 1 && grid[0].length <= 1) && tableElm.nodeName == 'TBODY') {\r
-                                                                       inst.dom.remove(inst.dom.getParent(tableElm, "table"));\r
-                                                                       return true;\r
-                                                               }\r
+                               // Add cell selection logic\r
+                               ed.onMouseDown.add(function(ed, e) {\r
+                                       if (e.button != 2) {\r
+                                               cleanup();\r
 \r
-                                                               // Delete cells\r
-                                                               for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
-                                                                       if (tdElm != lastTDElm) {\r
-                                                                               var sd = getColRowSpan(tdElm);\r
+                                               startCell = dom.getParent(e.target, 'td,th');\r
+                                               startTable = dom.getParent(startCell, 'table');\r
+                                       }\r
+                               });\r
 \r
-                                                                               if (sd['colspan'] > 1)\r
-                                                                                       tdElm.colSpan = sd['colspan'] - 1;\r
-                                                                               else {\r
-                                                                                       if (tdElm.parentNode)\r
-                                                                                               tdElm.parentNode.removeChild(tdElm);\r
-                                                                               }\r
+                               dom.bind(ed.getDoc(), 'mouseover', function(e) {\r
+                                       var sel, table, target = e.target;\r
 \r
-                                                                               lastTDElm = tdElm;\r
-                                                                       }\r
-                                                               }\r
+                                       if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) {\r
+                                               table = dom.getParent(target, 'table');\r
+                                               if (table == startTable) {\r
+                                                       if (!tableGrid) {\r
+                                                               tableGrid = createTableGrid(table);\r
+                                                               tableGrid.setStartCell(startCell);\r
 \r
-                                                               select(-1);\r
-                                                       break;\r
+                                                               ed.getBody().style.webkitUserSelect = 'none';\r
+                                                       }\r
 \r
-                                               case "mceTableSplitCells":\r
-                                                       if (!trElm || !tdElm)\r
-                                                               return true;\r
+                                                       tableGrid.setEndCell(target);\r
+                                               }\r
 \r
-                                                       var spandata = getColRowSpan(tdElm);\r
+                                               // Remove current selection\r
+                                               sel = ed.selection.getSel();\r
 \r
-                                                       var colspan = spandata["colspan"];\r
-                                                       var rowspan = spandata["rowspan"];\r
+                                               if (sel.removeAllRanges)\r
+                                                       sel.removeAllRanges();\r
+                                               else\r
+                                                       sel.empty();\r
 \r
-                                                       // Needs splitting\r
-                                                       if (colspan > 1 || rowspan > 1) {\r
-                                                               // Generate cols\r
-                                                               tdElm.colSpan = 1;\r
-                                                               for (var i=1; i<colspan; i++) {\r
-                                                                       var newTD = doc.createElement("td");\r
+                                               e.preventDefault();\r
+                                       }\r
+                               });\r
 \r
-                                                                       if (!tinymce.isIE)\r
-                                                                               newTD.innerHTML = '<br mce_bogus="1"/>';\r
+                               ed.onMouseUp.add(function(ed, e) {\r
+                                       var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode;\r
 \r
-                                                                       trElm.insertBefore(newTD, nextElm(tdElm, "TD,TH"));\r
+                                       // Move selection to startCell\r
+                                       if (startCell) {\r
+                                               if (tableGrid)\r
+                                                       ed.getBody().style.webkitUserSelect = '';\r
 \r
-                                                                       if (rowspan > 1)\r
-                                                                               addRows(newTD, trElm, rowspan);\r
-                                                               }\r
+                                               function setPoint(node, start) {\r
+                                                       var walker = new tinymce.dom.TreeWalker(node, node);\r
 \r
-                                                               addRows(tdElm, trElm, rowspan);\r
-                                                       }\r
+                                                       do {\r
+                                                               // Text node\r
+                                                               if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) {\r
+                                                                       if (start)\r
+                                                                               rng.setStart(node, 0);\r
+                                                                       else\r
+                                                                               rng.setEnd(node, node.nodeValue.length);\r
 \r
-                                                       // Apply visual aids\r
-                                                       tableElm = inst.dom.getParent(inst.selection.getNode(), "table");\r
-                                                       break;\r
+                                                                       return;\r
+                                                               }\r
 \r
-                                               case "mceTableMergeCells":\r
-                                                       var rows = [];\r
-                                                       var sel = inst.selection.getSel();\r
-                                                       var grid = getTableGrid(tableElm);\r
-\r
-                                                       if (tinymce.isIE || sel.rangeCount == 1) {\r
-                                                               if (user_interface) {\r
-                                                                       // Setup template\r
-                                                                       var sp = getColRowSpan(tdElm);\r
-\r
-                                                                       inst.windowManager.open({\r
-                                                                               url : url + '/merge_cells.htm',\r
-                                                                               width : 240 + parseInt(inst.getLang('table.merge_cells_delta_width', 0)),\r
-                                                                               height : 110 + parseInt(inst.getLang('table.merge_cells_delta_height', 0)),\r
-                                                                               inline : 1\r
-                                                                       }, {\r
-                                                                               action : "update",\r
-                                                                               numcols : sp.colspan,\r
-                                                                               numrows : sp.rowspan,\r
-                                                                               plugin_url : url\r
-                                                                       });\r
-\r
-                                                                       return true;\r
-                                                               } else {\r
-                                                                       var numRows = parseInt(value['numrows']);\r
-                                                                       var numCols = parseInt(value['numcols']);\r
-                                                                       var cpos = getCellPos(grid, tdElm);\r
-\r
-                                                                       if (("" + numRows) == "NaN")\r
-                                                                               numRows = 1;\r
-\r
-                                                                       if (("" + numCols) == "NaN")\r
-                                                                               numCols = 1;\r
-\r
-                                                                       // Get rows and cells\r
-                                                                       var tRows = tableElm.rows;\r
-                                                                       for (var y=cpos.rowindex; y<grid.length; y++) {\r
-                                                                               var rowCells = [];\r
-\r
-                                                                               for (var x=cpos.cellindex; x<grid[y].length; x++) {\r
-                                                                                       var td = getCell(grid, y, x);\r
-\r
-                                                                                       if (td && !inArray(rows, td) && !inArray(rowCells, td)) {\r
-                                                                                               var cp = getCellPos(grid, td);\r
-\r
-                                                                                               // Within range\r
-                                                                                               if (cp.cellindex < cpos.cellindex+numCols && cp.rowindex < cpos.rowindex+numRows)\r
-                                                                                                       rowCells[rowCells.length] = td;\r
-                                                                                       }\r
-                                                                               }\r
-\r
-                                                                               if (rowCells.length > 0)\r
-                                                                                       rows[rows.length] = rowCells;\r
-\r
-                                                                               var td = getCell(grid, cpos.rowindex, cpos.cellindex);\r
-                                                                               each(ed.dom.select('br', td), function(e, i) {\r
-                                                                                       if (i > 0 && ed.dom.getAttrib('mce_bogus'))\r
-                                                                                               ed.dom.remove(e);\r
-                                                                               });\r
-                                                                       }\r
+                                                               // BR element\r
+                                                               if (node.nodeName == 'BR') {\r
+                                                                       if (start)\r
+                                                                               rng.setStartBefore(node);\r
+                                                                       else\r
+                                                                               rng.setEndBefore(node);\r
 \r
-                                                                       //return true;\r
+                                                                       return;\r
                                                                }\r
-                                                       } else {\r
-                                                               var cells = [];\r
-                                                               var sel = inst.selection.getSel();\r
-                                                               var lastTR = null;\r
-                                                               var curRow = null;\r
-                                                               var x1 = -1, y1 = -1, x2, y2;\r
-\r
-                                                               // Only one cell selected, whats the point?\r
-                                                               if (sel.rangeCount < 2)\r
-                                                                       return true;\r
-\r
-                                                               // Get all selected cells\r
-                                                               for (var i=0; i<sel.rangeCount; i++) {\r
-                                                                       var rng = sel.getRangeAt(i);\r
-                                                                       var tdElm = rng.startContainer.childNodes[rng.startOffset];\r
-\r
-                                                                       if (!tdElm)\r
+                                                       } while (node = (start ? walker.next() : walker.prev()));\r
+                                               };\r
+\r
+                                               // Try to expand text selection as much as we can only Gecko supports cell selection\r
+                                               selectedCells = dom.select('td.mceSelected,th.mceSelected');\r
+                                               if (selectedCells.length > 0) {\r
+                                                       rng = dom.createRng();\r
+                                                       node = selectedCells[0];\r
+                                                       endNode = selectedCells[selectedCells.length - 1];\r
+\r
+                                                       setPoint(node, 1);\r
+                                                       walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table'));\r
+\r
+                                                       do {\r
+                                                               if (node.nodeName == 'TD' || node.nodeName == 'TH') {\r
+                                                                       if (!dom.hasClass(node, 'mceSelected'))\r
                                                                                break;\r
 \r
-                                                                       if (tdElm.nodeName == "TD" || tdElm.nodeName == "TH")\r
-                                                                               cells[cells.length] = tdElm;\r
+                                                                       lastNode = node;\r
                                                                }\r
+                                                       } while (node = walker.next());\r
 \r
-                                                               // Get rows and cells\r
-                                                               var tRows = tableElm.rows;\r
-                                                               for (var y=0; y<tRows.length; y++) {\r
-                                                                       var rowCells = [];\r
+                                                       setPoint(lastNode);\r
 \r
-                                                                       for (var x=0; x<tRows[y].cells.length; x++) {\r
-                                                                               var td = tRows[y].cells[x];\r
+                                                       sel.setRng(rng);\r
+                                               }\r
 \r
-                                                                               for (var i=0; i<cells.length; i++) {\r
-                                                                                       if (td == cells[i]) {\r
-                                                                                               rowCells[rowCells.length] = td;\r
-                                                                                       }\r
-                                                                               }\r
-                                                                       }\r
+                                               ed.nodeChanged();\r
+                                               startCell = tableGrid = startTable = null;\r
+                                       }\r
+                               });\r
 \r
-                                                                       if (rowCells.length > 0)\r
-                                                                               rows[rows.length] = rowCells;\r
-                                                               }\r
+                               ed.onKeyUp.add(function(ed, e) {\r
+                                       cleanup();\r
+                               });\r
 \r
-                                                               // Find selected cells in grid and box\r
-                                                               var curRow = [];\r
-                                                               var lastTR = null;\r
-                                                               for (var y=0; y<grid.length; y++) {\r
-                                                                       for (var x=0; x<grid[y].length; x++) {\r
-                                                                               grid[y][x]._selected = false;\r
-\r
-                                                                               for (var i=0; i<cells.length; i++) {\r
-                                                                                       if (grid[y][x] == cells[i]) {\r
-                                                                                               // Get start pos\r
-                                                                                               if (x1 == -1) {\r
-                                                                                                       x1 = x;\r
-                                                                                                       y1 = y;\r
-                                                                                               }\r
-\r
-                                                                                               // Get end pos\r
-                                                                                               x2 = x;\r
-                                                                                               y2 = y;\r
-\r
-                                                                                               grid[y][x]._selected = true;\r
-                                                                                       }\r
-                                                                               }\r
-                                                                       }\r
-                                                               }\r
+                               // Add context menu\r
+                               if (ed && ed.plugins.contextmenu) {\r
+                                       ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {\r
+                                               var sm, se = ed.selection, el = se.getNode() || ed.getBody();\r
 \r
-                                                               // Is there gaps, if so deny\r
-                                                               for (var y=y1; y<=y2; y++) {\r
-                                                                       for (var x=x1; x<=x2; x++) {\r
-                                                                               if (!grid[y][x]._selected) {\r
-                                                                                       alert("Invalid selection for merge.");\r
-                                                                                       return true;\r
-                                                                               }\r
-                                                                       }\r
-                                                               }\r
+                                               if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th') || ed.dom.select('td.mceSelected,th.mceSelected').length) {\r
+                                                       m.removeAll();\r
+\r
+                                                       if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) {\r
+                                                               m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});\r
+                                                               m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});\r
+                                                               m.addSeparator();\r
                                                        }\r
 \r
-                                                       // Validate selection and get total rowspan and colspan\r
-                                                       var rowSpan = 1, colSpan = 1;\r
+                                                       if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) {\r
+                                                               m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});\r
+                                                               m.addSeparator();\r
+                                                       }\r
 \r
-                                                       // Validate horizontal and get total colspan\r
-                                                       var lastRowSpan = -1;\r
-                                                       for (var y=0; y<rows.length; y++) {\r
-                                                               var rowColSpan = 0;\r
+                                                       m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', value : {action : 'insert'}});\r
+                                                       m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'});\r
+                                                       m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'});\r
+                                                       m.addSeparator();\r
 \r
-                                                               for (var x=0; x<rows[y].length; x++) {\r
-                                                                       var sd = getColRowSpan(rows[y][x]);\r
+                                                       // Cell menu\r
+                                                       sm = m.addMenu({title : 'table.cell'});\r
+                                                       sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'});\r
+                                                       sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'});\r
+                                                       sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'});\r
 \r
-                                                                       rowColSpan += sd['colspan'];\r
+                                                       // Row menu\r
+                                                       sm = m.addMenu({title : 'table.row'});\r
+                                                       sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'});\r
+                                                       sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'});\r
+                                                       sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'});\r
+                                                       sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'});\r
+                                                       sm.addSeparator();\r
+                                                       sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'});\r
+                                                       sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'});\r
+                                                       sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'}).setDisabled(!clipboardRows);\r
+                                                       sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows);\r
 \r
-                                                                       if (lastRowSpan != -1 && sd['rowspan'] != lastRowSpan) {\r
-                                                                               alert("Invalid selection for merge.");\r
-                                                                               return true;\r
-                                                                       }\r
+                                                       // Column menu\r
+                                                       sm = m.addMenu({title : 'table.col'});\r
+                                                       sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'});\r
+                                                       sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'});\r
+                                                       sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'});\r
+                                               } else\r
+                                                       m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable'});\r
+                                       });\r
+                               }\r
 \r
-                                                                       lastRowSpan = sd['rowspan'];\r
-                                                               }\r
+                               // Fixes an issue on Gecko where it's impossible to place the caret behind a table\r
+                               // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled\r
+                               if (!tinymce.isIE) {\r
+                                       function fixTableCaretPos() {\r
+                                               var last;\r
 \r
-                                                               if (rowColSpan > colSpan)\r
-                                                                       colSpan = rowColSpan;\r
+                                               // Skip empty text nodes form the end\r
+                                               for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ;\r
 \r
-                                                               lastRowSpan = -1;\r
-                                                       }\r
+                                               if (last && last.nodeName == 'TABLE')\r
+                                                       ed.dom.add(ed.getBody(), 'p', null, '<br mce_bogus="1" />');\r
+                                       };\r
 \r
-                                                       // Validate vertical and get total rowspan\r
-                                                       var lastColSpan = -1;\r
-                                                       for (var x=0; x<rows[0].length; x++) {\r
-                                                               var colRowSpan = 0;\r
+                                       // Fixes an bug where it's impossible to place the caret before a table in Gecko\r
+                                       // this fix solves it by detecting when the caret is at the beginning of such a table\r
+                                       // and then manually moves the caret infront of the table\r
+                                       if (tinymce.isGecko) {\r
+                                               ed.onKeyDown.add(function(ed, e) {\r
+                                                       var rng, table, dom = ed.dom;\r
 \r
-                                                               for (var y=0; y<rows.length; y++) {\r
-                                                                       var sd = getColRowSpan(rows[y][x]);\r
+                                                       // On gecko it's not possible to place the caret before a table\r
+                                                       if (e.keyCode == 37 || e.keyCode == 38) {\r
+                                                               rng = ed.selection.getRng();\r
+                                                               table = dom.getParent(rng.startContainer, 'table');\r
 \r
-                                                                       colRowSpan += sd['rowspan'];\r
+                                                               if (table && ed.getBody().firstChild == table) {\r
+                                                                       if (isAtStart(rng, table)) {\r
+                                                                               rng = dom.createRng();\r
 \r
-                                                                       if (lastColSpan != -1 && sd['colspan'] != lastColSpan) {\r
-                                                                               alert("Invalid selection for merge.");\r
-                                                                               return true;\r
-                                                                       }\r
+                                                                               rng.setStartBefore(table);\r
+                                                                               rng.setEndBefore(table);\r
 \r
-                                                                       lastColSpan = sd['colspan'];\r
+                                                                               ed.selection.setRng(rng);\r
+\r
+                                                                               e.preventDefault();\r
+                                                                       }\r
                                                                }\r
+                                                       }\r
+                                               });\r
+                                       }\r
 \r
-                                                               if (colRowSpan > rowSpan)\r
-                                                                       rowSpan = colRowSpan;\r
+                                       ed.onKeyUp.add(fixTableCaretPos);\r
+                                       ed.onSetContent.add(fixTableCaretPos);\r
+                                       ed.onVisualAid.add(fixTableCaretPos);\r
 \r
-                                                               lastColSpan = -1;\r
-                                                       }\r
+                                       ed.onPreProcess.add(function(ed, o) {\r
+                                               var last = o.node.lastChild;\r
 \r
-                                                       // Setup td\r
-                                                       tdElm = rows[0][0];\r
-                                                       tdElm.rowSpan = rowSpan;\r
-                                                       tdElm.colSpan = colSpan;\r
+                                               if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR')\r
+                                                       ed.dom.remove(last);\r
+                                       });\r
 \r
-                                                       // Merge cells\r
-                                                       for (var y=0; y<rows.length; y++) {\r
-                                                               for (var x=0; x<rows[y].length; x++) {\r
-                                                                       var html = rows[y][x].innerHTML;\r
-                                                                       var chk = html.replace(/[ \t\r\n]/g, "");\r
+                                       fixTableCaretPos();\r
+                               }\r
+                       });\r
 \r
-                                                                       if (chk != "<br/>" && chk != "<br>" && chk != '<br mce_bogus="1"/>' && (x+y > 0))\r
-                                                                               tdElm.innerHTML += html;\r
+                       // Register action commands\r
+                       each({\r
+                               mceTableSplitCells : function(grid) {\r
+                                       grid.split();\r
+                               },\r
 \r
-                                                                       // Not current cell\r
-                                                                       if (rows[y][x] != tdElm && !rows[y][x]._deleted) {\r
-                                                                               var cpos = getCellPos(grid, rows[y][x]);\r
-                                                                               var tr = rows[y][x].parentNode;\r
+                               mceTableMergeCells : function(grid) {\r
+                                       var rowSpan, colSpan, cell;\r
 \r
-                                                                               tr.removeChild(rows[y][x]);\r
-                                                                               rows[y][x]._deleted = true;\r
+                                       cell = ed.dom.getParent(ed.selection.getNode(), 'th,td');\r
+                                       if (cell) {\r
+                                               rowSpan = cell.rowSpan;\r
+                                               colSpan = cell.colSpan;\r
+                                       }\r
 \r
-                                                                               // Empty TR, remove it\r
-                                                                               if (!tr.hasChildNodes()) {\r
-                                                                                       tr.parentNode.removeChild(tr);\r
+                                       if (!ed.dom.select('td.mceSelected,th.mceSelected').length) {\r
+                                               winMan.open({\r
+                                                       url : url + '/merge_cells.htm',\r
+                                                       width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)),\r
+                                                       height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)),\r
+                                                       inline : 1\r
+                                               }, {\r
+                                                       rows : rowSpan,\r
+                                                       cols : colSpan,\r
+                                                       onaction : function(data) {\r
+                                                               grid.merge(cell, data.cols, data.rows);\r
+                                                       },\r
+                                                       plugin_url : url\r
+                                               });\r
+                                       } else\r
+                                               grid.merge();\r
+                               },\r
 \r
-                                                                                       var lastCell = null;\r
-                                                                                       for (var x=0; cellElm = getCell(grid, cpos.rowindex, x); x++) {\r
-                                                                                               if (cellElm != lastCell && cellElm.rowSpan > 1)\r
-                                                                                                       cellElm.rowSpan--;\r
+                               mceTableInsertRowBefore : function(grid) {\r
+                                       grid.insertRow(true);\r
+                               },\r
 \r
-                                                                                               lastCell = cellElm;\r
-                                                                                       }\r
+                               mceTableInsertRowAfter : function(grid) {\r
+                                       grid.insertRow();\r
+                               },\r
 \r
-                                                                                       if (tdElm.rowSpan > 1)\r
-                                                                                               tdElm.rowSpan--;\r
-                                                                               }\r
-                                                                       }\r
-                                                               }\r
-                                                       }\r
+                               mceTableInsertColBefore : function(grid) {\r
+                                       grid.insertCol(true);\r
+                               },\r
 \r
-                                                       // Remove all but one bogus br\r
-                                                       each(ed.dom.select('br', tdElm), function(e, i) {\r
-                                                               if (i > 0 && ed.dom.getAttrib(e, 'mce_bogus'))\r
-                                                                       ed.dom.remove(e);\r
-                                                       });\r
+                               mceTableInsertColAfter : function(grid) {\r
+                                       grid.insertCol();\r
+                               },\r
 \r
-                                                       break;\r
-                                               }\r
+                               mceTableDeleteCol : function(grid) {\r
+                                       grid.deleteCols();\r
+                               },\r
 \r
-                                               tableElm = inst.dom.getParent(inst.selection.getNode(), "table");\r
-                                               inst.addVisual(tableElm);\r
-                                               inst.nodeChanged();\r
-                                       }\r
+                               mceTableDeleteRow : function(grid) {\r
+                                       grid.deleteRows();\r
+                               },\r
 \r
-                               return true;\r
-                       }\r
+                               mceTableCutRow : function(grid) {\r
+                                       clipboardRows = grid.cutRows();\r
+                               },\r
+\r
+                               mceTableCopyRow : function(grid) {\r
+                                       clipboardRows = grid.copyRows();\r
+                               },\r
+\r
+                               mceTablePasteRowBefore : function(grid) {\r
+                                       grid.pasteRows(clipboardRows, true);\r
+                               },\r
+\r
+                               mceTablePasteRowAfter : function(grid) {\r
+                                       grid.pasteRows(clipboardRows);\r
+                               },\r
 \r
-                       // Pass to next handler in chain\r
-                       return false;\r
+                               mceTableDelete : function(grid) {\r
+                                       grid.deleteTable();\r
+                               }\r
+                       }, function(func, name) {\r
+                               ed.addCommand(name, function() {\r
+                                       var grid = createTableGrid();\r
+\r
+                                       if (grid) {\r
+                                               func(grid);\r
+                                               ed.execCommand('mceRepaint');\r
+                                               cleanup();\r
+                                       }\r
+                               });\r
+                       });\r
+\r
+                       // Register dialog commands\r
+                       each({\r
+                               mceInsertTable : function(val) {\r
+                                       winMan.open({\r
+                                               url : url + '/table.htm',\r
+                                               width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)),\r
+                                               height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)),\r
+                                               inline : 1\r
+                                       }, {\r
+                                               plugin_url : url,\r
+                                               action : val ? val.action : 0\r
+                                       });\r
+                               },\r
+\r
+                               mceTableRowProps : function() {\r
+                                       winMan.open({\r
+                                               url : url + '/row.htm',\r
+                                               width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)),\r
+                                               height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)),\r
+                                               inline : 1\r
+                                       }, {\r
+                                               plugin_url : url\r
+                                       });\r
+                               },\r
+\r
+                               mceTableCellProps : function() {\r
+                                       winMan.open({\r
+                                               url : url + '/cell.htm',\r
+                                               width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)),\r
+                                               height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)),\r
+                                               inline : 1\r
+                                       }, {\r
+                                               plugin_url : url\r
+                                       });\r
+                               }\r
+                       }, function(func, name) {\r
+                               ed.addCommand(name, function(ui, val) {\r
+                                       func(val);\r
+                               });\r
+                       });\r
                }\r
        });\r
 \r
        // Register plugin\r
        tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin);\r
-})();
\ No newline at end of file
+})(tinymce);
\ No newline at end of file
index f23b06751d1f2831d2a46746192259163e213a57..b5fc1fda3d701ab6399793ec530e1379c73db445 100644 (file)
@@ -11,7 +11,7 @@ function init() {
        document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor')\r
 \r
        var inst = ed;\r
-       var tdElm = ed.dom.getParent(ed.selection.getNode(), "td,th");\r
+       var tdElm = ed.dom.getParent(ed.selection.getStart(), "td,th");\r
        var formObj = document.forms[0];\r
        var st = ed.dom.parseStyle(ed.dom.getAttrib(tdElm, "style"));\r
 \r
@@ -24,7 +24,7 @@ function init() {
        var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor'));\r
        var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor'));\r
        var className = ed.dom.getAttrib(tdElm, 'class');\r
-       var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;\r
+       var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1");\r
        var id = ed.dom.getAttrib(tdElm, 'id');\r
        var lang = ed.dom.getAttrib(tdElm, 'lang');\r
        var dir = ed.dom.getAttrib(tdElm, 'dir');\r
@@ -34,38 +34,55 @@ function init() {
        addClassesToList('class', 'table_cell_styles');\r
        TinyMCE_EditableSelects.init();\r
 \r
-       formObj.bordercolor.value = bordercolor;\r
-       formObj.bgcolor.value = bgcolor;\r
-       formObj.backgroundimage.value = backgroundimage;\r
-       formObj.width.value = width;\r
-       formObj.height.value = height;\r
-       formObj.id.value = id;\r
-       formObj.lang.value = lang;\r
-       formObj.style.value = ed.dom.serializeStyle(st);\r
-       selectByValue(formObj, 'align', align);\r
-       selectByValue(formObj, 'valign', valign);\r
-       selectByValue(formObj, 'class', className, true, true);\r
-       selectByValue(formObj, 'celltype', celltype);\r
-       selectByValue(formObj, 'dir', dir);\r
-       selectByValue(formObj, 'scope', scope);\r
-\r
-       // Resize some elements\r
-       if (isVisible('backgroundimagebrowser'))\r
-               document.getElementById('backgroundimage').style.width = '180px';\r
-\r
-       updateColor('bordercolor_pick', 'bordercolor');\r
-       updateColor('bgcolor_pick', 'bgcolor');\r
+       if (!ed.dom.hasClass(tdElm, 'mceSelected')) {\r
+               formObj.bordercolor.value = bordercolor;\r
+               formObj.bgcolor.value = bgcolor;\r
+               formObj.backgroundimage.value = backgroundimage;\r
+               formObj.width.value = width;\r
+               formObj.height.value = height;\r
+               formObj.id.value = id;\r
+               formObj.lang.value = lang;\r
+               formObj.style.value = ed.dom.serializeStyle(st);\r
+               selectByValue(formObj, 'align', align);\r
+               selectByValue(formObj, 'valign', valign);\r
+               selectByValue(formObj, 'class', className, true, true);\r
+               selectByValue(formObj, 'celltype', celltype);\r
+               selectByValue(formObj, 'dir', dir);\r
+               selectByValue(formObj, 'scope', scope);\r
+\r
+               // Resize some elements\r
+               if (isVisible('backgroundimagebrowser'))\r
+                       document.getElementById('backgroundimage').style.width = '180px';\r
+\r
+               updateColor('bordercolor_pick', 'bordercolor');\r
+               updateColor('bgcolor_pick', 'bgcolor');\r
+       } else\r
+               tinyMCEPopup.dom.hide('action');\r
 }\r
 \r
 function updateAction() {\r
        var el, inst = ed, tdElm, trElm, tableElm, formObj = document.forms[0];\r
 \r
        tinyMCEPopup.restoreSelection();\r
-       el = ed.selection.getNode();\r
+       el = ed.selection.getStart();\r
        tdElm = ed.dom.getParent(el, "td,th");\r
        trElm = ed.dom.getParent(el, "tr");\r
        tableElm = ed.dom.getParent(el, "table");\r
 \r
+       // Cell is selected\r
+       if (ed.dom.hasClass(tdElm, 'mceSelected')) {\r
+               // Update all selected sells\r
+               tinymce.each(ed.dom.select('td.mceSelected,th.mceSelected'), function(td) {\r
+                       updateCell(td);\r
+               });\r
+\r
+               ed.addVisual();\r
+               ed.nodeChanged();\r
+               inst.execCommand('mceEndUndoLevel');\r
+               tinyMCEPopup.close();\r
+               return;\r
+       }\r
+\r
        ed.execCommand('mceBeginUndoLevel');\r
 \r
        switch (getSelectValue(formObj, 'action')) {\r
index 31d6df0abcb2f70c55f3319912e0dc8507b79021..7ee4bf04015aa90ca0beda962776474f7486165f 100644 (file)
@@ -1,29 +1,27 @@
 tinyMCEPopup.requireLangPack();\r
 \r
-function init() {\r
-       var f = document.forms[0], v;\r
+var MergeCellsDialog = {\r
+       init : function() {\r
+               var f = document.forms[0];\r
 \r
-       tinyMCEPopup.resizeToInnerSize();\r
+               f.numcols.value = tinyMCEPopup.getWindowArg('cols', 1);\r
+               f.numrows.value = tinyMCEPopup.getWindowArg('rows', 1);\r
+       },\r
 \r
-       f.numcols.value = tinyMCEPopup.getWindowArg('numcols', 1);\r
-       f.numrows.value = tinyMCEPopup.getWindowArg('numrows', 1);\r
-}\r
+       merge : function() {\r
+               var func, f = document.forms[0];\r
 \r
-function mergeCells() {\r
-       var args = [], f = document.forms[0];\r
+               tinyMCEPopup.restoreSelection();\r
 \r
-       tinyMCEPopup.restoreSelection();\r
+               func = tinyMCEPopup.getWindowArg('onaction');\r
 \r
-       if (!AutoValidator.validate(f)) {\r
-               tinyMCEPopup.alert(tinyMCEPopup.getLang('invalid_data'));\r
-               return false;\r
-       }\r
-\r
-       args["numcols"] = f.numcols.value;\r
-       args["numrows"] = f.numrows.value;\r
+               func({\r
+                       cols : f.numcols.value,\r
+                       rows : f.numrows.value\r
+               });\r
 \r
-       tinyMCEPopup.execCommand("mceTableMergeCells", false, args);\r
-       tinyMCEPopup.close();\r
-}\r
+               tinyMCEPopup.close();\r
+       }\r
+};\r
 \r
-tinyMCEPopup.onInit.add(init);\r
+tinyMCEPopup.onInit.add(MergeCellsDialog.init, MergeCellsDialog);\r
index d25f635f6835d1c6c79e00592c5c1dc8ce703118..70d95b6729d78b16c9934f8fac9462e9bddb6aec 100644 (file)
@@ -8,7 +8,7 @@ function init() {
 \r
        var inst = tinyMCEPopup.editor;\r
        var dom = inst.dom;\r
-       var trElm = dom.getParent(inst.selection.getNode(), "tr");\r
+       var trElm = dom.getParent(inst.selection.getStart(), "tr");\r
        var formObj = document.forms[0];\r
        var st = dom.parseStyle(dom.getAttrib(trElm, "style"));\r
 \r
@@ -19,32 +19,37 @@ function init() {
        var height = trimSize(getStyle(trElm, 'height', 'height'));\r
        var className = dom.getAttrib(trElm, 'class');\r
        var bgcolor = convertRGBToHex(getStyle(trElm, 'bgcolor', 'backgroundColor'));\r
-       var backgroundimage = getStyle(trElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;\r
+       var backgroundimage = getStyle(trElm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1");\r
        var id = dom.getAttrib(trElm, 'id');\r
        var lang = dom.getAttrib(trElm, 'lang');\r
        var dir = dom.getAttrib(trElm, 'dir');\r
 \r
-       // Setup form\r
-       addClassesToList('class', 'table_row_styles');\r
-       TinyMCE_EditableSelects.init();\r
-\r
-       formObj.bgcolor.value = bgcolor;\r
-       formObj.backgroundimage.value = backgroundimage;\r
-       formObj.height.value = height;\r
-       formObj.id.value = id;\r
-       formObj.lang.value = lang;\r
-       formObj.style.value = dom.serializeStyle(st);\r
-       selectByValue(formObj, 'align', align);\r
-       selectByValue(formObj, 'valign', valign);\r
-       selectByValue(formObj, 'class', className, true, true);\r
        selectByValue(formObj, 'rowtype', rowtype);\r
-       selectByValue(formObj, 'dir', dir);\r
-\r
-       // Resize some elements\r
-       if (isVisible('backgroundimagebrowser'))\r
-               document.getElementById('backgroundimage').style.width = '180px';\r
 \r
-       updateColor('bgcolor_pick', 'bgcolor');\r
+       // Any cells selected\r
+       if (dom.select('td.mceSelected,th.mceSelected', trElm).length == 0) {\r
+               // Setup form\r
+               addClassesToList('class', 'table_row_styles');\r
+               TinyMCE_EditableSelects.init();\r
+\r
+               formObj.bgcolor.value = bgcolor;\r
+               formObj.backgroundimage.value = backgroundimage;\r
+               formObj.height.value = height;\r
+               formObj.id.value = id;\r
+               formObj.lang.value = lang;\r
+               formObj.style.value = dom.serializeStyle(st);\r
+               selectByValue(formObj, 'align', align);\r
+               selectByValue(formObj, 'valign', valign);\r
+               selectByValue(formObj, 'class', className, true, true);\r
+               selectByValue(formObj, 'dir', dir);\r
+\r
+               // Resize some elements\r
+               if (isVisible('backgroundimagebrowser'))\r
+                       document.getElementById('backgroundimage').style.width = '180px';\r
+\r
+               updateColor('bgcolor_pick', 'bgcolor');\r
+       } else\r
+               tinyMCEPopup.dom.hide('action');\r
 }\r
 \r
 function updateAction() {\r
@@ -52,8 +57,28 @@ function updateAction() {
        var action = getSelectValue(formObj, 'action');\r
 \r
        tinyMCEPopup.restoreSelection();\r
-       trElm = dom.getParent(inst.selection.getNode(), "tr");\r
-       tableElm = dom.getParent(inst.selection.getNode(), "table");\r
+       trElm = dom.getParent(inst.selection.getStart(), "tr");\r
+       tableElm = dom.getParent(inst.selection.getStart(), "table");\r
+\r
+       // Update all selected rows\r
+       if (dom.select('td.mceSelected,th.mceSelected', trElm).length > 0) {\r
+               tinymce.each(tableElm.rows, function(tr) {\r
+                       var i;\r
+\r
+                       for (i = 0; i < tr.cells.length; i++) {\r
+                               if (dom.hasClass(tr.cells[i], 'mceSelected')) {\r
+                                       updateRow(tr, true);\r
+                                       return;\r
+                               }\r
+                       }\r
+               });\r
+\r
+               inst.addVisual();\r
+               inst.nodeChanged();\r
+               inst.execCommand('mceEndUndoLevel');\r
+               tinyMCEPopup.close();\r
+               return;\r
+       }\r
 \r
        inst.execCommand('mceBeginUndoLevel');\r
 \r
index 2b6fd1f7020a896ce8717921e5d88111c367a0cb..d1b42c2af0dc43596c3576f0499253337d3ede14 100644 (file)
@@ -24,14 +24,14 @@ function insertTable() {
        border = formObj.elements['border'].value != "" ? formObj.elements['border'].value  : 0;\r
        cellpadding = formObj.elements['cellpadding'].value != "" ? formObj.elements['cellpadding'].value : "";\r
        cellspacing = formObj.elements['cellspacing'].value != "" ? formObj.elements['cellspacing'].value : "";\r
-       align = formObj.elements['align'].options[formObj.elements['align'].selectedIndex].value;\r
-       frame = formObj.elements['frame'].options[formObj.elements['frame'].selectedIndex].value;\r
-       rules = formObj.elements['rules'].options[formObj.elements['rules'].selectedIndex].value;\r
+       align = getSelectValue(formObj, "align");\r
+       frame = getSelectValue(formObj, "tframe");\r
+       rules = getSelectValue(formObj, "rules");\r
        width = formObj.elements['width'].value;\r
        height = formObj.elements['height'].value;\r
        bordercolor = formObj.elements['bordercolor'].value;\r
        bgcolor = formObj.elements['bgcolor'].value;\r
-       className = formObj.elements['class'].options[formObj.elements['class'].selectedIndex].value;\r
+       className = getSelectValue(formObj, "class");\r
        id = formObj.elements['id'].value;\r
        summary = formObj.elements['summary'].value;\r
        style = formObj.elements['style'].value;\r
@@ -82,7 +82,7 @@ function insertTable() {
                        capEl = elm.ownerDocument.createElement('caption');\r
 \r
                        if (!tinymce.isIE)\r
-                               capEl.innerHTML = '<br mce_bogus="1"/>';\r
+                               capEl.innerHTML = '<br _mce_bogus="1"/>';\r
 \r
                        elm.insertBefore(capEl, elm.firstChild);\r
                }\r
@@ -151,13 +151,14 @@ function insertTable() {
        html += makeAttrib('border', border);\r
        html += makeAttrib('cellpadding', cellpadding);\r
        html += makeAttrib('cellspacing', cellspacing);\r
+       html += makeAttrib('_mce_new', '1');\r
 \r
        if (width && inst.settings.inline_styles) {\r
                if (style)\r
                        style += '; ';\r
 \r
                // Force px\r
-               if (/[0-9\.]+/.test(width))\r
+               if (/^[0-9\.]+$/.test(width))\r
                        width += 'px';\r
 \r
                style += 'width: ' + width;\r
@@ -186,7 +187,7 @@ function insertTable() {
 \r
        if (caption) {\r
                if (!tinymce.isIE)\r
-                       html += '<caption><br mce_bogus="1"/></caption>';\r
+                       html += '<caption><br _mce_bogus="1"/></caption>';\r
                else\r
                        html += '<caption></caption>';\r
        }\r
@@ -196,7 +197,7 @@ function insertTable() {
 \r
                for (var x=0; x<cols; x++) {\r
                        if (!tinymce.isIE)\r
-                               html += '<td><br mce_bogus="1"/></td>';\r
+                               html += '<td><br _mce_bogus="1"/></td>';\r
                        else\r
                                html += '<td></td>';\r
                }\r
@@ -210,9 +211,10 @@ function insertTable() {
 \r
        // Move table\r
        if (inst.settings.fix_table_elements) {\r
-               var bm = inst.selection.getBookmark(), patt = '';\r
+               var patt = '';\r
 \r
-               inst.execCommand('mceInsertContent', false, '<br class="_mce_marker" />');\r
+               inst.focus();\r
+               inst.selection.setContent('<br class="_mce_marker" />');\r
 \r
                tinymce.each('h1,h2,h3,h4,h5,h6,p'.split(','), function(n) {\r
                        if (patt)\r
@@ -225,12 +227,19 @@ function insertTable() {
                        inst.dom.split(inst.dom.getParent(n, 'h1,h2,h3,h4,h5,h6,p'), n);\r
                });\r
 \r
-               dom.setOuterHTML(dom.select('._mce_marker')[0], html);\r
-\r
-               inst.selection.moveToBookmark(bm);\r
+               dom.setOuterHTML(dom.select('br._mce_marker')[0], html);\r
        } else\r
                inst.execCommand('mceInsertContent', false, html);\r
 \r
+       tinymce.each(dom.select('table[_mce_new]'), function(node) {\r
+               var td = dom.select('td', node);\r
+\r
+               inst.selection.select(td[0], true);\r
+               inst.selection.collapse();\r
+\r
+               dom.setAttrib(node, '_mce_new', '');\r
+       });\r
+\r
        inst.addVisual();\r
        inst.execCommand('mceEndUndoLevel');\r
 \r
@@ -307,7 +316,7 @@ function init() {
                style = dom.serializeStyle(st);\r
                dir = dom.getAttrib(elm, 'dir');\r
                lang = dom.getAttrib(elm, 'lang');\r
-               background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+               background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1");\r
                formObj.caption.checked = elm.getElementsByTagName('caption').length > 0;\r
 \r
                orgTableWidth = width;\r
@@ -322,7 +331,7 @@ function init() {
 \r
        // Update form\r
        selectByValue(formObj, 'align', align);\r
-       selectByValue(formObj, 'frame', frame);\r
+       selectByValue(formObj, 'tframe', frame);\r
        selectByValue(formObj, 'rules', rules);\r
        selectByValue(formObj, 'class', className, true, true);\r
        formObj.cols.value = cols;\r
@@ -416,7 +425,7 @@ function changedStyle() {
        var st = dom.parseStyle(formObj.style.value);\r
 \r
        if (st['background-image'])\r
-               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1");\r
        else\r
                formObj.backgroundimage.value = '';\r
 \r
index da56a4c5b81ec4c25edcb6dc47a016b436ef1a35..077751efebb48a2dc4216edbc2c639a44018537e 100755 (executable)
@@ -1,39 +1,39 @@
 tinyMCE.addI18n('ar.table_dlg',{\r
-general_tab:"\u0639\u0627\u0645",\r
-advanced_tab:"\u0645\u062A\u0642\u062F\u0645",\r
-general_props:"\u062E\u0635\u0627\u0626\u0635 \u0639\u0627\u0645\u0629",\r
-advanced_props:"\u062E\u0635\u0627\u0626\u0635 \u0645\u062A\u0642\u062F\u0645\u0629",\r
+general_tab:"General",\r
+advanced_tab:"Advanced",\r
+general_props:"General properties",\r
+advanced_props:"Advanced properties",\r
 rowtype:"Row in table part",\r
-title:"\u0625\u062F\u0631\u0627\u062C/\u062A\u0639\u062F\u064A\u0644 \u062C\u062F\u0648\u0644",\r
-width:"\u0627\u0644\u0639\u0631\u0636",\r
-height:"\u0627\u0644\u0625\u0631\u062A\u0641\u0627\u0639",\r
-cols:"\u0627\u0639\u0645\u062F\u0629",\r
-rows:"\u0635\u0641\u0648\u0641",\r
+title:"Insert/Modify table",\r
+width:"Width",\r
+height:"Height",\r
+cols:"Cols",\r
+rows:"Rows",\r
 cellspacing:"Cellspacing",\r
 cellpadding:"Cellpadding",\r
-border:"\u0627\u0644\u062D\u062F\u0648\u062F",\r
-align:"\u0645\u062D\u0627\u0630\u0627\u0629",\r
+border:"Border",\r
+align:"Alignment",\r
 align_default:"Default",\r
-align_left:"\u064A\u0633\u0627\u0631",\r
-align_right:"\u064A\u0645\u064A\u0646",\r
+align_left:"Left",\r
+align_right:"Right",\r
 align_middle:"Center",\r
-row_title:"Table row \u062E\u0635\u0627\u0626\u0635",\r
-cell_title:"Table cell \u062E\u0635\u0627\u0626\u0635",\r
+row_title:"Table row properties",\r
+cell_title:"Table cell properties",\r
 cell_type:"Cell type",\r
 valign:"Vertical alignment",\r
-align_top:"\u0623\u0639\u0644\u0649",\r
-align_bottom:"\u0623\u0633\u0641\u0644",\r
-bordercolor:"\u0627\u0644\u062D\u062F\u0648\u062F color",\r
-bgcolor:"\u0644\u0648\u0646 \u0627\u0644\u062E\u0644\u0641\u064A\u0629",\r
+align_top:"Top",\r
+align_bottom:"Bottom",\r
+bordercolor:"Border color",\r
+bgcolor:"Background color",\r
 merge_cells_title:"Merge table cells",\r
 id:"Id",\r
 style:"Style",\r
-langdir:"\u0627\u062A\u062C\u0627\u0647 \u0627\u0644\u0644\u063A\u0629",\r
-langcode:"\u0634\u0641\u0631\u0629 \u0627\u0644\u0644\u063A\u0629",\r
-mime:"\u0627\u0644\u0645\u0633\u0627\u0631 MIME type",\r
-ltr:"\u064A\u0633\u0627\u0631 to \u064A\u0645\u064A\u0646",\r
-rtl:"\u064A\u0645\u064A\u0646 to \u064A\u0633\u0627\u0631",\r
-bgimage:"\u0635\u0648\u0631\u0629 \u0627\u0644\u062E\u0644\u0641\u064A\u0629",\r
+langdir:"Language direction",\r
+langcode:"Language code",\r
+mime:"Target MIME type",\r
+ltr:"Left to right",\r
+rtl:"Right to left",\r
+bgimage:"Background image",\r
 summary:"Summary",\r
 td:"Data",\r
 th:"Header",\r
diff --git a/program/js/tiny_mce/plugins/table/langs/az_dlg.js b/program/js/tiny_mce/plugins/table/langs/az_dlg.js
new file mode 100644 (file)
index 0000000..e833a01
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('az.table_dlg',{\r
+general_tab:"\u00DCmumi",\r
+advanced_tab:"\u018Flav\u0259l\u0259r",\r
+general_props:"\u00DCmumi x\u00FCsusiyy\u0259tl\u0259r",\r
+advanced_props:"\u018Flav\u0259 x\u00FCsusiyy\u0259tl\u0259r",\r
+rowtype:"C\u0259dv\u0259l hiss\u0259sind\u0259ki s\u0259tr",\r
+title:"C\u0259dv\u0259li \u0259lav\u0259 et/d\u0259yi\u015Fdir",\r
+width:"Eni",\r
+height:"H\u00FCnd\u00FCrl\u00FCy\u00FC",\r
+cols:"S\u00FCtunlar",\r
+rows:"S\u0259trl\u0259r",\r
+cellspacing:"\u00D6z\u0259kl\u0259r aras\u0131ndak\u0131 m\u0259saf\u0259",\r
+cellpadding:"\u00D6z\u0259kl\u0259rd\u0259 doldurma",\r
+border:"S\u0259rh\u0259d",\r
+align:"Tarazla\u015Fd\u0131rma",\r
+align_default:"Default",\r
+align_left:"Sola",\r
+align_right:"Sa\u011Fa",\r
+align_middle:"M\u0259rk\u0259z il\u0259",\r
+row_title:"S\u0259tr x\u00FCsusiyy\u0259ti",\r
+cell_title:"\u00D6z\u0259k x\u00FCsusiyy\u0259ti",\r
+cell_type:"\u00D6z\u0259k n\u00F6v\u00FC",\r
+valign:"\u015Eaquli tarazla\u015Fma",\r
+align_top:"Yuxar\u0131 il\u0259",\r
+align_bottom:"A\u015Fa\u011F\u0131 il\u0259",\r
+bordercolor:"S\u0259rh\u0259d r\u0259ngi",\r
+bgcolor:"Fon r\u0259ngi",\r
+merge_cells_title:"\u00D6z\u0259k stili",\r
+id:"\u0130dentifikator",\r
+style:"Stil",\r
+langdir:"Dil istiqam\u0259ti",\r
+langcode:"Dil kodu",\r
+mime:"H\u0259d\u0259fli MIME-n\u00F6v",\r
+ltr:"Solda-sa\u011Fa",\r
+rtl:"Sa\u011Fda-sola",\r
+bgimage:"Fon \u015F\u0259kli",\r
+summary:"X\u00FClas\u0259",\r
+td:"Veril\u0259nl\u0259r",\r
+th:"Ba\u015Fl\u0131q",\r
+cell_cell:"Haz\u0131rki \u00F6z\u0259yi yenil\u0259",\r
+cell_row:"S\u0259trd\u0259ki b\u00FCt\u00FCn \u00F6z\u0259kl\u0259ri yenil\u0259",\r
+cell_all:"C\u0259dv\u0259ld\u0259ki b\u00FCt\u00FCn \u00F6z\u0259kl\u0259ri yenil\u0259",\r
+row_row:"Haz\u0131rki s\u0259tri yenil\u0259",\r
+row_odd:"C\u0259d\u0259ld\u0259ki t\u0259k (\u0259d\u0259d) s\u0259trl\u0259ri yenil\u0259",\r
+row_even:"C\u0259dv\u0259ld\u0259ki c\u00FCt (\u0259d\u0259d) s\u0259trl\u0259ri yenil\u0259",\r
+row_all:"C\u0259dv\u0259ld\u0259ki b\u00FCt\u00FCn s\u0259trl\u0259ri yenil\u0259",\r
+thead:"C\u0259dv\u0259lin yuxar\u0131 hiss\u0259si",\r
+tbody:"C\u0259dv\u0259lin \u0259sas hiss\u0259si",\r
+tfoot:"C\u0259dv\u0259lin a\u015Fa\u011F\u0131 hiss\u0259si",\r
+scope:"H\u0259dd",\r
+rowgroup:"S\u0259tr qrupu",\r
+colgroup:"S\u00FCtun qrupu",\r
+col_limit:"Siz s\u00FCtunlarda {$cols} maksimum say\u0131 a\u015Fd\u0131n\u0131z.",\r
+row_limit:"Siz s\u0259trl\u0259rd\u0259 {$rows} maksimum say\u0131 a\u015Fd\u0131n\u0131z.",\r
+cell_limit:"Siz \u00F6z\u0259kl\u0259rd\u0259 {$cells} maksimum say\u0131 a\u015Fd\u0131n\u0131z.",\r
+missing_scope:"\u018Fminsiniz ki, ba\u015Fl\u0131q \u00F6z\u0259yinin h\u0259ddini g\u00F6st\u0259rm\u0259d\u0259n davam etm\u0259k ist\u0259yirsiniz? Bunsuz b\u0259zi i\u015F qabiliyy\u0259ti a\u015Fa\u011F\u0131 olan istifad\u0259\u00E7il\u0259r\u0259 c\u0259dv\u0259lin m\u0259lumatlar\u0131 v\u0259 t\u0259rkibini anlamaq \u00E7\u0259tin olacaq.",\r
+caption:"C\u0259dv\u0259l ba\u015Fl\u0131\u011F\u0131",\r
+frame:"\u00C7\u0259r\u00E7iv\u0259",\r
+frame_none:"he\u00E7n\u0259",\r
+frame_groups:"qruplar",\r
+frame_rows:"s\u0259trl\u0259r",\r
+frame_cols:"s\u00FCtunlar",\r
+frame_all:"ham\u0131s\u0131",\r
+rules:"X\u0259ttl\u0259r",\r
+rules_void:"he\u00E7 n\u0259",\r
+rules_above:"yuxar\u0131dan",\r
+rules_below:"a\u015Fa\u011F\u0131dan",\r
+rules_hsides:"\u00FCf\u00FCqi t\u0259r\u0259fl\u0259r",\r
+rules_lhs:"sol \u00FCf\u00FCqi t\u0259r\u0259fl\u0259r",\r
+rules_rhs:"sa\u011F \u00FCf\u00FCqi t\u0259r\u0259fl\u0259r",\r
+rules_vsides:"\u015Faquli t\u0259r\u0259fl\u0259r",\r
+rules_box:"konteyner",\r
+rules_border:"s\u0259rh\u0259d"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/be_dlg.js b/program/js/tiny_mce/plugins/table/langs/be_dlg.js
new file mode 100644 (file)
index 0000000..3b01b8b
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('be.table_dlg',{\r
+general_tab:"\u0410\u0433\u0443\u043B\u044C\u043D\u044B\u044F",\r
+advanced_tab:"\u0414\u0430\u0434\u0430\u0442\u043A\u043E\u0432\u044B\u044F",\r
+general_props:"\u0410\u0433\u0443\u043B\u044C\u043D\u044B\u044F \u045E\u043B\u0430\u0441\u0446\u0456\u0432\u0430\u0441\u0446\u0456",\r
+advanced_props:"\u0414\u0430\u0434\u0430\u0442\u043A\u043E\u0432\u044B\u044F \u045E\u043B\u0430\u0441\u0446\u0456\u0432\u0430\u0441\u0446\u0456",\r
+rowtype:"\u0420\u0430\u0434\u043E\u043A \u0443 \u0447\u0430\u0441\u0442\u043A\u0456 \u0442\u0430\u0431\u043B\u0456\u0446\u044B",\r
+title:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044C/\u0437\u043C\u044F\u043D\u0456\u0446\u044C \u0442\u0430\u0431\u043B\u0456\u0446\u0443",\r
+width:"\u0428\u044B\u0440\u044B\u043D\u044F",\r
+height:"\u0412\u044B\u0448\u044B\u043D\u044F",\r
+cols:"\u0421\u043B\u0443\u043F\u043A\u0456",\r
+rows:"\u0420\u0430\u0434\u043A\u0456",\r
+cellspacing:"\u0410\u0434\u043B\u0435\u0433\u043B\u0430\u0441\u0446\u044C \u043F\u0430\u043C\u0456\u0436 \u0432\u043E\u0447\u043A\u0430\u043C\u0456",\r
+cellpadding:"\u041D\u0430\u0431\u0456\u0432\u0430\u043D\u043D\u0435 \u045E \u0432\u043E\u0447\u043A\u0430\u0445",\r
+border:"\u041C\u044F\u0436\u0430",\r
+align:"\u0412\u044B\u0440\u0430\u045E\u043D\u043E\u045E\u0432\u0430\u043D\u043D\u0435",\r
+align_default:"\u041F\u0430 \u0437\u043C\u0430\u045E\u0447\u0430\u043D\u043D\u0456",\r
+align_left:"\u041D\u0430\u043B\u0435\u0432\u0430",\r
+align_right:"\u041D\u0430\u043F\u0440\u0430\u0432\u0430",\r
+align_middle:"\u041F\u0430 \u0446\u044D\u043D\u0442\u0440\u044B",\r
+row_title:"\u0423\u043B\u0430\u0441\u0446\u0456\u0432\u0430\u0441\u0446\u0456 \u0440\u0430\u0434\u043A\u0430",\r
+cell_title:"\u0423\u043B\u0430\u0441\u0446\u0456\u0432\u0430\u0441\u0446\u0456 \u0432\u043E\u0447\u043A\u0430",\r
+cell_type:"\u0422\u044B\u043F \u0432\u043E\u0447\u043A\u0430",\r
+valign:"\u0412\u0435\u0440\u0442\u044B\u043A\u0430\u043B\u044C\u043D\u0430\u0435 \u0432\u044B\u0440\u0430\u045E\u043D\u043E\u045E\u0432\u0430\u043D\u043D\u0435",\r
+align_top:"\u041F\u0430 \u0432\u0435\u0440\u0441\u0435",\r
+align_bottom:"\u041F\u0430 \u043D\u0456\u0437\u0435",\r
+bordercolor:"\u041A\u043E\u043B\u0435\u0440 \u043C\u044F\u0436\u044B",\r
+bgcolor:"\u041A\u043E\u043B\u0435\u0440 \u0444\u043E\u043D\u0443",\r
+merge_cells_title:"\u0417\u043B\u0456\u0446\u044C \u0432\u043E\u0447\u043A\u0456",\r
+id:"\u0406\u0434\u044D\u043D\u0442\u044B\u0444\u0456\u043A\u0430\u0442\u0430\u0440",\r
+style:"\u0421\u0442\u044B\u043B\u044C",\r
+langdir:"\u041A\u0456\u0440\u0443\u043D\u0430\u043A \u043C\u043E\u0432\u044B",\r
+langcode:"\u041A\u043E\u0434 \u043C\u043E\u0432\u044B",\r
+mime:"\u041C\u044D\u0442\u0430\u0432\u044B MIME-\u0442\u044B\u043F",\r
+ltr:"\u0417\u043B\u0435\u0432\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u0430",\r
+rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0435\u0432\u0430",\r
+bgimage:"\u0424\u043E\u043D\u0430\u0432\u044B \u043C\u0430\u043B\u044E\u043D\u0430\u043A",\r
+summary:"\u0417\u0432\u043E\u0434\u043A\u0430",\r
+td:"\u0414\u0430\u0434\u0437\u0435\u043D\u044B\u044F",\r
+th:"\u0417\u0430\u0433\u0430\u043B\u043E\u0432\u0430\u043A",\r
+cell_cell:"\u0410\u0431\u043D\u0430\u0432\u0456\u0446\u044C \u0431\u044F\u0433\u0443\u0447\u0430\u0435 \u0432\u043E\u0447\u043A\u0430",\r
+cell_row:"\u0410\u0431\u043D\u0430\u0432\u0456\u0446\u044C \u0443\u0441\u0435 \u0432\u043E\u0447\u043A\u0456 \u045E \u0440\u0430\u0434\u043A\u0443",\r
+cell_all:"\u0410\u0431\u043D\u0430\u0432\u0456\u0446\u044C \u0443\u0441\u0435 \u0432\u043E\u0447\u043A\u0456 \u045E \u0442\u0430\u0431\u043B\u0456\u0446\u044B",\r
+row_row:"\u0410\u0431\u043D\u0430\u0432\u0456\u0446\u044C \u0431\u044F\u0433\u0443\u0447\u044B \u0440\u0430\u0434\u043E\u043A",\r
+row_odd:"\u0410\u0431\u043D\u0430\u0432\u0456\u0446\u044C \u043D\u044F\u0446\u043E\u0442\u043D\u044B\u044F \u0440\u0430\u0434\u043A\u0456 \u045E \u0442\u0430\u0431\u043B\u0456\u0446\u044B",\r
+row_even:"\u0410\u0431\u043D\u0430\u0432\u0456\u0446\u044C \u0446\u043E\u0442\u043D\u044B\u044F \u0440\u0430\u0434\u043A\u0456 \u045E \u0442\u0430\u0431\u043B\u0456\u0446\u044B",\r
+row_all:"\u0410\u0431\u043D\u0430\u0432\u0456\u0446\u044C \u0443\u0441\u0435 \u0440\u0430\u0434\u043A\u0456 \u045E \u0442\u0430\u0431\u043B\u0456\u0446\u044B",\r
+thead:"\u0412\u0435\u0440\u0445\u043D\u044F\u044F \u0447\u0430\u0441\u0442\u043A\u0430 \u0442\u0430\u0431\u043B\u0456\u0446\u044B",\r
+tbody:"\u0410\u0441\u043D\u043E\u045E\u043D\u0430\u044F \u0447\u0430\u0441\u0442\u043A\u0430 \u0442\u0430\u0431\u043B\u0456\u0446\u044B",\r
+tfoot:"\u041D\u0456\u0436\u043D\u044F\u044F \u0447\u0430\u0441\u0442\u043A\u0430 \u0442\u0430\u0431\u043B\u0456\u0446\u044B",\r
+scope:"\u041C\u0435\u0436\u044B",\r
+rowgroup:"\u0413\u0440\u0443\u043F\u0430 \u0440\u0430\u0434\u043A\u043E\u045E",\r
+colgroup:"\u0413\u0440\u0443\u043F\u0430 \u0441\u043B\u0443\u043F\u043A\u043E\u045E",\r
+col_limit:"\u0412\u044B \u043F\u0435\u0440\u0430\u0432\u044B\u0441\u0456\u043B\u0456 \u043C\u0430\u043A\u0441\u0456\u043C\u0430\u043B\u044C\u043D\u0443\u044E \u043A\u043E\u043B\u044C\u043A\u0430\u0441\u0446\u044C \u0443 {$cols} \u0441\u043B\u0443\u043F\u043A\u043E\u045E.",\r
+row_limit:"\u0412\u044B \u043F\u0435\u0440\u0430\u0432\u044B\u0441\u0456\u043B\u0456 \u043C\u0430\u043A\u0441\u0456\u043C\u0430\u043B\u044C\u043D\u0443\u044E \u043A\u043E\u043B\u044C\u043A\u0430\u0441\u0446\u044C \u0443 {$rows} \u0440\u0430\u0434\u043A\u043E\u045E.",\r
+cell_limit:"\u0412\u044B \u043F\u0435\u0440\u0430\u0432\u044B\u0441\u0456\u043B\u0456 \u043C\u0430\u043A\u0441\u0456\u043C\u0430\u043B\u044C\u043D\u0443\u044E \u043A\u043E\u043B\u044C\u043A\u0430\u0441\u0446\u044C \u0443 {$cells} \u0432\u043E\u0447\u0430\u043A.",\r
+missing_scope:"\u0412\u044B \u0441\u0430\u043F\u0440\u0430\u045E\u0434\u044B \u0436\u0430\u0434\u0430\u0435\u0446\u0435 \u043F\u0440\u0430\u0446\u044F\u0433\u043D\u0443\u0446\u044C \u0431\u0435\u0437 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u044F \u043C\u0435\u0436 \u0433\u044D\u0442\u0430\u0433\u0430 \u0432\u043E\u0447\u043A\u0430 \u0437\u0430\u0433\u0430\u043B\u043E\u045E\u043A\u0430? \u0411\u0435\u0437 \u0433\u044D\u0442\u0430\u0433\u0430 \u043D\u0435\u043A\u0430\u0442\u043E\u0440\u044B\u043C \u043A\u0430\u0440\u044B\u0441\u0442\u0430\u0447\u0430\u043C \u0437 \u0430\u0431\u043C\u0435\u0436\u0430\u0432\u0430\u043D\u0430\u0439 \u043F\u0440\u0430\u0446\u0430\u0437\u0434\u043E\u043B\u044C\u043D\u0430\u0441\u0446\u044E \u043C\u043E\u0436\u0430 \u0431\u044B\u0446\u044C \u0446\u044F\u0436\u043A\u0430 \u0437\u0440\u0430\u0437\u0443\u043C\u0435\u0446\u044C \u0443\u0442\u0440\u044B\u043C\u0430\u043D\u043D\u0435 \u0430\u0431\u043E \u0434\u0430\u0434\u0437\u0435\u043D\u044B\u044F \u0442\u0430\u0431\u043B\u0456\u0446\u044B.",\r
+caption:"\u0417\u0430\u0433\u0430\u043B\u043E\u0432\u0430\u043A \u0442\u0430\u0431\u043B\u0456\u0446\u044B",\r
+frame:"\u0420\u0430\u043C\u043A\u0430",\r
+frame_none:"\u043D\u0456\u0447\u043E\u0433\u0430",\r
+frame_groups:"\u0433\u0440\u0443\u043F\u044B",\r
+frame_rows:"\u0440\u0430\u0434\u043A\u0456",\r
+frame_cols:"\u0441\u043B\u0443\u043F\u043A\u0456",\r
+frame_all:"\u0443\u0441\u0451",\r
+rules:"\u041B\u0456\u043D\u0435\u0439\u043A\u0456",\r
+rules_void:"\u043D\u0456\u0448\u0442\u043E",\r
+rules_above:"\u0437\u0432\u0435\u0440\u0445\u0443",\r
+rules_below:"\u0437\u043D\u0456\u0437\u0443",\r
+rules_hsides:"\u0433\u0430\u0440\u044B\u0437\u0430\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u044F \u0431\u0430\u043A\u0456",\r
+rules_lhs:"\u043B\u0435\u0432\u044B\u044F \u0433\u0430\u0440\u044B\u0437\u0430\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u044F \u0431\u0430\u043A\u0456",\r
+rules_rhs:"\u043F\u0440\u0430\u0432\u044B\u044F \u0433\u0430\u0440\u044B\u0437\u0430\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u044F \u0431\u0430\u043A\u0456",\r
+rules_vsides:"\u0432\u0435\u0440\u0442\u044B\u043A\u0430\u043B\u044C\u043D\u044B\u044F \u0431\u0430\u043A\u0456",\r
+rules_box:"\u043A\u0430\u043D\u0442\u044D\u0439\u043D\u0435\u0440",\r
+rules_border:"\u043C\u044F\u0436\u0430"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/bn_dlg.js b/program/js/tiny_mce/plugins/table/langs/bn_dlg.js
new file mode 100644 (file)
index 0000000..0a88975
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('bn.table_dlg',{\r
+general_tab:"General",\r
+advanced_tab:"Advanced",\r
+general_props:"General properties",\r
+advanced_props:"Advanced properties",\r
+rowtype:"Row in table part",\r
+title:"Insert/Modify table",\r
+width:"Width",\r
+height:"Height",\r
+cols:"Cols",\r
+rows:"Rows",\r
+cellspacing:"Cellspacing",\r
+cellpadding:"Cellpadding",\r
+border:"Border",\r
+align:"Alignment",\r
+align_default:"Default",\r
+align_left:"Left",\r
+align_right:"Right",\r
+align_middle:"Center",\r
+row_title:"Table row properties",\r
+cell_title:"Table cell properties",\r
+cell_type:"Cell type",\r
+valign:"Vertical alignment",\r
+align_top:"Top",\r
+align_bottom:"Bottom",\r
+bordercolor:"Border color",\r
+bgcolor:"Background color",\r
+merge_cells_title:"Merge table cells",\r
+id:"Id",\r
+style:"Style",\r
+langdir:"Language direction",\r
+langcode:"Language code",\r
+mime:"Target MIME type",\r
+ltr:"Left to right",\r
+rtl:"Right to left",\r
+bgimage:"Background image",\r
+summary:"Summary",\r
+td:"Data",\r
+th:"Header",\r
+cell_cell:"Update current cell",\r
+cell_row:"Update all cells in row",\r
+cell_all:"Update all cells in table",\r
+row_row:"Update current row",\r
+row_odd:"Update odd rows in table",\r
+row_even:"Update even rows in table",\r
+row_all:"Update all rows in table",\r
+thead:"Table Head",\r
+tbody:"Table Body",\r
+tfoot:"Table Foot",\r
+scope:"Scope",\r
+rowgroup:"Row Group",\r
+colgroup:"Col Group",\r
+col_limit:"You've exceeded the maximum number of columns of {$cols}.",\r
+row_limit:"You've exceeded the maximum number of rows of {$rows}.",\r
+cell_limit:"You've exceeded the maximum number of cells of {$cells}.",\r
+missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
+caption:"Table caption",\r
+frame:"Frame",\r
+frame_none:"none",\r
+frame_groups:"groups",\r
+frame_rows:"rows",\r
+frame_cols:"cols",\r
+frame_all:"all",\r
+rules:"Rules",\r
+rules_void:"void",\r
+rules_above:"above",\r
+rules_below:"below",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"box",\r
+rules_border:"border"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/br_dlg.js b/program/js/tiny_mce/plugins/table/langs/br_dlg.js
new file mode 100644 (file)
index 0000000..8794e79
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('br.table_dlg',{\r
+general_tab:"Geral",\r
+advanced_tab:"Avan\u00E7ado",\r
+general_props:"Propriedades gerais",\r
+advanced_props:"Propriedades avan\u00E7adas",\r
+rowtype:"Linha na parte da tabela",\r
+title:"Inserir/modificar tabela",\r
+width:"Largura",\r
+height:"Altura",\r
+cols:"Colunas",\r
+rows:"Linhas",\r
+cellspacing:"Cellspacing",\r
+cellpadding:"Cellpadding",\r
+border:"Limites",\r
+align:"Alinhamento",\r
+align_default:"Padr\u00E3o",\r
+align_left:"Esquerda",\r
+align_right:"Direita",\r
+align_middle:"Centro",\r
+row_title:"Propriedades de linhas",\r
+cell_title:"Propriedades de c\u00E9lulas",\r
+cell_type:"Tipo de c\u00E9lula",\r
+valign:"Alinhamento vertical",\r
+align_top:"Topo",\r
+align_bottom:"Abaixo",\r
+bordercolor:"Cor dos limites",\r
+bgcolor:"Cor de fundo",\r
+merge_cells_title:"Unir c\u00E9lulas",\r
+id:"Id",\r
+style:"Estilo",\r
+langdir:"Dire\u00E7\u00E3o do texto",\r
+langcode:"C\u00F3digo da linguagem",\r
+mime:"MIME alvo",\r
+ltr:"Da esquerda para a direita",\r
+rtl:"Da direita para a esquerda",\r
+bgimage:"Imagem de fundo",\r
+summary:"Sum\u00E1rio",\r
+td:"Dados",\r
+th:"Campo",\r
+cell_cell:"Atualizar esta c\u00E9lula",\r
+cell_row:"Atualizar todas as c\u00E9lulas na linha",\r
+cell_all:"Atualizar todas as c\u00E9lulas na tabela",\r
+row_row:"Atcualizar esta linha",\r
+row_odd:"Atualizar linhas \u00EDmpares",\r
+row_even:"Atualizar linhas pares",\r
+row_all:"Atualizar todas as linhas",\r
+thead:"Topo da tabela",\r
+tbody:"Corpo da tabela",\r
+tfoot:"Rodap\u00E9 da tabela",\r
+scope:"Alcance",\r
+rowgroup:"Grupo linhas",\r
+colgroup:"Grupo colunas",\r
+col_limit:"Excedeu o n\u00FAmero m\u00E1ximo de colunas de {$cols}.",\r
+row_limit:"Excedeu o n\u00FAmero m\u00E1ximo de linhas de {$rows}.",\r
+cell_limit:"Excedeu o n\u00FAmero m\u00E1ximo de c\u00E9lulas de {$cells}.",\r
+missing_scope:"Tem certeza de que quer continuar sem especificar um escopo para esta c\u00E9lula? (Isso poder\u00E1 causar dificuldades a usu\u00E1rios deficientes)",\r
+caption:"T\u00EDtulo da tabela",\r
+frame:"Frame",\r
+frame_none:"Nenhum",\r
+frame_groups:"Grupos",\r
+frame_rows:"Linhas",\r
+frame_cols:"colunas",\r
+frame_all:"Todos",\r
+rules:"Regras",\r
+rules_void:"void",\r
+rules_above:"acima",\r
+rules_below:"abaixo",\r
+rules_hsides:"Hsides",\r
+rules_lhs:"Lhs",\r
+rules_rhs:"Rhs",\r
+rules_vsides:"Vsides",\r
+rules_box:"Box",\r
+rules_border:"Limites"\r
+});
\ No newline at end of file
index abd88d1c0ab478df2fd3a3fda19c7cc64b1cb9b9..31e905f3749f97343bf4ce043b286906dcf331cd 100755 (executable)
@@ -3,72 +3,72 @@ general_tab:"General",
 advanced_tab:"Avan\u00E7at",\r
 general_props:"Propietats generals",\r
 advanced_props:"Propietats avan\u00E7ades",\r
-rowtype:"Part de la taula on \u00E9s la fila",\r
+rowtype:"Fila",\r
 title:"Insereix/Modifica taula",\r
 width:"Amplada",\r
 height:"Al\u00E7ada",\r
 cols:"Columnes",\r
 rows:"Files",\r
-cellspacing:"Espai de Cel.la",\r
-cellpadding:"Espai de marge",\r
+cellspacing:"Espaiat de cel\u00B7la",\r
+cellpadding:"Separaci\u00F3 de cel\u00B7la",\r
 border:"Vora",\r
 align:"Alineaci\u00F3",\r
 align_default:"Per defecte",\r
 align_left:"Esquerra",\r
 align_right:"Dreta",\r
-align_middle:"Centrat",\r
-row_title:"Propietats de la fila de la taula",\r
-cell_title:"Propietats de la cel\u00B7la de la taula",\r
+align_middle:"Centre",\r
+row_title:"Propietats de fila",\r
+cell_title:"Propietats de cel\u00B7la",\r
 cell_type:"Tipus de cel\u00B7la",\r
 valign:"Alineaci\u00F3 vertical",\r
-align_top:"Dalt",\r
-align_bottom:"Baix",\r
-bordercolor:"Color de la vora",\r
-bgcolor:"Color del fons",\r
-merge_cells_title:"Refon les cel\u00B7les de la taula",\r
+align_top:"A dalt",\r
+align_bottom:"A baix",\r
+bordercolor:"Color de vora",\r
+bgcolor:"Color de fons",\r
+merge_cells_title:"Fusiona cel\u00B7les",\r
 id:"Id",\r
 style:"Estil",\r
-langdir:"Direcci\u00F3 de l'Idioma",\r
-langcode:"Codi de l'idioma",\r
-mime:"Tipus MIME de l'objectiu",\r
-ltr:"D'esquerra a dreta",\r
+langdir:"Direcci\u00F3 de l\'idioma",\r
+langcode:"Codi de l\'idioma",\r
+mime:"Tipus MIME",\r
+ltr:"D\'esquerra a dreta",\r
 rtl:"De dreta a esquerra",\r
 bgimage:"Imatge de fons",\r
 summary:"Resum",\r
 td:"Dades",\r
 th:"Cap\u00E7alera",\r
-cell_cell:"Actualitza la cel\u00B7la actual",\r
+cell_cell:"Actualitza la cel\u00B7la",\r
 cell_row:"Actualitza totes les cel\u00B7les de la fila",\r
 cell_all:"Actualitza totes les cel\u00B7les de la taula",\r
-row_row:"Actualitza la fila actual",\r
-row_odd:"Actualitza les files senars de la taula",\r
-row_even:"Actualitza les files parelles de la taula",\r
-row_all:"Actualitza les files de la taula",\r
-thead:"Cap\u00E7alera de la Taula",\r
-tbody:"Cos de la Taula",\r
-tfoot:"Peu de la Taula",\r
+row_row:"Actualitza la fila",\r
+row_odd:"Actualitza les files senars",\r
+row_even:"Actualitza les files parells",\r
+row_all:"Actualitza totes les files",\r
+thead:"Cap\u00E7alera de la taula",\r
+tbody:"Cos de la taula",\r
+tfoot:"Peu de la taula",\r
 scope:"Abast",\r
-rowgroup:"Grup de Files",\r
-colgroup:"Grup de Columnes",\r
-col_limit:"Has excedit el nombre m\u00E0xim de columnes de {$cols}.",\r
-row_limit:"Has excedit el nombre m\u00E0xim de files de {$rows}.",\r
-cell_limit:"Has excedit el nombre m\u00E0xim de cel\u00B7les de {$cells}.",\r
-missing_scope:"Segur que vols continuar sense especificar un abast per a les cel\u00B7les de cap\u00E7alera d'aquesta taula? Sense aix\u00F2, alguns usuaris/es amb discapacitats tindran dificultats per entendre el contingut o les dades mostrades a la taula.",\r
+rowgroup:"Grup de files",\r
+colgroup:"Grup de columnes",\r
+col_limit:"Heu superat el nombre m\u00E0xim de columnes de {$cols}.",\r
+row_limit:"Heu superat el nombre m\u00E0xim de files de {$rows}.",\r
+cell_limit:"Heu superat el nombre m\u00E0xim de cel\u00B7les de {$cells}..",\r
+missing_scope:"Esteu segur que voleu continuar sense indicar un abast per a aquesta cel\u00B7la de cap\u00E7alera. Pot ser dif\u00EDcil per a alguns usuaris amb discapacitats entendre el contingut o les dades mostrades a la taula.",\r
 caption:"T\u00EDtol de la taula",\r
 frame:"Marc",\r
 frame_none:"cap",\r
 frame_groups:"grups",\r
 frame_rows:"files",\r
 frame_cols:"columnes",\r
-frame_all:"totes",\r
+frame_all:"tot",\r
 rules:"Regles",\r
-rules_void:"salta regles",\r
-rules_above:"sobre",\r
-rules_below:"sota",\r
-rules_hsides:"banda horitzontal",\r
+rules_void:"buit",\r
+rules_above:"per damunt de",\r
+rules_below:"per sota de",\r
+rules_hsides:"hsides",\r
 rules_lhs:"lhs",\r
 rules_rhs:"rhs",\r
-rules_vsides:"banda vertical",\r
-rules_box:"caixa",\r
+rules_vsides:"vsides",\r
+rules_box:"quadre",\r
 rules_border:"vora"\r
 });
\ No newline at end of file
index 9c8df6b23bffa6e9b1c64412c837737c150a254b..41890044a08fad20253e77acf7624ad8820c6f9e 100755 (executable)
@@ -1,8 +1,8 @@
 tinyMCE.addI18n('cs.table_dlg',{\r
-general_tab:"Hlavn\u00ED",\r
-advanced_tab:"Pokro\u010Dil\u00E9",\r
-general_props:"Hlavn\u00ED nastaven\u00ED",\r
-advanced_props:"Pokro\u010Dil\u00E9 nastaven\u00ED",\r
+general_tab:"Obecn\u00E9",\r
+advanced_tab:"Roz\u0161\u00ED\u0159en\u00E9",\r
+general_props:"Obecn\u00E9 parametry",\r
+advanced_props:"Roz\u0161\u00ED\u0159en\u00E9 parametry",\r
 rowtype:"Typ \u0159\u00E1dku",\r
 title:"Vlo\u017Eit/upravit tabulku",\r
 width:"\u0160\u00ED\u0159ka",\r
@@ -16,7 +16,7 @@ align:"Zarovn\u00E1n\u00ED",
 align_default:"V\u00FDchoz\u00ED",\r
 align_left:"Vlevo",\r
 align_right:"Vpravo",\r
-align_middle:"Doprost\u0159ed",\r
+align_middle:"Na st\u0159ed",\r
 row_title:"Vlastnosti \u0159\u00E1dku",\r
 cell_title:"Vlastnosti bu\u0148ky",\r
 cell_type:"Typ bu\u0148ky",\r
@@ -34,7 +34,7 @@ mime:"MIME typ c\u00EDle",
 ltr:"Zleva doprava",\r
 rtl:"Zprava doleva",\r
 bgimage:"Obr\u00E1zek pozad\u00ED",\r
-summary:"Sum\u00E1\u0159",\r
+summary:"Shrnut\u00ED obsahu",\r
 td:"Data",\r
 th:"Z\u00E1hlav\u00ED",\r
 cell_cell:"Aktualizovat zvolenou bu\u0148ku",\r
@@ -47,28 +47,28 @@ row_all:"Aktualizovat v\u0161echny \u0159\u00E1dky tabulky",
 thead:"Hlavi\u010Dka tabulky",\r
 tbody:"T\u011Blo tabulky",\r
 tfoot:"Pata tabulky",\r
-scope:"Zv\u00FDrazn\u011Bn\u00ED",\r
+scope:"Hlavi\u010Dka pro",\r
 rowgroup:"Skupina \u0159\u00E1dk\u016F",\r
 colgroup:"Skupina sloupc\u016F",\r
 col_limit:"P\u0159ekro\u010Dili jste maxim\u00E1ln\u00ED po\u010Det sloupc\u016F {$cols}.",\r
 row_limit:"P\u0159ekro\u010Dili jste maxim\u00E1ln\u00ED po\u010Det \u0159\u00E1dk\u016F {$rows}.",\r
 cell_limit:"P\u0159ekro\u010Dili jste maxim\u00E1ln\u00ED po\u010Det bun\u011Bk {$cells}.",\r
-missing_scope:"Jste si jist\u00ED, \u017Ee nechcete definovat zv\u00FDrazn\u011Bn\u00ED pro tuto hlavi\u010Dkovou bu\u0148ku (hlavi\u010Dku \u0159\u00E1dku nebo sloupce)? Bez n\u011Bj mo\u017En\u00E1 nebude mo\u017En\u00E9 spr\u00E1vn\u011B pochopit zobrazen\u00FD obsah \u010Di data tabulky.",\r
+missing_scope:"Skute\u010Dn\u011B chcete pokra\u010Dovat bez ur\u010Den\u00ED oblasti hlavi\u010Dky t\u00E9to tabulky? Bez n\u00ED m\u016F\u017Ee u n\u011Bkter\u00FDch u\u017Eivatel\u016F doch\u00E1zet k ur\u010Dit\u00FDm probl\u00E9m\u016Fm p\u0159i interpretaci a zobrazov\u00E1n\u00ED dat v tabulce.",\r
 caption:"Nadpis tabulky",\r
-frame:"R\u00E1m (frame)",\r
-frame_none:"\u017E\u00E1dn\u00FD",\r
-frame_groups:"skupiny",\r
+frame:"R\u00E1me\u010Dek tabulky",\r
+frame_none:"\u017E\u00E1dn\u00E1",\r
+frame_groups:"oblasti a skupiny sloupc\u016F",\r
 frame_rows:"\u0159\u00E1dky",\r
 frame_cols:"sloupce",\r
 frame_all:"v\u0161e",\r
-rules:"Pravidla (rules)",\r
-rules_void:"void",\r
-rules_above:"nad",\r
-rules_below:"pod",\r
-rules_hsides:"hsides",\r
-rules_lhs:"lhs",\r
-rules_rhs:"rhs",\r
-rules_vsides:"vsides",\r
-rules_box:"box",\r
-rules_border:"r\u00E1me\u010Dek"\r
+rules:"Vykreslen\u00ED m\u0159\u00ED\u017Eky",\r
+rules_void:"\u017E\u00E1dn\u00FD",\r
+rules_above:"naho\u0159e",\r
+rules_below:"dole",\r
+rules_hsides:"naho\u0159e a dole",\r
+rules_lhs:"vlevo",\r
+rules_rhs:"vpravo",\r
+rules_vsides:"vlevo a vpravo",\r
+rules_box:"box okolo",\r
+rules_border:"r\u00E1me\u010Dek okolo"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/cy_dlg.js b/program/js/tiny_mce/plugins/table/langs/cy_dlg.js
new file mode 100644 (file)
index 0000000..a1e8d09
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('cy.table_dlg',{\r
+general_tab:"Cyffredinol",\r
+advanced_tab:"Uwch",\r
+general_props:"Priodweddau cyffredinol",\r
+advanced_props:"Priodweddau uwch",\r
+rowtype:"Rhes mewn rhan tabl",\r
+title:"Mewnosod/Golygu tabl",\r
+width:"Lled",\r
+height:"Uchder",\r
+cols:"Colofnau",\r
+rows:"Rhesi",\r
+cellspacing:"Bylchiad celloedd",\r
+cellpadding:"Padio celloedd",\r
+border:"Border",\r
+align:"Aliniad",\r
+align_default:"Rhagosodedig",\r
+align_left:"Chwith",\r
+align_right:"De",\r
+align_middle:"Canol",\r
+row_title:"Priodweddau rhes tabl",\r
+cell_title:"Priodweddau cell tabl",\r
+cell_type:"Math cell",\r
+valign:"Aliniad ferigol",\r
+align_top:"Pen",\r
+align_bottom:"Gwaelod",\r
+bordercolor:"Lliw border",\r
+bgcolor:"Lliw cefndir",\r
+merge_cells_title:"Cyfuno celloedd tabl",\r
+id:"Id",\r
+style:"Arddull",\r
+langdir:"Cyfeiriad iaith",\r
+langcode:"Cod iaith",\r
+mime:"Math MIME targed",\r
+ltr:"Chwith i'r dde",\r
+rtl:"De i'r chwith",\r
+bgimage:"Delwedd cefndir",\r
+summary:"Crynodeb",\r
+td:"Data",\r
+th:"Pennyn",\r
+cell_cell:"Diweddaru cell cyfredol",\r
+cell_row:"Diweddaru pob cell yn y rhes",\r
+cell_all:"Diweddaru pob cell yn y tabl",\r
+row_row:"Diweddaru rhes cyfredol",\r
+row_odd:"Diweddaru rhesi odrif yn y tabl",\r
+row_even:"Diweddaru rhesi eilrif yn y tabl",\r
+row_all:"Diweddaru pob rhes yn y tabl",\r
+thead:"Pen Tabl",\r
+tbody:"Corff Tabl",\r
+tfoot:"Troed Tabl",\r
+scope:"Cwmpas",\r
+rowgroup:"Gr\u0175p Rhesi",\r
+colgroup:"Gr\u0175p Colofnau",\r
+col_limit:"Rydych wedi mynd tu twnt i'r nifer uchafswm {$cols} o golofnau.",\r
+row_limit:"Rydych wedi mynd tu twnt i'r nifer uchafswm {$rows} o rhesi.",\r
+cell_limit:"Rydych wedi mynd tu twnt i'r nifer uchafswm {$cells} o celloedd.",\r
+missing_scope:"A ydych chi'n si\u0175r eich bod eisiau parhau heb penodi cwmpas i'r cell pennyn yma? Hebddo fo, efallai fydd o'n anodd i rhai ddefnyddwyr gyda anableddau i ddeallt y cynnwys neu'r data yn y tabl.",\r
+caption:"Egluryn tabl",\r
+frame:"Ffr\u00E2m",\r
+frame_none:"none",\r
+frame_groups:"groups",\r
+frame_rows:"rows",\r
+frame_cols:"cols",\r
+frame_all:"all",\r
+rules:"Rheolau",\r
+rules_void:"void",\r
+rules_above:"above",\r
+rules_below:"o dan",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"box",\r
+rules_border:"border"\r
+});
\ No newline at end of file
index 24dacd26f40ec84ac7cfcc8be10e91aa29349ebe..6deb56868f43929505df796fe1a16681dcc7b4ff 100755 (executable)
@@ -30,7 +30,7 @@ id:"Id",
 style:"Style",\r
 langdir:"Sprogretning",\r
 langcode:"Sprogkode",\r
-mime:"Destinations MIME type",\r
+mime:"Destinations-MIME-type",\r
 ltr:"Venstre mod h\u00F8jre",\r
 rtl:"H\u00F8jre mod venstre",\r
 bgimage:"Baggrundsbillede",\r
@@ -50,10 +50,10 @@ tfoot:"Tabelfod",
 scope:"Forklaring",\r
 rowgroup:"R\u00E6kkegruppe",\r
 colgroup:"Kolonnegruppe",\r
-col_limit:"Du har overskredet antallet af tilladte kolonnerr p\u00E5 {$cols}.",\r
+col_limit:"Du har overskredet antallet af tilladte kolonner p\u00E5 {$cols}.",\r
 row_limit:"Du har overskredet antallet af tilladte r\u00E6kker p\u00E5 {$rows}.",\r
 cell_limit:"Du har overskredet antallet af tilladte celler p\u00E5 {$cells}.",\r
-missing_scope:"Er du sikker p\u00E5 di vil forts\u00E6tte uden at angive forklaring for denne overskriftscelle? Uden forklaring vil v\u00E6re sv\u00E6rt for f.ek.s blinde at l\u00E6se og forst\u00E5 indholdet i tabellen.",\r
+missing_scope:"Er du sikker p\u00E5, du vil forts\u00E6tte uden at angive forklaring for denne overskriftscelle? Uden forklaring vil v\u00E6re sv\u00E6rt for f.ek.s blinde at l\u00E6se og forst\u00E5 indholdet i tabellen.",\r
 caption:"Tabeloverskrift",\r
 frame:"Ramme",\r
 frame_none:"ingen",\r
index 7bbe7fa1aac2dd1795dfd561a12b6eb178238d9a..850ffc9064161ec6bdbd521dc3791273aaea0904 100755 (executable)
@@ -3,7 +3,7 @@ general_tab:"Allgemein",
 advanced_tab:"Erweitert",\r
 general_props:"Allgemeine Einstellungen",\r
 advanced_props:"Erweiterte Einstellungen",\r
-rowtype:"Row in table part",\r
+rowtype:"Gruppierung",\r
 title:"Tabelle einf\u00FCgen/bearbeiten",\r
 width:"Breite",\r
 height:"H\u00F6he",\r
@@ -47,28 +47,28 @@ row_all:"Alle Zeilen ver\u00E4ndern",
 thead:"Tabellenkopf",\r
 tbody:"Tabelleninhalt",\r
 tfoot:"Tabellenfu\u00DF",\r
-scope:"Zusammenhang",\r
+scope:"Bezug",\r
 rowgroup:"Vertikal gruppieren",\r
 colgroup:"Horizontal gruppieren",\r
 col_limit:"Sie haben die maximale Spaltenzahl von {$cols} \u00FCberschritten.",\r
 row_limit:"Sie haben die maximale Zeilenzahl von {$rows} \u00FCberschritten.",\r
 cell_limit:"Sie haben die maximale Zellenzahl von {$cells} \u00FCberschritten.",\r
-missing_scope:"Sind Sie sicher, dass Sie keinen Zusammenhang f\u00FCr diese \u00DCberschrift angeben wollen? Benutzer mit k\u00F6rperlichen Einschr\u00E4nkungen k\u00F6nnten Schwierigkeiten haben, den Inhalt der Tabelle zu verstehen.",\r
+missing_scope:"Wollen Sie wirklich keine Beziehung f\u00FCr diese \u00DCberschrift angeben? Benutzer mit k\u00F6rperlichen Einschr\u00E4nkungen k\u00F6nnten Schwierigkeiten haben, den Inhalt der Tabelle zu verstehen.",\r
 caption:"Beschriftung der Tabelle",\r
-frame:"Gitter",\r
-frame_none:"keins",\r
-frame_groups:"Gruppen",\r
-frame_rows:"Zeilen",\r
-frame_cols:"Spalten",\r
-frame_all:"Alle",\r
-rules:"Rules",\r
-rules_void:"void",\r
-rules_above:"above",\r
-rules_below:"below",\r
-rules_hsides:"hsides",\r
-rules_lhs:"lhs",\r
-rules_rhs:"rhs",\r
-rules_vsides:"vsides",\r
-rules_box:"box",\r
-rules_border:"border"\r
+frame:"Rahmen",\r
+frame_none:"keine",\r
+frame_groups:"zwischen Gruppen",\r
+frame_rows:"zwischen Zeilen",\r
+frame_cols:"zwischen Spalten",\r
+frame_all:"zwischen allen Zellen",\r
+rules:"Gitter",\r
+rules_void:"keins",\r
+rules_above:"nur oben",\r
+rules_below:"nur unten",\r
+rules_hsides:"oben und unten",\r
+rules_lhs:"nur links",\r
+rules_rhs:"nur rechts",\r
+rules_vsides:"links und rechts",\r
+rules_box:"alle 4 Seiten (Box)",\r
+rules_border:"alle 4 Seiten (Border)"\r
 });
\ No newline at end of file
index f717ba743f5c962a46ff9dd3134462b123a309db..53786c4864cd78425f6757669cffa4340d8bd448 100755 (executable)
@@ -53,7 +53,7 @@ colgroup:"Grupo de columnas",
 col_limit:"Ha superado el n\u00FAmero m\u00E1ximo de columnas: {$cols}.",\r
 row_limit:"Ha superado el n\u00FAmero m\u00E1ximo de filas: {$rows}.",\r
 cell_limit:"Ha superado el n\u00FAmero m\u00E1ximo de celdas: {$cells}.",\r
-missing_scope:"\u00BFEst\u00E1 seguro que desea continuar sin especificar el alcance del encabezado de celda? Sin \u00E9l podr\u00EDa ser dificultoso para algunos usuarios entender el contenido o los datos mostrados en la tabla.",\r
+missing_scope:" \u00BFEst\u00E1 seguro que desea continuar sin especificar el alcance del encabezado de celda? Sin \u00E9l podr\u00EDa ser dificultoso para algunos usuarios entender el contenido o los datos mostrados en la tabla.",\r
 caption:"Subt\u00EDtulo de la tabla",\r
 frame:"Recuadro",\r
 frame_none:"ninguno",\r
index 3d28433e1c85fdf8e2e59ece4b8906f61ffd7a76..dae6d97f153d9984ab0b201e997588e41727cc73 100755 (executable)
@@ -1,74 +1,74 @@
 tinyMCE.addI18n('et.table_dlg',{\r
-general_tab:"General",\r
-advanced_tab:"Advanced",\r
-general_props:"General properties",\r
-advanced_props:"Advanced properties",\r
-rowtype:"Row in table part",\r
-title:"Insert/Modify table",\r
-width:"Width",\r
-height:"Height",\r
-cols:"Cols",\r
-rows:"Rows",\r
-cellspacing:"Cellspacing",\r
-cellpadding:"Cellpadding",\r
-border:"Border",\r
-align:"Alignment",\r
-align_default:"Default",\r
-align_left:"Left",\r
-align_right:"Right",\r
-align_middle:"Center",\r
-row_title:"Table row properties",\r
-cell_title:"Table cell properties",\r
-cell_type:"Cell type",\r
-valign:"Vertical alignment",\r
-align_top:"Top",\r
-align_bottom:"Bottom",\r
-bordercolor:"Border color",\r
-bgcolor:"Background color",\r
-merge_cells_title:"Merge table cells",\r
-id:"Id",\r
-style:"Style",\r
-langdir:"Language direction",\r
-langcode:"Language code",\r
-mime:"Target MIME type",\r
-ltr:"Left to right",\r
-rtl:"Right to left",\r
-bgimage:"Background image",\r
-summary:"Summary",\r
-td:"Data",\r
-th:"Header",\r
-cell_cell:"Update current cell",\r
-cell_row:"Update all cells in row",\r
-cell_all:"Update all cells in table",\r
-row_row:"Update current row",\r
-row_odd:"Update odd rows in table",\r
-row_even:"Update even rows in table",\r
-row_all:"Update all rows in table",\r
-thead:"Table Head",\r
-tbody:"Table Body",\r
-tfoot:"Table Foot",\r
-scope:"Scope",\r
-rowgroup:"Row Group",\r
-colgroup:"Col Group",\r
-col_limit:"You've exceeded the maximum number of columns of {$cols}.",\r
-row_limit:"You've exceeded the maximum number of rows of {$rows}.",\r
-cell_limit:"You've exceeded the maximum number of cells of {$cells}.",\r
-missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
-caption:"Table caption",\r
-frame:"Frame",\r
-frame_none:"none",\r
-frame_groups:"groups",\r
-frame_rows:"rows",\r
-frame_cols:"cols",\r
-frame_all:"all",\r
-rules:"Rules",\r
-rules_void:"void",\r
-rules_above:"above",\r
-rules_below:"below",\r
+general_tab:"\u00DCldine",\r
+advanced_tab:"T\u00E4psustatud",\r
+general_props:"\u00DCldised seaded",\r
+advanced_props:"T\u00E4psustatud seaded",\r
+rowtype:"Rida rea osas",\r
+title:"Sisesta/muuda tabelit",\r
+width:"Laius",\r
+height:"K\u00F5rgus",\r
+cols:"Veerge",\r
+rows:"Ridu",\r
+cellspacing:"Veeru laius",\r
+cellpadding:"Veeru t\u00E4ide",\r
+border:"Raam",\r
+align:"Joondus",\r
+align_default:"Vaikimisi",\r
+align_left:"Vasak",\r
+align_right:"Parem",\r
+align_middle:"Keskel",\r
+row_title:"Tabeli rea seaded",\r
+cell_title:"Tabeli veeru seaded",\r
+cell_type:"Veeru t\u00FC\u00FCp",\r
+valign:"Vertikaalne joondus",\r
+align_top:"\u00DCleval",\r
+align_bottom:"All",\r
+bordercolor:"Raami v\u00E4rv",\r
+bgcolor:"Tausta v\u00E4rv",\r
+merge_cells_title:"\u00DChenda lahtrid",\r
+id:"ID",\r
+style:"Stiil",\r
+langdir:"Keele suund",\r
+langcode:"Keele kood",\r
+mime:"M\u00E4rgista MIME t\u00FC\u00FCp",\r
+ltr:"Vasakult paremale",\r
+rtl:"Paremalt vasakule",\r
+bgimage:"Tausta pilt",\r
+summary:"Kokkuv\u00F5te",\r
+td:"Info",\r
+th:"P\u00E4is",\r
+cell_cell:"Uuenda antud lahtrit",\r
+cell_row:"Uuenda k\u00F5iki lahtreid reas",\r
+cell_all:"Uuenda k\u00F5iki lahtreid tabelis",\r
+row_row:"Uuenda antud rida",\r
+row_odd:"Uuenda paarituid ridu tabelis",\r
+row_even:"Uuenda paaris ridu tabelis",\r
+row_all:"Uuenda k\u00F5iki ridu tabelis",\r
+thead:"Tabeli p\u00E4is",\r
+tbody:"Tabeli sisu",\r
+tfoot:"Tabeli jalus",\r
+scope:"Ulatus",\r
+rowgroup:"Rea grupp",\r
+colgroup:"Veeru grupp",\r
+col_limit:"Oled j\u00F5udnud maksemaalse arvu veegudeni.",\r
+row_limit:"Oled j\u00F5udnud maksimaalse arvu ridadeni",\r
+cell_limit:"Oled j\u00F5udnud maksimaalse arvu elementideni",\r
+missing_scope:"Oled kindel, et soovid j\u00E4tkata t\u00E4psustamata antud tabeli p\u00E4ise nime?",\r
+caption:"Tabeli seletus",\r
+frame:"Raam",\r
+frame_none:"mitte \u00FCkski",\r
+frame_groups:"grupid",\r
+frame_rows:"read",\r
+frame_cols:"veerud",\r
+frame_all:"k\u00F5ik",\r
+rules:"Reeglid",\r
+rules_void:"t\u00FChi",\r
+rules_above:"\u00FCleval",\r
+rules_below:"all",\r
 rules_hsides:"hsides",\r
 rules_lhs:"lhs",\r
 rules_rhs:"rhs",\r
 rules_vsides:"vsides",\r
-rules_box:"box",\r
-rules_border:"border"\r
+rules_box:"kast",\r
+rules_border:"raam"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/eu_dlg.js b/program/js/tiny_mce/plugins/table/langs/eu_dlg.js
new file mode 100644 (file)
index 0000000..f51f333
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('eu.table_dlg',{\r
+general_tab:"Orokorra",\r
+advanced_tab:"Aurreratua",\r
+general_props:"Ezaugarri orokorrak",\r
+advanced_props:"Ezaugarri aurreratuak",\r
+rowtype:"Row in table part",\r
+title:"Txertatu/Aldatu taula",\r
+width:"Zabalera",\r
+height:"Altuera",\r
+cols:"Zutabeak",\r
+rows:"Lerroak",\r
+cellspacing:"Cellspacing",\r
+cellpadding:"Cellpadding",\r
+border:"Border",\r
+align:"Lerrokatzea",\r
+align_default:"Default",\r
+align_left:"Ezkerrera",\r
+align_right:"Eskuinera",\r
+align_middle:"Erdian",\r
+row_title:"Lerro ezaugarriak",\r
+cell_title:"Gelaxka ezaugarriak",\r
+cell_type:"Gelaxka mota",\r
+valign:"Lerrokatze bertikala",\r
+align_top:"Goian",\r
+align_bottom:"Behean",\r
+bordercolor:"Border color",\r
+bgcolor:"Atzeko kolorea",\r
+merge_cells_title:"Bateratu gelaxkak",\r
+id:"Id",\r
+style:"Estiloa",\r
+langdir:"Hizkuntza norabidea",\r
+langcode:"Hizkuntza kodea",\r
+mime:"Helburuareb MIME mota",\r
+ltr:"Ezkerretik eskuinera",\r
+rtl:"Eskuinetik ezkerrera",\r
+bgimage:"Atzeko irudia",\r
+summary:"Laburpena",\r
+td:"Datuak",\r
+th:"Goiburua",\r
+cell_cell:"Eguneratu uneko gelaxka",\r
+cell_row:"Eguneratu lerroko gelaxka guztiak",\r
+cell_all:"Eguneratu gelaxka guztiak",\r
+row_row:"Eguneratu uneko lerroa",\r
+row_odd:"Eguneratu lerro bikoitiak",\r
+row_even:"Eguneratu lerro bakoitiak",\r
+row_all:"Eguneratu lerro guztiak",\r
+thead:"Taularen Goiburukoa",\r
+tbody:"Taularen Gorputza",\r
+tfoot:"Taularen Oina",\r
+scope:"Eremua",\r
+rowgroup:"Lerro Taldea",\r
+colgroup:"Zut Taldea",\r
+col_limit:"Zutabe kopuru maximoa ({$cols}) gainditu duzu.",\r
+row_limit:"Lerro kopuru maximoa ({$rows}) gainditu duzu.",\r
+cell_limit:"Gelaxka kopuru maximoa ({$cells}) gainditu duzu..",\r
+missing_scope:"Taularen goiburukoari eremu bat zehaztu gabe jarritu nahi duzula ziur zaude? Eremu hori gabe, ezintasunak dituzten erabiltzaileentzat zaila izango da taularen datuak ulertzea.",\r
+caption:"Table caption",\r
+frame:"Markoa",\r
+frame_none:"none",\r
+frame_groups:"taldeak",\r
+frame_rows:"lerroak",\r
+frame_cols:"zurabeak",\r
+frame_all:"guztiak",\r
+rules:"Rules",\r
+rules_void:"void",\r
+rules_above:"above",\r
+rules_below:"below",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"box",\r
+rules_border:"border"\r
+});
\ No newline at end of file
index eb241420c1790b6682169792d8c10d85401e107b..f3e0e880413b224f406c17c4adfe8d53dbc50354 100755 (executable)
@@ -3,72 +3,72 @@ general_tab:"\u0639\u0645\u0648\u0645\u06CC",
 advanced_tab:"\u067E\u06CC\u0634\u0631\u0641\u062A\u0647",\r
 general_props:"\u0645\u0634\u062E\u0635\u0627\u062A \u0639\u0645\u0648\u0645\u06CC",\r
 advanced_props:"\u0645\u0634\u062E\u0635\u0627\u062A \u067E\u06CC\u0634\u0631\u0641\u062A\u0647",\r
-rowtype:"Row in table part",\r
+rowtype:"\u0633\u0637\u0631 \u062F\u0631 \u0628\u062E\u0634 \u062C\u062F\u0648\u0644",\r
 title:"\u062F\u0631\u062C/\u0627\u0635\u0644\u0627\u062D \u062C\u062F\u0648\u0644",\r
-width:"\u0639\u0631\u0636",\r
+width:"\u067E\u0647\u0646\u0627",\r
 height:"\u0627\u0631\u062A\u0641\u0627\u0639",\r
-cols:"\u0633\u062A\u0648\u0646\u200C\u0647\u0627",\r
+cols:"\u0633\u062A\u0648\u0646 \u0647\u0627",\r
 rows:"\u0633\u0637\u0631\u0647\u0627",\r
-cellspacing:"Cellspacing",\r
-cellpadding:"Cellpadding",\r
+cellspacing:"\u0641\u0627\u0635\u0644\u0647 \u0633\u0644\u0648\u0644 \u0647\u0627",\r
+cellpadding:"\u0644\u0627\u06CC\u0647 \u06AF\u0630\u0627\u0631\u06CC \u0633\u0644\u0648\u0644 \u0647\u0627",\r
 border:"\u062D\u0627\u0634\u06CC\u0647",\r
 align:"\u062A\u0631\u0627\u0632",\r
-align_default:"\u067E\u06CC\u0634 \u0641\u0631\u0636",\r
+align_default:"\u067E\u06CC\u0634\u0641\u0631\u0636",\r
 align_left:"\u0686\u067E",\r
 align_right:"\u0631\u0627\u0633\u062A",\r
-align_middle:"\u0645\u0631\u06A9\u0632",\r
+align_middle:"\u0648\u0633\u0637",\r
 row_title:"\u0645\u0634\u062E\u0635\u0627\u062A \u0633\u0637\u0631 \u062C\u062F\u0648\u0644",\r
-cell_title:"\u0645\u0634\u062E\u0635\u0627\u062A \u0633\u062A\u0648\u0646 \u062C\u062F\u0648\u0644",\r
+cell_title:"\u0645\u0634\u062E\u0635\u0627\u062A \u0633\u0644\u0648\u0644 \u062C\u062F\u0648\u0644",\r
 cell_type:"\u0646\u0648\u0639 \u0633\u0644\u0648\u0644",\r
 valign:"\u062A\u0631\u0627\u0632 \u0639\u0645\u0648\u062F\u06CC",\r
 align_top:"\u0628\u0627\u0644\u0627",\r
 align_bottom:"\u067E\u0627\u06CC\u06CC\u0646",\r
 bordercolor:"\u0631\u0646\u06AF \u062D\u0627\u0634\u06CC\u0647",\r
-bgcolor:"\u0631\u0646\u06AF \u067E\u0633 \u0632\u0645\u06CC\u0646\u0647",\r
-merge_cells_title:"\u0627\u062F\u063A\u0627\u0645 \u0633\u0644\u0648\u0644\u200C\u0647\u0627\u06CC \u062C\u062F\u0648\u0644",\r
+bgcolor:"\u0631\u0646\u06AF \u0632\u0645\u06CC\u0646\u0647",\r
+merge_cells_title:"\u0627\u062F\u063A\u0627\u0645 \u0633\u0644\u0648\u0644 \u0647\u0627\u06CC \u062C\u062F\u0648\u0644",\r
 id:"\u0634\u0646\u0627\u0633\u0647",\r
-style:"\u0633\u0628\u06A9",\r
+style:"\u0627\u0633\u062A\u06CC\u0644",\r
 langdir:"\u062C\u0647\u062A \u0632\u0628\u0627\u0646",\r
-langcode:"\u06A9\u062F \u0632\u0628\u0627\u0646",\r
-mime:"\u0647\u062F\u0641 MIME type",\r
+langcode:"\u0643\u062F \u0632\u0628\u0627\u0646",\r
+mime:"\u0646\u0648\u0639 MIME \u0645\u0642\u0635\u062F (Target)",\r
 ltr:"\u0686\u067E \u0628\u0647 \u0631\u0627\u0633\u062A",\r
 rtl:"\u0631\u0627\u0633\u062A \u0628\u0647 \u0686\u067E",\r
-bgimage:"\u062A\u0635\u0648\u06CC\u0631 \u067E\u0633 \u0632\u0645\u06CC\u0646\u0647",\r
-summary:"\u062E\u0644\u0627\u0635\u0647 \u0648\u0636\u0639\u06CC\u062A",\r
-td:"\u062F\u0627\u062F\u0647\u200C\u0647\u0627",\r
-th:"\u0633\u0631\u0641\u0635\u0644",\r
-cell_cell:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u0633\u0644\u0648\u0644 \u062C\u0627\u0631\u06CC",\r
-cell_row:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u062A\u0645\u0627\u0645 \u0633\u0644\u0648\u0644\u200C\u0647\u0627\u06CC \u0627\u06CC\u0646 \u0633\u0637\u0631",\r
-cell_all:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u062A\u0645\u0627\u0645 \u0633\u0644\u0648\u0644\u200C\u0647\u0627\u06CC \u062C\u062F\u0648\u0644",\r
-row_row:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u0633\u0637\u0631 \u062C\u0627\u0631\u06CC",\r
-row_odd:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u0633\u0637\u0631\u0647\u0627\u06CC \u0641\u0631\u062F \u062C\u062F\u0648\u0644",\r
-row_even:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u0633\u0637\u0631\u0647\u0627\u06CC \u0632\u0648\u062C \u062C\u062F\u0648\u0644",\r
-row_all:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u062A\u0645\u0627\u0645 \u0633\u0637\u0631\u0647\u0627\u06CC \u062C\u062F\u0648\u0644",\r
-thead:"\u062C\u062F\u0648\u0644 Head",\r
+bgimage:"\u062A\u0635\u0648\u06CC\u0631 \u0632\u0645\u06CC\u0646\u0647",\r
+summary:"\u062E\u0644\u0627\u0635\u0647",\r
+td:"\u062F\u0627\u062F\u0647",\r
+th:"\u0633\u0631 \u062C\u062F\u0648\u0644",\r
+cell_cell:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u0633\u0644\u0648\u0644 \u0641\u0639\u0644\u06CC",\r
+cell_row:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u062A\u0645\u0627\u0645\u06CC \u0633\u0644\u0648\u0644 \u0647\u0627\u06CC \u0633\u0637\u0631",\r
+cell_all:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u062A\u0645\u0627\u0645\u06CC \u0633\u0644\u0648\u0644 \u0647\u0627\u06CC \u062C\u062F\u0648\u0644",\r
+row_row:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u0633\u0637\u0631 \u0641\u0639\u0644\u06CC",\r
+row_odd:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u0633\u0637\u0631\u0647\u0627\u06CC \u0641\u0631\u062F \u062F\u0631 \u062C\u062F\u0648\u0644",\r
+row_even:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u0633\u0637\u0631\u0647\u0627\u06CC \u0632\u0648\u062C \u062F\u0631 \u062C\u062F\u0648\u0644",\r
+row_all:"\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06CC \u062A\u0645\u0627\u0645\u06CC \u0633\u0637\u0631\u0647\u0627 \u062F\u0631 \u062C\u062F\u0648\u0644",\r
+thead:"\u0628\u0627\u0644\u0627\u06CC \u062C\u062F\u0648\u0644",\r
 tbody:"\u0628\u062F\u0646\u0647 \u062C\u062F\u0648\u0644",\r
-tfoot:"\u062C\u062F\u0648\u0644 Foot",\r
-scope:"Scope",\r
-rowgroup:"Row Group",\r
-colgroup:"Col Group",\r
-col_limit:"You've exceeded the maximum number of columns of {$cols}.",\r
-row_limit:"You've exceeded the maximum number of rows of {$rows}.",\r
-cell_limit:"You've exceeded the maximum number of cells of {$cells}.",\r
-missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
-caption:"Table caption",\r
-frame:"Frame",\r
-frame_none:"none",\r
-frame_groups:"groups",\r
-frame_rows:"rows",\r
-frame_cols:"cols",\r
+tfoot:"\u067E\u0627\u06CC\u06CC\u0646 \u062C\u062F\u0648\u0644",\r
+scope:"\u0645\u062D\u062F\u0648\u062F\u0647",\r
+rowgroup:"\u06AF\u0631\u0648\u0647 \u0633\u0637\u0631",\r
+colgroup:"\u06AF\u0631\u0648\u0647 \u0633\u062A\u0648\u0646",\r
+col_limit:"\u0634\u0645\u0627 \u0627\u0632 \u062A\u0639\u062F\u0627\u062F \u062D\u062F\u0627\u0643\u062B\u0631 {$cols} \u0633\u062A\u0648\u0646 \u062A\u062C\u0627\u0648\u0632 \u0643\u0631\u062F\u06CC\u062F.",\r
+row_limit:"\u0634\u0645\u0627 \u0627\u0632 \u062A\u0639\u062F\u0627\u062F \u062D\u062F\u0627\u0643\u062B\u0631 {$rows} \u0633\u0637\u0631 \u062A\u062C\u0627\u0648\u0632 \u0643\u0631\u062F\u06CC\u062F.",\r
+cell_limit:"\u0634\u0645\u0627 \u0627\u0632 \u062A\u0639\u062F\u0627\u062F \u062D\u062F\u0627\u0643\u062B\u0631 {$cells} \u0633\u0644\u0648\u0644 \u062A\u062C\u0627\u0648\u0632 \u0643\u0631\u062F\u06CC\u062F.",\r
+missing_scope:"\u0622\u06CC\u0627 \u0634\u0645\u0627 \u0627\u0632 \u0627\u062F\u0627\u0645\u0647 \u062F\u0627\u062F\u0646 \u0628\u062F\u0648\u0646 \u062A\u0639\u06CC\u06CC\u0646 \u0645\u062D\u062F\u0648\u062F\u0647 \u0628\u0631\u0627\u06CC \u0627\u06CC\u0646 \u0633\u0644\u0648\u0644 \u0628\u0627\u0644\u0627\u06CC \u062C\u062F\u0648\u0644 \u0627\u0637\u0645\u06CC\u0646\u0627\u0646 \u062F\u0627\u0631\u06CC\u062F\u061F. \u0628\u062F\u0648\u0646 \u0622\u0646 \u060C \u0645\u0645\u0643\u0646 \u0627\u0633\u062A \u0628\u0631\u0627\u06CC \u0628\u0631\u062E\u06CC \u0643\u0627\u0631\u0628\u0631\u0627\u0646 \u0639\u0627\u062C\u0632 \u0627\u0632 \u0641\u0647\u0645 \u0645\u062D\u062A\u0648\u0627 \u06CC\u0627 \u062F\u0631 \u062F\u0627\u062F\u0647 \u0647\u0627\u06CC \u0646\u0645\u0627\u06CC\u0634 \u062F\u0627\u062F\u0647 \u0634\u062F\u0647 \u062C\u062F\u0648\u0644 \u0645\u0634\u0643\u0644\u06CC \u067E\u06CC\u0634 \u0622\u06CC\u062F.",\r
+caption:"\u0639\u0646\u0648\u0627\u0646 \u062C\u062F\u0648\u0644",\r
+frame:"\u0642\u0627\u0628 (Frame)",\r
+frame_none:"\u0647\u06CC\u0686 \u0643\u062F\u0627\u0645",\r
+frame_groups:"\u06AF\u0631\u0648\u0647 \u0647\u0627",\r
+frame_rows:"\u0633\u0637\u0631\u0647\u0627",\r
+frame_cols:"\u0633\u062A\u0648\u0646 \u0647\u0627",\r
 frame_all:"\u0647\u0645\u0647",\r
-rules:"Rules",\r
-rules_void:"void",\r
-rules_above:"above",\r
-rules_below:"below",\r
+rules:"\u062E\u0637 \u0647\u0627",\r
+rules_void:"\u062E\u0627\u0644\u06CC",\r
+rules_above:"\u0628\u0627\u0644\u0627",\r
+rules_below:"\u067E\u0627\u06CC\u06CC\u0646",\r
 rules_hsides:"hsides",\r
 rules_lhs:"lhs",\r
 rules_rhs:"rhs",\r
 rules_vsides:"vsides",\r
-rules_box:"box",\r
-rules_border:"border"\r
+rules_box:"\u062C\u0639\u0628\u0647",\r
+rules_border:"\u062D\u0627\u0634\u06CC\u0647"\r
 });
\ No newline at end of file
index 9f14328f79c46693102239e6b636d9106f1b4b96..8a0fca1f6866dffb283638500c8b35bbbffe66a5 100755 (executable)
@@ -53,7 +53,7 @@ colgroup:"Sarake ryhm\u00E4",
 col_limit:"Olet ylitt\u00E4nyt suurimman sallitun m\u00E4\u00E4r\u00E4n sarakkeita {$cols}.",\r
 row_limit:"Olet ylitt\u00E4nyt suurimman sallitun m\u00E4\u00E4r\u00E4n rivej\u00E4 {$rows}.",\r
 cell_limit:"Olet ylitt\u00E4nyt suurimman sallitun m\u00E4\u00E4r\u00E4n soluja {$cells}.",\r
-missing_scope:"Haluatko varmasti jatkaa m\u00E4\u00E4ritt\u00E4m\u00E4tt\u00E4 tilaa t\u00E4lle taulukon otsakesolulle? Ilman sit\u00E4 voi olla joillekin k\u00E4ytt\u00E4jille vaikea ymm\u00E4rt\u00E4\u00E4 taulukon sis\u00E4lt\u00E4m\u00E4\u00E4 informaatiota.",\r
+missing_scope:"Haluatko varmasti jatkaa m\u00E4\u00E4ritt\u00E4m\u00E4tt\u00E4 tilaa t\u00E4lle taulukon otsakesolulle? Ilman sit\u00E4 joidenkin k\u00E4ytt\u00E4jien voi olla vaikea ymm\u00E4rt\u00E4\u00E4 taulukon sis\u00E4lt\u00E4m\u00E4\u00E4 informaatiota.",\r
 caption:"Taulukon seloste",\r
 frame:"kehys",\r
 frame_none:"ei mit\u00E4\u00E4n",\r
index d49267ed32629e6b65da1aedad6a4a7d3ba61c34..a8bda8d436530b1dda4c779702cfbb522bf32771 100755 (executable)
@@ -4,18 +4,18 @@ advanced_tab:"Avanc\u00E9",
 general_props:"Propri\u00E9t\u00E9s g\u00E9n\u00E9rales",\r
 advanced_props:"Propri\u00E9t\u00E9s avanc\u00E9es",\r
 rowtype:"Type de ligne",\r
-title:"Ins\u00E9rer/Modifier tableau",\r
+title:"Ins\u00E9rer / modifier un tableau",\r
 width:"Largeur",\r
 height:"Hauteur",\r
 cols:"Colonnes",\r
 rows:"Lignes",\r
-cellspacing:"Espacement des cellules",\r
+cellspacing:"Espacement entre les cellules",\r
 cellpadding:"Espacement dans les cellules",\r
 border:"Bordure",\r
 align:"Alignement",\r
-align_default:"Par defaut",\r
+align_default:"Par d\u00E9faut",\r
 align_left:"Gauche",\r
-align_right:"Droit",\r
+align_right:"Droite",\r
 align_middle:"Centr\u00E9",\r
 row_title:"Propri\u00E9t\u00E9s de la ligne",\r
 cell_title:"Propri\u00E9t\u00E9s de la cellule",\r
@@ -25,7 +25,7 @@ align_top:"Haut",
 align_bottom:"Bas",\r
 bordercolor:"Couleur de la bordure",\r
 bgcolor:"Couleur du fond",\r
-merge_cells_title:"Fusioner les cellules",\r
+merge_cells_title:"Fusionner les cellules",\r
 id:"Id",\r
 style:"Style",\r
 langdir:"Sens de lecture",\r
@@ -39,12 +39,12 @@ td:"Donn\u00E9es",
 th:"Titre",\r
 cell_cell:"Mettre \u00E0 jour la cellule courante",\r
 cell_row:"Mettre \u00E0 jour toutes les cellules de la ligne",\r
-cell_all:"Mettre \u00E0 jour toutes les celluls du tableau",\r
+cell_all:"Mettre \u00E0 jour toutes les cellules du tableau",\r
 row_row:"Mettre \u00E0 jour la ligne courante",\r
 row_odd:"Mettre \u00E0 jour les lignes impaires",\r
 row_even:"Mettre \u00E0 jour les lignes paires",\r
-row_all:"Mettre \u00E0 jout toutes les lignes du tableau",\r
-thead:"T\u00EAte de tableau",\r
+row_all:"Mettre \u00E0 jour toutes les lignes du tableau",\r
+thead:"En-t\u00EAtes de tableau",\r
 tbody:"Corps de tableau",\r
 tfoot:"Pied de tableau",\r
 scope:"Port\u00E9e",\r
@@ -53,7 +53,7 @@ colgroup:"Groupe de colonnes",
 col_limit:"Vous avez d\u00E9pass\u00E9 le nombre maximum de colonnes ({$cols}).",\r
 row_limit:"Vous avez d\u00E9pass\u00E9 le nombre maximum de lignes ({$rows}).",\r
 cell_limit:"Vous avez d\u00E9pass\u00E9 le nombre maximum de cellules ({$cells}).",\r
-missing_scope:"\u00CAtes-vous s\u00FBr de vouloir continuer sans sp\u00E9ficier de port\u00E9e pour cette cellule de titre\u00A0? Sans port\u00E9e, cela peut \u00EAtre difficile pour certains usagers \u00E0 probl\u00E8mes de comprendre le contenu ou les donn\u00E9es affich\u00E9es dans le tableau.",\r
+missing_scope:"\u00CAtes-vous s\u00FBr de vouloir continuer sans sp\u00E9cifier de port\u00E9e pour cette cellule de titre ? Sans port\u00E9e, cela peut \u00EAtre difficile pour certains utilisateurs de comprendre le contenu ou les donn\u00E9es affich\u00E9es dans le tableau.",\r
 caption:"Afficher la l\u00E9gende du tableau",\r
 frame:"Cadre",\r
 frame_none:"aucun",\r
@@ -62,13 +62,13 @@ frame_rows:"lignes",
 frame_cols:"colonnes",\r
 frame_all:"tous",\r
 rules:"R\u00E8gles",\r
-rules_void:"nul",\r
-rules_above:"au dessus",\r
-rules_below:"au dessous",\r
-rules_hsides:"hsides",\r
-rules_lhs:"lhs",\r
-rules_rhs:"rhs",\r
-rules_vsides:"vsides",\r
-rules_box:"box",\r
-rules_border:"border"\r
+rules_void:"aucune",\r
+rules_above:"au-dessus",\r
+rules_below:"au-dessous",\r
+rules_hsides:"horizontales",\r
+rules_lhs:"\u00E0 gauche",\r
+rules_rhs:"\u00E0 droite",\r
+rules_vsides:"verticales",\r
+rules_box:"bo\u00EEte",\r
+rules_border:"bordure"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/gl_dlg.js b/program/js/tiny_mce/plugins/table/langs/gl_dlg.js
new file mode 100644 (file)
index 0000000..806803f
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('gl.table_dlg',{\r
+general_tab:"Xeral",\r
+advanced_tab:"Avanzado",\r
+general_props:"Propiedades xerales",\r
+advanced_props:"Propiedades avanzadas",\r
+rowtype:"Tipo de fila",\r
+title:"Insertar/Modificar t\u00E1boa",\r
+width:"Ancho",\r
+height:"Alto",\r
+cols:"Cols",\r
+rows:"Filas",\r
+cellspacing:"Espaciado de celda",\r
+cellpadding:"Relleno de celda",\r
+border:"Borde",\r
+align:"Ali\u00F1aci\u00F3n",\r
+align_default:"Predet.",\r
+align_left:"Esquerda",\r
+align_right:"Dereita",\r
+align_middle:"Centrado",\r
+row_title:"Propiedades da fila",\r
+cell_title:"Propiedades da celda",\r
+cell_type:"Tipo de celda",\r
+valign:"Ali\u00F1aci\u00F3n vertical",\r
+align_top:"Arriba",\r
+align_bottom:"Abaixo",\r
+bordercolor:"Cor do borde",\r
+bgcolor:"Cor de fondo",\r
+merge_cells_title:"Unir celdas",\r
+id:"Id",\r
+style:"Estilo",\r
+langdir:"Direcci\u00F3n da lenguaxe",\r
+langcode:"C\u00F3digo da lenguaxe",\r
+mime:"Tipo MIME",\r
+ltr:"Esquerda a dereita",\r
+rtl:"Dereita a esquerda",\r
+bgimage:"Imaxe de fondo",\r
+summary:"Resumen",\r
+td:"Datos",\r
+th:"Encabezamento",\r
+cell_cell:"Actualizar celda actual",\r
+cell_row:"Actualizar todalas celdas na fila",\r
+cell_all:"Actualizar todalas celdas na t\u00E1boa",\r
+row_row:"Actualizar fila actual",\r
+row_odd:"Actualizar filas impares",\r
+row_even:"Actualizar filas pares",\r
+row_all:"Actualizar todalas filas",\r
+thead:"Encabezamento da t\u00E1boa",\r
+tbody:"Corpo da t\u00E1boa",\r
+tfoot:"Pe da t\u00E1boa",\r
+scope:"\u00C1mbito",\r
+rowgroup:"Grupo de filas",\r
+colgroup:"Grupo de columnas",\r
+col_limit:"Super\u00F3u o n\u00FAmero m\u00E1ximo de columnas: {$cols}.",\r
+row_limit:"Super\u00F3u o n\u00FAmero m\u00E1ximo de filas: {$rows}.",\r
+cell_limit:"Super\u00F3u o n\u00FAmero m\u00E1ximo de celdas: {$cells}.",\r
+missing_scope:"\u00BFEst\u00E1 seguro que desexa continuar sen especifica-lo \u00E1mbito do encabezado de celda? Sen \u00E9l podr\u00EDa ser dificultoso pra algunos usuarios entende-lo contido ou os datos mostrados na t\u00E1boa.",\r
+caption:"Subt\u00EDtulo da t\u00E1boa",\r
+frame:"Recadro",\r
+frame_none:"ning\u00FAn",\r
+frame_groups:"grupos",\r
+frame_rows:"filas",\r
+frame_cols:"columnas",\r
+frame_all:"todos",\r
+rules:"Regras",\r
+rules_void:"vac\u00EDo",\r
+rules_above:"encima",\r
+rules_below:"debaixo",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"box",\r
+rules_border:"borde"\r
+});
\ No newline at end of file
index b9385ae537d2594a379f55c91c0775a87d7bcc20..8a74e90dd4c86397c01847730b17ed32526f851f 100755 (executable)
@@ -3,8 +3,8 @@ general_tab:"\u05DB\u05DC\u05DC\u05D9",
 advanced_tab:"\u05DE\u05EA\u05E7\u05D3\u05DD",\r
 general_props:"\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05DB\u05DC\u05DC\u05D9\u05D5\u05EA",\r
 advanced_props:"\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05DE\u05EA\u05E7\u05D3\u05DE\u05D5\u05EA",\r
-rowtype:"Row in table part",\r
-title:"Insert/Modify table",\r
+rowtype:"\u05E1\u05D5\u05D2 \u05D4\u05E9\u05D5\u05E8\u05D4 \u05D1\u05D8\u05D1\u05DC\u05D4",\r
+title:"\u05D4\u05D5\u05E1\u05E4\u05EA/\u05E2\u05E8\u05D9\u05DB\u05EA \u05D8\u05D1\u05DC\u05D4",\r
 width:"\u05E8\u05D5\u05D7\u05D1",\r
 height:"\u05D2\u05D5\u05D1\u05D4",\r
 cols:"\u05E2\u05DE\u05D5\u05D3\u05D5\u05EA",\r
@@ -12,7 +12,7 @@ rows:"\u05E9\u05D5\u05E8\u05D5\u05EA",
 cellspacing:"Cellspacing",\r
 cellpadding:"Cellpadding",\r
 border:"\u05D2\u05D1\u05D5\u05DC",\r
-align:"\u05D9\u05E9\u05D5\u05E8",\r
+align:"\u05D9\u05E9\u05D5\u05E8 \u05D0\u05D5\u05E4\u05E7\u05D9",\r
 align_default:"Default",\r
 align_left:"\u05DC\u05E9\u05DE\u05D0\u05DC",\r
 align_right:"\u05DC\u05D9\u05DE\u05D9\u05DF",\r
@@ -20,14 +20,14 @@ align_middle:"\u05D0\u05DE\u05E6\u05E2",
 row_title:"\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05E9\u05D5\u05E8\u05D4 \u05D1\u05D8\u05D1\u05DC\u05D4",\r
 cell_title:"\u05EA\u05DB\u05D5\u05E0\u05D5\u05EA \u05EA\u05D0 \u05D1\u05D8\u05D1\u05DC\u05D4",\r
 cell_type:"\u05E1\u05D2\u05E0\u05D5\u05DF \u05D4\u05EA\u05D0",\r
-valign:"Vertical alignment",\r
+valign:"\u05D9\u05E9\u05D5\u05E8 \u05D0\u05E0\u05DB\u05D9",\r
 align_top:"\u05E2\u05DC\u05D9\u05D5\u05DF",\r
 align_bottom:"\u05EA\u05D7\u05EA\u05D9\u05EA",\r
 bordercolor:"\u05E6\u05D1\u05E2 \u05D4\u05D2\u05D1\u05D5\u05DC",\r
 bgcolor:"\u05E6\u05D1\u05E2 \u05D4\u05E8\u05E7\u05E2",\r
 merge_cells_title:"\u05D0\u05D7\u05D3 \u05EA\u05D0\u05D9\u05DD \u05D1\u05D8\u05D1\u05DC\u05D4",\r
 id:"Id",\r
-style:"Style",\r
+style:"\u05E2\u05D9\u05E6\u05D5\u05D1",\r
 langdir:"\u05DB\u05D9\u05D5\u05D5\u05DF \u05D4\u05E9\u05E4\u05D4",\r
 langcode:"\u05E7\u05D5\u05D3 \u05D4\u05E9\u05E4\u05D4",\r
 mime:"Target MIME type",\r
@@ -35,8 +35,8 @@ ltr:"\u05DE\u05E9\u05DE\u05D0\u05DC \u05DC\u05D9\u05DE\u05D9\u05DF",
 rtl:"\u05DE\u05D9\u05DE\u05D9\u05DF \u05DC\u05E9\u05DE\u05D0\u05DC",\r
 bgimage:"\u05EA\u05DE\u05D5\u05E0\u05EA \u05E8\u05E7\u05E2",\r
 summary:"\u05EA\u05DE\u05E6\u05D9\u05EA",\r
-td:"Data",\r
-th:"Header",\r
+td:"\u05EA\u05D0 \u05DE\u05D9\u05D3\u05E2",\r
+th:"\u05DB\u05D5\u05EA\u05E8\u05EA",\r
 cell_cell:"\u05E2\u05D3\u05DB\u05D5\u05DF \u05EA\u05D0 \u05E0\u05D5\u05DB\u05D7\u05D9",\r
 cell_row:"\u05E2\u05D3\u05DB\u05D5\u05DF \u05DB\u05DC \u05EA\u05D0\u05D9 \u05D4\u05E9\u05D5\u05E8\u05D4",\r
 cell_all:"\u05E2\u05D3\u05DB\u05D5\u05DF \u05DB\u05DC \u05EA\u05D0\u05D9 \u05D4\u05D8\u05D1\u05DC\u05D4",\r
@@ -44,9 +44,9 @@ row_row:"\u05E2\u05D3\u05DB\u05D5\u05DF \u05E9\u05D5\u05E8\u05D4 \u05E0\u05D5\u0
 row_odd:"\u05E2\u05D3\u05DB\u05D5\u05DF \u05E9\u05D5\u05E8\u05D5\u05EA \u05D0\u05D9-\u05D6\u05D5\u05D2\u05D9\u05D5\u05EA \u05D1\u05D8\u05D1\u05DC\u05D4",\r
 row_even:"\u05E2\u05D3\u05DB\u05D5\u05DF \u05E9\u05D5\u05E8\u05D5\u05EA \u05D6\u05D5\u05D2\u05D9\u05D5\u05EA \u05D1\u05D8\u05D1\u05DC\u05D4",\r
 row_all:"\u05E2\u05D3\u05DB\u05D5\u05DF\u05DB\u05DC \u05D4\u05E9\u05D5\u05E8\u05D5\u05EA \u05D1\u05D8\u05D1\u05DC\u05D4",\r
-thead:"Table Head",\r
-tbody:"Table Body",\r
-tfoot:"Table Foot",\r
+thead:"\u05E9\u05D5\u05E8\u05EA \u05DB\u05D5\u05EA\u05E8\u05EA",\r
+tbody:"\u05E9\u05D5\u05E8\u05D4 \u05E8\u05D2\u05D9\u05DC\u05D4",\r
+tfoot:"\u05E9\u05D5\u05E8\u05D4 \u05EA\u05D7\u05EA\u05D9\u05EA",\r
 scope:"Scope",\r
 rowgroup:"Row Group",\r
 colgroup:"Col Group",\r
@@ -56,7 +56,7 @@ cell_limit:"\u05D7\u05E8\u05D9\u05D2\u05D4 \u05DE\u05DE\u05E1\u05E4\u05E8 \u05D4
 missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
 caption:"\u05DB\u05D5\u05EA\u05E8\u05EA \u05D4\u05D8\u05D1\u05DC\u05D4",\r
 frame:"Frame",\r
-frame_none:"none",\r
+frame_none:"\u05DC\u05DC\u05D0",\r
 frame_groups:"\u05E7\u05D1\u05D5\u05E6\u05D5\u05EA",\r
 frame_rows:"\u05E9\u05D5\u05E8\u05D5\u05EA",\r
 frame_cols:"\u05E2\u05DE\u05D5\u05D3\u05D5\u05EA",\r
diff --git a/program/js/tiny_mce/plugins/table/langs/hi_dlg.js b/program/js/tiny_mce/plugins/table/langs/hi_dlg.js
new file mode 100644 (file)
index 0000000..f761356
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('hi.table_dlg',{\r
+general_tab:"General",\r
+advanced_tab:"Advanced",\r
+general_props:"General properties",\r
+advanced_props:"Advanced properties",\r
+rowtype:"Row in table part",\r
+title:"Insert/Modify table",\r
+width:"Width",\r
+height:"Height",\r
+cols:"Cols",\r
+rows:"Rows",\r
+cellspacing:"Cellspacing",\r
+cellpadding:"Cellpadding",\r
+border:"Border",\r
+align:"Alignment",\r
+align_default:"Default",\r
+align_left:"Left",\r
+align_right:"Right",\r
+align_middle:"Center",\r
+row_title:"Table row properties",\r
+cell_title:"Table cell properties",\r
+cell_type:"Cell type",\r
+valign:"Vertical alignment",\r
+align_top:"Top",\r
+align_bottom:"Bottom",\r
+bordercolor:"Border color",\r
+bgcolor:"Background color",\r
+merge_cells_title:"Merge table cells",\r
+id:"Id",\r
+style:"Style",\r
+langdir:"Language direction",\r
+langcode:"Language code",\r
+mime:"Target MIME type",\r
+ltr:"Left to right",\r
+rtl:"Right to left",\r
+bgimage:"Background image",\r
+summary:"Summary",\r
+td:"Data",\r
+th:"Header",\r
+cell_cell:"Update current cell",\r
+cell_row:"Update all cells in row",\r
+cell_all:"Update all cells in table",\r
+row_row:"Update current row",\r
+row_odd:"Update odd rows in table",\r
+row_even:"Update even rows in table",\r
+row_all:"Update all rows in table",\r
+thead:"Table Head",\r
+tbody:"Table Body",\r
+tfoot:"Table Foot",\r
+scope:"Scope",\r
+rowgroup:"Row Group",\r
+colgroup:"Col Group",\r
+col_limit:"You've exceeded the maximum number of columns of {$cols}.",\r
+row_limit:"You've exceeded the maximum number of rows of {$rows}.",\r
+cell_limit:"You've exceeded the maximum number of cells of {$cells}.",\r
+missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
+caption:"Table caption",\r
+frame:"Frame",\r
+frame_none:"none",\r
+frame_groups:"groups",\r
+frame_rows:"rows",\r
+frame_cols:"cols",\r
+frame_all:"all",\r
+rules:"Rules",\r
+rules_void:"void",\r
+rules_above:"above",\r
+rules_below:"below",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"box",\r
+rules_border:"border"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/hy_dlg.js b/program/js/tiny_mce/plugins/table/langs/hy_dlg.js
new file mode 100644 (file)
index 0000000..53ce35c
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('hy.table_dlg',{\r
+general_tab:"\u041E\u0431\u0449\u0435\u0435",\r
+advanced_tab:"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E",\r
+general_props:"\u041E\u0431\u0449\u0438\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430",\r
+advanced_props:"\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430",\r
+rowtype:"Row in table part",\r
+title:"\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 / \u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
+width:"\u0428\u0438\u0440\u0438\u043D\u0430",\r
+height:"\u0412\u044B\u0441\u043E\u0442\u0430",\r
+cols:"\u0421\u0442\u043E\u043B\u0431\u0446\u044B",\r
+rows:"\u0421\u0440\u043E\u043A\u0438",\r
+cellspacing:"\u0420\u0430\u0441\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u043C\u0435\u0436\u0434\u0443 \u044F\u0447\u0435\u0439\u043A\u0430\u043C\u0438",\r
+cellpadding:"\u041E\u0442\u0441\u0442\u0443\u043F\u044B \u0432 \u044F\u0447\u0435\u0439\u043A\u0430\u0445",\r
+border:"\u0413\u0440\u0430\u043D\u0438\u0446\u0430",\r
+align:"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435",\r
+align_default:"\u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E",\r
+align_left:"\u041F\u043E \u043B\u0435\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+align_right:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+align_middle:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443",\r
+row_title:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043E\u043A\u0435 \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
+cell_title:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u044F\u0447\u0435\u0439\u043A\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
+cell_type:"\u0422\u0438\u043F \u044F\u0447\u0435\u0439\u043A\u0438",\r
+valign:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u0432\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435",\r
+align_top:"\u041F\u043E \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+align_bottom:"\u041F\u043E \u043D\u0438\u0436\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+bordercolor:"\u0446\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B",\r
+bgcolor:"\u0446\u0432\u0435\u0442 \u0444\u043E\u043D\u0430",\r
+merge_cells_title:"\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u044F\u0447\u0435\u0439\u043A\u0438",\r
+id:"Id",\r
+style:"\u0421\u0442\u0438\u043B\u044C",\r
+langdir:"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u044F\u0437\u044B\u043A\u0430",\r
+langcode:"\u041A\u043E\u0434 \u044F\u0437\u044B\u043A\u0430",\r
+mime:"Target MIME-\u0442\u0438\u043F",\r
+ltr:"\u0421\u043B\u0435\u0432\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u043E",\r
+rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0435\u0432\u043E",\r
+bgimage:"\u0424\u043E\u043D\u043E\u0432\u043E\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435",\r
+summary:"\u041E\u0431\u0449\u0435\u0435",\r
+td:"\u0414\u0430\u043D\u043D\u044B\u0435",\r
+th:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A",\r
+cell_cell:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u044F\u0447\u0435\u0439\u043A\u0443",\r
+cell_row:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0432\u0441\u0435 \u044F\u0447\u0435\u0439\u043A\u0438 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435",\r
+cell_all:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0432\u0441\u0435 \u044F\u0447\u0435\u0439\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435",\r
+row_row:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443",\r
+row_odd:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u043D\u0435\u0447\u0435\u0442\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435",\r
+row_even:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0447\u0435\u0442\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435",\r
+row_all:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0432\u0441\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435",\r
+thead:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
+tbody:"\u0422\u0435\u043B\u043E \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
+tfoot:"\u041D\u0438\u0436\u043D\u044F\u044F \u0447\u0430\u0441\u0442\u0441\u0438\u043D\u0430",\r
+scope:"Scope",\r
+rowgroup:"Row Group",\r
+colgroup:"Col Group",\r
+col_limit:"You've exceeded the maximum number of columns of ($ cols)",\r
+row_limit:"You've exceeded the maximum number of rows of ($ rows)",\r
+cell_limit:"You've exceeded the maximum number of cells of ($ cells)",\r
+missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table",\r
+caption:"Table caption",\r
+frame:"\u0424\u0440\u0435\u0439\u043C",\r
+frame_none:"none",\r
+frame_groups:"groups",\r
+frame_rows:"rows",\r
+frame_cols:"cols",\r
+frame_all:"all",\r
+rules:"Rules",\r
+rules_void:"void",\r
+rules_above:"above",\r
+rules_below:"below",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"box",\r
+rules_border:"border"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/ia_dlg.js b/program/js/tiny_mce/plugins/table/langs/ia_dlg.js
new file mode 100644 (file)
index 0000000..236632e
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('ia.table_dlg',{\r
+general_tab:"\u57FA\u672C",\r
+advanced_tab:"\u9AD8\u7EA7",\r
+general_props:"\u57FA\u672C \u5C5E\u6027",\r
+advanced_props:"\u9AD8\u7EA7\u5C5E\u6027",\r
+rowtype:"\u884C\u6240\u5728\u7684\u8868\u683C\u4F4D\u7F6E",\r
+title:"\u63D2\u5165/\u7F16\u8F91 \u8868\u683C",\r
+width:"\u5BBD\u5EA6",\r
+height:"\u9AD8\u5EA6",\r
+cols:"\u5217\u6570",\r
+rows:"\u884C\u6570",\r
+cellspacing:"\u50A8\u5B58\u683C\u95F4\u8DDD",\r
+cellpadding:"\u50A8\u5B58\u683C\u5185\u8DDD",\r
+border:"\u8FB9\u6846",\r
+align:"\u5BF9\u9F50\u65B9\u5F0F",\r
+align_default:"\u9ED8\u8BA4",\r
+align_left:"\u5C45\u5DE6",\r
+align_right:"\u5C45\u53F3",\r
+align_middle:"\u5C45\u4E2D",\r
+row_title:"\u884C \u5C5E\u6027",\r
+cell_title:"\u50A8\u5B58\u683C \u5C5E\u6027",\r
+cell_type:"\u50A8\u5B58\u683C \u7C7B\u522B",\r
+valign:"\u5782\u76F4\u5BF9\u9F50\u65B9\u5F0F",\r
+align_top:"\u9876\u90E8",\r
+align_bottom:"\u5E95\u90E8",\r
+bordercolor:"\u8FB9\u6846\u989C\u8272",\r
+bgcolor:"\u80CC\u666F\u989C\u8272",\r
+merge_cells_title:"\u5408\u5E76\u50A8\u5B58\u683C",\r
+id:"Id",\r
+style:"\u6837\u5F0F",\r
+langdir:"\u8BED\u8A00\u4E66\u5199\u65B9\u5411",\r
+langcode:"\u8BED\u8A00\u7F16\u7801",\r
+mime:"\u76EE\u6807 MIME \u7C7B\u578B",\r
+ltr:"\u4ECE\u5DE6\u5230\u53F3",\r
+rtl:"\u4ECE\u53F3\u5230\u5DE6",\r
+bgimage:"\u80CC\u666F\u56FE\u7247",\r
+summary:"\u6458\u8981",\r
+td:"\u8868\u683C",\r
+th:"\u8868\u5934",\r
+cell_cell:"\u66F4\u65B0\u76EE\u524D\u7684\u50A8\u5B58\u683C",\r
+cell_row:"\u66F4\u65B0\u5F53\u524D\u884C\u7684\u50A8\u5B58\u683C",\r
+cell_all:"\u66F4\u65B0\u5168\u90E8\u50A8\u5B58\u683C",\r
+row_row:"\u66F4\u65B0\u6240\u5728\u884C",\r
+row_odd:"\u66F4\u65B0\u8868\u683C\u7684\u5947\u6570\u884C",\r
+row_even:"\u66F4\u65B0\u8868\u683C\u7684\u5076\u6570\u884C",\r
+row_all:"\u66F4\u65B0\u8868\u683C\u7684\u5168\u90E8\u884C",\r
+thead:"\u8868\u5934",\r
+tbody:"\u8868\u4F53",\r
+tfoot:"\u8868\u811A",\r
+scope:"\u8303\u56F4",\r
+rowgroup:"\u884C\u7EC4",\r
+colgroup:"\u5217\u7EC4",\r
+col_limit:"\u5DF2\u8D85\u8FC7\u9650\u5236\uFF0C\u6700\u591A\u4E3A {$cols} \u5217\u3002",\r
+row_limit:"\u5DF2\u8D85\u8FC7\u9650\u5236\uFF0C\u6700\u591A\u4E3A {$rows} \u884C\u3002",\r
+cell_limit:"\u5DF2\u8D85\u8FC7\u9650\u5236\uFF0C\u6700\u591A\u4E3A{$cells} \u50A8\u5B58\u683C\u3002",\r
+missing_scope:"\u60A8\u786E\u5B9A\u4E0D\u6307\u5B9A\u8868\u5934\u50A8\u5B58\u683C\u7684\u8303\u56F4\u5417\uFF1F\u5982\u679C\u4E0D\u6307\u5B9A\uFF0C\u90E8\u5206\u4F7F\u7528\u8005\u5C06\u5F88\u96BE\u67E5\u770B\u8868\u683C\u5185\u5BB9",\r
+caption:"\u8868\u683C\u6807\u9898",\r
+frame:"\u8FB9\u6846",\r
+frame_none:"\u65E0",\r
+frame_groups:"\u7EC4",\r
+frame_rows:"\u884C",\r
+frame_cols:"\u5217",\r
+frame_all:"\u5168\u90E8",\r
+rules:"\u6807\u5C3A",\r
+rules_void:"\u7A7A",\r
+rules_above:"\u4E4B\u4E0A",\r
+rules_below:"\u4E4B\u4E0B",\r
+rules_hsides:"\u6C34\u5E73\u5927\u5C0F",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"\u5782\u76F4\u5927\u5C0F",\r
+rules_box:"\u76D2",\r
+rules_border:"\u8FB9\u6846"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/id_dlg.js b/program/js/tiny_mce/plugins/table/langs/id_dlg.js
new file mode 100644 (file)
index 0000000..b1c4584
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('id.table_dlg',{\r
+general_tab:"Umum",\r
+advanced_tab:"Advanced",\r
+general_props:"Properti Umum",\r
+advanced_props:"Properti Advanced",\r
+rowtype:"Row in table part",\r
+title:"Sisipkan/Ubah Tabel",\r
+width:"Lebar",\r
+height:"Tinggi",\r
+cols:"Cols",\r
+rows:"Rows",\r
+cellspacing:"Cellspacing",\r
+cellpadding:"Cellpadding",\r
+border:"Border",\r
+align:"Alignment",\r
+align_default:"Default",\r
+align_left:"Kiri",\r
+align_right:"Kanan",\r
+align_middle:"Tengah",\r
+row_title:"Properti row tabel",\r
+cell_title:"Properti cell tabel",\r
+cell_type:"Cell type",\r
+valign:"Vertical alignment",\r
+align_top:"Atas",\r
+align_bottom:"Bawah",\r
+bordercolor:"Warna Border",\r
+bgcolor:"Warna Background",\r
+merge_cells_title:"Merge cell tabel",\r
+id:"Id",\r
+style:"Style",\r
+langdir:"Bahasa",\r
+langcode:"Kode Bahasa",\r
+mime:"Target MIME type",\r
+ltr:"Kiri ke kanan",\r
+rtl:"Kanan ke kiri",\r
+bgimage:"Gambar Background",\r
+summary:"Summary",\r
+td:"Data",\r
+th:"Header",\r
+cell_cell:"Update current cell",\r
+cell_row:"Update all cells in row",\r
+cell_all:"Update all cells in table",\r
+row_row:"Update current row",\r
+row_odd:"Update odd rows in table",\r
+row_even:"Update even rows in table",\r
+row_all:"Update all rows in table",\r
+thead:"Table Head",\r
+tbody:"Table Body",\r
+tfoot:"Table Foot",\r
+scope:"Scope",\r
+rowgroup:"Row Group",\r
+colgroup:"Col Group",\r
+col_limit:"Anda telah melebihi jumlah maksimum kolom {$cols}.",\r
+row_limit:"Anda telah melebihi jumlah maksimum row {$rows}.",\r
+cell_limit:"Anda telah melebihi jumlah maksimum cell {$cells}.",\r
+missing_scope:"Yakin ingin melanjutkan tanpa menetapkan cakupan sel header tabel ini. Tanpa itu, mungkin sulit bagi beberapa pengguna yang memiliki keterbatasan untuk memahami isi atau data yang ditampilkan dari tabel.",\r
+caption:"Table caption",\r
+frame:"Frame",\r
+frame_none:"none",\r
+frame_groups:"groups",\r
+frame_rows:"rows",\r
+frame_cols:"cols",\r
+frame_all:"all",\r
+rules:"Rules",\r
+rules_void:"void",\r
+rules_above:"above",\r
+rules_below:"below",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"box",\r
+rules_border:"border"\r
+});
\ No newline at end of file
index 4f6734070448982776393e5e2e19823d94c67781..65a9a0632e15b5596d3d64c769b3c95168705dec 100755 (executable)
@@ -62,13 +62,13 @@ frame_rows:"righe",
 frame_cols:"colonne",\r
 frame_all:"tutte",\r
 rules:"Regole",\r
-rules_void:"void",\r
-rules_above:"above",\r
-rules_below:"below",\r
-rules_hsides:"hsides",\r
+rules_void:"vuoto",\r
+rules_above:"sopra",\r
+rules_below:"sotto",\r
+rules_hsides:"lato orizz.",\r
 rules_lhs:"lhs",\r
 rules_rhs:"rhs",\r
-rules_vsides:"vsides",\r
+rules_vsides:"lato vert.",\r
 rules_box:"box",\r
-rules_border:"border"\r
+rules_border:"bordo"\r
 });
\ No newline at end of file
index ad85614efcc6f77a4f3d61773e82501e7c048199..53fbb94fc026c8e9b4e2cb7d2e142ab289ec10ca 100755 (executable)
@@ -26,8 +26,8 @@ align_bottom:"\u4E0B\u63C3\u3048",
 bordercolor:"\u67A0\u7DDA\u306E\u8272",\r
 bgcolor:"\u80CC\u666F\u8272",\r
 merge_cells_title:"\u30BB\u30EB\u306E\u7D50\u5408",\r
-id:"ID",\r
-style:"\u30B9\u30BF\u30A4\u30EB",\r
+id:"ID\u5C5E\u6027",\r
+style:"style\u5C5E\u6027",\r
 langdir:"\u6587\u7AE0\u306E\u65B9\u5411",\r
 langcode:"\u8A00\u8A9E\u30B3\u30FC\u30C9",\r
 mime:"\u30BF\u30FC\u30B2\u30C3\u30C8\u306EMIME\u30BF\u30A4\u30D7",\r
@@ -35,7 +35,7 @@ ltr:"\u5DE6\u304B\u3089\u53F3",
 rtl:"\u53F3\u304B\u3089\u5DE6",\r
 bgimage:"\u80CC\u666F\u753B\u50CF",\r
 summary:"\u30B5\u30DE\u30EA\u30FC",\r
-td:"\u65E5\u4ED8",\r
+td:"\u30C7\u30FC\u30BF",\r
 th:"\u30D8\u30C3\u30C0",\r
 cell_cell:"\u9078\u629E\u30BB\u30EB\u306E\u66F4\u65B0",\r
 cell_row:"\u884C\u5185\u306E\u30BB\u30EB\u306E\u66F4\u65B0",\r
diff --git a/program/js/tiny_mce/plugins/table/langs/ka_dlg.js b/program/js/tiny_mce/plugins/table/langs/ka_dlg.js
new file mode 100644 (file)
index 0000000..a4e85de
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('ka.table_dlg',{\r
+general_tab:"\u10E1\u10D0\u10D4\u10E0\u10D7\u10DD",\r
+advanced_tab:"\u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D8\u10D7",\r
+general_props:"\u10E1\u10D0\u10D4\u10E0\u10D7\u10DD \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+advanced_props:"\u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D8\u10D7\u10D8 \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+rowtype:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8\u10E1 \u10E0\u10D8\u10DE\u10D8",\r
+title:"\u10EA\u10EE\u10E0\u10D8\u10DA\u10D8\u10E1 \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+width:"\u10E1\u10D8\u10D2\u10D0\u10DC\u10D4",\r
+height:"\u10E1\u10D8\u10DB\u10D0\u10E6\u10DA\u10D4",\r
+cols:"\u10E1\u10D5\u10D4\u10E2\u10D4\u10D1\u10D8",\r
+rows:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D4\u10D1\u10D8",\r
+cellspacing:"\u10E3\u10EF\u10E0\u10D4\u10D1\u10E1 \u10E8\u10DD\u10E0\u10D8\u10E1 \u10D3\u10D0\u10E8\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+cellpadding:"\u10E3\u10EF\u10E0\u10D4\u10D1\u10E1 \u10E8\u10DD\u10E0\u10D8\u10E1 \u10D3\u10D0\u10E8\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+border:"\u10E1\u10D0\u10D6\u10E6\u10D5\u10D0\u10E0\u10D8",\r
+align:"\u10D2\u10D0\u10E1\u10EC\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+align_default:"\u10E1\u10D0\u10EC\u10D8\u10E1\u10D0\u10D3",\r
+align_left:"\u10DB\u10D0\u10E0\u10EA\u10EE\u10D4\u10DC\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+align_right:"\u10DB\u10D0\u10E0\u10EF\u10D5\u10D4\u10DC\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+align_middle:"\u10EA\u10D4\u10DC\u10E2\u10E0\u10D6\u10D4",\r
+row_title:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8\u10E1 \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+cell_title:"\u10E3\u10EF\u10E0\u10D8\u10E1 \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+cell_type:"\u10E2\u10D8\u10DE\u10D8",\r
+valign:"\u10D5\u10D4\u10E0\u10E2\u10D8\u10D9\u10D0\u10DA\u10E3\u10E0\u10D8 \u10D2\u10D0\u10E1\u10EC\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+align_top:"\u10D6\u10D4\u10D3\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+align_bottom:"\u10E5\u10D5\u10D4\u10D3\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+bordercolor:"\u10E1\u10D0\u10D6\u10E6\u10D5\u10E0\u10D4\u10D1\u10D8\u10E1 \u10E4\u10D4\u10E0\u10D8",\r
+bgcolor:"\u10E8\u10D4\u10D5\u10E1\u10D4\u10D1\u10D8\u10E1 \u10E4\u10D4\u10E0\u10D8",\r
+merge_cells_title:"\u10E3\u10EF\u10E0\u10D4\u10D1\u10D8\u10E1 \u10D2\u10D0\u10D4\u10E0\u10D7\u10D8\u10D0\u10DC\u10D4\u10D1\u10D0",\r
+id:"\u10E1\u10D0\u10EE\u10D4\u10DA\u10D8",\r
+style:"\u10E1\u10E2\u10D8\u10DA\u10D8",\r
+langdir:"\u10E2\u10D4\u10E5\u10E1\u10E2\u10D8\u10E1 \u10DB\u10D8\u10DB\u10D0\u10E0\u10D7\u10E3\u10DA\u10D4\u10D1\u10D0",\r
+langcode:"\u10D4\u10DC\u10D8\u10E1 \u10D9\u10DD\u10D3\u10D8",\r
+mime:"MIME \u10DB\u10D8\u10D6\u10DC\u10D8\u10E1 \u10E2\u10D8\u10DE\u10D8",\r
+ltr:"\u10DB\u10D0\u10E0\u10EA\u10EE\u10DC\u10D8\u10D3\u10D0\u10DC \u10DB\u10D0\u10E0\u10EF\u10D5\u10DC\u10D8\u10D5",\r
+rtl:"\u10DB\u10D0\u10E0\u10D5\u10DC\u10D8\u10D3\u10D0\u10DC \u10DB\u10D0\u10E0\u10EA\u10EE\u10DC\u10D8\u10D5",\r
+bgimage:"\u10E4\u10DD\u10DC\u10E3\u10E0\u10D8 \u10D2\u10D0\u10DB\u10DD\u10E1\u10D0\u10EE\u10E3\u10DA\u10D1\u10D0",\r
+summary:"\u10E1\u10D0\u10D4\u10E0\u10D7\u10DD",\r
+td:"\u10DB\u10DD\u10DC\u10D0\u10EA\u10D4\u10DB\u10D4\u10D1\u10D8",\r
+th:"\u10E1\u10D0\u10D7\u10D0\u10E3\u10E0\u10D8",\r
+cell_cell:"\u10DB\u10DD\u10EA\u10D4\u10DB\u10E3\u10DA\u10D8 \u10E3\u10EF\u10E0\u10D8\u10E1 \u10D2\u10D0\u10DC\u10D0\u10EE\u10DA\u10D4\u10D1\u10D0",\r
+cell_row:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10E8\u10D8 \u10E7\u10D5\u10D4\u10DA\u10D0 \u10E3\u10EF\u10E0\u10E1 \u10D2\u10D0\u10DC\u10D0\u10EE\u10DA\u10D4\u10D1\u10D0",\r
+cell_all:"\u10EA\u10EE\u10E0\u10D8\u10DA\u10E1\u10D8 \u10E7\u10D5\u10D4\u10DA\u10D0 \u10E3\u10EF\u10E0\u10D8\u10E1 \u10D2\u10D0\u10DC\u10D0\u10EE\u10DA\u10D4\u10D1\u10D0",\r
+row_row:"\u10DB\u10DD\u10EA\u10D4\u10DB\u10E3\u10DA\u10D8 \u10E1\u10E2\u10D8\u10E0\u10E5\u10DD\u10DC\u10D8\u10E1 \u10D2\u10D0\u10DC\u10D0\u10EE\u10DA\u10D4\u10D1\u10D0",\r
+row_odd:"\u10EA\u10EE\u10E0\u10E3\u10DA\u10E1\u10D8 \u10D9\u10D4\u10DC\u10E2\u10D8 \u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D4\u10D1\u10D8\u10E1 \u10D2\u10D0\u10DC\u10D0\u10EE\u10DA\u10D4\u10D1\u10D0",\r
+row_even:"\u10EA\u10EE\u10E0\u10D8\u10DA\u10E8\u10D8 \u10DA\u10E3\u10EC\u10D8\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D4\u10D1\u10D8\u10E1 \u10D2\u10D0\u10DC\u10D0\u10EE\u10DA\u10D4\u10D1\u10D0",\r
+row_all:"\u10EA\u10EE\u10E0\u10D8\u10DA\u10E1\u10D8 \u10E7\u10D5\u10D4\u10DA\u10D0 \u10E3\u10EF\u10E0\u10D8\u10E1 \u10D2\u10D0\u10DC\u10D0\u10EE\u10DA\u10D4\u10D1\u10D0",\r
+thead:"\u10E1\u10D0\u10D7\u10D0\u10E3\u10E0\u10D8",\r
+tbody:"\u10E1\u10EE\u10D4\u10E3\u10DA\u10D8",\r
+tfoot:"\u10D3\u10D0\u10E1\u10E0\u10E3\u10DA\u10D4\u10D1\u10D0",\r
+scope:"\u10DB\u10D8\u10D3\u10D0\u10DB\u10DD",\r
+rowgroup:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D4\u10D1\u10D8\u10E1 \u10EF\u10D2\u10E3\u10E4\u10D8",\r
+colgroup:"\u10E1\u10D5\u10D4\u10E2\u10D4\u10D1\u10D8\u10E1 \u10EF\u10D2\u10E3\u10E4\u10D8",\r
+col_limit:"\u10DB\u10D8\u10E6\u10EC\u10D4\u10E3\u10DA\u10D8\u10D0 \u10DB\u10D0\u10E5\u10E1\u10D8\u10DB\u10D0\u10DA\u10E3\u10E0\u10D8 \u10D6\u10E6\u10D5\u10D0\u10E0\u10D8, $ \u10E1\u10D5\u10D4\u10E2\u10D8.",\r
+row_limit:"\u10DB\u10D8\u10E6\u10EC\u10D4\u10E3\u10DA\u10D8\u10D0 \u10DB\u10D0\u10E5\u10E1\u10D8\u10DB\u10D0\u10DA\u10E3\u10E0\u10D8 \u10D6\u10E6\u10D5\u10D0\u10E0\u10D8, $ \u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8.",\r
+cell_limit:"\u10DB\u10D8\u10E6\u10EC\u10D4\u10E3\u10DA\u10D8\u10D0 \u10DB\u10D0\u10E5\u10E1\u10D8\u10DB\u10D0\u10DA\u10E3\u10E0\u10D8 \u10D6\u10E6\u10D5\u10D0\u10E0\u10D8, $ \u10E3\u10EF\u10E0\u10D0.",\r
+missing_scope:"\u10D7\u10E3 \u10E1\u10D0\u10D7\u10D0\u10E3\u10E0\u10D8 \u10D0\u10E0 \u10D8\u10E5\u10DC\u10D4\u10D1\u10D0 \u10DB\u10D8\u10D7\u10D8\u10D7\u10D4\u10D1\u10E3\u10DA\u10D8, \u10E8\u10D4\u10D8\u10EB\u10DA\u10D4\u10D1\u10D0 \u10E7\u10D5\u10D4\u10DA\u10D0\u10DB \u10D5\u10D4\u10E0 \u10DC\u10D0\u10EE\u10DD\u10E1 \u10D8\u10DC\u10E4\u10DD\u10E0\u10DB\u10D0\u10EA\u10D8\u10D0.",\r
+caption:"\u10E1\u10D0\u10D7\u10D0\u10E3\u10E0\u10D8",\r
+frame:"\u10D9\u10D0\u10D3\u10E0\u10D8",\r
+frame_none:"none",\r
+frame_groups:"\u10EF\u10D2\u10E3\u10E4\u10D4\u10D1\u10D8",\r
+frame_rows:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D4\u10D1\u10D8",\r
+frame_cols:"\u10E1\u10D5\u10D4\u10E2\u10D4\u10D1\u10D8",\r
+frame_all:"\u10E7\u10D5\u10D4\u10DA\u10D0",\r
+rules:"wesebi",\r
+rules_void:"void",\r
+rules_above:"above",\r
+rules_below:"below",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"\u10D9\u10DD\u10DA\u10DD\u10E4\u10D8",\r
+rules_border:"\u10E1\u10D0\u10D6\u10E6\u10D5\u10D0\u10E0\u10D8"\r
+});
\ No newline at end of file
index addcc30079915ac3e4beb46b68148287276c8064..f2876544fe20f692f65f080785831f0186b9228e 100755 (executable)
@@ -9,8 +9,8 @@ width:"Ilgis",
 height:"Auk\u0161tis",\r
 cols:"Stulpeliai",\r
 rows:"Eilut\u0117s",\r
-cellspacing:"Tarpas tarp l\u0105steli\u0173",\r
-cellpadding:"Tarpas l\u0105stel\u0117s viduje",\r
+cellspacing:"Tarpas tarp langeli\u0173",\r
+cellpadding:"Tarpas langelio viduje",\r
 border:"R\u0117melis",\r
 align:"Lygiavimas",\r
 align_default:"Standartinis",\r
@@ -18,44 +18,44 @@ align_left:"Lygiuoti kair\u0117je",
 align_right:"Lygiuoti de\u0161in\u0117je",\r
 align_middle:"Centruoti",\r
 row_title:"Lentel\u0117s eilut\u0117s nustatymai",\r
-cell_title:"Lentel\u0117s l\u0105stel\u0117s nustatymai",\r
-cell_type:"L\u0105stel\u0117s tipas",\r
+cell_title:"Lentel\u0117s langeli\u0173 nustatymai",\r
+cell_type:"Langelio tipas",\r
 valign:"Vertikalus lygiavimas",\r
 align_top:"Vir\u0161uje",\r
 align_bottom:"Apa\u010Dioje",\r
 bordercolor:"R\u0117melio spalva",\r
 bgcolor:"Fono spalva",\r
-merge_cells_title:"Sulieti lentel\u0117s l\u0105steles",\r
+merge_cells_title:"Sujungti lentel\u0117s langelius",\r
 id:"Id",\r
 style:"Stilius",\r
 langdir:"Kalbos kryptis",\r
 langcode:"Kalbos kodas",\r
-mime:"Taikinio MIME tipas",\r
+mime:"Paskirties MIME tipas",\r
 ltr:"I\u0161 kair\u0117s \u012F de\u0161in\u0119",\r
 rtl:"I\u0161 de\u0161in\u0117s \u012F kair\u0119",\r
 bgimage:"Fono paveiksl\u0117lis",\r
 summary:"Apibendrinimas",\r
 td:"Duomenys",\r
 th:"Antra\u0161t\u0117",\r
-cell_cell:"Atnaujinti esam\u0105 l\u0105stel\u0119",\r
-cell_row:"Atnaujinti visas eilut\u0117s l\u0105steles",\r
-cell_all:"Atnaujinti visas lentel\u0117s l\u0105steles",\r
-row_row:"Atnaujinti esam\u0105 eilut\u0119",\r
+cell_cell:"Atnaujinti dabartin\u012F langel\u012F",\r
+cell_row:"Atnaujinti visus eilut\u0117s langelius",\r
+cell_all:"Atnaujinti visus lentel\u0117s langelius",\r
+row_row:"Atnaujinti dabartin\u0119 eilut\u0119",\r
 row_odd:"Atnaujinti nelygines lentel\u0117s eilutes",\r
 row_even:"Atnaujinti lygines lentel\u0117s eilutes",\r
 row_all:"Atnaujinti visas lentel\u0117s eilutes",\r
-thead:"Lentel\u0117s Vir\u0161us",\r
-tbody:"Lentel\u0117s Vidus",\r
-tfoot:"Lentel\u0117s Apa\u010Dia",\r
+thead:"Lentel\u0117s vir\u0161us",\r
+tbody:"Lentel\u0117s vidus",\r
+tfoot:"Lentel\u0117s apa\u010Dia",\r
 scope:"Galiojimo sritis",\r
 rowgroup:"Eilu\u010Di\u0173 grup\u0117",\r
 colgroup:"Stulpeli\u0173 grup\u0117",\r
-col_limit:"Vir\u0161ijote did\u017Eiausia stulpeli\u0173 kiek\u012F i\u0161 {$cols}.",\r
-row_limit:"Vir\u0161ijote did\u017Eiausia eilu\u010Di\u0173 kiek\u012F i\u0161 {$rows}.",\r
-cell_limit:"Vir\u0161ijote did\u017Eiausia l\u0105steli\u0173 kiek\u012F i\u0161 {$cells}.",\r
-missing_scope:"Ar norite t\u0119sti nenurod\u0119 galiojimo srities \u0161iai lentel\u0117s vir\u0161utinei l\u0105stelei. Be nurodymo, gali b\u016Bti sunku kai kuriems vartotojams su negalia lentel\u0117je atvaizduojam\u0173 duomen\u0173 turin\u012F.",\r
+col_limit:"Vir\u0161ijote did\u017Eiausi\u0105 ({$cols}) stulpeli\u0173 kiek\u012F.",\r
+row_limit:"Vir\u0161ijote did\u017Eiausi\u0105 ({$rows}) eilu\u010Di\u0173 kiek\u012F.",\r
+cell_limit:"Vir\u0161ijote did\u017Eiausi\u0105 ({$cells}) langeli\u0173 kiek\u012F.",\r
+missing_scope:"Ar norite t\u0119sti nenurod\u0119 galiojimo srities \u0161iam lentel\u0117s vir\u0161utiniam langeliui. Be nurodymo, kai kuriems naudotojams su negalia gali b\u016Bti sunku suprasti lentel\u0117je atvaizduojam\u0173 duomen\u0173 turin\u012F.",\r
 caption:"Lentel\u0117s antra\u0161t\u0117",\r
-frame:"Freimas",\r
+frame:"R\u0117melis",\r
 frame_none:"joks",\r
 frame_groups:"grup\u0117s",\r
 frame_rows:"eilut\u0117s",\r
index 3d8f72cf6d2caeda20cac7db48e6a4d9751d0b1a..0f72b17bdfb2fc056b27dcb4d01c85be7a67c239 100755 (executable)
@@ -43,17 +43,17 @@ cell_all:"Alle cellen in tabel bijwerken",
 row_row:"Huidige rij bijwerken",\r
 row_odd:"Oneven rijen bijwerken",\r
 row_even:"Even rijen bijwerken",\r
-row_all:"Alle rijen bijweken",\r
+row_all:"Alle rijen bijwerken",\r
 thead:"Tabelkop",\r
 tbody:"Tabellichaam",\r
 tfoot:"Tabelvoet",\r
 scope:"Bereik",\r
 rowgroup:"Rijgroep",\r
 colgroup:"Kolomgroep",\r
-col_limit:"Je hebt het maximale aantal kolommen van {$cols} overschreden.",\r
-row_limit:"Je hebt het maximale aantal rijen van {$rows} overschreden.",\r
-cell_limit:"Je hebt het maximale aantal cellen van {$cells} overschreden.",\r
-missing_scope:"Weet je zeker dat je door wilt gaan met het toewijzen van een kop zonder een bereik op te geven? Mensen met een visuele handicap kunnen hierdoor waarschijnlijk slecht bij de gegevens.",\r
+col_limit:"U heeft het maximale aantal kolommen van {$cols} overschreden.",\r
+row_limit:"U heeft hebt het maximale aantal rijen van {$rows} overschreden.",\r
+cell_limit:"U heeft het maximale aantal cellen van {$cells} overschreden.",\r
+missing_scope:"Weet u zeker dat u door wilt gaan met het toewijzen van een kop zonder een bereik op te geven? Mensen met een visuele handicap kunnen hierdoor waarschijnlijk slecht bij de gegevens.",\r
 caption:"Tabelbeschrijving",\r
 frame:"Frame",\r
 frame_none:"Geen",\r
@@ -65,10 +65,10 @@ rules:"Hulplijnen",
 rules_void:"Geen",\r
 rules_above:"Boven",\r
 rules_below:"Onder",\r
-rules_hsides:"Horizontale zijdes",\r
+rules_hsides:"Horizontale zijden",\r
 rules_lhs:"Linkerzijkant",\r
 rules_rhs:"Rechterzijkant",\r
-rules_vsides:"Verticale zijdes",\r
+rules_vsides:"Verticale zijden",\r
 rules_box:"Box",\r
 rules_border:"Rand"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/no_dlg.js b/program/js/tiny_mce/plugins/table/langs/no_dlg.js
new file mode 100644 (file)
index 0000000..66b1880
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('no.table_dlg',{\r
+general_tab:"Generelt",\r
+advanced_tab:"Avansert",\r
+general_props:"Generelt",\r
+advanced_props:"Generelle egenskaper",\r
+rowtype:"Rad i tabell",\r
+title:"Sett inn / rediger tabell",\r
+width:"Bredde",\r
+height:"H\u00F8yde",\r
+cols:"Kolonner",\r
+rows:"Rader",\r
+cellspacing:"Celleavstand",\r
+cellpadding:"Cellefylling",\r
+border:"Ramme",\r
+align:"Justering",\r
+align_default:"Standard",\r
+align_left:"Venstre",\r
+align_right:"H\u00F8yre",\r
+align_middle:"Midtstilt",\r
+row_title:"Radegenskaper",\r
+cell_title:"Celleegenskaper",\r
+cell_type:"Celletype",\r
+valign:"Vertikal justering",\r
+align_top:"Topp",\r
+align_bottom:"Bunn",\r
+bordercolor:"Rammefarge",\r
+bgcolor:"Bakgrunn",\r
+merge_cells_title:"Sl\u00E5 sammen celler",\r
+id:"Id",\r
+style:"Stil",\r
+langdir:"Skriftretning",\r
+langcode:"Spr\u00E5kkode",\r
+mime:"M\u00E5let sin MIME-type",\r
+ltr:"Venstre mot h\u00F8yre",\r
+rtl:"H\u00F8yre mot venstre",\r
+bgimage:"Bakgrunnsbilde",\r
+summary:"Sammendrag",\r
+td:"Data",\r
+th:"Overskrift",\r
+cell_cell:"Oppdater aktuell celle",\r
+cell_row:"Oppdater alle celler i raden",\r
+cell_all:"Oppdater alle celler i tabellen",\r
+row_row:"Oppdater aktuell rad",\r
+row_odd:"Oppdater oddetallrader",\r
+row_even:"Oppdater partallrader",\r
+row_all:"Oppdater alle rader",\r
+thead:"Tabellhode",\r
+tbody:"Tabellkropp",\r
+tfoot:"Tabellfot",\r
+scope:"Omr\u00E5de",\r
+rowgroup:"Radgruppe",\r
+colgroup:"Kolonnegruppe",\r
+col_limit:"Du har flere enn maksimalt tillatt kolonner p\u00E5 {$cols}.",\r
+row_limit:"Du har flere enn maksimalt tillatt rader p\u00E5 {$rows}.",\r
+cell_limit:"Du har flere enn maksimalt tillatt celler p\u00E5 {$cells}.",\r
+missing_scope:"Er du sikker p\u00E5 at du vil fortsette uten \u00E5 angi et omr\u00E5de for denne overskrifscella? Uten dette kan det bli vanskelig for enkelte funksjonshemmede brukere \u00E5 forst\u00E5 innholdet eller dataene som blir presenterte i tabellen.",\r
+caption:"Tabelloverskrift",\r
+frame:"Ramme",\r
+frame_none:"ingen",\r
+frame_groups:"grupper",\r
+frame_rows:"rader",\r
+frame_cols:"kolonner",\r
+frame_all:"alle",\r
+rules:"Streker",\r
+rules_void:"ingen",\r
+rules_above:"over",\r
+rules_below:"under",\r
+rules_hsides:"hside",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vside",\r
+rules_box:"boks",\r
+rules_border:"ramme"\r
+});
\ No newline at end of file
index 6a5f4ade78da37ba290435bac370329620d75563..5527cb53623bafe7598cd5d0b0a343a9cc22158c 100755 (executable)
@@ -28,9 +28,9 @@ bgcolor:"Kolor t\u0142a",
 merge_cells_title:"Po\u0142\u0105cz kom\u00F3rki",\r
 id:"Id",\r
 style:"Styl",\r
-langdir:"Language direction",\r
-langcode:"Language code",\r
-mime:"Target MIME type",\r
+langdir:"Kierunek czytania tekstu",\r
+langcode:"Oznaczenie kodowe j\u0119zyka",\r
+mime:"Docelowy typ MIME",\r
 ltr:"Kierunek z lewej do prawej",\r
 rtl:"Kierunek z prawej do lewej",\r
 bgimage:"Obrazek t\u0142a",\r
@@ -50,16 +50,16 @@ tfoot:"Stopka tabeli",
 scope:"Zakres",\r
 rowgroup:"Grupa wierszy",\r
 colgroup:"Grupa kolumn",\r
-col_limit:"Przekroczy\u0142e\u015B maksymaln\u0105 liczb\u0119 kolumn of {$cols}.",\r
-row_limit:"Przekroczy\u0142e\u015B maksymaln\u0105 liczb\u0119 kolumn {$rows}.",\r
-cell_limit:"Przekroczy\u0142e\u015B maksymaln\u0105 liczb\u0119 cells of {$cells}.",\r
-missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
+col_limit:"Przekroczy\u0142e\u015B maksymaln\u0105 liczb\u0119 kolumn kt\u00F3ra wynosi {$cols}.",\r
+row_limit:"Przekroczy\u0142e\u015B maksymaln\u0105 liczb\u0119 wierszy kt\u00F3ra wynosi {$rows}.",\r
+cell_limit:"Przekroczy\u0142e\u015B maksymaln\u0105 liczb\u0119 kom\u00F3rek kt\u00F3ra wynosi {$cells}.",\r
+missing_scope:"Jeste\u015B pewny \u017Ce chcesz kontynuowa\u0107 bez definiowania zasi\u0119gu dla kom\u00F3rki tabeli. Bez niej, mo\u017Ce by\u0107 trudne dla niekt\u00F3rych u\u017Cytkownik\u00F3w zrozuminie zawarto\u015Bci albo danych wy\u015Bwietlanych poza tabel\u0105.",\r
 caption:"Nag\u0142\u00F3wek tabeli",\r
 frame:"Ramka",\r
 frame_none:"brak",\r
-frame_groups:"groups",\r
-frame_rows:"rows",\r
-frame_cols:"cols",\r
+frame_groups:"grupy",\r
+frame_rows:"wiersze",\r
+frame_cols:"kolumny",\r
 frame_all:"wszystkie",\r
 rules:"Prowadnice",\r
 rules_void:"void",\r
diff --git a/program/js/tiny_mce/plugins/table/langs/ps_dlg.js b/program/js/tiny_mce/plugins/table/langs/ps_dlg.js
new file mode 100644 (file)
index 0000000..f2c1803
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('ps.table_dlg',{\r
+general_tab:"General",\r
+advanced_tab:"Advanced",\r
+general_props:"General properties",\r
+advanced_props:"Advanced properties",\r
+rowtype:"Row in table part",\r
+title:"Insert/Modify table",\r
+width:"Width",\r
+height:"Height",\r
+cols:"Cols",\r
+rows:"Rows",\r
+cellspacing:"Cellspacing",\r
+cellpadding:"Cellpadding",\r
+border:"Border",\r
+align:"Alignment",\r
+align_default:"Default",\r
+align_left:"Left",\r
+align_right:"Right",\r
+align_middle:"Center",\r
+row_title:"Table row properties",\r
+cell_title:"Table cell properties",\r
+cell_type:"Cell type",\r
+valign:"Vertical alignment",\r
+align_top:"Top",\r
+align_bottom:"Bottom",\r
+bordercolor:"Border color",\r
+bgcolor:"Background color",\r
+merge_cells_title:"Merge table cells",\r
+id:"Id",\r
+style:"Style",\r
+langdir:"Language direction",\r
+langcode:"Language code",\r
+mime:"Target MIME type",\r
+ltr:"Left to right",\r
+rtl:"Right to left",\r
+bgimage:"Background image",\r
+summary:"Summary",\r
+td:"Data",\r
+th:"Header",\r
+cell_cell:"Update current cell",\r
+cell_row:"Update all cells in row",\r
+cell_all:"Update all cells in table",\r
+row_row:"Update current row",\r
+row_odd:"Update odd rows in table",\r
+row_even:"Update even rows in table",\r
+row_all:"Update all rows in table",\r
+thead:"Table Head",\r
+tbody:"Table Body",\r
+tfoot:"Table Foot",\r
+scope:"Scope",\r
+rowgroup:"Row Group",\r
+colgroup:"Col Group",\r
+col_limit:"You've exceeded the maximum number of columns of {$cols}.",\r
+row_limit:"You've exceeded the maximum number of rows of {$rows}.",\r
+cell_limit:"You've exceeded the maximum number of cells of {$cells}.",\r
+missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
+caption:"Table caption",\r
+frame:"Frame",\r
+frame_none:"none",\r
+frame_groups:"groups",\r
+frame_rows:"rows",\r
+frame_cols:"cols",\r
+frame_all:"all",\r
+rules:"Rules",\r
+rules_void:"void",\r
+rules_above:"above",\r
+rules_below:"below",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"box",\r
+rules_border:"border"\r
+});
\ No newline at end of file
index 4c83f255e978fef9a4146cb082a6571486a1776a..4c1196326a9e0d6193989713045ec20e76a0dc96 100755 (executable)
@@ -7,32 +7,32 @@ rowtype:"Linha na parte da tabela",
 title:"Inserir/modificar tabela",\r
 width:"Largura",\r
 height:"Altura",\r
-cols:"Cols",\r
-rows:"Rows",\r
-cellspacing:"Cellspacing",\r
-cellpadding:"Cellpadding",\r
-border:"Borda",\r
-align:"Alinhamento",\r
+cols:"Colunas",\r
+rows:"Linhas",\r
+cellspacing:"Espa\u00E7amento da C\u00E9lula",\r
+cellpadding:"Enchimento da C\u00E9lula",\r
+border:"Limites",\r
+align:"Alinha.",\r
 align_default:"Padr\u00E3o",\r
 align_left:"Esquerda",\r
 align_right:"Direita",\r
 align_middle:"Centro",\r
 row_title:"Propriedades de linhas",\r
 cell_title:"Propriedades de c\u00E9lulas",\r
-cell_type:"Tipo de c\u00E9lula",\r
-valign:"Alinhamento vertical",\r
+cell_type:"Tipo c\u00E9l.",\r
+valign:"Alinha. vert.",\r
 align_top:"Topo",\r
-align_bottom:"Embaixo",\r
-bordercolor:"Cor da borda",\r
+align_bottom:"Abaixo",\r
+bordercolor:"Cor dos limites",\r
 bgcolor:"Cor de fundo",\r
 merge_cells_title:"Unir c\u00E9lulas",\r
 id:"Id",\r
 style:"Estilo",\r
 langdir:"Dire\u00E7\u00E3o do texto",\r
-langcode:"C\u00F3digo da linguagem",\r
+langcode:"C\u00F3digo do idioma",\r
 mime:"MIME alvo",\r
-ltr:"Esquerda para direita",\r
-rtl:"Direita para esquerda",\r
+ltr:"Da esquerda para a direita",\r
+rtl:"Da direita para a esquerda",\r
 bgimage:"Imagem de fundo",\r
 summary:"Sum\u00E1rio",\r
 td:"Dados",\r
@@ -50,9 +50,9 @@ tfoot:"Rodap\u00E9 da tabela",
 scope:"Alcance",\r
 rowgroup:"Grupo linhas",\r
 colgroup:"Grupo colunas",\r
-col_limit:"Voc\u00EA excedeu o n\u00FAmero m\u00E1ximo de colunas de {$cols}.",\r
-row_limit:"Voc\u00EA excedeu o n\u00FAmero m\u00E1ximo de linhas de {$rows}.",\r
-cell_limit:"Voc\u00EA excedeu o n\u00FAmero m\u00E1ximo de c\u00E9lulas de {$cells}.",\r
+col_limit:"Excedeu o n\u00FAmero m\u00E1ximo de colunas de {$cols}.",\r
+row_limit:"Excedeu o n\u00FAmero m\u00E1ximo de linhas de {$rows}.",\r
+cell_limit:"Excedeu o n\u00FAmero m\u00E1ximo de c\u00E9lulas de {$cells}.",\r
 missing_scope:"Tem certeza de que quer continuar sem especificar um escopo para esta c\u00E9lula? (Isso poder\u00E1 causar dificuldades a usu\u00E1rios deficientes)",\r
 caption:"T\u00EDtulo da tabela",\r
 frame:"Frame",\r
@@ -62,13 +62,13 @@ frame_rows:"Linhas",
 frame_cols:"colunas",\r
 frame_all:"Todos",\r
 rules:"Regras",\r
-rules_void:"Void",\r
-rules_above:"Acima",\r
-rules_below:"Abaixo",\r
+rules_void:"void",\r
+rules_above:"acima",\r
+rules_below:"abaixo",\r
 rules_hsides:"Hsides",\r
 rules_lhs:"Lhs",\r
 rules_rhs:"Rhs",\r
 rules_vsides:"Vsides",\r
 rules_box:"Box",\r
-rules_border:"Borda"\r
+rules_border:"Limites"\r
 });
\ No newline at end of file
index e2aee5e90d7f5fea40d1b6bb44b28760fc391fba..0b71a6cac1879e49003fca98b3a89a3aaba1012a 100755 (executable)
@@ -51,8 +51,8 @@ scope:"Scop",
 rowgroup:"Grupeaz\u0103 r\u00E2nduri",\r
 colgroup:"Grupeaz\u0103 celule",\r
 col_limit:"A\u0163i dep\u0103\u015Fit num\u0103rul maxim de coloane: {$cols}.",\r
-row_limit:"A\u0163i dep\u0103\u015Fit num\u0103rul maxim de r\u00E2nduri {$rows}.",\r
-cell_limit:"A\u0163i dep\u0103\u015Fit num\u0103rul maxim de celule {$cells}.",\r
+row_limit:"A\u0163i dep\u0103\u015Fit num\u0103rul maxim de r\u00E2nduri: {$rows}.",\r
+cell_limit:"A\u0163i dep\u0103\u015Fit num\u0103rul maxim de celule: {$cells}.",\r
 missing_scope:"Sigur dori\u0163i s\u0103 l\u0103sa\u0163i scopul necompletat? ",\r
 caption:"Titlu tabel",\r
 frame:"Frame",\r
index f064883321cd9420d39299465252008887ee61ad..1e7be3d80fb7769132e1a25f7f5c51963100b036 100755 (executable)
@@ -1,74 +1,74 @@
 tinyMCE.addI18n('ru.table_dlg',{\r
-general_tab:"\u041E\u0431\u0449\u0438\u0435",\r
-advanced_tab:"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435",\r
-general_props:"\u041E\u0431\u0449\u0438\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430",\r
-advanced_props:"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430",\r
-rowtype:"\u0421\u0442\u0440\u043E\u043A\u0430 \u0432 \u0447\u0430\u0441\u0442\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
-title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C/\u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u0443",\r
+general_tab:"\u041E\u0431\u0449\u0435\u0435",\r
+advanced_tab:"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E",\r
+general_props:"\u041E\u0431\u0449\u0438\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B",\r
+advanced_props:"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B",\r
+rowtype:"\u0422\u0438\u043F \u0441\u0442\u0440\u043E\u043A\u0438",\r
+title:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
 width:"\u0428\u0438\u0440\u0438\u043D\u0430",\r
 height:"\u0412\u044B\u0441\u043E\u0442\u0430",\r
 cols:"\u0421\u0442\u043E\u043B\u0431\u0446\u044B",\r
-rows:"\u0421\u0442\u0440\u043E\u043A\u0438",\r
+rows:"\u0421\u0440\u043E\u043A\u0438",\r
 cellspacing:"\u0420\u0430\u0441\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u043C\u0435\u0436\u0434\u0443 \u044F\u0447\u0435\u0439\u043A\u0430\u043C\u0438",\r
-cellpadding:"\u041D\u0430\u0431\u0438\u0432\u043A\u0430 \u0432 \u044F\u0447\u0435\u0439\u043A\u0430\u0445",\r
+cellpadding:"\u041E\u0442\u0441\u0442\u0443\u043F\u044B \u0432 \u044F\u0447\u0435\u0439\u043A\u0430\u0445",\r
 border:"\u0413\u0440\u0430\u043D\u0438\u0446\u0430",\r
 align:"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435",\r
 align_default:"\u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E",\r
-align_left:"\u0412\u043B\u0435\u0432\u043E",\r
-align_right:"\u0412\u043F\u0440\u0430\u0432\u043E",\r
+align_left:"\u041F\u043E \u043B\u0435\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+align_right:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
 align_middle:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443",\r
-row_title:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043E\u043A\u0438",\r
-cell_title:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u044F\u0447\u0435\u0439\u043A\u0438",\r
-cell_type:"\u0422\u0438\u043F \u044F\u0447\u0435\u0439\u043A\u0438",\r
-valign:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u0432\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435",\r
-align_top:"\u041F\u043E \u0432\u0435\u0440\u0445\u0443",\r
-align_bottom:"\u041F\u043E \u043D\u0438\u0437\u0443",\r
+row_title:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0441\u0442\u0440\u043E\u043A\u0438",\r
+cell_title:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u044F\u0447\u0435\u0439\u043A\u0438",\r
+cell_type:"\u0422\u0438\u043F",\r
+valign:"\u0412\u0435\u0440\u0442. \u0432\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435",\r
+align_top:"\u041F\u043E \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+align_bottom:"\u041F\u043E \u043D\u0438\u0436\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E",\r
 bordercolor:"\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B",\r
-bgcolor:"\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430",\r
-merge_cells_title:"\u0421\u043B\u0438\u0442\u044C \u044F\u0447\u0435\u0439\u043A\u0438",\r
-id:"\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440",\r
+bgcolor:"\u0426\u0432\u0435\u0442 \u0437\u0430\u043B\u0438\u0432\u043A\u0438",\r
+merge_cells_title:"\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u044F\u0447\u0435\u0439\u043A\u0438",\r
+id:"\u0418\u043C\u044F",\r
 style:"\u0421\u0442\u0438\u043B\u044C",\r
-langdir:"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u044F\u0437\u044B\u043A\u0430",\r
+langdir:"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u0430",\r
 langcode:"\u041A\u043E\u0434 \u044F\u0437\u044B\u043A\u0430",\r
-mime:"\u0426\u0435\u043B\u0435\u0432\u043E\u0439 MIME-\u0442\u0438\u043F",\r
+mime:"MIME \u0442\u0438\u043F \u0446\u0435\u043B\u0438",\r
 ltr:"\u0421\u043B\u0435\u0432\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u043E",\r
 rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0435\u0432\u043E",\r
 bgimage:"\u0424\u043E\u043D\u043E\u0432\u043E\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435",\r
-summary:"\u0421\u0432\u043E\u0434\u043A\u0430",\r
+summary:"\u041E\u0431\u0449\u0435\u0435",\r
 td:"\u0414\u0430\u043D\u043D\u044B\u0435",\r
 th:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A",\r
 cell_cell:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u044F\u0447\u0435\u0439\u043A\u0443",\r
 cell_row:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0432\u0441\u0435 \u044F\u0447\u0435\u0439\u043A\u0438 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435",\r
 cell_all:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0432\u0441\u0435 \u044F\u0447\u0435\u0439\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435",\r
 row_row:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443",\r
-row_odd:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u043D\u0435\u0447\u0451\u0442\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435",\r
-row_even:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0447\u0451\u0442\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435",\r
+row_odd:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u043D\u0435\u0447\u0435\u0442\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435",\r
+row_even:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0447\u0435\u0442\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435",\r
 row_all:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0432\u0441\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435",\r
-thead:"\u0412\u0435\u0440\u0445\u043D\u044F\u044F \u0447\u0430\u0441\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
-tbody:"\u041E\u0441\u043D\u043E\u0432\u043D\u0430\u044F \u0447\u0430\u0441\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
-tfoot:"\u041D\u0438\u0436\u043D\u044F\u044F \u0447\u0430\u0441\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
-scope:"\u041F\u0440\u0435\u0434\u0435\u043B\u044B",\r
+thead:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A",\r
+tbody:"\u0422\u0435\u043B\u043E",\r
+tfoot:"\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u0435",\r
+scope:"\u041E\u0431\u043B\u0430\u0441\u0442\u044C",\r
 rowgroup:"\u0413\u0440\u0443\u043F\u043F\u0430 \u0441\u0442\u0440\u043E\u043A",\r
 colgroup:"\u0413\u0440\u0443\u043F\u043F\u0430 \u0441\u0442\u043E\u043B\u0431\u0446\u043E\u0432",\r
-col_limit:"\u0412\u044B \u043F\u0440\u0435\u0432\u044B\u0441\u0438\u043B\u0438 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0432 {$cols} \u0441\u0442\u043E\u043B\u0431\u0446\u043E\u0432.",\r
-row_limit:"\u0412\u044B \u043F\u0440\u0435\u0432\u044B\u0441\u0438\u043B\u0438 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0432 {$rows} \u0441\u0442\u0440\u043E\u043A.",\r
-cell_limit:"\u0412\u044B \u043F\u0440\u0435\u0432\u044B\u0441\u0438\u043B\u0438 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0432 {$cells} \u044F\u0447\u0435\u0435\u043A.",\r
-missing_scope:"\u0412\u044B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0431\u0435\u0437 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u0435\u043B\u043E\u0432 \u044D\u0442\u043E\u0439 \u044F\u0447\u0435\u0439\u043A\u0438 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430? \u0411\u0435\u0437 \u044D\u0442\u043E\u0433\u043E \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\u043C \u0441 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u043D\u043E\u0439 \u0442\u0440\u0443\u0434\u043E\u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u044C\u044E \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0442\u0440\u0443\u0434\u043D\u043E \u043F\u043E\u043D\u044F\u0442\u044C \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0435 \u0438\u043B\u0438 \u0434\u0430\u043D\u043D\u044B\u0435 \u0442\u0430\u0431\u043B\u0438\u0446\u044B.",\r
-caption:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0442\u0430\u0431\u043B\u0438\u0446\u044B",\r
-frame:"\u0420\u0430\u043C\u043A\u0430",\r
-frame_none:"\u043D\u0438\u0447\u0435\u0433\u043E",\r
-frame_groups:"\u0433\u0440\u0443\u043F\u043F\u044B",\r
-frame_rows:"\u0441\u0442\u0440\u043E\u043A\u0438",\r
-frame_cols:"\u0441\u0442\u043E\u043B\u0431\u0446\u044B",\r
-frame_all:"\u0432\u0441\u0451",\r
-rules:"\u041B\u0438\u043D\u0435\u0439\u043A\u0438",\r
-rules_void:"\u043D\u0438\u0447\u0442\u043E",\r
-rules_above:"\u0441\u0432\u0435\u0440\u0445\u0443",\r
-rules_below:"\u0441\u043D\u0438\u0437\u0443",\r
-rules_hsides:"\u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B",\r
-rules_lhs:"\u043B\u0435\u0432\u044B\u0435 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B",\r
-rules_rhs:"\u043F\u0440\u0430\u0432\u044B\u0435 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B",\r
-rules_vsides:"\u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B",\r
-rules_box:"\u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440",\r
-rules_border:"\u0433\u0440\u0430\u043D\u0438\u0446\u0430"\r
+col_limit:"\u0414\u043E\u0441\u0442\u0438\u0433\u043D\u0443\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0432\u0439 \u043F\u0440\u0435\u0434\u0435\u043B, \u0432 $ \u043A\u043E\u043B\u043E\u043D\u043E\u043A.",\r
+row_limit:"\u0414\u043E\u0441\u0442\u0438\u0433\u043D\u0443\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0432\u0439 \u043F\u0440\u0435\u0434\u0435\u043B, \u0432 $ \u0441\u0442\u0440\u043E\u043A.",\r
+cell_limit:"\u0414\u043E\u0441\u0442\u0438\u0433\u043D\u0443\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0432\u0439 \u043F\u0440\u0435\u0434\u0435\u043B, \u0432 $ \u044F\u0447\u0435\u0435\u043A.",\r
+missing_scope:"\u041F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C \u0431\u0435\u0437 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u043D\u0438\u044F \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0437\u0430\u0433\u043B\u043E\u043B\u0432\u043A\u0430? \u0411\u0435\u0437 \u044D\u0442\u043E\u0433\u043E \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0442\u0440\u0443\u0434\u043D\u0435\u043D\u043E \u0432\u043E\u0441\u043F\u0440\u0438\u044F\u0442\u0438\u0435 \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\u043C.",\r
+caption:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A",\r
+frame:"\u041A\u0430\u0434\u0440",\r
+frame_none:"none",\r
+frame_groups:"groups",\r
+frame_rows:"rows",\r
+frame_cols:"cols",\r
+frame_all:"all",\r
+rules:"\u041F\u0440\u0430\u0432\u0438\u043B\u0430",\r
+rules_void:"void",\r
+rules_above:"above",\r
+rules_below:"below",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"box",\r
+rules_border:"border"\r
 });
\ No newline at end of file
index 7028370cb4541a8eeb3b47ad70c31d2ce2e8af37..90f732825ada82caa691c9e802e1a6d3f8d9db20 100755 (executable)
@@ -1,74 +1,74 @@
 tinyMCE.addI18n('sk.table_dlg',{\r
-general_tab:"Hlavn\u00E9",\r
+general_tab:"Obecn\u00E9",\r
 advanced_tab:"Roz\u0161\u00EDren\u00E9",\r
-general_props:"Hlavn\u00E9 vlastnosti",\r
-advanced_props:"Roz\u0161\u00EDren\u00E9 vlastnosti",\r
-rowtype:"Row in table part",\r
+general_props:"Obecn\u00E9 parametre",\r
+advanced_props:"Roz\u0161\u00EDren\u00E9 parametre",\r
+rowtype:"Typ riadku",\r
 title:"Vlo\u017Ei\u0165/Upravi\u0165 tabu\u013Eku",\r
 width:"\u0160\u00EDrka",\r
 height:"V\u00FD\u0161ka",\r
 cols:"St\u013Apce",\r
 rows:"Riadky",\r
-cellspacing:"Cellspacing",\r
-cellpadding:"Cellpadding",\r
-border:"R\u00E1m\u010Dek",\r
-align:"Poloha",\r
-align_default:"Predvolene",\r
+cellspacing:"Rozstup buniek",\r
+cellpadding:"Odsadenie obsahu",\r
+border:"Or\u00E1movanie",\r
+align:"Zarovnanie",\r
+align_default:"Predvolen\u00E9",\r
 align_left:"V\u013Eavo",\r
 align_right:"Vpravo",\r
 align_middle:"Na stred",\r
-row_title:"Vlastnosti riadkov tabu\u013Eky",\r
-cell_title:"Vlastnosti buniek tabu\u013Eky",\r
-cell_type:"Tyb bunky",\r
-valign:"Vertik\u00E1lna poloha",\r
+row_title:"Vlastnosti riadkov",\r
+cell_title:"Vlastnosti bunky",\r
+cell_type:"Typ bunky",\r
+valign:"Vertik\u00E1lne zarovnanie",\r
 align_top:"Hore",\r
 align_bottom:"Dolu",\r
 bordercolor:"Farba or\u00E1movania",\r
 bgcolor:"Farba pozadia",\r
-merge_cells_title:"Zl\u00FA\u010Di\u0165 bunky tabu\u013Eky",\r
+merge_cells_title:"Zl\u00FA\u010Di\u0165 bunky",\r
 id:"ID",\r
-style:"CSS \u0160t\u00FDl",\r
+style:"\u0160t\u00FDl",\r
 langdir:"Smer textu",\r
 langcode:"K\u00F3d jazyka",\r
-mime:"Cie\u013Eov\u00FD typ MIME",\r
-ltr:"Z \u013Eava do prava",\r
-rtl:"Z prava do \u013Eava",\r
+mime:"MIME typ cie\u013Ea",\r
+ltr:"Z\u013Eava doprava",\r
+rtl:"Sprava do\u013Eava",\r
 bgimage:"Obr\u00E1zok pozadia",\r
-summary:"Popis tabu\u013Eky",\r
+summary:"Obsah tabu\u013Eky",\r
 td:"D\u00E1ta",\r
-th:"Hlav\u010Dka",\r
+th:"Hlavi\u010Dka",\r
 cell_cell:"Aktualizova\u0165 aktu\u00E1lnu bunku",\r
 cell_row:"Aktualizova\u0165 v\u0161etky bunky v riadku",\r
-cell_all:"Aktualizova\u0165 v\u0161etky bunky v tebu\u013Eke",\r
+cell_all:"Aktualizova\u0165 v\u0161etky bunky v tabu\u013Eke",\r
 row_row:"Aktualizova\u0165 aktu\u00E1lny riadok",\r
-row_odd:"Aktualizova\u0165 odd rows in table",\r
-row_even:"Aktualizova\u0165 nep\u00E1rne riadky v tabu\u013Eke",\r
-row_all:"Aktualizova\u0165 v\u0161etky riadky v tabu\u013Eke",\r
+row_odd:"Aktualizova\u0165 nep\u00E1rne riadky tabu\u013Eky",\r
+row_even:"Aktualizova\u0165 p\u00E1rne riadky tabu\u013Eky",\r
+row_all:"Aktualizova\u0165 v\u0161etky riadky tabu\u013Eky",\r
 thead:"Hlavi\u010Dka tabu\u013Eky",\r
 tbody:"Telo tabu\u013Eky",\r
 tfoot:"P\u00E4ta tabu\u013Eky",\r
-scope:"Scope",\r
+scope:"Hlavi\u010Dka pre",\r
 rowgroup:"Skupina riadkov",\r
 colgroup:"Skupina st\u013Apcov",\r
-col_limit:"Bol presiahnut\u00FD maxim\u00E1lny po\u010Det st\u013Apcov {$cols}.",\r
-row_limit:"Bol presiahnut\u00FD maxim\u00E1lny po\u010Det riadkov {$rows}.",\r
-cell_limit:"Bol presiahnut\u00FD maxim\u00E1lny po\u010Det buniek {$cells}.",\r
-missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
-caption:"Table caption",\r
-frame:"R\u00E1m\u010Dek",\r
-frame_none:"\u017Eiadne",\r
-frame_groups:"groups",\r
+col_limit:"Prekro\u010Dili ste maxim\u00E1lny po\u010Det st\u013Apcov {$cols}.",\r
+row_limit:"Prekro\u010Dili ste maxim\u00E1lny po\u010Det riadkov {$rows}.",\r
+cell_limit:"Prekro\u010Dili ste maxim\u00E1lny po\u010Det buniek {$cells}.",\r
+missing_scope:"Skuto\u010Dne chcete pokra\u010Dova\u0165 bez ur\u010Denia oblasti hlavi\u010Dky tejto tabu\u013Eky? Bez nej m\u00F4\u017Ee u niektor\u00FDch u\u017E\u00EDvate\u013Eov doch\u00E1dza\u0165 k ur\u010Dit\u00FDm probl\u00E9mom pri intepret\u00E1cii a zobrazovan\u00ED d\u00E1t v tabu\u013Eke.",\r
+caption:"Nadpis tabu\u013Eky",\r
+frame:"Or\u00E1movanie tabu\u013Eky",\r
+frame_none:"\u017Eiadna",\r
+frame_groups:"oblasti a skupiny st\u013Apcov",\r
 frame_rows:"riadky",\r
 frame_cols:"st\u013Apce",\r
-frame_all:"v\u0161etky",\r
-rules:"Pravidl\u00E1",\r
-rules_void:"void",\r
-rules_above:"above",\r
-rules_below:"below",\r
-rules_hsides:"hsides",\r
-rules_lhs:"lhs",\r
-rules_rhs:"rhs",\r
-rules_vsides:"vsides",\r
-rules_box:"box",\r
-rules_border:"okraj"\r
+frame_all:"v\u0161etko",\r
+rules:"Vykreslenie mrie\u017Eky",\r
+rules_void:"\u017Eiadne",\r
+rules_above:"hore",\r
+rules_below:"dole",\r
+rules_hsides:"hore a dole",\r
+rules_lhs:"v\u013Eavo",\r
+rules_rhs:"vpravo",\r
+rules_vsides:"v\u013Eavo a vpravo",\r
+rules_box:"box okolo",\r
+rules_border:"or\u00E1movanie okolo"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/sq_dlg.js b/program/js/tiny_mce/plugins/table/langs/sq_dlg.js
new file mode 100644 (file)
index 0000000..9d42264
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('sq.table_dlg',{\r
+general_tab:"T\u00EB p\u00EBrgjithshme",\r
+advanced_tab:"T\u00EB avancuara",\r
+general_props:"Tipare t\u00EB p\u00EBrgjithshme",\r
+advanced_props:"Tipare t\u00EB avancuara",\r
+rowtype:"Rresht n\u00EB",\r
+title:"Fut/Edito tabel\u00EB",\r
+width:"Gjer\u00EBsia",\r
+height:"Gjat\u00EBsia",\r
+cols:"Kolona",\r
+rows:"Rreshta",\r
+cellspacing:"Hap\u00EBsira midis qelizave",\r
+cellpadding:"Hap\u00EBsira e br\u00EBndshme",\r
+border:"Korniza",\r
+align:"Drejtimi",\r
+align_default:"Paracaktuar",\r
+align_left:"Majtas",\r
+align_right:"Djathtas",\r
+align_middle:"Qend\u00EBr",\r
+row_title:"Tiparet e rreshtit",\r
+cell_title:"Tiparet e qeliz\u00EBs",\r
+cell_type:"Tipi i qeliz\u00EBs",\r
+valign:"Drejtimi vertikal",\r
+align_top:"Krye",\r
+align_bottom:"Fund",\r
+bordercolor:"Ngjyra e korniz\u00EBs",\r
+bgcolor:"Ngjyra e fush\u00EBs",\r
+merge_cells_title:"Bashko qelizat",\r
+id:"Id",\r
+style:"Stili",\r
+langdir:"Drejtimi i gjuh\u00EBs",\r
+langcode:"Kodi i gjuh\u00EBs",\r
+mime:"Tipi MIME i sh\u00EBnjestr\u00EBs",\r
+ltr:"Majtas-Djathtas",\r
+rtl:"Djathtas-Majtas",\r
+bgimage:"Foto e fush\u00EBs",\r
+summary:"P\u00EBrmbledhja",\r
+td:"T\u00EB dh\u00EBna",\r
+th:"Kok\u00EB",\r
+cell_cell:"Rifresko qeliz\u00EBn aktuale",\r
+cell_row:"Rifresko t\u00EB gjitha qelizat n\u00EB rresht",\r
+cell_all:"Rifresko t\u00EB gjitha qelizat",\r
+row_row:"Rifresko rreshtin aktual",\r
+row_odd:"Rifresko rreshtat tek",\r
+row_even:"Rifresko rreshtat \u00E7ift",\r
+row_all:"Rifresko t\u00EB gjitha rreshtat n\u00EB tabel\u00EB",\r
+thead:"Kok\u00EBn e Tabel\u00EBs",\r
+tbody:"Trupin e Tabel\u00EBs",\r
+tfoot:"K\u00EBmb\u00EBt e Tabel\u00EBs",\r
+scope:"Objektivi",\r
+rowgroup:"Grup Rreshtash",\r
+colgroup:"Grup Kolonash",\r
+col_limit:"Keni kaluar numrin maksimal t\u00EB kolonave: {$cols}.",\r
+row_limit:"Keni kaluar numrin maksimal t\u00EB rreshtave: {$rows}.",\r
+cell_limit:"Keni kaluar numrin maksimal t\u00EB qelizave {$cells}.",\r
+missing_scope:"Jeni t\u00EB sigurt q\u00EB nuk doni t\u00EB vendosni objektiv p\u00EBr k\u00EBt\u00EB qeliz\u00EB t\u00EB kok\u00EBs. Pa t\u00EB mund t\u00EB jet\u00EB e v\u00EBshtir\u00EB p\u00EBr disa p\u00EBrdorues me aft\u00EBsi t\u00EB kufizuara t\u00EB lexojn\u00EB p\u00EBrmbajtjen e tabel\u00EBs.",\r
+caption:"Krijo hap\u00EBsir\u00EB p\u00EBr titull",\r
+frame:"Korniza",\r
+frame_none:"asnj\u00EB",\r
+frame_groups:"grupe",\r
+frame_rows:"rreshta",\r
+frame_cols:"kolona",\r
+frame_all:"t\u00EB gjitha",\r
+rules:"Rregullat",\r
+rules_void:"zbrazur",\r
+rules_above:"sip\u00EBr",\r
+rules_below:"posht\u00EB",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"kuti",\r
+rules_border:"korniz\u00EB"\r
+});
\ No newline at end of file
index a7de7422d413b1e60b3d68aea054eef823c173d0..bcf81c71556e652bb91e114b295f587dd228c6ab 100755 (executable)
@@ -52,7 +52,7 @@ colgroup:"Kolumngrupp",
 col_limit:"Du kan inte ange fler \u00E4n {$cols} kolumner.",\r
 row_limit:"Du kan inte ange fler \u00E4n {$rows} rader.",\r
 cell_limit:"Du kan inte skapa en tabell med fler \u00E4n {$cells} celler.",\r
-missing_scope:"\u00C4r du s\u00E4ker p\u00E5 att du vill forts\u00E4tta utan att ange en omfattning, denna underl\u00E4ttar f\u00F6r icke-grafiska webbl\u00E4sare.",\r
+missing_scope:"\u00D6\u0084r du s\u00E4ker p\u00E5 att du vill forts\u00E4tta utan att ange en omfattning, denna underl\u00E4ttar f\u00F6r icke-grafiska webbl\u00E4sare.",\r
 caption:"\u00D6verskrift",\r
 frame:"Ram",\r
 frame_none:"none",\r
diff --git a/program/js/tiny_mce/plugins/table/langs/ta_dlg.js b/program/js/tiny_mce/plugins/table/langs/ta_dlg.js
new file mode 100644 (file)
index 0000000..0174ef9
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('ta.table_dlg',{\r
+general_tab:"General",\r
+advanced_tab:"Advanced",\r
+general_props:"General properties",\r
+advanced_props:"Advanced properties",\r
+rowtype:"Row in table part",\r
+title:"Insert/Modify table",\r
+width:"Width",\r
+height:"Height",\r
+cols:"Cols",\r
+rows:"Rows",\r
+cellspacing:"Cellspacing",\r
+cellpadding:"Cellpadding",\r
+border:"Border",\r
+align:"Alignment",\r
+align_default:"Default",\r
+align_left:"Left",\r
+align_right:"Right",\r
+align_middle:"Center",\r
+row_title:"Table row properties",\r
+cell_title:"Table cell properties",\r
+cell_type:"Cell type",\r
+valign:"Vertical alignment",\r
+align_top:"Top",\r
+align_bottom:"Bottom",\r
+bordercolor:"Border color",\r
+bgcolor:"Background color",\r
+merge_cells_title:"Merge table cells",\r
+id:"Id",\r
+style:"Style",\r
+langdir:"Language direction",\r
+langcode:"Language code",\r
+mime:"Target MIME type",\r
+ltr:"Left to right",\r
+rtl:"Right to left",\r
+bgimage:"Background image",\r
+summary:"Summary",\r
+td:"Data",\r
+th:"Header",\r
+cell_cell:"Update current cell",\r
+cell_row:"Update all cells in row",\r
+cell_all:"Update all cells in table",\r
+row_row:"Update current row",\r
+row_odd:"Update odd rows in table",\r
+row_even:"Update even rows in table",\r
+row_all:"Update all rows in table",\r
+thead:"Table Head",\r
+tbody:"Table Body",\r
+tfoot:"Table Foot",\r
+scope:"Scope",\r
+rowgroup:"Row Group",\r
+colgroup:"Col Group",\r
+col_limit:"You've exceeded the maximum number of columns of {$cols}.",\r
+row_limit:"You've exceeded the maximum number of rows of {$rows}.",\r
+cell_limit:"You've exceeded the maximum number of cells of {$cells}.",\r
+missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
+caption:"Table caption",\r
+frame:"Frame",\r
+frame_none:"none",\r
+frame_groups:"groups",\r
+frame_rows:"rows",\r
+frame_cols:"cols",\r
+frame_all:"all",\r
+rules:"Rules",\r
+rules_void:"void",\r
+rules_above:"above",\r
+rules_below:"below",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"box",\r
+rules_border:"border"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/te_dlg.js b/program/js/tiny_mce/plugins/table/langs/te_dlg.js
new file mode 100644 (file)
index 0000000..fb7cfb9
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('te.table_dlg',{\r
+general_tab:"General",\r
+advanced_tab:"Advanced",\r
+general_props:"General properties",\r
+advanced_props:"Advanced properties",\r
+rowtype:"Row in table part",\r
+title:"Insert/Modify table",\r
+width:"Width",\r
+height:"Height",\r
+cols:"Cols",\r
+rows:"Rows",\r
+cellspacing:"Cellspacing",\r
+cellpadding:"Cellpadding",\r
+border:"Border",\r
+align:"Alignment",\r
+align_default:"Default",\r
+align_left:"Left",\r
+align_right:"Right",\r
+align_middle:"Center",\r
+row_title:"Table row properties",\r
+cell_title:"Table cell properties",\r
+cell_type:"Cell type",\r
+valign:"Vertical alignment",\r
+align_top:"Top",\r
+align_bottom:"Bottom",\r
+bordercolor:"Border color",\r
+bgcolor:"Background color",\r
+merge_cells_title:"Merge table cells",\r
+id:"Id",\r
+style:"Style",\r
+langdir:"Language direction",\r
+langcode:"Language code",\r
+mime:"Target MIME type",\r
+ltr:"Left to right",\r
+rtl:"Right to left",\r
+bgimage:"Background image",\r
+summary:"Summary",\r
+td:"Data",\r
+th:"Header",\r
+cell_cell:"Update current cell",\r
+cell_row:"Update all cells in row",\r
+cell_all:"Update all cells in table",\r
+row_row:"Update current row",\r
+row_odd:"Update odd rows in table",\r
+row_even:"Update even rows in table",\r
+row_all:"Update all rows in table",\r
+thead:"Table Head",\r
+tbody:"Table Body",\r
+tfoot:"Table Foot",\r
+scope:"Scope",\r
+rowgroup:"Row Group",\r
+colgroup:"Col Group",\r
+col_limit:"You've exceeded the maximum number of columns of {$cols}.",\r
+row_limit:"You've exceeded the maximum number of rows of {$rows}.",\r
+cell_limit:"You've exceeded the maximum number of cells of {$cells}.",\r
+missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
+caption:"Table caption",\r
+frame:"Frame",\r
+frame_none:"none",\r
+frame_groups:"groups",\r
+frame_rows:"rows",\r
+frame_cols:"cols",\r
+frame_all:"all",\r
+rules:"Rules",\r
+rules_void:"void",\r
+rules_above:"above",\r
+rules_below:"below",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"box",\r
+rules_border:"border"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/th_dlg.js b/program/js/tiny_mce/plugins/table/langs/th_dlg.js
new file mode 100644 (file)
index 0000000..d3b66a1
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('th.table_dlg',{\r
+general_tab:"\u0E17\u0E31\u0E48\u0E27\u0E44\u0E1B",\r
+advanced_tab:"\u0E02\u0E31\u0E49\u0E19\u0E2A\u0E39\u0E07",\r
+general_props:"\u0E04\u0E38\u0E13\u0E2A\u0E21\u0E1A\u0E31\u0E15\u0E34\u0E17\u0E31\u0E48\u0E27\u0E44\u0E1B",\r
+advanced_props:"\u0E04\u0E38\u0E13\u0E2A\u0E21\u0E1A\u0E31\u0E15\u0E34\u0E02\u0E31\u0E49\u0E19\u0E2A\u0E39\u0E07",\r
+rowtype:"Row in table part",\r
+title:"\u0E40\u0E1E\u0E34\u0E48\u0E21/\u0E41\u0E01\u0E49\u0E44\u0E02 \u0E15\u0E32\u0E23\u0E32\u0E07",\r
+width:"\u0E01\u0E27\u0E49\u0E32\u0E07",\r
+height:"\u0E2A\u0E39\u0E07",\r
+cols:"\u0E04\u0E2D\u0E25\u0E31\u0E21\u0E1E\u0E4C",\r
+rows:"\u0E41\u0E16\u0E27",\r
+cellspacing:"Cellspacing",\r
+cellpadding:"Cellpadding",\r
+border:"\u0E01\u0E23\u0E2D\u0E1A",\r
+align:"\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07\u0E08\u0E31\u0E14\u0E27\u0E32\u0E07",\r
+align_default:"\u0E04\u0E48\u0E32\u0E40\u0E23\u0E34\u0E48\u0E21\u0E15\u0E49\u0E19",\r
+align_left:"\u0E0B\u0E49\u0E32\u0E22",\r
+align_right:"\u0E02\u0E27\u0E32",\r
+align_middle:"\u0E01\u0E25\u0E32\u0E07",\r
+row_title:"\u0E04\u0E38\u0E13\u0E2A\u0E21\u0E1A\u0E31\u0E15\u0E34\u0E41\u0E16\u0E27\u0E43\u0E19\u0E15\u0E32\u0E23\u0E32\u0E07",\r
+cell_title:"\u0E04\u0E38\u0E13\u0E2A\u0E21\u0E1A\u0E31\u0E15\u0E34\u0E40\u0E0B\u0E25\u0E25\u0E4C\u0E43\u0E19\u0E32\u0E23\u0E32\u0E07",\r
+cell_type:"Cell type",\r
+valign:"Vertical alignment",\r
+align_top:"\u0E1A\u0E19",\r
+align_bottom:"\u0E25\u0E48\u0E32\u0E07",\r
+bordercolor:"\u0E2A\u0E35\u0E01\u0E23\u0E2D\u0E1A",\r
+bgcolor:"\u0E2A\u0E35\u0E1E\u0E37\u0E49\u0E19\u0E2B\u0E25\u0E31\u0E07",\r
+merge_cells_title:"Merge table cells",\r
+id:"Id",\r
+style:"\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A",\r
+langdir:"\u0E17\u0E34\u0E28\u0E17\u0E32\u0E07\u0E01\u0E32\u0E23\u0E2D\u0E48\u0E32\u0E19",\r
+langcode:"\u0E42\u0E04\u0E4A\u0E14\u0E20\u0E32\u0E29\u0E32",\r
+mime:"\u0E40\u0E1B\u0E49\u0E32\u0E2B\u0E21\u0E32\u0E22 MIME type",\r
+ltr:"\u0E0B\u0E49\u0E32\u0E22\u0E44\u0E1B\u0E02\u0E27\u0E32",\r
+rtl:"\u0E02\u0E27\u0E32\u0E44\u0E1B\u0E0B\u0E49\u0E32\u0E22",\r
+bgimage:"\u0E1E\u0E37\u0E49\u0E19\u0E2B\u0E25\u0E31\u0E07 image",\r
+summary:"Summary",\r
+td:"Data",\r
+th:"Header",\r
+cell_cell:"Update current cell",\r
+cell_row:"Update all cells in row",\r
+cell_all:"Update all cells in table",\r
+row_row:"Update current row",\r
+row_odd:"Update odd rows in table",\r
+row_even:"Update even rows in table",\r
+row_all:"Update all rows in table",\r
+thead:"Table Head",\r
+tbody:"Table Body",\r
+tfoot:"Table Foot",\r
+scope:"Scope",\r
+rowgroup:"Row Group",\r
+colgroup:"Col Group",\r
+col_limit:"You've exceeded the maximum number of columns of {$cols}.",\r
+row_limit:"You've exceeded the maximum number of rows of {$rows}.",\r
+cell_limit:"You've exceeded the maximum number of cells of {$cells}.",\r
+missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
+caption:"Table caption",\r
+frame:"Frame",\r
+frame_none:"none",\r
+frame_groups:"groups",\r
+frame_rows:"rows",\r
+frame_cols:"cols",\r
+frame_all:"all",\r
+rules:"Rules",\r
+rules_void:"void",\r
+rules_above:"above",\r
+rules_below:"below",\r
+rules_hsides:"hsides",\r
+rules_lhs:"lhs",\r
+rules_rhs:"rhs",\r
+rules_vsides:"vsides",\r
+rules_box:"box",\r
+rules_border:"border"\r
+});
\ No newline at end of file
index 2318314fcc9ad252fe6fb8f05b3ae20d24a62cc6..f2457eb18927ca0aa48547b47f62978c4160e9e1 100755 (executable)
@@ -3,20 +3,20 @@ general_tab:"Genel",
 advanced_tab:"Geli\u015Fmi\u015F",\r
 general_props:"Genel \u00F6zellikler",\r
 advanced_props:"Geli\u015Fmi\u015F \u00F6zellikler",\r
-rowtype:"Tablo par\u00E7as\u0131ndaki sat\u0131r",\r
-title:"Tablo ekle/d\u00FCzenle",\r
+rowtype:"Tablo b\u00F6l\u00FCm\u00FCndeki sat\u0131r",\r
+title:"Tablo Ekle/D\u00FCzenle",\r
 width:"Geni\u015Flik",\r
 height:"Y\u00FCkseklik",\r
-cols:"Kolonlar",\r
+cols:"S\u00FCtunlar",\r
 rows:"Sat\u0131rlar",\r
-cellspacing:"H\u00FCcre aralama",\r
-cellpadding:"H\u00FCcre dolgusu",\r
+cellspacing:"H\u00FCcre i\u00E7i bo\u015Flu\u011Fu",\r
+cellpadding:"H\u00FCcre d\u0131\u015F\u0131 bo\u015Flu\u011Fu",\r
 border:"Kenarl\u0131k",\r
 align:"Hizalama",\r
 align_default:"Varsay\u0131lan",\r
-align_left:"Sola",\r
-align_right:"Sa\u011Fa",\r
-align_middle:"Ortala",\r
+align_left:"Sol",\r
+align_right:"Sa\u011F",\r
+align_middle:"Orta",\r
 row_title:"Tablo sat\u0131r \u00F6zellikleri",\r
 cell_title:"Tablo h\u00FCcre \u00F6zellikleri",\r
 cell_type:"H\u00FCcre tipi",\r
@@ -28,47 +28,47 @@ bgcolor:"Arkaplan rengi",
 merge_cells_title:"Tablo h\u00FCcrelerini birle\u015Ftir",\r
 id:"Id",\r
 style:"Stil",\r
-langdir:"Dil y\u00F6nelimi",\r
+langdir:"Dil y\u00F6n\u00FC",\r
 langcode:"Dil kodu",\r
 mime:"Hedef MIME tipi",\r
-ltr:"Soldan sa\u011Fa",\r
-rtl:"Sa\u011Fdan sola",\r
+ltr:"Sa\u011Fdan sola",\r
+rtl:"Soldan sa\u011Fa",\r
 bgimage:"Arkaplan resmi",\r
 summary:"\u00D6zet",\r
 td:"Veri",\r
 th:"Ba\u015Fl\u0131k",\r
-cell_cell:"Se\u00E7ili h\u00FCcreyi g\u00FCncelle",\r
+cell_cell:"Se\u00E7ili h\u00FCcreleri g\u00FCncelle",\r
 cell_row:"Sat\u0131rdaki t\u00FCm h\u00FCcreleri g\u00FCncelle",\r
 cell_all:"Tablodaki t\u00FCm h\u00FCcreleri g\u00FCncelle",\r
 row_row:"Se\u00E7ili sat\u0131r\u0131 g\u00FCncelle",\r
 row_odd:"Tablodaki tek nolu sat\u0131rlar\u0131 g\u00FCncelle",\r
-row_even:"Tablodaki \u00E7ift nolu sat\u0131rlar\u0131 g\u00FCncele",\r
+row_even:"Tablodaki \u00E7ift nolu sat\u0131rlar\u0131 g\u00FCncelle",\r
 row_all:"Tablodaki t\u00FCm sat\u0131rlar\u0131 g\u00FCncelle",\r
 thead:"Tablo Ba\u015Fl\u0131\u011F\u0131",\r
-tbody:"Table G\u00F6vdesi",\r
-tfoot:"Table Altl\u0131\u011F\u0131",\r
+tbody:"Tablo G\u00F6vdesi",\r
+tfoot:"Tablo Alt\u0131",\r
 scope:"Kapsam",\r
 rowgroup:"Sat\u0131r Grubu",\r
-colgroup:"Kolon Grubu",\r
-col_limit:"Maksimum kolon say\u0131s\u0131 olan {$cols} de\u011Ferini a\u015Ft\u0131n\u0131z.",\r
-row_limit:"Maksimum sat\u0131r say\u0131s\u0131 olan {$rows} de\u011Ferini a\u015Ft\u0131n\u0131z.",\r
-cell_limit:"Maksimum h\u00FCcre say\u0131s\u0131 olan {$cells} de\u011Ferini a\u015Ft\u0131n\u0131z.",\r
-missing_scope:"Bu tablo ba\u015Fl\u0131k h\u00FCcresi i\u00E7in bir kapsam belirlemeden devam etmek istedi\u011Finizden emin misiniz? Bu de\u011Fer olmadan, engelli kullan\u0131c\u0131lar\u0131n tabloda g\u00F6r\u00FCnt\u00FClenen i\u00E7eri\u011Fi anlamas\u0131 m\u00FCmk\u00FCn olmayabilir.",\r
+colgroup:"S\u00FCtun Grubu",\r
+col_limit:"Maksimum s\u00FCtun say\u0131s\u0131 ($cols) a\u015F\u0131ld\u0131.",\r
+row_limit:"Maksimum sat\u0131r say\u0131s\u0131 ($rows) a\u015F\u0131ld\u0131.",\r
+cell_limit:"Maksimum h\u00FCcre say\u0131s\u0131 ($cells) a\u015F\u0131ld\u0131.",\r
+missing_scope:"Tablo ba\u015Fl\u0131k h\u00FCcresi i\u00E7in bir kapsam belirlemeden devam etmek istedi\u011Finize emin misiniz? Bu de\u011Fer olmadan, engelli kullan\u0131c\u0131lar  tabloda g\u00F6sterilen verileri ve i\u00E7eri\u011Fi anlamas\u0131 zordur.",\r
 caption:"Tablo ba\u015Fl\u0131\u011F\u0131",\r
 frame:"\u00C7er\u00E7eve",\r
 frame_none:"hi\u00E7biri",\r
 frame_groups:"gruplar",\r
 frame_rows:"sat\u0131rlar",\r
-frame_cols:"kolonlar",\r
+frame_cols:"s\u00FCtunlar",\r
 frame_all:"t\u00FCm\u00FC",\r
 rules:"\u00C7izgiler",\r
 rules_void:"yok",\r
 rules_above:"\u00FCst\u00FCnde",\r
 rules_below:"alt\u0131nda",\r
-rules_hsides:"solsa\u011F",\r
-rules_lhs:"soltaraf",\r
-rules_rhs:"sa\u011Ftaraf",\r
-rules_vsides:"\u00FCstalt",\r
+rules_hsides:"yatay kenarlar",\r
+rules_lhs:"sol yatay kenarlar",\r
+rules_rhs:"sa\u011F yatay kenarlar",\r
+rules_vsides:"dikey kenarlar",\r
 rules_box:"kutu",\r
 rules_border:"kenarl\u0131k"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/langs/tw_dlg.js b/program/js/tiny_mce/plugins/table/langs/tw_dlg.js
new file mode 100644 (file)
index 0000000..1e6c711
--- /dev/null
@@ -0,0 +1,74 @@
+tinyMCE.addI18n('tw.table_dlg',{\r
+general_tab:"\u4E00\u822C",\r
+advanced_tab:"\u9AD8\u7D1A",\r
+general_props:"\u4E00\u822C\u5C6C\u6027",\r
+advanced_props:"\u9AD8\u7D1A\u5C6C\u6027",\r
+rowtype:"\u6B04\u6240\u5728\u7684\u8868\u683C\u4F4D\u7F6E",\r
+title:"\u63D2\u5165/\u7DE8\u8F2F\u8868\u683C",\r
+width:"\u5BEC\u5EA6",\r
+height:"\u9AD8\u5EA6",\r
+cols:"\u5217\u6578",\r
+rows:"\u6B04\u6578",\r
+cellspacing:"\u8868\u683C\u9593\u8DDD",\r
+cellpadding:"\u88DC\u767D\u5C3A\u5BF8",\r
+border:"\u908A\u6846",\r
+align:"\u5C0D\u9F4A\u65B9\u5F0F",\r
+align_default:"\u9810\u8A2D",\r
+align_left:"\u9760\u5DE6\u5C0D\u9F4A",\r
+align_right:"\u9760\u53F3\u5C0D\u9F4A",\r
+align_middle:"\u5C45\u4E2D\u5C0D\u9F4A",\r
+row_title:"\u6B04\u5C6C\u6027",\r
+cell_title:"\u8868\u683C\u5C6C\u6027",\r
+cell_type:"\u8868\u683C\u985E\u578B",\r
+valign:"\u5C0D\u9F4A\u65B9\u5F0F",\r
+align_top:"\u4E0A\u65B9",\r
+align_bottom:"\u4E0B\u65B9",\r
+bordercolor:"\u908A\u6846\u984F\u8272",\r
+bgcolor:"\u80CC\u666F\u984F\u8272",\r
+merge_cells_title:"\u5408\u4F75\u8868\u683C",\r
+id:"ID \u503C",\r
+style:"\u6A23\u5F0F",\r
+langdir:"\u6587\u5B57\u6392\u5217\u65B9\u5F0F",\r
+langcode:"\u8A9E\u8A00\u7DE8\u78BC",\r
+mime:"MIME\u985E\u578B",\r
+ltr:"\u7531\u5DE6\u5230\u53F3",\r
+rtl:"\u7531\u53F3\u5230\u5DE6",\r
+bgimage:"\u80CC\u666F\u5716\u7247",\r
+summary:"\u6982\u8981",\r
+td:"\u55AE\u683C",\r
+th:"\u6A19\u984C\u55AE\u683C",\r
+cell_cell:"\u66F4\u65B0\u55AE\u683C",\r
+cell_row:"\u66F4\u65B0\u7576\u524D\u884C\u7684\u5168\u90E8\u55AE\u683C",\r
+cell_all:"\u66F4\u65B0\u8868\u683C\u5167\u7684\u5168\u90E8\u55AE\u683C",\r
+row_row:"\u66F4\u65B0\u6240\u5728\u6B04",\r
+row_odd:"\u66F4\u65B0\u8868\u683C\u5167\u7684\u5947\u6578\u6B04",\r
+row_even:"\u66F4\u65B0\u8868\u683C\u5167\u7684\u5076\u6578\u6B04",\r
+row_all:"\u66F4\u65B0\u8868\u683C\u5167\u5168\u90E8\u6B04",\r
+thead:"\u8868\u982D",\r
+tbody:"\u8868\u8EAB",\r
+tfoot:"\u8868\u5C3E",\r
+scope:"\u7BC4\u570D",\r
+rowgroup:"\u884C\u7FA4\u7D44",\r
+colgroup:"\u5217\u7FA4\u7D44",\r
+col_limit:"\u7A0B\u5F0F\u932F\u8AA4\uFF0C\u6700\u9AD8\u7684\u5217\u6578\u70BA{$cols} \u5217\u3002 ",\r
+row_limit:"\u7A0B\u5F0F\u932F\u8AA4\uFF0C\u6700\u9AD8\u7684\u884C\u6578\u70BA{$rows} \u6B04\u3002 ",\r
+cell_limit:"\u7A0B\u5F0F\u932F\u8AA4\uFF0C\u6700\u9AD8\u7684\u55AE\u683C\u6578\u70BA{$cells} \u683C\u3002 ",\r
+missing_scope:"\u7F3A\u5C11\u6A19\u984C",\r
+caption:"\u8868\u683C\u6A19\u984C",\r
+frame:"\u6846\u67B6",\r
+frame_none:"\u7121",\r
+frame_groups:"\u7FA4\u7D44",\r
+frame_rows:"\u884C",\r
+frame_cols:"\u5217",\r
+frame_all:"\u5168\u90E8",\r
+rules:"\u67F5\u683C",\r
+rules_void:"\u7A7A",\r
+rules_above:"\u4E0A",\r
+rules_below:"\u4E0B",\r
+rules_hsides:"\u6C34\u6E96",\r
+rules_lhs:"\u5DE6\u908A",\r
+rules_rhs:"\u53F3\u908A",\r
+rules_vsides:"\u5782\u76F4",\r
+rules_box:"\u76D2\u578B",\r
+rules_border:"\u5916\u6846"\r
+});
\ No newline at end of file
index b8e3ad4504f7a089aa028f3643418ca5e5aca57f..d1ad9ec135735cf4165070451b723e0feabac472 100755 (executable)
@@ -3,15 +3,15 @@ general_tab:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0435",
 advanced_tab:"\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u043E",\r
 general_props:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0456 \u0432\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456",\r
 advanced_props:"\u0420\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u0456 \u0432\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456",\r
-rowtype:"Row in table part",\r
-title:"\u0414\u043E\u0434\u0430\u0432\u0430\u043D\u043D\u044F/\u0417\u043C\u0456\u043D\u0430 \u0442\u0430\u0431\u043B\u0438\u0446\u0456",\r
+rowtype:"\u0420\u044F\u0434\u043E\u043A \u0432 \u0447\u0430\u0441\u0442\u0438\u043D\u0456 \u0442\u0430\u0431\u043B\u0438\u0446\u0456",\r
+title:"\u0414\u043E\u0434\u0430\u0442\u0438/\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044E",\r
 width:"\u0428\u0438\u0440\u0438\u043D\u0430",\r
 height:"\u0412\u0438\u0441\u043E\u0442\u0430",\r
-cols:"\u0421\u0442\u043E\u043B\u0431\u0446\u044B",\r
-rows:"\u0421\u0442\u0440\u043E\u043A\u0438",\r
+cols:"\u0421\u0442\u043E\u0432\u043F\u0446\u0456",\r
+rows:"\u0420\u044F\u0434\u043A\u0438",\r
 cellspacing:"\u0412\u0456\u0434\u0441\u0442\u0430\u043D\u044C \u043C\u0456\u0436 \u043A\u043E\u043C\u0456\u0440\u043A\u0430\u043C\u0438",\r
 cellpadding:"\u0412\u0456\u0434\u0441\u0442\u0443\u043F\u0438 \u0443 \u043A\u043E\u043C\u0456\u0440\u043A\u0430\u0445",\r
-border:"\u0413\u0440\u0430\u043D\u0438\u0446\u044F",\r
+border:"\u0420\u0430\u043C\u043A\u0430",\r
 align:"\u0412\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F",\r
 align_default:"\u0417\u0430 \u0437\u0430\u043C\u043E\u0432\u0447\u0430\u043D\u043D\u044F\u043C",\r
 align_left:"\u041F\u043E \u043B\u0456\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
@@ -20,19 +20,19 @@ align_middle:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443",
 row_title:"\u0412\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456 \u0440\u044F\u0434\u043A\u0443 \u0442\u0430\u0431\u043B\u0438\u0446\u0456",\r
 cell_title:"\u0412\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456 \u043A\u043E\u043C\u0456\u0440\u043A\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u0456",\r
 cell_type:"\u0422\u0438\u043F \u043A\u043E\u043C\u0456\u0440\u043A\u0438",\r
-valign:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u0432\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435",\r
+valign:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u0435 \u0432\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F",\r
 align_top:"\u041F\u043E \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E",\r
 align_bottom:"\u041F\u043E \u043D\u0438\u0436\u043D\u044C\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
-bordercolor:"\u043A\u043E\u043B\u0456\u0440 \u0433\u0440\u0430\u043D\u0438\u0446\u044B",\r
-bgcolor:"\u043A\u043E\u043B\u0456\u0440 \u0444\u043E\u043D\u0443",\r
+bordercolor:"\u041A\u043E\u043B\u0456\u0440 \u0433\u0440\u0430\u043D\u0438\u0446\u0456",\r
+bgcolor:"\u041A\u043E\u043B\u0456\u0440 \u0444\u043E\u043D\u0443",\r
 merge_cells_title:"\u041E\u0431'\u0454\u0434\u043D\u0430\u0442\u0438 \u043A\u043E\u043C\u0456\u0440\u043A\u0438",\r
-id:"Id",\r
+id:"\u0406\u0434\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0430\u0442\u043E\u0440",\r
 style:"\u0421\u0442\u0438\u043B\u044C",\r
 langdir:"\u041D\u0430\u043F\u0440\u044F\u043C \u043C\u043E\u0432\u0438",\r
 langcode:"\u041A\u043E\u0434 \u043C\u043E\u0432\u0438",\r
-mime:"Target MIME-\u0442\u0438\u043F",\r
-ltr:"\u0417\u043B\u0456\u0432\u0430 \u043F\u0440\u0430\u0432\u043E\u0440\u0443\u0447",\r
-rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043B\u0456\u0432\u043E\u0440\u0443\u0447",\r
+mime:"MIME-\u0442\u0438\u043F \u0446\u0456\u043B\u0456",\r
+ltr:"\u0417\u043B\u0456\u0432\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u043E",\r
+rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0456\u0432\u043E",\r
 bgimage:"\u0424\u043E\u043D\u043E\u0432\u0435 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F",\r
 summary:"\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0435",\r
 td:"\u0414\u0430\u043D\u043D\u0456",\r
@@ -43,32 +43,32 @@ cell_all:"\u041E\u043D\u043E\u0432\u0438\u0442\u0438 \u0432\u0441\u0456 \u043A\u
 row_row:"\u041E\u043D\u043E\u0432\u0438\u0442\u0438 \u043F\u043E\u0442\u043E\u0447\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A",\r
 row_odd:"\u041E\u043D\u043E\u0432\u0438\u0442\u0438 \u043D\u0435\u043F\u0430\u0440\u043D\u0456 \u0440\u044F\u0434\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446",\r
 row_even:"\u041E\u043D\u043E\u0432\u0438\u0442\u0438 \u043F\u0430\u0440\u043D\u0456 \u0440\u044F\u0434\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0456",\r
-row_all:"\u043D\u043E\u0432\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u044F\u0434\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0456",\r
+row_all:"\u041E\u043D\u043E\u0432\u0438\u0442\u0438 \u0432\u0441\u0456 \u0440\u044F\u0434\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0456",\r
 thead:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0442\u0430\u0431\u043B\u0438\u0446\u0456",\r
 tbody:"\u0422\u0456\u043B\u043E \u0442\u0430\u0431\u043B\u0438\u0446\u0456",\r
-tfoot:"\u041D\u0438\u0436\u043D\u044F \u0447\u0430\u0441\u0442\u0441\u0438\u043D\u0430",\r
-scope:"Scope",\r
-rowgroup:"Row Group",\r
-colgroup:"Col Group",\r
-col_limit:"You've exceeded the maximum number of columns of {$cols}.",\r
-row_limit:"You've exceeded the maximum number of rows of {$rows}.",\r
-cell_limit:"You've exceeded the maximum number of cells of {$cells}.",\r
-missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
-caption:"Table caption",\r
+tfoot:"\u041D\u0438\u0436\u043D\u044F \u0447\u0430\u0441\u0442\u0438\u043D\u0430",\r
+scope:"\u0420\u043E\u0437\u043C\u0430\u0445",\r
+rowgroup:"\u0413\u0440\u0443\u043F\u0430 \u043A\u043E\u043C\u0456\u0440\u043E\u043A",\r
+colgroup:"\u0413\u0440\u0443\u043F\u0430 \u0441\u0442\u043E\u0432\u043F\u0446\u0456\u0432",\r
+col_limit:"\u0412\u0438 \u043F\u0435\u0440\u0435\u0432\u0438\u0449\u0438\u043B\u0438 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0443 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0441\u0442\u043E\u0432\u043F\u0446\u0456\u0432: {$cols}.",\r
+row_limit:"\u0412\u0438 \u043F\u0435\u0440\u0435\u0432\u0438\u0449\u0438\u043B\u0438 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0443 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0440\u044F\u0434\u043A\u0456\u0432: {$rows}.",\r
+cell_limit:"\u0412\u0438 \u043F\u0435\u0440\u0435\u0432\u0438\u0449\u0438\u043B\u0438 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0443 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043A\u043E\u043C\u0456\u0440\u043E\u043A: {$cells}.",\r
+missing_scope:"\u0412\u0438 \u0432\u043F\u0435\u0432\u043D\u0435\u043D\u0456, \u0449\u043E \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u043F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438 \u043D\u0435 \u0432\u043A\u0430\u0437\u0430\u0432\u0448\u0438 \u043C\u0435\u0436\u0456 \u0434\u043B\u044F \u0446\u0456\u0454\u0457 \u043A\u043E\u043C\u0456\u0440\u043A\u0438 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0443. \u0411\u0435\u0437 \u0446\u044C\u043E\u0433\u043E \u0434\u0435\u044F\u043A\u0438\u043C \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430\u043C \u0431\u0443\u0434\u0435 \u0432\u0430\u0436\u043A\u043E \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u0442\u0438 \u0437\u043C\u0456\u0441\u0442 \u0442\u0430\u0431\u043B\u0438\u0446\u0456.",\r
+caption:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0442\u0430\u0431\u043B\u0438\u0446\u0456",\r
 frame:"\u0424\u0440\u0435\u0439\u043C",\r
-frame_none:"none",\r
-frame_groups:"groups",\r
-frame_rows:"rows",\r
-frame_cols:"cols",\r
-frame_all:"all",\r
-rules:"Rules",\r
-rules_void:"void",\r
-rules_above:"above",\r
-rules_below:"below",\r
-rules_hsides:"hsides",\r
+frame_none:"\u043D\u0456\u044F\u043A\u0438\u0439",\r
+frame_groups:"\u0433\u0440\u0443\u043F\u0438",\r
+frame_rows:"\u0440\u044F\u0434\u043A\u0438",\r
+frame_cols:"\u0441\u0442\u043E\u0432\u043F\u0446\u0456",\r
+frame_all:"\u0432\u0441\u0456",\r
+rules:"\u041F\u0440\u0430\u0432\u0438\u043B\u0430",\r
+rules_void:"\u043F\u0443\u0441\u0442\u043E",\r
+rules_above:"\u0437\u0432\u0435\u0440\u0445\u0443",\r
+rules_below:"\u0437\u043D\u0438\u0437\u0443",\r
+rules_hsides:"h-\u0441\u0442\u043E\u0440\u043E\u043D\u0438",\r
 rules_lhs:"lhs",\r
 rules_rhs:"rhs",\r
-rules_vsides:"vsides",\r
-rules_box:"box",\r
-rules_border:"border"\r
+rules_vsides:"v-\u0441\u0442\u043E\u0440\u043E\u043D\u0438",\r
+rules_box:"\u0431\u043E\u043A\u0441",\r
+rules_border:"\u0440\u0430\u043C\u043A\u0430"\r
 });
\ No newline at end of file
index 3c198e2702921f1746b61242ffe7f4382ea45a05..d851a2ac86c829183ebe203b6dd00582246e96fa 100755 (executable)
@@ -1,74 +1,74 @@
 tinyMCE.addI18n('vi.table_dlg',{\r
-general_tab:"C\u01A1 b\u1EA3n",\r
+general_tab:"Chung",\r
 advanced_tab:"N\u00E2ng cao",\r
-general_props:"T\u00F9y ch\u1ECDn c\u01A1 b\u1EA3n",\r
-advanced_props:"T\u00F9y ch\u1ECDn n\u00E2ng cao",\r
-rowtype:"Row in table part",\r
-title:"Ch\u00E8n/thay \u0111\u1ED5i b\u1EA3ng",\r
+general_props:"Thu\u1ED9c t\u00EDnh chung",\r
+advanced_props:"Thu\u1ED9c t\u00EDnh n\u00E2ng cao",\r
+rowtype:"H\u00E0ng trong t\u1EEBng ph\u1EA7n b\u1EA3ng",\r
+title:"Ch\u00E8n/S\u1EEDa b\u1EA3ng",\r
 width:"Chi\u1EC1u r\u1ED9ng",\r
 height:"Chi\u1EC1u cao",\r
-cols:"S\u1ED1 c\u1ED9t",\r
-rows:"S\u1ED1 d\u00F2ng",\r
-cellspacing:"Kho\u1EA3ng c\u00E1ch ngang",\r
-cellpadding:"Kho\u1EA3ng c\u00E1ch d\u1ECDc",\r
-border:"\u0110\u01B0\u1EDDng vi\u1EC1n",\r
+cols:"C\u1ED9t",\r
+rows:"H\u00E0ng",\r
+cellspacing:"Kho\u1EA3ng c\u00E1ch \u00F4",\r
+cellpadding:"Kho\u1EA3ng l\u00F3t \u00F4",\r
+border:"Vi\u1EC1n",\r
 align:"Canh l\u1EC1",\r
 align_default:"M\u1EB7c \u0111\u1ECBnh",\r
 align_left:"Tr\u00E1i",\r
 align_right:"Ph\u1EA3i",\r
 align_middle:"Gi\u1EEFa",\r
-row_title:"Thay \u0111\u1ED5i thu\u1ED9c t\u00EDnh d\u00F2ng",\r
-cell_title:"Thay \u0111\u1ED5i thu\u1ED9c t\u00EDnh \u00F4",\r
-cell_type:"Cell type",\r
+row_title:"Thu\u1ED9c t\u00EDnh h\u00E0ng",\r
+cell_title:"Thu\u1ED9c t\u00EDnh \u00F4",\r
+cell_type:"Lo\u1EA1i \u00F4",\r
 valign:"Canh l\u1EC1 d\u1ECDc",\r
 align_top:"Tr\u00EAn",\r
 align_bottom:"D\u01B0\u1EDBi",\r
-bordercolor:"M\u00E0u \u0111\u01B0\u1EDDng vi\u1EC1n",\r
+bordercolor:"M\u00E0u vi\u1EC1n",\r
 bgcolor:"M\u00E0u n\u1EC1n",\r
-merge_cells_title:"G\u1ED9p \u00F4",\r
+merge_cells_title:"K\u1EBFt h\u1EE3p c\u00E1c \u00F4 c\u1EE7a b\u1EA3ng",\r
 id:"Id",\r
-style:"Style",\r
-langdir:"Language direction",\r
-langcode:"Language code",\r
-mime:"Target MIME type",\r
-ltr:"Left to right",\r
-rtl:"Right to left",\r
-bgimage:"Background image",\r
-summary:"Summary",\r
-td:"Data",\r
-th:"Header",\r
-cell_cell:"C\u1EADp nh\u1EADt \u00F4 hi\u1EC7n t\u1EA1i",\r
-cell_row:"C\u1EADp nh\u1EADt t\u1EA5t c\u1EA3 \u00F4 c\u00F3 tr\u00EAn d\u00F2ng",\r
-cell_all:"C\u1EADp nh\u1EADt t\u1EA5t c\u1EA3 \u00F4 c\u00F3 trong b\u1EA3ng",\r
-row_row:"C\u1EADp nh\u1EADt d\u00F2ng hi\u1EC7n t\u1EA1i",\r
-row_odd:"C\u1EADp nh\u1EADt d\u00F2ng l\u1EBB c\u00F3 trong b\u1EA3ng",\r
-row_even:"C\u1EADp nh\u1EADt d\u00F2ng ch\u1EB5n c\u00F3 trong b\u1EA3ng",\r
-row_all:"C\u1EADp nh\u1EADt t\u1EA5t c\u1EA3 d\u00F2ng c\u00F3 trong b\u1EA3ng",\r
-thead:"Ph\u1EA7n \u0111\u1EA7u b\u1EA3ng",\r
-tbody:"Ph\u1EA7n th\u00E2n b\u1EA3ng",\r
-tfoot:"Ph\u1EA7n cu\u1ED1i b\u1EA3ng",\r
-scope:"Scope",\r
-rowgroup:"Row Group",\r
-colgroup:"Col Group",\r
-col_limit:"You've exceeded the maximum number of columns of {$cols}.",\r
-row_limit:"You've exceeded the maximum number of rows of {$rows}.",\r
-cell_limit:"You've exceeded the maximum number of cells of {$cells}.",\r
-missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",\r
-caption:"Th\u00EAm ti\u00EAu \u0111\u1EC1 cho b\u1EA3ng",\r
-frame:"Frame",\r
-frame_none:"none",\r
-frame_groups:"groups",\r
-frame_rows:"rows",\r
-frame_cols:"cols",\r
-frame_all:"all",\r
-rules:"Rules",\r
-rules_void:"void",\r
-rules_above:"above",\r
-rules_below:"below",\r
+style:"Ki\u1EC3u d\u00E1ng",\r
+langdir:"H\u01B0\u1EDBng ng\u00F4n ng\u1EEF",\r
+langcode:"M\u00E3 ng\u00F4n ng\u1EEF",\r
+mime:"Ki\u1EC3u MIME \u0111\u00EDch",\r
+ltr:"Tr\u00E1i qua ph\u1EA3i",\r
+rtl:"Ph\u1EA3i qua tr\u00E1i",\r
+bgimage:"\u1EA2nh n\u1EC1n",\r
+summary:"T\u00F3m l\u01B0\u1EE3c",\r
+td:"D\u1EEF li\u1EC7u",\r
+th:"\u0110\u1EA7u \u0111\u1EC1",\r
+cell_cell:"C\u1EADp nh\u1EADt \u00F4 hi\u1EC7n th\u1EDDi",\r
+cell_row:"C\u1EADp nh\u1EA5t t\u1EA5t c\u00E1c \u00F4 trong h\u00E0ng",\r
+cell_all:"C\u1EADp nh\u1EA5t t\u1EA5t c\u00E1c \u00F4 trong b\u1EA3ng",\r
+row_row:"C\u1EADp nh\u1EADt h\u00E0ng hi\u1EC7n th\u1EDDi",\r
+row_odd:"C\u1EADp nh\u1EADt h\u00E0ng l\u1EBB trong b\u1EA3ng",\r
+row_even:"C\u1EADp nh\u1EADt h\u00E0ng ch\u1EB5n trong b\u1EA3ng",\r
+row_all:"C\u1EADp nh\u1EADt t\u1EA5t h\u00E0ng trong b\u1EA3ng",\r
+thead:"\u0110\u1EA7u b\u1EA3ng",\r
+tbody:"Th\u00E2n b\u1EA3n",\r
+tfoot:"Ch\u00E2n b\u1EA3ng",\r
+scope:"Ph\u1EA1m vi",\r
+rowgroup:"Nh\u00F3m h\u00E0ng",\r
+colgroup:"Nh\u00F3m c\u1ED9t",\r
+col_limit:"B\u1EA1n \u0111\u00E3 v\u01B0\u1EE3t qu\u00E1 s\u1ED1 t\u1ED1i \u0111a c\u1ED9t c\u1EE7a {$cols}.",\r
+row_limit:"B\u1EA1n \u0111\u00E3 v\u01B0\u1EE3t qu\u00E1 s\u1ED1 t\u1ED1i \u0111a h\u00E0ng c\u1EE7a {$rows}.",\r
+cell_limit:"B\u1EA1n \u0111\u00E3 v\u01B0\u1EE3t qu\u00E1 s\u1ED1 t\u1ED1i \u0111a \u00F4 c\u1EE7a {$cells}.",\r
+missing_scope:"B\u1EA1n c\u00F3 ch\u1EAFc ch\u1EAFn mu\u1ED1n ti\u1EBFp th\u1EE5c  v\u1EDBi vi\u1EC7c kh\u00F4ng ch\u1EC9 \u0111\u1ECBnh ph\u1EA1m vi cho \u00F4 ti\u00EAu \u0111\u1EC1 c\u1EE7a b\u1EA3ng n\u00E0y. Kh\u00F4ng c\u00F3 n\u00F3, \u0111i\u1EC1u n\u00E0y c\u00F3 th\u1EC3 kh\u00F3 kh\u0103n cho m\u1ED9t s\u1ED1 ng\u01B0\u1EDDi d\u00F9ng khuy\u1EBFt t\u1EADt \u0111\u1EC3 hi\u1EC3u n\u1ED9i dung ho\u1EB7c d\u1EEF li\u1EC7u hi\u1EC3n th\u1ECB c\u1EE7a b\u1EA3ng.",\r
+caption:"Ch\u00FA t\u00EDch b\u1EA3ng",\r
+frame:"Khung",\r
+frame_none:"kh\u00F4ng",\r
+frame_groups:"nh\u00F3m",\r
+frame_rows:"h\u00E0ng",\r
+frame_cols:"c\u1ED9t",\r
+frame_all:"t\u1EA5t",\r
+rules:"Th\u01B0\u1EDBc",\r
+rules_void:"tr\u1ED1ng kh\u00F4ng",\r
+rules_above:"tr\u00EAn",\r
+rules_below:"d\u01B0\u1EDBi",\r
 rules_hsides:"hsides",\r
 rules_lhs:"lhs",\r
 rules_rhs:"rhs",\r
 rules_vsides:"vsides",\r
 rules_box:"box",\r
-rules_border:"border"\r
+rules_border:"vi\u1EC1n"\r
 });
\ No newline at end of file
index 569a640cfc74637107e7ee90c7568adb5394e26a..db7dc0d34701cdaebfa51f4990373acb33b0e5b8 100755 (executable)
@@ -1,74 +1,74 @@
 tinyMCE.addI18n('zh.table_dlg',{\r
-general_tab:"\u57FA\u672C",\r
+general_tab:"\u4E00\u822C",\r
 advanced_tab:"\u9AD8\u7EA7",\r
 general_props:"\u4E00\u822C\u5C5E\u6027",\r
 advanced_props:"\u9AD8\u7EA7\u5C5E\u6027",\r
-rowtype:"\u5217\u6240\u5728\u7684\u8868\u683C\u4F4D\u7F6E",\r
+rowtype:"\u680F\u6240\u5728\u7684\u8868\u683C\u4F4D\u7F6E",\r
 title:"\u63D2\u5165/\u7F16\u8F91\u8868\u683C",\r
-width:"\u5BBD",\r
-height:"\u9AD8",\r
-cols:"\u680F\u6570",\r
-rows:"\u5217\u6570",\r
-cellspacing:"\u5355\u5143\u683C\u95F4\u8DDD",\r
-cellpadding:"\u5355\u5143\u683C\u5185\u8DDD",\r
+width:"\u5BBD\u5EA6",\r
+height:"\u9AD8\u5EA6",\r
+cols:"\u5217\u6570",\r
+rows:"\u680F\u6570",\r
+cellspacing:"\u8868\u683C\u95F4\u8DDD",\r
+cellpadding:"\u8865\u767D\u5C3A\u5BF8",\r
 border:"\u8FB9\u6846",\r
 align:"\u5BF9\u9F50\u65B9\u5F0F",\r
 align_default:"\u9884\u8BBE",\r
-align_left:"\u7F6E\u5DE6",\r
-align_right:"\u7F6E\u53F3",\r
-align_middle:"\u7F6E\u4E2D",\r
-row_title:"\u4F8B\u6807\u9898",\r
-cell_title:"\u5355\u5143\u683C\u6807\u9898",\r
-cell_type:"\u5355\u5143\u683C\u7C7B\u578B",\r
-valign:"\u5782\u76F4\u5BF9\u9F50\u65B9\u5F0F",\r
-align_top:"\u9876\u90E8",\r
-align_bottom:"\u5E95\u90E8",\r
+align_left:"\u9760\u5DE6\u5BF9\u9F50",\r
+align_right:"\u9760\u53F3\u5BF9\u9F50",\r
+align_middle:"\u5C45\u4E2D\u5BF9\u9F50",\r
+row_title:"\u680F\u5C5E\u6027",\r
+cell_title:"\u8868\u683C\u5C5E\u6027",\r
+cell_type:"\u8868\u683C\u7C7B\u578B",\r
+valign:"\u5BF9\u9F50\u65B9\u5F0F",\r
+align_top:"\u4E0A\u65B9",\r
+align_bottom:"\u4E0B\u65B9",\r
 bordercolor:"\u8FB9\u6846\u989C\u8272",\r
 bgcolor:"\u80CC\u666F\u989C\u8272",\r
-merge_cells_title:"\u5408\u5E76\u5355\u5143\u683C",\r
-id:"ID",\r
+merge_cells_title:"\u5408\u5E76\u8868\u683C",\r
+id:"ID \u503C",\r
 style:"\u6837\u5F0F",\r
-langdir:"\u8BED\u8A00\u4E66\u5199\u65B9\u5411",\r
+langdir:"\u6587\u5B57\u6392\u5217\u65B9\u5F0F",\r
 langcode:"\u8BED\u8A00\u7F16\u7801",\r
-mime:"\u76EE\u6807MIME\u7C7B\u578B",\r
-ltr:"\u4ECE\u5DE6\u5230\u53F3",\r
-rtl:"\u4ECE\u53F3\u5230\u5DE6",\r
-bgimage:"\u80CC\u666F\u56FE\u6863",\r
-summary:"\u6458\u8981",\r
-td:"\u8D44\u6599",\r
-th:"\u8868\u5934",\r
-cell_cell:"\u66F4\u65B0\u5F53\u524D\u5355\u5143\u683C",\r
-cell_row:"\u66F4\u65B0\u76EE\u524D\u5217\u7684\u5355\u5143\u683C",\r
-cell_all:"\u66F4\u65B0\u6240\u6709\u5355\u5143\u683C",\r
-row_row:"\u66F4\u65B0\u76EE\u524D\u5217",\r
-row_odd:"\u66F4\u65B0\u8868\u683C\u7684\u5947\u6570\u5217",\r
-row_even:"\u66F4\u65B0\u8868\u683C\u7684\u5076\u6570\u5217",\r
-row_all:"\u66F4\u65B0\u8868\u683C\u7684\u6240\u6709\u5217",\r
-thead:"\u8868\u683C\u8868\u5934",\r
-tbody:"\u8868\u683C\u4E3B\u4F53",\r
-tfoot:"\u8868\u683C\u811A\u6CE8",\r
+mime:"MIME\u7C7B\u578B",\r
+ltr:"\u7531\u5DE6\u5230\u53F3",\r
+rtl:"\u7531\u53F3\u5230\u5DE6",\r
+bgimage:"\u80CC\u666F\u56FE\u7247",\r
+summary:"\u6982\u8981",\r
+td:"\u5355\u5143\u683C",\r
+th:"\u6807\u9898\u5355\u5143\u683C",\r
+cell_cell:"\u66F4\u65B0\u5355\u5143\u683C",\r
+cell_row:"\u66F4\u65B0\u5F53\u524D\u884C\u7684\u5168\u90E8\u5355\u5143\u683C",\r
+cell_all:"\u66F4\u65B0\u8868\u683C\u5185\u7684\u5168\u90E8\u5355\u5143\u683C",\r
+row_row:"\u66F4\u65B0\u6240\u5728\u680F",\r
+row_odd:"\u66F4\u65B0\u8868\u683C\u5185\u7684\u5947\u6570\u680F",\r
+row_even:"\u66F4\u65B0\u8868\u683C\u5185\u7684\u5076\u6570\u680F",\r
+row_all:"\u66F4\u65B0\u8868\u683C\u5185\u5168\u90E8\u680F",\r
+thead:"\u8868\u5934",\r
+tbody:"\u8868\u8EAB",\r
+tfoot:"\u8868\u5C3E",\r
 scope:"\u8303\u56F4",\r
-rowgroup:"\u5217\u7FA4\u7EC4",\r
-colgroup:"\u680F\u7FA4\u7EC4",\r
-col_limit:"\u5DF2\u8D85\u8FC7\u6700\u5927\u680F\u6570\u9650\u5236{$cols}\u680F\u3002 ",\r
-row_limit:"\u5DF2\u8D85\u8FC7\u6700\u5927\u5217\u6570\u9650\u5236{$rows}\u5217\u3002 ",\r
-cell_limit:"\u5DF2\u8D85\u8FC7\u6700\u5927\u5355\u5143\u683C\u9650\u5236{$cells}\u5355\u5143\u683C\u3002 ",\r
-missing_scope:"\u60A8\u786E\u5B9A\u4E0D\u6307\u5B9A\u8868\u5934\u5355\u5143\u683C\u7684\u8303\u56F4\u5417\uFF1F\u5982\u679C\u4E0D\u6307\u5B9A\uFF0C\u90E8\u5206\u7528\u6237\u5C06\u5F88\u96BE\u67E5\u770B\u8868\u683C\u5185\u5BB9\u3002 ",\r
+rowgroup:"\u884C\u7FA4\u7EC4",\r
+colgroup:"\u5217\u7FA4\u7EC4",\r
+col_limit:"\u7A0B\u5F0F\u9519\u8BEF\uFF0C\u6700\u9AD8\u7684\u5217\u6570\u4E3A{$cols} \u5217\u3002 ",\r
+row_limit:"\u7A0B\u5F0F\u9519\u8BEF\uFF0C\u6700\u9AD8\u7684\u884C\u6570\u4E3A{$rows} \u680F\u3002 ",\r
+cell_limit:"\u7A0B\u5F0F\u9519\u8BEF\uFF0C\u6700\u9AD8\u7684\u5355\u5143\u683C\u6570\u4E3A{$cells} \u683C\u3002 ",\r
+missing_scope:"\u7F3A\u5C11\u6807\u9898",\r
 caption:"\u8868\u683C\u6807\u9898",\r
-frame:"\u7A97\u6846",\r
+frame:"\u6846\u67B6",\r
 frame_none:"\u65E0",\r
 frame_groups:"\u7FA4\u7EC4",\r
-frame_rows:"\u5217",\r
-frame_cols:"\u680F",\r
+frame_rows:"\u884C",\r
+frame_cols:"\u5217",\r
 frame_all:"\u5168\u90E8",\r
-rules:"\u6807\u5C3A",\r
+rules:"\u6805\u683C",\r
 rules_void:"\u7A7A",\r
-rules_above:"\u4E4B\u4E0A",\r
-rules_below:"\u4E4B\u4E0B",\r
-rules_hsides:"\u6C34\u5E73\u5927\u5C0F",\r
-rules_lhs:"lhs",\r
-rules_rhs:"rhs",\r
-rules_vsides:"\u5782\u76F4\u5927\u5C0F",\r
-rules_box:"\u76D2",\r
-rules_border:"\u6846\u7EBF"\r
+rules_above:"\u4E0A",\r
+rules_below:"\u4E0B",\r
+rules_hsides:"\u6C34\u5E73",\r
+rules_lhs:"\u5DE6\u8FB9",\r
+rules_rhs:"\u53F3\u8FB9",\r
+rules_vsides:"\u5782\u76F4",\r
+rules_box:"\u76D2\u578B",\r
+rules_border:"\u5916\u6846"\r
 });
\ No newline at end of file
index 25d42eb6574b976c7a6c93e1c16b18a01fac8b22..9736ed8c03f09248ed515235d963d0fb05d57567 100644 (file)
@@ -8,7 +8,7 @@
        <script type="text/javascript" src="js/merge_cells.js"></script>\r
 </head>\r
 <body style="margin: 8px">\r
-<form onsubmit="mergeCells();return false;" action="#">\r
+<form onsubmit="MergeCellsDialog.merge();return false;" action="#">\r
        <fieldset>\r
                <legend>{#table_dlg.merge_cells_title}</legend>\r
                  <table border="0" cellpadding="0" cellspacing="3" width="100%">\r
        </fieldset>\r
 \r
        <div class="mceActionPanel">\r
-               <div style="float: left">\r
-                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
-               </div>\r
-\r
-               <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-               </div>\r
+               <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
        </div>\r
 </form>\r
 </body>\r
index 07ca13c983249a7a4b313540f46ac0b4d5974297..092e6c8270e23825ce47634d98ca6847e83d37dd 100644 (file)
                                </select>\r
                        </div>\r
 \r
-                       <div style="float: left">\r
-                               <div><input type="submit" id="insert" name="insert" value="{#update}" /></div>\r
-                       </div>\r
-\r
-                       <div style="float: right">\r
-                               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-                       </div>\r
+                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
                </div>\r
        </form>\r
 </body>\r
index 2a138513cb58a7caff91b8f7cd59f9b80281321c..f269039228dbe343035e21544b92378aa230fe11 100644 (file)
                                                </tr>\r
 \r
                                                <tr>\r
-                                                       <td class="column1"><label for="frame">{#table_dlg.frame}</label></td> \r
+                                                       <td class="column1"><label for="tframe">{#table_dlg.frame}</label></td> \r
                                                        <td>\r
-                                                               <select id="frame" name="frame" class="advfield"> \r
+                                                               <select id="tframe" name="tframe" class="advfield"> \r
                                                                                <option value="">{#not_set}</option>\r
                                                                                <option value="void">{#table_dlg.rules_void}</option>\r
                                                                                <option value="above">{#table_dlg.rules_above}</option> \r
                </div>\r
 \r
                <div class="mceActionPanel">\r
-                       <div style="float: left">\r
-                               <input type="submit" id="insert" name="insert" value="{#insert}" />\r
-                       </div>\r
-\r
-                       <div style="float: right">\r
-                               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-                       </div>\r
+                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
                </div>\r
        </form>\r
 </body>\r
index 02ec4e6982bb99339a659e64fa6db671430defa7..0a5275fe284898be6a1c688f6b036a8125637ada 100644 (file)
@@ -1,8 +1,11 @@
 /**\r
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ * editor_plugin_src.js\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 (function() {\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/abbr.htm b/program/js/tiny_mce/plugins/xhtmlxtras/abbr.htm
deleted file mode 100644 (file)
index 3928a17..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml">\r
-<head>\r
-       <title>{#xhtmlxtras_dlg.title_abbr_element}</title>\r
-       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
-       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
-       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
-       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
-       <script type="text/javascript" src="js/element_common.js"></script>\r
-       <script type="text/javascript" src="js/abbr.js"></script>\r
-       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
-</head>\r
-<body style="display: none">\r
-<form onsubmit="insertAbbr();return false;" action="#">\r
-       <div class="tabs">\r
-               <ul>\r
-                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li>\r
-                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->\r
-               </ul>\r
-       </div>\r
-\r
-       <div class="panel_wrapper">\r
-               <div id="general_panel" class="panel current">\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> \r
-                                               <td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> \r
-                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> \r
-                                               <td>\r
-                                                       <select id="class" name="class" class="field mceEditableSelect">\r
-                                                               <option value="">{#not_set}</option> \r
-                                                       </select>\r
-                                               </td>\r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> \r
-                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> \r
-                                               <td>\r
-                                                       <select id="dir" name="dir" class="field"> \r
-                                                               <option value="">{#not_set}</option> \r
-                                                               <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> \r
-                                                               <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> \r
-                                                       </select>\r
-                                               </td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> \r
-                                               <td>\r
-                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
-                                               </td> \r
-                                       </tr>\r
-                               </table>\r
-                       </fieldset>\r
-               </div>\r
-               <div id="events_panel" class="panel">\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>\r
-\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
-                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
-                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
-                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
-                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
-                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
-                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
-                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
-                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
-                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
-                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
-                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
-                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                               </table>\r
-                       </fieldset>\r
-               </div>\r
-       </div>\r
-       <div class="mceActionPanel">\r
-               <div style="float: left">\r
-                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
-               </div>\r
-               <div style="float: left">\r
-                       <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeAbbr();" style="display: none;" />\r
-               </div>\r
-               <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-               </div>\r
-       </div>\r
-\r
-</form>\r
-</body>\r
-</html>\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/acronym.htm b/program/js/tiny_mce/plugins/xhtmlxtras/acronym.htm
deleted file mode 100644 (file)
index 4d4ebaa..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml">\r
-<head>\r
-       <title>{#xhtmlxtras_dlg.title_acronym_element}</title>\r
-       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
-       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
-       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
-       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
-       <script type="text/javascript" src="js/element_common.js"></script>\r
-       <script type="text/javascript" src="js/acronym.js"></script>\r
-       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
-</head>\r
-<body style="display: none">\r
-<form onsubmit="insertAcronym();return false;" action="#">\r
-       <div class="tabs">\r
-               <ul>\r
-                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li>\r
-                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->\r
-               </ul>\r
-       </div>\r
-\r
-       <div class="panel_wrapper">\r
-               <div id="general_panel" class="panel current">\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> \r
-                                               <td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> \r
-                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> \r
-                                               <td>\r
-                                                       <select id="class" name="class" class="field mceEditableSelect">\r
-                                                               <option value="">{#not_set}</option> \r
-                                                       </select>\r
-                                               </td>\r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> \r
-                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> \r
-                                               <td>\r
-                                                       <select id="dir" name="dir" class="field"> \r
-                                                               <option value="">{#not_set}</option> \r
-                                                               <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> \r
-                                                               <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> \r
-                                                       </select>\r
-                                               </td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> \r
-                                               <td>\r
-                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
-                                               </td> \r
-                                       </tr>\r
-                               </table>\r
-                       </fieldset>\r
-               </div>\r
-               <div id="events_panel" class="panel">\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>\r
-\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
-                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
-                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
-                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
-                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
-                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
-                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
-                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
-                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
-                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
-                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
-                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
-                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                               </table>\r
-                       </fieldset>\r
-               </div>\r
-       </div>\r
-       <div class="mceActionPanel">\r
-               <div style="float: left">\r
-                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
-               </div>\r
-               <div style="float: left">\r
-                       <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeAcronym();" style="display: none;" />\r
-               </div>\r
-               <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-               </div>\r
-       </div>\r
-\r
-</form>\r
-</body>\r
-</html>\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/attributes.htm b/program/js/tiny_mce/plugins/xhtmlxtras/attributes.htm
deleted file mode 100644 (file)
index 322b468..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml">\r
-<head>\r
-       <title>{#xhtmlxtras_dlg.attribs_title}</title>\r
-       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
-       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
-       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
-       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
-       <script type="text/javascript" src="js/attributes.js"></script>\r
-       <link rel="stylesheet" type="text/css" href="css/attributes.css" />\r
-</head>\r
-<body style="display: none">\r
-<form onsubmit="insertAction();return false;" action="#">\r
-       <div class="tabs">\r
-               <ul>\r
-                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.attribute_attrib_tab}</a></span></li>\r
-                       <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.attribute_events_tab}</a></span></li>\r
-               </ul>\r
-       </div>\r
-\r
-       <div class="panel_wrapper">\r
-               <div id="general_panel" class="panel current">\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.attribute_attrib_tab}</legend>\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> \r
-                                               <td><input id="title" name="title" type="text" value="" class="mceFocus" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> \r
-                                               <td><input id="id" name="id" type="text" value="" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td><label id="classlabel" for="classlist">{#class_name}</label></td>\r
-                                               <td>\r
-                                                       <select id="classlist" name="classlist" class="mceEditableSelect">\r
-                                                               <option value="" selected="selected">{#not_set}</option>\r
-                                                       </select>\r
-                                               </td>\r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="stylelabel" for="style">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> \r
-                                               <td><input id="style" name="style" type="text" value="" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> \r
-                                               <td>\r
-                                                       <select id="dir" name="dir"> \r
-                                                               <option value="">{#not_set}</option> \r
-                                                               <option value="ltr">{#xhtmlxtras_dlg.option_ltr}</option> \r
-                                                               <option value="rtl">{#xhtmlxtras_dlg.option_rtl}</option> \r
-                                                       </select>\r
-                                               </td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> \r
-                                               <td>\r
-                                                       <input id="lang" name="lang" type="text" value="" />\r
-                                               </td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                                       <td><label id="tabindexlabel" for="tabindex">{#xhtmlxtras_dlg.attribute_label_tabindex}</label></td>\r
-                                                       <td><input type="text" id="tabindex" name="tabindex" value="" /></td>\r
-                                               </tr>\r
-\r
-                                               <tr>\r
-                                                       <td><label id="accesskeylabel" for="accesskey">{#xhtmlxtras_dlg.attribute_label_accesskey}</label></td>\r
-                                                       <td><input type="text" id="accesskey" name="accesskey" value="" /></td>\r
-                                               </tr>\r
-                               </table>\r
-                       </fieldset>\r
-               </div>\r
-               <div id="events_panel" class="panel">\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.attribute_events_tab}</legend>\r
-\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
-                                               <td><input id="onfocus" name="onfocus" type="text" value="" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
-                                               <td><input id="onblur" name="onblur" type="text" value="" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
-                                               <td><input id="onclick" name="onclick" type="text" value="" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
-                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
-                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
-                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
-                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
-                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
-                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
-                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
-                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
-                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" /></td> \r
-                                       </tr>\r
-                               </table>\r
-                       </fieldset>\r
-               </div>\r
-       </div>\r
-       <div class="mceActionPanel">\r
-               <div style="float: left">\r
-                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
-               </div>\r
-               <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-               </div>\r
-       </div>\r
-\r
-</form>\r
-</body>\r
-</html>\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/cite.htm b/program/js/tiny_mce/plugins/xhtmlxtras/cite.htm
deleted file mode 100644 (file)
index cdfaf4e..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml">\r
-<head>\r
-       <title>{#xhtmlxtras_dlg.title_cite_element}</title>\r
-       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
-       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
-       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
-       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
-       <script type="text/javascript" src="js/element_common.js"></script>\r
-       <script type="text/javascript" src="js/cite.js"></script>\r
-       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
-</head>\r
-<body style="display: none">\r
-<form onsubmit="insertCite();return false;" action="#">\r
-       <div class="tabs">\r
-               <ul>\r
-                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li>\r
-                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->\r
-               </ul>\r
-       </div>\r
-\r
-       <div class="panel_wrapper">\r
-               <div id="general_panel" class="panel current">\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> \r
-                                               <td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> \r
-                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> \r
-                                               <td>\r
-                                                       <select id="class" name="class" class="field mceEditableSelect">\r
-                                                               <option value="">{#not_set}</option> \r
-                                                       </select>\r
-                                               </td>\r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> \r
-                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> \r
-                                               <td>\r
-                                                       <select id="dir" name="dir" class="field"> \r
-                                                               <option value="">{#not_set}</option> \r
-                                                               <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> \r
-                                                               <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> \r
-                                                       </select>\r
-                                               </td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> \r
-                                               <td>\r
-                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
-                                               </td> \r
-                                       </tr>\r
-                               </table>\r
-                       </fieldset>\r
-               </div>\r
-               <div id="events_panel" class="panel">\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>\r
-\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
-                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
-                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
-                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
-                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
-                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
-                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
-                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
-                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
-                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
-                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
-                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
-                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                               </table>\r
-                       </fieldset>\r
-               </div>\r
-       </div>\r
-       <div class="mceActionPanel">\r
-               <div style="float: left">\r
-                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
-               </div>\r
-               <div style="float: left">\r
-                       <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeCite();" style="display: none;" />\r
-               </div>\r
-               <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-               </div>\r
-       </div>\r
-\r
-</form>\r
-</body>\r
-</html>\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/css/attributes.css b/program/js/tiny_mce/plugins/xhtmlxtras/css/attributes.css
deleted file mode 100644 (file)
index 9a6a235..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-.panel_wrapper div.current {\r
-       height: 290px;\r
-}\r
-\r
-#id, #style, #title, #dir, #hreflang, #lang, #classlist, #tabindex, #accesskey {\r
-       width: 200px;\r
-}\r
-\r
-#events_panel input {\r
-       width: 200px;\r
-}\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/css/popup.css b/program/js/tiny_mce/plugins/xhtmlxtras/css/popup.css
deleted file mode 100644 (file)
index e67114d..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-input.field, select.field {width:200px;}\r
-input.picker {width:179px; margin-left: 5px;}\r
-input.disabled {border-color:#F2F2F2;}\r
-img.picker {vertical-align:text-bottom; cursor:pointer;}\r
-h1 {padding: 0 0 5px 0;}\r
-.panel_wrapper div.current {height:160px;}\r
-#xhtmlxtrasdel .panel_wrapper div.current, #xhtmlxtrasins .panel_wrapper div.current {height: 230px;}\r
-a.browse span {display:block; width:20px; height:20px; background:url('../../../themes/advanced/img/icons.gif') -140px -20px;}\r
-#datetime {width:180px;}\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css b/program/js/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css
deleted file mode 100644 (file)
index 6838d90..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-ins {\r
-       border-bottom: 1px solid green;\r
-       text-decoration: none;\r
-       color: green;\r
-}\r
-\r
-del {\r
-       color: Red;\r
-       text-decoration: line-through;\r
-}\r
-\r
-cite {\r
-       border-bottom: 1px dashed blue;\r
-}\r
-\r
-acronym {\r
-       border-bottom: 1px dotted #CCC;\r
-       cursor: help;\r
-}\r
-\r
-abbr, html\:abbr {\r
-       border-bottom: 1px dashed #CCC;\r
-       cursor: help;\r
-}\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/del.htm b/program/js/tiny_mce/plugins/xhtmlxtras/del.htm
deleted file mode 100644 (file)
index f45676e..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml">\r
-<head>\r
-       <title>{#xhtmlxtras_dlg.title_del_element}</title>\r
-       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
-       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
-       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
-       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
-       <script type="text/javascript" src="js/element_common.js"></script>\r
-       <script type="text/javascript" src="js/del.js"></script>\r
-       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
-</head>\r
-<body id="xhtmlxtrasins" style="display: none">\r
-<form onsubmit="insertDel();return false;" action="#">\r
-       <div class="tabs">\r
-               <ul>\r
-                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li>\r
-                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->\r
-               </ul>\r
-       </div>\r
-\r
-       <div class="panel_wrapper">\r
-               <div id="general_panel" class="panel current">\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.fieldset_general_tab}</legend>\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label id="datetimelabel" for="datetime">{#xhtmlxtras_dlg.attribute_label_datetime}</label>:</td>\r
-                                               <td>\r
-                                                       <table border="0" cellspacing="0" cellpadding="0">\r
-                                                               <tr> \r
-                                                                       <td><input id="datetime" name="datetime" type="text" value="" maxlength="19" class="field mceFocus" /></td> \r
-                                                                       <td><a href="javascript:insertDateTime('datetime');" onmousedown="return false;" class="browse"><span class="datetime" title="{#xhtmlxtras_dlg.insert_date}"></span></a></td>\r
-                                                               </tr>\r
-                                                       </table>\r
-                                               </td>\r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="citelabel" for="cite">{#xhtmlxtras_dlg.attribute_label_cite}</label>:</td>\r
-                                               <td><input id="cite" name="cite" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                               </table>\r
-                       </fieldset>\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> \r
-                                               <td><input id="title" name="title" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> \r
-                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> \r
-                                               <td>\r
-                                                       <select id="class" name="class" class="field mceEditableSelect">\r
-                                                               <option value="">{#not_set}</option> \r
-                                                       </select>\r
-                                               </td>\r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> \r
-                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> \r
-                                               <td>\r
-                                                       <select id="dir" name="dir" class="field"> \r
-                                                               <option value="">{#not_set}</option> \r
-                                                               <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> \r
-                                                               <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> \r
-                                                       </select>\r
-                                               </td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> \r
-                                               <td>\r
-                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
-                                               </td> \r
-                                       </tr>\r
-                               </table>\r
-                       </fieldset>\r
-               </div>\r
-               <div id="events_panel" class="panel">\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>\r
-\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
-                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
-                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
-                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
-                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
-                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
-                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
-                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
-                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
-                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
-                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
-                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
-                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                               </table>\r
-                       </fieldset>\r
-               </div>\r
-       </div>\r
-       <div class="mceActionPanel">\r
-               <div style="float: left">\r
-                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
-               </div>\r
-               <div style="float: left">\r
-                       <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeDel();" style="display: none;" />\r
-               </div>\r
-               <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-               </div>\r
-       </div>\r
-\r
-</form>\r
-\r
-</body>\r
-</html>\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/editor_plugin.js b/program/js/tiny_mce/plugins/xhtmlxtras/editor_plugin.js
deleted file mode 100644 (file)
index 8c7f48e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-(function(){tinymce.create("tinymce.plugins.XHTMLXtrasPlugin",{init:function(b,c){b.addCommand("mceCite",function(){b.windowManager.open({file:c+"/cite.htm",width:350+parseInt(b.getLang("xhtmlxtras.cite_delta_width",0)),height:250+parseInt(b.getLang("xhtmlxtras.cite_delta_height",0)),inline:1},{plugin_url:c})});b.addCommand("mceAcronym",function(){b.windowManager.open({file:c+"/acronym.htm",width:350+parseInt(b.getLang("xhtmlxtras.acronym_delta_width",0)),height:250+parseInt(b.getLang("xhtmlxtras.acronym_delta_width",0)),inline:1},{plugin_url:c})});b.addCommand("mceAbbr",function(){b.windowManager.open({file:c+"/abbr.htm",width:350+parseInt(b.getLang("xhtmlxtras.abbr_delta_width",0)),height:250+parseInt(b.getLang("xhtmlxtras.abbr_delta_width",0)),inline:1},{plugin_url:c})});b.addCommand("mceDel",function(){b.windowManager.open({file:c+"/del.htm",width:340+parseInt(b.getLang("xhtmlxtras.del_delta_width",0)),height:310+parseInt(b.getLang("xhtmlxtras.del_delta_width",0)),inline:1},{plugin_url:c})});b.addCommand("mceIns",function(){b.windowManager.open({file:c+"/ins.htm",width:340+parseInt(b.getLang("xhtmlxtras.ins_delta_width",0)),height:310+parseInt(b.getLang("xhtmlxtras.ins_delta_width",0)),inline:1},{plugin_url:c})});b.addCommand("mceAttributes",function(){b.windowManager.open({file:c+"/attributes.htm",width:380,height:370,inline:1},{plugin_url:c})});b.addButton("cite",{title:"xhtmlxtras.cite_desc",cmd:"mceCite"});b.addButton("acronym",{title:"xhtmlxtras.acronym_desc",cmd:"mceAcronym"});b.addButton("abbr",{title:"xhtmlxtras.abbr_desc",cmd:"mceAbbr"});b.addButton("del",{title:"xhtmlxtras.del_desc",cmd:"mceDel"});b.addButton("ins",{title:"xhtmlxtras.ins_desc",cmd:"mceIns"});b.addButton("attribs",{title:"xhtmlxtras.attribs_desc",cmd:"mceAttributes"});if(tinymce.isIE){function a(d,e){if(e.set){e.content=e.content.replace(/<abbr([^>]+)>/gi,"<html:abbr $1>");e.content=e.content.replace(/<\/abbr>/gi,"</html:abbr>")}}b.onBeforeSetContent.add(a);b.onPostProcess.add(a)}b.onNodeChange.add(function(e,d,g,f){g=e.dom.getParent(g,"CITE,ACRONYM,ABBR,DEL,INS");d.setDisabled("cite",f);d.setDisabled("acronym",f);d.setDisabled("abbr",f);d.setDisabled("del",f);d.setDisabled("ins",f);d.setDisabled("attribs",g&&g.nodeName=="BODY");d.setActive("cite",0);d.setActive("acronym",0);d.setActive("abbr",0);d.setActive("del",0);d.setActive("ins",0);if(g){do{d.setDisabled(g.nodeName.toLowerCase(),0);d.setActive(g.nodeName.toLowerCase(),1)}while(g=g.parentNode)}})},getInfo:function(){return{longname:"XHTML Xtras Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("xhtmlxtras",tinymce.plugins.XHTMLXtrasPlugin)})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js b/program/js/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js
deleted file mode 100644 (file)
index bef06f2..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/**\r
- * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-(function() {\r
-       tinymce.create('tinymce.plugins.XHTMLXtrasPlugin', {\r
-               init : function(ed, url) {\r
-                       // Register commands\r
-                       ed.addCommand('mceCite', function() {\r
-                               ed.windowManager.open({\r
-                                       file : url + '/cite.htm',\r
-                                       width : 350 + parseInt(ed.getLang('xhtmlxtras.cite_delta_width', 0)),\r
-                                       height : 250 + parseInt(ed.getLang('xhtmlxtras.cite_delta_height', 0)),\r
-                                       inline : 1\r
-                               }, {\r
-                                       plugin_url : url\r
-                               });\r
-                       });\r
-\r
-                       ed.addCommand('mceAcronym', function() {\r
-                               ed.windowManager.open({\r
-                                       file : url + '/acronym.htm',\r
-                                       width : 350 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)),\r
-                                       height : 250 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)),\r
-                                       inline : 1\r
-                               }, {\r
-                                       plugin_url : url\r
-                               });\r
-                       });\r
-\r
-                       ed.addCommand('mceAbbr', function() {\r
-                               ed.windowManager.open({\r
-                                       file : url + '/abbr.htm',\r
-                                       width : 350 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)),\r
-                                       height : 250 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)),\r
-                                       inline : 1\r
-                               }, {\r
-                                       plugin_url : url\r
-                               });\r
-                       });\r
-\r
-                       ed.addCommand('mceDel', function() {\r
-                               ed.windowManager.open({\r
-                                       file : url + '/del.htm',\r
-                                       width : 340 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)),\r
-                                       height : 310 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)),\r
-                                       inline : 1\r
-                               }, {\r
-                                       plugin_url : url\r
-                               });\r
-                       });\r
-\r
-                       ed.addCommand('mceIns', function() {\r
-                               ed.windowManager.open({\r
-                                       file : url + '/ins.htm',\r
-                                       width : 340 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)),\r
-                                       height : 310 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)),\r
-                                       inline : 1\r
-                               }, {\r
-                                       plugin_url : url\r
-                               });\r
-                       });\r
-\r
-                       ed.addCommand('mceAttributes', function() {\r
-                               ed.windowManager.open({\r
-                                       file : url + '/attributes.htm',\r
-                                       width : 380,\r
-                                       height : 370,\r
-                                       inline : 1\r
-                               }, {\r
-                                       plugin_url : url\r
-                               });\r
-                       });\r
-\r
-                       // Register buttons\r
-                       ed.addButton('cite', {title : 'xhtmlxtras.cite_desc', cmd : 'mceCite'});\r
-                       ed.addButton('acronym', {title : 'xhtmlxtras.acronym_desc', cmd : 'mceAcronym'});\r
-                       ed.addButton('abbr', {title : 'xhtmlxtras.abbr_desc', cmd : 'mceAbbr'});\r
-                       ed.addButton('del', {title : 'xhtmlxtras.del_desc', cmd : 'mceDel'});\r
-                       ed.addButton('ins', {title : 'xhtmlxtras.ins_desc', cmd : 'mceIns'});\r
-                       ed.addButton('attribs', {title : 'xhtmlxtras.attribs_desc', cmd : 'mceAttributes'});\r
-\r
-                       if (tinymce.isIE) {\r
-                               function fix(ed, o) {\r
-                                       if (o.set) {\r
-                                               o.content = o.content.replace(/<abbr([^>]+)>/gi, '<html:abbr $1>');\r
-                                               o.content = o.content.replace(/<\/abbr>/gi, '</html:abbr>');\r
-                                       }\r
-                               };\r
-\r
-                               ed.onBeforeSetContent.add(fix);\r
-                               ed.onPostProcess.add(fix);\r
-                       }\r
-\r
-                       ed.onNodeChange.add(function(ed, cm, n, co) {\r
-                               n = ed.dom.getParent(n, 'CITE,ACRONYM,ABBR,DEL,INS');\r
-\r
-                               cm.setDisabled('cite', co);\r
-                               cm.setDisabled('acronym', co);\r
-                               cm.setDisabled('abbr', co);\r
-                               cm.setDisabled('del', co);\r
-                               cm.setDisabled('ins', co);\r
-                               cm.setDisabled('attribs', n && n.nodeName == 'BODY');\r
-                               cm.setActive('cite', 0);\r
-                               cm.setActive('acronym', 0);\r
-                               cm.setActive('abbr', 0);\r
-                               cm.setActive('del', 0);\r
-                               cm.setActive('ins', 0);\r
-\r
-                               // Activate all\r
-                               if (n) {\r
-                                       do {\r
-                                               cm.setDisabled(n.nodeName.toLowerCase(), 0);\r
-                                               cm.setActive(n.nodeName.toLowerCase(), 1);\r
-                                       } while (n = n.parentNode);\r
-                               }\r
-                       });\r
-               },\r
-\r
-               getInfo : function() {\r
-                       return {\r
-                               longname : 'XHTML Xtras Plugin',\r
-                               author : 'Moxiecode Systems AB',\r
-                               authorurl : 'http://tinymce.moxiecode.com',\r
-                               infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras',\r
-                               version : tinymce.majorVersion + "." + tinymce.minorVersion\r
-                       };\r
-               }\r
-       });\r
-\r
-       // Register plugin\r
-       tinymce.PluginManager.add('xhtmlxtras', tinymce.plugins.XHTMLXtrasPlugin);\r
-})();
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/ins.htm b/program/js/tiny_mce/plugins/xhtmlxtras/ins.htm
deleted file mode 100644 (file)
index 9fa21c4..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml">\r
-<head>\r
-       <title>{#xhtmlxtras_dlg.title_ins_element}</title>\r
-       <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
-       <script type="text/javascript" src="../../utils/mctabs.js"></script>\r
-       <script type="text/javascript" src="../../utils/form_utils.js"></script>\r
-       <script type="text/javascript" src="../../utils/editable_selects.js"></script>\r
-       <script type="text/javascript" src="js/element_common.js"></script>\r
-       <script type="text/javascript" src="js/ins.js"></script>\r
-       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
-</head>\r
-<body id="xhtmlxtrasins" style="display: none">\r
-<form onsubmit="insertIns();return false;" action="#">\r
-       <div class="tabs">\r
-               <ul>\r
-                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.general_tab}</a></span></li>\r
-                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->\r
-               </ul>\r
-       </div>\r
-\r
-       <div class="panel_wrapper">\r
-               <div id="general_panel" class="panel current">\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.fieldset_general_tab}</legend>\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label id="datetimelabel" for="datetime">{#xhtmlxtras_dlg.attribute_label_datetime}</label>:</td> \r
-                                               <td>\r
-                                                       <table border="0" cellspacing="0" cellpadding="0">\r
-                                                               <tr> \r
-                                                                       <td><input id="datetime" name="datetime" type="text" value="" maxlength="19" class="field mceFocus" /></td> \r
-                                                                       <td><a href="javascript:insertDateTime('datetime');" onmousedown="return false;" class="browse"><span class="datetime" title="{#xhtmlxtras_dlg.insert_date}"></span></a></td>\r
-                                                               </tr>\r
-                                                       </table>\r
-                                               </td>\r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="citelabel" for="cite">{#xhtmlxtras_dlg.attribute_label_cite}</label>:</td> \r
-                                               <td><input id="cite" name="cite" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                               </table>\r
-                       </fieldset>\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> \r
-                                               <td><input id="title" name="title" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> \r
-                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> \r
-                                               <td>\r
-                                                       <select id="class" name="class" class="field mceEditableSelect">\r
-                                                               <option value="">{#not_set}</option> \r
-                                                       </select>\r
-                                               </td>\r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> \r
-                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> \r
-                                               <td>\r
-                                                       <select id="dir" name="dir" class="field"> \r
-                                                               <option value="">{#not_set}</option> \r
-                                                               <option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> \r
-                                                               <option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> \r
-                                                       </select>\r
-                                               </td> \r
-                                       </tr>\r
-                                       <tr>\r
-                                               <td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> \r
-                                               <td>\r
-                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
-                                               </td> \r
-                                       </tr>\r
-                               </table>\r
-                       </fieldset>\r
-               </div>\r
-               <div id="events_panel" class="panel">\r
-                       <fieldset>\r
-                               <legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>\r
-\r
-                               <table border="0" cellpadding="0" cellspacing="4">\r
-                                       <tr>\r
-                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
-                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
-                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
-                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
-                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
-                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
-                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
-                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
-                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
-                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
-                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
-                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-\r
-                                       <tr>\r
-                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
-                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
-                                       </tr>\r
-                               </table>\r
-                       </fieldset>\r
-               </div>\r
-       </div>\r
-       <div class="mceActionPanel">\r
-               <div style="float: left">\r
-                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
-               </div>\r
-               <div style="float: left">\r
-                       <input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeIns();" style="display: none;" />\r
-               </div>\r
-               <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-               </div>\r
-       </div>\r
-\r
-</form>\r
-\r
-</body>\r
-</html>\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/abbr.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/abbr.js
deleted file mode 100644 (file)
index e84b6a8..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
- /**\r
- * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
- *\r
- * @author Moxiecode - based on work by Andrew Tetlaw\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-function init() {\r
-       SXE.initElementDialog('abbr');\r
-       if (SXE.currentAction == "update") {\r
-               SXE.showRemoveButton();\r
-       }\r
-}\r
-\r
-function insertAbbr() {\r
-       SXE.insertElement(tinymce.isIE ? 'html:abbr' : 'abbr');\r
-       tinyMCEPopup.close();\r
-}\r
-\r
-function removeAbbr() {\r
-       SXE.removeElement('abbr');\r
-       tinyMCEPopup.close();\r
-}\r
-\r
-tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/acronym.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/acronym.js
deleted file mode 100644 (file)
index 933d122..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
- /**\r
- * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
- *\r
- * @author Moxiecode - based on work by Andrew Tetlaw\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-function init() {\r
-       SXE.initElementDialog('acronym');\r
-       if (SXE.currentAction == "update") {\r
-               SXE.showRemoveButton();\r
-       }\r
-}\r
-\r
-function insertAcronym() {\r
-       SXE.insertElement('acronym');\r
-       tinyMCEPopup.close();\r
-}\r
-\r
-function removeAcronym() {\r
-       SXE.removeElement('acronym');\r
-       tinyMCEPopup.close();\r
-}\r
-\r
-tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/attributes.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/attributes.js
deleted file mode 100644 (file)
index 23c7fa4..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
- /**\r
- * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
- *\r
- * @author Moxiecode - based on work by Andrew Tetlaw\r
- * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-function init() {\r
-       tinyMCEPopup.resizeToInnerSize();\r
-       var inst = tinyMCEPopup.editor;\r
-       var dom = inst.dom;\r
-       var elm = inst.selection.getNode();\r
-       var f = document.forms[0];\r
-       var onclick = dom.getAttrib(elm, 'onclick');\r
-\r
-       setFormValue('title', dom.getAttrib(elm, 'title'));\r
-       setFormValue('id', dom.getAttrib(elm, 'id'));\r
-       setFormValue('style', dom.getAttrib(elm, "style"));\r
-       setFormValue('dir', dom.getAttrib(elm, 'dir'));\r
-       setFormValue('lang', dom.getAttrib(elm, 'lang'));\r
-       setFormValue('tabindex', dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));\r
-       setFormValue('accesskey', dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));\r
-       setFormValue('onfocus', dom.getAttrib(elm, 'onfocus'));\r
-       setFormValue('onblur', dom.getAttrib(elm, 'onblur'));\r
-       setFormValue('onclick', onclick);\r
-       setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick'));\r
-       setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown'));\r
-       setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup'));\r
-       setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover'));\r
-       setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove'));\r
-       setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout'));\r
-       setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress'));\r
-       setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown'));\r
-       setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup'));\r
-       className = dom.getAttrib(elm, 'class');\r
-\r
-       addClassesToList('classlist', 'advlink_styles');\r
-       selectByValue(f, 'classlist', className, true);\r
-\r
-       TinyMCE_EditableSelects.init();\r
-}\r
-\r
-function setFormValue(name, value) {\r
-       if(value && document.forms[0].elements[name]){\r
-               document.forms[0].elements[name].value = value;\r
-       }\r
-}\r
-\r
-function insertAction() {\r
-       var inst = tinyMCEPopup.editor;\r
-       var elm = inst.selection.getNode();\r
-\r
-       tinyMCEPopup.execCommand("mceBeginUndoLevel");  \r
-       setAllAttribs(elm);\r
-       tinyMCEPopup.execCommand("mceEndUndoLevel");\r
-       tinyMCEPopup.close();\r
-}\r
-\r
-function setAttrib(elm, attrib, value) {\r
-       var formObj = document.forms[0];\r
-       var valueElm = formObj.elements[attrib.toLowerCase()];\r
-       var inst = tinyMCEPopup.editor;\r
-       var dom = inst.dom;\r
-\r
-       if (typeof(value) == "undefined" || value == null) {\r
-               value = "";\r
-\r
-               if (valueElm)\r
-                       value = valueElm.value;\r
-       }\r
-\r
-       if (value != "") {\r
-               dom.setAttrib(elm, attrib.toLowerCase(), value);\r
-\r
-               if (attrib == "style")\r
-                       attrib = "style.cssText";\r
-\r
-               if (attrib.substring(0, 2) == 'on')\r
-                       value = 'return true;' + value;\r
-\r
-               if (attrib == "class")\r
-                       attrib = "className";\r
-\r
-               elm[attrib]=value;\r
-       } else\r
-               elm.removeAttribute(attrib);\r
-}\r
-\r
-function setAllAttribs(elm) {\r
-       var f = document.forms[0];\r
-\r
-       setAttrib(elm, 'title');\r
-       setAttrib(elm, 'id');\r
-       setAttrib(elm, 'style');\r
-       setAttrib(elm, 'class', getSelectValue(f, 'classlist'));\r
-       setAttrib(elm, 'dir');\r
-       setAttrib(elm, 'lang');\r
-       setAttrib(elm, 'tabindex');\r
-       setAttrib(elm, 'accesskey');\r
-       setAttrib(elm, 'onfocus');\r
-       setAttrib(elm, 'onblur');\r
-       setAttrib(elm, 'onclick');\r
-       setAttrib(elm, 'ondblclick');\r
-       setAttrib(elm, 'onmousedown');\r
-       setAttrib(elm, 'onmouseup');\r
-       setAttrib(elm, 'onmouseover');\r
-       setAttrib(elm, 'onmousemove');\r
-       setAttrib(elm, 'onmouseout');\r
-       setAttrib(elm, 'onkeypress');\r
-       setAttrib(elm, 'onkeydown');\r
-       setAttrib(elm, 'onkeyup');\r
-\r
-       // Refresh in old MSIE\r
-//     if (tinyMCE.isMSIE5)\r
-//             elm.outerHTML = elm.outerHTML;\r
-}\r
-\r
-function insertAttribute() {\r
-       tinyMCEPopup.close();\r
-}\r
-\r
-tinyMCEPopup.onInit.add(init);\r
-tinyMCEPopup.requireLangPack();\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/cite.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/cite.js
deleted file mode 100644 (file)
index c36f7fd..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
- /**\r
- * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
- *\r
- * @author Moxiecode - based on work by Andrew Tetlaw\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-function init() {\r
-       SXE.initElementDialog('cite');\r
-       if (SXE.currentAction == "update") {\r
-               SXE.showRemoveButton();\r
-       }\r
-}\r
-\r
-function insertCite() {\r
-       SXE.insertElement('cite');\r
-       tinyMCEPopup.close();\r
-}\r
-\r
-function removeCite() {\r
-       SXE.removeElement('cite');\r
-       tinyMCEPopup.close();\r
-}\r
-\r
-tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/del.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/del.js
deleted file mode 100644 (file)
index 7049f2b..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
- /**\r
- * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
- *\r
- * @author Moxiecode - based on work by Andrew Tetlaw\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-function init() {\r
-       SXE.initElementDialog('del');\r
-       if (SXE.currentAction == "update") {\r
-               setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime'));\r
-               setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite'));\r
-               SXE.showRemoveButton();\r
-       }\r
-}\r
-\r
-function setElementAttribs(elm) {\r
-       setAllCommonAttribs(elm);\r
-       setAttrib(elm, 'datetime');\r
-       setAttrib(elm, 'cite');\r
-}\r
-\r
-function insertDel() {\r
-       var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'DEL');\r
-\r
-       tinyMCEPopup.execCommand('mceBeginUndoLevel');\r
-       if (elm == null) {\r
-               var s = SXE.inst.selection.getContent();\r
-               if(s.length > 0) {\r
-                       insertInlineElement('del');\r
-                       var elementArray = tinymce.grep(SXE.inst.dom.select('del'), function(n) {return n.id == '#sxe_temp_del#';});\r
-                       for (var i=0; i<elementArray.length; i++) {\r
-                               var elm = elementArray[i];\r
-                               setElementAttribs(elm);\r
-                       }\r
-               }\r
-       } else {\r
-               setElementAttribs(elm);\r
-       }\r
-       tinyMCEPopup.editor.nodeChanged();\r
-       tinyMCEPopup.execCommand('mceEndUndoLevel');\r
-       tinyMCEPopup.close();\r
-}\r
-\r
-function insertInlineElement(en) {\r
-       var ed = tinyMCEPopup.editor, dom = ed.dom;\r
-\r
-       ed.getDoc().execCommand('FontName', false, 'mceinline');\r
-       tinymce.each(dom.select(tinymce.isWebKit ? 'span' : 'font'), function(n) {\r
-               if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline')\r
-                       dom.replace(dom.create(en), n, 1);\r
-       });\r
-}\r
-\r
-function removeDel() {\r
-       SXE.removeElement('del');\r
-       tinyMCEPopup.close();\r
-}\r
-\r
-tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/element_common.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/element_common.js
deleted file mode 100644 (file)
index 70f168a..0000000
+++ /dev/null
@@ -1,231 +0,0 @@
- /**\r
- * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
- *\r
- * @author Moxiecode - based on work by Andrew Tetlaw\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-tinyMCEPopup.requireLangPack();\r
-\r
-function initCommonAttributes(elm) {\r
-       var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom;\r
-\r
-       // Setup form data for common element attributes\r
-       setFormValue('title', dom.getAttrib(elm, 'title'));\r
-       setFormValue('id', dom.getAttrib(elm, 'id'));\r
-       selectByValue(formObj, 'class', dom.getAttrib(elm, 'class'), true);\r
-       setFormValue('style', dom.getAttrib(elm, 'style'));\r
-       selectByValue(formObj, 'dir', dom.getAttrib(elm, 'dir'));\r
-       setFormValue('lang', dom.getAttrib(elm, 'lang'));\r
-       setFormValue('onfocus', dom.getAttrib(elm, 'onfocus'));\r
-       setFormValue('onblur', dom.getAttrib(elm, 'onblur'));\r
-       setFormValue('onclick', dom.getAttrib(elm, 'onclick'));\r
-       setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick'));\r
-       setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown'));\r
-       setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup'));\r
-       setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover'));\r
-       setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove'));\r
-       setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout'));\r
-       setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress'));\r
-       setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown'));\r
-       setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup'));\r
-}\r
-\r
-function setFormValue(name, value) {\r
-       if(document.forms[0].elements[name]) document.forms[0].elements[name].value = value;\r
-}\r
-\r
-function insertDateTime(id) {\r
-       document.getElementById(id).value = getDateTime(new Date(), "%Y-%m-%dT%H:%M:%S");\r
-}\r
-\r
-function getDateTime(d, fmt) {\r
-       fmt = fmt.replace("%D", "%m/%d/%y");\r
-       fmt = fmt.replace("%r", "%I:%M:%S %p");\r
-       fmt = fmt.replace("%Y", "" + d.getFullYear());\r
-       fmt = fmt.replace("%y", "" + d.getYear());\r
-       fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2));\r
-       fmt = fmt.replace("%d", addZeros(d.getDate(), 2));\r
-       fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2));\r
-       fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2));\r
-       fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2));\r
-       fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1));\r
-       fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM"));\r
-       fmt = fmt.replace("%%", "%");\r
-\r
-       return fmt;\r
-}\r
-\r
-function addZeros(value, len) {\r
-       var i;\r
-\r
-       value = "" + value;\r
-\r
-       if (value.length < len) {\r
-               for (i=0; i<(len-value.length); i++)\r
-                       value = "0" + value;\r
-       }\r
-\r
-       return value;\r
-}\r
-\r
-function selectByValue(form_obj, field_name, value, add_custom, ignore_case) {\r
-       if (!form_obj || !form_obj.elements[field_name])\r
-               return;\r
-\r
-       var sel = form_obj.elements[field_name];\r
-\r
-       var found = false;\r
-       for (var i=0; i<sel.options.length; i++) {\r
-               var option = sel.options[i];\r
-\r
-               if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) {\r
-                       option.selected = true;\r
-                       found = true;\r
-               } else\r
-                       option.selected = false;\r
-       }\r
-\r
-       if (!found && add_custom && value != '') {\r
-               var option = new Option('Value: ' + value, value);\r
-               option.selected = true;\r
-               sel.options[sel.options.length] = option;\r
-       }\r
-\r
-       return found;\r
-}\r
-\r
-function setAttrib(elm, attrib, value) {\r
-       var formObj = document.forms[0];\r
-       var valueElm = formObj.elements[attrib.toLowerCase()];\r
-       tinyMCEPopup.editor.dom.setAttrib(elm, attrib, value || valueElm.value);\r
-}\r
-\r
-function setAllCommonAttribs(elm) {\r
-       setAttrib(elm, 'title');\r
-       setAttrib(elm, 'id');\r
-       setAttrib(elm, 'class');\r
-       setAttrib(elm, 'style');\r
-       setAttrib(elm, 'dir');\r
-       setAttrib(elm, 'lang');\r
-       /*setAttrib(elm, 'onfocus');\r
-       setAttrib(elm, 'onblur');\r
-       setAttrib(elm, 'onclick');\r
-       setAttrib(elm, 'ondblclick');\r
-       setAttrib(elm, 'onmousedown');\r
-       setAttrib(elm, 'onmouseup');\r
-       setAttrib(elm, 'onmouseover');\r
-       setAttrib(elm, 'onmousemove');\r
-       setAttrib(elm, 'onmouseout');\r
-       setAttrib(elm, 'onkeypress');\r
-       setAttrib(elm, 'onkeydown');\r
-       setAttrib(elm, 'onkeyup');*/\r
-}\r
-\r
-SXE = {\r
-       currentAction : "insert",\r
-       inst : tinyMCEPopup.editor,\r
-       updateElement : null\r
-}\r
-\r
-SXE.focusElement = SXE.inst.selection.getNode();\r
-\r
-SXE.initElementDialog = function(element_name) {\r
-       addClassesToList('class', 'xhtmlxtras_styles');\r
-       TinyMCE_EditableSelects.init();\r
-\r
-       element_name = element_name.toLowerCase();\r
-       var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase());\r
-       if (elm != null && elm.nodeName.toUpperCase() == element_name.toUpperCase()) {\r
-               SXE.currentAction = "update";\r
-       }\r
-\r
-       if (SXE.currentAction == "update") {\r
-               initCommonAttributes(elm);\r
-               SXE.updateElement = elm;\r
-       }\r
-\r
-       document.forms[0].insert.value = tinyMCEPopup.getLang(SXE.currentAction, 'Insert', true); \r
-}\r
-\r
-SXE.insertElement = function(element_name) {\r
-       var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase()), h, tagName;\r
-\r
-       tinyMCEPopup.execCommand('mceBeginUndoLevel');\r
-       if (elm == null) {\r
-               var s = SXE.inst.selection.getContent();\r
-               if(s.length > 0) {\r
-                       tagName = element_name;\r
-\r
-                       if (tinymce.isIE && element_name.indexOf('html:') == 0)\r
-                               element_name = element_name.substring(5).toLowerCase();\r
-\r
-                       insertInlineElement(element_name);\r
-                       var elementArray = tinymce.grep(SXE.inst.dom.select(element_name));\r
-                       for (var i=0; i<elementArray.length; i++) {\r
-                               var elm = elementArray[i];\r
-\r
-                               if (SXE.inst.dom.getAttrib(elm, '_mce_new')) {\r
-                                       elm.id = '';\r
-                                       elm.setAttribute('id', '');\r
-                                       elm.removeAttribute('id');\r
-                                       elm.removeAttribute('_mce_new');\r
-\r
-                                       setAllCommonAttribs(elm);\r
-                               }\r
-                       }\r
-               }\r
-       } else {\r
-               setAllCommonAttribs(elm);\r
-       }\r
-       SXE.inst.nodeChanged();\r
-       tinyMCEPopup.execCommand('mceEndUndoLevel');\r
-}\r
-\r
-SXE.removeElement = function(element_name){\r
-       element_name = element_name.toLowerCase();\r
-       elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase());\r
-       if(elm && elm.nodeName.toUpperCase() == element_name.toUpperCase()){\r
-               tinyMCEPopup.execCommand('mceBeginUndoLevel');\r
-               tinyMCE.execCommand('mceRemoveNode', false, elm);\r
-               SXE.inst.nodeChanged();\r
-               tinyMCEPopup.execCommand('mceEndUndoLevel');\r
-       }\r
-}\r
-\r
-SXE.showRemoveButton = function() {\r
-               document.getElementById("remove").style.display = 'block';\r
-}\r
-\r
-SXE.containsClass = function(elm,cl) {\r
-       return (elm.className.indexOf(cl) > -1) ? true : false;\r
-}\r
-\r
-SXE.removeClass = function(elm,cl) {\r
-       if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) {\r
-               return true;\r
-       }\r
-       var classNames = elm.className.split(" ");\r
-       var newClassNames = "";\r
-       for (var x = 0, cnl = classNames.length; x < cnl; x++) {\r
-               if (classNames[x] != cl) {\r
-                       newClassNames += (classNames[x] + " ");\r
-               }\r
-       }\r
-       elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end\r
-}\r
-\r
-SXE.addClass = function(elm,cl) {\r
-       if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl;\r
-       return true;\r
-}\r
-\r
-function insertInlineElement(en) {\r
-       var ed = tinyMCEPopup.editor, dom = ed.dom;\r
-\r
-       ed.getDoc().execCommand('FontName', false, 'mceinline');\r
-       tinymce.each(dom.select('span,font'), function(n) {\r
-               if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline')\r
-                       dom.replace(dom.create(en, {_mce_new : 1}), n, 1);\r
-       });\r
-}\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/js/ins.js b/program/js/tiny_mce/plugins/xhtmlxtras/js/ins.js
deleted file mode 100644 (file)
index 4fcc998..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
- /**\r
- * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
- *\r
- * @author Moxiecode - based on work by Andrew Tetlaw\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-function init() {\r
-       SXE.initElementDialog('ins');\r
-       if (SXE.currentAction == "update") {\r
-               setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime'));\r
-               setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite'));\r
-               SXE.showRemoveButton();\r
-       }\r
-}\r
-\r
-function setElementAttribs(elm) {\r
-       setAllCommonAttribs(elm);\r
-       setAttrib(elm, 'datetime');\r
-       setAttrib(elm, 'cite');\r
-}\r
-\r
-function insertIns() {\r
-       var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'INS');\r
-       tinyMCEPopup.execCommand('mceBeginUndoLevel');\r
-       if (elm == null) {\r
-               var s = SXE.inst.selection.getContent();\r
-               if(s.length > 0) {\r
-                       insertInlineElement('INS');\r
-                       var elementArray = tinymce.grep(SXE.inst.dom.select('ins'), function(n) {return n.id == '#sxe_temp_ins#';});\r
-                       for (var i=0; i<elementArray.length; i++) {\r
-                               var elm = elementArray[i];\r
-                               setElementAttribs(elm);\r
-                       }\r
-               }\r
-       } else {\r
-               setElementAttribs(elm);\r
-       }\r
-       tinyMCEPopup.editor.nodeChanged();\r
-       tinyMCEPopup.execCommand('mceEndUndoLevel');\r
-       tinyMCEPopup.close();\r
-}\r
-\r
-function removeIns() {\r
-       SXE.removeElement('ins');\r
-       tinyMCEPopup.close();\r
-}\r
-\r
-function insertInlineElement(en) {\r
-       var ed = tinyMCEPopup.editor, dom = ed.dom;\r
-\r
-       ed.getDoc().execCommand('FontName', false, 'mceinline');\r
-       tinymce.each(dom.select(tinymce.isWebKit ? 'span' : 'font'), function(n) {\r
-               if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline')\r
-                       dom.replace(dom.create(en), n, 1);\r
-       });\r
-}\r
-\r
-tinyMCEPopup.onInit.add(init);\r
diff --git a/program/js/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js b/program/js/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js
deleted file mode 100644 (file)
index 45b6b26..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-tinyMCE.addI18n('en.xhtmlxtras_dlg',{\r
-attribute_label_title:"Title",\r
-attribute_label_id:"ID",\r
-attribute_label_class:"Class",\r
-attribute_label_style:"Style",\r
-attribute_label_cite:"Cite",\r
-attribute_label_datetime:"Date/Time",\r
-attribute_label_langdir:"Text Direction",\r
-attribute_option_ltr:"Left to right",\r
-attribute_option_rtl:"Right to left",\r
-attribute_label_langcode:"Language",\r
-attribute_label_tabindex:"TabIndex",\r
-attribute_label_accesskey:"AccessKey",\r
-attribute_events_tab:"Events",\r
-attribute_attrib_tab:"Attributes",\r
-general_tab:"General",\r
-attrib_tab:"Attributes",\r
-events_tab:"Events",\r
-fieldset_general_tab:"General Settings",\r
-fieldset_attrib_tab:"Element Attributes",\r
-fieldset_events_tab:"Element Events",\r
-title_ins_element:"Insertion Element",\r
-title_del_element:"Deletion Element",\r
-title_acronym_element:"Acronym Element",\r
-title_abbr_element:"Abbreviation Element",\r
-title_cite_element:"Citation Element",\r
-remove:"Remove",\r
-insert_date:"Insert current date/time",\r
-option_ltr:"Left to right",\r
-option_rtl:"Right to left",\r
-attribs_title:"Insert/Edit Attributes"\r
-});
\ No newline at end of file
index e5df7aa5aca5b9b6d138569f4d2f8626b0d3652b..267f837eb171711e11e39b06443a703ea137993e 100644 (file)
@@ -48,9 +48,7 @@
                </div>\r
 \r
                <div class="mceActionPanel">\r
-                       <div style="float: right">\r
-                               <input type="button" id="cancel" name="cancel" value="{#close}" onclick="tinyMCEPopup.close();" />\r
-                       </div>\r
+                       <input type="button" id="cancel" name="cancel" value="{#close}" onclick="tinyMCEPopup.close();" />\r
                </div>\r
 </body>\r
 </html>\r
index 42095a1c0cabd4db2666cbdefd2666cfa68e00b0..2bc63fcfdc6a5c9e520793e723fa4da22d8bfcdf 100644 (file)
        </table>\r
 \r
        <div class="mceActionPanel">\r
-               <div style="float: left">\r
-                       <input type="submit" id="insert" name="insert" value="{#update}" />\r
-               </div>\r
-\r
-               <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-               </div>\r
+               <input type="submit" id="insert" name="insert" value="{#update}" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
        </div>\r
 </form>\r
 </body>\r
index f11a38ad8a2a8038b7809b76c499e73b09b89c0e..3991b8141b34a0bb3c6b5151c4134c5c445b4a69 100644 (file)
@@ -2,7 +2,6 @@
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
        <title>{#advanced_dlg.charmap_title}</title>\r
-       <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />\r
        <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
        <script type="text/javascript" src="js/charmap.js"></script>\r
 </head>\r
index 90eb4c2ee1fc66b458f718c8e78f3b9b3fb375d2..096e7550c33f00fc4cc6c0216f3831674fa42b31 100644 (file)
@@ -21,7 +21,7 @@
                        <fieldset>\r
                                <legend>{#advanced_dlg.colorpicker_picker_title}</legend>\r
                                <div id="picker">\r
-                                       <img id="colors" src="img/colorpicker.jpg" onclick="computeColor(event)" onmousedown="isMouseDown = true;return false;" onmouseup="isMouseDown = false;" onmousemove="if (isMouseDown && isMouseOver) computeColor(event); return false;" onmouseover="isMouseOver=true;" onmouseout="isMouseOver=false;" alt=" " />\r
+                                       <img id="colors" src="img/colorpicker.jpg" onclick="computeColor(event)" onmousedown="isMouseDown = true;return false;" onmouseup="isMouseDown = false;" onmousemove="if (isMouseDown && isMouseOver) computeColor(event); return false;" onmouseover="isMouseOver=true;" onmouseout="isMouseOver=false;" alt="" />\r
 \r
                                        <div id="light">\r
                                                <!-- Will be filled with divs -->\r
@@ -60,9 +60,7 @@
        </div>\r
 \r
        <div class="mceActionPanel">\r
-               <div style="float: left">\r
-                       <input type="submit" id="insert" name="insert" value="{#apply}" />\r
-               </div>\r
+               <input type="submit" id="insert" name="insert" value="{#apply}" />\r
 \r
                <div id="preview"></div>\r
 \r
index 628c793cc7961c7e22d2e1c04940aa2bf66f7132..dc619774616e1d3c7646475d2dd7c0e90e5cad4a 100644 (file)
@@ -1 +1 @@
-(function(e){var d=e.DOM,b=e.dom.Event,h=e.extend,f=e.each,a=e.util.Cookie,g,c=e.explode;e.ThemeManager.requireLangPack("advanced");e.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],controls:{bold:["bold_desc","Bold"],italic:["italic_desc","Italic"],underline:["underline_desc","Underline"],strikethrough:["striketrough_desc","Strikethrough"],justifyleft:["justifyleft_desc","JustifyLeft"],justifycenter:["justifycenter_desc","JustifyCenter"],justifyright:["justifyright_desc","JustifyRight"],justifyfull:["justifyfull_desc","JustifyFull"],bullist:["bullist_desc","InsertUnorderedList"],numlist:["numlist_desc","InsertOrderedList"],outdent:["outdent_desc","Outdent"],indent:["indent_desc","Indent"],cut:["cut_desc","Cut"],copy:["copy_desc","Copy"],paste:["paste_desc","Paste"],undo:["undo_desc","Undo"],redo:["redo_desc","Redo"],link:["link_desc","mceLink"],unlink:["unlink_desc","unlink"],image:["image_desc","mceImage"],cleanup:["cleanup_desc","mceCleanup"],help:["help_desc","mceHelp"],code:["code_desc","mceCodeEditor"],hr:["hr_desc","InsertHorizontalRule"],removeformat:["removeformat_desc","RemoveFormat"],sub:["sub_desc","subscript"],sup:["sup_desc","superscript"],forecolor:["forecolor_desc","ForeColor"],forecolorpicker:["forecolor_desc","mceForeColor"],backcolor:["backcolor_desc","HiliteColor"],backcolorpicker:["backcolor_desc","mceBackColor"],charmap:["charmap_desc","mceCharMap"],visualaid:["visualaid_desc","mceToggleVisualAid"],anchor:["anchor_desc","mceInsertAnchor"],newdocument:["newdocument_desc","mceNewDocument"],blockquote:["blockquote_desc","mceBlockQuote"]},stateControls:["bold","italic","underline","strikethrough","bullist","numlist","justifyleft","justifycenter","justifyright","justifyfull","sub","sup","blockquote"],init:function(j,k){var l=this,m,i,n;l.editor=j;l.url=k;l.onResolveName=new e.util.Dispatcher(this);l.settings=m=h({theme_advanced_path:true,theme_advanced_toolbar_location:"bottom",theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"center",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",readonly:j.settings.readonly},j.settings);if(!m.font_size_style_values){m.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(e.is(m.theme_advanced_font_sizes,"string")){m.font_size_style_values=e.explode(m.font_size_style_values);m.font_size_classes=e.explode(m.font_size_classes||"");n={};j.settings.theme_advanced_font_sizes=m.theme_advanced_font_sizes;f(j.getParam("theme_advanced_font_sizes","","hash"),function(q,p){var o;if(p==q&&q>=1&&q<=7){p=q+" ("+l.sizes[q-1]+"pt)";if(j.settings.convert_fonts_to_spans){o=m.font_size_classes[q-1];q=m.font_size_style_values[q-1]||(l.sizes[q-1]+"pt")}}if(/^\s*\./.test(q)){o=q.replace(/\./g,"")}n[p]=o?{"class":o}:{fontSize:q}});m.theme_advanced_font_sizes=n}if((i=m.theme_advanced_path_location)&&i!="none"){m.theme_advanced_statusbar_location=m.theme_advanced_path_location}if(m.theme_advanced_statusbar_location=="none"){m.theme_advanced_statusbar_location=0}j.onInit.add(function(){j.onNodeChange.add(l._nodeChanged,l);if(j.settings.content_css!==false){j.dom.loadCSS(j.baseURI.toAbsolute("themes/advanced/skins/"+j.settings.skin+"/content.css"))}});j.onSetProgressState.add(function(q,o,r){var s,t=q.id,p;if(o){l.progressTimer=setTimeout(function(){s=q.getContainer();s=s.insertBefore(d.create("DIV",{style:"position:relative"}),s.firstChild);p=d.get(q.id+"_tbl");d.add(s,"div",{id:t+"_blocker","class":"mceBlocker",style:{width:p.clientWidth+2,height:p.clientHeight+2}});d.add(s,"div",{id:t+"_progress","class":"mceProgress",style:{left:p.clientWidth/2,top:p.clientHeight/2}})},r||0)}else{d.remove(t+"_blocker");d.remove(t+"_progress");clearTimeout(l.progressTimer)}});d.loadCSS(m.editor_css?j.documentBaseURI.toAbsolute(m.editor_css):k+"/skins/"+j.settings.skin+"/ui.css");if(m.skin_variant){d.loadCSS(k+"/skins/"+j.settings.skin+"/ui_"+m.skin_variant+".css")}},createControl:function(l,i){var j,k;if(k=i.createControl(l)){return k}switch(l){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu()}if((j=this.controls[l])){return i.createButton(l,{title:"advanced."+j[0],cmd:j[1],ui:j[2],value:j[3]})}},execCommand:function(k,j,l){var i=this["_"+k];if(i){i.call(this,j,l);return true}return false},_importClasses:function(j){var i=this.editor,k=i.controlManager.get("styleselect");if(k.getLength()==0){f(i.dom.getClasses(),function(l){k.add(l["class"],l["class"])})}},_createStyleSelect:function(m){var j=this,i=j.editor,k=i.controlManager,l=k.createListBox("styleselect",{title:"advanced.style_select",onselect:function(n){if(l.selectedValue===n){i.execCommand("mceSetStyleInfo",0,{command:"removeformat"});l.select();return false}else{i.execCommand("mceSetCSSClass",0,n)}}});if(l){f(i.getParam("theme_advanced_styles","","hash"),function(o,n){if(o){l.add(j.editor.translate(n),o)}});l.onPostRender.add(function(o,p){if(!l.NativeListBox){b.add(p.id+"_text","focus",j._importClasses,j);b.add(p.id+"_text","mousedown",j._importClasses,j);b.add(p.id+"_open","focus",j._importClasses,j);b.add(p.id+"_open","mousedown",j._importClasses,j)}else{b.add(p.id,"focus",j._importClasses,j)}})}return l},_createFontSelect:function(){var k,j=this,i=j.editor;k=i.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",cmd:"FontName"});if(k){f(i.getParam("theme_advanced_fonts",j.settings.theme_advanced_fonts,"hash"),function(m,l){k.add(i.translate(l),m,{style:m.indexOf("dings")==-1?"font-family:"+m:""})})}return k},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(i){if(i.fontSize){k.execCommand("FontSize",false,i.fontSize)}else{f(m.settings.theme_advanced_font_sizes,function(p,o){if(p["class"]){j.push(p["class"])}});k.editorCommands._applyInlineStyle("span",{"class":i["class"]},{check_classes:j})}}});if(n){f(m.settings.theme_advanced_font_sizes,function(o,i){var p=o.fontSize;if(p>=1&&p<=7){p=m.sizes[parseInt(p)-1]+"pt"}n.add(i,o,{style:"font-size:"+p,"class":"mceFontSize"+(l++)+(" "+(o["class"]||""))})})}return n},_createBlockFormats:function(){var k,i={p:"advanced.paragraph",address:"advanced.address",pre:"advanced.pre",h1:"advanced.h1",h2:"advanced.h2",h3:"advanced.h3",h4:"advanced.h4",h5:"advanced.h5",h6:"advanced.h6",div:"advanced.div",blockquote:"advanced.blockquote",code:"advanced.code",dt:"advanced.dt",dd:"advanced.dd",samp:"advanced.samp"},j=this;k=j.editor.controlManager.createListBox("formatselect",{title:"advanced.block",cmd:"FormatBlock"});if(k){f(j.editor.getParam("theme_advanced_blockformats",j.settings.theme_advanced_blockformats,"hash"),function(m,l){k.add(j.editor.translate(l!=m?l:i[m]),m,{"class":"mce_formatPreview mce_"+m})})}return k},_createForeColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_text_colors){l.colors=i}if(k.theme_advanced_default_foreground_color){l.default_color=k.theme_advanced_default_foreground_color}l.title="advanced.forecolor_desc";l.cmd="ForeColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("forecolor",l);return m},_createBackColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_background_colors){l.colors=i}if(k.theme_advanced_default_background_color){l.default_color=k.theme_advanced_default_background_color}l.title="advanced.backcolor_desc";l.cmd="HiliteColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("backcolor",l);return m},renderUI:function(k){var m,l,q,v=this,r=v.editor,w=v.settings,u,j,i;m=j=d.create("span",{id:r.id+"_parent","class":"mceEditor "+r.settings.skin+"Skin"+(w.skin_variant?" "+r.settings.skin+"Skin"+v._ufirst(w.skin_variant):"")});if(!d.boxModel){m=d.add(m,"div",{"class":"mceOldBoxModel"})}m=u=d.add(m,"table",{id:r.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});m=q=d.add(m,"tbody");switch((w.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":l=v._rowLayout(w,q,k);break;case"customlayout":l=r.execCallback("theme_advanced_custom_layout",w,q,k,j);break;default:l=v._simpleLayout(w,q,k,j)}m=k.targetNode;i=d.stdMode?u.getElementsByTagName("tr"):u.rows;d.addClass(i[0],"mceFirst");d.addClass(i[i.length-1],"mceLast");f(d.select("tr",q),function(o){d.addClass(o.firstChild,"mceFirst");d.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(d.get(w.theme_advanced_toolbar_container)){d.get(w.theme_advanced_toolbar_container).appendChild(j)}else{d.insertAfter(j,m)}b.add(r.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){v._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return b.cancel(n)}});if(!r.getParam("accessibility_focus")){b.add(d.add(j,"a",{href:"#"},"<!-- IE -->"),"focus",function(){tinyMCE.get(r.id).focus()})}if(w.theme_advanced_toolbar_location=="external"){k.deltaHeight=0}v.deltaHeight=k.deltaHeight;k.targetNode=null;return{iframeContainer:l,editorContainer:r.id+"_parent",sizeContainer:u,deltaHeight:k.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:e.majorVersion+"."+e.minorVersion}},resizeBy:function(i,j){var k=d.get(this.editor.id+"_tbl");this.resizeTo(k.clientWidth+i,k.clientHeight+j)},resizeTo:function(i,l){var j=this.editor,k=j.settings,n=d.get(j.id+"_tbl"),o=d.get(j.id+"_ifr"),m;i=Math.max(k.theme_advanced_resizing_min_width||100,i);l=Math.max(k.theme_advanced_resizing_min_height||100,l);i=Math.min(k.theme_advanced_resizing_max_width||65535,i);l=Math.min(k.theme_advanced_resizing_max_height||65535,l);m=n.clientHeight-o.clientHeight;d.setStyle(o,"height",l-m);d.setStyles(n,{width:i,height:l})},destroy:function(){var i=this.editor.id;b.clear(i+"_resize");b.clear(i+"_path_row");b.clear(i+"_external_close")},_simpleLayout:function(y,r,k,i){var x=this,u=x.editor,v=y.theme_advanced_toolbar_location,m=y.theme_advanced_statusbar_location,l,j,q,w;if(y.readonly){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});return j}if(v=="top"){x._addToolbars(r,k)}if(v=="external"){l=w=d.create("div",{style:"position:relative"});l=d.add(l,"div",{id:u.id+"_external","class":"mceExternalToolbar"});d.add(l,"a",{id:u.id+"_external_close",href:"javascript:;","class":"mceExternalClose"});l=d.add(l,"table",{id:u.id+"_tblext",cellSpacing:0,cellPadding:0});q=d.add(l,"tbody");if(i.firstChild.className=="mceOldBoxModel"){i.firstChild.appendChild(w)}else{i.insertBefore(w,i.firstChild)}x._addToolbars(q,k);u.onMouseUp.add(function(){var o=d.get(u.id+"_external");d.show(o);d.hide(g);var n=b.add(u.id+"_external_close","click",function(){d.hide(u.id+"_external");b.remove(u.id+"_external_close","click",n)});d.show(o);d.setStyle(o,"top",0-d.getRect(u.id+"_tblext").h-1);d.hide(o);d.show(o);o.style.filter="";g=u.id+"_external";o=null})}if(m=="top"){x._addStatusBar(r,k)}if(!y.theme_advanced_toolbar_container){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"})}if(v=="bottom"){x._addToolbars(r,k)}if(m=="bottom"){x._addStatusBar(r,k)}return j},_rowLayout:function(w,m,k){var v=this,p=v.editor,u,x,i=p.controlManager,l,j,r,q;u=w.theme_advanced_containers_default_class||"";x=w.theme_advanced_containers_default_align||"center";f(c(w.theme_advanced_containers||""),function(s,o){var n=w["theme_advanced_container_"+s]||"";switch(n.toLowerCase()){case"mceeditor":l=d.add(m,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});break;case"mceelementpath":v._addStatusBar(m,k);break;default:q=(w["theme_advanced_container_"+s+"_align"]||x).toLowerCase();q="mce"+v._ufirst(q);l=d.add(d.add(m,"tr"),"td",{"class":"mceToolbar "+(w["theme_advanced_container_"+s+"_class"]||u)+" "+q||x});r=i.createToolbar("toolbar"+o);v._addControls(n,r);d.setHTML(l,r.renderHTML());k.deltaHeight-=w.theme_advanced_row_height}});return j},_addControls:function(j,i){var k=this,l=k.settings,m,n=k.editor.controlManager;if(l.theme_advanced_disable&&!k._disabled){m={};f(c(l.theme_advanced_disable),function(o){m[o]=1});k._disabled=m}else{m=k._disabled}f(c(j),function(p){var o;if(m&&m[p]){return}if(p=="tablecontrols"){f(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"],function(q){q=k.createControl(q,n);if(q){i.add(q)}});return}o=k.createControl(p,n);if(o){i.add(o)}})},_addToolbars:function(w,k){var z=this,p,m,r=z.editor,A=z.settings,y,j=r.controlManager,u,l,q=[],x;x=A.theme_advanced_toolbar_align.toLowerCase();x="mce"+z._ufirst(x);l=d.add(d.add(w,"tr"),"td",{"class":"mceToolbar "+x});if(!r.getParam("accessibility_focus")){q.push(d.createHTML("a",{href:"#",onfocus:"tinyMCE.get('"+r.id+"').focus();"},"<!-- IE -->"))}q.push(d.createHTML("a",{href:"#",accesskey:"q",title:r.getLang("advanced.toolbar_focus")},"<!-- IE -->"));for(p=1;(y=A["theme_advanced_buttons"+p]);p++){m=j.createToolbar("toolbar"+p,{"class":"mceToolbarRow"+p});if(A["theme_advanced_buttons"+p+"_add"]){y+=","+A["theme_advanced_buttons"+p+"_add"]}if(A["theme_advanced_buttons"+p+"_add_before"]){y=A["theme_advanced_buttons"+p+"_add_before"]+","+y}z._addControls(y,m);q.push(m.renderHTML());k.deltaHeight-=A.theme_advanced_row_height}q.push(d.createHTML("a",{href:"#",accesskey:"z",title:r.getLang("advanced.toolbar_focus"),onfocus:"tinyMCE.getInstanceById('"+r.id+"').focus();"},"<!-- IE -->"));d.setHTML(l,q.join(""))},_addStatusBar:function(m,j){var k,v=this,p=v.editor,w=v.settings,i,q,u,l;k=d.add(m,"tr");k=l=d.add(k,"td",{"class":"mceStatusbar"});k=d.add(k,"div",{id:p.id+"_path_row"},w.theme_advanced_path?p.translate("advanced.path")+": ":"&#160;");d.add(k,"a",{href:"#",accesskey:"x"});if(w.theme_advanced_resizing){d.add(l,"a",{id:p.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize"});if(w.theme_advanced_resizing_use_cookie){p.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+p.id+"_size"),r=d.get(p.id+"_tbl");if(!n){return}if(w.theme_advanced_resize_horizontal){r.style.width=Math.max(10,n.cw)+"px"}r.style.height=Math.max(10,n.ch)+"px";d.get(p.id+"_ifr").style.height=Math.max(10,parseInt(n.ch)+v.deltaHeight)+"px"})}p.onPostRender.add(function(){b.add(p.id+"_resize","mousedown",function(x){var z,t,o,s,y,r;z=d.get(p.id+"_tbl");o=z.clientWidth;s=z.clientHeight;miw=w.theme_advanced_resizing_min_width||100;mih=w.theme_advanced_resizing_min_height||100;maw=w.theme_advanced_resizing_max_width||65535;mah=w.theme_advanced_resizing_max_height||65535;t=d.add(d.get(p.id+"_parent"),"div",{"class":"mcePlaceHolder"});d.setStyles(t,{width:o,height:s});d.hide(z);d.show(t);i={x:x.screenX,y:x.screenY,w:o,h:s,dx:null,dy:null};q=b.add(d.doc,"mousemove",function(B){var n,A;i.dx=B.screenX-i.x;i.dy=B.screenY-i.y;n=Math.max(miw,i.w+i.dx);A=Math.max(mih,i.h+i.dy);n=Math.min(maw,n);A=Math.min(mah,A);if(w.theme_advanced_resize_horizontal){t.style.width=n+"px"}t.style.height=A+"px";return b.cancel(B)});u=b.add(d.doc,"mouseup",function(n){var A;b.remove(d.doc,"mousemove",q);b.remove(d.doc,"mouseup",u);z.style.display="";d.remove(t);if(i.dx===null){return}A=d.get(p.id+"_ifr");if(w.theme_advanced_resize_horizontal){z.style.width=Math.max(10,i.w+i.dx)+"px"}z.style.height=Math.max(10,i.h+i.dy)+"px";A.style.height=Math.max(10,A.clientHeight+i.dy)+"px";if(w.theme_advanced_resizing_use_cookie){a.setHash("TinyMCE_"+p.id+"_size",{cw:i.w+i.dx,ch:i.h+i.dy})}});return b.cancel(x)})})}j.deltaHeight-=21;k=m=null},_nodeChanged:function(l,u,k,q){var y=this,i,r=0,x,m,z=y.settings,w,j,o;if(z.readonly){return}e.each(y.stateControls,function(n){u.setActive(n,l.queryCommandState(y.controls[n][1]))});u.setActive("visualaid",l.hasVisual);u.setDisabled("undo",!l.undoManager.hasUndo()&&!l.typing);u.setDisabled("redo",!l.undoManager.hasRedo());u.setDisabled("outdent",!l.queryCommandState("Outdent"));i=d.getParent(k,"A");if(m=u.get("link")){if(!i||!i.name){m.setDisabled(!i&&q);m.setActive(!!i)}}if(m=u.get("unlink")){m.setDisabled(!i&&q);m.setActive(!!i&&!i.name)}if(m=u.get("anchor")){m.setActive(!!i&&i.name);if(e.isWebKit){i=d.getParent(k,"IMG");m.setActive(!!i&&d.getAttrib(i,"mce_name")=="a")}}i=d.getParent(k,"IMG");if(m=u.get("image")){m.setActive(!!i&&k.className.indexOf("mceItem")==-1)}if(m=u.get("styleselect")){if(k.className){y._importClasses();m.select(k.className)}else{m.select()}}if(m=u.get("formatselect")){i=d.getParent(k,d.isBlock);if(i){m.select(i.nodeName.toLowerCase())}}if(l.settings.convert_fonts_to_spans){l.dom.getParent(k,function(p){if(p.nodeName==="SPAN"){if(!w&&p.className){w=p.className}if(!j&&p.style.fontSize){j=p.style.fontSize}if(!o&&p.style.fontFamily){o=p.style.fontFamily.replace(/[\"\']+/g,"").replace(/^([^,]+).*/,"$1").toLowerCase()}}return false});if(m=u.get("fontselect")){m.select(function(n){return n.replace(/^([^,]+).*/,"$1").toLowerCase()==o})}if(m=u.get("fontsizeselect")){m.select(function(n){if(n.fontSize&&n.fontSize===j){return true}if(n["class"]&&n["class"]===w){return true}})}}else{if(m=u.get("fontselect")){m.select(l.queryCommandValue("FontName"))}if(m=u.get("fontsizeselect")){x=l.queryCommandValue("FontSize");m.select(function(n){return n.fontSize==x})}}if(z.theme_advanced_path&&z.theme_advanced_statusbar_location){i=d.get(l.id+"_path")||d.add(l.id+"_path_row","span",{id:l.id+"_path"});d.setHTML(i,"");l.dom.getParent(k,function(A){var p=A.nodeName.toLowerCase(),s,v,t="";if(A.nodeType!=1||A.nodeName==="BR"||(d.hasClass(A,"mceItemHidden")||d.hasClass(A,"mceItemRemoved"))){return}if(x=d.getAttrib(A,"mce_name")){p=x}if(e.isIE&&A.scopeName!=="HTML"){p=A.scopeName+":"+p}p=p.replace(/mce\:/g,"");switch(p){case"b":p="strong";break;case"i":p="em";break;case"img":if(x=d.getAttrib(A,"src")){t+="src: "+x+" "}break;case"a":if(x=d.getAttrib(A,"name")){t+="name: "+x+" ";p+="#"+x}if(x=d.getAttrib(A,"href")){t+="href: "+x+" "}break;case"font":if(z.convert_fonts_to_spans){p="span"}if(x=d.getAttrib(A,"face")){t+="font: "+x+" "}if(x=d.getAttrib(A,"size")){t+="size: "+x+" "}if(x=d.getAttrib(A,"color")){t+="color: "+x+" "}break;case"span":if(x=d.getAttrib(A,"style")){t+="style: "+x+" "}break}if(x=d.getAttrib(A,"id")){t+="id: "+x+" "}if(x=A.className){x=x.replace(/(webkit-[\w\-]+|Apple-[\w\-]+|mceItem\w+|mceVisualAid)/g,"");if(x&&x.indexOf("mceItem")==-1){t+="class: "+x+" ";if(d.isBlock(A)||p=="img"||p=="span"){p+="."+x}}}p=p.replace(/(html:)/g,"");p={name:p,node:A,title:t};y.onResolveName.dispatch(y,p);t=p.title;p=p.name;v=d.create("a",{href:"javascript:;",onmousedown:"return false;",title:t,"class":"mcePath_"+(r++)},p);if(i.hasChildNodes()){i.insertBefore(d.doc.createTextNode(" \u00bb "),i.firstChild);i.insertBefore(v,i.firstChild)}else{i.appendChild(v)}},l.getBody())}},_sel:function(i){this.editor.execCommand("mceSelectNodeDepth",false,i)},_mceInsertAnchor:function(k,j){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/anchor.htm",width:320+parseInt(i.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(i.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/charmap.htm",width:550+parseInt(i.getLang("advanced.charmap_delta_width",0)),height:250+parseInt(i.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(k,j){var i=this.editor;j=j||{};i.windowManager.open({url:e.baseURL+"/themes/advanced/color_picker.htm",width:375+parseInt(i.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(i.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:j.color,func:j.func,theme_url:this.url})},_mceCodeEditor:function(j,k){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/source_editor.htm",width:parseInt(i.getParam("theme_advanced_source_editor_width",720)),height:parseInt(i.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(j,k){var i=this.editor;if(i.dom.getAttrib(i.selection.getNode(),"class").indexOf("mceItem")!=-1){return}i.windowManager.open({url:e.baseURL+"/themes/advanced/image.htm",width:355+parseInt(i.getLang("advanced.image_delta_width",0)),height:275+parseInt(i.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(j,k){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/link.htm",width:310+parseInt(i.getLang("advanced.link_delta_width",0)),height:200+parseInt(i.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var i=this.editor;i.windowManager.confirm("advanced.newdocument",function(j){if(j){i.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var i=this;this._mceColorPicker(0,{color:i.fgColor,func:function(j){i.fgColor=j;i.editor.execCommand("ForeColor",false,j)}})},_mceBackColor:function(){var i=this;this._mceColorPicker(0,{color:i.bgColor,func:function(j){i.bgColor=j;i.editor.execCommand("HiliteColor",false,j)}})},_ufirst:function(i){return i.substring(0,1).toUpperCase()+i.substring(1)}});e.ThemeManager.add("advanced",e.themes.AdvancedTheme)}(tinymce));
\ No newline at end of file
+(function(e){var d=e.DOM,b=e.dom.Event,h=e.extend,f=e.each,a=e.util.Cookie,g,c=e.explode;e.ThemeManager.requireLangPack("advanced");e.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],controls:{bold:["bold_desc","Bold"],italic:["italic_desc","Italic"],underline:["underline_desc","Underline"],strikethrough:["striketrough_desc","Strikethrough"],justifyleft:["justifyleft_desc","JustifyLeft"],justifycenter:["justifycenter_desc","JustifyCenter"],justifyright:["justifyright_desc","JustifyRight"],justifyfull:["justifyfull_desc","JustifyFull"],bullist:["bullist_desc","InsertUnorderedList"],numlist:["numlist_desc","InsertOrderedList"],outdent:["outdent_desc","Outdent"],indent:["indent_desc","Indent"],cut:["cut_desc","Cut"],copy:["copy_desc","Copy"],paste:["paste_desc","Paste"],undo:["undo_desc","Undo"],redo:["redo_desc","Redo"],link:["link_desc","mceLink"],unlink:["unlink_desc","unlink"],image:["image_desc","mceImage"],cleanup:["cleanup_desc","mceCleanup"],help:["help_desc","mceHelp"],code:["code_desc","mceCodeEditor"],hr:["hr_desc","InsertHorizontalRule"],removeformat:["removeformat_desc","RemoveFormat"],sub:["sub_desc","subscript"],sup:["sup_desc","superscript"],forecolor:["forecolor_desc","ForeColor"],forecolorpicker:["forecolor_desc","mceForeColor"],backcolor:["backcolor_desc","HiliteColor"],backcolorpicker:["backcolor_desc","mceBackColor"],charmap:["charmap_desc","mceCharMap"],visualaid:["visualaid_desc","mceToggleVisualAid"],anchor:["anchor_desc","mceInsertAnchor"],newdocument:["newdocument_desc","mceNewDocument"],blockquote:["blockquote_desc","mceBlockQuote"]},stateControls:["bold","italic","underline","strikethrough","bullist","numlist","justifyleft","justifycenter","justifyright","justifyfull","sub","sup","blockquote"],init:function(j,k){var l=this,m,i,n;l.editor=j;l.url=k;l.onResolveName=new e.util.Dispatcher(this);l.settings=m=h({theme_advanced_path:true,theme_advanced_toolbar_location:"bottom",theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"center",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",readonly:j.settings.readonly},j.settings);if(!m.font_size_style_values){m.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(e.is(m.theme_advanced_font_sizes,"string")){m.font_size_style_values=e.explode(m.font_size_style_values);m.font_size_classes=e.explode(m.font_size_classes||"");n={};j.settings.theme_advanced_font_sizes=m.theme_advanced_font_sizes;f(j.getParam("theme_advanced_font_sizes","","hash"),function(q,p){var o;if(p==q&&q>=1&&q<=7){p=q+" ("+l.sizes[q-1]+"pt)";o=m.font_size_classes[q-1];q=m.font_size_style_values[q-1]||(l.sizes[q-1]+"pt")}if(/^\s*\./.test(q)){o=q.replace(/\./g,"")}n[p]=o?{"class":o}:{fontSize:q}});m.theme_advanced_font_sizes=n}if((i=m.theme_advanced_path_location)&&i!="none"){m.theme_advanced_statusbar_location=m.theme_advanced_path_location}if(m.theme_advanced_statusbar_location=="none"){m.theme_advanced_statusbar_location=0}j.onInit.add(function(){if(!j.settings.readonly){j.onNodeChange.add(l._nodeChanged,l)}if(j.settings.content_css!==false){j.dom.loadCSS(j.baseURI.toAbsolute("themes/advanced/skins/"+j.settings.skin+"/content.css"))}});j.onSetProgressState.add(function(q,o,r){var s,t=q.id,p;if(o){l.progressTimer=setTimeout(function(){s=q.getContainer();s=s.insertBefore(d.create("DIV",{style:"position:relative"}),s.firstChild);p=d.get(q.id+"_tbl");d.add(s,"div",{id:t+"_blocker","class":"mceBlocker",style:{width:p.clientWidth+2,height:p.clientHeight+2}});d.add(s,"div",{id:t+"_progress","class":"mceProgress",style:{left:p.clientWidth/2,top:p.clientHeight/2}})},r||0)}else{d.remove(t+"_blocker");d.remove(t+"_progress");clearTimeout(l.progressTimer)}});d.loadCSS(m.editor_css?j.documentBaseURI.toAbsolute(m.editor_css):k+"/skins/"+j.settings.skin+"/ui.css");if(m.skin_variant){d.loadCSS(k+"/skins/"+j.settings.skin+"/ui_"+m.skin_variant+".css")}},createControl:function(l,i){var j,k;if(k=i.createControl(l)){return k}switch(l){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu()}if((j=this.controls[l])){return i.createButton(l,{title:"advanced."+j[0],cmd:j[1],ui:j[2],value:j[3]})}},execCommand:function(k,j,l){var i=this["_"+k];if(i){i.call(this,j,l);return true}return false},_importClasses:function(k){var i=this.editor,j=i.controlManager.get("styleselect");if(j.getLength()==0){f(i.dom.getClasses(),function(n,l){var m="style_"+l;i.formatter.register(m,{inline:"span",attributes:{"class":n["class"]},selector:"*"});j.add(n["class"],m)})}},_createStyleSelect:function(m){var k=this,i=k.editor,j=i.controlManager,l;l=j.createListBox("styleselect",{title:"advanced.style_select",onselect:function(o){var p,n=[];f(l.items,function(q){n.push(q.value)});i.focus();i.undoManager.add();p=i.formatter.matchAll(n);if(p[0]==o){i.formatter.remove(o)}else{i.formatter.apply(o)}i.undoManager.add();i.nodeChanged();return false}});i.onInit.add(function(){var o=0,n=i.getParam("style_formats");if(n){f(n,function(p){var q,r=0;f(p,function(){r++});if(r>1){q=p.name=p.name||"style_"+(o++);i.formatter.register(q,p);l.add(p.title,q)}else{l.add(p.title)}})}else{f(i.getParam("theme_advanced_styles","","hash"),function(r,q){var p;if(r){p="style_"+(o++);i.formatter.register(p,{inline:"span",classes:r,selector:"*"});l.add(k.editor.translate(q),p)}})}});if(l.getLength()==0){l.onPostRender.add(function(o,p){if(!l.NativeListBox){b.add(p.id+"_text","focus",k._importClasses,k);b.add(p.id+"_text","mousedown",k._importClasses,k);b.add(p.id+"_open","focus",k._importClasses,k);b.add(p.id+"_open","mousedown",k._importClasses,k)}else{b.add(p.id,"focus",k._importClasses,k)}})}return l},_createFontSelect:function(){var k,j=this,i=j.editor;k=i.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(l){i.execCommand("FontName",false,l);k.select(function(m){return l==m});return false}});if(k){f(i.getParam("theme_advanced_fonts",j.settings.theme_advanced_fonts,"hash"),function(m,l){k.add(i.translate(l),m,{style:m.indexOf("dings")==-1?"font-family:"+m:""})})}return k},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(i){if(i["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:i["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,i.fontSize)}n.select(function(o){return i==o});return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(o,i){var p=o.fontSize;if(p>=1&&p<=7){p=m.sizes[parseInt(p)-1]+"pt"}n.add(i,o,{style:"font-size:"+p,"class":"mceFontSize"+(l++)+(" "+(o["class"]||""))})})}return n},_createBlockFormats:function(){var k,i={p:"advanced.paragraph",address:"advanced.address",pre:"advanced.pre",h1:"advanced.h1",h2:"advanced.h2",h3:"advanced.h3",h4:"advanced.h4",h5:"advanced.h5",h6:"advanced.h6",div:"advanced.div",blockquote:"advanced.blockquote",code:"advanced.code",dt:"advanced.dt",dd:"advanced.dd",samp:"advanced.samp"},j=this;k=j.editor.controlManager.createListBox("formatselect",{title:"advanced.block",cmd:"FormatBlock"});if(k){f(j.editor.getParam("theme_advanced_blockformats",j.settings.theme_advanced_blockformats,"hash"),function(m,l){k.add(j.editor.translate(l!=m?l:i[m]),m,{"class":"mce_formatPreview mce_"+m})})}return k},_createForeColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_text_colors){l.colors=i}if(k.theme_advanced_default_foreground_color){l.default_color=k.theme_advanced_default_foreground_color}l.title="advanced.forecolor_desc";l.cmd="ForeColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("forecolor",l);return m},_createBackColorMenu:function(){var m,j=this,k=j.settings,l={},i;if(k.theme_advanced_more_colors){l.more_colors_func=function(){j._mceColorPicker(0,{color:m.value,func:function(n){m.setColor(n)}})}}if(i=k.theme_advanced_background_colors){l.colors=i}if(k.theme_advanced_default_background_color){l.default_color=k.theme_advanced_default_background_color}l.title="advanced.backcolor_desc";l.cmd="HiliteColor";l.scope=this;m=j.editor.controlManager.createColorSplitButton("backcolor",l);return m},renderUI:function(k){var m,l,q,v=this,r=v.editor,w=v.settings,u,j,i;m=j=d.create("span",{id:r.id+"_parent","class":"mceEditor "+r.settings.skin+"Skin"+(w.skin_variant?" "+r.settings.skin+"Skin"+v._ufirst(w.skin_variant):"")});if(!d.boxModel){m=d.add(m,"div",{"class":"mceOldBoxModel"})}m=u=d.add(m,"table",{id:r.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});m=q=d.add(m,"tbody");switch((w.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":l=v._rowLayout(w,q,k);break;case"customlayout":l=r.execCallback("theme_advanced_custom_layout",w,q,k,j);break;default:l=v._simpleLayout(w,q,k,j)}m=k.targetNode;i=d.stdMode?u.getElementsByTagName("tr"):u.rows;d.addClass(i[0],"mceFirst");d.addClass(i[i.length-1],"mceLast");f(d.select("tr",q),function(o){d.addClass(o.firstChild,"mceFirst");d.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(d.get(w.theme_advanced_toolbar_container)){d.get(w.theme_advanced_toolbar_container).appendChild(j)}else{d.insertAfter(j,m)}b.add(r.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){v._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return b.cancel(n)}});if(!r.getParam("accessibility_focus")){b.add(d.add(j,"a",{href:"#"},"<!-- IE -->"),"focus",function(){tinyMCE.get(r.id).focus()})}if(w.theme_advanced_toolbar_location=="external"){k.deltaHeight=0}v.deltaHeight=k.deltaHeight;k.targetNode=null;return{iframeContainer:l,editorContainer:r.id+"_parent",sizeContainer:u,deltaHeight:k.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:e.majorVersion+"."+e.minorVersion}},resizeBy:function(i,j){var k=d.get(this.editor.id+"_tbl");this.resizeTo(k.clientWidth+i,k.clientHeight+j)},resizeTo:function(i,l){var j=this.editor,k=this.settings,m=d.get(j.id+"_tbl"),n=d.get(j.id+"_ifr");i=Math.max(k.theme_advanced_resizing_min_width||100,i);l=Math.max(k.theme_advanced_resizing_min_height||100,l);i=Math.min(k.theme_advanced_resizing_max_width||65535,i);l=Math.min(k.theme_advanced_resizing_max_height||65535,l);d.setStyle(m,"height","");d.setStyle(n,"height",l);if(k.theme_advanced_resize_horizontal){d.setStyle(m,"width","");d.setStyle(n,"width",i);if(i<m.clientWidth){d.setStyle(n,"width",m.clientWidth)}}},destroy:function(){var i=this.editor.id;b.clear(i+"_resize");b.clear(i+"_path_row");b.clear(i+"_external_close")},_simpleLayout:function(y,r,k,i){var x=this,u=x.editor,v=y.theme_advanced_toolbar_location,m=y.theme_advanced_statusbar_location,l,j,q,w;if(y.readonly){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});return j}if(v=="top"){x._addToolbars(r,k)}if(v=="external"){l=w=d.create("div",{style:"position:relative"});l=d.add(l,"div",{id:u.id+"_external","class":"mceExternalToolbar"});d.add(l,"a",{id:u.id+"_external_close",href:"javascript:;","class":"mceExternalClose"});l=d.add(l,"table",{id:u.id+"_tblext",cellSpacing:0,cellPadding:0});q=d.add(l,"tbody");if(i.firstChild.className=="mceOldBoxModel"){i.firstChild.appendChild(w)}else{i.insertBefore(w,i.firstChild)}x._addToolbars(q,k);u.onMouseUp.add(function(){var o=d.get(u.id+"_external");d.show(o);d.hide(g);var n=b.add(u.id+"_external_close","click",function(){d.hide(u.id+"_external");b.remove(u.id+"_external_close","click",n)});d.show(o);d.setStyle(o,"top",0-d.getRect(u.id+"_tblext").h-1);d.hide(o);d.show(o);o.style.filter="";g=u.id+"_external";o=null})}if(m=="top"){x._addStatusBar(r,k)}if(!y.theme_advanced_toolbar_container){l=d.add(r,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"})}if(v=="bottom"){x._addToolbars(r,k)}if(m=="bottom"){x._addStatusBar(r,k)}return j},_rowLayout:function(w,m,k){var v=this,p=v.editor,u,x,i=p.controlManager,l,j,r,q;u=w.theme_advanced_containers_default_class||"";x=w.theme_advanced_containers_default_align||"center";f(c(w.theme_advanced_containers||""),function(s,o){var n=w["theme_advanced_container_"+s]||"";switch(n.toLowerCase()){case"mceeditor":l=d.add(m,"tr");l=j=d.add(l,"td",{"class":"mceIframeContainer"});break;case"mceelementpath":v._addStatusBar(m,k);break;default:q=(w["theme_advanced_container_"+s+"_align"]||x).toLowerCase();q="mce"+v._ufirst(q);l=d.add(d.add(m,"tr"),"td",{"class":"mceToolbar "+(w["theme_advanced_container_"+s+"_class"]||u)+" "+q||x});r=i.createToolbar("toolbar"+o);v._addControls(n,r);d.setHTML(l,r.renderHTML());k.deltaHeight-=w.theme_advanced_row_height}});return j},_addControls:function(j,i){var k=this,l=k.settings,m,n=k.editor.controlManager;if(l.theme_advanced_disable&&!k._disabled){m={};f(c(l.theme_advanced_disable),function(o){m[o]=1});k._disabled=m}else{m=k._disabled}f(c(j),function(p){var o;if(m&&m[p]){return}if(p=="tablecontrols"){f(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"],function(q){q=k.createControl(q,n);if(q){i.add(q)}});return}o=k.createControl(p,n);if(o){i.add(o)}})},_addToolbars:function(w,k){var z=this,p,m,r=z.editor,A=z.settings,y,j=r.controlManager,u,l,q=[],x;x=A.theme_advanced_toolbar_align.toLowerCase();x="mce"+z._ufirst(x);l=d.add(d.add(w,"tr"),"td",{"class":"mceToolbar "+x});if(!r.getParam("accessibility_focus")){q.push(d.createHTML("a",{href:"#",onfocus:"tinyMCE.get('"+r.id+"').focus();"},"<!-- IE -->"))}q.push(d.createHTML("a",{href:"#",accesskey:"q",title:r.getLang("advanced.toolbar_focus")},"<!-- IE -->"));for(p=1;(y=A["theme_advanced_buttons"+p]);p++){m=j.createToolbar("toolbar"+p,{"class":"mceToolbarRow"+p});if(A["theme_advanced_buttons"+p+"_add"]){y+=","+A["theme_advanced_buttons"+p+"_add"]}if(A["theme_advanced_buttons"+p+"_add_before"]){y=A["theme_advanced_buttons"+p+"_add_before"]+","+y}z._addControls(y,m);q.push(m.renderHTML());k.deltaHeight-=A.theme_advanced_row_height}q.push(d.createHTML("a",{href:"#",accesskey:"z",title:r.getLang("advanced.toolbar_focus"),onfocus:"tinyMCE.getInstanceById('"+r.id+"').focus();"},"<!-- IE -->"));d.setHTML(l,q.join(""))},_addStatusBar:function(m,j){var k,v=this,p=v.editor,w=v.settings,i,q,u,l;k=d.add(m,"tr");k=l=d.add(k,"td",{"class":"mceStatusbar"});k=d.add(k,"div",{id:p.id+"_path_row"},w.theme_advanced_path?p.translate("advanced.path")+": ":"&#160;");d.add(k,"a",{href:"#",accesskey:"x"});if(w.theme_advanced_resizing){d.add(l,"a",{id:p.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize"});if(w.theme_advanced_resizing_use_cookie){p.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+p.id+"_size"),r=d.get(p.id+"_tbl");if(!n){return}v.resizeTo(n.cw,n.ch)})}p.onPostRender.add(function(){b.add(p.id+"_resize","mousedown",function(D){var t,r,s,o,C,z,A,F,n,E,x;function y(G){n=A+(G.screenX-C);E=F+(G.screenY-z);v.resizeTo(n,E)}function B(G){b.remove(d.doc,"mousemove",t);b.remove(p.getDoc(),"mousemove",r);b.remove(d.doc,"mouseup",s);b.remove(p.getDoc(),"mouseup",o);if(w.theme_advanced_resizing_use_cookie){a.setHash("TinyMCE_"+p.id+"_size",{cw:n,ch:E})}}D.preventDefault();C=D.screenX;z=D.screenY;x=d.get(v.editor.id+"_ifr");A=n=x.clientWidth;F=E=x.clientHeight;t=b.add(d.doc,"mousemove",y);r=b.add(p.getDoc(),"mousemove",y);s=b.add(d.doc,"mouseup",B);o=b.add(p.getDoc(),"mouseup",B)})})}j.deltaHeight-=21;k=m=null},_nodeChanged:function(r,z,l,x,j){var C=this,i,y=0,B,u,D=C.settings,A,k,w,m,q;e.each(C.stateControls,function(n){z.setActive(n,r.queryCommandState(C.controls[n][1]))});function o(p){var s,n=j.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s<n.length;s++){if(t(n[s])){return n[s]}}}z.setActive("visualaid",r.hasVisual);z.setDisabled("undo",!r.undoManager.hasUndo()&&!r.typing);z.setDisabled("redo",!r.undoManager.hasRedo());z.setDisabled("outdent",!r.queryCommandState("Outdent"));i=o("A");if(u=z.get("link")){if(!i||!i.name){u.setDisabled(!i&&x);u.setActive(!!i)}}if(u=z.get("unlink")){u.setDisabled(!i&&x);u.setActive(!!i&&!i.name)}if(u=z.get("anchor")){u.setActive(!!i&&i.name)}i=o("IMG");if(u=z.get("image")){u.setActive(!!i&&l.className.indexOf("mceItem")==-1)}if(u=z.get("styleselect")){C._importClasses();m=[];f(u.items,function(n){m.push(n.value)});q=r.formatter.matchAll(m);u.select(q[0])}if(u=z.get("formatselect")){i=o(d.isBlock);if(i){u.select(i.nodeName.toLowerCase())}}o(function(p){if(p.nodeName==="SPAN"){if(!A&&p.className){A=p.className}if(!k&&p.style.fontSize){k=p.style.fontSize}if(!w&&p.style.fontFamily){w=p.style.fontFamily.replace(/[\"\']+/g,"").replace(/^([^,]+).*/,"$1").toLowerCase()}}return false});if(u=z.get("fontselect")){u.select(function(n){return n.replace(/^([^,]+).*/,"$1").toLowerCase()==w})}if(u=z.get("fontsizeselect")){if(D.theme_advanced_runtime_fontsize&&!k&&!A){k=r.dom.getStyle(l,"fontSize",true)}u.select(function(n){if(n.fontSize&&n.fontSize===k){return true}if(n["class"]&&n["class"]===A){return true}})}if(D.theme_advanced_path&&D.theme_advanced_statusbar_location){i=d.get(r.id+"_path")||d.add(r.id+"_path_row","span",{id:r.id+"_path"});d.setHTML(i,"");o(function(E){var p=E.nodeName.toLowerCase(),s,v,t="";if(E.nodeType!=1||E.nodeName==="BR"||(d.hasClass(E,"mceItemHidden")||d.hasClass(E,"mceItemRemoved"))){return}if(B=d.getAttrib(E,"mce_name")){p=B}if(e.isIE&&E.scopeName!=="HTML"){p=E.scopeName+":"+p}p=p.replace(/mce\:/g,"");switch(p){case"b":p="strong";break;case"i":p="em";break;case"img":if(B=d.getAttrib(E,"src")){t+="src: "+B+" "}break;case"a":if(B=d.getAttrib(E,"name")){t+="name: "+B+" ";p+="#"+B}if(B=d.getAttrib(E,"href")){t+="href: "+B+" "}break;case"font":if(B=d.getAttrib(E,"face")){t+="font: "+B+" "}if(B=d.getAttrib(E,"size")){t+="size: "+B+" "}if(B=d.getAttrib(E,"color")){t+="color: "+B+" "}break;case"span":if(B=d.getAttrib(E,"style")){t+="style: "+B+" "}break}if(B=d.getAttrib(E,"id")){t+="id: "+B+" "}if(B=E.className){B=B.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g,"");if(B){t+="class: "+B+" ";if(d.isBlock(E)||p=="img"||p=="span"){p+="."+B}}}p=p.replace(/(html:)/g,"");p={name:p,node:E,title:t};C.onResolveName.dispatch(C,p);t=p.title;p=p.name;v=d.create("a",{href:"javascript:;",onmousedown:"return false;",title:t,"class":"mcePath_"+(y++)},p);if(i.hasChildNodes()){i.insertBefore(d.doc.createTextNode(" \u00bb "),i.firstChild);i.insertBefore(v,i.firstChild)}else{i.appendChild(v)}},r.getBody())}},_sel:function(i){this.editor.execCommand("mceSelectNodeDepth",false,i)},_mceInsertAnchor:function(k,j){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/anchor.htm",width:320+parseInt(i.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(i.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/charmap.htm",width:550+parseInt(i.getLang("advanced.charmap_delta_width",0)),height:250+parseInt(i.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(k,j){var i=this.editor;j=j||{};i.windowManager.open({url:e.baseURL+"/themes/advanced/color_picker.htm",width:375+parseInt(i.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(i.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:j.color,func:j.func,theme_url:this.url})},_mceCodeEditor:function(j,k){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/source_editor.htm",width:parseInt(i.getParam("theme_advanced_source_editor_width",720)),height:parseInt(i.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(j,k){var i=this.editor;if(i.dom.getAttrib(i.selection.getNode(),"class").indexOf("mceItem")!=-1){return}i.windowManager.open({url:e.baseURL+"/themes/advanced/image.htm",width:355+parseInt(i.getLang("advanced.image_delta_width",0)),height:275+parseInt(i.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(j,k){var i=this.editor;i.windowManager.open({url:e.baseURL+"/themes/advanced/link.htm",width:310+parseInt(i.getLang("advanced.link_delta_width",0)),height:200+parseInt(i.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var i=this.editor;i.windowManager.confirm("advanced.newdocument",function(j){if(j){i.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var i=this;this._mceColorPicker(0,{color:i.fgColor,func:function(j){i.fgColor=j;i.editor.execCommand("ForeColor",false,j)}})},_mceBackColor:function(){var i=this;this._mceColorPicker(0,{color:i.bgColor,func:function(j){i.bgColor=j;i.editor.execCommand("HiliteColor",false,j)}})},_ufirst:function(i){return i.substring(0,1).toUpperCase()+i.substring(1)}});e.ThemeManager.add("advanced",e.themes.AdvancedTheme)}(tinymce));
\ No newline at end of file
index 21eb259a205a9da0d3c46f24deb13b0b309b8ff9..279ca359ce3d9f6246367d3df302ccbc94b1b12e 100644 (file)
@@ -1,8 +1,11 @@
 /**\r
- * $Id: editor_template_src.js 1045 2009-03-04 20:03:18Z spocke $\r
+ * editor_template_src.js\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 (function(tinymce) {\r
 \r
                                        if (k == v && v >= 1 && v <= 7) {\r
                                                k = v + ' (' + t.sizes[v - 1] + 'pt)';\r
-\r
-                                               if (ed.settings.convert_fonts_to_spans) {\r
-                                                       cl = s.font_size_classes[v - 1];\r
-                                                       v = s.font_size_style_values[v - 1] || (t.sizes[v - 1] + 'pt');\r
-                                               }\r
+                                               cl = s.font_size_classes[v - 1];\r
+                                               v = s.font_size_style_values[v - 1] || (t.sizes[v - 1] + 'pt');\r
                                        }\r
 \r
                                        if (/^\s*\./.test(v))\r
 \r
                        // Init editor\r
                        ed.onInit.add(function() {\r
-                               ed.onNodeChange.add(t._nodeChanged, t);\r
+                               if (!ed.settings.readonly)\r
+                                       ed.onNodeChange.add(t._nodeChanged, t);\r
 \r
                                if (ed.settings.content_css !== false)\r
                                        ed.dom.loadCSS(ed.baseURI.toAbsolute("themes/advanced/skins/" + ed.settings.skin + "/content.css"));\r
                },\r
 \r
                _importClasses : function(e) {\r
-                       var ed = this.editor, c = ed.controlManager.get('styleselect');\r
+                       var ed = this.editor, ctrl = ed.controlManager.get('styleselect');\r
+\r
+                       if (ctrl.getLength() == 0) {\r
+                               each(ed.dom.getClasses(), function(o, idx) {\r
+                                       var name = 'style_' + idx;\r
+\r
+                                       ed.formatter.register(name, {\r
+                                               inline : 'span',\r
+                                               attributes : {'class' : o['class']},\r
+                                               selector : '*'\r
+                                       });\r
 \r
-                       if (c.getLength() == 0) {\r
-                               each(ed.dom.getClasses(), function(o) {\r
-                                       c.add(o['class'], o['class']);\r
+                                       ctrl.add(o['class'], name);\r
                                });\r
                        }\r
                },\r
 \r
                _createStyleSelect : function(n) {\r
-                       var t = this, ed = t.editor, cf = ed.controlManager, c = cf.createListBox('styleselect', {\r
+                       var t = this, ed = t.editor, ctrlMan = ed.controlManager, ctrl;\r
+\r
+                       // Setup style select box\r
+                       ctrl = ctrlMan.createListBox('styleselect', {\r
                                title : 'advanced.style_select',\r
-                               onselect : function(v) {\r
-                                       if (c.selectedValue === v) {\r
-                                               ed.execCommand('mceSetStyleInfo', 0, {command : 'removeformat'});\r
-                                               c.select();\r
-                                               return false;\r
-                                       } else\r
-                                               ed.execCommand('mceSetCSSClass', 0, v);\r
+                               onselect : function(name) {\r
+                                       var matches, formatNames = [];\r
+\r
+                                       each(ctrl.items, function(item) {\r
+                                               formatNames.push(item.value);\r
+                                       });\r
+\r
+                                       ed.focus();\r
+                                       ed.undoManager.add();\r
+\r
+                                       // Toggle off the current format\r
+                                       matches = ed.formatter.matchAll(formatNames);\r
+                                       if (matches[0] == name)\r
+                                               ed.formatter.remove(name);\r
+                                       else\r
+                                               ed.formatter.apply(name);\r
+\r
+                                       ed.undoManager.add();\r
+                                       ed.nodeChanged();\r
+\r
+                                       return false; // No auto select\r
                                }\r
                        });\r
 \r
-                       if (c) {\r
-                               each(ed.getParam('theme_advanced_styles', '', 'hash'), function(v, k) {\r
-                                       if (v)\r
-                                               c.add(t.editor.translate(k), v);\r
-                               });\r
+                       // Handle specified format\r
+                       ed.onInit.add(function() {\r
+                               var counter = 0, formats = ed.getParam('style_formats');\r
+\r
+                               if (formats) {\r
+                                       each(formats, function(fmt) {\r
+                                               var name, keys = 0;\r
+\r
+                                               each(fmt, function() {keys++;});\r
+\r
+                                               if (keys > 1) {\r
+                                                       name = fmt.name = fmt.name || 'style_' + (counter++);\r
+                                                       ed.formatter.register(name, fmt);\r
+                                                       ctrl.add(fmt.title, name);\r
+                                               } else\r
+                                                       ctrl.add(fmt.title);\r
+                                       });\r
+                               } else {\r
+                                       each(ed.getParam('theme_advanced_styles', '', 'hash'), function(val, key) {\r
+                                               var name;\r
+\r
+                                               if (val) {\r
+                                                       name = 'style_' + (counter++);\r
 \r
-                               c.onPostRender.add(function(ed, n) {\r
-                                       if (!c.NativeListBox) {\r
+                                                       ed.formatter.register(name, {\r
+                                                               inline : 'span',\r
+                                                               classes : val,\r
+                                                               selector : '*'\r
+                                                       });\r
+\r
+                                                       ctrl.add(t.editor.translate(key), name);\r
+                                               }\r
+                                       });\r
+                               }\r
+                       });\r
+\r
+                       // Auto import classes if the ctrl box is empty\r
+                       if (ctrl.getLength() == 0) {\r
+                               ctrl.onPostRender.add(function(ed, n) {\r
+                                       if (!ctrl.NativeListBox) {\r
                                                Event.add(n.id + '_text', 'focus', t._importClasses, t);\r
                                                Event.add(n.id + '_text', 'mousedown', t._importClasses, t);\r
                                                Event.add(n.id + '_open', 'focus', t._importClasses, t);\r
                                });\r
                        }\r
 \r
-                       return c;\r
+                       return ctrl;\r
                },\r
 \r
                _createFontSelect : function() {\r
                        var c, t = this, ed = t.editor;\r
 \r
-                       c = ed.controlManager.createListBox('fontselect', {title : 'advanced.fontdefault', cmd : 'FontName'});\r
+                       c = ed.controlManager.createListBox('fontselect', {\r
+                               title : 'advanced.fontdefault',\r
+                               onselect : function(v) {\r
+                                       ed.execCommand('FontName', false, v);\r
+\r
+                                       // Fake selection, execCommand will fire a nodeChange and update the selection\r
+                                       c.select(function(sv) {\r
+                                               return v == sv;\r
+                                       });\r
+\r
+                                       return false; // No auto select\r
+                               }\r
+                       });\r
+\r
                        if (c) {\r
                                each(ed.getParam('theme_advanced_fonts', t.settings.theme_advanced_fonts, 'hash'), function(v, k) {\r
                                        c.add(ed.translate(k), v, {style : v.indexOf('dings') == -1 ? 'font-family:' + v : ''});\r
                        var t = this, ed = t.editor, c, i = 0, cl = [];\r
 \r
                        c = ed.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', onselect : function(v) {\r
-                               if (v.fontSize)\r
+                               if (v['class']) {\r
+                                       ed.focus();\r
+                                       ed.undoManager.add();\r
+                                       ed.formatter.toggle('fontsize_class', {value : v['class']});\r
+                                       ed.undoManager.add();\r
+                                       ed.nodeChanged();\r
+                               } else\r
                                        ed.execCommand('FontSize', false, v.fontSize);\r
-                               else {\r
-                                       each(t.settings.theme_advanced_font_sizes, function(v, k) {\r
-                                               if (v['class'])\r
-                                                       cl.push(v['class']);\r
-                                       });\r
 \r
-                                       ed.editorCommands._applyInlineStyle('span', {'class' : v['class']}, {check_classes : cl});\r
-                               }\r
+                               // Fake selection, execCommand will fire a nodeChange and update the selection\r
+                               c.select(function(sv) {\r
+                                       return v == sv;\r
+                               });\r
+\r
+                               return false; // No auto select\r
                        }});\r
 \r
                        if (c) {\r
                },\r
 \r
                resizeTo : function(w, h) {\r
-                       var ed = this.editor, s = ed.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr'), dh;\r
+                       var ed = this.editor, s = this.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr');\r
 \r
                        // Boundery fix box\r
                        w = Math.max(s.theme_advanced_resizing_min_width || 100, w);\r
                        w = Math.min(s.theme_advanced_resizing_max_width || 0xFFFF, w);\r
                        h = Math.min(s.theme_advanced_resizing_max_height || 0xFFFF, h);\r
 \r
-                       // Calc difference between iframe and container\r
-                       dh = e.clientHeight - ifr.clientHeight;\r
-\r
                        // Resize iframe and container\r
-                       DOM.setStyle(ifr, 'height', h - dh);\r
-                       DOM.setStyles(e, {width : w, height : h});\r
+                       DOM.setStyle(e, 'height', '');\r
+                       DOM.setStyle(ifr, 'height', h);\r
+\r
+                       if (s.theme_advanced_resize_horizontal) {\r
+                               DOM.setStyle(e, 'width', '');\r
+                               DOM.setStyle(ifr, 'width', w);\r
+\r
+                               // Make sure that the size is never smaller than the over all ui\r
+                               if (w < e.clientWidth)\r
+                                       DOM.setStyle(ifr, 'width', e.clientWidth);\r
+                       }\r
                },\r
 \r
                destroy : function() {\r
                                                if (!o)\r
                                                        return;\r
 \r
-                                               if (s.theme_advanced_resize_horizontal)\r
-                                                       c.style.width = Math.max(10, o.cw) + 'px';\r
-\r
-                                               c.style.height = Math.max(10, o.ch) + 'px';\r
-                                               DOM.get(ed.id + '_ifr').style.height = Math.max(10, parseInt(o.ch) + t.deltaHeight) + 'px';\r
+                                               t.resizeTo(o.cw, o.ch);\r
                                        });\r
                                }\r
 \r
                                ed.onPostRender.add(function() {\r
                                        Event.add(ed.id + '_resize', 'mousedown', function(e) {\r
-                                               var c, p, w, h, n, pa;\r
-\r
-                                               // Measure container\r
-                                               c = DOM.get(ed.id + '_tbl');\r
-                                               w = c.clientWidth;\r
-                                               h = c.clientHeight;\r
-\r
-                                               miw = s.theme_advanced_resizing_min_width || 100;\r
-                                               mih = s.theme_advanced_resizing_min_height || 100;\r
-                                               maw = s.theme_advanced_resizing_max_width || 0xFFFF;\r
-                                               mah = s.theme_advanced_resizing_max_height || 0xFFFF;\r
-\r
-                                               // Setup placeholder\r
-                                               p = DOM.add(DOM.get(ed.id + '_parent'), 'div', {'class' : 'mcePlaceHolder'});\r
-                                               DOM.setStyles(p, {width : w, height : h});\r
-\r
-                                               // Replace with placeholder\r
-                                               DOM.hide(c);\r
-                                               DOM.show(p);\r
-\r
-                                               // Create internal resize obj\r
-                                               r = {\r
-                                                       x : e.screenX,\r
-                                                       y : e.screenY,\r
-                                                       w : w,\r
-                                                       h : h,\r
-                                                       dx : null,\r
-                                                       dy : null\r
-                                               };\r
-\r
-                                               // Start listening\r
-                                               mf = Event.add(DOM.doc, 'mousemove', function(e) {\r
-                                                       var w, h;\r
-\r
-                                                       // Calc delta values\r
-                                                       r.dx = e.screenX - r.x;\r
-                                                       r.dy = e.screenY - r.y;\r
-\r
-                                                       // Boundery fix box\r
-                                                       w = Math.max(miw, r.w + r.dx);\r
-                                                       h = Math.max(mih, r.h + r.dy);\r
-                                                       w = Math.min(maw, w);\r
-                                                       h = Math.min(mah, h);\r
-\r
-                                                       // Resize placeholder\r
-                                                       if (s.theme_advanced_resize_horizontal)\r
-                                                               p.style.width = w + 'px';\r
+                                               var mouseMoveHandler1, mouseMoveHandler2,\r
+                                                       mouseUpHandler1, mouseUpHandler2,\r
+                                                       startX, startY, startWidth, startHeight, width, height, ifrElm;\r
 \r
-                                                       p.style.height = h + 'px';\r
+                                               function resizeOnMove(e) {\r
+                                                       width = startWidth + (e.screenX - startX);\r
+                                                       height = startHeight + (e.screenY - startY);\r
 \r
-                                                       return Event.cancel(e);\r
-                                               });\r
-\r
-                                               me = Event.add(DOM.doc, 'mouseup', function(e) {\r
-                                                       var ifr;\r
+                                                       t.resizeTo(width, height);\r
+                                               };\r
 \r
+                                               function endResize(e) {\r
                                                        // Stop listening\r
-                                                       Event.remove(DOM.doc, 'mousemove', mf);\r
-                                                       Event.remove(DOM.doc, 'mouseup', me);\r
-\r
-                                                       c.style.display = '';\r
-                                                       DOM.remove(p);\r
-\r
-                                                       if (r.dx === null)\r
-                                                               return;\r
-\r
-                                                       ifr = DOM.get(ed.id + '_ifr');\r
-\r
-                                                       if (s.theme_advanced_resize_horizontal)\r
-                                                               c.style.width = Math.max(10, r.w + r.dx) + 'px';\r
-\r
-                                                       c.style.height = Math.max(10, r.h + r.dy) + 'px';\r
-                                                       ifr.style.height = Math.max(10, ifr.clientHeight + r.dy) + 'px';\r
+                                                       Event.remove(DOM.doc, 'mousemove', mouseMoveHandler1);\r
+                                                       Event.remove(ed.getDoc(), 'mousemove', mouseMoveHandler2);\r
+                                                       Event.remove(DOM.doc, 'mouseup', mouseUpHandler1);\r
+                                                       Event.remove(ed.getDoc(), 'mouseup', mouseUpHandler2);\r
 \r
+                                                       // Store away the size\r
                                                        if (s.theme_advanced_resizing_use_cookie) {\r
                                                                Cookie.setHash("TinyMCE_" + ed.id + "_size", {\r
-                                                                       cw : r.w + r.dx,\r
-                                                                       ch : r.h + r.dy\r
+                                                                       cw : width,\r
+                                                                       ch : height\r
                                                                });\r
                                                        }\r
-                                               });\r
+                                               };\r
+\r
+                                               e.preventDefault();\r
+\r
+                                               // Get the current rect size\r
+                                               startX = e.screenX;\r
+                                               startY = e.screenY;\r
+                                               ifrElm = DOM.get(t.editor.id + '_ifr');\r
+                                               startWidth = width = ifrElm.clientWidth;\r
+                                               startHeight = height = ifrElm.clientHeight;\r
 \r
-                                               return Event.cancel(e);\r
+                                               // Register envent handlers\r
+                                               mouseMoveHandler1 = Event.add(DOM.doc, 'mousemove', resizeOnMove);\r
+                                               mouseMoveHandler2 = Event.add(ed.getDoc(), 'mousemove', resizeOnMove);\r
+                                               mouseUpHandler1 = Event.add(DOM.doc, 'mouseup', endResize);\r
+                                               mouseUpHandler2 = Event.add(ed.getDoc(), 'mouseup', endResize);\r
                                        });\r
                                });\r
                        }\r
                        n = tb = null;\r
                },\r
 \r
-               _nodeChanged : function(ed, cm, n, co) {\r
-                       var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn;\r
-\r
-                       if (s.readonly)\r
-                               return;\r
+               _nodeChanged : function(ed, cm, n, co, ob) {\r
+                       var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, formatNames, matches;\r
 \r
                        tinymce.each(t.stateControls, function(c) {\r
                                cm.setActive(c, ed.queryCommandState(t.controls[c][1]));\r
                        });\r
 \r
+                       function getParent(name) {\r
+                               var i, parents = ob.parents, func = name;\r
+\r
+                               if (typeof(name) == 'string') {\r
+                                       func = function(node) {\r
+                                               return node.nodeName == name;\r
+                                       };\r
+                               }\r
+\r
+                               for (i = 0; i < parents.length; i++) {\r
+                                       if (func(parents[i]))\r
+                                               return parents[i];\r
+                               }\r
+                       };\r
+\r
                        cm.setActive('visualaid', ed.hasVisual);\r
                        cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing);\r
                        cm.setDisabled('redo', !ed.undoManager.hasRedo());\r
                        cm.setDisabled('outdent', !ed.queryCommandState('Outdent'));\r
 \r
-                       p = DOM.getParent(n, 'A');\r
+                       p = getParent('A');\r
                        if (c = cm.get('link')) {\r
                                if (!p || !p.name) {\r
                                        c.setDisabled(!p && co);\r
 \r
                        if (c = cm.get('anchor')) {\r
                                c.setActive(!!p && p.name);\r
-\r
-                               if (tinymce.isWebKit) {\r
-                                       p = DOM.getParent(n, 'IMG');\r
-                                       c.setActive(!!p && DOM.getAttrib(p, 'mce_name') == 'a');\r
-                               }\r
                        }\r
 \r
-                       p = DOM.getParent(n, 'IMG');\r
+                       p = getParent('IMG');\r
                        if (c = cm.get('image'))\r
                                c.setActive(!!p && n.className.indexOf('mceItem') == -1);\r
 \r
                        if (c = cm.get('styleselect')) {\r
-                               if (n.className) {\r
-                                       t._importClasses();\r
-                                       c.select(n.className);\r
-                               } else\r
-                                       c.select();\r
+                               t._importClasses();\r
+\r
+                               formatNames = [];\r
+                               each(c.items, function(item) {\r
+                                       formatNames.push(item.value);\r
+                               });\r
+\r
+                               matches = ed.formatter.matchAll(formatNames);\r
+                               c.select(matches[0]);\r
                        }\r
 \r
                        if (c = cm.get('formatselect')) {\r
-                               p = DOM.getParent(n, DOM.isBlock);\r
+                               p = getParent(DOM.isBlock);\r
 \r
                                if (p)\r
                                        c.select(p.nodeName.toLowerCase());\r
                        }\r
 \r
-                       if (ed.settings.convert_fonts_to_spans) {\r
-                               ed.dom.getParent(n, function(n) {\r
-                                       if (n.nodeName === 'SPAN') {\r
-                                               if (!cl && n.className)\r
-                                                       cl = n.className;\r
+                       // Find out current fontSize, fontFamily and fontClass\r
+                       getParent(function(n) {\r
+                               if (n.nodeName === 'SPAN') {\r
+                                       if (!cl && n.className)\r
+                                               cl = n.className;\r
 \r
-                                               if (!fz && n.style.fontSize)\r
-                                                       fz = n.style.fontSize;\r
+                                       if (!fz && n.style.fontSize)\r
+                                               fz = n.style.fontSize;\r
 \r
-                                               if (!fn && n.style.fontFamily)\r
-                                                       fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase();\r
-                                       }\r
+                                       if (!fn && n.style.fontFamily)\r
+                                               fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase();\r
+                               }\r
+\r
+                               return false;\r
+                       });\r
 \r
-                                       return false;\r
+                       if (c = cm.get('fontselect')) {\r
+                               c.select(function(v) {\r
+                                       return v.replace(/^([^,]+).*/, '$1').toLowerCase() == fn;\r
                                });\r
+                       }\r
 \r
-                               if (c = cm.get('fontselect')) {\r
-                                       c.select(function(v) {\r
-                                               return v.replace(/^([^,]+).*/, '$1').toLowerCase() == fn;\r
-                                       });\r
-                               }\r
+                       // Select font size\r
+                       if (c = cm.get('fontsizeselect')) {\r
+                               // Use computed style\r
+                               if (s.theme_advanced_runtime_fontsize && !fz && !cl)\r
+                                       fz = ed.dom.getStyle(n, 'fontSize', true);\r
 \r
-                               if (c = cm.get('fontsizeselect')) {\r
-                                       c.select(function(v) {\r
-                                               if (v.fontSize && v.fontSize === fz)\r
-                                                       return true;\r
+                               c.select(function(v) {\r
+                                       if (v.fontSize && v.fontSize === fz)\r
+                                               return true;\r
 \r
-                                               if (v['class'] && v['class'] === cl)\r
-                                                       return true;\r
-                                       });\r
-                               }\r
-                       } else {\r
-                               if (c = cm.get('fontselect'))\r
-                                       c.select(ed.queryCommandValue('FontName'));\r
-\r
-                               if (c = cm.get('fontsizeselect')) {\r
-                                       v = ed.queryCommandValue('FontSize');\r
-                                       c.select(function(iv) {\r
-                                               return iv.fontSize == v;\r
-                                       });\r
-                               }\r
+                                       if (v['class'] && v['class'] === cl)\r
+                                               return true;\r
+                               });\r
                        }\r
 \r
                        if (s.theme_advanced_path && s.theme_advanced_statusbar_location) {\r
                                p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'});\r
                                DOM.setHTML(p, '');\r
 \r
-                               ed.dom.getParent(n, function(n) {\r
+                               getParent(function(n) {\r
                                        var na = n.nodeName.toLowerCase(), u, pi, ti = '';\r
 \r
+                                       /*if (n.getAttribute('_mce_bogus'))\r
+                                               return;\r
+*/\r
                                        // Ignore non element and hidden elements\r
                                        if (n.nodeType != 1 || n.nodeName === 'BR' || (DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved')))\r
                                                return;\r
                                                        break;\r
 \r
                                                case 'font':\r
-                                                       if (s.convert_fonts_to_spans)\r
-                                                               na = 'span';\r
-\r
                                                        if (v = DOM.getAttrib(n, 'face'))\r
                                                                ti += 'font: ' + v + ' ';\r
 \r
                                                ti += 'id: ' + v + ' ';\r
 \r
                                        if (v = n.className) {\r
-                                               v = v.replace(/(webkit-[\w\-]+|Apple-[\w\-]+|mceItem\w+|mceVisualAid)/g, '');\r
+                                               v = v.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g, '')\r
 \r
-                                               if (v && v.indexOf('mceItem') == -1) {\r
+                                               if (v) {\r
                                                        ti += 'class: ' + v + ' ';\r
 \r
                                                        if (DOM.isBlock(n) || na == 'img' || na == 'span')\r
index 7ec1052ba54a6813ce9ddb4820037bca3fb10680..f30d670641afcb284105b7bbc79afcbd102b2aa4 100644 (file)
        </div>\r
 \r
        <div class="mceActionPanel">\r
-               <div style="float: left">\r
-                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
-               </div>\r
-\r
-               <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-               </div>\r
+               <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
        </div>\r
 </form>\r
 </body>\r
index ccac36f54d983cc33a0a6e45134e3dabf1820367..e46de5333082869b9bdab2576a554a2f9d01a966 100644 (file)
Binary files a/program/js/tiny_mce/themes/advanced/img/icons.gif and b/program/js/tiny_mce/themes/advanced/img/icons.gif differ
index b5efd1ec9736d60bdd261cdde9987f15e4d095c2..7fe7810558e74edefb59a63da1c14cfc9689b139 100644 (file)
@@ -5,7 +5,7 @@ var AnchorDialog = {
                var action, elm, f = document.forms[0];\r
 \r
                this.editor = ed;\r
-               elm = ed.dom.getParent(ed.selection.getNode(), 'A,IMG');\r
+               elm = ed.dom.getParent(ed.selection.getNode(), 'A');\r
                v = ed.dom.getAttrib(elm, 'name');\r
 \r
                if (v) {\r
@@ -17,18 +17,18 @@ var AnchorDialog = {
        },\r
 \r
        update : function() {\r
-               var ed = this.editor;\r
-               \r
+               var ed = this.editor, elm, name = document.forms[0].anchorName.value;\r
+\r
                tinyMCEPopup.restoreSelection();\r
 \r
                if (this.action != 'update')\r
                        ed.selection.collapse(1);\r
 \r
-               // Webkit acts weird if empty inline element is inserted so we need to use a image instead\r
-               if (tinymce.isWebKit)\r
-                       ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('img', {mce_name : 'a', name : document.forms[0].anchorName.value, 'class' : 'mceItemAnchor'}));\r
+               elm = ed.dom.getParent(ed.selection.getNode(), 'A');\r
+               if (elm)\r
+                       elm.name = name;\r
                else\r
-                       ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', {name : document.forms[0].anchorName.value, 'class' : 'mceItemAnchor'}, ''));\r
+                       ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', {name : name, 'class' : 'mceItemAnchor'}, ''));\r
 \r
                tinyMCEPopup.close();\r
        }\r
index 8467ef60366b6fcdc3f9d6471ef88337eaa49ed0..8c5aea1721f56c80391a174cbc1c719ef9d124a1 100644 (file)
@@ -1,3 +1,13 @@
+/**\r
+ * charmap.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
 tinyMCEPopup.requireLangPack();\r
 \r
 var charmap = [\r
index 4982ce0c8e04ddff0f65885ffcf77b109797870b..6423d908095f0f1a221c9dcecde7ca281137b665 100644 (file)
@@ -151,8 +151,8 @@ var ImageDialog = {
                        }\r
 \r
                        // Merge\r
-                       st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st));\r
-                       this.styleVal = dom.serializeStyle(st);\r
+                       st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st), 'img');\r
+                       this.styleVal = dom.serializeStyle(st, 'img');\r
                }\r
        },\r
 \r
index 21aae6cbf88d18f497fe093e95422656365d7a15..f67a5bc82810d5cd57d3b6a05fdf4bee9e199b2c 100644 (file)
@@ -63,8 +63,8 @@ var LinkDialog = {
                                        ed.dom.setAttribs(e, {\r
                                                href : f.href.value,\r
                                                title : f.linktitle.value,\r
-                                               target : f.target_list ? f.target_list.options[f.target_list.selectedIndex].value : null,\r
-                                               'class' : f.class_list ? f.class_list.options[f.class_list.selectedIndex].value : null\r
+                                               target : f.target_list ? getSelectValue(f, "target_list") : null,\r
+                                               'class' : f.class_list ? getSelectValue(f, "class_list") : null\r
                                        });\r
                                }\r
                        });\r
@@ -72,8 +72,8 @@ var LinkDialog = {
                        ed.dom.setAttribs(e, {\r
                                href : f.href.value,\r
                                title : f.linktitle.value,\r
-                               target : f.target_list ? f.target_list.options[f.target_list.selectedIndex].value : null,\r
-                               'class' : f.class_list ? f.class_list.options[f.class_list.selectedIndex].value : null\r
+                               target : f.target_list ? getSelectValue(f, "target_list") : null,\r
+                               'class' : f.class_list ? getSelectValue(f, "class_list") : null\r
                        });\r
                }\r
 \r
index 6579a5c6cfc418be28958f0fa550fc27ff570806..2a8282e8461e26ba7f6b46d819b54efe6874b0b4 100755 (executable)
@@ -1,62 +1,62 @@
 tinyMCE.addI18n('ar.advanced',{\r
 style_select:"Styles",\r
-font_size:"\u062D\u062C\u0645 \u0627\u0644\u062E\u0637",\r
-fontdefault:"\u0646\u0648\u0639 \u0627\u0644\u062E\u0637",\r
-block:"\u062A\u0646\u0633\u064A\u0642",\r
-paragraph:"\u0641\u0642\u0631\u0629",\r
+font_size:"Font size",\r
+fontdefault:"Font family",\r
+block:"Format",\r
+paragraph:"Paragraph",\r
 div:"Div",\r
-address:"\u0639\u0646\u0648\u0627\u0646",\r
+address:"Address",\r
 pre:"Preformatted",\r
-h1:"\u0639\u0646\u0648\u0627\u0646 1",\r
-h2:"\u0639\u0646\u0648\u0627\u0646 2",\r
-h3:"\u0639\u0646\u0648\u0627\u0646 3",\r
-h4:"\u0639\u0646\u0648\u0627\u0646 4",\r
-h5:"\u0639\u0646\u0648\u0627\u0646 5",\r
-h6:"\u0639\u0646\u0648\u0627\u0646 6",\r
+h1:"Heading 1",\r
+h2:"Heading 2",\r
+h3:"Heading 3",\r
+h4:"Heading 4",\r
+h5:"Heading 5",\r
+h6:"Heading 6",\r
 blockquote:"Blockquote",\r
-code:"\u0643\u0648\u062F",\r
-samp:"\u0643\u0648\u062F \u0628\u0633\u064A\u0637",\r
+code:"Code",\r
+samp:"Code sample",\r
 dt:"Definition term ",\r
 dd:"Definition description",\r
-bold_desc:"\u0639\u0631\u064A\u0636 (Ctrl+B)",\r
-italic_desc:"\u0645\u0627\u0626\u0644 (Ctrl+I)",\r
-underline_desc:"\u062A\u062D\u062A\u0647 \u062E\u0637 (Ctrl+U)",\r
-striketrough_desc:"\u064A\u062A\u0648\u0633\u0637\u0629 \u062E\u0637",\r
-justifyleft_desc:"\u0645\u062D\u0627\u0630\u0627\u0629 \u0644\u0644\u064A\u0633\u0627\u0631",\r
-justifycenter_desc:"\u0645\u062D\u0627\u0630\u0627\u0629 \u0644\u0644\u0648\u0633\u0637",\r
-justifyright_desc:"\u0645\u062D\u0627\u0630\u0627\u0629 \u064A\u0645\u064A\u0646",\r
-justifyfull_desc:"\u0636\u0628\u0637",\r
-bullist_desc:"\u062A\u0639\u062F\u0627\u062F \u0646\u0642\u0637\u064A",\r
-numlist_desc:"\u062A\u0639\u062F\u0627\u062F \u0631\u0642\u0645\u064A",\r
-outdent_desc:"\u0625\u0646\u0642\u0627\u0635 \u0627\u0644\u0645\u0633\u0627\u0641\u0629 \u0627\u0644\u0628\u0627\u062F\u0626\u0629",\r
-indent_desc:"\u0632\u064A\u0627\u062F\u0629 \u0627\u0644\u0645\u0633\u0627\u0641\u0629 \u0627\u0644\u0628\u0627\u062F\u0626\u0629",\r
-undo_desc:"\u062A\u0631\u0627\u062C\u0639 (Ctrl+Z)",\r
-redo_desc:"\u0625\u0639\u0627\u062F\u0629 (Ctrl+Y)",\r
-link_desc:"\u0625\u062F\u0631\u0627\u062C/\u062A\u062D\u0631\u064A\u0631 \u0631\u0627\u0628\u0637",\r
-unlink_desc:"\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0631\u0627\u0628\u0637",\r
-image_desc:"\u0625\u062F\u0631\u0627\u062C/\u062A\u062D\u0631\u064A\u0631 \u0635\u0648\u0631\u0629",\r
-cleanup_desc:"\u062A\u0646\u0636\u064A\u0641 \u0627\u0644\u0623\u0643\u0648\u0627\u062F \u0627\u0644\u062E\u0627\u0637\u0626\u0629",\r
-code_desc:"\u062A\u062D\u0631\u064A\u0631 \u0643\u0648\u062F HTML",\r
-sub_desc:"\u0623\u0633\u0641\u0644 \u0627\u0644\u0646\u0635",\r
-sup_desc:"\u0623\u0639\u0644\u0649 \u0627\u0644\u0646\u0635",\r
-hr_desc:"\u0625\u062F\u0631\u0627\u062C \u062E\u0637 \u0627\u0641\u0642\u064A",\r
-removeformat_desc:"\u0645\u0633\u062D \u0627\u0644\u062A\u0646\u0633\u064A\u0642\u0627\u062A",\r
+bold_desc:"Bold (Ctrl+B)",\r
+italic_desc:"Italic (Ctrl+I)",\r
+underline_desc:"Underline (Ctrl+U)",\r
+striketrough_desc:"Strikethrough",\r
+justifyleft_desc:"Align left",\r
+justifycenter_desc:"Align center",\r
+justifyright_desc:"Align right",\r
+justifyfull_desc:"Align full",\r
+bullist_desc:"Unordered list",\r
+numlist_desc:"Ordered list",\r
+outdent_desc:"Outdent",\r
+indent_desc:"Indent",\r
+undo_desc:"Undo (Ctrl+Z)",\r
+redo_desc:"Redo (Ctrl+Y)",\r
+link_desc:"Insert/edit link",\r
+unlink_desc:"Unlink",\r
+image_desc:"Insert/edit image",\r
+cleanup_desc:"Cleanup messy code",\r
+code_desc:"Edit HTML Source",\r
+sub_desc:"Subscript",\r
+sup_desc:"Superscript",\r
+hr_desc:"Insert horizontal ruler",\r
+removeformat_desc:"Remove formatting",\r
 custom1_desc:"Your custom description here",\r
-forecolor_desc:"\u062D\u062F\u062F \u0644\u0648\u0646 \u0627\u0644\u0646\u0635",\r
-backcolor_desc:"\u062D\u062F\u062F \u0644\u0648\u0646 \u0627\u0644\u062E\u0644\u0641\u064A\u0629",\r
-charmap_desc:"\u0625\u062F\u0627\u0631\u062C \u062D\u0631\u0641 \u0645\u062E\u0635\u0635",\r
+forecolor_desc:"Select text color",\r
+backcolor_desc:"Select background color",\r
+charmap_desc:"Insert custom character",\r
 visualaid_desc:"Toggle guidelines/invisible elements",\r
-anchor_desc:"\u0625\u062F\u0631\u0627\u062C/\u062A\u062D\u0631\u064A\u0631 \u0639\u0644\u0627\u0645\u0629",\r
-cut_desc:"\u0642\u0635",\r
-copy_desc:"\u0646\u0633\u062E",\r
-paste_desc:"\u0644\u0635\u0642",\r
-image_props_desc:"\u062E\u0635\u0627\u0626\u0635 \u0627\u0644\u0635\u0648\u0631\u0629",\r
-newdocument_desc:"\u0645\u0633\u062A\u0646\u062F \u062C\u062F\u064A\u062F",\r
-help_desc:"\u0645\u0633\u0627\u0639\u062F\u0629",\r
+anchor_desc:"Insert/edit anchor",\r
+cut_desc:"Cut",\r
+copy_desc:"Copy",\r
+paste_desc:"Paste",\r
+image_props_desc:"Image properties",\r
+newdocument_desc:"New document",\r
+help_desc:"Help",\r
 blockquote_desc:"Blockquote",\r
-clipboard_msg:"\u0646\u0633\u062E/\u0642\u0635/\u0644\u0635\u0642 \u063A\u064A\u0631 \u0645\u062A\u0648\u0641\u0631\u0629 \u0644\u0645\u062A\u0635\u0641\u062D Mozilla \u0648 Firefox.\n\u0647\u0644 \u062A\u0631\u064A\u062F \u0645\u0639\u0631\u0641\u0629 \u0627\u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u062D\u0648\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u0648\u0636\u0648\u0639?",\r
-path:"\u0627\u0644\u0645\u0633\u0627\u0631",\r
-newdocument:"\u0647\u0644 \u062A\u0631\u064A\u062F \u062D\u0642\u0627 \u0645\u0633\u062D \u062C\u0645\u064A\u0639 \u0627\u0644\u0645\u062D\u062A\u0648\u064A\u0627\u062A?",\r
-toolbar_focus:"\u0625\u0646\u062A\u0642\u0627\u0644 \u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u0623\u062F\u0648\u0627\u062A - Alt+Q, \u0625\u0646\u062A\u0642\u0627\u0644 \u0644\u0644\u0645\u062D\u0631\u0631 - Alt-Z, \u0625\u0646\u062A\u0642\u0627\u0644 \u0644\u0644\u0645\u0633\u0627\u0631 - Alt-X",\r
-more_colors:"\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0623\u0644\u0648\u0627\u0646"\r
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you want more information about this issue?",\r
+path:"Path",\r
+newdocument:"Are you sure you want clear all contents?",\r
+toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",\r
+more_colors:"More colors"\r
 });
\ No newline at end of file
index 463313a66932a0979c02a37214d969408e2ff0bd..26562d9a28e9d39bea85792b49a76bb3253d2d91 100755 (executable)
@@ -1,51 +1,51 @@
 tinyMCE.addI18n('ar.advanced_dlg',{\r
-about_title:"\u062D\u0648\u0644 TinyMCE",\r
-about_general:"\u062D\u0648\u0644",\r
-about_help:"\u0645\u0633\u0627\u0639\u062F\u0629",\r
-about_license:"\u0627\u0644\u0631\u062E\u0635\u0629",\r
-about_plugins:"\u0627\u0644\u0625\u0636\u0627\u0641\u0627\u062A",\r
-about_plugin:"\u0627\u0644\u0625\u0636\u0627\u0641\u0629",\r
-about_author:"\u0627\u0644\u0645\u0628\u0631\u0645\u062C",\r
-about_version:"\u0627\u0644\u0625\u0635\u062F\u0627\u0631",\r
-about_loaded:"\u0627\u0644\u0625\u0636\u0627\u0641\u0627\u062A \u0627\u0644\u0645\u062D\u0645\u0644\u0629",\r
-anchor_title:"\u0625\u062F\u0631\u0627\u062C/\u062A\u062D\u0631\u064A\u0631 \u0639\u0644\u0627\u0645\u0629",\r
-anchor_name:"\u0627\u0633\u0645 \u0627\u0644\u0639\u0644\u0627\u0645\u0629",\r
-code_title:"\u0645\u062D\u0631\u0631 \u0643\u0648\u062F HTML",\r
-code_wordwrap:"\u0627\u0644\u062A\u0641\u0627\u0641 \u0627\u0644\u0646\u0635",\r
-colorpicker_title:"\u062D\u062F\u062F \u0644\u0648\u0646",\r
-colorpicker_picker_tab:"\u0627\u0644\u0645\u0627\u0632\u062C",\r
-colorpicker_picker_title:"\u0645\u0627\u0632\u062C \u0627\u0644\u0623\u0644\u0648\u0627\u0646",\r
-colorpicker_palette_tab:"\u0627\u0644\u0644\u0648\u062D\u0629",\r
-colorpicker_palette_title:"\u0644\u0648\u062D\u0629 \u0627\u0644\u0623\u0644\u0648\u0627\u0646",\r
-colorpicker_named_tab:"\u0627\u0644\u0623\u0633\u0645\u0627\u0621",\r
-colorpicker_named_title:"\u0627\u0633\u0645\u0627\u0621 \u0627\u0644\u0623\u0644\u0648\u0627\u0646",\r
-colorpicker_color:"\u0627\u0644\u0644\u0648\u0646:",\r
-colorpicker_name:"\u0627\u0644\u0623\u0633\u0645:",\r
-charmap_title:"\u062D\u062F\u062F \u062D\u0631\u0641 \u0645\u062E\u0635\u0635",\r
-image_title:"\u0625\u062F\u0631\u0627\u062C/\u062A\u062D\u0631\u064A\u0631 \u0635\u0648\u0631\u0629",\r
-image_src:"\u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629",\r
-image_alt:"\u0648\u0635\u0641 \u0627\u0644\u0635\u0648\u0631\u0629",\r
-image_list:"\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0635\u0648\u0631",\r
-image_border:"\u0627\u0644\u062D\u062F\u0648\u062F",\r
-image_dimensions:"\u0627\u0644\u0642\u064A\u0627\u0633\u0627\u062A",\r
-image_vspace:"\u0645\u0633\u0627\u0641\u0629 \u0639\u0645\u0648\u062F\u064A\u0629",\r
-image_hspace:"\u0645\u0633\u0627\u0641\u0629 \u0627\u0641\u0642\u064A\u0629",\r
-image_align:"\u0645\u062D\u0627\u0630\u0627\u0629",\r
-image_align_baseline:"\u062E\u0637 \u0627\u0644\u0642\u0627\u0639\u062F\u0629",\r
-image_align_top:"\u0623\u0639\u0644\u0649",\r
-image_align_middle:"\u062A\u0648\u0633\u064A\u0637 \u0639\u0645\u0648\u062F\u064A",\r
-image_align_bottom:"\u0627\u0633\u0641\u0644",\r
-image_align_texttop:"\u0623\u0639\u0644\u0649 \u0627\u0644\u0646\u0635",\r
-image_align_textbottom:"\u0623\u0633\u0641\u0644 \u0627\u0644\u0646\u0635",\r
-image_align_left:"\u064A\u0633\u0627\u0631",\r
-image_align_right:"\u064A\u0645\u064A\u0646",\r
-link_title:"\u0625\u062F\u0631\u0627\u062C/\u062A\u062D\u0631\u064A\u0631 \u0631\u0627\u0628\u0637",\r
-link_url:"\u0627\u0644\u0631\u0627\u0628\u0637",\r
-link_target:"\u0627\u0644\u0645\u0633\u0627\u0631",\r
-link_target_same:"\u0641\u062A\u062D \u0627\u0644\u0631\u0627\u0628\u0637 \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0635\u0641\u062D\u0629",\r
-link_target_blank:"\u0641\u062A\u062D \u0627\u0644\u0631\u0627\u0628\u0637 \u0641\u064A \u0635\u0641\u062D\u0629 \u062C\u062F\u064A\u062F\u0629",\r
-link_titlefield:"\u0627\u0644\u0639\u0646\u0648\u0627\u0646",\r
+about_title:"About TinyMCE",\r
+about_general:"About",\r
+about_help:"Help",\r
+about_license:"License",\r
+about_plugins:"Plugins",\r
+about_plugin:"Plugin",\r
+about_author:"Author",\r
+about_version:"Version",\r
+about_loaded:"Loaded plugins",\r
+anchor_title:"Insert/edit anchor",\r
+anchor_name:"Anchor name",\r
+code_title:"HTML Source Editor",\r
+code_wordwrap:"Word wrap",\r
+colorpicker_title:"Select a color",\r
+colorpicker_picker_tab:"Picker",\r
+colorpicker_picker_title:"Color picker",\r
+colorpicker_palette_tab:"Palette",\r
+colorpicker_palette_title:"Palette colors",\r
+colorpicker_named_tab:"Named",\r
+colorpicker_named_title:"Named colors",\r
+colorpicker_color:"Color:",\r
+colorpicker_name:"Name:",\r
+charmap_title:"Select custom character",\r
+image_title:"Insert/edit image",\r
+image_src:"Image URL",\r
+image_alt:"Image description",\r
+image_list:"Image list",\r
+image_border:"Border",\r
+image_dimensions:"Dimensions",\r
+image_vspace:"Vertical space",\r
+image_hspace:"Horizontal space",\r
+image_align:"Alignment",\r
+image_align_baseline:"Baseline",\r
+image_align_top:"Top",\r
+image_align_middle:"Middle",\r
+image_align_bottom:"Bottom",\r
+image_align_texttop:"Text top",\r
+image_align_textbottom:"Text bottom",\r
+image_align_left:"Left",\r
+image_align_right:"Right",\r
+link_title:"Insert/edit link",\r
+link_url:"Link URL",\r
+link_target:"Target",\r
+link_target_same:"Open link in the same window",\r
+link_target_blank:"Open link in a new window",\r
+link_titlefield:"Title",\r
 link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",\r
 link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",\r
-link_list:"\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0648\u0627\u0628\u0637"\r
+link_list:"Link list"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/az.js b/program/js/tiny_mce/themes/advanced/langs/az.js
new file mode 100644 (file)
index 0000000..c82cf6c
--- /dev/null
@@ -0,0 +1,63 @@
+tinyMCE.addI18n('az.advanced',{\r
+style_select:"Still\u0259r",\r
+font_size:"\u015Erift \u00F6l\u00E7\u00FC\u015F\u00FC",\r
+fontdefault:"\u015Erift",\r
+block:"Format",\r
+paragraph:"Abzas",\r
+div:"B\u00F6lm\u0259",\r
+address:"\u00DCnvan",\r
+pre:"Formatlanm\u0131\u015F m\u0259tn",\r
+h1:"Ba\u015Fl\u0131q 1",\r
+h2:"Ba\u015Fl\u0131q 2",\r
+h3:"Ba\u015Fl\u0131q 3",\r
+h4:"Ba\u015Fl\u0131q 4",\r
+h5:"Ba\u015Fl\u0131q 5",\r
+h6:"Ba\u015Fl\u0131q 6",\r
+blockquote:"Sitat bloku",\r
+code:"Kod",\r
+samp:"Kod n\u00FCmun\u0259si",\r
+dt:"M\u00FC\u0259yy\u0259n edil\u0259n termin",\r
+dd:"Terminin m\u00FC\u0259yy\u0259n edilm\u0259si",\r
+bold_desc:"Yar\u0131qal\u0131n (Ctrl+B)",\r
+italic_desc:"Kursiv (Ctrl+I)",\r
+underline_desc:"Altdan x\u0259tt (Ctrl+U)",\r
+striketrough_desc:"Qaralanm\u0131\u015F",\r
+justifyleft_desc:"Soldan d\u00FCzl\u0259ndir",\r
+justifycenter_desc:"M\u0259rk\u0259z\u0259 d\u00FCzl\u0259ndir",\r
+justifyright_desc:"Sa\u011Fdan d\u00FCzl\u0259ndir",\r
+justifyfull_desc:"Enin\u0259 d\u00FCzl\u0259ndir",\r
+bullist_desc:"Qeyd edilmi\u015F siyah\u0131",\r
+numlist_desc:"N\u00F6mr\u0259l\u0259nmi\u015F siyah\u0131",\r
+outdent_desc:"Bo\u015F yeri ki\u00E7ilt",\r
+indent_desc:"Bo\u015F yeri b\u00F6y\u00FCt",\r
+undo_desc:"L\u0259\u011Fv et (Ctrl+Z)",\r
+redo_desc:"T\u0259krarla (Ctrl+Y)",\r
+link_desc:"\u018Flav\u0259 et/ke\u00E7idi redakt\u0259 et",\r
+unlink_desc:"Ke\u00E7idi sil",\r
+image_desc:"\u018Flav\u0259 et/\u015F\u0259kili redakt\u0259 et",\r
+cleanup_desc:"\u018Fyri kodu t\u0259mizl\u0259",\r
+code_desc:"HTML-m\u0259nb\u0259ni redakt\u0259 et",\r
+sub_desc:"A\u015Fa\u011F\u0131 indeks",\r
+sup_desc:"Yuxar\u0131 indeks",\r
+hr_desc:"\u00DCf\u00FCqi x\u0259tt \u0259lav\u0259 et",\r
+removeformat_desc:"Formatlaman\u0131 l\u0259\u011Fv et",\r
+custom1_desc:"\u00D6z t\u0259svirinizi daxil edin",\r
+forecolor_desc:"M\u0259tnin r\u0259ngini se\u00E7",\r
+backcolor_desc:"Fonun r\u0259ngini se\u00E7",\r
+charmap_desc:"X\u00FCsusi simvol \u0259lav\u0259 et",\r
+visualaid_desc:"G\u00F6nd\u0259ril\u0259n/g\u00F6r\u00FCnm\u0259z elementl\u0259ri yand\u0131r/s\u00F6nd\u00FCr",\r
+anchor_desc:"L\u00F6vb\u0259r \u0259lav\u0259/redakt\u0259 et",\r
+cut_desc:"K\u0259s",\r
+copy_desc:"Kopyala",\r
+paste_desc:"\u018Flav\u0259 et",\r
+image_props_desc:"\u015E\u0259kil x\u00FCsusiyy\u0259ti",\r
+newdocument_desc:"Yeni s\u0259n\u0259d",\r
+help_desc:"K\u00F6m\u0259k",\r
+blockquote_desc:"Sitat bloku",\r
+clipboard_msg:"Kopyalama/\u018Flav\u0259 et Mozilla v\u0259 Firefox-da i\u015Fl\u0259mir.\r\nN\u0259 ba\u015F verdiyi haqda daha \u0259trafl\u0131 \u00F6yr\u0259nm\u0259k ist\u0259yirsiniz?",\r
+path:"Yol",\r
+newdocument:"\u0130\u00E7ind\u0259kil\u0259ri tam t\u0259mizl\u0259m\u0259kd\u0259 \u0259minsiniz?",\r
+toolbar_focus:"Alt+Q - al\u0259t d\u00FCym\u0259l\u0259rin\u0259 ke\u00E7, Alt-Z - redaktoruna ke\u00E7, Alt-X - elementl\u0259r yoluna ke\u00E7",\r
+more_colors:"Daha \u00E7ox r\u0259ng",\r
+image_delta_width:"65"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/az_dlg.js b/program/js/tiny_mce/themes/advanced/langs/az_dlg.js
new file mode 100644 (file)
index 0000000..663dc09
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('az.advanced_dlg',{\r
+about_title:"TinyMCE haqda",\r
+about_general:"Proqram haqq\u0131nda",\r
+about_help:"K\u00F6m\u0259k",\r
+about_license:"Lisenziya",\r
+about_plugins:"Plaginl\u0259r",\r
+about_plugin:"Plaginl\u0259r",\r
+about_author:"M\u00FC\u0259llif",\r
+about_version:"Versiya",\r
+about_loaded:"Y\u00FCkl\u0259nil\u0259n plaginl\u0259r",\r
+anchor_title:"L\u00F6bv\u0259r \u0259lav\u0259/redakt\u0259 et",\r
+anchor_name:"L\u00F6vb\u0259r ad\u0131",\r
+code_title:"HTML-m\u0259nb\u0259 redaktoru",\r
+code_wordwrap:"S\u00F6zl\u0259rin s\u0259tr\u0259 ke\u00E7idi",\r
+colorpicker_title:"R\u0259ngi se\u00E7",\r
+colorpicker_picker_tab:"Se\u00E7im",\r
+colorpicker_picker_title:"R\u0259ng se\u00E7imi",\r
+colorpicker_palette_tab:"Palitra",\r
+colorpicker_palette_title:"Palitra r\u0259ngl\u0259ri",\r
+colorpicker_named_tab:"Adland\u0131r\u0131lm\u0131\u015F",\r
+colorpicker_named_title:"Adland\u0131r\u0131lm\u0131\u015F r\u0259ngl\u0259r",\r
+colorpicker_color:"R\u0259ng:",\r
+colorpicker_name:"Ad\u0131:",\r
+charmap_title:"X\u00FCsusi simvol se\u00E7in",\r
+image_title:"\u015E\u0259kli \u0259lav\u0259/redakt\u0259 et",\r
+image_src:"\u015E\u0259klin \u00FCnvan\u0131",\r
+image_alt:"\u015E\u0259klin t\u0259sviri",\r
+image_list:"\u015E\u0259kil siyah\u0131s\u0131",\r
+image_border:"S\u0259rh\u0259d",\r
+image_dimensions:"\u00D6l\u00E7\u00FCl\u0259r",\r
+image_vspace:"\u015Eaquli f\u0259za",\r
+image_hspace:"\u00DCf\u00FCqi f\u0259za",\r
+image_align:"Tarazla\u015Fd\u0131r",\r
+image_align_baseline:"Bazis liniyas\u0131 \u00FCzr\u0259",\r
+image_align_top:"Yuxar\u0131 il\u0259",\r
+image_align_middle:"M\u0259rk\u0259z il\u0259",\r
+image_align_bottom:"A\u015Fa\u011F\u0131 il\u0259",\r
+image_align_texttop:"M\u0259tn yuxar\u0131s\u0131 il\u0259",\r
+image_align_textbottom:"M\u0259tn a\u015Fa\u011F\u0131s\u0131 \u00FCzr\u0259",\r
+image_align_left:"Sola",\r
+image_align_right:"Sa\u011Fa",\r
+link_title:"Ke\u00E7idi \u0259lav\u0259/redakt\u0259 et",\r
+link_url:"Ke\u00E7id \u00FCnvan\u0131",\r
+link_target:"H\u0259d\u0259f",\r
+link_target_same:"Ke\u00E7idi h\u0259min p\u0259nc\u0259r\u0259d\u0259 a\u00E7",\r
+link_target_blank:"Ke\u00E7idi yeni p\u0259nc\u0259r\u0259d\u0259 a\u00E7",\r
+link_titlefield:"Ad\u0131",\r
+link_is_email:"Daxil edil\u0259n \u00FCnvan e-po\u00E7ta b\u0259nz\u0259yir. mailto: prefiksini \u0259lav\u0259 etm\u0259k ist\u0259yirsiniz?",\r
+link_is_external:"Daxil edil\u0259n \u00FCnvan xarici ke\u00E7id\u0259 b\u0259nz\u0259yir. http:// prefiksini \u0259lav\u0259 etm\u0259k ist\u0259yirsiniz?",\r
+link_list:"Ke\u00E7idl\u0259r siyah\u0131s\u0131"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/be.js b/program/js/tiny_mce/themes/advanced/langs/be.js
new file mode 100644 (file)
index 0000000..3d484a0
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('be.advanced',{\r
+style_select:"\u0421\u0442\u044B\u043B\u0456",\r
+font_size:"\u041F\u0430\u043C\u0435\u0440 \u0448\u0440\u044B\u0444\u0442\u0430",\r
+fontdefault:"\u0428\u0440\u044B\u0444\u0442",\r
+block:"\u0424\u0430\u0440\u043C\u0430\u0442",\r
+paragraph:"\u0410\u0431\u0437\u0430\u0446",\r
+div:"\u041F\u0430\u0434\u0437\u0435\u043B",\r
+address:"\u0410\u0434\u0440\u0430\u0441",\r
+pre:"\u0410\u0434\u0444\u0430\u0440\u043C\u0430\u0442\u0430\u0432\u0430\u043D\u044B \u0442\u044D\u043A\u0441\u0442",\r
+h1:"\u0417\u0430\u0433\u0430\u043B\u043E\u0432\u0430\u043A 1",\r
+h2:"\u0417\u0430\u0433\u0430\u043B\u043E\u0432\u0430\u043A 2",\r
+h3:"\u0417\u0430\u0433\u0430\u043B\u043E\u0432\u0430\u043A 3",\r
+h4:"\u0417\u0430\u0433\u0430\u043B\u043E\u0432\u0430\u043A 4",\r
+h5:"\u0417\u0430\u0433\u0430\u043B\u043E\u0432\u0430\u043A 5",\r
+h6:"\u0417\u0430\u0433\u0430\u043B\u043E\u0432\u0430\u043A 6",\r
+blockquote:"\u0411\u043B\u043E\u043A \u0432\u044B\u043D\u044F\u0442\u043A\u0456",\r
+code:"\u041A\u043E\u0434",\r
+samp:"\u041F\u0440\u044B\u043A\u043B\u0430\u0434 \u043A\u043E\u0434\u0430",\r
+dt:"\u0412\u044B\u0437\u043D\u0430\u0447\u0430\u0435\u043C\u044B \u0442\u044D\u0440\u043C\u0456\u043D",\r
+dd:"\u0410\u0437\u043D\u0430\u0447\u044D\u043D\u043D\u0435 \u0442\u044D\u0440\u043C\u0456\u043D\u0430",\r
+bold_desc:"\u0422\u043E\u045E\u0441\u0442\u044B (Ctrl+B)",\r
+italic_desc:"\u041A\u0443\u0440\u0441\u0456\u045E (Ctrl+I)",\r
+underline_desc:"\u041F\u0430\u0434\u043A\u0440\u044D\u0441\u043B\u0435\u043D\u044B (Ctrl+U)",\r
+striketrough_desc:"\u041F\u0435\u0440\u0430\u043A\u0440\u044D\u0441\u043B\u0435\u043D\u044B",\r
+justifyleft_desc:"\u0412\u044B\u0440\u0430\u045E\u043D\u043E\u045E\u0432\u0430\u043D\u043D\u0435 \u043D\u0430\u043B\u0435\u0432\u0430",\r
+justifycenter_desc:"\u0412\u044B\u0440\u0430\u045E\u043D\u043E\u045E\u0432\u0430\u043D\u043D\u0435 \u043F\u0430 \u0446\u044D\u043D\u0442\u0440\u044B",\r
+justifyright_desc:"\u0412\u044B\u0440\u0430\u045E\u043D\u043E\u045E\u0432\u0430\u043D\u043D\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u0430",\r
+justifyfull_desc:"\u0412\u044B\u0440\u0430\u045E\u043D\u043E\u045E\u0432\u0430\u043D\u043D\u0435 \u043F\u0430 \u0448\u044B\u0440\u044B\u043D\u0456",\r
+bullist_desc:"\u041C\u0430\u0440\u043A\u0456\u0440\u0430\u0432\u0430\u043D\u044B \u0441\u043F\u0456\u0441",\r
+numlist_desc:"\u041D\u0443\u043C\u0430\u0440\u0430\u0432\u0430\u043D\u044B \u0441\u043F\u0456\u0441",\r
+outdent_desc:"\u041F\u0430\u043C\u0435\u043D\u0448\u044B\u0446\u044C \u0432\u043E\u0434\u0441\u0442\u0443\u043F",\r
+indent_desc:"\u041F\u0430\u0432\u044F\u043B\u0456\u0447\u044B\u0446\u044C \u0432\u043E\u0434\u0441\u0442\u0443\u043F",\r
+undo_desc:"\u0410\u0434\u043C\u044F\u043D\u0456\u0446\u044C (Ctrl+Z)",\r
+redo_desc:"\u041F\u0430\u045E\u0442\u0430\u0440\u044B\u0446\u044C (Ctrl+Y)",\r
+link_desc:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044C/\u0440\u044D\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044C \u0441\u043F\u0430\u0441\u044B\u043B\u043A\u0443",\r
+unlink_desc:"\u0412\u044B\u0434\u0430\u043B\u0456\u0446\u044C \u0441\u043F\u0430\u0441\u044B\u043B\u043A\u0443",\r
+image_desc:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044C/\u0440\u044D\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044C \u043C\u0430\u043B\u044E\u043D\u0430\u043A",\r
+cleanup_desc:"\u041F\u0430\u0447\u044B\u0441\u0446\u0456\u0446\u044C \u0431\u0440\u0443\u0434\u043D\u044B \u043A\u043E\u0434",\r
+code_desc:"\u0420\u044D\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044C HTML-\u0437\u044B\u0445\u043E\u0434\u043D\u0456\u043A",\r
+sub_desc:"\u041D\u0456\u0436\u043D\u0456 \u0430\u0437\u043D\u0430\u0447\u043D\u0456\u043A",\r
+sup_desc:"\u0412\u0435\u0440\u0445\u043D\u0456 \u0430\u0437\u043D\u0430\u0447\u043D\u0456\u043A",\r
+hr_desc:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044C \u0433\u0430\u0440\u044B\u0437\u0430\u043D\u0442\u0430\u043B\u044C\u043D\u0443\u044E \u043B\u0456\u043D\u0456\u044E",\r
+removeformat_desc:"\u041F\u0440\u044B\u0431\u0440\u0430\u0446\u044C \u0444\u0430\u0440\u043C\u0430\u0442\u0430\u0432\u0430\u043D\u043D\u0435",\r
+custom1_desc:"\u0423\u0432\u044F\u0434\u0437\u0456\u0446\u0435 \u0432\u0430\u0448\u0430 \u0430\u043F\u0456\u0441\u0430\u043D\u043D\u0435",\r
+forecolor_desc:"\u0410\u0431\u0440\u0430\u0446\u044C \u043A\u043E\u043B\u0435\u0440 \u0442\u044D\u043A\u0441\u0442\u0443",\r
+backcolor_desc:"\u0410\u0431\u0440\u0430\u0446\u044C \u043A\u043E\u043B\u0435\u0440 \u0444\u043E\u043D\u0443",\r
+charmap_desc:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044C \u0430\u0434\u043C\u044B\u0441\u043B\u043E\u0432\u044B \u0437\u043D\u0430\u043A",\r
+visualaid_desc:"\u0423\u043B\u0443\u0447\u044B\u0446\u044C/\u0432\u044B\u043A\u043B\u044E\u0447\u044B\u0446\u044C \u043D\u0430\u043A\u0456\u0440\u0430\u0432\u0430\u043B\u044C\u043D\u044B\u044F/\u043D\u044F\u0431\u0430\u0447\u043D\u044B\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B",\r
+anchor_desc:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044C/\u0440\u044D\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044C \u044F\u043A\u0430\u0440",\r
+cut_desc:"\u0412\u044B\u0440\u0430\u0437\u0430\u0446\u044C",\r
+copy_desc:"\u041A\u0430\u043F\u0456\u044F\u0432\u0430\u0446\u044C",\r
+paste_desc:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044C",\r
+image_props_desc:"\u0423\u043B\u0430\u0441\u0446\u0456\u0432\u0430\u0441\u0446\u0456 \u043C\u0430\u043B\u044E\u043D\u043A\u0430",\r
+newdocument_desc:"\u041D\u043E\u0432\u044B \u0434\u0430\u043A\u0443\u043C\u0435\u043D\u0442",\r
+help_desc:"\u0414\u0430\u043F\u0430\u043C\u043E\u0433\u0430",\r
+blockquote_desc:"\u0411\u043B\u043E\u043A \u0432\u044B\u043D\u044F\u0442\u043A\u0456",\r
+clipboard_msg:"\u041A\u0430\u043F\u0456\u044F\u0432\u0430\u043D\u043D\u0435/\u0423\u0441\u0442\u0430\u045E\u043A\u0430 \u043D\u0435 \u043F\u0440\u0430\u0446\u0443\u0435 \u045E Mozilla \u0456 Firefox.\r\n\u0416\u0430\u0434\u0430\u0435\u0446\u0435 \u043F\u0430\u0434\u0440\u0430\u0431\u044F\u0437\u043D\u0435\u0439 \u043F\u0430\u0437\u043D\u0430\u0446\u044C, \u0443 \u0447\u044B\u043C \u0441\u043F\u0440\u0430\u0432\u0430?",\r
+path:"\u0428\u043B\u044F\u0445",\r
+newdocument:"\u0412\u044B \u045E\u043F\u044D\u045E\u043D\u0435\u043D\u044B\u044F, \u0448\u0442\u043E \u0436\u0430\u0434\u0430\u0435\u0446\u0435 \u0430\u0447\u044B\u0441\u0446\u0456\u0446\u044C \u0443\u0441\u0451 \u0437\u043C\u0435\u0441\u0446\u0456\u0432\u0430?",\r
+toolbar_focus:"\u041F\u0435\u0440\u0430\u0439\u0441\u0446\u0456 \u0434\u0430 \u043A\u043D\u043E\u043F\u0430\u043A \u043F\u0440\u044B\u043B\u0430\u0434 - Alt+Q, \u041F\u0435\u0440\u0430\u0439\u0441\u0446\u0456 \u0434\u0430 \u0440\u044D\u0434\u0430\u043A\u0442\u0430\u0440\u0430 - Alt-Z, \u041F\u0435\u0440\u0430\u0439\u0441\u0446\u0456 \u0434\u0430 \u0448\u043B\u044F\u0445\u0443 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 - Alt-X",\r
+more_colors:"\u042F\u0448\u0447\u044D \u043A\u043E\u043B\u0435\u0440\u044B"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/be_dlg.js b/program/js/tiny_mce/themes/advanced/langs/be_dlg.js
new file mode 100644 (file)
index 0000000..7c6175d
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('be.advanced_dlg',{\r
+about_title:"\u0410\u0431 TinyMCE",\r
+about_general:"\u0410\u0431 \u043F\u0440\u0430\u0433\u0440\u0430\u043C\u0435",\r
+about_help:"\u0414\u0430\u043F\u0430\u043C\u043E\u0433\u0430",\r
+about_license:"\u041B\u0456\u0446\u044D\u043D\u0437\u0456\u044F",\r
+about_plugins:"\u0423\u0431\u0443\u0434\u043E\u0432\u044B",\r
+about_plugin:"\u0423\u0431\u0443\u0434\u043E\u0432\u0430",\r
+about_author:"\u0410\u045E\u0442\u0430\u0440",\r
+about_version:"\u0412\u0435\u0440\u0441\u0456\u044F",\r
+about_loaded:"\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u043D\u044B\u044F \u045E\u0431\u0443\u0434\u043E\u0432\u044B",\r
+anchor_title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C/\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u044F\u043A\u043E\u0440\u044C",\r
+anchor_name:"\u0418\u043C\u044F \u044F\u043A\u043E\u0440\u044F",\r
+code_title:"\u0420\u044D\u0434\u0430\u043A\u0442\u0430\u0440 HTML-\u0437\u044B\u0445\u043E\u0434\u043D\u0456\u043A\u0430",\r
+code_wordwrap:"\u041F\u0435\u0440\u0430\u043D\u043E\u0441 \u0441\u043B\u043E\u045E",\r
+colorpicker_title:"\u0410\u0431\u044F\u0440\u044B\u0446\u0435 \u043A\u043E\u043B\u0435\u0440",\r
+colorpicker_picker_tab:"\u0412\u044B\u0431\u0430\u0440",\r
+colorpicker_picker_title:"\u0412\u044B\u0431\u0430\u0440 \u043A\u043E\u043B\u0435\u0440\u0443",\r
+colorpicker_palette_tab:"\u041F\u0430\u043B\u0456\u0442\u0440\u0430",\r
+colorpicker_palette_title:"\u041A\u043E\u043B\u0435\u0440\u044B \u043F\u0430\u043B\u0456\u0442\u0440\u044B",\r
+colorpicker_named_tab:"\u041D\u0430\u0439\u043C\u0435\u043D\u043D\u044B",\r
+colorpicker_named_title:"\u041D\u0430\u0439\u043C\u0435\u043D\u043D\u044B\u044F \u043A\u043E\u043B\u0435\u0440\u044B",\r
+colorpicker_color:"\u041A\u043E\u043B\u0435\u0440:",\r
+colorpicker_name:"\u041D\u0430\u0437\u043E\u045E:",\r
+charmap_title:"\u0410\u0431\u044F\u0440\u044B\u0446\u0435 \u0430\u0434\u043C\u044B\u0441\u043B\u043E\u0432\u044B \u0437\u043D\u0430\u043A",\r
+image_title:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044C/\u0440\u044D\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044C \u043C\u0430\u043B\u044E\u043D\u0430\u043A",\r
+image_src:"\u0410\u0434\u0440\u0430\u0441 \u043C\u0430\u043B\u044E\u043D\u043A\u0430",\r
+image_alt:"\u0410\u043F\u0456\u0441\u0430\u043D\u043D\u0435 \u043C\u0430\u043B\u044E\u043D\u043A\u0430",\r
+image_list:"\u0421\u043F\u0456\u0441 \u043C\u0430\u043B\u044E\u043D\u043A\u0430\u045E",\r
+image_border:"\u041C\u044F\u0436\u0430",\r
+image_dimensions:"\u041F\u0430\u043C\u0435\u0440\u044B",\r
+image_vspace:"\u0412\u0435\u0440\u0442\u044B\u043A\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u0440\u0430\u0441\u0442\u043E\u0440\u0430",\r
+image_hspace:"\u0413\u0430\u0440\u044B\u0437\u0430\u043D\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u0440\u0430\u0441\u0442\u043E\u0440\u0430",\r
+image_align:"\u0412\u044B\u0440\u0430\u045E\u043D\u043E\u045E\u0432\u0430\u043D\u043D\u0435",\r
+image_align_baseline:"\u041F\u0430 \u0431\u0430\u0437\u0456\u0441\u043D\u0430\u0439 \u043B\u0456\u043D\u0456\u0456",\r
+image_align_top:"\u041F\u0430 \u0432\u0435\u0440\u0441\u0435",\r
+image_align_middle:"\u041F\u0430 \u0446\u044D\u043D\u0442\u0440\u044B",\r
+image_align_bottom:"\u041F\u0430 \u043D\u0456\u0437\u0435",\r
+image_align_texttop:"\u041F\u0430 \u0432\u0435\u0440\u0441\u0435 \u0442\u044D\u043A\u0441\u0442\u0443",\r
+image_align_textbottom:"\u041F\u0430 \u043D\u0456\u0437\u0435 \u0442\u044D\u043A\u0441\u0442\u0443",\r
+image_align_left:"\u041D\u0430\u043B\u0435\u0432\u0430",\r
+image_align_right:"\u041D\u0430\u043F\u0440\u0430\u0432\u0430",\r
+link_title:"\u0423\u0441\u0442\u0430\u0432\u0456\u0446\u044C/\u0440\u044D\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044C \u0441\u043F\u0430\u0441\u044B\u043B\u043A\u0443",\r
+link_url:"\u0410\u0434\u0440\u0430\u0441 \u0441\u043F\u0430\u0441\u044B\u043B\u043A\u0456",\r
+link_target:"\u041C\u044D\u0442\u0430",\r
+link_target_same:"\u0410\u0434\u043A\u0440\u044B\u0446\u044C \u0441\u043F\u0430\u0441\u044B\u043B\u043A\u0443 \u045E \u0442\u044B\u043C \u0436\u0430 \u0430\u043A\u043D\u0435",\r
+link_target_blank:"\u0410\u0434\u043A\u0440\u044B\u0446\u044C \u0441\u043F\u0430\u0441\u044B\u043B\u043A\u0443 \u045E \u043D\u043E\u0432\u044B\u043C \u0430\u043A\u043D\u0435",\r
+link_titlefield:"\u041D\u0430\u0437\u043E\u045E",\r
+link_is_email:"\u0423\u0432\u0435\u0434\u0437\u0435\u043D\u044B \u0430\u0434\u0440\u0430\u0441 \u043F\u0430\u0434\u043E\u0431\u043D\u044B \u043D\u0430 email, \u0432\u044B \u0436\u0430\u0434\u0430\u0435\u0446\u0435 \u0434\u0430\u0434\u0430\u0446\u044C \u043F\u0440\u044D\u0444\u0456\u043A\u0441 mailto:?",\r
+link_is_external:"\u0423\u0432\u0435\u0434\u0437\u0435\u043D\u044B \u0430\u0434\u0440\u0430\u0441 \u043F\u0430\u0434\u043E\u0431\u043D\u044B \u043D\u0430 \u0432\u043E\u043D\u043A\u0430\u0432\u0443\u044E \u0441\u043F\u0430\u0441\u044B\u043B\u043A\u0443, \u0432\u044B \u0436\u0430\u0434\u0430\u0435\u0446\u0435 \u0434\u0430\u0434\u0430\u0446\u044C \u043F\u0440\u044D\u0444\u0456\u043A\u0441 http://?",\r
+link_list:"\u0421\u043F\u0456\u0441 \u0441\u043F\u0430\u0441\u044B\u043B\u0430\u043A"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/bn.js b/program/js/tiny_mce/themes/advanced/langs/bn.js
new file mode 100644 (file)
index 0000000..689d1de
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('bn.advanced',{\r
+style_select:"Styles",\r
+font_size:"Font size",\r
+fontdefault:"Font family",\r
+block:"Format",\r
+paragraph:"Paragraph",\r
+div:"Div",\r
+address:"Address",\r
+pre:"Preformatted",\r
+h1:"Heading 1",\r
+h2:"Heading 2",\r
+h3:"Heading 3",\r
+h4:"Heading 4",\r
+h5:"Heading 5",\r
+h6:"Heading 6",\r
+blockquote:"Blockquote",\r
+code:"Code",\r
+samp:"Code sample",\r
+dt:"Definition term ",\r
+dd:"Definition description",\r
+bold_desc:"Bold (Ctrl+B)",\r
+italic_desc:"Italic (Ctrl+I)",\r
+underline_desc:"Underline (Ctrl+U)",\r
+striketrough_desc:"Strikethrough",\r
+justifyleft_desc:"Align left",\r
+justifycenter_desc:"Align center",\r
+justifyright_desc:"Align right",\r
+justifyfull_desc:"Align full",\r
+bullist_desc:"Unordered list",\r
+numlist_desc:"Ordered list",\r
+outdent_desc:"Outdent",\r
+indent_desc:"Indent",\r
+undo_desc:"Undo (Ctrl+Z)",\r
+redo_desc:"Redo (Ctrl+Y)",\r
+link_desc:"Insert/edit link",\r
+unlink_desc:"Unlink",\r
+image_desc:"Insert/edit image",\r
+cleanup_desc:"Cleanup messy code",\r
+code_desc:"Edit HTML Source",\r
+sub_desc:"Subscript",\r
+sup_desc:"Superscript",\r
+hr_desc:"Insert horizontal ruler",\r
+removeformat_desc:"Remove formatting",\r
+custom1_desc:"Your custom description here",\r
+forecolor_desc:"Select text color",\r
+backcolor_desc:"Select background color",\r
+charmap_desc:"Insert custom character",\r
+visualaid_desc:"Toggle guidelines/invisible elements",\r
+anchor_desc:"Insert/edit anchor",\r
+cut_desc:"Cut",\r
+copy_desc:"Copy",\r
+paste_desc:"Paste",\r
+image_props_desc:"Image properties",\r
+newdocument_desc:"New document",\r
+help_desc:"Help",\r
+blockquote_desc:"Blockquote",\r
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you want more information about this issue?",\r
+path:"Path",\r
+newdocument:"Are you sure you want clear all contents?",\r
+toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",\r
+more_colors:"More colors"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/bn_dlg.js b/program/js/tiny_mce/themes/advanced/langs/bn_dlg.js
new file mode 100644 (file)
index 0000000..19f880b
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('bn.advanced_dlg',{\r
+about_title:"About TinyMCE",\r
+about_general:"About",\r
+about_help:"Help",\r
+about_license:"License",\r
+about_plugins:"Plugins",\r
+about_plugin:"Plugin",\r
+about_author:"Author",\r
+about_version:"Version",\r
+about_loaded:"Loaded plugins",\r
+anchor_title:"Insert/edit anchor",\r
+anchor_name:"Anchor name",\r
+code_title:"HTML Source Editor",\r
+code_wordwrap:"Word wrap",\r
+colorpicker_title:"Select a color",\r
+colorpicker_picker_tab:"Picker",\r
+colorpicker_picker_title:"Color picker",\r
+colorpicker_palette_tab:"Palette",\r
+colorpicker_palette_title:"Palette colors",\r
+colorpicker_named_tab:"Named",\r
+colorpicker_named_title:"Named colors",\r
+colorpicker_color:"Color:",\r
+colorpicker_name:"Name:",\r
+charmap_title:"Select custom character",\r
+image_title:"Insert/edit image",\r
+image_src:"Image URL",\r
+image_alt:"Image description",\r
+image_list:"Image list",\r
+image_border:"Border",\r
+image_dimensions:"Dimensions",\r
+image_vspace:"Vertical space",\r
+image_hspace:"Horizontal space",\r
+image_align:"Alignment",\r
+image_align_baseline:"Baseline",\r
+image_align_top:"Top",\r
+image_align_middle:"Middle",\r
+image_align_bottom:"Bottom",\r
+image_align_texttop:"Text top",\r
+image_align_textbottom:"Text bottom",\r
+image_align_left:"Left",\r
+image_align_right:"Right",\r
+link_title:"Insert/edit link",\r
+link_url:"Link URL",\r
+link_target:"Target",\r
+link_target_same:"Open link in the same window",\r
+link_target_blank:"Open link in a new window",\r
+link_titlefield:"Title",\r
+link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",\r
+link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",\r
+link_list:"Link list"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/br.js b/program/js/tiny_mce/themes/advanced/langs/br.js
new file mode 100644 (file)
index 0000000..8dfb0a7
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('br.advanced',{\r
+style_select:"Estilos",\r
+font_size:"Tamanho",\r
+fontdefault:"Fam\u00EDlia(Fonte)",\r
+block:"Formata\u00E7\u00E3o",\r
+paragraph:"Par\u00E1grafo",\r
+div:"Div",\r
+address:"Endere\u00E7o",\r
+pre:"Pr\u00E9-formatado",\r
+h1:"Cabe\u00E7alho 1",\r
+h2:"Cabe\u00E7alho 2",\r
+h3:"Cabe\u00E7alho 3",\r
+h4:"Cabe\u00E7alho 4",\r
+h5:"Cabe\u00E7alho 5",\r
+h6:"Cabe\u00E7alho 6",\r
+blockquote:"Cita\u00E7\u00E3o em bloco",\r
+code:"C\u00F3digo",\r
+samp:"Amostra de c\u00F3digo",\r
+dt:"Termo de defini\u00E7\u00E3o",\r
+dd:"Descri\u00E7\u00E3o de defini\u00E7\u00E3o",\r
+bold_desc:"Negrito (Ctrl+B)",\r
+italic_desc:"It\u00E1lico (Ctrl+I)",\r
+underline_desc:"Sublinhado (Ctrl+U)",\r
+striketrough_desc:"Riscado",\r
+justifyleft_desc:"Alinhar \u00E0 esquerda",\r
+justifycenter_desc:"Centralizar",\r
+justifyright_desc:"Alinhar \u00E0 direita",\r
+justifyfull_desc:"Justificar",\r
+bullist_desc:"Marcadores",\r
+numlist_desc:"Numera\u00E7\u00E3o",\r
+outdent_desc:"Diminuir recuo",\r
+indent_desc:"Aumentar recuo",\r
+undo_desc:"Desfazer (Ctrl+Z)",\r
+redo_desc:"Refazer (Ctrl+Y)",\r
+link_desc:"Inserir/editar hyperlink",\r
+unlink_desc:"Remover hyperlink",\r
+image_desc:"Inserir/editar imagem",\r
+cleanup_desc:"Limpar c\u00F3digo incorreto",\r
+code_desc:"Editar c\u00F3digo fonte",\r
+sub_desc:"Subscrito",\r
+sup_desc:"Superscrito",\r
+hr_desc:"Inserir separador horizontal",\r
+removeformat_desc:"Remover formata\u00E7\u00E3o",\r
+custom1_desc:"Insira aqui a sua descri\u00E7\u00E3o personalizada",\r
+forecolor_desc:"Selecionar cor do texto",\r
+backcolor_desc:"Selecionar cor de fundo",\r
+charmap_desc:"Inserir caracteres especiais",\r
+visualaid_desc:"Alternar guias/elementos invis\u00EDveis",\r
+anchor_desc:"Inserir/editar \u00E2ncora",\r
+cut_desc:"Cortar",\r
+copy_desc:"Copiar",\r
+paste_desc:"Colar",\r
+image_props_desc:"Propriedades de imagem",\r
+newdocument_desc:"Novo documento",\r
+help_desc:"Ajuda",\r
+blockquote_desc:"Cita\u00E7\u00E3o em bloco",\r
+clipboard_msg:"Copiar/cortar/colar n\u00E3o est\u00E1 dispon\u00EDvel no Mozilla e Firefox. Deseja obter mais informa\u00E7\u00F5es sobre isso?",\r
+path:"Endere\u00E7o",\r
+newdocument:"Tem certeza de que deseja apagar tudo?",\r
+toolbar_focus:"Ir para ferramentas - Alt+Q, Ir para o editor - Alt-Z, Ir para endere\u00E7o do elemento - Alt-X",\r
+more_colors:"Mais cores"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/br_dlg.js b/program/js/tiny_mce/themes/advanced/langs/br_dlg.js
new file mode 100644 (file)
index 0000000..76b8d9e
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('br.advanced_dlg',{\r
+about_title:"Sobre o TinyMCE",\r
+about_general:"Sobre",\r
+about_help:"Ajuda",\r
+about_license:"Licen\u00E7a",\r
+about_plugins:"Plugins",\r
+about_plugin:"Plugin",\r
+about_author:"Autor",\r
+about_version:"Vers\u00E3o",\r
+about_loaded:"Plugins Instalados",\r
+anchor_title:"Inserir/editar \u00E2ncora",\r
+anchor_name:"Nome da \u00E2ncora",\r
+code_title:"Editor HTML",\r
+code_wordwrap:"Quebra autom\u00E1tica de linha",\r
+colorpicker_title:"Seleccione uma cor",\r
+colorpicker_picker_tab:"Editor",\r
+colorpicker_picker_title:"Editor de Cores",\r
+colorpicker_palette_tab:"Paleta",\r
+colorpicker_palette_title:"Paleta de Cores",\r
+colorpicker_named_tab:"Personalizadas",\r
+colorpicker_named_title:"Cores Personalizadas",\r
+colorpicker_color:"Cor:",\r
+colorpicker_name:"Nome:",\r
+charmap_title:"Selecionar caracteres personalizados",\r
+image_title:"Inserir/editar imagem",\r
+image_src:"Endere\u00E7o da imagem",\r
+image_alt:"Descri\u00E7\u00E3o da imagem",\r
+image_list:"Lista de imagens",\r
+image_border:"Limites",\r
+image_dimensions:"Dimens\u00F5es",\r
+image_vspace:"Espa\u00E7o Vertical",\r
+image_hspace:"Espa\u00E7o Horizontal",\r
+image_align:"Alinhamento",\r
+image_align_baseline:"Sobre a linha de texto",\r
+image_align_top:"Topo",\r
+image_align_middle:"Meio",\r
+image_align_bottom:"Abaixo",\r
+image_align_texttop:"Topo do texto",\r
+image_align_textbottom:"Base do texto",\r
+image_align_left:"Esquerda",\r
+image_align_right:"Direita",\r
+link_title:"Inserir/editar hyperlink",\r
+link_url:"URL do hyperink",\r
+link_target:"Alvo",\r
+link_target_same:"Abrir hyperlink na mesma janela",\r
+link_target_blank:"Abrir hyperlink em nova janela",\r
+link_titlefield:"T\u00EDtulo",\r
+link_is_email:"A URL digitada parece ser um endere\u00E7o de e-mail. Deseja acrescentar o (necess\u00E1rio) prefixo mailto:?",\r
+link_is_external:"A URL digitada parece conduzir a um link externo. Deseja acrescentar o (necess\u00E1rio) prefixo http://?",\r
+link_list:"Lista de Links"\r
+});
\ No newline at end of file
index 7fa1bf953fea48ff0fad0fbce7d8b402280bb368..0b0d7bfa7e06d48563e313a45e8f4543b50480c5 100755 (executable)
@@ -1,33 +1,33 @@
 tinyMCE.addI18n('ca.advanced',{\r
 style_select:"Estils",\r
-font_size:"Mida de lletra",\r
-fontdefault:"Tipografia",\r
+font_size:"Mida de font",\r
+fontdefault:"Fam\u00EDlia de font",\r
 block:"Format",\r
 paragraph:"Par\u00E0graf",\r
-div:"Div",\r
+div:"Capa",\r
 address:"Adre\u00E7a",\r
 pre:"Preformatat",\r
-h1:"Cap\u00E7alera 1",\r
-h2:"Cap\u00E7alera 2",\r
-h3:"Cap\u00E7alera 3",\r
-h4:"Cap\u00E7alera 4",\r
-h5:"Cap\u00E7alera 5",\r
-h6:"Cap\u00E7alera 6",\r
-blockquote:"Cita",\r
+h1:"Encap\u00E7alament 1",\r
+h2:"Encap\u00E7alament 2",\r
+h3:"Encap\u00E7alament 3",\r
+h4:"Encap\u00E7alament 4",\r
+h5:"Encap\u00E7alament 5",\r
+h6:"Encap\u00E7alament 6",\r
+blockquote:"Citabloc",\r
 code:"Codi",\r
-samp:"Mostra de codi",\r
-dt:"Terme de la definici\u00F3",\r
-dd:"Descripci\u00F3 de la definici\u00F3",\r
+samp:"Mostra el Codi",\r
+dt:"Terme de definici\u00F3 ",\r
+dd:"Descripci\u00F3 de definici\u00F3",\r
 bold_desc:"Negreta (Ctrl+B)",\r
 italic_desc:"Cursiva (Ctrl+I)",\r
 underline_desc:"Subratllat (Ctrl+U)",\r
-striketrough_desc:"Tatxat",\r
-justifyleft_desc:"Alinea a l'esquerra",\r
-justifycenter_desc:"Centra",\r
-justifyright_desc:"Alinea a la dreta",\r
-justifyfull_desc:"Justifica",\r
-bullist_desc:"Llista no ordenada",\r
-numlist_desc:"Llista ordenada",\r
+striketrough_desc:"Barrat",\r
+justifyleft_desc:"Alineaci\u00F3 esquerra",\r
+justifycenter_desc:"Alineaci\u00F3 al centre",\r
+justifyright_desc:"Alineaci\u00F3 dreta",\r
+justifyfull_desc:"Justificat",\r
+bullist_desc:"Llista no numerada",\r
+numlist_desc:"Llista numerada",\r
 outdent_desc:"Redueix el sagnat",\r
 indent_desc:"Augmenta el sagnat",\r
 undo_desc:"Desf\u00E9s (Ctrl+Z)",\r
@@ -35,17 +35,17 @@ redo_desc:"Ref\u00E9s (Ctrl+Y)",
 link_desc:"Insereix/edita enlla\u00E7",\r
 unlink_desc:"Desenlla\u00E7a",\r
 image_desc:"Insereix/edita imatge",\r
-cleanup_desc:"Neteja el codi no correcte",\r
-code_desc:"Edita la font HTML",\r
+cleanup_desc:"Poleix el codi",\r
+code_desc:"Edita el codi font HTML",\r
 sub_desc:"Sub\u00EDndex",\r
 sup_desc:"Super\u00EDndex",\r
-hr_desc:"Insereix regle horitzontal",\r
+hr_desc:"Insereix un filet horitzontal",\r
 removeformat_desc:"Elimina el format",\r
-custom1_desc:"Aqu\u00ED la teva descripci\u00F3 personalitzada",\r
-forecolor_desc:"Selecciona el color del text",\r
-backcolor_desc:"Selecciona el color de fons",\r
-charmap_desc:"Insereix car\u00E0cter personalitzat",\r
-visualaid_desc:"Canvia els elements guies/invisibles",\r
+custom1_desc:"Aqu\u00ED la vostra pr\u00F2pia descripci\u00F3",\r
+forecolor_desc:"Selecci\u00F3 del color de text",\r
+backcolor_desc:"Selecci\u00F3 del color de fons",\r
+charmap_desc:"Insereix un car\u00E0cter",\r
+visualaid_desc:"Commuta elements guies/invisibles",\r
 anchor_desc:"Insereix/edita \u00E0ncora",\r
 cut_desc:"Retalla",\r
 copy_desc:"Copia",\r
@@ -53,10 +53,10 @@ paste_desc:"Enganxa",
 image_props_desc:"Propietats de la imatge",\r
 newdocument_desc:"Nou document",\r
 help_desc:"Ajuda",\r
-blockquote_desc:"Descripci\u00F3 de la cita",\r
-clipboard_msg:"Copia/Retalla/Enganxa no est\u00E0 disponible en Mozilla/Firefox.\r\nVols m\u00E9s informaci\u00F3 sobre aquest tema?",\r
+blockquote_desc:"Citabloc",\r
+clipboard_msg:"Copia/Retalla/Enganxa no es troba disponible ni al Mozilla ni al Firefox.\r\nVoleu m\u00E9s informaci\u00F3 sobre aix\u00F2?",\r
 path:"Cam\u00ED",\r
-newdocument:"Segur que vols esborrar tot el contingut?",\r
-toolbar_focus:"Salta als botons d'eines - Alt+Q, Salta a l'editor - Alt-Z, Salta al cam\u00ED de l'element - Alt-X",\r
+newdocument:"Esteu segur que voleu buidar tots els continguts?",\r
+toolbar_focus:"Salta als botons d\'eina - Alt+Q, Salta a l\'editor - Alt-Z, Salta al cam\u00ED de l\'element - Alt-X",\r
 more_colors:"M\u00E9s colors"\r
 });
\ No newline at end of file
index e0cc6eea0465b30f7196259c45a2c26a823e738b..381ece3e92ddf80ec19808c929a2efd73fcc3dd0 100755 (executable)
@@ -1,51 +1,51 @@
 tinyMCE.addI18n('ca.advanced_dlg',{\r
-about_title:"Quant a TinyMCE",\r
+about_title:"Quant al TinyMCE",\r
 about_general:"Quant a",\r
 about_help:"Ajuda",\r
 about_license:"Llic\u00E8ncia",\r
-about_plugins:"Extensions",\r
-about_plugin:"Extensi\u00F3",\r
+about_plugins:"Connectors",\r
+about_plugin:"Connector",\r
 about_author:"Autor",\r
 about_version:"Versi\u00F3",\r
-about_loaded:"Extensions carregades",\r
+about_loaded:"Connectors carregats",\r
 anchor_title:"Insereix/edita \u00E0ncora",\r
-anchor_name:"Nom de l'\u00E0ncora",\r
-code_title:"Editor de Font HTML",\r
-code_wordwrap:"Salt de paraula",\r
-colorpicker_title:"Selecciona un color",\r
-colorpicker_picker_tab:"Triador",\r
-colorpicker_picker_title:"Triador de color",\r
+anchor_name:"Nom de l\'\u00E0ncora",\r
+code_title:"Editor de codi font HTML",\r
+code_wordwrap:"Embolcall de paraula",\r
+colorpicker_title:"Selecci\u00F3 de color",\r
+colorpicker_picker_tab:"Capturador",\r
+colorpicker_picker_title:"Capturador de color",\r
 colorpicker_palette_tab:"Paleta",\r
-colorpicker_palette_title:"Colors de la paleta",\r
-colorpicker_named_tab:"Amb nom",\r
-colorpicker_named_title:"Colors amb nom",\r
+colorpicker_palette_title:"Paleta de colors",\r
+colorpicker_named_tab:"Per nom",\r
+colorpicker_named_title:"Colors pel seu nom",\r
 colorpicker_color:"Color:",\r
 colorpicker_name:"Nom:",\r
-charmap_title:"Selecciona el car\u00E0cter personalitzat",\r
+charmap_title:"Selecci\u00F3 de car\u00E0cter",\r
 image_title:"Insereix/edita imatge",\r
 image_src:"URL de la imatge",\r
 image_alt:"Descripci\u00F3 de la imatge",\r
-image_list:"Llista d'imatges",\r
+image_list:"Llista de la imatge",\r
 image_border:"Vora",\r
 image_dimensions:"Dimensions",\r
-image_vspace:"Espaiat vertical",\r
-image_hspace:"Espaiat horitzontal",\r
+image_vspace:"Espai vertical",\r
+image_hspace:"Espai horitzontal",\r
 image_align:"Alineaci\u00F3",\r
-image_align_baseline:"L\u00EDnia base",\r
-image_align_top:"Dalt",\r
-image_align_middle:"Mig",\r
-image_align_bottom:"Baix",\r
-image_align_texttop:"A dalt del text",\r
-image_align_textbottom:"A baix del text",\r
+image_align_baseline:"L\u00EDnia de base",\r
+image_align_top:"A dalt",\r
+image_align_middle:"Al Mig",\r
+image_align_bottom:"A baix",\r
+image_align_texttop:"Part superior del text",\r
+image_align_textbottom:"Part inferior del text",\r
 image_align_left:"Esquerra",\r
 image_align_right:"Dreta",\r
 link_title:"Insereix/edita enlla\u00E7",\r
-link_url:"URL de l'enlla\u00E7",\r
-link_target:"Objectiu",\r
-link_target_same:"Obre l'enlla\u00E7 a la mateixa finestra",\r
-link_target_blank:"Obre l'enlla\u00E7 en una finestra nova",\r
+link_url:"URL de l\'enlla\u00E7",\r
+link_target:"Dest\u00ED",\r
+link_target_same:"Obre l\'enlla\u00E7 a la mateixa finestra",\r
+link_target_blank:"Obre l\'enlla\u00E7 a una nova finestra",\r
 link_titlefield:"T\u00EDtol",\r
-link_is_email:"L'URL que has introdu\u00EFt sembla una adre\u00E7a de correu, vols afegir-hi el prefix mailto://?",\r
-link_is_external:"L'URL que has introdu\u00EFt sembla un enlla\u00E7 extern, vols afegir-hi el prefix http://?",\r
-link_list:"Llista d'enlla\u00E7os"\r
+link_is_email:"L\'URL que heu introdu\u00EFt sembla ser una adre\u00E7a de correu, voleu afegir-hi el prefix requerit mailto: ?",\r
+link_is_external:"L\'URL que heu introdu\u00EFt sembla ser un enlla\u00E7 extern, voleu afegir-hi el prefix requerit http:// ?",\r
+link_list:"Llista d\'enlla\u00E7os"\r
 });
\ No newline at end of file
index afef934bef9779085cfa732d838d54b7ff6fb704..5c337ffa8b0efec4f39ab8290a2b1b46f41e521c 100755 (executable)
@@ -1,10 +1,10 @@
 tinyMCE.addI18n('cs.advanced',{\r
-style_select:"--- Styly ---",\r
-font_size:"- Velikost p\u00EDsma -",\r
-fontdefault:"--- P\u00EDsma ---",\r
-block:"-- Form\u00E1t --",\r
+style_select:"Styly",\r
+font_size:"Velikost p\u00EDsma",\r
+fontdefault:"P\u00EDsmo",\r
+block:"Form\u00E1t",\r
 paragraph:"Odstavec",\r
-div:"Div",\r
+div:"Odd\u00EDl",\r
 address:"Adresa",\r
 pre:"P\u0159edform\u00E1tov\u00E1no",\r
 h1:"Nadpis 1",\r
@@ -13,11 +13,11 @@ h3:"Nadpis 3",
 h4:"Nadpis 4",\r
 h5:"Nadpis 5",\r
 h6:"Nadpis 6",\r
-blockquote:"Odsazen\u00FD blok textu",\r
+blockquote:"Blokov\u00E1 citace",\r
 code:"K\u00F3d",\r
-samp:"Vzorek",\r
-dt:"Term\u00EDn",\r
-dd:"Definice",\r
+samp:"Uk\u00E1zka k\u00F3du",\r
+dt:"Term\u00EDn definice",\r
+dd:"Popis definice",\r
 bold_desc:"Tu\u010Dn\u00E9 (Ctrl+B)",\r
 italic_desc:"Kurz\u00EDva (Ctrl+I)",\r
 underline_desc:"Podtr\u017Een\u00E9 (Ctrl+U)",\r
@@ -33,30 +33,30 @@ indent_desc:"Zv\u011Bt\u0161it odsazen\u00ED",
 undo_desc:"Zp\u011Bt (Ctrl+Z)",\r
 redo_desc:"Znovu (Ctrl+Y)",\r
 link_desc:"Vlo\u017Eit/upravit odkaz",\r
-unlink_desc:"Zru\u0161it odkaz",\r
+unlink_desc:"Odebrat odkaz",\r
 image_desc:"Vlo\u017Eit/upravit obr\u00E1zek",\r
 cleanup_desc:"Vy\u010Distit k\u00F3d",\r
-code_desc:"Editovat HTML k\u00F3d",\r
+code_desc:"Upravit HTML zdroj",\r
 sub_desc:"Doln\u00ED index",\r
 sup_desc:"Horn\u00ED index",\r
 hr_desc:"Vlo\u017Eit vodorovn\u00FD odd\u011Blova\u010D",\r
-removeformat_desc:"Zru\u0161it form\u00E1tov\u00E1n\u00ED",\r
+removeformat_desc:"Odstranit form\u00E1tov\u00E1n\u00ED",\r
 custom1_desc:"Libovoln\u00FD popisek",\r
 forecolor_desc:"Barva textu",\r
 backcolor_desc:"Barva pozad\u00ED",\r
 charmap_desc:"Vlo\u017Eit speci\u00E1ln\u00ED znak",\r
-visualaid_desc:"Zviditelnit zna\u010Dky",\r
-anchor_desc:"Vlo\u017Eit/upravit kotvu",\r
+visualaid_desc:"Zobrazit pomocn\u00E9 linky/skryt\u00E9 prvky",\r
+anchor_desc:"Vlo\u017Eit/upravit z\u00E1lo\u017Eku (kotvu)",\r
 cut_desc:"Vyjmout",\r
 copy_desc:"Kop\u00EDrovat",\r
 paste_desc:"Vlo\u017Eit",\r
 image_props_desc:"Vlastnosti obr\u00E1zku",\r
 newdocument_desc:"Nov\u00FD dokument",\r
 help_desc:"N\u00E1pov\u011Bda",\r
-blockquote_desc:"Blok citace",\r
-clipboard_msg:"Funkce kop\u00EDrovat/vyjmout/vlo\u017Eit nejsou pou\u017Eiteln\u00E9 v Mozille a Firefoxu.\nChcete v\u00EDce informac\u00ED?",\r
+blockquote_desc:"Blokov\u00E1 citace",\r
+clipboard_msg:"Funkce kop\u00EDrovat/vyjmout/vlo\u017Eit nejsou podporovan\u00E9 v prohl\u00ED\u017Ee\u010D\u00EDch Mozilla a Firefox.\nChcete v\u00EDce informac\u00ED o tomto probl\u00E9mu?",\r
 path:"Cesta",\r
-newdocument:"Jste si opravdu jisti, \u017Ee chcete vymazat ve\u0161ker\u00FD obsah?",\r
-toolbar_focus:"Skok na li\u0161tu n\u00E1stroj\u016F - Alt+Q, skok do editoru - Alt-Z, skok na cestu prvk\u016F - Alt-X",\r
+newdocument:"Jste si opravdu jisti, \u017Ee chcete odstranit ve\u0161ker\u00FD obsah?",\r
+toolbar_focus:"P\u0159echod na li\u0161tu n\u00E1stroj\u016F - Alt+Q, p\u0159echod do editoru - Alt-Z, p\u0159echod na cestu prvk\u016F - Alt-X",\r
 more_colors:"Dal\u0161\u00ED barvy"\r
 });
\ No newline at end of file
index b8c39433c32ec683884e7f5f2b685e7569558e04..a78e004880969f0dfff3672fe90d81f113766017 100755 (executable)
@@ -1,17 +1,17 @@
 tinyMCE.addI18n('cs.advanced_dlg',{\r
 about_title:"O TinyMCE",\r
-about_general:"O n\u00E1s",\r
+about_general:"O programu",\r
 about_help:"N\u00E1pov\u011Bda",\r
 about_license:"Licence",\r
-about_plugins:"Pluginy",\r
-about_plugin:"Plugin",\r
+about_plugins:"Z\u00E1suvn\u00E9 moduly",\r
+about_plugin:"Z\u00E1suvn\u00FD modul",\r
 about_author:"Autor",\r
 about_version:"Verze",\r
-about_loaded:"Na\u010Dten\u00E9 pluginy",\r
-anchor_title:"Vlo\u017Eit/upravit kotvu",\r
-anchor_name:"N\u00E1zev kotvy",\r
-code_title:"HTML",\r
-code_wordwrap:"Zalomen\u00ED \u0159\u00E1dk\u016F",\r
+about_loaded:"Na\u010Dten\u00E9 z\u00E1suvn\u00E9 moduly",\r
+anchor_title:"Vlo\u017Eit/upravit z\u00E1lo\u017Eku (kotvu)",\r
+anchor_name:"N\u00E1zev z\u00E1lo\u017Eky",\r
+code_title:"Editor HTML",\r
+code_wordwrap:"Zalamov\u00E1n\u00ED \u0159\u00E1dk\u016F",\r
 colorpicker_title:"V\u00FDb\u011Br barvy",\r
 colorpicker_picker_tab:"Kap\u00E1tko",\r
 colorpicker_picker_title:"Kap\u00E1tko",\r
@@ -28,8 +28,8 @@ image_alt:"Popis obr\u00E1zku",
 image_list:"Seznam obr\u00E1zk\u016F",\r
 image_border:"R\u00E1me\u010Dek",\r
 image_dimensions:"Rozm\u011Bry",\r
-image_vspace:"Vertik\u00E1ln\u00ED mezera",\r
-image_hspace:"Horizont\u00E1ln\u00ED mezera",\r
+image_vspace:"Vertik\u00E1ln\u00ED odsazen\u00ED",\r
+image_hspace:"Horizont\u00E1ln\u00ED odsazen\u00ED",\r
 image_align:"Zarovn\u00E1n\u00ED",\r
 image_align_baseline:"Na z\u00E1kladnu",\r
 image_align_top:"Nahoru",\r
@@ -45,7 +45,7 @@ link_target:"C\u00EDl",
 link_target_same:"Otev\u0159\u00EDt odkaz ve stejn\u00E9m okn\u011B",\r
 link_target_blank:"Otev\u0159\u00EDt odkaz v nov\u00E9m okn\u011B",\r
 link_titlefield:"Titulek",\r
-link_is_email:"Zadan\u00E9 URL vypad\u00E1 jako e-mailov\u00E1 adresa, chcete doplnit prefix mailto:?",\r
-link_is_external:"Zadan\u00E9 URL vypad\u00E1 jako extern\u00ED odkaz, chcete doplnit prefix http://?",\r
+link_is_email:"Zadan\u00E9 URL vypad\u00E1 jako e-mailov\u00E1 adresa, chcete doplnit povinn\u00FD prefix mailto:?",\r
+link_is_external:"Zadan\u00E9 URL vypad\u00E1 jako extern\u00ED odkaz, chcete doplnit povinn\u00FD prefix http://?",\r
 link_list:"Seznam odkaz\u016F"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/cy.js b/program/js/tiny_mce/themes/advanced/langs/cy.js
new file mode 100644 (file)
index 0000000..bb59c2e
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('cy.advanced',{\r
+style_select:"Ardulliau",\r
+font_size:"Maint Ffont",\r
+fontdefault:"Teulu ffont",\r
+block:"Fformat",\r
+paragraph:"Paragraff",\r
+div:"Div",\r
+address:"Cyfeririad",\r
+pre:"Rhagffomatiwyd",\r
+h1:"Pennawd 1",\r
+h2:"Pennawd 2",\r
+h3:"Pennawd 3",\r
+h4:"Pennawd 4",\r
+h5:"Pennawd 5",\r
+h6:"Pennawd 6",\r
+blockquote:"Dyfyniad bloc",\r
+code:"C\u00F4d",\r
+samp:"Sampl c\u00F4d",\r
+dt:"Term diffiniad ",\r
+dd:"Disgrifiad diffiniad",\r
+bold_desc:"Trwm (Ctrl+B)",\r
+italic_desc:"Italig (Ctrl+I)",\r
+underline_desc:"Tanlinellu (Ctrl+U)",\r
+striketrough_desc:"Taro drwodd",\r
+justifyleft_desc:"Alinio i'r chwith",\r
+justifycenter_desc:"Alinio i'r canol",\r
+justifyright_desc:"Alinio i'r dde",\r
+justifyfull_desc:"Alinio llawn",\r
+bullist_desc:"Rhestr didrenus",\r
+numlist_desc:"Rhestr trenus",\r
+outdent_desc:"Alloli",\r
+indent_desc:"Mewnoli",\r
+undo_desc:"Dadwneud (Ctrl+Z)",\r
+redo_desc:"Ailwneud (Ctrl+Y)",\r
+link_desc:"Mewnosod/golygu cyswllt",\r
+unlink_desc:"Datgysylltu",\r
+image_desc:"Mewnosod/golygu delwedd",\r
+cleanup_desc:"Glanhau c\u00F4d anhrefnus",\r
+code_desc:"Golygu Ffynhonell HTML",\r
+sub_desc:"Isysgrif",\r
+sup_desc:"Uwchysgrif",\r
+hr_desc:"Mewnosod mesurydd llorweddol",\r
+removeformat_desc:"Tynnu fformatio",\r
+custom1_desc:"Eich disgrifiad addasiedig yma",\r
+forecolor_desc:"Dewis lliw testun",\r
+backcolor_desc:"Dewis lliw cefndir",\r
+charmap_desc:"Mewnosod n\u00F4d addasiedig",\r
+visualaid_desc:"Toglu llinellau cyfeirydd/elfennau anweledig",\r
+anchor_desc:"Mewnosod/golygu angor",\r
+cut_desc:"Torri",\r
+copy_desc:"Cop\u00EFo",\r
+paste_desc:"Gludo",\r
+image_props_desc:"Priodweddau delwedd",\r
+newdocument_desc:"Dogfen newydd",\r
+help_desc:"Cymorth",\r
+blockquote_desc:"Dyfyniad bloc",\r
+clipboard_msg:"Nid yw Cop\u00EFo/Torri/Gludo ar gael mewn Mozilla a Firefox.\r\nYdych chi eisiau mwy o wybodaeth am y mater yma?",\r
+path:"Llwybr",\r
+newdocument:"A ydych chi'n si\u0175r eich bod eisiau clirio'r holl cynnwys?",\r
+toolbar_focus:"Neidio i botymau offeryn - Alt+Q, Neidio i olygydd - Alt-Z, Neidio i lwybr elfen - Alt-X",\r
+more_colors:"Mwy o liwiau"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/cy_dlg.js b/program/js/tiny_mce/themes/advanced/langs/cy_dlg.js
new file mode 100644 (file)
index 0000000..d0b9646
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('cy.advanced_dlg',{\r
+about_title:"Ynglyn TinyMCE",\r
+about_general:"Ynglyn",\r
+about_help:"Cymorth",\r
+about_license:"Twyddedd",\r
+about_plugins:"Ategion",\r
+about_plugin:"Ategyn",\r
+about_author:"Awdur",\r
+about_version:"Fersion",\r
+about_loaded:"Ategion wedi llwytho",\r
+anchor_title:"Mewnosod/golygu angor",\r
+anchor_name:"Enw angor",\r
+code_title:"Golygydd Ffynhonell HTML",\r
+code_wordwrap:"Amlapio geiriau",\r
+colorpicker_title:"Dewis lliw",\r
+colorpicker_picker_tab:"Dweisydd",\r
+colorpicker_picker_title:"Dewisydd lliw",\r
+colorpicker_palette_tab:"Palet",\r
+colorpicker_palette_title:"Lliwiau palet",\r
+colorpicker_named_tab:"Wedi'u enwi",\r
+colorpicker_named_title:"Lliwiau wedi'u enwi",\r
+colorpicker_color:"Lliw:",\r
+colorpicker_name:"Enw:",\r
+charmap_title:"Dewis n\u00F4d addasiedig",\r
+image_title:"Mewnosod/golygu delwedd",\r
+image_src:"URL delwedd",\r
+image_alt:"disgrifiad delwedd",\r
+image_list:"Rhestr delweddau",\r
+image_border:"Border",\r
+image_dimensions:"Dimensiynau",\r
+image_vspace:"Gofod fertigol",\r
+image_hspace:"Gofod llorweddol",\r
+image_align:"Aliniad",\r
+image_align_baseline:"Gwaelodlin",\r
+image_align_top:"Pen",\r
+image_align_middle:"Canol",\r
+image_align_bottom:"Gwaelod",\r
+image_align_texttop:"Pen testun",\r
+image_align_textbottom:"Gwaelod testun",\r
+image_align_left:"Chwith",\r
+image_align_right:"De",\r
+link_title:"Mewnosod/golygu cyswllt",\r
+link_url:"URL cyswllt",\r
+link_target:"Targed",\r
+link_target_same:"Agor cyswllt yn yr un ffenst",\r
+link_target_blank:"Agor cyswllt mewn ffenst newydd",\r
+link_titlefield:"Teitl",\r
+link_is_email:"Mae'r URL a rydych wedi rhoi yn edrych fel cyferiad e-bost, ydych chi eisiau ychwanegu'r rhagddodiad mailto: sydd angen?",\r
+link_is_external:"Mae'r URL a rydych wedi rhoi yn edrych fel cyswllt allannol, ydych chi eisiau ychwanegu'r rhagddodiad http:// sydd angen?",\r
+link_list:"Rhestr cysylltau"\r
+});
\ No newline at end of file
index ac57a35890970c306edfa1d10166e32cf0cf9793..e50372396bbf9d03db9502feb520d67da500e6bc 100755 (executable)
@@ -50,7 +50,7 @@ anchor_desc:"Inds\u00E6t/rediger anker",
 cut_desc:"Klip",\r
 copy_desc:"Kopier",\r
 paste_desc:"Inds\u00E6t",\r
-image_props_desc:"Billedeegenskaber",\r
+image_props_desc:"Billedegenskaber",\r
 newdocument_desc:"Nyt dokument",\r
 help_desc:"Hj\u00E6lp",\r
 blockquote_desc:"Blokcitat",\r
index d2beb3cdc738b972383e484b072f146a63811f56..d499858f19d12ad0a6a4b256bfce8695329b2052 100755 (executable)
@@ -10,13 +10,13 @@ about_version:"Version",
 about_loaded:"Indl\u00E6ste udvidelser",\r
 anchor_title:"Inds\u00E6t/rediger anker",\r
 anchor_name:"Navn p\u00E5 anker",\r
-code_title:"HTML kildekode redigering",\r
+code_title:"HTML kildekode-redigering",\r
 code_wordwrap:"Tekstombrydning",\r
 colorpicker_title:"V\u00E6lg en farve",\r
 colorpicker_picker_tab:"V\u00E6lger",\r
-colorpicker_picker_title:"Farve v\u00E6lger",\r
+colorpicker_picker_title:"Farvev\u00E6lger",\r
 colorpicker_palette_tab:"Palette",\r
-colorpicker_palette_title:"Palette farver",\r
+colorpicker_palette_title:"Palette-farver",\r
 colorpicker_named_tab:"Navngivet",\r
 colorpicker_named_title:"Navngivet farve",\r
 colorpicker_color:"Farve:",\r
@@ -24,7 +24,7 @@ colorpicker_name:"Navn:",
 charmap_title:"V\u00E6lg specialtegn",\r
 image_title:"Inds\u00E6t/rediger billede",\r
 image_src:"Billede URL",\r
-image_alt:"Billedebeskrivelse",\r
+image_alt:"Billedbeskrivelse",\r
 image_list:"Liste over billeder",\r
 image_border:"Kant",\r
 image_dimensions:"Dimensioner",\r
@@ -45,7 +45,7 @@ link_target:"Target",
 link_target_same:"\u00C5ben link i samme vindue",\r
 link_target_blank:"\u00C5ben link i nyt vindue",\r
 link_titlefield:"Titel",\r
-link_is_email:"Den URL der er indtastet ser ud til at v\u00E6re en emailadresse. Vil du have tilf\u00F8jet det p\u00E5kr\u00E6vede mailto: foran?",\r
-link_is_external:"Den URL der er indtastet ser ud til at v\u00E6re et eksternt link. Vil du have tilf\u00F8jet det p\u00E5kr\u00E6vede http:// foran?",\r
+link_is_email:"Den URL, der er indtastet, ser ud til at v\u00E6re en emailadresse. Vil du have tilf\u00F8jet det p\u00E5kr\u00E6vede mailto: foran?",\r
+link_is_external:"Den URL, der er indtastet, ser ud til at v\u00E6re et eksternt link. Vil du have tilf\u00F8jet det p\u00E5kr\u00E6vede http:// foran?",\r
 link_list:"Liste over links"\r
 });
\ No newline at end of file
index 1bca9e40c7f17d07f5699fd7b3deb05c640bebc8..2cdbfae5250594f1045c5789e51a5e013313759f 100755 (executable)
@@ -5,7 +5,7 @@ fontdefault:"Schriftart",
 block:"Vorlage",\r
 paragraph:"Absatz",\r
 div:"Zusammenh\u00E4ngender Bereich",\r
-address:"Addresse",\r
+address:"Adresse",\r
 pre:"Rohdaten",\r
 h1:"\u00DCberschrift 1",\r
 h2:"\u00DCberschrift 2",\r
@@ -22,9 +22,9 @@ bold_desc:"Fett (Strg+B)",
 italic_desc:"Kursiv (Strg+I)",\r
 underline_desc:"Unterstrichen (Strg+U)",\r
 striketrough_desc:"Durchgestrichen",\r
-justifyleft_desc:"Links ausgerichtet",\r
-justifycenter_desc:"Mittig ausgerichtet",\r
-justifyright_desc:"Rechts ausgerichtet",\r
+justifyleft_desc:"Linksb\u00FCndig",\r
+justifycenter_desc:"Zentriert",\r
+justifyright_desc:"Rechtsb\u00FCndig",\r
 justifyfull_desc:"Blocksatz",\r
 bullist_desc:"Unsortierte Liste",\r
 numlist_desc:"Sortierte Liste",\r
@@ -35,7 +35,7 @@ redo_desc:"Wiederholen (Strg+Y)",
 link_desc:"Link einf\u00FCgen/ver\u00E4ndern",\r
 unlink_desc:"Link entfernen",\r
 image_desc:"Bild einf\u00FCgen/ver\u00E4ndern",\r
-cleanup_desc:"Quellcode aufr\u00E4ufen",\r
+cleanup_desc:"Quellcode aufr\u00E4umen",\r
 code_desc:"HTML-Quellcode bearbeiten",\r
 sub_desc:"Tiefgestellt",\r
 sup_desc:"Hochgestellt",\r
@@ -58,5 +58,6 @@ clipboard_msg:"Kopieren, Ausschneiden und Einf\u00FCgen sind im Mozilla Firefox
 path:"Pfad",\r
 newdocument:"Wollen Sie wirklich den ganzen Inhalt l\u00F6schen?",\r
 toolbar_focus:"Zur Werkzeugleiste springen: Alt+Q; Zum Editor springen: Alt-Z; Zum Elementpfad springen: Alt-X",\r
-more_colors:"Weitere Farben"\r
+more_colors:"Weitere Farben",\r
+anchor_delta_width:"13"\r
 });
\ No newline at end of file
index f0d75f888217af56041440603dceb7652469d64a..e1ec11ca978a9dfde834afe00738178cc0e6d9fa 100755 (executable)
@@ -1,6 +1,6 @@
 tinyMCE.addI18n('de.advanced_dlg',{\r
 about_title:"\u00DCber TinyMCE",\r
-about_general:"\u00DCber\u2026",\r
+about_general:"\u00DCber",\r
 about_help:"Hilfe",\r
 about_license:"Lizenzbedingungen",\r
 about_plugins:"Plugins",\r
@@ -27,7 +27,7 @@ image_src:"Adresse",
 image_alt:"Alternativtext",\r
 image_list:"Bilderliste",\r
 image_border:"Rahmen",\r
-image_dimensions:"Ausma\u00DFe",\r
+image_dimensions:"Abmessungen",\r
 image_vspace:"Vertikaler Abstand",\r
 image_hspace:"Horizontaler Abstand",\r
 image_align:"Ausrichtung",\r
@@ -45,7 +45,7 @@ link_target:"Fenster",
 link_target_same:"Im selben Fenster \u00F6ffnen",\r
 link_target_blank:"Neues Fenster \u00F6ffnen",\r
 link_titlefield:"Titel",\r
-link_is_email:"Bei der Adresse scheint es sich um eine E-Mail-Adresse zu handeln. Wollen Sie das dazu ben\u00F6tigte mailto: voranstellen?",\r
-link_is_external:"Bei der Adresse scheint es sich um einen externen Link zu handeln. M\u00F6chten Sie, dass zur korrekten Verlinkung ein http:// vorangestellt wird?",\r
+link_is_email:"Diese Adresse scheint eine E-Mail-Adresse zu sein. M\u00F6chten Sie das dazu ben\u00F6tigte \"mailto:\" voranstellen?",\r
+link_is_external:"Diese Adresse scheint ein externer Link zu sein. M\u00F6chten Sie das dazu ben\u00F6tigte \"http://\" voranstellen?",\r
 link_list:"Linkliste"\r
 });
\ No newline at end of file
index 66d65ece6ebd2884bc7f33cef1fec5da3dac91e5..bfd46d51691b7dbecd62926b11d51572f2baced3 100755 (executable)
@@ -58,5 +58,7 @@ clipboard_msg:"\u039F\u03B9 \u03BB\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03
 path:"\u0394\u03B9\u03B1\u03B4\u03C1\u03BF\u03BC\u03AE",\r
 newdocument:"\u03A3\u03B9\u03AF\u03B3\u03BF\u03C5\u03C1\u03B1 \u03B8\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03BA\u03B1\u03B8\u03B1\u03C1\u03AF\u03C3\u03B5\u03C4\u03B5 \u03CC\u03BB\u03BF \u03C4\u03BF \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03BF ;",\r
 toolbar_focus:"\u039C\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03C3\u03C4\u03B1 \u03BA\u03BF\u03C5\u03BC\u03C0\u03B9\u03AC \u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03C9\u03BD - Alt+Q, \u039C\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03C3\u03C4\u03BF\u03BD \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03C4\u03AE \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 - Alt-Z, \u039C\u03B5\u03C4\u03AC\u03B2\u03B1\u03C3\u03B7 \u03C3\u03C4\u03B7\u03BD \u03B4\u03B9\u03B1\u03B4\u03C1\u03BF\u03BC\u03AE \u03C4\u03BF\u03C5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF\u03C5 - Alt-X",\r
-more_colors:"\u03A0\u03B5\u03C1\u03B9\u03C3\u03C3\u03CC\u03C4\u03B5\u03C1\u03B1 \u03C7\u03C1\u03CE\u03BC\u03B1\u03C4\u03B1"\r
+more_colors:"\u03A0\u03B5\u03C1\u03B9\u03C3\u03C3\u03CC\u03C4\u03B5\u03C1\u03B1 \u03C7\u03C1\u03CE\u03BC\u03B1\u03C4\u03B1",\r
+image_delta_width:"20",\r
+link_delta_width:"80"\r
 });
\ No newline at end of file
index 880de6f8ee5c54768795e9086516d99cebd52f49..1f13eccb27ba2880d776d7bd37f58521cad2c3c1 100755 (executable)
@@ -29,7 +29,7 @@ justifyfull_desc:"Justificar",
 bullist_desc:"Lista desordenada",\r
 numlist_desc:"Lista ordenada",\r
 outdent_desc:"Reducir sangr\u00EDa",\r
-indent_desc:"Aumentar sandr\u00EDa",\r
+indent_desc:"Aumentar sangr\u00EDa",\r
 undo_desc:"Deshacer (Ctrl+Z)",\r
 redo_desc:"Rehacer (Ctrl+Y)",\r
 link_desc:"Insertar/editar hiperv\u00EDnculo",\r
@@ -42,8 +42,8 @@ sup_desc:"Super\u00EDndice",
 hr_desc:"Insertar regla horizontal",\r
 removeformat_desc:"Limpiar formato",\r
 custom1_desc:"Su descripci\u00F3n personal aqu\u00ED",\r
-forecolor_desc:"Seleccionar color del texto",\r
-backcolor_desc:"Seleccionar color de fondo",\r
+forecolor_desc:"Elegir color del texto",\r
+backcolor_desc:"Elegir color de fondo",\r
 charmap_desc:"Insertar caracteres personalizados",\r
 visualaid_desc:"Mostrar/ocultar l\u00EDnea de gu\u00EDa/elementos invisibles",\r
 anchor_desc:"Insertar/editar ancla",\r
@@ -54,9 +54,9 @@ image_props_desc:"Propiedades de imagen",
 newdocument_desc:"Nuevo documento",\r
 help_desc:"Ayuda",\r
 blockquote_desc:"Cita",\r
-clipboard_msg:"Copiar/Cortar/Pegar no se encuentra disponible en Mozilla y Firefox.\n\u00BFDesea obtener m\u00E1s informaci\u00F3n acerca de este tema?",\r
+clipboard_msg:"Copiar/Cortar/Pegar no se encuentra disponible en Mozilla y Firefox.\n \u00BFQuiere m\u00E1s informaci\u00F3n sobre este tema?",\r
 path:"Ruta",\r
-newdocument:"\u00BFEst\u00E1 seguro que desea limpiar todo el contenido?",\r
+newdocument:" \u00BFSeguro que desea limpiar todo el contenido?",\r
 toolbar_focus:"Ir a los botones de herramientas - Alt+Q, Ir al editor - Alt-Z, Ir a la ruta del elemento - Alt-X",\r
 more_colors:"M\u00E1s colores"\r
 });
\ No newline at end of file
index 60a0376edda19177893ed6684ed6dfc11b37ecf3..db43b8ddc52ff1f57d56a07f8ae9d9bda2902493 100755 (executable)
@@ -12,7 +12,7 @@ anchor_title:"Insertar/editar ancla",
 anchor_name:"Nombre del ancla",\r
 code_title:"Editor del c\u00F3digo fuente HTML",\r
 code_wordwrap:"Ajustar al margen",\r
-colorpicker_title:"Seleccionar color",\r
+colorpicker_title:"Elegir color",\r
 colorpicker_picker_tab:"Selector",\r
 colorpicker_picker_title:"Paleta de color",\r
 colorpicker_palette_tab:"Paleta",\r
@@ -21,7 +21,7 @@ colorpicker_named_tab:"Nombrados",
 colorpicker_named_title:"Colores nombrados",\r
 colorpicker_color:"Color:",\r
 colorpicker_name:"Nombre:",\r
-charmap_title:"Seleccionar caracter personalizado",\r
+charmap_title:"Elegir caracter personalizado",\r
 image_title:"Insertar/editar imagen",\r
 image_src:"URL de la Imagen",\r
 image_alt:"Descripci\u00F3n de la Imagen",\r
@@ -45,7 +45,7 @@ link_target:"Destino",
 link_target_same:"Abrir v\u00EDnculo en la misma ventana",\r
 link_target_blank:"Abrir v\u00EDnculo en una ventana nueva",\r
 link_titlefield:"T\u00EDtulo",\r
-link_is_email:"La URL que introdujo parece ser una direcci\u00F3n de email, \u00BFdesea agregar el prefijo mailto: necesario?",\r
-link_is_external:"La URL que introdujo parece ser un v\u00EDnculo externo, \u00BFdesea agregar el prefijo http:// necesario?",\r
+link_is_email:"La URL que introdujo parece ser una direcci\u00F3n de email,  \u00BFdesea agregar el prefijo mailto: necesario?",\r
+link_is_external:"La URL que introdujo parece ser un v\u00EDnculo externo,  \u00BFdesea agregar el prefijo http:// necesario?",\r
 link_list:"Lista de hiperv\u00EDnculos"\r
 });
\ No newline at end of file
index 6942cb0ce000037664b6fb8424c0f2eefb306f3d..6312921f140065cc977834d7c99673a90ab82769 100755 (executable)
@@ -1,23 +1,23 @@
 tinyMCE.addI18n('et.advanced',{\r
-style_select:"Styles",\r
-font_size:"Font size",\r
-fontdefault:"Font family",\r
-block:"Format",\r
-paragraph:"Paragraph",\r
+style_select:"Stiilid",\r
+font_size:"Fondi suurus",\r
+fontdefault:"Font",\r
+block:"Formaat",\r
+paragraph:"Paragraaf",\r
 div:"Div",\r
-address:"Address",\r
-pre:"Preformatted",\r
+address:"Aadress",\r
+pre:"Eelformeeritud",\r
 h1:"Heading 1",\r
 h2:"Heading 2",\r
 h3:"Heading 3",\r
 h4:"Heading 4",\r
 h5:"Heading 5",\r
 h6:"Heading 6",\r
-blockquote:"Blockquote",\r
-code:"Code",\r
-samp:"Code sample",\r
-dt:"Definition term ",\r
-dd:"Definition description",\r
+blockquote:"Plokkviide",\r
+code:"Kood",\r
+samp:"Koodi n\u00E4ide",\r
+dt:"Defineeringu tingimus",\r
+dd:"Defineeringu kirjeldus",\r
 bold_desc:"Rasvane (Ctrl+B)",\r
 italic_desc:"Kursiiv (Ctrl+I)",\r
 underline_desc:"Allajoonitud (Ctrl+U)",\r
@@ -54,7 +54,7 @@ image_props_desc:"Pildi kirjeldus",
 newdocument_desc:"Uus dokument",\r
 help_desc:"Abi",\r
 blockquote_desc:"Plokkviide",\r
-clipboard_msg:"Kopeeri/L\u00F5ika/Kleebi ei ole Mozillas ja Firefoxis saadaval.\r\nKas soovid rohkem infot selle probleemi kohta?",\r
+clipboard_msg:"Kopeeri/L\u00F5ika/Kleebi ei ole Mozillas ja Firefoxis saadaval. Kas soovid rohkem infot selle probleemi kohta?",\r
 path:"Tee",\r
 newdocument:"Oled sa kindel, et tahad kustutada k\u00F5ik sisud?",\r
 toolbar_focus:"H\u00FCppa t\u00F6\u00F6riista nuppudele - Alt+Q, H\u00FCppa redigeerijale - Alt-Z, H\u00FCppa elemendi teele - Alt-X",\r
index 4f37832a4fbdd5564bd8cc587a93efb08630429c..362d026fbe31d002bab0eff95ba373088715171b 100755 (executable)
@@ -1,17 +1,17 @@
 tinyMCE.addI18n('et.advanced_dlg',{\r
-about_title:"About TinyMCE",\r
-about_general:"About",\r
-about_help:"Help",\r
-about_license:"License",\r
-about_plugins:"Plugins",\r
-about_plugin:"Plugin",\r
-about_author:"Author",\r
-about_version:"Version",\r
-about_loaded:"Loaded plugins",\r
+about_title:"Teave TinyMCE kohta",\r
+about_general:"Teave",\r
+about_help:"Abi",\r
+about_license:"Litsents",\r
+about_plugins:"Lisad",\r
+about_plugin:"Lisa",\r
+about_author:"Autor",\r
+about_version:"Versioon",\r
+about_loaded:"Laetud lisad",\r
 anchor_title:"Sisesta/redigeeri ankur",\r
 anchor_name:"Ankru nimi",\r
-code_title:"HTML Source Editor",\r
-code_wordwrap:"Word wrap",\r
+code_title:"HTML koodi redaktor",\r
+code_wordwrap:"S\u00F5na pakkimine",\r
 colorpicker_title:"Vali v\u00E4rv",\r
 colorpicker_picker_tab:"Korjaja",\r
 colorpicker_picker_title:"V\u00E4rvi korjaja",\r
diff --git a/program/js/tiny_mce/themes/advanced/langs/eu.js b/program/js/tiny_mce/themes/advanced/langs/eu.js
new file mode 100644 (file)
index 0000000..9bc232e
--- /dev/null
@@ -0,0 +1,72 @@
+tinyMCE.addI18n('eu.advanced',{\r
+style_select:"Estiloak",\r
+font_size:"Letra-tamaina",\r
+fontdefault:"Letra-tipoa",\r
+block:"Formatua",\r
+paragraph:"Parrafoa",\r
+div:"Div",\r
+address:"Helbidea",\r
+pre:"Aurreformateatua",\r
+h1:"1. goiburua",\r
+h2:"2. goiburua",\r
+h3:"3. goiburua",\r
+h4:"4. goiburua",\r
+h5:"5. goiburua",\r
+h6:"6. goiburua",\r
+blockquote:"Zita",\r
+code:"Kodea",\r
+samp:"Kode adibidea",\r
+dt:"Definizio terminoa (dt) ",\r
+dd:"Definizioa (dd)",\r
+bold_desc:"Beltza (Ctrl+B)",\r
+italic_desc:"Etzana (Ctrl+I)",\r
+underline_desc:"Azpimarratua (Ctrl+U)",\r
+striketrough_desc:"Gainetik marra duena",\r
+justifyleft_desc:"Ezkerrean alineatu",\r
+justifycenter_desc:"Erdian zentratu",\r
+justifyright_desc:"Eskuinean alineatu",\r
+justifyfull_desc:"Testua justifikatu",\r
+bullist_desc:"Zerrenda",\r
+numlist_desc:"Zerrenda ordenatua",\r
+outdent_desc:"Koska kendu",\r
+indent_desc:"Koska gehitu",\r
+undo_desc:"Desegin (Ctrl+Z)",\r
+redo_desc:"Berregin (Ctrl+Y)",\r
+link_desc:"Lotura txertatu/editatu",\r
+unlink_desc:"Lotura kendu",\r
+image_desc:"Irudia txertatu/editatu",\r
+cleanup_desc:"Kode zikina garbitu",\r
+code_desc:"HTML kodea editatu",\r
+sub_desc:"Azpi-indizea",\r
+sup_desc:"Goi-indizea",\r
+hr_desc:"Lerro horizontala gehitu",\r
+removeformat_desc:"Formatua kendu",\r
+custom1_desc:"Nahi duzun deskribapena hemen idatzi",\r
+forecolor_desc:"Testuaren kolorea aukeratu",\r
+backcolor_desc:"Atzeko kolorea aukeratu",\r
+charmap_desc:"Karaktere berezia txertatu",\r
+visualaid_desc:"Elementu ikustezinak ikustarazi/ezkutatu",\r
+anchor_desc:"Aingura txertatu/editatu",\r
+cut_desc:"Ebaki",\r
+copy_desc:"Kopiatu",\r
+paste_desc:"Itsatsi",\r
+image_props_desc:"Irudiaren aukerak",\r
+newdocument_desc:"Dokumentu berria",\r
+help_desc:"Laguntza",\r
+blockquote_desc:"Zita",\r
+clipboard_msg:"Kopiatu/Ebaki/Itsatsi ez dago Mozilla eta Firefoxen.\nHonen inguruko informazioa nahi duzu??",\r
+path:"Bidea",\r
+newdocument:"Eduki guztia kendu nahi duzu?",\r
+toolbar_focus:"Tresnaren botoietara joan - Alt+Q, Editorera joan - Alt-Z, Elementuaren bidera joan - Alt-X",\r
+more_colors:"Kolore gehiago",\r
+image_delta_width:"Irudiaren zabalera",\r
+image_delta_height:"Irudiaren altuera",\r
+link_delta_width:"Loturaren zabalera",\r
+link_delta_height:"Loturaren altuera",\r
+colorpicker_delta_width:"Kolore hautatzailearen zabalera",\r
+colorpicker_delta_height:"Kolore hautatzailearen altuera",\r
+charmap_delta_width:"Karaktere maparen zabalera",\r
+charmap_delta_height:"Karaktere maparen altuera",\r
+anchor_delta_width:"Ainguraren zabalera",\r
+anchor_delta_height:"Ainguraren altuera"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/eu_dlg.js b/program/js/tiny_mce/themes/advanced/langs/eu_dlg.js
new file mode 100644 (file)
index 0000000..6da2305
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('eu.advanced_dlg',{\r
+about_title:"TinyMCEri buruz",\r
+about_general:"Honi buruz",\r
+about_help:"Laguntza",\r
+about_license:"Lizentzia",\r
+about_plugins:"Gehigarriak",\r
+about_plugin:"Gehiagarria",\r
+about_author:"Egilea",\r
+about_version:"Bertsioa",\r
+about_loaded:"Kargatutako gehigarriak",\r
+anchor_title:"Aingura txertatu/editatu",\r
+anchor_name:"Ainguraren izena",\r
+code_title:"HTML kodearen editorea",\r
+code_wordwrap:"Itzulbiratu",\r
+colorpicker_title:"Kolorea aukeratu",\r
+colorpicker_picker_tab:"Aukeratu",\r
+colorpicker_picker_title:"Kolore aukeratzailea",\r
+colorpicker_palette_tab:"Paleta",\r
+colorpicker_palette_title:"Kolore paleta",\r
+colorpicker_named_tab:"Izendunak",\r
+colorpicker_named_title:"Izendun koloreak",\r
+colorpicker_color:"Kolorea:",\r
+colorpicker_name:"Izena:",\r
+charmap_title:"Karaktere berezia aukeratu",\r
+image_title:"Irudia txertatu/editatu",\r
+image_src:"Irudiaren URL helbidea",\r
+image_alt:"Irudiaren deskribapena",\r
+image_list:"Irudi zerrenda",\r
+image_border:"Inguruko marra",\r
+image_dimensions:"Tamaina",\r
+image_vspace:"Tarte bertikala",\r
+image_hspace:"Tarte horizontala",\r
+image_align:"Alineazioa",\r
+image_align_baseline:"Oinarriko marra",\r
+image_align_top:"Goian",\r
+image_align_middle:"Tartean",\r
+image_align_bottom:"Behean",\r
+image_align_texttop:"Testua goian",\r
+image_align_textbottom:"Testua behean",\r
+image_align_left:"Ezkerrean",\r
+image_align_right:"Eskuinean",\r
+link_title:"Lotura txertatu/editatu",\r
+link_url:"Loturaren URLa",\r
+link_target:"Helburua",\r
+link_target_same:"Lotura leiho berean ireki",\r
+link_target_blank:"Lotura leiho berrian ireki",\r
+link_titlefield:"Izenburua",\r
+link_is_email:"Sartutako helbideak e-posta bat dirudi, aurretik mailto: gehitzea nahi duzu?",\r
+link_is_external:"Sartutako helbideak kanpoko webgune batena dirudi, aurretik http:// gehitzea nahi duzu?",\r
+link_list:"Lotura zerrenda"\r
+});
\ No newline at end of file
index 6c063b13439a4b30231b07478d572c2fdd1c8d97..127055b5492fabf8356d5a738846e5d2ba1cd59b 100755 (executable)
@@ -1,62 +1,62 @@
 tinyMCE.addI18n('fa.advanced',{\r
-style_select:"\u0633\u0628\u06A9\u200C\u0647\u0627",\r
+style_select:"\u0627\u0633\u062A\u06CC\u0644 \u0647\u0627",\r
 font_size:"\u0627\u0646\u062F\u0627\u0632\u0647 \u0642\u0644\u0645",\r
-fontdefault:"\u0646\u0648\u0639 \u0642\u0644\u0645",\r
+fontdefault:"\u062E\u0627\u0646\u0648\u0627\u062F\u0647 \u0642\u0644\u0645",\r
 block:"\u0642\u0627\u0644\u0628",\r
 paragraph:"\u067E\u0627\u0631\u0627\u06AF\u0631\u0627\u0641",\r
 div:"Div",\r
 address:"\u0622\u062F\u0631\u0633",\r
-pre:"\u0627\u0632 \u0642\u0628\u0644 \u0642\u0627\u0644\u0628\u0646\u062F\u06CC \u0634\u062F\u0647",\r
-h1:"\u0633\u0631\u0641\u0635\u0644 1",\r
-h2:"\u0633\u0631\u0641\u0635\u0644 2",\r
-h3:"\u0633\u0631\u0641\u0635\u0644 3",\r
-h4:"\u0633\u0631\u0641\u0635\u0644 4",\r
-h5:"\u0633\u0631\u0641\u0635\u0644 5",\r
-h6:"\u0633\u0631\u0641\u0635\u0644 6",\r
-blockquote:"\u062C\u0639\u0628\u0647 \u0646\u0642\u0644 \u0642\u0648\u0644",\r
-code:"\u06A9\u062F",\r
-samp:"\u0646\u0645\u0648\u0646\u0647 \u06A9\u062F",\r
-dt:"Definition term ",\r
-dd:"Definition description",\r
-bold_desc:"(Ctrl+B) \u067E\u0631\u0631\u0646\u06AF",\r
-italic_desc:"(Ctrl+I) \u06A9\u062C",\r
-underline_desc:"(Ctrl+U) \u0632\u06CC\u0631\u062E\u0637",\r
-striketrough_desc:"\u062E\u0637 \u062E\u0648\u0631\u062F\u0647",\r
-justifyleft_desc:"\u0686\u067E \u0686\u06CC\u0646",\r
-justifycenter_desc:"\u0648\u0633\u0637 \u0686\u06CC\u0646",\r
-justifyright_desc:"\u0631\u0627\u0633\u062A \u0686\u06CC\u0646",\r
-justifyfull_desc:"\u062A\u0631\u0627\u0632 \u06A9\u0634\u06CC\u062F\u0647",\r
-bullist_desc:"\u0644\u06CC\u0633\u062A \u0633\u0627\u062F\u0647",\r
-numlist_desc:"\u0644\u06CC\u0633\u062A \u0634\u0645\u0627\u0631\u0647\u200C\u062F\u0627\u0631",\r
-outdent_desc:"\u06A9\u0627\u0647\u0634 \u062A\u0648\u0631\u0641\u062A\u06AF\u06CC",\r
-indent_desc:"\u0627\u0641\u0632\u0627\u06CC\u0634 \u062A\u0648\u0631\u0641\u062A\u06AF\u06CC",\r
-undo_desc:"(Ctrl+Z) \u0628\u0627\u0637\u0644 \u0646\u0645\u0648\u062F\u0646",\r
-redo_desc:"(Ctrl+Y) \u062A\u06A9\u0631\u0627\u0631",\r
-link_desc:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0644\u06CC\u0646\u06A9",\r
-unlink_desc:"\u062D\u0630\u0641 \u0644\u06CC\u0646\u06A9",\r
+pre:"\u0642\u0627\u0644\u0628 \u0628\u0646\u062F\u06CC \u0634\u062F\u0647 \u0627\u0632 \u0642\u0628\u0644",\r
+h1:"\u0639\u0646\u0648\u0627\u0646 \u06AF\u0630\u0627\u0631\u06CC \u06F1",\r
+h2:"\u0639\u0646\u0648\u0627\u0646 \u06AF\u0630\u0627\u0631\u06CC 2",\r
+h3:"\u0639\u0646\u0648\u0627\u0646 \u06AF\u0630\u0627\u0631\u06CC 3",\r
+h4:"\u0639\u0646\u0648\u0627\u0646 \u06AF\u0630\u0627\u0631\u06CC 4",\r
+h5:"\u0639\u0646\u0648\u0627\u0646 \u06AF\u0630\u0627\u0631\u06CC 5",\r
+h6:"\u0639\u0646\u0648\u0627\u0646 \u06AF\u0630\u0627\u0631\u06CC 6",\r
+blockquote:"\u0628\u0644\u0648\u0643 \u0646\u0642\u0644 \u0642\u0648\u0644",\r
+code:"\u0643\u062F",\r
+samp:"\u0646\u0645\u0648\u0646\u0647 \u0643\u062F",\r
+dt:"\u062A\u0639\u0631\u06CC\u0641 \u0648\u0627\u0698\u0647 ",\r
+dd:"\u062A\u0639\u0631\u06CC\u0641 \u062A\u0648\u0636\u06CC\u062D",\r
+bold_desc:"\u0636\u062E\u06CC\u0645 (Ctrl+B)",\r
+italic_desc:"\u0643\u062C (Ctrl+I)",\r
+underline_desc:"\u0632\u06CC\u0631 \u062E\u0637 (Ctrl+U)",\r
+striketrough_desc:"\u062E\u0637 \u0648\u0633\u0637",\r
+justifyleft_desc:"\u062A\u0631\u0627\u0632 \u0686\u067E",\r
+justifycenter_desc:"\u062A\u0631\u0627\u0632 \u0648\u0633\u0637",\r
+justifyright_desc:"\u062A\u0631\u0627\u0632 \u0631\u0627\u0633\u062A",\r
+justifyfull_desc:"\u062A\u0631\u0627\u0632 \u0643\u0627\u0645\u0644",\r
+bullist_desc:"\u0644\u06CC\u0633\u062A \u0646\u0627\u0645\u0631\u062A\u0628",\r
+numlist_desc:"\u0644\u06CC\u0633\u062A \u0645\u0631\u062A\u0628",\r
+outdent_desc:"\u0628\u06CC\u0631\u0648\u0646 \u0622\u0645\u062F\u06AF\u06CC",\r
+indent_desc:"\u062A\u0648\u0631\u0641\u062A\u06AF\u06CC",\r
+undo_desc:"\u0627\u0646\u062C\u0627\u0645 \u0639\u0645\u0644 \u0642\u0628\u0644 (Ctrl+Z)",\r
+redo_desc:"\u0627\u0646\u062C\u0627\u0645 \u0639\u0645\u0644 \u0628\u0639\u062F (Ctrl+Y)",\r
+link_desc:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0644\u06CC\u0646\u0643",\r
+unlink_desc:"\u063A\u06CC\u0631 \u0644\u06CC\u0646\u0643 \u0643\u0631\u062F\u0646",\r
 image_desc:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u062A\u0635\u0648\u06CC\u0631",\r
-cleanup_desc:"\u067E\u0627\u06A9 \u0633\u0627\u0632\u06CC \u06A9\u062F\u0647\u0627\u06CC \u0622\u0634\u0641\u062A\u0647",\r
-code_desc:"HTML \u0648\u06CC\u0631\u0627\u06CC\u0634 \u06A9\u062F",\r
-sub_desc:"(\u0632\u06CC\u0631\u0646\u0648\u06CC\u0633 (\u0627\u0646\u062F\u06CC\u0633",\r
-sup_desc:"(\u0628\u0627\u0644\u0627\u0646\u0648\u06CC\u0633 (\u062A\u0648\u0627\u0646",\r
+cleanup_desc:"\u067E\u0627\u0643 \u0633\u0627\u0632\u06CC \u0643\u062F \u0647\u0627\u06CC \u0628\u0647\u0645 \u062E\u0648\u0631\u062F\u0647",\r
+code_desc:"\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0633\u0648\u0631\u0633 HTML",\r
+sub_desc:"\u067E\u0627\u06CC\u06CC\u0646 \u0646\u0648\u06CC\u0633",\r
+sup_desc:"\u0628\u0627\u0644\u0627 \u0646\u0648\u06CC\u0633",\r
 hr_desc:"\u062F\u0631\u062C \u062E\u0637 \u0627\u0641\u0642\u06CC",\r
-removeformat_desc:"\u062D\u0630\u0641 \u0633\u0628\u06A9",\r
-custom1_desc:"\u0645\u062D\u0644 \u062A\u0648\u0636\u06CC\u062D \u062F\u0644\u062E\u0648\u0627\u0647 \u0634\u0645\u0627",\r
-forecolor_desc:"\u0631\u0646\u06AF \u0645\u062A\u0646 \u0631\u0627 \u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F",\r
-backcolor_desc:"\u0631\u0646\u06AF \u067E\u0633 \u0632\u0645\u06CC\u0646\u0647 \u0631\u0627 \u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F",\r
-charmap_desc:"\u062F\u0631\u062C \u06A9\u0627\u0631\u0627\u06A9\u062A\u0631 \u062F\u0644\u062E\u0648\u0627\u0647",\r
-visualaid_desc:"\u062A\u063A\u06CC\u06CC\u0631 \u0648\u0636\u0639\u06CC\u062A \u062E\u0637\u0648\u0637 \u0631\u0627\u0647\u0646\u0645\u0627/\u0639\u0646\u0627\u0635\u0631 \u0645\u062E\u0641\u06CC",\r
-anchor_desc:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0645\u0631\u062C\u0639",\r
-cut_desc:"\u0628\u0631\u0634",\r
-copy_desc:"\u0631\u0648\u0646\u0648\u0634\u062A",\r
-paste_desc:"\u0686\u0633\u0628\u0627\u0646\u062F\u0646",\r
-image_props_desc:"\u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u062A\u0635\u0648\u06CC\u0631",\r
+removeformat_desc:"\u062D\u0630\u0641 \u0642\u0627\u0644\u0628 \u0628\u0646\u062F\u06CC",\r
+custom1_desc:"\u062A\u0648\u0636\u06CC\u062D \u0633\u0641\u0627\u0631\u0634\u06CC \u0634\u0645\u0627 \u062F\u0631 \u0627\u06CC\u0646\u062C\u0627",\r
+forecolor_desc:"\u0627\u0646\u062A\u062E\u0627\u0628 \u0631\u0646\u06AF \u0645\u062A\u0646",\r
+backcolor_desc:"\u0627\u0646\u062A\u062E\u0627\u0628 \u0631\u0646\u06AF \u0632\u0645\u06CC\u0646\u0647",\r
+charmap_desc:"\u062F\u0631\u062C \u0643\u0627\u0631\u0627\u0643\u062A\u0631 \u0633\u0641\u0627\u0631\u0634\u06CC",\r
+visualaid_desc:"\u062A\u0639\u0648\u06CC\u0636 \u0639\u0646\u0627\u0635\u0631 \u062E\u0637\u0648\u0637 \u0631\u0627\u0647\u0646\u0645\u0627/\u063A\u06CC\u0631 \u0642\u0627\u0628\u0644 \u0646\u0645\u0627\u06CC\u0627\u0646",\r
+anchor_desc:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0644\u0646\u06AF\u0631",\r
+cut_desc:"\u0628\u0631\u0634 (Cut)",\r
+copy_desc:"\u0643\u067E\u06CC",\r
+paste_desc:"\u0686\u0633\u0628\u0627\u0646\u062F\u0646 (Paste)",\r
+image_props_desc:"\u0645\u0634\u062E\u0635\u0627\u062A \u062A\u0635\u0648\u06CC\u0631",\r
 newdocument_desc:"\u0633\u0646\u062F \u062C\u062F\u06CC\u062F",\r
-help_desc:"\u0631\u0627\u0647\u0646\u0645\u0627",\r
-blockquote_desc:"\u062C\u0639\u0628\u0647 \u0646\u0642\u0644 \u0642\u0648\u0644",\r
-clipboard_msg:"\u0631\u0648\u0646\u0648\u0634\u062A/\u0628\u0631\u0634/\u062C\u0627\u06CC\u06AF\u0630\u0627\u0631\u06CC \u062F\u0631 \u0645\u0631\u0648\u0631\u06AF\u0631\u0647\u0627\u06CC \u0645\u0648\u0632\u06CC\u0644\u0627 \u0648 \u0641\u0627\u06CC\u0631\u0641\u0627\u06A9\u0633 \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u0646\u062F.\r\n\u0622\u06CC\u0627 \u0628\u0647 \u0627\u0637\u0644\u0627\u0639\u0627\u062A \u0628\u06CC\u0634\u062A\u0631\u06CC \u062F\u0631 \u0627\u06CC\u0646 \u0632\u0645\u06CC\u0646\u0647 \u0646\u06CC\u0627\u0632 \u062F\u0627\u0631\u06CC\u062F\u061F",\r
-path:"\u0645\u0633\u064A\u0631",\r
-newdocument:"\u0622\u06CC\u0627 \u0645\u0637\u0645\u0626\u0646\u06CC\u062F \u06A9\u0647 \u0645\u0647\u0645 \u0645\u062D\u062A\u0648\u06CC\u0627\u062A \u0631\u0627 \u067E\u0627\u06A9 \u0645\u06CC \u06A9\u0646\u06CC\u062F\u061F",\r
-toolbar_focus:"\u067E\u0631\u0634 \u0628\u0647 \u06A9\u0644\u06CC\u062F\u0647\u0627\u06CC \u0627\u0628\u0632\u0627\u0631 - Alt+Q, \u067E\u0631\u0634 \u0628\u0647 \u0648\u06CC\u0631\u0627\u06CC\u0634\u06AF\u0631 - Alt-Z, \u067E\u0631\u0634 \u0628\u0647 \u0645\u0633\u06CC\u0631 \u0639\u0646\u0635\u0631 - Alt-X",\r
-more_colors:"\u0631\u0646\u06AF\u200C\u0647\u0627\u06CC \u0628\u06CC\u0634\u062A\u0631"\r
+help_desc:"\u0631\u0627\u0647\u0646\u0645\u0627\u06CC\u06CC",\r
+blockquote_desc:"\u0628\u0644\u0648\u0643 \u0646\u0642\u0644 \u0642\u0648\u0644",\r
+clipboard_msg:"\u0643\u067E\u06CC/\u0628\u0631\u0634 (Cut)/\u0686\u0633\u0628\u0627\u0646\u062F\u0646 (Paste) \u062F\u0631 Mozilla \u0648 Firefox \u0642\u0627\u0628\u0644 \u062F\u0633\u062A\u0631\u0633 \u0646\u0645\u06CC \u0628\u0627\u0634\u062F.\r\n\u0622\u06CC\u0627 \u0634\u0645\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062A \u0628\u06CC\u0634\u062A\u0631\u06CC \u062F\u0631\u0628\u0627\u0631\u0647 \u0627\u06CC\u0646 \u0645\u0648\u0636\u0648\u0639 \u0645\u06CC \u062E\u0648\u0627\u0647\u06CC\u062F\u061F",\r
+path:"\u0645\u0633\u06CC\u0631",\r
+newdocument:"\u0622\u06CC\u0627 \u0634\u0645\u0627 \u0645\u06CC \u062E\u0648\u0627\u0647\u06CC\u062F \u062A\u0627 \u062A\u0645\u0627\u0645\u06CC \u0645\u062D\u062A\u0648\u0627 \u0631\u0627 \u067E\u0627\u0643 \u0643\u0646\u06CC\u062F\u061F",\r
+toolbar_focus:"\u067E\u0631\u0634 \u0628\u0647 \u062F\u0643\u0645\u0647 \u0647\u0627\u06CC \u0627\u0628\u0632\u0627\u0631 - Alt+Q \u060C \u067E\u0631\u0634 \u0628\u0647 \u0648\u06CC\u0631\u0627\u06CC\u0634\u06AF\u0631 - Alt-Z \u060C \u067E\u0631\u0634 \u0628\u0647 \u0645\u0633\u06CC\u0631 \u0639\u0646\u0635\u0631 - Alt-X",\r
+more_colors:"\u0631\u0646\u06AF\u0647\u0627\u06CC \u0628\u06CC\u0634\u062A\u0631"\r
 });
\ No newline at end of file
index ddc6ddc83bd4c38be6147f1869566e461d0593cd..80c5b451270ecd08a154e1409b0f43fdd649c6cd 100755 (executable)
@@ -1,51 +1,51 @@
 tinyMCE.addI18n('fa.advanced_dlg',{\r
-about_title:"About TinyMCE",\r
+about_title:"\u062F\u0631\u0628\u0627\u0631\u0647 TinyMCE",\r
 about_general:"\u062F\u0631\u0628\u0627\u0631\u0647",\r
-about_help:"\u0631\u0627\u0647\u0646\u0645\u0627",\r
-about_license:"\u0627\u062C\u0627\u0632\u0647 \u0646\u0627\u0645\u0647",\r
-about_plugins:"Plugins",\r
-about_plugin:"Plugin",\r
-about_author:"Author",\r
-about_version:"\u0646\u06AF\u0627\u0631\u0634",\r
-about_loaded:"Loaded plugins",\r
-anchor_title:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0645\u0631\u062C\u0639",\r
-anchor_name:"\u0646\u0627\u0645 \u0645\u0631\u062C\u0639",\r
-code_title:"HTML Source Editor",\r
-code_wordwrap:"Word wrap",\r
-colorpicker_title:"\u0631\u0646\u06AF\u06CC \u0631\u0627 \u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F",\r
-colorpicker_picker_tab:"Picker",\r
-colorpicker_picker_title:"Color picker",\r
-colorpicker_palette_tab:"Palette",\r
-colorpicker_palette_title:"Palette colors",\r
-colorpicker_named_tab:"Named",\r
-colorpicker_named_title:"Named colors",\r
+about_help:"\u0631\u0627\u0647\u0646\u0645\u0627\u06CC\u06CC",\r
+about_license:"\u0644\u06CC\u0633\u0627\u0646\u0633",\r
+about_plugins:"\u0627\u0644\u062D\u0627\u0642\u0627\u062A",\r
+about_plugin:"\u0627\u0644\u062D\u0627\u0642\u0647",\r
+about_author:"\u0645\u0624\u0644\u0641",\r
+about_version:"\u0646\u0633\u062E\u0647",\r
+about_loaded:"\u0627\u0644\u062D\u0627\u0642\u0627\u062A \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u0634\u062F\u0647",\r
+anchor_title:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0644\u0646\u06AF\u0631 (Anchor)",\r
+anchor_name:"\u0646\u0627\u0645 \u0644\u0646\u06AF\u0631 (Anchor)",\r
+code_title:"\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0633\u0648\u0631\u0633 HTML",\r
+code_wordwrap:"\u0634\u0643\u0633\u062A\u0646 \u062E\u0637\u0648\u0637",\r
+colorpicker_title:"\u0627\u0646\u062A\u062E\u0627\u0628 \u06CC\u0643 \u0631\u0646\u06AF",\r
+colorpicker_picker_tab:"\u0627\u0646\u062A\u062E\u0627\u0628 \u0643\u0646\u0646\u062F\u0647",\r
+colorpicker_picker_title:"\u0627\u0646\u062A\u062E\u0627\u0628 \u0643\u0646\u0646\u062F\u0647 \u0631\u0646\u06AF",\r
+colorpicker_palette_tab:"\u0627\u0644\u06AF\u0648",\r
+colorpicker_palette_title:"\u0631\u0646\u06AF \u0647\u0627\u06CC \u0627\u0644\u06AF\u0648",\r
+colorpicker_named_tab:"\u0646\u0627\u0645 \u062F\u0627\u0631",\r
+colorpicker_named_title:"\u0631\u0646\u06AF \u0647\u0627\u06CC \u0646\u0627\u0645 \u062F\u0627\u0631",\r
 colorpicker_color:"\u0631\u0646\u06AF:",\r
 colorpicker_name:"\u0646\u0627\u0645:",\r
-charmap_title:"\u06A9\u0627\u0631\u0627\u06A9\u062A\u0631 \u062F\u0644\u062E\u0648\u0627\u0647 \u0631\u0627 \u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F",\r
+charmap_title:"\u0627\u0646\u062A\u062E\u0627\u0628 \u0643\u0627\u0631\u0627\u0643\u062A\u0631 \u0633\u0641\u0627\u0631\u0634\u06CC",\r
 image_title:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u062A\u0635\u0648\u06CC\u0631",\r
-image_src:"\u062A\u0635\u0648\u06CC\u0631 URL",\r
-image_alt:"\u062A\u0648\u0636\u06CC\u062D\u0627\u062A \u062A\u0635\u0648\u06CC\u0631",\r
-image_list:"Image list",\r
+image_src:"URL \u062A\u0635\u0648\u06CC\u0631",\r
+image_alt:"\u062A\u0648\u0636\u06CC\u062D \u062A\u0635\u0648\u06CC\u0631",\r
+image_list:"\u0644\u06CC\u0633\u062A \u062A\u0635\u0648\u06CC\u0631",\r
 image_border:"\u062D\u0627\u0634\u06CC\u0647",\r
 image_dimensions:"\u0627\u0628\u0639\u0627\u062F",\r
-image_vspace:"\u0641\u0636\u0627\u06CC \u0639\u0645\u0648\u062F\u06CC",\r
-image_hspace:"\u0641\u0636\u0627\u06CC \u0627\u0641\u0642\u06CC",\r
+image_vspace:"\u0641\u0627\u0635\u0644\u0647 \u0639\u0645\u0648\u062F\u06CC",\r
+image_hspace:"\u0641\u0627\u0635\u0644\u0647 \u0627\u0641\u0642\u06CC",\r
 image_align:"\u062A\u0631\u0627\u0632",\r
-image_align_baseline:"\u062E\u0637 \u0632\u0645\u06CC\u0646\u0647",\r
+image_align_baseline:"\u062E\u0637 \u067E\u0627\u06CC\u0647",\r
 image_align_top:"\u0628\u0627\u0644\u0627",\r
 image_align_middle:"\u0648\u0633\u0637",\r
 image_align_bottom:"\u067E\u0627\u06CC\u06CC\u0646",\r
-image_align_texttop:"Text top",\r
-image_align_textbottom:"Text bottom",\r
+image_align_texttop:"\u0628\u0627\u0644\u0627 \u0645\u062A\u0646",\r
+image_align_textbottom:"\u067E\u0627\u06CC\u06CC\u0646 \u0645\u062A\u0646",\r
 image_align_left:"\u0686\u067E",\r
 image_align_right:"\u0631\u0627\u0633\u062A",\r
-link_title:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0644\u06CC\u0646\u06A9",\r
-link_url:"\u0644\u06CC\u0646\u06A9 URL",\r
-link_target:"\u0647\u062F\u0641",\r
-link_target_same:"\u0628\u0627\u0632\u0634\u062F\u0646 \u062F\u0631 \u0647\u0645\u0627\u0646 \u067E\u0646\u062C\u0631\u0647",\r
-link_target_blank:"\u0628\u0627\u0632\u0634\u062F\u0646 \u062F\u0631 \u067E\u0646\u062C\u0631\u0647 \u062C\u062F\u06CC\u062F",\r
+link_title:"\u062F\u0631\u062C/\u0648\u06CC\u0631\u0627\u06CC\u0634 \u0644\u06CC\u0646\u0643",\r
+link_url:"URL \u0644\u06CC\u0646\u0643",\r
+link_target:"\u0645\u0642\u0635\u062F (Target)",\r
+link_target_same:"\u0628\u0627\u0632\u0634\u062F\u0646 \u0644\u06CC\u0646\u0643 \u062F\u0631 \u0647\u0645\u0627\u0646 \u067E\u0646\u062C\u0631\u0647",\r
+link_target_blank:"\u0628\u0627\u0632 \u0634\u062F\u0646 \u0644\u06CC\u0646\u0643 \u062F\u0631 \u06CC\u0643 \u067E\u0646\u062C\u0631\u0647 \u062C\u062F\u06CC\u062F",\r
 link_titlefield:"\u0639\u0646\u0648\u0627\u0646",\r
-link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",\r
-link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",\r
-link_list:"Link list"\r
+link_is_email:"URL \u06CC \u0643\u0647 \u0634\u0645\u0627 \u0648\u0627\u0631\u062F \u0646\u0645\u0648\u062F\u0647 \u0627\u06CC\u062F \u0628\u0647 \u0646\u0638\u0631 \u0645\u06CC \u0622\u06CC\u062F \u0643\u0647 \u06CC\u0643 \u0622\u062F\u0631\u0633 \u0627\u06CC\u0645\u06CC\u0644 \u0645\u06CC \u0628\u0627\u0634\u062F \u060C \u0622\u06CC\u0627 \u0645\u0627\u06CC\u0644\u06CC\u062F \u062A\u0627 \u067E\u06CC\u0634\u0648\u0646\u062F \u0627\u062C\u0628\u0627\u0631\u06CC \u0644\u0627\u0632\u0645\u0647 :mailto \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u0646\u0645\u0627\u0626\u06CC\u062F\u061F",\r
+link_is_external:"URL \u06CC \u0643\u0647 \u0634\u0645\u0627 \u0648\u0627\u0631\u062F \u0646\u0645\u0648\u062F\u0647 \u0627\u06CC\u062F \u0628\u0647 \u0646\u0638\u0631 \u0645\u06CC \u0622\u06CC\u062F \u0643\u0647 \u0644\u06CC\u0646\u0643 \u062E\u0627\u0631\u062C\u06CC \u0645\u06CC \u0628\u0627\u0634\u062F \u060C \u0622\u06CC\u0627 \u0645\u0627\u06CC\u0644\u06CC\u062F \u062A\u0627 \u067E\u06CC\u0634\u0648\u0646\u062F \u0644\u0627\u0632\u0645\u0647 //:http \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u0646\u0645\u0627\u0626\u06CC\u062F\u061F",\r
+link_list:"\u0644\u06CC\u0633\u062A \u0644\u06CC\u0646\u0643"\r
 });
\ No newline at end of file
index 076352d97e0378efcbd4868bf887f927f301b169..dfdfbf5394808886674f78a75bdeb25322a1d6a7 100755 (executable)
@@ -1,7 +1,7 @@
 tinyMCE.addI18n('fi.advanced',{\r
 style_select:"Tyylit",\r
-font_size:"Fonttikoko",\r
-fontdefault:"Fontti",\r
+font_size:"Kirjasinkoko",\r
+fontdefault:"Kirjasin",\r
 block:"Muotoilu",\r
 paragraph:"Kappale",\r
 div:"Div",\r
@@ -15,7 +15,7 @@ h5:"Otsikko 5",
 h6:"Otsikko 6",\r
 blockquote:"Pitk\u00E4 lainaus",\r
 code:"Koodi",\r
-samp:"Koodi esimerkki",\r
+samp:"Koodiesimerkki",\r
 dt:"M\u00E4\u00E4rittelyn ehto ",\r
 dd:"M\u00E4\u00E4rittelyn kuvaus",\r
 bold_desc:"Lihavoitu (Ctrl+B)",\r
@@ -28,7 +28,7 @@ justifyright_desc:"Tasaus oikealle",
 justifyfull_desc:"Tasattu",\r
 bullist_desc:"J\u00E4rjest\u00E4m\u00E4t\u00F6n lista",\r
 numlist_desc:"J\u00E4rjestetty lista",\r
-outdent_desc:"V\u00E4henn\u00E4 sisennyst\u00E4",\r
+outdent_desc:"Loitonna",\r
 indent_desc:"Sisenn\u00E4",\r
 undo_desc:"Peru (Ctrl+Z)",\r
 redo_desc:"Tee uudelleen (Ctrl+Y)",\r
@@ -36,7 +36,7 @@ link_desc:"Lis\u00E4\u00E4/muuta linkki",
 unlink_desc:"Poista linkki",\r
 image_desc:"Lis\u00E4\u00E4/muuta kuva",\r
 cleanup_desc:"Siisti sekainen koodi",\r
-code_desc:"Editoi HTML-koodia",\r
+code_desc:"Muokkaa HTML-koodia",\r
 sub_desc:"Alaindeksi",\r
 sup_desc:"Yl\u00E4indeksi",\r
 hr_desc:"Lis\u00E4\u00E4 vaakasuora viivain",\r
@@ -54,7 +54,7 @@ image_props_desc:"Kuvan ominaisuudet",
 newdocument_desc:"Uusi tiedosto",\r
 help_desc:"Ohje",\r
 blockquote_desc:"Pitk\u00E4 lainaus",\r
-clipboard_msg:"Kopioi/Leikkaa/Liit\u00E4 -painikkeet eiv\u00E4t toimi Mozilla ja Firefox-selaimilla. Voit kuitenkin k\u00E4ytt\u00E4\u00E4 n\u00E4pp\u00E4inyhdistelmi\u00E4 kopioimiseen (ctrl+c), leikkaamiseen (ctrl+x) ja liitt\u00E4miseen (ctrl+v).\r\nHalutatko lis\u00E4\u00E4 tietoa?",\r
+clipboard_msg:"Kopioi/Leikkaa/Liit\u00E4 -painikkeet eiv\u00E4t toimi Mozilla ja Firefox -selaimilla. Voit kuitenkin k\u00E4ytt\u00E4\u00E4 n\u00E4pp\u00E4inyhdistelmi\u00E4 kopioimiseen (ctrl+c), leikkaamiseen (ctrl+x) ja liitt\u00E4miseen (ctrl+v). Haluatko lis\u00E4\u00E4 tietoa?",\r
 path:"Polku",\r
 newdocument:"Haluatko varmasti tyhjent\u00E4\u00E4 kaiken sis\u00E4ll\u00F6n?",\r
 toolbar_focus:"Siirry ty\u00F6kaluihin - Alt+Q, Siirry tekstieditoriin - Alt-Z, Siirry elementin polkuun - Alt-X",\r
index 1309e6f13bf88a7d95dac5c1a489369eca147297..aede1cb6a18b0af14e3d1b113c423fc32b035917 100755 (executable)
@@ -16,7 +16,7 @@ colorpicker_title:"Valitse v\u00E4ri",
 colorpicker_picker_tab:"Valitsin",\r
 colorpicker_picker_title:"V\u00E4rin valitsin",\r
 colorpicker_palette_tab:"Paletti",\r
-colorpicker_palette_title:"V\u00E4ripalette",\r
+colorpicker_palette_title:"V\u00E4ripaletti",\r
 colorpicker_named_tab:"Nimetty",\r
 colorpicker_named_title:"Nimetyt v\u00E4rit",\r
 colorpicker_color:"V\u00E4ri:",\r
@@ -45,7 +45,7 @@ link_target:"Kohde",
 link_target_same:"Avaa linkki samassa ikkunassa",\r
 link_target_blank:"Avaa linkki uuteen ikkunaan",\r
 link_titlefield:"Otsikko",\r
-link_is_email:"Antamasi osoite n\u00E4ytt\u00E4\u00E4 olevan s\u00E4\u00E4hk\u00F6postiosoite. Haluatko lis\u00E4t\u00E4 siihen mailto:-etuliitteen?",\r
+link_is_email:"Antamasi osoite n\u00E4ytt\u00E4\u00E4 olevan s\u00E4hk\u00F6postiosoite. Haluatko lis\u00E4t\u00E4 siihen mailto:-etuliitteen?",\r
 link_is_external:"Antamasi osoite n\u00E4ytt\u00E4\u00E4 johtavan ulkopuoliselle sivustolle. Haluatko lis\u00E4t\u00E4 linkin eteen http://-etuliitteen? (suositus)",\r
 link_list:"Linkkilista"\r
 });
\ No newline at end of file
index a0fde92fa9a755fcca3b281a6c5422eec35f2492..dd2592f1c58101d11cd8660d0e8077df3c445bb0 100755 (executable)
@@ -1,19 +1,19 @@
 tinyMCE.addI18n('fr.advanced',{\r
 style_select:"Styles",\r
-font_size:"Taille de la police",\r
-fontdefault:"Famille de police",\r
+font_size:"Taille police",\r
+fontdefault:"Police",\r
 block:"Format",\r
 paragraph:"Paragraphe",\r
 div:"Div",\r
 address:"Adresse",\r
-pre:"Preformatt\u00E9",\r
+pre:"Pr\u00E9format\u00E9",\r
 h1:"Titre 1",\r
 h2:"Titre 2",\r
 h3:"Titre 3",\r
 h4:"Titre 4",\r
 h5:"Titre 5",\r
 h6:"Titre 6",\r
-blockquote:"Citation",\r
+blockquote:"Bloc de citation",\r
 code:"Code",\r
 samp:"Exemple de code",\r
 dt:"Terme \u00E0 d\u00E9finir",\r
@@ -26,27 +26,27 @@ justifyleft_desc:"Align\u00E9 \u00E0 gauche",
 justifycenter_desc:"Centr\u00E9",\r
 justifyright_desc:"Align\u00E9 \u00E0 droite",\r
 justifyfull_desc:"Justifi\u00E9",\r
-bullist_desc:"Liste non-num\u00E9rot\u00E9e",\r
+bullist_desc:"Liste \u00E0 puces",\r
 numlist_desc:"Liste num\u00E9rot\u00E9e",\r
 outdent_desc:"Retirer l'indentation",\r
 indent_desc:"Indenter",\r
-undo_desc:"D\u00E9faire (Ctrl+Z)",\r
-redo_desc:"Refaire (Ctrl+Y)",\r
-link_desc:"Ins\u00E9rer/\u00C9diter le lien",\r
-unlink_desc:"D\u00E9lier",\r
-image_desc:"Ins\u00E9rer/\u00C9diter l'image",\r
-cleanup_desc:"Nettoyer le code non propre",\r
-code_desc:"\u00C9diter source HTML",\r
+undo_desc:"Annuler (Ctrl+Z)",\r
+redo_desc:"R\u00E9tablir (Ctrl+Y)",\r
+link_desc:"Ins\u00E9rer / \u00E9diter le lien",\r
+unlink_desc:"Supprimer le lien",\r
+image_desc:"Ins\u00E9rer / \u00E9diter l'image",\r
+cleanup_desc:"Nettoyer le code",\r
+code_desc:"\u00C9diter le code source HTML",\r
 sub_desc:"Indice",\r
 sup_desc:"Exposant",\r
-hr_desc:"Ins\u00E9rer trait horizontal",\r
-removeformat_desc:"Enlever formattage",\r
+hr_desc:"Ins\u00E9rer un trait horizontal",\r
+removeformat_desc:"Supprimer le formatage",\r
 custom1_desc:"Votre description personnalis\u00E9e ici",\r
 forecolor_desc:"Choisir la couleur du texte",\r
 backcolor_desc:"Choisir la couleur de surlignage",\r
-charmap_desc:"Ins\u00E9rer caract\u00E8res sp\u00E9ciaux",\r
-visualaid_desc:"Activer/d\u00E9sactiver les guides et les \u00E9l\u00E9ments invisibles",\r
-anchor_desc:"Ins\u00E9rer/\u00C9diter ancre",\r
+charmap_desc:"Ins\u00E9rer des caract\u00E8res sp\u00E9ciaux",\r
+visualaid_desc:"Activer / d\u00E9sactiver les guides et les \u00E9l\u00E9ments invisibles",\r
+anchor_desc:"Ins\u00E9rer / \u00E9diter une ancre",\r
 cut_desc:"Couper",\r
 copy_desc:"Copier",\r
 paste_desc:"Coller",\r
@@ -54,9 +54,9 @@ image_props_desc:"Propri\u00E9t\u00E9s de l'image",
 newdocument_desc:"Nouveau document",\r
 help_desc:"Aide",\r
 blockquote_desc:"Citation",\r
-clipboard_msg:"Copier/Couper/Coller n'est pas disponible sous Mozilla et sous Firefox.\n\r\n      Voulez-vous plus d'information sur ce probl\u00E8me\u00A0?",\r
+clipboard_msg:"Les fonctions Copier/Couper/Coller ne sont pas valables sur Mozilla et Firefox.\nSouhaitez-vous avoir plus d'informations sur ce sujet ?",\r
 path:"Chemin",\r
-newdocument:"\u00CAtes-vous s\u00FBr de vouloir effacer l'enti\u00E8ret\u00E9 du document\u00A0?",\r
-toolbar_focus:"Aller aux boutons de l'\u00E9diteur - Alt+Q, Aller \u00E0 l'\u00E9diteur - Alt-Z, Aller au chemin de l'\u00E9l\u00E9ment - Alt-X",\r
+newdocument:"\u00CAtes-vous s\u00FBr de vouloir effacer l'int\u00E9gralit\u00E9 du document ?",\r
+toolbar_focus:"Atteindre les boutons de l'\u00E9diteur - Alt+Q, Aller \u00E0 l'\u00E9diteur - Alt-Z, Aller au chemin de l'\u00E9l\u00E9ment - Alt-X",\r
 more_colors:"Plus de couleurs"\r
 });
\ No newline at end of file
index 3aee7b27f8f1a1ec6f1f0118a69f8dd61cc35aaa..c9ced491f169112ee27e53312dc1488b04455015 100755 (executable)
@@ -8,10 +8,10 @@ about_plugin:"Plugin",
 about_author:"Auteur",\r
 about_version:"Version",\r
 about_loaded:"Plugins charg\u00E9s",\r
-anchor_title:"Ins\u00E9rer/\u00C9diter ancre",\r
+anchor_title:"Ins\u00E9rer / \u00E9diter une ancre",\r
 anchor_name:"Nom de l'ancre",\r
-code_title:"\u00C9diteur de la source HTML",\r
-code_wordwrap:"Rupture de ligne",\r
+code_title:"\u00C9diteur de source HTML",\r
+code_wordwrap:"Retour \u00E0 la ligne",\r
 colorpicker_title:"Choisir une couleur",\r
 colorpicker_picker_tab:"Nuancier",\r
 colorpicker_picker_title:"Nuancier",\r
@@ -22,7 +22,7 @@ colorpicker_named_title:"Couleurs nomm\u00E9es",
 colorpicker_color:"Couleur :",\r
 colorpicker_name:"Nom :",\r
 charmap_title:"Choisir le caract\u00E8re \u00E0 ins\u00E9rer",\r
-image_title:"Ins\u00E9rer/\u00C9diter image",\r
+image_title:"Ins\u00E9rer / \u00E9diter une image",\r
 image_src:"URL de l'image",\r
 image_alt:"Description de l'image",\r
 image_list:"Liste d'images",\r
@@ -31,21 +31,21 @@ image_dimensions:"Dimensions",
 image_vspace:"Espacement vertical",\r
 image_hspace:"Espacement horizontal",\r
 image_align:"Alignement",\r
-image_align_baseline:"Base",\r
-image_align_top:"Sommet",\r
-image_align_middle:"Milieu",\r
-image_align_bottom:"Bas",\r
-image_align_texttop:"Haut du texte",\r
-image_align_textbottom:"Bas du texte",\r
-image_align_left:"Gauche",\r
-image_align_right:"Droite",\r
-link_title:"Ins\u00E9rer/\u00C9diter lien",\r
+image_align_baseline:"Normal",\r
+image_align_top:"En haut",\r
+image_align_middle:"Au milieu",\r
+image_align_bottom:"En bas",\r
+image_align_texttop:"Texte en haut",\r
+image_align_textbottom:"Texte en bas",\r
+image_align_left:"Gauche (flottant)",\r
+image_align_right:"Droite (flottant)",\r
+link_title:"Ins\u00E9rer / \u00E9diter un lien",\r
 link_url:"URL du lien",\r
 link_target:"Cible",\r
 link_target_same:"Ouvrir dans la m\u00EAme fen\u00EAtre",\r
 link_target_blank:"Ouvrir dans une nouvelle fen\u00EAtre",\r
 link_titlefield:"Titre",\r
-link_is_email:"L'url que vous avez entr\u00E9 semble \u00EAtre une adresse e-mail, voulez-vous ajouter le pr\u00E9fixe mailto:\u00A0?",\r
-link_is_external:"L'url que vous avez entr\u00E9 semble \u00EAtre une adresse web externe, voulez-vous ajouter le pr\u00E9fixe http://\u00A0?",\r
+link_is_email:"L'URL que vous avez saisie semble \u00EAtre une adresse e-mail, souhaitez-vous ajouter le pr\u00E9fixe \u00AB mailto: \u00BB ?",\r
+link_is_external:"L'URL que vous avez saisie semble \u00EAtre une adresse web externe. Souhaitez-vous ajouter le pr\u00E9fixe \u00AB http:// \u00BB ?",\r
 link_list:"Liste de liens"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/gl.js b/program/js/tiny_mce/themes/advanced/langs/gl.js
new file mode 100644 (file)
index 0000000..caea6ee
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('gl.advanced',{\r
+style_select:"Estilos",\r
+font_size:"Tama\u00F1o",\r
+fontdefault:"Fonte",\r
+block:"Formato",\r
+paragraph:"P\u00E1rrafo",\r
+div:"Div",\r
+address:"Enderezo",\r
+pre:"Pre-formateado",\r
+h1:"Encabezamento 1",\r
+h2:"Encabezamento 2",\r
+h3:"Encabezamento 3",\r
+h4:"Encabezamento 4",\r
+h5:"Encabezamento 5",\r
+h6:"Encabezamento 6",\r
+blockquote:"Bloque de cita",\r
+code:"C\u00F3digo",\r
+samp:"Mostra de c\u00F3digo",\r
+dt:"Termo de definici\u00F3n",\r
+dd:"Descripci\u00F3n de definici\u00F3n",\r
+bold_desc:"Negrita (Ctrl+B)",\r
+italic_desc:"Cursiva (Ctrl+I)",\r
+underline_desc:"Subli\u00F1ado (Ctrl+U)",\r
+striketrough_desc:"Tachado",\r
+justifyleft_desc:"Ali\u00F1ar \u00E1 esquerda",\r
+justifycenter_desc:"Ali\u00F1ar \u00F3 centro",\r
+justifyright_desc:"Ali\u00F1ar \u00E1 dereita",\r
+justifyfull_desc:"Xustificar",\r
+bullist_desc:"Lista desordenada",\r
+numlist_desc:"Lista ordenada",\r
+outdent_desc:"Reducir sangr\u00EDa",\r
+indent_desc:"Aumentar sangr\u00EDa",\r
+undo_desc:"Desfacer (Ctrl+Z)",\r
+redo_desc:"Re-facer (Ctrl+Y)",\r
+link_desc:"Insertar/editar hiperv\u00EDnculo",\r
+unlink_desc:"Quitar hiperv\u00EDnculo",\r
+image_desc:"Insertar/editar imaxe",\r
+cleanup_desc:"Limpiar lixo no c\u00F3digo",\r
+code_desc:"Editar c\u00F3digo HTML",\r
+sub_desc:"Sub\u00EDndice",\r
+sup_desc:"Super\u00EDndice",\r
+hr_desc:"Insertar regra horizontal",\r
+removeformat_desc:"quitar formato",\r
+custom1_desc:"A s\u00FAa descripci\u00F3n persoal aqu\u00ED",\r
+forecolor_desc:"Seleccionar cor do texto",\r
+backcolor_desc:"Seleccionar cor do fondo",\r
+charmap_desc:"Insertar caracteres persoalizados",\r
+visualaid_desc:"Mostrar/ocultar li\u00F1a de gu\u00EDa/elementos invisibres",\r
+anchor_desc:"Insertar/editar \u00E1ncora",\r
+cut_desc:"Cortar",\r
+copy_desc:"Copiar",\r
+paste_desc:"Pegar",\r
+image_props_desc:"Propiedades de imaxe",\r
+newdocument_desc:"Novo documento",\r
+help_desc:"Axuda",\r
+blockquote_desc:"Cita",\r
+clipboard_msg:"Copiar/Cortar/Pegar non est\u00E1 disponible en Mozilla e Firefox.\r\n\u00BFDesexa obter mais informaci\u00F3n sobre de este asunto?",\r
+path:"Ruta",\r
+newdocument:"\u00BFSeguro que desexa limpar todo o contido?",\r
+toolbar_focus:"Ir \u00F3s bot\u00F3ns de ferramentas - Alt+Q, Ir \u00F3 editor - Alt-Z, Ir \u00E1 ruta do elemento - Alt-X",\r
+more_colors:"M\u00E1is cores"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/gl_dlg.js b/program/js/tiny_mce/themes/advanced/langs/gl_dlg.js
new file mode 100644 (file)
index 0000000..98e000c
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('gl.advanced_dlg',{\r
+about_title:"Sobre TinyMCE",\r
+about_general:"Sobre",\r
+about_help:"Axuda",\r
+about_license:"Licencia",\r
+about_plugins:"Comprementos",\r
+about_plugin:"Compremento",\r
+about_author:"Autor",\r
+about_version:"Versi\u00F3n",\r
+about_loaded:"Comprementos cargados",\r
+anchor_title:"Insertar/editar \u00E1ncora",\r
+anchor_name:"Nome da \u00E1ncora",\r
+code_title:"Editor HTML",\r
+code_wordwrap:"Cortar li\u00F1as autom\u00E1ticamente",\r
+colorpicker_title:"Seleccionar cor",\r
+colorpicker_picker_tab:"Selector",\r
+colorpicker_picker_title:"Selector de cores",\r
+colorpicker_palette_tab:"Paleta",\r
+colorpicker_palette_title:"Paleta de cores",\r
+colorpicker_named_tab:"Nomeados",\r
+colorpicker_named_title:"Cores nomeados",\r
+colorpicker_color:"Cor:",\r
+colorpicker_name:"Nome:",\r
+charmap_title:"Seleccionar caracter personalizado",\r
+image_title:"Insertar/editar imaxe",\r
+image_src:"URL da imaxe",\r
+image_alt:"Descripci\u00F3n da imaxe",\r
+image_list:"Lista de Imaxes",\r
+image_border:"Borde",\r
+image_dimensions:"Dimensi\u00F3n",\r
+image_vspace:"Espacio vertical",\r
+image_hspace:"Espacio horizontal",\r
+image_align:"Ali\u00F1aci\u00F3n",\r
+image_align_baseline:"Li\u00F1a base",\r
+image_align_top:"Arriba",\r
+image_align_middle:"Medio",\r
+image_align_bottom:"Abaixo",\r
+image_align_texttop:"Texto arriba",\r
+image_align_textbottom:"Texto abaixo",\r
+image_align_left:"Esquerda",\r
+image_align_right:"Dereita",\r
+link_title:"Insertar/editar enlace",\r
+link_url:"URL do enlace",\r
+link_target:"Obxetivo",\r
+link_target_same:"Abrir v\u00EDnculo na mesma vent\u00E1",\r
+link_target_blank:"Abrir v\u00EDnculo nunha vent\u00E1 nova",\r
+link_titlefield:"T\u00EDtulo",\r
+link_is_email:"A URL introducida semella ser un enderezo de e-mail, \u00BFDesexa engadi-lo prefixo necesario mailto:?",\r
+link_is_external:"A URL introducida semella ser un v\u00EDnculo externo, \u00BFDesexa engadi-lo prefixo necesario http://?",\r
+link_list:"Lista de hiperv\u00EDnculos"\r
+});
\ No newline at end of file
index 372127caeee528f5db2ffdc0586d54831e2b59ad..d208e4824a8d940719a61b950f070942fad2b44c 100755 (executable)
@@ -13,17 +13,17 @@ h3:"\u05DB\u05D5\u05EA\u05E8\u05EA 3",
 h4:"\u05DB\u05D5\u05EA\u05E8\u05EA 4",\r
 h5:"\u05DB\u05D5\u05EA\u05E8\u05EA 5",\r
 h6:"\u05DB\u05D5\u05EA\u05E8\u05EA 6",\r
-blockquote:"\u05E6\u05D9\u05D8\u05D5\u05D8 \u05D1\u05DC\u05D5\u05E7",\r
+blockquote:"\u05E6\u05D9\u05D8\u05D5\u05D8 \u05E7\u05D8\u05E2",\r
 code:"\u05E7\u05D5\u05D3",\r
 samp:"\u05D3\u05D5\u05D2\u05DE\u05EA \u05E7\u05D5\u05D3",\r
 dt:"\u05DE\u05D5\u05E9\u05D2",\r
 dd:"\u05D4\u05D2\u05D3\u05E8\u05EA \u05D4\u05DE\u05D5\u05E9\u05D2",\r
 bold_desc:"\u05DE\u05D5\u05D3\u05D2\u05E9 (Ctrl+B)",\r
 italic_desc:"\u05E0\u05D8\u05D5\u05D9 (Ctrl+I)",\r
-underline_desc:"\u05E7\u05D5 \u05EA\u05D7\u05EA\u05D5\u05DF(Ctrl+U)",\r
+underline_desc:"\u05E7\u05D5 \u05EA\u05D7\u05EA\u05D5\u05DF (Ctrl+U)",\r
 striketrough_desc:"\u05E7\u05D5 \u05D7\u05D5\u05E6\u05D4",\r
 justifyleft_desc:"\u05D9\u05D9\u05E9\u05D5\u05E8 \u05D8\u05E7\u05E1\u05D8 \u05DC\u05E9\u05DE\u05D0\u05DC",\r
-justifycenter_desc:"\u05DE\u05E8\u05DB\u05D6",\r
+justifycenter_desc:"\u05DE\u05D9\u05E8\u05DB\u05D5\u05D6 \u05D8\u05E7\u05E1\u05D8",\r
 justifyright_desc:"\u05D9\u05D9\u05E9\u05D5\u05E8 \u05D8\u05E7\u05E1\u05D8 \u05DC\u05D9\u05DE\u05D9\u05DF",\r
 justifyfull_desc:"\u05D9\u05D9\u05E9\u05D5\u05E8 \u05DC\u05E9\u05E0\u05D9 \u05D4\u05E6\u05D3\u05D3\u05D9\u05DD",\r
 bullist_desc:"\u05EA\u05D1\u05DC\u05D9\u05D8\u05D9\u05DD",\r
@@ -32,21 +32,21 @@ outdent_desc:"\u05D4\u05D2\u05D3\u05DC\u05EA \u05DB\u05E0\u05D9\u05E1\u05D4",
 indent_desc:"\u05D4\u05E7\u05D8\u05E0\u05EA \u05DB\u05E0\u05D9\u05E1\u05D4",\r
 undo_desc:"\u05D1\u05D9\u05D8\u05D5\u05DC \u05E4\u05E2\u05D5\u05DC\u05D4 (Ctrl+Z)",\r
 redo_desc:"\u05D7\u05D6\u05E8\u05D4 \u05E2\u05DC \u05E4\u05E2\u05D5\u05DC\u05D4 (Ctrl+Y)",\r
-link_desc:"\u05D4\u05D5\u05E1\u05E4\u05D4/\u05E2\u05E8\u05D9\u05DB\u05EA \u05D4\u05D9\u05E4\u05E8-\u05E7\u05D9\u05E9\u05D5\u05E8",\r
-unlink_desc:"\u05D4\u05E1\u05E8\u05EA \u05D4\u05D9\u05E4\u05E8-\u05E7\u05D9\u05E9\u05D5\u05E8",\r
+link_desc:"\u05D4\u05D5\u05E1\u05E4\u05EA/\u05E2\u05E8\u05D9\u05DB\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8",\r
+unlink_desc:"\u05D4\u05E1\u05E8\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8",\r
 image_desc:"\u05D4\u05D5\u05E1\u05E4\u05D4/\u05E2\u05E8\u05D9\u05DB\u05EA \u05D3\u05E3 \u05EA\u05DE\u05D5\u05E0\u05D4",\r
 cleanup_desc:"\u05E0\u05D9\u05E7\u05D5\u05D9 \u05E7\u05D5\u05D3",\r
 code_desc:"\u05E2\u05E8\u05D9\u05DB\u05EA \u05E7\u05D5\u05D3 HTML",\r
 sub_desc:"\u05DB\u05EA\u05D1 \u05E2\u05D9\u05DC\u05D9",\r
 sup_desc:"\u05DB\u05EA\u05D1 \u05EA\u05D7\u05EA\u05D9",\r
-hr_desc:"\u05D4\u05D5\u05E1\u05E4\u05EA \u05E7\u05D5 \u05DE\u05EA\u05D7",\r
+hr_desc:"\u05D4\u05D5\u05E1\u05E4\u05EA \u05E7\u05D5 \u05DE\u05E4\u05E8\u05D9\u05D3",\r
 removeformat_desc:"\u05D4\u05E1\u05E8\u05EA \u05E2\u05D9\u05E6\u05D5\u05D1",\r
 custom1_desc:"\u05D4\u05EA\u05D0\u05D5\u05E8 \u05E9\u05DC\u05DA \u05DB\u05D0\u05D5",\r
 forecolor_desc:"\u05D1\u05D7\u05D9\u05E8\u05EA \u05E6\u05D1\u05E2 \u05D2\u05D5\u05E4\u05DF",\r
 backcolor_desc:"\u05D1\u05D7\u05D9\u05E8\u05EA \u05E6\u05D1\u05E2 \u05E8\u05E7\u05E2",\r
 charmap_desc:"\u05D4\u05D5\u05E1\u05E4\u05EA \u05E1\u05D9\u05DE\u05DF",\r
 visualaid_desc:"\u05D4\u05E6\u05D2\u05D4 \u05D0\u05D5 \u05D4\u05E1\u05EA\u05E8\u05D4 \u05E9\u05DC \u05E1\u05D9\u05DE\u05D5\u05E0\u05D9 \u05E2\u05D9\u05E6\u05D5\u05D1",\r
-anchor_desc:"\u05D4\u05D5\u05E1\u05E4\u05D4/\u05E2\u05E8\u05D9\u05DB\u05EA \u05E1\u05D9\u05DE\u05E0\u05D9\u05D4",\r
+anchor_desc:"\u05D4\u05D5\u05E1\u05E4\u05EA/\u05E2\u05E8\u05D9\u05DB\u05EA \u05E1\u05D9\u05DE\u05E0\u05D9\u05D4",\r
 cut_desc:"\u05D2\u05D6\u05D9\u05E8\u05D4",\r
 copy_desc:"\u05D4\u05E2\u05EA\u05E7\u05D4",\r
 paste_desc:"\u05D4\u05D3\u05D1\u05E7\u05D4",\r
index 35162ea5997b80e3a628e1532e26e90ffdf396f2..413a275ee834e4483e25ffd7965787453761ff90 100755 (executable)
@@ -11,14 +11,14 @@ about_loaded:"\u05EA\u05D5\u05E1\u05E4\u05D5\u05EA \u05E4\u05E2\u05D9\u05DC\u05D
 anchor_title:"\u05D4\u05D5\u05E1\u05E4\u05D4/\u05E2\u05E8\u05D9\u05DB\u05EA \u05E1\u05D9\u05DE\u05E0\u05D9\u05D4",\r
 anchor_name:"\u05E9\u05DD \u05D4\u05E1\u05D9\u05DE\u05E0\u05D9\u05D4",\r
 code_title:"\u05E2\u05D5\u05E8\u05DA \u05D4-HTML",\r
-code_wordwrap:"\u05D4\u05E2\u05D1\u05E8\u05EA \u05DE\u05D9\u05DC\u05D9\u05DD",\r
+code_wordwrap:"\u05D2\u05DC\u05D9\u05E9\u05EA \u05D8\u05E7\u05E1\u05D8",\r
 colorpicker_title:"\u05D1\u05D7\u05D9\u05E8\u05EA \u05E6\u05D1\u05E2",\r
 colorpicker_picker_tab:"\u05D1\u05D5\u05E8\u05E8",\r
 colorpicker_picker_title:"\u05D1\u05D5\u05E8\u05E8 \u05D4\u05E6\u05D1\u05E2\u05D9\u05DD",\r
 colorpicker_palette_tab:"\u05DC\u05D5\u05D7 \u05E6\u05D1\u05E2\u05D9\u05DD",\r
 colorpicker_palette_title:"\u05DC\u05D5\u05D7 \u05E6\u05D1\u05E2\u05D9\u05DD",\r
-colorpicker_named_tab:"\u05DB\u05E0\u05D5\u05D9",\r
-colorpicker_named_title:"\u05E6\u05D1\u05E2\u05D9\u05DD \u05DB\u05E0\u05D5\u05D9\u05DD",\r
+colorpicker_named_tab:"\u05E6\u05D1\u05E2\u05D9\u05DD \u05D1\u05E2\u05DC\u05D9 \u05E9\u05DE\u05D5\u05EA",\r
+colorpicker_named_title:"\u05E6\u05D1\u05E2\u05D9\u05DD \u05D1\u05E2\u05DC\u05D9 \u05E9\u05DE\u05D5\u05EA",\r
 colorpicker_color:"\u05E6\u05D1\u05E2:",\r
 colorpicker_name:"\u05E9\u05DD:",\r
 charmap_title:"\u05D1\u05D7\u05D9\u05E8\u05EA \u05E1\u05D9\u05DE\u05DF",\r
@@ -40,7 +40,7 @@ image_align_textbottom:"\u05E7\u05E6\u05D4 \u05D4\u05EA\u05D7\u05EA\u05D5\u05DF
 image_align_left:"\u05E9\u05DE\u05D0\u05DC",\r
 image_align_right:"\u05D9\u05DE\u05D9\u05DF",\r
 link_title:"\u05D4\u05D5\u05E1\u05E4\u05D4/\u05E2\u05E8\u05D9\u05DB\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8",\r
-link_url:"\u05DB\u05EA\u05D5\u05D1\u05EA \u05D4\u05D4\u05D9\u05E4\u05E8-\u05E7\u05D9\u05E9\u05D5\u05E8",\r
+link_url:"\u05DB\u05EA\u05D5\u05D1\u05EA \u05D4\u05E7\u05D9\u05E9\u05D5\u05E8",\r
 link_target:"\u05D9\u05E2\u05D3",\r
 link_target_same:"\u05E4\u05EA\u05D7 \u05E7\u05D9\u05E9\u05D5\u05E8 \u05D1\u05D0\u05D5\u05EA\u05D5 \u05D7\u05DC\u05D5\u05DF",\r
 link_target_blank:"\u05E4\u05EA\u05D7 \u05E7\u05D9\u05E9\u05D5\u05E8 \u05D1\u05D7\u05DC\u05D5\u05DF \u05D7\u05D3\u05E9",\r
diff --git a/program/js/tiny_mce/themes/advanced/langs/hi.js b/program/js/tiny_mce/themes/advanced/langs/hi.js
new file mode 100644 (file)
index 0000000..2d97859
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('hi.advanced',{\r
+style_select:"Styles",\r
+font_size:"Font size",\r
+fontdefault:"Font family",\r
+block:"Format",\r
+paragraph:"Paragraph",\r
+div:"Div",\r
+address:"Address",\r
+pre:"Preformatted",\r
+h1:"Heading 1",\r
+h2:"Heading 2",\r
+h3:"Heading 3",\r
+h4:"Heading 4",\r
+h5:"Heading 5",\r
+h6:"Heading 6",\r
+blockquote:"Blockquote",\r
+code:"Code",\r
+samp:"Code sample",\r
+dt:"Definition term ",\r
+dd:"Definition description",\r
+bold_desc:"Bold (Ctrl+B)",\r
+italic_desc:"Italic (Ctrl+I)",\r
+underline_desc:"Underline (Ctrl+U)",\r
+striketrough_desc:"Strikethrough",\r
+justifyleft_desc:"Align left",\r
+justifycenter_desc:"Align center",\r
+justifyright_desc:"Align right",\r
+justifyfull_desc:"Align full",\r
+bullist_desc:"Unordered list",\r
+numlist_desc:"Ordered list",\r
+outdent_desc:"Outdent",\r
+indent_desc:"Indent",\r
+undo_desc:"Undo (Ctrl+Z)",\r
+redo_desc:"Redo (Ctrl+Y)",\r
+link_desc:"Insert/edit link",\r
+unlink_desc:"Unlink",\r
+image_desc:"Insert/edit image",\r
+cleanup_desc:"Cleanup messy code",\r
+code_desc:"Edit HTML Source",\r
+sub_desc:"Subscript",\r
+sup_desc:"Superscript",\r
+hr_desc:"Insert horizontal ruler",\r
+removeformat_desc:"Remove formatting",\r
+custom1_desc:"Your custom description here",\r
+forecolor_desc:"Select text color",\r
+backcolor_desc:"Select background color",\r
+charmap_desc:"Insert custom character",\r
+visualaid_desc:"Toggle guidelines/invisible elements",\r
+anchor_desc:"Insert/edit anchor",\r
+cut_desc:"Cut",\r
+copy_desc:"Copy",\r
+paste_desc:"Paste",\r
+image_props_desc:"Image properties",\r
+newdocument_desc:"New document",\r
+help_desc:"Help",\r
+blockquote_desc:"Blockquote",\r
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you want more information about this issue?",\r
+path:"Path",\r
+newdocument:"Are you sure you want clear all contents?",\r
+toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",\r
+more_colors:"More colors"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/hi_dlg.js b/program/js/tiny_mce/themes/advanced/langs/hi_dlg.js
new file mode 100644 (file)
index 0000000..dc6336f
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('hi.advanced_dlg',{\r
+about_title:"About TinyMCE",\r
+about_general:"About",\r
+about_help:"Help",\r
+about_license:"License",\r
+about_plugins:"Plugins",\r
+about_plugin:"Plugin",\r
+about_author:"Author",\r
+about_version:"Version",\r
+about_loaded:"Loaded plugins",\r
+anchor_title:"Insert/edit anchor",\r
+anchor_name:"Anchor name",\r
+code_title:"HTML Source Editor",\r
+code_wordwrap:"Word wrap",\r
+colorpicker_title:"Select a color",\r
+colorpicker_picker_tab:"Picker",\r
+colorpicker_picker_title:"Color picker",\r
+colorpicker_palette_tab:"Palette",\r
+colorpicker_palette_title:"Palette colors",\r
+colorpicker_named_tab:"Named",\r
+colorpicker_named_title:"Named colors",\r
+colorpicker_color:"Color:",\r
+colorpicker_name:"Name:",\r
+charmap_title:"Select custom character",\r
+image_title:"Insert/edit image",\r
+image_src:"Image URL",\r
+image_alt:"Image description",\r
+image_list:"Image list",\r
+image_border:"Border",\r
+image_dimensions:"Dimensions",\r
+image_vspace:"Vertical space",\r
+image_hspace:"Horizontal space",\r
+image_align:"Alignment",\r
+image_align_baseline:"Baseline",\r
+image_align_top:"Top",\r
+image_align_middle:"Middle",\r
+image_align_bottom:"Bottom",\r
+image_align_texttop:"Text top",\r
+image_align_textbottom:"Text bottom",\r
+image_align_left:"Left",\r
+image_align_right:"Right",\r
+link_title:"Insert/edit link",\r
+link_url:"Link URL",\r
+link_target:"Target",\r
+link_target_same:"Open link in the same window",\r
+link_target_blank:"Open link in a new window",\r
+link_titlefield:"Title",\r
+link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",\r
+link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",\r
+link_list:"Link list"\r
+});
\ No newline at end of file
index 3c674385519b7268132ccd9c1b32239b4ca55fe6..8be98335aa081851c8db4d284644270bd91b171b 100755 (executable)
@@ -30,7 +30,7 @@ bullist_desc:"Rendezetlen lista",
 numlist_desc:"Rendezett lista",\r
 outdent_desc:"Beh\u00FAz\u00E1s cs\u00F6kkent\u00E9se",\r
 indent_desc:"Beh\u00FAz\u00E1s n\u00F6vel\u00E9se",\r
-undo_desc:"Visszavon (Ctrl+Z)",\r
+undo_desc:"Visszavon\u00E1s (Ctrl+Z)",\r
 redo_desc:"M\u00E9gis v\u00E9grehajt (Ctrl+Y)",\r
 link_desc:"Link besz\u00FAr\u00E1sa/szerkeszt\u00E9se",\r
 unlink_desc:"Link megsz\u00FCntet\u00E9se",\r
@@ -54,7 +54,7 @@ image_props_desc:"K\u00E9p tulajdons\u00E1gai",
 newdocument_desc:"\u00DAj dokumentum",\r
 help_desc:"Seg\u00EDts\u00E9g",\r
 blockquote_desc:"Id\u00E9zet",\r
-clipboard_msg:"A M\u00E1sol\u00E1s/Kiv\u00E1g\u00E1s/Besz\u00FAr\u00E1s funkci\u00F3k nem el\u00E9rhet\u0151k Mozilla \u00E9s Firefox alatt. K\u00EDv\u00E1n t\u00F6bbet tudni err\u0151l a t\u00E9m\u00E1r\u00F3l?",\r
+clipboard_msg:"A M\u00E1sol\u00E1s/Kiv\u00E1g\u00E1s/Besz\u00FAr\u00E1s funkci\u00F3k nem \u00E9rhet\u0151ek el Mozilla \u00E9s Firefox alatt. K\u00EDv\u00E1n t\u00F6bbet tudni err\u0151l a t\u00E9m\u00E1r\u00F3l?",\r
 path:"\u00DAtvonal",\r
 newdocument:"Biztosan t\u00F6rli az eddigi tartalmat?",\r
 toolbar_focus:"Eszk\u00F6zgombokra ugr\u00E1s - Alt+Q, Szerkeszt\u0151h\u00F6z ugr\u00E1s - Alt-Z, Elem\u00FAtvonalhoz ugr\u00E1s - Alt-X",\r
index 3a3eb8ba6fae61406fcff4835a32549943313c8d..56fe93a8988dea7c014402c73fdbc78a2a35b694 100755 (executable)
@@ -2,7 +2,7 @@ tinyMCE.addI18n('hu.advanced_dlg',{
 about_title:"A TinyMCE-r\u0151l",\r
 about_general:"R\u00F3lunk",\r
 about_help:"Seg\u00EDts\u00E9g",\r
-about_license:"Licensz",\r
+about_license:"Licenc",\r
 about_plugins:"Pluginok",\r
 about_plugin:"Plugin",\r
 about_author:"Szerz\u0151",\r
@@ -27,7 +27,7 @@ image_src:"K\u00E9p URL",
 image_alt:"K\u00E9p le\u00EDr\u00E1s",\r
 image_list:"K\u00E9p lista",\r
 image_border:"Keret",\r
-image_dimensions:"Dimenzi\u00F3k",\r
+image_dimensions:"M\u00E9retek",\r
 image_vspace:"F\u00FCgg\u0151leges t\u00E1v",\r
 image_hspace:"V\u00EDzszintes t\u00E1v",\r
 image_align:"Igaz\u00EDt\u00E1s",\r
@@ -45,7 +45,7 @@ link_target:"Target",
 link_target_same:"Link azonos ablakba nyit\u00E1sa",\r
 link_target_blank:"Link \u00FAj ablakba nyit\u00E1sa",\r
 link_titlefield:"C\u00EDm",\r
-link_is_email:"A be\u00EDrt URL e-mail c\u00EDmnek t\u0171nik, k\u00EDv\u00E1nja a sz\u00FCks\u00E9ges mailto:-t el\u00E9 tenni?",\r
-link_is_external:"A be\u00EDrt URL k\u00FCls\u0151 hivatkoz\u00E1snak t\u0171nik, k\u00EDv\u00E1nja a sz\u00FCks\u00E9ges http://-t el\u00E9 tenni?",\r
+link_is_email:"A be\u00EDrt URL e-mail c\u00EDmnek t\u0171nik, k\u00EDv\u00E1nja a sz\u00FCks\u00E9ges mailto:-val kieg\u00E9sz\u00EDteni?",\r
+link_is_external:"A be\u00EDrt URL k\u00FCls\u0151 hivatkoz\u00E1snak t\u0171nik, k\u00EDv\u00E1nja a sz\u00FCks\u00E9ges http://-vel kieg\u00E9sz\u00EDteni?",\r
 link_list:"Link lista"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/hy.js b/program/js/tiny_mce/themes/advanced/langs/hy.js
new file mode 100644 (file)
index 0000000..c3caa21
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('hy.advanced',{\r
+style_select:"\u0548\u0573\u0565\u0580",\r
+font_size:"\u0549\u0561\u0583\u057D",\r
+fontdefault:"\u054F\u0561\u057C\u0561\u057F\u0565\u057D\u0561\u056F",\r
+block:"\u0556\u0578\u0580\u0574\u0561\u057F",\r
+paragraph:"\u0556\u0578\u0580\u0574\u0561\u057F",\r
+div:"Div",\r
+address:"\u0540\u0561\u057D\u0581\u0565\u056B \u0578\u0573",\r
+pre:"\u0546\u0561\u056D\u0561\u057A\u0565\u057D \u0586\u0578\u0580\u0574\u0561\u057F\u0561\u057E\u0578\u0580\u057E\u0561\u056E",\r
+h1:"\u054E\u0565\u0580\u0576\u0561\u0563\u056B\u0580 1",\r
+h2:"\u054E\u0565\u0580\u0576\u0561\u0563\u056B\u0580 2",\r
+h3:"\u054E\u0565\u0580\u0576\u0561\u0563\u056B\u0580 3",\r
+h4:"\u054E\u0565\u0580\u0576\u0561\u0563\u056B\u0580 4",\r
+h5:"\u054E\u0565\u0580\u0576\u0561\u0563\u056B\u0580 5",\r
+h6:"\u054E\u0565\u0580\u0576\u0561\u0563\u056B\u0580 6",\r
+blockquote:"\u0544\u0565\u056F\u0576\u0561\u0562\u0561\u0576\u0578\u0582\u0569\u0575\u0578\u0582\u0576",\r
+code:"\u053F\u0578\u0564",\r
+samp:"\u053F\u0578\u0564\u056B \u0585\u0580\u056B\u0576\u0561\u056F",\r
+dt:"\u054F\u0565\u0580\u0574\u056B\u0576\u0576\u0565\u0580\u056B \u0562\u0561\u057C\u0561\u0580\u0561\u0576",\r
+dd:"\u0532\u0561\u057C\u0561\u0580\u0561\u0576 \u0562\u0561\u0581\u0561\u057F\u0580\u0578\u0582\u0569\u0575\u0578\u0582\u0576",\r
+bold_desc:"\u0540\u0561\u057D\u057F (Ctrl + B)",\r
+italic_desc:"\u0547\u0565\u0572 (Ctrl + I)",\r
+underline_desc:"\u0538\u0576\u0564\u0563\u056E\u057E\u0561\u056E (Ctrl + U)",\r
+striketrough_desc:"\u0531\u0580\u057F\u0561\u0563\u056E\u057E\u0561\u056E",\r
+justifyleft_desc:"\u0541\u0561\u056D \u0570\u0561\u057E\u0561\u057D\u0561\u0580\u0565\u0581\u0578\u0582\u0574",\r
+justifycenter_desc:"\u053F\u0565\u0576\u057F\u0580\u0578\u0576\u0561\u0581\u0576\u0565\u056C",\r
+justifyright_desc:"\u0531\u057B \u0570\u0561\u057E\u0561\u057D\u0561\u0580\u0565\u0581\u0578\u0582\u0574",\r
+justifyfull_desc:"\u0538\u057D\u057F \u056C\u0561\u0575\u0576\u0578\u0582\u0569\u0575\u0561\u0576",\r
+bullist_desc:"\u0551\u0561\u0576\u056F",\r
+numlist_desc:"\u0540\u0561\u0574\u0561\u0580\u0561\u056F\u0561\u056C\u057E\u0561\u056E \u0581\u0561\u0576\u056F",\r
+outdent_desc:"\u053F\u0580\u0573\u0561\u057F\u0565\u056C \u0570\u0565\u057C\u0561\u057E\u0578\u0580\u0578\u0582\u0569\u0575\u0578\u0582\u0576\u0568 \u0571\u0561\u056D \u0565\u0566\u0580\u056B\u0581",\r
+indent_desc:"\u0531\u057E\u0565\u056C\u0561\u0581\u0576\u0565\u056C \u0570\u0565\u057C\u0561\u057E\u0578\u0580\u0578\u0582\u0569\u0575\u0578\u0582\u0576\u0568 \u0571\u0561\u056D \u0565\u0566\u0580\u056B\u0581",\r
+undo_desc:"\u0535\u057F (Ctrl + Z)",\r
+redo_desc:"\u0531\u057C\u0561\u057B (Ctrl + Y)",\r
+link_desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C / \u0583\u0578\u0583\u0578\u056D\u0565\u056C \u0570\u0572\u0578\u0582\u0574\u0568",\r
+unlink_desc:"\u0540\u0565\u057C\u0561\u0581\u0576\u0565\u056C \u0570\u0572\u0578\u0582\u0574\u0568",\r
+image_desc:"\u0531\u057E\u0565\u056C\u0561\u0581\u0576\u0565\u056C / \u0583\u0578\u0583\u0578\u056D\u0565\u056C \u0576\u056F\u0561\u0580",\r
+cleanup_desc:"\u0540\u0565\u057C\u0561\u0581\u0576\u0565\u056C \u0561\u057E\u0565\u056C\u0578\u0580\u0564 \u056F\u0578\u0564\u0568",\r
+code_desc:"\u0553\u0578\u0583\u0578\u056D\u0565\u056C HTML \u056F\u0578\u0564\u0568",\r
+sub_desc:"\u054D\u057F\u0578\u0580\u056B\u0576 \u056B\u0576\u0564\u0565\u0584\u057D",\r
+sup_desc:"\u054E\u0565\u0580\u056B\u0576 \u056B\u0576\u0564\u0565\u0584\u057D",\r
+hr_desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C \u0570\u0578\u0580\u056B\u0566\u0578\u0576\u0561\u056F\u0561\u0576 \u0562\u0561\u056A\u0561\u0576\u056B\u0579",\r
+removeformat_desc:"\u0540\u0565\u057C\u0561\u0581\u0576\u0565\u056C \u0586\u0578\u0580\u0574\u0561\u057F\u0561\u057E\u0578\u0580\u0578\u0582\u0574\u0568",\r
+custom1_desc:"\u0541\u0565\u0580 \u0574\u0565\u056F\u0576\u0561\u0562\u0561\u0576\u0578\u0582\u0569\u0575\u0578\u0582\u0576\u0568",\r
+forecolor_desc:"\u0538\u0576\u057F\u0580\u0565\u0584 \u057F\u0565\u0584\u057D\u057F\u056B \u0563\u0578\u0582\u0575\u0576\u0568",\r
+backcolor_desc:"\u0538\u0576\u057F\u0580\u0565\u0584 \u0586\u0578\u0576\u056B \u0563\u0578\u0582\u0575\u0576\u0568",\r
+charmap_desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C \u057D\u056B\u0574\u057E\u0578\u056C",\r
+visualaid_desc:"Toggle guidelines / invisible elements",\r
+anchor_desc:"\u0531\u057E\u0565\u056C\u0561\u0581\u0576\u0565\u056C / \u0583\u0578\u0583\u056D\u0565\u056C \u056D\u0561\u0580\u056B\u057D\u056D\u0568",\r
+cut_desc:"\u053F\u057F\u0580\u0565\u056C",\r
+copy_desc:"\u054A\u0561\u057F\u0573\u0565\u0576\u0565\u056C",\r
+paste_desc:"\u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C",\r
+image_props_desc:"\u0546\u056F\u0561\u0580\u056B \u057A\u0561\u0580\u0561\u0574\u0565\u057F\u0580\u0565\u0580",\r
+newdocument_desc:"\u0546\u0578\u0580 \u0583\u0561\u057D\u057F\u0561\u0569\u0578\u0582\u0572\u0569",\r
+help_desc:"\u0555\u0563\u0576\u0578\u0582\u0569\u0575\u0578\u0582\u0576",\r
+blockquote_desc:"\u0544\u0565\u056F\u0576\u0561\u0562\u0561\u0576\u0578\u0582\u0569\u0575\u0578\u0582\u0576",\r
+clipboard_msg:"\u054A\u0561\u057F\u0573\u0565\u0576\u0565\u056C / \u053F\u057F\u0580\u0565\u056C / \u054F\u0565\u0572\u0561\u0564\u0580\u0565\u056C (\u0574\u0561\u057F\u0579\u0565\u056C\u056B \u0579\u0567 Mozilla \u0587 Firefox \u0562\u0580\u0561\u0578\u0582\u0566\u0565\u0580\u0576\u0565\u0580\u0578\u0582\u0574) \ n \u0541\u0565\u0566 \u0570\u0565\u057F\u0561\u0584\u0580\u0584\u056B\u055E\u0580 \u0567 \u0561\u0575\u0564 \u056B\u0576\u0586\u0578\u0580\u0574\u0561\u0581\u056B\u0561\u0576",\r
+path:"\u0540\u0561\u057D\u0581\u0565",\r
+newdocument:"\u0540\u0561\u0574\u0578\u0566\u057E\u0561\u055E\u056E \u0565\u0584, \u0578\u0580 \u0581\u0561\u0576\u056F\u0561\u0576\u0578\u0582\u0574 \u0565\u0584 \u0561\u0574\u0562\u0578\u0572\u057B\u0568 \u0570\u0565\u057C\u0561\u0581\u0576\u0565\u056C",\r
+toolbar_focus:"\u0531\u0576\u0581\u0576\u0565\u056C \u057D\u0565\u0572\u0574\u0561\u056F\u0576\u0565\u0580\u056B \u057E\u0561\u0570\u0561\u0576\u0561\u056F - Alt + Q, \u0531\u0576\u0581\u0576\u0565\u056C \u056D\u0574\u0562\u0561\u0563\u0580\u056B\u0579\u056B\u0576 - Alt-Z, \u0531\u0576\u0581\u0576\u0565\u056C \u0570\u0561\u057D\u0581\u0565\u056B \u0567\u056C\u0565\u0574\u0565\u0576\u057F\u056B\u0576 - Alt-X",\r
+more_colors:"\u0547\u0561\u057F \u0563\u0578\u0582\u0575\u0576\u0565\u0580"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/hy_dlg.js b/program/js/tiny_mce/themes/advanced/langs/hy_dlg.js
new file mode 100644 (file)
index 0000000..582f9fa
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('hy.advanced_dlg',{\r
+about_title:"TinyMCE \u053D\u0574\u0562\u0561\u0563\u0580\u056B\u0579",\r
+about_general:"\u053E\u0580\u0561\u0563\u0580\u0561\u0575\u056B\u0576 \u0561\u057A\u0561\u0570\u0578\u057E\u0574\u0561\u0576 \u0574\u0561\u057D\u056B\u0576 ...",\r
+about_help:"\u0555\u0563\u0576\u0578\u0582\u0569\u0575\u0578\u0582\u0576",\r
+about_license:"\u053C\u056B\u0581\u0565\u0576\u0566\u056B\u0561",\r
+about_plugins:"\u054A\u056C\u0561\u0563\u056B\u0576\u0576\u0565\u0580",\r
+about_plugin:"\u054A\u056C\u0561\u0563\u056B\u0576",\r
+about_author:"\u0540\u0565\u0572\u056B\u0576\u0561\u056F",\r
+about_version:"\u054F\u0561\u0580\u0562\u0565\u0580\u0561\u056F",\r
+about_loaded:"\u0532\u0565\u057C\u0562\u057E\u0561\u056E \u057A\u056C\u0561\u0563\u056B\u0576\u0576\u0565\u0580",\r
+anchor_title:"\u0531\u057E\u0565\u056C\u0561\u0581\u0576\u0565\u056C / \u0583\u0578\u0583\u0578\u056D\u0565\u056C \u056D\u0561\u0580\u056B\u057D\u056D\u0568",\r
+anchor_name:"\u053D\u0561\u0580\u056B\u057D\u056D \u0561\u0576\u057E\u0561\u0576\u0578\u0582\u0574",\r
+code_title:"HTML \u056F\u0578\u0564\u056B \u056D\u0574\u0562\u0561\u0563\u0580\u056B\u0579",\r
+code_wordwrap:"\u054F\u0565\u0572\u0561\u0583\u0578\u056D\u0565\u056C \u0562\u0561\u057C\u0565\u0580",\r
+colorpicker_title:"\u0538\u0576\u057F\u0580\u0565\u0584 \u0563\u0578\u0582\u0575\u0576",\r
+colorpicker_picker_tab:"\u0533\u0578\u0582\u0576\u0561\u0575\u056B\u0576 \u0585\u0580\u056B\u0576\u0561\u056F",\r
+colorpicker_picker_title:"\u0533\u0578\u0582\u0576\u0561\u0575\u056B\u0576 \u0585\u0580\u056B\u0576\u0561\u056F",\r
+colorpicker_palette_tab:"\u0551\u0561\u0576\u056F",\r
+colorpicker_palette_title:"\u0533\u0578\u0582\u0575\u0576\u0565\u0580\u056B \u0581\u0561\u0576\u056F",\r
+colorpicker_named_tab:"\u0538\u057D\u057F \u0561\u0576\u057E\u0561\u0576\u0574\u0561\u0576",\r
+colorpicker_named_title:"\u0538\u057D\u057F \u0561\u0576\u057E\u0561\u0576\u0574\u0561\u0576",\r
+colorpicker_color:"\u0533\u0578\u0582\u0575\u0576:",\r
+colorpicker_name:"\u0531\u0576\u057E\u0561\u0576\u0578\u0582\u0574:",\r
+charmap_title:"\u0538\u0576\u057F\u0580\u0565\u056C \u057A\u0561\u057F\u0561\u0570\u0561\u056F\u0561\u0576 \u057D\u056B\u0574\u057E\u0578\u056C",\r
+image_title:"\u0531\u057E\u0565\u056C\u0561\u0581\u0576\u0565\u056C / \u0583\u0578\u0583\u0578\u056D\u0565\u056C \u0576\u056F\u0561\u0580",\r
+image_src:"\u0540\u0561\u057D\u0581\u0565",\r
+image_alt:"\u0546\u056F\u0561\u0580\u0561\u0563\u0580\u0578\u0582\u0569\u0575\u0578\u0582\u0576",\r
+image_list:"\u0546\u056F\u0561\u0580\u0576\u0565\u0580\u056B \u0581\u0561\u0576\u056F",\r
+image_border:"\u0535\u0566\u0580",\r
+image_dimensions:"\u0549\u0561\u0583\u057D\u0565\u0580",\r
+image_vspace:"\u0548\u0582\u0572\u0572\u0561\u0570. \u0577\u0565\u0572\u0578\u0582\u0574",\r
+image_hspace:"\u0540\u0578\u0580\u056B\u0566. \u0577\u0565\u0572\u0578\u0582\u0574",\r
+image_align:"\u0540\u0561\u057E\u0561\u057D\u0561\u0580\u0565\u0581\u0578\u0582\u0574",\r
+image_align_baseline:"\u0538\u057D\u057F \u0562\u0561\u0566\u0561\u0575\u056B\u0576 \u0563\u056E\u056B",\r
+image_align_top:"\u0538\u057D\u057F \u057E\u0565\u0580\u056B\u0576 \u0565\u0566\u0580\u056B",\r
+image_align_middle:"\u053F\u0565\u0576\u057F\u0580\u0578\u0576\u0561\u0581\u0576\u0565\u056C",\r
+image_align_bottom:"\u0538\u057D\u057F \u057D\u057F\u0578\u0580\u056B\u0576 \u0563\u056E\u056B",\r
+image_align_texttop:"\u0538\u057D\u057F \u057F\u0565\u0584\u057D\u057F\u056B \u057E\u0565\u0580\u056B\u0576 \u0565\u0566\u0580\u056B",\r
+image_align_textbottom:"\u0538\u057D\u057F \u057F\u0565\u0584\u057D\u057F\u056B \u057D\u057F\u0578\u0580\u056B\u0576 \u0565\u0566\u0580\u056B",\r
+image_align_left:"\u0541\u0561\u056D \u0570\u0561\u057E\u0561\u057D\u0561\u0580\u0565\u0581\u0578\u0582\u0574",\r
+image_align_right:"\u0531\u057B \u0570\u0561\u057E\u0561\u057D\u0561\u0580\u0565\u0581\u0578\u0582\u0574",\r
+link_title:"\u0531\u057E\u0565\u056C\u0561\u0581\u0576\u0565\u056C / \u0583\u0578\u0583\u0578\u056D\u0565\u056C \u0570\u0572\u0578\u0582\u0574\u0568",\r
+link_url:"\u0540\u0572\u0574\u0561\u0576 \u0570\u0561\u057D\u0581\u0565",\r
+link_target:"\u0532\u0561\u0581\u0565\u056C ...",\r
+link_target_same:"\u0561\u0575\u057D \u057A\u0561\u057F\u0578\u0582\u0570\u0561\u0576\u0578\u0582\u0574",\r
+link_target_blank:"\u0576\u0578\u0580 \u057A\u0561\u057F\u0578\u0582\u0570\u0561\u0576\u0578\u0582\u0574",\r
+link_titlefield:"\u054E\u0565\u0580\u0576\u0561\u0563\u056B\u0580",\r
+link_is_email:"\u0546\u0565\u0580\u0561\u056E\u057E\u0561\u056E URL \u0570\u0561\u057D\u0581\u0565\u0576 \u0576\u0574\u0561\u0576 \u0567 email \u0570\u0561\u057D\u0581\u0565\u056B, \u0534\u0578\u0582\u0584 \u0581\u0561\u0576\u056F\u0561\u0576\u0578\u0582\u055E\u0574 \u0565\u0584 \u0561\u057E\u0565\u056C\u0561\u0581\u0576\u0565\u056C mailto:",\r
+link_is_external:"\u0546\u0565\u0580\u0561\u056E\u057E\u0561\u056E URL \u0570\u0561\u057D\u0581\u0565\u0576 \u0576\u0574\u0561\u0576 \u0567 \u0561\u0580\u057F\u0561\u0584\u056B\u0576 \u0570\u0572\u0574\u0561\u0576, \u0534\u0578\u0582\u0584 \u0581\u0561\u0576\u056F\u0561\u0576\u0578\u0582\u055E\u0574 \u0565\u0584 \u0561\u057E\u0565\u056C\u0561\u0581\u0576\u0565\u056C http://",\r
+link_list:"\u0540\u0572\u0578\u0582\u0574\u0576\u0565\u0580\u056B \u0581\u0561\u0576\u056F"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/ia.js b/program/js/tiny_mce/themes/advanced/langs/ia.js
new file mode 100644 (file)
index 0000000..835045e
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('ia.advanced',{\r
+style_select:"\u6837\u5F0F",\r
+font_size:"\u5B57\u4F53\u5927\u5C0F",\r
+fontdefault:"\u5B57\u4F53",\r
+block:"\u683C\u5F0F",\r
+paragraph:"\u6BB5\u843D",\r
+div:"Div",\r
+address:"\u5730\u5740",\r
+pre:"\u9ED8\u8BA4\u683C\u5F0F",\r
+h1:"\u6807\u9898 1",\r
+h2:"\u6807\u9898 2",\r
+h3:"\u6807\u9898 3",\r
+h4:"\u6807\u9898 4",\r
+h5:"\u6807\u9898 5",\r
+h6:"\u6807\u9898 6",\r
+blockquote:"\u5F15\u7528",\r
+code:"\u4EE3\u7801",\r
+samp:"\u7A0B\u5E8F\u8303\u4F8B",\r
+dt:"\u540D\u8BCD\u5B9A\u4E49",\r
+dd:"\u540D\u8BCD\u89E3\u91CA",\r
+bold_desc:"\u7C97\u4F53 (Ctrl+B)",\r
+italic_desc:"\u659C\u4F53 (Ctrl+I)",\r
+underline_desc:"\u5E95\u7EBF (Ctrl+U)",\r
+striketrough_desc:"\u4E2D\u5212\u7EBF",\r
+justifyleft_desc:"\u5DE6\u5BF9\u9F50",\r
+justifycenter_desc:"\u5C45\u4E2D",\r
+justifyright_desc:"\u53F3\u5BF9\u9F50",\r
+justifyfull_desc:"\u4E24\u7AEF\u5BF9\u9F50",\r
+bullist_desc:"\u6E05\u5355\u7B26\u53F7",\r
+numlist_desc:"\u7F16\u53F7",\r
+outdent_desc:"\u51CF\u5C11\u7F29\u8FDB",\r
+indent_desc:"\u589E\u52A0\u7F29\u8FDB",\r
+undo_desc:"\u64A4\u9500 (Ctrl+Z)",\r
+redo_desc:"\u6062\u590D (Ctrl+Y)",\r
+link_desc:"\u63D2\u5165/\u7F16\u8F91 \u8FDE\u7ED3",\r
+unlink_desc:"\u53D6\u6D88\u8FDE\u7ED3",\r
+image_desc:"\u63D2\u5165/\u7F16\u8F91 \u56FE\u7247",\r
+cleanup_desc:"\u5220\u9664\u5197\u4F59\u7801",\r
+code_desc:"\u7F16\u8F91 HTML \u539F\u59CB\u7A0B\u5E8F\u4EE3\u7801",\r
+sub_desc:"\u4E0B\u6807",\r
+sup_desc:"\u4E0A\u6807",\r
+hr_desc:"\u63D2\u5165\u6C34\u5E73\u7EBF",\r
+removeformat_desc:"\u6E05\u9664\u6837\u5F0F",\r
+custom1_desc:"\u5728\u6B64\u8F93\u5165\u60A8\u7684\u81EA\u8BA2\u63CF\u8FF0",\r
+forecolor_desc:"\u9009\u62E9\u6587\u5B57\u989C\u8272",\r
+backcolor_desc:"\u9009\u62E9\u80CC\u666F\u989C\u8272",\r
+charmap_desc:"\u63D2\u5165\u7279\u6B8A\u7B26\u53F7",\r
+visualaid_desc:"\u7F51\u683C/\u9690\u85CF\u7EC4\u4EF6\uFF1F",\r
+anchor_desc:"\u63D2\u5165/\u7F16\u8F91 \u951A\u70B9",\r
+cut_desc:"\u526A\u5207 (Ctrl+X)",\r
+copy_desc:"\u590D\u5236 (Ctrl+C)",\r
+paste_desc:"\u7C98\u8D34 (Ctrl+V)",\r
+image_props_desc:"\u56FE\u7247\u5C5E\u6027",\r
+newdocument_desc:"\u65B0\u5EFA\u6587\u4EF6",\r
+help_desc:"\u5E2E\u52A9",\r
+blockquote_desc:"\u5F15\u7528",\r
+clipboard_msg:"\u590D\u5236\u3001\u526A\u5207\u548C\u7C98\u8D34\u529F\u80FD\u5728Mozilla \u548C Firefox\u4E2D\u65E0\u6CD5\u4F7F\u7528",\r
+path:"\u8DEF\u5F84",\r
+newdocument:"\u60A8\u786E\u8BA4\u8981\u5220\u9664\u5168\u90E8\u5185\u5BB9\u5417\uFF1F",\r
+toolbar_focus:"\u5DE5\u5177\u5217 - Alt+Q, \u7F16\u8F91\u5668 - Alt-Z, \u7EC4\u4EF6\u8DEF\u5F84 - Alt-X",\r
+more_colors:"\u66F4\u591A\u989C\u8272"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/ia_dlg.js b/program/js/tiny_mce/themes/advanced/langs/ia_dlg.js
new file mode 100644 (file)
index 0000000..546959e
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('ia.advanced_dlg',{\r
+about_title:"\u5173\u4E8E TinyMCE",\r
+about_general:"\u5173\u4E8E",\r
+about_help:"\u5E2E\u52A9",\r
+about_license:"\u6388\u6743",\r
+about_plugins:"\u5168\u90E8\u5916\u6302\u7A0B\u5E8F",\r
+about_plugin:"\u5916\u6302\u7A0B\u5E8F",\r
+about_author:"\u4F5C\u8005",\r
+about_version:"\u7248\u672C",\r
+about_loaded:"\u5DF2\u52A0\u8F7D\u7684\u5916\u6302\u7A0B\u5E8F",\r
+anchor_title:"\u63D2\u5165/\u7F16\u8F91 \u951A\u70B9",\r
+anchor_name:"\u951A\u70B9\u540D\u79F0",\r
+code_title:"HTML \u539F\u59CB\u7A0B\u5E8F\u4EE3\u7801\u7F16\u8F91\u5668",\r
+code_wordwrap:"\u81EA\u52A8\u6362\u884C",\r
+colorpicker_title:"\u9009\u62E9\u989C\u8272",\r
+colorpicker_picker_tab:"\u9009\u62E9\u5668",\r
+colorpicker_picker_title:"\u53D6\u8272\u5668",\r
+colorpicker_palette_tab:"\u8272\u8C31",\r
+colorpicker_palette_title:"\u8272\u8C31\u989C\u8272",\r
+colorpicker_named_tab:"\u9ED8\u8BA4\u503C",\r
+colorpicker_named_title:"\u9ED8\u8BA4\u7684\u989C\u8272",\r
+colorpicker_color:"\u989C\u8272:",\r
+colorpicker_name:"\u8272\u540D:",\r
+charmap_title:"\u63D2\u5165\u7279\u6B8A\u7B26\u53F7",\r
+image_title:"\u63D2\u5165/\u7F16\u8F91 \u56FE\u7247",\r
+image_src:"\u56FE\u7247\u7F51\u5740",\r
+image_alt:"\u56FE\u7247\u8BF4\u660E",\r
+image_list:"\u56FE\u7247\u6E05\u5355",\r
+image_border:"\u8FB9\u6846",\r
+image_dimensions:"\u5C3A\u5BF8",\r
+image_vspace:"\u5782\u76F4\u95F4\u8DDD",\r
+image_hspace:"\u6C34\u5E73\u95F4\u8DDD",\r
+image_align:"\u5BF9\u9F50\u65B9\u5F0F",\r
+image_align_baseline:"\u57FA\u7EBF",\r
+image_align_top:"\u9876\u90E8\u5BF9\u9F50",\r
+image_align_middle:"\u4E2D\u90E8\u5BF9\u9F50",\r
+image_align_bottom:"\u5E95\u90E8\u5BF9\u9F50",\r
+image_align_texttop:"\u6587\u5B57\u4E0A\u65B9",\r
+image_align_textbottom:"\u6587\u5B57\u4E0B\u65B9",\r
+image_align_left:"\u5DE6\u5BF9\u9F50",\r
+image_align_right:"\u53F3\u5BF9\u9F50",\r
+link_title:"\u63D2\u5165/\u7F16\u8F91 \u8FDE\u7ED3",\r
+link_url:"\u8FDE\u7ED3\u7F51\u5740",\r
+link_target:"\u76EE\u6807",\r
+link_target_same:"\u5F53\u524D\u7A97\u53E3\u6253\u5F00",\r
+link_target_blank:"\u65B0\u7A97\u53E3\u6253\u5F00",\r
+link_titlefield:"\u6807\u9898",\r
+link_is_email:"\u60A8\u8F93\u5165\u7684\u5E94\u8BE5\u662F\u4E00\u4E2A\u7535\u5B50\u90AE\u5BC4\u5730\u5740\uFF0C\u662F\u5426\u9700\u8981\u5728\u7F51\u5740\u524D\u52A0\u4E0A mailto: ? ",\r
+link_is_external:"\u60A8\u8F93\u5165\u7684\u7F51\u5740\u5E94\u8BE5\u662F\u4E00\u4E2A\u5916\u90E8\u8FDE\u7ED3\uFF0C\u662F\u5426\u9700\u8981\u5728\u7F51\u5740\u524D\u52A0\u4E0A http:// ?",\r
+link_list:"\u8FDE\u7ED3\u6E05\u5355"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/id.js b/program/js/tiny_mce/themes/advanced/langs/id.js
new file mode 100644 (file)
index 0000000..7da8d65
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('id.advanced',{\r
+style_select:"Styles",\r
+font_size:"Font size",\r
+fontdefault:"Font family",\r
+block:"Format",\r
+paragraph:"Paragraph",\r
+div:"Div",\r
+address:"Address",\r
+pre:"Preformatted",\r
+h1:"Heading 1",\r
+h2:"Heading 2",\r
+h3:"Heading 3",\r
+h4:"Heading 4",\r
+h5:"Heading 5",\r
+h6:"Heading 6",\r
+blockquote:"Blockquote",\r
+code:"Code",\r
+samp:"Code sample",\r
+dt:"Definition term ",\r
+dd:"Definition description",\r
+bold_desc:"Bold (Ctrl+B)",\r
+italic_desc:"Italic (Ctrl+I)",\r
+underline_desc:"Underline (Ctrl+U)",\r
+striketrough_desc:"Strikethrough",\r
+justifyleft_desc:"Align left",\r
+justifycenter_desc:"Align center",\r
+justifyright_desc:"Align right",\r
+justifyfull_desc:"Align full",\r
+bullist_desc:"Unordered list",\r
+numlist_desc:"Ordered list",\r
+outdent_desc:"Outdent",\r
+indent_desc:"Indent",\r
+undo_desc:"Undo (Ctrl+Z)",\r
+redo_desc:"Redo (Ctrl+Y)",\r
+link_desc:"Insert/edit link",\r
+unlink_desc:"Unlink",\r
+image_desc:"Insert/edit image",\r
+cleanup_desc:"Cleanup messy code",\r
+code_desc:"Edit HTML Source",\r
+sub_desc:"Subscript",\r
+sup_desc:"Superscript",\r
+hr_desc:"Insert horizontal ruler",\r
+removeformat_desc:"Remove formatting",\r
+custom1_desc:"Deskripsi disini",\r
+forecolor_desc:"Pilih text color",\r
+backcolor_desc:"Pilih background color",\r
+charmap_desc:"Insert custom character",\r
+visualaid_desc:"Toggle guidelines/invisible elements",\r
+anchor_desc:"Insert/edit anchor",\r
+cut_desc:"Cut",\r
+copy_desc:"Copy",\r
+paste_desc:"Paste",\r
+image_props_desc:"Image properties",\r
+newdocument_desc:"New document",\r
+help_desc:"Help",\r
+blockquote_desc:"Blockquote",\r
+clipboard_msg:"Copy/Cut/Paste tidak tersedia pada Mozilla dan Firefox.\nButuh info selengkapnya?",\r
+path:"Path",\r
+newdocument:"Yakin untuk menghapus semua konten?",\r
+toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",\r
+more_colors:"More colors"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/id_dlg.js b/program/js/tiny_mce/themes/advanced/langs/id_dlg.js
new file mode 100644 (file)
index 0000000..634bed7
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('id.advanced_dlg',{\r
+about_title:"Tentang TinyMCE",\r
+about_general:"Tentang",\r
+about_help:"Bantuan",\r
+about_license:"Lisensi",\r
+about_plugins:"Plugins",\r
+about_plugin:"Plugin",\r
+about_author:"Penulis",\r
+about_version:"Versi",\r
+about_loaded:"Loaded plugins",\r
+anchor_title:"Insert/edit anchor",\r
+anchor_name:"Anchor name",\r
+code_title:"HTML Source Editor",\r
+code_wordwrap:"Word wrap",\r
+colorpicker_title:"Select a color",\r
+colorpicker_picker_tab:"Picker",\r
+colorpicker_picker_title:"Color picker",\r
+colorpicker_palette_tab:"Palette",\r
+colorpicker_palette_title:"Palette colors",\r
+colorpicker_named_tab:"Named",\r
+colorpicker_named_title:"Named colors",\r
+colorpicker_color:"Color:",\r
+colorpicker_name:"Name:",\r
+charmap_title:"Pilih custom character",\r
+image_title:"Insert/edit image",\r
+image_src:"Image URL",\r
+image_alt:"Image description",\r
+image_list:"Image list",\r
+image_border:"Border",\r
+image_dimensions:"Dimensions",\r
+image_vspace:"Vertical space",\r
+image_hspace:"Horizontal space",\r
+image_align:"Alignment",\r
+image_align_baseline:"Baseline",\r
+image_align_top:"Top",\r
+image_align_middle:"Middle",\r
+image_align_bottom:"Bottom",\r
+image_align_texttop:"Text top",\r
+image_align_textbottom:"Text bottom",\r
+image_align_left:"Left",\r
+image_align_right:"Right",\r
+link_title:"Insert/edit link",\r
+link_url:"Link URL",\r
+link_target:"Target",\r
+link_target_same:"Buka link pada window yang sama",\r
+link_target_blank:"Buka link pada window baru",\r
+link_titlefield:"Judul",\r
+link_is_email:"URL yang Anda sisipkan tampaknya e-mail, Anda ingin menambahkan awalan 'mailto:'?",\r
+link_is_external:"URL yang Anda sisipkan tampaknya link eksternal, Anda ingin menambahkan awalan 'http://'?",\r
+link_list:"Daftar Link"\r
+});
\ No newline at end of file
index 58ddba7127ff715e8915d2011a5ffe36ba7eb972..2c8db83700f820e1e20e63ea4eb9185ecd1a3435 100755 (executable)
@@ -58,5 +58,15 @@ clipboard_msg:"Copia/Taglia/Incolla non \u00E8 disponibile in Mozilla e Firefox.
 path:"Percorso",\r
 newdocument:"Sei sicuro di voler cancellare tutti i contenuti?",\r
 toolbar_focus:"Vai ai pulsanti strumento - Alt+Q, Vai all'editor - Alt-Z, Vai al percorso dell'elemento - Alt-X",\r
-more_colors:"Colori aggiuntivi"\r
+more_colors:"Colori aggiuntivi",\r
+image_delta_width:"Larghezza",\r
+image_delta_height:"Altezza",\r
+link_delta_width:"Larghezza",\r
+link_delta_height:"Altezza",\r
+colorpicker_delta_width:"Larghezza",\r
+colorpicker_delta_height:"Altezza",\r
+charmap_delta_width:"Larghezza",\r
+charmap_delta_height:"Altezza",\r
+anchor_delta_width:"Larghezza",\r
+anchor_delta_height:"Altezza"\r
 });
\ No newline at end of file
index 23050bce8cb13bde5e4326b605047d7e452b63e6..4a53660749f5de8671f3f95152c4dac2aac62dfe 100755 (executable)
@@ -24,12 +24,12 @@ colorpicker_name:"Nome:",
 charmap_title:"Seleziona carattere speciale",\r
 image_title:"Inserisci/modifica immagine",\r
 image_src:"URL immagine",\r
-image_alt:"Descrizione immagine",\r
+image_alt:"Descrizione",\r
 image_list:"Lista immagini",\r
 image_border:"Bordo",\r
 image_dimensions:"Dimensioni",\r
-image_vspace:"Spaziatura verticale",\r
-image_hspace:"Spaziatura orizzontale",\r
+image_vspace:"Spaziatura vert.",\r
+image_hspace:"Spaziatura orizz.",\r
 image_align:"Allineamentot",\r
 image_align_baseline:"Alla base",\r
 image_align_top:"In alto",\r
@@ -40,12 +40,12 @@ image_align_textbottom:"In basso al testo",
 image_align_left:"A sinistra",\r
 image_align_right:"A destra",\r
 link_title:"Inserisci/modifica collegamento",\r
-link_url:"URL collegamento",\r
+link_url:"URL link",\r
 link_target:"Target",\r
 link_target_same:"Apri link nella stessa finestra",\r
 link_target_blank:"Apri link in una nuova finestra",\r
 link_titlefield:"Titolo",\r
 link_is_email:"L'URL inserito sembra essere un indirizzo email. Aggiungere il necessario prefisso mailto: ?",\r
 link_is_external:"L'URL inserito sembra essere un link esterno. Aggiungere il necessario prefisso http:// ?",\r
-link_list:"Lista collegamenti"\r
+link_list:"Lista link"\r
 });
\ No newline at end of file
index f6a39afc1ecf0ac2f96123439c8c474526a66311..c4ab987b7e42edd6682e2ddbe06e942e469786fd 100755 (executable)
@@ -1,5 +1,5 @@
 tinyMCE.addI18n('ja.advanced',{\r
-style_select:"\u30B9\u30BF\u30A4\u30EB",\r
+style_select:"style\u5C5E\u6027",\r
 font_size:"\u30D5\u30A9\u30F3\u30C8\u30B5\u30A4\u30BA",\r
 fontdefault:"\u30D5\u30A9\u30F3\u30C8",\r
 block:"\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8",\r
@@ -54,7 +54,7 @@ image_props_desc:"\u753B\u50CF\u306E\u30D7\u30ED\u30D1\u30C6\u30A3",
 newdocument_desc:"\u65B0\u898F\u4F5C\u6210",\r
 help_desc:"\u30D8\u30EB\u30D7",\r
 blockquote_desc:"\u5F15\u7528",\r
-clipboard_msg:"\u30B3\u30D4\u30FC/\u5207\u308A\u53D6\u308A/\u8CBC\u308A\u4ED8\u3051\u306FMozilla\u53CA\u3073Firefox\u3067\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002\n\u8A73\u7D30\u306F\u3053\u3061\u3089",\r
+clipboard_msg:"\u3053\u306E\u30B3\u30DE\u30F3\u30C9\u306FFirefox\u3067\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002",\r
 path:"\u30D1\u30B9",\r
 newdocument:"\u7DE8\u96C6\u4E2D\u306E\u30C7\u30FC\u30BF\u3092\u7834\u68C4\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F",\r
 toolbar_focus:"\u30C4\u30FC\u30EB\u30DC\u30BF\u30F3\u3078\u30B8\u30E3\u30F3\u30D7 - Alt+Q, \u30A8\u30C7\u30A3\u30BF\u306B\u30B8\u30E3\u30F3\u30D7 - Alt-Z, \u30A8\u30EC\u30E1\u30F3\u30C8\u30D1\u30B9\u3078\u30B8\u30E3\u30F3\u30D7 - Alt-X",\r
index 37728eb7877a93db923f5542116f4c2c73935032..f10afbf74949fb462e0cd24dc63ef702465f9282 100755 (executable)
@@ -44,7 +44,7 @@ link_url:"\u30EA\u30F3\u30AFURL",
 link_target:"\u30BF\u30FC\u30B2\u30C3\u30C8",\r
 link_target_same:"\u540C\u3058\u30A6\u30A4\u30F3\u30C9\u30A6\u3067\u958B\u304F",\r
 link_target_blank:"\u65B0\u3057\u3044\u30A6\u30A4\u30F3\u30C9\u30A6\u3067\u958B\u304F",\r
-link_titlefield:"\u30BF\u30A4\u30C8\u30EB",\r
+link_titlefield:"title\u5C5E\u6027",\r
 link_is_email:"\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u304C\u5165\u529B\u3055\u308C\u307E\u3057\u305F\u3002\u30EA\u30F3\u30AF\u306Bmailto:\u3092\u4ED8\u52A0\u3057\u307E\u3059\u304B\uFF1F",\r
 link_is_external:"\u30EA\u30F3\u30AF\u306Bhttp://\u3092\u4ED8\u52A0\u3057\u307E\u3059\u304B\uFF1F",\r
 link_list:"\u4E00\u89A7\u304B\u3089\u9078\u3076"\r
diff --git a/program/js/tiny_mce/themes/advanced/langs/ka.js b/program/js/tiny_mce/themes/advanced/langs/ka.js
new file mode 100644 (file)
index 0000000..6ff862b
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('ka.advanced',{\r
+style_select:"\u10E1\u10E2\u10D8\u10DA\u10D8",\r
+font_size:"\u10D6\u10DD\u10DB\u10D0",\r
+fontdefault:"\u10E8\u10E0\u10D8\u10E4\u10E2\u10D8",\r
+block:"\u10E4\u10DD\u10E0\u10DB\u10D0\u10E2\u10D8",\r
+paragraph:"\u10D0\u10D1\u10D6\u10D0\u10EA\u10D8",\r
+div:"Div",\r
+address:"\u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8",\r
+pre:"\u10D2\u10D0\u10D3\u10D0\u10E4\u10DD\u10E0\u10DB\u10D0\u10E2\u10D4\u10D1\u10E3\u10DA\u10D8",\r
+h1:"\u10E1\u10D0\u10D7\u10D0\u10E3\u10E0\u10D8 1",\r
+h2:"\u10E1\u10D0\u10D7\u10D0\u10E3\u10E0\u10D8 2",\r
+h3:"\u10E1\u10D0\u10D7\u10D0\u10E3\u10E0\u10D8 3",\r
+h4:"\u10E1\u10D0\u10D7\u10D0\u10E3\u10E0\u10D8 4",\r
+h5:"\u10E1\u10D0\u10D7\u10D0\u10E3\u10E0\u10D8 5",\r
+h6:"\u10E1\u10D0\u10D7\u10D0\u10E3\u10E0\u10D8 6",\r
+blockquote:"\u10EA\u10D8\u10E2\u10D0\u10E2\u10D0",\r
+code:"\u10D9\u10DD\u10D3\u10D8",\r
+samp:"\u10D9\u10DD\u10D3\u10D8\u10E1 \u10DB\u10D0\u10D2\u10D0\u10DA\u10D8\u10D7\u10D8",\r
+dt:"\u10EA\u10DC\u10DD\u10D1\u10D0\u10E0\u10D8\u10E1 \u10E2\u10D4\u10E0\u10DB\u10D8\u10DC\u10D8",\r
+dd:"\u10EA\u10DC\u10DD\u10D1\u10D0\u10E0\u10D8\u10E1 \u10D0\u10E6\u10EC\u10D4\u10E0\u10D0",\r
+bold_desc:"\u10DC\u10D0\u10EE\u10D4\u10D5\u10E0\u10D0\u10D3 \u10E1\u10E5\u10D4\u10DA\u10D8 (Ctrl+B)",\r
+italic_desc:"\u10D3\u10D0\u10EE\u10E0\u10D8\u10DA\u10D8 (Ctrl+I)",\r
+underline_desc:"\u10DB\u10DD\u10EE\u10D0\u10D6\u10E3\u10E0\u10DA\u10D8 (Ctrl+U)",\r
+striketrough_desc:"\u10D2\u10D0\u10D3\u10D0\u10EE\u10D0\u10D6\u10E3\u10DA\u10D8",\r
+justifyleft_desc:"\u10E2\u10D4\u10E5\u10E1\u10E2\u10D8\u10E1 \u10D2\u10D0\u10E1\u10EC\u10DD\u10E0\u10D4\u10D1\u10D0 \u10DB\u10D0\u10E0\u10EA\u10EE\u10DC\u10D8\u10D5",\r
+justifycenter_desc:"\u10E2\u10D4\u10E5\u10E1\u10E2\u10D8\u10E1 \u10D2\u10D0\u10E1\u10EC\u10DD\u10E0\u10D4\u10D1\u10D0 \u10EA\u10D4\u10DC\u10E2\u10E0\u10D6\u10D4",\r
+justifyright_desc:"\u10E2\u10D4\u10E5\u10E1\u10E2\u10D8\u10E1 \u10D2\u10D0\u10E1\u10EC\u10DD\u10E0\u10D4\u10D1\u10D0 \u10DB\u10D0\u10E0\u10EF\u10D5\u10DC\u10D8\u10D5",\r
+justifyfull_desc:"\u10E1\u10D8\u10D2\u10D0\u10DC\u10D4\u10D6\u10D4",\r
+bullist_desc:"\u10DB\u10D0\u10E0\u10D9\u10D8\u10E0\u10D4\u10D1\u10E3\u10DA\u10D8 \u10E1\u10D8\u10D0",\r
+numlist_desc:"\u10D3\u10D0\u10DC\u10DD\u10DB\u10E0\u10D8\u10DA\u10D8 \u10E1\u10D8\u10D0",\r
+outdent_desc:"\u10D3\u10D0\u10E8\u10DD\u10E0\u10D4\u10D1\u10D8\u10E1 \u10E8\u10D4\u10DB\u10EA\u10D8\u10E0\u10D4\u10D1\u10D0",\r
+indent_desc:"\u10D3\u10D0\u10E8\u10DD\u10E0\u10D4\u10D1\u10D8\u10E1 \u10D2\u10D0\u10D6\u10E0\u10D3\u10D0",\r
+undo_desc:"\u10D2\u10D0\u10E3\u10E5\u10DB\u10D4\u10D1\u10D0 (Ctrl+Z)",\r
+redo_desc:"\u10D3\u10D0\u10D1\u10E0\u10E3\u10DC\u10D4\u10D1\u10D0 (Ctrl+Y)",\r
+link_desc:"\u10D1\u10DB\u10E3\u10DA\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0/\u10E8\u10D4\u10EA\u10D5\u10DA\u10D0",\r
+unlink_desc:"\u10D1\u10DB\u10E3\u10DA\u10D8\u10E1 \u10EC\u10D0\u10E8\u10DA\u10D0",\r
+image_desc:"\u10D2\u10D0\u10DB\u10DD\u10E1\u10D0\u10EE\u10E3\u10DA\u10D4\u10D1\u10D8\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0/\u10E0\u10D4\u10D3\u10D0\u10E5\u10E2\u10D8\u10E0\u10D4\u10D1\u10D0",\r
+cleanup_desc:"\u10D6\u10D4\u10D3\u10DB\u10D4\u10E2\u10D8 \u10D9\u10DD\u10D3\u10D8\u10E1\u10D0\u10D2\u10D0\u10DC \u10D2\u10D0\u10EC\u10DB\u10D4\u10DC\u10D3\u10D0",\r
+code_desc:"HTML \u10D9\u10DD\u10D3\u10D8\u10E1 \u10E0\u10D4\u10D3\u10D0\u10E5\u10E2\u10D8\u10E0\u10D4\u10D1\u10D0",\r
+sub_desc:"\u10E1\u10E2\u10D8\u10E0\u10E5\u10DD\u10DC\u10D8\u10E1 \u10E5\u10D5\u10D4\u10DB\u10DD\u10D7",\r
+sup_desc:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8\u10E1 \u10D6\u10D4\u10DB\u10DD\u10D7",\r
+hr_desc:"\u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0",\r
+removeformat_desc:"\u10E4\u10DD\u10E0\u10DB\u10D0\u10E2\u10D8\u10E1 \u10D2\u10D0\u10EC\u10DB\u10D4\u10DC\u10D3\u10D0",\r
+custom1_desc:"\u10E1\u10D0\u10D9\u10E3\u10D7\u10D0\u10E0\u10D8 \u10D0\u10E6\u10EC\u10D4\u10E0\u10D0",\r
+forecolor_desc:"\u10E2\u10D4\u10E5\u10E1\u10E2\u10D8\u10E1 \u10E4\u10D4\u10E0\u10D8",\r
+backcolor_desc:"\u10DB\u10DD\u10DC\u10D8\u10E1\u10DC\u10E3\u10DA\u10D8 \u10E2\u10D4\u10E5\u10E1\u10E2\u10D8\u10E1 \u10E4\u10D4\u10E0\u10D8",\r
+charmap_desc:"\u10E1\u10D8\u10DB\u10D1\u10DD\u10DA\u10DD\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0",\r
+visualaid_desc:"\u10E7\u10D5\u10D4\u10DA\u10D0 \u10E1\u10D8\u10DB\u10D1\u10DD\u10DA\u10DD",\r
+anchor_desc:"\u10E6\u10E3\u10D6\u10D0\u10E1 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D0/\u10E0\u10D4\u10D3\u10D0\u10E5\u10E2\u10D8\u10E0\u10D4\u10D1\u10D0",\r
+cut_desc:"\u10D0\u10DB\u10DD\u10ED\u10E0\u10D0",\r
+copy_desc:"\u10D9\u10DD\u10DE\u10D8\u10E0\u10D4\u10D1\u10D0",\r
+paste_desc:"\u10E9\u10D0\u10E1\u10DB\u10D0",\r
+image_props_desc:"\u10D2\u10D0\u10DB\u10DD\u10E1\u10D0\u10EE\u10E3\u10DA\u10D4\u10D1\u10D8\u10E1 \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+newdocument_desc:"\u10D0\u10EE\u10D0\u10DA\u10D8 \u10D3\u10DD\u10D9\u10E3\u10DB\u10D4\u10DC\u10E2\u10D8",\r
+help_desc:"\u10D3\u10D0\u10EE\u10DB\u10D0\u10E0\u10D4\u10D1\u10D0",\r
+blockquote_desc:"\u10EA\u10D8\u10E2\u10D0\u10E2\u10D0",\r
+clipboard_msg:"\u10D9\u10DD\u10DE\u10D8\u10E0\u10D4\u10D1\u10D0, \u10D0\u10DB\u10DD\u10ED\u10E0\u10D0 \u10D3\u10D0 \u10E9\u10D0\u10E1\u10DB\u10D0 Firefox-\u10E8\u10D8 \u10D0\u10E0 \u10DB\u10E3\u10E8\u10D0\u10DD\u10D1\u10E1.\r\n\u10D2\u10E1\u10E3\u10E0\u10D7 \u10DB\u10D8\u10D8\u10E6\u10DD\u10D7 \u10D3\u10D0\u10DB\u10D0\u10E2\u10D4\u10D1\u10D8\u10D7\u10D8 \u10D8\u10DC\u10E4\u10DD\u10E0\u10DB\u10D0\u10EA\u10D8\u10D0?",\r
+path:"\u10E2\u10D4\u10D2\u10D4\u10D1\u10D8",\r
+newdocument:"\u10D3\u10D0\u10E0\u10EC\u10DB\u10E3\u10DC\u10D4\u10D1\u10E3\u10DA\u10D8 \u10EE\u10D0\u10E0\u10D7, \u10E0\u10DD\u10DB \u10D2\u10E1\u10E3\u10E0\u10D7 \u10E7\u10D5\u10D4\u10DA\u10D0\u10E4\u10D4\u10E0\u10D8\u10E1 \u10EC\u10D0\u10E8\u10DA\u10D0",\r
+toolbar_focus:"\u10E6\u10D8\u10DA\u10D0\u10D9\u10D4\u10D1\u10D8\u10E1 \u10DE\u10D0\u10DC\u10D4\u10DA\u10D6\u10D4 \u10D2\u10D0\u10D3\u10D0\u10E1\u10D5\u10DA\u10D0 (Alt+Q). \u10E0\u10D4\u10D3\u10D0\u10E5\u10E2\u10DD\u10E0\u10D6\u10D4 \u10D2\u10D0\u10D3\u10D0\u10E1\u10D5\u10DA\u10D0 (Alt+Z). \u10D2\u10D6\u10D8\u10E1 \u10D4\u10DA\u10D4\u10DB\u10D4\u10DC\u10E2\u10D8\u10D6\u10D4 \u10D2\u10D0\u10D3\u10D0\u10E1\u10D5\u10DA\u10D0 (Alt+X).",\r
+more_colors:"\u10E1\u10EE\u10D5\u10D0 \u10E4\u10D4\u10E0\u10D4\u10D1\u10D8..."\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/ka_dlg.js b/program/js/tiny_mce/themes/advanced/langs/ka_dlg.js
new file mode 100644 (file)
index 0000000..34c83a2
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('ka.advanced_dlg',{\r
+about_title:"TinyMCE \u10D0\u10E0\u10EC\u10D4\u10E0\u10D8\u10DA\u10DD\u10D1\u10D0",\r
+about_general:"\u10D0\u10E0\u10EC\u10D4\u10E0\u10D8\u10DA\u10DD\u10D1\u10D0",\r
+about_help:"\u10D3\u10D0\u10EE\u10DB\u10D0\u10E0\u10D4\u10D1\u10D0",\r
+about_license:"\u10DA\u10D8\u10EA\u10D4\u10DC\u10D6\u10D8\u10D0",\r
+about_plugins:"\u10DE\u10DA\u10D0\u10D2\u10D8\u10DC\u10D4\u10D1\u10D8",\r
+about_plugin:"\u10DE\u10DA\u10D0\u10D2\u10D8\u10DC\u10D8",\r
+about_author:"\u10D0\u10D5\u10E2\u10DD\u10E0\u10D8",\r
+about_version:"\u10D5\u10D4\u10E0\u10E1\u10D8\u10D0",\r
+about_loaded:"\u10DB\u10D8\u10DB\u10D0\u10D2\u10E0\u10D4\u10D1\u10E3\u10DA\u10D8 \u10DE\u10DA\u10D0\u10D2\u10D8\u10DC\u10D4\u10D1\u10D8",\r
+anchor_title:"\u10E6\u10E3\u10D6\u10D0\u10E1 \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+anchor_name:"\u10E6\u10E3\u10D6\u10D0\u10E1 \u10E1\u10D0\u10EE\u10D4\u10DA\u10D8",\r
+code_title:"HTML \u10D9\u10DD\u10D3\u10D8\u10E1 \u10E0\u10D4\u10D3\u10D0\u10E5\u10E2\u10DD\u10E0\u10D8",\r
+code_wordwrap:"\u10E1\u10E2\u10E0\u10D8\u10E5\u10DD\u10DC\u10D8\u10E1 \u10D2\u10D0\u10D3\u10D0\u10E2\u10D0\u10DC\u10D0",\r
+colorpicker_title:"\u10E4\u10D4\u10E0\u10D4\u10D1\u10D8",\r
+colorpicker_picker_tab:"\u10E1\u10DE\u10D4\u10E5\u10E2\u10E0\u10D8",\r
+colorpicker_picker_title:"\u10E4\u10D4\u10E0\u10D4\u10D1\u10D8",\r
+colorpicker_palette_tab:"\u10DE\u10D0\u10DA\u10D8\u10E2\u10E0\u10D0",\r
+colorpicker_palette_title:"\u10E4\u10D4\u10E0\u10D4\u10D1\u10D8",\r
+colorpicker_named_tab:"\u10E1\u10D0\u10EE\u10D4\u10DA\u10EC\u10DD\u10D3\u10D4\u10D1\u10D0",\r
+colorpicker_named_title:"\u10E4\u10D4\u10E0\u10D4\u10D1\u10D8",\r
+colorpicker_color:"\u10D9\u10DD\u10D3\u10D8:",\r
+colorpicker_name:"\u10E1\u10D0\u10EE\u10D4\u10DA\u10EC\u10DD\u10D3\u10D4\u10D1\u10D0:",\r
+charmap_title:"\u10E1\u10D8\u10DB\u10D1\u10DD\u10DA\u10DD\u10E1 \u10D0\u10E0\u10E9\u10D4\u10D5\u10D0",\r
+image_title:"\u10D2\u10D0\u10DB\u10DD\u10E1\u10D0\u10EE\u10E3\u10DA\u10D4\u10D1\u10D8\u10E1 \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+image_src:"\u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8",\r
+image_alt:"\u10D0\u10E6\u10EC\u10D4\u10E0\u10D0",\r
+image_list:"\u10D2\u10D0\u10DB\u10DD\u10E1\u10D0\u10EE\u10E3\u10DA\u10D4\u10D1\u10D4\u10D1\u10D8\u10E1 \u10E1\u10D8\u10D0",\r
+image_border:"\u10E1\u10D0\u10D6\u10E6\u10D5\u10D0\u10E0\u10D8",\r
+image_dimensions:"\u10D6\u10DD\u10DB\u10D0",\r
+image_vspace:"\u10D5\u10D4\u10E0\u10E2. \u10D3\u10D0\u10E8\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+image_hspace:"\u10F0\u10DD\u10E0\u10D8\u10D6\u10DD\u10DC\u10E2. \u10D3\u10D0\u10E8\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+image_align:"\u10D2\u10D0\u10E1\u10EC\u10DD\u10E0\u10D4\u10D1\u10D0",\r
+image_align_baseline:"\u10E1\u10D0\u10D1\u10D0\u10D6\u10E1\u10DD \u10EE\u10D0\u10D6\u10D8\u10E1 \u10DB\u10D8\u10EE\u10D4\u10D3\u10D5\u10D8\u10D7",\r
+image_align_top:"\u10D6\u10D4\u10D3\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+image_align_middle:"\u10EA\u10D4\u10DC\u10E2\u10E0\u10D6\u10D4",\r
+image_align_bottom:"\u10E5\u10D5\u10D4\u10D3\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+image_align_texttop:"\u10E2\u10D4\u10E5\u10E1\u10E2\u10D8\u10E1 \u10D6\u10D4\u10D3\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+image_align_textbottom:"\u10E2\u10D4\u10E5\u10E1\u10E2\u10D8\u10E1 \u10E5\u10D5\u10D4\u10D3\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+image_align_left:"\u10DB\u10D0\u10E0\u10EA\u10EE\u10D4\u10DC\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+image_align_right:"\u10DB\u10D0\u10E0\u10EF\u10D5\u10D4\u10DC\u10D0 \u10D9\u10D8\u10D3\u10D4\u10D6\u10D4",\r
+link_title:"\u10D1\u10DB\u10E3\u10DA\u10D8\u10E1 \u10DE\u10D0\u10E0\u10D0\u10DB\u10D4\u10E2\u10E0\u10D4\u10D1\u10D8",\r
+link_url:"\u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8",\r
+link_target:"\u10DB\u10D8\u10D6\u10D0\u10DC\u10D8",\r
+link_target_same:"\u10DB\u10DD\u10EA\u10D4\u10DB\u10E3\u10DA \u10E4\u10D0\u10DC\u10EF\u10D0\u10E0\u10D0\u10E8\u10D8 \u10D2\u10D0\u10EE\u10E1\u10DC\u10D0",\r
+link_target_blank:"\u10D0\u10EE\u10D0\u10DA \u10E4\u10D0\u10DC\u10EF\u10D0\u10E0\u10D0\u10E8\u10D8 \u10D2\u10D0\u10EE\u10E1\u10DC\u10D0",\r
+link_titlefield:"\u10E1\u10D0\u10D7\u10D0\u10E3\u10E0\u10D8",\r
+link_is_email:"\u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D8\u10DA\u10D8 \u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8 \u10D2\u10D0\u10D5\u10E1 \u10D4\u10DA.\u10E4\u10DD\u10E1\u10E2\u10D8\u10E1 \u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10E1, \u10D3\u10D0\u10D5\u10D0\u10DB\u10D0\u10E2\u10DD\u10D7 \u10DE\u10E0\u10D4\u10E4\u10D8\u10E5\u10E1\u10D8 mailto:?",\r
+link_is_external:"\u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D8\u10DA\u10D8 \u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8 \u10D2\u10D0\u10D5\u10E1 \u10D2\u10D0\u10E0\u10D4 \u10D1\u10DB\u10E3\u10DA\u10E1, \u10D3\u10D0\u10D5\u10D0\u10DB\u10D0\u10D7\u10DD\u10E2 \u10DE\u10E0\u10D4\u10E4\u10D8\u10E5\u10E1\u10D8 http://?",\r
+link_list:"\u10D1\u10DB\u10E3\u10DA\u10D4\u10D1\u10D8\u10E1 \u10E1\u10D8\u10D0"\r
+});
\ No newline at end of file
index bf25877e7caf2e725b8db193df59b07b2f3dd854..dda0ed83a55f48ed3c1fa2be3e7b8dfb992d367a 100755 (executable)
@@ -6,7 +6,7 @@ block:"Formatas",
 paragraph:"Paragrafas",\r
 div:"Div \u017Eym\u0117",\r
 address:"Adresas",\r
-pre:"Preformatuotas tekstas",\r
+pre:"I\u0161 anksto formatuotas",\r
 h1:"Antra\u0161t\u0117 1",\r
 h2:"Antra\u0161t\u0117 2",\r
 h3:"Antra\u0161t\u0117 3",\r
@@ -17,21 +17,21 @@ blockquote:"Citatos blokas",
 code:"Kodas",\r
 samp:"Kodo pavyzdys",\r
 dt:"Apibr\u0117\u017Eimo terminas",\r
-dd:"Apibr\u0117\u017Eimo apra\u0161ymas",\r
-bold_desc:"Storas (Ctrl+B)",\r
-italic_desc:"Pasvir\u0119s (Ctrl+I)",\r
+dd:"Apibr\u0117\u017Eimo apra\u0161as",\r
+bold_desc:"Pusjuodis (Ctrl+B)",\r
+italic_desc:"Kursyvas (Ctrl+I)",\r
 underline_desc:"Pabrauktas (Ctrl+U)",\r
 striketrough_desc:"Perbrauktas",\r
 justifyleft_desc:"Lygiuoti pagal kair\u0119",\r
 justifycenter_desc:"Centruoti",\r
 justifyright_desc:"Lygiuoti pagal de\u0161in\u0119",\r
 justifyfull_desc:"Lygiuoti pagal abu kra\u0161tus",\r
-bullist_desc:"Ner\u016B\u0161uotas s\u0105ra\u0161as",\r
-numlist_desc:"R\u016B\u0161uotas skai\u010Diais s\u0105ra\u0161as",\r
-outdent_desc:"Stumti prie kairiojo kra\u0161to",\r
-indent_desc:"Stumti nuo kairiojo kra\u0161to",\r
-undo_desc:"Atstatyti (Ctrl+Z)",\r
-redo_desc:"Perdaryti (Ctrl+Y)",\r
+bullist_desc:"Nesunumeruotas s\u0105ra\u0161as",\r
+numlist_desc:"Sunumeruotas s\u0105ra\u0161as",\r
+outdent_desc:"Atvirk\u0161tin\u0117 \u012Ftrauka",\r
+indent_desc:"\u012Etrauka",\r
+undo_desc:"At\u0161aukti (Ctrl+Z)",\r
+redo_desc:"Gr\u0105\u017Einti (Ctrl+Y)",\r
 link_desc:"\u012Eterpti/redaguoti nuorod\u0105",\r
 unlink_desc:"Pa\u0161alinti nuorod\u0105",\r
 image_desc:"\u012Eterpti/redaguoti paveiksl\u0117l\u012F",\r
@@ -41,22 +41,23 @@ sub_desc:"Apatinis indeksas",
 sup_desc:"Vir\u0161utinis indeksas",\r
 hr_desc:"\u012Eterpti horizontali\u0105 linij\u0105",\r
 removeformat_desc:"Pa\u0161alinti formatavim\u0105",\r
-custom1_desc:"J\u016Bs\u0173 apra\u0161ymas \u010Dia",\r
+custom1_desc:"J\u016Bs\u0173 apra\u0161as \u010Dia",\r
 forecolor_desc:"Parinkti teksto spalv\u0105",\r
 backcolor_desc:"Parinkti fono spalv\u0105",\r
 charmap_desc:"\u012Eterpti nestandartin\u012F simbol\u012F",\r
 visualaid_desc:"Kaitalioti gaires/nematom\u0173 element\u0173 rodym\u0105",\r
-anchor_desc:"\u012Eterpti/redaguoti inkar\u0105",\r
+anchor_desc:"\u012Eterpti/redaguoti prierai\u0161\u0105",\r
 cut_desc:"I\u0161kirpti",\r
 copy_desc:"Kopijuoti",\r
-paste_desc:"\u012Eklijuoti",\r
+paste_desc:"\u012Ed\u0117ti",\r
 image_props_desc:"Paveiksl\u0117lio nustatymai",\r
 newdocument_desc:"Naujas dokumentas",\r
 help_desc:"Pagalba",\r
 blockquote_desc:"Citatos blokas",\r
-clipboard_msg:"Kopijavimas/I\u0161kirpimas/\u012Eklijavimas negalimas Mozilla ir Firefox nar\u0161ykl\u0117se.\r\nAr norite daugiau informacijos apie \u0161i\u0105 problem\u0105?",\r
+clipboard_msg:"Kopijavimas/I\u0161kirpimas/\u012Ed\u0117jimas negalimas Mozilla ir Firefox nar\u0161ykl\u0117se.\r\nAr norite daugiau informacijos apie \u0161i\u0105 problem\u0105?",\r
 path:"Kelias",\r
-newdocument:"Ar tikrai norite i\u0161trinti vis\u0105 turin\u012F?",\r
+newdocument:"Ar tikrai norite i\u0161valyti vis\u0105 turin\u012F?",\r
 toolbar_focus:"Per\u0161okimas prie \u012Franki\u0173 juostos mygtuk\u0173 - Alt+Q, Per\u0161okimas prie redaktoriaus - Alt-Z, Per\u0161okimas prie element\u0173 kelio - Alt-X",\r
-more_colors:"Daugiau spalv\u0173"\r
+more_colors:"Daugiau spalv\u0173",\r
+link_delta_width:"70"\r
 });
\ No newline at end of file
index cdf076833ee557dbcd7e0545000c8e9bfd8c1c39..73abb59c42a4ba3f98f0172c1d09f4991ce24483 100755 (executable)
@@ -2,21 +2,21 @@ tinyMCE.addI18n('lt.advanced_dlg',{
 about_title:"Apie TinyMCE",\r
 about_general:"Apie",\r
 about_help:"Pagalba",\r
-about_license:"Licenzija",\r
-about_plugins:"\u012Eskiepiai",\r
-about_plugin:"\u012Eskiepis",\r
+about_license:"Licencija",\r
+about_plugins:"Papildiniai",\r
+about_plugin:"Papildinys",\r
 about_author:"Autorius",\r
 about_version:"Versija",\r
-about_loaded:"U\u017Ekrauti \u012Fskiepiai",\r
-anchor_title:"\u012Eterpti/redaguoti inkar\u0105",\r
-anchor_name:"Inkaro vardas",\r
+about_loaded:"\u012Ekelti papildiniai",\r
+anchor_title:"\u012Eterpti/redaguoti prierai\u0161\u0105",\r
+anchor_name:"Prierai\u0161o vardas",\r
 code_title:"HTML i\u0161eities kodo redaktorius",\r
-code_wordwrap:"\u017Dod\u017Eio lau\u017Eymas",\r
+code_wordwrap:"Skaidyti tekst\u0105",\r
 colorpicker_title:"Pasirinkti spalv\u0105",\r
-colorpicker_picker_tab:"Parink\u0117jas",\r
-colorpicker_picker_title:"Spalvos parink\u0117jas",\r
+colorpicker_picker_tab:"Parinkiklis",\r
+colorpicker_picker_title:"Spalvos parinkiklis",\r
 colorpicker_palette_tab:"Palet\u0117",\r
-colorpicker_palette_title:"Paletin\u0117s spalvos",\r
+colorpicker_palette_title:"Palet\u0117s spalvos",\r
 colorpicker_named_tab:"\u012Evardintosios",\r
 colorpicker_named_title:"\u012Evardintosios spalvos",\r
 colorpicker_color:"Spalva:",\r
@@ -24,7 +24,7 @@ colorpicker_name:"Pavadinimas:",
 charmap_title:"Pasirinkti nestandartin\u012F simbol\u012F",\r
 image_title:"\u012Eterpti/redaguoti paveiksl\u0117l\u012F",\r
 image_src:"Paveiksl\u0117lio URL adresas",\r
-image_alt:"Paveiksl\u0117lio apra\u0161ymas",\r
+image_alt:"Paveiksl\u0117lio apra\u0161as",\r
 image_list:"Paveiksl\u0117li\u0173 s\u0105ra\u0161as",\r
 image_border:"R\u0117melis",\r
 image_dimensions:"I\u0161matavimai",\r
@@ -41,11 +41,11 @@ image_align_left:"Kair\u0117je",
 image_align_right:"De\u0161in\u0117je",\r
 link_title:"\u012Eterpti/redaguoti nuorod\u0105",\r
 link_url:"Nuorodos URL adresas",\r
-link_target:"Taikinys",\r
-link_target_same:"Atidaryti tame pa\u010Diame lange",\r
-link_target_blank:"Atidaryti naujame lange",\r
+link_target:"Paskirtis",\r
+link_target_same:"Atverti tame pa\u010Diame lange",\r
+link_target_blank:"Atverti naujame lange",\r
 link_titlefield:"Pavadinimas",\r
-link_is_email:"URL adresas, kur\u012F \u012Fved\u0117te yra e-pa\u0161to adresas, ar norite prid\u0117ti reikaling\u0105 mailto: prefiks\u0105?",\r
+link_is_email:"URL adresas, kur\u012F \u012Fved\u0117te yra el. pa\u0161to adresas, ar norite prid\u0117ti reikaling\u0105 mailto: prefiks\u0105?",\r
 link_is_external:"URL adresas, kur\u012F \u012Fved\u0117te yra i\u0161orin\u0117 nuoroda, ar norite prid\u0117ti reikaling\u0105 http:// prefiks\u0105?",\r
 link_list:"Nuorod\u0173 s\u0105ra\u0161as"\r
 });
\ No newline at end of file
index c99b3d9aac9a38c21b53818446e01a49ccf6e0bf..1e67ec931f3f6b187be8c8db600895a38364b276 100755 (executable)
@@ -2,8 +2,8 @@ tinyMCE.addI18n('nl.advanced',{
 style_select:"Stijlen",\r
 font_size:"Tekengrootte",\r
 fontdefault:"Lettertype",\r
-block:"Formaat",\r
-paragraph:"Paragraaf",\r
+block:"Opmaak",\r
+paragraph:"Alinea",\r
 div:"Div",\r
 address:"Adres",\r
 pre:"Vaste opmaak",\r
diff --git a/program/js/tiny_mce/themes/advanced/langs/no.js b/program/js/tiny_mce/themes/advanced/langs/no.js
new file mode 100644 (file)
index 0000000..5446fb5
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('no.advanced',{\r
+style_select:"Stiler",\r
+font_size:"Skriftst\u00F8rrelse",\r
+fontdefault:"Skriftfamilie",\r
+block:"Format",\r
+paragraph:"Avsnitt",\r
+div:"Div",\r
+address:"Adresse",\r
+pre:"Pre-formatert",\r
+h1:"Overskrift 1",\r
+h2:"Overskrift 2",\r
+h3:"Overskrift 3",\r
+h4:"Overskrift 4",\r
+h5:"Overskrift 5",\r
+h6:"Overskrift 6",\r
+blockquote:"Innrykk",\r
+code:"Kode",\r
+samp:"Kodeeksempel",\r
+dt:"Definisjonsuttrykk",\r
+dd:"Definisjonsbeskrivelse",\r
+bold_desc:"Fet",\r
+italic_desc:"Kursiv",\r
+underline_desc:"Understrek",\r
+striketrough_desc:"Gjennomstrek",\r
+justifyleft_desc:"Venstrejustert",\r
+justifycenter_desc:"Midtstilt",\r
+justifyright_desc:"H\u00F8yrejustert",\r
+justifyfull_desc:"Blokkjustert",\r
+bullist_desc:"Punktliste",\r
+numlist_desc:"Nummerliste",\r
+outdent_desc:"Reduser innrykk",\r
+indent_desc:"\u00D8k innrykk",\r
+undo_desc:"Angre",\r
+redo_desc:"Gj\u00F8r om",\r
+link_desc:"Sett inn / endre lenke",\r
+unlink_desc:"Fjern lenke",\r
+image_desc:"Sett inn / endre bilde",\r
+cleanup_desc:"Rens grisete kode",\r
+code_desc:"Redigere HTML-kode",\r
+sub_desc:"Senk skrift",\r
+sup_desc:"Hev skrift",\r
+hr_desc:"Sett inn horisontal linje",\r
+removeformat_desc:"Fjern formatering",\r
+custom1_desc:"Din spesialfunksjondefinisjon her",\r
+forecolor_desc:"Vel skriftfarge",\r
+backcolor_desc:"Vel bakgrunnsfarge",\r
+charmap_desc:"Sett inn spesialtegn",\r
+visualaid_desc:"Sl\u00E5 av/p\u00E5 usynlige element",\r
+anchor_desc:"Sett inn / endre anker",\r
+cut_desc:"Klipp ut",\r
+copy_desc:"Kopier",\r
+paste_desc:"Lim inn",\r
+image_props_desc:"Egenskaper for bilde",\r
+newdocument_desc:"Nytt dokument",\r
+help_desc:"Hjelp",\r
+blockquote_desc:"Innrykk",\r
+clipboard_msg:"Klipp ut / Kopier /Lim inn fungerer ikke i Mozilla og Firefox. \r\n  Vil du vite mer om dette?",\r
+path:"Sti",\r
+newdocument:"Er du sikker p\u00E5 at du vil slette alt innhold?",\r
+toolbar_focus:"Skift til verkt\u00F8yknapper - Alt+Q, Skift til editor - Alt-Z, Skift til elementsti - Alt-",\r
+more_colors:"Flere farger"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/no_dlg.js b/program/js/tiny_mce/themes/advanced/langs/no_dlg.js
new file mode 100644 (file)
index 0000000..bd03f78
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('no.advanced_dlg',{\r
+about_title:"Om TinyMCE",\r
+about_general:"Om",\r
+about_help:"Hjelp",\r
+about_license:"Lisens",\r
+about_plugins:"Programtillegg",\r
+about_plugin:"Programtillegg",\r
+about_author:"Utvikler",\r
+about_version:"Versjon",\r
+about_loaded:"Last programtillegg",\r
+anchor_title:"Sett inn / endre anker",\r
+anchor_name:"Ankernavn",\r
+code_title:"HTML-editor",\r
+code_wordwrap:"Tekstbryting",\r
+colorpicker_title:"Velg en farge",\r
+colorpicker_picker_tab:"Velg farge",\r
+colorpicker_picker_title:"Fargevalg",\r
+colorpicker_palette_tab:"Palett",\r
+colorpicker_palette_title:"Palettfarger",\r
+colorpicker_named_tab:"Navnevalg",\r
+colorpicker_named_title:"Fargenavn",\r
+colorpicker_color:"Farge:",\r
+colorpicker_name:"Navn:",\r
+charmap_title:"Velg spesialtegn",\r
+image_title:"Sett inn / endre bilde",\r
+image_src:"Bilde-URL",\r
+image_alt:"Bildeomtale",\r
+image_list:"Liste med bilde",\r
+image_border:"Ramme",\r
+image_dimensions:"Dimensjoner",\r
+image_vspace:"Vertikal avstand",\r
+image_hspace:"Horisontal avstand",\r
+image_align:"Justering",\r
+image_align_baseline:"Bunnlinje",\r
+image_align_top:"Topp",\r
+image_align_middle:"Midtstilt",\r
+image_align_bottom:"Bunn",\r
+image_align_texttop:"Teksttopp",\r
+image_align_textbottom:"Tekstbunn",\r
+image_align_left:"Venstre",\r
+image_align_right:"H\u00F8yre",\r
+link_title:"Sett inn / endre lenke",\r
+link_url:"Lenke-URL",\r
+link_target:"Vindu",\r
+link_target_same:"\u00C5pne i dette vinduet",\r
+link_target_blank:"\u00C5pne i nytt vindu",\r
+link_titlefield:"Tittel",\r
+link_is_email:"Nettadressen du skrev inn ser ut til \u00E5 v\u00E6re en e-postadresse. \u00D8nsker du \u00E5 legge til det obligatoriske mailto:-prefikset?",\r
+link_is_external:"Nettadressen du skrev inn ser ut til \u00E5 v\u00E6re en ekstern nettadresse. \u00D8nsker du \u00E5 legge til det obligatoriske http://-prefikset?",\r
+link_list:"Lenkeliste"\r
+});
\ No newline at end of file
index b7c48b6d60d1ebd1c157277e428dd9680d030cdf..40805aa97d9c1362b6341e1f98e53e386a49553c 100755 (executable)
@@ -3,7 +3,7 @@ style_select:"Styl",
 font_size:"Rozmiar czcionki",\r
 fontdefault:"Rodzaj czcionki",\r
 block:"Format",\r
-paragraph:"Paragraf",\r
+paragraph:"Akapit",\r
 div:"Div",\r
 address:"Adres",\r
 pre:"Czcionka o sta\u0142ej szeroko\u015Bci",\r
@@ -45,7 +45,7 @@ custom1_desc:"Tw\u00F3j niestandardowy opis tutaj",
 forecolor_desc:"Wybierz kolor tekstu",\r
 backcolor_desc:"Wybierz kolor t\u0142a",\r
 charmap_desc:"Wstaw niestandardowy znak",\r
-visualaid_desc:"Prze\u0142\u0105cz widoczno\u015B\u0107 wska\u017Anik\u00F3w i niewidzialnych element\u00F3w",\r
+visualaid_desc:"Prze\u0142\u0105cz widoczno\u015B\u0107 wska\u017Anik\u00F3w i niewidocznych element\u00F3w",\r
 anchor_desc:"Wstaw/edytuj kotwic\u0119",\r
 cut_desc:"Wytnij",\r
 copy_desc:"Kopiuj",\r
diff --git a/program/js/tiny_mce/themes/advanced/langs/ps.js b/program/js/tiny_mce/themes/advanced/langs/ps.js
new file mode 100644 (file)
index 0000000..a4edf23
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('ps.advanced',{\r
+style_select:"Styles",\r
+font_size:"Font size",\r
+fontdefault:"Font family",\r
+block:"Format",\r
+paragraph:"Paragraph",\r
+div:"Div",\r
+address:"Address",\r
+pre:"Preformatted",\r
+h1:"Heading 1",\r
+h2:"Heading 2",\r
+h3:"Heading 3",\r
+h4:"Heading 4",\r
+h5:"Heading 5",\r
+h6:"Heading 6",\r
+blockquote:"Blockquote",\r
+code:"Code",\r
+samp:"Code sample",\r
+dt:"Definition term ",\r
+dd:"Definition description",\r
+bold_desc:"Bold (Ctrl+B)",\r
+italic_desc:"Italic (Ctrl+I)",\r
+underline_desc:"Underline (Ctrl+U)",\r
+striketrough_desc:"Strikethrough",\r
+justifyleft_desc:"Align left",\r
+justifycenter_desc:"Align center",\r
+justifyright_desc:"Align right",\r
+justifyfull_desc:"Align full",\r
+bullist_desc:"Unordered list",\r
+numlist_desc:"Ordered list",\r
+outdent_desc:"Outdent",\r
+indent_desc:"Indent",\r
+undo_desc:"Undo (Ctrl+Z)",\r
+redo_desc:"Redo (Ctrl+Y)",\r
+link_desc:"Insert/edit link",\r
+unlink_desc:"Unlink",\r
+image_desc:"Insert/edit image",\r
+cleanup_desc:"Cleanup messy code",\r
+code_desc:"Edit HTML Source",\r
+sub_desc:"Subscript",\r
+sup_desc:"Superscript",\r
+hr_desc:"Insert horizontal ruler",\r
+removeformat_desc:"Remove formatting",\r
+custom1_desc:"Your custom description here",\r
+forecolor_desc:"Select text color",\r
+backcolor_desc:"Select background color",\r
+charmap_desc:"Insert custom character",\r
+visualaid_desc:"Toggle guidelines/invisible elements",\r
+anchor_desc:"Insert/edit anchor",\r
+cut_desc:"Cut",\r
+copy_desc:"Copy",\r
+paste_desc:"Paste",\r
+image_props_desc:"Image properties",\r
+newdocument_desc:"New document",\r
+help_desc:"Help",\r
+blockquote_desc:"Blockquote",\r
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you want more information about this issue?",\r
+path:"Path",\r
+newdocument:"Are you sure you want clear all contents?",\r
+toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",\r
+more_colors:"More colors"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/ps_dlg.js b/program/js/tiny_mce/themes/advanced/langs/ps_dlg.js
new file mode 100644 (file)
index 0000000..40ba63f
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('ps.advanced_dlg',{\r
+about_title:"About TinyMCE",\r
+about_general:"About",\r
+about_help:"Help",\r
+about_license:"License",\r
+about_plugins:"Plugins",\r
+about_plugin:"Plugin",\r
+about_author:"Author",\r
+about_version:"Version",\r
+about_loaded:"Loaded plugins",\r
+anchor_title:"Insert/edit anchor",\r
+anchor_name:"Anchor name",\r
+code_title:"HTML Source Editor",\r
+code_wordwrap:"Word wrap",\r
+colorpicker_title:"Select a color",\r
+colorpicker_picker_tab:"Picker",\r
+colorpicker_picker_title:"Color picker",\r
+colorpicker_palette_tab:"Palette",\r
+colorpicker_palette_title:"Palette colors",\r
+colorpicker_named_tab:"Named",\r
+colorpicker_named_title:"Named colors",\r
+colorpicker_color:"Color:",\r
+colorpicker_name:"Name:",\r
+charmap_title:"Select custom character",\r
+image_title:"Insert/edit image",\r
+image_src:"Image URL",\r
+image_alt:"Image description",\r
+image_list:"Image list",\r
+image_border:"Border",\r
+image_dimensions:"Dimensions",\r
+image_vspace:"Vertical space",\r
+image_hspace:"Horizontal space",\r
+image_align:"Alignment",\r
+image_align_baseline:"Baseline",\r
+image_align_top:"Top",\r
+image_align_middle:"Middle",\r
+image_align_bottom:"Bottom",\r
+image_align_texttop:"Text top",\r
+image_align_textbottom:"Text bottom",\r
+image_align_left:"Left",\r
+image_align_right:"Right",\r
+link_title:"Insert/edit link",\r
+link_url:"Link URL",\r
+link_target:"Target",\r
+link_target_same:"Open link in the same window",\r
+link_target_blank:"Open link in a new window",\r
+link_titlefield:"Title",\r
+link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",\r
+link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",\r
+link_list:"Link list"\r
+});
\ No newline at end of file
index 5b9dad11162ed2994502b9dc5d73ce54e17a9a82..f78a55d30cb1c917e31467aa3c280ebb0bbed918 100755 (executable)
@@ -1,30 +1,30 @@
 tinyMCE.addI18n('pt.advanced',{\r
 style_select:"Estilos",\r
 font_size:"Tamanho",\r
-fontdefault:"Fam\u00EDlia(Fonte)",\r
+fontdefault:"Tipo de fonte",\r
 block:"Formata\u00E7\u00E3o",\r
 paragraph:"Par\u00E1grafo",\r
 div:"Div",\r
 address:"Endere\u00E7o",\r
 pre:"Pr\u00E9-formatado",\r
-h1:"Cabe\u00E7alho 1",\r
-h2:"Cabe\u00E7alho 2",\r
-h3:"Cabe\u00E7alho 3",\r
-h4:"Cabe\u00E7alho 4",\r
-h5:"Cabe\u00E7alho 5",\r
-h6:"Cabe\u00E7alho 6",\r
+h1:"T\u00EDtulo 1",\r
+h2:"T\u00EDtulo 2",\r
+h3:"T\u00EDtulo 3",\r
+h4:"T\u00EDtulo 4",\r
+h5:"T\u00EDtulo 5",\r
+h6:"T\u00EDtulo 6",\r
 blockquote:"Cita\u00E7\u00E3o em bloco",\r
 code:"C\u00F3digo",\r
 samp:"Amostra de c\u00F3digo",\r
-dt:"Termo de defini\u00E7\u00E3o",\r
-dd:"Descri\u00E7\u00E3o de defini\u00E7\u00E3o",\r
+dt:"Termo da defini\u00E7\u00E3o",\r
+dd:"Descri\u00E7\u00E3o da defini\u00E7\u00E3o",\r
 bold_desc:"Negrito (Ctrl+B)",\r
 italic_desc:"It\u00E1lico (Ctrl+I)",\r
 underline_desc:"Sublinhado (Ctrl+U)",\r
-striketrough_desc:"Texto Riscado",\r
-justifyleft_desc:"Alinhar \u00E0\u00A0 esquerda",\r
+striketrough_desc:"Riscado",\r
+justifyleft_desc:"Alinhar \u00E0 esquerda",\r
 justifycenter_desc:"Centralizar",\r
-justifyright_desc:"Alinhar \u00E0\u00A0 direita",\r
+justifyright_desc:"Alinhar \u00E0 direita",\r
 justifyfull_desc:"Justificar",\r
 bullist_desc:"Marcadores",\r
 numlist_desc:"Numera\u00E7\u00E3o",\r
@@ -36,27 +36,27 @@ link_desc:"Inserir/editar hyperlink",
 unlink_desc:"Remover hyperlink",\r
 image_desc:"Inserir/editar imagem",\r
 cleanup_desc:"Limpar c\u00F3digo incorreto",\r
-code_desc:"Editar c\u00F3digo de fonte",\r
-sub_desc:"Subscrito",\r
-sup_desc:"Superscrito",\r
+code_desc:"Editar c\u00F3digo fonte",\r
+sub_desc:"Inferior \u00E0 linha",\r
+sup_desc:"Superior \u00E0 linha",\r
 hr_desc:"Inserir separador horizontal",\r
 removeformat_desc:"Remover formata\u00E7\u00E3o",\r
-custom1_desc:"Sua descri\u00E7\u00E3o personalizada aqui",\r
-forecolor_desc:"Selecionar cor do texto",\r
-backcolor_desc:"Selecionar cor de fundo",\r
+custom1_desc:"Insira aqui a sua descri\u00E7\u00E3o personalizada",\r
+forecolor_desc:"Selecionar cor do texto",\r
+backcolor_desc:"Selecionar cor de fundo",\r
 charmap_desc:"Inserir caracteres especiais",\r
 visualaid_desc:"Alternar guias/elementos invis\u00EDveis",\r
 anchor_desc:"Inserir/editar \u00E2ncora",\r
-cut_desc:"Cortar",\r
+cut_desc:"Recortar",\r
 copy_desc:"Copiar",\r
 paste_desc:"Colar",\r
-image_props_desc:"Propriedades de imagem",\r
+image_props_desc:"Propriedades da imagem",\r
 newdocument_desc:"Novo documento",\r
 help_desc:"Ajuda",\r
 blockquote_desc:"Cita\u00E7\u00E3o em bloco",\r
-clipboard_msg:"Copiar/cortar/colar n\u00E3o est\u00E1 dispon\u00EDvel em Mozilla e Firefox. Deseja mais informa\u00E7\u00F5es sobre isso?",\r
+clipboard_msg:"Copiar/recortar/colar n\u00E3o est\u00E1 dispon\u00EDvel no Mozilla e Firefox. Deseja mais informa\u00E7\u00F5es sobre este problema?",\r
 path:"Endere\u00E7o",\r
-newdocument:"Tem certeza de que deseja apagar tudo?",\r
-toolbar_focus:"Ir para ferramentas - Alt+Q, Ir para o editor - Alt-Z, Ir para endere\u00E7o do elemento - Alt-X",\r
+newdocument:"Tem a certeza que deseja apagar tudo?",\r
+toolbar_focus:"Ir para as ferramentas - Alt+Q, Ir para o editor - Alt-Z, Ir para o endere\u00E7o do elemento - Alt-X",\r
 more_colors:"Mais cores"\r
 });
\ No newline at end of file
index 26e9dcff3a7db2749cb5bb46713153ad543686a2..074269d71bc1112a6fc2e5548b174f9835f56162 100755 (executable)
@@ -15,8 +15,8 @@ code_wordwrap:"Quebra autom\u00E1tica de linha",
 colorpicker_title:"Selecione uma cor",\r
 colorpicker_picker_tab:"Editor",\r
 colorpicker_picker_title:"Editor de Cores",\r
-colorpicker_palette_tab:"Palheta",\r
-colorpicker_palette_title:"Palheta de Cores",\r
+colorpicker_palette_tab:"Paleta",\r
+colorpicker_palette_title:"Paleta de Cores",\r
 colorpicker_named_tab:"Personalizadas",\r
 colorpicker_named_title:"Cores Personalizadas",\r
 colorpicker_color:"Cor:",\r
@@ -26,7 +26,7 @@ image_title:"Inserir/editar imagem",
 image_src:"Endere\u00E7o da imagem",\r
 image_alt:"Descri\u00E7\u00E3o da imagem",\r
 image_list:"Lista de imagens",\r
-image_border:"Borda",\r
+image_border:"Limites",\r
 image_dimensions:"Dimens\u00F5es",\r
 image_vspace:"Espa\u00E7o Vertical",\r
 image_hspace:"Espa\u00E7o Horizontal",\r
@@ -34,7 +34,7 @@ image_align:"Alinhamento",
 image_align_baseline:"Sobre a linha de texto",\r
 image_align_top:"Topo",\r
 image_align_middle:"Meio",\r
-image_align_bottom:"Embaixo",\r
+image_align_bottom:"Abaixo",\r
 image_align_texttop:"Topo do texto",\r
 image_align_textbottom:"Base do texto",\r
 image_align_left:"Esquerda",\r
@@ -45,7 +45,7 @@ link_target:"Alvo",
 link_target_same:"Abrir hyperlink na mesma janela",\r
 link_target_blank:"Abrir hyperlink em nova janela",\r
 link_titlefield:"T\u00EDtulo",\r
-link_is_email:"A URL digitada parece ser um endere\u00E7o de e-mail. Deseja acrescentar o (necess\u00E1rio) prefixo mailto:?",\r
-link_is_external:"A URL digitada parece conduzir a um link externo. Deseja acrescentar o (necess\u00E1rio) prefixo http://?",\r
+link_is_email:"A URL digitada parece ser um endere\u00E7o de e-mail. Deseja acrescentar o prefixo necess\u00E1rio mailto:?",\r
+link_is_external:"A URL digitada parece conduzir a um link externo. Deseja acrescentar o prefixo necess\u00E1rio http://?",\r
 link_list:"Lista de Links"\r
 });
\ No newline at end of file
index b7e52d23e3125c03e807721edfb6eb7727efcc4c..51562ac5ea03edeff50e757641988495779a6e88 100755 (executable)
@@ -25,15 +25,15 @@ striketrough_desc:"T\u0103iat",
 justifyleft_desc:"Aliniere la st\u00E2nga",\r
 justifycenter_desc:"Centrare",\r
 justifyright_desc:"Aliniere la dreapta",\r
-justifyfull_desc:"Aliniere \"justify\"",\r
+justifyfull_desc:"Aliniere pe toat\u0103 l\u0103\u0163imea",\r
 bullist_desc:"List\u0103 neordonat\u0103",\r
 numlist_desc:"List\u0103 ordonat\u0103",\r
-outdent_desc:"Outdenteaz\u0103",\r
+outdent_desc:"De-indenteaz\u0103",\r
 indent_desc:"Indenteaz\u0103",\r
 undo_desc:"Undo (Ctrl+Z)",\r
 redo_desc:"Ref\u0103 (Ctrl+Y)",\r
 link_desc:"Inserare/editare leg\u0103tur\u0103",\r
-unlink_desc:"\u015Eterge link",\r
+unlink_desc:"\u015Eterge leg\u0103tura",\r
 image_desc:"Inserare/editare imagine",\r
 cleanup_desc:"Cur\u0103\u0163are cod",\r
 code_desc:"Editare surs\u0103 HTML",\r
@@ -45,7 +45,7 @@ custom1_desc:"Descriere ...",
 forecolor_desc:"Culoare text",\r
 backcolor_desc:"Culoare fundal",\r
 charmap_desc:"Inserare caracter special",\r
-visualaid_desc:"Toggle guidelines/invisible elements",\r
+visualaid_desc:"Comut\u0103 ghidajele/elementele invizibile",\r
 anchor_desc:"Inserare/editare ancor\u0103",\r
 cut_desc:"Taie",\r
 copy_desc:"Copiaz\u0103",\r
@@ -54,7 +54,7 @@ image_props_desc:"Detalii imagine",
 newdocument_desc:"Document nou",\r
 help_desc:"Autor",\r
 blockquote_desc:"Citat",\r
-clipboard_msg:"Copiere/T\u0103iere/Lipire nu sunt disponibile \u00EEn  Mozilla \u015Fi Firefox.\nDori\u0163i mai multe informa\u0163ii despre aceast\u0103 problem\u0103?",\r
+clipboard_msg:"Copierea/T\u0103ierea/Lipirea nu sunt disponibile \u00EEn Mozilla \u015Fi Firefox.\nDori\u0163i mai multe informa\u0163ii despre aceast\u0103 problem\u0103?",\r
 path:"Cale",\r
 newdocument:"Sigur dori\u0163i s\u0103 \u015Fterge\u0163i tot?",\r
 toolbar_focus:"S\u0103ri\u0163i la instrumente - Alt+Q, S\u0103ri\u0163i la editor - Alt-Z, S\u0103ri\u0163i la cale - Alt-X",\r
index 08adadc2115c7e52c4cc76efa6b23a7d1645ea7b..48b3b8c4ba2aacdad276d18c05838f7a0b916b9f 100755 (executable)
@@ -13,16 +13,16 @@ anchor_name:"Nume ancor\u0103",
 code_title:"Editor surs\u0103 HTML",\r
 code_wordwrap:"Word wrap",\r
 colorpicker_title:"Alege\u0163i o culoare",\r
-colorpicker_picker_tab:"Picker",\r
-colorpicker_picker_title:"Color picker",\r
+colorpicker_picker_tab:"Pipet\u0103",\r
+colorpicker_picker_title:"Pipet\u0103 de culori",\r
 colorpicker_palette_tab:"Palet\u0103",\r
 colorpicker_palette_title:"Palet\u0103 de culori",\r
-colorpicker_named_tab:"Named",\r
+colorpicker_named_tab:"Denumite",\r
 colorpicker_named_title:"Culori denumite",\r
 colorpicker_color:"Culoare:",\r
 colorpicker_name:"Nume:",\r
 charmap_title:"Alege\u0163i un caracter special",\r
-image_title:"Insereaz\u0103/editeaz\u0103 imagine",\r
+image_title:"Insereaz\u0103/editeaz\u0103 imagine",\r
 image_src:"URL imagine",\r
 image_alt:"Descriere imagine",\r
 image_list:"List\u0103 de imagini",\r
@@ -39,13 +39,13 @@ image_align_texttop:"Textul sus",
 image_align_textbottom:"Textul la mijloc",\r
 image_align_left:"St\u00E2nga",\r
 image_align_right:"Dreapta",\r
-link_title:"Insereaz\u0103/editeaz\u0103 link",\r
-link_url:"URL link",\r
+link_title:"Inserare/editare leg\u0103tur\u0103",\r
+link_url:"URL leg\u0103tur\u0103",\r
 link_target:"\u0162int\u0103",\r
-link_target_same:"Deschide link \u00EEn aceea\u015Fi fereastr\u0103",\r
-link_target_blank:"Deschide link \u00EEn fereastr\u0103 nou\u0103",\r
+link_target_same:"Deschide leg\u0103tura \u00EEn aceea\u015Fi fereastr\u0103",\r
+link_target_blank:"Deschide leg\u0103tura \u00EEntr-o fereastr\u0103 nou\u0103",\r
 link_titlefield:"Titlu",\r
-link_is_email:"URL-ul pe care l-a\u0163i introdus pare a fi o adres\u0103 de email, dori\u0163i s\u0103 adaug \u015Fi prefixul mailto: necesar?",\r
-link_is_external:"URL-ul pe care l-a\u0163i introdus pare a fi un link extern, dori\u0163i s\u0103 adaug \u015Fi prefixul http:// necesar?",\r
-link_list:"Lista de linkuri"\r
+link_is_email:"URL-ul pe care l-a\u0163i introdus pare a fi o adres\u0103 de e-mail. Dori\u0163i s\u0103 adaug \u015Fi prefixul mailto: necesar?",\r
+link_is_external:"URL-ul pe care l-a\u0163i introdus pare a fi o leg\u0103tur\u0103 extern\u0103. Dori\u0163i s\u0103 adaug \u015Fi prefixul http:// necesar?",\r
+link_list:"Lista de leg\u0103turi"\r
 });
\ No newline at end of file
index 2b4d9a6898900da3bed2f9f488dd47b128aa44fa..374b4107ab7f0cd280677a3e15b93940ea254068 100755 (executable)
@@ -1,63 +1,62 @@
 tinyMCE.addI18n('ru.advanced',{\r
-style_select:"\u0421\u0442\u0438\u043B\u0438",\r
-font_size:"\u0420\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430",\r
+style_select:"\u0421\u0442\u0438\u043B\u044C",\r
+font_size:"\u0420\u0430\u0437\u043C\u0435\u0440",\r
 fontdefault:"\u0428\u0440\u0438\u0444\u0442",\r
 block:"\u0424\u043E\u0440\u043C\u0430\u0442",\r
 paragraph:"\u0410\u0431\u0437\u0430\u0446",\r
-div:"\u0420\u0430\u0437\u0434\u0435\u043B",\r
+div:"Div",\r
 address:"\u0410\u0434\u0440\u0435\u0441",\r
-pre:"\u041E\u0442\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442",\r
+pre:"\u041F\u0440\u0435\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439",\r
 h1:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 1",\r
 h2:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 2",\r
 h3:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 3",\r
 h4:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 4",\r
 h5:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 5",\r
 h6:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 6",\r
-blockquote:"\u0411\u043B\u043E\u043A \u0446\u0438\u0442\u0430\u0442\u044B",\r
+blockquote:"\u0426\u0438\u0442\u0430\u0442\u0430",\r
 code:"\u041A\u043E\u0434",\r
 samp:"\u041F\u0440\u0438\u043C\u0435\u0440 \u043A\u043E\u0434\u0430",\r
-dt:"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0439 \u0442\u0435\u0440\u043C\u0438\u043D",\r
-dd:"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u0435\u0440\u043C\u0438\u043D\u0430",\r
+dt:"\u0422\u0435\u0440\u043C\u0438\u043D \u0441\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A\u0430",\r
+dd:"\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0441\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A\u0430",\r
 bold_desc:"\u041F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u044B\u0439 (Ctrl+B)",\r
 italic_desc:"\u041A\u0443\u0440\u0441\u0438\u0432 (Ctrl+I)",\r
-underline_desc:"\u041F\u043E\u0434\u0447\u0451\u0440\u043A\u043D\u0443\u0442\u044B\u0439 (Ctrl+U)",\r
-striketrough_desc:"\u041F\u0435\u0440\u0435\u0447\u0451\u0440\u043A\u043D\u0443\u0442\u044B\u0439",\r
-justifyleft_desc:"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435 \u0432\u043B\u0435\u0432\u043E",\r
-justifycenter_desc:"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435 \u043F\u043E \u0446\u0435\u043D\u0442\u0440\u0443",\r
-justifyright_desc:"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435 \u0432\u043F\u0440\u0430\u0432\u043E",\r
-justifyfull_desc:"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435 \u043F\u043E \u0448\u0438\u0440\u0438\u043D\u0435",\r
+underline_desc:"\u041F\u043E\u0434\u0447\u0435\u0440\u043A\u043D\u0443\u0442\u044B\u0439 (Ctrl+U)",\r
+striketrough_desc:"\u0417\u0430\u0447\u0435\u0440\u043A\u043D\u0443\u0442\u044B\u0439",\r
+justifyleft_desc:"\u041F\u043E \u043B\u0435\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+justifycenter_desc:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443",\r
+justifyright_desc:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+justifyfull_desc:"\u041F\u043E \u0448\u0438\u0440\u0438\u043D\u0435",\r
 bullist_desc:"\u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A",\r
 numlist_desc:"\u041D\u0443\u043C\u0435\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A",\r
 outdent_desc:"\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F",\r
 indent_desc:"\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F",\r
 undo_desc:"\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C (Ctrl+Z)",\r
-redo_desc:"\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C (Ctrl+Y)",\r
-link_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C/\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443",\r
+redo_desc:"\u0412\u0435\u0440\u043D\u0443\u0442\u044C (Ctrl+Y)",\r
+link_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C/\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443",\r
 unlink_desc:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443",\r
-image_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C/\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435",\r
-cleanup_desc:"\u041F\u043E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u043A\u0440\u0438\u0432\u043E\u0439 \u043A\u043E\u0434",\r
-code_desc:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C HTML-\u0438\u0441\u0445\u043E\u0434\u043D\u0438\u043A",\r
-sub_desc:"\u041D\u0438\u0436\u043D\u0438\u0439 \u0438\u043D\u0434\u0435\u043A\u0441",\r
-sup_desc:"\u0412\u0435\u0440\u0445\u043D\u0438\u0439 \u0438\u043D\u0434\u0435\u043A\u0441",\r
-hr_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0443\u044E \u043B\u0438\u043D\u0438\u044E",\r
-removeformat_desc:"\u0423\u0431\u0440\u0430\u0442\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435",\r
-custom1_desc:"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448\u0435 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435",\r
-forecolor_desc:"\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0446\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430",\r
-backcolor_desc:"\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0446\u0432\u0435\u0442 \u0444\u043E\u043D\u0430",\r
-charmap_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0439 \u0441\u0438\u043C\u0432\u043E\u043B",\r
-visualaid_desc:"\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C/\u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435/\u043D\u0435\u0432\u0438\u0434\u0438\u043C\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B",\r
-anchor_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C/\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u044F\u043A\u043E\u0440\u044C",\r
+image_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C/\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435",\r
+cleanup_desc:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u043B\u0438\u0448\u043D\u0438\u0439 \u043A\u043E\u0434",\r
+code_desc:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C HTML \u043A\u043E\u0434",\r
+sub_desc:"\u041F\u043E\u0434\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0439",\r
+sup_desc:"\u041D\u0430\u0434\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0439",\r
+hr_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0447\u0435\u0440\u0442\u0443",\r
+removeformat_desc:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0444\u043E\u0440\u043C\u0430\u0442",\r
+custom1_desc:"\u0421\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0435 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435",\r
+forecolor_desc:"\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430",\r
+backcolor_desc:"\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0442\u0435\u043A\u0441\u0442\u0430",\r
+charmap_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B",\r
+visualaid_desc:"\u0412\u0441\u0435 \u0437\u043D\u0430\u043A\u0438",\r
+anchor_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C/\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u044F\u043A\u043E\u0440\u044C",\r
 cut_desc:"\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C",\r
 copy_desc:"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C",\r
 paste_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C",\r
-image_props_desc:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",\r
+image_props_desc:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",\r
 newdocument_desc:"\u041D\u043E\u0432\u044B\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442",\r
 help_desc:"\u041F\u043E\u043C\u043E\u0449\u044C",\r
-blockquote_desc:"\u0411\u043B\u043E\u043A \u0446\u0438\u0442\u0430\u0442\u044B",\r
-clipboard_msg:"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435/\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0432 Mozilla \u0438 Firefox.\r\n\u0425\u043E\u0442\u0438\u0442\u0435 \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435 \u0443\u0437\u043D\u0430\u0442\u044C, \u0432 \u0447\u0451\u043C \u0434\u0435\u043B\u043E?",\r
-path:"\u041F\u0443\u0442\u044C",\r
-newdocument:"\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u043E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0432\u0441\u0451 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435?",\r
-toolbar_focus:"\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043A\u043D\u043E\u043F\u043A\u0430\u043C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 - Alt+Q, \u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0443 - Alt-Z, \u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043F\u0443\u0442\u0438 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 - Alt-X",\r
-more_colors:"\u0415\u0449\u0451 \u0446\u0432\u0435\u0442\u0430",\r
-image_delta_width:"65"\r
+blockquote_desc:"\u0426\u0438\u0442\u0430\u0442\u0430",\r
+clipboard_msg:"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435, \u0432\u044B\u0440\u0435\u0437\u043A\u0430 \u0438 \u0432\u0441\u0442\u0430\u0432\u043A\u0430 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u0432 Firefox.\r\n\u0425\u043E\u0442\u0438\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0431\u043E\u043B\u0435\u0435 \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E?",\r
+path:"\u0422\u0435\u0433\u0438",\r
+newdocument:"\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0432\u0441\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C?",\r
+toolbar_focus:"\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u044C \u043A\u043D\u043E\u043F\u043E\u043A (Alt+Q). \u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0443 (Alt+Z). \u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0443 \u043F\u0443\u0442\u0438 (Alt+X).",\r
+more_colors:"\u0414\u0440\u0443\u0433\u0438\u0435 \u0446\u0432\u0435\u0442\u0430..."\r
 });
\ No newline at end of file
index dd019701d8b438893166cdf267c9f1978851b511..ff19b2151441910497641394606e313c211c2f36 100755 (executable)
@@ -1,51 +1,51 @@
 tinyMCE.addI18n('ru.advanced_dlg',{\r
-about_title:"\u041E TinyMCE",\r
-about_general:"\u041E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0435",\r
+about_title:"\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 TinyMCE",\r
+about_general:"\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435",\r
 about_help:"\u041F\u043E\u043C\u043E\u0449\u044C",\r
 about_license:"\u041B\u0438\u0446\u0435\u043D\u0437\u0438\u044F",\r
 about_plugins:"\u041F\u043B\u0430\u0433\u0438\u043D\u044B",\r
 about_plugin:"\u041F\u043B\u0430\u0433\u0438\u043D",\r
 about_author:"\u0410\u0432\u0442\u043E\u0440",\r
 about_version:"\u0412\u0435\u0440\u0441\u0438\u044F",\r
-about_loaded:"\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u043D\u044B\u0435 \u043F\u043B\u0430\u0433\u0438\u043D\u044B",\r
-anchor_title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C/\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u044F\u043A\u043E\u0440\u044C",\r
+about_loaded:"\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0435 \u043F\u043B\u0430\u0433\u0438\u043D\u044B",\r
+anchor_title:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u044F\u043A\u043E\u0440\u044F",\r
 anchor_name:"\u0418\u043C\u044F \u044F\u043A\u043E\u0440\u044F",\r
-code_title:"\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 HTML-\u0438\u0441\u0445\u043E\u0434\u043D\u0438\u043A\u0430",\r
-code_wordwrap:"\u041F\u0435\u0440\u0435\u043D\u043E\u0441 \u0441\u043B\u043E\u0432",\r
-colorpicker_title:"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0446\u0432\u0435\u0442",\r
-colorpicker_picker_tab:"\u0412\u044B\u0431\u043E\u0440",\r
-colorpicker_picker_title:"\u0412\u044B\u0431\u043E\u0440 \u0446\u0432\u0435\u0442\u0430",\r
+code_title:"\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 HTML \u043A\u043E\u0434\u0430",\r
+code_wordwrap:"\u041F\u0435\u0440\u0435\u043D\u043E\u0441 \u0441\u0442\u0440\u043E\u043A",\r
+colorpicker_title:"\u0426\u0432\u0435\u0442\u0430",\r
+colorpicker_picker_tab:"\u0421\u043F\u043A\u0442\u0440",\r
+colorpicker_picker_title:"\u0426\u0432\u0435\u0442\u0430",\r
 colorpicker_palette_tab:"\u041F\u0430\u043B\u0438\u0442\u0440\u0430",\r
-colorpicker_palette_title:"\u0426\u0432\u0435\u0442\u0430 \u043F\u0430\u043B\u0438\u0442\u0440\u044B",\r
-colorpicker_named_tab:"\u0418\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u043D\u044B\u0439",\r
-colorpicker_named_title:"\u0418\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0446\u0432\u0435\u0442\u0430",\r
-colorpicker_color:"\u0426\u0432\u0435\u0442:",\r
+colorpicker_palette_title:"\u0426\u0432\u0435\u0442\u0430",\r
+colorpicker_named_tab:"\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u044F",\r
+colorpicker_named_title:"\u0426\u0432\u0435\u0442\u0430",\r
+colorpicker_color:"\u041A\u043E\u0434:",\r
 colorpicker_name:"\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435:",\r
-charmap_title:"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0439 \u0441\u0438\u043C\u0432\u043E\u043B",\r
-image_title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C/\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435",\r
-image_src:"\u0410\u0434\u0440\u0435\u0441 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",\r
-image_alt:"\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",\r
-image_list:"\u0421\u043F\u0438\u0441\u043E\u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439",\r
+charmap_title:"\u0412\u044B\u0431\u043E\u0440 \u0441\u0438\u043C\u0432\u043E\u043B\u0430",\r
+image_title:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",\r
+image_src:"\u0410\u0434\u0440\u0435\u0441",\r
+image_alt:"\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435",\r
+image_list:"\u0421\u043F\u0438\u0441\u043E\u043A \u043A\u0430\u0440\u0442\u0438\u043D\u043E\u043A",\r
 image_border:"\u0413\u0440\u0430\u043D\u0438\u0446\u0430",\r
-image_dimensions:"\u0420\u0430\u0437\u043C\u0435\u0440\u044B",\r
-image_vspace:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E",\r
-image_hspace:"\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E",\r
+image_dimensions:"\u0420\u0430\u0437\u043C\u0435\u0440",\r
+image_vspace:"\u0412\u0435\u0440\u0442. \u043E\u0442\u0441\u0442\u0443\u043F",\r
+image_hspace:"\u0413\u043E\u0440\u0438\u0437. \u043E\u0442\u0441\u0442\u0443\u043F",\r
 image_align:"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435",\r
-image_align_baseline:"\u041F\u043E \u0431\u0430\u0437\u0438\u0441\u043D\u043E\u0439 \u043B\u0438\u043D\u0438\u0438",\r
-image_align_top:"\u041F\u043E \u0432\u0435\u0440\u0445\u0443",\r
+image_align_baseline:"\u041F\u043E \u0431\u0430\u0437\u043E\u0432\u043E\u0439 \u043B\u0438\u043D\u0438\u0438",\r
+image_align_top:"\u041F\u043E \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E",\r
 image_align_middle:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443",\r
-image_align_bottom:"\u041F\u043E \u043D\u0438\u0437\u0443",\r
-image_align_texttop:"\u041F\u043E \u0432\u0435\u0440\u0445\u0443 \u0442\u0435\u043A\u0441\u0442\u0430",\r
-image_align_textbottom:"\u041F\u043E \u043D\u0438\u0437\u0443 \u0442\u0435\u043A\u0441\u0442\u0430",\r
-image_align_left:"\u0412\u043B\u0435\u0432\u043E",\r
-image_align_right:"\u0412\u043F\u0440\u0430\u0432\u043E",\r
-link_title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C/\u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443",\r
-link_url:"\u0410\u0434\u0440\u0435\u0441 \u0441\u0441\u044B\u043B\u043A\u0438",\r
+image_align_bottom:"\u041F\u043E \u043D\u0438\u0436\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+image_align_texttop:"\u041F\u043E \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E \u0442\u0435\u043A\u0441\u0442\u0430",\r
+image_align_textbottom:"\u041F\u043E \u043D\u0438\u0436\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E \u0442\u0435\u043A\u0441\u0442\u0430",\r
+image_align_left:"\u041F\u043E \u043B\u0435\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+image_align_right:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
+link_title:"\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0441\u0441\u044B\u043B\u043A\u0438",\r
+link_url:"\u0410\u0434\u0440\u0435\u0441",\r
 link_target:"\u0426\u0435\u043B\u044C",\r
-link_target_same:"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u0432 \u0442\u043E\u043C \u0436\u0435 \u043E\u043A\u043D\u0435",\r
-link_target_blank:"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u0432 \u043D\u043E\u0432\u043E\u043C \u043E\u043A\u043D\u0435",\r
-link_titlefield:"\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435",\r
-link_is_email:"\u0412\u0432\u0435\u0434\u0451\u043D\u043D\u044B\u0439 \u0430\u0434\u0440\u0435\u0441 \u043F\u043E\u0445\u043E\u0436 \u043D\u0430 email, \u0432\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0435\u0444\u0438\u043A\u0441 mailto:?",\r
-link_is_external:"\u0412\u0432\u0435\u0434\u0451\u043D\u043D\u044B\u0439 \u0430\u0434\u0440\u0435\u0441 \u043F\u043E\u0445\u043E\u0436 \u043D\u0430 \u0432\u043D\u0435\u0448\u043D\u044E\u044E \u0441\u0441\u044B\u043B\u043A\u0443, \u0432\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0435\u0444\u0438\u043A\u0441 http://?",\r
+link_target_same:"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 \u044D\u0442\u043E\u043C \u043E\u043A\u043D\u0435",\r
+link_target_blank:"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 \u043D\u043E\u0432\u043E\u043C \u043E\u043A\u043D\u0435",\r
+link_titlefield:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A",\r
+link_is_email:"\u0412\u0432\u0435\u0434\u0435\u043D\u043D\u044B\u0439 \u0430\u0434\u0440\u0435\u0441 \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u0435\u0442 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u0443\u044E \u043F\u043E\u0447\u0442\u0443, \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0435\u0444\u0438\u043A\u0441 mailto:?",\r
+link_is_external:"\u0412\u0432\u0435\u0434\u0435\u043D\u043D\u044B\u0439 \u0430\u0434\u0440\u0435\u0441 \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u0435\u0442 \u0432\u043D\u0435\u0448\u043D\u044E\u044E \u0441\u0441\u044B\u043B\u043A\u0443, \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0435\u0444\u0438\u043A\u0441 http://?",\r
 link_list:"\u0421\u043F\u0438\u0441\u043E\u043A \u0441\u0441\u044B\u043B\u043E\u043A"\r
 });
\ No newline at end of file
index 521323f9e05d3b04190660c6069ec73cf841b561..cba6b3f1ee17ab58f317cc1cf01ce076350a4aa3 100755 (executable)
@@ -1,62 +1,61 @@
 tinyMCE.addI18n('si.advanced',{\r
-style_select:"Styles",\r
-font_size:"Font size",\r
-fontdefault:"Font family",\r
-block:"Format",\r
-paragraph:"Paragraph",\r
+style_select:"\u0DC1\u0DDB\u0DBD\u0DD2\u0DBA",\r
+font_size:"\u0DB4\u0DB1\u0DCA\u0DAF \u0DB4\u0DCA\u200D\u0DBB\u0DB8\u0DCF\u0DAB\u0DBA",\r
+fontdefault:"\u0DB4\u0DB1\u0DCA\u0DAF \u0DC3\u0DB8\u0DD6\u0DC4\u0DBA",\r
+block:"\u0D86\u0D9A\u0DD8\u0DAD\u0DD2\u0DBA",\r
+paragraph:"\u200D\u0DA1\u0DDA\u0DAF\u0DBA",\r
 div:"Div",\r
-address:"Address",\r
-pre:"Preformatted",\r
-h1:"Heading 1",\r
-h2:"Heading 2",\r
-h3:"Heading 3",\r
-h4:"Heading 4",\r
-h5:"Heading 5",\r
-h6:"Heading 6",\r
+address:"\u0DBD\u0DD2\u0DB4\u0DD2\u0DB1\u0DBA",\r
+pre:"\u0DB4\u0DD6\u0DBB\u0DCA\u0DC0 \u0DB1\u0DD2\u0DBB\u0DCA\u0DB8\u0DCF\u0DAB\u0DBA",\r
+h1:"\u0DB8\u0DCF\u0DAD\u0DD8\u0D9A\u0DCF\u0DC0 1",\r
+h2:"\u0DB8\u0DCF\u0DAD\u0DD8\u0D9A\u0DCF\u0DC0 2",\r
+h3:"\u0DB8\u0DCF\u0DAD\u0DD8\u0D9A\u0DCF\u0DC0 3",\r
+h4:"\u0DB8\u0DCF\u0DAD\u0DD8\u0D9A\u0DCF\u0DC0 4",\r
+h5:"\u0DB8\u0DCF\u0DAD\u0DD8\u0D9A\u0DCF\u0DC0 5",\r
+h6:"\u0DB8\u0DCF\u0DAD\u0DD8\u0D9A\u0DCF\u0DC0 6",\r
 blockquote:"Blockquote",\r
-code:"Code",\r
-samp:"Code sample",\r
-dt:"Definition term ",\r
-dd:"Definition description",\r
+code:"\u0D9A\u0DDA\u0DAD\u0DBA",\r
+samp:"\u0D9A\u0DDA\u0DAD \u0DC3\u0DCF\u0DB8\u0DCA\u0DB4\u0DBD",\r
+dt:"\u0DB1\u0DD2\u0DBB\u0DCA\u0DC0\u0DA0\u0DB1\u0DBA ",\r
+dd:"\u0DB1\u0DD2\u0DBB\u0DCA\u0DC0\u0DA0\u0DB1 \u0DC0\u0DD2\u0DC3\u0DCA\u0DAD\u0DBB\u0DBA",\r
 bold_desc:"Bold (Ctrl+B)",\r
 italic_desc:"Italic (Ctrl+I)",\r
 underline_desc:"Underline (Ctrl+U)",\r
 striketrough_desc:"Strikethrough",\r
-justifyleft_desc:"Align left",\r
-justifycenter_desc:"Align center",\r
-justifyright_desc:"Align right",\r
-justifyfull_desc:"Align full",\r
-bullist_desc:"Unordered list",\r
-numlist_desc:"Ordered list",\r
+justifyleft_desc:"\u0DC0\u0DB8\u0DCA \u0DB4\u0DD9\u0DC5\u0DA7 \u0D9C\u0DB1\u0DCA\u0DB1\u0DC0\u0DCF",\r
+justifycenter_desc:"\u0DB8\u0DD0\u0DAF \u0DB4\u0DD9\u0DC5\u0DA7 \u0D9C\u0DB1\u0DCA\u0DB1\u0DC0\u0DCF",\r
+justifyright_desc:"\u0DAF\u0D9A\u0DD4\u0DAB\u0DD4 \u0DB4\u0DD9\u0DC5\u0DA7 \u0D9C\u0DB1\u0DCA\u0DB1\u0DC0\u0DCF",\r
+justifyfull_desc:"\u0DB4\u0DD9\u0DC5\u0DA7 \u0D9C\u0DB1\u0DCA\u0DB1\u0DC0\u0DCF",\r
+bullist_desc:"\u0D85\u0D9A\u0DCA\u200D\u0DBB\u0DB8\u0DCF\u0DB1\u0DD4\u0D9A\u0DD6\u0DBD \u0DBD\u0DD0\u0DBA\u0DD2\u0DC3\u0DCA\u0DAD\u0DD4\u0DC0",\r
+numlist_desc:"\u0D9A\u0DCA\u200D\u0DBB\u0DB8\u0DCF\u0DB1\u0DD4\u0D9A\u0DD6\u0DBD \u0DBD\u0DD0\u0DBA\u0DD2\u0DC3\u0DCA\u0DAD\u0DD4\u0DC0",\r
 outdent_desc:"Outdent",\r
 indent_desc:"Indent",\r
-undo_desc:"Undo (Ctrl+Z)",\r
-redo_desc:"Redo (Ctrl+Y)",\r
-link_desc:"Insert/edit link",\r
+undo_desc:"\u0DB1\u0DD2\u0DC1\u0DCA\u0DB4\u0DCA\u200D\u0DBB\u0DB7 \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1(Ctrl+Z)",\r
+redo_desc:"\u0DB1\u0DD0\u0DC0\u0DAD \u0D9A\u0DBB\u0DB1\u0DC0\u0DCF  (Ctrl+Y)",\r
+link_desc:"\u0DC3\u0DB8\u0DCA\u0DB6\u0DB1\u0DCA\u0DB0\u0D9A\u0DBA \u0D87\u0DAD\u0DD4\u0DC5\u0DD4/\u0DC3\u0D82\u0DC3\u0DCA\u0D9A\u0DBB\u0DAB\u0DBA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
 unlink_desc:"Unlink",\r
-image_desc:"Insert/edit image",\r
-cleanup_desc:"Cleanup messy code",\r
-code_desc:"Edit HTML Source",\r
-sub_desc:"Subscript",\r
-sup_desc:"Superscript",\r
-hr_desc:"Insert horizontal ruler",\r
-removeformat_desc:"Remove formatting",\r
-custom1_desc:"Your custom description here",\r
-forecolor_desc:"Select text color",\r
-backcolor_desc:"Select background color",\r
-charmap_desc:"Insert custom character",\r
-visualaid_desc:"Toggle guidelines/invisible elements",\r
-anchor_desc:"Insert/edit anchor",\r
+image_desc:"\u0D85\u0DB1\u0DD4\u0DBB\u0DD6\u0DB4\u0DBA \u0D87\u0DAD\u0DD4\u0DC5\u0DD4/\u0DC3\u0D82\u0DC3\u0DCA\u0D9A\u0DBB\u0DAB\u0DBA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1 ",\r
+cleanup_desc:"\u0DC0\u0DD0\u0DBB\u0DAF\u0DD2 \u0D9A\u0DDA\u0DAD \u0D89\u0DC0\u0DAD\u0DCA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+code_desc:" HTML \u0DB8\u0DD6\u0DBD\u0DCF\u0DC1\u0DCA\u200D\u0DBB\u0DBA \u0DC3\u0D82\u0DC3\u0DCA\u0D9A\u0DBB\u0DAB\u0DBA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+sub_desc:"\u0DBA\u0DA7\u0DD2\u0DBD\u0D9A\u0DD4\u0DAB\u0DD4",\r
+sup_desc:"\u0D8B\u0DA9\u0DD4\u0DBD\u0D9A\u0DD4\u0DAB",\r
+hr_desc:"\u0DAD\u0DD2\u0DBB\u0DC3\u0DCA \u0DBB\u0DD6\u0DBD \u0D87\u0DAD\u0DD4\u0DBD\u0DCA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+removeformat_desc:"\u0D86\u0D9A\u0DD8\u0DAD\u0DD2\u0D9A\u0DBB\u0DAB\u0DBA \u0D89\u0DC0\u0DAD\u0DCA\u0D9A\u0DBB\u0DB1\u0DC0\u0DCF",\r
+custom1_desc:"\u0D94\u0DB6\u0DDA \u0DC0\u0DCA\u200D\u0DBA\u0DC0\u0DC4\u0DCF\u0DBB\u0DD2\u0D9A \u0DC0\u0DD2\u0DC3\u0DCA\u0DAD\u0DBB\u0DBA",\r
+forecolor_desc:" \u0DB4\u0DCF\u0DAA\u0DBA\u0DD9\u0DC4\u0DD2 \u0DC0\u0DBB\u0DCA\u0DAB\u0DBA \u0DAD\u0DDD\u0DBB\u0DCF\u0D9C\u0DB1\u0DCA\u0DB1\u0DC0\u0DCF",\r
+backcolor_desc:"\u0DB4\u0DC3\u0DD4\u0DB6\u0DD2\u0DB8 \u0DC0\u0DBB\u0DCA\u0DAB\u0DBA \u0DAD\u0DDD\u0DBB\u0DCF\u0D9C\u0DB1\u0DCA\u0DB1\u0DC0\u0DCF",\r
+charmap_desc:" \u0DB7\u0DCF\u0DC0\u0DD2\u0DAD \u0D85\u0D9A\u0DCA\u0DC2\u0DBB\u0DBA \u0D87\u0DAD\u0DD4\u0DBD\u0DD4 \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+visualaid_desc:"\u0DB8\u0DCF\u0DBB\u0DCA\u0D9C\u0DC3\u0DD6\u0DA0\u0D9A/\u0D85\u0DAF\u0DD8\u0DC1\u0DCA\u200D\u0DBA \u0DB8\u0DD6\u0DBD\u0DD2\u0D9A\u0DCF\u0D82\u0D9C",\r
+anchor_desc:"\u0D86\u0DB0\u0DCF\u0DBB\u0DBA \u0D87\u0DAD\u0DD4\u0DC5\u0DD4/\u0DC3\u0D82\u0DC3\u0DCA\u0D9A\u0DBB\u0DAB\u0DBA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1 ",\r
 cut_desc:"Cut",\r
-copy_desc:"Copy",\r
-paste_desc:"Paste",\r
-image_props_desc:"Image properties",\r
-newdocument_desc:"New document",\r
-help_desc:"Help",\r
+copy_desc:"\t\u0DB4\u0DD2\u0DA7\u0DB4\u0DAD\u0DCA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+image_props_desc:"\u0D85\u0DB1\u0DD4\u0DBB\u0DD6\u0DB4\u0DD2 \u0DBD\u0D9A\u0DCA\u0DC2\u0DAB\u0DBA",\r
+newdocument_desc:"\u0DB1\u0DC0 \u0DBD\u0DDA\u0D9B\u0DB1\u0DBA",\r
+help_desc:"\u0D8B\u0DB4\u0D9A\u0DCF\u0DBB\u0DBA",\r
 blockquote_desc:"Blockquote",\r
-clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you want more information about this issue?",\r
-path:"Path",\r
-newdocument:"Are you sure you want clear all contents?",\r
+clipboard_msg:"\u0DB4\u0DD2\u0DA7\u0DB4\u0DAD\u0DCA \u0D9A\u0DD2\u0DBB\u0DD3\u0DB8/\u0D89\u0DC0\u0DAD\u0DCA \u0D9A\u0DD2\u0DBB\u0DD3\u0DB8/\u0D87\u0DBD\u0DC0\u0DD3\u0DB8 \u0DB8\u0DDC\u0DC3\u0DD2\u0DBD\u0DCA\u0DBD\u0DCF \u0DC4\u0DCF \u0DC6\u0DBA\u0DBB\u0DCA \u0DC6\u0DDC\u0D9A\u0DCA\u0DC3\u0DCA \u0DC4\u0DD2 \u0D87\u0DAD\u0DD4\u0DC5\u0DAD\u0DCA \u0DB1\u0DDC\u0DC0\u0DDA.\r\n\u0D94\u0DB6\u0DA7 \u0DB8\u0DDA \u0DB4\u0DD2\u0DC5\u0DD2\u0DB6\u0DB3\u0DC0 \u0DAD\u0DA0\u0DAF\u0DD4\u0DBB\u0DA7\u0DAD\u0DCA \u0DAD\u0DDC\u0DBB\u0DAD\u0DD4\u0DBB\u0DD4 \u0D85\u0DC0\u0DC1\u0DCA\u200D\u0DBA \u0DC0\u0DDA\u0DAF?",\r
+path:"\u0DB8\u0D9F",\r
+newdocument:"\u0D94\u0DB6\u0DA7 \u0DB8\u0DD9\u0DB8 \u0D85\u0DB1\u0DCA\u0DAD\u0DBB\u0DCA\u0D9C\u0DAD\u0DBA \u0DB8\u0D9A\u0DCF \u0DAF\u0DD0\u0DB8\u0DD3\u0DB8\u0DA7 \u0D85\u0DC0\u0DC1\u0DCA\u200D\u0DBA \u0DB8 \u0DAF?",\r
 toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",\r
-more_colors:"More colors"\r
+more_colors:"\u0DAD\u0DC0\u0DAD\u0DCA \u0DC0\u0DBB\u0DCA\u0DAB"\r
 });
\ No newline at end of file
index 73687557d90f16212b3f4941e5f56592d5438e85..9e16ddaf2c87aa5ec7303aff702d984d6e217ae0 100755 (executable)
@@ -1,51 +1,51 @@
 tinyMCE.addI18n('si.advanced_dlg',{\r
-about_title:"About TinyMCE",\r
-about_general:"About",\r
-about_help:"Help",\r
-about_license:"License",\r
+about_title:" TinyMCE \u0DB4\u0DD2\u0DC5\u0DD2\u0DB6\u0DB3",\r
+about_general:"\u0DC3\u0DC0\u0DD2\u0DC3\u0DCA\u0DAD\u0DBB\u0DCF\u0DAD\u0DCA\u0DB8\u0D9A\u0DC0",\r
+about_help:"\u0D8B\u0DB4\u0D9A\u0DCF\u0DBB\u0DBA",\r
+about_license:"\u0DB6\u0DBD\u0DB4\u0DAD\u0DCA\u200D\u0DBB\u0DBA",\r
 about_plugins:"Plugins",\r
 about_plugin:"Plugin",\r
-about_author:"Author",\r
-about_version:"Version",\r
+about_author:"\u0D9A\u0DAD\u0DD8",\r
+about_version:"\u0DC3\u0D82\u0DC3\u0DCA\u0D9A\u0DBB\u0DAB\u0DBA",\r
 about_loaded:"Loaded plugins",\r
-anchor_title:"Insert/edit anchor",\r
-anchor_name:"Anchor name",\r
-code_title:"HTML Source Editor",\r
-code_wordwrap:"Word wrap",\r
-colorpicker_title:"Select a color",\r
-colorpicker_picker_tab:"Picker",\r
-colorpicker_picker_title:"Color picker",\r
-colorpicker_palette_tab:"Palette",\r
-colorpicker_palette_title:"Palette colors",\r
-colorpicker_named_tab:"Named",\r
-colorpicker_named_title:"Named colors",\r
-colorpicker_color:"Color:",\r
-colorpicker_name:"Name:",\r
-charmap_title:"Select custom character",\r
-image_title:"Insert/edit image",\r
-image_src:"Image URL",\r
-image_alt:"Image description",\r
-image_list:"Image list",\r
-image_border:"Border",\r
-image_dimensions:"Dimensions",\r
-image_vspace:"Vertical space",\r
-image_hspace:"Horizontal space",\r
-image_align:"Alignment",\r
-image_align_baseline:"Baseline",\r
-image_align_top:"Top",\r
-image_align_middle:"Middle",\r
-image_align_bottom:"Bottom",\r
-image_align_texttop:"Text top",\r
-image_align_textbottom:"Text bottom",\r
-image_align_left:"Left",\r
-image_align_right:"Right",\r
-link_title:"Insert/edit link",\r
-link_url:"Link URL",\r
-link_target:"Target",\r
-link_target_same:"Open link in the same window",\r
-link_target_blank:"Open link in a new window",\r
-link_titlefield:"Title",\r
-link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",\r
-link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",\r
-link_list:"Link list"\r
+anchor_title:"\u0D86\u0DB0\u0DCF\u0DBB\u0DBA \u0D87\u0DAD\u0DD4\u0DC5\u0DD4/\u0DC3\u0D82\u0DC3\u0DCA\u0D9A\u0DBB\u0DAB\u0DBA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+anchor_name:"\u0D86\u0DB0\u0DCF\u0DBB\u0D9A \u0DB1\u0DCF\u0DB8\u0DBA",\r
+code_title:"HTML \u0D9A\u0DDA\u0DAD \u0DC3\u0D82\u0DC3\u0DCA\u0D9A\u0DCF\u0DBB\u0D9A\u0DBA",\r
+code_wordwrap:"\u0DC0\u0DCF\u0D9C\u0DCA \u0DC0\u0DD9\u0DBD\u0DD4\u0DB8",\r
+colorpicker_title:"\u0DC0\u0DBB\u0DCA\u0DAB\u0DBA \u0DAD\u0DDD\u0DBB\u0DB1\u0DCA\u0DB1",\r
+colorpicker_picker_tab:"\t\u0D87\u0DC4\u0DD4\u0DC5\u0DD4\u0DB8\u0DCA \u0D9A\u0DD6\u0DBB ",\r
+colorpicker_picker_title:"\u0DC0\u0DBB\u0DCA\u0DAB \u0D87\u0DC4\u0DD4\u0DC5\u0DD4\u0DB8\u0DCA \u0D9A\u0DD6\u0DBB",\r
+colorpicker_palette_tab:"\t\u0DC0\u0DBB\u0DCA\u0DAB \u0D91\u0DBD\u0D9A\u0DBA",\r
+colorpicker_palette_title:"\t\u0DC0\u0DBB\u0DCA\u0DAB \u0D91\u0DBD\u0D9A \u0DC0\u0DBB\u0DCA\u0DAB",\r
+colorpicker_named_tab:"\u0DB1\u0DB8\u0DD0\u0DAD\u0DD2",\r
+colorpicker_named_title:"\u0DB1\u0DB8\u0DD0\u0DAD\u0DD2 \u0DC0\u0DBB\u0DCA\u0DAB",\r
+colorpicker_color:"\u0DC0\u0DBB\u0DCA\u0DAB:",\r
+colorpicker_name:"\u0DB1\u0DCF\u0DB8\u0DBA",\r
+charmap_title:"\u0DB7\u0DCF\u0DC0\u0DD2\u0DAD\u0DCF\u0DC0\u0DB1 \u0D9C\u0DD4\u0DAB\u0DCF\u0D82\u0D9C\u0DBA \u0DAD\u0DDD\u0DBB\u0DB1\u0DCA\u0DB1",\r
+image_title:"\u0D85\u0DB1\u0DD4\u0DBB\u0DD6\u0DB4\u0DBA\u0DD9\u0DC4\u0DD2 \u0D87\u0DAD\u0DD4\u0DC5\u0DD4/\u0DC3\u0D82\u0DC3\u0DCA\u0D9A\u0DBB\u0DAB\u0DBA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+image_src:"\u0D85\u0DB1\u0DD4\u0DBB\u0DD6\u0DB4\u0DBA\u0DD9\u0DC4\u0DD2 URL",\r
+image_alt:"\u0D85\u0DB1\u0DD4\u0DBB\u0DD6\u0DB4\u0DBA\u0DD9\u0DC4\u0DD2 \u0DC0\u0DD2\u0DC3\u0DCA\u0DAD\u0DBB",\r
+image_list:"\u0D85\u0DB1\u0DD4\u0DBB\u0DD6\u0DB4 \u0DBD\u0DD0\u0DBA\u0DD2\u0DC3\u0DCA\u0DAD\u0DD4\u0DC0",\r
+image_border:"\u0DB6\u0DDD\u0DA9\u0DBB\u0DBA",\r
+image_dimensions:"\u0DB8\u0DCF\u0DB1",\r
+image_vspace:"\u0DC3\u0DD2\u0DBB\u0DC3\u0DCA \u0D85\u0DC0\u0D9A\u0DCF\u0DC1\u0DBA",\r
+image_hspace:"\u0DAD\u0DD2\u0DBB\u0DC3\u0DCA \u0D85\u0DC0\u0D9A\u0DCF\u0DC1\u0DBA",\r
+image_align:"\u0DB4\u0DD9\u0DBD \u0D9C\u0DD0\u0DB1\u0DCA\u0DC0\u0DD4\u0DB8",\r
+image_align_baseline:"\u0DB8\u0DD6\u0DBD\u0DD2\u0D9A\u0DBA",\r
+image_align_top:"\u0D89\u0DC4\u0DC5",\r
+image_align_middle:"\u0DB8\u0DD0\u0DAF",\r
+image_align_bottom:"\u0DBA\u0DA7",\r
+image_align_texttop:"\u0DB4\u0DCF\u0DA8\u0DBA \u0D89\u0DC4\u0DC5",\r
+image_align_textbottom:"\u0DB4\u0DCF\u0DA8\u0DBA \u0DB4\u0DC4\u0DC5",\r
+image_align_left:"\u0DC0\u0DB8\u0DA7",\r
+image_align_right:"\u0DAF\u0D9A\u0DD4\u0DAB\u0DA7",\r
+link_title:"\u0D87\u0DB8\u0DD4\u0DB1\u0DD4\u0DB8 \u0D87\u0DAD\u0DD4\u0DC5\u0DD4/\u0DC3\u0D82\u0DC3\u0DCA\u0D9A\u0DBB\u0DAB\u0DBA \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+link_url:"\u0D87\u0DB8\u0DD4\u0DB1\u0DD4\u0DB8 URL",\r
+link_target:"\u0D89\u0DBD\u0D9A\u0DCA\u0D9A\u0DBA",\r
+link_target_same:"\u0D87\u0DB8\u0DD4\u0DB1\u0DD4\u0DB8 \u0DC0\u0DD9\u0DB1\u0DB8 \u0D9A\u0DC0\u0DD4\u0DBD\u0DD4\u0DC0\u0D9A \u0DC0\u0DD2\u0DC0\u0DD8\u0DAD \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+link_target_blank:"\u0D87\u0DB8\u0DD4\u0DB1\u0DD4\u0DB8 \u0DC0\u0DD9\u0DB1\u0DB8 \u0D9A\u0DC0\u0DD4\u0DBD\u0DD4\u0DC0\u0D9A \u0DC0\u0DD2\u0DC0\u0DD8\u0DAD \u0D9A\u0DBB\u0DB1\u0DCA\u0DB1",\r
+link_titlefield:"\u0DB8\u0DCF\u0DAD\u0DD8\u0D9A\u0DCF\u0DC0",\r
+link_is_email:"\u0D94\u0DB6 \u0D87\u0DAD\u0DD4\u0DC5\u0DAD\u0DCA \u0D9A\u0DC5 URL \u0DBA \u0DC0\u0DD2\u0DAF\u0DCA\u200D\u0DBA\u0DD4\u0DAD\u0DCA \u0DAD\u0DD0\u0DB4\u0DD0\u0DBD \u0D9A\u0DCA \u0DB1\u0DB8\u0DCA \u0D94\u0DB6\u0DA7 \u0D91\u0DBA\u0DA7 \u0DB4\u0DCA\u200D\u0DBB\u0DC0\u0DDA\u0DC1 \u0DC0\u0DD3\u0DB8\u0DA7 \u0D85\u0DC0\u0DC1\u0DCA\u200D\u0DBA \u0DAF?",\r
+link_is_external:"\u0D94\u0DB6 \u0D87\u0DAD\u0DD4\u0DC5\u0DAD\u0DCA \u0D9A\u0DC5 URL \u0DBA \u0DB6\u0DCF\u0DC4\u0DD2\u0DBB \u0D87\u0DB8\u0DD2\u0DAB\u0DD4\u0DB8\u0D9A\u0DCA \u0DB1\u0DB8\u0DCA,\u0D94\u0DB6\u0DA7 \u0D91\u0DBA\u0DA7 \u0DB4\u0DCA\u200D\u0DBB\u0DC0\u0DDA\u0DC1 \u0DC0\u0DD3\u0DB8\u0DA7 \u0D85\u0DC0\u0DC1\u0DCA\u200D\u0DBA \u0DAF??",\r
+link_list:"\u0D87\u0DB8\u0DD4\u0DAB\u0DD4\u0DB8\u0DCA \u0DBD\u0DBA\u0DD2\u0DC3\u0DCA\u0DAD\u0DD4\u0DC0"\r
 });
\ No newline at end of file
index 7449da8e0962a4764f86d0d03c939169754d221b..9ed8fee6e50fd35f6adc9f8cff7fcc5c9e0b9ccc 100755 (executable)
@@ -1,30 +1,30 @@
 tinyMCE.addI18n('sk.advanced',{\r
-style_select:"- \u0160t\u00FDly -",\r
-font_size:"- Ve\u013Ekos\u0165 p\u00EDsma  -",\r
-fontdefault:"- Typ p\u00EDsma -",\r
-block:"- Form\u00E1t -",\r
-paragraph:"Odstavec [p]",\r
-div:"Div",\r
-address:"Adresa [address]",\r
-pre:"Predform\u00E1t [pre]",\r
-h1:"Nadpis 1 [h1]",\r
-h2:"Nadpis 2 [h2]",\r
-h3:"Nadpis 3 [h3]",\r
-h4:"Nadpis 4 [h4]",\r
-h5:"Nadpis 5 [h5]",\r
-h6:"Nadpis 6 [h6]",\r
-blockquote:"Odsadenie",\r
+style_select:"\u0160t\u00FDly",\r
+font_size:"Ve\u013Ekos\u0165 p\u00EDsma",\r
+fontdefault:"P\u00EDsmo",\r
+block:"Form\u00E1t",\r
+paragraph:"Odstavec",\r
+div:"Oddiel",\r
+address:"Adresa",\r
+pre:"Predform\u00E1tovan\u00E9",\r
+h1:"Nadpis 1",\r
+h2:"Nadpis 2",\r
+h3:"Nadpis 3",\r
+h4:"Nadpis 4",\r
+h5:"Nadpis 5",\r
+h6:"Nadpis 6",\r
+blockquote:"Blokov\u00E1 cit\u00E1cia",\r
 code:"K\u00F3d",\r
 samp:"Uk\u00E1\u017Eka k\u00F3du",\r
-dt:"Defin\u00EDcia podmienky",\r
-dd:"Defin\u00EDcia popisu",\r
-bold_desc:"Tu\u010Dn\u00FD text (Ctrl+B)",\r
-italic_desc:"\u0160ikm\u00FD text (kurziv\u00E1) (Ctrl+I)",\r
-underline_desc:"Pod\u010Diarknut\u00FD text (Ctrl+U)",\r
-striketrough_desc:"Pre\u0161krtnut\u00FD text",\r
-justifyleft_desc:"Zarovna\u0165 v\u013Eavo",\r
+dt:"Term\u00EDn defin\u00EDcie",\r
+dd:"Popis defin\u00EDcie",\r
+bold_desc:"Tu\u010Dn\u00E9 (Ctrl+B)",\r
+italic_desc:"Kurz\u00EDva (Ctrl+I)",\r
+underline_desc:"Pod\u010Diarknut\u00E9 (Ctrl+U)",\r
+striketrough_desc:"Pre\u010Diarknut\u00E9",\r
+justifyleft_desc:"Zarovna\u0165 do\u013Eava",\r
 justifycenter_desc:"Zarovna\u0165 na stred",\r
-justifyright_desc:"Zarovna\u0165 vpravo",\r
+justifyright_desc:"Zarovna\u0165 doprava",\r
 justifyfull_desc:"Zarovna\u0165 do bloku",\r
 bullist_desc:"Zoznam s odr\u00E1\u017Ekami",\r
 numlist_desc:"\u010C\u00EDslovan\u00FD zoznam",\r
@@ -33,30 +33,30 @@ indent_desc:"Zv\u00E4\u010D\u0161i\u0165 odsadenie",
 undo_desc:"Sp\u00E4\u0165 (Ctrl+Z)",\r
 redo_desc:"Znovu (Ctrl+Y)",\r
 link_desc:"Vlo\u017Ei\u0165/upravi\u0165 odkaz",\r
-unlink_desc:"Zru\u0161i\u0165 odkaz",\r
+unlink_desc:"Odobra\u0165 odkaz",\r
 image_desc:"Vlo\u017Ei\u0165/upravi\u0165 obr\u00E1zok",\r
-cleanup_desc:"Vy\u010Disti\u0165 neusporiadan\u00FD k\u00F3d",\r
-code_desc:"Zobrazi\u0165 HTML zdroj",\r
+cleanup_desc:"Vy\u010Disti\u0165 k\u00F3d",\r
+code_desc:"Upravi\u0165 HTML zdroj",\r
 sub_desc:"Doln\u00FD index",\r
 sup_desc:"Horn\u00FD index",\r
 hr_desc:"Vlo\u017Ei\u0165 vodorovn\u00FD odde\u013Eova\u010D",\r
 removeformat_desc:"Odstr\u00E1ni\u0165 form\u00E1tovanie",\r
 custom1_desc:"\u013Dubovoln\u00FD popisok",\r
-forecolor_desc:"Vyber farbu textu",\r
-backcolor_desc:"Vyber farbu pozadia",\r
-charmap_desc:"Vlo\u017Ei\u0165 vlastn\u00FD znak",\r
-visualaid_desc:"Zobrazi\u0165 pomocn\u00E9/skryt\u00E9 prvky",\r
-anchor_desc:"Vlo\u017Ei\u0165/upravi\u0165 n\u00E1zov kotvy",\r
+forecolor_desc:"Farba p\u00EDsma",\r
+backcolor_desc:"Farba zv\u00FDraznenia textu",\r
+charmap_desc:"Vlo\u017Ei\u0165 \u0161peci\u00E1lny znak",\r
+visualaid_desc:"Zobrazi\u0165 pomocn\u00E9 linky/skryt\u00E9 prvky",\r
+anchor_desc:"Vlo\u017Ei\u0165/upravi\u0165 z\u00E1lo\u017Eku (kotvu)",\r
 cut_desc:"Vystrihn\u00FA\u0165",\r
 copy_desc:"Kop\u00EDrova\u0165",\r
 paste_desc:"Vlo\u017Ei\u0165",\r
 image_props_desc:"Vlastnosti obr\u00E1zka",\r
 newdocument_desc:"Nov\u00FD dokument",\r
-help_desc:"N\u00E1poveda",\r
-blockquote_desc:"Citovan\u00FD text",\r
-clipboard_msg:"Funkcie Kop\u00EDrova\u0165/vysrihn\u00FA\u0165/vlo\u017Ei\u0165 nie su podporovan\u00E9 prehliada\u010Dmi Mozilla a Firefox. Chce\u0161 viac inform\u00E1ci\u00ED o tomto probl\u00E9me?",\r
+help_desc:"Pomocn\u00EDk",\r
+blockquote_desc:"Blokov\u00E1 cit\u00E1cia",\r
+clipboard_msg:"Funkcie kop\u00EDrova\u0165/vystrihn\u00FA\u0165/vlo\u017Ei\u0165 nie s\u00FA podporovan\u00E9 v prehliada\u010Doch Mozilla a Firefox.\nChcete viac inform\u00E1ci\u00ED o tomto probl\u00E9me?",\r
 path:"Cesta",\r
-newdocument:"Naozaj chce\u0161 vy\u010Disti\u0165 v\u0161etok obsah?",\r
-toolbar_focus:"Prejdi na n\u00E1strojov\u00E9 tla\u010Didl\u00E1 - Alt+Q, Prejdi na editor - Alt-Z, Prejdi na cestu elementov - Alt-X",\r
-more_colors:"Viac farieb"\r
+newdocument:"Ste si naozaj ist\u00ED, \u017Ee chcete odstr\u00E1ni\u0165 v\u0161etok obsah?",\r
+toolbar_focus:"Prechod na li\u0161tu n\u00E1strojov - Alt+Q, prechod do editora - Alt-Z, prechod na cestu k objektom - Alt-X",\r
+more_colors:"\u010Eal\u0161ie farby"\r
 });
\ No newline at end of file
index f381c51f4679adbb442754b7e9e82043eb17c13f..72b12db78250185a356bac6fcebc07f12783aa94 100755 (executable)
@@ -1,51 +1,51 @@
 tinyMCE.addI18n('sk.advanced_dlg',{\r
 about_title:"O TinyMCE",\r
-about_general:"O Programe",\r
-about_help:"N\u00E1poveda",\r
+about_general:"O programe",\r
+about_help:"Pomocn\u00EDk",\r
 about_license:"Licencia",\r
-about_plugins:"Pluginy",\r
-about_plugin:"Plugin",\r
+about_plugins:"Z\u00E1suvn\u00E9 moduly",\r
+about_plugin:"Z\u00E1suvn\u00FD modul",\r
 about_author:"Autor",\r
 about_version:"Verzia",\r
-about_loaded:"Na\u010D\u00EDtan\u00E9 pluginy",\r
-anchor_title:"Vlo\u017Ei\u0165/upravi\u0165 n\u00E1zov kotvy",\r
-anchor_name:"N\u00E1zov kotvy",\r
-code_title:"Editor HTML k\u00F3du",\r
-code_wordwrap:"Zalamova\u0165 riadky",\r
-colorpicker_title:"Vyber farbu",\r
-colorpicker_picker_tab:"Mie\u0161a\u010D",\r
-colorpicker_picker_title:"Mie\u0161a\u010D farieb",\r
-colorpicker_palette_tab:"Paleta",\r
-colorpicker_palette_title:"Paleta farieb",\r
-colorpicker_named_tab:"N\u00E1zvoslovia",\r
-colorpicker_named_title:"N\u00E1zvy farieb",\r
-colorpicker_color:"Farba:",\r
+about_loaded:"Na\u010D\u00EDtan\u00E9 z\u00E1suvn\u00E9 moduly",\r
+anchor_title:"Vlo\u017Ei\u0165/upravi\u0165 z\u00E1lo\u017Eku (kotvu)",\r
+anchor_name:"N\u00E1zov z\u00E1lo\u017Eky",\r
+code_title:"Editor HTML",\r
+code_wordwrap:"Zalamovanie riadkov",\r
+colorpicker_title:"V\u00FDber farby",\r
+colorpicker_picker_tab:"Kvapkadlo",\r
+colorpicker_picker_title:"Kvapkadlo",\r
+colorpicker_palette_tab:"Vzorkovn\u00EDk",\r
+colorpicker_palette_title:"Vzorkovn\u00EDk farieb",\r
+colorpicker_named_tab:"N\u00E1zvy",\r
+colorpicker_named_title:"Pomenovan\u00E9 farby",\r
+colorpicker_color:"Vybrat\u00E1 farba:",\r
 colorpicker_name:"N\u00E1zov:",\r
-charmap_title:"Vyber \u0161peci\u00E1lny znak",\r
-image_title:"Vlo\u017Ei\u0165/editova\u0165 obr\u00E1zok",\r
+charmap_title:"Vlo\u017Ei\u0165 \u0161peci\u00E1lny znak",\r
+image_title:"Vlo\u017Ei\u0165/upravi\u0165 obr\u00E1zok",\r
 image_src:"URL obr\u00E1zka",\r
 image_alt:"Popis obr\u00E1zka",\r
 image_list:"Zoznam obr\u00E1zkov",\r
-image_border:"Okraj",\r
+image_border:"Or\u00E1movanie",\r
 image_dimensions:"Rozmery",\r
-image_vspace:"Vertik\u00E1lna medzera",\r
-image_hspace:"Horizont\u00E1lna medzera",\r
-image_align:"Usporiadanie",\r
-image_align_baseline:"Z\u00E1klad\u0148a",\r
+image_vspace:"Vertik\u00E1lne odsadenie",\r
+image_hspace:"Horizont\u00E1lne odsadenie",\r
+image_align:"Zarovnanie",\r
+image_align_baseline:"Na z\u00E1klad\u0148u",\r
 image_align_top:"Hore",\r
-image_align_middle:"Uprostred",\r
-image_align_bottom:"Dolu",\r
-image_align_texttop:"Text hore",\r
-image_align_textbottom:"Text dolu",\r
+image_align_middle:"Na stred riadku",\r
+image_align_bottom:"Dole",\r
+image_align_texttop:"S vrcholom riadku",\r
+image_align_textbottom:"So spodkom riadku",\r
 image_align_left:"V\u013Eavo",\r
 image_align_right:"Vpravo",\r
-link_title:"Vlo\u017Ei\u0165/editova\u0165 odkaz",\r
+link_title:"Vlo\u017Ei\u0165/upravi\u0165 odkaz",\r
 link_url:"URL odkazu",\r
-link_target:"Cie\u013E odkazu",\r
+link_target:"Cie\u013E",\r
 link_target_same:"Otvori\u0165 odkaz v rovnakom okne",\r
 link_target_blank:"Otvori\u0165 odkaz v novom okne",\r
-link_titlefield:"N\u00E1zov",\r
-link_is_email:"Zd\u00E1 sa, \u017Ee zadan\u00E1 URL je emailov\u00E1 adresa. Chce\u0161 vlo\u017Ei\u0165 povinn\u00FD prefix mailto: ?",\r
-link_is_external:"Zd\u00E1 sa, \u017Ee zadan\u00E1 URL je extern\u00FD odkaz. Chce\u0161 vlo\u017Ei\u0165 povinn\u00FD prefix http:// ?",\r
+link_titlefield:"Titulok",\r
+link_is_email:"Zadan\u00E9 URL vyzer\u00E1 ako e-mailov\u00E1 adresa, chcete doplni\u0165 povinn\u00FD prefix mailto:?",\r
+link_is_external:"Zadan\u00E9 URL vyzer\u00E1 ako extern\u00FD odkaz, chcete doplni\u0165 povinn\u00FD prefix http://?",\r
 link_list:"Zoznam odkazov"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/sq.js b/program/js/tiny_mce/themes/advanced/langs/sq.js
new file mode 100644 (file)
index 0000000..a061972
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('sq.advanced',{\r
+style_select:"Stilet",\r
+font_size:"Madh\u00EBsia e tekstit",\r
+fontdefault:"Familja e tekstit",\r
+block:"Formati",\r
+paragraph:"Paragraf",\r
+div:"Div",\r
+address:"Adres\u00EB",\r
+pre:"Para formatuar",\r
+h1:"Kok\u00EB 1",\r
+h2:"Kok\u00EB 2",\r
+h3:"Kok\u00EB 3",\r
+h4:"Kok\u00EB 4",\r
+h5:"Kok\u00EB 5",\r
+h6:"Kok\u00EB 6",\r
+blockquote:"Bllok",\r
+code:"Kod",\r
+samp:"Shembull kodi",\r
+dt:"Terma e p\u00EBrcaktimit ",\r
+dd:"P\u00EBrshkrimi i p\u00EBrcaktimit",\r
+bold_desc:"I Trash\u00EB (Ctrl+B)",\r
+italic_desc:"I Pjerr\u00EBt (Ctrl+I)",\r
+underline_desc:"I N\u00EBnvizuar (Ctrl+U)",\r
+striketrough_desc:"Vij\u00EB n\u00EB mes",\r
+justifyleft_desc:"Drejtimi majtas",\r
+justifycenter_desc:"Drejtimi qend\u00EBr",\r
+justifyright_desc:"Drejtimi djathtas",\r
+justifyfull_desc:"Drejtim i plot\u00EB",\r
+bullist_desc:"List\u00EB e parregullt",\r
+numlist_desc:"List\u00EB e rregullt",\r
+outdent_desc:"Hiq kryerradh\u00EB",\r
+indent_desc:"Vendos kryerradh\u00EB",\r
+undo_desc:"\u00C7b\u00EBj (Ctrl+Z)",\r
+redo_desc:"Rib\u00EBj (Ctrl+Y)",\r
+link_desc:"Fut/edito lidhje",\r
+unlink_desc:"Hiq lidhje",\r
+image_desc:"Fut/edito foto",\r
+cleanup_desc:"Pastro kodin",\r
+code_desc:"Edito kodin HTML",\r
+sub_desc:"N\u00EBn shkrim",\r
+sup_desc:"Mbi shkrim",\r
+hr_desc:"Fut linj\u00EB horizontale",\r
+removeformat_desc:"Fshi formatimin",\r
+custom1_desc:"P\u00EBshkrimi i personalizuar k\u00EBtu",\r
+forecolor_desc:"Zgjidh ngjyr\u00EBn e tekstit",\r
+backcolor_desc:"Zgjidh ngjyr\u00EBn e fush\u00EBs",\r
+charmap_desc:"Fut karakter t\u00EB personalizuar",\r
+visualaid_desc:"Shfaq/Fshih vijat ndihm\u00EBse dhe element\u00EBt e paduksh\u00EBm",\r
+anchor_desc:"Fut/edito lidhje",\r
+cut_desc:"Prit",\r
+copy_desc:"Kopjo",\r
+paste_desc:"Ngjit",\r
+image_props_desc:"Opsionet e fotos",\r
+newdocument_desc:"Dokument i Ri",\r
+help_desc:"Ndihm\u00EB",\r
+blockquote_desc:"Bllok",\r
+clipboard_msg:"Kopja/Prerja/Ngjitja nuk suportohen n\u00EB Mozilla dhe Firefox.\nD\u00EBshironi m\u00EB shum\u00EB informacione p\u00EBr k\u00EBt\u00EB \u00E7\u00EBshtje?",\r
+path:"Rruga",\r
+newdocument:"Jeni t\u00EB sigurt q\u00EB doni t'a fshini p\u00EBrmbajtjen?",\r
+toolbar_focus:"Shko tek butonat - Alt+Q, Shko tek editori - Alt+Z, Shko tek rruga e elementit - Alt+X",\r
+more_colors:"M\u00EB shum\u00EB ngjyra"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/sq_dlg.js b/program/js/tiny_mce/themes/advanced/langs/sq_dlg.js
new file mode 100644 (file)
index 0000000..1a77a86
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('sq.advanced_dlg',{\r
+about_title:"Rreth TinyMCE",\r
+about_general:"Rreth",\r
+about_help:"Ndihm\u00EB",\r
+about_license:"Li\u00E7enca",\r
+about_plugins:"Shtesa",\r
+about_plugin:"Shtes\u00EB",\r
+about_author:"Autori",\r
+about_version:"Versioni",\r
+about_loaded:"Shtesa t\u00EB ngarkuara",\r
+anchor_title:"Fut/edito lidhje",\r
+anchor_name:"Emri i lidhjes",\r
+code_title:"Edituesi i kodit HTML",\r
+code_wordwrap:"Word wrap",\r
+colorpicker_title:"Zgjidh nj\u00EB ngjyr\u00EB",\r
+colorpicker_picker_tab:"Zgjedh\u00EBsi",\r
+colorpicker_picker_title:"Zgjedh\u00EBsi i ngjyr\u00EBs",\r
+colorpicker_palette_tab:"Librari",\r
+colorpicker_palette_title:"Ngjyrat e Libraris\u00EB",\r
+colorpicker_named_tab:"Em\u00EBruar",\r
+colorpicker_named_title:"Ngjyrat e em\u00EBruara",\r
+colorpicker_color:"Ngjyra:",\r
+colorpicker_name:"Emri:",\r
+charmap_title:"Zgjidh karakter t\u00EB personalizuar",\r
+image_title:"Fut/edio foto",\r
+image_src:"URL e fotos",\r
+image_alt:"P\u00EBrshkrimi i fotos",\r
+image_list:"Lista e fotove",\r
+image_border:"Korniza",\r
+image_dimensions:"P\u00EBrmasat",\r
+image_vspace:"Hap\u00EBsira Vertikale",\r
+image_hspace:"Hap\u00EBsira Horizontale",\r
+image_align:"Drejtimi",\r
+image_align_baseline:"Vij\u00EB fundore",\r
+image_align_top:"Krye",\r
+image_align_middle:"Mes",\r
+image_align_bottom:"Fund",\r
+image_align_texttop:"N\u00EB krye t\u00EB tekstit",\r
+image_align_textbottom:"N\u00EB fund t\u00EB tekstit",\r
+image_align_left:"Majtas",\r
+image_align_right:"Djathtas",\r
+link_title:"Fut/edito lidhje",\r
+link_url:"URL e lidhjes",\r
+link_target:"Sh\u00EBnjestra",\r
+link_target_same:"Hape lidhjen n\u00EB t\u00EB nj\u00EBjt\u00EBn dritare",\r
+link_target_blank:"Hape lidhjen n\u00EB dritare t\u00EB re",\r
+link_titlefield:"Titulli",\r
+link_is_email:"Lidhja q\u00EB keni futur duket si adres\u00EB emaili. Doni t\u00EB shtoni prefiksin mailto:?",\r
+link_is_external:"Lidhja q\u00EB keni futur duket si lidhje e jasht\u00EBme. Doni t\u00EB shtoni prefiksin http://?",\r
+link_list:"Lista e lidhjeve"\r
+});
\ No newline at end of file
index f5c6347e8dd988bf6624f8d17886c80b9add41ae..d451779f502082a0d6085a581e4bc5de74883bd4 100755 (executable)
@@ -19,7 +19,7 @@ samp:"Primjer koda",
 dt:"Definicija pojma",\r
 dd:"Opis definicije",\r
 bold_desc:"Podebljaj (Ctrl+B)",\r
-italic_desc:"Kurziv (Ctrl+I)",\r
+italic_desc:"Iskosi (Ctrl+I)",\r
 underline_desc:"Podcrtaj (Ctrl+U)",\r
 striketrough_desc:"Precrtaj",\r
 justifyleft_desc:"Poravnaj levo",\r
@@ -32,8 +32,8 @@ outdent_desc:"Uvuci",
 indent_desc:"Izvuci",\r
 undo_desc:"Poni\u0161ti (Ctrl+Z)",\r
 redo_desc:"Ponovi (Ctrl+Y)",\r
-link_desc:"Umetni/uredi poveznicu",\r
-unlink_desc:"Poni\u0161ti poveznicu",\r
+link_desc:"Ubaci/promijeni link",\r
+unlink_desc:"Poni\u0161ti link",\r
 image_desc:"Umetni/uredi sliku",\r
 cleanup_desc:"Po\u010Disti kod",\r
 code_desc:"Uredi HTML izvor",\r
index 55332e03e86d0da89daf8e4c027c846f3d527ae6..bb98562bfa271be8cca22505ee4bfc3693c5ea98 100755 (executable)
@@ -39,13 +39,13 @@ image_align_texttop:"Vrh teksta",
 image_align_textbottom:"Dno teksta",\r
 image_align_left:"Levo",\r
 image_align_right:"Desno",\r
-link_title:"Umetni/uredi poveznicu",\r
-link_url:"URL poveznice",\r
+link_title:"Ubaci/promijeni link",\r
+link_url:"URL link",\r
 link_target:"Meta",\r
-link_target_same:"Otvori poveznicu u istom prozoru",\r
-link_target_blank:"Otvori poveznicu u novom prozoru",\r
+link_target_same:"Otvori link u istom prozoru",\r
+link_target_blank:"Otvori link u novom prozoru",\r
 link_titlefield:"Naslov",\r
 link_is_email:"URL koji ste uneli izgleda kao e-mail adresa, \u017Eelite li dodati potrebni mailto: prefiks?",\r
-link_is_external:"URL koji ste uneli izgleda kao vanjska poveznica, \u017Eelite li dodati potrebni http:// prefiks?",\r
-link_list:"Lista poveznica"\r
+link_is_external:"URL koji ste uneli izgleda kao vanjski link, \u017Eelite li dodati potrebni http:// prefiks?",\r
+link_list:"Lista linkova"\r
 });
\ No newline at end of file
index daaf9c0faa37ce96439b830e2fab11d2deeacde4..5552b9bd9d80c8ce1926e5c23b79d4339ec995c8 100755 (executable)
@@ -3,7 +3,7 @@ style_select:"Stilar",
 font_size:"Fontstorlek",\r
 fontdefault:"Fontfamilj",\r
 block:"Format",\r
-paragraph:"Paragraf",\r
+paragraph:"Stycke",\r
 div:"Div",\r
 address:"Adress",\r
 pre:"F\u00F6rformaterad",\r
@@ -56,5 +56,5 @@ blockquote_desc:"Blockcitat",
 clipboard_msg:"Kopiera/klipp ut/klistra in \u00E4r inte tillg\u00E4ngligt i din webbl\u00E4sare.\nVill du veta mer om detta?",\r
 path:"Element",\r
 newdocument:"\u00C4r du s\u00E4ker p\u00E5 att du vill radera allt inneh\u00E5ll?",\r
-toolbar_focus:"Hoppa till verktygsf\u00E4ltet - Alt+Q, Hoppa till redigeraren - Alt-Z, Hoppa till element listan - Alt-X"\r
+toolbar_focus:"Hoppa till verktygsf\u00E4ltet - Alt+Q, Hoppa till redigeraren - Alt-Z, Hoppa till elementlistan - Alt-X"\r
 });
\ No newline at end of file
index 1364f2f8d9d141d6bc7bf7016438ee99eddc0896..12a5941a05caf8730415c90f896aa10883bc31d5 100755 (executable)
@@ -37,13 +37,13 @@ image_align_middle:"Mitten",
 image_align_bottom:"Botten",\r
 image_align_texttop:"Toppen av texten",\r
 image_align_textbottom:"Botten av texten",\r
-image_align_left:"H\u00F6ger",\r
-image_align_right:"V\u00E4nster",\r
+image_align_left:"V\u00E4nster",\r
+image_align_right:"H\u00F6ger",\r
 link_title:"Infoga/redigera l\u00E4nk",\r
 link_url:"L\u00E4nkens URL",\r
 link_target:"M\u00E5l",\r
-link_target_same:"\u00D6ppna l\u00E4nken i samma f\u00F6nster",\r
-link_target_blank:"\u00D6ppna l\u00E4nken i ett nytt f\u00F6nster",\r
+link_target_same:"\u00D6\u0096ppna l\u00E4nken i samma f\u00F6nster",\r
+link_target_blank:"\u00D6\u0096ppna l\u00E4nken i ett nytt f\u00F6nster",\r
 link_titlefield:"Titel",\r
 link_is_email:"L\u00E4nken du angav verkar vara en e-post adress. Vill du infoga mailto: prefixet p\u00E5 l\u00E4nken?",\r
 link_is_external:"L\u00E4nken du angav verkar vara en extern adress. Vill du infoga http:// prefixet p\u00E5 l\u00E4nken?",\r
diff --git a/program/js/tiny_mce/themes/advanced/langs/ta.js b/program/js/tiny_mce/themes/advanced/langs/ta.js
new file mode 100644 (file)
index 0000000..ee34066
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('ta.advanced',{\r
+style_select:"Styles",\r
+font_size:"Font size",\r
+fontdefault:"Font family",\r
+block:"Format",\r
+paragraph:"Paragraph",\r
+div:"Div",\r
+address:"Address",\r
+pre:"Preformatted",\r
+h1:"Heading 1",\r
+h2:"Heading 2",\r
+h3:"Heading 3",\r
+h4:"Heading 4",\r
+h5:"Heading 5",\r
+h6:"Heading 6",\r
+blockquote:"Blockquote",\r
+code:"Code",\r
+samp:"Code sample",\r
+dt:"Definition term ",\r
+dd:"Definition description",\r
+bold_desc:"Bold (Ctrl+B)",\r
+italic_desc:"Italic (Ctrl+I)",\r
+underline_desc:"Underline (Ctrl+U)",\r
+striketrough_desc:"Strikethrough",\r
+justifyleft_desc:"Align left",\r
+justifycenter_desc:"Align center",\r
+justifyright_desc:"Align right",\r
+justifyfull_desc:"Align full",\r
+bullist_desc:"Unordered list",\r
+numlist_desc:"Ordered list",\r
+outdent_desc:"Outdent",\r
+indent_desc:"Indent",\r
+undo_desc:"Undo (Ctrl+Z)",\r
+redo_desc:"Redo (Ctrl+Y)",\r
+link_desc:"Insert/edit link",\r
+unlink_desc:"Unlink",\r
+image_desc:"Insert/edit image",\r
+cleanup_desc:"Cleanup messy code",\r
+code_desc:"Edit HTML Source",\r
+sub_desc:"Subscript",\r
+sup_desc:"Superscript",\r
+hr_desc:"Insert horizontal ruler",\r
+removeformat_desc:"Remove formatting",\r
+custom1_desc:"Your custom description here",\r
+forecolor_desc:"Select text color",\r
+backcolor_desc:"Select background color",\r
+charmap_desc:"Insert custom character",\r
+visualaid_desc:"Toggle guidelines/invisible elements",\r
+anchor_desc:"Insert/edit anchor",\r
+cut_desc:"Cut",\r
+copy_desc:"Copy",\r
+paste_desc:"Paste",\r
+image_props_desc:"Image properties",\r
+newdocument_desc:"New document",\r
+help_desc:"Help",\r
+blockquote_desc:"Blockquote",\r
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you want more information about this issue?",\r
+path:"Path",\r
+newdocument:"Are you sure you want clear all contents?",\r
+toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",\r
+more_colors:"More colors"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/ta_dlg.js b/program/js/tiny_mce/themes/advanced/langs/ta_dlg.js
new file mode 100644 (file)
index 0000000..39f6f80
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('ta.advanced_dlg',{\r
+about_title:"About TinyMCE",\r
+about_general:"About",\r
+about_help:"Help",\r
+about_license:"License",\r
+about_plugins:"Plugins",\r
+about_plugin:"Plugin",\r
+about_author:"Author",\r
+about_version:"Version",\r
+about_loaded:"Loaded plugins",\r
+anchor_title:"Insert/edit anchor",\r
+anchor_name:"Anchor name",\r
+code_title:"HTML Source Editor",\r
+code_wordwrap:"Word wrap",\r
+colorpicker_title:"Select a color",\r
+colorpicker_picker_tab:"Picker",\r
+colorpicker_picker_title:"Color picker",\r
+colorpicker_palette_tab:"Palette",\r
+colorpicker_palette_title:"Palette colors",\r
+colorpicker_named_tab:"Named",\r
+colorpicker_named_title:"Named colors",\r
+colorpicker_color:"Color:",\r
+colorpicker_name:"Name:",\r
+charmap_title:"Select custom character",\r
+image_title:"Insert/edit image",\r
+image_src:"Image URL",\r
+image_alt:"Image description",\r
+image_list:"Image list",\r
+image_border:"Border",\r
+image_dimensions:"Dimensions",\r
+image_vspace:"Vertical space",\r
+image_hspace:"Horizontal space",\r
+image_align:"Alignment",\r
+image_align_baseline:"Baseline",\r
+image_align_top:"Top",\r
+image_align_middle:"Middle",\r
+image_align_bottom:"Bottom",\r
+image_align_texttop:"Text top",\r
+image_align_textbottom:"Text bottom",\r
+image_align_left:"Left",\r
+image_align_right:"Right",\r
+link_title:"Insert/edit link",\r
+link_url:"Link URL",\r
+link_target:"Target",\r
+link_target_same:"Open link in the same window",\r
+link_target_blank:"Open link in a new window",\r
+link_titlefield:"Title",\r
+link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",\r
+link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",\r
+link_list:"Link list"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/te.js b/program/js/tiny_mce/themes/advanced/langs/te.js
new file mode 100644 (file)
index 0000000..542bfc7
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('te.advanced',{\r
+style_select:"Styles",\r
+font_size:"Font size",\r
+fontdefault:"Font family",\r
+block:"Format",\r
+paragraph:"Paragraph",\r
+div:"Div",\r
+address:"Address",\r
+pre:"Preformatted",\r
+h1:"Heading 1",\r
+h2:"Heading 2",\r
+h3:"Heading 3",\r
+h4:"Heading 4",\r
+h5:"Heading 5",\r
+h6:"Heading 6",\r
+blockquote:"Blockquote",\r
+code:"Code",\r
+samp:"Code sample",\r
+dt:"Definition term ",\r
+dd:"Definition description",\r
+bold_desc:"Bold (Ctrl+B)",\r
+italic_desc:"Italic (Ctrl+I)",\r
+underline_desc:"Underline (Ctrl+U)",\r
+striketrough_desc:"Strikethrough",\r
+justifyleft_desc:"Align left",\r
+justifycenter_desc:"Align center",\r
+justifyright_desc:"Align right",\r
+justifyfull_desc:"Align full",\r
+bullist_desc:"Unordered list",\r
+numlist_desc:"Ordered list",\r
+outdent_desc:"Outdent",\r
+indent_desc:"Indent",\r
+undo_desc:"Undo (Ctrl+Z)",\r
+redo_desc:"Redo (Ctrl+Y)",\r
+link_desc:"Insert/edit link",\r
+unlink_desc:"Unlink",\r
+image_desc:"Insert/edit image",\r
+cleanup_desc:"Cleanup messy code",\r
+code_desc:"Edit HTML Source",\r
+sub_desc:"Subscript",\r
+sup_desc:"Superscript",\r
+hr_desc:"Insert horizontal ruler",\r
+removeformat_desc:"Remove formatting",\r
+custom1_desc:"Your custom description here",\r
+forecolor_desc:"Select text color",\r
+backcolor_desc:"Select background color",\r
+charmap_desc:"Insert custom character",\r
+visualaid_desc:"Toggle guidelines/invisible elements",\r
+anchor_desc:"Insert/edit anchor",\r
+cut_desc:"Cut",\r
+copy_desc:"Copy",\r
+paste_desc:"Paste",\r
+image_props_desc:"Image properties",\r
+newdocument_desc:"New document",\r
+help_desc:"Help",\r
+blockquote_desc:"Blockquote",\r
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you want more information about this issue?",\r
+path:"Path",\r
+newdocument:"Are you sure you want clear all contents?",\r
+toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",\r
+more_colors:"More colors"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/te_dlg.js b/program/js/tiny_mce/themes/advanced/langs/te_dlg.js
new file mode 100644 (file)
index 0000000..f1185c9
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('te.advanced_dlg',{\r
+about_title:"About TinyMCE",\r
+about_general:"About",\r
+about_help:"Help",\r
+about_license:"License",\r
+about_plugins:"Plugins",\r
+about_plugin:"Plugin",\r
+about_author:"Author",\r
+about_version:"Version",\r
+about_loaded:"Loaded plugins",\r
+anchor_title:"Insert/edit anchor",\r
+anchor_name:"Anchor name",\r
+code_title:"HTML Source Editor",\r
+code_wordwrap:"Word wrap",\r
+colorpicker_title:"Select a color",\r
+colorpicker_picker_tab:"Picker",\r
+colorpicker_picker_title:"Color picker",\r
+colorpicker_palette_tab:"Palette",\r
+colorpicker_palette_title:"Palette colors",\r
+colorpicker_named_tab:"Named",\r
+colorpicker_named_title:"Named colors",\r
+colorpicker_color:"Color:",\r
+colorpicker_name:"Name:",\r
+charmap_title:"Select custom character",\r
+image_title:"Insert/edit image",\r
+image_src:"Image URL",\r
+image_alt:"Image description",\r
+image_list:"Image list",\r
+image_border:"Border",\r
+image_dimensions:"Dimensions",\r
+image_vspace:"Vertical space",\r
+image_hspace:"Horizontal space",\r
+image_align:"Alignment",\r
+image_align_baseline:"Baseline",\r
+image_align_top:"Top",\r
+image_align_middle:"Middle",\r
+image_align_bottom:"Bottom",\r
+image_align_texttop:"Text top",\r
+image_align_textbottom:"Text bottom",\r
+image_align_left:"Left",\r
+image_align_right:"Right",\r
+link_title:"Insert/edit link",\r
+link_url:"Link URL",\r
+link_target:"Target",\r
+link_target_same:"Open link in the same window",\r
+link_target_blank:"Open link in a new window",\r
+link_titlefield:"Title",\r
+link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",\r
+link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",\r
+link_list:"Link list"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/th.js b/program/js/tiny_mce/themes/advanced/langs/th.js
new file mode 100644 (file)
index 0000000..ed2c430
--- /dev/null
@@ -0,0 +1,62 @@
+tinyMCE.addI18n('th.advanced',{\r
+style_select:"\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A",\r
+font_size:"\u0E02\u0E19\u0E32\u0E14\u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23",\r
+fontdefault:"\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23",\r
+block:"\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A",\r
+paragraph:"\u0E22\u0E48\u0E2D\u0E2B\u0E19\u0E49\u0E32",\r
+div:"Div",\r
+address:"\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48",\r
+pre:"\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E1E\u0E37\u0E49\u0E19\u0E10\u0E32\u0E19",\r
+h1:"Heading 1",\r
+h2:"Heading 2",\r
+h3:"Heading 3",\r
+h4:"Heading 4",\r
+h5:"Heading 5",\r
+h6:"Heading 6",\r
+blockquote:"\u0E2D\u0E49\u0E32\u0E07\u0E2D\u0E34\u0E07",\r
+code:"\u0E42\u0E04\u0E49\u0E14",\r
+samp:"\u0E42\u0E04\u0E49\u0E14\u0E15\u0E31\u0E27\u0E2D\u0E22\u0E48\u0E32\u0E07",\r
+dt:"\u0E04\u0E33\u0E19\u0E34\u0E22\u0E32\u0E21",\r
+dd:"\u0E23\u0E32\u0E22\u0E25\u0E30\u0E40\u0E2D\u0E35\u0E22\u0E14\u0E04\u0E33\u0E19\u0E34\u0E22\u0E32\u0E21",\r
+bold_desc:"\u0E15\u0E31\u0E27\u0E2B\u0E19\u0E32 (Ctrl+B)",\r
+italic_desc:"\u0E15\u0E31\u0E27\u0E40\u0E2D\u0E35\u0E22\u0E07 (Ctrl+I)",\r
+underline_desc:"\u0E15\u0E31\u0E27\u0E02\u0E35\u0E14\u0E40\u0E2A\u0E49\u0E19\u0E43\u0E15\u0E49(Ctrl+U)",\r
+striketrough_desc:"\u0E02\u0E35\u0E14\u0E06\u0E48\u0E32",\r
+justifyleft_desc:"\u0E08\u0E31\u0E14\u0E0B\u0E49\u0E32\u0E22",\r
+justifycenter_desc:"\u0E08\u0E31\u0E14\u0E01\u0E25\u0E32\u0E07",\r
+justifyright_desc:"\u0E08\u0E31\u0E14\u0E02\u0E27\u0E32",\r
+justifyfull_desc:"\u0E08\u0E31\u0E14\u0E40\u0E15\u0E47\u0E21\u0E2B\u0E19\u0E49\u0E32",\r
+bullist_desc:"\u0E25\u0E33\u0E14\u0E31\u0E1A\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23",\r
+numlist_desc:"\u0E25\u0E33\u0E14\u0E31\u0E1A\u0E15\u0E31\u0E27\u0E40\u0E25\u0E02",\r
+outdent_desc:"\u0E25\u0E14\u0E01\u0E32\u0E23\u0E40\u0E22\u0E37\u0E49\u0E2D\u0E07",\r
+indent_desc:"\u0E40\u0E22\u0E37\u0E49\u0E2D\u0E07\u0E02\u0E27\u0E32",\r
+undo_desc:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01 (Ctrl+Z)",\r
+redo_desc:"\u0E22\u0E49\u0E2D\u0E19\u0E01\u0E25\u0E31\u0E1A (Ctrl+Y)",\r
+link_desc:"\u0E40\u0E1E\u0E34\u0E48\u0E21/\u0E41\u0E01\u0E49\u0E44\u0E02 \u0E25\u0E34\u0E49\u0E07\u0E04\u0E4C",\r
+unlink_desc:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\u0E25\u0E34\u0E49\u0E07\u0E04\u0E4C",\r
+image_desc:"\u0E40\u0E1E\u0E34\u0E48\u0E21/\u0E41\u0E01\u0E49\u0E44\u0E02 \u0E23\u0E39\u0E1B",\r
+cleanup_desc:"\u0E25\u0E49\u0E32\u0E07\u0E42\u0E04\u0E49\u0E14",\r
+code_desc:"\u0E41\u0E01\u0E49\u0E44\u0E02 HTML",\r
+sub_desc:"\u0E15\u0E31\u0E27\u0E2B\u0E49\u0E2D\u0E22",\r
+sup_desc:"\u0E15\u0E31\u0E27\u0E22\u0E01",\r
+hr_desc:"\u0E43\u0E2A\u0E48\u0E40\u0E2A\u0E49\u0E19\u0E1A\u0E23\u0E23\u0E17\u0E31\u0E14",\r
+removeformat_desc:"\u0E25\u0E49\u0E32\u0E07\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A",\r
+custom1_desc:"\u0E43\u0E2A\u0E48\u0E23\u0E32\u0E22\u0E25\u0E30\u0E40\u0E2D\u0E35\u0E22\u0E14\u0E40\u0E2D\u0E07\u0E44\u0E14\u0E49\u0E17\u0E35\u0E48\u0E19\u0E35\u0E48",\r
+forecolor_desc:"\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E2A\u0E35\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21",\r
+backcolor_desc:"\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E2A\u0E35\u0E1E\u0E37\u0E49\u0E19\u0E2B\u0E25\u0E31\u0E07",\r
+charmap_desc:"\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23",\r
+visualaid_desc:"\u0E2A\u0E25\u0E31\u0E1A guidelines/\u0E0B\u0E48\u0E2D\u0E19 elements",\r
+anchor_desc:"\u0E40\u0E1E\u0E34\u0E48\u0E21/\u0E41\u0E01\u0E49\u0E44\u0E02 \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E25\u0E34\u0E49\u0E07\u0E04\u0E4C",\r
+cut_desc:"\u0E15\u0E31\u0E14",\r
+copy_desc:"\u0E04\u0E31\u0E14\u0E25\u0E2D\u0E01",\r
+paste_desc:"\u0E27\u0E32\u0E07",\r
+image_props_desc:"\u0E04\u0E38\u0E13\u0E2A\u0E21\u0E1A\u0E31\u0E15\u0E34\u0E23\u0E39\u0E1B",\r
+newdocument_desc:"\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23\u0E43\u0E2B\u0E21\u0E48",\r
+help_desc:"\u0E0A\u0E48\u0E27\u0E22\u0E40\u0E2B\u0E25\u0E37\u0E2D",\r
+blockquote_desc:"\u0E2D\u0E49\u0E32\u0E07\u0E16\u0E36\u0E07",\r
+clipboard_msg:"\u0E04\u0E31\u0E14\u0E25\u0E2D\u0E01 / \u0E15\u0E31\u0E14 / \u0E27\u0E32\u0E07\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E21\u0E35\u0E43\u0E2B\u0E49\u0E1A\u0E23\u0E34\u0E01\u0E32\u0E23\u0E43\u0E19 Mozilla \u0E41\u0E25\u0E30 Firefox.\nDo \u0E04\u0E38\u0E13\u0E15\u0E49\u0E2D\u0E07\u0E01\u0E32\u0E23\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E40\u0E15\u0E34\u0E21\u0E40\u0E01\u0E35\u0E48\u0E22\u0E27\u0E01\u0E31\u0E1A\u0E1B\u0E31\u0E0D\u0E2B\u0E32\u0E19\u0E35\u0E49\u0E2B\u0E23\u0E37\u0E2D\u0E44\u0E21\u0E48?",\r
+path:"\u0E1E\u0E32\u0E17",\r
+newdocument:"\u0E04\u0E38\u0E13\u0E41\u0E19\u0E48\u0E43\u0E08\u0E2B\u0E23\u0E37\u0E2D\u0E44\u0E21\u0E48\u0E27\u0E48\u0E32\u0E15\u0E49\u0E2D\u0E07\u0E01\u0E32\u0E23\u0E25\u0E49\u0E32\u0E07\u0E40\u0E19\u0E37\u0E49\u0E2D\u0E2B\u0E32\u0E17\u0E31\u0E49\u0E07\u0E2B\u0E21\u0E14?",\r
+toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",\r
+more_colors:"\u0E2A\u0E35\u0E2D\u0E37\u0E48\u0E19\u0E46"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/th_dlg.js b/program/js/tiny_mce/themes/advanced/langs/th_dlg.js
new file mode 100644 (file)
index 0000000..606ee7f
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('th.advanced_dlg',{\r
+about_title:"\u0E40\u0E01\u0E35\u0E48\u0E22\u0E27\u0E01\u0E31\u0E1A TinyMCE",\r
+about_general:"\u0E40\u0E01\u0E35\u0E48\u0E22\u0E27\u0E01\u0E31\u0E1A\u0E40\u0E23\u0E32",\r
+about_help:"\u0E0A\u0E48\u0E27\u0E22\u0E40\u0E2B\u0E25\u0E37\u0E2D",\r
+about_license:"\u0E25\u0E34\u0E02\u0E2A\u0E34\u0E17\u0E18\u0E34\u0E4C",\r
+about_plugins:"\u0E1B\u0E25\u0E31\u0E4A\u0E01\u0E2D\u0E34\u0E19",\r
+about_plugin:"\u0E1B\u0E25\u0E31\u0E4A\u0E01\u0E2D\u0E34\u0E19",\r
+about_author:"\u0E1C\u0E39\u0E49\u0E40\u0E02\u0E35\u0E22\u0E19",\r
+about_version:"\u0E23\u0E38\u0E48\u0E19",\r
+about_loaded:"\u0E42\u0E2B\u0E25\u0E14\u0E1B\u0E25\u0E31\u0E4A\u0E01\u0E2D\u0E34\u0E19",\r
+anchor_title:"\u0E40\u0E1E\u0E34\u0E48\u0E21/\u0E41\u0E01\u0E49\u0E44\u0E02 \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E25\u0E34\u0E49\u0E07\u0E04\u0E4C",\r
+anchor_name:"\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E25\u0E34\u0E49\u0E07\u0E04\u0E4C",\r
+code_title:"\u0E41\u0E01\u0E49\u0E44\u0E02 HTML",\r
+code_wordwrap:"\u0E15\u0E31\u0E14\u0E04\u0E33",\r
+colorpicker_title:"\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E2A\u0E35",\r
+colorpicker_picker_tab:"\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E2A\u0E35",\r
+colorpicker_picker_title:"\u0E08\u0E32\u0E19\u0E2A\u0E35",\r
+colorpicker_palette_tab:"\u0E08\u0E32\u0E19\u0E2A\u0E35",\r
+colorpicker_palette_title:"\u0E08\u0E32\u0E19\u0E2A\u0E35",\r
+colorpicker_named_tab:"\u0E0A\u0E37\u0E48\u0E2D",\r
+colorpicker_named_title:"\u0E0A\u0E37\u0E48\u0E2D\u0E2A\u0E35",\r
+colorpicker_color:"\u0E2A\u0E35:",\r
+colorpicker_name:"\u0E0A\u0E37\u0E48\u0E2D:",\r
+charmap_title:"\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23\u0E17\u0E35\u0E48\u0E01\u0E33\u0E2B\u0E19\u0E14\u0E40\u0E2D\u0E07",\r
+image_title:"\u0E40\u0E1E\u0E34\u0E48\u0E21/\u0E41\u0E01\u0E49\u0E44\u0E02 \u0E23\u0E39\u0E1B",\r
+image_src:"URL \u0E23\u0E39\u0E1B",\r
+image_alt:"\u0E23\u0E32\u0E22\u0E25\u0E30\u0E2D\u0E35\u0E22\u0E14\u0E23\u0E39\u0E1B",\r
+image_list:"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E23\u0E39\u0E1B",\r
+image_border:"\u0E01\u0E23\u0E2D\u0E1A",\r
+image_dimensions:"\u0E02\u0E19\u0E32\u0E14",\r
+image_vspace:"\u0E23\u0E30\u0E22\u0E30\u0E2B\u0E48\u0E32\u0E07\u0E41\u0E19\u0E27\u0E15\u0E31\u0E49\u0E07",\r
+image_hspace:"\u0E23\u0E30\u0E22\u0E30\u0E2B\u0E48\u0E32\u0E07\u0E41\u0E19\u0E27\u0E19\u0E2D\u0E19",\r
+image_align:"\u0E15\u0E33\u0E41\u0E2B\u0E19\u0E48\u0E07\u0E08\u0E31\u0E14\u0E27\u0E32\u0E07",\r
+image_align_baseline:"\u0E40\u0E2A\u0E49\u0E19\u0E1E\u0E37\u0E49\u0E19",\r
+image_align_top:"\u0E1A\u0E19",\r
+image_align_middle:"\u0E01\u0E25\u0E32\u0E07",\r
+image_align_bottom:"\u0E25\u0E48\u0E32\u0E07",\r
+image_align_texttop:"\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E2D\u0E22\u0E39\u0E48\u0E1A\u0E19",\r
+image_align_textbottom:"\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E2D\u0E22\u0E39\u0E48\u0E25\u0E48\u0E32\u0E07",\r
+image_align_left:"\u0E0B\u0E49\u0E32\u0E22",\r
+image_align_right:"\u0E02\u0E27\u0E32",\r
+link_title:"\u0E40\u0E1E\u0E34\u0E48\u0E21/\u0E41\u0E01\u0E49\u0E44\u0E02 \u0E25\u0E34\u0E49\u0E07\u0E04\u0E4C",\r
+link_url:"\u0E25\u0E34\u0E49\u0E07\u0E04\u0E4C URL",\r
+link_target:"\u0E40\u0E1B\u0E49\u0E32\u0E2B\u0E21\u0E32\u0E22",\r
+link_target_same:"\u0E40\u0E1B\u0E34\u0E14\u0E25\u0E34\u0E49\u0E07\u0E04\u0E4C\u0E43\u0E19\u0E2B\u0E19\u0E49\u0E32\u0E15\u0E48\u0E32\u0E07\u0E40\u0E14\u0E35\u0E22\u0E27\u0E01\u0E31\u0E19",\r
+link_target_blank:"\u0E40\u0E1B\u0E34\u0E14\u0E25\u0E34\u0E49\u0E07\u0E04\u0E4C\u0E43\u0E19\u0E2B\u0E19\u0E49\u0E32\u0E15\u0E48\u0E32\u0E07\u0E43\u0E2B\u0E21\u0E48",\r
+link_titlefield:"\u0E0A\u0E37\u0E48\u0E2D",\r
+link_is_email:"URL \u0E17\u0E35\u0E48\u0E04\u0E38\u0E13\u0E1B\u0E49\u0E2D\u0E19\u0E14\u0E39\u0E40\u0E2B\u0E21\u0E37\u0E2D\u0E19\u0E27\u0E48\u0E32\u0E08\u0E30\u0E21\u0E35\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48\u0E2D\u0E35\u0E40\u0E21\u0E25\u0E2D\u0E22\u0E39\u0E48\u0E15\u0E49\u0E2D\u0E07\u0E01\u0E32\u0E23\u0E40\u0E1E\u0E34\u0E48\u0E21 mailto: \u0E19\u0E33\u0E2B\u0E19\u0E49\u0E32\u0E2B\u0E23\u0E37\u0E2D\u0E44\u0E21\u0E48 ?",\r
+link_is_external:"URL \u0E17\u0E35\u0E48\u0E04\u0E38\u0E13\u0E1B\u0E49\u0E2D\u0E19\u0E14\u0E39\u0E40\u0E2B\u0E21\u0E37\u0E2D\u0E19\u0E27\u0E48\u0E32\u0E20\u0E32\u0E22\u0E19\u0E2D\u0E01\u0E25\u0E34\u0E07\u0E04\u0E04\u0E38\u0E13\u0E15\u0E49\u0E2D\u0E07\u0E01\u0E32\u0E23\u0E40\u0E1E\u0E34\u0E48\u0E21  http:// \u0E2B\u0E23\u0E37\u0E2D\u0E44\u0E21\u0E48 ?",\r
+link_list:"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E25\u0E34\u0E49\u0E07\u0E04\u0E4C"\r
+});
\ No newline at end of file
index f89bc3277478a9c986b499c850d52621e0381317..ee82e6dd407c0c054d3d27aa1b0fa460acf68672 100755 (executable)
@@ -4,59 +4,59 @@ font_size:"Yaz\u0131 boyutu",
 fontdefault:"Yaz\u0131 tipi",\r
 block:"Bi\u00E7im",\r
 paragraph:"Paragraf",\r
-div:"B\u00F6l\u00FCm",\r
+div:"Blok",\r
 address:"Adres",\r
-pre:"\u00D6nformatl\u0131",\r
+pre:"\u00D6nceden bi\u00E7imlendirilmi\u015F",\r
 h1:"Ba\u015Fl\u0131k 1",\r
 h2:"Ba\u015Fl\u0131k 2",\r
 h3:"Ba\u015Fl\u0131k 3",\r
 h4:"Ba\u015Fl\u0131k 4",\r
 h5:"Ba\u015Fl\u0131k 5",\r
 h6:"Ba\u015Fl\u0131k 6",\r
-blockquote:"Al\u0131nt\u0131",\r
+blockquote:"Blok al\u0131nt\u0131",\r
 code:"Kod",\r
-samp:"Kod \u00F6rne\u011Fi",\r
-dt:"Tan\u0131m terimi ",\r
-dd:"Tan\u0131m a\u00E7\u0131klamas\u0131",\r
+samp:"\u00D6rnek kod",\r
+dt:"\u0130fade tan\u0131mlama ",\r
+dd:"A\u00E7\u0131klama tan\u0131mlama",\r
 bold_desc:"Kal\u0131n (Ctrl+B)",\r
-italic_desc:"E\u011Fik (Ctrl+I)",\r
-underline_desc:"Alt\u0131 \u00E7izgili (Ctrl+U)",\r
-striketrough_desc:"Ortas\u0131 \u00E7izgili",\r
-justifyleft_desc:"Sola yasla",\r
+italic_desc:"\u0130talik (Ctrl+I)",\r
+underline_desc:"Alt\u0131 \u00E7izili (Ctrl+U)",\r
+striketrough_desc:"\u00DCst\u00FC \u00E7izili",\r
+justifyleft_desc:"Sola hizala",\r
 justifycenter_desc:"Ortala",\r
-justifyright_desc:"Sa\u011Fa yasla",\r
+justifyright_desc:"Sa\u011Fa hizala",\r
 justifyfull_desc:"\u0130ki yana yasla",\r
 bullist_desc:"S\u0131ras\u0131z liste",\r
 numlist_desc:"S\u0131ral\u0131 liste",\r
-outdent_desc:"D\u0131\u015Fa kayd\u0131r",\r
-indent_desc:"\u0130\u00E7e kayd\u0131r",\r
+outdent_desc:"Girintiyi azalt",\r
+indent_desc:"Girintiyi art\u0131r",\r
 undo_desc:"Geri al (Ctrl+Z)",\r
-redo_desc:"Tekrarla (Ctrl+Y)",\r
+redo_desc:"Yinele (Ctrl+Y)",\r
 link_desc:"Ba\u011Flant\u0131 ekle/d\u00FCzenle",\r
-unlink_desc:"Ba\u011Flant\u0131y\u0131 sil",\r
+unlink_desc:"Ba\u011Flant\u0131y\u0131 kald\u0131r",\r
 image_desc:"Resim ekle/d\u00FCzenle",\r
 cleanup_desc:"Da\u011F\u0131n\u0131k kodu temizle",\r
 code_desc:"HTML Kayna\u011F\u0131n\u0131 D\u00FCzenle",\r
 sub_desc:"Altsimge",\r
 sup_desc:"\u00DCstsimge",\r
-hr_desc:"Yatay \u00E7izgi ekle",\r
-removeformat_desc:"Bi\u00E7imi kald\u0131r",\r
-custom1_desc:"\u00D6zel a\u00E7\u0131klaman\u0131z\u0131 buraya girin",\r
-forecolor_desc:"Metin rengi se\u00E7",\r
-backcolor_desc:"Arkaplan rengi se\u00E7",\r
+hr_desc:"Yatay cetvel ekle",\r
+removeformat_desc:"Bi\u00E7imi temizle",\r
+custom1_desc:"\u00D6zel a\u00E7\u0131klamalar burada",\r
+forecolor_desc:"Metin rengini se\u00E7",\r
+backcolor_desc:"Arkaplan rengini se\u00E7",\r
 charmap_desc:"\u00D6zel karakter ekle",\r
-visualaid_desc:"Y\u00F6nergeleri ve g\u00F6r\u00FCnmez elemanlar\u0131 a\u00E7/kapa",\r
-anchor_desc:"\u00C7engel noktas\u0131 ekle",\r
+visualaid_desc:"K\u0131lavuz/g\u00F6r\u00FCnmez nesneleri a\u00E7/kapat.",\r
+anchor_desc:"K\u00F6pr\u00FC ekle/d\u00FCzenle",\r
 cut_desc:"Kes",\r
 copy_desc:"Kopyala",\r
 paste_desc:"Yap\u0131\u015Ft\u0131r",\r
 image_props_desc:"Resim \u00F6zellikleri",\r
-newdocument_desc:"Yeni belge",\r
+newdocument_desc:"Bo\u015F belge",\r
 help_desc:"Yard\u0131m",\r
-blockquote_desc:"Al\u0131nt\u0131",\r
-clipboard_msg:"Kopyala/Kes/Yap\u0131\u015Ft\u0131r Mozilla ve Firefox'ta kullan\u0131lamaz.\r\nBu konuda daha fazla bilgi edinmek ister misiniz?",\r
+blockquote_desc:"Blok al\u0131nt\u0131",\r
+clipboard_msg:"Mozilla Firefox da Kes/Kopyala/Yap\u0131\u015Ft\u0131r kullan\u0131lamaz. Bu konu hakk\u0131nda daha fazla bilgi almak ister misiniz?",\r
 path:"Yol",\r
-newdocument:"T\u00FCm i\u00E7eri\u011Fi bo\u015Faltmak istedinizden emin misiniz?",\r
-toolbar_focus:"Ara\u00E7 d\u00FC\u011Fmelerine atla - Alt+Q, Edit\u00F6re atla - Alt-Z, Eleman yoluna atla - Alt-X",\r
+newdocument:"T\u00FCm i\u00E7eriklerleri temizlemek istedi\u011Finizden emin misiniz?",\r
+toolbar_focus:"Alt+Q ara\u00E7 d\u00FC\u011Fmelerine ge\u00E7. Alt+Z: Edit\u00F6re ge\u00E7. Alt+X:Elementin yoluna ge\u00E7.",\r
 more_colors:"Daha fazla renk"\r
 });
\ No newline at end of file
index 6bec44a3c7ba8bb9d60c012f2e7a8d12f9667360..c1db6f0c562730b0d4dc4e235b3b304167653666 100755 (executable)
@@ -1,51 +1,51 @@
 tinyMCE.addI18n('tr.advanced_dlg',{\r
-about_title:"TinyMCE Hakk\u0131nda",\r
+about_title:"TinyMCE hakk\u0131nda",\r
 about_general:"Hakk\u0131nda",\r
 about_help:"Yard\u0131m",\r
 about_license:"Lisans",\r
 about_plugins:"Eklentiler",\r
 about_plugin:"Eklenti",\r
 about_author:"Yazar",\r
-about_version:"S\u00FCr\u00FCm",\r
+about_version:"Versiyon",\r
 about_loaded:"Y\u00FCkl\u00FC eklentiler",\r
-anchor_title:"\u00C7engel noktas\u0131 ekle/d\u00FCzenle",\r
-anchor_name:"\u00C7engel noktas\u0131 ad\u0131",\r
+anchor_title:"K\u00F6pr\u00FC ekle/d\u00FCzenle",\r
+anchor_name:"K\u00F6pr\u00FC ad\u0131",\r
 code_title:"HTML Kaynak Edit\u00F6r\u00FC",\r
-code_wordwrap:"S\u00F6zc\u00FCk kayd\u0131r",\r
-colorpicker_title:"Bir renk se\u00E7",\r
+code_wordwrap:"Kelimeleri birlikte tut",\r
+colorpicker_title:"Renk se\u00E7",\r
 colorpicker_picker_tab:"Se\u00E7ici",\r
 colorpicker_picker_title:"Renk se\u00E7ici",\r
 colorpicker_palette_tab:"Palet",\r
-colorpicker_palette_title:"Palet renkleri",\r
-colorpicker_named_tab:"\u0130simli",\r
-colorpicker_named_title:"\u0130simli renkler",\r
+colorpicker_palette_title:"Renk paleti",\r
+colorpicker_named_tab:"Ad\u0131",\r
+colorpicker_named_title:"Renk ad\u0131",\r
 colorpicker_color:"Renk:",\r
 colorpicker_name:"\u0130sim:",\r
 charmap_title:"\u00D6zel karakter se\u00E7",\r
 image_title:"Resim ekle/d\u00FCzenle",\r
-image_src:"Resim URL",\r
-image_alt:"Resim tan\u0131m\u0131",\r
+image_src:"Resmin URL'si",\r
+image_alt:"Resim a\u00E7\u0131klamas\u0131",\r
 image_list:"Resim listesi",\r
 image_border:"Kenarl\u0131k",\r
 image_dimensions:"Boyutlar",\r
 image_vspace:"Dikey bo\u015Fluk",\r
 image_hspace:"Yatay bo\u015Fluk",\r
 image_align:"Hizalama",\r
-image_align_baseline:"Taban \u00E7izgisi",\r
+image_align_baseline:"Taban hizas\u0131",\r
 image_align_top:"\u00DCst",\r
 image_align_middle:"Orta",\r
 image_align_bottom:"Alt",\r
 image_align_texttop:"Metin \u00FCstte",\r
 image_align_textbottom:"Metin altta",\r
-image_align_left:"Sola",\r
-image_align_right:"Sa\u011Fa",\r
+image_align_left:"Sol",\r
+image_align_right:"Sa\u011F",\r
 link_title:"Ba\u011Flant\u0131 ekle/d\u00FCzenle",\r
-link_url:"Ba\u011Flant\u0131 URL",\r
+link_url:"Ba\u011Flant\u0131 URL'si",\r
 link_target:"Hedef",\r
 link_target_same:"Ba\u011Flant\u0131y\u0131 ayn\u0131 pencerede a\u00E7",\r
 link_target_blank:"Ba\u011Flant\u0131y\u0131 yeni pencerede a\u00E7",\r
 link_titlefield:"Ba\u015Fl\u0131k",\r
-link_is_email:"Girdi\u011Finiz URL bir e-posta adresi gibi g\u00F6z\u00FCk\u00FCyor, gerekli olan mailto: \u00F6nekinin eklenmesini ister misiniz?",\r
-link_is_external:"Girdi\u011Finiz URL d\u0131\u015F bir ba\u011Flant\u0131 gibi g\u00F6z\u00FCk\u00FCyor, gerekli olan http:// \u00F6nekinin eklenmesini ister misiniz?",\r
+link_is_email:"Girdi\u011Finiz URL e-posta adresi gibi g\u00F6r\u00FCn\u00FCyor; gerekli olan mailto: \u00F6nekinin eklenmesini ister misiniz? prefix?",\r
+link_is_external:"Girdi\u011Fiz URL d\u0131\u015F ba\u011Flant\u0131 gibi g\u00F6r\u00FCn\u00FCyor; gerekli olan http:// \u00F6nekinin eklenmesini ister misiniz?",\r
 link_list:"Ba\u011Flant\u0131 listesi"\r
 });
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/tw.js b/program/js/tiny_mce/themes/advanced/langs/tw.js
new file mode 100644 (file)
index 0000000..76f521f
--- /dev/null
@@ -0,0 +1,64 @@
+tinyMCE.addI18n('tw.advanced',{\r
+style_select:"\u6A23\u5F0F",\r
+font_size:"\u5B57\u9AD4\u5927\u5C0F",\r
+fontdefault:"\u5B57\u9AD4",\r
+block:"\u683C\u5F0F",\r
+paragraph:"\u6BB5\u843D",\r
+div:"DIV \u5C64",\r
+address:"\u7DB2\u5740",\r
+pre:"\u9810\u8A2D\u7DE8\u6392",\r
+h1:"\u6A19\u984C1",\r
+h2:"\u6A19\u984C2",\r
+h3:"\u6A19\u984C3",\r
+h4:"\u6A19\u984C4",\r
+h5:"\u6A19\u984C5",\r
+h6:"\u6A19\u984C6",\r
+blockquote:"\u5F15\u7528",\r
+code:"\u4EE3\u78BC",\r
+samp:"\u4EE3\u78BC\u7BC4\u4F8B",\r
+dt:"\u540D\u8A5E\u5B9A\u7FA9",\r
+dd:"\u540D\u8A5E\u89E3\u91CB",\r
+bold_desc:"\u7C97\u9AD4 (Ctrl+B)",\r
+italic_desc:"\u659C\u9AD4 (Ctrl+I)",\r
+underline_desc:"\u4E0B\u5283\u7DDA(Ctrl+U)",\r
+striketrough_desc:"\u522A\u9664\u7DDA",\r
+justifyleft_desc:"\u9760\u5DE6\u5C0D\u9F4A",\r
+justifycenter_desc:"\u5C45\u4E2D\u5C0D\u9F4A",\r
+justifyright_desc:"\u9760\u53F3\u5C0D\u9F4A",\r
+justifyfull_desc:"\u9F4A\u884C",\r
+bullist_desc:"\u7B26\u865F\u5217\u8868",\r
+numlist_desc:"\u7DE8\u865F\u5217\u8868",\r
+outdent_desc:"\u6E1B\u5C11\u7E2E\u6392",\r
+indent_desc:"\u589E\u52A0\u7E2E\u6392",\r
+undo_desc:"\u5FA9\u539F (Ctrl+Z)",\r
+redo_desc:"\u91CD\u505A (Ctrl+Y)",\r
+link_desc:"\u93C8\u7D50",\r
+unlink_desc:"\u53D6\u6D88\u93C8\u7D50",\r
+image_desc:"\u63D2\u5165/\u7DE8\u8F2F\u5716\u7247",\r
+cleanup_desc:"\u6E05\u9664\u591A\u9918\u4EE3\u78BC",\r
+code_desc:"\u7DE8\u8F2F HTML \u4EE3\u78BC",\r
+sub_desc:"\u4E0B\u6A19",\r
+sup_desc:"\u4E0A\u6A19",\r
+hr_desc:"\u63D2\u5165\u6C34\u5E73\u7DDA",\r
+removeformat_desc:"\u6E05\u9664\u6A23\u5F0F",\r
+custom1_desc:"\u5728\u6B64\u8F38\u5165\u60A8\u7684\u81EA\u5B9A\u7FA9\u63CF\u8FF0",\r
+forecolor_desc:"\u6587\u5B57\u984F\u8272",\r
+backcolor_desc:"\u80CC\u666F\u984F\u8272",\r
+charmap_desc:"\u63D2\u5165\u7279\u6B8A\u7B26\u865F",\r
+visualaid_desc:"\u8868\u683C\u6A23\u5F0F/\u96B1\u85CF\u5143\u4EF6",\r
+anchor_desc:"\u63D2\u5165/\u7DE8\u8F2F\u9328\u9EDE",\r
+cut_desc:"\u526A\u4E0B",\r
+copy_desc:"\u8907\u88FD",\r
+paste_desc:"\u8CBC\u4E0A",\r
+image_props_desc:"\u5716\u7247\u5C6C\u6027",\r
+newdocument_desc:"\u65B0\u6587\u4EF6",\r
+help_desc:"\u8AAA\u660E",\r
+blockquote_desc:"\u5F15\u7528",\r
+clipboard_msg:"\u5F88\u62B1\u6B49\uFF0C\u60A8\u7684\u700F\u89BD\u5668\u4E0D\u652F\u63F4\u8907\u88FD\u8CBC\u4E0A\u529F\u80FD",\r
+path:"\u4F4D\u7F6E",\r
+newdocument:"\u60A8\u78BA\u8A8D\u8981\u6E05\u9664\u5168\u90E8\u5167\u5BB9\u55CE\uFF1F ",\r
+toolbar_focus:"\u5DE5\u5177\u6309\u9215- Alt+Q,\u7DE8\u8F2F\u5668- Alt-Z,\u5143\u4EF6\u4F4D\u7F6E- Alt-X",\r
+more_colors:"\u66F4\u591A\u984F\u8272",\r
+link_delta_width:"40",\r
+link_delta_height:"60"\r
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/langs/tw_dlg.js b/program/js/tiny_mce/themes/advanced/langs/tw_dlg.js
new file mode 100644 (file)
index 0000000..a1b3148
--- /dev/null
@@ -0,0 +1,51 @@
+tinyMCE.addI18n('tw.advanced_dlg',{\r
+about_title:"\u95DC\u65BC TinyMCE",\r
+about_general:"\u95DC\u65BC",\r
+about_help:"\u8AAA\u660E",\r
+about_license:"\u6388\u6B0A",\r
+about_plugins:"\u5168\u90E8\u63D2\u4EF6",\r
+about_plugin:"\u63D2\u4EF6",\r
+about_author:"\u4F5C\u8005",\r
+about_version:"\u7248\u672C",\r
+about_loaded:"\u5DF2\u8F09\u5165\u7684\u63D2\u4EF6",\r
+anchor_title:"\u63D2\u5165/\u7DE8\u8F2F\u9328\u9EDE",\r
+anchor_name:"\u9328\u9EDE\u540D\u7A31",\r
+code_title:"HTML\u7DE8\u8F2F\u5668",\r
+code_wordwrap:"\u81EA\u52D5\u63DB\u884C",\r
+colorpicker_title:"\u9078\u64C7\u984F\u8272",\r
+colorpicker_picker_tab:"\u9078\u8272\u5668",\r
+colorpicker_picker_title:"\u9078\u8272\u5668",\r
+colorpicker_palette_tab:"\u8272\u7968",\r
+colorpicker_palette_title:"\u8272\u7968\u984F\u8272",\r
+colorpicker_named_tab:"\u9810\u8A2D\u7684",\r
+colorpicker_named_title:"\u9810\u8A2D\u984F\u8272",\r
+colorpicker_color:"\u984F\u8272:",\r
+colorpicker_name:"\u540D\u7A31:",\r
+charmap_title:"\u63D2\u5165\u7279\u6B8A\u7B26\u865F",\r
+image_title:"\u63D2\u5165/\u7DE8\u8F2F\u5716\u7247",\r
+image_src:"\u5716\u7247\u4F4D\u5143\u5740",\r
+image_alt:"\u8AAA\u660E",\r
+image_list:"\u5716\u7247\u5217\u8868",\r
+image_border:"\u908A\u6846",\r
+image_dimensions:"\u5C3A\u5BF8",\r
+image_vspace:"\u5782\u76F4\u9593\u8DDD",\r
+image_hspace:"\u6C34\u6E96\u9593\u8DDD",\r
+image_align:"\u5C0D\u9F4A\u65B9\u5F0F",\r
+image_align_baseline:"\u57FA\u6E96\u7DDA",\r
+image_align_top:"\u9760\u4E0A\u5C0D\u9F4A",\r
+image_align_middle:"\u5782\u76F4\u5C45\u4E2D",\r
+image_align_bottom:"\u9760\u4E0B\u5C0D\u9F4A",\r
+image_align_texttop:"\u6587\u5B57\u4E0A\u65B9",\r
+image_align_textbottom:"\u6587\u5B57\u4E0B\u65B9",\r
+image_align_left:"\u9760\u5DE6\u5C0D\u9F4A",\r
+image_align_right:"\u9760\u53F3\u5C0D\u9F4A",\r
+link_title:"\u63D2\u5165/\u7DE8\u8F2F\u93C8\u7D50",\r
+link_url:"\u93C8\u7D50\u7DB2\u5740",\r
+link_target:"\u6253\u958B\u65B9\u5F0F",\r
+link_target_same:"\u5728\u7576\u524D\u8996\u7A97\u4E2D\u6253\u958B",\r
+link_target_blank:"\u5728\u65B0\u8996\u7A97\u4E2D\u6253\u958B",\r
+link_titlefield:"\u6A19\u984C",\r
+link_is_email:"\u60A8\u8F38\u5165\u7684\u662F\u96FB\u5B50\u90F5\u4EF6\u4F4D\u5143\u5740\uFF0C\u662F\u5426\u9700\u8981\u52A0mailto: \u9996\u78BC\uFF1F ",\r
+link_is_external:"\u60A8\u8F38\u5165\u7684\u7DB2\u5740\u662F\u4E00\u500B\u5916\u90E8\u93C8\u7D50\uFF0C\u4F46\u683C\u5F0F\u4E0D\u592A\u6B63\u78BA",\r
+link_list:"\u93C8\u7D50\u5217\u8868"\r
+});
\ No newline at end of file
index 545049c7141660afb5025526ed2bad0a9e7a3743..7ab2ce949e245d35ea8a03e835273cb73ea607cf 100755 (executable)
@@ -16,8 +16,8 @@ h6:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 6",
 blockquote:"\u0426\u0438\u0442\u0430\u0442\u0430",\r
 code:"\u041A\u043E\u0434",\r
 samp:"\u041F\u0440\u0438\u043A\u043B\u0430\u0434 \u043A\u043E\u0434\u0443",\r
-dt:"\u0414\u043E\u0432\u0456\u0434\u043D\u0438\u043A \u0442\u0435\u0440\u043C\u0456\u043D ",\r
-dd:"\u0414\u043E\u0432\u0456\u0434\u043D\u0438\u043A \u043E\u043F\u0438\u0441 ",\r
+dt:"\u0414\u043E\u0432\u0456\u0434\u043D\u0438\u043A, \u0442\u0435\u0440\u043C\u0456\u043D ",\r
+dd:"\u0414\u043E\u0432\u0456\u0434\u043D\u0438\u043A, \u043E\u043F\u0438\u0441 ",\r
 bold_desc:"\u0416\u0438\u0440\u043D\u0438\u0439 (Ctrl+B)",\r
 italic_desc:"\u041A\u0443\u0440\u0441\u0438\u0432 (Ctrl+I)",\r
 underline_desc:"\u041F\u0456\u0434\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u0438\u0439 (Ctrl+U)",\r
@@ -26,7 +26,7 @@ justifyleft_desc:"\u041F\u043E \u043B\u0456\u0432\u043E\u043C\u0443 \u043A\u0440
 justifycenter_desc:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443",\r
 justifyright_desc:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
 justifyfull_desc:"\u041F\u043E \u0448\u0438\u0440\u0438\u043D\u0456",\r
-bullist_desc:"\u0421\u043F\u0438\u0441\u043E\u043A",\r
+bullist_desc:"\u041D\u0435\u043D\u0443\u043C\u0435\u0440\u043E\u0432\u0430\u043D\u0438\u0439 \u0441\u043F\u0438\u0441\u043E\u043A",\r
 numlist_desc:"\u041D\u0443\u043C\u0435\u0440\u043E\u0432\u0430\u043D\u0438\u0439 \u0441\u043F\u0438\u0441\u043E\u043A",\r
 outdent_desc:"\u0417\u043C\u0435\u043D\u0448\u0442\u0438\u0442\u0438 \u0432\u0456\u0434\u0441\u0442\u0443\u043F",\r
 indent_desc:"\u0417\u0431\u0456\u043B\u044C\u0448\u0438\u0442\u0438  \u0432\u0456\u0434\u0441\u0442\u0443\u043F",\r
@@ -35,7 +35,7 @@ redo_desc:"\u041F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u0438 (Ctrl+Y)",
 link_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438/\u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F",\r
 unlink_desc:"\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F",\r
 image_desc:"\u0414\u043E\u0434\u0430\u0442\u0438/\u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F",\r
-cleanup_desc:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0437\u0430\u0439\u0432\u044B\u0439 \u043A\u043E\u0434",\r
+cleanup_desc:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0437\u0430\u0439\u0432\u0438\u0439 \u043A\u043E\u0434",\r
 code_desc:"\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 HTML \u043A\u043E\u0434",\r
 sub_desc:"\u041D\u0438\u0436\u043D\u0456\u0439 \u0456\u043D\u0434\u0435\u043A\u0441",\r
 sup_desc:"\u0412\u0435\u0440\u0445\u043D\u0456\u0439 \u0456\u043D\u0434\u0435\u043A\u0441",\r
@@ -45,7 +45,7 @@ custom1_desc:"\u0412\u0430\u0448 \u0434\u043E\u0432\u0456\u043B\u044C\u043D\u043
 forecolor_desc:"\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u043A\u043E\u043B\u0456\u0440 \u0442\u0435\u043A\u0441\u0442\u0443",\r
 backcolor_desc:"\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u043A\u043E\u043B\u0456\u0440 \u0444\u043E\u043D\u0443",\r
 charmap_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B",\r
-visualaid_desc:"Toggle guidelines/invisible elements",\r
+visualaid_desc:"\u041F\u0435\u0440\u0435\u043C\u043A\u043D\u0443\u0442\u0438 \u043E\u0441\u043D\u043E\u0432\u043D\u0456/\u043F\u0440\u0438\u0445\u043E\u0432\u0430\u043D\u0456 \u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0438",\r
 anchor_desc:"\u0414\u043E\u0434\u0430\u0442\u0438/\u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u044F\u043A\u0456\u0440",\r
 cut_desc:"\u0412\u0438\u0440\u0456\u0437\u0430\u0442\u0438",\r
 copy_desc:"\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438",\r
@@ -56,7 +56,7 @@ help_desc:"\u0414\u043E\u043F\u043E\u043C\u043E\u0433\u0430",
 blockquote_desc:"\u0426\u0438\u0442\u0430\u0442\u0430",\r
 clipboard_msg:"\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438/\u0412\u0438\u0440\u0456\u0437\u0430\u0442\u0438/\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0456 \u0432 Mozilla \u0438 Firefox.\n\u0412\u0430\u043C \u0446\u0456\u043A\u0430\u0432\u0430 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F \u043F\u0440\u043E \u0446\u0435?",\r
 path:"\u0428\u043B\u044F\u0445",\r
-newdocument:"\u0412\u0438 \u043F\u0435\u0432\u043D\u0456, \u0449\u043E \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0441\u0435 \u0432\u0438\u0434\u0430\u043B\u0438\u0442\u0438?",\r
-toolbar_focus:"\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u044C \u043A\u043D\u043E\u043F\u043E\u043A - Alt+Q, \u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0443 - Alt-Z, \u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043D\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0448\u043B\u044F\u0445\u0443 - Alt-X",\r
+newdocument:"\u0412\u0438 \u0432\u043F\u0435\u0432\u043D\u0435\u043D\u0456, \u0449\u043E \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0441\u0435 \u0432\u0438\u0434\u0430\u043B\u0438\u0442\u0438?",\r
+toolbar_focus:"\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u044C \u043A\u043D\u043E\u043F\u043E\u043A - Alt+Q, \u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0443 - Alt-Z, \u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043E \u0448\u043B\u044F\u0445\u0443 \u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0443 - Alt-X",\r
 more_colors:"\u0411\u0456\u043B\u044C\u0448\u0435 \u043A\u043E\u043B\u044C\u043E\u0440\u0456\u0432"\r
 });
\ No newline at end of file
index d69392b11639b4a32d4ad4e23ba5a4e9fdc147c5..e7c72bb4ab98bb7e48126aa7832f9eba520e0157 100755 (executable)
@@ -3,11 +3,11 @@ about_title:"\u041F\u0440\u043E \u043F\u0440\u043E\u0434\u0443\u043A\u0442 TinyM
 about_general:"\u041F\u0440\u043E \u043F\u0440\u043E\u0434\u0443\u043A\u0442...",\r
 about_help:"\u0414\u043E\u043F\u043E\u043C\u043E\u0433\u0430",\r
 about_license:"\u041B\u0456\u0446\u0435\u043D\u0437\u0456\u044F",\r
-about_plugins:"\u041F\u043B\u0430\u0433\u0456\u043D\u0438",\r
-about_plugin:"\u041F\u043B\u0430\u0433\u0456\u043D",\r
+about_plugins:"\u0414\u043E\u0434\u0430\u0442\u043A\u0438",\r
+about_plugin:"\u0414\u043E\u0434\u0430\u0442\u043E\u043A",\r
 about_author:"\u0410\u0432\u0442\u043E\u0440",\r
 about_version:"\u0412\u0435\u0440\u0441\u0456\u044F",\r
-about_loaded:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u0456 \u043F\u043B\u0430\u0433\u0456\u043D\u0438",\r
+about_loaded:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u0456 \u0434\u043E\u0434\u0430\u0442\u043A\u0438",\r
 anchor_title:"\u0414\u043E\u0434\u0430\u0442\u0438/\u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u044F\u043A\u0456\u0440",\r
 anchor_name:"\u041D\u0430\u0437\u0432\u0430 \u044F\u043A\u043E\u0440\u044F",\r
 code_title:"\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 HTML \u043A\u043E\u0434\u0443",\r
@@ -20,18 +20,18 @@ colorpicker_palette_title:"\u041F\u0430\u043B\u0456\u0442\u0440\u0430 \u043A\u04
 colorpicker_named_tab:"\u0417\u0430 \u043D\u0430\u0437\u0432\u043E\u044E",\r
 colorpicker_named_title:"\u0417\u0430 \u043D\u0430\u0437\u0432\u043E\u044E",\r
 colorpicker_color:"\u041A\u043E\u043B\u0456\u0440:",\r
-colorpicker_name:"\u041D\u0430\u0439\u043C\u0435\u043D\u0443\u0432\u0430\u043D\u043D\u044F:",\r
+colorpicker_name:"\u041D\u0430\u0437\u0432\u0430:",\r
 charmap_title:"\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u0434\u043E\u0432\u0456\u043B\u044C\u043D\u0438\u0439 \u0441\u0438\u043C\u0432\u043E\u043B",\r
 image_title:"\u0414\u043E\u0434\u0430\u0442\u0438/\u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F",\r
 image_src:"\u0410\u0434\u0440\u0435\u0441\u0430",\r
 image_alt:"\u041E\u043F\u0438\u0441",\r
 image_list:"\u0421\u043F\u0438\u0441\u043E\u043A \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u044C",\r
-image_border:"\u0413\u0440\u0430\u043D\u0438\u0446\u044F",\r
+image_border:"\u0420\u0430\u043C\u043A\u0430",\r
 image_dimensions:"\u0420\u043E\u0437\u043C\u0456\u0440\u0438",\r
 image_vspace:"\u0412\u0435\u0440\u0442. \u0432\u0456\u0434\u0441\u0442\u0443\u043F",\r
 image_hspace:"\u0413\u043E\u0440\u0438\u0437. \u0432\u0456\u0434\u0441\u0442\u0443\u043F",\r
 image_align:"\u0412\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F",\r
-image_align_baseline:"\u041F\u043E \u0431\u0430\u0437\u043E\u0432\u0456\u0439 \u043B\u0438\u043D\u0456\u0457",\r
+image_align_baseline:"\u041F\u043E \u0431\u0430\u0437\u043E\u0432\u0456\u0439 \u043B\u0456\u043D\u0456\u0457",\r
 image_align_top:"\u041F\u043E \u0432\u0435\u0440\u0445\u043D\u044C\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
 image_align_middle:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443",\r
 image_align_bottom:"\u041F\u043E \u043D\u0438\u0436\u043D\u044C\u043E\u043C\u0443 \u043A\u0440\u0430\u044E",\r
@@ -42,10 +42,10 @@ image_align_right:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043
 link_title:"\u0414\u043E\u0434\u0430\u0442\u0438/\u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F",\r
 link_url:"\u0410\u0434\u0440\u0435\u0441\u0430 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F",\r
 link_target:"\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0432...",\r
-link_target_same:"\u0446\u044C\u043E\u043C\u0443 \u0436\u0435 \u0432\u0456\u043A\u043D\u0456",\r
+link_target_same:"\u0446\u044C\u043E\u043C\u0443 \u0436 \u0432\u0456\u043A\u043D\u0456",\r
 link_target_blank:"\u043D\u043E\u0432\u043E\u043C\u0443 \u0432\u0456\u043A\u043D\u0456",\r
 link_titlefield:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A",\r
-link_is_email:"\u0412\u0432\u0435\u0434\u0435\u043D\u0438\u0439 URL \u0441\u0445\u043E\u0436\u0438\u0439 \u043D\u0430 email \u0430\u0434\u0440\u0435\u0441\u0443, \u0432\u0438 \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0434\u043E\u0434\u0430\u0442\u0438 \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u0438\u0439 \u043F\u0440\u0435\u0444\u0456\u043A\u0441 mailto:?",\r
-link_is_external:"\u0412\u0432\u0435\u0434\u0435\u043D\u0438\u0439 URL \u0441\u0445\u043E\u0436\u0438\u0439 \u043D\u0430 \u0437\u043E\u0432\u043D\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F, \u0432\u0438 \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0434\u043E\u0434\u0430\u0442\u0438 \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u0438\u0439 \u043F\u0440\u0435\u0444\u0456\u043A\u0441 http://?",\r
+link_is_email:"\u0412\u0432\u0435\u0434\u0435\u043D\u0435 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0441\u0445\u043E\u0436\u0435 \u043D\u0430 \u0430\u0434\u0440\u0435\u0441\u0443 \u0435\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0457 \u043F\u043E\u0448\u0442\u0438, \u0432\u0438 \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0434\u043E\u0434\u0430\u0442\u0438 \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u0438\u0439 \u043F\u0440\u0435\u0444\u0456\u043A\u0441 mailto:?",\r
+link_is_external:"\u0412\u0432\u0435\u0434\u0435\u043D\u0435 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0441\u0445\u043E\u0436\u0435 \u043D\u0430 \u0437\u043E\u0432\u043D\u0456\u0448\u043D\u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F, \u0432\u0438 \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0434\u043E\u0434\u0430\u0442\u0438 \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u0438\u0439 \u043F\u0440\u0435\u0444\u0456\u043A\u0441 http://?",\r
 link_list:"\u0421\u043F\u0438\u0441\u043E\u043A \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C"\r
 });
\ No newline at end of file
index ec9402a4db3a945ee1133bd16eb6f42f9f288e7c..6e77ccd854f77c01c895afb24a43bf5306b8c08b 100755 (executable)
@@ -1,62 +1,62 @@
 tinyMCE.addI18n('vi.advanced',{\r
 style_select:"Ki\u1EC3u",\r
-font_size:"C\u1EE1 ch\u1EEF",\r
-fontdefault:"Ph\u00F4ng ch\u1EEF",\r
+font_size:"K\u00EDch th\u01B0\u1EDBc font",\r
+fontdefault:"T\u00EAn font ch\u1EEF",\r
 block:"\u0110\u1ECBnh d\u1EA1ng",\r
-paragraph:"\u0110o\u1EA1n v\u0103n b\u1EA3n",\r
-div:"Div",\r
-address:"\u0110\u1ECBa ch\u1EC9",\r
-pre:"Kh\u00F4ng \u0111\u1ECBnh d\u1EA1ng",\r
-h1:"Ti\u00EAu \u0111\u1EC1 1",\r
-h2:"Ti\u00EAu \u0111\u1EC1 2",\r
-h3:"Ti\u00EAu \u0111\u1EC1 3",\r
-h4:"Ti\u00EAu \u0111\u1EC1 4",\r
-h5:"Ti\u00EAu \u0111\u1EC1 5",\r
-h6:"Ti\u00EAu \u0111\u1EC1 6",\r
-blockquote:"\u0110\u1ECBnh d\u1EA1ng kh\u1ED1i",\r
-code:"M\u00E3",\r
-samp:"M\u00E3 v\u00ED d\u1EE5",\r
-dt:"T\u00EAn \u0111\u1ECBnh ngh\u0129a ",\r
-dd:"M\u00F4 t\u1EA3 \u0111\u1ECBnh ngh\u0129a",\r
-bold_desc:"\u0110\u1EADm (Ctrl+B)",\r
-italic_desc:"Nghi\u00EAng (Ctrl+I)",\r
+paragraph:"\u0110o\u1EA1n",\r
+div:"Th\u1EBB",\r
+address:"Th\u1EBB \u0110\u1ECBa ch\u1EC9",\r
+pre:"Th\u1EBB Ti\u1EC1n \u0111\u1ECBnh d\u1EA1ng",\r
+h1:"Th\u1EBB Heading 1",\r
+h2:"Th\u1EBB Heading 2",\r
+h3:"Th\u1EBB Heading 3",\r
+h4:"Th\u1EBB Heading 4",\r
+h5:"Th\u1EBB Heading 5",\r
+h6:"Th\u1EBB Heading 6",\r
+blockquote:"Th\u1EBB Tr\u00EDch d\u1EABn",\r
+code:"Th\u1EBB M\u00E3",\r
+samp:"Th\u1EBB M\u00E3 v\u00ED d\u1EE5",\r
+dt:"Th\u1EBB \u0110i\u1EC1u kho\u1EA3n \u0111\u1ECBnh ngh\u0129a ",\r
+dd:"Th\u1EBB M\u00F4 t\u1EA3 \u0111\u1ECBnh ngh\u0129a",\r
+bold_desc:"Ch\u1EEF \u0111\u1EADm (Ctrl+B)",\r
+italic_desc:"Ch\u1EEF nghi\u00EAng (Ctrl+I)",\r
 underline_desc:"G\u1EA1ch ch\u00E2n (Ctrl+U)",\r
-striketrough_desc:"G\u1EA1ch x\u00F3a",\r
-justifyleft_desc:"C\u0103n tr\u00E1i",\r
-justifycenter_desc:"C\u0103n gi\u1EEFa",\r
-justifyright_desc:"C\u0103n ph\u1EA3i",\r
-justifyfull_desc:"C\u0103n \u0111\u1EC1u",\r
+striketrough_desc:"G\u1EA1ch ngang",\r
+justifyleft_desc:"Canh l\u1EC1 tr\u00E1i",\r
+justifycenter_desc:"Canh gi\u1EEFa",\r
+justifyright_desc:"Canh l\u1EC1 ph\u1EA3i",\r
+justifyfull_desc:"Canh l\u1EC1 \u0111\u1EC1u",\r
 bullist_desc:"Danh s\u00E1ch",\r
-numlist_desc:"Danh s\u00E1ch th\u1EE9 t\u1EF1",\r
-outdent_desc:"Gi\u1EA3m l\u1EC1 tr\u00E1i",\r
-indent_desc:"T\u0103ng l\u1EC1 tr\u00E1i",\r
-undo_desc:"Kh\u00F4i ph\u1EE5c (Ctrl+Z)",\r
-redo_desc:"L\u1EB7p l\u1EA1i (Ctrl+Y)",\r
-link_desc:"Ch\u00E8n/thay \u0111\u1ED5i li\u00EAn k\u1EBFt",\r
-unlink_desc:"X\u00F3a li\u00EAn k\u1EBFt",\r
-image_desc:"Ch\u00E8n/s\u1EEDa h\u00ECnh \u1EA3nh",\r
+numlist_desc:"Danh s\u00E1ch c\u00F3 ch\u1EC9 s\u1ED1",\r
+outdent_desc:"V\u1EC1 \u0111\u1EA7u d\u00F2ng",\r
+indent_desc:"Th\u1EE5t \u0111\u1EA7u d\u00F2ng",\r
+undo_desc:"Tr\u1EDF v\u1EC1 (Ctrl+Z)",\r
+redo_desc:"Ti\u1EBFn t\u1EDBi (Ctrl+Y)",\r
+link_desc:"Th\u00EAm/S\u1EEDa Li\u00EAn k\u1EBFt",\r
+unlink_desc:"X\u00F3a Li\u00EAn k\u1EBFt",\r
+image_desc:"Ch\u00E8n/s\u1EEDa \u1EA3nh",\r
 cleanup_desc:"D\u1ECDn d\u1EB9p m\u00E3 l\u1ED9n x\u1ED9n",\r
-code_desc:"S\u1EEDa m\u00E3 ngu\u1ED3n HTML",\r
-sub_desc:"Subscript",\r
-sup_desc:"Superscript",\r
-hr_desc:"Ch\u00E8n thanh ngang",\r
-removeformat_desc:"X\u00F3a \u0111\u1ECBnh d\u1EA1ng",\r
-custom1_desc:"M\u00F4 t\u1EA3 c\u1EE7a b\u1EA1n \u1EDF \u0111\u00E2y",\r
+code_desc:"S\u1EEDa m\u00E3 HTML",\r
+sub_desc:"Ch\u1EC9 s\u1ED1 d\u01B0\u1EDBi d\u00F2ng",\r
+sup_desc:"Ch\u1EC9 s\u1ED1 b\u00EAn tr\u00EAn",\r
+hr_desc:"Ch\u00E8n th\u01B0\u1EDBc ngang",\r
+removeformat_desc:"Lo\u1EA1i b\u1ECF \u0111\u1ECBnh d\u1EA1ng",\r
+custom1_desc:"M\u00F4 t\u1EA3 t\u00F9y bi\u1EBFn c\u1EE7a b\u1EA1n \u1EDF \u0111\u00E2y",\r
 forecolor_desc:"Ch\u1ECDn m\u00E0u ch\u1EEF",\r
 backcolor_desc:"Ch\u1ECDn m\u00E0u n\u1EC1n",\r
-charmap_desc:"Ch\u00E8n k\u00FD t\u1EF1 \u0111\u1EB7c bi\u1EC7t",\r
-visualaid_desc:"B\u1EADt/t\u1EAFt c\u00E1c ph\u1EA7n t\u1EED \u1EA9n",\r
-anchor_desc:"Ch\u00E8n/s\u1EEDa m\u1ED1c (anchor)",\r
+charmap_desc:"Ch\u00E8n k\u00FD t\u1EF1 t\u00F9y bi\u1EBFn",\r
+visualaid_desc:"\u0110\u1EA3o c\u00E1c th\u00E0nh ph\u1EA7n h\u01B0\u1EDBng d\u1EABn ho\u1EB7c \u1EA9n",\r
+anchor_desc:"Ch\u00E8n/s\u1EEDa m\u1ECF neo",\r
 cut_desc:"C\u1EAFt",\r
 copy_desc:"Sao ch\u00E9p",\r
 paste_desc:"D\u00E1n",\r
-image_props_desc:"Thu\u1ED9c t\u00EDnh h\u00ECnh \u1EA3nh",\r
+image_props_desc:"Thu\u1ED9c t\u00EDnh \u1EA3nh",\r
 newdocument_desc:"V\u0103n b\u1EA3n m\u1EDBi",\r
-help_desc:"Gi\u00FAp \u0111\u1EE1",\r
-blockquote_desc:"\u0110\u1ECBnh d\u1EA1ng kh\u1ED1i",\r
-clipboard_msg:"Sao ch\u00E9p/C\u1EAFt/D\u00E1n kh\u00F4ng ho\u1EA1t \u0111\u1ED9ng tr\u00EAn Mozilla v\u00E0 Firefox.\nB\u1EA1n mu\u1ED1n xem th\u00EAm th\u00F4ng tin v\u1EC1 v\u1EA5n \u0111\u1EC1 n\u00E0y?",\r
-path:"D\u01B0\u1EDDng d\u1EABn",\r
-newdocument:"B\u1EA1n c\u00F3 ch\u1EAFc ch\u1EAFn mu\u1ED1n x\u00F3a t\u1EA5t c\u1EA3 n\u1ED9i dung \u0111\u00E3 so\u1EA1n?",\r
-toolbar_focus:"Nh\u1EA3y \u0111\u1EBFn thanh c\u00F4ng c\u1EE5 - Alt+Q, Nh\u1EA3y \u0111\u1EBFn \u00F4 so\u1EA1n th\u1EA3o - Alt-Z, Nh\u1EA3y \u0111\u1EBFn \u0111\u01B0\u1EDDng d\u1EABn - Alt-X",\r
-more_colors:"Nhi\u1EC1u m\u00E0u h\u01A1n"\r
+help_desc:"Tr\u1EE3 gi\u00FAp",\r
+blockquote_desc:"Blockquote",\r
+clipboard_msg:"Sao ch\u00E9p/C\u1EAFt/D\u00E1n kh\u00F4ng c\u00F3 s\u1EB5n trong Mozilla v\u00E0 Firefox.\r\n\t\t\tB\u1EA1n c\u00F3 mu\u1ED1n bi\u1EBFt th\u00EAm th\u00F4ng tin v\u1EC1 v\u1EA5n \u0111\u1EC1 n\u00E0y?",\r
+path:"\u0110\u01B0\u1EDDng d\u1EABn",\r
+newdocument:"B\u1EA1n c\u00F3 ch\u1EAFc ch\u1EAFn mu\u1ED1n x\u00F3a t\u1EA5t c\u1EA3 n\u1ED9i dung?",\r
+toolbar_focus:"Nh\u1EA3y t\u1EDBi c\u00E1c n\u00FAt c\u00F4ng c\u1EE5 - Alt+Q, T\u1EDBi tr\u00ECnh so\u1EA1n th\u1EA3o - Alt-Z, T\u1EDBi \u0111\u01B0\u1EDDng d\u1EABn c\u00E1c ph\u1EA7n t\u1EED - Alt-X",\r
+more_colors:"Th\u00EAm m\u00E0u"\r
 });
\ No newline at end of file
index 159acccb0777d0b2cba0516c80f1b1065f23f717..ccd64396e907479a975911c65048da008a3f6d86 100755 (executable)
@@ -1,51 +1,51 @@
 tinyMCE.addI18n('vi.advanced_dlg',{\r
-about_title:"Gi\u1EDBi thi\u1EC7u TinyMCE",\r
-about_general:"Gi\u1EDBi thi\u1EC7u",\r
-about_help:"Gi\u00FAp \u0111\u1EE1",\r
+about_title:"Th\u00F4ng tin v\u1EC1 TinyMCE",\r
+about_general:"Th\u00F4ng tin",\r
+about_help:"Tr\u1EE3 gi\u00FAp",\r
 about_license:"Gi\u1EA5y ph\u00E9p",\r
-about_plugins:"C\u00E1c ph\u1EA7n m\u1EDF r\u1ED9ng",\r
-about_plugin:"Ph\u1EA7n m\u1EDF r\u1ED9ng",\r
+about_plugins:"Tr\u00ECnh g\u1EAFn k\u00E8m",\r
+about_plugin:"Tr\u00ECnh g\u1EAFn k\u00E8m",\r
 about_author:"T\u00E1c gi\u1EA3",\r
 about_version:"Phi\u00EAn b\u1EA3n",\r
-about_loaded:"C\u00E1c ph\u1EA7n m\u1EDF r\u1ED9ng \u0111\u00E3 n\u1EA1p",\r
-anchor_title:"Ch\u00E8n/s\u1EEDa m\u1ED1c (anchor)",\r
-anchor_name:"T\u00EAn m\u1ED1c (anchor)",\r
-code_title:"So\u1EA1n M\u00E3 HTML",\r
-code_wordwrap:"Xu\u1ED1ng d\u00F2ng",\r
+about_loaded:"Tr\u00ECnh g\u1EAFn k\u00E8m \u0111\u00E3 n\u1EA1p",\r
+anchor_title:"Ch\u00E8n/s\u1EEDa m\u1ECF neo",\r
+anchor_name:"T\u00EAn m\u1ECF neo",\r
+code_title:"Tr\u00ECnh so\u1EA1n th\u1EA3o m\u00E3 ngu\u1ED3n HTML",\r
+code_wordwrap:"Xu\u1ED1ng d\u00F2ng t\u1EF1 \u0111\u1ED9ng",\r
 colorpicker_title:"Ch\u1ECDn m\u1ED9t m\u00E0u",\r
 colorpicker_picker_tab:"B\u1ED9 ch\u1ECDn",\r
 colorpicker_picker_title:"B\u1ED9 ch\u1ECDn m\u00E0u",\r
-colorpicker_palette_tab:"B\u1EA3ng",\r
+colorpicker_palette_tab:"B\u1EA3ng m\u00E0u",\r
 colorpicker_palette_title:"B\u1EA3ng m\u00E0u",\r
-colorpicker_named_tab:"\u0110\u00E3 c\u00F3 t\u00EAn",\r
-colorpicker_named_title:"M\u00E0u \u0111\u00E3 c\u00F3 t\u00EAn",\r
+colorpicker_named_tab:"T\u00EAn",\r
+colorpicker_named_title:"M\u00E0u \u0111\u00E3 \u0111\u1EB7t t\u00EAn",\r
 colorpicker_color:"M\u00E0u:",\r
 colorpicker_name:"T\u00EAn:",\r
-charmap_title:"Ch\u1ECDn k\u00FD t\u1EF1 \u0111\u1EB7c bi\u1EC7t",\r
-image_title:"Ch\u00E8n/s\u1EEDa h\u00ECnh \u1EA3nh",\r
-image_src:"D\u01B0\u1EDDng d\u1EABn \u0111\u1EBFn h\u00ECnh \u1EA3nh",\r
-image_alt:"M\u00F4 t\u1EA3 h\u00ECnh \u1EA3nh",\r
-image_list:"Danh s\u00E1ch h\u00ECnh \u1EA3nh",\r
+charmap_title:"Ch\u1ECDn k\u00FD t\u1EF1 t\u00F9y bi\u1EBFn",\r
+image_title:"Ch\u00E8n/s\u1EEDa \u1EA3nh",\r
+image_src:"URL \u1EA3nh",\r
+image_alt:"M\u00F4 t\u1EA3 \u1EA3nh",\r
+image_list:"Danh s\u00E1ch \u1EA3nh",\r
 image_border:"Vi\u1EC1n",\r
-image_dimensions:"K\u00EDch th\u01B0\u1EDBc",\r
+image_dimensions:"K\u00EDch th\u01B0\u1EDBng",\r
 image_vspace:"Kho\u1EA3ng c\u00E1ch d\u1ECDc",\r
 image_hspace:"Kho\u1EA3ng c\u00E1ch ngang",\r
-image_align:"C\u0103n l\u1EC1",\r
-image_align_baseline:"\u0110\u01B0\u1EDDng c\u01A1 b\u1EA3n",\r
-image_align_top:"Tr\u00EAn",\r
+image_align:"Canh l\u1EC1n",\r
+image_align_baseline:"\u0110\u01B0\u1EDDng c\u01A1 s\u1EDF",\r
+image_align_top:"Tr\u00EAn c\u00F9ng",\r
 image_align_middle:"Gi\u1EEFa",\r
-image_align_bottom:"\u0110\u00E1y",\r
-image_align_texttop:"Tr\u00EAn c\u1EE7a ch\u1EEF",\r
-image_align_textbottom:"\u0110\u00E1y c\u1EE7a ch\u1EEF",\r
+image_align_bottom:"D\u01B0\u1EDBi c\u00F9ng",\r
+image_align_texttop:"V\u0103n b\u1EA3n tr\u00EA",\r
+image_align_textbottom:"V\u0103n b\u1EA3n d\u01B0\u1EDBi",\r
 image_align_left:"Tr\u00E1i",\r
 image_align_right:"Ph\u1EA3i",\r
-link_title:"Ch\u00E8n/s\u1EEDa li\u00EAn k\u1EBFt",\r
-link_url:"Li\u00EAn k\u1EBFt",\r
+link_title:"Th\u00EAm/S\u1EEDa Li\u00EAn k\u1EBFt",\r
+link_url:"URL Li\u00EAn k\u1EBFt",\r
 link_target:"\u0110\u00EDch",\r
 link_target_same:"M\u1EDF li\u00EAn k\u1EBFt trong c\u00F9ng c\u1EEDa s\u1ED5",\r
 link_target_blank:"M\u1EDF li\u00EAn k\u1EBFt trong c\u1EEDa s\u1ED5 m\u1EDBi",\r
 link_titlefield:"Ti\u00EAu \u0111\u1EC1",\r
-link_is_email:"Li\u00EAn k\u1EBFt b\u1EA1n nh\u1EADp c\u00F3 v\u1EBB nh\u01B0 l\u00E0 m\u1ED9t \u0111\u1ECBa ch\u1EC9 email, b\u1EA1n c\u00F3 mu\u1ED1n th\u00EAm ph\u1EA7n mailto: v\u00E0o tr\u01B0\u1EDBc li\u00EAn k\u1EBFt?",\r
-link_is_external:"Li\u00EAn k\u1EBFt b\u1EA1n nh\u1EADp c\u00F3 v\u1EBB nh\u01B0 l\u00E0 m\u1ED9t trang web ngo\u00E0i, b\u1EA1n c\u00F3 mu\u1ED1n th\u00EAm ph\u1EA7n http:// v\u00E0o tr\u01B0\u1EDBc li\u00EAn k\u1EBFt?",\r
+link_is_email:"URL b\u1EA1n \u0111\u00E3 nh\u1EADp c\u00F3 v\u1EBB l\u00E0 m\u1ED9t \u0111\u1ECBa ch\u1EC9 \u0111i\u1EC7n th\u01B0, B\u1EA1n c\u00F3 mu\u1ED1n th\u00EAm ti\u1EC1n t\u1ED1 mailto?",\r
+link_is_external:"URL b\u1EA1n \u0111\u00E3 nh\u1EADp c\u00F3 v\u1EBB l\u00E0 m\u1ED9t li\u00EAn k\u1EBFt ngo\u00E0i, b\u1EA1n c\u00F3 mu\u1ED1n th\u00EAm ti\u1EC1n t\u1ED1 http://?",\r
 link_list:"Danh s\u00E1ch li\u00EAn k\u1EBFt"\r
 });
\ No newline at end of file
index 7c13265361a88431ce360f4915db0db4ec73145f..a4c32e4c41bd7797984f59b814b476f3555d602f 100755 (executable)
@@ -1,12 +1,12 @@
 tinyMCE.addI18n('zh.advanced',{\r
 style_select:"\u6837\u5F0F",\r
 font_size:"\u5B57\u4F53\u5927\u5C0F",\r
-fontdefault:"\u5B57\u578B",\r
+fontdefault:"\u5B57\u4F53",\r
 block:"\u683C\u5F0F",\r
 paragraph:"\u6BB5\u843D",\r
-div:"Div",\r
-address:"\u5730\u5740",\r
-pre:"\u539F\u59CB\u683C\u5F0F",\r
+div:"DIV \u5C42",\r
+address:"\u7F51\u5740",\r
+pre:"\u9884\u8BBE\u7F16\u6392",\r
 h1:"\u6807\u98981",\r
 h2:"\u6807\u98982",\r
 h3:"\u6807\u98983",\r
@@ -14,49 +14,51 @@ h4:"\u6807\u98984",
 h5:"\u6807\u98985",\r
 h6:"\u6807\u98986",\r
 blockquote:"\u5F15\u7528",\r
-code:"\u4EE3\u7801",\r
-samp:"\u7A0B\u5E8F\u8303\u4F8B",\r
+code:"\u539F\u59CB\u7801",\r
+samp:"\u539F\u59CB\u7801\u6837\u4F8B",\r
 dt:"\u540D\u8BCD\u5B9A\u4E49",\r
 dd:"\u540D\u8BCD\u89E3\u91CA",\r
-bold_desc:"\u7C97\u4F53(Ctrl+B)",\r
-italic_desc:"\u659C\u4F53(Ctrl+I)",\r
-underline_desc:"\u5E95\u7EBF(Ctrl+U)",\r
+bold_desc:"\u7C97\u4F53 (Ctrl+B)",\r
+italic_desc:"\u659C\u4F53 (Ctrl+I)",\r
+underline_desc:"\u4E0B\u5212\u7EBF(Ctrl+U)",\r
 striketrough_desc:"\u5220\u9664\u7EBF",\r
 justifyleft_desc:"\u9760\u5DE6\u5BF9\u9F50",\r
-justifycenter_desc:"\u5C45\u4E2D",\r
+justifycenter_desc:"\u5C45\u4E2D\u5BF9\u9F50",\r
 justifyright_desc:"\u9760\u53F3\u5BF9\u9F50",\r
-justifyfull_desc:"\u5DE6\u53F3\u5BF9\u9F50",\r
-bullist_desc:"\u9879\u76EE\u65B9\u5F0F\u5217\u8868",\r
-numlist_desc:"\u7F16\u53F7\u65B9\u5F0F\u5217\u8868",\r
+justifyfull_desc:"\u9F50\u884C",\r
+bullist_desc:"\u7B26\u53F7\u5217\u8868",\r
+numlist_desc:"\u7F16\u53F7\u5217\u8868",\r
 outdent_desc:"\u51CF\u5C11\u7F29\u8FDB",\r
 indent_desc:"\u589E\u52A0\u7F29\u8FDB",\r
-undo_desc:"\u8FD8\u539F(Ctrl+Z)",\r
-redo_desc:"\u91CD\u505A(Ctrl+Y)",\r
-link_desc:"\u63D2\u5165/\u7F16\u8F91\u94FE\u63A5",\r
-unlink_desc:"\u53D6\u6D88\u94FE\u63A5",\r
+undo_desc:"\u8FD8\u539F (Ctrl+Z)",\r
+redo_desc:"\u8FD8\u539F (Ctrl+Y)",\r
+link_desc:"\u8FDE\u7ED3",\r
+unlink_desc:"\u53D6\u6D88\u8FDE\u7ED3",\r
 image_desc:"\u63D2\u5165/\u7F16\u8F91\u56FE\u7247",\r
-cleanup_desc:"\u6E05\u9664\u5197\u7801",\r
-code_desc:"\u7F16\u8F91HTML\u539F\u59CB\u6587\u4EF6",\r
+cleanup_desc:"\u6E05\u9664\u591A\u4F59\u539F\u59CB\u7801",\r
+code_desc:"\u7F16\u8F91HTML \u539F\u59CB\u7801",\r
 sub_desc:"\u4E0B\u6807",\r
 sup_desc:"\u4E0A\u6807",\r
-hr_desc:"\u63D2\u5165\u6C34\u5E73\u5206\u5272\u7EBF",\r
+hr_desc:"\u63D2\u5165\u6C34\u5E73\u7EBF",\r
 removeformat_desc:"\u6E05\u9664\u6837\u5F0F",\r
-custom1_desc:"\u5728\u6B64\u8F93\u5165\u81EA\u8BA2\u63CF\u8FF0",\r
-forecolor_desc:"\u9009\u62E9\u6587\u5B57\u989C\u8272",\r
-backcolor_desc:"\u9009\u62E9\u80CC\u666F\u989C\u8272",\r
-charmap_desc:"\u63D2\u5165\u81EA\u5B9A\u4E49\u7B26\u53F7",\r
-visualaid_desc:"\u5207\u6362\u53EF\u89C1/\u9690\u85CF\u5143\u7D20",\r
+custom1_desc:"\u5728\u6B64\u8F93\u5165\u60A8\u7684\u81EA\u8BA2\u63CF\u8FF0",\r
+forecolor_desc:"\u6587\u5B57\u989C\u8272",\r
+backcolor_desc:"\u80CC\u666F\u989C\u8272",\r
+charmap_desc:"\u63D2\u5165\u7279\u6B8A\u7B26\u53F7",\r
+visualaid_desc:"\u8868\u683C\u6837\u5F0F/\u9690\u85CF\u5143\u4EF6",\r
 anchor_desc:"\u63D2\u5165/\u7F16\u8F91\u951A\u70B9",\r
-cut_desc:"\u526A\u5207(Ctrl+X)",\r
-copy_desc:"\u590D\u5236(Ctrl+C)",\r
-paste_desc:"\u7C98\u8D34(Ctrl+V)",\r
+cut_desc:"\u526A\u4E0B",\r
+copy_desc:"\u8907\u5236",\r
+paste_desc:"\u8D34\u4E0A",\r
 image_props_desc:"\u56FE\u7247\u5C5E\u6027",\r
-newdocument_desc:"\u65B0\u6587\u4EF6",\r
+newdocument_desc:"\u65B0\u6863\u6849",\r
 help_desc:"\u8BF4\u660E",\r
 blockquote_desc:"\u5F15\u7528",\r
-clipboard_msg:"\u590D\u5236/\u526A\u4E0B/\u8D34\u4E0A\u529F\u80FD\u5728Mozilla\u548CFirefox\u4E2D\u65E0\u6CD5\u4F7F\u7528",\r
-path:"\u8DEF\u5F84",\r
-newdocument:"\u4F60\u786E\u5B9A\u8981\u6E05\u9664\u6240\u6709\u5185\u5BB9\u5417\uFF1F ",\r
-toolbar_focus:"\u79FB\u81F3\u5DE5\u5177\u680F- Alt+Q,\u79FB\u81F3\u7F16\u8F91\u5668- Alt-Z,\u79FB\u81F3\u5143\u7D20\u8DEF\u5F84- Alt-X",\r
-more_colors:"\u66F4\u591A\u989C\u8272"\r
+clipboard_msg:"\u5F88\u62B1\u6B49\uFF0C\u60A8\u7684\u6D4F\u89C8\u5668\u4E0D\u652F\u63F4\u8907\u5236\u8D34\u4E0A\u529F\u80FD",\r
+path:"\u4F4D\u7F6E",\r
+newdocument:"\u60A8\u786E\u8BA4\u8981\u6E05\u9664\u5168\u90E8\u5185\u5BB9\u5417\uFF1F ",\r
+toolbar_focus:"\u5DE5\u5177\u6309\u94AE- Alt+Q,\u7F16\u8F91\u5668- Alt-Z,\u5143\u4EF6\u4F4D\u7F6E- Alt-X",\r
+more_colors:"\u66F4\u591A\u989C\u8272",\r
+link_delta_width:"40",\r
+link_delta_height:"60"\r
 });
\ No newline at end of file
index 04cdf8bc6c31fccf177735a5c4641dca7d8381d0..6db911a5edfe857bff2da4786639e6bdf411e76c 100755 (executable)
@@ -1,51 +1,51 @@
 tinyMCE.addI18n('zh.advanced_dlg',{\r
-about_title:"\u5173\u4E8ETinyMCE",\r
+about_title:"\u5173\u4E8E TinyMCE",\r
 about_general:"\u5173\u4E8E",\r
 about_help:"\u8BF4\u660E",\r
 about_license:"\u6388\u6743",\r
-about_plugins:"\u5916\u6302\u7EC4\u4EF6",\r
-about_plugin:"\u5916\u6302\u7EC4\u4EF6",\r
+about_plugins:"\u5168\u90E8\u5916\u6302\u7A0B\u5F0F",\r
+about_plugin:"\u5916\u6302\u7A0B\u5F0F",\r
 about_author:"\u4F5C\u8005",\r
 about_version:"\u7248\u672C",\r
-about_loaded:"\u5DF2\u52A0\u8F7D\u7684\u5916\u6302\u7EC4\u4EF6",\r
+about_loaded:"\u5DF2\u8F7D\u5165\u7684\u5916\u6302\u7A0B\u5F0F",\r
 anchor_title:"\u63D2\u5165/\u7F16\u8F91\u951A\u70B9",\r
 anchor_name:"\u951A\u70B9\u540D\u79F0",\r
-code_title:"HTML\u539F\u59CB\u7801\u7F16\u8F91\u5668",\r
+code_title:"HTML\u7F16\u8F91\u5668",\r
 code_wordwrap:"\u81EA\u52A8\u6362\u884C",\r
 colorpicker_title:"\u9009\u62E9\u989C\u8272",\r
-colorpicker_picker_tab:"\u9009\u8272\u5668",\r
-colorpicker_picker_title:"\u9009\u8272\u5668",\r
-colorpicker_palette_tab:"\u8272\u76D8",\r
-colorpicker_palette_title:"\u8272\u76D8\u989C\u8272",\r
-colorpicker_named_tab:"\u8272\u540D",\r
-colorpicker_named_title:"\u989C\u8272\u540D\u79F0",\r
-colorpicker_color:"\u989C\u8272\uFF1A",\r
-colorpicker_name:"\u540D\u79F0\uFF1A",\r
-charmap_title:"\u9009\u62E9\u81EA\u5B9A\u4E49\u5B57\u7B26\u7B26\u53F7",\r
-image_title:"\u63D2\u5165/\u7F16\u8F91\u56FE\u6863",\r
-image_src:"\u56FE\u6863URL",\r
-image_alt:"\u56FE\u6863\u8BF4\u660E",\r
-image_list:"\u56FE\u6587\u4EF6\u6E05\u5355",\r
+colorpicker_picker_tab:"\u62FE\u8272\u5668",\r
+colorpicker_picker_title:"\u62FE\u8272\u5668",\r
+colorpicker_palette_tab:"\u8272\u7968",\r
+colorpicker_palette_title:"\u8272\u7968\u989C\u8272",\r
+colorpicker_named_tab:"\u9884\u8BBE\u7684",\r
+colorpicker_named_title:"\u9884\u8BBE\u989C\u8272",\r
+colorpicker_color:"\u989C\u8272:",\r
+colorpicker_name:"\u540D\u79F0:",\r
+charmap_title:"\u63D2\u5165\u7279\u6B8A\u7B26\u53F7",\r
+image_title:"\u63D2\u5165/\u7F16\u8F91\u56FE\u7247",\r
+image_src:"\u56FE\u7247\u4F4D\u5740",\r
+image_alt:"\u8BF4\u660E",\r
+image_list:"\u56FE\u7247\u5217\u8868",\r
 image_border:"\u8FB9\u6846",\r
 image_dimensions:"\u5C3A\u5BF8",\r
 image_vspace:"\u5782\u76F4\u95F4\u8DDD",\r
 image_hspace:"\u6C34\u5E73\u95F4\u8DDD",\r
 image_align:"\u5BF9\u9F50\u65B9\u5F0F",\r
-image_align_baseline:"\u57FA\u7EBF",\r
-image_align_top:"\u7F6E\u9876\u5BF9\u9F50",\r
-image_align_middle:"\u7F6E\u4E2D",\r
-image_align_bottom:"\u7F6E\u5E95\u5BF9\u9F50",\r
+image_align_baseline:"\u57FA\u51C6\u7EBF",\r
+image_align_top:"\u9760\u4E0A\u5BF9\u9F50",\r
+image_align_middle:"\u5782\u76F4\u5C45\u4E2D",\r
+image_align_bottom:"\u9760\u4E0B\u5BF9\u9F50",\r
 image_align_texttop:"\u6587\u5B57\u4E0A\u65B9",\r
 image_align_textbottom:"\u6587\u5B57\u4E0B\u65B9",\r
 image_align_left:"\u9760\u5DE6\u5BF9\u9F50",\r
 image_align_right:"\u9760\u53F3\u5BF9\u9F50",\r
-link_title:"\u63D2\u5165/\u7F16\u8F91\u94FE\u63A5",\r
-link_url:"\u94FE\u63A5URL",\r
-link_target:"\u76EE\u6807",\r
-link_target_same:"\u76EE\u524D\u7A97\u53E3\u5F00\u542F\u94FE\u63A5",\r
-link_target_blank:"\u65B0\u7A97\u53E3\u5F00\u542F\u94FE\u63A5",\r
+link_title:"\u63D2\u5165/\u7F16\u8F91\u8FDE\u7ED3",\r
+link_url:"\u8FDE\u7ED3\u7F51\u5740",\r
+link_target:"\u6253\u5F00\u65B9\u5F0F",\r
+link_target_same:"\u5728\u5F53\u524D\u89C6\u7A97\u4E2D\u6253\u5F00",\r
+link_target_blank:"\u5728\u65B0\u89C6\u7A97\u4E2D\u6253\u5F00",\r
 link_titlefield:"\u6807\u9898",\r
-link_is_email:"\u4F60\u8F93\u5165\u7684URL\u4F3C\u4E4E\u662F\u4E00\u4E2Aemail\u5730\u5740\uFF0C\u662F\u5426\u8981\u52A0\u4E0A\u524D\u7F6E\u8BCDmailto: ?",\r
-link_is_external:"\u4F60\u8F93\u5165\u7684URL\u4F3C\u4E4E\u662F\u4E00\u4E2A\u5916\u90E8\u94FE\u63A5\uFF0C\u662F\u5426\u8981\u52A0\u4E0A\u524D\u7F6E\u8BCDhttp:// ?",\r
-link_list:"\u94FE\u63A5\u6E05\u5355"\r
+link_is_email:"\u60A8\u8F93\u5165\u7684\u662F\u7535\u5B50\u90AE\u4EF6\u4F4D\u5740\uFF0C\u662F\u5426\u9700\u8981\u52A0mailto: \u9996\u7801\uFF1F ",\r
+link_is_external:"\u60A8\u8F93\u5165\u7684\u7F51\u5740\u662F\u4E00\u4E2A\u5916\u90E8\u8FDE\u7ED3\uFF0C\u4F46\u683C\u5F0F\u4E0D\u592A\u6B63\u786E",\r
+link_list:"\u8FDE\u7ED3\u5217\u8868"\r
 });
\ No newline at end of file
index a78bd334d5ec42983537585b90c3ecba287cf908..7565b9ae8b23f0c01cd868e59a69bbaa1f0dbadc 100644 (file)
        </div>\r
 \r
        <div class="mceActionPanel">\r
-               <div style="float: left">\r
-                       <input type="submit" id="insert" name="insert" value="{#insert}" />\r
-               </div>\r
-\r
-               <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
-               </div>\r
+               <input type="submit" id="insert" name="insert" value="{#insert}" />\r
+               <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />\r
        </div>\r
 </form>\r
 </body>\r
index 19da1943bc055d2fcb4658f65f3534d0ca7cdb1b..36f38aba296a50bf8e8321df4d4b57ddc9a01c96 100644 (file)
@@ -8,8 +8,8 @@ h4 {font-size: 1em}
 h5 {font-size: .83em}\r
 h6 {font-size: .75em}\r
 .mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;}\r
-a.mceItemAnchor {width:12px; line-height:6px; overflow:hidden; padding-left:12px; background:url(img/items.gif) no-repeat bottom left;}\r
-img.mceItemAnchor {width:12px; height:12px; background:url(img/items.gif) no-repeat;}\r
+a.mceItemAnchor {display:inline-block; width:11px !important; height:11px  !important; background:url(img/items.gif) no-repeat 0 0;}\r
+td.mceSelected, th.mceSelected {background-color:#3399ff !important}\r
 img {border:0;}\r
 table {cursor:default}\r
 table td, table th {cursor:text}\r
@@ -17,7 +17,7 @@ ins {border-bottom:1px solid green; text-decoration: none; color:green}
 del {color:red; text-decoration:line-through}\r
 cite {border-bottom:1px dashed blue}\r
 acronym {border-bottom:1px dotted #CCC; cursor:help}\r
-abbr, html\:abbr {border-bottom:1px dashed #CCC; cursor:help}\r
+abbr {border-bottom:1px dashed #CCC; cursor:help}\r
 \r
 /* IE */\r
 * html body {\r
@@ -30,3 +30,6 @@ scrollbar-highlight-color:#F0F0EE;
 scrollbar-shadow-color:#F0F0EE;\r
 scrollbar-track-color:#F5F5F5;\r
 }\r
+\r
+img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px}\r
+font[face=mceinline] {font-family:inherit !important}\r
index 873c67e3c449b3a9386cee5a6f296ce45a2cdafb..f01222650e03a53bac7d07907127cf5b1bdd27f6 100644 (file)
@@ -42,10 +42,11 @@ width:94px; height:26px;
 background:url(img/buttons.png) 0 -26px;\r
 cursor:pointer;\r
 padding-bottom:2px;\r
+float:left;\r
 }\r
 \r
-#insert {background:url(img/buttons.png) 0 -52px;}\r
-#cancel {background:url(img/buttons.png) 0 0;}\r
+#insert {background:url(img/buttons.png) 0 -52px}\r
+#cancel {background:url(img/buttons.png) 0 0; float:right}\r
 \r
 /* Browse */\r
 a.pickcolor, a.browse {text-decoration:none}\r
@@ -113,4 +114,4 @@ h3 {font-size:14px;}
 #colorpicker #namedcolors {width:150px;}\r
 #colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}\r
 #colorpicker #colornamecontainer {margin-top:5px;}\r
-#colorpicker #picker_panel fieldset {margin:auto;width:325px;}
\ No newline at end of file
+#colorpicker #picker_panel fieldset {margin:auto;width:325px;}\r
index 230a2ee288dacbbe3bb029a1b442b6cc974fddfc..0049c7b3d0f1789c800954edc95986a5886acbca 100644 (file)
@@ -4,7 +4,7 @@
 .defaultSkin table td {vertical-align:middle}\r
 \r
 /* Containers */\r
-.defaultSkin table {background:#F0F0EE}\r
+.defaultSkin table {direction:ltr; background:#F0F0EE}\r
 .defaultSkin iframe {display:block; background:#FFF}\r
 .defaultSkin .mceToolbar {height:26px}\r
 .defaultSkin .mceLeft {text-align:left}\r
@@ -24,7 +24,7 @@
 .defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC}\r
 .defaultSkin .mceStatusbar {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px}\r
 .defaultSkin .mceStatusbar div {float:left; margin:2px}\r
-.defaultSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize}\r
+.defaultSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0}\r
 .defaultSkin .mceStatusbar a:hover {text-decoration:underline}\r
 .defaultSkin table.mceToolbar {margin-left:3px}\r
 .defaultSkin span.mceIcon, .defaultSkin img.mceIcon {display:block; width:20px; height:20px}\r
@@ -47,7 +47,6 @@
 .defaultSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px}\r
 \r
 /* ListBox */\r
-.defaultSkin .mceListBox {direction:ltr}\r
 .defaultSkin .mceListBox, .defaultSkin .mceListBox a {display:block}\r
 .defaultSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px solid #CCC; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden}\r
 .defaultSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px solid #CCC;}\r
@@ -63,7 +62,7 @@
 .defaultSkin .mceSplitButton {width:32px; height:20px; direction:ltr}\r
 .defaultSkin .mceSplitButton a, .defaultSkin .mceSplitButton span {height:20px; display:block}\r
 .defaultSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;}\r
-.defaultSkin .mceSplitButton span.mceAction {width:20px; background:url(../../img/icons.gif) 20px 20px;}\r
+.defaultSkin .mceSplitButton span.mceAction {width:20px; background-image:url(../../img/icons.gif);}\r
 .defaultSkin .mceSplitButton a.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0; border:1px solid #F0F0EE;}\r
 .defaultSkin .mceSplitButton span.mceOpen {display:none}\r
 .defaultSkin table.mceSplitButtonEnabled:hover a.mceAction, .defaultSkin .mceSplitButtonHover a.mceAction, .defaultSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0}\r
 /* Progress,Resize */\r
 .defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); background:#FFF}\r
 .defaultSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}\r
-.defaultSkin .mcePlaceHolder {border:1px dotted gray}\r
 \r
 /* Formats */\r
 .defaultSkin .mce_formatPreview a {font-size:10px}\r
 .defaultSkin span.mce_del {background-position:-940px -20px}\r
 .defaultSkin span.mce_ins {background-position:-960px -20px}\r
 .defaultSkin span.mce_pagebreak {background-position:0 -40px}\r
-.defaultSkin .mce_spellchecker span.mceAction {background-position:-540px -20px}\r
+.defaultSkin span.mce_restoredraft {background-position:-20px -40px}\r
+.defaultSkin span.mce_spellchecker {background-position:-540px -20px}\r
index b8431d16955cc25f3ac0dae70464178bdf2572fb..3cea5ff1ce3c296e739b37e09bbc111fc52e17bb 100644 (file)
@@ -8,8 +8,8 @@ h4 {font-size: 1em}
 h5 {font-size: .83em}\r
 h6 {font-size: .75em}\r
 .mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;}\r
-a.mceItemAnchor {width:12px; line-height:6px; overflow:hidden; padding-left:12px; background:url(../default/img/items.gif) no-repeat bottom left;}\r
-img.mceItemAnchor {width:12px; height:12px; background:url(../default/img/items.gif) no-repeat;}\r
+a.mceItemAnchor {display:inline-block; width:11px !important; height:11px  !important; background:url(../default/img/items.gif) no-repeat 0 0;}\r
+td.mceSelected, th.mceSelected {background-color:#3399ff !important}\r
 img {border:0;}\r
 table {cursor:default}\r
 table td, table th {cursor:text}\r
@@ -17,7 +17,7 @@ ins {border-bottom:1px solid green; text-decoration: none; color:green}
 del {color:red; text-decoration:line-through}\r
 cite {border-bottom:1px dashed blue}\r
 acronym {border-bottom:1px dotted #CCC; cursor:help}\r
-abbr, html\:abbr {border-bottom:1px dashed #CCC; cursor:help}\r
+abbr {border-bottom:1px dashed #CCC; cursor:help}\r
 \r
 /* IE */\r
 * html body {\r
@@ -30,3 +30,6 @@ scrollbar-highlight-color:#F0F0EE;
 scrollbar-shadow-color:#F0F0EE;\r
 scrollbar-track-color:#F5F5F5;\r
 }\r
+\r
+img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px}\r
+font[face=mceinline] {font-family:inherit !important}\r
index 6c37d6fb8395556422d93a9668f68c93f82b7b55..e3af1396e4c29259bb12be1cb0c3dd3e82f7b2da 100644 (file)
@@ -42,10 +42,11 @@ width:94px; height:26px;
 background:url(../default/img/buttons.png) 0 -26px;\r
 cursor:pointer;\r
 padding-bottom:2px;\r
+float:left;\r
 }\r
 \r
-#insert {background:url(../default/img/buttons.png) 0 -52px;}\r
-#cancel {background:url(../default/img/buttons.png) 0 0;}\r
+#insert {background:url(../default/img/buttons.png) 0 -52px}\r
+#cancel {background:url(../default/img/buttons.png) 0 0; float:right}\r
 \r
 /* Browse */\r
 a.pickcolor, a.browse {text-decoration:none}\r
index c10a3f0161f642bd3fee6da3538aaf44abefd921..a6253976afc3755ed06a2cbe6b40353f67a8b3f6 100644 (file)
@@ -21,7 +21,7 @@
 .o2k7Skin .mceIframeContainer {border-top:1px solid #ABC6DD; border-bottom:1px solid #ABC6DD}\r
 .o2k7Skin .mceStatusbar {display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px}\r
 .o2k7Skin .mceStatusbar div {float:left; padding:2px}\r
-.o2k7Skin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize}\r
+.o2k7Skin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0}\r
 .o2k7Skin .mceStatusbar a:hover {text-decoration:underline}\r
 .o2k7Skin table.mceToolbar {margin-left:3px}\r
 .o2k7Skin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; margin-left:3px;}\r
@@ -65,7 +65,7 @@
 .o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px}\r
 .o2k7Skin .mceSplitButton {background:url(img/button_bg.png)}\r
 .o2k7Skin .mceSplitButton a.mceAction {width:22px}\r
-.o2k7Skin .mceSplitButton span.mceAction {width:22px; background:url(../../img/icons.gif) 20px 20px}\r
+.o2k7Skin .mceSplitButton span.mceAction {width:22px; background-image:url(../../img/icons.gif)}\r
 .o2k7Skin .mceSplitButton a.mceOpen {width:10px; background:url(img/button_bg.png) -44px 0}\r
 .o2k7Skin .mceSplitButton span.mceOpen {display:none}\r
 .o2k7Skin table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background:url(img/button_bg.png) 0 -22px}\r
 /* Progress,Resize */\r
 .o2k7Skin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF}\r
 .o2k7Skin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}\r
-.o2k7Skin .mcePlaceHolder {border:1px dotted gray}\r
 \r
 /* Formats */\r
 .o2k7Skin .mce_formatPreview a {font-size:10px}\r
 .o2k7Skin span.mce_del {background-position:-940px -20px}\r
 .o2k7Skin span.mce_ins {background-position:-960px -20px}\r
 .o2k7Skin span.mce_pagebreak {background-position:0 -40px}\r
-.o2k7Skin .mce_spellchecker span.mceAction {background-position:-540px -20px}\r
+.o2k7Skin span.mce_restoredraft {background-position:-20px -40px}\r
+.o2k7Skin span.mce_spellchecker {background-position:-540px -20px}\r
index 553e7bb2bc734587ba964e703bd2e2374abe8b0b..5957bbd1782e4a9727f0b708b05b0b2b419cea4f 100644 (file)
@@ -1,6 +1,5 @@
 <html xmlns="http://www.w3.org/1999/xhtml">\r
 <head>\r
-       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
        <title>{#advanced_dlg.code_title}</title>\r
        <script type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
        <script type="text/javascript" src="js/source_editor.js"></script>\r
                <textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,monospace; font-size: 12px;" dir="ltr" wrap="off" class="mceFocus"></textarea>\r
 \r
                <div class="mceActionPanel">\r
-                       <div style="float: left">\r
-                               <input type="submit" name="insert" value="{#update}" id="insert" />\r
-                       </div>\r
-\r
-                       <div style="float: right">\r
-                               <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
-                       </div>\r
+                       <input type="submit" name="insert" value="{#update}" id="insert" />\r
+                       <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
                </div>\r
        </form>\r
 </body>\r
index fb0bd7893b9bfb2db17c33c309a46cbd54b0791f..4b862d49d62afec995fffba2a7ddb4fa904a5ee3 100644 (file)
@@ -1,11 +1,11 @@
 /**\r
- * $Id: editor_template_src.js 920 2008-09-09 14:05:33Z spocke $\r
+ * editor_template_src.js\r
  *\r
- * This file is meant to showcase how to create a simple theme. The advanced\r
- * theme is more suitable for production use.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 (function() {\r
index 447ea07ed55065beed55b1ee3acc555baaa05177..ced9747950bddec88d26dcc0c37fd3fe34e74e5d 100644 (file)
@@ -1 +1,362 @@
-var tinymce={majorVersion:"3",minorVersion:"2.3",releaseDate:"2009-04-23",_init:function(){var o=this,k=document,l=window,j=navigator,b=j.userAgent,h,a,g,f,e,m;o.isOpera=l.opera&&opera.buildNumber;o.isWebKit=/WebKit/.test(b);o.isIE=!o.isWebKit&&!o.isOpera&&(/MSIE/gi).test(b)&&(/Explorer/gi).test(j.appName);o.isIE6=o.isIE&&/MSIE [56]/.test(b);o.isGecko=!o.isWebKit&&/Gecko/.test(b);o.isMac=b.indexOf("Mac")!=-1;o.isAir=/adobeair/i.test(b);if(l.tinyMCEPreInit){o.suffix=tinyMCEPreInit.suffix;o.baseURL=tinyMCEPreInit.base;o.query=tinyMCEPreInit.query;return}o.suffix="";a=k.getElementsByTagName("base");for(h=0;h<a.length;h++){if(m=a[h].href){if(/^https?:\/\/[^\/]+$/.test(m)){m+="/"}f=m?m.match(/.*\//)[0]:""}}function c(d){if(d.src&&/tiny_mce(|_dev|_src|_gzip|_jquery|_prototype).js/.test(d.src)){if(/_(src|dev)\.js/g.test(d.src)){o.suffix="_src"}if((e=d.src.indexOf("?"))!=-1){o.query=d.src.substring(e+1)}o.baseURL=d.src.substring(0,d.src.lastIndexOf("/"));if(f&&o.baseURL.indexOf("://")==-1){o.baseURL=f+o.baseURL}return o.baseURL}return null}a=k.getElementsByTagName("script");for(h=0;h<a.length;h++){if(c(a[h])){return}}g=k.getElementsByTagName("head")[0];if(g){a=g.getElementsByTagName("script");for(h=0;h<a.length;h++){if(c(a[h])){return}}}return},is:function(b,a){var c=typeof(b);if(!a){return c!="undefined"}if(a=="array"&&(b.hasOwnProperty&&b instanceof Array)){return true}return c==a},each:function(d,a,c){var e,b;if(!d){return 0}c=c||d;if(typeof(d.length)!="undefined"){for(e=0,b=d.length;e<b;e++){if(a.call(c,d[e],e,d)===false){return 0}}}else{for(e in d){if(d.hasOwnProperty(e)){if(a.call(c,d[e],e,d)===false){return 0}}}}return 1},map:function(b,c){var d=[];tinymce.each(b,function(a){d.push(c(a))});return d},grep:function(b,c){var d=[];tinymce.each(b,function(a){if(!c||c(a)){d.push(a)}});return d},inArray:function(c,d){var e,b;if(c){for(e=0,b=c.length;e<b;e++){if(c[e]===d){return e}}}return -1},extend:function(f,d){var c,b=arguments;for(c=1;c<b.length;c++){d=b[c];tinymce.each(d,function(a,e){if(typeof(a)!=="undefined"){f[e]=a}})}return f},trim:function(a){return(a?""+a:"").replace(/^\s*|\s*$/g,"")},create:function(j,a){var i=this,b,e,f,g,d,h=0;j=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(j);f=j[3].match(/(^|\.)(\w+)$/i)[2];e=i.createNS(j[3].replace(/\.\w+$/,""));if(e[f]){return}if(j[2]=="static"){e[f]=a;if(this.onCreate){this.onCreate(j[2],j[3],e[f])}return}if(!a[f]){a[f]=function(){};h=1}e[f]=a[f];i.extend(e[f].prototype,a);if(j[5]){b=i.resolve(j[5]).prototype;g=j[5].match(/\.(\w+)$/i)[1];d=e[f];if(h){e[f]=function(){return b[g].apply(this,arguments)}}else{e[f]=function(){this.parent=b[g];return d.apply(this,arguments)}}e[f].prototype[f]=e[f];i.each(b,function(c,k){e[f].prototype[k]=b[k]});i.each(a,function(c,k){if(b[k]){e[f].prototype[k]=function(){this.parent=b[k];return c.apply(this,arguments)}}else{if(k!=f){e[f].prototype[k]=c}}})}i.each(a["static"],function(c,k){e[f][k]=c});if(this.onCreate){this.onCreate(j[2],j[3],e[f].prototype)}},walk:function(c,b,d,a){a=a||this;if(c){if(d){c=c[d]}tinymce.each(c,function(f,e){if(b.call(a,f,e,d)===false){return false}tinymce.walk(f,b,d,a)})}},createNS:function(d,c){var b,a;c=c||window;d=d.split(".");for(b=0;b<d.length;b++){a=d[b];if(!c[a]){c[a]={}}c=c[a]}return c},resolve:function(d,c){var b,a;c=c||window;d=d.split(".");for(b=0,a=d.length;b<a;b++){c=c[d[b]];if(!c){break}}return c},addUnload:function(e,d){var c=this,a=window;e={func:e,scope:d||this};if(!c.unloads){function b(){var f=c.unloads,h,i;if(f){for(i in f){h=f[i];if(h&&h.func){h.func.call(h.scope,1)}}if(a.detachEvent){a.detachEvent("onbeforeunload",g);a.detachEvent("onunload",b)}else{if(a.removeEventListener){a.removeEventListener("unload",b,false)}}c.unloads=h=f=a=b=0;if(window.CollectGarbage){window.CollectGarbage()}}}function g(){var h=document;if(h.readyState=="interactive"){function f(){h.detachEvent("onstop",f);if(b){b()}h=0}if(h){h.attachEvent("onstop",f)}window.setTimeout(function(){if(h){h.detachEvent("onstop",f)}},0)}}if(a.attachEvent){a.attachEvent("onunload",b);a.attachEvent("onbeforeunload",g)}else{if(a.addEventListener){a.addEventListener("unload",b,false)}}c.unloads=[e]}else{c.unloads.push(e)}return e},removeUnload:function(c){var a=this.unloads,b=null;tinymce.each(a,function(e,d){if(e&&e.func==c){a.splice(d,1);b=c;return false}});return b},explode:function(a,b){return a?tinymce.map(a.split(b||","),tinymce.trim):a},_addVer:function(b){var a;if(!this.query){return b}a=(b.indexOf("?")==-1?"?":"&")+this.query;if(b.indexOf("#")==-1){return b+a}return b.replace("#",a+"#")}};window.tinymce=tinymce;tinymce._init();tinymce.create("tinymce.util.Dispatcher",{scope:null,listeners:null,Dispatcher:function(a){this.scope=a||this;this.listeners=[]},add:function(a,b){this.listeners.push({cb:a,scope:b||this.scope});return a},addToTop:function(a,b){this.listeners.unshift({cb:a,scope:b||this.scope});return a},remove:function(a){var b=this.listeners,c=null;tinymce.each(b,function(e,d){if(a==e.cb){c=a;b.splice(d,1);return false}});return c},dispatch:function(){var f,d=arguments,e,b=this.listeners,g;for(e=0;e<b.length;e++){g=b[e];f=g.cb.apply(g.scope,d);if(f===false){break}}return f}});(function(){var a=tinymce.each;tinymce.create("tinymce.util.URI",{URI:function(e,g){var f=this,h,d,c;g=f.settings=g||{};if(/^(mailto|tel|news|javascript|about):/i.test(e)||/^\s*#/.test(e)){f.source=e;return}if(e.indexOf("/")===0&&e.indexOf("//")!==0){e=(g.base_uri?g.base_uri.protocol||"http":"http")+"://mce_host"+e}if(e.indexOf(":/")===-1&&e.indexOf("//")!==0){e=(g.base_uri.protocol||"http")+"://mce_host"+f.toAbsPath(g.base_uri.path,e)}e=e.replace(/@@/g,"(mce_at)");e=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e);a(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(b,j){var k=e[j];if(k){k=k.replace(/\(mce_at\)/g,"@@")}f[b]=k});if(c=g.base_uri){if(!f.protocol){f.protocol=c.protocol}if(!f.userInfo){f.userInfo=c.userInfo}if(!f.port&&f.host=="mce_host"){f.port=c.port}if(!f.host||f.host=="mce_host"){f.host=c.host}f.source=""}},setPath:function(c){var b=this;c=/^(.*?)\/?(\w+)?$/.exec(c);b.path=c[0];b.directory=c[1];b.file=c[2];b.source="";b.getURI()},toRelative:function(b){var c=this,d;if(b==="./"){return b}b=new tinymce.util.URI(b,{base_uri:c});if((b.host!="mce_host"&&c.host!=b.host&&b.host)||c.port!=b.port||c.protocol!=b.protocol){return b.getURI()}d=c.toRelPath(c.path,b.path);if(b.query){d+="?"+b.query}if(b.anchor){d+="#"+b.anchor}return d},toAbsolute:function(b,c){var b=new tinymce.util.URI(b,{base_uri:this});return b.getURI(this.host==b.host?c:0)},toRelPath:function(g,h){var c,f=0,d="",e,b;g=g.substring(0,g.lastIndexOf("/"));g=g.split("/");c=h.split("/");if(g.length>=c.length){for(e=0,b=g.length;e<b;e++){if(e>=c.length||g[e]!=c[e]){f=e+1;break}}}if(g.length<c.length){for(e=0,b=c.length;e<b;e++){if(e>=g.length||g[e]!=c[e]){f=e+1;break}}}if(f==1){return h}for(e=0,b=g.length-(f-1);e<b;e++){d+="../"}for(e=f-1,b=c.length;e<b;e++){if(e!=f-1){d+="/"+c[e]}else{d+=c[e]}}return d},toAbsPath:function(e,f){var c,b=0,g=[],d;d=/\/$/.test(f)?"/":"";e=e.split("/");f=f.split("/");a(e,function(h){if(h){g.push(h)}});e=g;for(c=f.length-1,g=[];c>=0;c--){if(f[c].length==0||f[c]=="."){continue}if(f[c]==".."){b++;continue}if(b>0){b--;continue}g.push(f[c])}c=e.length-b;if(c<=0){return"/"+g.reverse().join("/")+d}return"/"+e.slice(0,c).join("/")+"/"+g.reverse().join("/")+d},getURI:function(d){var c,b=this;if(!b.source||d){c="";if(!d){if(b.protocol){c+=b.protocol+"://"}if(b.userInfo){c+=b.userInfo+"@"}if(b.host){c+=b.host}if(b.port){c+=":"+b.port}}if(b.path){c+=b.path}if(b.query){c+="?"+b.query}if(b.anchor){c+="#"+b.anchor}b.source=c}return b.source}})})();(function(){var a=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(d){var b=this.get(d),c;if(b){a(b.split("&"),function(e){e=e.split("=");c=c||{};c[unescape(e[0])]=unescape(e[1])})}return c},setHash:function(j,b,g,f,i,c){var h="";a(b,function(e,d){h+=(!h?"":"&")+escape(d)+"="+escape(e)});this.set(j,h,g,f,i,c)},get:function(i){var h=document.cookie,g,f=i+"=",d;if(!h){return}d=h.indexOf("; "+f);if(d==-1){d=h.indexOf(f);if(d!=0){return null}}else{d+=2}g=h.indexOf(";",d);if(g==-1){g=h.length}return unescape(h.substring(d+f.length,g))},set:function(i,b,g,f,h,c){document.cookie=i+"="+escape(b)+((g)?"; expires="+g.toGMTString():"")+((f)?"; path="+escape(f):"")+((h)?"; domain="+h:"")+((c)?"; secure":"")},remove:function(e,b){var c=new Date();c.setTime(c.getTime()-1000);this.set(e,"",c,b,c)}})})();tinymce.create("static tinymce.util.JSON",{serialize:function(e){var c,a,d=tinymce.util.JSON.serialize,b;if(e==null){return"null"}b=typeof e;if(b=="string"){a="\bb\tt\nn\ff\rr\"\"''\\\\";return'"'+e.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g,function(g,f){c=a.indexOf(f);if(c+1){return"\\"+a.charAt(c+1)}g=f.charCodeAt().toString(16);return"\\u"+"0000".substring(g.length)+g})+'"'}if(b=="object"){if(e.hasOwnProperty&&e instanceof Array){for(c=0,a="[";c<e.length;c++){a+=(c>0?",":"")+d(e[c])}return a+"]"}a="{";for(c in e){a+=typeof e[c]!="function"?(a.length>1?',"':'"')+c+'":'+d(e[c]):""}return a+"}"}return""+e},parse:function(s){try{return eval("("+s+")")}catch(ex){}}});tinymce.create("static tinymce.util.XHR",{send:function(g){var a,e,b=window,h=0;g.scope=g.scope||this;g.success_scope=g.success_scope||g.scope;g.error_scope=g.error_scope||g.scope;g.async=g.async===false?false:true;g.data=g.data||"";function d(i){a=0;try{a=new ActiveXObject(i)}catch(c){}return a}a=b.XMLHttpRequest?new XMLHttpRequest():d("Microsoft.XMLHTTP")||d("Msxml2.XMLHTTP");if(a){if(a.overrideMimeType){a.overrideMimeType(g.content_type)}a.open(g.type||(g.data?"POST":"GET"),g.url,g.async);if(g.content_type){a.setRequestHeader("Content-Type",g.content_type)}a.send(g.data);function f(){if(!g.async||a.readyState==4||h++>10000){if(g.success&&h<10000&&a.status==200){g.success.call(g.success_scope,""+a.responseText,a,g)}else{if(g.error){g.error.call(g.error_scope,h>10000?"TIMED_OUT":"GENERAL",a,g)}}a=null}else{b.setTimeout(f,10)}}if(!g.async){return f()}e=b.setTimeout(f,10)}}});(function(){var c=tinymce.extend,b=tinymce.util.JSON,a=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(d){this.settings=c({},d);this.count=0},send:function(f){var e=f.error,d=f.success;f=c(this.settings,f);f.success=function(h,g){h=b.parse(h);if(typeof(h)=="undefined"){h={error:"JSON Parse error."}}if(h.error){e.call(f.error_scope||f.scope,h.error,g)}else{d.call(f.success_scope||f.scope,h.result)}};f.error=function(h,g){e.call(f.error_scope||f.scope,h,g)};f.data=b.serialize({id:f.id||"c"+(this.count++),method:f.method,params:f.params});f.content_type="application/json";a.send(f)},"static":{sendRPC:function(d){return new tinymce.util.JSONRequest().send(d)}}})}());(function(c){var e=c.each,b=c.is;var d=c.isWebKit,a=c.isIE;c.create("tinymce.dom.DOMUtils",{doc:null,root:null,files:null,pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,props:{"for":"htmlFor","class":"className",className:"className",checked:"checked",disabled:"disabled",maxlength:"maxLength",readonly:"readOnly",selected:"selected",value:"value",id:"id",name:"name",type:"type"},DOMUtils:function(i,g){var f=this;f.doc=i;f.win=window;f.files={};f.cssFlicker=false;f.counter=0;f.boxModel=!c.isIE||i.compatMode=="CSS1Compat";f.stdMode=i.documentMode===8;this.settings=g=c.extend({keep_values:false,hex_colors:1,process_html:1},g);if(c.isIE6){try{i.execCommand("BackgroundImageCache",false,true)}catch(h){f.cssFlicker=true}}c.addUnload(f.destroy,f)},getRoot:function(){var f=this,g=f.settings;return(g&&f.get(g.root_element))||f.doc.body},getViewPort:function(g){var h,f;g=!g?this.win:g;h=g.document;f=this.boxModel?h.documentElement:h.body;return{x:g.pageXOffset||f.scrollLeft,y:g.pageYOffset||f.scrollTop,w:g.innerWidth||f.clientWidth,h:g.innerHeight||f.clientHeight}},getRect:function(i){var h,f=this,g;i=f.get(i);h=f.getPos(i);g=f.getSize(i);return{x:h.x,y:h.y,w:g.w,h:g.h}},getSize:function(j){var g=this,f,i;j=g.get(j);f=g.getStyle(j,"width");i=g.getStyle(j,"height");if(f.indexOf("px")===-1){f=0}if(i.indexOf("px")===-1){i=0}return{w:parseInt(f)||j.offsetWidth||j.clientWidth,h:parseInt(i)||j.offsetHeight||j.clientHeight}},is:function(g,f){return c.dom.Sizzle.matches(f,g.nodeType?[g]:g).length>0},getParent:function(i,h,g){return this.getParents(i,h,g,false)},getParents:function(p,k,i,m){var h=this,g,j=h.settings,l=[];p=h.get(p);m=m===undefined;if(j.strict_root){i=i||h.getRoot()}if(b(k,"string")){g=k;if(k==="*"){k=function(f){return f.nodeType==1}}else{k=function(f){return h.is(f,g)}}}while(p){if(p==i||!p.nodeType||p.nodeType===9){break}if(!k||k(p)){if(m){l.push(p)}else{return p}}p=p.parentNode}return m?l:null},get:function(f){var g;if(f&&this.doc&&typeof(f)=="string"){g=f;f=this.doc.getElementById(f);if(f&&f.id!==g){return this.doc.getElementsByName(g)[1]}}return f},select:function(h,g){var f=this;return c.dom.Sizzle(h,f.get(g)||f.get(f.settings.root_element)||f.doc,[])},add:function(j,l,f,i,k){var g=this;return this.run(j,function(n){var m,h;m=b(l,"string")?g.doc.createElement(l):l;g.setAttribs(m,f);if(i){if(i.nodeType){m.appendChild(i)}else{g.setHTML(m,i)}}return !k?n.appendChild(m):m})},create:function(i,f,g){return this.add(this.doc.createElement(i),i,f,g,1)},createHTML:function(m,f,j){var l="",i=this,g;l+="<"+m;for(g in f){if(f.hasOwnProperty(g)){l+=" "+g+'="'+i.encode(f[g])+'"'}}if(c.is(j)){return l+">"+j+"</"+m+">"}return l+" />"},remove:function(h,f){var g=this;return this.run(h,function(m){var l,k,j;l=m.parentNode;if(!l){return null}if(f){for(j=m.childNodes.length-1;j>=0;j--){g.insertAfter(m.childNodes[j],m)}}if(g.fixPsuedoLeaks){l=m.cloneNode(true);f="IELeakGarbageBin";k=g.get(f)||g.add(g.doc.body,"div",{id:f,style:"display:none"});k.appendChild(m);k.innerHTML="";return l}return l.removeChild(m)})},setStyle:function(i,f,g){var h=this;return h.run(i,function(l){var k,j;k=l.style;f=f.replace(/-(\D)/g,function(n,m){return m.toUpperCase()});if(h.pixelStyles.test(f)&&(c.is(g,"number")||/^[\-0-9\.]+$/.test(g))){g+="px"}switch(f){case"opacity":if(a){k.filter=g===""?"":"alpha(opacity="+(g*100)+")";if(!i.currentStyle||!i.currentStyle.hasLayout){k.display="inline-block"}}k[f]=k["-moz-opacity"]=k["-khtml-opacity"]=g||"";break;case"float":a?k.styleFloat=g:k.cssFloat=g;break;default:k[f]=g||""}if(h.settings.update_styles){h.setAttrib(l,"mce_style")}})},getStyle:function(i,f,h){i=this.get(i);if(!i){return false}if(this.doc.defaultView&&h){f=f.replace(/[A-Z]/g,function(j){return"-"+j});try{return this.doc.defaultView.getComputedStyle(i,null).getPropertyValue(f)}catch(g){return null}}f=f.replace(/-(\D)/g,function(k,j){return j.toUpperCase()});if(f=="float"){f=a?"styleFloat":"cssFloat"}if(i.currentStyle&&h){return i.currentStyle[f]}return i.style[f]},setStyles:function(i,j){var g=this,h=g.settings,f;f=h.update_styles;h.update_styles=0;e(j,function(k,l){g.setStyle(i,l,k)});h.update_styles=f;if(h.update_styles){g.setAttrib(i,h.cssText)}},setAttrib:function(h,i,f){var g=this;if(!h||!i){return}if(g.settings.strict){i=i.toLowerCase()}return this.run(h,function(k){var j=g.settings;switch(i){case"style":if(!b(f,"string")){e(f,function(l,m){g.setStyle(k,m,l)});return}if(j.keep_values){if(f&&!g._isRes(f)){k.setAttribute("mce_style",f,2)}else{k.removeAttribute("mce_style",2)}}k.style.cssText=f;break;case"class":k.className=f||"";break;case"src":case"href":if(j.keep_values){if(j.url_converter){f=j.url_converter.call(j.url_converter_scope||g,f,i,k)}g.setAttrib(k,"mce_"+i,f,2)}break;case"shape":k.setAttribute("mce_style",f);break}if(b(f)&&f!==null&&f.length!==0){k.setAttribute(i,""+f,2)}else{k.removeAttribute(i,2)}})},setAttribs:function(g,h){var f=this;return this.run(g,function(i){e(h,function(j,k){f.setAttrib(i,k,j)})})},getAttrib:function(i,j,h){var f,g=this;i=g.get(i);if(!i||i.nodeType!==1){return false}if(!b(h)){h=""}if(/^(src|href|style|coords|shape)$/.test(j)){f=i.getAttribute("mce_"+j);if(f){return f}}if(a&&g.props[j]){f=i[g.props[j]];f=f&&f.nodeValue?f.nodeValue:f}if(!f){f=i.getAttribute(j,2)}if(j==="style"){f=f||i.style.cssText;if(f){f=g.serializeStyle(g.parseStyle(f));if(g.settings.keep_values&&!g._isRes(f)){i.setAttribute("mce_style",f)}}}if(d&&j==="class"&&f){f=f.replace(/(apple|webkit)\-[a-z\-]+/gi,"")}if(a){switch(j){case"rowspan":case"colspan":if(f===1){f=""}break;case"size":if(f==="+0"||f===20||f===0){f=""}break;case"width":case"height":case"vspace":case"checked":case"disabled":case"readonly":if(f===0){f=""}break;case"hspace":if(f===-1){f=""}break;case"maxlength":case"tabindex":if(f===32768||f===2147483647||f==="32768"){f=""}break;case"multiple":case"compact":case"noshade":case"nowrap":if(f===65535){return j}return h;case"shape":f=f.toLowerCase();break;default:if(j.indexOf("on")===0&&f){f=(""+f).replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/,"$1")}}}return(f!==undefined&&f!==null&&f!=="")?""+f:h},getPos:function(m,i){var g=this,f=0,l=0,j,k=g.doc,h;m=g.get(m);i=i||k.body;if(m){if(a&&!g.stdMode){m=m.getBoundingClientRect();j=g.boxModel?k.documentElement:k.body;f=g.getStyle(g.select("html")[0],"borderWidth");f=(f=="medium"||g.boxModel&&!g.isIE6)&&2||f;m.top+=g.win.self!=g.win.top?2:0;return{x:m.left+j.scrollLeft-f,y:m.top+j.scrollTop-f}}h=m;while(h&&h!=i&&h.nodeType){f+=h.offsetLeft||0;l+=h.offsetTop||0;h=h.offsetParent}h=m.parentNode;while(h&&h!=i&&h.nodeType){f-=h.scrollLeft||0;l-=h.scrollTop||0;h=h.parentNode}}return{x:f,y:l}},parseStyle:function(h){var i=this,j=i.settings,k={};if(!h){return k}function f(w,q,v){var o,u,m,n;o=k[w+"-top"+q];if(!o){return}u=k[w+"-right"+q];if(o!=u){return}m=k[w+"-bottom"+q];if(u!=m){return}n=k[w+"-left"+q];if(m!=n){return}k[v]=n;delete k[w+"-top"+q];delete k[w+"-right"+q];delete k[w+"-bottom"+q];delete k[w+"-left"+q]}function g(n,m,l,p){var o;o=k[m];if(!o){return}o=k[l];if(!o){return}o=k[p];if(!o){return}k[n]=k[m]+" "+k[l]+" "+k[p];delete k[m];delete k[l];delete k[p]}h=h.replace(/&(#?[a-z0-9]+);/g,"&$1_MCE_SEMI_");e(h.split(";"),function(m){var l,n=[];if(m){m=m.replace(/_MCE_SEMI_/g,";");m=m.replace(/url\([^\)]+\)/g,function(o){n.push(o);return"url("+n.length+")"});m=m.split(":");l=c.trim(m[1]);l=l.replace(/url\(([^\)]+)\)/g,function(p,o){return n[parseInt(o)-1]});l=l.replace(/rgb\([^\)]+\)/g,function(o){return i.toHex(o)});if(j.url_converter){l=l.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g,function(o,p){return"url("+j.url_converter.call(j.url_converter_scope||i,i.decode(p),"style",null)+")"})}k[c.trim(m[0]).toLowerCase()]=l}});f("border","","border");f("border","-width","border-width");f("border","-color","border-color");f("border","-style","border-style");f("padding","","padding");f("margin","","margin");g("border","border-width","border-style","border-color");if(a){if(k.border=="medium none"){k.border=""}}return k},serializeStyle:function(g){var f="";e(g,function(i,h){if(h&&i){if(c.isGecko&&h.indexOf("-moz-")===0){return}switch(h){case"color":case"background-color":i=i.toLowerCase();break}f+=(f?" ":"")+h+": "+i+";"}});return f},loadCSS:function(f){var g=this,h=g.doc;if(!f){f=""}e(f.split(","),function(i){if(g.files[i]){return}g.files[i]=true;g.add(g.select("head")[0],"link",{rel:"stylesheet",href:c._addVer(i)})})},addClass:function(f,g){return this.run(f,function(h){var i;if(!g){return 0}if(this.hasClass(h,g)){return h.className}i=this.removeClass(h,g);return h.className=(i!=""?(i+" "):"")+g})},removeClass:function(h,i){var f=this,g;return f.run(h,function(k){var j;if(f.hasClass(k,i)){if(!g){g=new RegExp("(^|\\s+)"+i+"(\\s+|$)","g")}j=k.className.replace(g," ");return k.className=c.trim(j!=" "?j:"")}return k.className})},hasClass:function(g,f){g=this.get(g);if(!g||!f){return false}return(" "+g.className+" ").indexOf(" "+f+" ")!==-1},show:function(f){return this.setStyle(f,"display","block")},hide:function(f){return this.setStyle(f,"display","none")},isHidden:function(f){f=this.get(f);return !f||f.style.display=="none"||this.getStyle(f,"display")=="none"},uniqueId:function(f){return(!f?"mce_":f)+(this.counter++)},setHTML:function(i,g){var f=this;return this.run(i,function(m){var h,k,j,q,l,h;g=f.processHTML(g);if(a){function o(){try{m.innerHTML="<br />"+g;m.removeChild(m.firstChild)}catch(n){while(m.firstChild){m.firstChild.removeNode()}h=f.create("div");h.innerHTML="<br />"+g;e(h.childNodes,function(r,p){if(p){m.appendChild(r)}})}}if(f.settings.fix_ie_paragraphs){g=g.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi,'<p$1 mce_keep="true">&nbsp;</p>')}o();if(f.settings.fix_ie_paragraphs){j=m.getElementsByTagName("p");for(k=j.length-1,h=0;k>=0;k--){q=j[k];if(!q.hasChildNodes()){if(!q.mce_keep){h=1;break}q.removeAttribute("mce_keep")}}}if(h){g=g.replace(/<p ([^>]+)>|<p>/g,'<div $1 mce_tmp="1">');g=g.replace(/<\/p>/g,"</div>");o();if(f.settings.fix_ie_paragraphs){j=m.getElementsByTagName("DIV");for(k=j.length-1;k>=0;k--){q=j[k];if(q.mce_tmp){l=f.doc.createElement("p");q.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi,function(p,n){var r;if(n!=="mce_tmp"){r=q.getAttribute(n);if(!r&&n==="class"){r=q.className}l.setAttribute(n,r)}});for(h=0;h<q.childNodes.length;h++){l.appendChild(q.childNodes[h].cloneNode(true))}q.swapNode(l)}}}}}else{m.innerHTML=g}return g})},processHTML:function(j){var g=this,i=g.settings;if(!i.process_html){return j}if(c.isGecko){j=j.replace(/<(\/?)strong>|<strong( [^>]+)>/gi,"<$1b$2>");j=j.replace(/<(\/?)em>|<em( [^>]+)>/gi,"<$1i$2>")}else{if(a){j=j.replace(/&apos;/g,"&#39;");j=j.replace(/\s+(disabled|checked|readonly|selected)\s*=\s*[\"\']?(false|0)[\"\']?/gi,"")}}j=j.replace(/<a( )([^>]+)\/>|<a\/>/gi,"<a$1$2></a>");if(i.keep_values){if(/<script|style/.test(j)){function f(h){h=h.replace(/(<!--\[CDATA\[|\]\]-->)/g,"\n");h=h.replace(/^[\r\n]*|[\r\n]*$/g,"");h=h.replace(/^\s*(\/\/\s*<!--|\/\/\s*<!\[CDATA\[|<!--|<!\[CDATA\[)[\r\n]*/g,"");h=h.replace(/\s*(\/\/\s*\]\]>|\/\/\s*-->|\]\]>|-->|\]\]-->)\s*$/g,"");return h}j=j.replace(/<script([^>]+|)>([\s\S]*?)<\/script>/g,function(l,k,h){h=f(h);if(!k){k=' type="text/javascript"'}if(h){h="<!--\n"+h+"\n// -->"}return"<mce:script"+k+">"+h+"</mce:script>"});j=j.replace(/<style([^>]+|)>([\s\S]*?)<\/style>/g,function(l,k,h){h=f(h);return"<mce:style"+k+"><!--\n"+h+"\n--></mce:style><style"+k+' mce_bogus="1">'+h+"</style>"})}j=j.replace(/<!\[CDATA\[([\s\S]+)\]\]>/g,"<!--[CDATA[$1]]-->");j=j.replace(/<([\w:]+) [^>]*(src|href|style|shape|coords)[^>]*>/gi,function(h,l){function k(o,n,q){var p=q;if(h.indexOf("mce_"+n)!=-1){return o}if(n=="style"){if(g._isRes(q)){return o}if(i.hex_colors){p=p.replace(/rgb\([^\)]+\)/g,function(m){return g.toHex(m)})}if(i.url_converter){p=p.replace(/url\([\'\"]?([^\)\'\"]+)\)/g,function(m,r){return"url("+g.encode(i.url_converter.call(i.url_converter_scope||g,g.decode(r),n,l))+")"})}}else{if(n!="coords"&&n!="shape"){if(i.url_converter){p=g.encode(i.url_converter.call(i.url_converter_scope||g,g.decode(q),n,l))}}}return" "+n+'="'+q+'" mce_'+n+'="'+p+'"'}h=h.replace(/ (src|href|style|coords|shape)=[\"]([^\"]+)[\"]/gi,k);h=h.replace(/ (src|href|style|coords|shape)=[\']([^\']+)[\']/gi,k);return h.replace(/ (src|href|style|coords|shape)=([^\s\"\'>]+)/gi,k)})}return j},getOuterHTML:function(f){var g;f=this.get(f);if(!f){return null}if(f.outerHTML!==undefined){return f.outerHTML}g=(f.ownerDocument||this.doc).createElement("body");g.appendChild(f.cloneNode(true));return g.innerHTML},setOuterHTML:function(i,g,j){var f=this;return this.run(i,function(h){var l,k;h=f.get(h);j=j||h.ownerDocument||f.doc;if(a&&h.nodeType==1){h.outerHTML=g}else{k=j.createElement("body");k.innerHTML=g;l=k.lastChild;while(l){f.insertAfter(l.cloneNode(true),h);l=l.previousSibling}f.remove(h)}})},decode:function(g){var h,i,f;if(/&[^;]+;/.test(g)){h=this.doc.createElement("div");h.innerHTML=g;i=h.firstChild;f="";if(i){do{f+=i.nodeValue}while(i.nextSibling)}return f||g}return g},encode:function(f){return f?(""+f).replace(/[<>&\"]/g,function(h,g){switch(h){case"&":return"&amp;";case'"':return"&quot;";case"<":return"&lt;";case">":return"&gt;"}return h}):f},insertAfter:function(h,g){var f=this;g=f.get(g);return this.run(h,function(k){var j,i;j=g.parentNode;i=g.nextSibling;if(i){j.insertBefore(k,i)}else{j.appendChild(k)}return k})},isBlock:function(f){if(f.nodeType&&f.nodeType!==1){return false}f=f.nodeName||f;return/^(H[1-6]|HR|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TR|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP)$/.test(f)},replace:function(i,h,f){var g=this;if(b(h,"array")){i=i.cloneNode(true)}return g.run(h,function(j){if(f){e(j.childNodes,function(k){i.appendChild(k.cloneNode(true))})}if(g.fixPsuedoLeaks&&j.nodeType===1){j.parentNode.insertBefore(i,j);g.remove(j);return i}return j.parentNode.replaceChild(i,j)})},findCommonAncestor:function(h,f){var i=h,g;while(i){g=f;while(g&&i!=g){g=g.parentNode}if(i==g){break}i=i.parentNode}if(!i&&h.ownerDocument){return h.ownerDocument.documentElement}return i},toHex:function(f){var h=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(f);function g(i){i=parseInt(i).toString(16);return i.length>1?i:"0"+i}if(h){f="#"+g(h[1])+g(h[2])+g(h[3]);return f}return f},getClasses:function(){var l=this,g=[],k,m={},n=l.settings.class_filter,j;if(l.classes){return l.classes}function o(f){e(f.imports,function(i){o(i)});e(f.cssRules||f.rules,function(i){switch(i.type||1){case 1:if(i.selectorText){e(i.selectorText.split(","),function(p){p=p.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(p)||!/\.[\w\-]+$/.test(p)){return}j=p;p=p.replace(/.*\.([a-z0-9_\-]+).*/i,"$1");if(n&&!(p=n(p,j))){return}if(!m[p]){g.push({"class":p});m[p]=1}})}break;case 3:o(i.styleSheet);break}})}try{e(l.doc.styleSheets,o)}catch(h){}if(g.length>0){l.classes=g}return g},run:function(j,i,h){var g=this,k;if(g.doc&&typeof(j)==="string"){j=g.get(j)}if(!j){return false}h=h||this;if(!j.nodeType&&(j.length||j.length===0)){k=[];e(j,function(l,f){if(l){if(typeof(l)=="string"){l=g.doc.getElementById(l)}k.push(i.call(h,l,f))}});return k}return i.call(h,j)},getAttribs:function(g){var f;g=this.get(g);if(!g){return[]}if(a){f=[];if(g.nodeName=="OBJECT"){return g.attributes}g.cloneNode(false).outerHTML.replace(/([a-z0-9\:\-_]+)=/gi,function(i,h){f.push({specified:1,nodeName:h})});return f}return g.attributes},destroy:function(g){var f=this;f.win=f.doc=f.root=null;if(!g){c.removeUnload(f.destroy)}},createRng:function(){var f=this.doc;return f.createRange?f.createRange():new c.dom.Range(this)},split:function(k,j,n){var o=this,f=o.createRng(),l,i,m;function g(q,p){q=q[p];if(q&&q[p]&&q[p].nodeType==1&&h(q[p])){o.remove(q[p])}}function h(p){p=o.getOuterHTML(p);p=p.replace(/<(img|hr|table)/gi,"-");p=p.replace(/<[^>]+>/g,"");return p.replace(/[ \t\r\n]+|&nbsp;|&#160;/g,"")==""}if(k&&j){f.setStartBefore(k);f.setEndBefore(j);l=f.extractContents();f=o.createRng();f.setStartAfter(j);f.setEndAfter(k);i=f.extractContents();m=k.parentNode;g(l,"lastChild");if(!h(l)){m.insertBefore(l,k)}if(n){m.replaceChild(n,j)}else{m.insertBefore(j,k)}g(i,"firstChild");if(!h(i)){m.insertBefore(i,k)}o.remove(k);return n||j}},_isRes:function(f){return/^(top|left|bottom|right|width|height)/i.test(f)||/;\s*(top|left|bottom|right|width|height)/i.test(f)}});c.DOM=new c.dom.DOMUtils(document,{process_html:0})})(tinymce);(function(f){var h=0,c=1,e=2,d=tinymce.extend;function g(m,k){var j,l;if(m.parentNode!=k){return -1}for(l=k.firstChild,j=0;l!=m;l=l.nextSibling){j++}return j}function b(k){var j=0;while(k.previousSibling){j++;k=k.previousSibling}return j}function i(j,k){var l;if(j.nodeType==3){return j}if(k<0){return j}l=j.firstChild;while(l!=null&&k>0){--k;l=l.nextSibling}if(l!=null){return l}return j}function a(k){var j=k.doc;d(this,{dom:k,startContainer:j,startOffset:0,endContainer:j,endOffset:0,collapsed:true,commonAncestorContainer:j,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3})}d(a.prototype,{setStart:function(k,j){this._setEndPoint(true,k,j)},setEnd:function(k,j){this._setEndPoint(false,k,j)},setStartBefore:function(j){this.setStart(j.parentNode,b(j))},setStartAfter:function(j){this.setStart(j.parentNode,b(j)+1)},setEndBefore:function(j){this.setEnd(j.parentNode,b(j))},setEndAfter:function(j){this.setEnd(j.parentNode,b(j)+1)},collapse:function(k){var j=this;if(k){j.endContainer=j.startContainer;j.endOffset=j.startOffset}else{j.startContainer=j.endContainer;j.startOffset=j.endOffset}j.collapsed=true},selectNode:function(j){this.setStartBefore(j);this.setEndAfter(j)},selectNodeContents:function(j){this.setStart(j,0);this.setEnd(j,j.nodeType===1?j.childNodes.length:j.nodeValue.length)},compareBoundaryPoints:function(m,n){var l=this,p=l.startContainer,o=l.startOffset,k=l.endContainer,j=l.endOffset;if(m===0){return l._compareBoundaryPoints(p,o,p,o)}if(m===1){return l._compareBoundaryPoints(p,o,k,j)}if(m===2){return l._compareBoundaryPoints(k,j,k,j)}if(m===3){return l._compareBoundaryPoints(k,j,p,o)}},deleteContents:function(){this._traverse(e)},extractContents:function(){return this._traverse(h)},cloneContents:function(){return this._traverse(c)},insertNode:function(m){var j=this,l,k;if(m.nodeType===3||m.nodeType===4){l=j.startContainer.splitText(j.startOffset);j.startContainer.parentNode.insertBefore(m,l)}else{if(j.startContainer.childNodes.length>0){k=j.startContainer.childNodes[j.startOffset]}j.startContainer.insertBefore(m,k)}},surroundContents:function(l){var j=this,k=j.extractContents();j.insertNode(l);l.appendChild(k);j.selectNode(l)},cloneRange:function(){var j=this;return d(new a(j.dom),{startContainer:j.startContainer,startOffset:j.startOffset,endContainer:j.endContainer,endOffset:j.endOffset,collapsed:j.collapsed,commonAncestorContainer:j.commonAncestorContainer})},_isCollapsed:function(){return(this.startContainer==this.endContainer&&this.startOffset==this.endOffset)},_compareBoundaryPoints:function(m,p,k,o){var q,l,j,r,t,s;if(m==k){if(p==o){return 0}else{if(p<o){return -1}else{return 1}}}q=k;while(q&&q.parentNode!=m){q=q.parentNode}if(q){l=0;j=m.firstChild;while(j!=q&&l<p){l++;j=j.nextSibling}if(p<=l){return -1}else{return 1}}q=m;while(q&&q.parentNode!=k){q=q.parentNode}if(q){l=0;j=k.firstChild;while(j!=q&&l<o){l++;j=j.nextSibling}if(l<o){return -1}else{return 1}}r=this.dom.findCommonAncestor(m,k);t=m;while(t&&t.parentNode!=r){t=t.parentNode}if(!t){t=r}s=k;while(s&&s.parentNode!=r){s=s.parentNode}if(!s){s=r}if(t==s){return 0}j=r.firstChild;while(j){if(j==t){return -1}if(j==s){return 1}j=j.nextSibling}},_setEndPoint:function(k,q,p){var l=this,j,m;if(k){l.startContainer=q;l.startOffset=p}else{l.endContainer=q;l.endOffset=p}j=l.endContainer;while(j.parentNode){j=j.parentNode}m=l.startContainer;while(m.parentNode){m=m.parentNode}if(m!=j){l.collapse(k)}else{if(l._compareBoundaryPoints(l.startContainer,l.startOffset,l.endContainer,l.endOffset)>0){l.collapse(k)}}l.collapsed=l._isCollapsed();l.commonAncestorContainer=l.dom.findCommonAncestor(l.startContainer,l.endContainer)},_traverse:function(r){var s=this,q,m=0,v=0,k,o,l,n,j,u;if(s.startContainer==s.endContainer){return s._traverseSameContainer(r)}for(q=s.endContainer,k=q.parentNode;k!=null;q=k,k=k.parentNode){if(k==s.startContainer){return s._traverseCommonStartContainer(q,r)}++m}for(q=s.startContainer,k=q.parentNode;k!=null;q=k,k=k.parentNode){if(k==s.endContainer){return s._traverseCommonEndContainer(q,r)}++v}o=v-m;l=s.startContainer;while(o>0){l=l.parentNode;o--}n=s.endContainer;while(o<0){n=n.parentNode;o++}for(j=l.parentNode,u=n.parentNode;j!=u;j=j.parentNode,u=u.parentNode){l=j;n=u}return s._traverseCommonAncestors(l,n,r)},_traverseSameContainer:function(o){var r=this,q,u,j,k,l,p,m;if(o!=e){q=r.dom.doc.createDocumentFragment()}if(r.startOffset==r.endOffset){return q}if(r.startContainer.nodeType==3){u=r.startContainer.nodeValue;j=u.substring(r.startOffset,r.endOffset);if(o!=c){r.startContainer.deleteData(r.startOffset,r.endOffset-r.startOffset);r.collapse(true)}if(o==e){return null}q.appendChild(r.dom.doc.createTextNode(j));return q}k=i(r.startContainer,r.startOffset);l=r.endOffset-r.startOffset;while(l>0){p=k.nextSibling;m=r._traverseFullySelected(k,o);if(q){q.appendChild(m)}--l;k=p}if(o!=c){r.collapse(true)}return q},_traverseCommonStartContainer:function(j,p){var s=this,r,k,l,m,q,o;if(p!=e){r=s.dom.doc.createDocumentFragment()}k=s._traverseRightBoundary(j,p);if(r){r.appendChild(k)}l=g(j,s.startContainer);m=l-s.startOffset;if(m<=0){if(p!=c){s.setEndBefore(j);s.collapse(false)}return r}k=j.previousSibling;while(m>0){q=k.previousSibling;o=s._traverseFullySelected(k,p);if(r){r.insertBefore(o,r.firstChild)}--m;k=q}if(p!=c){s.setEndBefore(j);s.collapse(false)}return r},_traverseCommonEndContainer:function(m,p){var s=this,r,o,j,k,q,l;if(p!=e){r=s.dom.doc.createDocumentFragment()}j=s._traverseLeftBoundary(m,p);if(r){r.appendChild(j)}o=g(m,s.endContainer);++o;k=s.endOffset-o;j=m.nextSibling;while(k>0){q=j.nextSibling;l=s._traverseFullySelected(j,p);if(r){r.appendChild(l)}--k;j=q}if(p!=c){s.setStartAfter(m);s.collapse(true)}return r},_traverseCommonAncestors:function(p,j,s){var w=this,l,v,o,q,r,k,u,m;if(s!=e){v=w.dom.doc.createDocumentFragment()}l=w._traverseLeftBoundary(p,s);if(v){v.appendChild(l)}o=p.parentNode;q=g(p,o);r=g(j,o);++q;k=r-q;u=p.nextSibling;while(k>0){m=u.nextSibling;l=w._traverseFullySelected(u,s);if(v){v.appendChild(l)}u=m;--k}l=w._traverseRightBoundary(j,s);if(v){v.appendChild(l)}if(s!=c){w.setStartAfter(p);w.collapse(true)}return v},_traverseRightBoundary:function(p,q){var s=this,l=i(s.endContainer,s.endOffset-1),r,o,n,j,k;var m=l!=s.endContainer;if(l==p){return s._traverseNode(l,m,false,q)}r=l.parentNode;o=s._traverseNode(r,false,false,q);while(r!=null){while(l!=null){n=l.previousSibling;j=s._traverseNode(l,m,false,q);if(q!=e){o.insertBefore(j,o.firstChild)}m=true;l=n}if(r==p){return o}l=r.previousSibling;r=r.parentNode;k=s._traverseNode(r,false,false,q);if(q!=e){k.appendChild(o)}o=k}return null},_traverseLeftBoundary:function(p,q){var s=this,m=i(s.startContainer,s.startOffset);var n=m!=s.startContainer,r,o,l,j,k;if(m==p){return s._traverseNode(m,n,true,q)}r=m.parentNode;o=s._traverseNode(r,false,true,q);while(r!=null){while(m!=null){l=m.nextSibling;j=s._traverseNode(m,n,true,q);if(q!=e){o.appendChild(j)}n=true;m=l}if(r==p){return o}m=r.nextSibling;r=r.parentNode;k=s._traverseNode(r,false,true,q);if(q!=e){k.appendChild(o)}o=k}return null},_traverseNode:function(j,o,r,s){var u=this,m,l,p,k,q;if(o){return u._traverseFullySelected(j,s)}if(j.nodeType==3){m=j.nodeValue;if(r){k=u.startOffset;l=m.substring(k);p=m.substring(0,k)}else{k=u.endOffset;l=m.substring(0,k);p=m.substring(k)}if(s!=c){j.nodeValue=p}if(s==e){return null}q=j.cloneNode(false);q.nodeValue=l;return q}if(s==e){return null}return j.cloneNode(false)},_traverseFullySelected:function(l,k){var j=this;if(k!=e){return k==c?l.cloneNode(true):l}l.parentNode.removeChild(l);return null}});f.Range=a})(tinymce.dom);(function(){function a(e){var d=this,h="\uFEFF",b,g;function c(j,i){if(j&&i){if(j.item&&i.item&&j.item(0)===i.item(0)){return 1}if(j.isEqual&&i.isEqual&&i.isEqual(j)){return 1}}return 0}function f(){var m=e.dom,j=e.getRng(),s=m.createRng(),p,k,n,q,o,l;function i(v){var t=v.parentNode.childNodes,u;for(u=t.length-1;u>=0;u--){if(t[u]==v){return u}}return -1}function r(v){var t=j.duplicate(),B,y,u,w,x=0,z=0,A,C;t.collapse(v);B=t.parentElement();t.pasteHTML(h);u=B.childNodes;for(y=0;y<u.length;y++){w=u[y];if(y>0&&(w.nodeType!==3||u[y-1].nodeType!==3)){z++}if(w.nodeType===3){A=w.nodeValue.indexOf(h);if(A!==-1){x+=A;break}x+=w.nodeValue.length}else{x=0}}t.moveStart("character",-1);t.text="";return{index:z,offset:x,parent:B}}n=j.item?j.item(0):j.parentElement();if(n.ownerDocument!=m.doc){return s}if(j.item||!n.hasChildNodes()){s.setStart(n.parentNode,i(n));s.setEnd(s.startContainer,s.startOffset+1);return s}l=e.isCollapsed();p=r(true);k=r(false);p.parent.normalize();k.parent.normalize();q=p.parent.childNodes[Math.min(p.index,p.parent.childNodes.length-1)];if(q.nodeType!=3){s.setStart(p.parent,p.index)}else{s.setStart(p.parent.childNodes[p.index],p.offset)}o=k.parent.childNodes[Math.min(k.index,k.parent.childNodes.length-1)];if(o.nodeType!=3){if(!l){k.index++}s.setEnd(k.parent,k.index)}else{s.setEnd(k.parent.childNodes[k.index],k.offset)}if(!l){q=s.startContainer;if(q.nodeType==1){s.setStart(q,Math.min(s.startOffset,q.childNodes.length))}o=s.endContainer;if(o.nodeType==1){s.setEnd(o,Math.min(s.endOffset,o.childNodes.length))}}d.addRange(s);return s}this.addRange=function(j){var o,m=e.dom.doc.body,p,k,q,l,n,i;q=j.startContainer;l=j.startOffset;n=j.endContainer;i=j.endOffset;o=m.createTextRange();q=q.nodeType==1?q.childNodes[Math.min(l,q.childNodes.length-1)]:q;n=n.nodeType==1?n.childNodes[Math.min(l==i?i:i-1,n.childNodes.length-1)]:n;if(q==n&&q.nodeType==1){if(/^(IMG|TABLE)$/.test(q.nodeName)&&l!=i){o=m.createControlRange();o.addElement(q)}else{o=m.createTextRange();if(!q.hasChildNodes()&&q.canHaveHTML){q.innerHTML=h}o.moveToElementText(q);if(q.innerHTML==h){o.collapse(true);q.removeChild(q.firstChild)}}if(l==i){o.collapse(i<=j.endContainer.childNodes.length-1)}o.select();return}function r(t,v){var u,s,w;if(t.nodeType!=3){return -1}u=t.nodeValue;s=m.createTextRange();t.nodeValue=u.substring(0,v)+h+u.substring(v);s.moveToElementText(t.parentNode);s.findText(h);w=Math.abs(s.moveStart("character",-1048575));t.nodeValue=u;return w}if(j.collapsed){pos=r(q,l);o=m.createTextRange();o.move("character",pos);o.select();return}else{if(q==n&&q.nodeType==3){p=r(q,l);o.move("character",p);o.moveEnd("character",i-l);o.select();return}p=r(q,l);k=r(n,i);o=m.createTextRange();if(p==-1){o.moveToElementText(q);p=0}else{o.move("character",p)}tmpRng=m.createTextRange();if(k==-1){tmpRng.moveToElementText(n)}else{tmpRng.move("character",k)}o.setEndPoint("EndToEnd",tmpRng);o.select();return}};this.getRangeAt=function(){if(!b||!c(g,e.getRng())){b=f();g=e.getRng()}return b};this.destroy=function(){g=b=null}}tinymce.dom.TridentSelection=a})();(function(){var p=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,i=0,d=Object.prototype.toString,n=false;var b=function(D,t,A,v){A=A||[];var e=t=t||document;if(t.nodeType!==1&&t.nodeType!==9){return[]}if(!D||typeof D!=="string"){return A}var B=[],C,y,G,F,z,s,r=true,w=o(t);p.lastIndex=0;while((C=p.exec(D))!==null){B.push(C[1]);if(C[2]){s=RegExp.rightContext;break}}if(B.length>1&&j.exec(D)){if(B.length===2&&f.relative[B[0]]){y=g(B[0]+B[1],t)}else{y=f.relative[B[0]]?[t]:b(B.shift(),t);while(B.length){D=B.shift();if(f.relative[D]){D+=B.shift()}y=g(D,y)}}}else{if(!v&&B.length>1&&t.nodeType===9&&!w&&f.match.ID.test(B[0])&&!f.match.ID.test(B[B.length-1])){var H=b.find(B.shift(),t,w);t=H.expr?b.filter(H.expr,H.set)[0]:H.set[0]}if(t){var H=v?{expr:B.pop(),set:a(v)}:b.find(B.pop(),B.length===1&&(B[0]==="~"||B[0]==="+")&&t.parentNode?t.parentNode:t,w);y=H.expr?b.filter(H.expr,H.set):H.set;if(B.length>0){G=a(y)}else{r=false}while(B.length){var u=B.pop(),x=u;if(!f.relative[u]){u=""}else{x=B.pop()}if(x==null){x=t}f.relative[u](G,x,w)}}else{G=B=[]}}if(!G){G=y}if(!G){throw"Syntax error, unrecognized expression: "+(u||D)}if(d.call(G)==="[object Array]"){if(!r){A.push.apply(A,G)}else{if(t&&t.nodeType===1){for(var E=0;G[E]!=null;E++){if(G[E]&&(G[E]===true||G[E].nodeType===1&&h(t,G[E]))){A.push(y[E])}}}else{for(var E=0;G[E]!=null;E++){if(G[E]&&G[E].nodeType===1){A.push(y[E])}}}}}else{a(G,A)}if(s){b(s,e,A,v);b.uniqueSort(A)}return A};b.uniqueSort=function(r){if(c){n=false;r.sort(c);if(n){for(var e=1;e<r.length;e++){if(r[e]===r[e-1]){r.splice(e--,1)}}}}};b.matches=function(e,r){return b(e,null,null,r)};b.find=function(x,e,y){var w,u;if(!x){return[]}for(var t=0,s=f.order.length;t<s;t++){var v=f.order[t],u;if((u=f.match[v].exec(x))){var r=RegExp.leftContext;if(r.substr(r.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");w=f.find[v](u,e,y);if(w!=null){x=x.replace(f.match[v],"");break}}}}if(!w){w=e.getElementsByTagName("*")}return{set:w,expr:x}};b.filter=function(A,z,D,t){var s=A,F=[],x=z,v,e,w=z&&z[0]&&o(z[0]);while(A&&z.length){for(var y in f.filter){if((v=f.match[y].exec(A))!=null){var r=f.filter[y],E,C;e=false;if(x==F){F=[]}if(f.preFilter[y]){v=f.preFilter[y](v,x,D,F,t,w);if(!v){e=E=true}else{if(v===true){continue}}}if(v){for(var u=0;(C=x[u])!=null;u++){if(C){E=r(C,v,u,x);var B=t^!!E;if(D&&E!=null){if(B){e=true}else{x[u]=false}}else{if(B){F.push(C);e=true}}}}}if(E!==undefined){if(!D){x=F}A=A.replace(f.match[y],"");if(!e){return[]}break}}}if(A==s){if(e==null){throw"Syntax error, unrecognized expression: "+A}else{break}}s=A}return x};var f=b.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\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")}},relative:{"+":function(x,e,w){var u=typeof e==="string",y=u&&!/\W/.test(e),v=u&&!y;if(y&&!w){e=e.toUpperCase()}for(var t=0,s=x.length,r;t<s;t++){if((r=x[t])){while((r=r.previousSibling)&&r.nodeType!==1){}x[t]=v||r&&r.nodeName===e?r||false:r===e}}if(v){b.filter(e,x,true)}},">":function(w,r,x){var u=typeof r==="string";if(u&&!/\W/.test(r)){r=x?r:r.toUpperCase();for(var s=0,e=w.length;s<e;s++){var v=w[s];if(v){var t=v.parentNode;w[s]=t.nodeName===r?t:false}}}else{for(var s=0,e=w.length;s<e;s++){var v=w[s];if(v){w[s]=u?v.parentNode:v.parentNode===r}}if(u){b.filter(r,w,true)}}},"":function(t,r,v){var s=i++,e=q;if(!r.match(/\W/)){var u=r=v?r:r.toUpperCase();e=m}e("parentNode",r,s,t,u,v)},"~":function(t,r,v){var s=i++,e=q;if(typeof r==="string"&&!r.match(/\W/)){var u=r=v?r:r.toUpperCase();e=m}e("previousSibling",r,s,t,u,v)}},find:{ID:function(r,s,t){if(typeof s.getElementById!=="undefined"&&!t){var e=s.getElementById(r[1]);return e?[e]:[]}},NAME:function(s,v,w){if(typeof v.getElementsByName!=="undefined"){var r=[],u=v.getElementsByName(s[1]);for(var t=0,e=u.length;t<e;t++){if(u[t].getAttribute("name")===s[1]){r.push(u[t])}}return r.length===0?null:r}},TAG:function(e,r){return r.getElementsByTagName(e[1])}},preFilter:{CLASS:function(t,r,s,e,w,x){t=" "+t[1].replace(/\\/g,"")+" ";if(x){return t}for(var u=0,v;(v=r[u])!=null;u++){if(v){if(w^(v.className&&(" "+v.className+" ").indexOf(t)>=0)){if(!s){e.push(v)}}else{if(s){r[u]=false}}}}return false},ID:function(e){return e[1].replace(/\\/g,"")},TAG:function(r,e){for(var s=0;e[s]===false;s++){}return e[s]&&o(e[s])?r[1]:r[1].toUpperCase()},CHILD:function(e){if(e[1]=="nth"){var r=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(e[2]=="even"&&"2n"||e[2]=="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(r[1]+(r[2]||1))-0;e[3]=r[3]-0}e[0]=i++;return e},ATTR:function(u,r,s,e,v,w){var t=u[1].replace(/\\/g,"");if(!w&&f.attrMap[t]){u[1]=f.attrMap[t]}if(u[2]==="~="){u[4]=" "+u[4]+" "}return u},PSEUDO:function(u,r,s,e,v){if(u[1]==="not"){if(u[3].match(p).length>1||/^\w/.test(u[3])){u[3]=b(u[3],null,null,r)}else{var t=b.filter(u[3],r,s,true^v);if(!s){e.push.apply(e,t)}return false}}else{if(f.match.POS.test(u[0])||f.match.CHILD.test(u[0])){return true}}return u},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){e.parentNode.selectedIndex;return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(s,r,e){return !!b(e[3],s).length},header:function(e){return/h\d/i.test(e.nodeName)},text:function(e){return"text"===e.type},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toUpperCase()==="BUTTON"},input:function(e){return/input|select|textarea|button/i.test(e.nodeName)}},setFilters:{first:function(r,e){return e===0},last:function(s,r,e,t){return r===t.length-1},even:function(r,e){return e%2===0},odd:function(r,e){return e%2===1},lt:function(s,r,e){return r<e[3]-0},gt:function(s,r,e){return r>e[3]-0},nth:function(s,r,e){return e[3]-0==r},eq:function(s,r,e){return e[3]-0==r}},filter:{PSEUDO:function(w,s,t,x){var r=s[1],u=f.filters[r];if(u){return u(w,t,s,x)}else{if(r==="contains"){return(w.textContent||w.innerText||"").indexOf(s[3])>=0}else{if(r==="not"){var v=s[3];for(var t=0,e=v.length;t<e;t++){if(v[t]===w){return false}}return true}}}},CHILD:function(e,t){var w=t[1],r=e;switch(w){case"only":case"first":while(r=r.previousSibling){if(r.nodeType===1){return false}}if(w=="first"){return true}r=e;case"last":while(r=r.nextSibling){if(r.nodeType===1){return false}}return true;case"nth":var s=t[2],z=t[3];if(s==1&&z==0){return true}var v=t[0],y=e.parentNode;if(y&&(y.sizcache!==v||!e.nodeIndex)){var u=0;for(r=y.firstChild;r;r=r.nextSibling){if(r.nodeType===1){r.nodeIndex=++u}}y.sizcache=v}var x=e.nodeIndex-z;if(s==0){return x==0}else{return(x%s==0&&x/s>=0)}}},ID:function(r,e){return r.nodeType===1&&r.getAttribute("id")===e},TAG:function(r,e){return(e==="*"&&r.nodeType===1)||r.nodeName===e},CLASS:function(r,e){return(" "+(r.className||r.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(v,t){var s=t[1],e=f.attrHandle[s]?f.attrHandle[s](v):v[s]!=null?v[s]:v.getAttribute(s),w=e+"",u=t[2],r=t[4];return e==null?u==="!=":u==="="?w===r:u==="*="?w.indexOf(r)>=0:u==="~="?(" "+w+" ").indexOf(r)>=0:!r?w&&e!==false:u==="!="?w!=r:u==="^="?w.indexOf(r)===0:u==="$="?w.substr(w.length-r.length)===r:u==="|="?w===r||w.substr(0,r.length+1)===r+"-":false},POS:function(u,r,s,v){var e=r[2],t=f.setFilters[e];if(t){return t(u,s,r,v)}}}};var j=f.match.POS;for(var l in f.match){f.match[l]=new RegExp(f.match[l].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var a=function(r,e){r=Array.prototype.slice.call(r);if(e){e.push.apply(e,r);return e}return r};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(k){a=function(u,t){var r=t||[];if(d.call(u)==="[object Array]"){Array.prototype.push.apply(r,u)}else{if(typeof u.length==="number"){for(var s=0,e=u.length;s<e;s++){r.push(u[s])}}else{for(var s=0;u[s];s++){r.push(u[s])}}}return r}}var c;if(document.documentElement.compareDocumentPosition){c=function(r,e){var s=r.compareDocumentPosition(e)&4?-1:r===e?0:1;if(s===0){n=true}return s}}else{if("sourceIndex" in document.documentElement){c=function(r,e){var s=r.sourceIndex-e.sourceIndex;if(s===0){n=true}return s}}else{if(document.createRange){c=function(t,r){var s=t.ownerDocument.createRange(),e=r.ownerDocument.createRange();s.setStart(t,0);s.setEnd(t,0);e.setStart(r,0);e.setEnd(r,0);var u=s.compareBoundaryPoints(Range.START_TO_END,e);if(u===0){n=true}return u}}}}(function(){var r=document.createElement("div"),s="script"+(new Date).getTime();r.innerHTML="<a name='"+s+"'/>";var e=document.documentElement;e.insertBefore(r,e.firstChild);if(!!document.getElementById(s)){f.find.ID=function(u,v,w){if(typeof v.getElementById!=="undefined"&&!w){var t=v.getElementById(u[1]);return t?t.id===u[1]||typeof t.getAttributeNode!=="undefined"&&t.getAttributeNode("id").nodeValue===u[1]?[t]:undefined:[]}};f.filter.ID=function(v,t){var u=typeof v.getAttributeNode!=="undefined"&&v.getAttributeNode("id");return v.nodeType===1&&u&&u.nodeValue===t}}e.removeChild(r)})();(function(){var e=document.createElement("div");e.appendChild(document.createComment(""));if(e.getElementsByTagName("*").length>0){f.find.TAG=function(r,v){var u=v.getElementsByTagName(r[1]);if(r[1]==="*"){var t=[];for(var s=0;u[s];s++){if(u[s].nodeType===1){t.push(u[s])}}u=t}return u}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){f.attrHandle.href=function(r){return r.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var e=b,s=document.createElement("div");s.innerHTML="<p class='TEST'></p>";if(s.querySelectorAll&&s.querySelectorAll(".TEST").length===0){return}b=function(w,v,t,u){v=v||document;if(!u&&v.nodeType===9&&!o(v)){try{return a(v.querySelectorAll(w),t)}catch(x){}}return e(w,v,t,u)};for(var r in e){b[r]=e[r]}})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var e=document.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}f.order.splice(1,0,"CLASS");f.find.CLASS=function(r,s,t){if(typeof s.getElementsByClassName!=="undefined"&&!t){return s.getElementsByClassName(r[1])}}})()}function m(r,w,v,A,x,z){var y=r=="previousSibling"&&!z;for(var t=0,s=A.length;t<s;t++){var e=A[t];if(e){if(y&&e.nodeType===1){e.sizcache=v;e.sizset=t}e=e[r];var u=false;while(e){if(e.sizcache===v){u=A[e.sizset];break}if(e.nodeType===1&&!z){e.sizcache=v;e.sizset=t}if(e.nodeName===w){u=e;break}e=e[r]}A[t]=u}}}function q(r,w,v,A,x,z){var y=r=="previousSibling"&&!z;for(var t=0,s=A.length;t<s;t++){var e=A[t];if(e){if(y&&e.nodeType===1){e.sizcache=v;e.sizset=t}e=e[r];var u=false;while(e){if(e.sizcache===v){u=A[e.sizset];break}if(e.nodeType===1){if(!z){e.sizcache=v;e.sizset=t}if(typeof w!=="string"){if(e===w){u=true;break}}else{if(b.filter(w,[e]).length>0){u=e;break}}}e=e[r]}A[t]=u}}}var h=document.compareDocumentPosition?function(r,e){return r.compareDocumentPosition(e)&16}:function(r,e){return r!==e&&(r.contains?r.contains(e):true)};var o=function(e){return e.nodeType===9&&e.documentElement.nodeName!=="HTML"||!!e.ownerDocument&&e.ownerDocument.documentElement.nodeName!=="HTML"};var g=function(e,x){var t=[],u="",v,s=x.nodeType?[x]:x;while((v=f.match.PSEUDO.exec(e))){u+=v[0];e=e.replace(f.match.PSEUDO,"")}e=f.relative[e]?e+"*":e;for(var w=0,r=s.length;w<r;w++){b(e,s[w],t)}return b.filter(u,t)};window.tinymce.dom.Sizzle=b})();(function(d){var f=d.each,c=d.DOM,b=d.isIE,e=d.isWebKit,a;d.create("static tinymce.dom.Event",{inits:[],events:[],add:function(m,p,l,j){var g,h=this,i=h.events,k;if(m&&m.hasOwnProperty&&m instanceof Array){k=[];f(m,function(n){n=c.get(n);k.push(h.add(n,p,l,j))});return k}m=c.get(m);if(!m){return}g=function(n){n=n||window.event;if(n&&!n.target&&b){n.target=n.srcElement}if(!j){return l(n)}return l.call(j,n)};if(p=="unload"){d.unloads.unshift({func:g});return g}if(p=="init"){if(h.domLoaded){g()}else{h.inits.push(g)}return g}i.push({obj:m,name:p,func:l,cfunc:g,scope:j});h._add(m,p,g);return l},remove:function(l,m,k){var h=this,g=h.events,i=false,j;if(l&&l.hasOwnProperty&&l instanceof Array){j=[];f(l,function(n){n=c.get(n);j.push(h.remove(n,m,k))});return j}l=c.get(l);f(g,function(o,n){if(o.obj==l&&o.name==m&&(!k||(o.func==k||o.cfunc==k))){g.splice(n,1);h._remove(l,m,o.cfunc);i=true;return false}});return i},clear:function(l){var j=this,g=j.events,h,k;if(l){l=c.get(l);for(h=g.length-1;h>=0;h--){k=g[h];if(k.obj===l){j._remove(k.obj,k.name,k.cfunc);k.obj=k.cfunc=null;g.splice(h,1)}}}},cancel:function(g){if(!g){return false}this.stop(g);return this.prevent(g)},stop:function(g){if(g.stopPropagation){g.stopPropagation()}else{g.cancelBubble=true}return false},prevent:function(g){if(g.preventDefault){g.preventDefault()}else{g.returnValue=false}return false},_unload:function(){var g=a;f(g.events,function(j,h){g._remove(j.obj,j.name,j.cfunc);j.obj=j.cfunc=null});g.events=[];g=null},_add:function(h,i,g){if(h.attachEvent){h.attachEvent("on"+i,g)}else{if(h.addEventListener){h.addEventListener(i,g,false)}else{h["on"+i]=g}}},_remove:function(i,j,h){if(i){try{if(i.detachEvent){i.detachEvent("on"+j,h)}else{if(i.removeEventListener){i.removeEventListener(j,h,false)}else{i["on"+j]=null}}}catch(g){}}},_pageInit:function(){var g=a;if(g.domLoaded){return}g._remove(window,"DOMContentLoaded",g._pageInit);g.domLoaded=true;f(g.inits,function(h){h()});g.inits=[]},_wait:function(){if(window.tinyMCE_GZ&&tinyMCE_GZ.loaded){a.domLoaded=1;return}if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);a._pageInit()}});if(document.documentElement.doScroll&&window==window.top){(function(){if(a.domLoaded){return}try{document.documentElement.doScroll("left")}catch(g){setTimeout(arguments.callee,0);return}a._pageInit()})()}}else{if(document.addEventListener){a._add(window,"DOMContentLoaded",a._pageInit,a)}}a._add(window,"load",a._pageInit,a)}});a=d.dom.Event;a._wait();d.addUnload(a._unload)})(tinymce);(function(a){var b=a.each;a.create("tinymce.dom.Element",{Element:function(g,e){var c=this,f,d;e=e||{};c.id=g;c.dom=f=e.dom||a.DOM;c.settings=e;if(!a.isIE){d=c.dom.get(c.id)}b(["getPos","getRect","getParent","add","setStyle","getStyle","setStyles","setAttrib","setAttribs","getAttrib","addClass","removeClass","hasClass","getOuterHTML","setOuterHTML","remove","show","hide","isHidden","setHTML","get"],function(h){c[h]=function(){var j=[g],k;for(k=0;k<arguments.length;k++){j.push(arguments[k])}j=f[h].apply(f,j);c.update(h);return j}})},on:function(e,d,c){return a.dom.Event.add(this.id,e,d,c)},getXY:function(){return{x:parseInt(this.getStyle("left")),y:parseInt(this.getStyle("top"))}},getSize:function(){var c=this.dom.get(this.id);return{w:parseInt(this.getStyle("width")||c.clientWidth),h:parseInt(this.getStyle("height")||c.clientHeight)}},moveTo:function(c,d){this.setStyles({left:c,top:d})},moveBy:function(c,e){var d=this.getXY();this.moveTo(d.x+c,d.y+e)},resizeTo:function(c,d){this.setStyles({width:c,height:d})},resizeBy:function(c,e){var d=this.getSize();this.resizeTo(d.w+c,d.h+e)},update:function(d){var e=this,c,f=e.dom;if(a.isIE6&&e.settings.blocker){d=d||"";if(d.indexOf("get")===0||d.indexOf("has")===0||d.indexOf("is")===0){return}if(d=="remove"){f.remove(e.blocker);return}if(!e.blocker){e.blocker=f.uniqueId();c=f.add(e.settings.container||f.getRoot(),"iframe",{id:e.blocker,style:"position:absolute;",frameBorder:0,src:'javascript:""'});f.setStyle(c,"opacity",0)}else{c=f.get(e.blocker)}f.setStyle(c,"left",e.getStyle("left",1));f.setStyle(c,"top",e.getStyle("top",1));f.setStyle(c,"width",e.getStyle("width",1));f.setStyle(c,"height",e.getStyle("height",1));f.setStyle(c,"display",e.getStyle("display",1));f.setStyle(c,"zIndex",parseInt(e.getStyle("zIndex",1)||0)-1)}}})})(tinymce);(function(c){function e(f){return f.replace(/[\n\r]+/g,"")}var b=c.is,a=c.isIE,d=c.each;c.create("tinymce.dom.Selection",{Selection:function(i,h,g){var f=this;f.dom=i;f.win=h;f.serializer=g;d(["onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent"],function(j){f[j]=new c.util.Dispatcher(f)});if(!f.win.getSelection){f.tridentSel=new c.dom.TridentSelection(f)}c.addUnload(f.destroy,f)},getContent:function(g){var f=this,h=f.getRng(),l=f.dom.create("body"),j=f.getSel(),i,k,m;g=g||{};i=k="";g.get=true;g.format=g.format||"html";f.onBeforeGetContent.dispatch(f,g);if(g.format=="text"){return f.isCollapsed()?"":(h.text||(j.toString?j.toString():""))}if(h.cloneContents){m=h.cloneContents();if(m){l.appendChild(m)}}else{if(b(h.item)||b(h.htmlText)){l.innerHTML=h.item?h.item(0).outerHTML:h.htmlText}else{l.innerHTML=h.toString()}}if(/^\s/.test(l.innerHTML)){i=" "}if(/\s+$/.test(l.innerHTML)){k=" "}g.getInner=true;g.content=f.isCollapsed()?"":i+f.serializer.serialize(l,g)+k;f.onGetContent.dispatch(f,g);return g.content},setContent:function(i,g){var f=this,j=f.getRng(),l,k=f.win.document;g=g||{format:"html"};g.set=true;i=g.content=f.dom.processHTML(i);f.onBeforeSetContent.dispatch(f,g);i=g.content;if(j.insertNode){i+='<span id="__caret">_</span>';j.deleteContents();j.insertNode(f.getRng().createContextualFragment(i));l=f.dom.get("__caret");j=k.createRange();j.setStartBefore(l);j.setEndAfter(l);f.setRng(j);f.dom.remove("__caret")}else{if(j.item){k.execCommand("Delete",false,null);j=f.getRng()}j.pasteHTML(i)}f.onSetContent.dispatch(f,g)},getStart:function(){var f=this,g=f.getRng(),h;if(a){if(g.item){return g.item(0)}g=g.duplicate();g.collapse(1);h=g.parentElement();if(h&&h.nodeName=="BODY"){return h.firstChild}return h}else{h=g.startContainer;if(h.nodeName=="BODY"){return h.firstChild}return f.dom.getParent(h,"*")}},getEnd:function(){var f=this,g=f.getRng(),h;if(a){if(g.item){return g.item(0)}g=g.duplicate();g.collapse(0);h=g.parentElement();if(h&&h.nodeName=="BODY"){return h.lastChild}return h}else{h=g.endContainer;if(h.nodeName=="BODY"){return h.lastChild}return f.dom.getParent(h,"*")}},getBookmark:function(x){var j=this,m=j.getRng(),f,n,l,u=j.dom.getViewPort(j.win),v,p,z,o,w=-16777215,k,h=j.dom.getRoot(),g=0,i=0,y;n=u.x;l=u.y;if(x=="simple"){return{rng:m,scrollX:n,scrollY:l}}if(a){if(m.item){v=m.item(0);d(j.dom.select(v.nodeName),function(s,r){if(v==s){p=r;return false}});return{tag:v.nodeName,index:p,scrollX:n,scrollY:l}}f=j.dom.doc.body.createTextRange();f.moveToElementText(h);f.collapse(true);z=Math.abs(f.move("character",w));f=m.duplicate();f.collapse(true);p=Math.abs(f.move("character",w));f=m.duplicate();f.collapse(false);o=Math.abs(f.move("character",w))-p;return{start:p-z,length:o,scrollX:n,scrollY:l}}v=j.getNode();k=j.getSel();if(!k){return null}if(v&&v.nodeName=="IMG"){return{scrollX:n,scrollY:l}}function q(A,D,t){var s=j.dom.doc.createTreeWalker(A,NodeFilter.SHOW_TEXT,null,false),E,B=0,C={};while((E=s.nextNode())!=null){if(E==D){C.start=B}if(E==t){C.end=B;return C}B+=e(E.nodeValue||"").length}return null}if(k.anchorNode==k.focusNode&&k.anchorOffset==k.focusOffset){v=q(h,k.anchorNode,k.focusNode);if(!v){return{scrollX:n,scrollY:l}}e(k.anchorNode.nodeValue||"").replace(/^\s+/,function(r){g=r.length});return{start:Math.max(v.start+k.anchorOffset-g,0),end:Math.max(v.end+k.focusOffset-g,0),scrollX:n,scrollY:l,beg:k.anchorOffset-g==0}}else{v=q(h,m.startContainer,m.endContainer);if(!v){return{scrollX:n,scrollY:l}}return{start:Math.max(v.start+m.startOffset-g,0),end:Math.max(v.end+m.endOffset-i,0),scrollX:n,scrollY:l,beg:m.startOffset-g==0}}},moveToBookmark:function(n){var o=this,g=o.getRng(),p=o.getSel(),j=o.dom.getRoot(),m,h,k;function i(q,t,D){var B=o.dom.doc.createTreeWalker(q,NodeFilter.SHOW_TEXT,null,false),x,s=0,A={},u,C,z,y;while((x=B.nextNode())!=null){z=y=0;k=x.nodeValue||"";h=e(k).length;s+=h;if(s>=t&&!A.startNode){u=t-(s-h);if(n.beg&&u>=h){continue}A.startNode=x;A.startOffset=u+y}if(s>=D){A.endNode=x;A.endOffset=D-(s-h)+y;return A}}return null}if(!n){return false}o.win.scrollTo(n.scrollX,n.scrollY);if(a){if(g=n.rng){try{g.select()}catch(l){}return true}o.win.focus();if(n.tag){g=j.createControlRange();d(o.dom.select(n.tag),function(r,q){if(q==n.index){g.addElement(r)}})}else{try{if(n.start<0){return true}g=p.createRange();g.moveToElementText(j);g.collapse(true);g.moveStart("character",n.start);g.moveEnd("character",n.length)}catch(f){return true}}try{g.select()}catch(l){}return true}if(!p){return false}if(n.rng){p.removeAllRanges();p.addRange(n.rng)}else{if(b(n.start)&&b(n.end)){try{m=i(j,n.start,n.end);if(m){g=o.dom.doc.createRange();g.setStart(m.startNode,m.startOffset);g.setEnd(m.endNode,m.endOffset);p.removeAllRanges();p.addRange(g)}if(!c.isOpera){o.win.focus()}}catch(l){}}}},select:function(g,l){var p=this,f=p.getRng(),q=p.getSel(),o,m,k,j=p.win.document;function h(u,t){var s,r;if(u){s=j.createTreeWalker(u,NodeFilter.SHOW_TEXT,null,false);while(u=s.nextNode()){r=u;if(c.trim(u.nodeValue).length!=0){if(t){return u}else{r=u}}}}return r}if(a){try{o=j.body;if(/^(IMG|TABLE)$/.test(g.nodeName)){f=o.createControlRange();f.addElement(g)}else{f=o.createTextRange();f.moveToElementText(g)}f.select()}catch(i){}}else{if(l){m=h(g,1)||p.dom.select("br:first",g)[0];k=h(g,0)||p.dom.select("br:last",g)[0];if(m&&k){f=j.createRange();if(m.nodeName=="BR"){f.setStartBefore(m)}else{f.setStart(m,0)}if(k.nodeName=="BR"){f.setEndBefore(k)}else{f.setEnd(k,k.nodeValue.length)}}else{f.selectNode(g)}}else{f.selectNode(g)}p.setRng(f)}return g},isCollapsed:function(){var f=this,h=f.getRng(),g=f.getSel();if(!h||h.item){return false}return !g||h.boundingWidth==0||h.collapsed},collapse:function(f){var g=this,h=g.getRng(),i;if(h.item){i=h.item(0);h=this.win.document.body.createTextRange();h.moveToElementText(i)}h.collapse(!!f);g.setRng(h)},getSel:function(){var g=this,f=this.win;return f.getSelection?f.getSelection():f.document.selection},getRng:function(j){var g=this,h,i;if(j&&g.tridentSel){return g.tridentSel.getRangeAt(0)}try{if(h=g.getSel()){i=h.rangeCount>0?h.getRangeAt(0):(h.createRange?h.createRange():g.win.document.createRange())}}catch(f){}if(!i){i=a?g.win.document.body.createTextRange():g.win.document.createRange()}return i},setRng:function(i){var h,g=this;if(!g.tridentSel){h=g.getSel();if(h){h.removeAllRanges();h.addRange(i)}}else{if(i.cloneRange){g.tridentSel.addRange(i);return}try{i.select()}catch(f){}}},setNode:function(g){var f=this;f.setContent(f.dom.getOuterHTML(g));return g},getNode:function(){var f=this,h=f.getRng(),g=f.getSel(),i;if(!a){if(!h){return f.dom.getRoot()}i=h.commonAncestorContainer;if(!h.collapsed){if(c.isWebKit&&g.anchorNode&&g.anchorNode.nodeType==1){return g.anchorNode.childNodes[g.anchorOffset]}if(h.startContainer==h.endContainer){if(h.startOffset-h.endOffset<2){if(h.startContainer.hasChildNodes()){i=h.startContainer.childNodes[h.startOffset]}}}}return f.dom.getParent(i,"*")}return h.item?h.item(0):h.parentElement()},getSelectedBlocks:function(g,f){var i=this,j=i.dom,m,h,l,k=[];m=j.getParent(g||i.getStart(),j.isBlock);h=j.getParent(f||i.getEnd(),j.isBlock);if(m){k.push(m)}if(m&&h&&m!=h){l=m;while((l=l.nextSibling)&&l!=h){if(j.isBlock(l)){k.push(l)}}}if(h&&m!=h){k.push(h)}return k},destroy:function(g){var f=this;f.win=null;if(f.tridentSel){f.tridentSel.destroy()}if(!g){c.removeUnload(f.destroy)}}})})(tinymce);(function(a){a.create("tinymce.dom.XMLWriter",{node:null,XMLWriter:function(c){function b(){var e=document.implementation;if(!e||!e.createDocument){try{return new ActiveXObject("MSXML2.DOMDocument")}catch(d){}try{return new ActiveXObject("Microsoft.XmlDom")}catch(d){}}else{return e.createDocument("","",null)}}this.doc=b();this.valid=a.isOpera||a.isWebKit;this.reset()},reset:function(){var b=this,c=b.doc;if(c.firstChild){c.removeChild(c.firstChild)}b.node=c.appendChild(c.createElement("html"))},writeStartElement:function(c){var b=this;b.node=b.node.appendChild(b.doc.createElement(c))},writeAttribute:function(c,b){if(this.valid){b=b.replace(/>/g,"%MCGT%")}this.node.setAttribute(c,b)},writeEndElement:function(){this.node=this.node.parentNode},writeFullEndElement:function(){var b=this,c=b.node;c.appendChild(b.doc.createTextNode(""));b.node=c.parentNode},writeText:function(b){if(this.valid){b=b.replace(/>/g,"%MCGT%")}this.node.appendChild(this.doc.createTextNode(b))},writeCDATA:function(b){this.node.appendChild(this.doc.createCDATA(b))},writeComment:function(b){if(a.isIE){b=b.replace(/^\-|\-$/g," ")}this.node.appendChild(this.doc.createComment(b.replace(/\-\-/g," ")))},getContent:function(){var b;b=this.doc.xml||new XMLSerializer().serializeToString(this.doc);b=b.replace(/<\?[^?]+\?>|<html>|<\/html>|<html\/>|<!DOCTYPE[^>]+>/g,"");b=b.replace(/ ?\/>/g," />");if(this.valid){b=b.replace(/\%MCGT%/g,"&gt;")}return b}})})(tinymce);(function(a){a.create("tinymce.dom.StringWriter",{str:null,tags:null,count:0,settings:null,indent:null,StringWriter:function(b){this.settings=a.extend({indent_char:" ",indentation:1},b);this.reset()},reset:function(){this.indent="";this.str="";this.tags=[];this.count=0},writeStartElement:function(b){this._writeAttributesEnd();this.writeRaw("<"+b);this.tags.push(b);this.inAttr=true;this.count++;this.elementCount=this.count},writeAttribute:function(d,b){var c=this;c.writeRaw(" "+c.encode(d)+'="'+c.encode(b)+'"')},writeEndElement:function(){var b;if(this.tags.length>0){b=this.tags.pop();if(this._writeAttributesEnd(1)){this.writeRaw("</"+b+">")}if(this.settings.indentation>0){this.writeRaw("\n")}}},writeFullEndElement:function(){if(this.tags.length>0){this._writeAttributesEnd();this.writeRaw("</"+this.tags.pop()+">");if(this.settings.indentation>0){this.writeRaw("\n")}}},writeText:function(b){this._writeAttributesEnd();this.writeRaw(this.encode(b));this.count++},writeCDATA:function(b){this._writeAttributesEnd();this.writeRaw("<![CDATA["+b+"]]>");this.count++},writeComment:function(b){this._writeAttributesEnd();this.writeRaw("<!-- "+b+"-->");this.count++},writeRaw:function(b){this.str+=b},encode:function(b){return b.replace(/[<>&"]/g,function(c){switch(c){case"<":return"&lt;";case">":return"&gt;";case"&":return"&amp;";case'"':return"&quot;"}return c})},getContent:function(){return this.str},_writeAttributesEnd:function(b){if(!this.inAttr){return}this.inAttr=false;if(b&&this.elementCount==this.count){this.writeRaw(" />");return false}this.writeRaw(">");return true}})})(tinymce);(function(e){var g=e.extend,f=e.each,b=e.util.Dispatcher,d=e.isIE,a=e.isGecko;function c(h){return h.replace(/([?+*])/g,".$1")}e.create("tinymce.dom.Serializer",{Serializer:function(j){var i=this;i.key=0;i.onPreProcess=new b(i);i.onPostProcess=new b(i);try{i.writer=new e.dom.XMLWriter()}catch(h){i.writer=new e.dom.StringWriter()}i.settings=j=g({dom:e.DOM,valid_nodes:0,node_filter:0,attr_filter:0,invalid_attrs:/^(mce_|_moz_)/,closed:/^(br|hr|input|meta|img|link|param|area)$/,entity_encoding:"named",entities:"160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro",bool_attrs:/(checked|disabled|readonly|selected|nowrap)/,valid_elements:"*[*]",extended_valid_elements:0,valid_child_elements:0,invalid_elements:0,fix_table_elements:1,fix_list_elements:true,fix_content_duplication:true,convert_fonts_to_spans:false,font_size_classes:0,font_size_style_values:0,apply_source_formatting:0,indent_mode:"simple",indent_char:"\t",indent_levels:1,remove_linebreaks:1,remove_redundant_brs:1,element_format:"xhtml"},j);i.dom=j.dom;if(j.remove_redundant_brs){i.onPostProcess.add(function(k,l){l.content=l.content.replace(/(<br \/>\s*)+<\/(p|h[1-6]|div|li)>/gi,function(n,m,o){if(/^<br \/>\s*<\//.test(n)){return"</"+o+">"}return n})})}if(j.element_format=="html"){i.onPostProcess.add(function(k,l){l.content=l.content.replace(/<([^>]+) \/>/g,"<$1>")})}if(j.fix_list_elements){i.onPreProcess.add(function(v,s){var l,y,w=["ol","ul"],u,t,q,k=/^(OL|UL)$/,z;function m(r,x){var o=x.split(","),p;while((r=r.previousSibling)!=null){for(p=0;p<o.length;p++){if(r.nodeName==o[p]){return r}}}return null}for(y=0;y<w.length;y++){l=i.dom.select(w[y],s.node);for(u=0;u<l.length;u++){t=l[u];q=t.parentNode;if(k.test(q.nodeName)){z=m(t,"LI");if(!z){z=i.dom.create("li");z.innerHTML="&nbsp;";z.appendChild(t);q.insertBefore(z,q.firstChild)}else{z.appendChild(t)}}}}})}if(j.fix_table_elements){i.onPreProcess.add(function(k,l){f(i.dom.select("p table",l.node),function(m){i.dom.split(i.dom.getParent(m,"p"),m)})})}},setEntities:function(p){var n=this,j,m,h={},o="",k;if(n.entityLookup){return}j=p.split(",");for(m=0;m<j.length;m+=2){k=j[m];if(k==34||k==38||k==60||k==62){continue}h[String.fromCharCode(j[m])]=j[m+1];k=parseInt(j[m]).toString(16);o+="\\u"+"0000".substring(k.length)+k}if(!o){n.settings.entity_encoding="raw";return}n.entitiesRE=new RegExp("["+o+"]","g");n.entityLookup=h},setValidChildRules:function(h){this.childRules=null;this.addValidChildRules(h)},addValidChildRules:function(k){var j=this,l,h,i;if(!k){return}l="A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment";h="A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment";i="H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP";f(k.split(","),function(n){var o=n.split(/\[|\]/),m;n="";f(o[1].split("|"),function(p){if(n){n+="|"}switch(p){case"%itrans":p=h;break;case"%itrans_na":p=h.substring(2);break;case"%istrict":p=l;break;case"%istrict_na":p=l.substring(2);break;case"%btrans":p=i;break;case"%bstrict":p=i;break}n+=p});m=new RegExp("^("+n.toLowerCase()+")$","i");f(o[0].split("/"),function(p){j.childRules=j.childRules||{};j.childRules[p]=m})});k="";f(j.childRules,function(n,m){if(k){k+="|"}k+=m});j.parentElementsRE=new RegExp("^("+k.toLowerCase()+")$","i")},setRules:function(i){var h=this;h._setup();h.rules={};h.wildRules=[];h.validElements={};return h.addRules(i)},addRules:function(i){var h=this,j;if(!i){return}h._setup();f(i.split(","),function(m){var q=m.split(/\[|\]/),l=q[0].split("/"),r,k,o,n=[];if(j){k=e.extend([],j.attribs)}if(q.length>1){f(q[1].split("|"),function(u){var p={},t;k=k||[];u=u.replace(/::/g,"~");u=/^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(u);u[2]=u[2].replace(/~/g,":");if(u[1]=="!"){r=r||[];r.push(u[2])}if(u[1]=="-"){for(t=0;t<k.length;t++){if(k[t].name==u[2]){k.splice(t,1);return}}}switch(u[3]){case"=":p.defaultVal=u[4]||"";break;case":":p.forcedVal=u[4];break;case"<":p.validVals=u[4].split("?");break}if(/[*.?]/.test(u[2])){o=o||[];p.nameRE=new RegExp("^"+c(u[2])+"$");o.push(p)}else{p.name=u[2];k.push(p)}n.push(u[2])})}f(l,function(v,u){var w=v.charAt(0),t=1,p={};if(j){if(j.noEmpty){p.noEmpty=j.noEmpty}if(j.fullEnd){p.fullEnd=j.fullEnd}if(j.padd){p.padd=j.padd}}switch(w){case"-":p.noEmpty=true;break;case"+":p.fullEnd=true;break;case"#":p.padd=true;break;default:t=0}l[u]=v=v.substring(t);h.validElements[v]=1;if(/[*.?]/.test(l[0])){p.nameRE=new RegExp("^"+c(l[0])+"$");h.wildRules=h.wildRules||{};h.wildRules.push(p)}else{p.name=l[0];if(l[0]=="@"){j=p}h.rules[v]=p}p.attribs=k;if(r){p.requiredAttribs=r}if(o){v="";f(n,function(s){if(v){v+="|"}v+="("+c(s)+")"});p.validAttribsRE=new RegExp("^"+v.toLowerCase()+"$");p.wildAttribs=o}})});i="";f(h.validElements,function(m,l){if(i){i+="|"}if(l!="@"){i+=l}});h.validElementsRE=new RegExp("^("+c(i.toLowerCase())+")$")},findRule:function(m){var j=this,l=j.rules,h,k;j._setup();k=l[m];if(k){return k}l=j.wildRules;for(h=0;h<l.length;h++){if(l[h].nameRE.test(m)){return l[h]}}return null},findAttribRule:function(h,l){var j,k=h.wildAttribs;for(j=0;j<k.length;j++){if(k[j].nameRE.test(l)){return k[j]}}return null},serialize:function(l,k){var j,i=this;i._setup();k=k||{};k.format=k.format||"html";i.processObj=k;l=l.cloneNode(true);i.key=""+(parseInt(i.key)+1);if(!k.no_events){k.node=l;i.onPreProcess.dispatch(i,k)}i.writer.reset();i._serializeNode(l,k.getInner);k.content=i.writer.getContent();if(!k.no_events){i.onPostProcess.dispatch(i,k)}i._postProcess(k);k.node=null;return e.trim(k.content)},_postProcess:function(n){var i=this,k=i.settings,j=n.content,m=[],l;if(n.format=="html"){l=i._protect({content:j,patterns:[{pattern:/(<script[^>]*>)(.*?)(<\/script>)/g},{pattern:/(<style[^>]*>)(.*?)(<\/style>)/g},{pattern:/(<pre[^>]*>)(.*?)(<\/pre>)/g,encode:1},{pattern:/(<!--\[CDATA\[)(.*?)(\]\]-->)/g}]});j=l.content;if(k.entity_encoding!=="raw"){j=i._encode(j)}if(!n.set){j=j.replace(/<p>\s+<\/p>|<p([^>]+)>\s+<\/p>/g,k.entity_encoding=="numeric"?"<p$1>&#160;</p>":"<p$1>&nbsp;</p>");if(k.remove_linebreaks){j=j.replace(/\r?\n|\r/g," ");j=j.replace(/(<[^>]+>)\s+/g,"$1 ");j=j.replace(/\s+(<\/[^>]+>)/g," $1");j=j.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g,"<$1 $2>");j=j.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g,"<$1>");j=j.replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g,"</$1>")}if(k.apply_source_formatting&&k.indent_mode=="simple"){j=j.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g,"\n<$1$2$3>\n");j=j.replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g,"\n<$1$2>");j=j.replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g,"</$1>\n");j=j.replace(/\n\n/g,"\n")}}j=i._unprotect(j,l);j=j.replace(/<!--\[CDATA\[([\s\S]+)\]\]-->/g,"<![CDATA[$1]]>");if(k.entity_encoding=="raw"){j=j.replace(/<p>&nbsp;<\/p>|<p([^>]+)>&nbsp;<\/p>/g,"<p$1>\u00a0</p>")}}n.content=j},_serializeNode:function(C,m){var y=this,z=y.settings,u=y.writer,p,j,r,E,D,F,A,h,x,k,q,B,o;if(!z.node_filter||z.node_filter(C)){switch(C.nodeType){case 1:if(C.hasAttribute?C.hasAttribute("mce_bogus"):C.getAttribute("mce_bogus")){return}o=false;p=C.hasChildNodes();k=C.getAttribute("mce_name")||C.nodeName.toLowerCase();if(d){if(C.scopeName!=="HTML"&&C.scopeName!=="html"){k=C.scopeName+":"+k}}if(k.indexOf("mce:")===0){k=k.substring(4)}if(!y.validElementsRE.test(k)||(y.invalidElementsRE&&y.invalidElementsRE.test(k))||m){o=true;break}if(d){if(z.fix_content_duplication){if(C.mce_serialized==y.key){return}C.mce_serialized=y.key}if(k.charAt(0)=="/"){k=k.substring(1)}}else{if(a){if(C.nodeName==="BR"&&C.getAttribute("type")=="_moz"){return}}}if(y.childRules){if(y.parentElementsRE.test(y.elementName)){if(!y.childRules[y.elementName].test(k)){o=true;break}}y.elementName=k}q=y.findRule(k);k=q.name||k;if((!p&&q.noEmpty)||(d&&!k)){o=true;break}if(q.requiredAttribs){F=q.requiredAttribs;for(E=F.length-1;E>=0;E--){if(this.dom.getAttrib(C,F[E])!==""){break}}if(E==-1){o=true;break}}u.writeStartElement(k);if(q.attribs){for(E=0,A=q.attribs,D=A.length;E<D;E++){F=A[E];x=y._getAttrib(C,F);if(x!==null){u.writeAttribute(F.name,x)}}}if(q.validAttribsRE){A=y.dom.getAttribs(C);for(E=A.length-1;E>-1;E--){h=A[E];if(h.specified){F=h.nodeName.toLowerCase();if(z.invalid_attrs.test(F)||!q.validAttribsRE.test(F)){continue}B=y.findAttribRule(q,F);x=y._getAttrib(C,B,F);if(x!==null){u.writeAttribute(F,x)}}}}if(q.padd){if(p&&(r=C.firstChild)&&r.nodeType===1&&C.childNodes.length===1){if(r.hasAttribute?r.hasAttribute("mce_bogus"):r.getAttribute("mce_bogus")){u.writeText("\u00a0")}}else{if(!p){u.writeText("\u00a0")}}}break;case 3:if(y.childRules&&y.parentElementsRE.test(y.elementName)){if(!y.childRules[y.elementName].test(C.nodeName)){return}}return u.writeText(C.nodeValue);case 4:return u.writeCDATA(C.nodeValue);case 8:return u.writeComment(C.nodeValue)}}else{if(C.nodeType==1){p=C.hasChildNodes()}}if(p){r=C.firstChild;while(r){y._serializeNode(r);y.elementName=k;r=r.nextSibling}}if(!o){if(p||!z.closed.test(k)){u.writeFullEndElement()}else{u.writeEndElement()}}},_protect:function(j){var i=this;j.items=j.items||[];function h(l){return l.replace(/[\r\n\\]/g,function(m){if(m==="\n"){return"\\n"}else{if(m==="\\"){return"\\\\"}}return"\\r"})}function k(l){return l.replace(/\\[\\rn]/g,function(m){if(m==="\\n"){return"\n"}else{if(m==="\\\\"){return"\\"}}return"\r"})}f(j.patterns,function(l){j.content=k(h(j.content).replace(l.pattern,function(n,o,m,p){m=k(m);if(l.encode){m=i._encode(m)}j.items.push(m);return o+"<!--mce:"+(j.items.length-1)+"-->"+p}))});return j},_unprotect:function(i,j){i=i.replace(/\<!--mce:([0-9]+)--\>/g,function(k,h){return j.items[parseInt(h)]});j.items=[];return i},_encode:function(m){var j=this,k=j.settings,i;if(k.entity_encoding!=="raw"){if(k.entity_encoding.indexOf("named")!=-1){j.setEntities(k.entities);i=j.entityLookup;m=m.replace(j.entitiesRE,function(h){var l;if(l=i[h]){h="&"+l+";"}return h})}if(k.entity_encoding.indexOf("numeric")!=-1){m=m.replace(/[\u007E-\uFFFF]/g,function(h){return"&#"+h.charCodeAt(0)+";"})}}return m},_setup:function(){var h=this,i=this.settings;if(h.done){return}h.done=1;h.setRules(i.valid_elements);h.addRules(i.extended_valid_elements);h.addValidChildRules(i.valid_child_elements);if(i.invalid_elements){h.invalidElementsRE=new RegExp("^("+c(i.invalid_elements.replace(/,/g,"|").toLowerCase())+")$")}if(i.attrib_value_filter){h.attribValueFilter=i.attribValueFilter}},_getAttrib:function(m,j,h){var l,k;h=h||j.name;if(j.forcedVal&&(k=j.forcedVal)){if(k==="{$uid}"){return this.dom.uniqueId()}return k}k=this.dom.getAttrib(m,h);if(this.settings.bool_attrs.test(h)&&k){k=(""+k).toLowerCase();if(k==="false"||k==="0"){return null}k=h}switch(h){case"rowspan":case"colspan":if(k=="1"){k=""}break}if(this.attribValueFilter){k=this.attribValueFilter(h,k,m)}if(j.validVals){for(l=j.validVals.length-1;l>=0;l--){if(k==j.validVals[l]){break}}if(l==-1){return null}}if(k===""&&typeof(j.defaultVal)!="undefined"){k=j.defaultVal;if(k==="{$uid}"){return this.dom.uniqueId()}return k}else{if(h=="class"&&this.processObj.get){k=k.replace(/\s?mceItem\w+\s?/g,"")}}if(k===""){return null}return k}})})(tinymce);(function(tinymce){var each=tinymce.each,Event=tinymce.dom.Event;tinymce.create("tinymce.dom.ScriptLoader",{ScriptLoader:function(s){this.settings=s||{};this.queue=[];this.lookup={}},isDone:function(u){return this.lookup[u]?this.lookup[u].state==2:0},markDone:function(u){this.lookup[u]={state:2,url:u}},add:function(u,cb,s,pr){var t=this,lo=t.lookup,o;if(o=lo[u]){if(cb&&o.state==2){cb.call(s||this)}return o}o={state:0,url:u,func:cb,scope:s||this};if(pr){t.queue.unshift(o)}else{t.queue.push(o)}lo[u]=o;return o},load:function(u,cb,s){var t=this,o;if(o=t.lookup[u]){if(cb&&o.state==2){cb.call(s||t)}return o}function loadScript(u){if(Event.domLoaded||t.settings.strict_mode){tinymce.util.XHR.send({url:tinymce._addVer(u),error:t.settings.error,async:false,success:function(co){t.eval(co)}})}else{document.write('<script type="text/javascript" src="'+tinymce._addVer(u)+'"><\/script>')}}if(!tinymce.is(u,"string")){each(u,function(u){loadScript(u)});if(cb){cb.call(s||t)}}else{loadScript(u);if(cb){cb.call(s||t)}}},loadQueue:function(cb,s){var t=this;if(!t.queueLoading){t.queueLoading=1;t.queueCallbacks=[];t.loadScripts(t.queue,function(){t.queueLoading=0;if(cb){cb.call(s||t)}each(t.queueCallbacks,function(o){o.func.call(o.scope)})})}else{if(cb){t.queueCallbacks.push({func:cb,scope:s||t})}}},eval:function(co){var w=window;if(!w.execScript){try{eval.call(w,co)}catch(ex){eval(co,w)}}else{w.execScript(co)}},loadScripts:function(sc,cb,s){var t=this,lo=t.lookup;function done(o){o.state=2;if(o.func){o.func.call(o.scope||t)}}function allDone(){var l;l=sc.length;each(sc,function(o){o=lo[o.url];if(o.state===2){done(o);l--}else{load(o)}});if(l===0&&cb){cb.call(s||t);cb=0}}function load(o){if(o.state>0){return}o.state=1;tinymce.dom.ScriptLoader.loadScript(o.url,function(){done(o);allDone()})}each(sc,function(o){var u=o.url;if(!lo[u]){lo[u]=o;t.queue.push(o)}else{o=lo[u]}if(o.state>0){return}if(!Event.domLoaded&&!t.settings.strict_mode){var ix,ol="";if(cb||o.func){o.state=1;ix=tinymce.dom.ScriptLoader._addOnLoad(function(){done(o);allDone()});if(tinymce.isIE){ol=' onreadystatechange="'}else{ol=' onload="'}ol+="tinymce.dom.ScriptLoader._onLoad(this,'"+u+"',"+ix+');"'}document.write('<script type="text/javascript" src="'+tinymce._addVer(u)+'"'+ol+"><\/script>");if(!o.func){done(o)}}else{load(o)}});allDone()},"static":{_addOnLoad:function(f){var t=this;t._funcs=t._funcs||[];t._funcs.push(f);return t._funcs.length-1},_onLoad:function(e,u,ix){if(!tinymce.isIE||e.readyState=="complete"){this._funcs[ix].call(this)}},loadScript:function(u,cb){var id=tinymce.DOM.uniqueId(),e;function done(){Event.clear(id);tinymce.DOM.remove(id);if(cb){cb.call(document,u);cb=0}}if(tinymce.isIE){tinymce.util.XHR.send({url:tinymce._addVer(u),async:false,success:function(co){window.execScript(co);done()}})}else{e=tinymce.DOM.create("script",{id:id,type:"text/javascript",src:tinymce._addVer(u)});Event.add(e,"load",done);(document.getElementsByTagName("head")[0]||document.body).appendChild(e)}}}});tinymce.ScriptLoader=new tinymce.dom.ScriptLoader()})(tinymce);(function(c){var b=c.DOM,a=c.is;c.create("tinymce.ui.Control",{Control:function(e,d){this.id=e;this.settings=d=d||{};this.rendered=false;this.onRender=new c.util.Dispatcher(this);this.classPrefix="";this.scope=d.scope||this;this.disabled=0;this.active=0},setDisabled:function(d){var f;if(d!=this.disabled){f=b.get(this.id);if(f&&this.settings.unavailable_prefix){if(d){this.prevTitle=f.title;f.title=this.settings.unavailable_prefix+": "+f.title}else{f.title=this.prevTitle}}this.setState("Disabled",d);this.setState("Enabled",!d);this.disabled=d}},isDisabled:function(){return this.disabled},setActive:function(d){if(d!=this.active){this.setState("Active",d);this.active=d}},isActive:function(){return this.active},setState:function(f,d){var e=b.get(this.id);f=this.classPrefix+f;if(d){b.addClass(e,f)}else{b.removeClass(e,f)}},isRendered:function(){return this.rendered},renderHTML:function(){},renderTo:function(d){b.setHTML(d,this.renderHTML())},postRender:function(){var e=this,d;if(a(e.disabled)){d=e.disabled;e.disabled=-1;e.setDisabled(d)}if(a(e.active)){d=e.active;e.active=-1;e.setActive(d)}},remove:function(){b.remove(this.id);this.destroy()},destroy:function(){c.dom.Event.clear(this.id)}})})(tinymce);tinymce.create("tinymce.ui.Container:tinymce.ui.Control",{Container:function(b,a){this.parent(b,a);this.controls=[];this.lookup={}},add:function(a){this.lookup[a.id]=a;this.controls.push(a);return a},get:function(a){return this.lookup[a]}});tinymce.create("tinymce.ui.Separator:tinymce.ui.Control",{Separator:function(b,a){this.parent(b,a);this.classPrefix="mceSeparator"},renderHTML:function(){return tinymce.DOM.createHTML("span",{"class":this.classPrefix})}});(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.MenuItem:tinymce.ui.Control",{MenuItem:function(g,f){this.parent(g,f);this.classPrefix="mceMenuItem"},setSelected:function(f){this.setState("Selected",f);this.selected=f},isSelected:function(){return this.selected},postRender:function(){var f=this;f.parent();if(c(f.selected)){f.setSelected(f.selected)}}})})(tinymce);(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.Menu:tinymce.ui.MenuItem",{Menu:function(h,g){var f=this;f.parent(h,g);f.items={};f.collapsed=false;f.menuCount=0;f.onAddItem=new d.util.Dispatcher(this)},expand:function(g){var f=this;if(g){a(f,function(h){if(h.expand){h.expand()}},"items",f)}f.collapsed=false},collapse:function(g){var f=this;if(g){a(f,function(h){if(h.collapse){h.collapse()}},"items",f)}f.collapsed=true},isCollapsed:function(){return this.collapsed},add:function(f){if(!f.settings){f=new d.ui.MenuItem(f.id||b.uniqueId(),f)}this.onAddItem.dispatch(this,f);return this.items[f.id]=f},addSeparator:function(){return this.add({separator:true})},addMenu:function(f){if(!f.collapse){f=this.createMenu(f)}this.menuCount++;return this.add(f)},hasMenus:function(){return this.menuCount!==0},remove:function(f){delete this.items[f.id]},removeAll:function(){var f=this;a(f,function(g){if(g.removeAll){g.removeAll()}else{g.remove()}g.destroy()},"items",f);f.items={}},createMenu:function(g){var f=new d.ui.Menu(g.id||b.uniqueId(),g);f.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return f}})})(tinymce);(function(e){var d=e.is,c=e.DOM,f=e.each,a=e.dom.Event,b=e.dom.Element;e.create("tinymce.ui.DropMenu:tinymce.ui.Menu",{DropMenu:function(h,g){g=g||{};g.container=g.container||c.doc.body;g.offset_x=g.offset_x||0;g.offset_y=g.offset_y||0;g.vp_offset_x=g.vp_offset_x||0;g.vp_offset_y=g.vp_offset_y||0;if(d(g.icons)&&!g.icons){g["class"]+=" mceNoIcons"}this.parent(h,g);this.onShowMenu=new e.util.Dispatcher(this);this.onHideMenu=new e.util.Dispatcher(this);this.classPrefix="mceMenu"},createMenu:function(j){var h=this,i=h.settings,g;j.container=j.container||i.container;j.parent=h;j.constrain=j.constrain||i.constrain;j["class"]=j["class"]||i["class"];j.vp_offset_x=j.vp_offset_x||i.vp_offset_x;j.vp_offset_y=j.vp_offset_y||i.vp_offset_y;g=new e.ui.DropMenu(j.id||c.uniqueId(),j);g.onAddItem.add(h.onAddItem.dispatch,h.onAddItem);return g},update:function(){var i=this,j=i.settings,g=c.get("menu_"+i.id+"_tbl"),l=c.get("menu_"+i.id+"_co"),h,k;h=j.max_width?Math.min(g.clientWidth,j.max_width):g.clientWidth;k=j.max_height?Math.min(g.clientHeight,j.max_height):g.clientHeight;if(!c.boxModel){i.element.setStyles({width:h+2,height:k+2})}else{i.element.setStyles({width:h,height:k})}if(j.max_width){c.setStyle(l,"width",h)}if(j.max_height){c.setStyle(l,"height",k);if(g.clientHeight<j.max_height){c.setStyle(l,"overflow","hidden")}}},showMenu:function(p,n,r){var z=this,A=z.settings,o,g=c.getViewPort(),u,l,v,q,i=2,k,j,m=z.classPrefix;z.collapse(1);if(z.isMenuVisible){return}if(!z.rendered){o=c.add(z.settings.container,z.renderNode());f(z.items,function(h){h.postRender()});z.element=new b("menu_"+z.id,{blocker:1,container:A.container})}else{o=c.get("menu_"+z.id)}if(!e.isOpera){c.setStyles(o,{left:-65535,top:-65535})}c.show(o);z.update();p+=A.offset_x||0;n+=A.offset_y||0;g.w-=4;g.h-=4;if(A.constrain){u=o.clientWidth-i;l=o.clientHeight-i;v=g.x+g.w;q=g.y+g.h;if((p+A.vp_offset_x+u)>v){p=r?r-u:Math.max(0,(v-A.vp_offset_x)-u)}if((n+A.vp_offset_y+l)>q){n=Math.max(0,(q-A.vp_offset_y)-l)}}c.setStyles(o,{left:p,top:n});z.element.update();z.isMenuVisible=1;z.mouseClickFunc=a.add(o,"click",function(s){var h;s=s.target;if(s&&(s=c.getParent(s,"tr"))&&!c.hasClass(s,m+"ItemSub")){h=z.items[s.id];if(h.isDisabled()){return}k=z;while(k){if(k.hideMenu){k.hideMenu()}k=k.settings.parent}if(h.settings.onclick){h.settings.onclick(s)}return a.cancel(s)}});if(z.hasMenus()){z.mouseOverFunc=a.add(o,"mouseover",function(w){var h,t,s;w=w.target;if(w&&(w=c.getParent(w,"tr"))){h=z.items[w.id];if(z.lastMenu){z.lastMenu.collapse(1)}if(h.isDisabled()){return}if(w&&c.hasClass(w,m+"ItemSub")){t=c.getRect(w);h.showMenu((t.x+t.w-i),t.y-i,t.x);z.lastMenu=h;c.addClass(c.get(h.id).firstChild,m+"ItemActive")}}})}z.onShowMenu.dispatch(z);if(A.keyboard_focus){a.add(o,"keydown",z._keyHandler,z);c.select("a","menu_"+z.id)[0].focus();z._focusIdx=0}},hideMenu:function(j){var g=this,i=c.get("menu_"+g.id),h;if(!g.isMenuVisible){return}a.remove(i,"mouseover",g.mouseOverFunc);a.remove(i,"click",g.mouseClickFunc);a.remove(i,"keydown",g._keyHandler);c.hide(i);g.isMenuVisible=0;if(!j){g.collapse(1)}if(g.element){g.element.hide()}if(h=c.get(g.id)){c.removeClass(h.firstChild,g.classPrefix+"ItemActive")}g.onHideMenu.dispatch(g)},add:function(i){var g=this,h;i=g.parent(i);if(g.isRendered&&(h=c.get("menu_"+g.id))){g._add(c.select("tbody",h)[0],i)}return i},collapse:function(g){this.parent(g);this.hideMenu(1)},remove:function(g){c.remove(g.id);this.destroy();return this.parent(g)},destroy:function(){var g=this,h=c.get("menu_"+g.id);a.remove(h,"mouseover",g.mouseOverFunc);a.remove(h,"click",g.mouseClickFunc);if(g.element){g.element.remove()}c.remove(h)},renderNode:function(){var i=this,j=i.settings,l,h,k,g;g=c.create("div",{id:"menu_"+i.id,"class":j["class"],style:"position:absolute;left:0;top:0;z-index:200000"});k=c.add(g,"div",{id:"menu_"+i.id+"_co","class":i.classPrefix+(j["class"]?" "+j["class"]:"")});i.element=new b("menu_"+i.id,{blocker:1,container:j.container});if(j.menu_line){c.add(k,"span",{"class":i.classPrefix+"Line"})}l=c.add(k,"table",{id:"menu_"+i.id+"_tbl",border:0,cellPadding:0,cellSpacing:0});h=c.add(l,"tbody");f(i.items,function(m){i._add(h,m)});i.rendered=true;return g},_keyHandler:function(j){var i=this,h=j.keyCode;function g(m){var k=i._focusIdx+m,l=c.select("a","menu_"+i.id)[k];if(l){i._focusIdx=k;l.focus()}}switch(h){case 38:g(-1);return;case 40:g(1);return;case 13:return;case 27:return this.hideMenu()}},_add:function(j,h){var i,q=h.settings,p,l,k,m=this.classPrefix,g;if(q.separator){l=c.add(j,"tr",{id:h.id,"class":m+"ItemSeparator"});c.add(l,"td",{"class":m+"ItemSeparator"});if(i=l.previousSibling){c.addClass(i,"mceLast")}return}i=l=c.add(j,"tr",{id:h.id,"class":m+"Item "+m+"ItemEnabled"});i=k=c.add(i,"td");i=p=c.add(i,"a",{href:"javascript:;",onclick:"return false;",onmousedown:"return false;"});c.addClass(k,q["class"]);g=c.add(i,"span",{"class":"mceIcon"+(q.icon?" mce_"+q.icon:"")});if(q.icon_src){c.add(g,"img",{src:q.icon_src})}i=c.add(i,q.element||"span",{"class":"mceText",title:h.settings.title},h.settings.title);if(h.settings.style){c.setAttrib(i,"style",h.settings.style)}if(j.childNodes.length==1){c.addClass(l,"mceFirst")}if((i=l.previousSibling)&&c.hasClass(i,m+"ItemSeparator")){c.addClass(l,"mceFirst")}if(h.collapse){c.addClass(l,m+"ItemSub")}if(i=l.previousSibling){c.removeClass(i,"mceLast")}c.addClass(l,"mceLast")}})})(tinymce);(function(b){var a=b.DOM;b.create("tinymce.ui.Button:tinymce.ui.Control",{Button:function(d,c){this.parent(d,c);this.classPrefix="mceButton"},renderHTML:function(){var f=this.classPrefix,e=this.settings,d,c;c=a.encode(e.label||"");d='<a id="'+this.id+'" href="javascript:;" class="'+f+" "+f+"Enabled "+e["class"]+(c?" "+f+"Labeled":"")+'" onmousedown="return false;" onclick="return false;" title="'+a.encode(e.title)+'">';if(e.image){d+='<img class="mceIcon" src="'+e.image+'" />'+c+"</a>"}else{d+='<span class="mceIcon '+e["class"]+'"></span>'+(c?'<span class="'+f+'Label">'+c+"</span>":"")+"</a>"}return d},postRender:function(){var c=this,d=c.settings;b.dom.Event.add(c.id,"click",function(f){if(!c.isDisabled()){return d.onclick.call(d.scope,f)}})}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.ListBox:tinymce.ui.Control",{ListBox:function(h,g){var f=this;f.parent(h,g);f.items=[];f.onChange=new a(f);f.onPostRender=new a(f);f.onAdd=new a(f);f.onRenderMenu=new d.util.Dispatcher(this);f.classPrefix="mceListBox"},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){var g=this,h,i;if(f!=g.selectedIndex){h=c.get(g.id+"_text");i=g.items[f];if(i){g.selectedValue=i.value;g.selectedIndex=f;c.setHTML(h,c.encode(i.title));c.removeClass(h,"mceTitle")}else{c.setHTML(h,c.encode(g.settings.title));c.addClass(h,"mceTitle");g.selectedValue=g.selectedIndex=null}h=0}},add:function(i,f,h){var g=this;h=h||{};h=d.extend(h,{title:i,value:f});g.items.push(h);g.onAdd.dispatch(g,h)},getLength:function(){return this.items.length},renderHTML:function(){var i="",f=this,g=f.settings,j=f.classPrefix;i='<table id="'+f.id+'" cellpadding="0" cellspacing="0" class="'+j+" "+j+"Enabled"+(g["class"]?(" "+g["class"]):"")+'"><tbody><tr>';i+="<td>"+c.createHTML("a",{id:f.id+"_text",href:"javascript:;","class":"mceText",onclick:"return false;",onmousedown:"return false;"},c.encode(f.settings.title))+"</td>";i+="<td>"+c.createHTML("a",{id:f.id+"_open",tabindex:-1,href:"javascript:;","class":"mceOpen",onclick:"return false;",onmousedown:"return false;"},"<span></span>")+"</td>";i+="</tr></tbody></table>";return i},showMenu:function(){var g=this,j,i,h=c.get(this.id),f;if(g.isDisabled()||g.items.length==0){return}if(g.menu&&g.menu.isMenuVisible){return g.hideMenu()}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}j=c.getPos(this.settings.menu_container);i=c.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.keyboard_focus=!d.isOpera;if(g.oldID){f.items[g.oldID].setSelected(0)}e(g.items,function(k){if(k.value===g.selectedValue){f.items[k.id].setSelected(1);g.oldID=k.id}});f.showMenu(0,h.clientHeight);b.add(c.doc,"mousedown",g.hideMenu,g);c.addClass(g.id,g.classPrefix+"Selected")},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&(g.target.id==f.id+"_text"||g.target.id==f.id+"_open")){return}if(!g||!c.getParent(g.target,".mceMenu")){c.removeClass(f.id,f.classPrefix+"Selected");b.remove(c.doc,"mousedown",f.hideMenu,f);if(f.menu){f.menu.hideMenu()}}},renderMenu:function(){var g=this,f;f=g.settings.control_manager.createDropMenu(g.id+"_menu",{menu_line:1,"class":g.classPrefix+"Menu mceNoIcons",max_width:150,max_height:150});f.onHideMenu.add(g.hideMenu,g);f.add({title:g.settings.title,"class":"mceMenuItemTitle",onclick:function(){if(g.settings.onselect("")!==false){g.select("")}}});e(g.items,function(h){h.id=c.uniqueId();h.onclick=function(){if(g.settings.onselect(h.value)!==false){g.select(h.value)}};f.add(h)});g.onRenderMenu.dispatch(g,f);g.menu=f},postRender:function(){var f=this,g=f.classPrefix;b.add(f.id,"click",f.showMenu,f);b.add(f.id+"_text","focus",function(h){if(!f._focused){f.keyDownHandler=b.add(f.id+"_text","keydown",function(l){var i=-1,j,k=l.keyCode;e(f.items,function(m,n){if(f.selectedValue==m.value){i=n}});if(k==38){j=f.items[i-1]}else{if(k==40){j=f.items[i+1]}else{if(k==13){j=f.selectedValue;f.selectedValue=null;f.settings.onselect(j);return b.cancel(l)}}}if(j){f.hideMenu();f.select(j.value)}})}f._focused=1});b.add(f.id+"_text","blur",function(){b.remove(f.id+"_text","keydown",f.keyDownHandler);f._focused=0});if(d.isIE6||!c.boxModel){b.add(f.id,"mouseover",function(){if(!c.hasClass(f.id,g+"Disabled")){c.addClass(f.id,g+"Hover")}});b.add(f.id,"mouseout",function(){if(!c.hasClass(f.id,g+"Disabled")){c.removeClass(f.id,g+"Hover")}})}f.onPostRender.dispatch(f,c.get(f.id))},destroy:function(){this.parent();b.clear(this.id+"_text")}})})(tinymce);(function(d){var c=d.DOM,b=d.dom.Event,e=d.each,a=d.util.Dispatcher;d.create("tinymce.ui.NativeListBox:tinymce.ui.ListBox",{NativeListBox:function(g,f){this.parent(g,f);this.classPrefix="mceNativeListBox"},setDisabled:function(f){c.get(this.id).disabled=f},isDisabled:function(){return c.get(this.id).disabled},select:function(h){var g=this,j,i;if(h==undefined){return g.selectByIndex(-1)}if(h&&h.call){i=h}else{i=function(f){return f==h}}if(h!=g.selectedValue){e(g.items,function(k,f){if(i(k.value)){j=1;g.selectByIndex(f);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(f){c.get(this.id).selectedIndex=f+1;this.selectedValue=this.items[f]?this.items[f].value:null},add:function(j,g,f){var i,h=this;f=f||{};f.value=g;if(h.isRendered()){c.add(c.get(this.id),"option",f,j)}i={title:j,value:g,attribs:f};h.items.push(i);h.onAdd.dispatch(h,i)},getLength:function(){return c.get(this.id).options.length-1},renderHTML:function(){var g,f=this;g=c.createHTML("option",{value:""},"-- "+f.settings.title+" --");e(f.items,function(h){g+=c.createHTML("option",{value:h.value},h.title)});g=c.createHTML("select",{id:f.id,"class":"mceNativeListBox"},g);return g},postRender:function(){var g=this,h;g.rendered=true;function f(j){var i=g.items[j.target.selectedIndex-1];if(i&&(i=i.value)){g.onChange.dispatch(g,i);if(g.settings.onselect){g.settings.onselect(i)}}}b.add(g.id,"change",f);b.add(g.id,"keydown",function(j){var i;b.remove(g.id,"change",h);i=b.add(g.id,"blur",function(){b.add(g.id,"change",f);b.remove(g.id,"blur",i)});if(j.keyCode==13||j.keyCode==32){f(j);return b.cancel(j)}});g.onPostRender.dispatch(g,c.get(g.id))}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.MenuButton:tinymce.ui.Button",{MenuButton:function(f,e){this.parent(f,e);this.onRenderMenu=new c.util.Dispatcher(this);e.menu_container=e.menu_container||b.doc.body},showMenu:function(){var g=this,j,i,h=b.get(g.id),f;if(g.isDisabled()){return}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}if(g.isMenuVisible){return g.hideMenu()}j=b.getPos(g.settings.menu_container);i=b.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.vp_offset_x=i.x;f.settings.vp_offset_y=i.y;f.settings.keyboard_focus=g._focused;f.showMenu(0,h.clientHeight);a.add(b.doc,"mousedown",g.hideMenu,g);g.setState("Selected",1);g.isMenuVisible=1},renderMenu:function(){var f=this,e;e=f.settings.control_manager.createDropMenu(f.id+"_menu",{menu_line:1,"class":this.classPrefix+"Menu",icons:f.settings.icons});e.onHideMenu.add(f.hideMenu,f);f.onRenderMenu.dispatch(f,e);f.menu=e},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&b.getParent(g.target,function(h){return h.id===f.id||h.id===f.id+"_open"})){return}if(!g||!b.getParent(g.target,".mceMenu")){f.setState("Selected",0);a.remove(b.doc,"mousedown",f.hideMenu,f);if(f.menu){f.menu.hideMenu()}}f.isMenuVisible=0},postRender:function(){var e=this,f=e.settings;a.add(e.id,"click",function(){if(!e.isDisabled()){if(f.onclick){f.onclick(e.value)}e.showMenu()}})}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.SplitButton:tinymce.ui.MenuButton",{SplitButton:function(f,e){this.parent(f,e);this.classPrefix="mceSplitButton"},renderHTML:function(){var i,f=this,g=f.settings,e;i="<tbody><tr>";if(g.image){e=b.createHTML("img ",{src:g.image,"class":"mceAction "+g["class"]})}else{e=b.createHTML("span",{"class":"mceAction "+g["class"]},"")}i+="<td>"+b.createHTML("a",{id:f.id+"_action",href:"javascript:;","class":"mceAction "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"</td>";e=b.createHTML("span",{"class":"mceOpen "+g["class"]});i+="<td>"+b.createHTML("a",{id:f.id+"_open",href:"javascript:;","class":"mceOpen "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"</td>";i+="</tr></tbody>";return b.createHTML("table",{id:f.id,"class":"mceSplitButton mceSplitButtonEnabled "+g["class"],cellpadding:"0",cellspacing:"0",onmousedown:"return false;",title:g.title},i)},postRender:function(){var e=this,f=e.settings;if(f.onclick){a.add(e.id+"_action","click",function(){if(!e.isDisabled()){f.onclick(e.value)}})}a.add(e.id+"_open","click",e.showMenu,e);a.add(e.id+"_open","focus",function(){e._focused=1});a.add(e.id+"_open","blur",function(){e._focused=0});if(c.isIE6||!b.boxModel){a.add(e.id,"mouseover",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.addClass(e.id,"mceSplitButtonHover")}});a.add(e.id,"mouseout",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.removeClass(e.id,"mceSplitButtonHover")}})}},destroy:function(){this.parent();a.clear(this.id+"_action");a.clear(this.id+"_open")}})})(tinymce);(function(d){var c=d.DOM,a=d.dom.Event,b=d.is,e=d.each;d.create("tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton",{ColorSplitButton:function(h,g){var f=this;f.parent(h,g);f.settings=g=d.extend({colors:"000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",grid_width:8,default_color:"#888888"},f.settings);f.onShowMenu=new d.util.Dispatcher(f);f.onHideMenu=new d.util.Dispatcher(f);f.value=g.default_color},showMenu:function(){var f=this,g,j,i,h;if(f.isDisabled()){return}if(!f.isMenuRendered){f.renderMenu();f.isMenuRendered=true}if(f.isMenuVisible){return f.hideMenu()}i=c.get(f.id);c.show(f.id+"_menu");c.addClass(i,"mceSplitButtonSelected");h=c.getPos(i);c.setStyles(f.id+"_menu",{left:h.x,top:h.y+i.clientHeight,zIndex:200000});i=0;a.add(c.doc,"mousedown",f.hideMenu,f);if(f._focused){f._keyHandler=a.add(f.id+"_menu","keydown",function(k){if(k.keyCode==27){f.hideMenu()}});c.select("a",f.id+"_menu")[0].focus()}f.onShowMenu.dispatch(f);f.isMenuVisible=1},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&c.getParent(g.target,function(h){return h.id===f.id+"_open"})){return}if(!g||!c.getParent(g.target,".mceSplitButtonMenu")){c.removeClass(f.id,"mceSplitButtonSelected");a.remove(c.doc,"mousedown",f.hideMenu,f);a.remove(f.id+"_menu","keydown",f._keyHandler);c.hide(f.id+"_menu")}f.onHideMenu.dispatch(f);f.isMenuVisible=0},renderMenu:function(){var k=this,f,j=0,l=k.settings,p,h,o,g;g=c.add(l.menu_container,"div",{id:k.id+"_menu","class":l.menu_class+" "+l["class"],style:"position:absolute;left:0;top:-1000px;"});f=c.add(g,"div",{"class":l["class"]+" mceSplitButtonMenu"});c.add(f,"span",{"class":"mceMenuLine"});p=c.add(f,"table",{"class":"mceColorSplitMenu"});h=c.add(p,"tbody");j=0;e(b(l.colors,"array")?l.colors:l.colors.split(","),function(i){i=i.replace(/^#/,"");if(!j--){o=c.add(h,"tr");j=l.grid_width-1}p=c.add(o,"td");p=c.add(p,"a",{href:"javascript:;",style:{backgroundColor:"#"+i},mce_color:"#"+i})});if(l.more_colors_func){p=c.add(h,"tr");p=c.add(p,"td",{colspan:l.grid_width,"class":"mceMoreColors"});p=c.add(p,"a",{id:k.id+"_more",href:"javascript:;",onclick:"return false;","class":"mceMoreColors"},l.more_colors_title);a.add(p,"click",function(i){l.more_colors_func.call(l.more_colors_scope||this);return a.cancel(i)})}c.addClass(f,"mceColorSplitMenu");a.add(k.id+"_menu","click",function(i){var m;i=i.target;if(i.nodeName=="A"&&(m=i.getAttribute("mce_color"))){k.setColor(m)}return a.cancel(i)});return g},setColor:function(g){var f=this;c.setStyle(f.id+"_preview","backgroundColor",g);f.value=g;f.hideMenu();f.settings.onselect(g)},postRender:function(){var f=this,g=f.id;f.parent();c.add(g+"_action","div",{id:g+"_preview","class":"mceColorPreview"});c.setStyle(f.id+"_preview","backgroundColor",f.value)},destroy:function(){this.parent();a.clear(this.id+"_menu");a.clear(this.id+"_more");c.remove(this.id+"_menu")}})})(tinymce);tinymce.create("tinymce.ui.Toolbar:tinymce.ui.Container",{renderHTML:function(){var l=this,e="",g,j,b=tinymce.DOM,m=l.settings,d,a,f,k;k=l.controls;for(d=0;d<k.length;d++){j=k[d];a=k[d-1];f=k[d+1];if(d===0){g="mceToolbarStart";if(j.Button){g+=" mceToolbarStartButton"}else{if(j.SplitButton){g+=" mceToolbarStartSplitButton"}else{if(j.ListBox){g+=" mceToolbarStartListBox"}}}e+=b.createHTML("td",{"class":g},b.createHTML("span",null,"<!-- IE -->"))}if(a&&j.ListBox){if(a.Button||a.SplitButton){e+=b.createHTML("td",{"class":"mceToolbarEnd"},b.createHTML("span",null,"<!-- IE -->"))}}if(b.stdMode){e+='<td style="position: relative">'+j.renderHTML()+"</td>"}else{e+="<td>"+j.renderHTML()+"</td>"}if(f&&j.ListBox){if(f.Button||f.SplitButton){e+=b.createHTML("td",{"class":"mceToolbarStart"},b.createHTML("span",null,"<!-- IE -->"))}}}g="mceToolbarEnd";if(j.Button){g+=" mceToolbarEndButton"}else{if(j.SplitButton){g+=" mceToolbarEndSplitButton"}else{if(j.ListBox){g+=" mceToolbarEndListBox"}}}e+=b.createHTML("td",{"class":g},b.createHTML("span",null,"<!-- IE -->"));return b.createHTML("table",{id:l.id,"class":"mceToolbar"+(m["class"]?" "+m["class"]:""),cellpadding:"0",cellspacing:"0",align:l.settings.align||""},"<tbody><tr>"+e+"</tr></tbody>")}});(function(b){var a=b.util.Dispatcher,c=b.each;b.create("tinymce.AddOnManager",{items:[],urls:{},lookup:{},onAdd:new a(this),get:function(d){return this.lookup[d]},requireLangPack:function(f){var d,e=b.EditorManager.settings;if(e&&e.language){d=this.urls[f]+"/langs/"+e.language+".js";if(!b.dom.Event.domLoaded&&!e.strict_mode){b.ScriptLoader.load(d)}else{b.ScriptLoader.add(d)}}},add:function(e,d){this.items.push(d);this.lookup[e]=d;this.onAdd.dispatch(this,e,d);return d},load:function(h,e,d,g){var f=this;if(f.urls[h]){return}if(e.indexOf("/")!=0&&e.indexOf("://")==-1){e=b.baseURL+"/"+e}f.urls[h]=e.substring(0,e.lastIndexOf("/"));b.ScriptLoader.add(e,d,g)}});b.PluginManager=new b.AddOnManager();b.ThemeManager=new b.AddOnManager()}(tinymce));(function(f){var g=f.each,h=f.extend,e=f.DOM,a=f.dom.Event,c=f.ThemeManager,b=f.PluginManager,d=f.explode;f.create("static tinymce.EditorManager",{editors:{},i18n:{},activeEditor:null,preInit:function(){var i=this,j=window.location;f.documentBaseURL=j.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");if(!/[\/\\]$/.test(f.documentBaseURL)){f.documentBaseURL+="/"}f.baseURL=new f.util.URI(f.documentBaseURL).toAbsolute(f.baseURL);f.EditorManager.baseURI=new f.util.URI(f.baseURL);if(document.domain&&j.hostname!=document.domain){f.relaxedDomain=document.domain}i.onBeforeUnload=new f.util.Dispatcher(i);a.add(window,"beforeunload",function(k){i.onBeforeUnload.dispatch(i,k)})},init:function(q){var p=this,l,k=f.ScriptLoader,o,n,i=[],m;function j(u,v,r){var t=u[v];if(!t){return}if(f.is(t,"string")){r=t.replace(/\.\w+$/,"");r=r?f.resolve(r):0;t=f.resolve(t)}return t.apply(r||this,Array.prototype.slice.call(arguments,2))}q=h({theme:"simple",language:"en",strict_loading_mode:document.contentType=="application/xhtml+xml"},q);p.settings=q;if(!a.domLoaded&&!q.strict_loading_mode){if(q.language){k.add(f.baseURL+"/langs/"+q.language+".js")}if(q.theme&&q.theme.charAt(0)!="-"&&!c.urls[q.theme]){c.load(q.theme,"themes/"+q.theme+"/editor_template"+f.suffix+".js")}if(q.plugins){l=d(q.plugins);if(f.inArray(l,"compat2x")!=-1){b.load("compat2x","plugins/compat2x/editor_plugin"+f.suffix+".js")}g(l,function(r){if(r&&r.charAt(0)!="-"&&!b.urls[r]){if(!f.isWebKit&&r=="safari"){return}b.load(r,"plugins/"+r+"/editor_plugin"+f.suffix+".js")}})}k.loadQueue()}a.add(document,"init",function(){var r,t;j(q,"onpageload");if(q.browsers){r=false;g(d(q.browsers),function(u){switch(u){case"ie":case"msie":if(f.isIE){r=true}break;case"gecko":if(f.isGecko){r=true}break;case"safari":case"webkit":if(f.isWebKit){r=true}break;case"opera":if(f.isOpera){r=true}break}});if(!r){return}}switch(q.mode){case"exact":r=q.elements||"";if(r.length>0){g(d(r),function(u){if(e.get(u)){m=new f.Editor(u,q);i.push(m);m.render(1)}else{o=0;g(document.forms,function(v){g(v.elements,function(w){if(w.name===u){u="mce_editor_"+o;e.setAttrib(w,"id",u);m=new f.Editor(u,q);i.push(m);m.render(1)}})})}})}break;case"textareas":case"specific_textareas":function s(v,u){return u.constructor===RegExp?u.test(v.className):e.hasClass(v,u)}g(e.select("textarea"),function(u){if(q.editor_deselector&&s(u,q.editor_deselector)){return}if(!q.editor_selector||s(u,q.editor_selector)){n=e.get(u.name);if(!u.id&&!n){u.id=u.name}if(!u.id||p.get(u.id)){u.id=e.uniqueId()}m=new f.Editor(u.id,q);i.push(m);m.render(1)}});break}if(q.oninit){r=t=0;g(i,function(u){t++;if(!u.initialized){u.onInit.add(function(){r++;if(r==t){j(q,"oninit")}})}else{r++}if(r==t){j(q,"oninit")}})}})},get:function(i){return this.editors[i]},getInstanceById:function(i){return this.get(i)},add:function(i){this.editors[i.id]=i;this._setActive(i);return i},remove:function(j){var i=this;if(!i.editors[j.id]){return null}delete i.editors[j.id];if(i.activeEditor==j){g(i.editors,function(k){i._setActive(k);return false})}j.destroy();return j},execCommand:function(o,m,l){var n=this,k=n.get(l),i;switch(o){case"mceFocus":k.focus();return true;case"mceAddEditor":case"mceAddControl":if(!n.get(l)){new f.Editor(l,n.settings).render()}return true;case"mceAddFrameControl":i=l.window;i.tinyMCE=tinyMCE;i.tinymce=f;f.DOM.doc=i.document;f.DOM.win=i;k=new f.Editor(l.element_id,l);k.render();if(f.isIE){function j(){k.destroy();i.detachEvent("onunload",j);i=i.tinyMCE=i.tinymce=null}i.attachEvent("onunload",j)}l.page_window=null;return true;case"mceRemoveEditor":case"mceRemoveControl":if(k){k.remove()}return true;case"mceToggleEditor":if(!k){n.execCommand("mceAddControl",0,l);return true}if(k.isHidden()){k.show()}else{k.hide()}return true}if(n.activeEditor){return n.activeEditor.execCommand(o,m,l)}return false},execInstanceCommand:function(m,l,k,j){var i=this.get(m);if(i){return i.execCommand(l,k,j)}return false},triggerSave:function(){g(this.editors,function(i){i.save()})},addI18n:function(k,l){var i,j=this.i18n;if(!f.is(k,"string")){g(k,function(n,m){g(n,function(q,p){g(q,function(s,r){if(p==="common"){j[m+"."+r]=s}else{j[m+"."+p+"."+r]=s}})})})}else{g(l,function(n,m){j[k+"."+m]=n})}},_setActive:function(i){this.selectedInstance=this.activeEditor=i}});f.EditorManager.preInit()})(tinymce);var tinyMCE=window.tinyMCE=tinymce.EditorManager;(function(n){var o=n.DOM,k=n.dom.Event,f=n.extend,l=n.util.Dispatcher;var j=n.each,a=n.isGecko,b=n.isIE,e=n.isWebKit;var d=n.is,h=n.ThemeManager,c=n.PluginManager,i=n.EditorManager;var p=n.inArray,m=n.grep,g=n.explode;n.create("tinymce.Editor",{Editor:function(u,r){var q=this;q.id=q.editorId=u;q.execCommands={};q.queryStateCommands={};q.queryValueCommands={};q.plugins={};j(["onPreInit","onBeforeRenderUI","onPostRender","onInit","onRemove","onActivate","onDeactivate","onClick","onEvent","onMouseUp","onMouseDown","onDblClick","onKeyDown","onKeyUp","onKeyPress","onContextMenu","onSubmit","onReset","onPaste","onPreProcess","onPostProcess","onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent","onLoadContent","onSaveContent","onNodeChange","onChange","onBeforeExecCommand","onExecCommand","onUndo","onRedo","onVisualAid","onSetProgressState"],function(s){q[s]=new l(q)});q.settings=r=f({id:u,language:"en",docs_language:"en",theme:"simple",skin:"default",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:n.documentBaseURL,add_form_submit_trigger:1,submit_patch:1,add_unload_trigger:1,convert_urls:1,relative_urls:1,remove_script_host:1,table_inline_editing:0,object_resizing:1,cleanup:1,accessibility_focus:1,custom_shortcuts:1,custom_undo_redo_keyboard_shortcuts:1,custom_undo_redo_restore_selection:1,custom_undo_redo:1,doctype:'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',visual_table_class:"mceItemTable",visual:1,inline_styles:true,convert_fonts_to_spans:true,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",apply_source_formatting:1,directionality:"ltr",forced_root_block:"p",valid_elements:"@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p[align],-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote[cite],-table[border=0|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value|tabindex|accesskey],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big",hidden_input:1,padd_empty_editor:1,render_ui:1,init_theme:1,force_p_newlines:1,indentation:"30px",keep_styles:1,fix_table_elements:1,removeformat_selector:"span,b,strong,em,i,font,u,strike"},r);q.documentBaseURI=new n.util.URI(r.document_base_url||n.documentBaseURL,{base_uri:tinyMCE.baseURI});q.baseURI=i.baseURI;q.execCallback("setup",q)},render:function(u){var v=this,w=v.settings,x=v.id,q=n.ScriptLoader;if(!k.domLoaded){k.add(document,"init",function(){v.render()});return}if(!u){w.strict_loading_mode=1;tinyMCE.settings=w}if(!v.getElement()){return}if(w.strict_loading_mode){q.settings.strict_mode=w.strict_loading_mode;n.DOM.settings.strict=1}if(!/TEXTAREA|INPUT/i.test(v.getElement().nodeName)&&w.hidden_input&&o.getParent(x,"form")){o.insertAfter(o.create("input",{type:"hidden",name:x}),x)}if(n.WindowManager){v.windowManager=new n.WindowManager(v)}if(w.encoding=="xml"){v.onGetContent.add(function(s,t){if(t.save){t.content=o.encode(t.content)}})}if(w.add_form_submit_trigger){v.onSubmit.addToTop(function(){if(v.initialized){v.save();v.isNotDirty=1}})}if(w.add_unload_trigger){v._beforeUnload=tinyMCE.onBeforeUnload.add(function(){if(v.initialized&&!v.destroyed&&!v.isHidden()){v.save({format:"raw",no_events:true})}})}n.addUnload(v.destroy,v);if(w.submit_patch){v.onBeforeRenderUI.add(function(){var s=v.getElement().form;if(!s){return}if(s._mceOldSubmit){return}if(!s.submit.nodeType&&!s.submit.length){v.formElement=s;s._mceOldSubmit=s.submit;s.submit=function(){i.triggerSave();v.isNotDirty=1;return v.formElement._mceOldSubmit(v.formElement)}}s=null})}function r(){if(w.language){q.add(n.baseURL+"/langs/"+w.language+".js")}if(w.theme&&w.theme.charAt(0)!="-"&&!h.urls[w.theme]){h.load(w.theme,"themes/"+w.theme+"/editor_template"+n.suffix+".js")}j(g(w.plugins),function(s){if(s&&s.charAt(0)!="-"&&!c.urls[s]){if(!e&&s=="safari"){return}c.load(s,"plugins/"+s+"/editor_plugin"+n.suffix+".js")}});q.loadQueue(function(){if(!v.removed){v.init()}})}if(w.plugins.indexOf("compat2x")!=-1){c.load("compat2x","plugins/compat2x/editor_plugin"+n.suffix+".js");q.loadQueue(r)}else{r()}},init:function(){var v,F=this,G=F.settings,C,z,B=F.getElement(),r,q,D,y,A,E;i.add(F);if(G.theme){G.theme=G.theme.replace(/-/,"");r=h.get(G.theme);F.theme=new r();if(F.theme.init&&G.init_theme){F.theme.init(F,h.urls[G.theme]||n.documentBaseURL.replace(/\/$/,""))}}j(g(G.plugins.replace(/\-/g,"")),function(w){var H=c.get(w),t=c.urls[w]||n.documentBaseURL.replace(/\/$/,""),s;if(H){s=new H(F,t);F.plugins[w]=s;if(s.init){s.init(F,t)}}});if(G.popup_css!==false){if(G.popup_css){G.popup_css=F.documentBaseURI.toAbsolute(G.popup_css)}else{G.popup_css=F.baseURI.toAbsolute("themes/"+G.theme+"/skins/"+G.skin+"/dialog.css")}}if(G.popup_css_add){G.popup_css+=","+F.documentBaseURI.toAbsolute(G.popup_css_add)}F.controlManager=new n.ControlManager(F);F.undoManager=new n.UndoManager(F);F.undoManager.onAdd.add(function(t,s){if(!s.initial){return F.onChange.dispatch(F,s,t)}});F.undoManager.onUndo.add(function(t,s){return F.onUndo.dispatch(F,s,t)});F.undoManager.onRedo.add(function(t,s){return F.onRedo.dispatch(F,s,t)});if(G.custom_undo_redo){F.onExecCommand.add(function(t,w,u,H,s){if(w!="Undo"&&w!="Redo"&&w!="mceRepaint"&&(!s||!s.skip_undo)){F.undoManager.add()}})}F.onExecCommand.add(function(s,t){if(!/^(FontName|FontSize)$/.test(t)){F.nodeChanged()}});if(a){function x(s,t){if(!t||!t.initial){F.execCommand("mceRepaint")}}F.onUndo.add(x);F.onRedo.add(x);F.onSetContent.add(x)}F.onBeforeRenderUI.dispatch(F,F.controlManager);if(G.render_ui){C=G.width||B.style.width||B.offsetWidth;z=G.height||B.style.height||B.offsetHeight;F.orgDisplay=B.style.display;E=/^[0-9\.]+(|px)$/i;if(E.test(""+C)){C=Math.max(parseInt(C)+(r.deltaWidth||0),100)}if(E.test(""+z)){z=Math.max(parseInt(z)+(r.deltaHeight||0),100)}r=F.theme.renderUI({targetNode:B,width:C,height:z,deltaWidth:G.delta_width,deltaHeight:G.delta_height});F.editorContainer=r.editorContainer}o.setStyles(r.sizeContainer||r.editorContainer,{width:C,height:z});z=(r.iframeHeight||z)+(typeof(z)=="number"?(r.deltaHeight||0):"");if(z<100){z=100}F.iframeHTML=G.doctype+'<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="'+F.documentBaseURI.getURI()+'" />';F.iframeHTML+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';if(n.relaxedDomain){F.iframeHTML+='<script type="text/javascript">document.domain = "'+n.relaxedDomain+'";<\/script>'}y=G.body_id||"tinymce";if(y.indexOf("=")!=-1){y=F.getParam("body_id","","hash");y=y[F.id]||y}A=G.body_class||"";if(A.indexOf("=")!=-1){A=F.getParam("body_class","","hash");A=A[F.id]||""}F.iframeHTML+='</head><body id="'+y+'" class="mceContentBody '+A+'"></body></html>';if(n.relaxedDomain){if(b||(n.isOpera&&parseFloat(opera.version())>=9.5)){D='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+F.id+'");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()'}else{if(n.isOpera){D='javascript:(function(){document.open();document.domain="'+document.domain+'";document.close();ed.setupIframe();})()'}}}v=o.add(r.iframeContainer,"iframe",{id:F.id+"_ifr",src:D||'javascript:""',frameBorder:"0",style:{width:"100%",height:z}});F.contentAreaContainer=r.iframeContainer;o.get(r.editorContainer).style.display=F.orgDisplay;o.get(F.id).style.display="none";if(!b||!n.relaxedDomain){F.setupIframe()}B=v=r=null},setupIframe:function(){var z=this,A=z.settings,u=o.get(z.id),v=z.getDoc(),r,x;if(!b||!n.relaxedDomain){v.open();v.write(z.iframeHTML);v.close()}if(!b){try{if(!A.readonly){v.designMode="On"}}catch(w){}}if(b){x=z.getBody();o.hide(x);if(!A.readonly){x.contentEditable=true}o.show(x)}z.dom=new n.DOM.DOMUtils(z.getDoc(),{keep_values:true,url_converter:z.convertURL,url_converter_scope:z,hex_colors:A.force_hex_style_colors,class_filter:A.class_filter,update_styles:1,fix_ie_paragraphs:1});z.serializer=new n.dom.Serializer({entity_encoding:A.entity_encoding,entities:A.entities,valid_elements:A.verify_html===false?"*[*]":A.valid_elements,extended_valid_elements:A.extended_valid_elements,valid_child_elements:A.valid_child_elements,invalid_elements:A.invalid_elements,fix_table_elements:A.fix_table_elements,fix_list_elements:A.fix_list_elements,fix_content_duplication:A.fix_content_duplication,convert_fonts_to_spans:A.convert_fonts_to_spans,font_size_classes:A.font_size_classes,font_size_style_values:A.font_size_style_values,apply_source_formatting:A.apply_source_formatting,remove_linebreaks:A.remove_linebreaks,element_format:A.element_format,dom:z.dom});z.selection=new n.dom.Selection(z.dom,z.getWin(),z.serializer);z.forceBlocks=new n.ForceBlocks(z,{forced_root_block:A.forced_root_block});z.editorCommands=new n.EditorCommands(z);z.serializer.onPreProcess.add(function(s,t){return z.onPreProcess.dispatch(z,t,s)});z.serializer.onPostProcess.add(function(s,t){return z.onPostProcess.dispatch(z,t,s)});z.onPreInit.dispatch(z);if(!A.gecko_spellcheck){z.getBody().spellcheck=0}if(!A.readonly){z._addEvents()}z.controlManager.onPostRender.dispatch(z,z.controlManager);z.onPostRender.dispatch(z);if(A.directionality){z.getBody().dir=A.directionality}if(A.nowrap){z.getBody().style.whiteSpace="nowrap"}if(A.auto_resize){z.onNodeChange.add(z.resizeToContent,z)}if(A.custom_elements){function y(s,t){j(g(A.custom_elements),function(B){var C;if(B.indexOf("~")===0){B=B.substring(1);C="span"}else{C="div"}t.content=t.content.replace(new RegExp("<("+B+")([^>]*)>","g"),"<"+C+' mce_name="$1"$2>');t.content=t.content.replace(new RegExp("</("+B+")>","g"),"</"+C+">")})}z.onBeforeSetContent.add(y);z.onPostProcess.add(function(s,t){if(t.set){y(s,t)}})}if(A.handle_node_change_callback){z.onNodeChange.add(function(t,s,B){z.execCallback("handle_node_change_callback",z.id,B,-1,-1,true,z.selection.isCollapsed())})}if(A.save_callback){z.onSaveContent.add(function(s,B){var t=z.execCallback("save_callback",z.id,B.content,z.getBody());if(t){B.content=t}})}if(A.onchange_callback){z.onChange.add(function(t,s){z.execCallback("onchange_callback",z,s)})}if(A.convert_newlines_to_brs){z.onBeforeSetContent.add(function(s,t){if(t.initial){t.content=t.content.replace(/\r?\n/g,"<br />")}})}if(A.fix_nesting&&b){z.onBeforeSetContent.add(function(s,t){t.content=z._fixNesting(t.content)})}if(A.preformatted){z.onPostProcess.add(function(s,t){t.content=t.content.replace(/^\s*<pre.*?>/,"");t.content=t.content.replace(/<\/pre>\s*$/,"");if(t.set){t.content='<pre class="mceItemHidden">'+t.content+"</pre>"}})}if(A.verify_css_classes){z.serializer.attribValueFilter=function(D,B){var C,t;if(D=="class"){if(!z.classesRE){t=z.dom.getClasses();if(t.length>0){C="";j(t,function(s){C+=(C?"|":"")+s["class"]});z.classesRE=new RegExp("("+C+")","gi")}}return !z.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(B)||z.classesRE.test(B)?B:""}return B}}if(A.convert_fonts_to_spans){z._convertFonts()}if(A.inline_styles){z._convertInlineElements()}if(A.cleanup_callback){z.onBeforeSetContent.add(function(s,t){t.content=z.execCallback("cleanup_callback","insert_to_editor",t.content,t)});z.onPreProcess.add(function(s,t){if(t.set){z.execCallback("cleanup_callback","insert_to_editor_dom",t.node,t)}if(t.get){z.execCallback("cleanup_callback","get_from_editor_dom",t.node,t)}});z.onPostProcess.add(function(s,t){if(t.set){t.content=z.execCallback("cleanup_callback","insert_to_editor",t.content,t)}if(t.get){t.content=z.execCallback("cleanup_callback","get_from_editor",t.content,t)}})}if(A.save_callback){z.onGetContent.add(function(s,t){if(t.save){t.content=z.execCallback("save_callback",z.id,t.content,z.getBody())}})}if(A.handle_event_callback){z.onEvent.add(function(s,t,B){if(z.execCallback("handle_event_callback",t,s,B)===false){k.cancel(t)}})}z.onSetContent.add(function(){z.addVisual(z.getBody())});if(A.padd_empty_editor){z.onPostProcess.add(function(s,t){t.content=t.content.replace(/^(<p[^>]*>(&nbsp;|&#160;|\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/,"")})}if(a){function q(s,t){j(s.dom.select("a"),function(C){var B=C.parentNode;if(s.dom.isBlock(B)&&B.lastChild===C){s.dom.add(B,"br",{mce_bogus:1})}})}z.onExecCommand.add(function(s,t){if(t==="CreateLink"){q(s)}});z.onSetContent.add(z.selection.onSetContent.add(q));if(!A.readonly){try{v.designMode="Off";v.designMode="On"}catch(w){}}}setTimeout(function(){if(z.removed){return}z.load({initial:true,format:(A.cleanup_on_startup?"html":"raw")});z.startContent=z.getContent({format:"raw"});z.undoManager.add({initial:true});z.initialized=true;z.onInit.dispatch(z);z.execCallback("setupcontent_callback",z.id,z.getBody(),z.getDoc());z.execCallback("init_instance_callback",z);z.focus(true);z.nodeChanged({initial:1});if(A.content_css){n.each(g(A.content_css),function(s){z.dom.loadCSS(z.documentBaseURI.toAbsolute(s))})}if(A.auto_focus){setTimeout(function(){var s=i.get(A.auto_focus);s.selection.select(s.getBody(),1);s.selection.collapse(1);s.getWin().focus()},100)}},1);u=null},focus:function(r){var u,q=this,s=q.settings.content_editable;if(!r){if(!s&&(!b||q.selection.getNode().ownerDocument!=q.getDoc())){q.getWin().focus()}}if(i.activeEditor!=q){if((u=i.activeEditor)!=null){u.onDeactivate.dispatch(u,q)}q.onActivate.dispatch(q,u)}i._setActive(q)},execCallback:function(v){var q=this,u=q.settings[v],r;if(!u){return}if(q.callbackLookup&&(r=q.callbackLookup[v])){u=r.func;r=r.scope}if(d(u,"string")){r=u.replace(/\.\w+$/,"");r=r?n.resolve(r):0;u=n.resolve(u);q.callbackLookup=q.callbackLookup||{};q.callbackLookup[v]={func:u,scope:r}}return u.apply(r||q,Array.prototype.slice.call(arguments,1))},translate:function(q){var t=this.settings.language||"en",r=i.i18n;if(!q){return""}return r[t+"."+q]||q.replace(/{\#([^}]+)\}/g,function(u,s){return r[t+"."+s]||"{#"+s+"}"})},getLang:function(r,q){return i.i18n[(this.settings.language||"en")+"."+r]||(d(q)?q:"{#"+r+"}")},getParam:function(w,s,q){var t=n.trim,r=d(this.settings[w])?this.settings[w]:s,u;if(q==="hash"){u={};if(d(r,"string")){j(r.indexOf("=")>0?r.split(/[;,](?![^=;,]*(?:[;,]|$))/):r.split(","),function(x){x=x.split("=");if(x.length>1){u[t(x[0])]=t(x[1])}else{u[t(x[0])]=t(x)}})}else{u=r}return u}return r},nodeChanged:function(u){var q=this,r=q.selection,v=r.getNode()||q.getBody();if(q.initialized){q.onNodeChange.dispatch(q,u?u.controlManager||q.controlManager:q.controlManager,b&&v.ownerDocument!=q.getDoc()?q.getBody():v,r.isCollapsed(),u)}},addButton:function(u,r){var q=this;q.buttons=q.buttons||{};q.buttons[u]=r},addCommand:function(t,r,q){this.execCommands[t]={func:r,scope:q||this}},addQueryStateHandler:function(t,r,q){this.queryStateCommands[t]={func:r,scope:q||this}},addQueryValueHandler:function(t,r,q){this.queryValueCommands[t]={func:r,scope:q||this}},addShortcut:function(s,v,q,u){var r=this,w;if(!r.settings.custom_shortcuts){return false}r.shortcuts=r.shortcuts||{};if(d(q,"string")){w=q;q=function(){r.execCommand(w,false,null)}}if(d(q,"object")){w=q;q=function(){r.execCommand(w[0],w[1],w[2])}}j(g(s),function(t){var x={func:q,scope:u||this,desc:v,alt:false,ctrl:false,shift:false};j(g(t,"+"),function(y){switch(y){case"alt":case"ctrl":case"shift":x[y]=true;break;default:x.charCode=y.charCodeAt(0);x.keyCode=y.toUpperCase().charCodeAt(0)}});r.shortcuts[(x.ctrl?"ctrl":"")+","+(x.alt?"alt":"")+","+(x.shift?"shift":"")+","+x.keyCode]=x});return true},execCommand:function(x,w,z,q){var u=this,v=0,y,r;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(x)&&(!q||!q.skip_focus)){u.focus()}y={};u.onBeforeExecCommand.dispatch(u,x,w,z,y);if(y.terminate){return false}if(u.execCallback("execcommand_callback",u.id,u.selection.getNode(),x,w,z)){u.onExecCommand.dispatch(u,x,w,z,q);return true}if(y=u.execCommands[x]){r=y.func.call(y.scope,w,z);if(r!==true){u.onExecCommand.dispatch(u,x,w,z,q);return r}}j(u.plugins,function(s){if(s.execCommand&&s.execCommand(x,w,z)){u.onExecCommand.dispatch(u,x,w,z,q);v=1;return false}});if(v){return true}if(u.theme&&u.theme.execCommand&&u.theme.execCommand(x,w,z)){u.onExecCommand.dispatch(u,x,w,z,q);return true}if(n.GlobalCommands.execCommand(u,x,w,z)){u.onExecCommand.dispatch(u,x,w,z,q);return true}if(u.editorCommands.execCommand(x,w,z)){u.onExecCommand.dispatch(u,x,w,z,q);return true}u.getDoc().execCommand(x,w,z);u.onExecCommand.dispatch(u,x,w,z,q)},queryCommandState:function(w){var r=this,v,u;if(r._isHidden()){return}if(v=r.queryStateCommands[w]){u=v.func.call(v.scope);if(u!==true){return u}}v=r.editorCommands.queryCommandState(w);if(v!==-1){return v}try{return this.getDoc().queryCommandState(w)}catch(q){}},queryCommandValue:function(w){var r=this,v,u;if(r._isHidden()){return}if(v=r.queryValueCommands[w]){u=v.func.call(v.scope);if(u!==true){return u}}v=r.editorCommands.queryCommandValue(w);if(d(v)){return v}try{return this.getDoc().queryCommandValue(w)}catch(q){}},show:function(){var q=this;o.show(q.getContainer());o.hide(q.id);q.load()},hide:function(){var q=this,r=q.getDoc();if(b&&r){r.execCommand("SelectAll")}q.save();o.hide(q.getContainer());o.setStyle(q.id,"display",q.orgDisplay)},isHidden:function(){return !o.isHidden(this.id)},setProgressState:function(q,r,s){this.onSetProgressState.dispatch(this,q,r,s);return q},resizeToContent:function(){var q=this;o.setStyle(q.id+"_ifr","height",q.getBody().scrollHeight)},load:function(u){var q=this,s=q.getElement(),r;if(s){u=u||{};u.load=true;r=q.setContent(d(s.value)?s.value:s.innerHTML,u);u.element=s;if(!u.no_events){q.onLoadContent.dispatch(q,u)}u.element=s=null;return r}},save:function(v){var q=this,u=q.getElement(),r,s;if(!u||!q.initialized){return}v=v||{};v.save=true;if(!v.no_events){q.undoManager.typing=0;q.undoManager.add()}v.element=u;r=v.content=q.getContent(v);if(!v.no_events){q.onSaveContent.dispatch(q,v)}r=v.content;if(!/TEXTAREA|INPUT/i.test(u.nodeName)){u.innerHTML=r;if(s=o.getParent(q.id,"form")){j(s.elements,function(t){if(t.name==q.id){t.value=r;return false}})}}else{u.value=r}v.element=u=null;return r},setContent:function(r,s){var q=this;s=s||{};s.format=s.format||"html";s.set=true;s.content=r;if(!s.no_events){q.onBeforeSetContent.dispatch(q,s)}if(!n.isIE&&(r.length===0||/^\s+$/.test(r))){s.content=q.dom.setHTML(q.getBody(),'<br mce_bogus="1" />');s.format="raw"}s.content=q.dom.setHTML(q.getBody(),n.trim(s.content));if(s.format!="raw"&&q.settings.cleanup){s.getInner=true;s.content=q.dom.setHTML(q.getBody(),q.serializer.serialize(q.getBody(),s))}if(!s.no_events){q.onSetContent.dispatch(q,s)}return s.content},getContent:function(s){var q=this,r;s=s||{};s.format=s.format||"html";s.get=true;if(!s.no_events){q.onBeforeGetContent.dispatch(q,s)}if(s.format!="raw"&&q.settings.cleanup){s.getInner=true;r=q.serializer.serialize(q.getBody(),s)}else{r=q.getBody().innerHTML}r=r.replace(/^\s*|\s*$/g,"");s.content=r;if(!s.no_events){q.onGetContent.dispatch(q,s)}return s.content},isDirty:function(){var q=this;return n.trim(q.startContent)!=n.trim(q.getContent({format:"raw",no_events:1}))&&!q.isNotDirty},getContainer:function(){var q=this;if(!q.container){q.container=o.get(q.editorContainer||q.id+"_parent")}return q.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return o.get(this.settings.content_element||this.id)},getWin:function(){var q=this,r;if(!q.contentWindow){r=o.get(q.id+"_ifr");if(r){q.contentWindow=r.contentWindow}}return q.contentWindow},getDoc:function(){var r=this,q;if(!r.contentDocument){q=r.getWin();if(q){r.contentDocument=q.document}}return r.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(q,x,w){var r=this,v=r.settings;if(v.urlconverter_callback){return r.execCallback("urlconverter_callback",q,w,true,x)}if(!v.convert_urls||(w&&w.nodeName=="LINK")||q.indexOf("file:")===0){return q}if(v.relative_urls){return r.documentBaseURI.toRelative(q)}q=r.documentBaseURI.toAbsolute(q,v.remove_script_host);return q},addVisual:function(u){var q=this,r=q.settings;u=u||q.getBody();if(!d(q.hasVisual)){q.hasVisual=r.visual}j(q.dom.select("table,a",u),function(t){var s;switch(t.nodeName){case"TABLE":s=q.dom.getAttrib(t,"border");if(!s||s=="0"){if(q.hasVisual){q.dom.addClass(t,r.visual_table_class)}else{q.dom.removeClass(t,r.visual_table_class)}}return;case"A":s=q.dom.getAttrib(t,"name");if(s){if(q.hasVisual){q.dom.addClass(t,"mceItemAnchor")}else{q.dom.removeClass(t,"mceItemAnchor")}}return}});q.onVisualAid.dispatch(q,u,q.hasVisual)},remove:function(){var q=this,r=q.getContainer();q.removed=1;q.hide();q.execCallback("remove_instance_callback",q);q.onRemove.dispatch(q);q.onExecCommand.listeners=[];i.remove(q);o.remove(r)},destroy:function(r){var q=this;if(q.destroyed){return}if(!r){n.removeUnload(q.destroy);tinyMCE.onBeforeUnload.remove(q._beforeUnload);if(q.theme&&q.theme.destroy){q.theme.destroy()}q.controlManager.destroy();q.selection.destroy();q.dom.destroy();if(!q.settings.content_editable){k.clear(q.getWin());k.clear(q.getDoc())}k.clear(q.getBody());k.clear(q.formElement)}if(q.formElement){q.formElement.submit=q.formElement._mceOldSubmit;q.formElement._mceOldSubmit=null}q.contentAreaContainer=q.formElement=q.container=q.settings.content_element=q.bodyElement=q.contentDocument=q.contentWindow=null;if(q.selection){q.selection=q.selection.win=q.selection.dom=q.selection.dom.doc=null}q.destroyed=1},_addEvents:function(){var w=this,v,y=w.settings,x={mouseup:"onMouseUp",mousedown:"onMouseDown",click:"onClick",keyup:"onKeyUp",keydown:"onKeyDown",keypress:"onKeyPress",submit:"onSubmit",reset:"onReset",contextmenu:"onContextMenu",dblclick:"onDblClick",paste:"onPaste"};function u(t,A){var s=t.type;if(w.removed){return}if(w.onEvent.dispatch(w,t,A)!==false){w[x[t.fakeType||t.type]].dispatch(w,t,A)}}j(x,function(t,s){switch(s){case"contextmenu":if(n.isOpera){k.add(w.getBody(),"mousedown",function(A){if(A.ctrlKey){A.fakeType="contextmenu";u(A)}})}else{k.add(w.getBody(),s,u)}break;case"paste":k.add(w.getBody(),s,function(A){u(A)});break;case"submit":case"reset":k.add(w.getElement().form||o.getParent(w.id,"form"),s,u);break;default:k.add(y.content_editable?w.getBody():w.getDoc(),s,u)}});k.add(y.content_editable?w.getBody():(a?w.getDoc():w.getWin()),"focus",function(s){w.focus(true)});if(n.isGecko){k.add(w.getDoc(),"DOMNodeInserted",function(t){var s;t=t.target;if(t.nodeType===1&&t.nodeName==="IMG"&&(s=t.getAttribute("mce_src"))){t.src=w.documentBaseURI.toAbsolute(s)}})}if(a){function q(){var B=this,D=B.getDoc(),C=B.settings;if(a&&!C.readonly){if(B._isHidden()){try{if(!C.content_editable){D.designMode="On"}}catch(A){}}try{D.execCommand("styleWithCSS",0,false)}catch(A){if(!B._isHidden()){try{D.execCommand("useCSS",0,true)}catch(A){}}}if(!C.table_inline_editing){try{D.execCommand("enableInlineTableEditing",false,false)}catch(A){}}if(!C.object_resizing){try{D.execCommand("enableObjectResizing",false,false)}catch(A){}}}}w.onBeforeExecCommand.add(q);w.onMouseDown.add(q)}w.onMouseUp.add(w.nodeChanged);w.onClick.add(w.nodeChanged);w.onKeyUp.add(function(s,t){var A=t.keyCode;if((A>=33&&A<=36)||(A>=37&&A<=40)||A==13||A==45||A==46||A==8||(n.isMac&&(A==91||A==93))||t.ctrlKey){w.nodeChanged()}});w.onReset.add(function(){w.setContent(w.startContent,{format:"raw"})});if(y.custom_shortcuts){if(y.custom_undo_redo_keyboard_shortcuts){w.addShortcut("ctrl+z",w.getLang("undo_desc"),"Undo");w.addShortcut("ctrl+y",w.getLang("redo_desc"),"Redo")}if(a){w.addShortcut("ctrl+b",w.getLang("bold_desc"),"Bold");w.addShortcut("ctrl+i",w.getLang("italic_desc"),"Italic");w.addShortcut("ctrl+u",w.getLang("underline_desc"),"Underline")}for(v=1;v<=6;v++){w.addShortcut("ctrl+"+v,"",["FormatBlock",false,"<h"+v+">"])}w.addShortcut("ctrl+7","",["FormatBlock",false,"<p>"]);w.addShortcut("ctrl+8","",["FormatBlock",false,"<div>"]);w.addShortcut("ctrl+9","",["FormatBlock",false,"<address>"]);function z(t){var s=null;if(!t.altKey&&!t.ctrlKey&&!t.metaKey){return s}j(w.shortcuts,function(A){if(n.isMac&&A.ctrl!=t.metaKey){return}else{if(!n.isMac&&A.ctrl!=t.ctrlKey){return}}if(A.alt!=t.altKey){return}if(A.shift!=t.shiftKey){return}if(t.keyCode==A.keyCode||(t.charCode&&t.charCode==A.charCode)){s=A;return false}});return s}w.onKeyUp.add(function(s,t){var A=z(t);if(A){return k.cancel(t)}});w.onKeyPress.add(function(s,t){var A=z(t);if(A){return k.cancel(t)}});w.onKeyDown.add(function(s,t){var A=z(t);if(A){A.func.call(A.scope);return k.cancel(t)}})}if(n.isIE){k.add(w.getDoc(),"controlselect",function(A){var t=w.resizeInfo,s;A=A.target;if(A.nodeName!=="IMG"){return}if(t){k.remove(t.node,t.ev,t.cb)}if(!w.dom.hasClass(A,"mceItemNoResize")){ev="resizeend";s=k.add(A,ev,function(C){var B;C=C.target;if(B=w.dom.getStyle(C,"width")){w.dom.setAttrib(C,"width",B.replace(/[^0-9%]+/g,""));w.dom.setStyle(C,"width","")}if(B=w.dom.getStyle(C,"height")){w.dom.setAttrib(C,"height",B.replace(/[^0-9%]+/g,""));w.dom.setStyle(C,"height","")}})}else{ev="resizestart";s=k.add(A,"resizestart",k.cancel,k)}t=w.resizeInfo={node:A,ev:ev,cb:s}});w.onKeyDown.add(function(s,t){switch(t.keyCode){case 8:if(w.selection.getRng().item){w.selection.getRng().item(0).removeNode();return k.cancel(t)}}})}if(n.isOpera){w.onClick.add(function(s,t){k.prevent(t)})}if(y.custom_undo_redo){function r(){w.undoManager.typing=0;w.undoManager.add()}if(n.isIE){k.add(w.getWin(),"blur",function(s){var t;if(w.selection){t=w.selection.getNode();if(!w.removed&&t.ownerDocument&&t.ownerDocument!=w.getDoc()){r()}}})}else{k.add(w.getDoc(),"blur",function(){if(w.selection&&!w.removed){r()}})}w.onMouseDown.add(r);w.onKeyUp.add(function(s,t){if((t.keyCode>=33&&t.keyCode<=36)||(t.keyCode>=37&&t.keyCode<=40)||t.keyCode==13||t.keyCode==45||t.ctrlKey){w.undoManager.typing=0;w.undoManager.add()}});w.onKeyDown.add(function(s,t){if((t.keyCode>=33&&t.keyCode<=36)||(t.keyCode>=37&&t.keyCode<=40)||t.keyCode==13||t.keyCode==45){if(w.undoManager.typing){w.undoManager.add();w.undoManager.typing=0}return}if(!w.undoManager.typing){w.undoManager.add();w.undoManager.typing=1}})}},_convertInlineElements:function(){var z=this,B=z.settings,r=z.dom,y,w,u,A,q;function x(s,t){if(!B.inline_styles){return}if(t.get){j(z.dom.select("table,u,strike",t.node),function(v){switch(v.nodeName){case"TABLE":if(y=r.getAttrib(v,"height")){r.setStyle(v,"height",y);r.setAttrib(v,"height","")}break;case"U":case"STRIKE":v.style.textDecoration=v.nodeName=="U"?"underline":"line-through";r.setAttrib(v,"mce_style","");r.setAttrib(v,"mce_name","span");break}})}else{if(t.set){j(z.dom.select("table,span",t.node).reverse(),function(v){if(v.nodeName=="TABLE"){if(y=r.getStyle(v,"height")){r.setAttrib(v,"height",y.replace(/[^0-9%]+/g,""))}}else{if(v.style.textDecoration=="underline"){u="u"}else{if(v.style.textDecoration=="line-through"){u="strike"}else{u=""}}if(u){v.style.textDecoration="";r.setAttrib(v,"mce_style","");w=r.create(u,{style:r.getAttrib(v,"style")});r.replace(w,v,1)}}})}}}z.onPreProcess.add(x);if(!B.cleanup_on_startup){z.onSetContent.add(function(s,t){if(t.initial){x(z,{node:z.getBody(),set:1})}})}},_convertFonts:function(){var w=this,x=w.settings,z=w.dom,v,r,q,u;if(!x.inline_styles){return}v=[8,10,12,14,18,24,36];r=["xx-small","x-small","small","medium","large","x-large","xx-large"];if(q=x.font_size_style_values){q=g(q)}if(u=x.font_size_classes){u=g(u)}function y(B){var C,A,t,s;if(!x.inline_styles){return}t=w.dom.select("font",B);for(s=t.length-1;s>=0;s--){C=t[s];A=z.create("span",{style:z.getAttrib(C,"style"),"class":z.getAttrib(C,"class")});z.setStyles(A,{fontFamily:z.getAttrib(C,"face"),color:z.getAttrib(C,"color"),backgroundColor:C.style.backgroundColor});if(C.size){if(q){z.setStyle(A,"fontSize",q[parseInt(C.size)-1])}else{z.setAttrib(A,"class",u[parseInt(C.size)-1])}}z.setAttrib(A,"mce_style","");z.replace(A,C,1)}}w.onPreProcess.add(function(s,t){if(t.get){y(t.node)}});w.onSetContent.add(function(s,t){if(t.initial){y(t.node)}})},_isHidden:function(){var q;if(!a){return 0}q=this.selection.getSel();return(!q||!q.rangeCount||q.rangeCount==0)},_fixNesting:function(r){var t=[],q;r=r.replace(/<(\/)?([^\s>]+)[^>]*?>/g,function(u,s,w){var v;if(s==="/"){if(!t.length){return""}if(w!==t[t.length-1].tag){for(q=t.length-1;q>=0;q--){if(t[q].tag===w){t[q].close=1;break}}return""}else{t.pop();if(t.length&&t[t.length-1].close){u=u+"</"+t[t.length-1].tag+">";t.pop()}}}else{if(/^(br|hr|input|meta|img|link|param)$/i.test(w)){return u}if(/\/>$/.test(u)){return u}t.push({tag:w})}return u});for(q=t.length-1;q>=0;q--){r+="</"+t[q].tag+">"}return r}})})(tinymce);(function(d){var f=d.each,c=d.isIE,a=d.isGecko,b=d.isOpera,e=d.isWebKit;d.create("tinymce.EditorCommands",{EditorCommands:function(g){this.editor=g},execCommand:function(k,j,l){var h=this,g=h.editor,i;switch(k){case"mceResetDesignMode":case"mceBeginUndoLevel":return true;case"unlink":h.UnLink();return true;case"JustifyLeft":case"JustifyCenter":case"JustifyRight":case"JustifyFull":h.mceJustify(k,k.substring(7).toLowerCase());return true;default:i=this[k];if(i){i.call(this,j,l);return true}}return false},Indent:function(){var g=this.editor,l=g.dom,j=g.selection,k,h,i;h=g.settings.indentation;i=/[a-z%]+$/i.exec(h);h=parseInt(h);if(g.settings.inline_styles&&(!this.queryStateInsertUnorderedList()&&!this.queryStateInsertOrderedList())){f(j.getSelectedBlocks(),function(m){l.setStyle(m,"paddingLeft",(parseInt(m.style.paddingLeft||0)+h)+i)});return}g.getDoc().execCommand("Indent",false,null);if(c){l.getParent(j.getNode(),function(m){if(m.nodeName=="BLOCKQUOTE"){m.dir=m.style.cssText=""}})}},Outdent:function(){var h=this.editor,m=h.dom,k=h.selection,l,g,i,j;i=h.settings.indentation;j=/[a-z%]+$/i.exec(i);i=parseInt(i);if(h.settings.inline_styles&&(!this.queryStateInsertUnorderedList()&&!this.queryStateInsertOrderedList())){f(k.getSelectedBlocks(),function(n){g=Math.max(0,parseInt(n.style.paddingLeft||0)-i);m.setStyle(n,"paddingLeft",g?g+j:"")});return}h.getDoc().execCommand("Outdent",false,null)},mceSetContent:function(h,g){this.editor.setContent(g)},mceToggleVisualAid:function(){var g=this.editor;g.hasVisual=!g.hasVisual;g.addVisual()},mceReplaceContent:function(h,g){var i=this.editor.selection;i.setContent(g.replace(/\{\$selection\}/g,i.getContent({format:"text"})))},mceInsertLink:function(i,h){var g=this.editor,j=g.selection,k=g.dom.getParent(j.getNode(),"a");if(d.is(h,"string")){h={href:h}}function l(m){f(h,function(o,n){g.dom.setAttrib(m,n,o)})}if(!k){g.execCommand("CreateLink",false,"javascript:mctmp(0);");f(g.dom.select("a[href=javascript:mctmp(0);]"),function(m){l(m)})}else{if(h.href){l(k)}else{g.dom.remove(k,1)}}},UnLink:function(){var g=this.editor,h=g.selection;if(h.isCollapsed()){h.select(h.getNode())}g.getDoc().execCommand("unlink",false,null);h.collapse(0)},FontName:function(i,h){var j=this,g=j.editor,k=g.selection,l;if(!h){if(k.isCollapsed()){k.select(k.getNode())}}else{if(g.settings.convert_fonts_to_spans){j._applyInlineStyle("span",{style:{fontFamily:h}})}else{g.getDoc().execCommand("FontName",false,h)}}},FontSize:function(j,i){var h=this.editor,l=h.settings,k,g;if(l.convert_fonts_to_spans&&i>=1&&i<=7){g=d.explode(l.font_size_style_values);k=d.explode(l.font_size_classes);if(k){i=k[i-1]||i}else{i=g[i-1]||i}}if(i>=1&&i<=7){h.getDoc().execCommand("FontSize",false,i)}else{this._applyInlineStyle("span",{style:{fontSize:i}})}},queryCommandValue:function(h){var g=this["queryValue"+h];if(g){return g.call(this,h)}return false},queryCommandState:function(h){var g;switch(h){case"JustifyLeft":case"JustifyCenter":case"JustifyRight":case"JustifyFull":return this.queryStateJustify(h,h.substring(7).toLowerCase());default:if(g=this["queryState"+h]){return g.call(this,h)}}return -1},_queryState:function(h){try{return this.editor.getDoc().queryCommandState(h)}catch(g){}},_queryVal:function(h){try{return this.editor.getDoc().queryCommandValue(h)}catch(g){}},queryValueFontSize:function(){var h=this.editor,g=0,i;if(i=h.dom.getParent(h.selection.getNode(),"span")){g=i.style.fontSize}if(!g&&(b||e)){if(i=h.dom.getParent(h.selection.getNode(),"font")){g=i.size}return g}return g||this._queryVal("FontSize")},queryValueFontName:function(){var h=this.editor,g=0,i;if(i=h.dom.getParent(h.selection.getNode(),"font")){g=i.face}if(i=h.dom.getParent(h.selection.getNode(),"span")){g=i.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()}if(!g){g=this._queryVal("FontName")}return g},mceJustify:function(o,p){var k=this.editor,m=k.selection,g=m.getNode(),q=g.nodeName,h,j,i=k.dom,l;if(k.settings.inline_styles&&this.queryStateJustify(o,p)){l=1}h=i.getParent(g,k.dom.isBlock);if(q=="IMG"){if(p=="full"){return}if(l){if(p=="center"){i.setStyle(h||g.parentNode,"textAlign","")}i.setStyle(g,"float","");this.mceRepaint();return}if(p=="center"){if(h&&/^(TD|TH)$/.test(h.nodeName)){h=0}if(!h||h.childNodes.length>1){j=i.create("p");j.appendChild(g.cloneNode(false));if(h){i.insertAfter(j,h)}else{i.insertAfter(j,g)}i.remove(g);g=j.firstChild;h=j}i.setStyle(h,"textAlign",p);i.setStyle(g,"float","")}else{i.setStyle(g,"float",p);i.setStyle(h||g.parentNode,"textAlign","")}this.mceRepaint();return}if(k.settings.inline_styles&&k.settings.forced_root_block){if(l){p=""}f(m.getSelectedBlocks(i.getParent(m.getStart(),i.isBlock),i.getParent(m.getEnd(),i.isBlock)),function(n){i.setAttrib(n,"align","");i.setStyle(n,"textAlign",p=="full"?"justify":p)});return}else{if(!l){k.getDoc().execCommand(o,false,null)}}if(k.settings.inline_styles){if(l){i.getParent(k.selection.getNode(),function(r){if(r.style&&r.style.textAlign){i.setStyle(r,"textAlign","")}});return}f(i.select("*"),function(s){var r=s.align;if(r){if(r=="full"){r="justify"}i.setStyle(s,"textAlign",r);i.setAttrib(s,"align","")}})}},mceSetCSSClass:function(h,g){this.mceSetStyleInfo(0,{command:"setattrib",name:"class",value:g})},getSelectedElement:function(){var w=this,o=w.editor,n=o.dom,s=o.selection,h=s.getRng(),l,k,u,p,j,g,q,i,x,v;if(s.isCollapsed()||h.item){return s.getNode()}v=o.settings.merge_styles_invalid_parents;if(d.is(v,"string")){v=new RegExp(v,"i")}if(c){l=h.duplicate();l.collapse(true);u=l.parentElement();k=h.duplicate();k.collapse(false);p=k.parentElement();if(u!=p){l.move("character",1);u=l.parentElement()}if(u==p){l=h.duplicate();l.moveToElementText(u);if(l.compareEndPoints("StartToStart",h)==0&&l.compareEndPoints("EndToEnd",h)==0){return v&&v.test(u.nodeName)?null:u}}}else{function m(r){return n.getParent(r,"*")}u=h.startContainer;p=h.endContainer;j=h.startOffset;g=h.endOffset;if(!h.collapsed){if(u==p){if(j-g<2){if(u.hasChildNodes()){i=u.childNodes[j];return v&&v.test(i.nodeName)?null:i}}}}if(u.nodeType!=3||p.nodeType!=3){return null}if(j==0){i=m(u);if(i&&i.firstChild!=u){i=null}}if(j==u.nodeValue.length){q=u.nextSibling;if(q&&q.nodeType==1){i=u.nextSibling}}if(g==0){q=p.previousSibling;if(q&&q.nodeType==1){x=q}}if(g==p.nodeValue.length){x=m(p);if(x&&x.lastChild!=p){x=null}}if(i==x){return v&&i&&v.test(i.nodeName)?null:i}}return null},mceSetStyleInfo:function(n,m){var q=this,h=q.editor,j=h.getDoc(),g=h.dom,i,k,r=h.selection,p=m.wrapper||"span",k=r.getBookmark(),o;function l(t,s){if(t.nodeType==1){switch(m.command){case"setattrib":return g.setAttrib(t,m.name,m.value);case"setstyle":return g.setStyle(t,m.name,m.value);case"removeformat":return g.setAttrib(t,"class","")}}}o=h.settings.merge_styles_invalid_parents;if(d.is(o,"string")){o=new RegExp(o,"i")}if((i=q.getSelectedElement())&&!h.settings.force_span_wrappers){l(i,1)}else{j.execCommand("FontName",false,"__");f(g.select("span,font"),function(u){var s,t;if(g.getAttrib(u,"face")=="__"||u.style.fontFamily==="__"){s=g.create(p,{mce_new:"1"});l(s);f(u.childNodes,function(v){s.appendChild(v.cloneNode(true))});g.replace(s,u)}})}f(g.select(p).reverse(),function(t){var s=t.parentNode;if(!g.getAttrib(t,"mce_new")){s=g.getParent(t,"*[mce_new]");if(s){g.remove(t,1)}}});f(g.select(p).reverse(),function(t){var s=t.parentNode;if(!s||!g.getAttrib(t,"mce_new")){return}if(h.settings.force_span_wrappers&&s.nodeName!="SPAN"){return}if(s.nodeName==p.toUpperCase()&&s.childNodes.length==1){return g.remove(s,1)}if(t.nodeType==1&&(!o||!o.test(s.nodeName))&&s.childNodes.length==1){l(s);g.setAttrib(t,"class","")}});f(g.select(p).reverse(),function(s){if(g.getAttrib(s,"mce_new")||(g.getAttribs(s).length<=1&&s.className==="")){if(!g.getAttrib(s,"class")&&!g.getAttrib(s,"style")){return g.remove(s,1)}g.setAttrib(s,"mce_new","")}});r.moveToBookmark(k)},queryStateJustify:function(k,h){var g=this.editor,j=g.selection.getNode(),i=g.dom;if(j&&j.nodeName=="IMG"){if(i.getStyle(j,"float")==h){return 1}return j.parentNode.style.textAlign==h}j=i.getParent(g.selection.getStart(),function(l){return l.nodeType==1&&l.style.textAlign});if(h=="full"){h="justify"}if(g.settings.inline_styles){return(j&&j.style.textAlign==h)}return this._queryState(k)},ForeColor:function(i,h){var g=this.editor;if(g.settings.convert_fonts_to_spans){this._applyInlineStyle("span",{style:{color:h}});return}else{g.getDoc().execCommand("ForeColor",false,h)}},HiliteColor:function(i,k){var h=this,g=h.editor,j=g.getDoc();if(g.settings.convert_fonts_to_spans){this._applyInlineStyle("span",{style:{backgroundColor:k}});return}function l(n){if(!a){return}try{j.execCommand("styleWithCSS",0,n)}catch(m){j.execCommand("useCSS",0,!n)}}if(a||b){l(true);j.execCommand("hilitecolor",false,k);l(false)}else{j.execCommand("BackColor",false,k)}},FormatBlock:function(n,h){var o=this,l=o.editor,p=l.selection,j=l.dom,g,k,m;function i(q){return/^(P|DIV|H[1-6]|ADDRESS|BLOCKQUOTE|PRE)$/.test(q.nodeName)}g=j.getParent(p.getNode(),function(q){return i(q)});if(g){if((c&&i(g.parentNode))||g.nodeName=="DIV"){k=l.dom.create(h);f(j.getAttribs(g),function(q){j.setAttrib(k,q.nodeName,j.getAttrib(g,q.nodeName))});m=p.getBookmark();j.replace(k,g,1);p.moveToBookmark(m);l.nodeChanged();return}}h=l.settings.forced_root_block?(h||"<p>"):h;if(h.indexOf("<")==-1){h="<"+h+">"}if(d.isGecko){h=h.replace(/<(div|blockquote|code|dt|dd|dl|samp)>/gi,"$1")}l.getDoc().execCommand("FormatBlock",false,h)},mceCleanup:function(){var h=this.editor,i=h.selection,g=i.getBookmark();h.setContent(h.getContent());i.moveToBookmark(g)},mceRemoveNode:function(j,k){var h=this.editor,i=h.selection,g,l=k||i.getNode();if(l==h.getBody()){return}g=i.getBookmark();h.dom.remove(l,1);i.moveToBookmark(g);h.nodeChanged()},mceSelectNodeDepth:function(i,j){var g=this.editor,h=g.selection,k=0;g.dom.getParent(h.getNode(),function(l){if(l.nodeType==1&&k++==j){h.select(l);g.nodeChanged();return false}},g.getBody())},mceSelectNode:function(h,g){this.editor.selection.select(g)},mceInsertContent:function(g,h){this.editor.selection.setContent(h)},mceInsertRawHTML:function(h,i){var g=this.editor;g.selection.setContent("tiny_mce_marker");g.setContent(g.getContent().replace(/tiny_mce_marker/g,i))},mceRepaint:function(){var i,g,j=this.editor;if(d.isGecko){try{i=j.selection;g=i.getBookmark(true);if(i.getSel()){i.getSel().selectAllChildren(j.getBody())}i.collapse(true);i.moveToBookmark(g)}catch(h){}}},queryStateUnderline:function(){var g=this.editor,h=g.selection.getNode();if(h&&h.nodeName=="A"){return false}return this._queryState("Underline")},queryStateOutdent:function(){var g=this.editor,h;if(g.settings.inline_styles){if((h=g.dom.getParent(g.selection.getStart(),g.dom.isBlock))&&parseInt(h.style.paddingLeft)>0){return true}if((h=g.dom.getParent(g.selection.getEnd(),g.dom.isBlock))&&parseInt(h.style.paddingLeft)>0){return true}}return this.queryStateInsertUnorderedList()||this.queryStateInsertOrderedList()||(!g.settings.inline_styles&&!!g.dom.getParent(g.selection.getNode(),"BLOCKQUOTE"))},queryStateInsertUnorderedList:function(){return this.editor.dom.getParent(this.editor.selection.getNode(),"UL")},queryStateInsertOrderedList:function(){return this.editor.dom.getParent(this.editor.selection.getNode(),"OL")},queryStatemceBlockQuote:function(){return !!this.editor.dom.getParent(this.editor.selection.getStart(),function(g){return g.nodeName==="BLOCKQUOTE"})},_applyInlineStyle:function(o,j,m){var q=this,n=q.editor,l=n.dom,i,p={},k,r;o=o.toUpperCase();if(m&&m.check_classes&&j["class"]){m.check_classes.push(j["class"])}function h(){f(l.select(o).reverse(),function(t){var s=0;f(l.getAttribs(t),function(u){if(u.nodeName.substring(0,1)!="_"&&l.getAttrib(t,u.nodeName)!=""){s++}});if(s==0){l.remove(t,1)}})}function g(){var s;f(l.select("span,font"),function(t){if(t.style.fontFamily=="mceinline"||t.face=="mceinline"){if(!s){s=n.selection.getBookmark()}j._mce_new="1";l.replace(l.create(o,j),t,1)}});f(l.select(o+"[_mce_new]"),function(u){function t(v){if(v.nodeType==1){f(j.style,function(x,w){l.setStyle(v,w,"")});if(j["class"]&&v.className&&m){f(m.check_classes,function(w){if(l.hasClass(v,w)){l.removeClass(v,w)}})}}}f(l.select(o,u),t);if(u.parentNode&&u.parentNode.nodeType==1&&u.parentNode.childNodes.length==1){t(u.parentNode)}l.getParent(u.parentNode,function(v){if(v.nodeType==1){if(j.style){f(j.style,function(y,x){var w;if(!p[x]&&(w=l.getStyle(v,x))){if(w===y){l.setStyle(u,x,"")}p[x]=1}})}if(j["class"]&&v.className&&m){f(m.check_classes,function(w){if(l.hasClass(v,w)){l.removeClass(u,w)}})}}return false});u.removeAttribute("_mce_new")});h();n.selection.moveToBookmark(s);return !!s}n.focus();n.getDoc().execCommand("FontName",false,"mceinline");g();if(k=q._applyInlineStyle.keyhandler){n.onKeyUp.remove(k);n.onKeyPress.remove(k);n.onKeyDown.remove(k);n.onSetContent.remove(q._applyInlineStyle.chandler)}if(n.selection.isCollapsed()){if(!c){f(l.getParents(n.selection.getNode(),"span"),function(s){f(j.style,function(u,t){var w;if(w=l.getStyle(s,t)){if(w==u){l.setStyle(s,t,"");r=2;return false}r=1;return false}});if(r){return false}});if(r==2){i=n.selection.getBookmark();h();n.selection.moveToBookmark(i);window.setTimeout(function(){n.nodeChanged()},1);return}}q._pendingStyles=d.extend(q._pendingStyles||{},j.style);q._applyInlineStyle.chandler=n.onSetContent.add(function(){delete q._pendingStyles});q._applyInlineStyle.keyhandler=k=function(s){if(q._pendingStyles){j.style=q._pendingStyles;delete q._pendingStyles}if(g()){n.onKeyDown.remove(q._applyInlineStyle.keyhandler);n.onKeyPress.remove(q._applyInlineStyle.keyhandler)}if(s.type=="keyup"){n.onKeyUp.remove(q._applyInlineStyle.keyhandler)}};n.onKeyDown.add(k);n.onKeyPress.add(k);n.onKeyUp.add(k)}else{q._pendingStyles=0}}})})(tinymce);(function(a){a.create("tinymce.UndoManager",{index:0,data:null,typing:0,UndoManager:function(c){var d=this,b=a.util.Dispatcher;d.editor=c;d.data=[];d.onAdd=new b(this);d.onUndo=new b(this);d.onRedo=new b(this)},add:function(d){var g=this,f,e=g.editor,c,h=e.settings,j;d=d||{};d.content=d.content||e.getContent({format:"raw",no_events:1});d.content=d.content.replace(/^\s*|\s*$/g,"");j=g.data[g.index>0&&(g.index==0||g.index==g.data.length)?g.index-1:g.index];if(!d.initial&&j&&d.content==j.content){return null}if(h.custom_undo_redo_levels){if(g.data.length>h.custom_undo_redo_levels){for(f=0;f<g.data.length-1;f++){g.data[f]=g.data[f+1]}g.data.length--;g.index=g.data.length}}if(h.custom_undo_redo_restore_selection&&!d.initial){d.bookmark=c=d.bookmark||e.selection.getBookmark()}if(g.index<g.data.length){g.index++}if(g.data.length===0&&!d.initial){return null}g.data.length=g.index+1;g.data[g.index++]=d;if(d.initial){g.index=0}if(g.data.length==2&&g.data[0].initial){g.data[0].bookmark=c}g.onAdd.dispatch(g,d);e.isNotDirty=0;return d},undo:function(){var e=this,c=e.editor,b=b,d;if(e.typing){e.add();e.typing=0}if(e.index>0){if(e.index==e.data.length&&e.index>1){d=e.index;e.typing=0;if(!e.add()){e.index=d}--e.index}b=e.data[--e.index];c.setContent(b.content,{format:"raw"});c.selection.moveToBookmark(b.bookmark);e.onUndo.dispatch(e,b)}return b},redo:function(){var d=this,c=d.editor,b=null;if(d.index<d.data.length-1){b=d.data[++d.index];c.setContent(b.content,{format:"raw"});c.selection.moveToBookmark(b.bookmark);d.onRedo.dispatch(d,b)}return b},clear:function(){var b=this;b.data=[];b.index=0;b.typing=0;b.add({initial:true})},hasUndo:function(){return this.index!=0||this.typing},hasRedo:function(){return this.index<this.data.length-1}})})(tinymce);(function(e){var b,d,a,c,f,h;b=e.dom.Event;d=e.isIE;a=e.isGecko;c=e.isOpera;f=e.each;h=e.extend;function g(i){i=i.innerHTML;i=i.replace(/<\w+ .*?mce_\w+\"?=.*?>/gi,"-");i=i.replace(/<(img|hr|table)/gi,"-");i=i.replace(/<[^>]+>/g,"");return i.replace(/[ \t\r\n]+/g,"")==""}e.create("tinymce.ForceBlocks",{ForceBlocks:function(j){var k=this,l=j.settings,m;k.editor=j;k.dom=j.dom;m=(l.forced_root_block||"p").toLowerCase();l.element=m.toUpperCase();j.onPreInit.add(k.setup,k);k.reOpera=new RegExp("(\\u00a0|&#160;|&nbsp;)</"+m+">","gi");k.rePadd=new RegExp("<p( )([^>]+)><\\/p>|<p( )([^>]+)\\/>|<p( )([^>]+)>\\s+<\\/p>|<p><\\/p>|<p\\/>|<p>\\s+<\\/p>".replace(/p/g,m),"gi");k.reNbsp2BR1=new RegExp("<p( )([^>]+)>[\\s\\u00a0]+<\\/p>|<p>[\\s\\u00a0]+<\\/p>".replace(/p/g,m),"gi");k.reNbsp2BR2=new RegExp("<%p()([^>]+)>(&nbsp;|&#160;)<\\/%p>|<%p>(&nbsp;|&#160;)<\\/%p>".replace(/%p/g,m),"gi");k.reBR2Nbsp=new RegExp("<p( )([^>]+)>\\s*<br \\/>\\s*<\\/p>|<p>\\s*<br \\/>\\s*<\\/p>".replace(/p/g,m),"gi");function i(n,p){if(c){p.content=p.content.replace(k.reOpera,"</"+m+">")}p.content=p.content.replace(k.rePadd,"<"+m+"$1$2$3$4$5$6>\u00a0</"+m+">");if(!d&&!c&&p.set){p.content=p.content.replace(k.reNbsp2BR1,"<"+m+"$1$2><br /></"+m+">");p.content=p.content.replace(k.reNbsp2BR2,"<"+m+"$1$2><br /></"+m+">")}else{p.content=p.content.replace(k.reBR2Nbsp,"<"+m+"$1$2>\u00a0</"+m+">")}}j.onBeforeSetContent.add(i);j.onPostProcess.add(i);if(l.forced_root_block){j.onInit.add(k.forceRoots,k);j.onSetContent.add(k.forceRoots,k);j.onBeforeGetContent.add(k.forceRoots,k)}},setup:function(){var j=this,i=j.editor,k=i.settings;if(k.forced_root_block){i.onKeyUp.add(j.forceRoots,j);i.onPreProcess.add(j.forceRoots,j)}if(k.force_br_newlines){if(d){i.onKeyPress.add(function(m,p){var q,o=m.selection;if(p.keyCode==13&&o.getNode().nodeName!="LI"){o.setContent('<br id="__" /> ',{format:"raw"});q=m.dom.get("__");q.removeAttribute("id");o.select(q);o.collapse();return b.cancel(p)}})}return}if(!d&&k.force_p_newlines){i.onKeyPress.add(function(m,n){if(n.keyCode==13&&!n.shiftKey){if(!j.insertPara(n)){b.cancel(n)}}});if(a){i.onKeyDown.add(function(m,n){if((n.keyCode==8||n.keyCode==46)&&!n.shiftKey){j.backspaceDelete(n,n.keyCode==8)}})}}function l(n,m){var o=i.dom.create(m);f(n.attributes,function(p){if(p.specified&&p.nodeValue){o.setAttribute(p.nodeName.toLowerCase(),p.nodeValue)}});f(n.childNodes,function(p){o.appendChild(p.cloneNode(true))});n.parentNode.replaceChild(o,n);return o}if(d){i.onPreProcess.add(function(m,n){f(m.dom.select("p,h1,h2,h3,h4,h5,h6,div",n.node),function(o){if(g(o)){o.innerHTML=""}})});if(k.element!="P"){i.onKeyPress.add(function(m,n){j.lastElm=m.selection.getNode().nodeName});i.onKeyUp.add(function(o,q){var s,p=o.selection,r=p.getNode(),m=o.getBody();if(m.childNodes.length===1&&r.nodeName=="P"){r=l(r,k.element);p.select(r);p.collapse();o.nodeChanged()}else{if(q.keyCode==13&&!q.shiftKey&&j.lastElm!="P"){s=o.dom.getParent(r,"p");if(s){l(s,k.element);o.nodeChanged()}}}})}}},find:function(o,k,l){var j=this.editor,i=j.getDoc().createTreeWalker(o,4,null,false),m=-1;while(o=i.nextNode()){m++;if(k==0&&o==l){return m}if(k==1&&m==l){return o}}return -1},forceRoots:function(p,D){var u=this,p=u.editor,H=p.getBody(),E=p.getDoc(),K=p.selection,v=K.getSel(),w=K.getRng(),I=-2,o,B,j,k,F=-16777215;var G,l,J,A,x,m=H.childNodes,z,y,q;for(z=m.length-1;z>=0;z--){G=m[z];if(G.nodeType==3||(!u.dom.isBlock(G)&&G.nodeType!=8)){if(!l){if(G.nodeType!=3||/[^\s]/g.test(G.nodeValue)){if(I==-2&&w){if(!d){if(w.startContainer.nodeType==1&&(y=w.startContainer.childNodes[w.startOffset])&&y.nodeType==1){q=y.getAttribute("id");y.setAttribute("id","__mce")}else{if(p.dom.getParent(w.startContainer,function(i){return i===H})){B=w.startOffset;j=w.endOffset;I=u.find(H,0,w.startContainer);o=u.find(H,0,w.endContainer)}}}else{k=E.body.createTextRange();k.moveToElementText(H);k.collapse(1);J=k.move("character",F)*-1;k=w.duplicate();k.collapse(1);A=k.move("character",F)*-1;k=w.duplicate();k.collapse(0);x=(k.move("character",F)*-1)-A;I=A-J;o=x}}l=p.dom.create(p.settings.forced_root_block);l.appendChild(G.cloneNode(1));G.parentNode.replaceChild(l,G)}}else{if(l.hasChildNodes()){l.insertBefore(G,l.firstChild)}else{l.appendChild(G)}}}else{l=null}}if(I!=-2){if(!d){l=H.getElementsByTagName(p.settings.element)[0];w=E.createRange();if(I!=-1){w.setStart(u.find(H,1,I),B)}else{w.setStart(l,0)}if(o!=-1){w.setEnd(u.find(H,1,o),j)}else{w.setEnd(l,0)}if(v){v.removeAllRanges();v.addRange(w)}}else{try{w=v.createRange();w.moveToElementText(H);w.collapse(1);w.moveStart("character",I);w.moveEnd("character",o);w.select()}catch(C){}}}else{if(!d&&(y=p.dom.get("__mce"))){if(q){y.setAttribute("id",q)}else{y.removeAttribute("id")}w=E.createRange();w.setStartBefore(y);w.setEndBefore(y);K.setRng(w)}}},getParentBlock:function(j){var i=this.dom;return i.getParent(j,i.isBlock)},insertPara:function(M){var A=this,o=A.editor,I=o.dom,N=o.getDoc(),R=o.settings,B=o.selection.getSel(),C=B.getRangeAt(0),Q=N.body;var F,G,D,K,J,l,j,m,q,i,x,P,k,p,E,H=I.getViewPort(o.getWin()),w,z,v;F=N.createRange();F.setStart(B.anchorNode,B.anchorOffset);F.collapse(true);G=N.createRange();G.setStart(B.focusNode,B.focusOffset);G.collapse(true);D=F.compareBoundaryPoints(F.START_TO_END,G)<0;K=D?B.anchorNode:B.focusNode;J=D?B.anchorOffset:B.focusOffset;l=D?B.focusNode:B.anchorNode;j=D?B.focusOffset:B.anchorOffset;if(K===l&&/^(TD|TH)$/.test(K.nodeName)){I.remove(K.firstChild);o.dom.add(K,R.element,null,"<br />");P=o.dom.add(K,R.element,null,"<br />");C=N.createRange();C.selectNodeContents(P);C.collapse(1);o.selection.setRng(C);return false}if(K==Q&&l==Q&&Q.firstChild&&o.dom.isBlock(Q.firstChild)){K=l=K.firstChild;J=j=0;F=N.createRange();F.setStart(K,0);G=N.createRange();G.setStart(l,0)}K=K.nodeName=="HTML"?N.body:K;K=K.nodeName=="BODY"?K.firstChild:K;l=l.nodeName=="HTML"?N.body:l;l=l.nodeName=="BODY"?l.firstChild:l;m=A.getParentBlock(K);q=A.getParentBlock(l);i=m?m.nodeName:R.element;if(A.dom.getParent(m,"ol,ul,pre")){return true}if(m&&(m.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(I.getStyle(m,"position",1)))){i=R.element;m=null}if(q&&(q.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(I.getStyle(m,"position",1)))){i=R.element;q=null}if(/(TD|TABLE|TH|CAPTION)/.test(i)||(m&&i=="DIV"&&/left|right/gi.test(I.getStyle(m,"float",1)))){i=R.element;m=q=null}x=(m&&m.nodeName==i)?m.cloneNode(0):o.dom.create(i);P=(q&&q.nodeName==i)?q.cloneNode(0):o.dom.create(i);P.removeAttribute("id");if(/^(H[1-6])$/.test(i)&&K.nodeValue&&J==K.nodeValue.length){P=o.dom.create(R.element)}E=k=K;do{if(E==Q||E.nodeType==9||A.dom.isBlock(E)||/(TD|TABLE|TH|CAPTION)/.test(E.nodeName)){break}k=E}while((E=E.previousSibling?E.previousSibling:E.parentNode));E=p=l;do{if(E==Q||E.nodeType==9||A.dom.isBlock(E)||/(TD|TABLE|TH|CAPTION)/.test(E.nodeName)){break}p=E}while((E=E.nextSibling?E.nextSibling:E.parentNode));if(k.nodeName==i){F.setStart(k,0)}else{F.setStartBefore(k)}F.setEnd(K,J);x.appendChild(F.cloneContents()||N.createTextNode(""));try{G.setEndAfter(p)}catch(L){}G.setStart(l,j);P.appendChild(G.cloneContents()||N.createTextNode(""));C=N.createRange();if(!k.previousSibling&&k.parentNode.nodeName==i){C.setStartBefore(k.parentNode)}else{if(F.startContainer.nodeName==i&&F.startOffset==0){C.setStartBefore(F.startContainer)}else{C.setStart(F.startContainer,F.startOffset)}}if(!p.nextSibling&&p.parentNode.nodeName==i){C.setEndAfter(p.parentNode)}else{C.setEnd(G.endContainer,G.endOffset)}C.deleteContents();if(c){o.getWin().scrollTo(0,H.y)}if(x.firstChild&&x.firstChild.nodeName==i){x.innerHTML=x.firstChild.innerHTML}if(P.firstChild&&P.firstChild.nodeName==i){P.innerHTML=P.firstChild.innerHTML}if(g(x)){x.innerHTML="<br />"}function O(y,s){var r=[],T,S,t;y.innerHTML="";if(R.keep_styles){S=s;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(S.nodeName)){T=S.cloneNode(false);I.setAttrib(T,"id","");r.push(T)}}while(S=S.parentNode)}if(r.length>0){for(t=r.length-1,T=y;t>=0;t--){T=T.appendChild(r[t])}r[0].innerHTML=c?"&nbsp;":"<br />";return r[0]}else{y.innerHTML=c?"&nbsp;":"<br />"}}if(g(P)){v=O(P,l)}if(c&&parseFloat(opera.version())<9.5){C.insertNode(x);C.insertNode(P)}else{C.insertNode(P);C.insertNode(x)}P.normalize();x.normalize();function u(r){return N.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false).nextNode()||r}C=N.createRange();C.selectNodeContents(a?u(v||P):v||P);C.collapse(1);B.removeAllRanges();B.addRange(C);w=o.dom.getPos(P).y;z=P.clientHeight;if(w<H.y||w+z>H.y+H.h){o.getWin().scrollTo(0,w<H.y?w:w-H.h+25)}return false},backspaceDelete:function(l,u){var x=this,k=x.editor,p=k.getBody(),j,m=k.selection,i=m.getRng(),o=i.startContainer,j,q,s;if(o&&k.dom.isBlock(o)&&!/^(TD|TH)$/.test(o.nodeName)&&u){if(o.childNodes.length==0||(o.childNodes.length==1&&o.firstChild.nodeName=="BR")){j=o;while((j=j.previousSibling)&&!k.dom.isBlock(j)){}if(j){if(o!=p.firstChild){q=k.dom.doc.createTreeWalker(j,NodeFilter.SHOW_TEXT,null,false);while(s=q.nextNode()){j=s}i=k.getDoc().createRange();i.setStart(j,j.nodeValue?j.nodeValue.length:0);i.setEnd(j,j.nodeValue?j.nodeValue.length:0);m.setRng(i);k.dom.remove(o)}return b.cancel(l)}}}function v(n){var r;n=n.target;if(n&&n.parentNode&&n.nodeName=="BR"&&(j=x.getParentBlock(n))){r=n.previousSibling;b.remove(p,"DOMNodeInserted",v);if(r&&r.nodeType==3&&/\s+$/.test(r.nodeValue)){return}if(n.previousSibling||n.nextSibling){k.dom.remove(n)}}}b._add(p,"DOMNodeInserted",v);window.setTimeout(function(){b._remove(p,"DOMNodeInserted",v)},1)}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each,e=c.extend;c.create("tinymce.ControlManager",{ControlManager:function(f,j){var h=this,g;j=j||{};h.editor=f;h.controls={};h.onAdd=new c.util.Dispatcher(h);h.onPostRender=new c.util.Dispatcher(h);h.prefix=j.prefix||f.id+"_";h._cls={};h.onPostRender.add(function(){d(h.controls,function(i){i.postRender()})})},get:function(f){return this.controls[this.prefix+f]||this.controls[f]},setActive:function(h,f){var g=null;if(g=this.get(h)){g.setActive(f)}return g},setDisabled:function(h,f){var g=null;if(g=this.get(h)){g.setDisabled(f)}return g},add:function(g){var f=this;if(g){f.controls[g.id]=g;f.onAdd.dispatch(g,f)}return g},createControl:function(i){var h,g=this,f=g.editor;d(f.plugins,function(j){if(j.createControl){h=j.createControl(i,g);if(h){return false}}});switch(i){case"|":case"separator":return g.createSeparator()}if(!h&&f.buttons&&(h=f.buttons[i])){return g.createButton(i,h)}return g.add(h)},createDropMenu:function(f,n,h){var m=this,i=m.editor,j,g,k,l;n=e({"class":"mceDropDown",constrain:i.settings.constrain_menus},n);n["class"]=n["class"]+" "+i.getParam("skin")+"Skin";if(k=i.getParam("skin_variant")){n["class"]+=" "+i.getParam("skin")+"Skin"+k.substring(0,1).toUpperCase()+k.substring(1)}f=m.prefix+f;l=h||m._cls.dropmenu||c.ui.DropMenu;j=m.controls[f]=new l(f,n);j.onAddItem.add(function(r,q){var p=q.settings;p.title=i.getLang(p.title,p.title);if(!p.onclick){p.onclick=function(o){i.execCommand(p.cmd,p.ui||false,p.value)}}});i.onRemove.add(function(){j.destroy()});if(c.isIE){j.onShowMenu.add(function(){i.focus();g=i.selection.getBookmark(1)});j.onHideMenu.add(function(){if(g){i.selection.moveToBookmark(g);g=0}})}return m.add(j)},createListBox:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.scope=i.scope||g;if(!i.onselect){i.onselect=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}i=e({title:i.title,"class":"mce_"+m,scope:i.scope,control_manager:h},i);m=h.prefix+m;if(g.settings.use_native_selects){k=new c.ui.NativeListBox(m,i)}else{f=l||h._cls.listbox||c.ui.ListBox;k=new f(m,i)}h.controls[m]=k;if(c.isWebKit){k.onPostRender.add(function(p,o){a.add(o,"mousedown",function(){g.bookmark=g.selection.getBookmark("simple")});a.add(o,"focus",function(){g.selection.moveToBookmark(g.bookmark);g.bookmark=null})})}if(k.hideMenu){g.onMouseDown.add(k.hideMenu,k)}return h.add(k)},createButton:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.label=g.translate(i.label);i.scope=i.scope||g;if(!i.onclick&&!i.menu_button){i.onclick=function(){g.execCommand(i.cmd,i.ui||false,i.value)}}i=e({title:i.title,"class":"mce_"+m,unavailable_prefix:g.getLang("unavailable",""),scope:i.scope,control_manager:h},i);m=h.prefix+m;if(i.menu_button){f=l||h._cls.menubutton||c.ui.MenuButton;k=new f(m,i);g.onMouseDown.add(k.hideMenu,k)}else{f=h._cls.button||c.ui.Button;k=new f(m,i)}return h.add(k)},createMenuButton:function(h,f,g){f=f||{};f.menu_button=1;return this.createButton(h,f,g)},createSplitButton:function(m,i,l){var h=this,g=h.editor,j,k,f;if(h.get(m)){return null}i.title=g.translate(i.title);i.scope=i.scope||g;if(!i.onclick){i.onclick=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}if(!i.onselect){i.onselect=function(n){g.execCommand(i.cmd,i.ui||false,n||i.value)}}i=e({title:i.title,"class":"mce_"+m,scope:i.scope,control_manager:h},i);m=h.prefix+m;f=l||h._cls.splitbutton||c.ui.SplitButton;k=h.add(new f(m,i));g.onMouseDown.add(k.hideMenu,k);return k},createColorSplitButton:function(f,n,h){var l=this,j=l.editor,i,k,m,g;if(l.get(f)){return null}n.title=j.translate(n.title);n.scope=n.scope||j;if(!n.onclick){n.onclick=function(o){if(c.isIE){g=j.selection.getBookmark(1)}j.execCommand(n.cmd,n.ui||false,o||n.value)}}if(!n.onselect){n.onselect=function(o){j.execCommand(n.cmd,n.ui||false,o||n.value)}}n=e({title:n.title,"class":"mce_"+f,menu_class:j.getParam("skin")+"Skin",scope:n.scope,more_colors_title:j.getLang("more_colors")},n);f=l.prefix+f;m=h||l._cls.colorsplitbutton||c.ui.ColorSplitButton;k=new m(f,n);j.onMouseDown.add(k.hideMenu,k);j.onRemove.add(function(){k.destroy()});if(c.isIE){k.onHideMenu.add(function(){if(g){j.selection.moveToBookmark(g);g=0}})}return l.add(k)},createToolbar:function(k,h,j){var i,g=this,f;k=g.prefix+k;f=j||g._cls.toolbar||c.ui.Toolbar;i=new f(k,h);if(g.get(k)){return null}return g.add(i)},createSeparator:function(g){var f=g||this._cls.separator||c.ui.Separator;return new f()},setControlType:function(g,f){return this._cls[g.toLowerCase()]=f},destroy:function(){d(this.controls,function(f){f.destroy()});this.controls=null}})})(tinymce);(function(d){var a=d.util.Dispatcher,e=d.each,c=d.isIE,b=d.isOpera;d.create("tinymce.WindowManager",{WindowManager:function(f){var g=this;g.editor=f;g.onOpen=new a(g);g.onClose=new a(g);g.params={};g.features={}},open:function(z,h){var v=this,k="",n,m,i=v.editor.settings.dialog_type=="modal",q,o,j,g=d.DOM.getViewPort(),r;z=z||{};h=h||{};o=b?g.w:screen.width;j=b?g.h:screen.height;z.name=z.name||"mc_"+new Date().getTime();z.width=parseInt(z.width||320);z.height=parseInt(z.height||240);z.resizable=true;z.left=z.left||parseInt(o/2)-(z.width/2);z.top=z.top||parseInt(j/2)-(z.height/2);h.inline=false;h.mce_width=z.width;h.mce_height=z.height;h.mce_auto_focus=z.auto_focus;if(i){if(c){z.center=true;z.help=false;z.dialogWidth=z.width+"px";z.dialogHeight=z.height+"px";z.scroll=z.scrollbars||false}}e(z,function(p,f){if(d.is(p,"boolean")){p=p?"yes":"no"}if(!/^(name|url)$/.test(f)){if(c&&i){k+=(k?";":"")+f+":"+p}else{k+=(k?",":"")+f+"="+p}}});v.features=z;v.params=h;v.onOpen.dispatch(v,z,h);r=z.url||z.file;r=d._addVer(r);try{if(c&&i){q=1;window.showModalDialog(r,window,k)}else{q=window.open(r,z.name,k)}}catch(l){}if(!q){alert(v.editor.getLang("popup_blocked"))}},close:function(f){f.close();this.onClose.dispatch(this)},createInstance:function(i,h,g,m,l,k){var j=d.resolve(i);return new j(h,g,m,l,k)},confirm:function(h,f,i,g){g=g||window;f.call(i||this,g.confirm(this._decode(this.editor.getLang(h,h))))},alert:function(h,f,j,g){var i=this;g=g||window;g.alert(i._decode(i.editor.getLang(h,h)));if(f){f.call(j||i)}},_decode:function(f){return d.DOM.decode(f).replace(/\\n/g,"\n")}})}(tinymce));(function(a){a.CommandManager=function(){var c={},b={},d={};function e(i,h,g,f){if(typeof(h)=="string"){h=[h]}a.each(h,function(j){i[j.toLowerCase()]={func:g,scope:f}})}a.extend(this,{add:function(h,g,f){e(c,h,g,f)},addQueryStateHandler:function(h,g,f){e(b,h,g,f)},addQueryValueHandler:function(h,g,f){e(d,h,g,f)},execCommand:function(g,j,i,h,f){if(j=c[j.toLowerCase()]){if(j.func.call(g||j.scope,i,h,f)!==false){return true}}},queryCommandValue:function(){if(cmd=d[cmd.toLowerCase()]){return cmd.func.call(scope||cmd.scope,ui,value,args)}},queryCommandState:function(){if(cmd=b[cmd.toLowerCase()]){return cmd.func.call(scope||cmd.scope,ui,value,args)}}})};a.GlobalCommands=new a.CommandManager()})(tinymce);(function(b){function a(i,d,h,m){var j,g,e,l,f;function k(p,o){do{if(p.parentNode==o){return p}p=p.parentNode}while(p)}function c(o){m(o);b.walk(o,m,"childNodes")}j=i.findCommonAncestor(d,h);e=k(d,j)||d;l=k(h,j)||h;for(g=d;g&&g!=e;g=g.parentNode){for(f=g.nextSibling;f;f=f.nextSibling){c(f)}}if(e!=l){for(g=e.nextSibling;g&&g!=l;g=g.nextSibling){c(g)}}else{c(e)}for(g=h;g&&g!=l;g=g.parentNode){for(f=g.previousSibling;f;f=f.previousSibling){c(f)}}}b.GlobalCommands.add("RemoveFormat",function(){var m=this,l=m.dom,u=m.selection,d=u.getRng(1),e=[],h,f,j,q,g,o,c,i;function k(s){var r;l.getParent(s,function(v){if(l.is(v,m.getParam("removeformat_selector"))){r=v}return l.isBlock(v)},m.getBody());return r}function p(r){if(l.is(r,m.getParam("removeformat_selector"))){e.push(r)}}function t(r){p(r);b.walk(r,p,"childNodes")}h=u.getBookmark();q=d.startContainer;o=d.endContainer;g=d.startOffset;c=d.endOffset;q=q.nodeType==1?q.childNodes[Math.min(g,q.childNodes.length-1)]:q;o=o.nodeType==1?o.childNodes[Math.min(g==c?c:c-1,o.childNodes.length-1)]:o;if(q==o){f=k(q);if(q.nodeType==3){if(f&&f.nodeType==1){i=q.splitText(g);i.splitText(c-g);l.split(f,i);u.moveToBookmark(h)}return}t(l.split(f,q)||q)}else{f=k(q);j=k(o);if(f){if(q.nodeType==3){if(g==q.nodeValue.length){q.nodeValue+="\uFEFF"}q=q.splitText(g)}}if(j){if(o.nodeType==3){o.splitText(c)}}if(f&&f==j){l.replace(l.create("span",{id:"__end"},o.cloneNode(true)),o)}if(f){f=l.split(f,q)}else{f=q}if(i=l.get("__end")){o=i;j=k(o)}if(j){j=l.split(j,o)}else{j=o}a(l,f,j,p);if(q.nodeValue=="\uFEFF"){q.nodeValue=""}t(o);t(q)}b.each(e,function(r){l.remove(r,1)});l.remove("__end",1);u.moveToBookmark(h)})})(tinymce);(function(a){a.GlobalCommands.add("mceBlockQuote",function(){var j=this,o=j.selection,f=j.dom,l,k,e,d,p,c,m,h,b;function g(i){return f.getParent(i,function(q){return q.nodeName==="BLOCKQUOTE"})}l=f.getParent(o.getStart(),f.isBlock);k=f.getParent(o.getEnd(),f.isBlock);if(p=g(l)){if(l!=k||l.childNodes.length>1||(l.childNodes.length==1&&l.firstChild.nodeName!="BR")){d=o.getBookmark()}if(g(k)){m=p.cloneNode(false);while(e=k.nextSibling){m.appendChild(e.parentNode.removeChild(e))}}if(m){f.insertAfter(m,p)}b=o.getSelectedBlocks(l,k);for(h=b.length-1;h>=0;h--){f.insertAfter(b[h],p)}if(/^\s*$/.test(p.innerHTML)){f.remove(p,1)}if(m&&/^\s*$/.test(m.innerHTML)){f.remove(m,1)}if(!d){if(!a.isIE){c=j.getDoc().createRange();c.setStart(l,0);c.setEnd(l,0);o.setRng(c)}else{o.select(l);o.collapse(0);if(f.getParent(o.getStart(),f.isBlock)!=l){c=o.getRng();c.move("character",-1);c.select()}}}else{j.selection.moveToBookmark(d)}return}if(a.isIE&&!l&&!k){j.getDoc().execCommand("Indent");e=g(o.getNode());e.style.margin=e.dir="";return}if(!l||!k){return}if(l!=k||l.childNodes.length>1||(l.childNodes.length==1&&l.firstChild.nodeName!="BR")){d=o.getBookmark()}a.each(o.getSelectedBlocks(g(o.getStart()),g(o.getEnd())),function(i){if(i.nodeName=="BLOCKQUOTE"&&!p){p=i;return}if(!p){p=f.create("blockquote");i.parentNode.insertBefore(p,i)}if(i.nodeName=="BLOCKQUOTE"&&p){e=i.firstChild;while(e){p.appendChild(e.cloneNode(true));e=e.nextSibling}f.remove(i);return}p.appendChild(f.remove(i))});if(!d){if(!a.isIE){c=j.getDoc().createRange();c.setStart(l,0);c.setEnd(l,0);o.setRng(c)}else{o.select(l);o.collapse(1)}}else{o.moveToBookmark(d)}})})(tinymce);(function(a){a.each(["Cut","Copy","Paste"],function(b){a.GlobalCommands.add(b,function(){var c=this,e=c.getDoc();try{e.execCommand(b,false,null);if(!e.queryCommandSupported(b)){throw"Error"}}catch(d){c.windowManager.alert(c.getLang("clipboard_no_support"))}})})})(tinymce);(function(a){a.GlobalCommands.add("InsertHorizontalRule",function(){if(a.isOpera){return this.getDoc().execCommand("InsertHorizontalRule",false,"")}this.selection.setContent("<hr />")})})(tinymce);(function(){var a=tinymce.GlobalCommands;a.add(["mceEndUndoLevel","mceAddUndoLevel"],function(){this.undoManager.add()});a.add("Undo",function(){var b=this;if(b.settings.custom_undo_redo){b.undoManager.undo();b.nodeChanged();return true}return false});a.add("Redo",function(){var b=this;if(b.settings.custom_undo_redo){b.undoManager.redo();b.nodeChanged();return true}return false})})();
\ No newline at end of file
+(function(m){var o=/^\s*|\s*$/g,q={majorVersion:"3",minorVersion:"3.7",releaseDate:"2010-06-10",_init:function(){function k(v){if(v.src&&/tiny_mce(|_gzip|_jquery|_prototype)(_dev|_src)?.js/.test(v.src)){if(/_(src|dev)\.js/g.test(v.src))j.suffix="_src";if((r=v.src.indexOf("?"))!=-1)j.query=v.src.substring(r+1);j.baseURL=v.src.substring(0,v.src.lastIndexOf("/"));if(l&&j.baseURL.indexOf("://")==-1&&j.baseURL.indexOf("/")!==0)j.baseURL=l+j.baseURL;return j.baseURL}return null}var j=this,b=document,g=
+navigator,d=g.userAgent,l,r,u;j.isOpera=m.opera&&opera.buildNumber;j.isWebKit=/WebKit/.test(d);j.isIE=!j.isWebKit&&!j.isOpera&&/MSIE/gi.test(d)&&/Explorer/gi.test(g.appName);j.isIE6=j.isIE&&/MSIE [56]/.test(d);j.isGecko=!j.isWebKit&&/Gecko/.test(d);j.isMac=d.indexOf("Mac")!=-1;j.isAir=/adobeair/i.test(d);j.isIDevice=/(iPad|iPhone)/.test(d);if(m.tinyMCEPreInit){j.suffix=tinyMCEPreInit.suffix;j.baseURL=tinyMCEPreInit.base;j.query=tinyMCEPreInit.query}else{j.suffix="";d=b.getElementsByTagName("base");
+for(g=0;g<d.length;g++)if(u=d[g].href){if(/^https?:\/\/[^\/]+$/.test(u))u+="/";l=u?u.match(/.*\//)[0]:""}d=b.getElementsByTagName("script");for(g=0;g<d.length;g++)if(k(d[g]))return;if(b=b.getElementsByTagName("head")[0]){d=b.getElementsByTagName("script");for(g=0;g<d.length;g++)if(k(d[g]))break}}},is:function(k,j){if(!j)return k!==void 0;if(j=="array"&&k.hasOwnProperty&&k instanceof Array)return true;return typeof k==j},each:function(k,j,b){var g,d;if(!k)return 0;b=b||k;if(k.length!==void 0){g=0;
+for(d=k.length;g<d;g++)if(j.call(b,k[g],g,k)===false)return 0}else for(g in k)if(k.hasOwnProperty(g))if(j.call(b,k[g],g,k)===false)return 0;return 1},map:function(k,j){var b=[];q.each(k,function(g){b.push(j(g))});return b},grep:function(k,j){var b=[];q.each(k,function(g){if(!j||j(g))b.push(g)});return b},inArray:function(k,j){var b,g;if(k){b=0;for(g=k.length;b<g;b++)if(k[b]===j)return b}return-1},extend:function(k,j){var b,g,d=arguments;b=1;for(g=d.length;b<g;b++){j=d[b];q.each(j,function(l,r){if(l!==
+void 0)k[r]=l})}return k},trim:function(k){return(k?""+k:"").replace(o,"")},create:function(k,j){var b,g,d,l,r,u=0;k=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(k);d=k[3].match(/(^|\.)(\w+)$/i)[2];g=this.createNS(k[3].replace(/\.\w+$/,""));if(!g[d])if(k[2]=="static"){g[d]=j;this.onCreate&&this.onCreate(k[2],k[3],g[d])}else{if(!j[d]){j[d]=function(){};u=1}g[d]=j[d];this.extend(g[d].prototype,j);if(k[5]){b=this.resolve(k[5]).prototype;l=k[5].match(/\.(\w+)$/i)[1];r=g[d];g[d]=u?function(){return b[l].apply(this,
+arguments)}:function(){this.parent=b[l];return r.apply(this,arguments)};g[d].prototype[d]=g[d];this.each(b,function(v,f){g[d].prototype[f]=b[f]});this.each(j,function(v,f){if(b[f])g[d].prototype[f]=function(){this.parent=b[f];return v.apply(this,arguments)};else if(f!=d)g[d].prototype[f]=v})}this.each(j["static"],function(v,f){g[d][f]=v});this.onCreate&&this.onCreate(k[2],k[3],g[d].prototype)}},walk:function(k,j,b,g){g=g||this;if(k){if(b)k=k[b];q.each(k,function(d,l){if(j.call(g,d,l,b)===false)return false;
+q.walk(d,j,b,g)})}},createNS:function(k,j){var b,g;j=j||m;k=k.split(".");for(b=0;b<k.length;b++){g=k[b];j[g]||(j[g]={});j=j[g]}return j},resolve:function(k,j){var b,g;j=j||m;k=k.split(".");b=0;for(g=k.length;b<g;b++){j=j[k[b]];if(!j)break}return j},addUnload:function(k,j){var b=this;k={func:k,scope:j||this};if(b.unloads)b.unloads.push(k);else{var g=function(){var l=b.unloads,r,u;if(l){for(u in l)(r=l[u])&&r.func&&r.func.call(r.scope,1);if(m.detachEvent){m.detachEvent("onbeforeunload",d);m.detachEvent("onunload",
+g)}else m.removeEventListener&&m.removeEventListener("unload",g,false);b.unloads=w=g=0;m.CollectGarbage&&CollectGarbage()}},d=function(){var l=document;if(l.readyState=="interactive"){var r=function(){l.detachEvent("onstop",r);g&&g();l=0};l&&l.attachEvent("onstop",r);m.setTimeout(function(){l&&l.detachEvent("onstop",r)},0)}};if(m.attachEvent){m.attachEvent("onunload",g);m.attachEvent("onbeforeunload",d)}else m.addEventListener&&m.addEventListener("unload",g,false);b.unloads=[k]}return k},removeUnload:function(k){var j=
+this.unloads,b=null;q.each(j,function(g,d){if(g&&g.func==k){j.splice(d,1);b=k;return false}});return b},explode:function(k,j){return k?q.map(k.split(j||","),q.trim):k},_addVer:function(k){var j;if(!this.query)return k;j=(k.indexOf("?")==-1?"?":"&")+this.query;if(k.indexOf("#")==-1)return k+j;return k.replace("#",j+"#")}};q._init();m.tinymce=m.tinyMCE=q})(window);
+tinymce.create("tinymce.util.Dispatcher",{scope:null,listeners:null,Dispatcher:function(m){this.scope=m||this;this.listeners=[]},add:function(m,o){this.listeners.push({cb:m,scope:o||this.scope});return m},addToTop:function(m,o){this.listeners.unshift({cb:m,scope:o||this.scope});return m},remove:function(m){var o=this.listeners,q=null;tinymce.each(o,function(k,j){if(m==k.cb){q=m;o.splice(j,1);return false}});return q},dispatch:function(){var m,o=arguments,q,k=this.listeners;for(q=0;q<k.length;q++){m=
+k[q];m=m.cb.apply(m.scope,o);if(m===false)break}return m}});
+(function(){var m=tinymce.each;tinymce.create("tinymce.util.URI",{URI:function(o,q){var k=this,j;o=tinymce.trim(o);q=k.settings=q||{};if(/^(mailto|tel|news|javascript|about|data):/i.test(o)||/^\s*#/.test(o))k.source=o;else{if(o.indexOf("/")===0&&o.indexOf("//")!==0)o=(q.base_uri?q.base_uri.protocol||"http":"http")+"://mce_host"+o;/^\w*:?\/\//.test(o)||(o=(q.base_uri.protocol||"http")+"://mce_host"+k.toAbsPath(q.base_uri.path,o));o=o.replace(/@@/g,"(mce_at)");o=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(o);
+m(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(b,g){var d=o[g];if(d)d=d.replace(/\(mce_at\)/g,"@@");k[b]=d});if(j=q.base_uri){if(!k.protocol)k.protocol=j.protocol;if(!k.userInfo)k.userInfo=j.userInfo;if(!k.port&&k.host=="mce_host")k.port=j.port;if(!k.host||k.host=="mce_host")k.host=j.host;k.source=""}}},setPath:function(o){o=/^(.*?)\/?(\w+)?$/.exec(o);this.path=o[0];this.directory=o[1];this.file=o[2];this.source=
+"";this.getURI()},toRelative:function(o){var q;if(o==="./")return o;o=new tinymce.util.URI(o,{base_uri:this});if(o.host!="mce_host"&&this.host!=o.host&&o.host||this.port!=o.port||this.protocol!=o.protocol)return o.getURI();q=this.toRelPath(this.path,o.path);if(o.query)q+="?"+o.query;if(o.anchor)q+="#"+o.anchor;return q},toAbsolute:function(o,q){o=new tinymce.util.URI(o,{base_uri:this});return o.getURI(this.host==o.host&&this.protocol==o.protocol?q:0)},toRelPath:function(o,q){var k,j=0,b="",g,d;o=
+o.substring(0,o.lastIndexOf("/"));o=o.split("/");k=q.split("/");if(o.length>=k.length){g=0;for(d=o.length;g<d;g++)if(g>=k.length||o[g]!=k[g]){j=g+1;break}}if(o.length<k.length){g=0;for(d=k.length;g<d;g++)if(g>=o.length||o[g]!=k[g]){j=g+1;break}}if(j==1)return q;g=0;for(d=o.length-(j-1);g<d;g++)b+="../";g=j-1;for(d=k.length;g<d;g++)b+=g!=j-1?"/"+k[g]:k[g];return b},toAbsPath:function(o,q){var k,j=0,b=[],g;g=/\/$/.test(q)?"/":"";o=o.split("/");q=q.split("/");m(o,function(d){d&&b.push(d)});o=b;k=q.length-
+1;for(b=[];k>=0;k--)if(!(q[k].length==0||q[k]=="."))if(q[k]=="..")j++;else if(j>0)j--;else b.push(q[k]);k=o.length-j;k=k<=0?b.reverse().join("/"):o.slice(0,k).join("/")+"/"+b.reverse().join("/");if(k.indexOf("/")!==0)k="/"+k;if(g&&k.lastIndexOf("/")!==k.length-1)k+=g;return k},getURI:function(o){var q;if(!this.source||o){q="";if(!o){if(this.protocol)q+=this.protocol+"://";if(this.userInfo)q+=this.userInfo+"@";if(this.host)q+=this.host;if(this.port)q+=":"+this.port}if(this.path)q+=this.path;if(this.query)q+=
+"?"+this.query;if(this.anchor)q+="#"+this.anchor;this.source=q}return this.source}})})();
+(function(){var m=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(o){o=this.get(o);var q;o&&m(o.split("&"),function(k){k=k.split("=");q=q||{};q[unescape(k[0])]=unescape(k[1])});return q},setHash:function(o,q,k,j,b,g){var d="";m(q,function(l,r){d+=(!d?"":"&")+escape(r)+"="+escape(l)});this.set(o,d,k,j,b,g)},get:function(o){var q=document.cookie,k=o+"=",j;if(q){j=q.indexOf("; "+k);if(j==-1){j=q.indexOf(k);if(j!=0)return null}else j+=2;o=q.indexOf(";",j);if(o==-1)o=q.length;
+return unescape(q.substring(j+k.length,o))}},set:function(o,q,k,j,b,g){document.cookie=o+"="+escape(q)+(k?"; expires="+k.toGMTString():"")+(j?"; path="+escape(j):"")+(b?"; domain="+b:"")+(g?"; secure":"")},remove:function(o,q){var k=new Date;k.setTime(k.getTime()-1E3);this.set(o,"",k,q,k)}})})();
+tinymce.create("static tinymce.util.JSON",{serialize:function(m){var o,q,k=tinymce.util.JSON.serialize,j;if(m==null)return"null";j=typeof m;if(j=="string"){q="\u0008b\tt\nn\u000cf\rr\"\"''\\\\";return'"'+m.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g,function(b,g){o=q.indexOf(g);if(o+1)return"\\"+q.charAt(o+1);b=g.charCodeAt().toString(16);return"\\u"+"0000".substring(b.length)+b})+'"'}if(j=="object"){if(m.hasOwnProperty&&m instanceof Array){o=0;for(q="[";o<m.length;o++)q+=(o>0?",":"")+k(m[o]);return q+
+"]"}q="{";for(o in m)q+=typeof m[o]!="function"?(q.length>1?',"':'"')+o+'":'+k(m[o]):"";return q+"}"}return""+m},parse:function(m){try{return eval("("+m+")")}catch(o){}}});
+tinymce.create("static tinymce.util.XHR",{send:function(m){function o(g){q=0;try{q=new ActiveXObject(g)}catch(d){}return q}var q,k=window,j=0;m.scope=m.scope||this;m.success_scope=m.success_scope||m.scope;m.error_scope=m.error_scope||m.scope;m.async=m.async===false?false:true;m.data=m.data||"";if(q=k.XMLHttpRequest?new XMLHttpRequest:o("Microsoft.XMLHTTP")||o("Msxml2.XMLHTTP")){q.overrideMimeType&&q.overrideMimeType(m.content_type);q.open(m.type||(m.data?"POST":"GET"),m.url,m.async);m.content_type&&
+q.setRequestHeader("Content-Type",m.content_type);q.setRequestHeader("X-Requested-With","XMLHttpRequest");q.send(m.data);var b=function(){if(!m.async||q.readyState==4||j++>1E4){if(m.success&&j<1E4&&q.status==200)m.success.call(m.success_scope,""+q.responseText,q,m);else if(m.error)m.error.call(m.error_scope,j>1E4?"TIMED_OUT":"GENERAL",q,m);q=null}else k.setTimeout(b,10)};if(!m.async)return b();k.setTimeout(b,10)}}});
+(function(){var m=tinymce.extend,o=tinymce.util.JSON,q=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(k){this.settings=m({},k);this.count=0},send:function(k){var j=k.error,b=k.success;k=m(this.settings,k);k.success=function(g,d){g=o.parse(g);if(typeof g=="undefined")g={error:"JSON Parse error."};g.error?j.call(k.error_scope||k.scope,g.error,d):b.call(k.success_scope||k.scope,g.result)};k.error=function(g,d){j.call(k.error_scope||k.scope,g,d)};k.data=o.serialize({id:k.id||
+"c"+this.count++,method:k.method,params:k.params});k.content_type="application/json";q.send(k)},"static":{sendRPC:function(k){return(new tinymce.util.JSONRequest).send(k)}}})})();
+(function(m){function o(c){var i={},a;c=c.split(",");for(a=c.length;a>=0;a--)i[c[a]]=1;return i}var q=m.each,k=m.is,j=m.isWebKit,b=m.isIE,g=/^(H[1-6R]|P|DIV|ADDRESS|PRE|FORM|T(ABLE|BODY|HEAD|FOOT|H|R|D)|LI|OL|UL|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|MENU|ISINDEX|SAMP)$/,d=o("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"),l=o("src,href,style,coords,shape"),r={"&":"&amp;",'"':"&quot;","<":"&lt;",">":"&gt;"},u=/[<>&\"]/g,v=
+/^([a-z0-9],?)+$/i,f=/<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)(\s*\/?)>/g,e=/(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;m.create("tinymce.dom.DOMUtils",{doc:null,root:null,files:null,pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,props:{"for":"htmlFor","class":"className",className:"className",checked:"checked",disabled:"disabled",maxlength:"maxLength",readonly:"readOnly",selected:"selected",value:"value",id:"id",name:"name",
+type:"type"},DOMUtils:function(c,i){var a=this;a.doc=c;a.win=window;a.files={};a.cssFlicker=false;a.counter=0;a.boxModel=!m.isIE||c.compatMode=="CSS1Compat";a.stdMode=c.documentMode===8;a.settings=i=m.extend({keep_values:false,hex_colors:1,process_html:1},i);if(m.isIE6)try{c.execCommand("BackgroundImageCache",false,true)}catch(h){a.cssFlicker=true}if(i.valid_styles){a._styles={};q(i.valid_styles,function(n,p){a._styles[p]=m.explode(n)})}m.addUnload(a.destroy,a)},getRoot:function(){var c=this.settings;
+return c&&this.get(c.root_element)||this.doc.body},getViewPort:function(c){var i;c=!c?this.win:c;i=c.document;i=this.boxModel?i.documentElement:i.body;return{x:c.pageXOffset||i.scrollLeft,y:c.pageYOffset||i.scrollTop,w:c.innerWidth||i.clientWidth,h:c.innerHeight||i.clientHeight}},getRect:function(c){var i;c=this.get(c);i=this.getPos(c);c=this.getSize(c);return{x:i.x,y:i.y,w:c.w,h:c.h}},getSize:function(c){var i,a;c=this.get(c);i=this.getStyle(c,"width");a=this.getStyle(c,"height");if(i.indexOf("px")===
+-1)i=0;if(a.indexOf("px")===-1)a=0;return{w:parseInt(i)||c.offsetWidth||c.clientWidth,h:parseInt(a)||c.offsetHeight||c.clientHeight}},getParent:function(c,i,a){return this.getParents(c,i,a,false)},getParents:function(c,i,a,h){var n=this,p,t=n.settings,s=[];c=n.get(c);h=h===undefined;if(t.strict_root)a=a||n.getRoot();if(k(i,"string")){p=i;i=i==="*"?function(x){return x.nodeType==1}:function(x){return n.is(x,p)}}for(;c;){if(c==a||!c.nodeType||c.nodeType===9)break;if(!i||i(c))if(h)s.push(c);else return c;
+c=c.parentNode}return h?s:null},get:function(c){var i;if(c&&this.doc&&typeof c=="string"){i=c;if((c=this.doc.getElementById(c))&&c.id!==i)return this.doc.getElementsByName(i)[1]}return c},getNext:function(c,i){return this._findSib(c,i,"nextSibling")},getPrev:function(c,i){return this._findSib(c,i,"previousSibling")},select:function(c,i){return m.dom.Sizzle(c,this.get(i)||this.get(this.settings.root_element)||this.doc,[])},is:function(c,i){var a;if(c.length===undefined){if(i==="*")return c.nodeType==
+1;if(v.test(i)){i=i.toLowerCase().split(/,/);c=c.nodeName.toLowerCase();for(a=i.length-1;a>=0;a--)if(i[a]==c)return true;return false}}return m.dom.Sizzle.matches(i,c.nodeType?[c]:c).length>0},add:function(c,i,a,h,n){var p=this;return this.run(c,function(t){var s;s=k(i,"string")?p.doc.createElement(i):i;p.setAttribs(s,a);if(h)h.nodeType?s.appendChild(h):p.setHTML(s,h);return!n?t.appendChild(s):s})},create:function(c,i,a){return this.add(this.doc.createElement(c),c,i,a,1)},createHTML:function(c,i,
+a){var h="",n;h+="<"+c;for(n in i)if(i.hasOwnProperty(n))h+=" "+n+'="'+this.encode(i[n])+'"';if(m.is(a))return h+">"+a+"</"+c+">";return h+" />"},remove:function(c,i){return this.run(c,function(a){var h,n;h=a.parentNode;if(!h)return null;if(i)for(;n=a.firstChild;)!m.isIE||n.nodeType!==3||n.nodeValue?h.insertBefore(n,a):a.removeChild(n);return h.removeChild(a)})},setStyle:function(c,i,a){var h=this;return h.run(c,function(n){var p;p=n.style;i=i.replace(/-(\D)/g,function(t,s){return s.toUpperCase()});
+if(h.pixelStyles.test(i)&&(m.is(a,"number")||/^[\-0-9\.]+$/.test(a)))a+="px";switch(i){case "opacity":if(b){p.filter=a===""?"":"alpha(opacity="+a*100+")";if(!c.currentStyle||!c.currentStyle.hasLayout)p.display="inline-block"}p[i]=p["-moz-opacity"]=p["-khtml-opacity"]=a||"";break;case "float":b?p.styleFloat=a:p.cssFloat=a;break;default:p[i]=a||""}h.settings.update_styles&&h.setAttrib(n,"_mce_style")})},getStyle:function(c,i,a){c=this.get(c);if(!c)return false;if(this.doc.defaultView&&a){i=i.replace(/[A-Z]/g,
+function(n){return"-"+n});try{return this.doc.defaultView.getComputedStyle(c,null).getPropertyValue(i)}catch(h){return null}}i=i.replace(/-(\D)/g,function(n,p){return p.toUpperCase()});if(i=="float")i=b?"styleFloat":"cssFloat";if(c.currentStyle&&a)return c.currentStyle[i];return c.style[i]},setStyles:function(c,i){var a=this,h=a.settings,n;n=h.update_styles;h.update_styles=0;q(i,function(p,t){a.setStyle(c,t,p)});h.update_styles=n;h.update_styles&&a.setAttrib(c,h.cssText)},setAttrib:function(c,i,a){var h=
+this;if(c&&i){if(h.settings.strict)i=i.toLowerCase();return this.run(c,function(n){var p=h.settings;switch(i){case "style":if(!k(a,"string")){q(a,function(t,s){h.setStyle(n,s,t)});return}if(p.keep_values)a&&!h._isRes(a)?n.setAttribute("_mce_style",a,2):n.removeAttribute("_mce_style",2);n.style.cssText=a;break;case "class":n.className=a||"";break;case "src":case "href":if(p.keep_values){if(p.url_converter)a=p.url_converter.call(p.url_converter_scope||h,a,i,n);h.setAttrib(n,"_mce_"+i,a,2)}break;case "shape":n.setAttribute("_mce_style",
+a)}k(a)&&a!==null&&a.length!==0?n.setAttribute(i,""+a,2):n.removeAttribute(i,2)})}},setAttribs:function(c,i){var a=this;return this.run(c,function(h){q(i,function(n,p){a.setAttrib(h,p,n)})})},getAttrib:function(c,i,a){var h;c=this.get(c);if(!c||c.nodeType!==1)return false;k(a)||(a="");if(/^(src|href|style|coords|shape)$/.test(i))if(h=c.getAttribute("_mce_"+i))return h;if(b&&this.props[i])h=(h=c[this.props[i]])&&h.nodeValue?h.nodeValue:h;h||(h=c.getAttribute(i,2));if(/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(i)){if(c[this.props[i]]===
+true&&h==="")return i;return h?i:""}if(c.nodeName==="FORM"&&c.getAttributeNode(i))return c.getAttributeNode(i).nodeValue;if(i==="style")if(h=h||c.style.cssText){h=this.serializeStyle(this.parseStyle(h),c.nodeName);this.settings.keep_values&&!this._isRes(h)&&c.setAttribute("_mce_style",h)}if(j&&i==="class"&&h)h=h.replace(/(apple|webkit)\-[a-z\-]+/gi,"");if(b)switch(i){case "rowspan":case "colspan":if(h===1)h="";break;case "size":if(h==="+0"||h===20||h===0)h="";break;case "width":case "height":case "vspace":case "checked":case "disabled":case "readonly":if(h===
+0)h="";break;case "hspace":if(h===-1)h="";break;case "maxlength":case "tabindex":if(h===32768||h===2147483647||h==="32768")h="";break;case "multiple":case "compact":case "noshade":case "nowrap":if(h===65535)return i;return a;case "shape":h=h.toLowerCase();break;default:if(i.indexOf("on")===0&&h)h=(""+h).replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/,"$1")}return h!==undefined&&h!==null&&h!==""?""+h:a},getPos:function(c,i){var a=0,h=0,n=this.doc;c=this.get(c);i=i||n.body;if(c){if(b&&!this.stdMode){c=
+c.getBoundingClientRect();h=this.boxModel?n.documentElement:n.body;a=this.getStyle(this.select("html")[0],"borderWidth");a=(a=="medium"||this.boxModel&&!this.isIE6)&&2||a;c.top+=this.win.self!=this.win.top?2:0;return{x:c.left+h.scrollLeft-a,y:c.top+h.scrollTop-a}}for(n=c;n&&n!=i&&n.nodeType;){a+=n.offsetLeft||0;h+=n.offsetTop||0;n=n.offsetParent}for(n=c.parentNode;n&&n!=i&&n.nodeType;){a-=n.scrollLeft||0;h-=n.scrollTop||0;n=n.parentNode}}return{x:a,y:h}},parseStyle:function(c){function i(p,t,s){var x,
+y;if(x=n[p+"-top"+t]){y=n[p+"-right"+t];if(x==y){x=n[p+"-bottom"+t];if(y==x){y=n[p+"-left"+t];if(x==y){n[s]=y;delete n[p+"-top"+t];delete n[p+"-right"+t];delete n[p+"-bottom"+t];delete n[p+"-left"+t]}}}}}var a=this,h=a.settings,n={};if(!c)return n;c=c.replace(/&(#?[a-z0-9]+);/g,"&$1_MCE_SEMI_");q(c.split(";"),function(p){var t,s=[];if(p){p=p.replace(/_MCE_SEMI_/g,";");p=p.replace(/url\([^\)]+\)/g,function(x){s.push(x);return"url("+s.length+")"});p=p.split(":");t=m.trim(p[1]);t=t.replace(/url\(([^\)]+)\)/g,
+function(x,y){return s[parseInt(y)-1]});t=t.replace(/rgb\([^\)]+\)/g,function(x){return a.toHex(x)});if(h.url_converter)t=t.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g,function(x,y){return"url("+h.url_converter.call(h.url_converter_scope||a,a.decode(y),"style",null)+")"});n[m.trim(p[0]).toLowerCase()]=t}});i("border","","border");i("border","-width","border-width");i("border","-color","border-color");i("border","-style","border-style");i("padding","","padding");i("margin","","margin");(function(p,
+t,s,x){var y;if(y=n[t])if(y=n[s])if(y=n[x]){n[p]=n[t]+" "+n[s]+" "+n[x];delete n[t];delete n[s];delete n[x]}})("border","border-width","border-style","border-color");if(b)if(n.border=="medium none")n.border="";return n},serializeStyle:function(c,i){function a(n,p){if(p&&n)if(p.indexOf("-")!==0){switch(p){case "font-weight":if(n==700)n="bold";break;case "color":case "background-color":n=n.toLowerCase()}h+=(h?" ":"")+p+": "+n+";"}}var h="";if(i&&this._styles){q(this._styles["*"],function(n){a(c[n],
+n)});q(this._styles[i.toLowerCase()],function(n){a(c[n],n)})}else q(c,a);return h},loadCSS:function(c){var i=this,a=i.doc,h;c||(c="");h=i.select("head")[0];q(c.split(","),function(n){var p;if(!i.files[n]){i.files[n]=true;p=i.create("link",{rel:"stylesheet",href:m._addVer(n)});if(b&&a.documentMode)p.onload=function(){a.recalc();p.onload=null};h.appendChild(p)}})},addClass:function(c,i){return this.run(c,function(a){var h;if(!i)return 0;if(this.hasClass(a,i))return a.className;h=this.removeClass(a,
+i);return a.className=(h!=""?h+" ":"")+i})},removeClass:function(c,i){var a=this,h;return a.run(c,function(n){var p;if(a.hasClass(n,i)){h||(h=RegExp("(^|\\s+)"+i+"(\\s+|$)","g"));p=n.className.replace(h," ");p=m.trim(p!=" "?p:"");n.className=p;if(!p){n.removeAttribute("class");n.removeAttribute("className")}return p}return n.className})},hasClass:function(c,i){c=this.get(c);if(!c||!i)return false;return(" "+c.className+" ").indexOf(" "+i+" ")!==-1},show:function(c){return this.setStyle(c,"display",
+"block")},hide:function(c){return this.setStyle(c,"display","none")},isHidden:function(c){c=this.get(c);return!c||c.style.display=="none"||this.getStyle(c,"display")=="none"},uniqueId:function(c){return(!c?"mce_":c)+this.counter++},setHTML:function(c,i){var a=this;return this.run(c,function(h){var n,p,t,s,x;i=a.processHTML(i);if(b){var y=function(){for(;h.firstChild;)h.firstChild.removeNode();try{h.innerHTML="<br />"+i;h.removeChild(h.firstChild)}catch(D){n=a.create("div");n.innerHTML="<br />"+i;
+q(n.childNodes,function(B,M){M&&h.appendChild(B)})}};if(a.settings.fix_ie_paragraphs)i=i.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi,'<p$1 _mce_keep="true">&nbsp;</p>');y();if(a.settings.fix_ie_paragraphs){t=h.getElementsByTagName("p");p=t.length-1;for(n=0;p>=0;p--){s=t[p];if(!s.hasChildNodes()){if(!s._mce_keep){n=1;break}s.removeAttribute("_mce_keep")}}}if(n){i=i.replace(/<p ([^>]+)>|<p>/ig,'<div $1 _mce_tmp="1">');i=i.replace(/<\/p>/gi,"</div>");y();if(a.settings.fix_ie_paragraphs){t=h.getElementsByTagName("DIV");
+for(p=t.length-1;p>=0;p--){s=t[p];if(s._mce_tmp){x=a.doc.createElement("p");s.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi,function(D,B){var M;if(B!=="_mce_tmp"){M=s.getAttribute(B);if(!M&&B==="class")M=s.className;x.setAttribute(B,M)}});for(n=0;n<s.childNodes.length;n++)x.appendChild(s.childNodes[n].cloneNode(true));s.swapNode(x)}}}}}else h.innerHTML=i;return i})},processHTML:function(c){var i=this,a=i.settings,h=[];if(!a.process_html)return c;if(b){c=c.replace(/&apos;/g,"&#39;");c=c.replace(/\s+(disabled|checked|readonly|selected)\s*=\s*[\"\']?(false|0)[\"\']?/gi,
+"")}c=c.replace(/<a( )([^>]+)\/>|<a\/>/gi,"<a$1$2></a>");if(a.keep_values){if(/<script|noscript|style/i.test(c)){var n=function(p){p=p.replace(/(<!--\[CDATA\[|\]\]--\>)/g,"\n");p=p.replace(/^[\r\n]*|[\r\n]*$/g,"");p=p.replace(/^\s*(\/\/\s*<!--|\/\/\s*<!\[CDATA\[|<!--|<!\[CDATA\[)[\r\n]*/g,"");return p=p.replace(/\s*(\/\/\s*\]\]>|\/\/\s*--\>|\]\]>|--\>|\]\]--\>)\s*$/g,"")};c=c.replace(/<script([^>]+|)>([\s\S]*?)<\/script>/gi,function(p,t,s){t||(t=' type="text/javascript"');t=t.replace(/src=\"([^\"]+)\"?/i,
+function(x,y){if(a.url_converter)y=i.encode(a.url_converter.call(a.url_converter_scope||i,i.decode(y),"src","script"));return'_mce_src="'+y+'"'});if(m.trim(s)){h.push(n(s));s="<!--\nMCE_SCRIPT:"+(h.length-1)+"\n// --\>"}return"<mce:script"+t+">"+s+"</mce:script>"});c=c.replace(/<style([^>]+|)>([\s\S]*?)<\/style>/gi,function(p,t,s){if(s){h.push(n(s));s="<!--\nMCE_SCRIPT:"+(h.length-1)+"\n--\>"}return"<mce:style"+t+">"+s+"</mce:style><style "+t+' _mce_bogus="1">'+s+"</style>"});c=c.replace(/<noscript([^>]+|)>([\s\S]*?)<\/noscript>/g,
+function(p,t,s){return"<mce:noscript"+t+"><!--"+i.encode(s).replace(/--/g,"&#45;&#45;")+"--\></mce:noscript>"})}c=c.replace(/<!\[CDATA\[([\s\S]+)\]\]>/g,"<!--[CDATA[$1]]--\>");c=function(p){return p.replace(f,function(t,s,x,y){return"<"+s+x.replace(e,function(D,B,M,X,C){B=B.toLowerCase();M=M||X||C||"";if(d[B]){if(M==="false"||M==="0")return;return B+'="'+B+'"'}if(l[B]&&x.indexOf("_mce_"+B)==-1){D=i.decode(M);if(a.url_converter&&(B=="src"||B=="href"))D=a.url_converter.call(a.url_converter_scope||i,
+D,B,s);if(B=="style")D=i.serializeStyle(i.parseStyle(D),B);return B+'="'+M+'" _mce_'+B+'="'+i.encode(D)+'"'}return D})+y+">"})}(c);c=c.replace(/MCE_SCRIPT:([0-9]+)/g,function(p,t){return h[t]})}return c},getOuterHTML:function(c){var i;c=this.get(c);if(!c)return null;if(c.outerHTML!==undefined)return c.outerHTML;i=(c.ownerDocument||this.doc).createElement("body");i.appendChild(c.cloneNode(true));return i.innerHTML},setOuterHTML:function(c,i,a){function h(p,t,s){s=s.createElement("body");s.innerHTML=
+t;for(t=s.lastChild;t;){n.insertAfter(t.cloneNode(true),p);t=t.previousSibling}n.remove(p)}var n=this;return this.run(c,function(p){p=n.get(p);if(p.nodeType==1){a=a||p.ownerDocument||n.doc;if(b)try{if(b&&p.nodeType==1)p.outerHTML=i;else h(p,i,a)}catch(t){h(p,i,a)}else h(p,i,a)}})},decode:function(c){var i,a;if(/&[\w#]+;/.test(c)){i=this.doc.createElement("div");i.innerHTML=c;i=i.firstChild;a="";if(i){do a+=i.nodeValue;while(i=i.nextSibling)}return a||c}return c},encode:function(c){return(""+c).replace(u,
+function(i){return r[i]})},insertAfter:function(c,i){i=this.get(i);return this.run(c,function(a){var h,n;h=i.parentNode;(n=i.nextSibling)?h.insertBefore(a,n):h.appendChild(a);return a})},isBlock:function(c){if(c.nodeType&&c.nodeType!==1)return false;c=c.nodeName||c;return g.test(c)},replace:function(c,i,a){if(k(i,"array"))c=c.cloneNode(true);return this.run(i,function(h){a&&q(m.grep(h.childNodes),function(n){c.appendChild(n)});return h.parentNode.replaceChild(c,h)})},rename:function(c,i){var a=this,
+h;if(c.nodeName!=i.toUpperCase()){h=a.create(i);q(a.getAttribs(c),function(n){a.setAttrib(h,n.nodeName,a.getAttrib(c,n.nodeName))});a.replace(h,c,1)}return h||c},findCommonAncestor:function(c,i){for(var a=c,h;a;){for(h=i;h&&a!=h;)h=h.parentNode;if(a==h)break;a=a.parentNode}if(!a&&c.ownerDocument)return c.ownerDocument.documentElement;return a},toHex:function(c){function i(h){h=parseInt(h).toString(16);return h.length>1?h:"0"+h}var a=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(c);
+if(a)return c="#"+i(a[1])+i(a[2])+i(a[3]);return c},getClasses:function(){function c(t){q(t.imports,function(s){c(s)});q(t.cssRules||t.rules,function(s){switch(s.type||1){case 1:s.selectorText&&q(s.selectorText.split(","),function(x){x=x.replace(/^\s*|\s*$|^\s\./g,"");if(!(/\.mce/.test(x)||!/\.[\w\-]+$/.test(x))){n=x;x=x.replace(/.*\.([a-z0-9_\-]+).*/i,"$1");if(!(h&&!(x=h(x,n))))if(!a[x]){i.push({"class":x});a[x]=1}}});break;case 3:c(s.styleSheet)}})}var i=[],a={},h=this.settings.class_filter,n;if(this.classes)return this.classes;
+try{q(this.doc.styleSheets,c)}catch(p){}if(i.length>0)this.classes=i;return i},run:function(c,i,a){var h=this,n;if(h.doc&&typeof c==="string")c=h.get(c);if(!c)return false;a=a||this;if(!c.nodeType&&(c.length||c.length===0)){n=[];q(c,function(p,t){if(p){if(typeof p=="string")p=h.doc.getElementById(p);n.push(i.call(a,p,t))}});return n}return i.call(a,c)},getAttribs:function(c){var i;c=this.get(c);if(!c)return[];if(b){i=[];if(c.nodeName=="OBJECT")return c.attributes;c.nodeName==="OPTION"&&this.getAttrib(c,
+"selected")&&i.push({specified:1,nodeName:"selected"});c.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi,"").replace(/[\w:\-]+/gi,function(a){i.push({specified:1,nodeName:a})});return i}return c.attributes},destroy:function(c){this.events&&this.events.destroy();this.win=this.doc=this.root=this.events=null;c||m.removeUnload(this.destroy)},createRng:function(){var c=this.doc;return c.createRange?c.createRange():new m.dom.Range(this)},nodeIndex:function(c,i){var a=
+0,h,n;if(c){h=c.nodeType;for(c=c.previousSibling;c;c=c.previousSibling){n=c.nodeType;if(i&&n==3)if(n==h||!c.nodeValue.length)continue;a++;h=n}}return a},split:function(c,i,a){function h(x){var y,D=x.childNodes;if(!(x.nodeType==1&&x.getAttribute("_mce_type")=="bookmark")){for(y=D.length-1;y>=0;y--)h(D[y]);if(x.nodeType!=9){if(x.nodeType==3&&x.nodeValue.length>0)return;if(x.nodeType==1){D=x.childNodes;D.length==1&&D[0]&&D[0].nodeType==1&&D[0].getAttribute("_mce_type")=="bookmark"&&x.parentNode.insertBefore(D[0],
+x);if(D.length||/^(br|hr|input|img)$/i.test(x.nodeName))return}n.remove(x)}return x}}var n=this,p=n.createRng(),t,s;if(c&&i){p.setStart(c.parentNode,n.nodeIndex(c));p.setEnd(i.parentNode,n.nodeIndex(i));t=p.extractContents();p=n.createRng();p.setStart(i.parentNode,n.nodeIndex(i)+1);p.setEnd(c.parentNode,n.nodeIndex(c)+1);p=p.extractContents();s=c.parentNode;s.insertBefore(h(t),c);a?s.replaceChild(a,i):s.insertBefore(i,c);s.insertBefore(h(p),c);n.remove(c);return a||i}},bind:function(c,i,a,h){if(!this.events)this.events=
+new m.dom.EventUtils;return this.events.add(c,i,a,h||this)},unbind:function(c,i,a){if(!this.events)this.events=new m.dom.EventUtils;return this.events.remove(c,i,a)},_findSib:function(c,i,a){var h=this,n=i;if(c){if(k(n,"string"))n=function(p){return h.is(p,i)};for(c=c[a];c;c=c[a])if(n(c))return c}return null},_isRes:function(c){return/^(top|left|bottom|right|width|height)/i.test(c)||/;\s*(top|left|bottom|right|width|height)/i.test(c)}});m.DOM=new m.dom.DOMUtils(document,{process_html:0})})(tinymce);
+(function(m){function o(q){function k(C,E){r(t,C,E)}function j(C,E){r(s,C,E)}function b(C){k(C.parentNode,X(C))}function g(C){j(C.parentNode,X(C)+1)}function d(C,E){var A;if(C.nodeType==3)return C;if(E<0)return C;for(A=C.firstChild;A&&E>0;){--E;A=A.nextSibling}if(A)return A;return C}function l(C,E,A,K){var H,W;if(C==A){if(E==K)return 0;if(E<K)return-1;return 1}for(H=A;H&&H.parentNode!=C;)H=H.parentNode;if(H){W=0;for(A=C.firstChild;A!=H&&W<E;){W++;A=A.nextSibling}if(E<=W)return-1;return 1}for(H=C;H&&
+H.parentNode!=A;)H=H.parentNode;if(H){W=0;for(A=A.firstChild;A!=H&&W<K;){W++;A=A.nextSibling}if(W<K)return-1;return 1}E=q.findCommonAncestor(C,A);for(C=C;C&&C.parentNode!=E;)C=C.parentNode;C||(C=E);for(K=A;K&&K.parentNode!=E;)K=K.parentNode;K||(K=E);if(C==K)return 0;for(A=E.firstChild;A;){if(A==C)return-1;if(A==K)return 1;A=A.nextSibling}}function r(C,E,A){if(C){a[y]=E;a[x]=A}else{a[D]=E;a[B]=A}for(E=a[D];E.parentNode;)E=E.parentNode;for(A=a[y];A.parentNode;)A=A.parentNode;if(A==E)l(a[y],a[x],a[D],
+a[B])>0&&a.collapse(C);else a.collapse(C);a.collapsed=a[y]==a[D]&&a[x]==a[B];a.commonAncestorContainer=q.findCommonAncestor(a[y],a[D])}function u(C){var E,A=0,K=0,H;if(a[y]==a[D])return v(C);E=a[D];for(H=E.parentNode;H;E=H,H=H.parentNode){if(H==a[y]){var W=E;C=C;E=void 0;H=void 0;A=void 0;K=void 0;H=void 0;if(C!=p)E=h.createDocumentFragment();H=f(W,C);E&&E.appendChild(H);A=X(W)-a[x];if(!(A<=0))for(H=W.previousSibling;A>0;){K=H.previousSibling;H=i(H,C);E&&E.insertBefore(H,E.firstChild);--A;H=K}if(C!=
+n){a.setEndBefore(W);a.collapse(s)}C=E;return C}++A}E=a[y];for(H=E.parentNode;H;E=H,H=H.parentNode){if(H==a[D]){W=E;C=C;E=void 0;A=void 0;H=void 0;A=void 0;K=void 0;H=void 0;if(C!=p)E=h.createDocumentFragment();H=e(W,C);E&&E.appendChild(H);A=X(W);++A;A=a[B]-A;for(H=W.nextSibling;A>0;){K=H.nextSibling;H=i(H,C);E&&E.appendChild(H);--A;H=K}if(C!=n){a.setStartAfter(W);a.collapse(t)}return E}++K}K=K-A;for(E=a[y];K>0;){E=E.parentNode;K--}for(A=a[D];K<0;){A=A.parentNode;K++}K=E.parentNode;for(H=A.parentNode;K!=
+H;K=K.parentNode,H=H.parentNode){E=K;A=H}E=E;A=A;var V;if(C!=p)W=h.createDocumentFragment();V=e(E,C);W&&W.appendChild(V);K=X(E);H=X(A);++K;K=H-K;for(V=E.nextSibling;K>0;){H=V.nextSibling;V=i(V,C);W&&W.appendChild(V);V=H;--K}V=f(A,C);W&&W.appendChild(V);if(C!=n){a.setStartAfter(E);a.collapse(t)}return W}function v(C){var E,A,K,H;if(C!=p)E=h.createDocumentFragment();if(a[x]==a[B])return E;if(a[y].nodeType==3){A=a[y].nodeValue;A=A.substring(a[x],a[B]);if(C!=n){a[y].deleteData(a[x],a[B]-a[x]);a.collapse(t)}if(C==
+p)return;E.appendChild(h.createTextNode(A));return E}K=d(a[y],a[x]);for(A=a[B]-a[x];A>0;){H=K.nextSibling;K=i(K,C);E&&E.appendChild(K);--A;K=H}C!=n&&a.collapse(t);return E}function f(C,E){var A=d(a[D],a[B]-1),K,H,W,V=A!=a[D];if(A==C)return c(A,V,s,E);K=A.parentNode;for(H=c(K,s,s,E);K;){for(;A;){W=A.previousSibling;A=c(A,V,s,E);E!=p&&H.insertBefore(A,H.firstChild);V=t;A=W}if(K==C)return H;A=K.previousSibling;K=K.parentNode;W=c(K,s,s,E);E!=p&&W.appendChild(H);H=W}}function e(C,E){var A=d(a[y],a[x]),
+K=A!=a[y],H,W,V;if(A==C)return c(A,K,t,E);H=A.parentNode;for(W=c(H,s,t,E);H;){for(;A;){V=A.nextSibling;A=c(A,K,t,E);E!=p&&W.appendChild(A);K=t;A=V}if(H==C)return W;A=H.nextSibling;H=H.parentNode;V=c(H,s,t,E);E!=p&&V.appendChild(W);W=V}}function c(C,E,A,K){var H;if(E)return i(C,K);if(C.nodeType==3){E=C.nodeValue;if(A){H=a[x];A=E.substring(H);E=E.substring(0,H)}else{H=a[B];A=E.substring(0,H);E=E.substring(H)}if(K!=n)C.nodeValue=E;if(K==p)return;C=C.cloneNode(s);C.nodeValue=A;return C}if(K!=p)return C.cloneNode(s)}
+function i(C,E){if(E!=p)return E==n?C.cloneNode(t):C;C.parentNode.removeChild(C)}var a=this,h=q.doc,n=1,p=2,t=true,s=false,x="startOffset",y="startContainer",D="endContainer",B="endOffset",M=tinymce.extend,X=q.nodeIndex;M(a,{startContainer:h,startOffset:0,endContainer:h,endOffset:0,collapsed:t,commonAncestorContainer:h,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:k,setEnd:j,setStartBefore:b,setStartAfter:function(C){k(C.parentNode,X(C)+1)},setEndBefore:function(C){j(C.parentNode,
+X(C))},setEndAfter:g,collapse:function(C){if(C){a[D]=a[y];a[B]=a[x]}else{a[y]=a[D];a[x]=a[B]}a.collapsed=t},selectNode:function(C){b(C);g(C)},selectNodeContents:function(C){k(C,0);j(C,C.nodeType===1?C.childNodes.length:C.nodeValue.length)},compareBoundaryPoints:function(C){var E=a[y],A=a[x],K=a[D],H=a[B];if(C===0)return l(E,A,E,A);if(C===1)return l(E,A,K,H);if(C===2)return l(K,H,K,H);if(C===3)return l(K,H,E,A)},deleteContents:function(){u(p)},extractContents:function(){return u(0)},cloneContents:function(){return u(n)},
+insertNode:function(C){var E=this[y],A=this[x],K;if((E.nodeType===3||E.nodeType===4)&&E.nodeValue)if(A)if(A>=E.nodeValue.length)q.insertAfter(C,E);else{A=E.splitText(A);E.parentNode.insertBefore(C,A)}else E.parentNode.insertBefore(C,E);else{if(E.childNodes.length>0)K=E.childNodes[A];K?E.insertBefore(C,K):E.appendChild(C)}},surroundContents:function(C){var E=a.extractContents();a.insertNode(C);C.appendChild(E);a.selectNode(C)},cloneRange:function(){return M(new o(q),{startContainer:a[y],startOffset:a[x],
+endContainer:a[D],endOffset:a[B],collapsed:a.collapsed,commonAncestorContainer:a.commonAncestorContainer})}})}m.Range=o})(tinymce.dom);
+(function(){tinymce.dom.TridentSelection=function(m){function o(){function b(r){var u,v,f,e=0,c,i,a,h;f=g.duplicate();f.collapse(r);u=j.create("a");a=f.parentElement();if(a.hasChildNodes()){a.appendChild(u);f.moveToElementText(u);h=g.compareEndPoints(r?"StartToStart":"EndToEnd",f);if(h>0){d[r?"setStartAfter":"setEndAfter"](a);j.remove(u)}else{v=tinymce.grep(a.childNodes);for(c=v.length-1;e<=c;){i=Math.floor((e+c)/2);a.insertBefore(u,v[i]);f.moveToElementText(u);h=g.compareEndPoints(r?"StartToStart":
+"EndToEnd",f);if(h>0)e=i+1;else if(h<0)c=i-1;else{found=true;break}}v=h>0||i==0?u.nextSibling:u.previousSibling;if(v.nodeType==1){j.remove(u);f=j.nodeIndex(v);v=v.parentNode;if(!r||i>0)f++}else{if(h>0||i==0){f.setEndPoint(r?"StartToStart":"EndToEnd",g);f=f.text.length}else{f.setEndPoint(r?"StartToStart":"EndToEnd",g);f=v.nodeValue.length-f.text.length}j.remove(u)}d[r?"setStart":"setEnd"](v,f)}}else d[r?"setStart":"setEnd"](a,0)}var g=m.getRng(),d=j.createRng(),l;l=g.item?g.item(0):g.parentElement();
+if(l.ownerDocument!=j.doc)return d;if(g.item||!l.hasChildNodes()){d.setStart(l.parentNode,j.nodeIndex(l));d.setEnd(d.startContainer,d.startOffset+1);return d}l=m.isCollapsed();b(true);l||b();return d}var q,k,j=m.dom;this.addRange=function(b){var g,d,l=m.dom.doc;d=l.body;var r,u,v,f,e,c;this.destroy();r=b.startContainer;u=b.startOffset;v=b.endContainer;f=b.endOffset;d.createTextRange();if(r==l||v==l){g=d.createTextRange();g.collapse();g.select()}else{if(r.nodeType==1&&r.hasChildNodes()){g=r.childNodes.length-
+1;if(u>g){e=1;r=r.childNodes[g]}else r=r.childNodes[u];if(r.nodeType==3)u=0}if(v.nodeType==1&&v.hasChildNodes()){g=v.childNodes.length-1;if(f==0){c=1;v=v.childNodes[0]}else{v=v.childNodes[Math.min(g,f-1)];if(v.nodeType==3)f=v.nodeValue.length}}if(r==v&&r.nodeType==1){if(/^(IMG|TABLE)$/.test(r.nodeName)&&u!=f){g=d.createControlRange();g.addElement(r)}else{g=d.createTextRange();if(!r.hasChildNodes()&&r.canHaveHTML)r.innerHTML="\ufeff";g.moveToElementText(r);if(r.innerHTML=="\ufeff"){g.collapse(true);
+r.removeChild(r.firstChild)}}u==f&&g.collapse(f<=b.endContainer.childNodes.length-1);g.select();g.scrollIntoView()}else{g=d.createTextRange();b=l.createElement("span");b.innerHTML=" ";if(r.nodeType==3){e?j.insertAfter(b,r):r.parentNode.insertBefore(b,r);g.moveToElementText(b);b.parentNode.removeChild(b);u>0&&g.move("character",u)}else{g.moveToElementText(r);e&&g.collapse(false)}if(r==v&&r.nodeType==3)try{g.moveEnd("character",f-u);g.select();g.scrollIntoView()}catch(i){}else{d=d.createTextRange();
+if(v.nodeType==3){v.parentNode.insertBefore(b,v);d.moveToElementText(b);b.parentNode.removeChild(b);d.move("character",f);g.setEndPoint("EndToStart",d)}else{d.moveToElementText(v);d.collapse(!!c);g.setEndPoint("EndToEnd",d)}g.select();g.scrollIntoView()}}}};this.getRangeAt=function(){if(!q||!tinymce.dom.RangeUtils.compareRanges(k,m.getRng())){q=o();k=m.getRng()}return q};this.destroy=function(){k=q=null};m.dom.boxModel&&function(){function b(f,e){var c=r.createTextRange();try{c.moveToPoint(f,e)}catch(i){c=
+null}return c}function g(f){if(f.button){if(f=b(f.x,f.y)){f.compareEndPoints("StartToStart",v)>0?f.setEndPoint("StartToStart",v):f.setEndPoint("EndToEnd",v);f.select()}}else d()}function d(){j.unbind(l,"mouseup",d);j.unbind(l,"mousemove",g);u=0}var l=j.doc,r=l.body,u,v;l.documentElement.unselectable=true;j.bind(l,"mousedown",function(f){if(f.target.nodeName==="HTML"){u&&d();u=1;if(v=b(f.x,f.y)){j.bind(l,"mouseup",d);j.bind(l,"mousemove",g);v.select()}}})}()}})();
+(function(){function m(a,h,n,p,t,s){t=0;for(var x=p.length;t<x;t++){var y=p[t];if(y){y=y[a];for(var D=false;y;){if(y.sizcache===n){D=p[y.sizset];break}if(y.nodeType===1&&!s){y.sizcache=n;y.sizset=t}if(y.nodeName.toLowerCase()===h){D=y;break}y=y[a]}p[t]=D}}}function o(a,h,n,p,t,s){t=0;for(var x=p.length;t<x;t++){var y=p[t];if(y){y=y[a];for(var D=false;y;){if(y.sizcache===n){D=p[y.sizset];break}if(y.nodeType===1){if(!s){y.sizcache=n;y.sizset=t}if(typeof h!=="string"){if(y===h){D=true;break}}else if(d.filter(h,
+[y]).length>0){D=y;break}}y=y[a]}p[t]=D}}}var q=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,k=0,j=Object.prototype.toString,b=false,g=true;[0,0].sort(function(){g=false;return 0});var d=function(a,h,n,p){n=n||[];var t=h=h||document;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!a||typeof a!=="string")return n;var s=[],x,y,D,B,M=true,X=d.isXML(h),C=a,E;do{q.exec("");if(x=q.exec(C)){C=x[3];s.push(x[1]);if(x[2]){B=
+x[3];break}}}while(x);if(s.length>1&&r.exec(a))if(s.length===2&&l.relative[s[0]])y=i(s[0]+s[1],h);else for(y=l.relative[s[0]]?[h]:d(s.shift(),h);s.length;){a=s.shift();if(l.relative[a])a+=s.shift();y=i(a,y)}else{if(!p&&s.length>1&&h.nodeType===9&&!X&&l.match.ID.test(s[0])&&!l.match.ID.test(s[s.length-1])){x=d.find(s.shift(),h,X);h=x.expr?d.filter(x.expr,x.set)[0]:x.set[0]}if(h){x=p?{expr:s.pop(),set:f(p)}:d.find(s.pop(),s.length===1&&(s[0]==="~"||s[0]==="+")&&h.parentNode?h.parentNode:h,X);y=x.expr?
+d.filter(x.expr,x.set):x.set;if(s.length>0)D=f(y);else M=false;for(;s.length;){x=E=s.pop();if(l.relative[E])x=s.pop();else E="";if(x==null)x=h;l.relative[E](D,x,X)}}else D=[]}D||(D=y);D||d.error(E||a);if(j.call(D)==="[object Array]")if(M)if(h&&h.nodeType===1)for(a=0;D[a]!=null;a++){if(D[a]&&(D[a]===true||D[a].nodeType===1&&d.contains(h,D[a])))n.push(y[a])}else for(a=0;D[a]!=null;a++)D[a]&&D[a].nodeType===1&&n.push(y[a]);else n.push.apply(n,D);else f(D,n);if(B){d(B,t,n,p);d.uniqueSort(n)}return n};
+d.uniqueSort=function(a){if(c){b=g;a.sort(c);if(b)for(var h=1;h<a.length;h++)a[h]===a[h-1]&&a.splice(h--,1)}return a};d.matches=function(a,h){return d(a,null,null,h)};d.find=function(a,h,n){var p;if(!a)return[];for(var t=0,s=l.order.length;t<s;t++){var x=l.order[t],y;if(y=l.leftMatch[x].exec(a)){var D=y[1];y.splice(1,1);if(D.substr(D.length-1)!=="\\"){y[1]=(y[1]||"").replace(/\\/g,"");p=l.find[x](y,h,n);if(p!=null){a=a.replace(l.match[x],"");break}}}}p||(p=h.getElementsByTagName("*"));return{set:p,
+expr:a}};d.filter=function(a,h,n,p){for(var t=a,s=[],x=h,y,D,B=h&&h[0]&&d.isXML(h[0]);a&&h.length;){for(var M in l.filter)if((y=l.leftMatch[M].exec(a))!=null&&y[2]){var X=l.filter[M],C,E;E=y[1];D=false;y.splice(1,1);if(E.substr(E.length-1)!=="\\"){if(x===s)s=[];if(l.preFilter[M])if(y=l.preFilter[M](y,x,n,s,p,B)){if(y===true)continue}else D=C=true;if(y)for(var A=0;(E=x[A])!=null;A++)if(E){C=X(E,y,A,x);var K=p^!!C;if(n&&C!=null)if(K)D=true;else x[A]=false;else if(K){s.push(E);D=true}}if(C!==undefined){n||
+(x=s);a=a.replace(l.match[M],"");if(!D)return[];break}}}if(a===t)if(D==null)d.error(a);else break;t=a}return x};d.error=function(a){throw"Syntax error, unrecognized expression: "+a;};var l=d.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\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")}},relative:{"+":function(a,h){var n=typeof h==="string",p=n&&!/\W/.test(h);n=n&&!p;if(p)h=h.toLowerCase();p=0;for(var t=a.length,s;p<t;p++)if(s=a[p]){for(;(s=s.previousSibling)&&s.nodeType!==1;);a[p]=n||s&&s.nodeName.toLowerCase()===
+h?s||false:s===h}n&&d.filter(h,a,true)},">":function(a,h){var n=typeof h==="string",p,t=0,s=a.length;if(n&&!/\W/.test(h))for(h=h.toLowerCase();t<s;t++){if(p=a[t]){n=p.parentNode;a[t]=n.nodeName.toLowerCase()===h?n:false}}else{for(;t<s;t++)if(p=a[t])a[t]=n?p.parentNode:p.parentNode===h;n&&d.filter(h,a,true)}},"":function(a,h,n){var p=k++,t=o,s;if(typeof h==="string"&&!/\W/.test(h)){s=h=h.toLowerCase();t=m}t("parentNode",h,p,a,s,n)},"~":function(a,h,n){var p=k++,t=o,s;if(typeof h==="string"&&!/\W/.test(h)){s=
+h=h.toLowerCase();t=m}t("previousSibling",h,p,a,s,n)}},find:{ID:function(a,h,n){if(typeof h.getElementById!=="undefined"&&!n)return(a=h.getElementById(a[1]))?[a]:[]},NAME:function(a,h){if(typeof h.getElementsByName!=="undefined"){for(var n=[],p=h.getElementsByName(a[1]),t=0,s=p.length;t<s;t++)p[t].getAttribute("name")===a[1]&&n.push(p[t]);return n.length===0?null:n}},TAG:function(a,h){return h.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,h,n,p,t,s){a=" "+a[1].replace(/\\/g,"")+" ";if(s)return a;
+s=0;for(var x;(x=h[s])!=null;s++)if(x)if(t^(x.className&&(" "+x.className+" ").replace(/[\t\n]/g," ").indexOf(a)>=0))n||p.push(x);else if(n)h[s]=false;return false},ID:function(a){return a[1].replace(/\\/g,"")},TAG:function(a){return a[1].toLowerCase()},CHILD:function(a){if(a[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=h[1]+(h[2]||1)-0;a[3]=h[3]-0}a[0]=k++;return a},ATTR:function(a,h,n,p,t,s){h=a[1].replace(/\\/g,
+"");if(!s&&l.attrMap[h])a[1]=l.attrMap[h];if(a[2]==="~=")a[4]=" "+a[4]+" ";return a},PSEUDO:function(a,h,n,p,t){if(a[1]==="not")if((q.exec(a[3])||"").length>1||/^\w/.test(a[3]))a[3]=d(a[3],null,null,h);else{a=d.filter(a[3],h,n,true^t);n||p.push.apply(p,a);return false}else if(l.match.POS.test(a[0])||l.match.CHILD.test(a[0]))return true;return a},POS:function(a){a.unshift(true);return a}},filters:{enabled:function(a){return a.disabled===false&&a.type!=="hidden"},disabled:function(a){return a.disabled===
+true},checked:function(a){return a.checked===true},selected:function(a){return a.selected===true},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,h,n){return!!d(n[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){return"text"===a.type},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===
+a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,h){return h===0},last:function(a,h,n,p){return h===p.length-1},even:function(a,h){return h%2===0},odd:function(a,h){return h%2===1},lt:function(a,h,n){return h<n[3]-0},gt:function(a,h,n){return h>n[3]-0},nth:function(a,h,n){return n[3]-
+0===h},eq:function(a,h,n){return n[3]-0===h}},filter:{PSEUDO:function(a,h,n,p){var t=h[1],s=l.filters[t];if(s)return s(a,n,h,p);else if(t==="contains")return(a.textContent||a.innerText||d.getText([a])||"").indexOf(h[3])>=0;else if(t==="not"){h=h[3];n=0;for(p=h.length;n<p;n++)if(h[n]===a)return false;return true}else d.error("Syntax error, unrecognized expression: "+t)},CHILD:function(a,h){var n=h[1],p=a;switch(n){case "only":case "first":for(;p=p.previousSibling;)if(p.nodeType===1)return false;if(n===
+"first")return true;p=a;case "last":for(;p=p.nextSibling;)if(p.nodeType===1)return false;return true;case "nth":n=h[2];var t=h[3];if(n===1&&t===0)return true;var s=h[0],x=a.parentNode;if(x&&(x.sizcache!==s||!a.nodeIndex)){var y=0;for(p=x.firstChild;p;p=p.nextSibling)if(p.nodeType===1)p.nodeIndex=++y;x.sizcache=s}p=a.nodeIndex-t;return n===0?p===0:p%n===0&&p/n>=0}},ID:function(a,h){return a.nodeType===1&&a.getAttribute("id")===h},TAG:function(a,h){return h==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===
+h},CLASS:function(a,h){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(a,h){var n=h[1];n=l.attrHandle[n]?l.attrHandle[n](a):a[n]!=null?a[n]:a.getAttribute(n);var p=n+"",t=h[2],s=h[4];return n==null?t==="!=":t==="="?p===s:t==="*="?p.indexOf(s)>=0:t==="~="?(" "+p+" ").indexOf(s)>=0:!s?p&&n!==false:t==="!="?p!==s:t==="^="?p.indexOf(s)===0:t==="$="?p.substr(p.length-s.length)===s:t==="|="?p===s||p.substr(0,s.length+1)===s+"-":false},POS:function(a,h,n,p){var t=l.setFilters[h[2]];
+if(t)return t(a,n,h,p)}}},r=l.match.POS,u=function(a,h){return"\\"+(h-0+1)},v;for(v in l.match){l.match[v]=RegExp(l.match[v].source+/(?![^\[]*\])(?![^\(]*\))/.source);l.leftMatch[v]=RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[v].source.replace(/\\(\d+)/g,u))}var f=function(a,h){a=Array.prototype.slice.call(a,0);if(h){h.push.apply(h,a);return h}return a};try{Array.prototype.slice.call(document.documentElement.childNodes,0)}catch(e){f=function(a,h){var n=h||[],p=0;if(j.call(a)==="[object Array]")Array.prototype.push.apply(n,
+a);else if(typeof a.length==="number")for(var t=a.length;p<t;p++)n.push(a[p]);else for(;a[p];p++)n.push(a[p]);return n}}var c;if(document.documentElement.compareDocumentPosition)c=function(a,h){if(!a.compareDocumentPosition||!h.compareDocumentPosition){if(a==h)b=true;return a.compareDocumentPosition?-1:1}var n=a.compareDocumentPosition(h)&4?-1:a===h?0:1;if(n===0)b=true;return n};else if("sourceIndex"in document.documentElement)c=function(a,h){if(!a.sourceIndex||!h.sourceIndex){if(a==h)b=true;return a.sourceIndex?
+-1:1}var n=a.sourceIndex-h.sourceIndex;if(n===0)b=true;return n};else if(document.createRange)c=function(a,h){if(!a.ownerDocument||!h.ownerDocument){if(a==h)b=true;return a.ownerDocument?-1:1}var n=a.ownerDocument.createRange(),p=h.ownerDocument.createRange();n.setStart(a,0);n.setEnd(a,0);p.setStart(h,0);p.setEnd(h,0);n=n.compareBoundaryPoints(Range.START_TO_END,p);if(n===0)b=true;return n};d.getText=function(a){for(var h="",n,p=0;a[p];p++){n=a[p];if(n.nodeType===3||n.nodeType===4)h+=n.nodeValue;
+else if(n.nodeType!==8)h+=d.getText(n.childNodes)}return h};(function(){var a=document.createElement("div"),h="script"+(new Date).getTime();a.innerHTML="<a name='"+h+"'/>";var n=document.documentElement;n.insertBefore(a,n.firstChild);if(document.getElementById(h)){l.find.ID=function(p,t,s){if(typeof t.getElementById!=="undefined"&&!s)return(t=t.getElementById(p[1]))?t.id===p[1]||typeof t.getAttributeNode!=="undefined"&&t.getAttributeNode("id").nodeValue===p[1]?[t]:undefined:[]};l.filter.ID=function(p,
+t){var s=typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id");return p.nodeType===1&&s&&s.nodeValue===t}}n.removeChild(a);n=a=null})();(function(){var a=document.createElement("div");a.appendChild(document.createComment(""));if(a.getElementsByTagName("*").length>0)l.find.TAG=function(h,n){var p=n.getElementsByTagName(h[1]);if(h[1]==="*"){for(var t=[],s=0;p[s];s++)p[s].nodeType===1&&t.push(p[s]);p=t}return p};a.innerHTML="<a href='#'></a>";if(a.firstChild&&typeof a.firstChild.getAttribute!==
+"undefined"&&a.firstChild.getAttribute("href")!=="#")l.attrHandle.href=function(h){return h.getAttribute("href",2)};a=null})();document.querySelectorAll&&function(){var a=d,h=document.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){d=function(p,t,s,x){t=t||document;if(!x&&t.nodeType===9&&!d.isXML(t))try{return f(t.querySelectorAll(p),s)}catch(y){}return a(p,t,s,x)};for(var n in a)d[n]=a[n];h=null}}();(function(){var a=document.createElement("div");
+a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!a.getElementsByClassName||a.getElementsByClassName("e").length===0)){a.lastChild.className="e";if(a.getElementsByClassName("e").length!==1){l.order.splice(1,0,"CLASS");l.find.CLASS=function(h,n,p){if(typeof n.getElementsByClassName!=="undefined"&&!p)return n.getElementsByClassName(h[1])};a=null}}})();d.contains=document.compareDocumentPosition?function(a,h){return!!(a.compareDocumentPosition(h)&16)}:function(a,h){return a!==h&&
+(a.contains?a.contains(h):true)};d.isXML=function(a){return(a=(a?a.ownerDocument||a:0).documentElement)?a.nodeName!=="HTML":false};var i=function(a,h){for(var n=[],p="",t,s=h.nodeType?[h]:h;t=l.match.PSEUDO.exec(a);){p+=t[0];a=a.replace(l.match.PSEUDO,"")}a=l.relative[a]?a+"*":a;t=0;for(var x=s.length;t<x;t++)d(a,s[t],n);return d.filter(p,n)};window.tinymce.dom.Sizzle=d})();
+(function(m){var o=m.each,q=m.DOM,k=m.isIE,j;m.create("tinymce.dom.EventUtils",{EventUtils:function(){this.inits=[];this.events=[]},add:function(b,g,d,l){var r,u=this,v=u.events,f;if(g instanceof Array){f=[];o(g,function(e){f.push(u.add(b,e,d,l))});return f}if(b&&b.hasOwnProperty&&b instanceof Array){f=[];o(b,function(e){e=q.get(e);f.push(u.add(e,g,d,l))});return f}if(b=q.get(b)){r=function(e){if(!u.disabled){if((e=e||window.event)&&k){if(!e.target)e.target=e.srcElement;m.extend(e,u._stoppers)}if(!l)return d(e);
+return d.call(l,e)}};if(g=="unload"){m.unloads.unshift({func:r});return r}if(g=="init"){u.domLoaded?r():u.inits.push(r);return r}v.push({obj:b,name:g,func:d,cfunc:r,scope:l});u._add(b,g,r);return d}},remove:function(b,g,d){var l=this,r=l.events,u=false,v;if(b&&b.hasOwnProperty&&b instanceof Array){v=[];o(b,function(f){f=q.get(f);v.push(l.remove(f,g,d))});return v}b=q.get(b);o(r,function(f,e){if(f.obj==b&&f.name==g&&(!d||f.func==d||f.cfunc==d)){r.splice(e,1);l._remove(b,g,f.cfunc);u=true;return false}});
+return u},clear:function(b){var g=this.events,d,l;if(b){b=q.get(b);for(d=g.length-1;d>=0;d--){l=g[d];if(l.obj===b){this._remove(l.obj,l.name,l.cfunc);l.obj=l.cfunc=null;g.splice(d,1)}}}},cancel:function(b){if(!b)return false;this.stop(b);return this.prevent(b)},stop:function(b){if(b.stopPropagation)b.stopPropagation();else b.cancelBubble=true;return false},prevent:function(b){if(b.preventDefault)b.preventDefault();else b.returnValue=false;return false},destroy:function(){var b=this;o(b.events,function(g){b._remove(g.obj,
+g.name,g.cfunc);g.obj=g.cfunc=null});b.events=[];b=null},_add:function(b,g,d){if(b.attachEvent)b.attachEvent("on"+g,d);else if(b.addEventListener)b.addEventListener(g,d,false);else b["on"+g]=d},_remove:function(b,g,d){if(b)try{if(b.detachEvent)b.detachEvent("on"+g,d);else if(b.removeEventListener)b.removeEventListener(g,d,false);else b["on"+g]=null}catch(l){}},_pageInit:function(){if(!this.domLoaded){this.domLoaded=true;o(this.inits,function(b){b()});this.inits=[]}},_wait:function(b){var g=this,d=
+b.document;if(b.tinyMCE_GZ&&tinyMCE_GZ.loaded)g.domLoaded=1;else{if(d.attachEvent){d.attachEvent("onreadystatechange",function(){if(d.readyState==="complete"){d.detachEvent("onreadystatechange",arguments.callee);g._pageInit(b)}});d.documentElement.doScroll&&b==b.top&&function(){if(!g.domLoaded){try{d.documentElement.doScroll("left")}catch(l){setTimeout(arguments.callee,0);return}g._pageInit(b)}}()}else d.addEventListener&&g._add(b,"DOMContentLoaded",function(){g._pageInit(b)});g._add(b,"load",function(){g._pageInit(b)})}},
+_stoppers:{preventDefault:function(){this.returnValue=false},stopPropagation:function(){this.cancelBubble=true}}});j=m.dom.Event=new m.dom.EventUtils;j._wait(window);m.addUnload(function(){j.destroy()})})(tinymce);
+(function(m){m.dom.Element=function(o,q){var k=this,j;k.settings=q=q||{};k.id=o;k.dom=j=q.dom||m.DOM;m.isIE||j.get(k.id);m.each("getPos,getRect,getParent,add,setStyle,getStyle,setStyles,setAttrib,setAttribs,getAttrib,addClass,removeClass,hasClass,getOuterHTML,setOuterHTML,remove,show,hide,isHidden,setHTML,get".split(/,/),function(b){k[b]=function(){var g=[o],d;for(d=0;d<arguments.length;d++)g.push(arguments[d]);g=j[b].apply(j,g);k.update(b);return g}});m.extend(k,{on:function(b,g,d){return m.dom.Event.add(k.id,
+b,g,d)},getXY:function(){return{x:parseInt(k.getStyle("left")),y:parseInt(k.getStyle("top"))}},getSize:function(){var b=j.get(k.id);return{w:parseInt(k.getStyle("width")||b.clientWidth),h:parseInt(k.getStyle("height")||b.clientHeight)}},moveTo:function(b,g){k.setStyles({left:b,top:g})},moveBy:function(b,g){var d=k.getXY();k.moveTo(d.x+b,d.y+g)},resizeTo:function(b,g){k.setStyles({width:b,height:g})},resizeBy:function(b,g){var d=k.getSize();k.resizeTo(d.w+b,d.h+g)},update:function(b){if(m.isIE6&&q.blocker){b=
+b||"";if(!(b.indexOf("get")===0||b.indexOf("has")===0||b.indexOf("is")===0))if(b=="remove")j.remove(k.blocker);else{if(k.blocker)b=j.get(k.blocker);else{k.blocker=j.uniqueId();b=j.add(q.container||j.getRoot(),"iframe",{id:k.blocker,style:"position:absolute;",frameBorder:0,src:'javascript:""'});j.setStyle(b,"opacity",0)}j.setStyles(b,{left:k.getStyle("left",1),top:k.getStyle("top",1),width:k.getStyle("width",1),height:k.getStyle("height",1),display:k.getStyle("display",1),zIndex:parseInt(k.getStyle("zIndex",
+1)||0)-1})}}}})}})(tinymce);
+(function(m){var o=m.is,q=m.isIE,k=m.each;m.create("tinymce.dom.Selection",{Selection:function(j,b,g){var d=this;d.dom=j;d.win=b;d.serializer=g;k(["onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent"],function(l){d[l]=new m.util.Dispatcher(d)});if(!d.win.getSelection)d.tridentSel=new m.dom.TridentSelection(d);m.addUnload(d.destroy,d)},getContent:function(j){var b=this.getRng(),g=this.dom.create("body"),d=this.getSel(),l,r;j=j||{};l=r="";j.get=true;j.format=j.format||"html";this.onBeforeGetContent.dispatch(this,
+j);if(j.format=="text")return this.isCollapsed()?"":b.text||(d.toString?d.toString():"");if(b.cloneContents)(b=b.cloneContents())&&g.appendChild(b);else g.innerHTML=o(b.item)||o(b.htmlText)?b.item?b.item(0).outerHTML:b.htmlText:b.toString();if(/^\s/.test(g.innerHTML))l=" ";if(/\s+$/.test(g.innerHTML))r=" ";j.getInner=true;j.content=this.isCollapsed()?"":l+this.serializer.serialize(g,j)+r;this.onGetContent.dispatch(this,j);return j.content},setContent:function(j,b){var g=this.getRng(),d,l=this.win.document;
+b=b||{format:"html"};b.set=true;b.content=this.dom.processHTML(j);this.onBeforeSetContent.dispatch(this,b);j=b.content;if(g.insertNode){j+='<span id="__caret">_</span>';if(g.startContainer==l&&g.endContainer==l)l.body.innerHTML=j;else{g.deleteContents();if(l.body.childNodes.length==0)l.body.innerHTML=j;else g.insertNode(g.createContextualFragment(j))}d=this.dom.get("__caret");g=l.createRange();g.setStartBefore(d);g.setEndBefore(d);this.setRng(g);this.dom.remove("__caret")}else{if(g.item){l.execCommand("Delete",
+false,null);g=this.getRng()}g.pasteHTML(j)}this.onSetContent.dispatch(this,b)},getStart:function(){var j=this.getRng(),b,g;if(j.duplicate||j.item){if(j.item)return j.item(0);b=j.duplicate();b.collapse(1);b=b.parentElement();for(j=g=j.parentElement();g=g.parentNode;)if(g==b){b=j;break}if(b&&b.nodeName=="BODY")return b.firstChild||b}else{b=j.startContainer;if(b.nodeType==1&&b.hasChildNodes())b=b.childNodes[Math.min(b.childNodes.length-1,j.startOffset)];if(b&&b.nodeType==3)return b.parentNode}return b},
+getEnd:function(){var j=this.getRng(),b;if(j.duplicate||j.item){if(j.item)return j.item(0);j=j.duplicate();j.collapse(0);if((b=j.parentElement())&&b.nodeName=="BODY")return b.lastChild||b}else{b=j.endContainer;j=j.endOffset;if(b.nodeType==1&&b.hasChildNodes())b=b.childNodes[j>0?j-1:j];if(b&&b.nodeType==3)return b.parentNode}return b},getBookmark:function(j,b){function g(c,i){var a=0;k(l.select(c),function(h,n){if(h==i)a=n});return a}var d=this,l=d.dom,r,u,v,f,e;if(j==2)return function(){function c(n,
+p){var t=n[p?"startContainer":"endContainer"],s=n[p?"startOffset":"endOffset"],x=[],y,D=0;if(t.nodeType==3){if(b)for(y=t.previousSibling;y&&y.nodeType==3;y=y.previousSibling)s+=y.nodeValue.length;x.push(s)}else{y=t.childNodes;if(s>=y.length&&y.length){D=1;s=Math.max(0,y.length-1)}x.push(d.dom.nodeIndex(y[s],b)+D)}for(;t&&t!=a;t=t.parentNode)x.push(d.dom.nodeIndex(t,b));return x}var i=d.getRng(true),a=l.getRoot(),h={};h.start=c(i,true);if(!d.isCollapsed())h.end=c(i);return h}();if(j)return{rng:d.getRng()};
+r=d.getRng();v=l.uniqueId();f=tinyMCE.activeEditor.selection.isCollapsed();if(r.duplicate||r.item)if(r.item){e=r.item(0);u=e.nodeName;return{name:u,index:g(u,e)}}else{u=r.duplicate();r.collapse();r.pasteHTML('<span _mce_type="bookmark" id="'+v+'_start" style="overflow:hidden;line-height:0px">\ufeff</span>');if(!f){u.collapse(false);u.pasteHTML('<span _mce_type="bookmark" id="'+v+'_end" style="overflow:hidden;line-height:0px">\ufeff</span>')}}else{e=d.getNode();u=e.nodeName;if(u=="IMG")return{name:u,
+index:g(u,e)};u=r.cloneRange();if(!f){u.collapse(false);u.insertNode(l.create("span",{_mce_type:"bookmark",id:v+"_end",style:"overflow:hidden;line-height:0px"},"\ufeff"))}r.collapse(true);r.insertNode(l.create("span",{_mce_type:"bookmark",id:v+"_start",style:"overflow:hidden;line-height:0px"},"\ufeff"))}d.moveToBookmark({id:v,keep:1});return{id:v}},moveToBookmark:function(j){var b=this.dom,g,d,l,r,u,v;this.tridentSel&&this.tridentSel.destroy();if(j)if(j.start){g=b.createRng();d=b.getRoot();var f=
+function(c){var i=j[c?"start":"end"],a,h,n;if(i){h=d;for(a=i.length-1;a>=1;a--){n=h.childNodes;if(n.length)h=n[i[a]]}c?g.setStart(h,i[0]):g.setEnd(h,i[0])}};f(true);f();this.setRng(g)}else if(j.id){f=function(c){var i=b.get(j.id+"_"+c),a,h,n;n=j.keep;if(i){a=i.parentNode;if(c=="start"){if(n){a=i.firstChild;h=1}else h=b.nodeIndex(i);l=r=a;u=v=h}else{if(n){a=i.firstChild;h=1}else h=b.nodeIndex(i);r=a;v=h}if(!n){n=i.previousSibling;a=i.nextSibling;for(k(m.grep(i.childNodes),function(p){if(p.nodeType==
+3)p.nodeValue=p.nodeValue.replace(/\uFEFF/g,"")});i=b.get(j.id+"_"+c);)b.remove(i,1);if(n&&a&&n.nodeType==a.nodeType&&n.nodeType==3){h=n.nodeValue.length;n.appendData(a.nodeValue);b.remove(a);if(c=="start"){l=r=n;u=v=h}else{r=n;v=h}}}}};var e=function(c){if(!q&&b.isBlock(c)&&!c.innerHTML)c.innerHTML='<br _mce_bogus="1" />';return c};f("start");f("end");g=b.createRng();g.setStart(e(l),u);g.setEnd(e(r),v);this.setRng(g)}else if(j.name)this.select(b.select(j.name)[j.index]);else j.rng&&this.setRng(j.rng)},
+select:function(j,b){var g=this.dom,d=g.createRng();g=g.nodeIndex(j);d.setStart(j.parentNode,g);d.setEnd(j.parentNode,g+1);if(b){g=function(l,r){var u=new m.dom.TreeWalker(l,l);do{if(l.nodeType==3&&m.trim(l.nodeValue).length!=0){r?d.setStart(l,0):d.setEnd(l,l.nodeValue.length);break}if(l.nodeName=="BR"){r?d.setStartBefore(l):d.setEndBefore(l);break}}while(l=r?u.next():u.prev())};g(j,1);g(j)}this.setRng(d);return j},isCollapsed:function(){var j=this.getRng(),b=this.getSel();if(!j||j.item)return false;
+if(j.compareEndPoints)return j.compareEndPoints("StartToEnd",j)===0;return!b||j.collapsed},collapse:function(j){var b=this.getRng(),g;if(b.item){g=b.item(0);b=this.win.document.body.createTextRange();b.moveToElementText(g)}b.collapse(!!j);this.setRng(b)},getSel:function(){var j=this.win;return j.getSelection?j.getSelection():j.document.selection},getRng:function(j){var b,g;if(j&&this.tridentSel)return this.tridentSel.getRangeAt(0);try{if(b=this.getSel())g=b.rangeCount>0?b.getRangeAt(0):b.createRange?
+b.createRange():this.win.document.createRange()}catch(d){}g||(g=this.win.document.createRange?this.win.document.createRange():this.win.document.body.createTextRange());if(this.selectedRange&&this.explicitRange)if(g.compareBoundaryPoints(g.START_TO_START,this.selectedRange)===0&&g.compareBoundaryPoints(g.END_TO_END,this.selectedRange)===0)g=this.explicitRange;else this.explicitRange=this.selectedRange=null;return g},setRng:function(j){var b;if(this.tridentSel)if(j.cloneRange)this.tridentSel.addRange(j);
+else try{j.select()}catch(g){}else if(b=this.getSel()){this.explicitRange=j;b.removeAllRanges();b.addRange(j);this.selectedRange=b.getRangeAt(0)}},setNode:function(j){this.setContent(this.dom.getOuterHTML(j));return j},getNode:function(){var j=this.getRng(),b=this.getSel(),g;if(j.setStart){if(!j)return this.dom.getRoot();g=j.commonAncestorContainer;if(!j.collapsed){if(j.startContainer==j.endContainer)if(j.startOffset-j.endOffset<2)if(j.startContainer.hasChildNodes())g=j.startContainer.childNodes[j.startOffset];
+if(m.isWebKit&&b.anchorNode&&b.anchorNode.nodeType==1)return b.anchorNode.childNodes[b.anchorOffset]}if(g&&g.nodeType==3)return g.parentNode;return g}return j.item?j.item(0):j.parentElement()},getSelectedBlocks:function(j,b){var g=this.dom,d,l,r,u=[];d=g.getParent(j||this.getStart(),g.isBlock);l=g.getParent(b||this.getEnd(),g.isBlock);d&&u.push(d);if(d&&l&&d!=l)for(r=d;(r=r.nextSibling)&&r!=l;)g.isBlock(r)&&u.push(r);l&&d!=l&&u.push(l);return u},destroy:function(j){this.win=null;this.tridentSel&&
+this.tridentSel.destroy();j||m.removeUnload(this.destroy)}})})(tinymce);
+(function(m){m.create("tinymce.dom.XMLWriter",{node:null,XMLWriter:function(){this.doc=function(){var o=document.implementation;if(!o||!o.createDocument){try{return new ActiveXObject("MSXML2.DOMDocument")}catch(q){}try{return new ActiveXObject("Microsoft.XmlDom")}catch(k){}}else return o.createDocument("","",null)}();this.valid=m.isOpera||m.isWebKit;this.reset()},reset:function(){var o=this.doc;o.firstChild&&o.removeChild(o.firstChild);this.node=o.appendChild(o.createElement("html"))},writeStartElement:function(o){this.node=
+this.node.appendChild(this.doc.createElement(o))},writeAttribute:function(o,q){if(this.valid)q=q.replace(/>/g,"%MCGT%");this.node.setAttribute(o,q)},writeEndElement:function(){this.node=this.node.parentNode},writeFullEndElement:function(){var o=this.node;o.appendChild(this.doc.createTextNode(""));this.node=o.parentNode},writeText:function(o){if(this.valid)o=o.replace(/>/g,"%MCGT%");this.node.appendChild(this.doc.createTextNode(o))},writeCDATA:function(o){this.node.appendChild(this.doc.createCDATASection(o))},
+writeComment:function(o){if(m.isIE)o=o.replace(/^\-|\-$/g," ");this.node.appendChild(this.doc.createComment(o.replace(/\-\-/g," ")))},getContent:function(){var o;o=this.doc.xml||(new XMLSerializer).serializeToString(this.doc);o=o.replace(/<\?[^?]+\?>|<html>|<\/html>|<html\/>|<!DOCTYPE[^>]+>/g,"");o=o.replace(/ ?\/>/g," />");if(this.valid)o=o.replace(/\%MCGT%/g,"&gt;");return o}})})(tinymce);
+(function(m){m.create("tinymce.dom.StringWriter",{str:null,tags:null,count:0,settings:null,indent:null,StringWriter:function(o){this.settings=m.extend({indent_char:" ",indentation:0},o);this.reset()},reset:function(){this.str=this.indent="";this.tags=[];this.count=0},writeStartElement:function(o){this._writeAttributesEnd();this.writeRaw("<"+o);this.tags.push(o);this.inAttr=true;this.count++;this.elementCount=this.count},writeAttribute:function(o,q){this.writeRaw(" "+this.encode(o)+'="'+this.encode(q)+
+'"')},writeEndElement:function(){var o;if(this.tags.length>0){o=this.tags.pop();this._writeAttributesEnd(1)&&this.writeRaw("</"+o+">");this.settings.indentation>0&&this.writeRaw("\n")}},writeFullEndElement:function(){if(this.tags.length>0){this._writeAttributesEnd();this.writeRaw("</"+this.tags.pop()+">");this.settings.indentation>0&&this.writeRaw("\n")}},writeText:function(o){this._writeAttributesEnd();this.writeRaw(this.encode(o));this.count++},writeCDATA:function(o){this._writeAttributesEnd();
+this.writeRaw("<![CDATA["+o+"]]\>");this.count++},writeComment:function(o){this._writeAttributesEnd();this.writeRaw("<!-- "+o+"--\>");this.count++},writeRaw:function(o){this.str+=o},encode:function(o){return o.replace(/[<>&"]/g,function(q){switch(q){case "<":return"&lt;";case ">":return"&gt;";case "&":return"&amp;";case '"':return"&quot;"}return q})},getContent:function(){return this.str},_writeAttributesEnd:function(o){if(this.inAttr){this.inAttr=false;if(o&&this.elementCount==this.count){this.writeRaw(" />");
+return false}this.writeRaw(">");return true}}})})(tinymce);
+(function(m){function o(d){return d.replace(/([?+*])/g,".$1")}var q=m.extend,k=m.each,j=m.util.Dispatcher,b=m.isIE,g=m.isGecko;m.create("tinymce.dom.Serializer",{Serializer:function(d){var l=this;l.key=0;l.onPreProcess=new j(l);l.onPostProcess=new j(l);try{l.writer=new m.dom.XMLWriter}catch(r){l.writer=new m.dom.StringWriter}l.settings=d=q({dom:m.DOM,valid_nodes:0,node_filter:0,attr_filter:0,invalid_attrs:/^(_mce_|_moz_|sizset|sizcache)/,closed:/^(br|hr|input|meta|img|link|param|area)$/,entity_encoding:"named",
+entities:"160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro",
+valid_elements:"*[*]",extended_valid_elements:0,invalid_elements:0,fix_table_elements:1,fix_list_elements:true,fix_content_duplication:true,convert_fonts_to_spans:false,font_size_classes:0,apply_source_formatting:0,indent_mode:"simple",indent_char:"\t",indent_levels:1,remove_linebreaks:1,remove_redundant_brs:1,element_format:"xhtml"},d);l.dom=d.dom;l.schema=d.schema;if(d.entity_encoding=="named"&&!d.entities)d.entity_encoding="raw";d.remove_redundant_brs&&l.onPostProcess.add(function(u,v){v.content=
+v.content.replace(/(<br \/>\s*)+<\/(p|h[1-6]|div|li)>/gi,function(f,e,c){if(/^<br \/>\s*<\//.test(f))return"</"+c+">";return f})});d.element_format=="html"&&l.onPostProcess.add(function(u,v){v.content=v.content.replace(/<([^>]+) \/>/g,"<$1>")});d.fix_list_elements&&l.onPreProcess.add(function(u,v){function f(s,x){for(var y=x.split(","),D;(s=s.previousSibling)!=null;)for(D=0;D<y.length;D++)if(s.nodeName==y[D])return s;return null}var e,c,i=["ol","ul"],a,h,n,p=/^(OL|UL)$/,t;for(c=0;c<i.length;c++){e=
+l.dom.select(i[c],v.node);for(a=0;a<e.length;a++){h=e[a];n=h.parentNode;if(p.test(n.nodeName))if(t=f(h,"LI"))t.appendChild(h);else{t=l.dom.create("li");t.innerHTML="&nbsp;";t.appendChild(h);n.insertBefore(t,n.firstChild)}}}});d.fix_table_elements&&l.onPreProcess.add(function(u,v){if(!m.isOpera||opera.buildNumber()>=1767)k(l.dom.select("p table",v.node).reverse(),function(f){var e=l.dom.getParent(f.parentNode,"table,p");if(e.nodeName!="TABLE")try{l.dom.split(e,f)}catch(c){}})})},setEntities:function(d){var l,
+r={},u;if(!this.entityLookup){d=d.split(",");for(l=0;l<d.length;l+=2){u=d[l];if(!(u==34||u==38||u==60||u==62)){r[String.fromCharCode(d[l])]=d[l+1];parseInt(d[l]).toString(16)}}this.entityLookup=r}},setRules:function(d){this._setup();this.rules={};this.wildRules=[];this.validElements={};return this.addRules(d)},addRules:function(d){var l=this,r;if(d){l._setup();k(d.split(","),function(u){u=u.split(/\[|\]/);var v=u[0].split("/"),f,e,c,i=[];if(r)e=m.extend([],r.attribs);u.length>1&&k(u[1].split("|"),
+function(a){var h={},n;e=e||[];a=a.replace(/::/g,"~");a=/^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(a);a[2]=a[2].replace(/~/g,":");if(a[1]=="!"){f=f||[];f.push(a[2])}if(a[1]=="-")for(n=0;n<e.length;n++)if(e[n].name==a[2]){e.splice(n,1);return}switch(a[3]){case "=":h.defaultVal=a[4]||"";break;case ":":h.forcedVal=a[4];break;case "<":h.validVals=a[4].split("?")}if(/[*.?]/.test(a[2])){c=c||[];h.nameRE=RegExp("^"+o(a[2])+"$");c.push(h)}else{h.name=a[2];e.push(h)}i.push(a[2])});k(v,function(a,h){var n=
+a.charAt(0),p=1,t={};if(r){if(r.noEmpty)t.noEmpty=r.noEmpty;if(r.fullEnd)t.fullEnd=r.fullEnd;if(r.padd)t.padd=r.padd}switch(n){case "-":t.noEmpty=true;break;case "+":t.fullEnd=true;break;case "#":t.padd=true;break;default:p=0}v[h]=a=a.substring(p);l.validElements[a]=1;if(/[*.?]/.test(v[0])){t.nameRE=RegExp("^"+o(v[0])+"$");l.wildRules=l.wildRules||{};l.wildRules.push(t)}else{t.name=v[0];if(v[0]=="@")r=t;l.rules[a]=t}t.attribs=e;if(f)t.requiredAttribs=f;if(c){a="";k(i,function(s){if(a)a+="|";a+="("+
+o(s)+")"});t.validAttribsRE=RegExp("^"+a.toLowerCase()+"$");t.wildAttribs=c}})});d="";k(l.validElements,function(u,v){if(d)d+="|";if(v!="@")d+=v});l.validElementsRE=RegExp("^("+o(d.toLowerCase())+")$")}},findRule:function(d){var l=this.rules,r;this._setup();if(l=l[d])return l;l=this.wildRules;for(r=0;r<l.length;r++)if(l[r].nameRE.test(d))return l[r];return null},findAttribRule:function(d,l){var r,u=d.wildAttribs;for(r=0;r<u.length;r++)if(u[r].nameRE.test(l))return u[r];return null},serialize:function(d,
+l){var r=this,u,v,f,e;r._setup();l=l||{};l.format=l.format||"html";r.processObj=l;if(b){e=[];k(d.getElementsByTagName("option"),function(c){c=r.dom.getAttrib(c,"selected");e.push(c?c:null)})}d=d.cloneNode(true);b&&k(d.getElementsByTagName("option"),function(c,i){r.dom.setAttrib(c,"selected",e[i])});f=d.ownerDocument.implementation;if(f.createHTMLDocument&&m.isOpera&&opera.buildNumber()>=1767){u=f.createHTMLDocument("");k(d.nodeName=="BODY"?d.childNodes:[d],function(c){u.body.appendChild(u.importNode(c,
+true))});d=d.nodeName!="BODY"?u.body.firstChild:u.body;v=r.dom.doc;r.dom.doc=u}r.key=""+(parseInt(r.key)+1);if(!l.no_events){l.node=d;r.onPreProcess.dispatch(r,l)}r.writer.reset();r._info=l;r._serializeNode(d,l.getInner);l.content=r.writer.getContent();if(v)r.dom.doc=v;l.no_events||r.onPostProcess.dispatch(r,l);r._postProcess(l);l.node=null;return m.trim(l.content)},_postProcess:function(d){var l=this,r=l.settings,u=d.content,v;if(d.format=="html"){v=l._protect({content:u,patterns:[{pattern:/(<script[^>]*>)(.*?)(<\/script>)/g},
+{pattern:/(<noscript[^>]*>)(.*?)(<\/noscript>)/g},{pattern:/(<style[^>]*>)(.*?)(<\/style>)/g},{pattern:/(<pre[^>]*>)(.*?)(<\/pre>)/g,encode:1},{pattern:/(<!--\[CDATA\[)(.*?)(\]\]--\>)/g}]});u=v.content;if(r.entity_encoding!=="raw")u=l._encode(u);if(!d.set){u=u.replace(/<p>\s+<\/p>|<p([^>]+)>\s+<\/p>/g,r.entity_encoding=="numeric"?"<p$1>&#160;</p>":"<p$1>&nbsp;</p>");if(r.remove_linebreaks){u=u.replace(/\r?\n|\r/g," ");u=u.replace(/(<[^>]+>)\s+/g,"$1 ");u=u.replace(/\s+(<\/[^>]+>)/g," $1");u=u.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g,
+"<$1 $2>");u=u.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g,"<$1>");u=u.replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g,"</$1>")}if(r.apply_source_formatting&&r.indent_mode=="simple"){u=u.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g,"\n<$1$2$3>\n");u=u.replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g,
+"\n<$1$2>");u=u.replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g,"</$1>\n");u=u.replace(/\n\n/g,"\n")}}u=l._unprotect(u,v);u=u.replace(/<!--\[CDATA\[([\s\S]+)\]\]--\>/g,"<![CDATA[$1]]\>");if(r.entity_encoding=="raw")u=u.replace(/<p>&nbsp;<\/p>|<p([^>]+)>&nbsp;<\/p>/g,"<p$1>\u00a0</p>");u=u.replace(/<noscript([^>]+|)>([\s\S]*?)<\/noscript>/g,function(f,e,c){return"<noscript"+e+">"+l.dom.decode(c.replace(/<!--|--\>/g,""))+"</noscript>"})}d.content=u},_serializeNode:function(d,
+l){var r=this.settings,u=this.writer,v,f,e,c,i,a,h,n,p,t,s,x,y;if(!r.node_filter||r.node_filter(d))switch(d.nodeType){case 1:if(d.hasAttribute?d.hasAttribute("_mce_bogus"):d.getAttribute("_mce_bogus"))return;t=x=false;v=d.hasChildNodes();n=d.getAttribute("_mce_name")||d.nodeName.toLowerCase();if(y=d.getAttribute("_mce_type"))if(this._info.cleanup)x=1;else return;if(b)if(d.scopeName!=="HTML"&&d.scopeName!=="html")n=d.scopeName+":"+n;if(n.indexOf("mce:")===0)n=n.substring(4);if(!x)if(!this.validElementsRE||
+!this.validElementsRE.test(n)||this.invalidElementsRE&&this.invalidElementsRE.test(n)||l){t=true;break}if(b){if(r.fix_content_duplication){if(d._mce_serialized==this.key)return;d._mce_serialized=this.key}if(n.charAt(0)=="/")n=n.substring(1)}else if(g)if(d.nodeName==="BR"&&d.getAttribute("type")=="_moz")return;if(r.validate_children){if(this.elementName&&!this.schema.isValid(this.elementName,n)){t=true;break}this.elementName=n}p=this.findRule(n);if(!p){t=true;break}n=p.name||n;s=r.closed.test(n);if(!v&&
+p.noEmpty||b&&!n){t=true;break}if(p.requiredAttribs){i=p.requiredAttribs;for(e=i.length-1;e>=0;e--)if(this.dom.getAttrib(d,i[e])!=="")break;if(e==-1){t=true;break}}u.writeStartElement(n);if(p.attribs){e=0;a=p.attribs;for(c=a.length;e<c;e++){i=a[e];h=this._getAttrib(d,i);h!==null&&u.writeAttribute(i.name,h)}}if(p.validAttribsRE){a=this.dom.getAttribs(d);for(e=a.length-1;e>-1;e--){i=a[e];if(i.specified){i=i.nodeName.toLowerCase();if(!(r.invalid_attrs.test(i)||!p.validAttribsRE.test(i))){c=this.findAttribRule(p,
+i);h=this._getAttrib(d,c,i);h!==null&&u.writeAttribute(i,h)}}}}y&&x&&u.writeAttribute("_mce_type",y);if(n==="script"&&m.trim(d.innerHTML)){u.writeText("// ");u.writeCDATA(d.innerHTML.replace(/<!--|--\>|<\[CDATA\[|\]\]>/g,""));v=false;break}if(p.padd)if(v&&(f=d.firstChild)&&f.nodeType===1&&d.childNodes.length===1){if(f.hasAttribute?f.hasAttribute("_mce_bogus"):f.getAttribute("_mce_bogus"))u.writeText("\u00a0")}else v||u.writeText("\u00a0");break;case 3:if(r.validate_children&&this.elementName&&!this.schema.isValid(this.elementName,
+"#text"))return;return u.writeText(d.nodeValue);case 4:return u.writeCDATA(d.nodeValue);case 8:return u.writeComment(d.nodeValue)}else if(d.nodeType==1)v=d.hasChildNodes();if(v&&!s)for(f=d.firstChild;f;){this._serializeNode(f);this.elementName=n;f=f.nextSibling}t||(s?u.writeEndElement():u.writeFullEndElement())},_protect:function(d){function l(v){return v.replace(/[\r\n\\]/g,function(f){if(f==="\n")return"\\n";else if(f==="\\")return"\\\\";return"\\r"})}function r(v){return v.replace(/\\[\\rn]/g,
+function(f){if(f==="\\n")return"\n";else if(f==="\\\\")return"\\";return"\r"})}var u=this;d.items=d.items||[];k(d.patterns,function(v){d.content=r(l(d.content).replace(v.pattern,function(f,e,c,i){c=r(c);if(v.encode)c=u._encode(c);d.items.push(c);return e+"<!--mce:"+(d.items.length-1)+"--\>"+i}))});return d},_unprotect:function(d,l){d=d.replace(/\<!--mce:([0-9]+)--\>/g,function(r,u){return l.items[parseInt(u)]});l.items=[];return d},_encode:function(d){var l=this.settings,r;if(l.entity_encoding!==
+"raw"){if(l.entity_encoding.indexOf("named")!=-1){this.setEntities(l.entities);r=this.entityLookup;d=d.replace(/[\u007E-\uFFFF]/g,function(u){var v;if(v=r[u])u="&"+v+";";return u})}if(l.entity_encoding.indexOf("numeric")!=-1)d=d.replace(/[\u007E-\uFFFF]/g,function(u){return"&#"+u.charCodeAt(0)+";"})}return d},_setup:function(){var d=this.settings;if(!this.done){this.done=1;this.setRules(d.valid_elements);this.addRules(d.extended_valid_elements);if(d.invalid_elements)this.invalidElementsRE=RegExp("^("+
+o(d.invalid_elements.replace(/,/g,"|").toLowerCase())+")$");if(d.attrib_value_filter)this.attribValueFilter=d.attribValueFilter}},_getAttrib:function(d,l,r){var u;r=r||l.name;if(l.forcedVal&&(u=l.forcedVal)){if(u==="{$uid}")return this.dom.uniqueId();return u}u=this.dom.getAttrib(d,r);switch(r){case "rowspan":case "colspan":if(u=="1")u=""}if(this.attribValueFilter)u=this.attribValueFilter(r,u,d);if(l.validVals){for(d=l.validVals.length-1;d>=0;d--)if(u==l.validVals[d])break;if(d==-1)return null}if(u===
+""&&typeof l.defaultVal!="undefined"){u=l.defaultVal;if(u==="{$uid}")return this.dom.uniqueId();return u}else if(r=="class"&&this.processObj.get)u=u.replace(/\s?mceItem\w+\s?/g,"");if(u==="")return null;return u}})})(tinymce);
+(function(m){m.dom.ScriptLoader=function(){function o(d,l){function r(){u.remove(c);if(v)v.onreadystatechange=v.onload=v=null;l()}var u=m.DOM,v,f,e,c;c=u.uniqueId();if(m.isIE6){f=new m.util.URI(d);e=location;if(f.host==e.hostname&&f.port==e.port&&f.protocol+":"==e.protocol){m.util.XHR.send({url:m._addVer(f.getURI()),success:function(i){var a=u.create("script",{type:"text/javascript"});a.text=i;document.getElementsByTagName("head")[0].appendChild(a);u.remove(a);r()}});return}}v=u.create("script",{id:c,
+type:"text/javascript",src:m._addVer(d)});v.onload=r;v.onreadystatechange=function(){var i=v.readyState;if(i=="complete"||i=="loaded")r()};(document.getElementsByTagName("head")[0]||document.body).appendChild(v)}var q={},k=[],j={},b=[],g=0;this.isDone=function(d){return q[d]==2};this.markDone=function(d){q[d]=2};this.add=this.load=function(d,l,r){if(q[d]==void 0){k.push(d);q[d]=0}if(l){j[d]||(j[d]=[]);j[d].push({func:l,scope:r||this})}};this.loadQueue=function(d,l){this.loadScripts(k,d,l)};this.loadScripts=
+function(d,l,r){function u(f){m.each(j[f],function(e){e.func.call(e.scope)});j[f]=void 0}var v;b.push({func:l,scope:r||this});v=function(){var f=m.grep(d);d.length=0;m.each(f,function(e){if(q[e]==2)u(e);else if(q[e]!=1){q[e]=1;g++;o(e,function(){q[e]=2;g--;u(e);v()})}});if(!g){m.each(b,function(e){e.func.call(e.scope)});b.length=0}};v()}};m.ScriptLoader=new m.dom.ScriptLoader})(tinymce);
+tinymce.dom.TreeWalker=function(m,o){function q(j,b,g,d){if(j){if(!d&&j[b])return j[b];if(j!=o){if(b=j[g])return b;for(j=j.parentNode;j&&j!=o;j=j.parentNode)if(b=j[g])return b}}}var k=m;this.current=function(){return k};this.next=function(j){return k=q(k,"firstChild","nextSibling",j)};this.prev=function(j){return k=q(k,"lastChild","lastSibling",j)}};
+(function(){var m={};(function(o,q){function k(b){return b.replace(/[A-Z]+/g,function(g){return k(o[g])})}for(var j in o)if(o.hasOwnProperty(j))o[j]=k(o[j]);k(q).replace(/#/g,"#text").replace(/(\w+)\[([^\]]+)\]/g,function(b,g,d){var l={};d=d.split(/\|/);for(b=d.length-1;b>=0;b--)l[d[b]]=1;m[g]=l})})({Z:"#|H|K|N|O|P",Y:"#|X|form|R|Q",X:"p|T|div|U|W|isindex|fieldset|table",W:"pre|hr|blockquote|address|center|noframes",U:"ul|ol|dl|menu|dir",ZC:"#|p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q",
+T:"h1|h2|h3|h4|h5|h6",ZB:"#|X|S|Q",S:"R|P",ZA:"#|a|G|J|M|O|P",R:"#|a|H|K|N|O",Q:"noscript|P",P:"ins|del|script",O:"input|select|textarea|label|button",N:"M|L",M:"em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym",L:"sub|sup",K:"J|I",J:"tt|i|b|u|s|strike",I:"big|small|font|basefont",H:"G|F",G:"br|span|bdo",F:"object|applet|img|map|iframe"},"script[]style[]object[#|param|X|form|a|H|K|N|O|Q]param[]p[S]a[Z]br[]span[S]bdo[S]applet[#|param|X|form|a|H|K|N|O|Q]h1[S]img[]map[X|form|Q|area]h2[S]iframe[#|X|form|a|H|K|N|O|Q]h3[S]tt[S]i[S]b[S]u[S]s[S]strike[S]big[S]small[S]font[S]basefont[]em[S]strong[S]dfn[S]code[S]q[S]samp[S]kbd[S]var[S]cite[S]abbr[S]acronym[S]sub[S]sup[S]input[]select[optgroup|option]optgroup[option]option[]textarea[]label[S]button[#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]h4[S]ins[#|X|form|a|H|K|N|O|Q]h5[S]del[#|X|form|a|H|K|N|O|Q]h6[S]div[#|X|form|a|H|K|N|O|Q]ul[li]li[#|X|form|a|H|K|N|O|Q]ol[li]dl[dt|dd]dt[S]dd[#|X|form|a|H|K|N|O|Q]menu[li]dir[li]pre[ZA]hr[]blockquote[#|X|form|a|H|K|N|O|Q]address[S|p]center[#|X|form|a|H|K|N|O|Q]noframes[#|X|form|a|H|K|N|O|Q]isindex[]fieldset[#|legend|X|form|a|H|K|N|O|Q]legend[S]table[caption|col|colgroup|thead|tfoot|tbody|tr]caption[S]col[]colgroup[col]thead[tr]tr[th|td]th[#|X|form|a|H|K|N|O|Q]form[#|X|a|H|K|N|O|Q]noscript[#|X|form|a|H|K|N|O|Q]td[#|X|form|a|H|K|N|O|Q]tfoot[tr]tbody[tr]area[]base[]body[#|X|form|a|H|K|N|O|Q]");
+tinymce.dom.Schema=function(){this.isValid=function(o,q){var k=m[o];return!!(k&&(!q||k[q]))}}})();
+(function(m){m.dom.RangeUtils=function(o){this.walk=function(q,k){function j(i,a,h){for(var n=[];i&&i!=h;i=i[a])n.push(i);return n}function b(i,a){do{if(i.parentNode==a)return i;i=i.parentNode}while(i)}function g(i,a,h){var n=h?"nextSibling":"previousSibling";v=i;for(f=v.parentNode;v&&v!=a;v=f){f=v.parentNode;e=j(v==i?v:v[n],n);if(e.length){h||e.reverse();k(e)}}}var d=q.startContainer,l=q.startOffset,r=q.endContainer,u=q.endOffset,v,f,e,c;c=o.select("td.mceSelected,th.mceSelected");if(c.length>0)m.each(c,
+function(i){k([i])});else{if(d.nodeType==1&&d.hasChildNodes())d=d.childNodes[l];if(r.nodeType==1&&r.hasChildNodes())r=r.childNodes[Math.min(l==u?u:u-1,r.childNodes.length-1)];u=o.findCommonAncestor(d,r);if(d==r)return k([d]);for(v=d;v;v=v.parentNode){if(v==r)return g(d,u,true);if(v==u)break}for(v=r;v;v=v.parentNode){if(v==d)return g(r,u);if(v==u)break}l=b(d,u)||d;u=b(r,u)||r;g(d,l,true);e=j(l==d?l:l.nextSibling,"nextSibling",u==r?u.nextSibling:u);e.length&&k(e);g(r,u)}}};m.dom.RangeUtils.compareRanges=
+function(o,q){if(o&&q)if(o.item||o.duplicate){if(o.item&&q.item&&o.item(0)===q.item(0))return true;if(o.isEqual&&q.isEqual&&q.isEqual(o))return true}else return o.startContainer==q.startContainer&&o.startOffset==q.startOffset;return false}})(tinymce);
+(function(m){var o=m.DOM,q=m.is;m.create("tinymce.ui.Control",{Control:function(k,j){this.id=k;this.settings=j=j||{};this.rendered=false;this.onRender=new m.util.Dispatcher(this);this.classPrefix="";this.scope=j.scope||this;this.active=this.disabled=0},setDisabled:function(k){var j;if(k!=this.disabled){if((j=o.get(this.id))&&this.settings.unavailable_prefix)if(k){this.prevTitle=j.title;j.title=this.settings.unavailable_prefix+": "+j.title}else j.title=this.prevTitle;this.setState("Disabled",k);this.setState("Enabled",
+!k);this.disabled=k}},isDisabled:function(){return this.disabled},setActive:function(k){if(k!=this.active){this.setState("Active",k);this.active=k}},isActive:function(){return this.active},setState:function(k,j){var b=o.get(this.id);k=this.classPrefix+k;j?o.addClass(b,k):o.removeClass(b,k)},isRendered:function(){return this.rendered},renderHTML:function(){},renderTo:function(k){o.setHTML(k,this.renderHTML())},postRender:function(){var k;if(q(this.disabled)){k=this.disabled;this.disabled=-1;this.setDisabled(k)}if(q(this.active)){k=
+this.active;this.active=-1;this.setActive(k)}},remove:function(){o.remove(this.id);this.destroy()},destroy:function(){m.dom.Event.clear(this.id)}})})(tinymce);tinymce.create("tinymce.ui.Container:tinymce.ui.Control",{Container:function(m,o){this.parent(m,o);this.controls=[];this.lookup={}},add:function(m){this.lookup[m.id]=m;this.controls.push(m);return m},get:function(m){return this.lookup[m]}});
+tinymce.create("tinymce.ui.Separator:tinymce.ui.Control",{Separator:function(m,o){this.parent(m,o);this.classPrefix="mceSeparator"},renderHTML:function(){return tinymce.DOM.createHTML("span",{"class":this.classPrefix})}});
+(function(m){var o=m.is;m.create("tinymce.ui.MenuItem:tinymce.ui.Control",{MenuItem:function(q,k){this.parent(q,k);this.classPrefix="mceMenuItem"},setSelected:function(q){this.setState("Selected",q);this.selected=q},isSelected:function(){return this.selected},postRender:function(){this.parent();o(this.selected)&&this.setSelected(this.selected)}})})(tinymce);
+(function(m){var o=m.DOM,q=m.walk;m.create("tinymce.ui.Menu:tinymce.ui.MenuItem",{Menu:function(k,j){this.parent(k,j);this.items={};this.collapsed=false;this.menuCount=0;this.onAddItem=new m.util.Dispatcher(this)},expand:function(k){k&&q(this,function(j){j.expand&&j.expand()},"items",this);this.collapsed=false},collapse:function(k){k&&q(this,function(j){j.collapse&&j.collapse()},"items",this);this.collapsed=true},isCollapsed:function(){return this.collapsed},add:function(k){k.settings||(k=new m.ui.MenuItem(k.id||
+o.uniqueId(),k));this.onAddItem.dispatch(this,k);return this.items[k.id]=k},addSeparator:function(){return this.add({separator:true})},addMenu:function(k){k.collapse||(k=this.createMenu(k));this.menuCount++;return this.add(k)},hasMenus:function(){return this.menuCount!==0},remove:function(k){delete this.items[k.id]},removeAll:function(){q(this,function(k){k.removeAll?k.removeAll():k.remove();k.destroy()},"items",this);this.items={}},createMenu:function(k){k=new m.ui.Menu(k.id||o.uniqueId(),k);k.onAddItem.add(this.onAddItem.dispatch,
+this.onAddItem);return k}})})(tinymce);
+(function(m){var o=m.is,q=m.DOM,k=m.each,j=m.dom.Event,b=m.dom.Element;m.create("tinymce.ui.DropMenu:tinymce.ui.Menu",{DropMenu:function(g,d){d=d||{};d.container=d.container||q.doc.body;d.offset_x=d.offset_x||0;d.offset_y=d.offset_y||0;d.vp_offset_x=d.vp_offset_x||0;d.vp_offset_y=d.vp_offset_y||0;if(o(d.icons)&&!d.icons)d["class"]+=" mceNoIcons";this.parent(g,d);this.onShowMenu=new m.util.Dispatcher(this);this.onHideMenu=new m.util.Dispatcher(this);this.classPrefix="mceMenu"},createMenu:function(g){var d=
+this.settings;g.container=g.container||d.container;g.parent=this;g.constrain=g.constrain||d.constrain;g["class"]=g["class"]||d["class"];g.vp_offset_x=g.vp_offset_x||d.vp_offset_x;g.vp_offset_y=g.vp_offset_y||d.vp_offset_y;g=new m.ui.DropMenu(g.id||q.uniqueId(),g);g.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return g},update:function(){var g=this.settings,d=q.get("menu_"+this.id+"_tbl"),l=q.get("menu_"+this.id+"_co"),r,u;r=g.max_width?Math.min(d.clientWidth,g.max_width):d.clientWidth;u=
+g.max_height?Math.min(d.clientHeight,g.max_height):d.clientHeight;q.boxModel?this.element.setStyles({width:r,height:u}):this.element.setStyles({width:r+2,height:u+2});g.max_width&&q.setStyle(l,"width",r);if(g.max_height){q.setStyle(l,"height",u);d.clientHeight<g.max_height&&q.setStyle(l,"overflow","hidden")}},showMenu:function(g,d,l){var r=this,u=r.settings,v,f=q.getViewPort(),e,c,i,a,h=r.classPrefix;r.collapse(1);if(!r.isMenuVisible){if(r.rendered)v=q.get("menu_"+r.id);else{v=q.add(r.settings.container,
+r.renderNode());k(r.items,function(n){n.postRender()});r.element=new b("menu_"+r.id,{blocker:1,container:u.container})}m.isOpera||q.setStyles(v,{left:-65535,top:-65535});q.show(v);r.update();g+=u.offset_x||0;d+=u.offset_y||0;f.w-=4;f.h-=4;if(u.constrain){e=v.clientWidth-2;c=v.clientHeight-2;i=f.x+f.w;f=f.y+f.h;if(g+u.vp_offset_x+e>i)g=l?l-e:Math.max(0,i-u.vp_offset_x-e);if(d+u.vp_offset_y+c>f)d=Math.max(0,f-u.vp_offset_y-c)}q.setStyles(v,{left:g,top:d});r.element.update();r.isMenuVisible=1;r.mouseClickFunc=
+j.add(v,"click",function(n){var p;if((n=n.target)&&(n=q.getParent(n,"tr"))&&!q.hasClass(n,h+"ItemSub")){p=r.items[n.id];if(!p.isDisabled()){for(a=r;a;){a.hideMenu&&a.hideMenu();a=a.settings.parent}p.settings.onclick&&p.settings.onclick(n);return j.cancel(n)}}});if(r.hasMenus())r.mouseOverFunc=j.add(v,"mouseover",function(n){var p;if((n=n.target)&&(n=q.getParent(n,"tr"))){p=r.items[n.id];r.lastMenu&&r.lastMenu.collapse(1);if(!p.isDisabled())if(n&&q.hasClass(n,h+"ItemSub")){n=q.getRect(n);p.showMenu(n.x+
+n.w-2,n.y-2,n.x);r.lastMenu=p;q.addClass(q.get(p.id).firstChild,h+"ItemActive")}}});r.onShowMenu.dispatch(r);if(u.keyboard_focus){j.add(v,"keydown",r._keyHandler,r);q.select("a","menu_"+r.id)[0].focus();r._focusIdx=0}}},hideMenu:function(g){var d=q.get("menu_"+this.id);if(this.isMenuVisible){j.remove(d,"mouseover",this.mouseOverFunc);j.remove(d,"click",this.mouseClickFunc);j.remove(d,"keydown",this._keyHandler);q.hide(d);this.isMenuVisible=0;g||this.collapse(1);this.element&&this.element.hide();if(g=
+q.get(this.id))q.removeClass(g.firstChild,this.classPrefix+"ItemActive");this.onHideMenu.dispatch(this)}},add:function(g){var d;g=this.parent(g);if(this.isRendered&&(d=q.get("menu_"+this.id)))this._add(q.select("tbody",d)[0],g);return g},collapse:function(g){this.parent(g);this.hideMenu(1)},remove:function(g){q.remove(g.id);this.destroy();return this.parent(g)},destroy:function(){var g=q.get("menu_"+this.id);j.remove(g,"mouseover",this.mouseOverFunc);j.remove(g,"click",this.mouseClickFunc);this.element&&
+this.element.remove();q.remove(g)},renderNode:function(){var g=this,d=g.settings,l,r,u;u=q.create("div",{id:"menu_"+g.id,"class":d["class"],style:"position:absolute;left:0;top:0;z-index:200000"});r=q.add(u,"div",{id:"menu_"+g.id+"_co","class":g.classPrefix+(d["class"]?" "+d["class"]:"")});g.element=new b("menu_"+g.id,{blocker:1,container:d.container});d.menu_line&&q.add(r,"span",{"class":g.classPrefix+"Line"});d=q.add(r,"table",{id:"menu_"+g.id+"_tbl",border:0,cellPadding:0,cellSpacing:0});l=q.add(d,
+"tbody");k(g.items,function(v){g._add(l,v)});g.rendered=true;return u},_keyHandler:function(g){function d(r){r=l._focusIdx+r;var u=q.select("a","menu_"+l.id)[r];if(u){l._focusIdx=r;u.focus()}}var l=this;switch(g.keyCode){case 38:d(-1);break;case 40:d(1);break;case 27:return this.hideMenu()}},_add:function(g,d){var l,r=d.settings,u,v,f=this.classPrefix;if(r.separator){u=q.add(g,"tr",{id:d.id,"class":f+"ItemSeparator"});q.add(u,"td",{"class":f+"ItemSeparator"});if(l=u.previousSibling)q.addClass(l,"mceLast")}else{l=
+u=q.add(g,"tr",{id:d.id,"class":f+"Item "+f+"ItemEnabled"});l=v=q.add(l,"td");l=q.add(l,"a",{href:"javascript:;",onclick:"return false;",onmousedown:"return false;"});q.addClass(v,r["class"]);v=q.add(l,"span",{"class":"mceIcon"+(r.icon?" mce_"+r.icon:"")});r.icon_src&&q.add(v,"img",{src:r.icon_src});l=q.add(l,r.element||"span",{"class":"mceText",title:d.settings.title},d.settings.title);d.settings.style&&q.setAttrib(l,"style",d.settings.style);g.childNodes.length==1&&q.addClass(u,"mceFirst");if((l=
+u.previousSibling)&&q.hasClass(l,f+"ItemSeparator"))q.addClass(u,"mceFirst");d.collapse&&q.addClass(u,f+"ItemSub");if(l=u.previousSibling)q.removeClass(l,"mceLast");q.addClass(u,"mceLast")}}})})(tinymce);
+(function(m){var o=m.DOM;m.create("tinymce.ui.Button:tinymce.ui.Control",{Button:function(q,k){this.parent(q,k);this.classPrefix="mceButton"},renderHTML:function(){var q=this.classPrefix,k=this.settings,j,b;b=o.encode(k.label||"");j='<a id="'+this.id+'" href="javascript:;" class="'+q+" "+q+"Enabled "+k["class"]+(b?" "+q+"Labeled":"")+'" onmousedown="return false;" onclick="return false;" title="'+o.encode(k.title)+'">';j+=k.image?'<img class="mceIcon" src="'+k.image+'" />'+b+"</a>":'<span class="mceIcon '+
+k["class"]+'"></span>'+(b?'<span class="'+q+'Label">'+b+"</span>":"")+"</a>";return j},postRender:function(){var q=this,k=q.settings;m.dom.Event.add(q.id,"click",function(j){if(!q.isDisabled())return k.onclick.call(k.scope,j)})}})})(tinymce);
+(function(m){var o=m.DOM,q=m.dom.Event,k=m.each,j=m.util.Dispatcher;m.create("tinymce.ui.ListBox:tinymce.ui.Control",{ListBox:function(b,g){this.parent(b,g);this.items=[];this.onChange=new j(this);this.onPostRender=new j(this);this.onAdd=new j(this);this.onRenderMenu=new m.util.Dispatcher(this);this.classPrefix="mceListBox"},select:function(b){var g=this,d,l;if(b==undefined)return g.selectByIndex(-1);l=b&&b.call?b:function(r){return r==b};if(b!=g.selectedValue){k(g.items,function(r,u){if(l(r.value)){d=
+1;g.selectByIndex(u);return false}});d||g.selectByIndex(-1)}},selectByIndex:function(b){var g,d;if(b!=this.selectedIndex){g=o.get(this.id+"_text");if(d=this.items[b]){this.selectedValue=d.value;this.selectedIndex=b;o.setHTML(g,o.encode(d.title));o.removeClass(g,"mceTitle")}else{o.setHTML(g,o.encode(this.settings.title));o.addClass(g,"mceTitle");this.selectedValue=this.selectedIndex=null}}},add:function(b,g,d){d=d||{};d=m.extend(d,{title:b,value:g});this.items.push(d);this.onAdd.dispatch(this,d)},
+getLength:function(){return this.items.length},renderHTML:function(){var b="";b=this.settings;var g=this.classPrefix;b='<table id="'+this.id+'" cellpadding="0" cellspacing="0" class="'+g+" "+g+"Enabled"+(b["class"]?" "+b["class"]:"")+'"><tbody><tr>';b+="<td>"+o.createHTML("a",{id:this.id+"_text",href:"javascript:;","class":"mceText",onclick:"return false;",onmousedown:"return false;"},o.encode(this.settings.title))+"</td>";b+="<td>"+o.createHTML("a",{id:this.id+"_open",tabindex:-1,href:"javascript:;",
+"class":"mceOpen",onclick:"return false;",onmousedown:"return false;"},"<span></span>")+"</td>";b+="</tr></tbody></table>";return b},showMenu:function(){var b=this,g,d=o.get(this.id),l;if(!(b.isDisabled()||b.items.length==0)){if(b.menu&&b.menu.isMenuVisible)return b.hideMenu();if(!b.isMenuRendered){b.renderMenu();b.isMenuRendered=true}o.getPos(this.settings.menu_container);g=o.getPos(d);l=b.menu;l.settings.offset_x=g.x;l.settings.offset_y=g.y;l.settings.keyboard_focus=!m.isOpera;b.oldID&&l.items[b.oldID].setSelected(0);
+k(b.items,function(r){if(r.value===b.selectedValue){l.items[r.id].setSelected(1);b.oldID=r.id}});l.showMenu(0,d.clientHeight);q.add(o.doc,"mousedown",b.hideMenu,b);o.addClass(b.id,b.classPrefix+"Selected")}},hideMenu:function(b){if(this.menu&&this.menu.isMenuVisible)if(!(b&&b.type=="mousedown"&&(b.target.id==this.id+"_text"||b.target.id==this.id+"_open")))if(!b||!o.getParent(b.target,".mceMenu")){o.removeClass(this.id,this.classPrefix+"Selected");q.remove(o.doc,"mousedown",this.hideMenu,this);this.menu.hideMenu()}},
+renderMenu:function(){var b=this,g;g=b.settings.control_manager.createDropMenu(b.id+"_menu",{menu_line:1,"class":b.classPrefix+"Menu mceNoIcons",max_width:150,max_height:150});g.onHideMenu.add(b.hideMenu,b);g.add({title:b.settings.title,"class":"mceMenuItemTitle",onclick:function(){b.settings.onselect("")!==false&&b.select("")}});k(b.items,function(d){if(d.value===undefined)g.add({title:d.title,"class":"mceMenuItemTitle",onclick:function(){b.settings.onselect("")!==false&&b.select("")}});else{d.id=
+o.uniqueId();d.onclick=function(){b.settings.onselect(d.value)!==false&&b.select(d.value)};g.add(d)}});b.onRenderMenu.dispatch(b,g);b.menu=g},postRender:function(){var b=this,g=b.classPrefix;q.add(b.id,"click",b.showMenu,b);q.add(b.id+"_text","focus",function(){if(!b._focused)b.keyDownHandler=q.add(b.id+"_text","keydown",function(d){var l=-1,r,u=d.keyCode;k(b.items,function(v,f){if(b.selectedValue==v.value)l=f});if(u==38)r=b.items[l-1];else if(u==40)r=b.items[l+1];else if(u==13){r=b.selectedValue;
+b.selectedValue=null;b.settings.onselect(r);return q.cancel(d)}if(r){b.hideMenu();b.select(r.value)}});b._focused=1});q.add(b.id+"_text","blur",function(){q.remove(b.id+"_text","keydown",b.keyDownHandler);b._focused=0});if(m.isIE6||!o.boxModel){q.add(b.id,"mouseover",function(){o.hasClass(b.id,g+"Disabled")||o.addClass(b.id,g+"Hover")});q.add(b.id,"mouseout",function(){o.hasClass(b.id,g+"Disabled")||o.removeClass(b.id,g+"Hover")})}b.onPostRender.dispatch(b,o.get(b.id))},destroy:function(){this.parent();
+q.clear(this.id+"_text");q.clear(this.id+"_open")}})})(tinymce);
+(function(m){var o=m.DOM,q=m.dom.Event,k=m.each;m.create("tinymce.ui.NativeListBox:tinymce.ui.ListBox",{NativeListBox:function(j,b){this.parent(j,b);this.classPrefix="mceNativeListBox"},setDisabled:function(j){o.get(this.id).disabled=j},isDisabled:function(){return o.get(this.id).disabled},select:function(j){var b=this,g,d;if(j==undefined)return b.selectByIndex(-1);d=j&&j.call?j:function(l){return l==j};if(j!=b.selectedValue){k(b.items,function(l,r){if(d(l.value)){g=1;b.selectByIndex(r);return false}});
+g||b.selectByIndex(-1)}},selectByIndex:function(j){o.get(this.id).selectedIndex=j+1;this.selectedValue=this.items[j]?this.items[j].value:null},add:function(j,b,g){g=g||{};g.value=b;this.isRendered()&&o.add(o.get(this.id),"option",g,j);j={title:j,value:b,attribs:g};this.items.push(j);this.onAdd.dispatch(this,j)},getLength:function(){return this.items.length},renderHTML:function(){var j;j=o.createHTML("option",{value:""},"-- "+this.settings.title+" --");k(this.items,function(b){j+=o.createHTML("option",
+{value:b.value},b.title)});return j=o.createHTML("select",{id:this.id,"class":"mceNativeListBox"},j)},postRender:function(){function j(g){if((g=b.items[g.target.selectedIndex-1])&&(g=g.value)){b.onChange.dispatch(b,g);b.settings.onselect&&b.settings.onselect(g)}}var b=this;b.rendered=true;q.add(b.id,"change",j);q.add(b.id,"keydown",function(g){var d;q.remove(b.id,"change",void 0);d=q.add(b.id,"blur",function(){q.add(b.id,"change",j);q.remove(b.id,"blur",d)});if(g.keyCode==13||g.keyCode==32){j(g);
+return q.cancel(g)}});b.onPostRender.dispatch(b,o.get(b.id))}})})(tinymce);
+(function(m){var o=m.DOM,q=m.dom.Event;m.create("tinymce.ui.MenuButton:tinymce.ui.Button",{MenuButton:function(k,j){this.parent(k,j);this.onRenderMenu=new m.util.Dispatcher(this);j.menu_container=j.menu_container||o.doc.body},showMenu:function(){var k,j=o.get(this.id),b;if(!this.isDisabled()){if(!this.isMenuRendered){this.renderMenu();this.isMenuRendered=true}if(this.isMenuVisible)return this.hideMenu();o.getPos(this.settings.menu_container);k=o.getPos(j);b=this.menu;b.settings.offset_x=k.x;b.settings.offset_y=
+k.y;b.settings.vp_offset_x=k.x;b.settings.vp_offset_y=k.y;b.settings.keyboard_focus=this._focused;b.showMenu(0,j.clientHeight);q.add(o.doc,"mousedown",this.hideMenu,this);this.setState("Selected",1);this.isMenuVisible=1}},renderMenu:function(){var k;k=this.settings.control_manager.createDropMenu(this.id+"_menu",{menu_line:1,"class":this.classPrefix+"Menu",icons:this.settings.icons});k.onHideMenu.add(this.hideMenu,this);this.onRenderMenu.dispatch(this,k);this.menu=k},hideMenu:function(k){var j=this;
+if(!(k&&k.type=="mousedown"&&o.getParent(k.target,function(b){return b.id===j.id||b.id===j.id+"_open"}))){if(!k||!o.getParent(k.target,".mceMenu")){j.setState("Selected",0);q.remove(o.doc,"mousedown",j.hideMenu,j);j.menu&&j.menu.hideMenu()}j.isMenuVisible=0}},postRender:function(){var k=this,j=k.settings;q.add(k.id,"click",function(){if(!k.isDisabled()){j.onclick&&j.onclick(k.value);k.showMenu()}})}})})(tinymce);
+(function(m){var o=m.DOM,q=m.dom.Event;m.create("tinymce.ui.SplitButton:tinymce.ui.MenuButton",{SplitButton:function(k,j){this.parent(k,j);this.classPrefix="mceSplitButton"},renderHTML:function(){var k,j=this.settings,b;k="<tbody><tr>";b=j.image?o.createHTML("img ",{src:j.image,"class":"mceAction "+j["class"]}):o.createHTML("span",{"class":"mceAction "+j["class"]},"");k+="<td>"+o.createHTML("a",{id:this.id+"_action",href:"javascript:;","class":"mceAction "+j["class"],onclick:"return false;",onmousedown:"return false;",
+title:j.title},b)+"</td>";b=o.createHTML("span",{"class":"mceOpen "+j["class"]});k+="<td>"+o.createHTML("a",{id:this.id+"_open",href:"javascript:;","class":"mceOpen "+j["class"],onclick:"return false;",onmousedown:"return false;",title:j.title},b)+"</td>";k+="</tr></tbody>";return o.createHTML("table",{id:this.id,"class":"mceSplitButton mceSplitButtonEnabled "+j["class"],cellpadding:"0",cellspacing:"0",onmousedown:"return false;",title:j.title},k)},postRender:function(){var k=this,j=k.settings;j.onclick&&
+q.add(k.id+"_action","click",function(){k.isDisabled()||j.onclick(k.value)});q.add(k.id+"_open","click",k.showMenu,k);q.add(k.id+"_open","focus",function(){k._focused=1});q.add(k.id+"_open","blur",function(){k._focused=0});if(m.isIE6||!o.boxModel){q.add(k.id,"mouseover",function(){o.hasClass(k.id,"mceSplitButtonDisabled")||o.addClass(k.id,"mceSplitButtonHover")});q.add(k.id,"mouseout",function(){o.hasClass(k.id,"mceSplitButtonDisabled")||o.removeClass(k.id,"mceSplitButtonHover")})}},destroy:function(){this.parent();
+q.clear(this.id+"_action");q.clear(this.id+"_open")}})})(tinymce);
+(function(m){var o=m.DOM,q=m.dom.Event,k=m.is,j=m.each;m.create("tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton",{ColorSplitButton:function(b,g){this.parent(b,g);this.settings=g=m.extend({colors:"000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",grid_width:8,default_color:"#888888"},
+this.settings);this.onShowMenu=new m.util.Dispatcher(this);this.onHideMenu=new m.util.Dispatcher(this);this.value=g.default_color},showMenu:function(){var b=this,g,d;if(!b.isDisabled()){if(!b.isMenuRendered){b.renderMenu();b.isMenuRendered=true}if(b.isMenuVisible)return b.hideMenu();g=o.get(b.id);o.show(b.id+"_menu");o.addClass(g,"mceSplitButtonSelected");d=o.getPos(g);o.setStyles(b.id+"_menu",{left:d.x,top:d.y+g.clientHeight,zIndex:2E5});g=0;q.add(o.doc,"mousedown",b.hideMenu,b);b.onShowMenu.dispatch(b);
+if(b._focused){b._keyHandler=q.add(b.id+"_menu","keydown",function(l){l.keyCode==27&&b.hideMenu()});o.select("a",b.id+"_menu")[0].focus()}b.isMenuVisible=1}},hideMenu:function(b){var g=this;if(!(b&&b.type=="mousedown"&&o.getParent(b.target,function(d){return d.id===g.id+"_open"}))){if(!b||!o.getParent(b.target,".mceSplitButtonMenu")){o.removeClass(g.id,"mceSplitButtonSelected");q.remove(o.doc,"mousedown",g.hideMenu,g);q.remove(g.id+"_menu","keydown",g._keyHandler);o.hide(g.id+"_menu")}g.onHideMenu.dispatch(g);
+g.isMenuVisible=0}},renderMenu:function(){var b=this,g,d=0,l=b.settings,r,u,v,f;f=o.add(l.menu_container,"div",{id:b.id+"_menu","class":l.menu_class+" "+l["class"],style:"position:absolute;left:0;top:-1000px;"});g=o.add(f,"div",{"class":l["class"]+" mceSplitButtonMenu"});o.add(g,"span",{"class":"mceMenuLine"});r=o.add(g,"table",{"class":"mceColorSplitMenu"});u=o.add(r,"tbody");d=0;j(k(l.colors,"array")?l.colors:l.colors.split(","),function(e){e=e.replace(/^#/,"");if(!d--){v=o.add(u,"tr");d=l.grid_width-
+1}r=o.add(v,"td");r=o.add(r,"a",{href:"javascript:;",style:{backgroundColor:"#"+e},_mce_color:"#"+e})});if(l.more_colors_func){r=o.add(u,"tr");r=o.add(r,"td",{colspan:l.grid_width,"class":"mceMoreColors"});r=o.add(r,"a",{id:b.id+"_more",href:"javascript:;",onclick:"return false;","class":"mceMoreColors"},l.more_colors_title);q.add(r,"click",function(e){l.more_colors_func.call(l.more_colors_scope||this);return q.cancel(e)})}o.addClass(g,"mceColorSplitMenu");q.add(b.id+"_menu","click",function(e){var c;
+e=e.target;if(e.nodeName=="A"&&(c=e.getAttribute("_mce_color")))b.setColor(c);return q.cancel(e)});return f},setColor:function(b){o.setStyle(this.id+"_preview","backgroundColor",b);this.value=b;this.hideMenu();this.settings.onselect(b)},postRender:function(){var b=this.id;this.parent();o.add(b+"_action","div",{id:b+"_preview","class":"mceColorPreview"});o.setStyle(this.id+"_preview","backgroundColor",this.value)},destroy:function(){this.parent();q.clear(this.id+"_menu");q.clear(this.id+"_more");o.remove(this.id+
+"_menu")}})})(tinymce);
+tinymce.create("tinymce.ui.Toolbar:tinymce.ui.Container",{renderHTML:function(){var m="",o,q,k=tinymce.DOM,j=this.settings,b,g,d,l;l=this.controls;for(b=0;b<l.length;b++){q=l[b];g=l[b-1];d=l[b+1];if(b===0){o="mceToolbarStart";if(q.Button)o+=" mceToolbarStartButton";else if(q.SplitButton)o+=" mceToolbarStartSplitButton";else if(q.ListBox)o+=" mceToolbarStartListBox";m+=k.createHTML("td",{"class":o},k.createHTML("span",null,"<!-- IE --\>"))}if(g&&q.ListBox)if(g.Button||g.SplitButton)m+=k.createHTML("td",
+{"class":"mceToolbarEnd"},k.createHTML("span",null,"<!-- IE --\>"));m+=k.stdMode?'<td style="position: relative">'+q.renderHTML()+"</td>":"<td>"+q.renderHTML()+"</td>";if(d&&q.ListBox)if(d.Button||d.SplitButton)m+=k.createHTML("td",{"class":"mceToolbarStart"},k.createHTML("span",null,"<!-- IE --\>"))}o="mceToolbarEnd";if(q.Button)o+=" mceToolbarEndButton";else if(q.SplitButton)o+=" mceToolbarEndSplitButton";else if(q.ListBox)o+=" mceToolbarEndListBox";m+=k.createHTML("td",{"class":o},k.createHTML("span",
+null,"<!-- IE --\>"));return k.createHTML("table",{id:this.id,"class":"mceToolbar"+(j["class"]?" "+j["class"]:""),cellpadding:"0",cellspacing:"0",align:this.settings.align||""},"<tbody><tr>"+m+"</tr></tbody>")}});
+(function(m){m.create("tinymce.AddOnManager",{items:[],urls:{},lookup:{},onAdd:new m.util.Dispatcher(this),get:function(o){return this.lookup[o]},requireLangPack:function(o){var q=m.settings;q&&q.language&&m.ScriptLoader.add(this.urls[o]+"/langs/"+q.language+".js")},add:function(o,q){this.items.push(q);this.lookup[o]=q;this.onAdd.dispatch(this,o,q);return q},load:function(o,q,k,j){if(!this.urls[o]){if(q.indexOf("/")!=0&&q.indexOf("://")==-1)q=m.baseURL+"/"+q;this.urls[o]=q.substring(0,q.lastIndexOf("/"));
+m.ScriptLoader.add(q,k,j)}}});m.PluginManager=new m.AddOnManager;m.ThemeManager=new m.AddOnManager})(tinymce);
+(function(m){var o=m.each,q=m.extend,k=m.DOM,j=m.dom.Event,b=m.explode,g=m.util.Dispatcher,d=0;m.documentBaseURL=window.location.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");/[\/\\]$/.test(m.documentBaseURL)||(m.documentBaseURL+="/");m.baseURL=(new m.util.URI(m.documentBaseURL)).toAbsolute(m.baseURL);m.baseURI=new m.util.URI(m.baseURL);m.onBeforeUnload=new g(m);j.add(window,"beforeunload",function(l){m.onBeforeUnload.dispatch(m,l)});m.onAddEditor=new g(m);m.onRemoveEditor=new g(m);m.EditorManager=
+q(m,{editors:[],i18n:{},activeEditor:null,init:function(l){function r(c,i,a){var h=c[i];if(h){if(m.is(h,"string")){a=(a=h.replace(/\.\w+$/,""))?m.resolve(a):0;h=m.resolve(h)}return h.apply(a||this,Array.prototype.slice.call(arguments,2))}}var u=this,v,f=[],e;l=q({theme:"simple",language:"en"},l);u.settings=l;j.add(document,"init",function(){var c,i;r(l,"onpageload");switch(l.mode){case "exact":c=l.elements||"";c.length>0&&o(b(c),function(a){if(k.get(a)){e=new m.Editor(a,l);f.push(e);e.render(1)}else o(document.forms,
+function(h){o(h.elements,function(n){if(n.name===a){a="mce_editor_"+d++;k.setAttrib(n,"id",a);e=new m.Editor(a,l);f.push(e);e.render(1)}})})});break;case "textareas":case "specific_textareas":o(k.select("textarea"),function(a){if(!(l.editor_deselector&&(l.editor_deselector.constructor===RegExp?l.editor_deselector.test(a.className):k.hasClass(a,l.editor_deselector))))if(!l.editor_selector||(l.editor_selector.constructor===RegExp?l.editor_selector.test(a.className):k.hasClass(a,l.editor_selector))){v=
+k.get(a.name);if(!a.id&&!v)a.id=a.name;if(!a.id||u.get(a.id))a.id=k.uniqueId();e=new m.Editor(a.id,l);f.push(e);e.render(1)}})}if(l.oninit){c=i=0;o(f,function(a){i++;if(a.initialized)c++;else a.onInit.add(function(){c++;c==i&&r(l,"oninit")});c==i&&r(l,"oninit")})}})},get:function(l){if(l===void 0)return this.editors;return this.editors[l]},getInstanceById:function(l){return this.get(l)},add:function(l){var r=this.editors;r[l.id]=l;r.push(l);this._setActive(l);this.onAddEditor.dispatch(this,l);return l},
+remove:function(l){var r,u=this.editors;if(!u[l.id])return null;delete u[l.id];for(r=0;r<u.length;r++)if(u[r]==l){u.splice(r,1);break}this.activeEditor==l&&this._setActive(u[0]);l.destroy();this.onRemoveEditor.dispatch(this,l);return l},execCommand:function(l,r,u){var v=this.get(u),f;switch(l){case "mceFocus":v.focus();return true;case "mceAddEditor":case "mceAddControl":this.get(u)||(new m.Editor(u,this.settings)).render();return true;case "mceAddFrameControl":f=u.window;f.tinyMCE=tinyMCE;f.tinymce=
+m;m.DOM.doc=f.document;m.DOM.win=f;v=new m.Editor(u.element_id,u);v.render();if(m.isIE){var e=function(){v.destroy();f.detachEvent("onunload",e);f=f.tinyMCE=f.tinymce=null};f.attachEvent("onunload",e)}u.page_window=null;return true;case "mceRemoveEditor":case "mceRemoveControl":v&&v.remove();return true;case "mceToggleEditor":if(!v){this.execCommand("mceAddControl",0,u);return true}v.isHidden()?v.show():v.hide();return true}if(this.activeEditor)return this.activeEditor.execCommand(l,r,u);return false},
+execInstanceCommand:function(l,r,u,v){if(l=this.get(l))return l.execCommand(r,u,v);return false},triggerSave:function(){o(this.editors,function(l){l.save()})},addI18n:function(l,r){var u=this.i18n;m.is(l,"string")?o(r,function(v,f){u[l+"."+f]=v}):o(l,function(v,f){o(v,function(e,c){o(e,function(i,a){if(c==="common")u[f+"."+a]=i;else u[f+"."+c+"."+a]=i})})})},_setActive:function(l){this.selectedInstance=this.activeEditor=l}})})(tinymce);
+(function(m){var o=m.DOM,q=m.dom.Event,k=m.extend,j=m.util.Dispatcher,b=m.each,g=m.isGecko,d=m.isIE,l=m.is,r=m.ThemeManager,u=m.PluginManager,v=m.explode;m.create("tinymce.Editor",{Editor:function(f,e){var c=this;c.id=c.editorId=f;c.execCommands={};c.queryStateCommands={};c.queryValueCommands={};c.isNotDirty=false;c.plugins={};b(["onPreInit","onBeforeRenderUI","onPostRender","onInit","onRemove","onActivate","onDeactivate","onClick","onEvent","onMouseUp","onMouseDown","onDblClick","onKeyDown","onKeyUp",
+"onKeyPress","onContextMenu","onSubmit","onReset","onPaste","onPreProcess","onPostProcess","onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent","onLoadContent","onSaveContent","onNodeChange","onChange","onBeforeExecCommand","onExecCommand","onUndo","onRedo","onVisualAid","onSetProgressState"],function(i){c[i]=new j(c)});c.settings=e=k({id:f,language:"en",docs_language:"en",theme:"simple",skin:"default",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:m.documentBaseURL,
+add_form_submit_trigger:1,submit_patch:1,add_unload_trigger:1,convert_urls:1,relative_urls:1,remove_script_host:1,table_inline_editing:0,object_resizing:1,cleanup:1,accessibility_focus:1,custom_shortcuts:1,custom_undo_redo_keyboard_shortcuts:1,custom_undo_redo_restore_selection:1,custom_undo_redo:1,doctype:m.isIE6?'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">':"<!DOCTYPE>",visual_table_class:"mceItemTable",visual:1,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",
+apply_source_formatting:1,directionality:"ltr",forced_root_block:"p",valid_elements:"@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p,-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote[cite],-table[border|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value|tabindex|accesskey],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big",
+hidden_input:1,padd_empty_editor:1,render_ui:1,init_theme:1,force_p_newlines:1,indentation:"30px",keep_styles:1,fix_table_elements:1,inline_styles:1,convert_fonts_to_spans:true},e);c.documentBaseURI=new m.util.URI(e.document_base_url||m.documentBaseURL,{base_uri:tinyMCE.baseURI});c.baseURI=m.baseURI;c.execCallback("setup",c)},render:function(){var f=this,e=f.settings,c=f.id,i=m.ScriptLoader;if(q.domLoaded){tinyMCE.settings=e;if(f.getElement())if(!m.isIDevice){!/TEXTAREA|INPUT/i.test(f.getElement().nodeName)&&
+e.hidden_input&&o.getParent(c,"form")&&o.insertAfter(o.create("input",{type:"hidden",name:c}),c);if(m.WindowManager)f.windowManager=new m.WindowManager(f);e.encoding=="xml"&&f.onGetContent.add(function(a,h){if(h.save)h.content=o.encode(h.content)});e.add_form_submit_trigger&&f.onSubmit.addToTop(function(){if(f.initialized){f.save();f.isNotDirty=1}});if(e.add_unload_trigger)f._beforeUnload=tinyMCE.onBeforeUnload.add(function(){f.initialized&&!f.destroyed&&!f.isHidden()&&f.save({format:"raw",no_events:true})});
+m.addUnload(f.destroy,f);e.submit_patch&&f.onBeforeRenderUI.add(function(){var a=f.getElement().form;if(a)if(!a._mceOldSubmit){if(!a.submit.nodeType&&!a.submit.length){f.formElement=a;a._mceOldSubmit=a.submit;a.submit=function(){m.triggerSave();f.isNotDirty=1;return f.formElement._mceOldSubmit(f.formElement)}}a=null}});(function(){e.language&&i.add(m.baseURL+"/langs/"+e.language+".js");e.theme&&e.theme.charAt(0)!="-"&&!r.urls[e.theme]&&r.load(e.theme,"themes/"+e.theme+"/editor_template"+m.suffix+
+".js");b(v(e.plugins),function(a){a&&a.charAt(0)!="-"&&!u.urls[a]&&a!="safari"&&u.load(a,"plugins/"+a+"/editor_plugin"+m.suffix+".js")});i.loadQueue(function(){f.removed||f.init()})})()}}else q.add(document,"init",function(){f.render()})},init:function(){var f=this,e=f.settings,c,i,a=f.getElement(),h,n,p;m.add(f);if(e.theme){e.theme=e.theme.replace(/-/,"");h=r.get(e.theme);f.theme=new h;if(f.theme.init&&e.init_theme)f.theme.init(f,r.urls[e.theme]||m.documentBaseURL.replace(/\/$/,""))}b(v(e.plugins.replace(/\-/g,
+"")),function(t){var s=u.get(t),x=u.urls[t]||m.documentBaseURL.replace(/\/$/,"");if(s){s=new s(f,x);f.plugins[t]=s;s.init&&s.init(f,x)}});if(e.popup_css!==false)e.popup_css=e.popup_css?f.documentBaseURI.toAbsolute(e.popup_css):f.baseURI.toAbsolute("themes/"+e.theme+"/skins/"+e.skin+"/dialog.css");if(e.popup_css_add)e.popup_css+=","+f.documentBaseURI.toAbsolute(e.popup_css_add);f.controlManager=new m.ControlManager(f);if(e.custom_undo_redo){f.onBeforeExecCommand.add(function(t,s,x,y,D){if(s!="Undo"&&
+s!="Redo"&&s!="mceRepaint"&&(!D||!D.skip_undo))f.undoManager.hasUndo()||f.undoManager.add()});f.onExecCommand.add(function(t,s,x,y,D){if(s!="Undo"&&s!="Redo"&&s!="mceRepaint"&&(!D||!D.skip_undo))f.undoManager.add()})}f.onExecCommand.add(function(t,s){/^(FontName|FontSize)$/.test(s)||f.nodeChanged()});if(g){p=function(t,s){if(!s||!s.initial)f.execCommand("mceRepaint")};f.onUndo.add(p);f.onRedo.add(p);f.onSetContent.add(p)}f.onBeforeRenderUI.dispatch(f,f.controlManager);if(e.render_ui){c=e.width||a.style.width||
+a.offsetWidth;i=e.height||a.style.height||a.offsetHeight;f.orgDisplay=a.style.display;p=/^[0-9\.]+(|px)$/i;if(p.test(""+c))c=Math.max(parseInt(c)+(h.deltaWidth||0),100);if(p.test(""+i))i=Math.max(parseInt(i)+(h.deltaHeight||0),100);h=f.theme.renderUI({targetNode:a,width:c,height:i,deltaWidth:e.delta_width,deltaHeight:e.delta_height});f.editorContainer=h.editorContainer}if(document.domain&&location.hostname!=document.domain)m.relaxedDomain=document.domain;o.setStyles(h.sizeContainer||h.editorContainer,
+{width:c,height:i});i=(h.iframeHeight||i)+(typeof i=="number"?h.deltaHeight||0:"");if(i<100)i=100;f.iframeHTML=e.doctype+'<html><head xmlns="http://www.w3.org/1999/xhtml">';if(e.document_base_url!=m.documentBaseURL)f.iframeHTML+='<base href="'+f.documentBaseURI.getURI()+'" />';f.iframeHTML+='<meta http-equiv="X-UA-Compatible" content="IE=7" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';if(m.relaxedDomain)f.iframeHTML+='<script type="text/javascript">document.domain = "'+
+m.relaxedDomain+'";<\/script>';c=e.body_id||"tinymce";if(c.indexOf("=")!=-1){c=f.getParam("body_id","","hash");c=c[f.id]||c}e=e.body_class||"";if(e.indexOf("=")!=-1){e=f.getParam("body_class","","hash");e=e[f.id]||""}f.iframeHTML+='</head><body id="'+c+'" class="mceContentBody '+e+'"></body></html>';if(m.relaxedDomain)if(d||m.isOpera&&parseFloat(opera.version())>=9.5)n='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+f.id+'");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()';
+else if(m.isOpera)n='javascript:(function(){document.open();document.domain="'+document.domain+'";document.close();ed.setupIframe();})()';o.add(h.iframeContainer,"iframe",{id:f.id+"_ifr",src:n||'javascript:""',frameBorder:"0",style:{width:"100%",height:i}});f.contentAreaContainer=h.iframeContainer;o.get(h.editorContainer).style.display=f.orgDisplay;o.get(f.id).style.display="none";if(!d||!m.relaxedDomain)f.setupIframe();a=h=null},setupIframe:function(){var f=this,e=f.settings;o.get(f.id);var c=f.getDoc(),
+i;if(!d||!m.relaxedDomain){c.open();c.write(f.iframeHTML);c.close()}if(!d)try{if(!e.readonly)c.designMode="On"}catch(a){}if(d){i=f.getBody();o.hide(i);if(!e.readonly)i.contentEditable=true;o.show(i)}f.dom=new m.dom.DOMUtils(f.getDoc(),{keep_values:true,url_converter:f.convertURL,url_converter_scope:f,hex_colors:e.force_hex_style_colors,class_filter:e.class_filter,update_styles:1,fix_ie_paragraphs:1,valid_styles:e.valid_styles});f.schema=new m.dom.Schema;f.serializer=new m.dom.Serializer(k(e,{valid_elements:e.verify_html===
+false?"*[*]":e.valid_elements,dom:f.dom,schema:f.schema}));f.selection=new m.dom.Selection(f.dom,f.getWin(),f.serializer);f.formatter=new m.Formatter(this);f.formatter.register({alignleft:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"left"}},{selector:"img,table",styles:{"float":"left"}}],aligncenter:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"center"}},{selector:"img",styles:{display:"block",marginLeft:"auto",marginRight:"auto"}},{selector:"table",
+styles:{marginLeft:"auto",marginRight:"auto"}}],alignright:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"right"}},{selector:"img,table",styles:{"float":"right"}}],alignfull:[{selector:"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li",styles:{textAlign:"justify"}}],bold:[{inline:"strong"},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b"}],italic:[{inline:"em"},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i"}],underline:[{inline:"span",styles:{textDecoration:"underline"},
+exact:true},{inline:"u"}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:true},{inline:"u"}],forecolor:{inline:"span",styles:{color:"%value"}},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"}},fontname:{inline:"span",styles:{fontFamily:"%value"}},fontsize:{inline:"span",styles:{fontSize:"%value"}},fontsize_class:{inline:"span",attributes:{"class":"%value"}},blockquote:{block:"blockquote",wrapper:1,remove:"all"},removeformat:[{selector:"b,strong,em,i,font,u,strike",
+remove:"all",split:true,expand:false,block_expand:true,deep:true},{selector:"span",attributes:["style","class"],remove:"empty",split:true,expand:false,deep:true},{selector:"*",attributes:["style","class"],split:false,expand:false,deep:true}]});b("p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp".split(/\s/),function(t){f.formatter.register(t,{block:t,remove:"all"})});f.formatter.register(f.settings.formats);f.undoManager=new m.UndoManager(f);f.undoManager.onAdd.add(function(t,s){if(!s.initial)return f.onChange.dispatch(f,
+s,t)});f.undoManager.onUndo.add(function(t,s){return f.onUndo.dispatch(f,s,t)});f.undoManager.onRedo.add(function(t,s){return f.onRedo.dispatch(f,s,t)});f.forceBlocks=new m.ForceBlocks(f,{forced_root_block:e.forced_root_block});f.editorCommands=new m.EditorCommands(f);f.serializer.onPreProcess.add(function(t,s){return f.onPreProcess.dispatch(f,s,t)});f.serializer.onPostProcess.add(function(t,s){return f.onPostProcess.dispatch(f,s,t)});f.onPreInit.dispatch(f);if(!e.gecko_spellcheck)f.getBody().spellcheck=
+0;e.readonly||f._addEvents();f.controlManager.onPostRender.dispatch(f,f.controlManager);f.onPostRender.dispatch(f);if(e.directionality)f.getBody().dir=e.directionality;if(e.nowrap)f.getBody().style.whiteSpace="nowrap";if(e.custom_elements){var h=function(t,s){b(v(e.custom_elements),function(x){var y;if(x.indexOf("~")===0){x=x.substring(1);y="span"}else y="div";s.content=s.content.replace(RegExp("<("+x+")([^>]*)>","g"),"<"+y+' _mce_name="$1"$2>');s.content=s.content.replace(RegExp("</("+x+")>","g"),
+"</"+y+">")})};f.onBeforeSetContent.add(h);f.onPostProcess.add(function(t,s){s.set&&h(t,s)})}e.handle_node_change_callback&&f.onNodeChange.add(function(t,s,x){f.execCallback("handle_node_change_callback",f.id,x,-1,-1,true,f.selection.isCollapsed())});e.save_callback&&f.onSaveContent.add(function(t,s){var x=f.execCallback("save_callback",f.id,s.content,f.getBody());if(x)s.content=x});e.onchange_callback&&f.onChange.add(function(t,s){f.execCallback("onchange_callback",f,s)});e.convert_newlines_to_brs&&
+f.onBeforeSetContent.add(function(t,s){if(s.initial)s.content=s.content.replace(/\r?\n/g,"<br />")});e.fix_nesting&&d&&f.onBeforeSetContent.add(function(t,s){s.content=f._fixNesting(s.content)});e.preformatted&&f.onPostProcess.add(function(t,s){s.content=s.content.replace(/^\s*<pre.*?>/,"");s.content=s.content.replace(/<\/pre>\s*$/,"");if(s.set)s.content='<pre class="mceItemHidden">'+s.content+"</pre>"});if(e.verify_css_classes)f.serializer.attribValueFilter=function(t,s){var x,y;if(t=="class"){if(!f.classesRE){y=
+f.dom.getClasses();if(y.length>0){x="";b(y,function(D){x+=(x?"|":"")+D["class"]});f.classesRE=RegExp("("+x+")","gi")}}return!f.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(s)||f.classesRE.test(s)?s:""}return s};if(e.cleanup_callback){f.onBeforeSetContent.add(function(t,s){s.content=f.execCallback("cleanup_callback","insert_to_editor",s.content,s)});f.onPreProcess.add(function(t,s){s.set&&f.execCallback("cleanup_callback","insert_to_editor_dom",s.node,s);s.get&&f.execCallback("cleanup_callback",
+"get_from_editor_dom",s.node,s)});f.onPostProcess.add(function(t,s){if(s.set)s.content=f.execCallback("cleanup_callback","insert_to_editor",s.content,s);if(s.get)s.content=f.execCallback("cleanup_callback","get_from_editor",s.content,s)})}e.save_callback&&f.onGetContent.add(function(t,s){if(s.save)s.content=f.execCallback("save_callback",f.id,s.content,f.getBody())});e.handle_event_callback&&f.onEvent.add(function(t,s,x){f.execCallback("handle_event_callback",s,t,x)===false&&q.cancel(s)});f.onSetContent.add(function(){f.addVisual(f.getBody())});
+e.padd_empty_editor&&f.onPostProcess.add(function(t,s){s.content=s.content.replace(/^(<p[^>]*>(&nbsp;|&#160;|\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/,"")});if(g){var n=function(t){b(t.dom.select("a"),function(s){var x=s.parentNode;t.dom.isBlock(x)&&x.lastChild===s&&t.dom.add(x,"br",{_mce_bogus:1})})};f.onExecCommand.add(function(t,s){s==="CreateLink"&&n(t)});f.onSetContent.add(f.selection.onSetContent.add(n));if(!e.readonly)try{c.designMode="Off";c.designMode="On"}catch(p){}}setTimeout(function(){if(!f.removed){f.load({initial:true,
+format:e.cleanup_on_startup?"html":"raw"});f.startContent=f.getContent({format:"raw"});f.initialized=true;f.onInit.dispatch(f);f.execCallback("setupcontent_callback",f.id,f.getBody(),f.getDoc());f.execCallback("init_instance_callback",f);f.focus(true);f.nodeChanged({initial:1});e.content_css&&m.each(v(e.content_css),function(t){f.dom.loadCSS(f.documentBaseURI.toAbsolute(t))});e.auto_focus&&setTimeout(function(){var t=m.get(e.auto_focus);t.selection.select(t.getBody(),1);t.selection.collapse(1);t.getWin().focus()},
+100)}},1)},focus:function(f){var e;e=this.settings.content_editable;var c,i=this.getDoc();if(!f){f=this.selection.getRng();if(f.item)c=f.item(0);e||this.getWin().focus();if(c&&c.ownerDocument==i){f=i.body.createControlRange();f.addElement(c);f.select()}}if(m.activeEditor!=this){if((e=m.activeEditor)!=null)e.onDeactivate.dispatch(e,this);this.onActivate.dispatch(this,e)}m._setActive(this)},execCallback:function(f){var e=this.settings[f],c;if(e){if(this.callbackLookup&&(c=this.callbackLookup[f])){e=
+c.func;c=c.scope}if(l(e,"string")){c=(c=e.replace(/\.\w+$/,""))?m.resolve(c):0;e=m.resolve(e);this.callbackLookup=this.callbackLookup||{};this.callbackLookup[f]={func:e,scope:c}}return e.apply(c||this,Array.prototype.slice.call(arguments,1))}},translate:function(f){var e=this.settings.language||"en",c=m.i18n;if(!f)return"";return c[e+"."+f]||f.replace(/{\#([^}]+)\}/g,function(i,a){return c[e+"."+a]||"{#"+a+"}"})},getLang:function(f,e){return m.i18n[(this.settings.language||"en")+"."+f]||(l(e)?e:"{#"+
+f+"}")},getParam:function(f,e,c){var i=m.trim;f=l(this.settings[f])?this.settings[f]:e;var a;if(c==="hash"){a={};if(l(f,"string"))b(f.indexOf("=")>0?f.split(/[;,](?![^=;,]*(?:[;,]|$))/):f.split(","),function(h){h=h.split("=");if(h.length>1)a[i(h[0])]=i(h[1]);else a[i(h[0])]=i(h)});else a=f;return a}return f},nodeChanged:function(f){var e=this.selection,c=(d?e.getNode():e.getStart())||this.getBody();if(this.initialized){f=f||{};c=d&&c.ownerDocument!=this.getDoc()?this.getBody():c;f.parents=[];this.dom.getParent(c,
+function(i){if(i.nodeName=="BODY")return true;f.parents.push(i)});this.onNodeChange.dispatch(this,f?f.controlManager||this.controlManager:this.controlManager,c,e.isCollapsed(),f)}},addButton:function(f,e){this.buttons=this.buttons||{};this.buttons[f]=e},addCommand:function(f,e,c){this.execCommands[f]={func:e,scope:c||this}},addQueryStateHandler:function(f,e,c){this.queryStateCommands[f]={func:e,scope:c||this}},addQueryValueHandler:function(f,e,c){this.queryValueCommands[f]={func:e,scope:c||this}},
+addShortcut:function(f,e,c,i){var a=this,h;if(!a.settings.custom_shortcuts)return false;a.shortcuts=a.shortcuts||{};if(l(c,"string")){h=c;c=function(){a.execCommand(h,false,null)}}if(l(c,"object")){h=c;c=function(){a.execCommand(h[0],h[1],h[2])}}b(v(f),function(n){var p={func:c,scope:i||this,desc:e,alt:false,ctrl:false,shift:false};b(v(n,"+"),function(t){switch(t){case "alt":case "ctrl":case "shift":p[t]=true;break;default:p.charCode=t.charCodeAt(0);p.keyCode=t.toUpperCase().charCodeAt(0)}});a.shortcuts[(p.ctrl?
+"ctrl":"")+","+(p.alt?"alt":"")+","+(p.shift?"shift":"")+","+p.keyCode]=p});return true},execCommand:function(f,e,c,i){var a=this,h=0,n;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(f)&&(!i||!i.skip_focus))a.focus();n={};a.onBeforeExecCommand.dispatch(a,f,e,c,n);if(n.terminate)return false;if(a.execCallback("execcommand_callback",a.id,a.selection.getNode(),f,e,c)){a.onExecCommand.dispatch(a,f,e,c,i);return true}if(n=a.execCommands[f]){n=n.func.call(n.scope,
+e,c);if(n!==true){a.onExecCommand.dispatch(a,f,e,c,i);return n}}b(a.plugins,function(p){if(p.execCommand&&p.execCommand(f,e,c)){a.onExecCommand.dispatch(a,f,e,c,i);h=1;return false}});if(h)return true;if(a.theme&&a.theme.execCommand&&a.theme.execCommand(f,e,c)){a.onExecCommand.dispatch(a,f,e,c,i);return true}if(m.GlobalCommands.execCommand(a,f,e,c)){a.onExecCommand.dispatch(a,f,e,c,i);return true}if(a.editorCommands.execCommand(f,e,c)){a.onExecCommand.dispatch(a,f,e,c,i);return true}a.getDoc().execCommand(f,
+e,c);a.onExecCommand.dispatch(a,f,e,c,i)},queryCommandState:function(f){var e;if(!this._isHidden()){if(e=this.queryStateCommands[f]){e=e.func.call(e.scope);if(e!==true)return e}e=this.editorCommands.queryCommandState(f);if(e!==-1)return e;try{return this.getDoc().queryCommandState(f)}catch(c){}}},queryCommandValue:function(f){var e;if(!this._isHidden()){if(e=this.queryValueCommands[f]){e=e.func.call(e.scope);if(e!==true)return e}e=this.editorCommands.queryCommandValue(f);if(l(e))return e;try{return this.getDoc().queryCommandValue(f)}catch(c){}}},
+show:function(){o.show(this.getContainer());o.hide(this.id);this.load()},hide:function(){var f=this.getDoc();d&&f&&f.execCommand("SelectAll");this.save();o.hide(this.getContainer());o.setStyle(this.id,"display",this.orgDisplay)},isHidden:function(){return!o.isHidden(this.id)},setProgressState:function(f,e,c){this.onSetProgressState.dispatch(this,f,e,c);return f},load:function(f){var e=this.getElement(),c;if(e){f=f||{};f.load=true;c=this.setContent(l(e.value)?e.value:e.innerHTML,f);f.element=e;f.no_events||
+this.onLoadContent.dispatch(this,f);f.element=null;return c}},save:function(f){var e=this,c=e.getElement(),i;if(c&&e.initialized){f=f||{};f.save=true;if(!f.no_events){e.undoManager.typing=0;e.undoManager.add()}f.element=c;i=f.content=e.getContent(f);f.no_events||e.onSaveContent.dispatch(e,f);i=f.content;if(/TEXTAREA|INPUT/i.test(c.nodeName))c.value=i;else{c.innerHTML=i;if(c=o.getParent(e.id,"form"))b(c.elements,function(a){if(a.name==e.id){a.value=i;return false}})}f.element=c=null;return i}},setContent:function(f,
+e){e=e||{};e.format=e.format||"html";e.set=true;e.content=f;e.no_events||this.onBeforeSetContent.dispatch(this,e);if(!m.isIE&&(f.length===0||/^\s+$/.test(f))){e.content=this.dom.setHTML(this.getBody(),'<br _mce_bogus="1" />');e.format="raw"}e.content=this.dom.setHTML(this.getBody(),m.trim(e.content));if(e.format!="raw"&&this.settings.cleanup){e.getInner=true;e.content=this.dom.setHTML(this.getBody(),this.serializer.serialize(this.getBody(),e))}e.no_events||this.onSetContent.dispatch(this,e);return e.content},
+getContent:function(f){var e;f=f||{};f.format=f.format||"html";f.get=true;f.no_events||this.onBeforeGetContent.dispatch(this,f);if(f.format!="raw"&&this.settings.cleanup){f.getInner=true;e=this.serializer.serialize(this.getBody(),f)}else e=this.getBody().innerHTML;e=e.replace(/^\s*|\s*$/g,"");f.content=e;f.no_events||this.onGetContent.dispatch(this,f);return f.content},isDirty:function(){return m.trim(this.startContent)!=m.trim(this.getContent({format:"raw",no_events:1}))&&!this.isNotDirty},getContainer:function(){if(!this.container)this.container=
+o.get(this.editorContainer||this.id+"_parent");return this.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return o.get(this.settings.content_element||this.id)},getWin:function(){var f;if(!this.contentWindow)if(f=o.get(this.id+"_ifr"))this.contentWindow=f.contentWindow;return this.contentWindow},getDoc:function(){var f;if(!this.contentDocument)if(f=this.getWin())this.contentDocument=f.document;return this.contentDocument},getBody:function(){return this.bodyElement||
+this.getDoc().body},convertURL:function(f,e,c){var i=this.settings;if(i.urlconverter_callback)return this.execCallback("urlconverter_callback",f,c,true,e);if(!i.convert_urls||c&&c.nodeName=="LINK"||f.indexOf("file:")===0)return f;if(i.relative_urls)return this.documentBaseURI.toRelative(f);return f=this.documentBaseURI.toAbsolute(f,i.remove_script_host)},addVisual:function(f){var e=this,c=e.settings;f=f||e.getBody();if(!l(e.hasVisual))e.hasVisual=c.visual;b(e.dom.select("table,a",f),function(i){var a;
+switch(i.nodeName){case "TABLE":a=e.dom.getAttrib(i,"border");if(!a||a=="0")e.hasVisual?e.dom.addClass(i,c.visual_table_class):e.dom.removeClass(i,c.visual_table_class);break;case "A":if(a=e.dom.getAttrib(i,"name"))e.hasVisual?e.dom.addClass(i,"mceItemAnchor"):e.dom.removeClass(i,"mceItemAnchor")}});e.onVisualAid.dispatch(e,f,e.hasVisual)},remove:function(){var f=this.getContainer();this.removed=1;this.hide();this.execCallback("remove_instance_callback",this);this.onRemove.dispatch(this);this.onExecCommand.listeners=
+[];m.remove(this);o.remove(f)},destroy:function(f){if(!this.destroyed){if(!f){m.removeUnload(this.destroy);tinyMCE.onBeforeUnload.remove(this._beforeUnload);this.theme&&this.theme.destroy&&this.theme.destroy();this.controlManager.destroy();this.selection.destroy();this.dom.destroy();if(!this.settings.content_editable){q.clear(this.getWin());q.clear(this.getDoc())}q.clear(this.getBody());q.clear(this.formElement)}if(this.formElement){this.formElement.submit=this.formElement._mceOldSubmit;this.formElement._mceOldSubmit=
+null}this.contentAreaContainer=this.formElement=this.container=this.settings.content_element=this.bodyElement=this.contentDocument=this.contentWindow=null;if(this.selection)this.selection=this.selection.win=this.selection.dom=this.selection.dom.doc=null;this.destroyed=1}},_addEvents:function(){function f(p,t){if(!e.removed)if(e.onEvent.dispatch(e,p,t)!==false)e[a[p.fakeType||p.type]].dispatch(e,p,t)}var e=this,c,i=e.settings,a={mouseup:"onMouseUp",mousedown:"onMouseDown",click:"onClick",keyup:"onKeyUp",
+keydown:"onKeyDown",keypress:"onKeyPress",submit:"onSubmit",reset:"onReset",contextmenu:"onContextMenu",dblclick:"onDblClick",paste:"onPaste"};b(a,function(p,t){switch(t){case "contextmenu":m.isOpera?e.dom.bind(e.getBody(),"mousedown",function(s){if(s.ctrlKey){s.fakeType="contextmenu";f(s)}}):e.dom.bind(e.getBody(),t,f);break;case "paste":e.dom.bind(e.getBody(),t,function(s){f(s)});break;case "submit":case "reset":e.dom.bind(e.getElement().form||o.getParent(e.id,"form"),t,f);break;default:e.dom.bind(i.content_editable?
+e.getBody():e.getDoc(),t,f)}});e.dom.bind(i.content_editable?e.getBody():g?e.getDoc():e.getWin(),"focus",function(){e.focus(true)});m.isGecko&&e.dom.bind(e.getDoc(),"DOMNodeInserted",function(p){var t;p=p.target;if(p.nodeType===1&&p.nodeName==="IMG"&&(t=p.getAttribute("_mce_src")))p.src=e.documentBaseURI.toAbsolute(t)});if(g){c=function(){var p=this.getDoc(),t=this.settings;if(g&&!t.readonly){if(this._isHidden())try{if(!t.content_editable)p.designMode="On"}catch(s){}try{p.execCommand("styleWithCSS",
+0,false)}catch(x){if(!this._isHidden())try{p.execCommand("useCSS",0,true)}catch(y){}}if(!t.table_inline_editing)try{p.execCommand("enableInlineTableEditing",false,false)}catch(D){}if(!t.object_resizing)try{p.execCommand("enableObjectResizing",false,false)}catch(B){}}};e.onBeforeExecCommand.add(c);e.onMouseDown.add(c)}m.isWebKit&&e.onClick.add(function(p,t){t=t.target;if(t.nodeName=="IMG"||t.nodeName=="A"&&e.dom.hasClass(t,"mceItemAnchor"))e.selection.getSel().setBaseAndExtent(t,0,t,1)});e.onMouseUp.add(e.nodeChanged);
+e.onKeyUp.add(function(p,t){var s=t.keyCode;if(s>=33&&s<=36||s>=37&&s<=40||s==13||s==45||s==46||s==8||m.isMac&&(s==91||s==93)||t.ctrlKey)e.nodeChanged()});e.onReset.add(function(){e.setContent(e.startContent,{format:"raw"})});if(i.custom_shortcuts){if(i.custom_undo_redo_keyboard_shortcuts){e.addShortcut("ctrl+z",e.getLang("undo_desc"),"Undo");e.addShortcut("ctrl+y",e.getLang("redo_desc"),"Redo")}e.addShortcut("ctrl+b",e.getLang("bold_desc"),"Bold");e.addShortcut("ctrl+i",e.getLang("italic_desc"),
+"Italic");e.addShortcut("ctrl+u",e.getLang("underline_desc"),"Underline");for(c=1;c<=6;c++)e.addShortcut("ctrl+"+c,"",["FormatBlock",false,"h"+c]);e.addShortcut("ctrl+7","",["FormatBlock",false,"<p>"]);e.addShortcut("ctrl+8","",["FormatBlock",false,"<div>"]);e.addShortcut("ctrl+9","",["FormatBlock",false,"<address>"]);var h=function(p){var t=null;if(!p.altKey&&!p.ctrlKey&&!p.metaKey)return t;b(e.shortcuts,function(s){if(!(m.isMac&&s.ctrl!=p.metaKey))if(!(!m.isMac&&s.ctrl!=p.ctrlKey))if(s.alt==p.altKey)if(s.shift==
+p.shiftKey)if(p.keyCode==s.keyCode||p.charCode&&p.charCode==s.charCode){t=s;return false}});return t};e.onKeyUp.add(function(p,t){if(h(t))return q.cancel(t)});e.onKeyPress.add(function(p,t){if(h(t))return q.cancel(t)});e.onKeyDown.add(function(p,t){var s=h(t);if(s){s.func.call(s.scope);return q.cancel(t)}})}if(m.isIE){e.dom.bind(e.getDoc(),"controlselect",function(p){var t=e.resizeInfo;p=p.target;if(p.nodeName==="IMG"){t&&e.dom.unbind(t.node,t.ev,t.cb);if(e.dom.hasClass(p,"mceItemNoResize")){ev="resizestart";
+t=e.dom.bind(p,"resizestart",q.cancel,q)}else{ev="resizeend";t=e.dom.bind(p,ev,function(s){var x;s=s.target;if(x=e.dom.getStyle(s,"width")){e.dom.setAttrib(s,"width",x.replace(/[^0-9%]+/g,""));e.dom.setStyle(s,"width","")}if(x=e.dom.getStyle(s,"height")){e.dom.setAttrib(s,"height",x.replace(/[^0-9%]+/g,""));e.dom.setStyle(s,"height","")}})}t=e.resizeInfo={node:p,ev:ev,cb:t}}});e.onKeyDown.add(function(p,t){switch(t.keyCode){case 8:if(e.selection.getRng().item){p.dom.remove(e.selection.getRng().item(0));
+return q.cancel(t)}}})}m.isOpera&&e.onClick.add(function(p,t){q.prevent(t)});if(i.custom_undo_redo){var n=function(){e.undoManager.typing=0;e.undoManager.add()};e.dom.bind(e.getDoc(),"focusout",function(){!e.removed&&e.undoManager.typing&&n()});e.onKeyUp.add(function(p,t){if(t.keyCode>=33&&t.keyCode<=36||t.keyCode>=37&&t.keyCode<=40||t.keyCode==13||t.keyCode==45||t.ctrlKey)n()});e.onKeyDown.add(function(p,t){var s,x,y,D;if(d&&t.keyCode==46){s=e.selection.getRng();if(s.parentElement){y=s.parentElement();
+x=s.duplicate();x.moveToElementText(y);x.setEndPoint("EndToEnd",s);D=x.text.length;if(t.ctrlKey){s.moveEnd("word",1);s.select()}e.selection.getSel().clear();if(s.parentElement()==y){try{y.innerHTML=y.innerHTML}catch(B){}x.moveToElementText(y);x.collapse();x.move("character",D);x.select()}t.preventDefault();return}}if(t.keyCode>=33&&t.keyCode<=36||t.keyCode>=37&&t.keyCode<=40||t.keyCode==13||t.keyCode==45)e.undoManager.typing&&n();else if(!e.undoManager.typing){e.undoManager.add();e.undoManager.typing=
+1}});e.onMouseDown.add(function(){e.undoManager.typing&&n()})}},_isHidden:function(){var f;if(!g)return 0;f=this.selection.getSel();return!f||!f.rangeCount||f.rangeCount==0},_fixNesting:function(f){var e=[],c;f=f.replace(/<(\/)?([^\s>]+)[^>]*?>/g,function(i,a,h){if(a==="/"){if(!e.length)return"";if(h!==e[e.length-1].tag){for(c=e.length-1;c>=0;c--)if(e[c].tag===h){e[c].close=1;break}return""}else{e.pop();if(e.length&&e[e.length-1].close){i=i+"</"+e[e.length-1].tag+">";e.pop()}}}else{if(/^(br|hr|input|meta|img|link|param)$/i.test(h))return i;
+if(/\/>$/.test(i))return i;e.push({tag:h})}return i});for(c=e.length-1;c>=0;c--)f+="</"+e[c].tag+">";return f}})})(tinymce);
+(function(m){var o=m.each,q=false;m.EditorCommands=function(k){function j(e){var c;e=e.toLowerCase();if(c=u.state[e])return c(e);return-1}function b(e,c){c=c||"exec";o(e,function(i,a){o(a.toLowerCase().split(","),function(h){u[c][h]=i})})}function g(e,c,i){if(c===void 0)c=q;if(i===void 0)i=null;return k.getDoc().execCommand(e,c,i)}function d(e,c){k.formatter.toggle(e,c?{value:c}:void 0)}var l=k.dom,r=k.selection,u={state:{},exec:{},value:{}},v=k.settings,f;m.extend(this,{execCommand:function(e,c,
+i){var a;e=e.toLowerCase();if(a=u.exec[e]){a(e,c,i);return true}return q},queryCommandState:j,queryCommandValue:function(e){var c;e=e.toLowerCase();if(c=u.value[e])return c(e);return q},addCommands:b});b({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){k.undoManager.add()},"Cut,Copy,Paste":function(e){var c=k.getDoc(),i;try{g(e)}catch(a){i=true}if(i||!c.queryCommandSupported(e))m.isGecko?k.windowManager.confirm(k.getLang("clipboard_msg"),function(h){h&&
+open("http://www.mozilla.org/editor/midasdemo/securityprefs.html","_blank")}):k.windowManager.alert(k.getLang("clipboard_no_support"))},unlink:function(e){r.isCollapsed()&&r.select(r.getNode());g(e);r.collapse(q)},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(e){var c=e.substring(7);o("left,center,right,full".split(","),function(i){c!=i&&k.formatter.remove("align"+i)});d("align"+c)},"InsertUnorderedList,InsertOrderedList":function(e){var c;g(e);if(e=l.getParent(r.getNode(),"ol,ul")){c=
+e.parentNode;if(/^(H[1-6]|P|ADDRESS|PRE)$/.test(c.nodeName)){f=r.getBookmark(void 0);l.split(c,e);r.moveToBookmark(f)}}},"Bold,Italic,Underline,Strikethrough":function(e){d(e)},"ForeColor,HiliteColor,FontName":function(e,c,i){d(e,i)},FontSize:function(e,c,i){var a;if(i>=1&&i<=7){a=m.explode(v.font_size_style_values);i=(c=m.explode(v.font_size_classes))?c[i-1]||i:a[i-1]||i}d(e,i)},RemoveFormat:function(e){k.formatter.remove(e)},mceBlockQuote:function(){d("blockquote")},FormatBlock:function(e,c,i){return d(i)},
+mceCleanup:function(){var e=r.getBookmark();k.setContent(k.getContent({cleanup:true}),{cleanup:true});r.moveToBookmark(e)},mceRemoveNode:function(e,c,i){e=i||r.getNode();if(e!=k.getBody()){f=r.getBookmark(void 0);k.dom.remove(e,true);r.moveToBookmark(f)}},mceSelectNodeDepth:function(e,c,i){var a=0;l.getParent(r.getNode(),function(h){if(h.nodeType==1&&a++==i){r.select(h);return q}},k.getBody())},mceSelectNode:function(e,c,i){r.select(i)},mceInsertContent:function(e,c,i){r.setContent(i)},mceInsertRawHTML:function(e,
+c,i){r.setContent("tiny_mce_marker");k.setContent(k.getContent().replace(/tiny_mce_marker/g,i))},mceSetContent:function(e,c,i){k.setContent(i)},"Indent,Outdent":function(e){var c,i,a;c=v.indentation;i=/[a-z%]+$/i.exec(c);c=parseInt(c);!j("InsertUnorderedList")&&!j("InsertOrderedList")?o(r.getSelectedBlocks(),function(h){if(e=="outdent"){a=Math.max(0,parseInt(h.style.paddingLeft||0)-c);l.setStyle(h,"paddingLeft",a?a+i:"")}else l.setStyle(h,"paddingLeft",parseInt(h.style.paddingLeft||0)+c+i)}):g(e)},
+mceRepaint:function(){if(m.isGecko)try{f=r.getBookmark(true);r.getSel()&&r.getSel().selectAllChildren(k.getBody());r.collapse(true);r.moveToBookmark(f)}catch(e){}},mceToggleFormat:function(e,c,i){k.formatter.toggle(i)},InsertHorizontalRule:function(){r.setContent("<hr />")},mceToggleVisualAid:function(){k.hasVisual=!k.hasVisual;k.addVisual()},mceReplaceContent:function(e,c,i){r.setContent(i.replace(/\{\$selection\}/g,r.getContent({format:"text"})))},mceInsertLink:function(e,c,i){e=l.getParent(r.getNode(),
+"a");if(m.is(i,"string"))i={href:i};if(e)i.href?l.setAttribs(e,i):k.dom.remove(e,true);else{g("CreateLink",q,"javascript:mctmp(0);");o(l.select("a[href=javascript:mctmp(0);]"),function(a){l.setAttribs(a,i)})}},selectAll:function(){var e=l.getRoot(),c=l.createRng();c.setStart(e,0);c.setEnd(e,e.childNodes.length);k.selection.setRng(c)}});b({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(e){e="align"+e.substring(7);return k.formatter.match(e)},"Bold,Italic,Underline,Strikethrough":function(e){return k.formatter.match(e)},
+mceBlockQuote:function(){return k.formatter.match("blockquote")},Outdent:function(){var e;if(v.inline_styles){if((e=l.getParent(r.getStart(),l.isBlock))&&parseInt(e.style.paddingLeft)>0)return true;if((e=l.getParent(r.getEnd(),l.isBlock))&&parseInt(e.style.paddingLeft)>0)return true}return j("InsertUnorderedList")||j("InsertOrderedList")||!v.inline_styles&&!!l.getParent(r.getNode(),"BLOCKQUOTE")},"InsertUnorderedList,InsertOrderedList":function(e){return l.getParent(r.getNode(),e=="insertunorderedlist"?
+"UL":"OL")}},"state");b({"FontSize,FontName":function(e){var c=0,i;if(i=l.getParent(r.getNode(),"span"))c=e=="fontsize"?i.style.fontSize:i.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase();return c}},"value");v.custom_undo_redo&&b({Undo:function(){k.undoManager.undo()},Redo:function(){k.undoManager.redo()}})}})(tinymce);
+(function(m){var o=m.util.Dispatcher;m.UndoManager=function(q){var k,j=0,b=[];return k={typing:0,onAdd:new o(k),onUndo:new o(k),onRedo:new o(k),add:function(g){var d;d=q.settings;var l;g=g||{};g.content=m.trim(q.getContent({format:"raw",no_events:1}));if((l=b[j])&&l.content==g.content)if(j>0||b.length==1)return null;if(d.custom_undo_redo_levels)if(b.length>d.custom_undo_redo_levels){for(d=0;d<b.length-1;d++)b[d]=b[d+1];b.length--;j=b.length}g.bookmark=q.selection.getBookmark(2,true);if(j<b.length-
+1)if(j==0)b=[];else b.length=j+1;b.push(g);j=b.length-1;k.onAdd.dispatch(k,g);q.isNotDirty=0;return g},undo:function(){var g;if(k.typing){k.add();k.typing=0}if(j>0){g=b[--j];q.setContent(g.content,{format:"raw"});q.selection.moveToBookmark(g.bookmark);k.onUndo.dispatch(k,g)}return g},redo:function(){var g;if(j<b.length-1){g=b[++j];q.setContent(g.content,{format:"raw"});q.selection.moveToBookmark(g.bookmark);k.onRedo.dispatch(k,g)}return g},clear:function(){b=[];j=k.typing=0},hasUndo:function(){return j>
+0||k.typing},hasRedo:function(){return j<b.length-1}}}})(tinymce);
+(function(m){function o(v,f){var e=f.ownerDocument.createRange();e.setStart(v.endContainer,v.endOffset);e.setEndAfter(f);return e.cloneContents().textContent.length==0}function q(v){v=v.innerHTML;v=v.replace(/<(img|hr|table|input|select|textarea)[ \>]/gi,"-");v=v.replace(/<[^>]+>/g,"");return v.replace(/[ \u00a0\t\r\n]+/g,"")==""}function k(v,f,e){var c;if(q(e)){c=f.getParent(e,"ul,ol");if(!f.getParent(c.parentNode,"ul,ol")){f.split(c,e);c=f.create("p",0,'<br _mce_bogus="1" />');f.replace(c,e);v.select(c,
+1)}return u}return r}var j=m.dom.Event,b=m.isIE,g=m.isGecko,d=m.isOpera,l=m.each,r=true,u=false;m.create("tinymce.ForceBlocks",{ForceBlocks:function(v){function f(a,h){if(d)h.content=h.content.replace(e.reOpera,"</"+i+">");h.content=h.content.replace(e.rePadd,"<"+i+"$1$2$3$4$5$6>\u00a0</"+i+">");if(!b&&!d&&h.set){h.content=h.content.replace(e.reNbsp2BR1,"<"+i+"$1$2><br /></"+i+">");h.content=h.content.replace(e.reNbsp2BR2,"<"+i+"$1$2><br /></"+i+">")}else h.content=h.content.replace(e.reBR2Nbsp,"<"+
+i+"$1$2>\u00a0</"+i+">")}var e=this,c=v.settings,i;e.editor=v;e.dom=v.dom;i=(c.forced_root_block||"p").toLowerCase();c.element=i.toUpperCase();v.onPreInit.add(e.setup,e);e.reOpera=RegExp("(\\u00a0|&#160;|&nbsp;)</"+i+">","gi");e.rePadd=RegExp("<p( )([^>]+)><\\/p>|<p( )([^>]+)\\/>|<p( )([^>]+)>\\s+<\\/p>|<p><\\/p>|<p\\/>|<p>\\s+<\\/p>".replace(/p/g,i),"gi");e.reNbsp2BR1=RegExp("<p( )([^>]+)>[\\s\\u00a0]+<\\/p>|<p>[\\s\\u00a0]+<\\/p>".replace(/p/g,i),"gi");e.reNbsp2BR2=RegExp("<%p()([^>]+)>(&nbsp;|&#160;)<\\/%p>|<%p>(&nbsp;|&#160;)<\\/%p>".replace(/%p/g,
+i),"gi");e.reBR2Nbsp=RegExp("<p( )([^>]+)>\\s*<br \\/>\\s*<\\/p>|<p>\\s*<br \\/>\\s*<\\/p>".replace(/p/g,i),"gi");v.onBeforeSetContent.add(f);v.onPostProcess.add(f);if(c.forced_root_block){v.onInit.add(e.forceRoots,e);v.onSetContent.add(e.forceRoots,e);v.onBeforeGetContent.add(e.forceRoots,e)}},setup:function(){var v=this,f=v.editor,e=f.settings,c=f.dom,i=f.selection;if(e.forced_root_block){f.onBeforeExecCommand.add(v.forceRoots,v);f.onKeyUp.add(v.forceRoots,v);f.onPreProcess.add(v.forceRoots,v)}e.force_br_newlines&&
+b&&f.onKeyPress.add(function(a,h){var n;if(h.keyCode==13&&i.getNode().nodeName!="LI"){i.setContent('<br id="__" /> ',{format:"raw"});n=c.get("__");n.removeAttribute("id");i.select(n);i.collapse();return j.cancel(h)}});if(e.force_p_newlines){if(b){m.addUnload(function(){v._previousFormats=0});f.onKeyPress.add(function(a,h){v._previousFormats=0;if(h.keyCode==13&&!h.shiftKey&&a.selection.isCollapsed()&&e.keep_styles){var n;var p=a.selection.getStart(),t,s,x;do if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(p.nodeName)){if(t){s=
+p.cloneNode(false);s.appendChild(t);t=s}else t=x=p.cloneNode(false);t.removeAttribute("id")}while(p=p.parentNode);if(t)n={wrapper:t,inner:x};v._previousFormats=n}});f.onKeyUp.add(function(a,h){if(h.keyCode==13&&!h.shiftKey){var n=a.selection.getStart(),p=v._previousFormats;if(!n.hasChildNodes())if(n=c.getParent(n,c.isBlock)){n.innerHTML="";if(v._previousFormats){n.appendChild(p.wrapper);p.inner.innerHTML="\ufeff"}else n.innerHTML="\ufeff";i.select(n,1);a.getDoc().execCommand("Delete",false,null)}}})}else f.onKeyPress.add(function(a,
+h){h.keyCode==13&&!h.shiftKey&&!v.insertPara(h)&&j.cancel(h)});g&&f.onKeyDown.add(function(a,h){if((h.keyCode==8||h.keyCode==46)&&!h.shiftKey)v.backspaceDelete(h,h.keyCode==8)})}m.isWebKit&&f.onKeyPress.add(function(a,h){if(h.keyCode==13&&(h.shiftKey||e.force_br_newlines&&!c.getParent(i.getNode(),"h1,h2,h3,h4,h5,h6,ol,ul"))){var n=i.getRng(),p,t=c.create("div",null," "),s=c.getViewPort(a.getWin()).h;n.insertNode(p=c.create("br"));n.setStartAfter(p);n.setEndAfter(p);i.setRng(n);if(i.getSel().focusNode==
+p.previousSibling){i.select(c.insertAfter(c.doc.createTextNode("\u00a0"),p));i.collapse(r)}c.insertAfter(t,p);n=c.getPos(t).y;c.remove(t);n>s&&a.getWin().scrollTo(0,n);j.cancel(h)}});f.onPreProcess.add(function(a,h){l(c.select("p,h1,h2,h3,h4,h5,h6,div",h.node),function(n){q(n)&&l(c.select("span,em,strong,b,i",h.node),function(p){if(!p.hasChildNodes()){p.appendChild(a.getDoc().createTextNode("\u00a0"));return u}})})});if(b)if(e.element!="P"){f.onKeyPress.add(function(){v.lastElm=i.getNode().nodeName});
+f.onKeyUp.add(function(a,h){var n;n=i.getNode();if(a.getBody().childNodes.length===1&&n.nodeName=="P"){n=c.rename(n,e.element);i.select(n);i.collapse();a.nodeChanged()}else if(h.keyCode==13&&!h.shiftKey&&v.lastElm!="P")if(n=c.getParent(n,"p")){c.rename(n,e.element);a.nodeChanged()}})}},find:function(v,f,e){for(var c=this.editor.getDoc().createTreeWalker(v,4,null,u),i=-1;v=c.nextNode();){i++;if(f==0&&v==e)return i;if(f==1&&i==e)return v}return-1},forceRoots:function(v){v=this.editor;var f=v.getBody(),
+e=v.getDoc(),c=v.selection,i=c.getSel(),a=c.getRng(),h=-2,n,p,t,s,x,y=f.childNodes,D,B,M;for(D=y.length-1;D>=0;D--){x=y[D];if(x.nodeType===1&&x.getAttribute("_mce_type"))s=null;else if(x.nodeType===3||!this.dom.isBlock(x)&&x.nodeType!==8&&!/^(script|mce:script|style|mce:style)$/i.test(x.nodeName))if(s)s.hasChildNodes()?s.insertBefore(x,s.firstChild):s.appendChild(x);else{if(x.nodeType!=3||/[^\s]/g.test(x.nodeValue)){if(h==-2&&a)if(b){if(a.item){s=e.body.createTextRange();s.moveToElementText(a.item(0));
+a=s}s=e.body.createTextRange();s.moveToElementText(f);s.collapse(1);h=s.move("character",-16777215)*-1;s=a.duplicate();s.collapse(1);n=s.move("character",-16777215)*-1;s=a.duplicate();s.collapse(0);s=s.move("character",-16777215)*-1-n;h=n-h;n=s}else if(a.startContainer.nodeType==1&&(B=a.startContainer.childNodes[a.startOffset])&&B.nodeType==1){M=B.getAttribute("id");B.setAttribute("id","__mce")}else if(v.dom.getParent(a.startContainer,function(C){return C===f})){p=a.startOffset;t=a.endOffset;h=this.find(f,
+0,a.startContainer);n=this.find(f,0,a.endContainer)}s=v.dom.create(v.settings.forced_root_block);x.parentNode.replaceChild(s,x);s.appendChild(x)}}else s=null}if(h!=-2)if(b)try{a=i.createRange();a.moveToElementText(f);a.collapse(1);a.moveStart("character",h);a.moveEnd("character",n);a.select()}catch(X){}else{s=f.getElementsByTagName(v.settings.element)[0];a=e.createRange();h!=-1?a.setStart(this.find(f,1,h),p):a.setStart(s,0);n!=-1?a.setEnd(this.find(f,1,n),t):a.setEnd(s,0);if(i){i.removeAllRanges();
+i.addRange(a)}}else if(!b&&(B=v.dom.get("__mce"))){M?B.setAttribute("id",M):B.removeAttribute("id");a=e.createRange();a.setStartBefore(B);a.setEndBefore(B);c.setRng(a)}},getParentBlock:function(v){var f=this.dom;return f.getParent(v,f.isBlock)},insertPara:function(){function v(V,aa){var ea=[],Z,z;V.innerHTML="";if(i.keep_styles){z=aa;do if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(z.nodeName)){Z=z.cloneNode(u);e.setAttrib(Z,"id","");ea.push(Z)}while(z=z.parentNode)}if(ea.length>0){z=ea.length-1;
+for(Z=V;z>=0;z--)Z=Z.appendChild(ea[z]);ea[0].innerHTML=d?"&nbsp;":"<br />";return ea[0]}else V.innerHTML=d?"&nbsp;":"<br />"}var f=this.editor,e=f.dom,c=f.getDoc(),i=f.settings,a=f.selection.getSel(),h=a.getRangeAt(0),n=c.body,p,t,s,x,y,D,B,M,X,C,E,A,K=e.getViewPort(f.getWin()),H;p=c.createRange();p.setStart(a.anchorNode,a.anchorOffset);p.collapse(r);t=c.createRange();t.setStart(a.focusNode,a.focusOffset);t.collapse(r);x=(s=p.compareBoundaryPoints(p.START_TO_END,t)<0)?a.anchorNode:a.focusNode;y=
+s?a.anchorOffset:a.focusOffset;D=s?a.focusNode:a.anchorNode;s=s?a.focusOffset:a.anchorOffset;if(x===D&&/^(TD|TH)$/.test(x.nodeName)){x.firstChild.nodeName=="BR"&&e.remove(x.firstChild);if(x.childNodes.length==0)f.dom.add(x,i.element,null,"<br />");else{A=x.innerHTML;x.innerHTML="";f.dom.add(x,i.element,null,A)}M=f.dom.add(x,i.element,null,"<br />");h=c.createRange();h.selectNodeContents(M);h.collapse(1);f.selection.setRng(h);return u}if(x==n&&D==n&&n.firstChild&&f.dom.isBlock(n.firstChild)){x=D=x.firstChild;
+y=s=0;p=c.createRange();p.setStart(x,0);t=c.createRange();t.setStart(D,0)}x=x.nodeName=="HTML"?c.body:x;x=x.nodeName=="BODY"?x.firstChild:x;D=D.nodeName=="HTML"?c.body:D;D=D.nodeName=="BODY"?D.firstChild:D;B=this.getParentBlock(x);M=this.getParentBlock(D);X=B?B.nodeName:i.element;if(A=this.dom.getParent(B,"li,pre")){if(A.nodeName=="LI")return k(f.selection,this.dom,A);return r}if(B&&(B.nodeName=="CAPTION"||/absolute|relative|fixed/gi.test(e.getStyle(B,"position",1)))){X=i.element;B=null}if(M&&(M.nodeName==
+"CAPTION"||/absolute|relative|fixed/gi.test(e.getStyle(B,"position",1)))){X=i.element;M=null}if(/(TD|TABLE|TH|CAPTION)/.test(X)||B&&X=="DIV"&&/left|right/gi.test(e.getStyle(B,"float",1))){X=i.element;B=M=null}C=B&&B.nodeName==X?B.cloneNode(0):f.dom.create(X);M=M&&M.nodeName==X?M.cloneNode(0):f.dom.create(X);M.removeAttribute("id");if(/^(H[1-6])$/.test(X)&&o(h,B))M=f.dom.create(i.element);A=B=x;do{if(A==n||A.nodeType==9||this.dom.isBlock(A)||/(TD|TABLE|TH|CAPTION)/.test(A.nodeName))break;B=A}while(A=
+A.previousSibling?A.previousSibling:A.parentNode);A=E=D;do{if(A==n||A.nodeType==9||this.dom.isBlock(A)||/(TD|TABLE|TH|CAPTION)/.test(A.nodeName))break;E=A}while(A=A.nextSibling?A.nextSibling:A.parentNode);B.nodeName==X?p.setStart(B,0):p.setStartBefore(B);p.setEnd(x,y);C.appendChild(p.cloneContents()||c.createTextNode(""));try{t.setEndAfter(E)}catch(W){}t.setStart(D,s);M.appendChild(t.cloneContents()||c.createTextNode(""));h=c.createRange();if(!B.previousSibling&&B.parentNode.nodeName==X)h.setStartBefore(B.parentNode);
+else p.startContainer.nodeName==X&&p.startOffset==0?h.setStartBefore(p.startContainer):h.setStart(p.startContainer,p.startOffset);!E.nextSibling&&E.parentNode.nodeName==X?h.setEndAfter(E.parentNode):h.setEnd(t.endContainer,t.endOffset);h.deleteContents();d&&f.getWin().scrollTo(0,K.y);if(C.firstChild&&C.firstChild.nodeName==X)C.innerHTML=C.firstChild.innerHTML;if(M.firstChild&&M.firstChild.nodeName==X)M.innerHTML=M.firstChild.innerHTML;if(q(C))C.innerHTML="<br />";if(q(M))H=v(M,D);if(d&&parseFloat(opera.version())<
+9.5){h.insertNode(C);h.insertNode(M)}else{h.insertNode(M);h.insertNode(C)}M.normalize();C.normalize();h=c.createRange();h.selectNodeContents(g?c.createTreeWalker(H||M,NodeFilter.SHOW_TEXT,null,u).nextNode()||H||M:H||M);h.collapse(1);a.removeAllRanges();a.addRange(h);c=f.dom.getPos(M).y;a=M.clientHeight;if(c<K.y||c+a>K.y+K.h)f.getWin().scrollTo(0,c<K.y?c:c-K.h+25);return u},backspaceDelete:function(v,f){var e=this.editor,c=e.getBody(),i,a=e.selection,h=a.getRng(),n=h.startContainer,p;if(!f&&h.collapsed&&
+n.nodeType==1&&h.startOffset==n.childNodes.length){p=new m.dom.TreeWalker(n.lastChild,n);for(i=n.lastChild;i;i=p.prev())if(i.nodeType==3){h.setStart(i,i.nodeValue.length);h.collapse(true);a.setRng(h);return}}if(n&&e.dom.isBlock(n)&&!/^(TD|TH)$/.test(n.nodeName)&&f)if(n.childNodes.length==0||n.childNodes.length==1&&n.firstChild.nodeName=="BR"){for(i=n;(i=i.previousSibling)&&!e.dom.isBlock(i););if(i){if(n!=c.firstChild){for(c=e.dom.doc.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,u);h=c.nextNode();)i=
+h;h=e.getDoc().createRange();h.setStart(i,i.nodeValue?i.nodeValue.length:0);h.setEnd(i,i.nodeValue?i.nodeValue.length:0);a.setRng(h);e.dom.remove(n)}return j.cancel(v)}}}})})(tinymce);
+(function(m){var o=m.dom.Event,q=m.each,k=m.extend;m.create("tinymce.ControlManager",{ControlManager:function(j,b){var g=this;b=b||{};g.editor=j;g.controls={};g.onAdd=new m.util.Dispatcher(g);g.onPostRender=new m.util.Dispatcher(g);g.prefix=b.prefix||j.id+"_";g._cls={};g.onPostRender.add(function(){q(g.controls,function(d){d.postRender()})})},get:function(j){return this.controls[this.prefix+j]||this.controls[j]},setActive:function(j,b){var g=null;if(g=this.get(j))g.setActive(b);return g},setDisabled:function(j,
+b){var g=null;if(g=this.get(j))g.setDisabled(b);return g},add:function(j){if(j){this.controls[j.id]=j;this.onAdd.dispatch(j,this)}return j},createControl:function(j){var b,g=this,d=g.editor;q(d.plugins,function(l){if(l.createControl)if(b=l.createControl(j,g))return false});switch(j){case "|":case "separator":return g.createSeparator()}if(!b&&d.buttons&&(b=d.buttons[j]))return g.createButton(j,b);return g.add(b)},createDropMenu:function(j,b,g){var d=this.editor,l,r,u;b=k({"class":"mceDropDown",constrain:d.settings.constrain_menus},
+b);b["class"]=b["class"]+" "+d.getParam("skin")+"Skin";if(u=d.getParam("skin_variant"))b["class"]+=" "+d.getParam("skin")+"Skin"+u.substring(0,1).toUpperCase()+u.substring(1);j=this.prefix+j;l=this.controls[j]=new (g||this._cls.dropmenu||m.ui.DropMenu)(j,b);l.onAddItem.add(function(v,f){var e=f.settings;e.title=d.getLang(e.title,e.title);if(!e.onclick)e.onclick=function(){if(e.cmd)d.execCommand(e.cmd,e.ui||false,e.value)}});d.onRemove.add(function(){l.destroy()});if(m.isIE){l.onShowMenu.add(function(){d.focus();
+r=d.selection.getBookmark(1)});l.onHideMenu.add(function(){if(r){d.selection.moveToBookmark(r);r=0}})}return this.add(l)},createListBox:function(j,b,g){var d=this.editor;if(this.get(j))return null;b.title=d.translate(b.title);b.scope=b.scope||d;if(!b.onselect)b.onselect=function(l){d.execCommand(b.cmd,b.ui||false,l||b.value)};b=k({title:b.title,"class":"mce_"+j,scope:b.scope,control_manager:this},b);j=this.prefix+j;if(d.settings.use_native_selects)g=new m.ui.NativeListBox(j,b);else{g=g||this._cls.listbox||
+m.ui.ListBox;g=new g(j,b)}this.controls[j]=g;m.isWebKit&&g.onPostRender.add(function(l,r){o.add(r,"mousedown",function(){d.bookmark=d.selection.getBookmark(1)});o.add(r,"focus",function(){d.selection.moveToBookmark(d.bookmark);d.bookmark=null})});g.hideMenu&&d.onMouseDown.add(g.hideMenu,g);return this.add(g)},createButton:function(j,b,g){var d=this.editor;if(this.get(j))return null;b.title=d.translate(b.title);b.label=d.translate(b.label);b.scope=b.scope||d;if(!b.onclick&&!b.menu_button)b.onclick=
+function(){d.execCommand(b.cmd,b.ui||false,b.value)};b=k({title:b.title,"class":"mce_"+j,unavailable_prefix:d.getLang("unavailable",""),scope:b.scope,control_manager:this},b);j=this.prefix+j;if(b.menu_button){g=g||this._cls.menubutton||m.ui.MenuButton;j=new g(j,b);d.onMouseDown.add(j.hideMenu,j)}else{g=this._cls.button||m.ui.Button;j=new g(j,b)}return this.add(j)},createMenuButton:function(j,b,g){b=b||{};b.menu_button=1;return this.createButton(j,b,g)},createSplitButton:function(j,b,g){var d=this.editor;
+if(this.get(j))return null;b.title=d.translate(b.title);b.scope=b.scope||d;if(!b.onclick)b.onclick=function(l){d.execCommand(b.cmd,b.ui||false,l||b.value)};if(!b.onselect)b.onselect=function(l){d.execCommand(b.cmd,b.ui||false,l||b.value)};b=k({title:b.title,"class":"mce_"+j,scope:b.scope,control_manager:this},b);j=this.prefix+j;j=this.add(new (g||this._cls.splitbutton||m.ui.SplitButton)(j,b));d.onMouseDown.add(j.hideMenu,j);return j},createColorSplitButton:function(j,b,g){var d=this.editor,l,r;if(this.get(j))return null;
+b.title=d.translate(b.title);b.scope=b.scope||d;if(!b.onclick)b.onclick=function(u){if(m.isIE)r=d.selection.getBookmark(1);d.execCommand(b.cmd,b.ui||false,u||b.value)};if(!b.onselect)b.onselect=function(u){d.execCommand(b.cmd,b.ui||false,u||b.value)};b=k({title:b.title,"class":"mce_"+j,menu_class:d.getParam("skin")+"Skin",scope:b.scope,more_colors_title:d.getLang("more_colors")},b);j=this.prefix+j;l=new (g||this._cls.colorsplitbutton||m.ui.ColorSplitButton)(j,b);d.onMouseDown.add(l.hideMenu,l);d.onRemove.add(function(){l.destroy()});
+if(m.isIE){l.onShowMenu.add(function(){d.focus();r=d.selection.getBookmark(1)});l.onHideMenu.add(function(){if(r){d.selection.moveToBookmark(r);r=0}})}return this.add(l)},createToolbar:function(j,b,g){j=this.prefix+j;b=new (g||this._cls.toolbar||m.ui.Toolbar)(j,b);if(this.get(j))return null;return this.add(b)},createSeparator:function(j){return new (j||this._cls.separator||m.ui.Separator)},setControlType:function(j,b){return this._cls[j.toLowerCase()]=b},destroy:function(){q(this.controls,function(j){j.destroy()});
+this.controls=null}})})(tinymce);
+(function(m){var o=m.util.Dispatcher,q=m.each,k=m.isIE,j=m.isOpera;m.create("tinymce.WindowManager",{WindowManager:function(b){this.editor=b;this.onOpen=new o(this);this.onClose=new o(this);this.params={};this.features={}},open:function(b,g){var d="",l=this.editor.settings.dialog_type=="modal",r,u,v;v=m.DOM.getViewPort();b=b||{};g=g||{};u=j?v.w:screen.width;v=j?v.h:screen.height;b.name=b.name||"mc_"+(new Date).getTime();b.width=parseInt(b.width||320);b.height=parseInt(b.height||240);b.resizable=true;
+b.left=b.left||parseInt(u/2)-b.width/2;b.top=b.top||parseInt(v/2)-b.height/2;g.inline=false;g.mce_width=b.width;g.mce_height=b.height;g.mce_auto_focus=b.auto_focus;if(l)if(k){b.center=true;b.help=false;b.dialogWidth=b.width+"px";b.dialogHeight=b.height+"px";b.scroll=b.scrollbars||false}q(b,function(e,c){if(m.is(e,"boolean"))e=e?"yes":"no";/^(name|url)$/.test(c)||(d+=k&&l?(d?";":"")+c+":"+e:(d?",":"")+c+"="+e)});this.features=b;this.params=g;this.onOpen.dispatch(this,b,g);u=b.url||b.file;u=m._addVer(u);
+try{if(k&&l){r=1;window.showModalDialog(u,window,d)}else r=window.open(u,b.name,d)}catch(f){}r||alert(this.editor.getLang("popup_blocked"))},close:function(b){b.close();this.onClose.dispatch(this)},createInstance:function(b,g,d,l,r,u){return new (m.resolve(b))(g,d,l,r,u)},confirm:function(b,g,d,l){l=l||window;g.call(d||this,l.confirm(this._decode(this.editor.getLang(b,b))))},alert:function(b,g,d,l){l=l||window;l.alert(this._decode(this.editor.getLang(b,b)));if(g)g.call(d||this)},resizeBy:function(b,
+g,d){d.resizeBy(b,g)},_decode:function(b){return m.DOM.decode(b).replace(/\\n/g,"\n")}})})(tinymce);
+(function(m){m.GlobalCommands=new function(){function o(b,g,d,l){if(typeof g=="string")g=[g];m.each(g,function(r){b[r.toLowerCase()]={func:d,scope:l}})}var q={},k={},j={};m.extend(this,{add:function(b,g,d){o(q,b,g,d)},addQueryStateHandler:function(b,g,d){o(k,b,g,d)},addQueryValueHandler:function(b,g,d){o(j,b,g,d)},execCommand:function(b,g,d,l,r){if(g=q[g.toLowerCase()])if(g.func.call(b||g.scope,d,l,r)!==false)return true},queryCommandValue:function(){if(cmd=j[cmd.toLowerCase()])return cmd.func.call(scope||
+cmd.scope,ui,value,args)},queryCommandState:function(){if(cmd=k[cmd.toLowerCase()])return cmd.func.call(scope||cmd.scope,ui,value,args)}})}})(tinymce);
+(function(m){m.Formatter=function(o){function q(z){return z.nodeType===1&&(z.face==="mceinline"||z.style.fontFamily==="mceinline")}function k(z){return z?y[z]:y}function j(z,F){if(z)if(typeof z!=="string")D(z,function(G,I){j(I,G)});else{F=F.length?F:[F];D(F,function(G){if(G.deep===ea)G.deep=!G.selector;if(G.split===ea)G.split=!G.selector||G.inline;if(G.remove===ea&&G.selector&&!G.inline)G.remove="none";if(G.selector&&G.inline){G.mixed=true;G.block_expand=true}if(typeof G.classes==="string")G.classes=
+G.classes.split(/\s+/)});y[z]=F}}function b(z,F,G){function I(O){var P=O.startContainer,J=O.startOffset;if(P.nodeType==1||P.nodeValue==="")if(P=P.nodeType==1?P.childNodes[J]:P){P=new X(P,P.parentNode);for(J=P.current();J;J=P.next())if(J.nodeType==3&&!e(J)){O.setStart(J,0);break}}return O}function T(O,P){P=P||N;if(O){D(P.styles,function(J,Q){B.setStyle(O,Q,f(J,F))});D(P.attributes,function(J,Q){B.setAttrib(O,Q,f(J,F))});D(P.classes,function(J){J=f(J,F);B.hasClass(O,J)||B.addClass(O,J)})}}function L(O){var P=
+[],J,Q;J=N.inline||N.block;Q=B.create(J);T(Q);C.walk(O,function(R){function ca(Y){var ba=Y.nodeName.toLowerCase(),da=Y.parentNode.nodeName.toLowerCase(),fa;if(u(ba,"br")){$=0;N.block&&B.remove(Y)}else if(N.wrapper&&d(Y,z,F))$=0;else if(N.block&&!N.wrapper&&/^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(ba)){Y=B.rename(Y,J);T(Y);P.push(Y);$=0}else{if(N.selector){D(U,function(ga){if(B.is(Y,ga.selector)&&!q(Y)){T(Y,ga);fa=true}});if(!N.inline||fa){$=0;return}}if(E(J,ba)&&E(da,J)){if(!$){$=Q.cloneNode(V);
+Y.parentNode.insertBefore($,Y);P.push($)}$.appendChild(Y)}else{$=0;D(m.grep(Y.childNodes),ca);$=0}}}var $;D(R,ca)});D(P,function(R){function ca(Y){var ba,da;D(Y.childNodes,function(fa){if(fa.nodeType==1&&!p(fa)&&!q(fa)){ba=fa;return V}});if(ba&&r(ba,N)){da=ba.cloneNode(V);T(da);B.replace(da,Y,aa);B.remove(ba,1)}return da||Y}var $;$=function(Y){var ba=0;D(Y.childNodes,function(da){!e(da)&&!p(da)&&ba++});return ba}(R);if($===0)B.remove(R,1);else if(N.inline||N.wrapper){if(!N.exact&&$===1)R=ca(R);D(U,
+function(Y){D(B.select(Y.inline,R),function(ba){a(Y,F,ba,Y.exact?ba:null)})});if(d(R.parentNode,z,F)){B.remove(R,1);R=0;return aa}N.merge_with_parents&&B.getParent(R.parentNode,function(Y){if(d(Y,z,F)){B.remove(R,1);R=0;return aa}});if(R){R=t(n(R),R);R=t(R,n(R,aa))}}})}var U=k(z),N=U[0],S;if(N)if(G){S=B.createRng();S.setStartBefore(G);S.setEndAfter(G);L(i(S,U))}else if(!M.isCollapsed()||!N.inline){G=M.getBookmark();L(i(M.getRng(aa),U));M.moveToBookmark(G);M.setRng(I(M.getRng(aa)));o.nodeChanged()}else x("apply",
+z,F)}function g(z,F,G){function I(J){var Q,R,ca;Q=m.grep(J.childNodes);R=0;for(ca=S.length;R<ca;R++)if(a(S[R],F,J,J))break;if(O.deep){R=0;for(ca=Q.length;R<ca;R++)I(Q[R])}}function T(J){var Q;D(B.getParents(J.parentNode,void 0,B.getRoot()).reverse(),function(R){var ca;if(!Q&&R.id!="_start"&&R.id!="_end")if((ca=d(R,z,F))&&ca.split!==false)Q=R});return Q}function L(J,Q,R,ca){var $,Y,ba,da,fa,ga;if(J){ga=J.parentNode;for($=Q.parentNode;$&&$!=ga;$=$.parentNode){Y=$.cloneNode(V);for(fa=0;fa<S.length;fa++)if(a(S[fa],
+F,Y,Y)){Y=0;break}if(Y){ba&&Y.appendChild(ba);da||(da=Y);ba=Y}}if(ca&&(!O.mixed||!A(J)))Q=B.split(J,Q);if(ba){R.parentNode.insertBefore(ba,R);da.appendChild(R)}}return Q}function U(J){var Q=B.get(J?"_start":"_end"),R=Q[J?"firstChild":"lastChild"];if(p(R))R=R[J?"firstChild":"lastChild"];B.remove(Q,true);return R}function N(J){var Q,R;J=i(J,S,aa);if(O.split){Q=s(J,aa);R=s(J);if(Q!=R){Q=c(Q,"span",{id:"_start",_mce_type:"bookmark"});R=c(R,"span",{id:"_end",_mce_type:"bookmark"});L(T(Q),Q,Q,true);L(T(R),
+R,R,true);Q=U(aa);R=U()}else Q=R=L(T(Q),Q,Q,true);J.startContainer=Q.parentNode;J.startOffset=H(Q);J.endContainer=R.parentNode;J.endOffset=H(R)+1}C.walk(J,function(ca){D(ca,function($){I($)})})}var S=k(z),O=S[0],P;if(G){P=B.createRng();P.setStartBefore(G);P.setEndAfter(G);N(P)}else if(!M.isCollapsed()||!O.inline){G=M.getBookmark();N(M.getRng(aa));M.moveToBookmark(G);o.nodeChanged()}else x("remove",z,F)}function d(z,F,G,I){function T(N,S,O){var P,J,Q=S[O];if(Q)if(Q.length===ea)for(P in Q){if(Q.hasOwnProperty(P)){J=
+O==="attributes"?B.getAttrib(N,P):v(N,P);if(I&&!J&&!S.exact)return;if((!I||S.exact)&&!u(J,f(Q[P],G)))return}}else for(P=0;P<Q.length;P++)if(O==="attributes"?B.getAttrib(N,Q[P]):v(N,Q[P]))break;return S}var L=k(F),U;if(L&&z)for(U=0;U<L.length;U++){F=L[U];if(r(z,F)&&T(z,F,"attributes")&&T(z,F,"styles")){if(L=F.classes)for(U=0;U<L.length;U++)if(!B.hasClass(z,L[U]))return;return F}}}function l(z,F,G){function I(L){L=B.getParent(L,function(U){return!!d(U,z,F,true)});return d(L,z,F)}var T;if(G)return I(G);
+if(M.isCollapsed()){for(G=Z.apply.length-1;G>=0;G--)if(Z.apply[G].name==z)return true;for(G=Z.remove.length-1;G>=0;G--)if(Z.remove[G].name==z)return false;return I(M.getNode())}G=M.getNode();if(I(G))return aa;T=M.getStart();if(T!=G)if(I(T))return aa;return V}function r(z,F){if(u(z,F.inline))return aa;if(u(z,F.block))return aa;if(F.selector)return B.is(z,F.selector)}function u(z,F){z=z||"";F=F||"";z=""+(z.nodeName||z);F=""+(F.nodeName||F);return z.toLowerCase()==F.toLowerCase()}function v(z,F){var G=
+B.getStyle(z,F);if(F=="color"||F=="backgroundColor")G=B.toHex(G);if(F=="fontWeight"&&G==700)G="bold";return""+G}function f(z,F){if(typeof z!="string")z=z(F);else if(F)z=z.replace(/%(\w+)/g,function(G,I){return F[I]||G});return z}function e(z){return z&&z.nodeType===3&&/^([\s\r\n]+|)$/.test(z.nodeValue)}function c(z,F,G){F=B.create(F,G);z.parentNode.insertBefore(F,z);F.appendChild(z);return F}function i(z,F){function G(O,P,J,Q){var R;for(Q=Q||B.getRoot();;){R=O.parentNode;if(R==Q||!F[0].block_expand&&
+A(R))break;for(N=R[P];N&&N!=O;N=N[J]){if(N.nodeType==1&&!p(N))return O;if(N.nodeType==3&&!e(N))return O}O=O.parentNode}return O}var I=z.startContainer,T=z.startOffset,L=z.endContainer,U=z.endOffset,N,S;if(I.nodeType==1&&I.hasChildNodes()){S=I.childNodes.length-1;I=I.childNodes[T>S?S:T];if(I.nodeType==3)T=0}if(L.nodeType==1&&L.hasChildNodes()){S=L.childNodes.length-1;L=L.childNodes[U>S?S:U-1];if(L.nodeType==3)U=L.nodeValue.length}if(p(I.parentNode))I=I.parentNode;if(p(I))I=I.nextSibling||I;if(p(L.parentNode))L=
+L.parentNode;if(p(L))L=L.previousSibling||L;if(F[0].inline||F[0].block_expand){I=G(I,"firstChild","nextSibling");L=G(L,"lastChild","previousSibling")}if(F[0].selector&&F[0].expand!==V&&!F[0].inline){S=function(O,P){var J,Q,R;if(O.nodeType==3&&O.nodeValue.length==0&&O[P])O=O[P];J=B.getParents(O,void 0,B.getRoot());for(Q=0;Q<J.length;Q++)for(R=0;R<F.length;R++)if(B.is(J[Q],F[R].selector))return J[Q];return O};I=S(I,"previousSibling");L=S(L,"nextSibling")}if(F[0].block||F[0].selector){S=function(O,P){var J;
+F[0].wrapper||(J=B.getParent(O,F[0].block));J||(J=B.getParent(O.nodeType==3?O.parentNode:O,A));if(J&&F[0].wrapper)J=B.getParents(J,"ul,ol",B.getRoot()).reverse()[0]||J;if(!J)for(J=O;J[P]&&!A(J[P]);){J=J[P];if(u(J,"br"))break}return J||O};I=S(I,"previousSibling");L=S(L,"nextSibling");if(F[0].block){A(I)||(I=G(I,"firstChild","nextSibling"));A(L)||(L=G(L,"lastChild","previousSibling"))}}if(I.nodeType==1){T=H(I);I=I.parentNode}if(L.nodeType==1){U=H(L)+1;L=L.parentNode}return{startContainer:I,startOffset:T,
+endContainer:L,endOffset:U}}function a(z,F,G,I){var T,L,U;if(!r(G,z))return V;if(z.remove!="all"){D(z.styles,function(N,S){N=f(N,F);if(typeof S==="number"){S=N;I=0}if(!I||u(v(I,S),N))B.setStyle(G,S,"");U=1});if(U&&B.getAttrib(G,"style")==""){G.removeAttribute("style");G.removeAttribute("_mce_style")}D(z.attributes,function(N,S){var O;N=f(N,F);if(typeof S==="number"){S=N;I=0}if(!I||u(B.getAttrib(I,S),N)){if(S=="class")if(N=B.getAttrib(G,S)){O="";D(N.split(/\s+/),function(P){if(/mce\w+/.test(P))O+=
+(O?" ":"")+P});if(O){B.setAttrib(G,S,O);return}}S=="class"&&G.removeAttribute("className");W.test(S)&&G.removeAttribute("_mce_"+S);G.removeAttribute(S)}});D(z.classes,function(N){N=f(N,F);if(!I||B.hasClass(I,N))B.removeClass(G,N)});L=B.getAttribs(G);for(T=0;T<L.length;T++)if(L[T].nodeName.indexOf("_")!==0)return V}if(z.remove!="none"){h(G,z);return aa}}function h(z,F){var G=z.parentNode,I;if(F.block)if(K){if(G==B.getRoot())if(!F.list_block||!u(z,F.list_block))D(m.grep(z.childNodes),function(L){if(E(K,
+L.nodeName.toLowerCase()))if(I)I.appendChild(L);else I=c(L,K);else I=0})}else{var T=function(L,U,N){L=n(L,U,N);return!L||L.nodeName=="BR"||A(L)};if(A(z)&&!A(G)){!T(z,V)&&!T(z.firstChild,aa,1)&&z.insertBefore(B.create("br"),z.firstChild);!T(z,aa)&&!T(z.lastChild,V,1)&&z.appendChild(B.create("br"))}}F.selector&&F.inline&&!u(F.inline,z)||B.remove(z,1)}function n(z,F,G){if(z){F=F?"nextSibling":"previousSibling";for(z=G?z:z[F];z;z=z[F])if(z.nodeType==1||!e(z))return z}}function p(z){return z&&z.nodeType==
+1&&z.getAttribute("_mce_type")=="bookmark"}function t(z,F){function G(L,U){function N(O){var P={};D(B.getAttribs(O),function(J){J=J.nodeName.toLowerCase();if(J.indexOf("_")!==0&&J!=="style")P[J]=B.getAttrib(O,J)});return P}function S(O,P){var J,Q;for(Q in O)if(O.hasOwnProperty(Q)){J=P[Q];if(J===ea)return V;if(O[Q]!=J)return V;delete P[Q]}for(Q in P)if(P.hasOwnProperty(Q))return V;return aa}if(L.nodeName!=U.nodeName)return V;if(!S(N(L),N(U)))return V;if(!S(B.parseStyle(B.getAttrib(L,"style")),B.parseStyle(B.getAttrib(U,
+"style"))))return V;return aa}var I,T;if(z&&F){T=function(L,U){for(I=L;I;I=I[U]){if(I.nodeType==3&&!e(I))break;if(I.nodeType==1&&!p(I))return I}return L};z=T(z,"previousSibling");F=T(F,"nextSibling");if(G(z,F)){for(I=z.nextSibling;I&&I!=F;){T=I;I=I.nextSibling;z.appendChild(T)}B.remove(F);D(m.grep(F.childNodes),function(L){z.appendChild(L)});return z}}return F}function s(z,F){var G,I,T;G=z[F?"startContainer":"endContainer"];I=z[F?"startOffset":"endOffset"];if(G.nodeType==1){T=G.childNodes.length-
+1;!F&&I&&I--;G=G.childNodes[I>T?T:I]}return G}function x(z,F,G){function I(){return Z.apply.length||Z.remove.length}function T(N){D(Z.apply.reverse(),function(S){b(S.name,S.vars,N)});D(Z.remove.reverse(),function(S){g(S.name,S.vars,N)});B.remove(N,1);Z.apply=[];Z.remove=[]}var L=Z[z],U=Z[z=="apply"?"remove":"apply"];for(z=L.length-1;z>=0;z--)if(L[z].name==F)return;L.push({name:F,vars:G});for(z=U.length-1;z>=0;z--)U[z].name==F&&U.splice(z,1);if(I()){o.getDoc().execCommand("FontName",false,"mceinline");
+Z.lastRng=M.getRng();D(B.select("font,span"),function(N){var S;if(q(N)){S=M.getBookmark();T(N);M.moveToBookmark(S);o.nodeChanged()}});if(!Z.isListening&&I()){Z.isListening=true;D("onKeyDown,onKeyUp,onKeyPress,onMouseUp".split(","),function(N){o[N].addToTop(function(S,O){if(I()&&!m.dom.RangeUtils.compareRanges(Z.lastRng,M.getRng())){D(B.select("font,span"),function(P){var J;if(q(P))if(J=P.firstChild){T(P);P=B.createRng();P.setStart(J,J.nodeValue.length);P.setEnd(J,J.nodeValue.length);M.setRng(P);S.nodeChanged()}else B.remove(P)});
+if(O.type=="keyup"||O.type=="mouseup"){Z.apply=[];Z.remove=[]}}})})}}}var y={},D=m.each,B=o.dom,M=o.selection,X=m.dom.TreeWalker,C=new m.dom.RangeUtils(B),E=o.schema.isValid,A=B.isBlock,K=o.settings.forced_root_block,H=B.nodeIndex,W=/^(src|href|style)$/,V=false,aa=true,ea,Z={apply:[],remove:[]};m.extend(this,{get:k,register:j,apply:b,remove:g,toggle:function(z,F,G){l(z,F,G)?g(z,F,G):b(z,F,G)},match:l,matchAll:function(z,F){var G,I=[],T={},L,U;if(M.isCollapsed()){for(L=0;L<z.length;L++)for(G=Z.remove.length-
+1;G>=0;G--){U=z[L];if(Z.remove[G].name==U){T[U]=true;break}}for(G=Z.apply.length-1;G>=0;G--)for(L=0;L<z.length;L++){U=z[L];if(!T[U]&&Z.apply[G].name==U){T[U]=true;I.push(U)}}}G=M.getStart();B.getParent(G,function(N){var S,O;for(S=0;S<z.length;S++){O=z[S];if(!T[O]&&d(N,O,F)){T[O]=true;I.push(O)}}});return I},matchNode:d,canApply:function(z){z=k(z);var F,G,I,T;if(z){F=M.getStart();F=B.getParents(F,void 0,B.getRoot());for(I=z.length-1;I>=0;I--){T=z[I].selector;if(!T)return aa;for(G=F.length-1;G>=0;G--)if(B.is(F[G],
+T))return aa}}return V}})}})(tinymce);
+tinymce.onAddEditor.add(function(m,o){var q,k,j,b=o.settings;if(b.inline_styles){k=m.explode(b.font_size_style_values);var g=function(l,r){j.replace(j.create("span",{style:r}),l,1)};q={font:function(l,r){g(r,{backgroundColor:r.style.backgroundColor,color:r.color,fontFamily:r.face,fontSize:k[parseInt(r.size)-1]})},u:function(l,r){g(r,{textDecoration:"underline"})},strike:function(l,r){g(r,{textDecoration:"line-through"})}};var d=function(l,r){j=l.dom;b.convert_fonts_to_spans&&m.each(j.select("font,u,strike",
+r.node),function(u){q[u.nodeName.toLowerCase()](o.dom,u)})};o.onPreProcess.add(d);o.onInit.add(function(){o.selection.onSetContent.add(d)})}});
index d235abd58637e82302ad2f3edbca41abfebad9a3..3ef3acb1fdc96824b8c7a357dfb4ee4d47ebe2bb 100644 (file)
@@ -2,4 +2,4 @@
 // Uncomment and change this document.domain value if you are loading the script cross subdomains
 // document.domain = 'moxiecode.com';
 
-var tinymce=null,tinyMCEPopup,tinyMCE;tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=b.editor.windowManager.createInstance("tinymce.dom.DOMUtils",document);if(b.features.popup_css!==false){b.dom.loadCSS(b.features.popup_css||b.editor.settings.popup_css)}b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=!b.getWindowArg("mce_inline");b.id=b.getWindowArg("mce_window_id");b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return window.dialogArguments||opener||parent||top},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var e=this,g,a=document.body,c=e.dom.getViewPort(window),d,f;d=e.getWindowArg("mce_width")-c.w;f=e.getWindowArg("mce_height")-c.h;if(e.isWindow){window.resizeBy(d,f)}else{e.editor.windowManager.resizeBy(d,f,e.id)}},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark("simple")},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write('<script type="text/javascript" src="'+tinymce._addVer(a)+'"><\/script>');tinymce.ScriptLoader.markDone(a)}}},pickColor:function(b,a){this.execCommand("mceColorPicker",true,{color:document.getElementById(a).value,func:function(e){document.getElementById(a).value=e;try{document.getElementById(a).onchange()}catch(d){}}})},openBrowser:function(a,c,b){tinyMCEPopup.restoreSelection();this.editor.execCallback("file_browser_callback",a,document.getElementById(a).value,c,window)},confirm:function(b,a,c){this.editor.windowManager.confirm(b,a,c,window)},alert:function(b,a,c){this.editor.windowManager.alert(b,a,c,window)},close:function(){var a=this;function b(){a.editor.windowManager.close(window);tinymce=tinyMCE=a.editor=a.params=a.dom=a.dom.doc=null}if(tinymce.isOpera){a.getWin().setTimeout(b,0)}else{b()}},_restoreSelection:function(){var a=window.event.srcElement;if(a.nodeName=="INPUT"&&(a.type=="submit"||a.type=="button")){tinyMCEPopup.restoreSelection()}},_onDOMLoaded:function(){var b=tinyMCEPopup,d=document.title,e,c,a;if(b.domLoaded){return}b.domLoaded=1;if(b.features.translate_i18n!==false){c=document.body.innerHTML;if(tinymce.isIE){c=c.replace(/ (value|title|alt)=([^"][^\s>]+)/gi,' $1="$2"')}document.dir=b.editor.getParam("directionality","");if((a=b.editor.translate(c))&&a!=c){document.body.innerHTML=a}if((a=b.editor.translate(d))&&a!=d){document.title=d=a}}document.body.style.display="";if(tinymce.isIE){document.attachEvent("onmouseup",tinyMCEPopup._restoreSelection);b.dom.add(b.dom.select("head")[0],"base",{target:"_self"})}b.restoreSelection();b.resizeToInnerSize();if(!b.isWindow){b.editor.windowManager.setTitle(window,d)}else{window.focus()}if(!tinymce.isIE&&!b.isWindow){tinymce.dom.Event._add(document,"focus",function(){b.editor.windowManager.focus(b.id)})}tinymce.each(b.dom.select("select"),function(f){f.onkeydown=tinyMCEPopup._accessHandler});tinymce.each(b.listeners,function(f){f.func.call(f.scope,b.editor)});if(b.getWindowArg("mce_auto_focus",true)){window.focus();tinymce.each(document.forms,function(g){tinymce.each(g.elements,function(f){if(b.dom.hasClass(f,"mceFocus")&&!f.disabled){f.focus();return false}})})}document.onkeyup=tinyMCEPopup._closeWinKeyHandler},_accessHandler:function(a){a=a||window.event;if(a.keyCode==13||a.keyCode==32){a=a.target||a.srcElement;if(a.onchange){a.onchange()}return tinymce.dom.Event.cancel(a)}},_closeWinKeyHandler:function(a){a=a||window.event;if(a.keyCode==27){tinyMCEPopup.close()}},_wait:function(){if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);tinyMCEPopup._onDOMLoaded()}});if(document.documentElement.doScroll&&window==window.top){(function(){if(tinyMCEPopup.domLoaded){return}try{document.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee,0);return}tinyMCEPopup._onDOMLoaded()})()}document.attachEvent("onload",tinyMCEPopup._onDOMLoaded)}else{if(document.addEventListener){window.addEventListener("DOMContentLoaded",tinyMCEPopup._onDOMLoaded,false);window.addEventListener("load",tinyMCEPopup._onDOMLoaded,false)}}}};tinyMCEPopup.init();tinyMCEPopup._wait();
\ No newline at end of file
+var tinymce=null,tinyMCEPopup,tinyMCE;tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=b.editor.windowManager.createInstance("tinymce.dom.DOMUtils",document);if(b.features.popup_css!==false){b.dom.loadCSS(b.features.popup_css||b.editor.settings.popup_css)}b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=!b.getWindowArg("mce_inline");b.id=b.getWindowArg("mce_window_id");b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return(!window.frameElement&&window.dialogArguments)||opener||parent||top},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var a=this;setTimeout(function(){var b=a.dom.getViewPort(window);a.editor.windowManager.resizeBy(a.getWindowArg("mce_width")-b.w,a.getWindowArg("mce_height")-b.h,a.id||window)},0)},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark(1)},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write('<script type="text/javascript" src="'+tinymce._addVer(a)+'"><\/script>');tinymce.ScriptLoader.markDone(a)}}},pickColor:function(b,a){this.execCommand("mceColorPicker",true,{color:document.getElementById(a).value,func:function(e){document.getElementById(a).value=e;try{document.getElementById(a).onchange()}catch(d){}}})},openBrowser:function(a,c,b){tinyMCEPopup.restoreSelection();this.editor.execCallback("file_browser_callback",a,document.getElementById(a).value,c,window)},confirm:function(b,a,c){this.editor.windowManager.confirm(b,a,c,window)},alert:function(b,a,c){this.editor.windowManager.alert(b,a,c,window)},close:function(){var a=this;function b(){a.editor.windowManager.close(window);tinymce=tinyMCE=a.editor=a.params=a.dom=a.dom.doc=null}if(tinymce.isOpera){a.getWin().setTimeout(b,0)}else{b()}},_restoreSelection:function(){var a=window.event.srcElement;if(a.nodeName=="INPUT"&&(a.type=="submit"||a.type=="button")){tinyMCEPopup.restoreSelection()}},_onDOMLoaded:function(){var b=tinyMCEPopup,d=document.title,e,c,a;if(b.domLoaded){return}b.domLoaded=1;if(b.features.translate_i18n!==false){c=document.body.innerHTML;if(tinymce.isIE){c=c.replace(/ (value|title|alt)=([^"][^\s>]+)/gi,' $1="$2"')}document.dir=b.editor.getParam("directionality","");if((a=b.editor.translate(c))&&a!=c){document.body.innerHTML=a}if((a=b.editor.translate(d))&&a!=d){document.title=d=a}}document.body.style.display="";if(tinymce.isIE){document.attachEvent("onmouseup",tinyMCEPopup._restoreSelection);b.dom.add(b.dom.select("head")[0],"base",{target:"_self"})}b.restoreSelection();b.resizeToInnerSize();if(!b.isWindow){b.editor.windowManager.setTitle(window,d)}else{window.focus()}if(!tinymce.isIE&&!b.isWindow){tinymce.dom.Event._add(document,"focus",function(){b.editor.windowManager.focus(b.id)})}tinymce.each(b.dom.select("select"),function(f){f.onkeydown=tinyMCEPopup._accessHandler});tinymce.each(b.listeners,function(f){f.func.call(f.scope,b.editor)});if(b.getWindowArg("mce_auto_focus",true)){window.focus();tinymce.each(document.forms,function(g){tinymce.each(g.elements,function(f){if(b.dom.hasClass(f,"mceFocus")&&!f.disabled){f.focus();return false}})})}document.onkeyup=tinyMCEPopup._closeWinKeyHandler},_accessHandler:function(a){a=a||window.event;if(a.keyCode==13||a.keyCode==32){a=a.target||a.srcElement;if(a.onchange){a.onchange()}return tinymce.dom.Event.cancel(a)}},_closeWinKeyHandler:function(a){a=a||window.event;if(a.keyCode==27){tinyMCEPopup.close()}},_wait:function(){if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);tinyMCEPopup._onDOMLoaded()}});if(document.documentElement.doScroll&&window==window.top){(function(){if(tinyMCEPopup.domLoaded){return}try{document.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee,0);return}tinyMCEPopup._onDOMLoaded()})()}document.attachEvent("onload",tinyMCEPopup._onDOMLoaded)}else{if(document.addEventListener){window.addEventListener("DOMContentLoaded",tinyMCEPopup._onDOMLoaded,false);window.addEventListener("load",tinyMCEPopup._onDOMLoaded,false)}}}};tinyMCEPopup.init();tinyMCEPopup._wait();
\ No newline at end of file
index 48384991576f30173e4f68eb64106f4634ee87a9..9db8d18fe0c0ce10dbdbf53ec5bda35e5d01796a 100644 (file)
-var tinymce = {\r
-       majorVersion : '3',\r
-       minorVersion : '2.3',\r
-       releaseDate : '2009-04-23',\r
-\r
-       _init : function() {\r
-               var t = this, d = document, w = window, na = navigator, ua = na.userAgent, i, nl, n, base, p, v;\r
-\r
-               // Browser checks\r
-               t.isOpera = w.opera && opera.buildNumber;\r
-               t.isWebKit = /WebKit/.test(ua);\r
-               t.isIE = !t.isWebKit && !t.isOpera && (/MSIE/gi).test(ua) && (/Explorer/gi).test(na.appName);\r
-               t.isIE6 = t.isIE && /MSIE [56]/.test(ua);\r
-               t.isGecko = !t.isWebKit && /Gecko/.test(ua);\r
-               t.isMac = ua.indexOf('Mac') != -1;\r
-               t.isAir = /adobeair/i.test(ua);\r
-\r
-               // TinyMCE .NET webcontrol might be setting the values for TinyMCE\r
-               if (w.tinyMCEPreInit) {\r
-                       t.suffix = tinyMCEPreInit.suffix;\r
-                       t.baseURL = tinyMCEPreInit.base;\r
-                       t.query = tinyMCEPreInit.query;\r
-                       return;\r
-               }\r
+(function(win) {\r
+       var whiteSpaceRe = /^\s*|\s*$/g,\r
+               undefined;\r
 \r
-               // Get suffix and base\r
-               t.suffix = '';\r
+       var tinymce = {\r
+               majorVersion : '3',\r
 \r
-               // If base element found, add that infront of baseURL\r
-               nl = d.getElementsByTagName('base');\r
-               for (i=0; i<nl.length; i++) {\r
-                       if (v = nl[i].href) {\r
-                               // Host only value like http://site.com or http://site.com:8008\r
-                               if (/^https?:\/\/[^\/]+$/.test(v))\r
-                                       v += '/';\r
+               minorVersion : '3.7',\r
 \r
-                               base = v ? v.match(/.*\//)[0] : ''; // Get only directory\r
-                       }\r
-               }\r
+               releaseDate : '2010-06-10',\r
 \r
-               function getBase(n) {\r
-                       if (n.src && /tiny_mce(|_dev|_src|_gzip|_jquery|_prototype).js/.test(n.src)) {\r
-                               if (/_(src|dev)\.js/g.test(n.src))\r
-                                       t.suffix = '_src';\r
+               _init : function() {\r
+                       var t = this, d = document, na = navigator, ua = na.userAgent, i, nl, n, base, p, v;\r
 \r
-                               if ((p = n.src.indexOf('?')) != -1)\r
-                                       t.query = n.src.substring(p + 1);\r
+                       t.isOpera = win.opera && opera.buildNumber;\r
 \r
-                               t.baseURL = n.src.substring(0, n.src.lastIndexOf('/'));\r
+                       t.isWebKit = /WebKit/.test(ua);\r
 \r
-                               // If path to script is relative and a base href was found add that one infront\r
-                               if (base && t.baseURL.indexOf('://') == -1)\r
-                                       t.baseURL = base + t.baseURL;\r
+                       t.isIE = !t.isWebKit && !t.isOpera && (/MSIE/gi).test(ua) && (/Explorer/gi).test(na.appName);\r
 \r
-                               return t.baseURL;\r
-                       }\r
+                       t.isIE6 = t.isIE && /MSIE [56]/.test(ua);\r
 \r
-                       return null;\r
-               };\r
+                       t.isGecko = !t.isWebKit && /Gecko/.test(ua);\r
+\r
+                       t.isMac = ua.indexOf('Mac') != -1;\r
 \r
-               // Check document\r
-               nl = d.getElementsByTagName('script');\r
-               for (i=0; i<nl.length; i++) {\r
-                       if (getBase(nl[i]))\r
+                       t.isAir = /adobeair/i.test(ua);\r
+\r
+                       t.isIDevice = /(iPad|iPhone)/.test(ua);\r
+\r
+                       // TinyMCE .NET webcontrol might be setting the values for TinyMCE\r
+                       if (win.tinyMCEPreInit) {\r
+                               t.suffix = tinyMCEPreInit.suffix;\r
+                               t.baseURL = tinyMCEPreInit.base;\r
+                               t.query = tinyMCEPreInit.query;\r
                                return;\r
-               }\r
+                       }\r
+\r
+                       // Get suffix and base\r
+                       t.suffix = '';\r
+\r
+                       // If base element found, add that infront of baseURL\r
+                       nl = d.getElementsByTagName('base');\r
+                       for (i=0; i<nl.length; i++) {\r
+                               if (v = nl[i].href) {\r
+                                       // Host only value like http://site.com or http://site.com:8008\r
+                                       if (/^https?:\/\/[^\/]+$/.test(v))\r
+                                               v += '/';\r
+\r
+                                       base = v ? v.match(/.*\//)[0] : ''; // Get only directory\r
+                               }\r
+                       }\r
+\r
+                       function getBase(n) {\r
+                               if (n.src && /tiny_mce(|_gzip|_jquery|_prototype)(_dev|_src)?.js/.test(n.src)) {\r
+                                       if (/_(src|dev)\.js/g.test(n.src))\r
+                                               t.suffix = '_src';\r
+\r
+                                       if ((p = n.src.indexOf('?')) != -1)\r
+                                               t.query = n.src.substring(p + 1);\r
+\r
+                                       t.baseURL = n.src.substring(0, n.src.lastIndexOf('/'));\r
+\r
+                                       // If path to script is relative and a base href was found add that one infront\r
+                                       // the src property will always be an absolute one on non IE browsers and IE 8\r
+                                       // so this logic will basically only be executed on older IE versions\r
+                                       if (base && t.baseURL.indexOf('://') == -1 && t.baseURL.indexOf('/') !== 0)\r
+                                               t.baseURL = base + t.baseURL;\r
+\r
+                                       return t.baseURL;\r
+                               }\r
 \r
-               // Check head\r
-               n = d.getElementsByTagName('head')[0];\r
-               if (n) {\r
-                       nl = n.getElementsByTagName('script');\r
+                               return null;\r
+                       };\r
+\r
+                       // Check document\r
+                       nl = d.getElementsByTagName('script');\r
                        for (i=0; i<nl.length; i++) {\r
                                if (getBase(nl[i]))\r
                                        return;\r
                        }\r
-               }\r
 \r
-               return;\r
-       },\r
-\r
-       is : function(o, t) {\r
-               var n = typeof(o);\r
+                       // Check head\r
+                       n = d.getElementsByTagName('head')[0];\r
+                       if (n) {\r
+                               nl = n.getElementsByTagName('script');\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       if (getBase(nl[i]))\r
+                                               return;\r
+                               }\r
+                       }\r
 \r
-               if (!t)\r
-                       return n != 'undefined';\r
+                       return;\r
+               },\r
 \r
-               if (t == 'array' && (o.hasOwnProperty && o instanceof Array))\r
-                       return true;\r
+               is : function(o, t) {\r
+                       if (!t)\r
+                               return o !== undefined;\r
 \r
-               return n == t;\r
-       },\r
+                       if (t == 'array' && (o.hasOwnProperty && o instanceof Array))\r
+                               return true;\r
 \r
+                       return typeof(o) == t;\r
+               },\r
 \r
-       each : function(o, cb, s) {\r
-               var n, l;\r
+               each : function(o, cb, s) {\r
+                       var n, l;\r
 \r
-               if (!o)\r
-                       return 0;\r
+                       if (!o)\r
+                               return 0;\r
 \r
-               s = s || o;\r
+                       s = s || o;\r
 \r
-               if (typeof(o.length) != 'undefined') {\r
-                       // Indexed arrays, needed for Safari\r
-                       for (n=0, l = o.length; n<l; n++) {\r
-                               if (cb.call(s, o[n], n, o) === false)\r
-                                       return 0;\r
-                       }\r
-               } else {\r
-                       // Hashtables\r
-                       for (n in o) {\r
-                               if (o.hasOwnProperty(n)) {\r
+                       if (o.length !== undefined) {\r
+                               // Indexed arrays, needed for Safari\r
+                               for (n=0, l = o.length; n < l; n++) {\r
                                        if (cb.call(s, o[n], n, o) === false)\r
                                                return 0;\r
                                }\r
+                       } else {\r
+                               // Hashtables\r
+                               for (n in o) {\r
+                                       if (o.hasOwnProperty(n)) {\r
+                                               if (cb.call(s, o[n], n, o) === false)\r
+                                                       return 0;\r
+                                       }\r
+                               }\r
                        }\r
-               }\r
 \r
-               return 1;\r
-       },\r
+                       return 1;\r
+               },\r
 \r
-       map : function(a, f) {\r
-               var o = [];\r
 \r
-               tinymce.each(a, function(v) {\r
-                       o.push(f(v));\r
-               });\r
+               map : function(a, f) {\r
+                       var o = [];\r
 \r
-               return o;\r
-       },\r
+                       tinymce.each(a, function(v) {\r
+                               o.push(f(v));\r
+                       });\r
 \r
-       grep : function(a, f) {\r
-               var o = [];\r
+                       return o;\r
+               },\r
 \r
-               tinymce.each(a, function(v) {\r
-                       if (!f || f(v))\r
-                               o.push(v);\r
-               });\r
+               grep : function(a, f) {\r
+                       var o = [];\r
 \r
-               return o;\r
-       },\r
+                       tinymce.each(a, function(v) {\r
+                               if (!f || f(v))\r
+                                       o.push(v);\r
+                       });\r
+\r
+                       return o;\r
+               },\r
 \r
-       inArray : function(a, v) {\r
-               var i, l;\r
+               inArray : function(a, v) {\r
+                       var i, l;\r
 \r
-               if (a) {\r
-                       for (i = 0, l = a.length; i < l; i++) {\r
-                               if (a[i] === v)\r
-                                       return i;\r
+                       if (a) {\r
+                               for (i = 0, l = a.length; i < l; i++) {\r
+                                       if (a[i] === v)\r
+                                               return i;\r
+                               }\r
                        }\r
-               }\r
 \r
-               return -1;\r
-       },\r
-\r
-       extend : function(o, e) {\r
-               var i, a = arguments;\r
+                       return -1;\r
+               },\r
 \r
-               for (i=1; i<a.length; i++) {\r
-                       e = a[i];\r
+               extend : function(o, e) {\r
+                       var i, l, a = arguments;\r
 \r
-                       tinymce.each(e, function(v, n) {\r
-                               if (typeof(v) !== 'undefined')\r
-                                       o[n] = v;\r
-                       });\r
-               }\r
+                       for (i = 1, l = a.length; i < l; i++) {\r
+                               e = a[i];\r
 \r
-               return o;\r
-       },\r
+                               tinymce.each(e, function(v, n) {\r
+                                       if (v !== undefined)\r
+                                               o[n] = v;\r
+                               });\r
+                       }\r
 \r
-       trim : function(s) {\r
-               return (s ? '' + s : '').replace(/^\s*|\s*$/g, '');\r
-       },\r
+                       return o;\r
+               },\r
 \r
 \r
-       create : function(s, p) {\r
-               var t = this, sp, ns, cn, scn, c, de = 0;\r
+               trim : function(s) {\r
+                       return (s ? '' + s : '').replace(whiteSpaceRe, '');\r
+               },\r
 \r
-               // Parse : <prefix> <class>:<super class>\r
-               s = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(s);\r
-               cn = s[3].match(/(^|\.)(\w+)$/i)[2]; // Class name\r
+               create : function(s, p) {\r
+                       var t = this, sp, ns, cn, scn, c, de = 0;\r
 \r
-               // Create namespace for new class\r
-               ns = t.createNS(s[3].replace(/\.\w+$/, ''));\r
+                       // Parse : <prefix> <class>:<super class>\r
+                       s = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(s);\r
+                       cn = s[3].match(/(^|\.)(\w+)$/i)[2]; // Class name\r
 \r
-               // Class already exists\r
-               if (ns[cn])\r
-                       return;\r
+                       // Create namespace for new class\r
+                       ns = t.createNS(s[3].replace(/\.\w+$/, ''));\r
 \r
-               // Make pure static class\r
-               if (s[2] == 'static') {\r
-                       ns[cn] = p;\r
+                       // Class already exists\r
+                       if (ns[cn])\r
+                               return;\r
 \r
-                       if (this.onCreate)\r
-                               this.onCreate(s[2], s[3], ns[cn]);\r
+                       // Make pure static class\r
+                       if (s[2] == 'static') {\r
+                               ns[cn] = p;\r
 \r
-                       return;\r
-               }\r
+                               if (this.onCreate)\r
+                                       this.onCreate(s[2], s[3], ns[cn]);\r
 \r
-               // Create default constructor\r
-               if (!p[cn]) {\r
-                       p[cn] = function() {};\r
-                       de = 1;\r
-               }\r
+                               return;\r
+                       }\r
 \r
-               // Add constructor and methods\r
-               ns[cn] = p[cn];\r
-               t.extend(ns[cn].prototype, p);\r
-\r
-               // Extend\r
-               if (s[5]) {\r
-                       sp = t.resolve(s[5]).prototype;\r
-                       scn = s[5].match(/\.(\w+)$/i)[1]; // Class name\r
-\r
-                       // Extend constructor\r
-                       c = ns[cn];\r
-                       if (de) {\r
-                               // Add passthrough constructor\r
-                               ns[cn] = function() {\r
-                                       return sp[scn].apply(this, arguments);\r
-                               };\r
-                       } else {\r
-                               // Add inherit constructor\r
-                               ns[cn] = function() {\r
-                                       this.parent = sp[scn];\r
-                                       return c.apply(this, arguments);\r
-                               };\r
+                       // Create default constructor\r
+                       if (!p[cn]) {\r
+                               p[cn] = function() {};\r
+                               de = 1;\r
                        }\r
-                       ns[cn].prototype[cn] = ns[cn];\r
 \r
-                       // Add super methods\r
-                       t.each(sp, function(f, n) {\r
-                               ns[cn].prototype[n] = sp[n];\r
-                       });\r
+                       // Add constructor and methods\r
+                       ns[cn] = p[cn];\r
+                       t.extend(ns[cn].prototype, p);\r
 \r
-                       // Add overridden methods\r
-                       t.each(p, function(f, n) {\r
-                               // Extend methods if needed\r
-                               if (sp[n]) {\r
-                                       ns[cn].prototype[n] = function() {\r
-                                               this.parent = sp[n];\r
-                                               return f.apply(this, arguments);\r
+                       // Extend\r
+                       if (s[5]) {\r
+                               sp = t.resolve(s[5]).prototype;\r
+                               scn = s[5].match(/\.(\w+)$/i)[1]; // Class name\r
+\r
+                               // Extend constructor\r
+                               c = ns[cn];\r
+                               if (de) {\r
+                                       // Add passthrough constructor\r
+                                       ns[cn] = function() {\r
+                                               return sp[scn].apply(this, arguments);\r
                                        };\r
                                } else {\r
-                                       if (n != cn)\r
-                                               ns[cn].prototype[n] = f;\r
+                                       // Add inherit constructor\r
+                                       ns[cn] = function() {\r
+                                               this.parent = sp[scn];\r
+                                               return c.apply(this, arguments);\r
+                                       };\r
                                }\r
-                       });\r
-               }\r
+                               ns[cn].prototype[cn] = ns[cn];\r
 \r
-               // Add static methods\r
-               t.each(p['static'], function(f, n) {\r
-                       ns[cn][n] = f;\r
-               });\r
+                               // Add super methods\r
+                               t.each(sp, function(f, n) {\r
+                                       ns[cn].prototype[n] = sp[n];\r
+                               });\r
 \r
-               if (this.onCreate)\r
-                       this.onCreate(s[2], s[3], ns[cn].prototype);\r
-       },\r
+                               // Add overridden methods\r
+                               t.each(p, function(f, n) {\r
+                                       // Extend methods if needed\r
+                                       if (sp[n]) {\r
+                                               ns[cn].prototype[n] = function() {\r
+                                                       this.parent = sp[n];\r
+                                                       return f.apply(this, arguments);\r
+                                               };\r
+                                       } else {\r
+                                               if (n != cn)\r
+                                                       ns[cn].prototype[n] = f;\r
+                                       }\r
+                               });\r
+                       }\r
 \r
-       walk : function(o, f, n, s) {\r
-               s = s || this;\r
+                       // Add static methods\r
+                       t.each(p['static'], function(f, n) {\r
+                               ns[cn][n] = f;\r
+                       });\r
 \r
-               if (o) {\r
-                       if (n)\r
-                               o = o[n];\r
+                       if (this.onCreate)\r
+                               this.onCreate(s[2], s[3], ns[cn].prototype);\r
+               },\r
 \r
-                       tinymce.each(o, function(o, i) {\r
-                               if (f.call(s, o, i, n) === false)\r
-                                       return false;\r
+               walk : function(o, f, n, s) {\r
+                       s = s || this;\r
 \r
-                               tinymce.walk(o, f, n, s);\r
-                       });\r
-               }\r
-       },\r
+                       if (o) {\r
+                               if (n)\r
+                                       o = o[n];\r
 \r
-       createNS : function(n, o) {\r
-               var i, v;\r
+                               tinymce.each(o, function(o, i) {\r
+                                       if (f.call(s, o, i, n) === false)\r
+                                               return false;\r
 \r
-               o = o || window;\r
+                                       tinymce.walk(o, f, n, s);\r
+                               });\r
+                       }\r
+               },\r
 \r
-               n = n.split('.');\r
-               for (i=0; i<n.length; i++) {\r
-                       v = n[i];\r
+               createNS : function(n, o) {\r
+                       var i, v;\r
 \r
-                       if (!o[v])\r
-                               o[v] = {};\r
+                       o = o || win;\r
 \r
-                       o = o[v];\r
-               }\r
+                       n = n.split('.');\r
+                       for (i=0; i<n.length; i++) {\r
+                               v = n[i];\r
 \r
-               return o;\r
-       },\r
+                               if (!o[v])\r
+                                       o[v] = {};\r
 \r
-       resolve : function(n, o) {\r
-               var i, l;\r
+                               o = o[v];\r
+                       }\r
 \r
-               o = o || window;\r
+                       return o;\r
+               },\r
 \r
-               n = n.split('.');\r
-               for (i=0, l = n.length; i<l; i++) {\r
-                       o = o[n[i]];\r
+               resolve : function(n, o) {\r
+                       var i, l;\r
 \r
-                       if (!o)\r
-                               break;\r
-               }\r
+                       o = o || win;\r
 \r
-               return o;\r
-       },\r
+                       n = n.split('.');\r
+                       for (i = 0, l = n.length; i < l; i++) {\r
+                               o = o[n[i]];\r
 \r
-       addUnload : function(f, s) {\r
-               var t = this, w = window;\r
+                               if (!o)\r
+                                       break;\r
+                       }\r
 \r
-               f = {func : f, scope : s || this};\r
+                       return o;\r
+               },\r
 \r
-               if (!t.unloads) {\r
-                       function unload() {\r
-                               var li = t.unloads, o, n;\r
+               addUnload : function(f, s) {\r
+                       var t = this;\r
 \r
-                               if (li) {\r
-                                       // Call unload handlers\r
-                                       for (n in li) {\r
-                                               o = li[n];\r
+                       f = {func : f, scope : s || this};\r
 \r
-                                               if (o && o.func)\r
-                                                       o.func.call(o.scope, 1); // Send in one arg to distinct unload and user destroy\r
-                                       }\r
+                       if (!t.unloads) {\r
+                               function unload() {\r
+                                       var li = t.unloads, o, n;\r
 \r
-                                       // Detach unload function\r
-                                       if (w.detachEvent) {\r
-                                               w.detachEvent('onbeforeunload', fakeUnload);\r
-                                               w.detachEvent('onunload', unload);\r
-                                       } else if (w.removeEventListener)\r
-                                               w.removeEventListener('unload', unload, false);\r
+                                       if (li) {\r
+                                               // Call unload handlers\r
+                                               for (n in li) {\r
+                                                       o = li[n];\r
 \r
-                                       // Destroy references\r
-                                       t.unloads = o = li = w = unload = 0;\r
+                                                       if (o && o.func)\r
+                                                               o.func.call(o.scope, 1); // Send in one arg to distinct unload and user destroy\r
+                                               }\r
 \r
-                                       // Run garbarge collector on IE\r
-                                       if (window.CollectGarbage)\r
-                                               window.CollectGarbage();\r
-                               }\r
-                       };\r
+                                               // Detach unload function\r
+                                               if (win.detachEvent) {\r
+                                                       win.detachEvent('onbeforeunload', fakeUnload);\r
+                                                       win.detachEvent('onunload', unload);\r
+                                               } else if (win.removeEventListener)\r
+                                                       win.removeEventListener('unload', unload, false);\r
 \r
-                       function fakeUnload() {\r
-                               var d = document;\r
+                                               // Destroy references\r
+                                               t.unloads = o = li = w = unload = 0;\r
 \r
-                               // Is there things still loading, then do some magic\r
-                               if (d.readyState == 'interactive') {\r
-                                       function stop() {\r
-                                               // Prevent memory leak\r
-                                               d.detachEvent('onstop', stop);\r
+                                               // Run garbarge collector on IE\r
+                                               if (win.CollectGarbage)\r
+                                                       CollectGarbage();\r
+                                       }\r
+                               };\r
 \r
-                                               // Call unload handler\r
-                                               if (unload)\r
-                                                       unload();\r
+                               function fakeUnload() {\r
+                                       var d = document;\r
 \r
-                                               d = 0;\r
-                                       };\r
+                                       // Is there things still loading, then do some magic\r
+                                       if (d.readyState == 'interactive') {\r
+                                               function stop() {\r
+                                                       // Prevent memory leak\r
+                                                       d.detachEvent('onstop', stop);\r
+\r
+                                                       // Call unload handler\r
+                                                       if (unload)\r
+                                                               unload();\r
 \r
-                                       // Fire unload when the currently loading page is stopped\r
-                                       if (d)\r
-                                               d.attachEvent('onstop', stop);\r
+                                                       d = 0;\r
+                                               };\r
 \r
-                                       // Remove onstop listener after a while to prevent the unload function\r
-                                       // to execute if the user presses cancel in an onbeforeunload\r
-                                       // confirm dialog and then presses the browser stop button\r
-                                       window.setTimeout(function() {\r
+                                               // Fire unload when the currently loading page is stopped\r
                                                if (d)\r
-                                                       d.detachEvent('onstop', stop);\r
-                                       }, 0);\r
-                               }\r
-                       };\r
+                                                       d.attachEvent('onstop', stop);\r
+\r
+                                               // Remove onstop listener after a while to prevent the unload function\r
+                                               // to execute if the user presses cancel in an onbeforeunload\r
+                                               // confirm dialog and then presses the browser stop button\r
+                                               win.setTimeout(function() {\r
+                                                       if (d)\r
+                                                               d.detachEvent('onstop', stop);\r
+                                               }, 0);\r
+                                       }\r
+                               };\r
 \r
-                       // Attach unload handler\r
-                       if (w.attachEvent) {\r
-                               w.attachEvent('onunload', unload);\r
-                               w.attachEvent('onbeforeunload', fakeUnload);\r
-                       } else if (w.addEventListener)\r
-                               w.addEventListener('unload', unload, false);\r
+                               // Attach unload handler\r
+                               if (win.attachEvent) {\r
+                                       win.attachEvent('onunload', unload);\r
+                                       win.attachEvent('onbeforeunload', fakeUnload);\r
+                               } else if (win.addEventListener)\r
+                                       win.addEventListener('unload', unload, false);\r
 \r
-                       // Setup initial unload handler array\r
-                       t.unloads = [f];\r
-               } else\r
-                       t.unloads.push(f);\r
+                               // Setup initial unload handler array\r
+                               t.unloads = [f];\r
+                       } else\r
+                               t.unloads.push(f);\r
 \r
-               return f;\r
-       },\r
+                       return f;\r
+               },\r
 \r
-       removeUnload : function(f) {\r
-               var u = this.unloads, r = null;\r
+               removeUnload : function(f) {\r
+                       var u = this.unloads, r = null;\r
 \r
-               tinymce.each(u, function(o, i) {\r
-                       if (o && o.func == f) {\r
-                               u.splice(i, 1);\r
-                               r = f;\r
-                               return false;\r
-                       }\r
-               });\r
+                       tinymce.each(u, function(o, i) {\r
+                               if (o && o.func == f) {\r
+                                       u.splice(i, 1);\r
+                                       r = f;\r
+                                       return false;\r
+                               }\r
+                       });\r
 \r
-               return r;\r
-       },\r
+                       return r;\r
+               },\r
 \r
-       explode : function(s, d) {\r
-               return s ? tinymce.map(s.split(d || ','), tinymce.trim) : s;\r
-       },\r
+               explode : function(s, d) {\r
+                       return s ? tinymce.map(s.split(d || ','), tinymce.trim) : s;\r
+               },\r
 \r
-       _addVer : function(u) {\r
-               var v;\r
+               _addVer : function(u) {\r
+                       var v;\r
 \r
-               if (!this.query)\r
-                       return u;\r
+                       if (!this.query)\r
+                               return u;\r
 \r
-               v = (u.indexOf('?') == -1 ? '?' : '&') + this.query;\r
+                       v = (u.indexOf('?') == -1 ? '?' : '&') + this.query;\r
 \r
-               if (u.indexOf('#') == -1)\r
-                       return u + v;\r
+                       if (u.indexOf('#') == -1)\r
+                               return u + v;\r
 \r
-               return u.replace('#', v + '#');\r
-       }\r
+                       return u.replace('#', v + '#');\r
+               }\r
 \r
-       };\r
+               };\r
+\r
+       // Initialize the API\r
+       tinymce._init();\r
+\r
+       // Expose tinymce namespace to the global namespace (window)\r
+       win.tinymce = win.tinyMCE = tinymce;\r
+})(window);\r
 \r
-// Required for GZip AJAX loading\r
-window.tinymce = tinymce;\r
 \r
-// Initialize the API\r
-tinymce._init();\r
 tinymce.create('tinymce.util.Dispatcher', {\r
        scope : null,\r
        listeners : null,\r
@@ -476,6 +492,7 @@ tinymce.create('tinymce.util.Dispatcher', {
        }\r
 \r
        });\r
+\r
 (function() {\r
        var each = tinymce.each;\r
 \r
@@ -483,11 +500,14 @@ tinymce.create('tinymce.util.Dispatcher', {
                URI : function(u, s) {\r
                        var t = this, o, a, b;\r
 \r
+                       // Trim whitespace\r
+                       u = tinymce.trim(u);\r
+\r
                        // Default settings\r
                        s = t.settings = s || {};\r
 \r
                        // Strange app protocol or local anchor\r
-                       if (/^(mailto|tel|news|javascript|about):/i.test(u) || /^\s*#/.test(u)) {\r
+                       if (/^(mailto|tel|news|javascript|about|data):/i.test(u) || /^\s*#/.test(u)) {\r
                                t.source = u;\r
                                return;\r
                        }\r
@@ -496,8 +516,8 @@ tinymce.create('tinymce.util.Dispatcher', {
                        if (u.indexOf('/') === 0 && u.indexOf('//') !== 0)\r
                                u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u;\r
 \r
-                       // Relative path\r
-                       if (u.indexOf(':/') === -1 && u.indexOf('//') !== 0)\r
+                       // Relative path http:// or protocol relative //path\r
+                       if (!/^\w*:?\/\//.test(u))\r
                                u = (s.base_uri.protocol || 'http') + '://mce_host' + t.toAbsPath(s.base_uri.path, u);\r
 \r
                        // Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri)\r
@@ -575,7 +595,7 @@ tinymce.create('tinymce.util.Dispatcher', {
                toAbsolute : function(u, nh) {\r
                        var u = new tinymce.util.URI(u, {base_uri : this});\r
 \r
-                       return u.getURI(this.host == u.host ? nh : 0);\r
+                       return u.getURI(this.host == u.host && this.protocol == u.protocol ? nh : 0);\r
                },\r
 \r
                toRelPath : function(base, path) {\r
@@ -621,7 +641,7 @@ tinymce.create('tinymce.util.Dispatcher', {
                },\r
 \r
                toAbsPath : function(base, path) {\r
-                       var i, nb = 0, o = [], tr;\r
+                       var i, nb = 0, o = [], tr, outPath;\r
 \r
                        // Split paths\r
                        tr = /\/$/.test(path) ? '/' : '';\r
@@ -661,9 +681,19 @@ tinymce.create('tinymce.util.Dispatcher', {
 \r
                        // If /a/b/c or /\r
                        if (i <= 0)\r
-                               return '/' + o.reverse().join('/') + tr;\r
+                               outPath = o.reverse().join('/');\r
+                       else\r
+                               outPath = base.slice(0, i).join('/') + '/' + o.reverse().join('/');\r
+\r
+                       // Add front / if it's needed\r
+                       if (outPath.indexOf('/') !== 0)\r
+                               outPath = '/' + outPath;\r
+\r
+                       // Add traling / if it's needed\r
+                       if (tr && outPath.lastIndexOf('/') !== outPath.length - 1)\r
+                               outPath += tr;\r
 \r
-                       return '/' + base.slice(0, i).join('/') + '/' + o.reverse().join('/') + tr;\r
+                       return outPath;\r
                },\r
 \r
                getURI : function(nh) {\r
@@ -701,9 +731,9 @@ tinymce.create('tinymce.util.Dispatcher', {
 \r
                        return t.source;\r
                }\r
-\r
-               });\r
+       });\r
 })();\r
+\r
 (function() {\r
        var each = tinymce.each;\r
 \r
@@ -772,9 +802,9 @@ tinymce.create('tinymce.util.Dispatcher', {
 \r
                        this.set(n, '', d, p, d);\r
                }\r
-\r
-               });\r
+       });\r
 })();\r
+\r
 tinymce.create('static tinymce.util.JSON', {\r
        serialize : function(o) {\r
                var i, v, s = tinymce.util.JSON.serialize, t;\r
@@ -827,6 +857,7 @@ tinymce.create('static tinymce.util.JSON', {
        }\r
 \r
        });\r
+\r
 tinymce.create('static tinymce.util.XHR', {\r
        send : function(o) {\r
                var x, t, w = window, c = 0;\r
@@ -860,6 +891,8 @@ tinymce.create('static tinymce.util.XHR', {
                        if (o.content_type)\r
                                x.setRequestHeader('Content-Type', o.content_type);\r
 \r
+                       x.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r
+\r
                        x.send(o.data);\r
 \r
                        function ready() {\r
@@ -881,9 +914,9 @@ tinymce.create('static tinymce.util.XHR', {
                        // Wait for response, onReadyStateChange can not be used since it leaks memory in IE\r
                        t = w.setTimeout(ready, 10);\r
                }\r
-\r
-               }\r
+       }\r
 });\r
+\r
 (function() {\r
        var extend = tinymce.extend, JSON = tinymce.util.JSON, XHR = tinymce.util.XHR;\r
 \r
@@ -935,12 +968,32 @@ tinymce.create('static tinymce.util.XHR', {
                                return new tinymce.util.JSONRequest().send(o);\r
                        }\r
                }\r
-\r
-               });\r
-}());(function(tinymce) {\r
+       });\r
+}());\r
+(function(tinymce) {\r
        // Shorten names\r
-       var each = tinymce.each, is = tinymce.is;\r
-       var isWebKit = tinymce.isWebKit, isIE = tinymce.isIE;\r
+       var each = tinymce.each,\r
+               is = tinymce.is,\r
+               isWebKit = tinymce.isWebKit,\r
+               isIE = tinymce.isIE,\r
+               blockRe = /^(H[1-6R]|P|DIV|ADDRESS|PRE|FORM|T(ABLE|BODY|HEAD|FOOT|H|R|D)|LI|OL|UL|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|MENU|ISINDEX|SAMP)$/,\r
+               boolAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'),\r
+               mceAttribs = makeMap('src,href,style,coords,shape'),\r
+               encodedChars = {'&' : '&amp;', '"' : '&quot;', '<' : '&lt;', '>' : '&gt;'},\r
+               encodeCharsRe = /[<>&\"]/g,\r
+               simpleSelectorRe = /^([a-z0-9],?)+$/i,\r
+               tagRegExp = /<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)(\s*\/?)>/g,\r
+               attrRegExp = /(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;\r
+\r
+       function makeMap(str) {\r
+               var map = {}, i;\r
+\r
+               str = str.split(',');\r
+               for (i = str.length; i >= 0; i--)\r
+                       map[str[i]] = 1;\r
+\r
+               return map;\r
+       };\r
 \r
        tinymce.create('tinymce.dom.DOMUtils', {\r
                doc : null,\r
@@ -963,7 +1016,7 @@ tinymce.create('static tinymce.util.XHR', {
                },\r
 \r
                DOMUtils : function(d, s) {\r
-                       var t = this;\r
+                       var t = this, globalStyle;\r
 \r
                        t.doc = d;\r
                        t.win = window;\r
@@ -973,7 +1026,7 @@ tinymce.create('static tinymce.util.XHR', {
                        t.boxModel = !tinymce.isIE || d.compatMode == "CSS1Compat"; \r
                        t.stdMode = d.documentMode === 8;\r
 \r
-                       this.settings = s = tinymce.extend({\r
+                       t.settings = s = tinymce.extend({\r
                                keep_values : false,\r
                                hex_colors : 1,\r
                                process_html : 1\r
@@ -988,6 +1041,16 @@ tinymce.create('static tinymce.util.XHR', {
                                }\r
                        }\r
 \r
+                       // Build styles list\r
+                       if (s.valid_styles) {\r
+                               t._styles = {};\r
+\r
+                               // Convert styles into a rule list\r
+                               each(s.valid_styles, function(value, key) {\r
+                                       t._styles[key] = tinymce.explode(value);\r
+                               });\r
+                       }\r
+\r
                        tinymce.addUnload(t.destroy, t);\r
                },\r
 \r
@@ -1049,10 +1112,6 @@ tinymce.create('static tinymce.util.XHR', {
                        };\r
                },\r
 \r
-               is : function(n, patt) {\r
-                       return tinymce.dom.Sizzle.matches(patt, n.nodeType ? [n] : n).length > 0;\r
-               },\r
-\r
                getParent : function(n, f, r) {\r
                        return this.getParents(n, f, r, false);\r
                },\r
@@ -1111,6 +1170,14 @@ tinymce.create('static tinymce.util.XHR', {
                        return e;\r
                },\r
 \r
+               getNext : function(node, selector) {\r
+                       return this._findSib(node, selector, 'nextSibling');\r
+               },\r
+\r
+               getPrev : function(node, selector) {\r
+                       return this._findSib(node, selector, 'previousSibling');\r
+               },\r
+\r
 \r
                select : function(pa, s) {\r
                        var t = this;\r
@@ -1118,6 +1185,32 @@ tinymce.create('static tinymce.util.XHR', {
                        return tinymce.dom.Sizzle(pa, t.get(s) || t.get(t.settings.root_element) || t.doc, []);\r
                },\r
 \r
+               is : function(n, selector) {\r
+                       var i;\r
+\r
+                       // If it isn't an array then try to do some simple selectors instead of Sizzle for to boost performance\r
+                       if (n.length === undefined) {\r
+                               // Simple all selector\r
+                               if (selector === '*')\r
+                                       return n.nodeType == 1;\r
+\r
+                               // Simple selector just elements\r
+                               if (simpleSelectorRe.test(selector)) {\r
+                                       selector = selector.toLowerCase().split(/,/);\r
+                                       n = n.nodeName.toLowerCase();\r
+\r
+                                       for (i = selector.length - 1; i >= 0; i--) {\r
+                                               if (selector[i] == n)\r
+                                                       return true;\r
+                                       }\r
+\r
+                                       return false;\r
+                               }\r
+                       }\r
+\r
+                       return tinymce.dom.Sizzle.matches(selector, n.nodeType ? [n] : n).length > 0;\r
+               },\r
+\r
 \r
                add : function(p, n, a, h, c) {\r
                        var t = this;\r
@@ -1159,42 +1252,29 @@ tinymce.create('static tinymce.util.XHR', {
                        return o + ' />';\r
                },\r
 \r
-               remove : function(n, k) {\r
-                       var t = this;\r
-\r
-                       return this.run(n, function(n) {\r
-                               var p, g, i;\r
+               remove : function(node, keep_children) {\r
+                       return this.run(node, function(node) {\r
+                               var parent, child;\r
 \r
-                               p = n.parentNode;\r
+                               parent = node.parentNode;\r
 \r
-                               if (!p)\r
+                               if (!parent)\r
                                        return null;\r
 \r
-                               if (k) {\r
-                                       for (i = n.childNodes.length - 1; i >= 0; i--)\r
-                                               t.insertAfter(n.childNodes[i], n);\r
-\r
-                                       //each(n.childNodes, function(c) {\r
-                                       //      p.insertBefore(c.cloneNode(true), n);\r
-                                       //});\r
-                               }\r
-\r
-                               // Fix IE psuedo leak\r
-                               if (t.fixPsuedoLeaks) {\r
-                                       p = n.cloneNode(true);\r
-                                       k = 'IELeakGarbageBin';\r
-                                       g = t.get(k) || t.add(t.doc.body, 'div', {id : k, style : 'display:none'});\r
-                                       g.appendChild(n);\r
-                                       g.innerHTML = '';\r
-\r
-                                       return p;\r
+                               if (keep_children) {\r
+                                       while (child = node.firstChild) {\r
+                                               // IE 8 will crash if you don't remove completely empty text nodes\r
+                                               if (!tinymce.isIE || child.nodeType !== 3 || child.nodeValue)\r
+                                                       parent.insertBefore(child, node);\r
+                                               else\r
+                                                       node.removeChild(child);\r
+                                       }\r
                                }\r
 \r
-                               return p.removeChild(n);\r
+                               return parent.removeChild(node);\r
                        });\r
                },\r
 \r
-\r
                setStyle : function(n, na, v) {\r
                        var t = this;\r
 \r
@@ -1236,7 +1316,7 @@ tinymce.create('static tinymce.util.XHR', {
 \r
                                // Force update of the style data\r
                                if (t.settings.update_styles)\r
-                                       t.setAttrib(e, 'mce_style');\r
+                                       t.setAttrib(e, '_mce_style');\r
                        });\r
                },\r
 \r
@@ -1319,9 +1399,9 @@ tinymce.create('static tinymce.util.XHR', {
                                                // No mce_style for elements with these since they might get resized by the user\r
                                                if (s.keep_values) {\r
                                                        if (v && !t._isRes(v))\r
-                                                               e.setAttribute('mce_style', v, 2);\r
+                                                               e.setAttribute('_mce_style', v, 2);\r
                                                        else\r
-                                                               e.removeAttribute('mce_style', 2);\r
+                                                               e.removeAttribute('_mce_style', 2);\r
                                                }\r
 \r
                                                e.style.cssText = v;\r
@@ -1337,13 +1417,13 @@ tinymce.create('static tinymce.util.XHR', {
                                                        if (s.url_converter)\r
                                                                v = s.url_converter.call(s.url_converter_scope || t, v, n, e);\r
 \r
-                                                       t.setAttrib(e, 'mce_' + n, v, 2);\r
+                                                       t.setAttrib(e, '_mce_' + n, v, 2);\r
                                                }\r
 \r
                                                break;\r
                                        \r
                                        case "shape":\r
-                                               e.setAttribute('mce_style', v);\r
+                                               e.setAttribute('_mce_style', v);\r
                                                break;\r
                                }\r
 \r
@@ -1364,7 +1444,6 @@ tinymce.create('static tinymce.util.XHR', {
                        });\r
                },\r
 \r
-\r
                getAttrib : function(e, n, dv) {\r
                        var v, t = this;\r
 \r
@@ -1378,7 +1457,7 @@ tinymce.create('static tinymce.util.XHR', {
 \r
                        // Try the mce variant for these\r
                        if (/^(src|href|style|coords|shape)$/.test(n)) {\r
-                               v = e.getAttribute("mce_" + n);\r
+                               v = e.getAttribute("_mce_" + n);\r
 \r
                                if (v)\r
                                        return v;\r
@@ -1392,14 +1471,26 @@ tinymce.create('static tinymce.util.XHR', {
                        if (!v)\r
                                v = e.getAttribute(n, 2);\r
 \r
+                       // Check boolean attribs\r
+                       if (/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(n)) {\r
+                               if (e[t.props[n]] === true && v === '')\r
+                                       return n;\r
+\r
+                               return v ? n : '';\r
+                       }\r
+\r
+                       // Inner input elements will override attributes on form elements\r
+                       if (e.nodeName === "FORM" && e.getAttributeNode(n))\r
+                               return e.getAttributeNode(n).nodeValue;\r
+\r
                        if (n === 'style') {\r
                                v = v || e.style.cssText;\r
 \r
                                if (v) {\r
-                                       v = t.serializeStyle(t.parseStyle(v));\r
+                                       v = t.serializeStyle(t.parseStyle(v), e.nodeName);\r
 \r
                                        if (t.settings.keep_values && !t._isRes(v))\r
-                                               e.setAttribute('mce_style', v);\r
+                                               e.setAttribute('_mce_style', v);\r
                                }\r
                        }\r
 \r
@@ -1467,7 +1558,7 @@ tinymce.create('static tinymce.util.XHR', {
                                        default:\r
                                                // IE has odd anonymous function for event attributes\r
                                                if (n.indexOf('on') === 0 && v)\r
-                                                       v = ('' + v).replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/, '$1');\r
+                                                       v = ('' + v).replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/, '$1');\r
                                }\r
                        }\r
 \r
@@ -1609,15 +1700,23 @@ tinymce.create('static tinymce.util.XHR', {
                        return o;\r
                },\r
 \r
-               serializeStyle : function(o) {\r
-                       var s = '';\r
+               serializeStyle : function(o, name) {\r
+                       var t = this, s = '';\r
 \r
-                       each(o, function(v, k) {\r
+                       function add(v, k) {\r
                                if (k && v) {\r
-                                       if (tinymce.isGecko && k.indexOf('-moz-') === 0)\r
+                                       // Remove browser specific styles like -moz- or -webkit-\r
+                                       if (k.indexOf('-') === 0)\r
                                                return;\r
 \r
                                        switch (k) {\r
+                                               case 'font-weight':\r
+                                                       // Opera will output bold as 700\r
+                                                       if (v == 700)\r
+                                                               v = 'bold';\r
+\r
+                                                       break;\r
+\r
                                                case 'color':\r
                                                case 'background-color':\r
                                                        v = v.toLowerCase();\r
@@ -1626,27 +1725,54 @@ tinymce.create('static tinymce.util.XHR', {
 \r
                                        s += (s ? ' ' : '') + k + ': ' + v + ';';\r
                                }\r
-                       });\r
+                       };\r
+\r
+                       // Validate style output\r
+                       if (name && t._styles) {\r
+                               each(t._styles['*'], function(name) {\r
+                                       add(o[name], name);\r
+                               });\r
+\r
+                               each(t._styles[name.toLowerCase()], function(name) {\r
+                                       add(o[name], name);\r
+                               });\r
+                       } else\r
+                               each(o, add);\r
 \r
                        return s;\r
                },\r
 \r
                loadCSS : function(u) {\r
-                       var t = this, d = t.doc;\r
+                       var t = this, d = t.doc, head;\r
 \r
                        if (!u)\r
                                u = '';\r
 \r
+                       head = t.select('head')[0];\r
+\r
                        each(u.split(','), function(u) {\r
+                               var link;\r
+\r
                                if (t.files[u])\r
                                        return;\r
 \r
                                t.files[u] = true;\r
-                               t.add(t.select('head')[0], 'link', {rel : 'stylesheet', href : tinymce._addVer(u)});\r
+                               link = t.create('link', {rel : 'stylesheet', href : tinymce._addVer(u)});\r
+\r
+                               // IE 8 has a bug where dynamically loading stylesheets would produce a 1 item remaining bug\r
+                               // This fix seems to resolve that issue by realcing the document ones a stylesheet finishes loading\r
+                               // It's ugly but it seems to work fine.\r
+                               if (isIE && d.documentMode) {\r
+                                       link.onload = function() {\r
+                                               d.recalc();\r
+                                               link.onload = null;\r
+                                       };\r
+                               }\r
+\r
+                               head.appendChild(link);\r
                        });\r
                },\r
 \r
-\r
                addClass : function(e, c) {\r
                        return this.run(e, function(e) {\r
                                var o;\r
@@ -1674,8 +1800,17 @@ tinymce.create('static tinymce.util.XHR', {
                                                re = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g");\r
 \r
                                        v = e.className.replace(re, ' ');\r
+                                       v = tinymce.trim(v != ' ' ? v : '');\r
 \r
-                                       return e.className = tinymce.trim(v != ' ' ? v : '');\r
+                                       e.className = v;\r
+\r
+                                       // Empty class attr\r
+                                       if (!v) {\r
+                                               e.removeAttribute('class');\r
+                                               e.removeAttribute('className');\r
+                                       }\r
+\r
+                                       return v;\r
                                }\r
 \r
                                return e.className;\r
@@ -1705,7 +1840,6 @@ tinymce.create('static tinymce.util.XHR', {
                        return !e || e.style.display == 'none' || this.getStyle(e, 'display') == 'none';\r
                },\r
 \r
-\r
                uniqueId : function(p) {\r
                        return (!p ? 'mce_' : p) + (this.counter++);\r
                },\r
@@ -1720,6 +1854,10 @@ tinymce.create('static tinymce.util.XHR', {
 \r
                                if (isIE) {\r
                                        function set() {\r
+                                               // Remove all child nodes\r
+                                               while (e.firstChild)\r
+                                                       e.firstChild.removeNode();\r
+\r
                                                try {\r
                                                        // IE will remove comments from the beginning\r
                                                        // unless you padd the contents with something\r
@@ -1729,10 +1867,6 @@ tinymce.create('static tinymce.util.XHR', {
                                                        // IE sometimes produces an unknown runtime error on innerHTML if it's an block element within a block element for example a div inside a p\r
                                                        // This seems to fix this problem\r
 \r
-                                                       // Remove all child nodes\r
-                                                       while (e.firstChild)\r
-                                                               e.firstChild.removeNode();\r
-\r
                                                        // Create new div with HTML contents and a BR infront to keep comments\r
                                                        x = t.create('div');\r
                                                        x.innerHTML = '<br />' + h;\r
@@ -1750,7 +1884,7 @@ tinymce.create('static tinymce.util.XHR', {
                                        // DOM tree if contents like this <p><ul><li>Item 1</li></ul></p> is inserted\r
                                        // It seems to be that IE doesn't like a root block element placed inside another root block element\r
                                        if (t.settings.fix_ie_paragraphs)\r
-                                               h = h.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi, '<p$1 mce_keep="true">&nbsp;</p>');\r
+                                               h = h.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi, '<p$1 _mce_keep="true">&nbsp;</p>');\r
 \r
                                        set();\r
 \r
@@ -1761,12 +1895,12 @@ tinymce.create('static tinymce.util.XHR', {
                                                        n = nl[i];\r
 \r
                                                        if (!n.hasChildNodes()) {\r
-                                                               if (!n.mce_keep) {\r
+                                                               if (!n._mce_keep) {\r
                                                                        x = 1; // Is broken\r
                                                                        break;\r
                                                                }\r
 \r
-                                                               n.removeAttribute('mce_keep');\r
+                                                               n.removeAttribute('_mce_keep');\r
                                                        }\r
                                                }\r
                                        }\r
@@ -1775,13 +1909,13 @@ tinymce.create('static tinymce.util.XHR', {
                                        if (x) {\r
                                                // So if we replace the p elements with divs and mark them and then replace them back to paragraphs\r
                                                // after we use innerHTML we can fix the DOM tree\r
-                                               h = h.replace(/<p ([^>]+)>|<p>/g, '<div $1 mce_tmp="1">');\r
-                                               h = h.replace(/<\/p>/g, '</div>');\r
+                                               h = h.replace(/<p ([^>]+)>|<p>/ig, '<div $1 _mce_tmp="1">');\r
+                                               h = h.replace(/<\/p>/gi, '</div>');\r
 \r
                                                // Set the new HTML with DIVs\r
                                                set();\r
 \r
-                                               // Replace all DIV elements with he mce_tmp attibute back to paragraphs\r
+                                               // Replace all DIV elements with the _mce_tmp attibute back to paragraphs\r
                                                // This is needed since IE has a annoying bug see above for details\r
                                                // This is a slow process but it has to be done. :(\r
                                                if (t.settings.fix_ie_paragraphs) {\r
@@ -1790,7 +1924,7 @@ tinymce.create('static tinymce.util.XHR', {
                                                                n = nl[i];\r
 \r
                                                                // Is it a temp div\r
-                                                               if (n.mce_tmp) {\r
+                                                               if (n._mce_tmp) {\r
                                                                        // Create new paragraph\r
                                                                        p = t.doc.createElement('p');\r
 \r
@@ -1798,7 +1932,7 @@ tinymce.create('static tinymce.util.XHR', {
                                                                        n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi, function(a, b) {\r
                                                                                var v;\r
 \r
-                                                                               if (b !== 'mce_tmp') {\r
+                                                                               if (b !== '_mce_tmp') {\r
                                                                                        v = n.getAttribute(b);\r
 \r
                                                                                        if (!v && b === 'class')\r
@@ -1826,16 +1960,12 @@ tinymce.create('static tinymce.util.XHR', {
                },\r
 \r
                processHTML : function(h) {\r
-                       var t = this, s = t.settings;\r
+                       var t = this, s = t.settings, codeBlocks = [];\r
 \r
                        if (!s.process_html)\r
                                return h;\r
 \r
-                       // Convert strong and em to b and i in FF since it can't handle them\r
-                       if (tinymce.isGecko) {\r
-                               h = h.replace(/<(\/?)strong>|<strong( [^>]+)>/gi, '<$1b$2>');\r
-                               h = h.replace(/<(\/?)em>|<em( [^>]+)>/gi, '<$1i$2>');\r
-                       } else if (isIE) {\r
+                       if (isIE) {\r
                                h = h.replace(/&apos;/g, '&#39;'); // IE can't handle apos\r
                                h = h.replace(/\s+(disabled|checked|readonly|selected)\s*=\s*[\"\']?(false|0)[\"\']?/gi, ''); // IE doesn't handle default values correct\r
                        }\r
@@ -1843,10 +1973,10 @@ tinymce.create('static tinymce.util.XHR', {
                        // Fix some issues\r
                        h = h.replace(/<a( )([^>]+)\/>|<a\/>/gi, '<a$1$2></a>'); // Force open\r
 \r
-                       // Store away src and href in mce_src and mce_href since browsers mess them up\r
+                       // Store away src and href in _mce_src and mce_href since browsers mess them up\r
                        if (s.keep_values) {\r
                                // Wrap scripts and styles in comments for serialization purposes\r
-                               if (/<script|style/.test(h)) {\r
+                               if (/<script|noscript|style/i.test(h)) {\r
                                        function trim(s) {\r
                                                // Remove prefix and suffix code for element\r
                                                s = s.replace(/(<!--\[CDATA\[|\]\]-->)/g, '\n');\r
@@ -1857,69 +1987,92 @@ tinymce.create('static tinymce.util.XHR', {
                                                return s;\r
                                        };\r
 \r
-                                       // Preserve script elements\r
-                                       h = h.replace(/<script([^>]+|)>([\s\S]*?)<\/script>/g, function(v, a, b) {\r
-                                               // Remove prefix and suffix code for script element\r
-                                               b = trim(b);\r
-\r
+                                       // Wrap the script contents in CDATA and keep them from executing\r
+                                       h = h.replace(/<script([^>]+|)>([\s\S]*?)<\/script>/gi, function(v, attribs, text) {\r
                                                // Force type attribute\r
-                                               if (!a)\r
-                                                       a = ' type="text/javascript"';\r
+                                               if (!attribs)\r
+                                                       attribs = ' type="text/javascript"';\r
+\r
+                                               // Convert the src attribute of the scripts\r
+                                               attribs = attribs.replace(/src=\"([^\"]+)\"?/i, function(a, url) {\r
+                                                       if (s.url_converter)\r
+                                                               url = t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(url), 'src', 'script'));\r
+\r
+                                                       return '_mce_src="' + url + '"';\r
+                                               });\r
+\r
+                                               // Wrap text contents\r
+                                               if (tinymce.trim(text)) {\r
+                                                       codeBlocks.push(trim(text));\r
+                                                       text = '<!--\nMCE_SCRIPT:' + (codeBlocks.length - 1) + '\n// -->';\r
+                                               }\r
+\r
+                                               return '<mce:script' + attribs + '>' + text + '</mce:script>';\r
+                                       });\r
 \r
-                                               // Wrap contents in a comment\r
-                                               if (b)\r
-                                                       b = '<!--\n' + b + '\n// -->';\r
+                                       // Wrap style elements\r
+                                       h = h.replace(/<style([^>]+|)>([\s\S]*?)<\/style>/gi, function(v, attribs, text) {\r
+                                               // Wrap text contents\r
+                                               if (text) {\r
+                                                       codeBlocks.push(trim(text));\r
+                                                       text = '<!--\nMCE_SCRIPT:' + (codeBlocks.length - 1) + '\n-->';\r
+                                               }\r
 \r
-                                               // Output fake element\r
-                                               return '<mce:script' + a + '>' + b + '</mce:script>';\r
+                                               return '<mce:style' + attribs + '>' + text + '</mce:style><style ' + attribs + ' _mce_bogus="1">' + text + '</style>';\r
                                        });\r
 \r
-                                       // Preserve style elements\r
-                                       h = h.replace(/<style([^>]+|)>([\s\S]*?)<\/style>/g, function(v, a, b) {\r
-                                               b = trim(b);\r
-                                               return '<mce:style' + a + '><!--\n' + b + '\n--></mce:style><style' + a + ' mce_bogus="1">' + b + '</style>';\r
+                                       // Wrap noscript elements\r
+                                       h = h.replace(/<noscript([^>]+|)>([\s\S]*?)<\/noscript>/g, function(v, attribs, text) {\r
+                                               return '<mce:noscript' + attribs + '><!--' + t.encode(text).replace(/--/g, '&#45;&#45;') + '--></mce:noscript>';\r
                                        });\r
                                }\r
 \r
                                h = h.replace(/<!\[CDATA\[([\s\S]+)\]\]>/g, '<!--[CDATA[$1]]-->');\r
 \r
-                               // Process all tags with src, href or style\r
-                               h = h.replace(/<([\w:]+) [^>]*(src|href|style|shape|coords)[^>]*>/gi, function(a, n) {\r
-                                       function handle(m, b, c) {\r
-                                               var u = c;\r
+                               // This function processes the attributes in the HTML string to force boolean\r
+                               // attributes to the attr="attr" format and convert style, src and href to _mce_ versions\r
+                               function processTags(html) {\r
+                                       return html.replace(tagRegExp, function(match, elm_name, attrs, end) {\r
+                                               return '<' + elm_name + attrs.replace(attrRegExp, function(match, name, value, val2, val3) {\r
+                                                       var mceValue;\r
 \r
-                                               // Tag already got a mce_ version\r
-                                               if (a.indexOf('mce_' + b) != -1)\r
-                                                       return m;\r
+                                                       name = name.toLowerCase();\r
+                                                       value = value || val2 || val3 || "";\r
 \r
-                                               if (b == 'style') {\r
-                                                       // No mce_style for elements with these since they might get resized by the user\r
-                                                       if (t._isRes(c))\r
-                                                               return m;\r
+                                                       // Treat boolean attributes\r
+                                                       if (boolAttrs[name]) {\r
+                                                               // false or 0 is treated as a missing attribute\r
+                                                               if (value === 'false' || value === '0')\r
+                                                                       return;\r
 \r
-                                                       if (s.hex_colors) {\r
-                                                               u = u.replace(/rgb\([^\)]+\)/g, function(v) {\r
-                                                                       return t.toHex(v);\r
-                                                               });\r
+                                                               return name + '="' + name + '"';\r
                                                        }\r
 \r
-                                                       if (s.url_converter) {\r
-                                                               u = u.replace(/url\([\'\"]?([^\)\'\"]+)\)/g, function(x, c) {\r
-                                                                       return 'url(' + t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(c), b, n)) + ')';\r
-                                                               });\r
+                                                       // Is attribute one that needs special treatment\r
+                                                       if (mceAttribs[name] && attrs.indexOf('_mce_' + name) == -1) {\r
+                                                               mceValue = t.decode(value);\r
+\r
+                                                               // Convert URLs to relative/absolute ones\r
+                                                               if (s.url_converter && (name == "src" || name == "href"))\r
+                                                                       mceValue = s.url_converter.call(s.url_converter_scope || t, mceValue, name, elm_name);\r
+\r
+                                                               // Process styles lowercases them and compresses them\r
+                                                               if (name == 'style')\r
+                                                                       mceValue = t.serializeStyle(t.parseStyle(mceValue), name);\r
+\r
+                                                               return name + '="' + value + '"' + ' _mce_' + name + '="' + t.encode(mceValue) + '"';\r
                                                        }\r
-                                               } else if (b != 'coords' && b != 'shape') {\r
-                                                       if (s.url_converter)\r
-                                                               u = t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(c), b, n));\r
-                                               }\r
 \r
-                                               return ' ' + b + '="' + c + '" mce_' + b + '="' + u + '"';\r
-                                       };\r
+                                                       return match;\r
+                                               }) + end + '>';\r
+                                       });\r
+                               };\r
 \r
-                                       a = a.replace(/ (src|href|style|coords|shape)=[\"]([^\"]+)[\"]/gi, handle); // W3C\r
-                                       a = a.replace(/ (src|href|style|coords|shape)=[\']([^\']+)[\']/gi, handle); // W3C\r
+                               h = processTags(h);\r
 \r
-                                       return a.replace(/ (src|href|style|coords|shape)=([^\s\"\'>]+)/gi, handle); // IE\r
+                               // Restore script blocks\r
+                               h = h.replace(/MCE_SCRIPT:([0-9]+)/g, function(val, idx) {\r
+                                       return codeBlocks[idx];\r
                                });\r
                        }\r
 \r
@@ -1946,25 +2099,41 @@ tinymce.create('static tinymce.util.XHR', {
                setOuterHTML : function(e, h, d) {\r
                        var t = this;\r
 \r
-                       return this.run(e, function(e) {\r
+                       function setHTML(e, h, d) {\r
                                var n, tp;\r
 \r
+                               tp = d.createElement("body");\r
+                               tp.innerHTML = h;\r
+\r
+                               n = tp.lastChild;\r
+                               while (n) {\r
+                                       t.insertAfter(n.cloneNode(true), e);\r
+                                       n = n.previousSibling;\r
+                               }\r
+\r
+                               t.remove(e);\r
+                       };\r
+\r
+                       return this.run(e, function(e) {\r
                                e = t.get(e);\r
-                               d = d || e.ownerDocument || t.doc;\r
-\r
-                               if (isIE && e.nodeType == 1)\r
-                                       e.outerHTML = h;\r
-                               else {\r
-                                       tp = d.createElement("body");\r
-                                       tp.innerHTML = h;\r
-\r
-                                       n = tp.lastChild;\r
-                                       while (n) {\r
-                                               t.insertAfter(n.cloneNode(true), e);\r
-                                               n = n.previousSibling;\r
-                                       }\r
 \r
-                                       t.remove(e);\r
+                               // Only set HTML on elements\r
+                               if (e.nodeType == 1) {\r
+                                       d = d || e.ownerDocument || t.doc;\r
+\r
+                                       if (isIE) {\r
+                                               try {\r
+                                                       // Try outerHTML for IE it sometimes produces an unknown runtime error\r
+                                                       if (isIE && e.nodeType == 1)\r
+                                                               e.outerHTML = h;\r
+                                                       else\r
+                                                               setHTML(e, h, d);\r
+                                               } catch (ex) {\r
+                                                       // Fix for unknown runtime error\r
+                                                       setHTML(e, h, d);\r
+                                               }\r
+                                       } else\r
+                                               setHTML(e, h, d);\r
                                }\r
                        });\r
                },\r
@@ -1973,7 +2142,7 @@ tinymce.create('static tinymce.util.XHR', {
                        var e, n, v;\r
 \r
                        // Look for entities to decode\r
-                       if (/&[^;]+;/.test(s)) {\r
+                       if (/&[\w#]+;/.test(s)) {\r
                                // Decode the entities using a div element not super efficient but less code\r
                                e = this.doc.createElement("div");\r
                                e.innerHTML = s;\r
@@ -1983,7 +2152,7 @@ tinymce.create('static tinymce.util.XHR', {
                                if (n) {\r
                                        do {\r
                                                v += n.nodeValue;\r
-                                       } while (n.nextSibling);\r
+                                       } while (n = n.nextSibling);\r
                                }\r
 \r
                                return v || s;\r
@@ -1992,58 +2161,39 @@ tinymce.create('static tinymce.util.XHR', {
                        return s;\r
                },\r
 \r
-               encode : function(s) {\r
-                       return s ? ('' + s).replace(/[<>&\"]/g, function (c, b) {\r
-                               switch (c) {\r
-                                       case '&':\r
-                                               return '&amp;';\r
-\r
-                                       case '"':\r
-                                               return '&quot;';\r
-\r
-                                       case '<':\r
-                                               return '&lt;';\r
-\r
-                                       case '>':\r
-                                               return '&gt;';\r
-                               }\r
-\r
-                               return c;\r
-                       }) : s;\r
+               encode : function(str) {\r
+                       return ('' + str).replace(encodeCharsRe, function(chr) {\r
+                               return encodedChars[chr];\r
+                       });\r
                },\r
 \r
+               insertAfter : function(node, reference_node) {\r
+                       reference_node = this.get(reference_node);\r
 \r
-               insertAfter : function(n, r) {\r
-                       var t = this;\r
-\r
-                       r = t.get(r);\r
-\r
-                       return this.run(n, function(n) {\r
-                               var p, ns;\r
+                       return this.run(node, function(node) {\r
+                               var parent, nextSibling;\r
 \r
-                               p = r.parentNode;\r
-                               ns = r.nextSibling;\r
+                               parent = reference_node.parentNode;\r
+                               nextSibling = reference_node.nextSibling;\r
 \r
-                               if (ns)\r
-                                       p.insertBefore(n, ns);\r
+                               if (nextSibling)\r
+                                       parent.insertBefore(node, nextSibling);\r
                                else\r
-                                       p.appendChild(n);\r
+                                       parent.appendChild(node);\r
 \r
-                               return n;\r
+                               return node;\r
                        });\r
                },\r
 \r
-\r
                isBlock : function(n) {\r
                        if (n.nodeType && n.nodeType !== 1)\r
                                return false;\r
 \r
                        n = n.nodeName || n;\r
 \r
-                       return /^(H[1-6]|HR|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TR|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP)$/.test(n);\r
+                       return blockRe.test(n);\r
                },\r
 \r
-\r
                replace : function(n, o, k) {\r
                        var t = this;\r
 \r
@@ -2052,23 +2202,33 @@ tinymce.create('static tinymce.util.XHR', {
 \r
                        return t.run(o, function(o) {\r
                                if (k) {\r
-                                       each(o.childNodes, function(c) {\r
-                                               n.appendChild(c.cloneNode(true));\r
+                                       each(tinymce.grep(o.childNodes), function(c) {\r
+                                               n.appendChild(c);\r
                                        });\r
                                }\r
 \r
-                               // Fix IE psuedo leak for elements since replacing elements if fairly common\r
-                               // Will break parentNode for some unknown reason\r
-                               if (t.fixPsuedoLeaks && o.nodeType === 1) {\r
-                                       o.parentNode.insertBefore(n, o);\r
-                                       t.remove(o);\r
-                                       return n;\r
-                               }\r
-\r
                                return o.parentNode.replaceChild(n, o);\r
                        });\r
                },\r
 \r
+               rename : function(elm, name) {\r
+                       var t = this, newElm;\r
+\r
+                       if (elm.nodeName != name.toUpperCase()) {\r
+                               // Rename block element\r
+                               newElm = t.create(name);\r
+\r
+                               // Copy attribs to new block\r
+                               each(t.getAttribs(elm), function(attr_node) {\r
+                                       t.setAttrib(newElm, attr_node.nodeName, t.getAttrib(elm, attr_node.nodeName));\r
+                               });\r
+\r
+                               // Replace block\r
+                               t.replace(newElm, elm, 1);\r
+                       }\r
+\r
+                       return newElm || elm;\r
+               },\r
 \r
                findCommonAncestor : function(a, b) {\r
                        var ps = a, pe;\r
@@ -2213,9 +2373,13 @@ tinymce.create('static tinymce.util.XHR', {
                                if (n.nodeName == 'OBJECT')\r
                                        return n.attributes;\r
 \r
+                               // IE doesn't keep the selected attribute if you clone option elements\r
+                               if (n.nodeName === 'OPTION' && this.getAttrib(n, 'selected'))\r
+                                       o.push({specified : 1, nodeName : 'selected'});\r
+\r
                                // It's crazy that this is faster in IE but it's because it returns all attributes all the time\r
-                               n.cloneNode(false).outerHTML.replace(/([a-z0-9\:\-_]+)=/gi, function(a, b) {\r
-                                       o.push({specified : 1, nodeName : b});\r
+                               n.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi, '').replace(/[\w:\-]+/gi, function(a) {\r
+                                       o.push({specified : 1, nodeName : a});\r
                                });\r
 \r
                                return o;\r
@@ -2227,7 +2391,10 @@ tinymce.create('static tinymce.util.XHR', {
                destroy : function(s) {\r
                        var t = this;\r
 \r
-                       t.win = t.doc = t.root = null;\r
+                       if (t.events)\r
+                               t.events.destroy();\r
+\r
+                       t.win = t.doc = t.root = t.events = null;\r
 \r
                        // Manual destroy then remove unload handler\r
                        if (!s)\r
@@ -2240,70 +2407,138 @@ tinymce.create('static tinymce.util.XHR', {
                        return d.createRange ? d.createRange() : new tinymce.dom.Range(this);\r
                },\r
 \r
+               nodeIndex : function(node, normalized) {\r
+                       var idx = 0, lastNodeType, lastNode, nodeType;\r
+\r
+                       if (node) {\r
+                               for (lastNodeType = node.nodeType, node = node.previousSibling, lastNode = node; node; node = node.previousSibling) {\r
+                                       nodeType = node.nodeType;\r
+\r
+                                       // Normalize text nodes\r
+                                       if (normalized && nodeType == 3) {\r
+                                               if (nodeType == lastNodeType || !node.nodeValue.length)\r
+                                                       continue;\r
+                                       }\r
+\r
+                                       idx++;\r
+                                       lastNodeType = nodeType;\r
+                               }\r
+                       }\r
+\r
+                       return idx;\r
+               },\r
+\r
                split : function(pe, e, re) {\r
                        var t = this, r = t.createRng(), bef, aft, pa;\r
 \r
-                       // W3C valid browsers tend to leave empty nodes to the left/right side of the contents, this makes sence\r
-                       // but we don't want that in our code since it serves no purpose\r
+                       // W3C valid browsers tend to leave empty nodes to the left/right side of the contents, this makes sense\r
+                       // but we don't want that in our code since it serves no purpose for the end user\r
                        // For example if this is chopped:\r
                        //   <p>text 1<span><b>CHOP</b></span>text 2</p>\r
                        // would produce:\r
                        //   <p>text 1<span></span></p><b>CHOP</b><p><span></span>text 2</p>\r
                        // this function will then trim of empty edges and produce:\r
                        //   <p>text 1</p><b>CHOP</b><p>text 2</p>\r
-                       function trimEdge(n, na) {\r
-                               n = n[na];\r
+                       function trim(node) {\r
+                               var i, children = node.childNodes;\r
 \r
-                               if (n && n[na] && n[na].nodeType == 1 && isEmpty(n[na]))\r
-                                       t.remove(n[na]);\r
-                       };\r
+                               if (node.nodeType == 1 && node.getAttribute('_mce_type') == 'bookmark')\r
+                                       return;\r
+\r
+                               for (i = children.length - 1; i >= 0; i--)\r
+                                       trim(children[i]);\r
+\r
+                               if (node.nodeType != 9) {\r
+                                       // Keep non whitespace text nodes\r
+                                       if (node.nodeType == 3 && node.nodeValue.length > 0)\r
+                                               return;\r
+\r
+                                       if (node.nodeType == 1) {\r
+                                               // If the only child is a bookmark then move it up\r
+                                               children = node.childNodes;\r
+                                               if (children.length == 1 && children[0] && children[0].nodeType == 1 && children[0].getAttribute('_mce_type') == 'bookmark')\r
+                                                       node.parentNode.insertBefore(children[0], node);\r
+\r
+                                               // Keep non empty elements or img, hr etc\r
+                                               if (children.length || /^(br|hr|input|img)$/i.test(node.nodeName))\r
+                                                       return;\r
+                                       }\r
 \r
-                       function isEmpty(n) {\r
-                               n = t.getOuterHTML(n);\r
-                               n = n.replace(/<(img|hr|table)/gi, '-'); // Keep these convert them to - chars\r
-                               n = n.replace(/<[^>]+>/g, ''); // Remove all tags\r
+                                       t.remove(node);\r
+                               }\r
 \r
-                               return n.replace(/[ \t\r\n]+|&nbsp;|&#160;/g, '') == '';\r
+                               return node;\r
                        };\r
 \r
                        if (pe && e) {\r
                                // Get before chunk\r
-                               r.setStartBefore(pe);\r
-                               r.setEndBefore(e);\r
+                               r.setStart(pe.parentNode, t.nodeIndex(pe));\r
+                               r.setEnd(e.parentNode, t.nodeIndex(e));\r
                                bef = r.extractContents();\r
 \r
                                // Get after chunk\r
                                r = t.createRng();\r
-                               r.setStartAfter(e);\r
-                               r.setEndAfter(pe);\r
+                               r.setStart(e.parentNode, t.nodeIndex(e) + 1);\r
+                               r.setEnd(pe.parentNode, t.nodeIndex(pe) + 1);\r
                                aft = r.extractContents();\r
 \r
-                               // Insert chunks and remove parent\r
+                               // Insert before chunk\r
                                pa = pe.parentNode;\r
+                               pa.insertBefore(trim(bef), pe);\r
 \r
-                               // Remove right side edge of the before contents\r
-                               trimEdge(bef, 'lastChild');\r
-\r
-                               if (!isEmpty(bef))\r
-                                       pa.insertBefore(bef, pe);\r
-\r
+                               // Insert middle chunk\r
                                if (re)\r
                                        pa.replaceChild(re, e);\r
                                else\r
                                        pa.insertBefore(e, pe);\r
 \r
-                               // Remove left site edge of the after contents\r
-                               trimEdge(aft, 'firstChild');\r
-\r
-                               if (!isEmpty(aft))\r
-                                       pa.insertBefore(aft, pe);\r
-\r
+                               // Insert after chunk\r
+                               pa.insertBefore(trim(aft), pe);\r
                                t.remove(pe);\r
 \r
                                return re || e;\r
                        }\r
                },\r
 \r
+               bind : function(target, name, func, scope) {\r
+                       var t = this;\r
+\r
+                       if (!t.events)\r
+                               t.events = new tinymce.dom.EventUtils();\r
+\r
+                       return t.events.add(target, name, func, scope || this);\r
+               },\r
+\r
+               unbind : function(target, name, func) {\r
+                       var t = this;\r
+\r
+                       if (!t.events)\r
+                               t.events = new tinymce.dom.EventUtils();\r
+\r
+                       return t.events.remove(target, name, func);\r
+               },\r
+\r
+\r
+               _findSib : function(node, selector, name) {\r
+                       var t = this, f = selector;\r
+\r
+                       if (node) {\r
+                               // If expression make a function of it using is\r
+                               if (is(f, 'string')) {\r
+                                       f = function(node) {\r
+                                               return t.is(node, selector);\r
+                                       };\r
+                               }\r
+\r
+                               // Loop all siblings\r
+                               for (node = node[name]; node; node = node[name]) {\r
+                                       if (f(node))\r
+                                               return node;\r
+                               }\r
+                       }\r
+\r
+                       return null;\r
+               },\r
 \r
                _isRes : function(c) {\r
                        // Is live resizble element\r
@@ -2339,237 +2574,239 @@ tinymce.create('static tinymce.util.XHR', {
                        return s;\r
                }\r
                */\r
+       });\r
 \r
-               });\r
-\r
-       // Setup page DOM\r
        tinymce.DOM = new tinymce.dom.DOMUtils(document, {process_html : 0});\r
 })(tinymce);\r
-(function(ns) {\r
-       // Traverse constants\r
-       var EXTRACT = 0, CLONE = 1, DELETE = 2, extend = tinymce.extend;\r
-\r
-       function indexOf(child, parent) {\r
-               var i, node;\r
-\r
-               if (child.parentNode != parent)\r
-                       return -1;\r
-\r
-               for (node = parent.firstChild, i = 0; node != child; node = node.nextSibling)\r
-                       i++;\r
-\r
-               return i;\r
-       };\r
-\r
-       function nodeIndex(n) {\r
-               var i = 0;\r
-\r
-               while (n.previousSibling) {\r
-                       i++;\r
-                       n = n.previousSibling;\r
-               }\r
-\r
-               return i;\r
-       };\r
-\r
-       function getSelectedNode(container, offset) {\r
-               var child;\r
-\r
-               if (container.nodeType == 3 /* TEXT_NODE */)\r
-                       return container;\r
-\r
-               if (offset < 0)\r
-                       return container;\r
-\r
-               child = container.firstChild;\r
-               while (child != null && offset > 0) {\r
-                       --offset;\r
-                       child = child.nextSibling;\r
-               }\r
-\r
-               if (child != null)\r
-                       return child;\r
-\r
-               return container;\r
-       };\r
 \r
+(function(ns) {\r
        // Range constructor\r
        function Range(dom) {\r
-               var d = dom.doc;\r
-\r
-               extend(this, {\r
-                       dom : dom,\r
-\r
+               var t = this,\r
+                       doc = dom.doc,\r
+                       EXTRACT = 0,\r
+                       CLONE = 1,\r
+                       DELETE = 2,\r
+                       TRUE = true,\r
+                       FALSE = false,\r
+                       START_OFFSET = 'startOffset',\r
+                       START_CONTAINER = 'startContainer',\r
+                       END_CONTAINER = 'endContainer',\r
+                       END_OFFSET = 'endOffset',\r
+                       extend = tinymce.extend,\r
+                       nodeIndex = dom.nodeIndex;\r
+\r
+               extend(t, {\r
                        // Inital states\r
-                       startContainer : d,\r
+                       startContainer : doc,\r
                        startOffset : 0,\r
-                       endContainer : d,\r
+                       endContainer : doc,\r
                        endOffset : 0,\r
-                       collapsed : true,\r
-                       commonAncestorContainer : d,\r
+                       collapsed : TRUE,\r
+                       commonAncestorContainer : doc,\r
 \r
                        // Range constants\r
                        START_TO_START : 0,\r
                        START_TO_END : 1,\r
                        END_TO_END : 2,\r
-                       END_TO_START : 3\r
+                       END_TO_START : 3,\r
+\r
+                       // Public methods\r
+                       setStart : setStart,\r
+                       setEnd : setEnd,\r
+                       setStartBefore : setStartBefore,\r
+                       setStartAfter : setStartAfter,\r
+                       setEndBefore : setEndBefore,\r
+                       setEndAfter : setEndAfter,\r
+                       collapse : collapse,\r
+                       selectNode : selectNode,\r
+                       selectNodeContents : selectNodeContents,\r
+                       compareBoundaryPoints : compareBoundaryPoints,\r
+                       deleteContents : deleteContents,\r
+                       extractContents : extractContents,\r
+                       cloneContents : cloneContents,\r
+                       insertNode : insertNode,\r
+                       surroundContents : surroundContents,\r
+                       cloneRange : cloneRange\r
                });\r
-       };\r
-\r
-       // Add range methods\r
-       extend(Range.prototype, {\r
-               setStart : function(n, o) {\r
-                       this._setEndPoint(true, n, o);\r
-               },\r
 \r
-               setEnd : function(n, o) {\r
-                       this._setEndPoint(false, n, o);\r
-               },\r
+               function setStart(n, o) {\r
+                       _setEndPoint(TRUE, n, o);\r
+               };\r
 \r
-               setStartBefore : function(n) {\r
-                       this.setStart(n.parentNode, nodeIndex(n));\r
-               },\r
+               function setEnd(n, o) {\r
+                       _setEndPoint(FALSE, n, o);\r
+               };\r
 \r
-               setStartAfter : function(n) {\r
-                       this.setStart(n.parentNode, nodeIndex(n) + 1);\r
-               },\r
+               function setStartBefore(n) {\r
+                       setStart(n.parentNode, nodeIndex(n));\r
+               };\r
 \r
-               setEndBefore : function(n) {\r
-                       this.setEnd(n.parentNode, nodeIndex(n));\r
-               },\r
+               function setStartAfter(n) {\r
+                       setStart(n.parentNode, nodeIndex(n) + 1);\r
+               };\r
 \r
-               setEndAfter : function(n) {\r
-                       this.setEnd(n.parentNode, nodeIndex(n) + 1);\r
-               },\r
+               function setEndBefore(n) {\r
+                       setEnd(n.parentNode, nodeIndex(n));\r
+               };\r
 \r
-               collapse : function(ts) {\r
-                       var t = this;\r
+               function setEndAfter(n) {\r
+                       setEnd(n.parentNode, nodeIndex(n) + 1);\r
+               };\r
 \r
+               function collapse(ts) {\r
                        if (ts) {\r
-                               t.endContainer = t.startContainer;\r
-                               t.endOffset = t.startOffset;\r
+                               t[END_CONTAINER] = t[START_CONTAINER];\r
+                               t[END_OFFSET] = t[START_OFFSET];\r
                        } else {\r
-                               t.startContainer = t.endContainer;\r
-                               t.startOffset = t.endOffset;\r
+                               t[START_CONTAINER] = t[END_CONTAINER];\r
+                               t[START_OFFSET] = t[END_OFFSET];\r
                        }\r
 \r
-                       t.collapsed = true;\r
-               },\r
+                       t.collapsed = TRUE;\r
+               };\r
 \r
-               selectNode : function(n) {\r
-                       this.setStartBefore(n);\r
-                       this.setEndAfter(n);\r
-               },\r
+               function selectNode(n) {\r
+                       setStartBefore(n);\r
+                       setEndAfter(n);\r
+               };\r
 \r
-               selectNodeContents : function(n) {\r
-                       this.setStart(n, 0);\r
-                       this.setEnd(n, n.nodeType === 1 ? n.childNodes.length : n.nodeValue.length);\r
-               },\r
+               function selectNodeContents(n) {\r
+                       setStart(n, 0);\r
+                       setEnd(n, n.nodeType === 1 ? n.childNodes.length : n.nodeValue.length);\r
+               };\r
 \r
-               compareBoundaryPoints : function(h, r) {\r
-                       var t = this, sc = t.startContainer, so = t.startOffset, ec = t.endContainer, eo = t.endOffset;\r
+               function compareBoundaryPoints(h, r) {\r
+                       var sc = t[START_CONTAINER], so = t[START_OFFSET], ec = t[END_CONTAINER], eo = t[END_OFFSET];\r
 \r
                        // Check START_TO_START\r
                        if (h === 0)\r
-                               return t._compareBoundaryPoints(sc, so, sc, so);\r
+                               return _compareBoundaryPoints(sc, so, sc, so);\r
 \r
                        // Check START_TO_END\r
                        if (h === 1)\r
-                               return t._compareBoundaryPoints(sc, so, ec, eo);\r
+                               return _compareBoundaryPoints(sc, so, ec, eo);\r
 \r
                        // Check END_TO_END\r
                        if (h === 2)\r
-                               return t._compareBoundaryPoints(ec, eo, ec, eo);\r
+                               return _compareBoundaryPoints(ec, eo, ec, eo);\r
 \r
                        // Check END_TO_START\r
                        if (h === 3)\r
-                               return t._compareBoundaryPoints(ec, eo, sc, so);\r
-               },\r
+                               return _compareBoundaryPoints(ec, eo, sc, so);\r
+               };\r
 \r
-               deleteContents : function() {\r
-                       this._traverse(DELETE);\r
-               },\r
+               function deleteContents() {\r
+                       _traverse(DELETE);\r
+               };\r
 \r
-               extractContents : function() {\r
-                       return this._traverse(EXTRACT);\r
-               },\r
+               function extractContents() {\r
+                       return _traverse(EXTRACT);\r
+               };\r
 \r
-               cloneContents : function() {\r
-                       return this._traverse(CLONE);\r
-               },\r
+               function cloneContents() {\r
+                       return _traverse(CLONE);\r
+               };\r
 \r
-               insertNode : function(n) {\r
-                       var t = this, nn, o;\r
+               function insertNode(n) {\r
+                       var startContainer = this[START_CONTAINER],\r
+                               startOffset = this[START_OFFSET], nn, o;\r
 \r
                        // Node is TEXT_NODE or CDATA\r
-                       if (n.nodeType === 3 || n.nodeType === 4) {\r
-                               nn = t.startContainer.splitText(t.startOffset);\r
-                               t.startContainer.parentNode.insertBefore(n, nn);\r
+                       if ((startContainer.nodeType === 3 || startContainer.nodeType === 4) && startContainer.nodeValue) {\r
+                               if (!startOffset) {\r
+                                       // At the start of text\r
+                                       startContainer.parentNode.insertBefore(n, startContainer);\r
+                               } else if (startOffset >= startContainer.nodeValue.length) {\r
+                                       // At the end of text\r
+                                       dom.insertAfter(n, startContainer);\r
+                               } else {\r
+                                       // Middle, need to split\r
+                                       nn = startContainer.splitText(startOffset);\r
+                                       startContainer.parentNode.insertBefore(n, nn);\r
+                               }\r
                        } else {\r
                                // Insert element node\r
-                               if (t.startContainer.childNodes.length > 0)\r
-                                       o = t.startContainer.childNodes[t.startOffset];\r
+                               if (startContainer.childNodes.length > 0)\r
+                                       o = startContainer.childNodes[startOffset];\r
 \r
-                               t.startContainer.insertBefore(n, o);\r
+                               if (o)\r
+                                       startContainer.insertBefore(n, o);\r
+                               else\r
+                                       startContainer.appendChild(n);\r
                        }\r
-               },\r
+               };\r
 \r
-               surroundContents : function(n) {\r
-                       var t = this, f = t.extractContents();\r
+               function surroundContents(n) {\r
+                       var f = t.extractContents();\r
 \r
                        t.insertNode(n);\r
                        n.appendChild(f);\r
                        t.selectNode(n);\r
-               },\r
-\r
-               cloneRange : function() {\r
-                       var t = this;\r
+               };\r
 \r
-                       return extend(new Range(t.dom), {\r
-                               startContainer : t.startContainer,\r
-                               startOffset : t.startOffset,\r
-                               endContainer : t.endContainer,\r
-                               endOffset : t.endOffset,\r
+               function cloneRange() {\r
+                       return extend(new Range(dom), {\r
+                               startContainer : t[START_CONTAINER],\r
+                               startOffset : t[START_OFFSET],\r
+                               endContainer : t[END_CONTAINER],\r
+                               endOffset : t[END_OFFSET],\r
                                collapsed : t.collapsed,\r
                                commonAncestorContainer : t.commonAncestorContainer\r
                        });\r
-               },\r
+               };\r
 \r
-/*\r
-               detach : function() {\r
-                       // Not implemented\r
-               },\r
-*/\r
-               // Internal methods\r
+               // Private methods\r
 \r
-               _isCollapsed : function() {\r
-                       return (this.startContainer == this.endContainer && this.startOffset == this.endOffset);\r
-               },\r
+               function _getSelectedNode(container, offset) {\r
+                       var child;\r
+\r
+                       if (container.nodeType == 3 /* TEXT_NODE */)\r
+                               return container;\r
+\r
+                       if (offset < 0)\r
+                               return container;\r
+\r
+                       child = container.firstChild;\r
+                       while (child && offset > 0) {\r
+                               --offset;\r
+                               child = child.nextSibling;\r
+                       }\r
 \r
-               _compareBoundaryPoints : function (containerA, offsetA, containerB, offsetB) {\r
+                       if (child)\r
+                               return child;\r
+\r
+                       return container;\r
+               };\r
+\r
+               function _isCollapsed() {\r
+                       return (t[START_CONTAINER] == t[END_CONTAINER] && t[START_OFFSET] == t[END_OFFSET]);\r
+               };\r
+\r
+               function _compareBoundaryPoints(containerA, offsetA, containerB, offsetB) {\r
                        var c, offsetC, n, cmnRoot, childA, childB;\r
 \r
-                       // In the first case the boundary-points have the same container. A is before B \r
-                       // if its offset is less than the offset of B, A is equal to B if its offset is \r
-                       // equal to the offset of B, and A is after B if its offset is greater than the \r
+                       // In the first case the boundary-points have the same container. A is before B\r
+                       // if its offset is less than the offset of B, A is equal to B if its offset is\r
+                       // equal to the offset of B, and A is after B if its offset is greater than the\r
                        // offset of B.\r
                        if (containerA == containerB) {\r
-                               if (offsetA == offsetB) {\r
+                               if (offsetA == offsetB)\r
                                        return 0; // equal\r
-                               } else if (offsetA < offsetB) {\r
+\r
+                               if (offsetA < offsetB)\r
                                        return -1; // before\r
-                               } else {\r
-                                       return 1; // after\r
-                               }\r
+\r
+                               return 1; // after\r
                        }\r
 \r
-                       // In the second case a child node C of the container of A is an ancestor \r
-                       // container of B. In this case, A is before B if the offset of A is less than or \r
+                       // In the second case a child node C of the container of A is an ancestor\r
+                       // container of B. In this case, A is before B if the offset of A is less than or\r
                        // equal to the index of the child node C and A is after B otherwise.\r
                        c = containerB;\r
-                       while (c && c.parentNode != containerA) {\r
+                       while (c && c.parentNode != containerA)\r
                                c = c.parentNode;\r
-                       }\r
+\r
                        if (c) {\r
                                offsetC = 0;\r
                                n = containerA.firstChild;\r
@@ -2579,15 +2816,14 @@ tinymce.create('static tinymce.util.XHR', {
                                        n = n.nextSibling;\r
                                }\r
 \r
-                               if (offsetA <= offsetC) {\r
+                               if (offsetA <= offsetC)\r
                                        return -1; // before\r
-                               } else {\r
-                                       return 1; // after\r
-                               }\r
+\r
+                               return 1; // after\r
                        }\r
 \r
-                       // In the third case a child node C of the container of B is an ancestor container \r
-                       // of A. In this case, A is before B if the index of the child node C is less than \r
+                       // In the third case a child node C of the container of B is an ancestor container\r
+                       // of A. In this case, A is before B if the index of the child node C is less than\r
                        // the offset of B and A is after B otherwise.\r
                        c = containerA;\r
                        while (c && c.parentNode != containerB) {\r
@@ -2603,124 +2839,113 @@ tinymce.create('static tinymce.util.XHR', {
                                        n = n.nextSibling;\r
                                }\r
 \r
-                               if (offsetC < offsetB) {\r
+                               if (offsetC < offsetB)\r
                                        return -1; // before\r
-                               } else {\r
-                                       return 1; // after\r
-                               }\r
+\r
+                               return 1; // after\r
                        }\r
 \r
-                       // In the fourth case, none of three other cases hold: the containers of A and B \r
-                       // are siblings or descendants of sibling nodes. In this case, A is before B if \r
+                       // In the fourth case, none of three other cases hold: the containers of A and B\r
+                       // are siblings or descendants of sibling nodes. In this case, A is before B if\r
                        // the container of A is before the container of B in a pre-order traversal of the\r
                        // Ranges' context tree and A is after B otherwise.\r
-                       cmnRoot = this.dom.findCommonAncestor(containerA, containerB);\r
+                       cmnRoot = dom.findCommonAncestor(containerA, containerB);\r
                        childA = containerA;\r
 \r
-                       while (childA && childA.parentNode != cmnRoot) {\r
-                               childA = childA.parentNode;  \r
-                       }\r
+                       while (childA && childA.parentNode != cmnRoot)\r
+                               childA = childA.parentNode;\r
 \r
-                       if (!childA) {\r
+                       if (!childA)\r
                                childA = cmnRoot;\r
-                       }\r
 \r
                        childB = containerB;\r
-                       while (childB && childB.parentNode != cmnRoot) {\r
+                       while (childB && childB.parentNode != cmnRoot)\r
                                childB = childB.parentNode;\r
-                       }\r
 \r
-                       if (!childB) {\r
+                       if (!childB)\r
                                childB = cmnRoot;\r
-                       }\r
 \r
-                       if (childA == childB) {\r
+                       if (childA == childB)\r
                                return 0; // equal\r
-                       }\r
 \r
                        n = cmnRoot.firstChild;\r
                        while (n) {\r
-                               if (n == childA) {\r
+                               if (n == childA)\r
                                        return -1; // before\r
-                               }\r
 \r
-                               if (n == childB) {\r
+                               if (n == childB)\r
                                        return 1; // after\r
-                               }\r
 \r
                                n = n.nextSibling;\r
                        }\r
-               },\r
+               };\r
 \r
-               _setEndPoint : function(st, n, o) {\r
-                       var t = this, ec, sc;\r
+               function _setEndPoint(st, n, o) {\r
+                       var ec, sc;\r
 \r
                        if (st) {\r
-                               t.startContainer = n;\r
-                               t.startOffset = o;\r
+                               t[START_CONTAINER] = n;\r
+                               t[START_OFFSET] = o;\r
                        } else {\r
-                               t.endContainer = n;\r
-                               t.endOffset = o;\r
+                               t[END_CONTAINER] = n;\r
+                               t[END_OFFSET] = o;\r
                        }\r
 \r
-                       // If one boundary-point of a Range is set to have a root container \r
-                       // other than the current one for the Range, the Range is collapsed to \r
+                       // If one boundary-point of a Range is set to have a root container\r
+                       // other than the current one for the Range, the Range is collapsed to\r
                        // the new position. This enforces the restriction that both boundary-\r
                        // points of a Range must have the same root container.\r
-                       ec = t.endContainer;\r
+                       ec = t[END_CONTAINER];\r
                        while (ec.parentNode)\r
                                ec = ec.parentNode;\r
 \r
-                       sc = t.startContainer;\r
+                       sc = t[START_CONTAINER];\r
                        while (sc.parentNode)\r
                                sc = sc.parentNode;\r
 \r
-                       if (sc != ec) {\r
-                               t.collapse(st);\r
-                       } else {\r
-                               // The start position of a Range is guaranteed to never be after the \r
-                               // end position. To enforce this restriction, if the start is set to \r
-                               // be at a position after the end, the Range is collapsed to that \r
+                       if (sc == ec) {\r
+                               // The start position of a Range is guaranteed to never be after the\r
+                               // end position. To enforce this restriction, if the start is set to\r
+                               // be at a position after the end, the Range is collapsed to that\r
                                // position.\r
-                               if (t._compareBoundaryPoints(t.startContainer, t.startOffset, t.endContainer, t.endOffset) > 0)\r
+                               if (_compareBoundaryPoints(t[START_CONTAINER], t[START_OFFSET], t[END_CONTAINER], t[END_OFFSET]) > 0)\r
                                        t.collapse(st);\r
-                       }\r
-\r
-                       t.collapsed = t._isCollapsed();\r
-                       t.commonAncestorContainer = t.dom.findCommonAncestor(t.startContainer, t.endContainer);\r
-               },\r
+                       } else\r
+                               t.collapse(st);\r
 \r
-               // This code is heavily "inspired" by the Apache Xerces implementation. I hope they don't mind. :)\r
+                       t.collapsed = _isCollapsed();\r
+                       t.commonAncestorContainer = dom.findCommonAncestor(t[START_CONTAINER], t[END_CONTAINER]);\r
+               };\r
 \r
-               _traverse : function(how) {\r
-                       var t = this, c, endContainerDepth = 0, startContainerDepth = 0, p, depthDiff, startNode, endNode, sp, ep;\r
+               function _traverse(how) {\r
+                       var c, endContainerDepth = 0, startContainerDepth = 0, p, depthDiff, startNode, endNode, sp, ep;\r
 \r
-                       if (t.startContainer == t.endContainer)\r
-                               return t._traverseSameContainer(how);\r
+                       if (t[START_CONTAINER] == t[END_CONTAINER])\r
+                               return _traverseSameContainer(how);\r
 \r
-                       for (c = t.endContainer, p = c.parentNode; p != null; c = p, p = p.parentNode) {\r
-                               if (p == t.startContainer)\r
-                                       return t._traverseCommonStartContainer(c, how);\r
+                       for (c = t[END_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) {\r
+                               if (p == t[START_CONTAINER])\r
+                                       return _traverseCommonStartContainer(c, how);\r
 \r
                                ++endContainerDepth;\r
                        }\r
 \r
-                       for (c = t.startContainer, p = c.parentNode; p != null; c = p, p = p.parentNode) {\r
-                               if (p == t.endContainer)\r
-                                       return t._traverseCommonEndContainer(c, how);\r
+                       for (c = t[START_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) {\r
+                               if (p == t[END_CONTAINER])\r
+                                       return _traverseCommonEndContainer(c, how);\r
 \r
                                ++startContainerDepth;\r
                        }\r
 \r
                        depthDiff = startContainerDepth - endContainerDepth;\r
 \r
-                       startNode = t.startContainer;\r
+                       startNode = t[START_CONTAINER];\r
                        while (depthDiff > 0) {\r
                                startNode = startNode.parentNode;\r
                                depthDiff--;\r
                        }\r
 \r
-                       endNode = t.endContainer;\r
+                       endNode = t[END_CONTAINER];\r
                        while (depthDiff < 0) {\r
                                endNode = endNode.parentNode;\r
                                depthDiff++;\r
@@ -2732,47 +2957,47 @@ tinymce.create('static tinymce.util.XHR', {
                                endNode = ep;\r
                        }\r
 \r
-                       return t._traverseCommonAncestors(startNode, endNode, how);\r
-               },\r
+                       return _traverseCommonAncestors(startNode, endNode, how);\r
+               };\r
 \r
-               _traverseSameContainer : function(how) {\r
-                       var t = this, frag, s, sub, n, cnt, sibling, xferNode;\r
+                function _traverseSameContainer(how) {\r
+                       var frag, s, sub, n, cnt, sibling, xferNode;\r
 \r
                        if (how != DELETE)\r
-                               frag = t.dom.doc.createDocumentFragment();\r
+                               frag = doc.createDocumentFragment();\r
 \r
                        // If selection is empty, just return the fragment\r
-                       if (t.startOffset == t.endOffset)\r
+                       if (t[START_OFFSET] == t[END_OFFSET])\r
                                return frag;\r
 \r
                        // Text node needs special case handling\r
-                       if (t.startContainer.nodeType == 3 /* TEXT_NODE */) {\r
+                       if (t[START_CONTAINER].nodeType == 3 /* TEXT_NODE */) {\r
                                // get the substring\r
-                               s = t.startContainer.nodeValue;\r
-                               sub = s.substring(t.startOffset, t.endOffset);\r
+                               s = t[START_CONTAINER].nodeValue;\r
+                               sub = s.substring(t[START_OFFSET], t[END_OFFSET]);\r
 \r
                                // set the original text node to its new value\r
                                if (how != CLONE) {\r
-                                       t.startContainer.deleteData(t.startOffset, t.endOffset - t.startOffset);\r
+                                       t[START_CONTAINER].deleteData(t[START_OFFSET], t[END_OFFSET] - t[START_OFFSET]);\r
 \r
                                        // Nothing is partially selected, so collapse to start point\r
-                                       t.collapse(true);\r
+                                       t.collapse(TRUE);\r
                                }\r
 \r
                                if (how == DELETE)\r
-                                       return null;\r
+                                       return;\r
 \r
-                               frag.appendChild(t.dom.doc.createTextNode(sub));\r
+                               frag.appendChild(doc.createTextNode(sub));\r
                                return frag;\r
                        }\r
 \r
                        // Copy nodes between the start/end offsets.\r
-                       n = getSelectedNode(t.startContainer, t.startOffset);\r
-                       cnt = t.endOffset - t.startOffset;\r
+                       n = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]);\r
+                       cnt = t[END_OFFSET] - t[START_OFFSET];\r
 \r
                        while (cnt > 0) {\r
                                sibling = n.nextSibling;\r
-                               xferNode = t._traverseFullySelected(n, how);\r
+                               xferNode = _traverseFullySelected(n, how);\r
 \r
                                if (frag)\r
                                        frag.appendChild( xferNode );\r
@@ -2783,31 +3008,31 @@ tinymce.create('static tinymce.util.XHR', {
 \r
                        // Nothing is partially selected, so collapse to start point\r
                        if (how != CLONE)\r
-                               t.collapse(true);\r
+                               t.collapse(TRUE);\r
 \r
                        return frag;\r
-               },\r
+               };\r
 \r
-               _traverseCommonStartContainer : function(endAncestor, how) {\r
-                       var t = this, frag, n, endIdx, cnt, sibling, xferNode;\r
+               function _traverseCommonStartContainer(endAncestor, how) {\r
+                       var frag, n, endIdx, cnt, sibling, xferNode;\r
 \r
                        if (how != DELETE)\r
-                               frag = t.dom.doc.createDocumentFragment();\r
+                               frag = doc.createDocumentFragment();\r
 \r
-                       n = t._traverseRightBoundary(endAncestor, how);\r
+                       n = _traverseRightBoundary(endAncestor, how);\r
 \r
                        if (frag)\r
                                frag.appendChild(n);\r
 \r
-                       endIdx = indexOf(endAncestor, t.startContainer);\r
-                       cnt = endIdx - t.startOffset;\r
+                       endIdx = nodeIndex(endAncestor);\r
+                       cnt = endIdx - t[START_OFFSET];\r
 \r
                        if (cnt <= 0) {\r
-                               // Collapse to just before the endAncestor, which \r
+                               // Collapse to just before the endAncestor, which\r
                                // is partially selected.\r
                                if (how != CLONE) {\r
                                        t.setEndBefore(endAncestor);\r
-                                       t.collapse(false);\r
+                                       t.collapse(FALSE);\r
                                }\r
 \r
                                return frag;\r
@@ -2816,7 +3041,7 @@ tinymce.create('static tinymce.util.XHR', {
                        n = endAncestor.previousSibling;\r
                        while (cnt > 0) {\r
                                sibling = n.previousSibling;\r
-                               xferNode = t._traverseFullySelected(n, how);\r
+                               xferNode = _traverseFullySelected(n, how);\r
 \r
                                if (frag)\r
                                        frag.insertBefore(xferNode, frag.firstChild);\r
@@ -2825,34 +3050,34 @@ tinymce.create('static tinymce.util.XHR', {
                                n = sibling;\r
                        }\r
 \r
-                       // Collapse to just before the endAncestor, which \r
+                       // Collapse to just before the endAncestor, which\r
                        // is partially selected.\r
                        if (how != CLONE) {\r
                                t.setEndBefore(endAncestor);\r
-                               t.collapse(false);\r
+                               t.collapse(FALSE);\r
                        }\r
 \r
                        return frag;\r
-               },\r
+               };\r
 \r
-               _traverseCommonEndContainer : function(startAncestor, how) {\r
-                       var t = this, frag, startIdx, n, cnt, sibling, xferNode;\r
+               function _traverseCommonEndContainer(startAncestor, how) {\r
+                       var frag, startIdx, n, cnt, sibling, xferNode;\r
 \r
                        if (how != DELETE)\r
-                               frag = t.dom.doc.createDocumentFragment();\r
+                               frag = doc.createDocumentFragment();\r
 \r
-                       n = t._traverseLeftBoundary(startAncestor, how);\r
+                       n = _traverseLeftBoundary(startAncestor, how);\r
                        if (frag)\r
                                frag.appendChild(n);\r
 \r
-                       startIdx = indexOf(startAncestor, t.endContainer);\r
+                       startIdx = nodeIndex(startAncestor);\r
                        ++startIdx;  // Because we already traversed it....\r
 \r
-                       cnt = t.endOffset - startIdx;\r
+                       cnt = t[END_OFFSET] - startIdx;\r
                        n = startAncestor.nextSibling;\r
                        while (cnt > 0) {\r
                                sibling = n.nextSibling;\r
-                               xferNode = t._traverseFullySelected(n, how);\r
+                               xferNode = _traverseFullySelected(n, how);\r
 \r
                                if (frag)\r
                                        frag.appendChild(xferNode);\r
@@ -2863,25 +3088,25 @@ tinymce.create('static tinymce.util.XHR', {
 \r
                        if (how != CLONE) {\r
                                t.setStartAfter(startAncestor);\r
-                               t.collapse(true);\r
+                               t.collapse(TRUE);\r
                        }\r
 \r
                        return frag;\r
-               },\r
+               };\r
 \r
-               _traverseCommonAncestors : function(startAncestor, endAncestor, how) {\r
-                       var t = this, n, frag, commonParent, startOffset, endOffset, cnt, sibling, nextSibling;\r
+               function _traverseCommonAncestors(startAncestor, endAncestor, how) {\r
+                       var n, frag, commonParent, startOffset, endOffset, cnt, sibling, nextSibling;\r
 \r
                        if (how != DELETE)\r
-                               frag = t.dom.doc.createDocumentFragment();\r
+                               frag = doc.createDocumentFragment();\r
 \r
-                       n = t._traverseLeftBoundary(startAncestor, how);\r
+                       n = _traverseLeftBoundary(startAncestor, how);\r
                        if (frag)\r
                                frag.appendChild(n);\r
 \r
                        commonParent = startAncestor.parentNode;\r
-                       startOffset = indexOf(startAncestor, commonParent);\r
-                       endOffset = indexOf(endAncestor, commonParent);\r
+                       startOffset = nodeIndex(startAncestor);\r
+                       endOffset = nodeIndex(endAncestor);\r
                        ++startOffset;\r
 \r
                        cnt = endOffset - startOffset;\r
@@ -2889,7 +3114,7 @@ tinymce.create('static tinymce.util.XHR', {
 \r
                        while (cnt > 0) {\r
                                nextSibling = sibling.nextSibling;\r
-                               n = t._traverseFullySelected(sibling, how);\r
+                               n = _traverseFullySelected(sibling, how);\r
 \r
                                if (frag)\r
                                        frag.appendChild(n);\r
@@ -2898,38 +3123,37 @@ tinymce.create('static tinymce.util.XHR', {
                                --cnt;\r
                        }\r
 \r
-                       n = t._traverseRightBoundary(endAncestor, how);\r
+                       n = _traverseRightBoundary(endAncestor, how);\r
 \r
                        if (frag)\r
                                frag.appendChild(n);\r
 \r
                        if (how != CLONE) {\r
                                t.setStartAfter(startAncestor);\r
-                               t.collapse(true);\r
+                               t.collapse(TRUE);\r
                        }\r
 \r
                        return frag;\r
-               },\r
+               };\r
 \r
-               _traverseRightBoundary : function(root, how) {\r
-                       var t = this, next = getSelectedNode(t.endContainer, t.endOffset - 1), parent, clonedParent, prevSibling, clonedChild, clonedGrandParent;\r
-                       var isFullySelected = next != t.endContainer;\r
+               function _traverseRightBoundary(root, how) {\r
+                       var next = _getSelectedNode(t[END_CONTAINER], t[END_OFFSET] - 1), parent, clonedParent, prevSibling, clonedChild, clonedGrandParent, isFullySelected = next != t[END_CONTAINER];\r
 \r
                        if (next == root)\r
-                               return t._traverseNode(next, isFullySelected, false, how);\r
+                               return _traverseNode(next, isFullySelected, FALSE, how);\r
 \r
                        parent = next.parentNode;\r
-                       clonedParent = t._traverseNode(parent, false, false, how);\r
+                       clonedParent = _traverseNode(parent, FALSE, FALSE, how);\r
 \r
-                       while (parent != null) {\r
-                               while (next != null) {\r
+                       while (parent) {\r
+                               while (next) {\r
                                        prevSibling = next.previousSibling;\r
-                                       clonedChild = t._traverseNode(next, isFullySelected, false, how);\r
+                                       clonedChild = _traverseNode(next, isFullySelected, FALSE, how);\r
 \r
                                        if (how != DELETE)\r
                                                clonedParent.insertBefore(clonedChild, clonedParent.firstChild);\r
 \r
-                                       isFullySelected = true;\r
+                                       isFullySelected = TRUE;\r
                                        next = prevSibling;\r
                                }\r
 \r
@@ -2939,37 +3163,33 @@ tinymce.create('static tinymce.util.XHR', {
                                next = parent.previousSibling;\r
                                parent = parent.parentNode;\r
 \r
-                               clonedGrandParent = t._traverseNode(parent, false, false, how);\r
+                               clonedGrandParent = _traverseNode(parent, FALSE, FALSE, how);\r
 \r
                                if (how != DELETE)\r
                                        clonedGrandParent.appendChild(clonedParent);\r
 \r
                                clonedParent = clonedGrandParent;\r
                        }\r
+               };\r
 \r
-                       // should never occur\r
-                       return null;\r
-               },\r
-\r
-               _traverseLeftBoundary : function(root, how) {\r
-                       var t = this, next = getSelectedNode(t.startContainer, t.startOffset);\r
-                       var isFullySelected = next != t.startContainer, parent, clonedParent, nextSibling, clonedChild, clonedGrandParent;\r
+               function _traverseLeftBoundary(root, how) {\r
+                       var next = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]), isFullySelected = next != t[START_CONTAINER], parent, clonedParent, nextSibling, clonedChild, clonedGrandParent;\r
 \r
                        if (next == root)\r
-                               return t._traverseNode(next, isFullySelected, true, how);\r
+                               return _traverseNode(next, isFullySelected, TRUE, how);\r
 \r
                        parent = next.parentNode;\r
-                       clonedParent = t._traverseNode(parent, false, true, how);\r
+                       clonedParent = _traverseNode(parent, FALSE, TRUE, how);\r
 \r
-                       while (parent != null) {\r
-                               while (next != null) {\r
+                       while (parent) {\r
+                               while (next) {\r
                                        nextSibling = next.nextSibling;\r
-                                       clonedChild = t._traverseNode(next, isFullySelected, true, how);\r
+                                       clonedChild = _traverseNode(next, isFullySelected, TRUE, how);\r
 \r
                                        if (how != DELETE)\r
                                                clonedParent.appendChild(clonedChild);\r
 \r
-                                       isFullySelected = true;\r
+                                       isFullySelected = TRUE;\r
                                        next = nextSibling;\r
                                }\r
 \r
@@ -2979,33 +3199,30 @@ tinymce.create('static tinymce.util.XHR', {
                                next = parent.nextSibling;\r
                                parent = parent.parentNode;\r
 \r
-                               clonedGrandParent = t._traverseNode(parent, false, true, how);\r
+                               clonedGrandParent = _traverseNode(parent, FALSE, TRUE, how);\r
 \r
                                if (how != DELETE)\r
                                        clonedGrandParent.appendChild(clonedParent);\r
 \r
                                clonedParent = clonedGrandParent;\r
                        }\r
+               };\r
 \r
-                       // should never occur\r
-                       return null;\r
-               },\r
-\r
-               _traverseNode : function(n, isFullySelected, isLeft, how) {\r
-                       var t = this, txtValue, newNodeValue, oldNodeValue, offset, newNode;\r
+               function _traverseNode(n, isFullySelected, isLeft, how) {\r
+                       var txtValue, newNodeValue, oldNodeValue, offset, newNode;\r
 \r
                        if (isFullySelected)\r
-                               return t._traverseFullySelected(n, how);\r
+                               return _traverseFullySelected(n, how);\r
 \r
                        if (n.nodeType == 3 /* TEXT_NODE */) {\r
                                txtValue = n.nodeValue;\r
 \r
                                if (isLeft) {\r
-                                       offset = t.startOffset;\r
+                                       offset = t[START_OFFSET];\r
                                        newNodeValue = txtValue.substring(offset);\r
                                        oldNodeValue = txtValue.substring(0, offset);\r
                                } else {\r
-                                       offset = t.endOffset;\r
+                                       offset = t[END_OFFSET];\r
                                        newNodeValue = txtValue.substring(0, offset);\r
                                        oldNodeValue = txtValue.substring(offset);\r
                                }\r
@@ -3014,102 +3231,38 @@ tinymce.create('static tinymce.util.XHR', {
                                        n.nodeValue = oldNodeValue;\r
 \r
                                if (how == DELETE)\r
-                                       return null;\r
+                                       return;\r
 \r
-                               newNode = n.cloneNode(false);\r
+                               newNode = n.cloneNode(FALSE);\r
                                newNode.nodeValue = newNodeValue;\r
 \r
                                return newNode;\r
                        }\r
 \r
                        if (how == DELETE)\r
-                               return null;\r
-\r
-                       return n.cloneNode(false);\r
-               },\r
+                               return;\r
 \r
-               _traverseFullySelected : function(n, how) {\r
-                       var t = this;\r
+                       return n.cloneNode(FALSE);\r
+               };\r
 \r
+               function _traverseFullySelected(n, how) {\r
                        if (how != DELETE)\r
-                               return how == CLONE ? n.cloneNode(true) : n;\r
+                               return how == CLONE ? n.cloneNode(TRUE) : n;\r
 \r
                        n.parentNode.removeChild(n);\r
-                       return null;\r
-               }\r
-       });\r
+               };\r
+       };\r
 \r
        ns.Range = Range;\r
 })(tinymce.dom);\r
+\r
 (function() {\r
        function Selection(selection) {\r
-               var t = this, invisibleChar = '\uFEFF', range, lastIERng;\r
-\r
-               function compareRanges(rng1, rng2) {\r
-                       if (rng1 && rng2) {\r
-                               // Both are control ranges and the selected element matches\r
-                               if (rng1.item && rng2.item && rng1.item(0) === rng2.item(0))\r
-                                       return 1;\r
-\r
-                               // Both are text ranges and the range matches\r
-                               if (rng1.isEqual && rng2.isEqual && rng2.isEqual(rng1))\r
-                                       return 1;\r
-                       }\r
-\r
-                       return 0;\r
-               };\r
+               var t = this, invisibleChar = '\uFEFF', range, lastIERng, dom = selection.dom, TRUE = true, FALSE = false;\r
 \r
+               // Returns a W3C DOM compatible range object by using the IE Range API\r
                function getRange() {\r
-                       var dom = selection.dom, ieRange = selection.getRng(), domRange = dom.createRng(), startPos, endPos, element, sc, ec, collapsed;\r
-\r
-                       function findIndex(element) {\r
-                               var nl = element.parentNode.childNodes, i;\r
-\r
-                               for (i = nl.length - 1; i >= 0; i--) {\r
-                                       if (nl[i] == element)\r
-                                               return i;\r
-                               }\r
-\r
-                               return -1;\r
-                       };\r
-\r
-                       function findEndPoint(start) {\r
-                               var rng = ieRange.duplicate(), parent, i, nl, n, offset = 0, index = 0, pos, tmpRng;\r
-\r
-                               // Insert marker character\r
-                               rng.collapse(start);\r
-                               parent = rng.parentElement();\r
-                               rng.pasteHTML(invisibleChar); // Needs to be a pasteHTML instead of .text = since IE has a bug with nodeValue\r
-\r
-                               // Find marker character\r
-                               nl = parent.childNodes;\r
-                               for (i = 0; i < nl.length; i++) {\r
-                                       n = nl[i];\r
-\r
-                                       // Calculate node index excluding text node fragmentation\r
-                                       if (i > 0 && (n.nodeType !== 3 || nl[i - 1].nodeType !== 3))\r
-                                               index++;\r
-\r
-                                       // If text node then calculate offset\r
-                                       if (n.nodeType === 3) {\r
-                                               // Look for marker\r
-                                               pos = n.nodeValue.indexOf(invisibleChar);\r
-                                               if (pos !== -1) {\r
-                                                       offset += pos;\r
-                                                       break;\r
-                                               }\r
-\r
-                                               offset += n.nodeValue.length;\r
-                                       } else\r
-                                               offset = 0;\r
-                               }\r
-\r
-                               // Remove marker character\r
-                               rng.moveStart('character', -1);\r
-                               rng.text = '';\r
-\r
-                               return {index : index, offset : offset, parent : parent};\r
-                       };\r
+                       var ieRange = selection.getRng(), domRange = dom.createRng(), element, collapsed;\r
 \r
                        // If selection is outside the current document just return an empty range\r
                        element = ieRange.item ? ieRange.item(0) : ieRange.parentElement();\r
@@ -3118,61 +3271,110 @@ tinymce.create('static tinymce.util.XHR', {
 \r
                        // Handle control selection or text selection of a image\r
                        if (ieRange.item || !element.hasChildNodes()) {\r
-                               domRange.setStart(element.parentNode, findIndex(element));\r
+                               domRange.setStart(element.parentNode, dom.nodeIndex(element));\r
                                domRange.setEnd(domRange.startContainer, domRange.startOffset + 1);\r
 \r
                                return domRange;\r
                        }\r
 \r
-                       // Check collapsed state\r
                        collapsed = selection.isCollapsed();\r
 \r
-                       // Find start and end pos index and offset\r
-                       startPos = findEndPoint(true);\r
-                       endPos = findEndPoint(false);\r
+                       function findEndPoint(start) {\r
+                               var marker, container, offset, nodes, startIndex = 0, endIndex, index, parent, checkRng, position;\r
 \r
-                       // Normalize the elements to avoid fragmented dom\r
-                       startPos.parent.normalize();\r
-                       endPos.parent.normalize();\r
+                               // Setup temp range and collapse it\r
+                               checkRng = ieRange.duplicate();\r
+                               checkRng.collapse(start);\r
 \r
-                       // Set start container and offset\r
-                       sc = startPos.parent.childNodes[Math.min(startPos.index, startPos.parent.childNodes.length - 1)];\r
+                               // Create marker and insert it at the end of the endpoints parent\r
+                               marker = dom.create('a');\r
+                               parent = checkRng.parentElement();\r
 \r
-                       if (sc.nodeType != 3)\r
-                               domRange.setStart(startPos.parent, startPos.index);\r
-                       else\r
-                               domRange.setStart(startPos.parent.childNodes[startPos.index], startPos.offset);\r
+                               // If parent doesn't have any children then set the container to that parent and the index to 0\r
+                               if (!parent.hasChildNodes()) {\r
+                                       domRange[start ? 'setStart' : 'setEnd'](parent, 0);\r
+                                       return;\r
+                               }\r
+\r
+                               parent.appendChild(marker);\r
+                               checkRng.moveToElementText(marker);\r
+                               position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng);\r
+                               if (position > 0) {\r
+                                       // The position is after the end of the parent element.\r
+                                       // This is the case where IE puts the caret to the left edge of a table.\r
+                                       domRange[start ? 'setStartAfter' : 'setEndAfter'](parent);\r
+                                       dom.remove(marker);\r
+                                       return;\r
+                               }\r
 \r
-                       // Set end container and offset\r
-                       ec = endPos.parent.childNodes[Math.min(endPos.index, endPos.parent.childNodes.length - 1)];\r
+                               // Setup node list and endIndex\r
+                               nodes = tinymce.grep(parent.childNodes);\r
+                               endIndex = nodes.length - 1;\r
+                               // Perform a binary search for the position\r
+                               while (startIndex <= endIndex) {\r
+                                       index = Math.floor((startIndex + endIndex) / 2);\r
+\r
+                                       // Insert marker and check it's position relative to the selection\r
+                                       parent.insertBefore(marker, nodes[index]);\r
+                                       checkRng.moveToElementText(marker);\r
+                                       position = ieRange.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', checkRng);\r
+                                       if (position > 0) {\r
+                                               // Marker is to the right\r
+                                               startIndex = index + 1;\r
+                                       } else if (position < 0) {\r
+                                               // Marker is to the left\r
+                                               endIndex = index - 1;\r
+                                       } else {\r
+                                               // Maker is where we are\r
+                                               found = true;\r
+                                               break;\r
+                                       }\r
+                               }\r
 \r
-                       if (ec.nodeType != 3) {\r
-                               if (!collapsed)\r
-                                       endPos.index++;\r
+                               // Setup container\r
+                               container = position > 0 || index == 0 ? marker.nextSibling : marker.previousSibling;\r
 \r
-                               domRange.setEnd(endPos.parent, endPos.index);\r
-                       } else\r
-                               domRange.setEnd(endPos.parent.childNodes[endPos.index], endPos.offset);\r
+                               // Handle element selection\r
+                               if (container.nodeType == 1) {\r
+                                       dom.remove(marker);\r
 \r
-                       // If not collapsed then make sure offsets are valid\r
-                       if (!collapsed) {\r
-                               sc = domRange.startContainer;\r
-                               if (sc.nodeType == 1)\r
-                                       domRange.setStart(sc, Math.min(domRange.startOffset, sc.childNodes.length));\r
+                                       // Find offset and container\r
+                                       offset = dom.nodeIndex(container);\r
+                                       container = container.parentNode;\r
 \r
-                               ec = domRange.endContainer;\r
-                               if (ec.nodeType == 1)\r
-                                       domRange.setEnd(ec, Math.min(domRange.endOffset, ec.childNodes.length));\r
-                       }\r
+                                       // Move the offset if we are setting the end or the position is after an element\r
+                                       if (!start || index > 0)\r
+                                               offset++;\r
+                               } else {\r
+                                       // Calculate offset within text node\r
+                                       if (position > 0 || index == 0) {\r
+                                               checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange);\r
+                                               offset = checkRng.text.length;\r
+                                       } else {\r
+                                               checkRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', ieRange);\r
+                                               offset = container.nodeValue.length - checkRng.text.length;\r
+                                       }\r
+\r
+                                       dom.remove(marker);\r
+                               }\r
+\r
+                               domRange[start ? 'setStart' : 'setEnd'](container, offset);\r
+                       };\r
+\r
+                       // Find start point\r
+                       findEndPoint(true);\r
 \r
-                       // Restore selection to new range\r
-                       t.addRange(domRange);\r
+                       // Find end point if needed\r
+                       if (!collapsed)\r
+                               findEndPoint();\r
 \r
                        return domRange;\r
                };\r
 \r
                this.addRange = function(rng) {\r
-                       var ieRng, body = selection.dom.doc.body, startPos, endPos, sc, so, ec, eo;\r
+                       var ieRng, ieRng2, doc = selection.dom.doc, body = doc.body, startPos, endPos, sc, so, ec, eo, marker, lastIndex, skipStart, skipEnd;\r
+\r
+                       this.destroy();\r
 \r
                        // Setup some shorter versions\r
                        sc = rng.startContainer;\r
@@ -3181,9 +3383,45 @@ tinymce.create('static tinymce.util.XHR', {
                        eo = rng.endOffset;\r
                        ieRng = body.createTextRange();\r
 \r
-                       // Find element\r
-                       sc = sc.nodeType == 1 ? sc.childNodes[Math.min(so, sc.childNodes.length - 1)] : sc;\r
-                       ec = ec.nodeType == 1 ? ec.childNodes[Math.min(so == eo ? eo : eo - 1, ec.childNodes.length - 1)] : ec;\r
+                       // If document selection move caret to first node in document\r
+                       if (sc == doc || ec == doc) {\r
+                               ieRng = body.createTextRange();\r
+                               ieRng.collapse();\r
+                               ieRng.select();\r
+                               return;\r
+                       }\r
+\r
+                       // If child index resolve it\r
+                       if (sc.nodeType == 1 && sc.hasChildNodes()) {\r
+                               lastIndex = sc.childNodes.length - 1;\r
+\r
+                               // Index is higher that the child count then we need to jump over the start container\r
+                               if (so > lastIndex) {\r
+                                       skipStart = 1;\r
+                                       sc = sc.childNodes[lastIndex];\r
+                               } else\r
+                                       sc = sc.childNodes[so];\r
+\r
+                               // Child was text node then move offset to start of it\r
+                               if (sc.nodeType == 3)\r
+                                       so = 0;\r
+                       }\r
+\r
+                       // If child index resolve it\r
+                       if (ec.nodeType == 1 && ec.hasChildNodes()) {\r
+                               lastIndex = ec.childNodes.length - 1;\r
+\r
+                               if (eo == 0) {\r
+                                       skipEnd = 1;\r
+                                       ec = ec.childNodes[0];\r
+                               } else {\r
+                                       ec = ec.childNodes[Math.min(lastIndex, eo - 1)];\r
+\r
+                                       // Child was text node then move offset to end of text node\r
+                                       if (ec.nodeType == 3)\r
+                                               eo = ec.nodeValue.length;\r
+                               }\r
+                       }\r
 \r
                        // Single element selection\r
                        if (sc == ec && sc.nodeType == 1) {\r
@@ -3203,7 +3441,7 @@ tinymce.create('static tinymce.util.XHR', {
 \r
                                        // If it's only containing a padding remove it so the caret remains\r
                                        if (sc.innerHTML == invisibleChar) {\r
-                                               ieRng.collapse(true);\r
+                                               ieRng.collapse(TRUE);\r
                                                sc.removeChild(sc.firstChild);\r
                                        }\r
                                }\r
@@ -3212,88 +3450,93 @@ tinymce.create('static tinymce.util.XHR', {
                                        ieRng.collapse(eo <= rng.endContainer.childNodes.length - 1);\r
 \r
                                ieRng.select();\r
-\r
+                               ieRng.scrollIntoView();\r
                                return;\r
                        }\r
 \r
-                       function getCharPos(container, offset) {\r
-                               var nodeVal, rng, pos;\r
-\r
-                               if (container.nodeType != 3)\r
-                                       return -1;\r
-\r
-                               nodeVal = container.nodeValue;\r
-                               rng = body.createTextRange();\r
-\r
-                               // Insert marker at offset position\r
-                               container.nodeValue = nodeVal.substring(0, offset) + invisibleChar + nodeVal.substring(offset);\r
-\r
-                               // Find char pos of marker and remove it\r
-                               rng.moveToElementText(container.parentNode);\r
-                               rng.findText(invisibleChar);\r
-                               pos = Math.abs(rng.moveStart('character', -0xFFFFF));\r
-                               container.nodeValue = nodeVal;\r
-\r
-                               return pos;\r
-                       };\r
+                       // Create range and marker\r
+                       ieRng = body.createTextRange();\r
+                       marker = doc.createElement('span');\r
+                       marker.innerHTML = ' ';\r
 \r
-                       // Collapsed range\r
-                       if (rng.collapsed) {\r
-                               pos = getCharPos(sc, so);\r
+                       // Set start of range to startContainer/startOffset\r
+                       if (sc.nodeType == 3) {\r
+                               // Insert marker after/before startContainer\r
+                               if (skipStart)\r
+                                       dom.insertAfter(marker, sc);\r
+                               else\r
+                                       sc.parentNode.insertBefore(marker, sc);\r
 \r
-                               ieRng = body.createTextRange();\r
-                               ieRng.move('character', pos);\r
-                               ieRng.select();\r
+                               // Select marker the caret to offset position\r
+                               ieRng.moveToElementText(marker);\r
+                               marker.parentNode.removeChild(marker);\r
 \r
-                               return;\r
+                               // Move if we need to, moving it 0 characters actually moves it!\r
+                               if (so > 0)\r
+                                       ieRng.move('character', so);\r
                        } else {\r
-                               // If same text container\r
-                               if (sc == ec && sc.nodeType == 3) {\r
-                                       startPos = getCharPos(sc, so);\r
+                               ieRng.moveToElementText(sc);\r
+\r
+                               if (skipStart)\r
+                                       ieRng.collapse(FALSE);\r
+                       }\r
 \r
-                                       ieRng.move('character', startPos);\r
+                       // If same text container then we can do a more simple move\r
+                       if (sc == ec && sc.nodeType == 3) {\r
+                               try {\r
                                        ieRng.moveEnd('character', eo - so);\r
                                        ieRng.select();\r
-\r
-                                       return;\r
+                                       ieRng.scrollIntoView();\r
+                               } catch (ex) {\r
+                                       // Some times a Runtime error of the 800a025e type gets thrown\r
+                                       // especially when the caret is placed before a table.\r
+                                       // This is a somewhat strange location for the caret.\r
+                                       // TODO: Find a better solution for this would possible require a rewrite of the setRng method\r
                                }\r
 \r
-                               // Get caret positions\r
-                               startPos = getCharPos(sc, so);\r
-                               endPos = getCharPos(ec, eo);\r
-                               ieRng = body.createTextRange();\r
-\r
-                               // Move start of range to start character position or start element\r
-                               if (startPos == -1) {\r
-                                       ieRng.moveToElementText(sc);\r
-                                       startPos = 0;\r
-                               } else\r
-                                       ieRng.move('character', startPos);\r
-\r
-                               // Move end of range to end character position or end element\r
-                               tmpRng = body.createTextRange();\r
-\r
-                               if (endPos == -1)\r
-                                       tmpRng.moveToElementText(ec);\r
-                               else\r
-                                       tmpRng.move('character', endPos);\r
+                               return;\r
+                       }\r
 \r
-                               ieRng.setEndPoint('EndToEnd', tmpRng);\r
-                               ieRng.select();\r
+                       // Set end of range to endContainer/endOffset\r
+                       ieRng2 = body.createTextRange();\r
+                       if (ec.nodeType == 3) {\r
+                               // Insert marker after/before startContainer\r
+                               ec.parentNode.insertBefore(marker, ec);\r
 \r
-                               return;\r
+                               // Move selection to end marker and move caret to end offset\r
+                               ieRng2.moveToElementText(marker);\r
+                               marker.parentNode.removeChild(marker);\r
+                               ieRng2.move('character', eo);\r
+                               ieRng.setEndPoint('EndToStart', ieRng2);\r
+                       } else {\r
+                               ieRng2.moveToElementText(ec);\r
+                               ieRng2.collapse(!!skipEnd);\r
+                               ieRng.setEndPoint('EndToEnd', ieRng2);\r
                        }\r
+\r
+                       ieRng.select();\r
+                       ieRng.scrollIntoView();\r
                };\r
 \r
                this.getRangeAt = function() {\r
                        // Setup new range if the cache is empty\r
-                       if (!range || !compareRanges(lastIERng, selection.getRng())) {\r
+                       if (!range || !tinymce.dom.RangeUtils.compareRanges(lastIERng, selection.getRng())) {\r
                                range = getRange();\r
 \r
                                // Store away text range for next call\r
                                lastIERng = selection.getRng();\r
                        }\r
 \r
+                       // IE will say that the range is equal then produce an invalid argument exception\r
+                       // if you perform specific operations in a keyup event. For example Ctrl+Del.\r
+                       // This hack will invalidate the range cache if the exception occurs\r
+                       try {\r
+                               range.startContainer.nextSibling;\r
+                       } catch (ex) {\r
+                               range = getRange();\r
+                               lastIERng = null;\r
+                       }\r
+\r
                        // Return cached range\r
                        return range;\r
                };\r
@@ -3302,12 +3545,86 @@ tinymce.create('static tinymce.util.XHR', {
                        // Destroy cached range and last IE range to avoid memory leaks\r
                        lastIERng = range = null;\r
                };\r
+\r
+               // IE has an issue where you can't select/move the caret by clicking outside the body if the document is in standards mode\r
+               if (selection.dom.boxModel) {\r
+                       (function() {\r
+                               var doc = dom.doc, body = doc.body, started, startRng;\r
+\r
+                               // Make HTML element unselectable since we are going to handle selection by hand\r
+                               doc.documentElement.unselectable = TRUE;\r
+\r
+                               // Return range from point or null if it failed\r
+                               function rngFromPoint(x, y) {\r
+                                       var rng = body.createTextRange();\r
+\r
+                                       try {\r
+                                               rng.moveToPoint(x, y);\r
+                                       } catch (ex) {\r
+                                               // IE sometimes throws and exception, so lets just ignore it\r
+                                               rng = null;\r
+                                       }\r
+\r
+                                       return rng;\r
+                               };\r
+\r
+                               // Fires while the selection is changing\r
+                               function selectionChange(e) {\r
+                                       var pointRng;\r
+\r
+                                       // Check if the button is down or not\r
+                                       if (e.button) {\r
+                                               // Create range from mouse position\r
+                                               pointRng = rngFromPoint(e.x, e.y);\r
+\r
+                                               if (pointRng) {\r
+                                                       // Check if pointRange is before/after selection then change the endPoint\r
+                                                       if (pointRng.compareEndPoints('StartToStart', startRng) > 0)\r
+                                                               pointRng.setEndPoint('StartToStart', startRng);\r
+                                                       else\r
+                                                               pointRng.setEndPoint('EndToEnd', startRng);\r
+\r
+                                                       pointRng.select();\r
+                                               }\r
+                                       } else\r
+                                               endSelection();\r
+                               }\r
+\r
+                               // Removes listeners\r
+                               function endSelection() {\r
+                                       dom.unbind(doc, 'mouseup', endSelection);\r
+                                       dom.unbind(doc, 'mousemove', selectionChange);\r
+                                       started = 0;\r
+                               };\r
+\r
+                               // Detect when user selects outside BODY\r
+                               dom.bind(doc, 'mousedown', function(e) {\r
+                                       if (e.target.nodeName === 'HTML') {\r
+                                               if (started)\r
+                                                       endSelection();\r
+\r
+                                               started = 1;\r
+\r
+                                               // Setup start position\r
+                                               startRng = rngFromPoint(e.x, e.y);\r
+                                               if (startRng) {\r
+                                                       // Listen for selection change events\r
+                                                       dom.bind(doc, 'mouseup', endSelection);\r
+                                                       dom.bind(doc, 'mousemove', selectionChange);\r
+\r
+                                                       startRng.select();\r
+                                               }\r
+                                       }\r
+                               });\r
+                       })();\r
+               }\r
        };\r
 \r
        // Expose the selection object\r
        tinymce.dom.TridentSelection = Selection;\r
 })();\r
 \r
+\r
 /*\r
  * Sizzle CSS Selector Engine - v1.0\r
  *  Copyright 2009, The Dojo Foundation\r
@@ -3316,14 +3633,26 @@ tinymce.create('static tinymce.util.XHR', {
  */\r
 (function(){\r
 \r
-var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,\r
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,\r
        done = 0,\r
        toString = Object.prototype.toString,\r
-       hasDuplicate = false;\r
+       hasDuplicate = false,\r
+       baseHasDuplicate = true;\r
+\r
+// Here we check if the JavaScript engine is using some sort of\r
+// optimization where it does not always call our comparision\r
+// function. If that is the case, discard the hasDuplicate value.\r
+//   Thus far that includes Google Chrome.\r
+[0, 0].sort(function(){\r
+       baseHasDuplicate = false;\r
+       return 0;\r
+});\r
 \r
 var Sizzle = function(selector, context, results, seed) {\r
        results = results || [];\r
-       var origContext = context = context || document;\r
+       context = context || document;\r
+\r
+       var origContext = context;\r
 \r
        if ( context.nodeType !== 1 && context.nodeType !== 9 ) {\r
                return [];\r
@@ -3333,19 +3662,25 @@ var Sizzle = function(selector, context, results, seed) {
                return results;\r
        }\r
 \r
-       var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context);\r
+       var parts = [], m, set, checkSet, extra, prune = true, contextXML = Sizzle.isXML(context),\r
+               soFar = selector, ret, cur, pop, i;\r
        \r
        // Reset the position of the chunker regexp (start from head)\r
-       chunker.lastIndex = 0;\r
-       \r
-       while ( (m = chunker.exec(selector)) !== null ) {\r
-               parts.push( m[1] );\r
+       do {\r
+               chunker.exec("");\r
+               m = chunker.exec(soFar);\r
+\r
+               if ( m ) {\r
+                       soFar = m[3];\r
+               \r
+                       parts.push( m[1] );\r
                \r
-               if ( m[2] ) {\r
-                       extra = RegExp.rightContext;\r
-                       break;\r
+                       if ( m[2] ) {\r
+                               extra = m[3];\r
+                               break;\r
+                       }\r
                }\r
-       }\r
+       } while ( m );\r
 \r
        if ( parts.length > 1 && origPOS.exec( selector ) ) {\r
                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {\r
@@ -3358,9 +3693,10 @@ var Sizzle = function(selector, context, results, seed) {
                        while ( parts.length ) {\r
                                selector = parts.shift();\r
 \r
-                               if ( Expr.relative[ selector ] )\r
+                               if ( Expr.relative[ selector ] ) {\r
                                        selector += parts.shift();\r
-\r
+                               }\r
+                               \r
                                set = posProcess( selector, set );\r
                        }\r
                }\r
@@ -3369,12 +3705,12 @@ var Sizzle = function(selector, context, results, seed) {
                // (but not if it'll be faster if the inner selector is an ID)\r
                if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&\r
                                Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {\r
-                       var ret = Sizzle.find( parts.shift(), context, contextXML );\r
+                       ret = Sizzle.find( parts.shift(), context, contextXML );\r
                        context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];\r
                }\r
 \r
                if ( context ) {\r
-                       var ret = seed ?\r
+                       ret = seed ?\r
                                { expr: parts.pop(), set: makeArray(seed) } :\r
                                Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );\r
                        set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;\r
@@ -3386,7 +3722,8 @@ var Sizzle = function(selector, context, results, seed) {
                        }\r
 \r
                        while ( parts.length ) {\r
-                               var cur = parts.pop(), pop = cur;\r
+                               cur = parts.pop();\r
+                               pop = cur;\r
 \r
                                if ( !Expr.relative[ cur ] ) {\r
                                        cur = "";\r
@@ -3410,20 +3747,20 @@ var Sizzle = function(selector, context, results, seed) {
        }\r
 \r
        if ( !checkSet ) {\r
-               throw "Syntax error, unrecognized expression: " + (cur || selector);\r
+               Sizzle.error( cur || selector );\r
        }\r
 \r
        if ( toString.call(checkSet) === "[object Array]" ) {\r
                if ( !prune ) {\r
                        results.push.apply( results, checkSet );\r
                } else if ( context && context.nodeType === 1 ) {\r
-                       for ( var i = 0; checkSet[i] != null; i++ ) {\r
-                               if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {\r
+                       for ( i = 0; checkSet[i] != null; i++ ) {\r
+                               if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {\r
                                        results.push( set[i] );\r
                                }\r
                        }\r
                } else {\r
-                       for ( var i = 0; checkSet[i] != null; i++ ) {\r
+                       for ( i = 0; checkSet[i] != null; i++ ) {\r
                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {\r
                                        results.push( set[i] );\r
                                }\r
@@ -3443,7 +3780,7 @@ var Sizzle = function(selector, context, results, seed) {
 \r
 Sizzle.uniqueSort = function(results){\r
        if ( sortOrder ) {\r
-               hasDuplicate = false;\r
+               hasDuplicate = baseHasDuplicate;\r
                results.sort(sortOrder);\r
 \r
                if ( hasDuplicate ) {\r
@@ -3454,6 +3791,8 @@ Sizzle.uniqueSort = function(results){
                        }\r
                }\r
        }\r
+\r
+       return results;\r
 };\r
 \r
 Sizzle.matches = function(expr, set){\r
@@ -3461,7 +3800,7 @@ Sizzle.matches = function(expr, set){
 };\r
 \r
 Sizzle.find = function(expr, context, isXML){\r
-       var set, match;\r
+       var set;\r
 \r
        if ( !expr ) {\r
                return [];\r
@@ -3470,8 +3809,9 @@ Sizzle.find = function(expr, context, isXML){
        for ( var i = 0, l = Expr.order.length; i < l; i++ ) {\r
                var type = Expr.order[i], match;\r
                \r
-               if ( (match = Expr.match[ type ].exec( expr )) ) {\r
-                       var left = RegExp.leftContext;\r
+               if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {\r
+                       var left = match[1];\r
+                       match.splice(1,1);\r
 \r
                        if ( left.substr( left.length - 1 ) !== "\\" ) {\r
                                match[1] = (match[1] || "").replace(/\\/g, "");\r
@@ -3493,15 +3833,21 @@ Sizzle.find = function(expr, context, isXML){
 \r
 Sizzle.filter = function(expr, set, inplace, not){\r
        var old = expr, result = [], curLoop = set, match, anyFound,\r
-               isXMLFilter = set && set[0] && isXML(set[0]);\r
+               isXMLFilter = set && set[0] && Sizzle.isXML(set[0]);\r
 \r
        while ( expr && set.length ) {\r
                for ( var type in Expr.filter ) {\r
-                       if ( (match = Expr.match[ type ].exec( expr )) != null ) {\r
-                               var filter = Expr.filter[ type ], found, item;\r
+                       if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {\r
+                               var filter = Expr.filter[ type ], found, item, left = match[1];\r
                                anyFound = false;\r
 \r
-                               if ( curLoop == result ) {\r
+                               match.splice(1,1);\r
+\r
+                               if ( left.substr( left.length - 1 ) === "\\" ) {\r
+                                       continue;\r
+                               }\r
+\r
+                               if ( curLoop === result ) {\r
                                        result = [];\r
                                }\r
 \r
@@ -3552,9 +3898,9 @@ Sizzle.filter = function(expr, set, inplace, not){
                }\r
 \r
                // Improper expression\r
-               if ( expr == old ) {\r
+               if ( expr === old ) {\r
                        if ( anyFound == null ) {\r
-                               throw "Syntax error, unrecognized expression: " + expr;\r
+                               Sizzle.error( expr );\r
                        } else {\r
                                break;\r
                        }\r
@@ -3566,18 +3912,23 @@ Sizzle.filter = function(expr, set, inplace, not){
        return curLoop;\r
 };\r
 \r
+Sizzle.error = function( msg ) {\r
+       throw "Syntax error, unrecognized expression: " + msg;\r
+};\r
+\r
 var Expr = Sizzle.selectors = {\r
        order: [ "ID", "NAME", "TAG" ],\r
        match: {\r
-               ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,\r
-               CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,\r
-               NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,\r
-               ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,\r
-               TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,\r
-               CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,\r
-               POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,\r
-               PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/\r
+               ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,\r
+               CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,\r
+               NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,\r
+               ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,\r
+               TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,\r
+               CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,\r
+               POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,\r
+               PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/\r
        },\r
+       leftMatch: {},\r
        attrMap: {\r
                "class": "className",\r
                "for": "htmlFor"\r
@@ -3588,20 +3939,20 @@ var Expr = Sizzle.selectors = {
                }\r
        },\r
        relative: {\r
-               "+": function(checkSet, part, isXML){\r
+               "+": function(checkSet, part){\r
                        var isPartStr = typeof part === "string",\r
                                isTag = isPartStr && !/\W/.test(part),\r
                                isPartStrNotTag = isPartStr && !isTag;\r
 \r
-                       if ( isTag && !isXML ) {\r
-                               part = part.toUpperCase();\r
+                       if ( isTag ) {\r
+                               part = part.toLowerCase();\r
                        }\r
 \r
                        for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {\r
                                if ( (elem = checkSet[i]) ) {\r
                                        while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}\r
 \r
-                                       checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?\r
+                                       checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?\r
                                                elem || false :\r
                                                elem === part;\r
                                }\r
@@ -3611,22 +3962,23 @@ var Expr = Sizzle.selectors = {
                                Sizzle.filter( part, checkSet, true );\r
                        }\r
                },\r
-               ">": function(checkSet, part, isXML){\r
-                       var isPartStr = typeof part === "string";\r
+               ">": function(checkSet, part){\r
+                       var isPartStr = typeof part === "string",\r
+                               elem, i = 0, l = checkSet.length;\r
 \r
                        if ( isPartStr && !/\W/.test(part) ) {\r
-                               part = isXML ? part : part.toUpperCase();\r
+                               part = part.toLowerCase();\r
 \r
-                               for ( var i = 0, l = checkSet.length; i < l; i++ ) {\r
-                                       var elem = checkSet[i];\r
+                               for ( ; i < l; i++ ) {\r
+                                       elem = checkSet[i];\r
                                        if ( elem ) {\r
                                                var parent = elem.parentNode;\r
-                                               checkSet[i] = parent.nodeName === part ? parent : false;\r
+                                               checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;\r
                                        }\r
                                }\r
                        } else {\r
-                               for ( var i = 0, l = checkSet.length; i < l; i++ ) {\r
-                                       var elem = checkSet[i];\r
+                               for ( ; i < l; i++ ) {\r
+                                       elem = checkSet[i];\r
                                        if ( elem ) {\r
                                                checkSet[i] = isPartStr ?\r
                                                        elem.parentNode :\r
@@ -3640,20 +3992,22 @@ var Expr = Sizzle.selectors = {
                        }\r
                },\r
                "": function(checkSet, part, isXML){\r
-                       var doneName = done++, checkFn = dirCheck;\r
+                       var doneName = done++, checkFn = dirCheck, nodeCheck;\r
 \r
-                       if ( !part.match(/\W/) ) {\r
-                               var nodeCheck = part = isXML ? part : part.toUpperCase();\r
+                       if ( typeof part === "string" && !/\W/.test(part) ) {\r
+                               part = part.toLowerCase();\r
+                               nodeCheck = part;\r
                                checkFn = dirNodeCheck;\r
                        }\r
 \r
                        checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);\r
                },\r
                "~": function(checkSet, part, isXML){\r
-                       var doneName = done++, checkFn = dirCheck;\r
+                       var doneName = done++, checkFn = dirCheck, nodeCheck;\r
 \r
-                       if ( typeof part === "string" && !part.match(/\W/) ) {\r
-                               var nodeCheck = part = isXML ? part : part.toUpperCase();\r
+                       if ( typeof part === "string" && !/\W/.test(part) ) {\r
+                               part = part.toLowerCase();\r
+                               nodeCheck = part;\r
                                checkFn = dirNodeCheck;\r
                        }\r
 \r
@@ -3667,7 +4021,7 @@ var Expr = Sizzle.selectors = {
                                return m ? [m] : [];\r
                        }\r
                },\r
-               NAME: function(match, context, isXML){\r
+               NAME: function(match, context){\r
                        if ( typeof context.getElementsByName !== "undefined" ) {\r
                                var ret = [], results = context.getElementsByName(match[1]);\r
 \r
@@ -3694,9 +4048,10 @@ var Expr = Sizzle.selectors = {
 \r
                        for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {\r
                                if ( elem ) {\r
-                                       if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {\r
-                                               if ( !inplace )\r
+                                       if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {\r
+                                               if ( !inplace ) {\r
                                                        result.push( elem );\r
+                                               }\r
                                        } else if ( inplace ) {\r
                                                curLoop[i] = false;\r
                                        }\r
@@ -3709,14 +4064,13 @@ var Expr = Sizzle.selectors = {
                        return match[1].replace(/\\/g, "");\r
                },\r
                TAG: function(match, curLoop){\r
-                       for ( var i = 0; curLoop[i] === false; i++ ){}\r
-                       return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();\r
+                       return match[1].toLowerCase();\r
                },\r
                CHILD: function(match){\r
-                       if ( match[1] == "nth" ) {\r
+                       if ( match[1] === "nth" ) {\r
                                // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'\r
                                var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(\r
-                                       match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||\r
+                                       match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||\r
                                        !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);\r
 \r
                                // calculate the numbers (first)n+(last) including if they are negative\r
@@ -3745,7 +4099,7 @@ var Expr = Sizzle.selectors = {
                PSEUDO: function(match, curLoop, inplace, result, not){\r
                        if ( match[1] === "not" ) {\r
                                // If we're dealing with a complex expression, or a simple one\r
-                               if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) {\r
+                               if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {\r
                                        match[3] = Sizzle(match[3], null, null, curLoop);\r
                                } else {\r
                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);\r
@@ -3791,7 +4145,7 @@ var Expr = Sizzle.selectors = {
                        return !!Sizzle( match[3], elem ).length;\r
                },\r
                header: function(elem){\r
-                       return /h\d/i.test( elem.nodeName );\r
+                       return (/h\d/i).test( elem.nodeName );\r
                },\r
                text: function(elem){\r
                        return "text" === elem.type;\r
@@ -3818,10 +4172,10 @@ var Expr = Sizzle.selectors = {
                        return "reset" === elem.type;\r
                },\r
                button: function(elem){\r
-                       return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";\r
+                       return "button" === elem.type || elem.nodeName.toLowerCase() === "button";\r
                },\r
                input: function(elem){\r
-                       return /input|select|textarea|button/i.test(elem.nodeName);\r
+                       return (/input|select|textarea|button/i).test(elem.nodeName);\r
                }\r
        },\r
        setFilters: {\r
@@ -3844,10 +4198,10 @@ var Expr = Sizzle.selectors = {
                        return i > match[3] - 0;\r
                },\r
                nth: function(elem, i, match){\r
-                       return match[3] - 0 == i;\r
+                       return match[3] - 0 === i;\r
                },\r
                eq: function(elem, i, match){\r
-                       return match[3] - 0 == i;\r
+                       return match[3] - 0 === i;\r
                }\r
        },\r
        filter: {\r
@@ -3857,17 +4211,19 @@ var Expr = Sizzle.selectors = {
                        if ( filter ) {\r
                                return filter( elem, i, match, array );\r
                        } else if ( name === "contains" ) {\r
-                               return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;\r
+                               return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;\r
                        } else if ( name === "not" ) {\r
                                var not = match[3];\r
 \r
-                               for ( var i = 0, l = not.length; i < l; i++ ) {\r
-                                       if ( not[i] === elem ) {\r
+                               for ( var j = 0, l = not.length; j < l; j++ ) {\r
+                                       if ( not[j] === elem ) {\r
                                                return false;\r
                                        }\r
                                }\r
 \r
                                return true;\r
+                       } else {\r
+                               Sizzle.error( "Syntax error, unrecognized expression: " + name );\r
                        }\r
                },\r
                CHILD: function(elem, match){\r
@@ -3875,20 +4231,26 @@ var Expr = Sizzle.selectors = {
                        switch (type) {\r
                                case 'only':\r
                                case 'first':\r
-                                       while (node = node.previousSibling)  {\r
-                                               if ( node.nodeType === 1 ) return false;\r
+                                       while ( (node = node.previousSibling) )  {\r
+                                               if ( node.nodeType === 1 ) { \r
+                                                       return false; \r
+                                               }\r
+                                       }\r
+                                       if ( type === "first" ) { \r
+                                               return true; \r
                                        }\r
-                                       if ( type == 'first') return true;\r
                                        node = elem;\r
                                case 'last':\r
-                                       while (node = node.nextSibling)  {\r
-                                               if ( node.nodeType === 1 ) return false;\r
+                                       while ( (node = node.nextSibling) )      {\r
+                                               if ( node.nodeType === 1 ) { \r
+                                                       return false; \r
+                                               }\r
                                        }\r
                                        return true;\r
                                case 'nth':\r
                                        var first = match[2], last = match[3];\r
 \r
-                                       if ( first == 1 && last == 0 ) {\r
+                                       if ( first === 1 && last === 0 ) {\r
                                                return true;\r
                                        }\r
                                        \r
@@ -3906,10 +4268,10 @@ var Expr = Sizzle.selectors = {
                                        }\r
                                        \r
                                        var diff = elem.nodeIndex - last;\r
-                                       if ( first == 0 ) {\r
-                                               return diff == 0;\r
+                                       if ( first === 0 ) {\r
+                                               return diff === 0;\r
                                        } else {\r
-                                               return ( diff % first == 0 && diff / first >= 0 );\r
+                                               return ( diff % first === 0 && diff / first >= 0 );\r
                                        }\r
                        }\r
                },\r
@@ -3917,7 +4279,7 @@ var Expr = Sizzle.selectors = {
                        return elem.nodeType === 1 && elem.getAttribute("id") === match;\r
                },\r
                TAG: function(elem, match){\r
-                       return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;\r
+                       return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;\r
                },\r
                CLASS: function(elem, match){\r
                        return (" " + (elem.className || elem.getAttribute("class")) + " ")\r
@@ -3945,7 +4307,7 @@ var Expr = Sizzle.selectors = {
                                !check ?\r
                                value && result !== false :\r
                                type === "!=" ?\r
-                               value != check :\r
+                               value !== check :\r
                                type === "^=" ?\r
                                value.indexOf(check) === 0 :\r
                                type === "$=" ?\r
@@ -3964,14 +4326,18 @@ var Expr = Sizzle.selectors = {
        }\r
 };\r
 \r
-var origPOS = Expr.match.POS;\r
+var origPOS = Expr.match.POS,\r
+       fescape = function(all, num){\r
+               return "\\" + (num - 0 + 1);\r
+       };\r
 \r
 for ( var type in Expr.match ) {\r
-       Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );\r
+       Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );\r
+       Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );\r
 }\r
 \r
 var makeArray = function(array, results) {\r
-       array = Array.prototype.slice.call( array );\r
+       array = Array.prototype.slice.call( array, 0 );\r
 \r
        if ( results ) {\r
                results.push.apply( results, array );\r
@@ -3983,23 +4349,25 @@ var makeArray = function(array, results) {
 \r
 // Perform a simple check to determine if the browser is capable of\r
 // converting a NodeList to an array using builtin methods.\r
+// Also verifies that the returned array holds DOM nodes\r
+// (which is not the case in the Blackberry browser)\r
 try {\r
-       Array.prototype.slice.call( document.documentElement.childNodes );\r
+       Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;\r
 \r
 // Provide a fallback method if it does not work\r
 } catch(e){\r
        makeArray = function(array, results) {\r
-               var ret = results || [];\r
+               var ret = results || [], i = 0;\r
 \r
                if ( toString.call(array) === "[object Array]" ) {\r
                        Array.prototype.push.apply( ret, array );\r
                } else {\r
                        if ( typeof array.length === "number" ) {\r
-                               for ( var i = 0, l = array.length; i < l; i++ ) {\r
+                               for ( var l = array.length; i < l; i++ ) {\r
                                        ret.push( array[i] );\r
                                }\r
                        } else {\r
-                               for ( var i = 0; array[i]; i++ ) {\r
+                               for ( ; array[i]; i++ ) {\r
                                        ret.push( array[i] );\r
                                }\r
                        }\r
@@ -4013,6 +4381,13 @@ var sortOrder;
 \r
 if ( document.documentElement.compareDocumentPosition ) {\r
        sortOrder = function( a, b ) {\r
+               if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {\r
+                       if ( a == b ) {\r
+                               hasDuplicate = true;\r
+                       }\r
+                       return a.compareDocumentPosition ? -1 : 1;\r
+               }\r
+\r
                var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;\r
                if ( ret === 0 ) {\r
                        hasDuplicate = true;\r
@@ -4021,6 +4396,13 @@ if ( document.documentElement.compareDocumentPosition ) {
        };\r
 } else if ( "sourceIndex" in document.documentElement ) {\r
        sortOrder = function( a, b ) {\r
+               if ( !a.sourceIndex || !b.sourceIndex ) {\r
+                       if ( a == b ) {\r
+                               hasDuplicate = true;\r
+                       }\r
+                       return a.sourceIndex ? -1 : 1;\r
+               }\r
+\r
                var ret = a.sourceIndex - b.sourceIndex;\r
                if ( ret === 0 ) {\r
                        hasDuplicate = true;\r
@@ -4029,6 +4411,13 @@ if ( document.documentElement.compareDocumentPosition ) {
        };\r
 } else if ( document.createRange ) {\r
        sortOrder = function( a, b ) {\r
+               if ( !a.ownerDocument || !b.ownerDocument ) {\r
+                       if ( a == b ) {\r
+                               hasDuplicate = true;\r
+                       }\r
+                       return a.ownerDocument ? -1 : 1;\r
+               }\r
+\r
                var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();\r
                aRange.setStart(a, 0);\r
                aRange.setEnd(a, 0);\r
@@ -4042,12 +4431,32 @@ if ( document.documentElement.compareDocumentPosition ) {
        };\r
 }\r
 \r
+// Utility function for retreiving the text value of an array of DOM nodes\r
+Sizzle.getText = function( elems ) {\r
+       var ret = "", elem;\r
+\r
+       for ( var i = 0; elems[i]; i++ ) {\r
+               elem = elems[i];\r
+\r
+               // Get the text from text nodes and CDATA nodes\r
+               if ( elem.nodeType === 3 || elem.nodeType === 4 ) {\r
+                       ret += elem.nodeValue;\r
+\r
+               // Traverse everything else, except comment nodes\r
+               } else if ( elem.nodeType !== 8 ) {\r
+                       ret += Sizzle.getText( elem.childNodes );\r
+               }\r
+       }\r
+\r
+       return ret;\r
+};\r
+\r
 // Check to see if the browser returns elements by name when\r
 // querying by getElementById (and provide a workaround)\r
 (function(){\r
        // We're going to inject a fake input element with a specified name\r
        var form = document.createElement("div"),\r
-               id = "script" + (new Date).getTime();\r
+               id = "script" + (new Date()).getTime();\r
        form.innerHTML = "<a name='" + id + "'/>";\r
 \r
        // Inject it into the root element, check its status, and remove it quickly\r
@@ -4056,7 +4465,7 @@ if ( document.documentElement.compareDocumentPosition ) {
 \r
        // The workaround has to do additional checks after a getElementById\r
        // Which slows things down for other browsers (hence the branching)\r
-       if ( !!document.getElementById( id ) ) {\r
+       if ( document.getElementById( id ) ) {\r
                Expr.find.ID = function(match, context, isXML){\r
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {\r
                                var m = context.getElementById(match[1]);\r
@@ -4071,6 +4480,7 @@ if ( document.documentElement.compareDocumentPosition ) {
        }\r
 \r
        root.removeChild( form );\r
+       root = form = null; // release memory in IE\r
 })();\r
 \r
 (function(){\r
@@ -4111,68 +4521,75 @@ if ( document.documentElement.compareDocumentPosition ) {
                        return elem.getAttribute("href", 2);\r
                };\r
        }\r
+\r
+       div = null; // release memory in IE\r
 })();\r
 \r
-if ( document.querySelectorAll ) (function(){\r
-       var oldSizzle = Sizzle, div = document.createElement("div");\r
-       div.innerHTML = "<p class='TEST'></p>";\r
+if ( document.querySelectorAll ) {\r
+       (function(){\r
+               var oldSizzle = Sizzle, div = document.createElement("div");\r
+               div.innerHTML = "<p class='TEST'></p>";\r
 \r
-       // Safari can't handle uppercase or unicode characters when\r
-       // in quirks mode.\r
-       if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {\r
-               return;\r
-       }\r
+               // Safari can't handle uppercase or unicode characters when\r
+               // in quirks mode.\r
+               if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {\r
+                       return;\r
+               }\r
        \r
-       Sizzle = function(query, context, extra, seed){\r
-               context = context || document;\r
+               Sizzle = function(query, context, extra, seed){\r
+                       context = context || document;\r
 \r
-               // Only use querySelectorAll on non-XML documents\r
-               // (ID selectors don't work in non-HTML documents)\r
-               if ( !seed && context.nodeType === 9 && !isXML(context) ) {\r
-                       try {\r
-                               return makeArray( context.querySelectorAll(query), extra );\r
-                       } catch(e){}\r
-               }\r
+                       // Only use querySelectorAll on non-XML documents\r
+                       // (ID selectors don't work in non-HTML documents)\r
+                       if ( !seed && context.nodeType === 9 && !Sizzle.isXML(context) ) {\r
+                               try {\r
+                                       return makeArray( context.querySelectorAll(query), extra );\r
+                               } catch(e){}\r
+                       }\r
                \r
-               return oldSizzle(query, context, extra, seed);\r
-       };\r
+                       return oldSizzle(query, context, extra, seed);\r
+               };\r
 \r
-       for ( var prop in oldSizzle ) {\r
-               Sizzle[ prop ] = oldSizzle[ prop ];\r
-       }\r
-})();\r
+               for ( var prop in oldSizzle ) {\r
+                       Sizzle[ prop ] = oldSizzle[ prop ];\r
+               }\r
+\r
+               div = null; // release memory in IE\r
+       })();\r
+}\r
 \r
-if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){\r
+(function(){\r
        var div = document.createElement("div");\r
+\r
        div.innerHTML = "<div class='test e'></div><div class='test'></div>";\r
 \r
        // Opera can't find a second classname (in 9.6)\r
-       if ( div.getElementsByClassName("e").length === 0 )\r
+       // Also, make sure that getElementsByClassName actually exists\r
+       if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {\r
                return;\r
+       }\r
 \r
        // Safari caches class attributes, doesn't catch changes (in 3.2)\r
        div.lastChild.className = "e";\r
 \r
-       if ( div.getElementsByClassName("e").length === 1 )\r
+       if ( div.getElementsByClassName("e").length === 1 ) {\r
                return;\r
-\r
+       }\r
+       \r
        Expr.order.splice(1, 0, "CLASS");\r
        Expr.find.CLASS = function(match, context, isXML) {\r
                if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {\r
                        return context.getElementsByClassName(match[1]);\r
                }\r
        };\r
+\r
+       div = null; // release memory in IE\r
 })();\r
 \r
 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\r
-       var sibDir = dir == "previousSibling" && !isXML;\r
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {\r
                var elem = checkSet[i];\r
                if ( elem ) {\r
-                       if ( sibDir && elem.nodeType === 1 ){\r
-                               elem.sizcache = doneName;\r
-                               elem.sizset = i;\r
-                       }\r
                        elem = elem[dir];\r
                        var match = false;\r
 \r
@@ -4187,7 +4604,7 @@ function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
                                        elem.sizset = i;\r
                                }\r
 \r
-                               if ( elem.nodeName === cur ) {\r
+                               if ( elem.nodeName.toLowerCase() === cur ) {\r
                                        match = elem;\r
                                        break;\r
                                }\r
@@ -4201,14 +4618,9 @@ function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
 }\r
 \r
 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\r
-       var sibDir = dir == "previousSibling" && !isXML;\r
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {\r
                var elem = checkSet[i];\r
                if ( elem ) {\r
-                       if ( sibDir && elem.nodeType === 1 ) {\r
-                               elem.sizcache = doneName;\r
-                               elem.sizset = i;\r
-                       }\r
                        elem = elem[dir];\r
                        var match = false;\r
 \r
@@ -4243,15 +4655,17 @@ function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
        }\r
 }\r
 \r
-var contains = document.compareDocumentPosition ?  function(a, b){\r
-       return a.compareDocumentPosition(b) & 16;\r
+Sizzle.contains = document.compareDocumentPosition ? function(a, b){\r
+       return !!(a.compareDocumentPosition(b) & 16);\r
 } : function(a, b){\r
        return a !== b && (a.contains ? a.contains(b) : true);\r
 };\r
 \r
-var isXML = function(elem){\r
-       return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||\r
-               !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML";\r
+Sizzle.isXML = function(elem){\r
+       // documentElement is verified for cases where it doesn't yet exist\r
+       // (such as loading iframes in IE - #4833) \r
+       var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;\r
+       return documentElement ? documentElement.nodeName !== "HTML" : false;\r
 };\r
 \r
 var posProcess = function(selector, context){\r
@@ -4280,18 +4694,30 @@ window.tinymce.dom.Sizzle = Sizzle;
 \r
 })();\r
 \r
+\r
 (function(tinymce) {\r
        // Shorten names\r
        var each = tinymce.each, DOM = tinymce.DOM, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, Event;\r
 \r
-       tinymce.create('static tinymce.dom.Event', {\r
-               inits : [],\r
-               events : [],\r
-\r
+       tinymce.create('tinymce.dom.EventUtils', {\r
+               EventUtils : function() {\r
+                       this.inits = [];\r
+                       this.events = [];\r
+               },\r
 \r
                add : function(o, n, f, s) {\r
                        var cb, t = this, el = t.events, r;\r
 \r
+                       if (n instanceof Array) {\r
+                               r = [];\r
+\r
+                               each(n, function(n) {\r
+                                       r.push(t.add(o, n, f, s));\r
+                               });\r
+\r
+                               return r;\r
+                       }\r
+\r
                        // Handle array\r
                        if (o && o.hasOwnProperty && o instanceof Array) {\r
                                r = [];\r
@@ -4311,11 +4737,20 @@ window.tinymce.dom.Sizzle = Sizzle;
 \r
                        // Setup event callback\r
                        cb = function(e) {\r
+                               // Is all events disabled\r
+                               if (t.disabled)\r
+                                       return;\r
+\r
                                e = e || window.event;\r
 \r
-                               // Patch in target in IE it's W3C valid\r
-                               if (e && !e.target && isIE)\r
-                                       e.target = e.srcElement;\r
+                               // Patch in target, preventDefault and stopPropagation in IE it's W3C valid\r
+                               if (e && isIE) {\r
+                                       if (!e.target)\r
+                                               e.target = e.srcElement;\r
+\r
+                                       // Patch in preventDefault, stopPropagation methods for W3C compatibility\r
+                                       tinymce.extend(e, t._stoppers);\r
+                               }\r
 \r
                                if (!s)\r
                                        return f(e);\r
@@ -4398,12 +4833,12 @@ window.tinymce.dom.Sizzle = Sizzle;
                        }\r
                },\r
 \r
-\r
                cancel : function(e) {\r
                        if (!e)\r
                                return false;\r
 \r
                        this.stop(e);\r
+\r
                        return this.prevent(e);\r
                },\r
 \r
@@ -4425,8 +4860,8 @@ window.tinymce.dom.Sizzle = Sizzle;
                        return false;\r
                },\r
 \r
-               _unload : function() {\r
-                       var t = Event;\r
+               destroy : function() {\r
+                       var t = this;\r
 \r
                        each(t.events, function(e, i) {\r
                                t._remove(e.obj, e.name, e.cfunc);\r
@@ -4461,110 +4896,107 @@ window.tinymce.dom.Sizzle = Sizzle;
                        }\r
                },\r
 \r
-               _pageInit : function() {\r
-                       var e = Event;\r
+               _pageInit : function(win) {\r
+                       var t = this;\r
 \r
                        // Keep it from running more than once\r
-                       if (e.domLoaded)\r
+                       if (t.domLoaded)\r
                                return;\r
 \r
-                       e._remove(window, 'DOMContentLoaded', e._pageInit);\r
-                       e.domLoaded = true;\r
+                       t.domLoaded = true;\r
 \r
-                       each(e.inits, function(c) {\r
+                       each(t.inits, function(c) {\r
                                c();\r
                        });\r
 \r
-                       e.inits = [];\r
+                       t.inits = [];\r
                },\r
 \r
-               _wait : function() {\r
+               _wait : function(win) {\r
+                       var t = this, doc = win.document;\r
+\r
                        // No need since the document is already loaded\r
-                       if (window.tinyMCE_GZ && tinyMCE_GZ.loaded) {\r
-                               Event.domLoaded = 1;\r
+                       if (win.tinyMCE_GZ && tinyMCE_GZ.loaded) {\r
+                               t.domLoaded = 1;\r
                                return;\r
                        }\r
 \r
                        // Use IE method\r
-                       if (document.attachEvent) {\r
-                               document.attachEvent("onreadystatechange", function() {\r
-                                       if (document.readyState === "complete") {\r
-                                               document.detachEvent("onreadystatechange", arguments.callee);\r
-                                               Event._pageInit();\r
+                       if (doc.attachEvent) {\r
+                               doc.attachEvent("onreadystatechange", function() {\r
+                                       if (doc.readyState === "complete") {\r
+                                               doc.detachEvent("onreadystatechange", arguments.callee);\r
+                                               t._pageInit(win);\r
                                        }\r
                                });\r
 \r
-                               if (document.documentElement.doScroll && window == window.top) {\r
+                               if (doc.documentElement.doScroll && win == win.top) {\r
                                        (function() {\r
-                                               if (Event.domLoaded)\r
+                                               if (t.domLoaded)\r
                                                        return;\r
 \r
                                                try {\r
                                                        // If IE is used, use the trick by Diego Perini\r
                                                        // http://javascript.nwbox.com/IEContentLoaded/\r
-                                                       document.documentElement.doScroll("left");\r
+                                                       doc.documentElement.doScroll("left");\r
                                                } catch (ex) {\r
                                                        setTimeout(arguments.callee, 0);\r
                                                        return;\r
                                                }\r
 \r
-                                               Event._pageInit();\r
+                                               t._pageInit(win);\r
                                        })();\r
                                }\r
-                       } else if (document.addEventListener)\r
-                               Event._add(window, 'DOMContentLoaded', Event._pageInit, Event);\r
-\r
-                       Event._add(window, 'load', Event._pageInit, Event);\r
-               }\r
+                       } else if (doc.addEventListener) {\r
+                               t._add(win, 'DOMContentLoaded', function() {\r
+                                       t._pageInit(win);\r
+                               });\r
+                       }\r
 \r
-               });\r
+                       t._add(win, 'load', function() {\r
+                               t._pageInit(win);\r
+                       });\r
+               },\r
 \r
-       // Shorten name\r
-       Event = tinymce.dom.Event;\r
+               _stoppers : {\r
+                       preventDefault :  function() {\r
+                               this.returnValue = false;\r
+                       },\r
 \r
-       // Dispatch DOM content loaded event for IE and Safari\r
-       Event._wait();\r
-       tinymce.addUnload(Event._unload);\r
-})(tinymce);\r
-(function(tinymce) {\r
-       var each = tinymce.each;\r
+                       stopPropagation : function() {\r
+                               this.cancelBubble = true;\r
+                       }\r
+               }\r
+       });\r
 \r
-       tinymce.create('tinymce.dom.Element', {\r
-               Element : function(id, s) {\r
-                       var t = this, dom, el;\r
+       Event = tinymce.dom.Event = new tinymce.dom.EventUtils();\r
 \r
-                       s = s || {};\r
-                       t.id = id;\r
-                       t.dom = dom = s.dom || tinymce.DOM;\r
-                       t.settings = s;\r
+       // Dispatch DOM content loaded event for IE and Safari\r
+       Event._wait(window);\r
 \r
-                       // Only IE leaks DOM references, this is a lot faster\r
-                       if (!tinymce.isIE)\r
-                               el = t.dom.get(t.id);\r
+       tinymce.addUnload(function() {\r
+               Event.destroy();\r
+       });\r
+})(tinymce);\r
 \r
-                       each([\r
-                               'getPos',\r
-                               'getRect',\r
-                               'getParent',\r
-                               'add',\r
-                               'setStyle',\r
-                               'getStyle',\r
-                               'setStyles',\r
-                               'setAttrib',\r
-                               'setAttribs',\r
-                               'getAttrib',\r
-                               'addClass',\r
-                               'removeClass',\r
-                               'hasClass',\r
-                               'getOuterHTML',\r
-                               'setOuterHTML',\r
-                               'remove',\r
-                               'show',\r
-                               'hide',\r
-                               'isHidden',\r
-                               'setHTML',\r
-                               'get'\r
-                       ], function(k) {\r
+(function(tinymce) {\r
+       tinymce.dom.Element = function(id, settings) {\r
+               var t = this, dom, el;\r
+\r
+               t.settings = settings = settings || {};\r
+               t.id = id;\r
+               t.dom = dom = settings.dom || tinymce.DOM;\r
+\r
+               // Only IE leaks DOM references, this is a lot faster\r
+               if (!tinymce.isIE)\r
+                       el = dom.get(t.id);\r
+\r
+               tinymce.each(\r
+                               ('getPos,getRect,getParent,add,setStyle,getStyle,setStyles,' + \r
+                               'setAttrib,setAttribs,getAttrib,addClass,removeClass,' + \r
+                               'hasClass,getOuterHTML,setOuterHTML,remove,show,hide,' + \r
+                               'isHidden,setHTML,get').split(/,/)\r
+                       , function(k) {\r
                                t[k] = function() {\r
                                        var a = [id], i;\r
 \r
@@ -4576,83 +5008,86 @@ window.tinymce.dom.Sizzle = Sizzle;
 \r
                                        return a;\r
                                };\r
-                       });\r
-               },\r
-\r
-               on : function(n, f, s) {\r
-                       return tinymce.dom.Event.add(this.id, n, f, s);\r
-               },\r
+               });\r
 \r
-               getXY : function() {\r
-                       return {\r
-                               x : parseInt(this.getStyle('left')),\r
-                               y : parseInt(this.getStyle('top'))\r
-                       };\r
-               },\r
+               tinymce.extend(t, {\r
+                       on : function(n, f, s) {\r
+                               return tinymce.dom.Event.add(t.id, n, f, s);\r
+                       },\r
 \r
-               getSize : function() {\r
-                       var n = this.dom.get(this.id);\r
+                       getXY : function() {\r
+                               return {\r
+                                       x : parseInt(t.getStyle('left')),\r
+                                       y : parseInt(t.getStyle('top'))\r
+                               };\r
+                       },\r
 \r
-                       return {\r
-                               w : parseInt(this.getStyle('width') || n.clientWidth),\r
-                               h : parseInt(this.getStyle('height') || n.clientHeight)\r
-                       };\r
-               },\r
+                       getSize : function() {\r
+                               var n = dom.get(t.id);\r
 \r
-               moveTo : function(x, y) {\r
-                       this.setStyles({left : x, top : y});\r
-               },\r
+                               return {\r
+                                       w : parseInt(t.getStyle('width') || n.clientWidth),\r
+                                       h : parseInt(t.getStyle('height') || n.clientHeight)\r
+                               };\r
+                       },\r
 \r
-               moveBy : function(x, y) {\r
-                       var p = this.getXY();\r
+                       moveTo : function(x, y) {\r
+                               t.setStyles({left : x, top : y});\r
+                       },\r
 \r
-                       this.moveTo(p.x + x, p.y + y);\r
-               },\r
+                       moveBy : function(x, y) {\r
+                               var p = t.getXY();\r
 \r
-               resizeTo : function(w, h) {\r
-                       this.setStyles({width : w, height : h});\r
-               },\r
+                               t.moveTo(p.x + x, p.y + y);\r
+                       },\r
 \r
-               resizeBy : function(w, h) {\r
-                       var s = this.getSize();\r
+                       resizeTo : function(w, h) {\r
+                               t.setStyles({width : w, height : h});\r
+                       },\r
 \r
-                       this.resizeTo(s.w + w, s.h + h);\r
-               },\r
+                       resizeBy : function(w, h) {\r
+                               var s = t.getSize();\r
 \r
-               update : function(k) {\r
-                       var t = this, b, dom = t.dom;\r
+                               t.resizeTo(s.w + w, s.h + h);\r
+                       },\r
 \r
-                       if (tinymce.isIE6 && t.settings.blocker) {\r
-                               k = k || '';\r
+                       update : function(k) {\r
+                               var b;\r
 \r
-                               // Ignore getters\r
-                               if (k.indexOf('get') === 0 || k.indexOf('has') === 0 || k.indexOf('is') === 0)\r
-                                       return;\r
+                               if (tinymce.isIE6 && settings.blocker) {\r
+                                       k = k || '';\r
 \r
-                               // Remove blocker on remove\r
-                               if (k == 'remove') {\r
-                                       dom.remove(t.blocker);\r
-                                       return;\r
-                               }\r
+                                       // Ignore getters\r
+                                       if (k.indexOf('get') === 0 || k.indexOf('has') === 0 || k.indexOf('is') === 0)\r
+                                               return;\r
 \r
-                               if (!t.blocker) {\r
-                                       t.blocker = dom.uniqueId();\r
-                                       b = dom.add(t.settings.container || dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder : 0, src : 'javascript:""'});\r
-                                       dom.setStyle(b, 'opacity', 0);\r
-                               } else\r
-                                       b = dom.get(t.blocker);\r
+                                       // Remove blocker on remove\r
+                                       if (k == 'remove') {\r
+                                               dom.remove(t.blocker);\r
+                                               return;\r
+                                       }\r
 \r
-                               dom.setStyle(b, 'left', t.getStyle('left', 1));\r
-                               dom.setStyle(b, 'top', t.getStyle('top', 1));\r
-                               dom.setStyle(b, 'width', t.getStyle('width', 1));\r
-                               dom.setStyle(b, 'height', t.getStyle('height', 1));\r
-                               dom.setStyle(b, 'display', t.getStyle('display', 1));\r
-                               dom.setStyle(b, 'zIndex', parseInt(t.getStyle('zIndex', 1) || 0) - 1);\r
+                                       if (!t.blocker) {\r
+                                               t.blocker = dom.uniqueId();\r
+                                               b = dom.add(settings.container || dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder : 0, src : 'javascript:""'});\r
+                                               dom.setStyle(b, 'opacity', 0);\r
+                                       } else\r
+                                               b = dom.get(t.blocker);\r
+\r
+                                       dom.setStyles(b, {\r
+                                               left : t.getStyle('left', 1),\r
+                                               top : t.getStyle('top', 1),\r
+                                               width : t.getStyle('width', 1),\r
+                                               height : t.getStyle('height', 1),\r
+                                               display : t.getStyle('display', 1),\r
+                                               zIndex : parseInt(t.getStyle('zIndex', 1) || 0) - 1\r
+                                       });\r
+                               }\r
                        }\r
-               }\r
-\r
                });\r
+       };\r
 })(tinymce);\r
+\r
 (function(tinymce) {\r
        function trimNl(s) {\r
                return s.replace(/[\n\r]+/g, '');\r
@@ -4740,23 +5175,27 @@ window.tinymce.dom.Sizzle = Sizzle;
                                h += '<span id="__caret">_</span>';\r
 \r
                                // Delete and insert new node\r
-                               r.deleteContents();\r
-                               r.insertNode(t.getRng().createContextualFragment(h));\r
+                               \r
+                               if (r.startContainer == d && r.endContainer ==  d) {\r
+                                       // WebKit will fail if the body is empty since the range is then invalid and it can't insert contents\r
+                                       d.body.innerHTML = h;\r
+                               } else {\r
+                                       r.deleteContents();\r
+                                       if (d.body.childNodes.length == 0) {\r
+                                               d.body.innerHTML = h;\r
+                                       } else {\r
+                                               r.insertNode(r.createContextualFragment(h));\r
+                                       }\r
+                               }\r
 \r
                                // Move to caret marker\r
                                c = t.dom.get('__caret');\r
-\r
                                // Make sure we wrap it compleatly, Opera fails with a simple select call\r
                                r = d.createRange();\r
                                r.setStartBefore(c);\r
-                               r.setEndAfter(c);\r
+                               r.setEndBefore(c);\r
                                t.setRng(r);\r
 \r
-                               // Delete the marker, and hopefully the caret gets placed in the right location\r
-                               // Removed this since it seems to remove &nbsp; in FF and simply deleting it\r
-                               // doesn't seem to affect the caret position in any browser\r
-                               //d.execCommand('Delete', false, null);\r
-\r
                                // Remove the caret position\r
                                t.dom.remove('__caret');\r
                        } else {\r
@@ -4774,34 +5213,50 @@ window.tinymce.dom.Sizzle = Sizzle;
                },\r
 \r
                getStart : function() {\r
-                       var t = this, r = t.getRng(), e;\r
-\r
-                       if (isIE) {\r
-                               if (r.item)\r
-                                       return r.item(0);\r
-\r
-                               r = r.duplicate();\r
-                               r.collapse(1);\r
-                               e = r.parentElement();\r
+                       var rng = this.getRng(), startElement, parentElement, checkRng, node;\r
+\r
+                       if (rng.duplicate || rng.item) {\r
+                               // Control selection, return first item\r
+                               if (rng.item)\r
+                                       return rng.item(0);\r
+\r
+                               // Get start element\r
+                               checkRng = rng.duplicate();\r
+                               checkRng.collapse(1);\r
+                               startElement = checkRng.parentElement();\r
+\r
+                               // Check if range parent is inside the start element, then return the inner parent element\r
+                               // This will fix issues when a single element is selected, IE would otherwise return the wrong start element\r
+                               parentElement = node = rng.parentElement();\r
+                               while (node = node.parentNode) {\r
+                                       if (node == startElement) {\r
+                                               startElement = parentElement;\r
+                                               break;\r
+                                       }\r
+                               }\r
 \r
-                               if (e && e.nodeName == 'BODY')\r
-                                       return e.firstChild;\r
+                               // If start element is body element try to move to the first child if it exists\r
+                               if (startElement && startElement.nodeName == 'BODY')\r
+                                       return startElement.firstChild || startElement;\r
 \r
-                               return e;\r
+                               return startElement;\r
                        } else {\r
-                               e = r.startContainer;\r
+                               startElement = rng.startContainer;\r
 \r
-                               if (e.nodeName == 'BODY')\r
-                                       return e.firstChild;\r
+                               if (startElement.nodeType == 1 && startElement.hasChildNodes())\r
+                                       startElement = startElement.childNodes[Math.min(startElement.childNodes.length - 1, rng.startOffset)];\r
 \r
-                               return t.dom.getParent(e, '*');\r
+                               if (startElement && startElement.nodeType == 3)\r
+                                       return startElement.parentNode;\r
+\r
+                               return startElement;\r
                        }\r
                },\r
 \r
                getEnd : function() {\r
-                       var t = this, r = t.getRng(), e;\r
+                       var t = this, r = t.getRng(), e, eo;\r
 \r
-                       if (isIE) {\r
+                       if (r.duplicate || r.item) {\r
                                if (r.item)\r
                                        return r.item(0);\r
 \r
@@ -4810,331 +5265,299 @@ window.tinymce.dom.Sizzle = Sizzle;
                                e = r.parentElement();\r
 \r
                                if (e && e.nodeName == 'BODY')\r
-                                       return e.lastChild;\r
+                                       return e.lastChild || e;\r
 \r
                                return e;\r
                        } else {\r
                                e = r.endContainer;\r
+                               eo = r.endOffset;\r
+\r
+                               if (e.nodeType == 1 && e.hasChildNodes())\r
+                                       e = e.childNodes[eo > 0 ? eo - 1 : eo];\r
 \r
-                               if (e.nodeName == 'BODY')\r
-                                       return e.lastChild;\r
+                               if (e && e.nodeType == 3)\r
+                                       return e.parentNode;\r
 \r
-                               return t.dom.getParent(e, '*');\r
+                               return e;\r
                        }\r
                },\r
 \r
-               getBookmark : function(si) {\r
-                       var t = this, r = t.getRng(), tr, sx, sy, vp = t.dom.getViewPort(t.win), e, sp, bp, le, c = -0xFFFFFF, s, ro = t.dom.getRoot(), wb = 0, wa = 0, nv;\r
-                       sx = vp.x;\r
-                       sy = vp.y;\r
+               getBookmark : function(type, normalized) {\r
+                       var t = this, dom = t.dom, rng, rng2, id, collapsed, name, element, index, chr = '\uFEFF', styles;\r
 \r
-                       // Simple bookmark fast but not as persistent\r
-                       if (si == 'simple')\r
-                               return {rng : r, scrollX : sx, scrollY : sy};\r
+                       function findIndex(name, element) {\r
+                               var index = 0;\r
 \r
-                       // Handle IE\r
-                       if (isIE) {\r
-                               // Control selection\r
-                               if (r.item) {\r
-                                       e = r.item(0);\r
+                               each(dom.select(name), function(node, i) {\r
+                                       if (node == element)\r
+                                               index = i;\r
+                               });\r
 \r
-                                       each(t.dom.select(e.nodeName), function(n, i) {\r
-                                               if (e == n) {\r
-                                                       sp = i;\r
-                                                       return false;\r
-                                               }\r
-                                       });\r
+                               return index;\r
+                       };\r
 \r
-                                       return {\r
-                                               tag : e.nodeName,\r
-                                               index : sp,\r
-                                               scrollX : sx,\r
-                                               scrollY : sy\r
-                                       };\r
-                               }\r
+                       if (type == 2) {\r
+                               function getLocation() {\r
+                                       var rng = t.getRng(true), root = dom.getRoot(), bookmark = {};\r
 \r
-                               // Text selection\r
-                               tr = t.dom.doc.body.createTextRange();\r
-                               tr.moveToElementText(ro);\r
-                               tr.collapse(true);\r
-                               bp = Math.abs(tr.move('character', c));\r
+                                       function getPoint(rng, start) {\r
+                                               var container = rng[start ? 'startContainer' : 'endContainer'],\r
+                                                       offset = rng[start ? 'startOffset' : 'endOffset'], point = [], node, childNodes, after = 0;\r
 \r
-                               tr = r.duplicate();\r
-                               tr.collapse(true);\r
-                               sp = Math.abs(tr.move('character', c));\r
+                                               if (container.nodeType == 3) {\r
+                                                       if (normalized) {\r
+                                                               for (node = container.previousSibling; node && node.nodeType == 3; node = node.previousSibling)\r
+                                                                       offset += node.nodeValue.length;\r
+                                                       }\r
 \r
-                               tr = r.duplicate();\r
-                               tr.collapse(false);\r
-                               le = Math.abs(tr.move('character', c)) - sp;\r
+                                                       point.push(offset);\r
+                                               } else {\r
+                                                       childNodes = container.childNodes;\r
 \r
-                               return {\r
-                                       start : sp - bp,\r
-                                       length : le,\r
-                                       scrollX : sx,\r
-                                       scrollY : sy\r
-                               };\r
-                       }\r
+                                                       if (offset >= childNodes.length && childNodes.length) {\r
+                                                               after = 1;\r
+                                                               offset = Math.max(0, childNodes.length - 1);\r
+                                                       }\r
 \r
-                       // Handle W3C\r
-                       e = t.getNode();\r
-                       s = t.getSel();\r
+                                                       point.push(t.dom.nodeIndex(childNodes[offset], normalized) + after);\r
+                                               }\r
 \r
-                       if (!s)\r
-                               return null;\r
+                                               for (; container && container != root; container = container.parentNode)\r
+                                                       point.push(t.dom.nodeIndex(container, normalized));\r
 \r
-                       // Image selection\r
-                       if (e && e.nodeName == 'IMG') {\r
-                               return {\r
-                                       scrollX : sx,\r
-                                       scrollY : sy\r
-                               };\r
-                       }\r
+                                               return point;\r
+                                       };\r
 \r
-                       // Text selection\r
+                                       bookmark.start = getPoint(rng, true);\r
 \r
-                       function getPos(r, sn, en) {\r
-                               var w = t.dom.doc.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {};\r
+                                       if (!t.isCollapsed())\r
+                                               bookmark.end = getPoint(rng);\r
 \r
-                               while ((n = w.nextNode()) != null) {\r
-                                       if (n == sn)\r
-                                               d.start = p;\r
+                                       return bookmark;\r
+                               };\r
 \r
-                                       if (n == en) {\r
-                                               d.end = p;\r
-                                               return d;\r
-                                       }\r
+                               return getLocation();\r
+                       }\r
 \r
-                                       p += trimNl(n.nodeValue || '').length;\r
-                               }\r
+                       // Handle simple range\r
+                       if (type)\r
+                               return {rng : t.getRng()};\r
 \r
-                               return null;\r
-                       };\r
+                       rng = t.getRng();\r
+                       id = dom.uniqueId();\r
+                       collapsed = tinyMCE.activeEditor.selection.isCollapsed();\r
+                       styles = 'overflow:hidden;line-height:0px';\r
 \r
-                       // Caret or selection\r
-                       if (s.anchorNode == s.focusNode && s.anchorOffset == s.focusOffset) {\r
-                               e = getPos(ro, s.anchorNode, s.focusNode);\r
+                       // Explorer method\r
+                       if (rng.duplicate || rng.item) {\r
+                               // Text selection\r
+                               if (!rng.item) {\r
+                                       rng2 = rng.duplicate();\r
 \r
-                               if (!e)\r
-                                       return {scrollX : sx, scrollY : sy};\r
+                                       // Insert start marker\r
+                                       rng.collapse();\r
+                                       rng.pasteHTML('<span _mce_type="bookmark" id="' + id + '_start" style="' + styles + '">' + chr + '</span>');\r
 \r
-                               // Count whitespace before\r
-                               trimNl(s.anchorNode.nodeValue || '').replace(/^\s+/, function(a) {wb = a.length;});\r
+                                       // Insert end marker\r
+                                       if (!collapsed) {\r
+                                               rng2.collapse(false);\r
+                                               rng2.pasteHTML('<span _mce_type="bookmark" id="' + id + '_end" style="' + styles + '">' + chr + '</span>');\r
+                                       }\r
+                               } else {\r
+                                       // Control selection\r
+                                       element = rng.item(0);\r
+                                       name = element.nodeName;\r
 \r
-                               return {\r
-                                       start : Math.max(e.start + s.anchorOffset - wb, 0),\r
-                                       end : Math.max(e.end + s.focusOffset - wb, 0),\r
-                                       scrollX : sx,\r
-                                       scrollY : sy,\r
-                                       beg : s.anchorOffset - wb == 0\r
-                               };\r
+                                       return {name : name, index : findIndex(name, element)};\r
+                               }\r
                        } else {\r
-                               e = getPos(ro, r.startContainer, r.endContainer);\r
+                               element = t.getNode();\r
+                               name = element.nodeName;\r
+                               if (name == 'IMG')\r
+                                       return {name : name, index : findIndex(name, element)};\r
 \r
-                               // Count whitespace before start and end container\r
-                               //(r.startContainer.nodeValue || '').replace(/^\s+/, function(a) {wb = a.length;});\r
-                               //(r.endContainer.nodeValue || '').replace(/^\s+/, function(a) {wa = a.length;});\r
+                               // W3C method\r
+                               rng2 = rng.cloneRange();\r
 \r
-                               if (!e)\r
-                                       return {scrollX : sx, scrollY : sy};\r
+                               // Insert end marker\r
+                               if (!collapsed) {\r
+                                       rng2.collapse(false);\r
+                                       rng2.insertNode(dom.create('span', {_mce_type : "bookmark", id : id + '_end', style : styles}, chr));\r
+                               }\r
 \r
-                               return {\r
-                                       start : Math.max(e.start + r.startOffset - wb, 0),\r
-                                       end : Math.max(e.end + r.endOffset - wa, 0),\r
-                                       scrollX : sx,\r
-                                       scrollY : sy,\r
-                                       beg : r.startOffset - wb == 0\r
-                               };\r
+                               rng.collapse(true);\r
+                               rng.insertNode(dom.create('span', {_mce_type : "bookmark", id : id + '_start', style : styles}, chr));\r
                        }\r
-               },\r
 \r
-               moveToBookmark : function(b) {\r
-                       var t = this, r = t.getRng(), s = t.getSel(), ro = t.dom.getRoot(), sd, nvl, nv;\r
+                       t.moveToBookmark({id : id, keep : 1});\r
 \r
-                       function getPos(r, sp, ep) {\r
-                               var w = t.dom.doc.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {}, o, v, wa, wb;\r
+                       return {id : id};\r
+               },\r
 \r
-                               while ((n = w.nextNode()) != null) {\r
-                                       wa = wb = 0;\r
+               moveToBookmark : function(bookmark) {\r
+                       var t = this, dom = t.dom, marker1, marker2, rng, root, startContainer, endContainer, startOffset, endOffset;\r
 \r
-                                       nv = n.nodeValue || '';\r
-                                       //nv.replace(/^\s+[^\s]/, function(a) {wb = a.length - 1;});\r
-                                       //nv.replace(/[^\s]\s+$/, function(a) {wa = a.length - 1;});\r
+                       // Clear selection cache\r
+                       if (t.tridentSel)\r
+                               t.tridentSel.destroy();\r
 \r
-                                       nvl = trimNl(nv).length;\r
-                                       p += nvl;\r
+                       if (bookmark) {\r
+                               if (bookmark.start) {\r
+                                       rng = dom.createRng();\r
+                                       root = dom.getRoot();\r
 \r
-                                       if (p >= sp && !d.startNode) {\r
-                                               o = sp - (p - nvl);\r
+                                       function setEndPoint(start) {\r
+                                               var point = bookmark[start ? 'start' : 'end'], i, node, offset, children;\r
 \r
-                                               // Fix for odd quirk in FF\r
-                                               if (b.beg && o >= nvl)\r
-                                                       continue;\r
+                                               if (point) {\r
+                                                       // Find container node\r
+                                                       for (node = root, i = point.length - 1; i >= 1; i--) {\r
+                                                               children = node.childNodes;\r
 \r
-                                               d.startNode = n;\r
-                                               d.startOffset = o + wb;\r
-                                       }\r
+                                                               if (children.length)\r
+                                                                       node = children[point[i]];\r
+                                                       }\r
 \r
-                                       if (p >= ep) {\r
-                                               d.endNode = n;\r
-                                               d.endOffset = ep - (p - nvl) + wb;\r
-                                               return d;\r
-                                       }\r
-                               }\r
+                                                       // Set offset within container node\r
+                                                       if (start)\r
+                                                               rng.setStart(node, point[0]);\r
+                                                       else\r
+                                                               rng.setEnd(node, point[0]);\r
+                                               }\r
+                                       };\r
 \r
-                               return null;\r
-                       };\r
+                                       setEndPoint(true);\r
+                                       setEndPoint();\r
 \r
-                       if (!b)\r
-                               return false;\r
+                                       t.setRng(rng);\r
+                               } else if (bookmark.id) {\r
+                                       function restoreEndPoint(suffix) {\r
+                                               var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev, keep = bookmark.keep;\r
 \r
-                       t.win.scrollTo(b.scrollX, b.scrollY);\r
+                                               if (marker) {\r
+                                                       node = marker.parentNode;\r
 \r
-                       // Handle explorer\r
-                       if (isIE) {\r
-                               // Handle simple\r
-                               if (r = b.rng) {\r
-                                       try {\r
-                                               r.select();\r
-                                       } catch (ex) {\r
-                                               // Ignore\r
-                                       }\r
+                                                       if (suffix == 'start') {\r
+                                                               if (!keep) {\r
+                                                                       idx = dom.nodeIndex(marker);\r
+                                                               } else {\r
+                                                                       node = marker.firstChild;\r
+                                                                       idx = 1;\r
+                                                               }\r
 \r
-                                       return true;\r
-                               }\r
+                                                               startContainer = endContainer = node;\r
+                                                               startOffset = endOffset = idx;\r
+                                                       } else {\r
+                                                               if (!keep) {\r
+                                                                       idx = dom.nodeIndex(marker);\r
+                                                               } else {\r
+                                                                       node = marker.firstChild;\r
+                                                                       idx = 1;\r
+                                                               }\r
 \r
-                               t.win.focus();\r
+                                                               endContainer = node;\r
+                                                               endOffset = idx;\r
+                                                       }\r
 \r
-                               // Handle control bookmark\r
-                               if (b.tag) {\r
-                                       r = ro.createControlRange();\r
+                                                       if (!keep) {\r
+                                                               prev = marker.previousSibling;\r
+                                                               next = marker.nextSibling;\r
 \r
-                                       each(t.dom.select(b.tag), function(n, i) {\r
-                                               if (i == b.index)\r
-                                                       r.addElement(n);\r
-                                       });\r
-                               } else {\r
-                                       // Try/catch needed since this operation breaks when TinyMCE is placed in hidden divs/tabs\r
-                                       try {\r
-                                               // Incorrect bookmark\r
-                                               if (b.start < 0)\r
-                                                       return true;\r
+                                                               // Remove all marker text nodes\r
+                                                               each(tinymce.grep(marker.childNodes), function(node) {\r
+                                                                       if (node.nodeType == 3)\r
+                                                                               node.nodeValue = node.nodeValue.replace(/\uFEFF/g, '');\r
+                                                               });\r
 \r
-                                               r = s.createRange();\r
-                                               r.moveToElementText(ro);\r
-                                               r.collapse(true);\r
-                                               r.moveStart('character', b.start);\r
-                                               r.moveEnd('character', b.length);\r
-                                       } catch (ex2) {\r
-                                               return true;\r
-                                       }\r
-                               }\r
+                                                               // Remove marker but keep children if for example contents where inserted into the marker\r
+                                                               // Also remove duplicated instances of the marker for example by a split operation or by WebKit auto split on paste feature\r
+                                                               while (marker = dom.get(bookmark.id + '_' + suffix))\r
+                                                                       dom.remove(marker, 1);\r
 \r
-                               try {\r
-                                       r.select();\r
-                               } catch (ex) {\r
-                                       // Needed for some odd IE bug #1843306\r
-                               }\r
+                                                               // If siblings are text nodes then merge them\r
+                                                               if (prev && next && prev.nodeType == next.nodeType && prev.nodeType == 3) {\r
+                                                                       idx = prev.nodeValue.length;\r
+                                                                       prev.appendData(next.nodeValue);\r
+                                                                       dom.remove(next);\r
 \r
-                               return true;\r
-                       }\r
+                                                                       if (suffix == 'start') {\r
+                                                                               startContainer = endContainer = prev;\r
+                                                                               startOffset = endOffset = idx;\r
+                                                                       } else {\r
+                                                                               endContainer = prev;\r
+                                                                               endOffset = idx;\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       };\r
 \r
-                       // Handle W3C\r
-                       if (!s)\r
-                               return false;\r
+                                       function addBogus(node) {\r
+                                               // Adds a bogus BR element for empty block elements\r
+                                               // on non IE browsers just to have a place to put the caret\r
+                                               if (!isIE && dom.isBlock(node) && !node.innerHTML)\r
+                                                       node.innerHTML = '<br _mce_bogus="1" />';\r
 \r
-                       // Handle simple\r
-                       if (b.rng) {\r
-                               s.removeAllRanges();\r
-                               s.addRange(b.rng);\r
-                       } else {\r
-                               if (is(b.start) && is(b.end)) {\r
-                                       try {\r
-                                               sd = getPos(ro, b.start, b.end);\r
-\r
-                                               if (sd) {\r
-                                                       r = t.dom.doc.createRange();\r
-                                                       r.setStart(sd.startNode, sd.startOffset);\r
-                                                       r.setEnd(sd.endNode, sd.endOffset);\r
-                                                       s.removeAllRanges();\r
-                                                       s.addRange(r);\r
-                                               }\r
+                                               return node;\r
+                                       };\r
 \r
-                                               if (!tinymce.isOpera)\r
-                                                       t.win.focus();\r
-                                       } catch (ex) {\r
-                                               // Ignore\r
-                                       }\r
-                               }\r
+                                       // Restore start/end points\r
+                                       restoreEndPoint('start');\r
+                                       restoreEndPoint('end');\r
+\r
+                                       rng = dom.createRng();\r
+                                       rng.setStart(addBogus(startContainer), startOffset);\r
+                                       rng.setEnd(addBogus(endContainer), endOffset);\r
+                                       t.setRng(rng);\r
+                               } else if (bookmark.name) {\r
+                                       t.select(dom.select(bookmark.name)[bookmark.index]);\r
+                               } else if (bookmark.rng)\r
+                                       t.setRng(bookmark.rng);\r
                        }\r
                },\r
 \r
-               select : function(n, c) {\r
-                       var t = this, r = t.getRng(), s = t.getSel(), b, fn, ln, d = t.win.document;\r
+               select : function(node, content) {\r
+                       var t = this, dom = t.dom, rng = dom.createRng(), idx;\r
 \r
-                       function find(n, start) {\r
-                               var walker, o;\r
+                       idx = dom.nodeIndex(node);\r
+                       rng.setStart(node.parentNode, idx);\r
+                       rng.setEnd(node.parentNode, idx + 1);\r
 \r
-                               if (n) {\r
-                                       walker = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);\r
-\r
-                                       // Find first/last non empty text node\r
-                                       while (n = walker.nextNode()) {\r
-                                               o = n;\r
+                       // Find first/last text node or BR element\r
+                       if (content) {\r
+                               function setPoint(node, start) {\r
+                                       var walker = new tinymce.dom.TreeWalker(node, node);\r
 \r
-                                               if (tinymce.trim(n.nodeValue).length != 0) {\r
+                                       do {\r
+                                               // Text node\r
+                                               if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) {\r
                                                        if (start)\r
-                                                               return n;\r
+                                                               rng.setStart(node, 0);\r
                                                        else\r
-                                                               o = n;\r
-                                               }\r
-                                       }\r
-                               }\r
-\r
-                               return o;\r
-                       };\r
-\r
-                       if (isIE) {\r
-                               try {\r
-                                       b = d.body;\r
+                                                               rng.setEnd(node, node.nodeValue.length);\r
 \r
-                                       if (/^(IMG|TABLE)$/.test(n.nodeName)) {\r
-                                               r = b.createControlRange();\r
-                                               r.addElement(n);\r
-                                       } else {\r
-                                               r = b.createTextRange();\r
-                                               r.moveToElementText(n);\r
-                                       }\r
-\r
-                                       r.select();\r
-                               } catch (ex) {\r
-                                       // Throws illigal agrument in IE some times\r
-                               }\r
-                       } else {\r
-                               if (c) {\r
-                                       fn = find(n, 1) || t.dom.select('br:first', n)[0];\r
-                                       ln = find(n, 0) || t.dom.select('br:last', n)[0];\r
-\r
-                                       if (fn && ln) {\r
-                                               r = d.createRange();\r
+                                                       return;\r
+                                               }\r
 \r
-                                               if (fn.nodeName == 'BR')\r
-                                                       r.setStartBefore(fn);\r
-                                               else\r
-                                                       r.setStart(fn, 0);\r
+                                               // BR element\r
+                                               if (node.nodeName == 'BR') {\r
+                                                       if (start)\r
+                                                               rng.setStartBefore(node);\r
+                                                       else\r
+                                                               rng.setEndBefore(node);\r
 \r
-                                               if (ln.nodeName == 'BR')\r
-                                                       r.setEndBefore(ln);\r
-                                               else\r
-                                                       r.setEnd(ln, ln.nodeValue.length);\r
-                                       } else\r
-                                               r.selectNode(n);\r
-                               } else\r
-                                       r.selectNode(n);\r
+                                                       return;\r
+                                               }\r
+                                       } while (node = (start ? walker.next() : walker.prev()));\r
+                               };\r
 \r
-                               t.setRng(r);\r
+                               setPoint(node, 1);\r
+                               setPoint(node);\r
                        }\r
 \r
-                       return n;\r
+                       t.setRng(rng);\r
+\r
+                       return node;\r
                },\r
 \r
                isCollapsed : function() {\r
@@ -5143,7 +5566,10 @@ window.tinymce.dom.Sizzle = Sizzle;
                        if (!r || r.item)\r
                                return false;\r
 \r
-                       return !s || r.boundingWidth == 0 || r.collapsed;\r
+                       if (r.compareEndPoints)\r
+                               return r.compareEndPoints('StartToEnd', r) === 0;\r
+\r
+                       return !s || r.collapsed;\r
                },\r
 \r
                collapse : function(b) {\r
@@ -5184,20 +5610,32 @@ window.tinymce.dom.Sizzle = Sizzle;
                        // This can occur when the editor is placed in a hidden container element on Gecko\r
                        // Or on IE when there was an exception\r
                        if (!r)\r
-                               r = isIE ? t.win.document.body.createTextRange() : t.win.document.createRange();\r
+                               r = t.win.document.createRange ? t.win.document.createRange() : t.win.document.body.createTextRange();\r
 \r
+                       if (t.selectedRange && t.explicitRange) {\r
+                               if (r.compareBoundaryPoints(r.START_TO_START, t.selectedRange) === 0 && r.compareBoundaryPoints(r.END_TO_END, t.selectedRange) === 0) {\r
+                                       // Safari, Opera and Chrome only ever select text which causes the range to change.\r
+                                       // This lets us use the originally set range if the selection hasn't been changed by the user.\r
+                                       r = t.explicitRange;\r
+                               } else {\r
+                                       t.selectedRange = null;\r
+                                       t.explicitRange = null;\r
+                               }\r
+                       }\r
                        return r;\r
                },\r
 \r
                setRng : function(r) {\r
                        var s, t = this;\r
-\r
+                       \r
                        if (!t.tridentSel) {\r
                                s = t.getSel();\r
 \r
                                if (s) {\r
+                                       t.explicitRange = r;\r
                                        s.removeAllRanges();\r
                                        s.addRange(r);\r
+                                       t.selectedRange = s.getRangeAt(0);\r
                                }\r
                        } else {\r
                                // Is W3C Range\r
@@ -5224,33 +5662,36 @@ window.tinymce.dom.Sizzle = Sizzle;
                },\r
 \r
                getNode : function() {\r
-                       var t = this, r = t.getRng(), s = t.getSel(), e;\r
+                       var t = this, rng = t.getRng(), sel = t.getSel(), elm;\r
 \r
-                       if (!isIE) {\r
+                       if (rng.setStart) {\r
                                // Range maybe lost after the editor is made visible again\r
-                               if (!r)\r
+                               if (!rng)\r
                                        return t.dom.getRoot();\r
 \r
-                               e = r.commonAncestorContainer;\r
+                               elm = rng.commonAncestorContainer;\r
 \r
                                // Handle selection a image or other control like element such as anchors\r
-                               if (!r.collapsed) {\r
-                                       // If the anchor node is a element instead of a text node then return this element\r
-                                       if (tinymce.isWebKit && s.anchorNode && s.anchorNode.nodeType == 1) \r
-                                               return s.anchorNode.childNodes[s.anchorOffset]; \r
-\r
-                                       if (r.startContainer == r.endContainer) {\r
-                                               if (r.startOffset - r.endOffset < 2) {\r
-                                                       if (r.startContainer.hasChildNodes())\r
-                                                               e = r.startContainer.childNodes[r.startOffset];\r
+                               if (!rng.collapsed) {\r
+                                       if (rng.startContainer == rng.endContainer) {\r
+                                               if (rng.startOffset - rng.endOffset < 2) {\r
+                                                       if (rng.startContainer.hasChildNodes())\r
+                                                               elm = rng.startContainer.childNodes[rng.startOffset];\r
                                                }\r
                                        }\r
+\r
+                                       // If the anchor node is a element instead of a text node then return this element\r
+                                       if (tinymce.isWebKit && sel.anchorNode && sel.anchorNode.nodeType == 1) \r
+                                               return sel.anchorNode.childNodes[sel.anchorOffset]; \r
                                }\r
 \r
-                               return t.dom.getParent(e, '*');\r
+                               if (elm && elm.nodeType == 3)\r
+                                       return elm.parentNode;\r
+\r
+                               return elm;\r
                        }\r
 \r
-                       return r.item ? r.item(0) : r.parentElement();\r
+                       return rng.item ? rng.item(0) : rng.parentElement();\r
                },\r
 \r
                getSelectedBlocks : function(st, en) {\r
@@ -5289,9 +5730,9 @@ window.tinymce.dom.Sizzle = Sizzle;
                        if (!s)\r
                                tinymce.removeUnload(t.destroy);\r
                }\r
-\r
-               });\r
+       });\r
 })(tinymce);\r
+\r
 (function(tinymce) {\r
        tinymce.create('tinymce.dom.XMLWriter', {\r
                node : null,\r
@@ -5358,7 +5799,7 @@ window.tinymce.dom.Sizzle = Sizzle;
                },\r
 \r
                writeCDATA : function(v) {\r
-                       this.node.appendChild(this.doc.createCDATA(v));\r
+                       this.node.appendChild(this.doc.createCDATASection(v));\r
                },\r
 \r
                writeComment : function(v) {\r
@@ -5381,9 +5822,9 @@ window.tinymce.dom.Sizzle = Sizzle;
 \r
                        return h;\r
                }\r
-\r
-               });\r
+       });\r
 })(tinymce);\r
+\r
 (function(tinymce) {\r
        tinymce.create('tinymce.dom.StringWriter', {\r
                str : null,\r
@@ -5395,7 +5836,7 @@ window.tinymce.dom.Sizzle = Sizzle;
                StringWriter : function(s) {\r
                        this.settings = tinymce.extend({\r
                                indent_char : ' ',\r
-                               indentation : 1\r
+                               indentation : 0\r
                        }, s);\r
 \r
                        this.reset();\r
@@ -5508,9 +5949,9 @@ window.tinymce.dom.Sizzle = Sizzle;
 \r
                        return true;\r
                }\r
-\r
-               });\r
+       });\r
 })(tinymce);\r
+\r
 (function(tinymce) {\r
        // Shorten names\r
        var extend = tinymce.extend, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher, isIE = tinymce.isIE, isGecko = tinymce.isGecko;\r
@@ -5540,21 +5981,18 @@ window.tinymce.dom.Sizzle = Sizzle;
                                valid_nodes : 0,\r
                                node_filter : 0,\r
                                attr_filter : 0,\r
-                               invalid_attrs : /^(mce_|_moz_)/,\r
+                               invalid_attrs : /^(_mce_|_moz_|sizset|sizcache)/,\r
                                closed : /^(br|hr|input|meta|img|link|param|area)$/,\r
                                entity_encoding : 'named',\r
                                entities : '160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro',\r
-                               bool_attrs : /(checked|disabled|readonly|selected|nowrap)/,\r
                                valid_elements : '*[*]',\r
                                extended_valid_elements : 0,\r
-                               valid_child_elements : 0,\r
                                invalid_elements : 0,\r
                                fix_table_elements : 1,\r
                                fix_list_elements : true,\r
                                fix_content_duplication : true,\r
                                convert_fonts_to_spans : false,\r
                                font_size_classes : 0,\r
-                               font_size_style_values : 0,\r
                                apply_source_formatting : 0,\r
                                indent_mode : 'simple',\r
                                indent_char : '\t',\r
@@ -5565,6 +6003,11 @@ window.tinymce.dom.Sizzle = Sizzle;
                        }, s);\r
 \r
                        t.dom = s.dom;\r
+                       t.schema = s.schema;\r
+\r
+                       // Use raw entities if no entities are defined\r
+                       if (s.entity_encoding == 'named' && !s.entities)\r
+                               s.entity_encoding = 'raw';\r
 \r
                        if (s.remove_redundant_brs) {\r
                                t.onPostProcess.add(function(se, o) {\r
@@ -5628,15 +6071,27 @@ window.tinymce.dom.Sizzle = Sizzle;
 \r
                        if (s.fix_table_elements) {\r
                                t.onPreProcess.add(function(se, o) {\r
-                                       each(t.dom.select('p table', o.node), function(n) {\r
-                                               t.dom.split(t.dom.getParent(n, 'p'), n);\r
-                                       });\r
+                                       // Since Opera will crash if you attach the node to a dynamic document we need to brrowser sniff a specific build\r
+                                       // so Opera users with an older version will have to live with less compaible output not much we can do here\r
+                                       if (!tinymce.isOpera || opera.buildNumber() >= 1767) {\r
+                                               each(t.dom.select('p table', o.node).reverse(), function(n) {\r
+                                                       var parent = t.dom.getParent(n.parentNode, 'table,p');\r
+\r
+                                                       if (parent.nodeName != 'TABLE') {\r
+                                                               try {\r
+                                                                       t.dom.split(parent, n);\r
+                                                               } catch (ex) {\r
+                                                                       // IE can sometimes fire an unknown runtime error so we just ignore it\r
+                                                               }\r
+                                                       }\r
+                                               });\r
+                                       }\r
                                });\r
                        }\r
                },\r
 \r
                setEntities : function(s) {\r
-                       var t = this, a, i, l = {}, re = '', v;\r
+                       var t = this, a, i, l = {}, v;\r
 \r
                        // No need to setup more than once\r
                        if (t.entityLookup)\r
@@ -5654,124 +6109,41 @@ window.tinymce.dom.Sizzle = Sizzle;
                                l[String.fromCharCode(a[i])] = a[i + 1];\r
 \r
                                v = parseInt(a[i]).toString(16);\r
-                               re += '\\u' + '0000'.substring(v.length) + v;\r
-                       }\r
-\r
-                       if (!re) {\r
-                               t.settings.entity_encoding = 'raw';\r
-                               return;\r
                        }\r
 \r
-                       t.entitiesRE = new RegExp('[' + re + ']', 'g');\r
                        t.entityLookup = l;\r
                },\r
 \r
-               setValidChildRules : function(s) {\r
-                       this.childRules = null;\r
-                       this.addValidChildRules(s);\r
+               setRules : function(s) {\r
+                       var t = this;\r
+\r
+                       t._setup();\r
+                       t.rules = {};\r
+                       t.wildRules = [];\r
+                       t.validElements = {};\r
+\r
+                       return t.addRules(s);\r
                },\r
 \r
-               addValidChildRules : function(s) {\r
-                       var t = this, inst, intr, bloc;\r
+               addRules : function(s) {\r
+                       var t = this, dr;\r
 \r
                        if (!s)\r
                                return;\r
 \r
-                       inst = 'A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment';\r
-                       intr = 'A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment';\r
-                       bloc = 'H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';\r
+                       t._setup();\r
 \r
                        each(s.split(','), function(s) {\r
-                               var p = s.split(/\[|\]/), re;\r
+                               var p = s.split(/\[|\]/), tn = p[0].split('/'), ra, at, wat, va = [];\r
 \r
-                               s = '';\r
-                               each(p[1].split('|'), function(v) {\r
-                                       if (s)\r
-                                               s += '|';\r
+                               // Extend with default rules\r
+                               if (dr)\r
+                                       at = tinymce.extend([], dr.attribs);\r
 \r
-                                       switch (v) {\r
-                                               case '%itrans':\r
-                                                       v = intr;\r
-                                                       break;\r
-\r
-                                               case '%itrans_na':\r
-                                                       v = intr.substring(2);\r
-                                                       break;\r
-\r
-                                               case '%istrict':\r
-                                                       v = inst;\r
-                                                       break;\r
-\r
-                                               case '%istrict_na':\r
-                                                       v = inst.substring(2);\r
-                                                       break;\r
-\r
-                                               case '%btrans':\r
-                                                       v = bloc;\r
-                                                       break;\r
-\r
-                                               case '%bstrict':\r
-                                                       v = bloc;\r
-                                                       break;\r
-                                       }\r
-\r
-                                       s += v;\r
-                               });\r
-                               re = new RegExp('^(' + s.toLowerCase() + ')$', 'i');\r
-\r
-                               each(p[0].split('/'), function(s) {\r
-                                       t.childRules = t.childRules || {};\r
-                                       t.childRules[s] = re;\r
-                               });\r
-                       });\r
-\r
-                       // Build regex\r
-                       s = '';\r
-                       each(t.childRules, function(v, k) {\r
-                               if (s)\r
-                                       s += '|';\r
-\r
-                               s += k;\r
-                       });\r
-\r
-                       t.parentElementsRE = new RegExp('^(' + s.toLowerCase() + ')$', 'i');\r
-\r
-                       /*console.debug(t.parentElementsRE.toString());\r
-                       each(t.childRules, function(v) {\r
-                               console.debug(v.toString());\r
-                       });*/\r
-               },\r
-\r
-               setRules : function(s) {\r
-                       var t = this;\r
-\r
-                       t._setup();\r
-                       t.rules = {};\r
-                       t.wildRules = [];\r
-                       t.validElements = {};\r
-\r
-                       return t.addRules(s);\r
-               },\r
-\r
-               addRules : function(s) {\r
-                       var t = this, dr;\r
-\r
-                       if (!s)\r
-                               return;\r
-\r
-                       t._setup();\r
-\r
-                       each(s.split(','), function(s) {\r
-                               var p = s.split(/\[|\]/), tn = p[0].split('/'), ra, at, wat, va = [];\r
-\r
-                               // Extend with default rules\r
-                               if (dr)\r
-                                       at = tinymce.extend([], dr.attribs);\r
-\r
-                               // Parse attributes\r
-                               if (p.length > 1) {\r
-                                       each(p[1].split('|'), function(s) {\r
-                                               var ar = {}, i;\r
+                               // Parse attributes\r
+                               if (p.length > 1) {\r
+                                       each(p[1].split('|'), function(s) {\r
+                                               var ar = {}, i;\r
 \r
                                                at = at || [];\r
 \r
@@ -5946,13 +6318,58 @@ window.tinymce.dom.Sizzle = Sizzle;
                },\r
 \r
                serialize : function(n, o) {\r
-                       var h, t = this;\r
+                       var h, t = this, doc, oldDoc, impl, selected;\r
 \r
                        t._setup();\r
                        o = o || {};\r
                        o.format = o.format || 'html';\r
                        t.processObj = o;\r
+\r
+                       // IE looses the selected attribute on option elements so we need to store it\r
+                       // See: http://support.microsoft.com/kb/829907\r
+                       if (isIE) {\r
+                               selected = [];\r
+                               each(n.getElementsByTagName('option'), function(n) {\r
+                                       var v = t.dom.getAttrib(n, 'selected');\r
+\r
+                                       selected.push(v ? v : null);\r
+                               });\r
+                       }\r
+\r
                        n = n.cloneNode(true);\r
+\r
+                       // IE looses the selected attribute on option elements so we need to restore it\r
+                       if (isIE) {\r
+                               each(n.getElementsByTagName('option'), function(n, i) {\r
+                                       t.dom.setAttrib(n, 'selected', selected[i]);\r
+                               });\r
+                       }\r
+\r
+                       // Nodes needs to be attached to something in WebKit/Opera\r
+                       // Older builds of Opera crashes if you attach the node to an document created dynamically\r
+                       // and since we can't feature detect a crash we need to sniff the acutal build number\r
+                       // This fix will make DOM ranges and make Sizzle happy!\r
+                       impl = n.ownerDocument.implementation;\r
+                       if (impl.createHTMLDocument && (tinymce.isOpera && opera.buildNumber() >= 1767)) {\r
+                               // Create an empty HTML document\r
+                               doc = impl.createHTMLDocument("");\r
+\r
+                               // Add the element or it's children if it's a body element to the new document\r
+                               each(n.nodeName == 'BODY' ? n.childNodes : [n], function(node) {\r
+                                       doc.body.appendChild(doc.importNode(node, true));\r
+                               });\r
+\r
+                               // Grab first child or body element for serialization\r
+                               if (n.nodeName != 'BODY')\r
+                                       n = doc.body.firstChild;\r
+                               else\r
+                                       n = doc.body;\r
+\r
+                               // set the new document in DOMUtils so createElement etc works\r
+                               oldDoc = t.dom.doc;\r
+                               t.dom.doc = doc;\r
+                       }\r
+\r
                        t.key = '' + (parseInt(t.key) + 1);\r
 \r
                        // Pre process\r
@@ -5963,11 +6380,16 @@ window.tinymce.dom.Sizzle = Sizzle;
 \r
                        // Serialize HTML DOM into a string\r
                        t.writer.reset();\r
+                       t._info = o;\r
                        t._serializeNode(n, o.getInner);\r
 \r
                        // Post process\r
                        o.content = t.writer.getContent();\r
 \r
+                       // Restore the old document if it was changed\r
+                       if (oldDoc)\r
+                               t.dom.doc = oldDoc;\r
+\r
                        if (!o.no_events)\r
                                t.onPostProcess.dispatch(t, o);\r
 \r
@@ -5988,6 +6410,7 @@ window.tinymce.dom.Sizzle = Sizzle;
                                        content : h,\r
                                        patterns : [\r
                                                {pattern : /(<script[^>]*>)(.*?)(<\/script>)/g},\r
+                                               {pattern : /(<noscript[^>]*>)(.*?)(<\/noscript>)/g},\r
                                                {pattern : /(<style[^>]*>)(.*?)(<\/style>)/g},\r
                                                {pattern : /(<pre[^>]*>)(.*?)(<\/pre>)/g, encode : 1},\r
                                                {pattern : /(<!--\[CDATA\[)(.*?)(\]\]-->)/g}\r
@@ -6040,23 +6463,38 @@ window.tinymce.dom.Sizzle = Sizzle;
                                // Restore the \u00a0 character if raw mode is enabled\r
                                if (s.entity_encoding == 'raw')\r
                                        h = h.replace(/<p>&nbsp;<\/p>|<p([^>]+)>&nbsp;<\/p>/g, '<p$1>\u00a0</p>');\r
+\r
+                               // Restore noscript elements\r
+                               h = h.replace(/<noscript([^>]+|)>([\s\S]*?)<\/noscript>/g, function(v, attribs, text) {\r
+                                       return '<noscript' + attribs + '>' + t.dom.decode(text.replace(/<!--|-->/g, '')) + '</noscript>';\r
+                               });\r
                        }\r
 \r
                        o.content = h;\r
                },\r
 \r
-               _serializeNode : function(n, inn) {\r
-                       var t = this, s = t.settings, w = t.writer, hc, el, cn, i, l, a, at, no, v, nn, ru, ar, iv;\r
+               _serializeNode : function(n, inner) {\r
+                       var t = this, s = t.settings, w = t.writer, hc, el, cn, i, l, a, at, no, v, nn, ru, ar, iv, closed, keep, type;\r
 \r
                        if (!s.node_filter || s.node_filter(n)) {\r
                                switch (n.nodeType) {\r
                                        case 1: // Element\r
-                                               if (n.hasAttribute ? n.hasAttribute('mce_bogus') : n.getAttribute('mce_bogus'))\r
+                                               if (n.hasAttribute ? n.hasAttribute('_mce_bogus') : n.getAttribute('_mce_bogus'))\r
                                                        return;\r
 \r
-                                               iv = false;\r
+                                               iv = keep = false;\r
                                                hc = n.hasChildNodes();\r
-                                               nn = n.getAttribute('mce_name') || n.nodeName.toLowerCase();\r
+                                               nn = n.getAttribute('_mce_name') || n.nodeName.toLowerCase();\r
+\r
+                                               // Get internal type\r
+                                               type = n.getAttribute('_mce_type');\r
+                                               if (type) {\r
+                                                       if (!t._info.cleanup) {\r
+                                                               iv = true;\r
+                                                               return;\r
+                                                       } else\r
+                                                               keep = 1;\r
+                                               }\r
 \r
                                                // Add correct prefix on IE\r
                                                if (isIE) {\r
@@ -6069,18 +6507,20 @@ window.tinymce.dom.Sizzle = Sizzle;
                                                        nn = nn.substring(4);\r
 \r
                                                // Check if valid\r
-                                               if (!t.validElementsRE.test(nn) || (t.invalidElementsRE && t.invalidElementsRE.test(nn)) || inn) {\r
-                                                       iv = true;\r
-                                                       break;\r
+                                               if (!keep) {\r
+                                                       if (!t.validElementsRE || !t.validElementsRE.test(nn) || (t.invalidElementsRE && t.invalidElementsRE.test(nn)) || inner) {\r
+                                                               iv = true;\r
+                                                               break;\r
+                                                       }\r
                                                }\r
 \r
                                                if (isIE) {\r
                                                        // Fix IE content duplication (DOM can have multiple copies of the same node)\r
                                                        if (s.fix_content_duplication) {\r
-                                                               if (n.mce_serialized == t.key)\r
+                                                               if (n._mce_serialized == t.key)\r
                                                                        return;\r
 \r
-                                                               n.mce_serialized = t.key;\r
+                                                               n._mce_serialized = t.key;\r
                                                        }\r
 \r
                                                        // IE sometimes adds a / infront of the node name\r
@@ -6093,19 +6533,25 @@ window.tinymce.dom.Sizzle = Sizzle;
                                                }\r
 \r
                                                // Check if valid child\r
-                                               if (t.childRules) {\r
-                                                       if (t.parentElementsRE.test(t.elementName)) {\r
-                                                               if (!t.childRules[t.elementName].test(nn)) {\r
-                                                                       iv = true;\r
-                                                                       break;\r
-                                                               }\r
+                                               if (s.validate_children) {\r
+                                                       if (t.elementName && !t.schema.isValid(t.elementName, nn)) {\r
+                                                               iv = true;\r
+                                                               break;\r
                                                        }\r
 \r
                                                        t.elementName = nn;\r
                                                }\r
 \r
                                                ru = t.findRule(nn);\r
+                                               \r
+                                               // No valid rule for this element could be found then skip it\r
+                                               if (!ru) {\r
+                                                       iv = true;\r
+                                                       break;\r
+                                               }\r
+\r
                                                nn = ru.name || nn;\r
+                                               closed = s.closed.test(nn);\r
 \r
                                                // Skip empty nodes or empty node name in IE\r
                                                if ((!hc && ru.noEmpty) || (isIE && !nn)) {\r
@@ -6163,11 +6609,23 @@ window.tinymce.dom.Sizzle = Sizzle;
                                                        }\r
                                                }\r
 \r
+                                               // Keep type attribute\r
+                                               if (type && keep)\r
+                                                       w.writeAttribute('_mce_type', type);\r
+\r
+                                               // Write text from script\r
+                                               if (nn === 'script' && tinymce.trim(n.innerHTML)) {\r
+                                                       w.writeText('// '); // Padd it with a comment so it will parse on older browsers\r
+                                                       w.writeCDATA(n.innerHTML.replace(/<!--|-->|<\[CDATA\[|\]\]>/g, '')); // Remove comments and cdata stuctures\r
+                                                       hc = false;\r
+                                                       break;\r
+                                               }\r
+\r
                                                // Padd empty nodes with a &nbsp;\r
                                                if (ru.padd) {\r
                                                        // If it has only one bogus child, padd it anyway workaround for <td><br /></td> bug\r
                                                        if (hc && (cn = n.firstChild) && cn.nodeType === 1 && n.childNodes.length === 1) {\r
-                                                               if (cn.hasAttribute ? cn.hasAttribute('mce_bogus') : cn.getAttribute('mce_bogus'))\r
+                                                               if (cn.hasAttribute ? cn.hasAttribute('_mce_bogus') : cn.getAttribute('_mce_bogus'))\r
                                                                        w.writeText('\u00a0');\r
                                                        } else if (!hc)\r
                                                                w.writeText('\u00a0'); // No children then padd it\r
@@ -6177,10 +6635,8 @@ window.tinymce.dom.Sizzle = Sizzle;
 \r
                                        case 3: // Text\r
                                                // Check if valid child\r
-                                               if (t.childRules && t.parentElementsRE.test(t.elementName)) {\r
-                                                       if (!t.childRules[t.elementName].test(n.nodeName))\r
-                                                               return;\r
-                                               }\r
+                                               if (s.validate_children && t.elementName && !t.schema.isValid(t.elementName, '#text'))\r
+                                                       return;\r
 \r
                                                return w.writeText(n.nodeValue);\r
 \r
@@ -6193,7 +6649,7 @@ window.tinymce.dom.Sizzle = Sizzle;
                        } else if (n.nodeType == 1)\r
                                hc = n.hasChildNodes();\r
 \r
-                       if (hc) {\r
+                       if (hc && !closed) {\r
                                cn = n.firstChild;\r
 \r
                                while (cn) {\r
@@ -6205,7 +6661,7 @@ window.tinymce.dom.Sizzle = Sizzle;
 \r
                        // Write element end\r
                        if (!iv) {\r
-                               if (hc || !s.closed.test(nn))\r
+                               if (!closed)\r
                                        w.writeFullEndElement();\r
                                else\r
                                        w.writeEndElement();\r
@@ -6273,7 +6729,7 @@ window.tinymce.dom.Sizzle = Sizzle;
                                        t.setEntities(s.entities);\r
                                        l = t.entityLookup;\r
 \r
-                                       h = h.replace(t.entitiesRE, function(a) {\r
+                                       h = h.replace(/[\u007E-\uFFFF]/g, function(a) {\r
                                                var v;\r
 \r
                                                if (v = l[a])\r
@@ -6303,7 +6759,6 @@ window.tinymce.dom.Sizzle = Sizzle;
 \r
                        t.setRules(s.valid_elements);\r
                        t.addRules(s.extended_valid_elements);\r
-                       t.addValidChildRules(s.valid_child_elements);\r
 \r
                        if (s.invalid_elements)\r
                                t.invalidElementsRE = new RegExp('^(' + wildcardToRE(s.invalid_elements.replace(/,/g, '|').toLowerCase()) + ')$');\r
@@ -6326,16 +6781,6 @@ window.tinymce.dom.Sizzle = Sizzle;
 \r
                        v = this.dom.getAttrib(n, na);\r
 \r
-                       // Bool attr\r
-                       if (this.settings.bool_attrs.test(na) && v) {\r
-                               v = ('' + v).toLowerCase();\r
-\r
-                               if (v === 'false' || v === '0')\r
-                                       return null;\r
-\r
-                               v = na;\r
-                       }\r
-\r
                        switch (na) {\r
                                case 'rowspan':\r
                                case 'colspan':\r
@@ -6378,306 +6823,591 @@ window.tinymce.dom.Sizzle = Sizzle;
 \r
                        return v;\r
                }\r
-\r
-               });\r
+       });\r
 })(tinymce);\r
+\r
 (function(tinymce) {\r
-       var each = tinymce.each, Event = tinymce.dom.Event;\r
+       tinymce.dom.ScriptLoader = function(settings) {\r
+               var QUEUED = 0,\r
+                       LOADING = 1,\r
+                       LOADED = 2,\r
+                       states = {},\r
+                       queue = [],\r
+                       scriptLoadedCallbacks = {},\r
+                       queueLoadedCallbacks = [],\r
+                       loading = 0,\r
+                       undefined;\r
+\r
+               function loadScript(url, callback) {\r
+                       var t = this, dom = tinymce.DOM, elm, uri, loc, id;\r
+\r
+                       // Execute callback when script is loaded\r
+                       function done() {\r
+                               dom.remove(id);\r
+\r
+                               if (elm)\r
+                                       elm.onreadystatechange = elm.onload = elm = null;\r
+\r
+                               callback();\r
+                       };\r
 \r
-       tinymce.create('tinymce.dom.ScriptLoader', {\r
-               ScriptLoader : function(s) {\r
-                       this.settings = s || {};\r
-                       this.queue = [];\r
-                       this.lookup = {};\r
-               },\r
+                       id = dom.uniqueId();\r
 \r
-               isDone : function(u) {\r
-                       return this.lookup[u] ? this.lookup[u].state == 2 : 0;\r
-               },\r
+                       if (tinymce.isIE6) {\r
+                               uri = new tinymce.util.URI(url);\r
+                               loc = location;\r
 \r
-               markDone : function(u) {\r
-                       this.lookup[u] = {state : 2, url : u};\r
-               },\r
+                               // If script is from same domain and we\r
+                               // use IE 6 then use XHR since it's more reliable\r
+                               if (uri.host == loc.hostname && uri.port == loc.port && (uri.protocol + ':') == loc.protocol) {\r
+                                       tinymce.util.XHR.send({\r
+                                               url : tinymce._addVer(uri.getURI()),\r
+                                               success : function(content) {\r
+                                                       // Create new temp script element\r
+                                                       var script = dom.create('script', {\r
+                                                               type : 'text/javascript'\r
+                                                       });\r
 \r
-               add : function(u, cb, s, pr) {\r
-                       var t = this, lo = t.lookup, o;\r
+                                                       // Evaluate script in global scope\r
+                                                       script.text = content;\r
+                                                       document.getElementsByTagName('head')[0].appendChild(script);\r
+                                                       dom.remove(script);\r
 \r
-                       if (o = lo[u]) {\r
-                               // Is loaded fire callback\r
-                               if (cb && o.state == 2)\r
-                                       cb.call(s || this);\r
+                                                       done();\r
+                                               }\r
+                                       });\r
 \r
-                               return o;\r
+                                       return;\r
+                               }\r
                        }\r
 \r
-                       o = {state : 0, url : u, func : cb, scope : s || this};\r
+                       // Create new script element\r
+                       elm = dom.create('script', {\r
+                               id : id,\r
+                               type : 'text/javascript',\r
+                               src : tinymce._addVer(url)\r
+                       });\r
 \r
-                       if (pr)\r
-                               t.queue.unshift(o);\r
-                       else\r
-                               t.queue.push(o);\r
+                       // Add onload and readystate listeners\r
+                       elm.onload = done;\r
+                       elm.onreadystatechange = function() {\r
+                               var state = elm.readyState;\r
+\r
+                               // Loaded state is passed on IE 6 however there\r
+                               // are known issues with this method but we can't use\r
+                               // XHR in a cross domain loading\r
+                               if (state == 'complete' || state == 'loaded')\r
+                                       done();\r
+                       };\r
 \r
-                       lo[u] = o;\r
+                       // Most browsers support this feature so we report errors\r
+                       // for those at least to help users track their missing plugins etc\r
+                       // todo: Removed since it produced error if the document is unloaded by navigating away, re-add it as an option\r
+                       /*elm.onerror = function() {\r
+                               alert('Failed to load: ' + url);\r
+                       };*/\r
 \r
-                       return o;\r
-               },\r
+                       // Add script to document\r
+                       (document.getElementsByTagName('head')[0] || document.body).appendChild(elm);\r
+               };\r
 \r
-               load : function(u, cb, s) {\r
-                       var t = this, o;\r
+               this.isDone = function(url) {\r
+                       return states[url] == LOADED;\r
+               };\r
 \r
-                       if (o = t.lookup[u]) {\r
-                               // Is loaded fire callback\r
-                               if (cb && o.state == 2)\r
-                                       cb.call(s || t);\r
+               this.markDone = function(url) {\r
+                       states[url] = LOADED;\r
+               };\r
 \r
-                               return o;\r
+               this.add = this.load = function(url, callback, scope) {\r
+                       var item, state = states[url];\r
+\r
+                       // Add url to load queue\r
+                       if (state == undefined) {\r
+                               queue.push(url);\r
+                               states[url] = QUEUED;\r
                        }\r
 \r
-                       function loadScript(u) {\r
-                               if (Event.domLoaded || t.settings.strict_mode) {\r
-                                       tinymce.util.XHR.send({\r
-                                               url : tinymce._addVer(u),\r
-                                               error : t.settings.error,\r
-                                               async : false,\r
-                                               success : function(co) {\r
-                                                       t.eval(co);\r
-                                               }\r
-                                       });\r
-                               } else\r
-                                       document.write('<script type="text/javascript" src="' + tinymce._addVer(u) + '"></script>');\r
-                       };\r
+                       if (callback) {\r
+                               // Store away callback for later execution\r
+                               if (!scriptLoadedCallbacks[url])\r
+                                       scriptLoadedCallbacks[url] = [];\r
+\r
+                               scriptLoadedCallbacks[url].push({\r
+                                       func : callback,\r
+                                       scope : scope || this\r
+                               });\r
+                       }\r
+               };\r
+\r
+               this.loadQueue = function(callback, scope) {\r
+                       this.loadScripts(queue, callback, scope);\r
+               };\r
 \r
-                       if (!tinymce.is(u, 'string')) {\r
-                               each(u, function(u) {\r
-                                       loadScript(u);\r
+               this.loadScripts = function(scripts, callback, scope) {\r
+                       var loadScripts;\r
+\r
+                       function execScriptLoadedCallbacks(url) {\r
+                               // Execute URL callback functions\r
+                               tinymce.each(scriptLoadedCallbacks[url], function(callback) {\r
+                                       callback.func.call(callback.scope);\r
                                });\r
 \r
-                               if (cb)\r
-                                       cb.call(s || t);\r
-                       } else {\r
-                               loadScript(u);\r
+                               scriptLoadedCallbacks[url] = undefined;\r
+                       };\r
 \r
-                               if (cb)\r
-                                       cb.call(s || t);\r
-                       }\r
-               },\r
+                       queueLoadedCallbacks.push({\r
+                               func : callback,\r
+                               scope : scope || this\r
+                       });\r
 \r
-               loadQueue : function(cb, s) {\r
-                       var t = this;\r
+                       loadScripts = function() {\r
+                               var loadingScripts = tinymce.grep(scripts);\r
+\r
+                               // Current scripts has been handled\r
+                               scripts.length = 0;\r
 \r
-                       if (!t.queueLoading) {\r
-                               t.queueLoading = 1;\r
-                               t.queueCallbacks = [];\r
+                               // Load scripts that needs to be loaded\r
+                               tinymce.each(loadingScripts, function(url) {\r
+                                       // Script is already loaded then execute script callbacks directly\r
+                                       if (states[url] == LOADED) {\r
+                                               execScriptLoadedCallbacks(url);\r
+                                               return;\r
+                                       }\r
 \r
-                               t.loadScripts(t.queue, function() {\r
-                                       t.queueLoading = 0;\r
+                                       // Is script not loading then start loading it\r
+                                       if (states[url] != LOADING) {\r
+                                               states[url] = LOADING;\r
+                                               loading++;\r
 \r
-                                       if (cb)\r
-                                               cb.call(s || t);\r
+                                               loadScript(url, function() {\r
+                                                       states[url] = LOADED;\r
+                                                       loading--;\r
 \r
-                                       each(t.queueCallbacks, function(o) {\r
-                                               o.func.call(o.scope);\r
-                                       });\r
+                                                       execScriptLoadedCallbacks(url);\r
+\r
+                                                       // Load more scripts if they where added by the recently loaded script\r
+                                                       loadScripts();\r
+                                               });\r
+                                       }\r
                                });\r
-                       } else if (cb)\r
-                               t.queueCallbacks.push({func : cb, scope : s || t});\r
-               },\r
 \r
-               eval : function(co) {\r
-                       var w = window;\r
+                               // No scripts are currently loading then execute all pending queue loaded callbacks\r
+                               if (!loading) {\r
+                                       tinymce.each(queueLoadedCallbacks, function(callback) {\r
+                                               callback.func.call(callback.scope);\r
+                                       });\r
 \r
-                       // Evaluate script\r
-                       if (!w.execScript) {\r
-                               try {\r
-                                       eval.call(w, co);\r
-                               } catch (ex) {\r
-                                       eval(co, w); // Firefox 3.0a8\r
+                                       queueLoadedCallbacks.length = 0;\r
                                }\r
-                       } else\r
-                               w.execScript(co); // IE\r
-               },\r
+                       };\r
 \r
-               loadScripts : function(sc, cb, s) {\r
-                       var t = this, lo = t.lookup;\r
+                       loadScripts();\r
+               };\r
+       };\r
 \r
-                       function done(o) {\r
-                               o.state = 2; // Has been loaded\r
+       // Global script loader\r
+       tinymce.ScriptLoader = new tinymce.dom.ScriptLoader();\r
+})(tinymce);\r
 \r
-                               // Run callback\r
-                               if (o.func)\r
-                                       o.func.call(o.scope || t);\r
-                       };\r
+tinymce.dom.TreeWalker = function(start_node, root_node) {\r
+       var node = start_node;\r
 \r
-                       function allDone() {\r
-                               var l;\r
+       function findSibling(node, start_name, sibling_name, shallow) {\r
+               var sibling, parent;\r
 \r
-                               // Check if all files are loaded\r
-                               l = sc.length;\r
-                               each(sc, function(o) {\r
-                                       o = lo[o.url];\r
+               if (node) {\r
+                       // Walk into nodes if it has a start\r
+                       if (!shallow && node[start_name])\r
+                               return node[start_name];\r
 \r
-                                       if (o.state === 2) {// It has finished loading\r
-                                               done(o);\r
-                                               l--;\r
-                                       } else\r
-                                               load(o);\r
-                               });\r
+                       // Return the sibling if it has one\r
+                       if (node != root_node) {\r
+                               sibling = node[sibling_name];\r
+                               if (sibling)\r
+                                       return sibling;\r
 \r
-                               // They are all loaded\r
-                               if (l === 0 && cb) {\r
-                                       cb.call(s || t);\r
-                                       cb = 0;\r
+                               // Walk up the parents to look for siblings\r
+                               for (parent = node.parentNode; parent && parent != root_node; parent = parent.parentNode) {\r
+                                       sibling = parent[sibling_name];\r
+                                       if (sibling)\r
+                                               return sibling;\r
                                }\r
-                       };\r
+                       }\r
+               }\r
+       };\r
 \r
-                       function load(o) {\r
-                               if (o.state > 0)\r
-                                       return;\r
+       this.current = function() {\r
+               return node;\r
+       };\r
 \r
-                               o.state = 1; // Is loading\r
+       this.next = function(shallow) {\r
+               return (node = findSibling(node, 'firstChild', 'nextSibling', shallow));\r
+       };\r
 \r
-                               tinymce.dom.ScriptLoader.loadScript(o.url, function() {\r
-                                       done(o);\r
-                                       allDone();\r
-                               });\r
+       this.prev = function(shallow) {\r
+               return (node = findSibling(node, 'lastChild', 'lastSibling', shallow));\r
+       };\r
+};\r
 \r
-                               /*\r
-                               tinymce.util.XHR.send({\r
-                                       url : o.url,\r
-                                       error : t.settings.error,\r
-                                       success : function(co) {\r
-                                               t.eval(co);\r
-                                               done(o);\r
-                                               allDone();\r
-                                       }\r
-                               });\r
-                               */\r
-                       };\r
+(function() {\r
+       var transitional = {};\r
 \r
-                       each(sc, function(o) {\r
-                               var u = o.url;\r
+       function unpack(lookup, data) {\r
+               var key;\r
 \r
-                               // Add to queue if needed\r
-                               if (!lo[u]) {\r
-                                       lo[u] = o;\r
-                                       t.queue.push(o);\r
-                               } else\r
-                                       o = lo[u];\r
+               function replace(value) {\r
+                       return value.replace(/[A-Z]+/g, function(key) {\r
+                               return replace(lookup[key]);\r
+                       });\r
+               };\r
 \r
-                               // Is already loading or has been loaded\r
-                               if (o.state > 0)\r
-                                       return;\r
+               // Unpack lookup\r
+               for (key in lookup) {\r
+                       if (lookup.hasOwnProperty(key))\r
+                               lookup[key] = replace(lookup[key]);\r
+               }\r
 \r
-                               if (!Event.domLoaded && !t.settings.strict_mode) {\r
-                                       var ix, ol = '';\r
+               // Unpack and parse data into object map\r
+               replace(data).replace(/#/g, '#text').replace(/(\w+)\[([^\]]+)\]/g, function(str, name, children) {\r
+                       var i, map = {};\r
 \r
-                                       // Add onload events\r
-                                       if (cb || o.func) {\r
-                                               o.state = 1; // Is loading\r
+                       children = children.split(/\|/);\r
 \r
-                                               ix = tinymce.dom.ScriptLoader._addOnLoad(function() {\r
-                                                       done(o);\r
-                                                       allDone();\r
-                                               });\r
+                       for (i = children.length - 1; i >= 0; i--)\r
+                               map[children[i]] = 1;\r
 \r
-                                               if (tinymce.isIE)\r
-                                                       ol = ' onreadystatechange="';\r
-                                               else\r
-                                                       ol = ' onload="';\r
+                       transitional[name] = map;\r
+               });\r
+       };\r
 \r
-                                               ol += 'tinymce.dom.ScriptLoader._onLoad(this,\'' + u + '\',' + ix + ');"';\r
-                                       }\r
+       // This is the XHTML 1.0 transitional elements with it's children packed to reduce it's size\r
+       // we will later include the attributes here and use it as a default for valid elements but it\r
+       // requires us to rewrite the serializer engine\r
+       unpack({\r
+               Z : '#|H|K|N|O|P',\r
+               Y : '#|X|form|R|Q',\r
+               X : 'p|T|div|U|W|isindex|fieldset|table',\r
+               W : 'pre|hr|blockquote|address|center|noframes',\r
+               U : 'ul|ol|dl|menu|dir',\r
+               ZC : '#|p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q',\r
+               T : 'h1|h2|h3|h4|h5|h6',\r
+               ZB : '#|X|S|Q',\r
+               S : 'R|P',\r
+               ZA : '#|a|G|J|M|O|P',\r
+               R : '#|a|H|K|N|O',\r
+               Q : 'noscript|P',\r
+               P : 'ins|del|script',\r
+               O : 'input|select|textarea|label|button',\r
+               N : 'M|L',\r
+               M : 'em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym',\r
+               L : 'sub|sup',\r
+               K : 'J|I',\r
+               J : 'tt|i|b|u|s|strike',\r
+               I : 'big|small|font|basefont',\r
+               H : 'G|F',\r
+               G : 'br|span|bdo',\r
+               F : 'object|applet|img|map|iframe'\r
+       }, 'script[]' + \r
+               'style[]' + \r
+               'object[#|param|X|form|a|H|K|N|O|Q]' + \r
+               'param[]' + \r
+               'p[S]' + \r
+               'a[Z]' + \r
+               'br[]' + \r
+               'span[S]' + \r
+               'bdo[S]' + \r
+               'applet[#|param|X|form|a|H|K|N|O|Q]' + \r
+               'h1[S]' + \r
+               'img[]' + \r
+               'map[X|form|Q|area]' + \r
+               'h2[S]' + \r
+               'iframe[#|X|form|a|H|K|N|O|Q]' + \r
+               'h3[S]' + \r
+               'tt[S]' + \r
+               'i[S]' + \r
+               'b[S]' + \r
+               'u[S]' + \r
+               's[S]' + \r
+               'strike[S]' + \r
+               'big[S]' + \r
+               'small[S]' + \r
+               'font[S]' + \r
+               'basefont[]' + \r
+               'em[S]' + \r
+               'strong[S]' + \r
+               'dfn[S]' + \r
+               'code[S]' + \r
+               'q[S]' + \r
+               'samp[S]' + \r
+               'kbd[S]' + \r
+               'var[S]' + \r
+               'cite[S]' + \r
+               'abbr[S]' + \r
+               'acronym[S]' + \r
+               'sub[S]' + \r
+               'sup[S]' + \r
+               'input[]' + \r
+               'select[optgroup|option]' + \r
+               'optgroup[option]' + \r
+               'option[]' + \r
+               'textarea[]' + \r
+               'label[S]' + \r
+               'button[#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]' + \r
+               'h4[S]' + \r
+               'ins[#|X|form|a|H|K|N|O|Q]' + \r
+               'h5[S]' + \r
+               'del[#|X|form|a|H|K|N|O|Q]' + \r
+               'h6[S]' + \r
+               'div[#|X|form|a|H|K|N|O|Q]' + \r
+               'ul[li]' + \r
+               'li[#|X|form|a|H|K|N|O|Q]' + \r
+               'ol[li]' + \r
+               'dl[dt|dd]' + \r
+               'dt[S]' + \r
+               'dd[#|X|form|a|H|K|N|O|Q]' + \r
+               'menu[li]' + \r
+               'dir[li]' + \r
+               'pre[ZA]' + \r
+               'hr[]' + \r
+               'blockquote[#|X|form|a|H|K|N|O|Q]' + \r
+               'address[S|p]' + \r
+               'center[#|X|form|a|H|K|N|O|Q]' + \r
+               'noframes[#|X|form|a|H|K|N|O|Q]' + \r
+               'isindex[]' + \r
+               'fieldset[#|legend|X|form|a|H|K|N|O|Q]' + \r
+               'legend[S]' + \r
+               'table[caption|col|colgroup|thead|tfoot|tbody|tr]' + \r
+               'caption[S]' + \r
+               'col[]' + \r
+               'colgroup[col]' + \r
+               'thead[tr]' + \r
+               'tr[th|td]' + \r
+               'th[#|X|form|a|H|K|N|O|Q]' + \r
+               'form[#|X|a|H|K|N|O|Q]' + \r
+               'noscript[#|X|form|a|H|K|N|O|Q]' + \r
+               'td[#|X|form|a|H|K|N|O|Q]' + \r
+               'tfoot[tr]' + \r
+               'tbody[tr]' + \r
+               'area[]' + \r
+               'base[]' + \r
+               'body[#|X|form|a|H|K|N|O|Q]'\r
+       );\r
+\r
+       tinymce.dom.Schema = function() {\r
+               var t = this, elements = transitional;\r
+\r
+               t.isValid = function(name, child_name) {\r
+                       var element = elements[name];\r
+\r
+                       return !!(element && (!child_name || element[child_name]));\r
+               };\r
+       };\r
+})();\r
+(function(tinymce) {\r
+       tinymce.dom.RangeUtils = function(dom) {\r
+               var INVISIBLE_CHAR = '\uFEFF';\r
+\r
+               this.walk = function(rng, callback) {\r
+                       var startContainer = rng.startContainer,\r
+                               startOffset = rng.startOffset,\r
+                               endContainer = rng.endContainer,\r
+                               endOffset = rng.endOffset,\r
+                               ancestor, startPoint,\r
+                               endPoint, node, parent, siblings, nodes;\r
+\r
+                       // Handle table cell selection the table plugin enables\r
+                       // you to fake select table cells and perform formatting actions on them\r
+                       nodes = dom.select('td.mceSelected,th.mceSelected');\r
+                       if (nodes.length > 0) {\r
+                               tinymce.each(nodes, function(node) {\r
+                                       callback([node]);\r
+                               });\r
 \r
-                                       document.write('<script type="text/javascript" src="' + tinymce._addVer(u) + '"' + ol + '></script>');\r
+                               return;\r
+                       }\r
 \r
-                                       if (!o.func)\r
-                                               done(o);\r
-                               } else\r
-                                       load(o);\r
-                       });\r
+                       function collectSiblings(node, name, end_node) {\r
+                               var siblings = [];\r
 \r
-                       allDone();\r
-               },\r
+                               for (; node && node != end_node; node = node[name])\r
+                                       siblings.push(node);\r
 \r
-               // Static methods\r
-               'static' : {\r
-                       _addOnLoad : function(f) {\r
-                               var t = this;\r
+                               return siblings;\r
+                       };\r
 \r
-                               t._funcs = t._funcs || [];\r
-                               t._funcs.push(f);\r
+                       function findEndPoint(node, root) {\r
+                               do {\r
+                                       if (node.parentNode == root)\r
+                                               return node;\r
 \r
-                               return t._funcs.length - 1;\r
-                       },\r
+                                       node = node.parentNode;\r
+                               } while(node);\r
+                       };\r
 \r
-                       _onLoad : function(e, u, ix) {\r
-                               if (!tinymce.isIE || e.readyState == 'complete')\r
-                                       this._funcs[ix].call(this);\r
-                       },\r
+                       function walkBoundary(start_node, end_node, next) {\r
+                               var siblingName = next ? 'nextSibling' : 'previousSibling';\r
 \r
-                       loadScript : function(u, cb) {\r
-                               var id = tinymce.DOM.uniqueId(), e;\r
+                               for (node = start_node, parent = node.parentNode; node && node != end_node; node = parent) {\r
+                                       parent = node.parentNode;\r
+                                       siblings = collectSiblings(node == start_node ? node : node[siblingName], siblingName);\r
 \r
-                               function done() {\r
-                                       Event.clear(id);\r
-                                       tinymce.DOM.remove(id);\r
+                                       if (siblings.length) {\r
+                                               if (!next)\r
+                                                       siblings.reverse();\r
 \r
-                                       if (cb) {\r
-                                               cb.call(document, u);\r
-                                               cb = 0;\r
+                                               callback(siblings);\r
                                        }\r
-                               };\r
+                               }\r
+                       };\r
 \r
-                               if (tinymce.isIE) {\r
-/*                                     Event.add(e, 'readystatechange', function(e) {\r
-                                               if (e.target && e.target.readyState == 'complete')\r
-                                                       done();\r
-                                       });*/\r
+                       // If index based start position then resolve it\r
+                       if (startContainer.nodeType == 1 && startContainer.hasChildNodes())\r
+                               startContainer = startContainer.childNodes[startOffset];\r
 \r
-                                       tinymce.util.XHR.send({\r
-                                               url : tinymce._addVer(u),\r
-                                               async : false,\r
-                                               success : function(co) {\r
-                                                       window.execScript(co);\r
-                                                       done();\r
-                                               }\r
-                                       });\r
-                               } else {\r
-                                       e = tinymce.DOM.create('script', {id : id, type : 'text/javascript', src : tinymce._addVer(u)});\r
-                                       Event.add(e, 'load', done);\r
+                       // If index based end position then resolve it\r
+                       if (endContainer.nodeType == 1 && endContainer.hasChildNodes())\r
+                               endContainer = endContainer.childNodes[Math.min(startOffset == endOffset ? endOffset : endOffset - 1, endContainer.childNodes.length - 1)];\r
 \r
-                                       // Check for head or body\r
-                                       (document.getElementsByTagName('head')[0] || document.body).appendChild(e);\r
-                               }\r
+                       // Find common ancestor and end points\r
+                       ancestor = dom.findCommonAncestor(startContainer, endContainer);\r
+\r
+                       // Same container\r
+                       if (startContainer == endContainer)\r
+                               return callback([startContainer]);\r
+\r
+                       // Process left side\r
+                       for (node = startContainer; node; node = node.parentNode) {\r
+                               if (node == endContainer)\r
+                                       return walkBoundary(startContainer, ancestor, true);\r
+\r
+                               if (node == ancestor)\r
+                                       break;\r
                        }\r
-               }\r
 \r
-               });\r
+                       // Process right side\r
+                       for (node = endContainer; node; node = node.parentNode) {\r
+                               if (node == startContainer)\r
+                                       return walkBoundary(endContainer, ancestor);\r
 \r
-       // Global script loader\r
-       tinymce.ScriptLoader = new tinymce.dom.ScriptLoader();\r
-})(tinymce);\r
-(function(tinymce) {\r
-       // Shorten class names\r
-       var DOM = tinymce.DOM, is = tinymce.is;\r
+                               if (node == ancestor)\r
+                                       break;\r
+                       }\r
 \r
-       tinymce.create('tinymce.ui.Control', {\r
-               Control : function(id, s) {\r
-                       this.id = id;\r
-                       this.settings = s = s || {};\r
-                       this.rendered = false;\r
-                       this.onRender = new tinymce.util.Dispatcher(this);\r
-                       this.classPrefix = '';\r
-                       this.scope = s.scope || this;\r
-                       this.disabled = 0;\r
-                       this.active = 0;\r
-               },\r
+                       // Find start/end point\r
+                       startPoint = findEndPoint(startContainer, ancestor) || startContainer;\r
+                       endPoint = findEndPoint(endContainer, ancestor) || endContainer;\r
 \r
-               setDisabled : function(s) {\r
-                       var e;\r
+                       // Walk left leaf\r
+                       walkBoundary(startContainer, startPoint, true);\r
 \r
-                       if (s != this.disabled) {\r
-                               e = DOM.get(this.id);\r
+                       // Walk the middle from start to end point\r
+                       siblings = collectSiblings(\r
+                               startPoint == startContainer ? startPoint : startPoint.nextSibling,\r
+                               'nextSibling',\r
+                               endPoint == endContainer ? endPoint.nextSibling : endPoint\r
+                       );\r
+\r
+                       if (siblings.length)\r
+                               callback(siblings);\r
+\r
+                       // Walk right leaf\r
+                       walkBoundary(endContainer, endPoint);\r
+               };\r
+\r
+               /*              this.split = function(rng) {\r
+                       var startContainer = rng.startContainer,\r
+                               startOffset = rng.startOffset,\r
+                               endContainer = rng.endContainer,\r
+                               endOffset = rng.endOffset;\r
+\r
+                       function splitText(node, offset) {\r
+                               if (offset == node.nodeValue.length)\r
+                                       node.appendData(INVISIBLE_CHAR);\r
+\r
+                               node = node.splitText(offset);\r
+\r
+                               if (node.nodeValue === INVISIBLE_CHAR)\r
+                                       node.nodeValue = '';\r
+\r
+                               return node;\r
+                       };\r
+\r
+                       // Handle single text node\r
+                       if (startContainer == endContainer) {\r
+                               if (startContainer.nodeType == 3) {\r
+                                       if (startOffset != 0)\r
+                                               startContainer = endContainer = splitText(startContainer, startOffset);\r
+\r
+                                       if (endOffset - startOffset != startContainer.nodeValue.length)\r
+                                               splitText(startContainer, endOffset - startOffset);\r
+                               }\r
+                       } else {\r
+                               // Split startContainer text node if needed\r
+                               if (startContainer.nodeType == 3 && startOffset != 0) {\r
+                                       startContainer = splitText(startContainer, startOffset);\r
+                                       startOffset = 0;\r
+                               }\r
+\r
+                               // Split endContainer text node if needed\r
+                               if (endContainer.nodeType == 3 && endOffset != endContainer.nodeValue.length) {\r
+                                       endContainer = splitText(endContainer, endOffset).previousSibling;\r
+                                       endOffset = endContainer.nodeValue.length;\r
+                               }\r
+                       }\r
+\r
+                       return {\r
+                               startContainer : startContainer,\r
+                               startOffset : startOffset,\r
+                               endContainer : endContainer,\r
+                               endOffset : endOffset\r
+                       };\r
+               };\r
+*/\r
+       };\r
+\r
+       tinymce.dom.RangeUtils.compareRanges = function(rng1, rng2) {\r
+               if (rng1 && rng2) {\r
+                       // Compare native IE ranges\r
+                       if (rng1.item || rng1.duplicate) {\r
+                               // Both are control ranges and the selected element matches\r
+                               if (rng1.item && rng2.item && rng1.item(0) === rng2.item(0))\r
+                                       return true;\r
+\r
+                               // Both are text ranges and the range matches\r
+                               if (rng1.isEqual && rng2.isEqual && rng2.isEqual(rng1))\r
+                                       return true;\r
+                       } else {\r
+                               // Compare w3c ranges\r
+                               return rng1.startContainer == rng2.startContainer && rng1.startOffset == rng2.startOffset;\r
+                       }\r
+               }\r
+\r
+               return false;\r
+       };\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       // Shorten class names\r
+       var DOM = tinymce.DOM, is = tinymce.is;\r
+\r
+       tinymce.create('tinymce.ui.Control', {\r
+               Control : function(id, s) {\r
+                       this.id = id;\r
+                       this.settings = s = s || {};\r
+                       this.rendered = false;\r
+                       this.onRender = new tinymce.util.Dispatcher(this);\r
+                       this.classPrefix = '';\r
+                       this.scope = s.scope || this;\r
+                       this.disabled = 0;\r
+                       this.active = 0;\r
+               },\r
+\r
+               setDisabled : function(s) {\r
+                       var e;\r
+\r
+                       if (s != this.disabled) {\r
+                               e = DOM.get(this.id);\r
 \r
                                // Add accessibility title for unavailable actions\r
                                if (e && this.settings.unavailable_prefix) {\r
@@ -6756,12 +7486,14 @@ window.tinymce.dom.Sizzle = Sizzle;
                destroy : function() {\r
                        tinymce.dom.Event.clear(this.id);\r
                }\r
-\r
-               });\r
-})(tinymce);tinymce.create('tinymce.ui.Container:tinymce.ui.Control', {\r
+       });\r
+})(tinymce);\r
+tinymce.create('tinymce.ui.Container:tinymce.ui.Control', {\r
        Container : function(id, s) {\r
                this.parent(id, s);\r
+\r
                this.controls = [];\r
+\r
                this.lookup = {};\r
        },\r
 \r
@@ -6775,8 +7507,8 @@ window.tinymce.dom.Sizzle = Sizzle;
        get : function(n) {\r
                return this.lookup[n];\r
        }\r
+});\r
 \r
-       });\r
 \r
 tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {\r
        Separator : function(id, s) {\r
@@ -6787,8 +7519,8 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
        renderHTML : function() {\r
                return tinymce.DOM.createHTML('span', {'class' : this.classPrefix});\r
        }\r
+});\r
 \r
-       });\r
 (function(tinymce) {\r
        var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk;\r
 \r
@@ -6816,9 +7548,9 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                        if (is(t.selected))\r
                                t.setSelected(t.selected);\r
                }\r
-\r
-               });\r
+       });\r
 })(tinymce);\r
+\r
 (function(tinymce) {\r
        var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk;\r
 \r
@@ -6915,9 +7647,9 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
 \r
                        return m;\r
                }\r
-\r
-               });\r
-})(tinymce);(function(tinymce) {\r
+       });\r
+})(tinymce);\r
+(function(tinymce) {\r
        var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event, Element = tinymce.dom.Element;\r
 \r
        tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu', {\r
@@ -7243,9 +7975,9 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
 \r
                        DOM.addClass(ro, 'mceLast');\r
                }\r
-\r
-               });\r
-})(tinymce);(function(tinymce) {\r
+       });\r
+})(tinymce);\r
+(function(tinymce) {\r
        var DOM = tinymce.DOM;\r
 \r
        tinymce.create('tinymce.ui.Button:tinymce.ui.Control', {\r
@@ -7276,9 +8008,9 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                                        return s.onclick.call(s.scope, e);\r
                        });\r
                }\r
-\r
-               });\r
+       });\r
 })(tinymce);\r
+\r
 (function(tinymce) {\r
        var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher;\r
 \r
@@ -7287,11 +8019,17 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                        var t = this;\r
 \r
                        t.parent(id, s);\r
+\r
                        t.items = [];\r
+\r
                        t.onChange = new Dispatcher(t);\r
+\r
                        t.onPostRender = new Dispatcher(t);\r
+\r
                        t.onAdd = new Dispatcher(t);\r
+\r
                        t.onRenderMenu = new tinymce.util.Dispatcher(this);\r
+\r
                        t.classPrefix = 'mceListBox';\r
                },\r
 \r
@@ -7420,16 +8158,16 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                hideMenu : function(e) {\r
                        var t = this;\r
 \r
-                       // Prevent double toogles by canceling the mouse click event to the button\r
-                       if (e && e.type == "mousedown" && (e.target.id == t.id + '_text' || e.target.id == t.id + '_open'))\r
-                               return;\r
-\r
-                       if (!e || !DOM.getParent(e.target, '.mceMenu')) {\r
-                               DOM.removeClass(t.id, t.classPrefix + 'Selected');\r
-                               Event.remove(DOM.doc, 'mousedown', t.hideMenu, t);\r
+                       if (t.menu && t.menu.isMenuVisible) {\r
+                               // Prevent double toogles by canceling the mouse click event to the button\r
+                               if (e && e.type == "mousedown" && (e.target.id == t.id + '_text' || e.target.id == t.id + '_open'))\r
+                                       return;\r
 \r
-                               if (t.menu)\r
+                               if (!e || !DOM.getParent(e.target, '.mceMenu')) {\r
+                                       DOM.removeClass(t.id, t.classPrefix + 'Selected');\r
+                                       Event.remove(DOM.doc, 'mousedown', t.hideMenu, t);\r
                                        t.menu.hideMenu();\r
+                               }\r
                        }\r
                },\r
 \r
@@ -7455,13 +8193,25 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                        });\r
 \r
                        each(t.items, function(o) {\r
-                               o.id = DOM.uniqueId();\r
-                               o.onclick = function() {\r
-                                       if (t.settings.onselect(o.value) !== false)\r
-                                               t.select(o.value); // Must be runned after\r
-                               };\r
+                               // No value then treat it as a title\r
+                               if (o.value === undefined) {\r
+                                       m.add({\r
+                                               title : o.title,\r
+                                               'class' : 'mceMenuItemTitle',\r
+                                               onclick : function() {\r
+                                                       if (t.settings.onselect('') !== false)\r
+                                                               t.select(''); // Must be runned after\r
+                                               }\r
+                                       });\r
+                               } else {\r
+                                       o.id = DOM.uniqueId();\r
+                                       o.onclick = function() {\r
+                                               if (t.settings.onselect(o.value) !== false)\r
+                                                       t.select(o.value); // Must be runned after\r
+                                       };\r
 \r
-                               m.add(o);\r
+                                       m.add(o);\r
+                               }\r
                        });\r
 \r
                        t.onRenderMenu.dispatch(t, m);\r
@@ -7472,7 +8222,7 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                        var t = this, cp = t.classPrefix;\r
 \r
                        Event.add(t.id, 'click', t.showMenu, t);\r
-                       Event.add(t.id + '_text', 'focus', function(e) {\r
+                       Event.add(t.id + '_text', 'focus', function() {\r
                                if (!t._focused) {\r
                                        t.keyDownHandler = Event.add(t.id + '_text', 'keydown', function(e) {\r
                                                var idx = -1, v, kc = e.keyCode;\r
@@ -7527,10 +8277,11 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                        this.parent();\r
 \r
                        Event.clear(this.id + '_text');\r
+                       Event.clear(this.id + '_open');\r
                }\r
-\r
-               });\r
-})(tinymce);(function(tinymce) {\r
+       });\r
+})(tinymce);\r
+(function(tinymce) {\r
        var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher;\r
 \r
        tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox', {\r
@@ -7603,7 +8354,7 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                },\r
 \r
                getLength : function() {\r
-                       return DOM.get(this.id).options.length - 1;\r
+                       return this.items.length;\r
                },\r
 \r
                renderHTML : function() {\r
@@ -7657,15 +8408,17 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
 \r
                        t.onPostRender.dispatch(t, DOM.get(t.id));\r
                }\r
-\r
-               });\r
-})(tinymce);(function(tinymce) {\r
+       });\r
+})(tinymce);\r
+(function(tinymce) {\r
        var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each;\r
 \r
        tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button', {\r
                MenuButton : function(id, s) {\r
                        this.parent(id, s);\r
+\r
                        this.onRenderMenu = new tinymce.util.Dispatcher(this);\r
+\r
                        s.menu_container = s.menu_container || DOM.doc.body;\r
                },\r
 \r
@@ -7744,9 +8497,9 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                                }\r
                        });\r
                }\r
-\r
-               });\r
+       });\r
 })(tinymce);\r
+\r
 (function(tinymce) {\r
        var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each;\r
 \r
@@ -7810,9 +8563,9 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                        Event.clear(this.id + '_action');\r
                        Event.clear(this.id + '_open');\r
                }\r
-\r
-               });\r
+       });\r
 })(tinymce);\r
+\r
 (function(tinymce) {\r
        var DOM = tinymce.DOM, Event = tinymce.dom.Event, is = tinymce.is, each = tinymce.each;\r
 \r
@@ -7829,6 +8582,7 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                        }, t.settings);\r
 \r
                        t.onShowMenu = new tinymce.util.Dispatcher(t);\r
+\r
                        t.onHideMenu = new tinymce.util.Dispatcher(t);\r
 \r
                        t.value = s.default_color;\r
@@ -7860,6 +8614,7 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                        e = 0;\r
 \r
                        Event.add(DOM.doc, 'mousedown', t.hideMenu, t);\r
+                       t.onShowMenu.dispatch(t);\r
 \r
                        if (t._focused) {\r
                                t._keyHandler = Event.add(t.id + '_menu', 'keydown', function(e) {\r
@@ -7870,8 +8625,6 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                                DOM.select('a', t.id + '_menu')[0].focus(); // Select first link\r
                        }\r
 \r
-                       t.onShowMenu.dispatch(t);\r
-\r
                        t.isMenuVisible = 1;\r
                },\r
 \r
@@ -7921,7 +8674,7 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                                        style : {\r
                                                backgroundColor : '#' + c\r
                                        },\r
-                                       mce_color : '#' + c\r
+                                       _mce_color : '#' + c\r
                                });\r
                        });\r
 \r
@@ -7943,7 +8696,7 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
 \r
                                e = e.target;\r
 \r
-                               if (e.nodeName == 'A' && (c = e.getAttribute('mce_color')))\r
+                               if (e.nodeName == 'A' && (c = e.getAttribute('_mce_color')))\r
                                        t.setColor(c);\r
 \r
                                return Event.cancel(e); // Prevent IE auto save warning\r
@@ -7977,9 +8730,9 @@ tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
                        Event.clear(this.id + '_more');\r
                        DOM.remove(this.id + '_menu');\r
                }\r
-\r
-               });\r
+       });\r
 })(tinymce);\r
+\r
 tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {\r
        renderHTML : function() {\r
                var t = this, h = '', c, co, dom = tinymce.DOM, s = t.settings, i, pr, nx, cl;\r
@@ -8041,8 +8794,8 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
 \r
                return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || ''}, '<tbody><tr>' + h + '</tr></tbody>');\r
        }\r
+});\r
 \r
-       });\r
 (function(tinymce) {\r
        var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each;\r
 \r
@@ -8050,6 +8803,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
                items : [],\r
                urls : {},\r
                lookup : {},\r
+\r
                onAdd : new Dispatcher(this),\r
 \r
                get : function(n) {\r
@@ -8057,16 +8811,10 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
                },\r
 \r
                requireLangPack : function(n) {\r
-                       var u, s = tinymce.EditorManager.settings;\r
-\r
-                       if (s && s.language) {\r
-                               u = this.urls[n] + '/langs/' + s.language + '.js';\r
+                       var s = tinymce.settings;\r
 \r
-                               if (!tinymce.dom.Event.domLoaded && !s.strict_mode)\r
-                                       tinymce.ScriptLoader.load(u);\r
-                               else\r
-                                       tinymce.ScriptLoader.add(u);\r
-                       }\r
+                       if (s && s.language)\r
+                               tinymce.ScriptLoader.add(this.urls[n] + '/langs/' + s.language + '.js');\r
                },\r
 \r
                add : function(id, o) {\r
@@ -8089,49 +8837,53 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
                        t.urls[n] = u.substring(0, u.lastIndexOf('/'));\r
                        tinymce.ScriptLoader.add(u, cb, s);\r
                }\r
-\r
-               });\r
+       });\r
 \r
        // Create plugin and theme managers\r
        tinymce.PluginManager = new tinymce.AddOnManager();\r
        tinymce.ThemeManager = new tinymce.AddOnManager();\r
-}(tinymce));(function(tinymce) {\r
+}(tinymce));\r
+\r
+(function(tinymce) {\r
        // Shorten names\r
-       var each = tinymce.each, extend = tinymce.extend, DOM = tinymce.DOM, Event = tinymce.dom.Event, ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, explode = tinymce.explode;\r
+       var each = tinymce.each, extend = tinymce.extend,\r
+               DOM = tinymce.DOM, Event = tinymce.dom.Event,\r
+               ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager,\r
+               explode = tinymce.explode,\r
+               Dispatcher = tinymce.util.Dispatcher, undefined, instanceCounter = 0;\r
 \r
-       tinymce.create('static tinymce.EditorManager', {\r
-               editors : {},\r
-               i18n : {},\r
-               activeEditor : null,\r
+       // Setup some URLs where the editor API is located and where the document is\r
+       tinymce.documentBaseURL = window.location.href.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');\r
+       if (!/[\/\\]$/.test(tinymce.documentBaseURL))\r
+               tinymce.documentBaseURL += '/';\r
 \r
-               preInit : function() {\r
-                       var t = this, lo = window.location;\r
+       tinymce.baseURL = new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL);\r
 \r
-                       // Setup some URLs where the editor API is located and where the document is\r
-                       tinymce.documentBaseURL = lo.href.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');\r
-                       if (!/[\/\\]$/.test(tinymce.documentBaseURL))\r
-                               tinymce.documentBaseURL += '/';\r
+       tinymce.baseURI = new tinymce.util.URI(tinymce.baseURL);\r
 \r
-                       tinymce.baseURL = new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL);\r
-                       tinymce.EditorManager.baseURI = new tinymce.util.URI(tinymce.baseURL);\r
+       // Add before unload listener\r
+       // This was required since IE was leaking memory if you added and removed beforeunload listeners\r
+       // with attachEvent/detatchEvent so this only adds one listener and instances can the attach to the onBeforeUnload event\r
+       tinymce.onBeforeUnload = new Dispatcher(tinymce);\r
 \r
-                       // User specified a document.domain value\r
-                       if (document.domain && lo.hostname != document.domain)\r
-                               tinymce.relaxedDomain = document.domain;\r
+       // Must be on window or IE will leak if the editor is placed in frame or iframe\r
+       Event.add(window, 'beforeunload', function(e) {\r
+               tinymce.onBeforeUnload.dispatch(tinymce, e);\r
+       });\r
 \r
-                       // Add before unload listener\r
-                       // This was required since IE was leaking memory if you added and removed beforeunload listeners\r
-                       // with attachEvent/detatchEvent so this only adds one listener and instances can the attach to the onBeforeUnload event\r
-                       t.onBeforeUnload = new tinymce.util.Dispatcher(t);\r
+       tinymce.onAddEditor = new Dispatcher(tinymce);\r
 \r
-                       // Must be on window or IE will leak if the editor is placed in frame or iframe\r
-                       Event.add(window, 'beforeunload', function(e) {\r
-                               t.onBeforeUnload.dispatch(t, e);\r
-                       });\r
-               },\r
+       tinymce.onRemoveEditor = new Dispatcher(tinymce);\r
+\r
+       tinymce.EditorManager = extend(tinymce, {\r
+               editors : [],\r
+\r
+               i18n : {},\r
+\r
+               activeEditor : null,\r
 \r
                init : function(s) {\r
-                       var t = this, pl, sl = tinymce.ScriptLoader, c, e, el = [], ed;\r
+                       var t = this, pl, sl = tinymce.ScriptLoader, e, el = [], ed;\r
 \r
                        function execCallback(se, n, s) {\r
                                var f = se[n];\r
@@ -8150,87 +8902,17 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
 \r
                        s = extend({\r
                                theme : "simple",\r
-                               language : "en",\r
-                               strict_loading_mode : document.contentType == 'application/xhtml+xml'\r
+                               language : "en"\r
                        }, s);\r
 \r
                        t.settings = s;\r
 \r
-                       // If page not loaded and strict mode isn't enabled then load them\r
-                       if (!Event.domLoaded && !s.strict_loading_mode) {\r
-                               // Load language\r
-                               if (s.language)\r
-                                       sl.add(tinymce.baseURL + '/langs/' + s.language + '.js');\r
-\r
-                               // Load theme\r
-                               if (s.theme && s.theme.charAt(0) != '-' && !ThemeManager.urls[s.theme])\r
-                                       ThemeManager.load(s.theme, 'themes/' + s.theme + '/editor_template' + tinymce.suffix + '.js');\r
-\r
-                               // Load plugins\r
-                               if (s.plugins) {\r
-                                       pl = explode(s.plugins);\r
-\r
-                                       // Load compat2x first\r
-                                       if (tinymce.inArray(pl, 'compat2x') != -1)\r
-                                               PluginManager.load('compat2x', 'plugins/compat2x/editor_plugin' + tinymce.suffix + '.js');\r
-\r
-                                       // Load rest if plugins\r
-                                       each(pl, function(v) {\r
-                                               if (v && v.charAt(0) != '-' && !PluginManager.urls[v]) {\r
-                                                       // Skip safari plugin for other browsers\r
-                                                       if (!tinymce.isWebKit && v == 'safari')\r
-                                                               return;\r
-\r
-                                                       PluginManager.load(v, 'plugins/' + v + '/editor_plugin' + tinymce.suffix + '.js');\r
-                                               }\r
-                                       });\r
-                               }\r
-\r
-                               sl.loadQueue();\r
-                       }\r
-\r
                        // Legacy call\r
                        Event.add(document, 'init', function() {\r
                                var l, co;\r
 \r
                                execCallback(s, 'onpageload');\r
 \r
-                               // Verify that it's a valid browser\r
-                               if (s.browsers) {\r
-                                       l = false;\r
-\r
-                                       each(explode(s.browsers), function(v) {\r
-                                               switch (v) {\r
-                                                       case 'ie':\r
-                                                       case 'msie':\r
-                                                               if (tinymce.isIE)\r
-                                                                       l = true;\r
-                                                               break;\r
-\r
-                                                       case 'gecko':\r
-                                                               if (tinymce.isGecko)\r
-                                                                       l = true;\r
-                                                               break;\r
-\r
-                                                       case 'safari':\r
-                                                       case 'webkit':\r
-                                                               if (tinymce.isWebKit)\r
-                                                                       l = true;\r
-                                                               break;\r
-\r
-                                                       case 'opera':\r
-                                                               if (tinymce.isOpera)\r
-                                                                       l = true;\r
-\r
-                                                               break;\r
-                                               }\r
-                                       });\r
-\r
-                                       // Not a valid one\r
-                                       if (!l)\r
-                                               return;\r
-                               }\r
-\r
                                switch (s.mode) {\r
                                        case "exact":\r
                                                l = s.elements || '';\r
@@ -8242,12 +8924,10 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
                                                                        el.push(ed);\r
                                                                        ed.render(1);\r
                                                                } else {\r
-                                                                       c = 0;\r
-\r
                                                                        each(document.forms, function(f) {\r
                                                                                each(f.elements, function(e) {\r
                                                                                        if (e.name === v) {\r
-                                                                                               v = 'mce_editor_' + c;\r
+                                                                                               v = 'mce_editor_' + instanceCounter++;\r
                                                                                                DOM.setAttrib(e, 'id', v);\r
 \r
                                                                                                ed = new tinymce.Editor(v, s);\r
@@ -8293,7 +8973,7 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
                                if (s.oninit) {\r
                                        l = co = 0;\r
 \r
-                                       each (el, function(ed) {\r
+                                       each(el, function(ed) {\r
                                                co++;\r
 \r
                                                if (!ed.initialized) {\r
@@ -8317,6 +8997,9 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
                },\r
 \r
                get : function(id) {\r
+                       if (id === undefined)\r
+                               return this.editors;\r
+\r
                        return this.editors[id];\r
                },\r
 \r
@@ -8324,33 +9007,44 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
                        return this.get(id);\r
                },\r
 \r
-               add : function(e) {\r
-                       this.editors[e.id] = e;\r
-                       this._setActive(e);\r
+               add : function(editor) {\r
+                       var self = this, editors = self.editors;\r
 \r
-                       return e;\r
+                       // Add named and index editor instance\r
+                       editors[editor.id] = editor;\r
+                       editors.push(editor);\r
+\r
+                       self._setActive(editor);\r
+                       self.onAddEditor.dispatch(self, editor);\r
+\r
+\r
+                       return editor;\r
                },\r
 \r
-               remove : function(e) {\r
-                       var t = this;\r
+               remove : function(editor) {\r
+                       var t = this, i, editors = t.editors;\r
 \r
                        // Not in the collection\r
-                       if (!t.editors[e.id])\r
+                       if (!editors[editor.id])\r
                                return null;\r
 \r
-                       delete t.editors[e.id];\r
+                       delete editors[editor.id];\r
 \r
-                       // Select another editor since the active one was removed\r
-                       if (t.activeEditor == e) {\r
-                               each(t.editors, function(e) {\r
-                                       t._setActive(e);\r
-                                       return false; // Break\r
-                               });\r
+                       for (i = 0; i < editors.length; i++) {\r
+                               if (editors[i] == editor) {\r
+                                       editors.splice(i, 1);\r
+                                       break;\r
+                               }\r
                        }\r
 \r
-                       e.destroy();\r
+                       // Select another editor since the active one was removed\r
+                       if (t.activeEditor == editor)\r
+                               t._setActive(editors[0]);\r
+\r
+                       editor.destroy();\r
+                       t.onRemoveEditor.dispatch(t, editor);\r
 \r
-                       return e;\r
+                       return editor;\r
                },\r
 \r
                execCommand : function(c, u, v) {\r
@@ -8463,75 +9157,109 @@ tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
 \r
                // Private methods\r
 \r
-               _setActive : function(e) {\r
-                       this.selectedInstance = this.activeEditor = e;\r
+               _setActive : function(editor) {\r
+                       this.selectedInstance = this.activeEditor = editor;\r
                }\r
-\r
-               });\r
-\r
-       tinymce.EditorManager.preInit();\r
+       });\r
 })(tinymce);\r
 \r
-// Short for editor manager window.tinyMCE is needed when TinyMCE gets loaded though a XHR call\r
-var tinyMCE = window.tinyMCE = tinymce.EditorManager;\r
 (function(tinymce) {\r
-       var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, Dispatcher = tinymce.util.Dispatcher;\r
-       var each = tinymce.each, isGecko = tinymce.isGecko, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit;\r
-       var is = tinymce.is, ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, EditorManager = tinymce.EditorManager;\r
-       var inArray = tinymce.inArray, grep = tinymce.grep, explode = tinymce.explode;\r
+       // Shorten these names\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend,\r
+               Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isGecko = tinymce.isGecko,\r
+               isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, is = tinymce.is,\r
+               ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager,\r
+               inArray = tinymce.inArray, grep = tinymce.grep, explode = tinymce.explode;\r
 \r
        tinymce.create('tinymce.Editor', {\r
                Editor : function(id, s) {\r
                        var t = this;\r
 \r
                        t.id = t.editorId = id;\r
+\r
                        t.execCommands = {};\r
                        t.queryStateCommands = {};\r
                        t.queryValueCommands = {};\r
+\r
+                       t.isNotDirty = false;\r
+\r
                        t.plugins = {};\r
 \r
                        // Add events to the editor\r
                        each([\r
                                'onPreInit',\r
+\r
                                'onBeforeRenderUI',\r
+\r
                                'onPostRender',\r
+\r
                                'onInit',\r
+\r
                                'onRemove',\r
+\r
                                'onActivate',\r
+\r
                                'onDeactivate',\r
+\r
                                'onClick',\r
+\r
                                'onEvent',\r
+\r
                                'onMouseUp',\r
+\r
                                'onMouseDown',\r
+\r
                                'onDblClick',\r
+\r
                                'onKeyDown',\r
+\r
                                'onKeyUp',\r
+\r
                                'onKeyPress',\r
+\r
                                'onContextMenu',\r
+\r
                                'onSubmit',\r
+\r
                                'onReset',\r
+\r
                                'onPaste',\r
+\r
                                'onPreProcess',\r
+\r
                                'onPostProcess',\r
+\r
                                'onBeforeSetContent',\r
+\r
                                'onBeforeGetContent',\r
+\r
                                'onSetContent',\r
+\r
                                'onGetContent',\r
+\r
                                'onLoadContent',\r
+\r
                                'onSaveContent',\r
+\r
                                'onNodeChange',\r
+\r
                                'onChange',\r
+\r
                                'onBeforeExecCommand',\r
+\r
                                'onExecCommand',\r
+\r
                                'onUndo',\r
+\r
                                'onRedo',\r
+\r
                                'onVisualAid',\r
+\r
                                'onSetProgressState'\r
                        ], function(e) {\r
                                t[e] = new Dispatcher(t);\r
                        });\r
 \r
-                       // Default editor config\r
                        t.settings = s = extend({\r
                                id : id,\r
                                language : 'en',\r
@@ -8557,16 +9285,14 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                custom_undo_redo_keyboard_shortcuts : 1,\r
                                custom_undo_redo_restore_selection : 1,\r
                                custom_undo_redo : 1,\r
-                               doctype : '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',\r
+                               doctype : tinymce.isIE6 ? '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' : '<!DOCTYPE>', // Use old doctype on IE 6 to avoid horizontal scroll\r
                                visual_table_class : 'mceItemTable',\r
                                visual : 1,\r
-                               inline_styles : true,\r
-                               convert_fonts_to_spans : true,\r
                                font_size_style_values : 'xx-small,x-small,small,medium,large,x-large,xx-large',\r
                                apply_source_formatting : 1,\r
                                directionality : 'ltr',\r
                                forced_root_block : 'p',\r
-                               valid_elements : '@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p[align],-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote[cite],-table[border=0|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value|tabindex|accesskey],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big',\r
+                               valid_elements : '@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p,-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote[cite],-table[border|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value|tabindex|accesskey],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big',\r
                                hidden_input : 1,\r
                                padd_empty_editor : 1,\r
                                render_ui : 1,\r
@@ -8575,14 +9301,15 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                indentation : '30px',\r
                                keep_styles : 1,\r
                                fix_table_elements : 1,\r
-                               removeformat_selector : 'span,b,strong,em,i,font,u,strike'\r
+                               inline_styles : 1,\r
+                               convert_fonts_to_spans : true\r
                        }, s);\r
 \r
-                       // Setup URIs\r
                        t.documentBaseURI = new tinymce.util.URI(s.document_base_url || tinymce.documentBaseURL, {\r
                                base_uri : tinyMCE.baseURI\r
                        });\r
-                       t.baseURI = EditorManager.baseURI;\r
+\r
+                       t.baseURI = tinymce.baseURI;\r
 \r
                        // Call setup\r
                        t.execCallback('setup', t);\r
@@ -8599,20 +9326,17 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                return;\r
                        }\r
 \r
-                       // Force strict loading mode if render us called by user and not internally\r
-                       if (!nst) {\r
-                               s.strict_loading_mode = 1;\r
-                               tinyMCE.settings = s;\r
-                       }\r
+                       tinyMCE.settings = s;\r
 \r
                        // Element not found, then skip initialization\r
                        if (!t.getElement())\r
                                return;\r
 \r
-                       if (s.strict_loading_mode) {\r
-                               sl.settings.strict_mode = s.strict_loading_mode;\r
-                               tinymce.DOM.settings.strict = 1;\r
-                       }\r
+                       // Is a iPad/iPhone, then skip initialization. We need to sniff here since the\r
+                       // browser says it has contentEditable support but there is no visible caret\r
+                       // We will remove this check ones Apple implements full contentEditable support\r
+                       if (tinymce.isIDevice)\r
+                               return;\r
 \r
                        // Add hidden input for non input elements inside form elements\r
                        if (!/TEXTAREA|INPUT/i.test(t.getElement().nodeName) && s.hidden_input && DOM.getParent(id, 'form'))\r
@@ -8663,7 +9387,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                                n._mceOldSubmit = n.submit;\r
                                                n.submit = function() {\r
                                                        // Save all instances\r
-                                                       EditorManager.triggerSave();\r
+                                                       tinymce.triggerSave();\r
                                                        t.isNotDirty = 1;\r
 \r
                                                        return t.formElement._mceOldSubmit(t.formElement);\r
@@ -8684,8 +9408,8 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
 \r
                                each(explode(s.plugins), function(p) {\r
                                        if (p && p.charAt(0) != '-' && !PluginManager.urls[p]) {\r
-                                               // Skip safari plugin for other browsers\r
-                                               if (!isWebKit && p == 'safari')\r
+                                               // Skip safari plugin, since it is removed as of 3.3b1\r
+                                               if (p == 'safari')\r
                                                        return;\r
 \r
                                                PluginManager.load(p, 'plugins/' + p + '/editor_plugin' + tinymce.suffix + '.js');\r
@@ -8699,20 +9423,14 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                });\r
                        };\r
 \r
-                       // Load compat2x first\r
-                       if (s.plugins.indexOf('compat2x') != -1) {\r
-                               PluginManager.load('compat2x', 'plugins/compat2x/editor_plugin' + tinymce.suffix + '.js');\r
-                               sl.loadQueue(loadScripts);\r
-                       } else\r
-                               loadScripts();\r
+                       loadScripts();\r
                },\r
 \r
                init : function() {\r
                        var n, t = this, s = t.settings, w, h, e = t.getElement(), o, ti, u, bi, bc, re;\r
 \r
-                       EditorManager.add(t);\r
+                       tinymce.add(t);\r
 \r
-                       // Create theme\r
                        if (s.theme) {\r
                                s.theme = s.theme.replace(/-/, '');\r
                                o = ThemeManager.get(s.theme);\r
@@ -8747,25 +9465,17 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                        if (s.popup_css_add)\r
                                s.popup_css += ',' + t.documentBaseURI.toAbsolute(s.popup_css_add);\r
 \r
-                       // Setup control factory\r
                        t.controlManager = new tinymce.ControlManager(t);\r
-                       t.undoManager = new tinymce.UndoManager(t);\r
-\r
-                       // Pass through\r
-                       t.undoManager.onAdd.add(function(um, l) {\r
-                               if (!l.initial)\r
-                                       return t.onChange.dispatch(t, l, um);\r
-                       });\r
-\r
-                       t.undoManager.onUndo.add(function(um, l) {\r
-                               return t.onUndo.dispatch(t, l, um);\r
-                       });\r
-\r
-                       t.undoManager.onRedo.add(function(um, l) {\r
-                               return t.onRedo.dispatch(t, l, um);\r
-                       });\r
 \r
                        if (s.custom_undo_redo) {\r
+                               // Add initial undo level\r
+                               t.onBeforeExecCommand.add(function(ed, cmd, ui, val, a) {\r
+                                       if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo)) {\r
+                                               if (!t.undoManager.hasUndo())\r
+                                                       t.undoManager.add();\r
+                                       }\r
+                               });\r
+\r
                                t.onExecCommand.add(function(ed, cmd, ui, val, a) {\r
                                        if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo))\r
                                                t.undoManager.add();\r
@@ -8819,6 +9529,10 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                        }\r
 \r
 \r
+                       // User specified a document.domain value\r
+                       if (document.domain && location.hostname != document.domain)\r
+                               tinymce.relaxedDomain = document.domain;\r
+\r
                        // Resize editor\r
                        DOM.setStyles(o.sizeContainer || o.editorContainer, {\r
                                width : w,\r
@@ -8829,8 +9543,14 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                        if (h < 100)\r
                                h = 100;\r
 \r
-                       t.iframeHTML = s.doctype + '<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="' + t.documentBaseURI.getURI() + '" />';\r
-                       t.iframeHTML += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';\r
+                       t.iframeHTML = s.doctype + '<html><head xmlns="http://www.w3.org/1999/xhtml">';\r
+\r
+                       // We only need to override paths if we have to\r
+                       // IE has a bug where it remove site absolute urls to relative ones if this is specified\r
+                       if (s.document_base_url != tinymce.documentBaseURL)\r
+                               t.iframeHTML += '<base href="' + t.documentBaseURI.getURI() + '" />';\r
+\r
+                       t.iframeHTML += '<meta http-equiv="X-UA-Compatible" content="IE=7" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';\r
 \r
                        if (tinymce.relaxedDomain)\r
                                t.iframeHTML += '<script type="text/javascript">document.domain = "' + tinymce.relaxedDomain + '";</script>';\r
@@ -8912,40 +9632,115 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                DOM.show(b);\r
                        }\r
 \r
-                       // Setup objects\r
-                       t.dom = new tinymce.DOM.DOMUtils(t.getDoc(), {\r
+                       t.dom = new tinymce.dom.DOMUtils(t.getDoc(), {\r
                                keep_values : true,\r
                                url_converter : t.convertURL,\r
                                url_converter_scope : t,\r
                                hex_colors : s.force_hex_style_colors,\r
                                class_filter : s.class_filter,\r
                                update_styles : 1,\r
-                               fix_ie_paragraphs : 1\r
+                               fix_ie_paragraphs : 1,\r
+                               valid_styles : s.valid_styles\r
                        });\r
 \r
-                       t.serializer = new tinymce.dom.Serializer({\r
-                               entity_encoding : s.entity_encoding,\r
-                               entities : s.entities,\r
+                       t.schema = new tinymce.dom.Schema();\r
+\r
+                       t.serializer = new tinymce.dom.Serializer(extend(s, {\r
                                valid_elements : s.verify_html === false ? '*[*]' : s.valid_elements,\r
-                               extended_valid_elements : s.extended_valid_elements,\r
-                               valid_child_elements : s.valid_child_elements,\r
-                               invalid_elements : s.invalid_elements,\r
-                               fix_table_elements : s.fix_table_elements,\r
-                               fix_list_elements : s.fix_list_elements,\r
-                               fix_content_duplication : s.fix_content_duplication,\r
-                               convert_fonts_to_spans : s.convert_fonts_to_spans,\r
-                               font_size_classes  : s.font_size_classes,\r
-                               font_size_style_values : s.font_size_style_values,\r
-                               apply_source_formatting : s.apply_source_formatting,\r
-                               remove_linebreaks : s.remove_linebreaks,\r
-                               element_format : s.element_format,\r
-                               dom : t.dom\r
-                       });\r
+                               dom : t.dom,\r
+                               schema : t.schema\r
+                       }));\r
 \r
                        t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer);\r
+\r
+                       t.formatter = new tinymce.Formatter(this);\r
+\r
+                       // Register default formats\r
+                       t.formatter.register({\r
+                               alignleft : [\r
+                                       {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'left'}},\r
+                                       {selector : 'img,table', styles : {'float' : 'left'}}\r
+                               ],\r
+\r
+                               aligncenter : [\r
+                                       {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'center'}},\r
+                                       {selector : 'img', styles : {display : 'block', marginLeft : 'auto', marginRight : 'auto'}},\r
+                                       {selector : 'table', styles : {marginLeft : 'auto', marginRight : 'auto'}}\r
+                               ],\r
+\r
+                               alignright : [\r
+                                       {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'right'}},\r
+                                       {selector : 'img,table', styles : {'float' : 'right'}}\r
+                               ],\r
+\r
+                               alignfull : [\r
+                                       {selector : 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'justify'}}\r
+                               ],\r
+\r
+                               bold : [\r
+                                       {inline : 'strong'},\r
+                                       {inline : 'span', styles : {fontWeight : 'bold'}},\r
+                                       {inline : 'b'}\r
+                               ],\r
+\r
+                               italic : [\r
+                                       {inline : 'em'},\r
+                                       {inline : 'span', styles : {fontStyle : 'italic'}},\r
+                                       {inline : 'i'}\r
+                               ],\r
+\r
+                               underline : [\r
+                                       {inline : 'span', styles : {textDecoration : 'underline'}, exact : true},\r
+                                       {inline : 'u'}\r
+                               ],\r
+\r
+                               strikethrough : [\r
+                                       {inline : 'span', styles : {textDecoration : 'line-through'}, exact : true},\r
+                                       {inline : 'u'}\r
+                               ],\r
+\r
+                               forecolor : {inline : 'span', styles : {color : '%value'}},\r
+                               hilitecolor : {inline : 'span', styles : {backgroundColor : '%value'}},\r
+                               fontname : {inline : 'span', styles : {fontFamily : '%value'}},\r
+                               fontsize : {inline : 'span', styles : {fontSize : '%value'}},\r
+                               fontsize_class : {inline : 'span', attributes : {'class' : '%value'}},\r
+                               blockquote : {block : 'blockquote', wrapper : 1, remove : 'all'},\r
+\r
+                               removeformat : [\r
+                                       {selector : 'b,strong,em,i,font,u,strike', remove : 'all', split : true, expand : false, block_expand : true, deep : true},\r
+                                       {selector : 'span', attributes : ['style', 'class'], remove : 'empty', split : true, expand : false, deep : true},\r
+                                       {selector : '*', attributes : ['style', 'class'], split : false, expand : false, deep : true}\r
+                               ]\r
+                       });\r
+\r
+                       // Register default block formats\r
+                       each('p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp'.split(/\s/), function(name) {\r
+                               t.formatter.register(name, {block : name, remove : 'all'});\r
+                       });\r
+\r
+                       // Register user defined formats\r
+                       t.formatter.register(t.settings.formats);\r
+\r
+                       t.undoManager = new tinymce.UndoManager(t);\r
+\r
+                       // Pass through\r
+                       t.undoManager.onAdd.add(function(um, l) {\r
+                               if (!l.initial)\r
+                                       return t.onChange.dispatch(t, l, um);\r
+                       });\r
+\r
+                       t.undoManager.onUndo.add(function(um, l) {\r
+                               return t.onUndo.dispatch(t, l, um);\r
+                       });\r
+\r
+                       t.undoManager.onRedo.add(function(um, l) {\r
+                               return t.onRedo.dispatch(t, l, um);\r
+                       });\r
+\r
                        t.forceBlocks = new tinymce.ForceBlocks(t, {\r
                                forced_root_block : s.forced_root_block\r
                        });\r
+\r
                        t.editorCommands = new tinymce.EditorCommands(t);\r
 \r
                        // Pass through\r
@@ -8974,9 +9769,6 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                        if (s.nowrap)\r
                                t.getBody().style.whiteSpace = "nowrap";\r
 \r
-                       if (s.auto_resize)\r
-                               t.onNodeChange.add(t.resizeToContent, t);\r
-\r
                        if (s.custom_elements) {\r
                                function handleCustom(ed, o) {\r
                                        each(explode(s.custom_elements), function(v) {\r
@@ -8988,7 +9780,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                                } else\r
                                                        n = 'div';\r
 \r
-                                               o.content = o.content.replace(new RegExp('<(' + v + ')([^>]*)>', 'g'), '<' + n + ' mce_name="$1"$2>');\r
+                                               o.content = o.content.replace(new RegExp('<(' + v + ')([^>]*)>', 'g'), '<' + n + ' _mce_name="$1"$2>');\r
                                                o.content = o.content.replace(new RegExp('</(' + v + ')>', 'g'), '</' + n + '>');\r
                                        });\r
                                };\r
@@ -8996,7 +9788,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                t.onBeforeSetContent.add(handleCustom);\r
                                t.onPostProcess.add(function(ed, o) {\r
                                        if (o.set)\r
-                                               handleCustom(ed, o)\r
+                                               handleCustom(ed, o);\r
                                });\r
                        }\r
 \r
@@ -9071,12 +9863,6 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                };\r
                        }\r
 \r
-                       if (s.convert_fonts_to_spans)\r
-                               t._convertFonts();\r
-\r
-                       if (s.inline_styles)\r
-                               t._convertInlineElements();\r
-\r
                        if (s.cleanup_callback) {\r
                                t.onBeforeSetContent.add(function(ed, o) {\r
                                        o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o);\r
@@ -9133,7 +9919,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                                var pn = n.parentNode;\r
 \r
                                                if (ed.dom.isBlock(pn) && pn.lastChild === n)\r
-                                                       ed.dom.add(pn, 'br', {'mce_bogus' : 1});\r
+                                                       ed.dom.add(pn, 'br', {'_mce_bogus' : 1});\r
                                        });\r
                                };\r
 \r
@@ -9164,7 +9950,6 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
 \r
                                t.load({initial : true, format : (s.cleanup_on_startup ? 'html' : 'raw')});\r
                                t.startContent = t.getContent({format : 'raw'});\r
-                               t.undoManager.add({initial : true});\r
                                t.initialized = true;\r
 \r
                                t.onInit.dispatch(t);\r
@@ -9183,7 +9968,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                // Handle auto focus\r
                                if (s.auto_focus) {\r
                                        setTimeout(function () {\r
-                                               var ed = EditorManager.get(s.auto_focus);\r
+                                               var ed = tinymce.get(s.auto_focus);\r
 \r
                                                ed.selection.select(ed.getBody(), 1);\r
                                                ed.selection.collapse(1);\r
@@ -9197,25 +9982,38 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
 \r
 \r
                focus : function(sf) {\r
-                       var oed, t = this, ce = t.settings.content_editable;\r
+                       var oed, t = this, ce = t.settings.content_editable, ieRng, controlElm, doc = t.getDoc();\r
 \r
                        if (!sf) {\r
-                               // Is not content editable or the selection is outside the area in IE\r
-                               // the IE statement is needed to avoid bluring if element selections inside layers since\r
-                               // the layer is like it's own document in IE\r
-                               if (!ce && (!isIE || t.selection.getNode().ownerDocument != t.getDoc()))\r
+                               // Get selected control element\r
+                               ieRng = t.selection.getRng();\r
+                               if (ieRng.item) {\r
+                                       controlElm = ieRng.item(0);\r
+                               }\r
+\r
+                               // Is not content editable\r
+                               if (!ce)\r
                                        t.getWin().focus();\r
 \r
+                               // Restore selected control element\r
+                               // This is needed when for example an image is selected within a\r
+                               // layer a call to focus will then remove the control selection\r
+                               if (controlElm && controlElm.ownerDocument == doc) {\r
+                                       ieRng = doc.body.createControlRange();\r
+                                       ieRng.addElement(controlElm);\r
+                                       ieRng.select();\r
+                               }\r
+\r
                        }\r
 \r
-                       if (EditorManager.activeEditor != t) {\r
-                               if ((oed = EditorManager.activeEditor) != null)\r
+                       if (tinymce.activeEditor != t) {\r
+                               if ((oed = tinymce.activeEditor) != null)\r
                                        oed.onDeactivate.dispatch(oed, t);\r
 \r
                                t.onActivate.dispatch(t, oed);\r
                        }\r
 \r
-                       EditorManager._setActive(t);\r
+                       tinymce._setActive(t);\r
                },\r
 \r
                execCallback : function(n) {\r
@@ -9242,7 +10040,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                },\r
 \r
                translate : function(s) {\r
-                       var c = this.settings.language || 'en', i18n = EditorManager.i18n;\r
+                       var c = this.settings.language || 'en', i18n = tinymce.i18n;\r
 \r
                        if (!s)\r
                                return '';\r
@@ -9253,7 +10051,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                },\r
 \r
                getLang : function(n, dv) {\r
-                       return EditorManager.i18n[(this.settings.language || 'en') + '.' + n] || (is(dv) ? dv : '{#' + n + '}');\r
+                       return tinymce.i18n[(this.settings.language || 'en') + '.' + n] || (is(dv) ? dv : '{#' + n + '}');\r
                },\r
 \r
                getParam : function(n, dv, ty) {\r
@@ -9281,14 +10079,26 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                },\r
 \r
                nodeChanged : function(o) {\r
-                       var t = this, s = t.selection, n = s.getNode() || t.getBody();\r
+                       var t = this, s = t.selection, n = (isIE ? s.getNode() : s.getStart()) || t.getBody();\r
 \r
                        // Fix for bug #1896577 it seems that this can not be fired while the editor is loading\r
                        if (t.initialized) {\r
+                               o = o || {};\r
+                               n = isIE && n.ownerDocument != t.getDoc() ? t.getBody() : n; // Fix for IE initial state\r
+\r
+                               // Get parents and add them to object\r
+                               o.parents = [];\r
+                               t.dom.getParent(n, function(node) {\r
+                                       if (node.nodeName == 'BODY')\r
+                                               return true;\r
+\r
+                                       o.parents.push(node);\r
+                               });\r
+\r
                                t.onNodeChange.dispatch(\r
                                        t,\r
                                        o ? o.controlManager || t.controlManager : t.controlManager,\r
-                                       isIE && n.ownerDocument != t.getDoc() ? t.getBody() : n, // Fix for IE initial state\r
+                                       n,\r
                                        s.isCollapsed(),\r
                                        o\r
                                );\r
@@ -9431,7 +10241,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                        t.onExecCommand.dispatch(t, cmd, ui, val, a);\r
                },\r
 \r
-               queryCommandState : function(c) {\r
+               queryCommandState : function(cmd) {\r
                        var t = this, o, s;\r
 \r
                        // Is hidden then return undefined\r
@@ -9439,7 +10249,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                return;\r
 \r
                        // Registred commands\r
-                       if (o = t.queryStateCommands[c]) {\r
+                       if (o = t.queryStateCommands[cmd]) {\r
                                s = o.func.call(o.scope);\r
 \r
                                // Fall though on true\r
@@ -9448,13 +10258,13 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                        }\r
 \r
                        // Registred commands\r
-                       o = t.editorCommands.queryCommandState(c);\r
+                       o = t.editorCommands.queryCommandState(cmd);\r
                        if (o !== -1)\r
                                return o;\r
 \r
                        // Browser commands\r
                        try {\r
-                               return this.getDoc().queryCommandState(c);\r
+                               return this.getDoc().queryCommandState(cmd);\r
                        } catch (ex) {\r
                                // Fails sometimes see bug: 1896577\r
                        }\r
@@ -9520,12 +10330,6 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                        return b;\r
                },\r
 \r
-               resizeToContent : function() {\r
-                       var t = this;\r
-\r
-                       DOM.setStyle(t.id + "_ifr", 'height', t.getBody().scrollHeight);\r
-               },\r
-\r
                load : function(o) {\r
                        var t = this, e = t.getElement(), h;\r
 \r
@@ -9603,7 +10407,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                        // Padd empty content in Gecko and Safari. Commands will otherwise fail on the content\r
                        // It will also be impossible to place the caret in the editor unless there is a BR element present\r
                        if (!tinymce.isIE && (h.length === 0 || /^\s+$/.test(h))) {\r
-                               o.content = t.dom.setHTML(t.getBody(), '<br mce_bogus="1" />');\r
+                               o.content = t.dom.setHTML(t.getBody(), '<br _mce_bogus="1" />');\r
                                o.format = 'raw';\r
                        }\r
 \r
@@ -9772,7 +10576,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                        // Clear all execCommand listeners this is required to avoid errors if the editor was removed inside another command\r
                        t.onExecCommand.listeners = [];\r
 \r
-                       EditorManager.remove(t);\r
+                       tinymce.remove(t);\r
                        DOM.remove(e);\r
                },\r
 \r
@@ -9860,33 +10664,33 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                        case 'contextmenu':\r
                                                if (tinymce.isOpera) {\r
                                                        // Fake contextmenu on Opera\r
-                                                       Event.add(t.getBody(), 'mousedown', function(e) {\r
+                                                       t.dom.bind(t.getBody(), 'mousedown', function(e) {\r
                                                                if (e.ctrlKey) {\r
                                                                        e.fakeType = 'contextmenu';\r
                                                                        eventHandler(e);\r
                                                                }\r
                                                        });\r
                                                } else\r
-                                                       Event.add(t.getBody(), k, eventHandler);\r
+                                                       t.dom.bind(t.getBody(), k, eventHandler);\r
                                                break;\r
 \r
                                        case 'paste':\r
-                                               Event.add(t.getBody(), k, function(e) {\r
+                                               t.dom.bind(t.getBody(), k, function(e) {\r
                                                        eventHandler(e);\r
                                                });\r
                                                break;\r
 \r
                                        case 'submit':\r
                                        case 'reset':\r
-                                               Event.add(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler);\r
+                                               t.dom.bind(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler);\r
                                                break;\r
 \r
                                        default:\r
-                                               Event.add(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler);\r
+                                               t.dom.bind(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler);\r
                                }\r
                        });\r
 \r
-                       Event.add(s.content_editable ? t.getBody() : (isGecko ? t.getDoc() : t.getWin()), 'focus', function(e) {\r
+                       t.dom.bind(s.content_editable ? t.getBody() : (isGecko ? t.getDoc() : t.getWin()), 'focus', function(e) {\r
                                t.focus(true);\r
                        });\r
 \r
@@ -9899,17 +10703,17 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                        each(ed.dom.select('img'), function(e) {\r
                                                var v;\r
 \r
-                                               if (v = e.getAttribute('mce_src'))\r
+                                               if (v = e.getAttribute('_mce_src'))\r
                                                        e.src = t.documentBaseURI.toAbsolute(v);\r
                                        })\r
                                });*/\r
 \r
-                               Event.add(t.getDoc(), 'DOMNodeInserted', function(e) {\r
+                               t.dom.bind(t.getDoc(), 'DOMNodeInserted', function(e) {\r
                                        var v;\r
 \r
                                        e = e.target;\r
 \r
-                                       if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('mce_src')))\r
+                                       if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('_mce_src')))\r
                                                e.src = t.documentBaseURI.toAbsolute(v);\r
                                });\r
                        }\r
@@ -9950,9 +10754,22 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                t.onMouseDown.add(setOpts);\r
                        }\r
 \r
+                       // Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250\r
+                       // WebKit can't even do simple things like selecting an image\r
+                       // This also fixes so it's possible to select mceItemAnchors\r
+                       if (tinymce.isWebKit) {\r
+                               t.onClick.add(function(ed, e) {\r
+                                       e = e.target;\r
+\r
+                                       // Needs tobe the setBaseAndExtend or it will fail to select floated images\r
+                                       if (e.nodeName == 'IMG' || (e.nodeName == 'A' && t.dom.hasClass(e, 'mceItemAnchor')))\r
+                                               t.selection.getSel().setBaseAndExtent(e, 0, e, 1);\r
+                               });\r
+                       }\r
+\r
                        // Add node change handlers\r
                        t.onMouseUp.add(t.nodeChanged);\r
-                       t.onClick.add(t.nodeChanged);\r
+                       //t.onClick.add(t.nodeChanged);\r
                        t.onKeyUp.add(function(ed, e) {\r
                                var c = e.keyCode;\r
 \r
@@ -9973,15 +10790,13 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                }\r
 \r
                                // Add default shortcuts for gecko\r
-                               if (isGecko) {\r
-                                       t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold');\r
-                                       t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic');\r
-                                       t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline');\r
-                               }\r
+                               t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold');\r
+                               t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic');\r
+                               t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline');\r
 \r
                                // BlockFormat shortcuts keys\r
                                for (i=1; i<=6; i++)\r
-                                       t.addShortcut('ctrl+' + i, '', ['FormatBlock', false, '<h' + i + '>']);\r
+                                       t.addShortcut('ctrl+' + i, '', ['FormatBlock', false, 'h' + i]);\r
 \r
                                t.addShortcut('ctrl+7', '', ['FormatBlock', false, '<p>']);\r
                                t.addShortcut('ctrl+8', '', ['FormatBlock', false, '<div>']);\r
@@ -10041,7 +10856,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                        if (tinymce.isIE) {\r
                                // Fix so resize will only update the width and height attributes not the styles of an image\r
                                // It will also block mceItemNoResize items\r
-                               Event.add(t.getDoc(), 'controlselect', function(e) {\r
+                               t.dom.bind(t.getDoc(), 'controlselect', function(e) {\r
                                        var re = t.resizeInfo, cb;\r
 \r
                                        e = e.target;\r
@@ -10051,11 +10866,11 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                                return;\r
 \r
                                        if (re)\r
-                                               Event.remove(re.node, re.ev, re.cb);\r
+                                               t.dom.unbind(re.node, re.ev, re.cb);\r
 \r
                                        if (!t.dom.hasClass(e, 'mceItemNoResize')) {\r
                                                ev = 'resizeend';\r
-                                               cb = Event.add(e, ev, function(e) {\r
+                                               cb = t.dom.bind(e, ev, function(e) {\r
                                                        var v;\r
 \r
                                                        e = e.target;\r
@@ -10072,7 +10887,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                                });\r
                                        } else {\r
                                                ev = 'resizestart';\r
-                                               cb = Event.add(e, 'resizestart', Event.cancel, Event);\r
+                                               cb = t.dom.bind(e, 'resizestart', Event.cancel, Event);\r
                                        }\r
 \r
                                        re = t.resizeInfo = {\r
@@ -10087,7 +10902,7 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                                case 8:\r
                                                        // Fix IE control + backspace browser bug\r
                                                        if (t.selection.getRng().item) {\r
-                                                               t.selection.getRng().item(0).removeNode();\r
+                                                               ed.dom.remove(t.selection.getRng().item(0));\r
                                                                return Event.cancel(e);\r
                                                        }\r
                                        }\r
@@ -10117,43 +10932,70 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                        t.undoManager.add();\r
                                };\r
 \r
-                               // Add undo level on editor blur\r
-                               if (tinymce.isIE) {\r
-                                       Event.add(t.getWin(), 'blur', function(e) {\r
-                                               var n;\r
+                               t.dom.bind(t.getDoc(), 'focusout', function(e) {\r
+                                       if (!t.removed && t.undoManager.typing)\r
+                                               addUndo();\r
+                               });\r
 \r
-                                               // Check added for fullscreen bug\r
-                                               if (t.selection) {\r
-                                                       n = t.selection.getNode();\r
+                               t.onKeyUp.add(function(ed, e) {\r
+                                       if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.ctrlKey)\r
+                                               addUndo();\r
+                               });\r
 \r
-                                                       // Add undo level is selection was lost to another document\r
-                                                       if (!t.removed && n.ownerDocument && n.ownerDocument != t.getDoc())\r
-                                                               addUndo();\r
-                                               }\r
-                                       });\r
-                               } else {\r
-                                       Event.add(t.getDoc(), 'blur', function() {\r
-                                               if (t.selection && !t.removed)\r
-                                                       addUndo();\r
-                                       });\r
-                               }\r
+                               t.onKeyDown.add(function(ed, e) {\r
+                                       var rng, tmpRng, parent, offset;\r
+\r
+                                       // IE has a really odd bug where the DOM might include an node that doesn't have\r
+                                       // a proper structure. If you try to access nodeValue it would throw an illegal value exception.\r
+                                       // This seems to only happen when you delete contents and it seems to be avoidable if you refresh the element\r
+                                       // after you delete contents from it. See: #3008923\r
+                                       if (isIE && e.keyCode == 46) {\r
+                                               rng = t.selection.getRng();\r
+\r
+                                               if (rng.parentElement) {\r
+                                                       parent = rng.parentElement();\r
+\r
+                                                       // Get the current caret position within the element\r
+                                                       tmpRng = rng.duplicate();\r
+                                                       tmpRng.moveToElementText(parent);\r
+                                                       tmpRng.setEndPoint('EndToEnd', rng);\r
+                                                       offset = tmpRng.text.length;\r
+\r
+                                                       // Select next word when ctrl key is used in combo with delete\r
+                                                       if (e.ctrlKey) {\r
+                                                               rng.moveEnd('word', 1);\r
+                                                               rng.select();\r
+                                                       }\r
 \r
-                               t.onMouseDown.add(addUndo);\r
+                                                       // Delete contents\r
+                                                       t.selection.getSel().clear();\r
 \r
-                               t.onKeyUp.add(function(ed, e) {\r
-                                       if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.ctrlKey) {\r
-                                               t.undoManager.typing = 0;\r
-                                               t.undoManager.add();\r
+                                                       // Check if we are within the same parent\r
+                                                       if (rng.parentElement() == parent) {\r
+                                                               try {\r
+                                                                       // Update the HTML and hopefully it will remove the artifacts\r
+                                                                       parent.innerHTML = parent.innerHTML;\r
+                                                               } catch (ex) {\r
+                                                                       // And since it's IE it can sometimes produce an unknown runtime error\r
+                                                               }\r
+\r
+                                                               // Restore the caret position\r
+                                                               tmpRng.moveToElementText(parent);\r
+                                                               tmpRng.collapse();\r
+                                                               tmpRng.move('character', offset);\r
+                                                               tmpRng.select();\r
+                                                       }\r
+\r
+                                                       // Block the default delete behavior since it might be broken\r
+                                                       e.preventDefault();\r
+                                                       return;\r
+                                               }\r
                                        }\r
-                               });\r
 \r
-                               t.onKeyDown.add(function(ed, e) {\r
                                        // Is caracter positon keys\r
                                        if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45) {\r
-                                               if (t.undoManager.typing) {\r
-                                                       t.undoManager.add();\r
-                                                       t.undoManager.typing = 0;\r
-                                               }\r
+                                               if (t.undoManager.typing)\r
+                                                       addUndo();\r
 \r
                                                return;\r
                                        }\r
@@ -10163,137 +11005,14 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
                                                t.undoManager.typing = 1;\r
                                        }\r
                                });\r
-                       }\r
-               },\r
-\r
-               _convertInlineElements : function() {\r
-                       var t = this, s = t.settings, dom = t.dom, v, e, na, st, sp;\r
-\r
-                       function convert(ed, o) {\r
-                               if (!s.inline_styles)\r
-                                       return;\r
-\r
-                               if (o.get) {\r
-                                       each(t.dom.select('table,u,strike', o.node), function(n) {\r
-                                               switch (n.nodeName) {\r
-                                                       case 'TABLE':\r
-                                                               if (v = dom.getAttrib(n, 'height')) {\r
-                                                                       dom.setStyle(n, 'height', v);\r
-                                                                       dom.setAttrib(n, 'height', '');\r
-                                                               }\r
-                                                               break;\r
-\r
-                                                       case 'U':\r
-                                                       case 'STRIKE':\r
-                                                               //sp = dom.create('span', {style : dom.getAttrib(n, 'style')});\r
-                                                               n.style.textDecoration = n.nodeName == 'U' ? 'underline' : 'line-through';\r
-                                                               dom.setAttrib(n, 'mce_style', '');\r
-                                                               dom.setAttrib(n, 'mce_name', 'span');\r
-                                                               break;\r
-                                               }\r
-                                       });\r
-                               } else if (o.set) {\r
-                                       each(t.dom.select('table,span', o.node).reverse(), function(n) {\r
-                                               if (n.nodeName == 'TABLE') {\r
-                                                       if (v = dom.getStyle(n, 'height'))\r
-                                                               dom.setAttrib(n, 'height', v.replace(/[^0-9%]+/g, ''));\r
-                                               } else {\r
-                                                       // Convert spans to elements\r
-                                                       if (n.style.textDecoration == 'underline')\r
-                                                               na = 'u';\r
-                                                       else if (n.style.textDecoration == 'line-through')\r
-                                                               na = 'strike';\r
-                                                       else\r
-                                                               na = '';\r
 \r
-                                                       if (na) {\r
-                                                               n.style.textDecoration = '';\r
-                                                               dom.setAttrib(n, 'mce_style', '');\r
-\r
-                                                               e = dom.create(na, {\r
-                                                                       style : dom.getAttrib(n, 'style')\r
-                                                               });\r
-\r
-                                                               dom.replace(e, n, 1);\r
-                                                       }\r
-                                               }\r
-                                       });\r
-                               }\r
-                       };\r
-\r
-                       t.onPreProcess.add(convert);\r
-\r
-                       if (!s.cleanup_on_startup) {\r
-                               t.onSetContent.add(function(ed, o) {\r
-                                       if (o.initial)\r
-                                               convert(t, {node : t.getBody(), set : 1});\r
+                               t.onMouseDown.add(function() {\r
+                                       if (t.undoManager.typing)\r
+                                               addUndo();\r
                                });\r
                        }\r
                },\r
 \r
-               _convertFonts : function() {\r
-                       var t = this, s = t.settings, dom = t.dom, fz, fzn, sl, cl;\r
-\r
-                       // No need\r
-                       if (!s.inline_styles)\r
-                               return;\r
-\r
-                       // Font pt values and font size names\r
-                       fz = [8, 10, 12, 14, 18, 24, 36];\r
-                       fzn = ['xx-small', 'x-small','small','medium','large','x-large', 'xx-large'];\r
-\r
-                       if (sl = s.font_size_style_values)\r
-                               sl = explode(sl);\r
-\r
-                       if (cl = s.font_size_classes)\r
-                               cl = explode(cl);\r
-\r
-                       function process(no) {\r
-                               var n, sp, nl, x;\r
-\r
-                               // Keep unit tests happy\r
-                               if (!s.inline_styles)\r
-                                       return;\r
-\r
-                               nl = t.dom.select('font', no);\r
-                               for (x = nl.length - 1; x >= 0; x--) {\r
-                                       n = nl[x];\r
-\r
-                                       sp = dom.create('span', {\r
-                                               style : dom.getAttrib(n, 'style'),\r
-                                               'class' : dom.getAttrib(n, 'class')\r
-                                       });\r
-\r
-                                       dom.setStyles(sp, {\r
-                                               fontFamily : dom.getAttrib(n, 'face'),\r
-                                               color : dom.getAttrib(n, 'color'),\r
-                                               backgroundColor : n.style.backgroundColor\r
-                                       });\r
-\r
-                                       if (n.size) {\r
-                                               if (sl)\r
-                                                       dom.setStyle(sp, 'fontSize', sl[parseInt(n.size) - 1]);\r
-                                               else\r
-                                                       dom.setAttrib(sp, 'class', cl[parseInt(n.size) - 1]);\r
-                                       }\r
-\r
-                                       dom.setAttrib(sp, 'mce_style', '');\r
-                                       dom.replace(sp, n, 1);\r
-                               }\r
-                       };\r
-\r
-                       // Run on cleanup\r
-                       t.onPreProcess.add(function(ed, o) {\r
-                               if (o.get)\r
-                                       process(o.node);\r
-                       });\r
-\r
-                       t.onSetContent.add(function(ed, o) {\r
-                               if (o.initial)\r
-                                       process(o.node);\r
-                       });\r
-               },\r
-\r
                _isHidden : function() {\r
                        var s;\r
 \r
@@ -10355,2543 +11074,3125 @@ var tinyMCE = window.tinyMCE = tinymce.EditorManager;
 \r
                        return s;\r
                }\r
-\r
-               });\r
+       });\r
 })(tinymce);\r
+\r
 (function(tinymce) {\r
-       var each = tinymce.each, isIE = tinymce.isIE, isGecko = tinymce.isGecko, isOpera = tinymce.isOpera, isWebKit = tinymce.isWebKit;\r
+       // Added for compression purposes\r
+       var each = tinymce.each, undefined, TRUE = true, FALSE = false;\r
 \r
-       tinymce.create('tinymce.EditorCommands', {\r
-               EditorCommands : function(ed) {\r
-                       this.editor = ed;\r
-               },\r
+       tinymce.EditorCommands = function(editor) {\r
+               var dom = editor.dom,\r
+                       selection = editor.selection,\r
+                       commands = {state: {}, exec : {}, value : {}},\r
+                       settings = editor.settings,\r
+                       bookmark;\r
 \r
-               execCommand : function(cmd, ui, val) {\r
-                       var t = this, ed = t.editor, f;\r
+               function execCommand(command, ui, value) {\r
+                       var func;\r
 \r
-                       switch (cmd) {\r
-                               // Ignore these\r
-                               case 'mceResetDesignMode':\r
-                               case 'mceBeginUndoLevel':\r
-                                       return true;\r
+                       command = command.toLowerCase();\r
+                       if (func = commands.exec[command]) {\r
+                               func(command, ui, value);\r
+                               return TRUE;\r
+                       }\r
 \r
-                               // Ignore these\r
-                               case 'unlink':\r
-                                       t.UnLink();\r
-                                       return true;\r
+                       return FALSE;\r
+               };\r
 \r
-                               // Bundle these together\r
-                               case 'JustifyLeft':\r
-                               case 'JustifyCenter':\r
-                               case 'JustifyRight':\r
-                               case 'JustifyFull':\r
-                                       t.mceJustify(cmd, cmd.substring(7).toLowerCase());\r
-                                       return true;\r
+               function queryCommandState(command) {\r
+                       var func;\r
 \r
-                               default:\r
-                                       f = this[cmd];\r
+                       command = command.toLowerCase();\r
+                       if (func = commands.state[command])\r
+                               return func(command);\r
 \r
-                                       if (f) {\r
-                                               f.call(this, ui, val);\r
-                                               return true;\r
-                                       }\r
-                       }\r
+                       return -1;\r
+               };\r
 \r
-                       return false;\r
-               },\r
+               function queryCommandValue(command) {\r
+                       var func;\r
+\r
+                       command = command.toLowerCase();\r
+                       if (func = commands.value[command])\r
+                               return func(command);\r
 \r
-               Indent : function() {\r
-                       var ed = this.editor, d = ed.dom, s = ed.selection, e, iv, iu;\r
+                       return FALSE;\r
+               };\r
 \r
-                       // Setup indent level\r
-                       iv = ed.settings.indentation;\r
-                       iu = /[a-z%]+$/i.exec(iv);\r
-                       iv = parseInt(iv);\r
+               function addCommands(command_list, type) {\r
+                       type = type || 'exec';\r
 \r
-                       if (ed.settings.inline_styles && (!this.queryStateInsertUnorderedList() && !this.queryStateInsertOrderedList())) {\r
-                               each(s.getSelectedBlocks(), function(e) {\r
-                                       d.setStyle(e, 'paddingLeft', (parseInt(e.style.paddingLeft || 0) + iv) + iu);\r
+                       each(command_list, function(callback, command) {\r
+                               each(command.toLowerCase().split(','), function(command) {\r
+                                       commands[type][command] = callback;\r
                                });\r
+                       });\r
+               };\r
 \r
-                               return;\r
-                       }\r
+               // Expose public methods\r
+               tinymce.extend(this, {\r
+                       execCommand : execCommand,\r
+                       queryCommandState : queryCommandState,\r
+                       queryCommandValue : queryCommandValue,\r
+                       addCommands : addCommands\r
+               });\r
 \r
-                       ed.getDoc().execCommand('Indent', false, null);\r
+               // Private methods\r
 \r
-                       if (isIE) {\r
-                               d.getParent(s.getNode(), function(n) {\r
-                                       if (n.nodeName == 'BLOCKQUOTE') {\r
-                                               n.dir = n.style.cssText = '';\r
-                                       }\r
-                               });\r
-                       }\r
-               },\r
+               function execNativeCommand(command, ui, value) {\r
+                       if (ui === undefined)\r
+                               ui = FALSE;\r
 \r
-               Outdent : function() {\r
-                       var ed = this.editor, d = ed.dom, s = ed.selection, e, v, iv, iu;\r
+                       if (value === undefined)\r
+                               value = null;\r
 \r
-                       // Setup indent level\r
-                       iv = ed.settings.indentation;\r
-                       iu = /[a-z%]+$/i.exec(iv);\r
-                       iv = parseInt(iv);\r
+                       return editor.getDoc().execCommand(command, ui, value);\r
+               };\r
 \r
-                       if (ed.settings.inline_styles && (!this.queryStateInsertUnorderedList() && !this.queryStateInsertOrderedList())) {\r
-                               each(s.getSelectedBlocks(), function(e) {\r
-                                       v = Math.max(0, parseInt(e.style.paddingLeft || 0) - iv);\r
-                                       d.setStyle(e, 'paddingLeft', v ? v + iu : '');\r
-                               });\r
+               function isFormatMatch(name) {\r
+                       return editor.formatter.match(name);\r
+               };\r
 \r
-                               return;\r
-                       }\r
+               function toggleFormat(name, value) {\r
+                       editor.formatter.toggle(name, value ? {value : value} : undefined);\r
+               };\r
 \r
-                       ed.getDoc().execCommand('Outdent', false, null);\r
-               },\r
+               function storeSelection(type) {\r
+                       bookmark = selection.getBookmark(type);\r
+               };\r
 \r
-/*\r
-               mceSetAttribute : function(u, v) {\r
-                       var ed = this.editor, d = ed.dom, e;\r
+               function restoreSelection() {\r
+                       selection.moveToBookmark(bookmark);\r
+               };\r
 \r
-                       if (e = d.getParent(ed.selection.getNode(), d.isBlock))\r
-                               d.setAttrib(e, v.name, v.value);\r
-               },\r
-*/\r
-               mceSetContent : function(u, v) {\r
-                       this.editor.setContent(v);\r
-               },\r
+               // Add execCommand overrides\r
+               addCommands({\r
+                       // Ignore these, added for compatibility\r
+                       'mceResetDesignMode,mceBeginUndoLevel' : function() {},\r
 \r
-               mceToggleVisualAid : function() {\r
-                       var ed = this.editor;\r
+                       // Add undo manager logic\r
+                       'mceEndUndoLevel,mceAddUndoLevel' : function() {\r
+                               editor.undoManager.add();\r
+                       },\r
 \r
-                       ed.hasVisual = !ed.hasVisual;\r
-                       ed.addVisual();\r
-               },\r
+                       'Cut,Copy,Paste' : function(command) {\r
+                               var doc = editor.getDoc(), failed;\r
 \r
-               mceReplaceContent : function(u, v) {\r
-                       var s = this.editor.selection;\r
+                               // Try executing the native command\r
+                               try {\r
+                                       execNativeCommand(command);\r
+                               } catch (ex) {\r
+                                       // Command failed\r
+                                       failed = TRUE;\r
+                               }\r
 \r
-                       s.setContent(v.replace(/\{\$selection\}/g, s.getContent({format : 'text'})));\r
-               },\r
+                               // Present alert message about clipboard access not being available\r
+                               if (failed || !doc.queryCommandSupported(command)) {\r
+                                       if (tinymce.isGecko) {\r
+                                               editor.windowManager.confirm(editor.getLang('clipboard_msg'), function(state) {\r
+                                                       if (state)\r
+                                                               open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', '_blank');\r
+                                               });\r
+                                       } else\r
+                                               editor.windowManager.alert(editor.getLang('clipboard_no_support'));\r
+                               }\r
+                       },\r
 \r
-               mceInsertLink : function(u, v) {\r
-                       var ed = this.editor, s = ed.selection, e = ed.dom.getParent(s.getNode(), 'a');\r
+                       // Override unlink command\r
+                       unlink : function(command) {\r
+                               if (selection.isCollapsed())\r
+                                       selection.select(selection.getNode());\r
 \r
-                       if (tinymce.is(v, 'string'))\r
-                               v = {href : v};\r
+                               execNativeCommand(command);\r
+                               selection.collapse(FALSE);\r
+                       },\r
 \r
-                       function set(e) {\r
-                               each(v, function(v, k) {\r
-                                       ed.dom.setAttrib(e, k, v);\r
-                               });\r
-                       };\r
+                       // Override justify commands to use the text formatter engine\r
+                       'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) {\r
+                               var align = command.substring(7);\r
 \r
-                       if (!e) {\r
-                               ed.execCommand('CreateLink', false, 'javascript:mctmp(0);');\r
-                               each(ed.dom.select('a[href=javascript:mctmp(0);]'), function(e) {\r
-                                       set(e);\r
+                               // Remove all other alignments first\r
+                               each('left,center,right,full'.split(','), function(name) {\r
+                                       if (align != name)\r
+                                               editor.formatter.remove('align' + name);\r
                                });\r
-                       } else {\r
-                               if (v.href)\r
-                                       set(e);\r
-                               else\r
-                                       ed.dom.remove(e, 1);\r
-                       }\r
-               },\r
 \r
-               UnLink : function() {\r
-                       var ed = this.editor, s = ed.selection;\r
+                               toggleFormat('align' + align);\r
+                       },\r
 \r
-                       if (s.isCollapsed())\r
-                               s.select(s.getNode());\r
+                       // Override list commands to fix WebKit bug\r
+                       'InsertUnorderedList,InsertOrderedList' : function(command) {\r
+                               var listElm, listParent;\r
 \r
-                       ed.getDoc().execCommand('unlink', false, null);\r
-                       s.collapse(0);\r
-               },\r
+                               execNativeCommand(command);\r
 \r
-               FontName : function(u, v) {\r
-                       var t = this, ed = t.editor, s = ed.selection, e;\r
+                               // WebKit produces lists within block elements so we need to split them\r
+                               // we will replace the native list creation logic to custom logic later on\r
+                               // TODO: Remove this when the list creation logic is removed\r
+                               listElm = dom.getParent(selection.getNode(), 'ol,ul');\r
+                               if (listElm) {\r
+                                       listParent = listElm.parentNode;\r
 \r
-                       if (!v) {\r
-                               if (s.isCollapsed())\r
-                                       s.select(s.getNode());\r
-                       } else {\r
-                               if (ed.settings.convert_fonts_to_spans)\r
-                                       t._applyInlineStyle('span', {style : {fontFamily : v}});\r
-                               else\r
-                                       ed.getDoc().execCommand('FontName', false, v);\r
-                       }\r
-               },\r
+                                       // If list is within a text block then split that block\r
+                                       if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) {\r
+                                               storeSelection();\r
+                                               dom.split(listParent, listElm);\r
+                                               restoreSelection();\r
+                                       }\r
+                               }\r
+                       },\r
 \r
-               FontSize : function(u, v) {\r
-                       var ed = this.editor, s = ed.settings, fc, fs;\r
+                       // Override commands to use the text formatter engine\r
+                       'Bold,Italic,Underline,Strikethrough' : function(command) {\r
+                               toggleFormat(command);\r
+                       },\r
 \r
-                       // Use style options instead\r
-                       if (s.convert_fonts_to_spans && v >= 1 && v <= 7) {\r
-                               fs = tinymce.explode(s.font_size_style_values);\r
-                               fc = tinymce.explode(s.font_size_classes);\r
+                       // Override commands to use the text formatter engine\r
+                       'ForeColor,HiliteColor,FontName' : function(command, ui, value) {\r
+                               toggleFormat(command, value);\r
+                       },\r
 \r
-                               if (fc)\r
-                                       v = fc[v - 1] || v;\r
-                               else\r
-                                       v = fs[v - 1] || v;\r
-                       }\r
+                       FontSize : function(command, ui, value) {\r
+                               var fontClasses, fontSizes;\r
 \r
-                       if (v >= 1 && v <= 7)\r
-                               ed.getDoc().execCommand('FontSize', false, v);\r
-                       else\r
-                               this._applyInlineStyle('span', {style : {fontSize : v}});\r
-               },\r
+                               // Convert font size 1-7 to styles\r
+                               if (value >= 1 && value <= 7) {\r
+                                       fontSizes = tinymce.explode(settings.font_size_style_values);\r
+                                       fontClasses = tinymce.explode(settings.font_size_classes);\r
 \r
-               queryCommandValue : function(c) {\r
-                       var f = this['queryValue' + c];\r
+                                       if (fontClasses)\r
+                                               value = fontClasses[value - 1] || value;\r
+                                       else\r
+                                               value = fontSizes[value - 1] || value;\r
+                               }\r
 \r
-                       if (f)\r
-                               return f.call(this, c);\r
+                               toggleFormat(command, value);\r
+                       },\r
 \r
-                       return false;\r
-               },\r
+                       RemoveFormat : function(command) {\r
+                               editor.formatter.remove(command);\r
+                       },\r
 \r
-               queryCommandState : function(cmd) {\r
-                       var f;\r
+                       mceBlockQuote : function(command) {\r
+                               toggleFormat('blockquote');\r
+                       },\r
 \r
-                       switch (cmd) {\r
-                               // Bundle these together\r
-                               case 'JustifyLeft':\r
-                               case 'JustifyCenter':\r
-                               case 'JustifyRight':\r
-                               case 'JustifyFull':\r
-                                       return this.queryStateJustify(cmd, cmd.substring(7).toLowerCase());\r
+                       FormatBlock : function(command, ui, value) {\r
+                               return toggleFormat(value);\r
+                       },\r
 \r
-                               default:\r
-                                       if (f = this['queryState' + cmd])\r
-                                               return f.call(this, cmd);\r
-                       }\r
+                       mceCleanup : function() {\r
+                               var bookmark = selection.getBookmark();\r
 \r
-                       return -1;\r
-               },\r
+                               editor.setContent(editor.getContent({cleanup : TRUE}), {cleanup : TRUE});\r
 \r
-               _queryState : function(c) {\r
-                       try {\r
-                               return this.editor.getDoc().queryCommandState(c);\r
-                       } catch (ex) {\r
-                               // Ignore exception\r
-                       }\r
-               },\r
+                               selection.moveToBookmark(bookmark);\r
+                       },\r
 \r
-               _queryVal : function(c) {\r
-                       try {\r
-                               return this.editor.getDoc().queryCommandValue(c);\r
-                       } catch (ex) {\r
-                               // Ignore exception\r
-                       }\r
-               },\r
+                       mceRemoveNode : function(command, ui, value) {\r
+                               var node = value || selection.getNode();\r
 \r
-               queryValueFontSize : function() {\r
-                       var ed = this.editor, v = 0, p;\r
+                               // Make sure that the body node isn't removed\r
+                               if (node != editor.getBody()) {\r
+                                       storeSelection();\r
+                                       editor.dom.remove(node, TRUE);\r
+                                       restoreSelection();\r
+                               }\r
+                       },\r
 \r
-                       if (p = ed.dom.getParent(ed.selection.getNode(), 'span'))\r
-                               v = p.style.fontSize;\r
+                       mceSelectNodeDepth : function(command, ui, value) {\r
+                               var counter = 0;\r
 \r
-                       if (!v && (isOpera || isWebKit)) {\r
-                               if (p = ed.dom.getParent(ed.selection.getNode(), 'font'))\r
-                                       v = p.size;\r
+                               dom.getParent(selection.getNode(), function(node) {\r
+                                       if (node.nodeType == 1 && counter++ == value) {\r
+                                               selection.select(node);\r
+                                               return FALSE;\r
+                                       }\r
+                               }, editor.getBody());\r
+                       },\r
 \r
-                               return v;\r
-                       }\r
+                       mceSelectNode : function(command, ui, value) {\r
+                               selection.select(value);\r
+                       },\r
 \r
-                       return v || this._queryVal('FontSize');\r
-               },\r
+                       mceInsertContent : function(command, ui, value) {\r
+                               selection.setContent(value);\r
+                       },\r
 \r
-               queryValueFontName : function() {\r
-                       var ed = this.editor, v = 0, p;\r
+                       mceInsertRawHTML : function(command, ui, value) {\r
+                               selection.setContent('tiny_mce_marker');\r
+                               editor.setContent(editor.getContent().replace(/tiny_mce_marker/g, value));\r
+                       },\r
 \r
-                       if (p = ed.dom.getParent(ed.selection.getNode(), 'font'))\r
-                               v = p.face;\r
+                       mceSetContent : function(command, ui, value) {\r
+                               editor.setContent(value);\r
+                       },\r
 \r
-                       if (p = ed.dom.getParent(ed.selection.getNode(), 'span'))\r
-                               v = p.style.fontFamily.replace(/, /g, ',').replace(/[\'\"]/g, '').toLowerCase();\r
+                       'Indent,Outdent' : function(command) {\r
+                               var intentValue, indentUnit, value;\r
 \r
-                       if (!v)\r
-                               v = this._queryVal('FontName');\r
+                               // Setup indent level\r
+                               intentValue = settings.indentation;\r
+                               indentUnit = /[a-z%]+$/i.exec(intentValue);\r
+                               intentValue = parseInt(intentValue);\r
 \r
-                       return v;\r
-               },\r
+                               if (!queryCommandState('InsertUnorderedList') && !queryCommandState('InsertOrderedList')) {\r
+                                       each(selection.getSelectedBlocks(), function(element) {\r
+                                               if (command == 'outdent') {\r
+                                                       value = Math.max(0, parseInt(element.style.paddingLeft || 0) - intentValue);\r
+                                                       dom.setStyle(element, 'paddingLeft', value ? value + indentUnit : '');\r
+                                               } else\r
+                                                       dom.setStyle(element, 'paddingLeft', (parseInt(element.style.paddingLeft || 0) + intentValue) + indentUnit);\r
+                                       });\r
+                               } else\r
+                                       execNativeCommand(command);\r
+                       },\r
 \r
-               mceJustify : function(c, v) {\r
-                       var ed = this.editor, se = ed.selection, n = se.getNode(), nn = n.nodeName, bl, nb, dom = ed.dom, rm;\r
+                       mceRepaint : function() {\r
+                               var bookmark;\r
 \r
-                       if (ed.settings.inline_styles && this.queryStateJustify(c, v))\r
-                               rm = 1;\r
+                               if (tinymce.isGecko) {\r
+                                       try {\r
+                                               storeSelection(TRUE);\r
 \r
-                       bl = dom.getParent(n, ed.dom.isBlock);\r
+                                               if (selection.getSel())\r
+                                                       selection.getSel().selectAllChildren(editor.getBody());\r
 \r
-                       if (nn == 'IMG') {\r
-                               if (v == 'full')\r
-                                       return;\r
+                                               selection.collapse(TRUE);\r
+                                               restoreSelection();\r
+                                       } catch (ex) {\r
+                                               // Ignore\r
+                                       }\r
+                               }\r
+                       },\r
 \r
-                               if (rm) {\r
-                                       if (v == 'center')\r
-                                               dom.setStyle(bl || n.parentNode, 'textAlign', '');\r
+                       mceToggleFormat : function(command, ui, value) {\r
+                               editor.formatter.toggle(value);\r
+                       },\r
 \r
-                                       dom.setStyle(n, 'float', '');\r
-                                       this.mceRepaint();\r
-                                       return;\r
-                               }\r
+                       InsertHorizontalRule : function() {\r
+                               selection.setContent('<hr />');\r
+                       },\r
 \r
-                               if (v == 'center') {\r
-                                       // Do not change table elements\r
-                                       if (bl && /^(TD|TH)$/.test(bl.nodeName))\r
-                                               bl = 0;\r
+                       mceToggleVisualAid : function() {\r
+                               editor.hasVisual = !editor.hasVisual;\r
+                               editor.addVisual();\r
+                       },\r
 \r
-                                       if (!bl || bl.childNodes.length > 1) {\r
-                                               nb = dom.create('p');\r
-                                               nb.appendChild(n.cloneNode(false));\r
+                       mceReplaceContent : function(command, ui, value) {\r
+                               selection.setContent(value.replace(/\{\$selection\}/g, selection.getContent({format : 'text'})));\r
+                       },\r
 \r
-                                               if (bl)\r
-                                                       dom.insertAfter(nb, bl);\r
-                                               else\r
-                                                       dom.insertAfter(nb, n);\r
+                       mceInsertLink : function(command, ui, value) {\r
+                               var link = dom.getParent(selection.getNode(), 'a');\r
 \r
-                                               dom.remove(n);\r
-                                               n = nb.firstChild;\r
-                                               bl = nb;\r
-                                       }\r
+                               if (tinymce.is(value, 'string'))\r
+                                       value = {href : value};\r
 \r
-                                       dom.setStyle(bl, 'textAlign', v);\r
-                                       dom.setStyle(n, 'float', '');\r
+                               if (!link) {\r
+                                       execNativeCommand('CreateLink', FALSE, 'javascript:mctmp(0);');\r
+                                       each(dom.select('a[href=javascript:mctmp(0);]'), function(link) {\r
+                                               dom.setAttribs(link, value);\r
+                                       });\r
                                } else {\r
-                                       dom.setStyle(n, 'float', v);\r
-                                       dom.setStyle(bl || n.parentNode, 'textAlign', '');\r
+                                       if (value.href)\r
+                                               dom.setAttribs(link, value);\r
+                                       else\r
+                                               editor.dom.remove(link, TRUE);\r
                                }\r
-\r
-                               this.mceRepaint();\r
-                               return;\r
+                       },\r
+                       \r
+                       selectAll : function() {\r
+                               var root = dom.getRoot();\r
+                               var rng = dom.createRng();\r
+                               rng.setStart(root, 0);\r
+                               rng.setEnd(root, root.childNodes.length);\r
+                               editor.selection.setRng(rng);\r
                        }\r
+               });\r
 \r
-                       // Handle the alignment outselfs, less quirks in all browsers\r
-                       if (ed.settings.inline_styles && ed.settings.forced_root_block) {\r
-                               if (rm)\r
-                                       v = '';\r
+               // Add queryCommandState overrides\r
+               addCommands({\r
+                       // Override justify commands\r
+                       'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) {\r
+                               return isFormatMatch('align' + command.substring(7));\r
+                       },\r
 \r
-                               each(se.getSelectedBlocks(dom.getParent(se.getStart(), dom.isBlock), dom.getParent(se.getEnd(), dom.isBlock)), function(e) {\r
-                                       dom.setAttrib(e, 'align', '');\r
-                                       dom.setStyle(e, 'textAlign', v == 'full' ? 'justify' : v);\r
-                               });\r
+                       'Bold,Italic,Underline,Strikethrough' : function(command) {\r
+                               return isFormatMatch(command);\r
+                       },\r
 \r
-                               return;\r
-                       } else if (!rm)\r
-                               ed.getDoc().execCommand(c, false, null);\r
-\r
-                       if (ed.settings.inline_styles) {\r
-                               if (rm) {\r
-                                       dom.getParent(ed.selection.getNode(), function(n) {\r
-                                               if (n.style && n.style.textAlign)\r
-                                                       dom.setStyle(n, 'textAlign', '');\r
-                                       });\r
+                       mceBlockQuote : function() {\r
+                               return isFormatMatch('blockquote');\r
+                       },\r
 \r
-                                       return;\r
+                       Outdent : function() {\r
+                               var node;\r
+\r
+                               if (settings.inline_styles) {\r
+                                       if ((node = dom.getParent(selection.getStart(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0)\r
+                                               return TRUE;\r
+\r
+                                       if ((node = dom.getParent(selection.getEnd(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0)\r
+                                               return TRUE;\r
                                }\r
 \r
-                               each(dom.select('*'), function(n) {\r
-                                       var v = n.align;\r
+                               return queryCommandState('InsertUnorderedList') || queryCommandState('InsertOrderedList') || (!settings.inline_styles && !!dom.getParent(selection.getNode(), 'BLOCKQUOTE'));\r
+                       },\r
+\r
+                       'InsertUnorderedList,InsertOrderedList' : function(command) {\r
+                               return dom.getParent(selection.getNode(), command == 'insertunorderedlist' ? 'UL' : 'OL');\r
+                       }\r
+               }, 'state');\r
 \r
-                                       if (v) {\r
-                                               if (v == 'full')\r
-                                                       v = 'justify';\r
+               // Add queryCommandValue overrides\r
+               addCommands({\r
+                       'FontSize,FontName' : function(command) {\r
+                               var value = 0, parent;\r
 \r
-                                               dom.setStyle(n, 'textAlign', v);\r
-                                               dom.setAttrib(n, 'align', '');\r
-                                       }\r
-                               });\r
+                               if (parent = dom.getParent(selection.getNode(), 'span')) {\r
+                                       if (command == 'fontsize')\r
+                                               value = parent.style.fontSize;\r
+                                       else\r
+                                               value = parent.style.fontFamily.replace(/, /g, ',').replace(/[\'\"]/g, '').toLowerCase();\r
+                               }\r
+\r
+                               return value;\r
                        }\r
-               },\r
+               }, 'value');\r
 \r
-               mceSetCSSClass : function(u, v) {\r
-                       this.mceSetStyleInfo(0, {command : 'setattrib', name : 'class', value : v});\r
-               },\r
+               // Add undo manager logic\r
+               if (settings.custom_undo_redo) {\r
+                       addCommands({\r
+                               Undo : function() {\r
+                                       editor.undoManager.undo();\r
+                               },\r
 \r
-               getSelectedElement : function() {\r
-                       var t = this, ed = t.editor, dom = ed.dom, se = ed.selection, r = se.getRng(), r1, r2, sc, ec, so, eo, e, sp, ep, re;\r
+                               Redo : function() {\r
+                                       editor.undoManager.redo();\r
+                               }\r
+                       });\r
+               }\r
+       };\r
+})(tinymce);\r
+(function(tinymce) {\r
+       var Dispatcher = tinymce.util.Dispatcher;\r
 \r
-                       if (se.isCollapsed() || r.item)\r
-                               return se.getNode();\r
+       tinymce.UndoManager = function(editor) {\r
+               var self, index = 0, data = [];\r
 \r
-                       // Setup regexp\r
-                       re = ed.settings.merge_styles_invalid_parents;\r
-                       if (tinymce.is(re, 'string'))\r
-                               re = new RegExp(re, 'i');\r
+               function getContent() {\r
+                       return tinymce.trim(editor.getContent({format : 'raw', no_events : 1}));\r
+               };\r
 \r
-                       if (isIE) {\r
-                               r1 = r.duplicate();\r
-                               r1.collapse(true);\r
-                               sc = r1.parentElement();\r
+               return self = {\r
+                       typing : 0,\r
 \r
-                               r2 = r.duplicate();\r
-                               r2.collapse(false);\r
-                               ec = r2.parentElement();\r
+                       onAdd : new Dispatcher(self),\r
+                       onUndo : new Dispatcher(self),\r
+                       onRedo : new Dispatcher(self),\r
 \r
-                               if (sc != ec) {\r
-                                       r1.move('character', 1);\r
-                                       sc = r1.parentElement();\r
-                               }\r
+                       add : function(level) {\r
+                               var i, settings = editor.settings, lastLevel;\r
 \r
-                               if (sc == ec) {\r
-                                       r1 = r.duplicate();\r
-                                       r1.moveToElementText(sc);\r
+                               level = level || {};\r
+                               level.content = getContent();\r
 \r
-                                       if (r1.compareEndPoints('StartToStart', r) == 0 && r1.compareEndPoints('EndToEnd', r) == 0)\r
-                                               return re && re.test(sc.nodeName) ? null : sc;\r
+                               // Add undo level if needed\r
+                               lastLevel = data[index];\r
+                               if (lastLevel && lastLevel.content == level.content) {\r
+                                       if (index > 0 || data.length == 1)\r
+                                               return null;\r
                                }\r
-                       } else {\r
-                               function getParent(n) {\r
-                                       return dom.getParent(n, '*');\r
-                               };\r
 \r
-                               sc = r.startContainer;\r
-                               ec = r.endContainer;\r
-                               so = r.startOffset;\r
-                               eo = r.endOffset;\r
+                               // Time to compress\r
+                               if (settings.custom_undo_redo_levels) {\r
+                                       if (data.length > settings.custom_undo_redo_levels) {\r
+                                               for (i = 0; i < data.length - 1; i++)\r
+                                                       data[i] = data[i + 1];\r
 \r
-                               if (!r.collapsed) {\r
-                                       if (sc == ec) {\r
-                                               if (so - eo < 2) {\r
-                                                       if (sc.hasChildNodes()) {\r
-                                                               sp = sc.childNodes[so];\r
-                                                               return re && re.test(sp.nodeName) ? null : sp;\r
-                                                       }\r
-                                               }\r
+                                               data.length--;\r
+                                               index = data.length;\r
                                        }\r
                                }\r
 \r
-                               if (sc.nodeType != 3 || ec.nodeType != 3)\r
-                                       return null;\r
-\r
-                               if (so == 0) {\r
-                                       sp = getParent(sc);\r
+                               // Get a non intrusive normalized bookmark\r
+                               level.bookmark = editor.selection.getBookmark(2, true);\r
 \r
-                                       if (sp && sp.firstChild != sc)\r
-                                               sp = null;\r
+                               // Crop array if needed\r
+                               if (index < data.length - 1) {\r
+                                       // Treat first level as initial\r
+                                       if (index == 0)\r
+                                               data = [];\r
+                                       else\r
+                                               data.length = index + 1;\r
                                }\r
 \r
-                               if (so == sc.nodeValue.length) {\r
-                                       e = sc.nextSibling;\r
+                               data.push(level);\r
+                               index = data.length - 1;\r
 \r
-                                       if (e && e.nodeType == 1)\r
-                                               sp = sc.nextSibling;\r
-                               }\r
+                               self.onAdd.dispatch(self, level);\r
+                               editor.isNotDirty = 0;\r
 \r
-                               if (eo == 0) {\r
-                                       e = ec.previousSibling;\r
+                               return level;\r
+                       },\r
 \r
-                                       if (e && e.nodeType == 1)\r
-                                               ep = e;\r
+                       undo : function() {\r
+                               var level, i;\r
+\r
+                               if (self.typing) {\r
+                                       self.add();\r
+                                       self.typing = 0;\r
                                }\r
 \r
-                               if (eo == ec.nodeValue.length) {\r
-                                       ep = getParent(ec);\r
+                               if (index > 0) {\r
+                                       level = data[--index];\r
 \r
-                                       if (ep && ep.lastChild != ec)\r
-                                               ep = null;\r
-                               }\r
+                                       editor.setContent(level.content, {format : 'raw'});\r
+                                       editor.selection.moveToBookmark(level.bookmark);\r
 \r
-                               // Same element\r
-                               if (sp == ep)\r
-                                       return re && sp && re.test(sp.nodeName) ? null : sp;\r
-                       }\r
+                                       self.onUndo.dispatch(self, level);\r
+                               }\r
 \r
-                       return null;\r
-               },\r
+                               return level;\r
+                       },\r
 \r
-               mceSetStyleInfo : function(u, v) {\r
-                       var t = this, ed = t.editor, d = ed.getDoc(), dom = ed.dom, e, b, s = ed.selection, nn = v.wrapper || 'span', b = s.getBookmark(), re;\r
+                       redo : function() {\r
+                               var level;\r
 \r
-                       function set(n, e) {\r
-                               if (n.nodeType == 1) {\r
-                                       switch (v.command) {\r
-                                               case 'setattrib':\r
-                                                       return dom.setAttrib(n, v.name, v.value);\r
+                               if (index < data.length - 1) {\r
+                                       level = data[++index];\r
 \r
-                                               case 'setstyle':\r
-                                                       return dom.setStyle(n, v.name, v.value);\r
+                                       editor.setContent(level.content, {format : 'raw'});\r
+                                       editor.selection.moveToBookmark(level.bookmark);\r
 \r
-                                               case 'removeformat':\r
-                                                       return dom.setAttrib(n, 'class', '');\r
-                                       }\r
+                                       self.onRedo.dispatch(self, level);\r
                                }\r
-                       };\r
 \r
-                       // Setup regexp\r
-                       re = ed.settings.merge_styles_invalid_parents;\r
-                       if (tinymce.is(re, 'string'))\r
-                               re = new RegExp(re, 'i');\r
+                               return level;\r
+                       },\r
 \r
-                       // Set style info on selected element\r
-                       if ((e = t.getSelectedElement()) && !ed.settings.force_span_wrappers)\r
-                               set(e, 1);\r
-                       else {\r
-                               // Generate wrappers and set styles on them\r
-                               d.execCommand('FontName', false, '__');\r
-                               each(dom.select('span,font'), function(n) {\r
-                                       var sp, e;\r
+                       clear : function() {\r
+                               data = [];\r
+                               index = self.typing = 0;\r
+                       },\r
 \r
-                                       if (dom.getAttrib(n, 'face') == '__' || n.style.fontFamily === '__') {\r
-                                               sp = dom.create(nn, {mce_new : '1'});\r
+                       hasUndo : function() {\r
+                               return index > 0 || self.typing;\r
+                       },\r
 \r
-                                               set(sp);\r
+                       hasRedo : function() {\r
+                               return index < data.length - 1;\r
+                       }\r
+               };\r
+       };\r
+})(tinymce);\r
 \r
-                                               each (n.childNodes, function(n) {\r
-                                                       sp.appendChild(n.cloneNode(true));\r
-                                               });\r
+(function(tinymce) {\r
+       // Shorten names\r
+       var Event = tinymce.dom.Event,\r
+               isIE = tinymce.isIE,\r
+               isGecko = tinymce.isGecko,\r
+               isOpera = tinymce.isOpera,\r
+               each = tinymce.each,\r
+               extend = tinymce.extend,\r
+               TRUE = true,\r
+               FALSE = false;\r
+\r
+       function cloneFormats(node) {\r
+               var clone, temp, inner;\r
+\r
+               do {\r
+                       if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(node.nodeName)) {\r
+                               if (clone) {\r
+                                       temp = node.cloneNode(false);\r
+                                       temp.appendChild(clone);\r
+                                       clone = temp;\r
+                               } else {\r
+                                       clone = inner = node.cloneNode(false);\r
+                               }\r
 \r
-                                               dom.replace(sp, n);\r
-                                       }\r
-                               });\r
+                               clone.removeAttribute('id');\r
                        }\r
+               } while (node = node.parentNode);\r
 \r
-                       // Remove wrappers inside new ones\r
-                       each(dom.select(nn).reverse(), function(n) {\r
-                               var p = n.parentNode;\r
+               if (clone)\r
+                       return {wrapper : clone, inner : inner};\r
+       };\r
 \r
-                               // Check if it's an old span in a new wrapper\r
-                               if (!dom.getAttrib(n, 'mce_new')) {\r
-                                       // Find new wrapper\r
-                                       p = dom.getParent(n, '*[mce_new]');\r
+       // Checks if the selection/caret is at the end of the specified block element\r
+       function isAtEnd(rng, par) {\r
+               var rng2 = par.ownerDocument.createRange();\r
 \r
-                                       if (p)\r
-                                               dom.remove(n, 1);\r
-                               }\r
-                       });\r
+               rng2.setStart(rng.endContainer, rng.endOffset);\r
+               rng2.setEndAfter(par);\r
 \r
-                       // Merge wrappers with parent wrappers\r
-                       each(dom.select(nn).reverse(), function(n) {\r
-                               var p = n.parentNode;\r
+               // Get number of characters to the right of the cursor if it's zero then we are at the end and need to merge the next block element\r
+               return rng2.cloneContents().textContent.length == 0;\r
+       };\r
 \r
-                               if (!p || !dom.getAttrib(n, 'mce_new'))\r
-                                       return;\r
+       function isEmpty(n) {\r
+               n = n.innerHTML;\r
 \r
-                               if (ed.settings.force_span_wrappers && p.nodeName != 'SPAN')\r
-                                       return;\r
+               n = n.replace(/<(img|hr|table|input|select|textarea)[ \>]/gi, '-'); // Keep these convert them to - chars\r
+               n = n.replace(/<[^>]+>/g, ''); // Remove all tags\r
+\r
+               return n.replace(/[ \u00a0\t\r\n]+/g, '') == '';\r
+       };\r
 \r
-                               // Has parent of the same type and only child\r
-                               if (p.nodeName == nn.toUpperCase() && p.childNodes.length == 1)\r
-                                       return dom.remove(p, 1);\r
+       function splitList(selection, dom, li) {\r
+               var listBlock, block;\r
 \r
-                               // Has parent that is more suitable to have the class and only child\r
-                               if (n.nodeType == 1 && (!re || !re.test(p.nodeName)) && p.childNodes.length == 1) {\r
-                                       set(p); // Set style info on parent instead\r
-                                       dom.setAttrib(n, 'class', '');\r
-                               }\r
-                       });\r
+               if (isEmpty(li)) {\r
+                       listBlock = dom.getParent(li, 'ul,ol');\r
 \r
-                       // Remove empty wrappers\r
-                       each(dom.select(nn).reverse(), function(n) {\r
-                               if (dom.getAttrib(n, 'mce_new') || (dom.getAttribs(n).length <= 1 && n.className === '')) {\r
-                                       if (!dom.getAttrib(n, 'class') && !dom.getAttrib(n, 'style'))\r
-                                               return dom.remove(n, 1);\r
+                       if (!dom.getParent(listBlock.parentNode, 'ul,ol')) {\r
+                               dom.split(listBlock, li);\r
+                               block = dom.create('p', 0, '<br _mce_bogus="1" />');\r
+                               dom.replace(block, li);\r
+                               selection.select(block, 1);\r
+                       }\r
 \r
-                                       dom.setAttrib(n, 'mce_new', ''); // Remove mce_new marker\r
-                               }\r
-                       });\r
+                       return FALSE;\r
+               }\r
 \r
-                       s.moveToBookmark(b);\r
-               },\r
+               return TRUE;\r
+       };\r
 \r
-               queryStateJustify : function(c, v) {\r
-                       var ed = this.editor, n = ed.selection.getNode(), dom = ed.dom;\r
+       tinymce.create('tinymce.ForceBlocks', {\r
+               ForceBlocks : function(ed) {\r
+                       var t = this, s = ed.settings, elm;\r
 \r
-                       if (n && n.nodeName == 'IMG') {\r
-                               if (dom.getStyle(n, 'float') == v)\r
-                                       return 1;\r
+                       t.editor = ed;\r
+                       t.dom = ed.dom;\r
+                       elm = (s.forced_root_block || 'p').toLowerCase();\r
+                       s.element = elm.toUpperCase();\r
 \r
-                               return n.parentNode.style.textAlign == v;\r
-                       }\r
+                       ed.onPreInit.add(t.setup, t);\r
 \r
-                       n = dom.getParent(ed.selection.getStart(), function(n) {\r
-                               return n.nodeType == 1 && n.style.textAlign;\r
-                       });\r
+                       t.reOpera = new RegExp('(\\u00a0|&#160;|&nbsp;)<\/' + elm + '>', 'gi');\r
+                       t.rePadd = new RegExp('<p( )([^>]+)><\\\/p>|<p( )([^>]+)\\\/>|<p( )([^>]+)>\\s+<\\\/p>|<p><\\\/p>|<p\\\/>|<p>\\s+<\\\/p>'.replace(/p/g, elm), 'gi');\r
+                       t.reNbsp2BR1 = new RegExp('<p( )([^>]+)>[\\s\\u00a0]+<\\\/p>|<p>[\\s\\u00a0]+<\\\/p>'.replace(/p/g, elm), 'gi');\r
+                       t.reNbsp2BR2 = new RegExp('<%p()([^>]+)>(&nbsp;|&#160;)<\\\/%p>|<%p>(&nbsp;|&#160;)<\\\/%p>'.replace(/%p/g, elm), 'gi');\r
+                       t.reBR2Nbsp = new RegExp('<p( )([^>]+)>\\s*<br \\\/>\\s*<\\\/p>|<p>\\s*<br \\\/>\\s*<\\\/p>'.replace(/p/g, elm), 'gi');\r
 \r
-                       if (v == 'full')\r
-                               v = 'justify';\r
+                       function padd(ed, o) {\r
+                               if (isOpera)\r
+                                       o.content = o.content.replace(t.reOpera, '</' + elm + '>');\r
 \r
-                       if (ed.settings.inline_styles)\r
-                               return (n && n.style.textAlign == v);\r
+                               o.content = o.content.replace(t.rePadd, '<' + elm + '$1$2$3$4$5$6>\u00a0</' + elm + '>');\r
 \r
-                       return this._queryState(c);\r
-               },\r
+                               if (!isIE && !isOpera && o.set) {\r
+                                       // Use &nbsp; instead of BR in padded paragraphs\r
+                                       o.content = o.content.replace(t.reNbsp2BR1, '<' + elm + '$1$2><br /></' + elm + '>');\r
+                                       o.content = o.content.replace(t.reNbsp2BR2, '<' + elm + '$1$2><br /></' + elm + '>');\r
+                               } else\r
+                                       o.content = o.content.replace(t.reBR2Nbsp, '<' + elm + '$1$2>\u00a0</' + elm + '>');\r
+                       };\r
 \r
-               ForeColor : function(ui, v) {\r
-                       var ed = this.editor;\r
+                       ed.onBeforeSetContent.add(padd);\r
+                       ed.onPostProcess.add(padd);\r
 \r
-                       if (ed.settings.convert_fonts_to_spans) {\r
-                               this._applyInlineStyle('span', {style : {color : v}});\r
-                               return;\r
-                       } else\r
-                               ed.getDoc().execCommand('ForeColor', false, v);\r
+                       if (s.forced_root_block) {\r
+                               ed.onInit.add(t.forceRoots, t);\r
+                               ed.onSetContent.add(t.forceRoots, t);\r
+                               ed.onBeforeGetContent.add(t.forceRoots, t);\r
+                       }\r
                },\r
 \r
-               HiliteColor : function(ui, val) {\r
-                       var t = this, ed = t.editor, d = ed.getDoc();\r
+               setup : function() {\r
+                       var t = this, ed = t.editor, s = ed.settings, dom = ed.dom, selection = ed.selection;\r
 \r
-                       if (ed.settings.convert_fonts_to_spans) {\r
-                               this._applyInlineStyle('span', {style : {backgroundColor : val}});\r
-                               return;\r
+                       // Force root blocks when typing and when getting output\r
+                       if (s.forced_root_block) {\r
+                               ed.onBeforeExecCommand.add(t.forceRoots, t);\r
+                               ed.onKeyUp.add(t.forceRoots, t);\r
+                               ed.onPreProcess.add(t.forceRoots, t);\r
                        }\r
 \r
-                       function set(s) {\r
-                               if (!isGecko)\r
-                                       return;\r
+                       if (s.force_br_newlines) {\r
+                               // Force IE to produce BRs on enter\r
+                               if (isIE) {\r
+                                       ed.onKeyPress.add(function(ed, e) {\r
+                                               var n;\r
 \r
-                               try {\r
-                                       // Try new Gecko method\r
-                                       d.execCommand("styleWithCSS", 0, s);\r
-                               } catch (ex) {\r
-                                       // Use old\r
-                                       d.execCommand("useCSS", 0, !s);\r
+                                               if (e.keyCode == 13 && selection.getNode().nodeName != 'LI') {\r
+                                                       selection.setContent('<br id="__" /> ', {format : 'raw'});\r
+                                                       n = dom.get('__');\r
+                                                       n.removeAttribute('id');\r
+                                                       selection.select(n);\r
+                                                       selection.collapse();\r
+                                                       return Event.cancel(e);\r
+                                               }\r
+                                       });\r
                                }\r
-                       };\r
+                       }\r
 \r
-                       if (isGecko || isOpera) {\r
-                               set(true);\r
-                               d.execCommand('hilitecolor', false, val);\r
-                               set(false);\r
-                       } else\r
-                               d.execCommand('BackColor', false, val);\r
-               },\r
+                       if (s.force_p_newlines) {\r
+                               if (!isIE) {\r
+                                       ed.onKeyPress.add(function(ed, e) {\r
+                                               if (e.keyCode == 13 && !e.shiftKey && !t.insertPara(e))\r
+                                                       Event.cancel(e);\r
+                                       });\r
+                               } else {\r
+                                       // Ungly hack to for IE to preserve the formatting when you press\r
+                                       // enter at the end of a block element with formatted contents\r
+                                       // This logic overrides the browsers default logic with\r
+                                       // custom logic that enables us to control the output\r
+                                       tinymce.addUnload(function() {\r
+                                               t._previousFormats = 0; // Fix IE leak\r
+                                       });\r
 \r
-               FormatBlock : function(ui, val) {\r
-                       var t = this, ed = t.editor, s = ed.selection, dom = ed.dom, bl, nb, b;\r
+                                       ed.onKeyPress.add(function(ed, e) {\r
+                                               t._previousFormats = 0;\r
 \r
-                       function isBlock(n) {\r
-                               return /^(P|DIV|H[1-6]|ADDRESS|BLOCKQUOTE|PRE)$/.test(n.nodeName);\r
-                       };\r
+                                               // Clone the current formats, this will later be applied to the new block contents\r
+                                               if (e.keyCode == 13 && !e.shiftKey && ed.selection.isCollapsed() && s.keep_styles)\r
+                                                       t._previousFormats = cloneFormats(ed.selection.getStart());\r
+                                       });\r
 \r
-                       bl = dom.getParent(s.getNode(), function(n) {\r
-                               return isBlock(n);\r
-                       });\r
+                                       ed.onKeyUp.add(function(ed, e) {\r
+                                               // Let IE break the element and the wrap the new caret location in the previous formats\r
+                                               if (e.keyCode == 13 && !e.shiftKey) {\r
+                                                       var parent = ed.selection.getStart(), fmt = t._previousFormats;\r
 \r
-                       // IE has an issue where it removes the parent div if you change format on the paragrah in <div><p>Content</p></div>\r
-                       // FF and Opera doesn't change parent DIV elements if you switch format\r
-                       if (bl) {\r
-                               if ((isIE && isBlock(bl.parentNode)) || bl.nodeName == 'DIV') {\r
-                                       // Rename block element\r
-                                       nb = ed.dom.create(val);\r
+                                                       // Parent is an empty block\r
+                                                       if (!parent.hasChildNodes()) {\r
+                                                               parent = dom.getParent(parent, dom.isBlock);\r
 \r
-                                       each(dom.getAttribs(bl), function(v) {\r
-                                               dom.setAttrib(nb, v.nodeName, dom.getAttrib(bl, v.nodeName));\r
+                                                               if (parent) {\r
+                                                                       parent.innerHTML = '';\r
+       \r
+                                                                       if (t._previousFormats) {\r
+                                                                               parent.appendChild(fmt.wrapper);\r
+                                                                               fmt.inner.innerHTML = '\uFEFF';\r
+                                                                       } else\r
+                                                                               parent.innerHTML = '\uFEFF';\r
+\r
+                                                                       selection.select(parent, 1);\r
+                                                                       ed.getDoc().execCommand('Delete', false, null);\r
+                                                               }\r
+                                                       }\r
+                                               }\r
                                        });\r
+                               }\r
 \r
-                                       b = s.getBookmark();\r
-                                       dom.replace(nb, bl, 1);\r
-                                       s.moveToBookmark(b);\r
-                                       ed.nodeChanged();\r
-                                       return;\r
+                               if (isGecko) {\r
+                                       ed.onKeyDown.add(function(ed, e) {\r
+                                               if ((e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey)\r
+                                                       t.backspaceDelete(e, e.keyCode == 8);\r
+                                       });\r
                                }\r
                        }\r
 \r
-                       val = ed.settings.forced_root_block ? (val || '<p>') : val;\r
-\r
-                       if (val.indexOf('<') == -1)\r
-                               val = '<' + val + '>';\r
-\r
-                       if (tinymce.isGecko)\r
-                               val = val.replace(/<(div|blockquote|code|dt|dd|dl|samp)>/gi, '$1');\r
+                       // Workaround for missing shift+enter support, http://bugs.webkit.org/show_bug.cgi?id=16973\r
+                       if (tinymce.isWebKit) {\r
+                               function insertBr(ed) {\r
+                                       var rng = selection.getRng(), br, div = dom.create('div', null, ' '), divYPos, vpHeight = dom.getViewPort(ed.getWin()).h;\r
 \r
-                       ed.getDoc().execCommand('FormatBlock', false, val);\r
-               },\r
+                                       // Insert BR element\r
+                                       rng.insertNode(br = dom.create('br'));\r
 \r
-               mceCleanup : function() {\r
-                       var ed = this.editor, s = ed.selection, b = s.getBookmark();\r
-                       ed.setContent(ed.getContent());\r
-                       s.moveToBookmark(b);\r
-               },\r
+                                       // Place caret after BR\r
+                                       rng.setStartAfter(br);\r
+                                       rng.setEndAfter(br);\r
+                                       selection.setRng(rng);\r
 \r
-               mceRemoveNode : function(ui, val) {\r
-                       var ed = this.editor, s = ed.selection, b, n = val || s.getNode();\r
+                                       // Could not place caret after BR then insert an nbsp entity and move the caret\r
+                                       if (selection.getSel().focusNode == br.previousSibling) {\r
+                                               selection.select(dom.insertAfter(dom.doc.createTextNode('\u00a0'), br));\r
+                                               selection.collapse(TRUE);\r
+                                       }\r
 \r
-                       // Make sure that the body node isn't removed\r
-                       if (n == ed.getBody())\r
-                               return;\r
+                                       // Create a temporary DIV after the BR and get the position as it\r
+                                       // seems like getPos() returns 0 for text nodes and BR elements.\r
+                                       dom.insertAfter(div, br);\r
+                                       divYPos = dom.getPos(div).y;\r
+                                       dom.remove(div);\r
 \r
-                       b = s.getBookmark();\r
-                       ed.dom.remove(n, 1);\r
-                       s.moveToBookmark(b);\r
-                       ed.nodeChanged();\r
-               },\r
+                                       // Scroll to new position, scrollIntoView can't be used due to bug: http://bugs.webkit.org/show_bug.cgi?id=16117\r
+                                       if (divYPos > vpHeight) // It is not necessary to scroll if the DIV is inside the view port.\r
+                                               ed.getWin().scrollTo(0, divYPos);\r
+                               };\r
 \r
-               mceSelectNodeDepth : function(ui, val) {\r
-                       var ed = this.editor, s = ed.selection, c = 0;\r
+                               ed.onKeyPress.add(function(ed, e) {\r
+                                       if (e.keyCode == 13 && (e.shiftKey || (s.force_br_newlines && !dom.getParent(selection.getNode(), 'h1,h2,h3,h4,h5,h6,ol,ul')))) {\r
+                                               insertBr(ed);\r
+                                               Event.cancel(e);\r
+                                       }\r
+                               });\r
+                       }\r
 \r
-                       ed.dom.getParent(s.getNode(), function(n) {\r
-                               if (n.nodeType == 1 && c++ == val) {\r
-                                       s.select(n);\r
-                                       ed.nodeChanged();\r
-                                       return false;\r
-                               }\r
-                       }, ed.getBody());\r
-               },\r
+                       // Padd empty inline elements within block elements\r
+                       // For example: <p><strong><em></em></strong></p> becomes <p><strong><em>&nbsp;</em></strong></p>\r
+                       ed.onPreProcess.add(function(ed, o) {\r
+                               each(dom.select('p,h1,h2,h3,h4,h5,h6,div', o.node), function(p) {\r
+                                       if (isEmpty(p)) {\r
+                                               each(dom.select('span,em,strong,b,i', o.node), function(n) {\r
+                                                       if (!n.hasChildNodes()) {\r
+                                                               n.appendChild(ed.getDoc().createTextNode('\u00a0'));\r
+                                                               return FALSE; // Break the loop one padding is enough\r
+                                                       }\r
+                                               });\r
+                                       }\r
+                               });\r
+                       });\r
 \r
-               mceSelectNode : function(u, v) {\r
-                       this.editor.selection.select(v);\r
-               },\r
+                       // IE specific fixes\r
+                       if (isIE) {\r
+                               // Replaces IE:s auto generated paragraphs with the specified element name\r
+                               if (s.element != 'P') {\r
+                                       ed.onKeyPress.add(function(ed, e) {\r
+                                               t.lastElm = selection.getNode().nodeName;\r
+                                       });\r
 \r
-               mceInsertContent : function(ui, val) {\r
-                       this.editor.selection.setContent(val);\r
-               },\r
+                                       ed.onKeyUp.add(function(ed, e) {\r
+                                               var bl, n = selection.getNode(), b = ed.getBody();\r
 \r
-               mceInsertRawHTML : function(ui, val) {\r
-                       var ed = this.editor;\r
+                                               if (b.childNodes.length === 1 && n.nodeName == 'P') {\r
+                                                       n = dom.rename(n, s.element);\r
+                                                       selection.select(n);\r
+                                                       selection.collapse();\r
+                                                       ed.nodeChanged();\r
+                                               } else if (e.keyCode == 13 && !e.shiftKey && t.lastElm != 'P') {\r
+                                                       bl = dom.getParent(n, 'p');\r
 \r
-                       ed.selection.setContent('tiny_mce_marker');\r
-                       ed.setContent(ed.getContent().replace(/tiny_mce_marker/g, val));\r
+                                                       if (bl) {\r
+                                                               dom.rename(bl, s.element);\r
+                                                               ed.nodeChanged();\r
+                                                       }\r
+                                               }\r
+                                       });\r
+                               }\r
+                       }\r
                },\r
 \r
-               mceRepaint : function() {\r
-                       var s, b, e = this.editor;\r
+               find : function(n, t, s) {\r
+                       var ed = this.editor, w = ed.getDoc().createTreeWalker(n, 4, null, FALSE), c = -1;\r
 \r
-                       if (tinymce.isGecko) {\r
-                               try {\r
-                                       s = e.selection;\r
-                                       b = s.getBookmark(true);\r
+                       while (n = w.nextNode()) {\r
+                               c++;\r
 \r
-                                       if (s.getSel())\r
-                                               s.getSel().selectAllChildren(e.getBody());\r
+                               // Index by node\r
+                               if (t == 0 && n == s)\r
+                                       return c;\r
 \r
-                                       s.collapse(true);\r
-                                       s.moveToBookmark(b);\r
-                               } catch (ex) {\r
-                                       // Ignore\r
-                               }\r
+                               // Node by index\r
+                               if (t == 1 && c == s)\r
+                                       return n;\r
                        }\r
-               },\r
-\r
-               queryStateUnderline : function() {\r
-                       var ed = this.editor, n = ed.selection.getNode();\r
-\r
-                       if (n && n.nodeName == 'A')\r
-                               return false;\r
 \r
-                       return this._queryState('Underline');\r
+                       return -1;\r
                },\r
 \r
-               queryStateOutdent : function() {\r
-                       var ed = this.editor, n;\r
+               forceRoots : function(ed, e) {\r
+                       var t = this, ed = t.editor, b = ed.getBody(), d = ed.getDoc(), se = ed.selection, s = se.getSel(), r = se.getRng(), si = -2, ei, so, eo, tr, c = -0xFFFFFF;\r
+                       var nx, bl, bp, sp, le, nl = b.childNodes, i, n, eid;\r
 \r
-                       if (ed.settings.inline_styles) {\r
-                               if ((n = ed.dom.getParent(ed.selection.getStart(), ed.dom.isBlock)) && parseInt(n.style.paddingLeft) > 0)\r
-                                       return true;\r
-\r
-                               if ((n = ed.dom.getParent(ed.selection.getEnd(), ed.dom.isBlock)) && parseInt(n.style.paddingLeft) > 0)\r
-                                       return true;\r
-                       }\r
-\r
-                       return this.queryStateInsertUnorderedList() || this.queryStateInsertOrderedList() || (!ed.settings.inline_styles && !!ed.dom.getParent(ed.selection.getNode(), 'BLOCKQUOTE'));\r
-               },\r
+                       // Fix for bug #1863847\r
+                       //if (e && e.keyCode == 13)\r
+                       //      return TRUE;\r
 \r
-               queryStateInsertUnorderedList : function() {\r
-                       return this.editor.dom.getParent(this.editor.selection.getNode(), 'UL');\r
-               },\r
+                       // Wrap non blocks into blocks\r
+                       for (i = nl.length - 1; i >= 0; i--) {\r
+                               nx = nl[i];\r
 \r
-               queryStateInsertOrderedList : function() {\r
-                       return this.editor.dom.getParent(this.editor.selection.getNode(), 'OL');\r
-               },\r
+                               // Ignore internal elements\r
+                               if (nx.nodeType === 1 && nx.getAttribute('_mce_type')) {\r
+                                       bl = null;\r
+                                       continue;\r
+                               }\r
 \r
-               queryStatemceBlockQuote : function() {\r
-                       return !!this.editor.dom.getParent(this.editor.selection.getStart(), function(n) {return n.nodeName === 'BLOCKQUOTE';});\r
-               },\r
+                               // Is text or non block element\r
+                               if (nx.nodeType === 3 || (!t.dom.isBlock(nx) && nx.nodeType !== 8 && !/^(script|mce:script|style|mce:style)$/i.test(nx.nodeName))) {\r
+                                       if (!bl) {\r
+                                               // Create new block but ignore whitespace\r
+                                               if (nx.nodeType != 3 || /[^\s]/g.test(nx.nodeValue)) {\r
+                                                       // Store selection\r
+                                                       if (si == -2 && r) {\r
+                                                               if (!isIE) {\r
+                                                                       // If selection is element then mark it\r
+                                                                       if (r.startContainer.nodeType == 1 && (n = r.startContainer.childNodes[r.startOffset]) && n.nodeType == 1) {\r
+                                                                               // Save the id of the selected element\r
+                                                                               eid = n.getAttribute("id");\r
+                                                                               n.setAttribute("id", "__mce");\r
+                                                                       } else {\r
+                                                                               // If element is inside body, might not be the case in contentEdiable mode\r
+                                                                               if (ed.dom.getParent(r.startContainer, function(e) {return e === b;})) {\r
+                                                                                       so = r.startOffset;\r
+                                                                                       eo = r.endOffset;\r
+                                                                                       si = t.find(b, 0, r.startContainer);\r
+                                                                                       ei = t.find(b, 0, r.endContainer);\r
+                                                                               }\r
+                                                                       }\r
+                                                               } else {\r
+                                                                       // Force control range into text range\r
+                                                                       if (r.item) {\r
+                                                                               tr = d.body.createTextRange();\r
+                                                                               tr.moveToElementText(r.item(0));\r
+                                                                               r = tr;\r
+                                                                       }\r
 \r
-               _applyInlineStyle : function(na, at, op) {\r
-                       var t = this, ed = t.editor, dom = ed.dom, bm, lo = {}, kh, found;\r
+                                                                       tr = d.body.createTextRange();\r
+                                                                       tr.moveToElementText(b);\r
+                                                                       tr.collapse(1);\r
+                                                                       bp = tr.move('character', c) * -1;\r
 \r
-                       na = na.toUpperCase();\r
+                                                                       tr = r.duplicate();\r
+                                                                       tr.collapse(1);\r
+                                                                       sp = tr.move('character', c) * -1;\r
 \r
-                       if (op && op.check_classes && at['class'])\r
-                               op.check_classes.push(at['class']);\r
+                                                                       tr = r.duplicate();\r
+                                                                       tr.collapse(0);\r
+                                                                       le = (tr.move('character', c) * -1) - sp;\r
 \r
-                       function removeEmpty() {\r
-                               each(dom.select(na).reverse(), function(n) {\r
-                                       var c = 0;\r
+                                                                       si = sp - bp;\r
+                                                                       ei = le;\r
+                                                               }\r
+                                                       }\r
 \r
-                                       // Check if there is any attributes\r
-                                       each(dom.getAttribs(n), function(an) {\r
-                                               if (an.nodeName.substring(0, 1) != '_' && dom.getAttrib(n, an.nodeName) != '') {\r
-                                                       //console.log(dom.getOuterHTML(n), dom.getAttrib(n, an.nodeName));\r
-                                                       c++;\r
+                                                       // Uses replaceChild instead of cloneNode since it removes selected attribute from option elements on IE\r
+                                                       // See: http://support.microsoft.com/kb/829907\r
+                                                       bl = ed.dom.create(ed.settings.forced_root_block);\r
+                                                       nx.parentNode.replaceChild(bl, nx);\r
+                                                       bl.appendChild(nx);\r
                                                }\r
-                                       });\r
+                                       } else {\r
+                                               if (bl.hasChildNodes())\r
+                                                       bl.insertBefore(nx, bl.firstChild);\r
+                                               else\r
+                                                       bl.appendChild(nx);\r
+                                       }\r
+                               } else\r
+                                       bl = null; // Time to create new block\r
+                       }\r
 \r
-                                       // No attributes then remove the element and keep the children\r
-                                       if (c == 0)\r
-                                               dom.remove(n, 1);\r
-                               });\r
-                       };\r
+                       // Restore selection\r
+                       if (si != -2) {\r
+                               if (!isIE) {\r
+                                       bl = b.getElementsByTagName(ed.settings.element)[0];\r
+                                       r = d.createRange();\r
 \r
-                       function replaceFonts() {\r
-                               var bm;\r
+                                       // Select last location or generated block\r
+                                       if (si != -1)\r
+                                               r.setStart(t.find(b, 1, si), so);\r
+                                       else\r
+                                               r.setStart(bl, 0);\r
 \r
-                               each(dom.select('span,font'), function(n) {\r
-                                       if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline') {\r
-                                               if (!bm)\r
-                                                       bm = ed.selection.getBookmark();\r
+                                       // Select last location or generated block\r
+                                       if (ei != -1)\r
+                                               r.setEnd(t.find(b, 1, ei), eo);\r
+                                       else\r
+                                               r.setEnd(bl, 0);\r
 \r
-                                               at._mce_new = '1';\r
-                                               dom.replace(dom.create(na, at), n, 1);\r
+                                       if (s) {\r
+                                               s.removeAllRanges();\r
+                                               s.addRange(r);\r
                                        }\r
-                               });\r
+                               } else {\r
+                                       try {\r
+                                               r = s.createRange();\r
+                                               r.moveToElementText(b);\r
+                                               r.collapse(1);\r
+                                               r.moveStart('character', si);\r
+                                               r.moveEnd('character', ei);\r
+                                               r.select();\r
+                                       } catch (ex) {\r
+                                               // Ignore\r
+                                       }\r
+                               }\r
+                       } else if (!isIE && (n = ed.dom.get('__mce'))) {\r
+                               // Restore the id of the selected element\r
+                               if (eid)\r
+                                       n.setAttribute('id', eid);\r
+                               else\r
+                                       n.removeAttribute('id');\r
 \r
-                               // Remove redundant elements\r
-                               each(dom.select(na + '[_mce_new]'), function(n) {\r
-                                       function removeStyle(n) {\r
-                                               if (n.nodeType == 1) {\r
-                                                       each(at.style, function(v, k) {\r
-                                                               dom.setStyle(n, k, '');\r
-                                                       });\r
+                               // Move caret before selected element\r
+                               r = d.createRange();\r
+                               r.setStartBefore(n);\r
+                               r.setEndBefore(n);\r
+                               se.setRng(r);\r
+                       }\r
+               },\r
 \r
-                                                       // Remove spans with the same class or marked classes\r
-                                                       if (at['class'] && n.className && op) {\r
-                                                               each(op.check_classes, function(c) {\r
-                                                                       if (dom.hasClass(n, c))\r
-                                                                               dom.removeClass(n, c);\r
-                                                               });\r
-                                                       }\r
-                                               }\r
-                                       };\r
+               getParentBlock : function(n) {\r
+                       var d = this.dom;\r
 \r
-                                       // Remove specified style information from child elements\r
-                                       each(dom.select(na, n), removeStyle);\r
+                       return d.getParent(n, d.isBlock);\r
+               },\r
 \r
-                                       // Remove the specified style information on parent if current node is only child (IE)\r
-                                       if (n.parentNode && n.parentNode.nodeType == 1 && n.parentNode.childNodes.length == 1)\r
-                                               removeStyle(n.parentNode);\r
+               insertPara : function(e) {\r
+                       var t = this, ed = t.editor, dom = ed.dom, d = ed.getDoc(), se = ed.settings, s = ed.selection.getSel(), r = s.getRangeAt(0), b = d.body;\r
+                       var rb, ra, dir, sn, so, en, eo, sb, eb, bn, bef, aft, sc, ec, n, vp = dom.getViewPort(ed.getWin()), y, ch, car;\r
 \r
-                                       // Remove the child elements style info if a parent already has it\r
-                                       dom.getParent(n.parentNode, function(pn) {\r
-                                               if (pn.nodeType == 1) {\r
-                                                       if (at.style) {\r
-                                                               each(at.style, function(v, k) {\r
-                                                                       var sv;\r
+                       // If root blocks are forced then use Operas default behavior since it's really good\r
+// Removed due to bug: #1853816\r
+//                     if (se.forced_root_block && isOpera)\r
+//                             return TRUE;\r
 \r
-                                                                       if (!lo[k] && (sv = dom.getStyle(pn, k))) {\r
-                                                                               if (sv === v)\r
-                                                                                       dom.setStyle(n, k, '');\r
+                       // Setup before range\r
+                       rb = d.createRange();\r
 \r
-                                                                               lo[k] = 1;\r
-                                                                       }\r
-                                                               });\r
-                                                       }\r
+                       // If is before the first block element and in body, then move it into first block element\r
+                       rb.setStart(s.anchorNode, s.anchorOffset);\r
+                       rb.collapse(TRUE);\r
 \r
-                                                       // Remove spans with the same class or marked classes\r
-                                                       if (at['class'] && pn.className && op) {\r
-                                                               each(op.check_classes, function(c) {\r
-                                                                       if (dom.hasClass(pn, c))\r
-                                                                               dom.removeClass(n, c);\r
-                                                               });\r
-                                                       }\r
-                                               }\r
+                       // Setup after range\r
+                       ra = d.createRange();\r
 \r
-                                               return false;\r
-                                       });\r
+                       // If is before the first block element and in body, then move it into first block element\r
+                       ra.setStart(s.focusNode, s.focusOffset);\r
+                       ra.collapse(TRUE);\r
 \r
-                                       n.removeAttribute('_mce_new');\r
-                               });\r
+                       // Setup start/end points\r
+                       dir = rb.compareBoundaryPoints(rb.START_TO_END, ra) < 0;\r
+                       sn = dir ? s.anchorNode : s.focusNode;\r
+                       so = dir ? s.anchorOffset : s.focusOffset;\r
+                       en = dir ? s.focusNode : s.anchorNode;\r
+                       eo = dir ? s.focusOffset : s.anchorOffset;\r
 \r
-                               removeEmpty();\r
-                               ed.selection.moveToBookmark(bm);\r
+                       // If selection is in empty table cell\r
+                       if (sn === en && /^(TD|TH)$/.test(sn.nodeName)) {\r
+                               if (sn.firstChild.nodeName == 'BR')\r
+                                       dom.remove(sn.firstChild); // Remove BR\r
 \r
-                               return !!bm;\r
-                       };\r
+                               // Create two new block elements\r
+                               if (sn.childNodes.length == 0) {\r
+                                       ed.dom.add(sn, se.element, null, '<br />');\r
+                                       aft = ed.dom.add(sn, se.element, null, '<br />');\r
+                               } else {\r
+                                       n = sn.innerHTML;\r
+                                       sn.innerHTML = '';\r
+                                       ed.dom.add(sn, se.element, null, n);\r
+                                       aft = ed.dom.add(sn, se.element, null, '<br />');\r
+                               }\r
 \r
-                       // Create inline elements\r
-                       ed.focus();\r
-                       ed.getDoc().execCommand('FontName', false, 'mceinline');\r
-                       replaceFonts();\r
+                               // Move caret into the last one\r
+                               r = d.createRange();\r
+                               r.selectNodeContents(aft);\r
+                               r.collapse(1);\r
+                               ed.selection.setRng(r);\r
 \r
-                       if (kh = t._applyInlineStyle.keyhandler) {\r
-                               ed.onKeyUp.remove(kh);\r
-                               ed.onKeyPress.remove(kh);\r
-                               ed.onKeyDown.remove(kh);\r
-                               ed.onSetContent.remove(t._applyInlineStyle.chandler);\r
+                               return FALSE;\r
                        }\r
 \r
-                       if (ed.selection.isCollapsed()) {\r
-                               // IE will format the current word so this code can't be executed on that browser\r
-                               if (!isIE) {\r
-                                       each(dom.getParents(ed.selection.getNode(), 'span'), function(n) {\r
-                                               each(at.style, function(v, k) {\r
-                                                       var kv;\r
-\r
-                                                       if (kv = dom.getStyle(n, k)) {\r
-                                                               if (kv == v) {\r
-                                                                       dom.setStyle(n, k, '');\r
-                                                                       found = 2;\r
-                                                                       return false;\r
-                                                               }\r
-\r
-                                                               found = 1;\r
-                                                               return false;\r
-                                                       }\r
-                                               });\r
-\r
-                                               if (found)\r
-                                                       return false;\r
-                                       });\r
-\r
-                                       if (found == 2) {\r
-                                               bm = ed.selection.getBookmark();\r
+                       // If the caret is in an invalid location in FF we need to move it into the first block\r
+                       if (sn == b && en == b && b.firstChild && ed.dom.isBlock(b.firstChild)) {\r
+                               sn = en = sn.firstChild;\r
+                               so = eo = 0;\r
+                               rb = d.createRange();\r
+                               rb.setStart(sn, 0);\r
+                               ra = d.createRange();\r
+                               ra.setStart(en, 0);\r
+                       }\r
 \r
-                                               removeEmpty();\r
+                       // Never use body as start or end node\r
+                       sn = sn.nodeName == "HTML" ? d.body : sn; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes\r
+                       sn = sn.nodeName == "BODY" ? sn.firstChild : sn;\r
+                       en = en.nodeName == "HTML" ? d.body : en; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes\r
+                       en = en.nodeName == "BODY" ? en.firstChild : en;\r
 \r
-                                               ed.selection.moveToBookmark(bm);\r
+                       // Get start and end blocks\r
+                       sb = t.getParentBlock(sn);\r
+                       eb = t.getParentBlock(en);\r
+                       bn = sb ? sb.nodeName : se.element; // Get block name to create\r
 \r
-                                               // Node change needs to be detached since the onselect event\r
-                                               // for the select box will run the onclick handler after onselect call. Todo: Add a nicer fix!\r
-                                               window.setTimeout(function() {\r
-                                                       ed.nodeChanged();\r
-                                               }, 1);\r
+                       // Return inside list use default browser behavior\r
+                       if (n = t.dom.getParent(sb, 'li,pre')) {\r
+                               if (n.nodeName == 'LI')\r
+                                       return splitList(ed.selection, t.dom, n);\r
 \r
-                                               return;\r
-                                       }\r
-                               }\r
+                               return TRUE;\r
+                       }\r
 \r
-                               // Start collecting styles\r
-                               t._pendingStyles = tinymce.extend(t._pendingStyles || {}, at.style);\r
+                       // If caption or absolute layers then always generate new blocks within\r
+                       if (sb && (sb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) {\r
+                               bn = se.element;\r
+                               sb = null;\r
+                       }\r
 \r
-                               t._applyInlineStyle.chandler = ed.onSetContent.add(function() {\r
-                                       delete t._pendingStyles;\r
-                               });\r
+                       // If caption or absolute layers then always generate new blocks within\r
+                       if (eb && (eb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) {\r
+                               bn = se.element;\r
+                               eb = null;\r
+                       }\r
 \r
-                               t._applyInlineStyle.keyhandler = kh = function(e) {\r
-                                       // Use pending styles\r
-                                       if (t._pendingStyles) {\r
-                                               at.style = t._pendingStyles;\r
-                                               delete t._pendingStyles;\r
-                                       }\r
+                       // Use P instead\r
+                       if (/(TD|TABLE|TH|CAPTION)/.test(bn) || (sb && bn == "DIV" && /left|right/gi.test(dom.getStyle(sb, 'float', 1)))) {\r
+                               bn = se.element;\r
+                               sb = eb = null;\r
+                       }\r
 \r
-                                       if (replaceFonts()) {\r
-                                               ed.onKeyDown.remove(t._applyInlineStyle.keyhandler);\r
-                                               ed.onKeyPress.remove(t._applyInlineStyle.keyhandler);\r
-                                       }\r
+                       // Setup new before and after blocks\r
+                       bef = (sb && sb.nodeName == bn) ? sb.cloneNode(0) : ed.dom.create(bn);\r
+                       aft = (eb && eb.nodeName == bn) ? eb.cloneNode(0) : ed.dom.create(bn);\r
 \r
-                                       if (e.type == 'keyup')\r
-                                               ed.onKeyUp.remove(t._applyInlineStyle.keyhandler);\r
-                               };\r
+                       // Remove id from after clone\r
+                       aft.removeAttribute('id');\r
 \r
-                               ed.onKeyDown.add(kh);\r
-                               ed.onKeyPress.add(kh);\r
-                               ed.onKeyUp.add(kh);\r
-                       } else\r
-                               t._pendingStyles = 0;\r
-               }\r
-       });\r
-})(tinymce);(function(tinymce) {\r
-       tinymce.create('tinymce.UndoManager', {\r
-               index : 0,\r
-               data : null,\r
-               typing : 0,\r
+                       // Is header and cursor is at the end, then force paragraph under\r
+                       if (/^(H[1-6])$/.test(bn) && isAtEnd(r, sb))\r
+                               aft = ed.dom.create(se.element);\r
 \r
-               UndoManager : function(ed) {\r
-                       var t = this, Dispatcher = tinymce.util.Dispatcher;\r
+                       // Find start chop node\r
+                       n = sc = sn;\r
+                       do {\r
+                               if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName))\r
+                                       break;\r
 \r
-                       t.editor = ed;\r
-                       t.data = [];\r
-                       t.onAdd = new Dispatcher(this);\r
-                       t.onUndo = new Dispatcher(this);\r
-                       t.onRedo = new Dispatcher(this);\r
-               },\r
+                               sc = n;\r
+                       } while ((n = n.previousSibling ? n.previousSibling : n.parentNode));\r
 \r
-               add : function(l) {\r
-                       var t = this, i, ed = t.editor, b, s = ed.settings, la;\r
+                       // Find end chop node\r
+                       n = ec = en;\r
+                       do {\r
+                               if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName))\r
+                                       break;\r
 \r
-                       l = l || {};\r
-                       l.content = l.content || ed.getContent({format : 'raw', no_events : 1});\r
+                               ec = n;\r
+                       } while ((n = n.nextSibling ? n.nextSibling : n.parentNode));\r
 \r
-                       // Add undo level if needed\r
-                       l.content = l.content.replace(/^\s*|\s*$/g, '');\r
-                       la = t.data[t.index > 0 && (t.index == 0 || t.index == t.data.length) ? t.index - 1 : t.index];\r
-                       if (!l.initial && la && l.content == la.content)\r
-                               return null;\r
+                       // Place first chop part into before block element\r
+                       if (sc.nodeName == bn)\r
+                               rb.setStart(sc, 0);\r
+                       else\r
+                               rb.setStartBefore(sc);\r
 \r
-                       // Time to compress\r
-                       if (s.custom_undo_redo_levels) {\r
-                               if (t.data.length > s.custom_undo_redo_levels) {\r
-                                       for (i = 0; i < t.data.length - 1; i++)\r
-                                               t.data[i] = t.data[i + 1];\r
+                       rb.setEnd(sn, so);\r
+                       bef.appendChild(rb.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari\r
 \r
-                                       t.data.length--;\r
-                                       t.index = t.data.length;\r
-                               }\r
+                       // Place secnd chop part within new block element\r
+                       try {\r
+                               ra.setEndAfter(ec);\r
+                       } catch(ex) {\r
+                               //console.debug(s.focusNode, s.focusOffset);\r
                        }\r
 \r
-                       if (s.custom_undo_redo_restore_selection && !l.initial)\r
-                               l.bookmark = b = l.bookmark || ed.selection.getBookmark();\r
+                       ra.setStart(en, eo);\r
+                       aft.appendChild(ra.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari\r
 \r
-                       if (t.index < t.data.length)\r
-                               t.index++;\r
+                       // Create range around everything\r
+                       r = d.createRange();\r
+                       if (!sc.previousSibling && sc.parentNode.nodeName == bn) {\r
+                               r.setStartBefore(sc.parentNode);\r
+                       } else {\r
+                               if (rb.startContainer.nodeName == bn && rb.startOffset == 0)\r
+                                       r.setStartBefore(rb.startContainer);\r
+                               else\r
+                                       r.setStart(rb.startContainer, rb.startOffset);\r
+                       }\r
 \r
-                       // Only initial marked undo levels should be allowed as first item\r
-                       // This to workaround a bug with Firefox and the blur event\r
-                       if (t.data.length === 0 && !l.initial)\r
-                               return null;\r
+                       if (!ec.nextSibling && ec.parentNode.nodeName == bn)\r
+                               r.setEndAfter(ec.parentNode);\r
+                       else\r
+                               r.setEnd(ra.endContainer, ra.endOffset);\r
+\r
+                       // Delete and replace it with new block elements\r
+                       r.deleteContents();\r
 \r
-                       // Add level\r
-                       t.data.length = t.index + 1;\r
-                       t.data[t.index++] = l;\r
+                       if (isOpera)\r
+                               ed.getWin().scrollTo(0, vp.y);\r
 \r
-                       if (l.initial)\r
-                               t.index = 0;\r
+                       // Never wrap blocks in blocks\r
+                       if (bef.firstChild && bef.firstChild.nodeName == bn)\r
+                               bef.innerHTML = bef.firstChild.innerHTML;\r
 \r
-                       // Set initial bookmark use first real undo level\r
-                       if (t.data.length == 2 && t.data[0].initial)\r
-                               t.data[0].bookmark = b;\r
+                       if (aft.firstChild && aft.firstChild.nodeName == bn)\r
+                               aft.innerHTML = aft.firstChild.innerHTML;\r
 \r
-                       t.onAdd.dispatch(t, l);\r
-                       ed.isNotDirty = 0;\r
+                       // Padd empty blocks\r
+                       if (isEmpty(bef))\r
+                               bef.innerHTML = '<br />';\r
 \r
-                       //console.dir(t.data);\r
+                       function appendStyles(e, en) {\r
+                               var nl = [], nn, n, i;\r
 \r
-                       return l;\r
-               },\r
+                               e.innerHTML = '';\r
 \r
-               undo : function() {\r
-                       var t = this, ed = t.editor, l = l, i;\r
+                               // Make clones of style elements\r
+                               if (se.keep_styles) {\r
+                                       n = en;\r
+                                       do {\r
+                                               // We only want style specific elements\r
+                                               if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(n.nodeName)) {\r
+                                                       nn = n.cloneNode(FALSE);\r
+                                                       dom.setAttrib(nn, 'id', ''); // Remove ID since it needs to be unique\r
+                                                       nl.push(nn);\r
+                                               }\r
+                                       } while (n = n.parentNode);\r
+                               }\r
+\r
+                               // Append style elements to aft\r
+                               if (nl.length > 0) {\r
+                                       for (i = nl.length - 1, nn = e; i >= 0; i--)\r
+                                               nn = nn.appendChild(nl[i]);\r
 \r
-                       if (t.typing) {\r
-                               t.add();\r
-                               t.typing = 0;\r
+                                       // Padd most inner style element\r
+                                       nl[0].innerHTML = isOpera ? '&nbsp;' : '<br />'; // Extra space for Opera so that the caret can move there\r
+                                       return nl[0]; // Move caret to most inner element\r
+                               } else\r
+                                       e.innerHTML = isOpera ? '&nbsp;' : '<br />'; // Extra space for Opera so that the caret can move there\r
+                       };\r
+\r
+                       // Fill empty afterblook with current style\r
+                       if (isEmpty(aft))\r
+                               car = appendStyles(aft, en);\r
+\r
+                       // Opera needs this one backwards for older versions\r
+                       if (isOpera && parseFloat(opera.version()) < 9.5) {\r
+                               r.insertNode(bef);\r
+                               r.insertNode(aft);\r
+                       } else {\r
+                               r.insertNode(aft);\r
+                               r.insertNode(bef);\r
                        }\r
 \r
-                       if (t.index > 0) {\r
-                               // If undo on last index then take snapshot\r
-                               if (t.index == t.data.length && t.index > 1) {\r
-                                       i = t.index;\r
-                                       t.typing = 0;\r
+                       // Normalize\r
+                       aft.normalize();\r
+                       bef.normalize();\r
 \r
-                                       if (!t.add())\r
-                                               t.index = i;\r
+                       function first(n) {\r
+                               return d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, FALSE).nextNode() || n;\r
+                       };\r
 \r
-                                       --t.index;\r
-                               }\r
+                       // Move cursor and scroll into view\r
+                       r = d.createRange();\r
+                       r.selectNodeContents(isGecko ? first(car || aft) : car || aft);\r
+                       r.collapse(1);\r
+                       s.removeAllRanges();\r
+                       s.addRange(r);\r
 \r
-                               l = t.data[--t.index];\r
-                               ed.setContent(l.content, {format : 'raw'});\r
-                               ed.selection.moveToBookmark(l.bookmark);\r
+                       // scrollIntoView seems to scroll the parent window in most browsers now including FF 3.0b4 so it's time to stop using it and do it our selfs\r
+                       y = ed.dom.getPos(aft).y;\r
+                       ch = aft.clientHeight;\r
 \r
-                               t.onUndo.dispatch(t, l);\r
+                       // Is element within viewport\r
+                       if (y < vp.y || y + ch > vp.y + vp.h) {\r
+                               ed.getWin().scrollTo(0, y < vp.y ? y : y - vp.h + 25); // Needs to be hardcoded to roughly one line of text if a huge text block is broken into two blocks\r
+                               //console.debug('SCROLL!', 'vp.y: ' + vp.y, 'y' + y, 'vp.h' + vp.h, 'clientHeight' + aft.clientHeight, 'yyy: ' + (y < vp.y ? y : y - vp.h + aft.clientHeight));\r
                        }\r
 \r
-                       return l;\r
+                       return FALSE;\r
                },\r
 \r
-               redo : function() {\r
-                       var t = this, ed = t.editor, l = null;\r
+               backspaceDelete : function(e, bs) {\r
+                       var t = this, ed = t.editor, b = ed.getBody(), dom = ed.dom, n, se = ed.selection, r = se.getRng(), sc = r.startContainer, n, w, tn, walker;\r
 \r
-                       if (t.index < t.data.length - 1) {\r
-                               l = t.data[++t.index];\r
-                               ed.setContent(l.content, {format : 'raw'});\r
-                               ed.selection.moveToBookmark(l.bookmark);\r
+                       // Delete when caret is behind a element doesn't work correctly on Gecko see #3011651\r
+                       if (!bs && r.collapsed && sc.nodeType == 1 && r.startOffset == sc.childNodes.length) {\r
+                               walker = new tinymce.dom.TreeWalker(sc.lastChild, sc);\r
 \r
-                               t.onRedo.dispatch(t, l);\r
+                               // Walk the dom backwards until we find a text node\r
+                               for (n = sc.lastChild; n; n = walker.prev()) {\r
+                                       if (n.nodeType == 3) {\r
+                                               r.setStart(n, n.nodeValue.length);\r
+                                               r.collapse(true);\r
+                                               se.setRng(r);\r
+                                               return;\r
+                                       }\r
+                               }\r
                        }\r
 \r
-                       return l;\r
-               },\r
+                       // The caret sometimes gets stuck in Gecko if you delete empty paragraphs\r
+                       // This workaround removes the element by hand and moves the caret to the previous element\r
+                       if (sc && ed.dom.isBlock(sc) && !/^(TD|TH)$/.test(sc.nodeName) && bs) {\r
+                               if (sc.childNodes.length == 0 || (sc.childNodes.length == 1 && sc.firstChild.nodeName == 'BR')) {\r
+                                       // Find previous block element\r
+                                       n = sc;\r
+                                       while ((n = n.previousSibling) && !ed.dom.isBlock(n)) ;\r
 \r
-               clear : function() {\r
-                       var t = this;\r
+                                       if (n) {\r
+                                               if (sc != b.firstChild) {\r
+                                                       // Find last text node\r
+                                                       w = ed.dom.doc.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, FALSE);\r
+                                                       while (tn = w.nextNode())\r
+                                                               n = tn;\r
 \r
-                       t.data = [];\r
-                       t.index = 0;\r
-                       t.typing = 0;\r
-                       t.add({initial : true});\r
-               },\r
+                                                       // Place caret at the end of last text node\r
+                                                       r = ed.getDoc().createRange();\r
+                                                       r.setStart(n, n.nodeValue ? n.nodeValue.length : 0);\r
+                                                       r.setEnd(n, n.nodeValue ? n.nodeValue.length : 0);\r
+                                                       se.setRng(r);\r
 \r
-               hasUndo : function() {\r
-                       return this.index != 0 || this.typing;\r
-               },\r
+                                                       // Remove the target container\r
+                                                       ed.dom.remove(sc);\r
+                                               }\r
 \r
-               hasRedo : function() {\r
-                       return this.index < this.data.length - 1;\r
+                                               return Event.cancel(e);\r
+                                       }\r
+                               }\r
+                       }\r
                }\r
-\r
-               });\r
+       });\r
 })(tinymce);\r
+\r
 (function(tinymce) {\r
        // Shorten names\r
-       var Event, isIE, isGecko, isOpera, each, extend;\r
-\r
-       Event = tinymce.dom.Event;\r
-       isIE = tinymce.isIE;\r
-       isGecko = tinymce.isGecko;\r
-       isOpera = tinymce.isOpera;\r
-       each = tinymce.each;\r
-       extend = tinymce.extend;\r
-\r
-       function isEmpty(n) {\r
-               n = n.innerHTML;\r
-               n = n.replace(/<\w+ .*?mce_\w+\"?=.*?>/gi, '-'); // Keep tags with mce_ attribs\r
-               n = n.replace(/<(img|hr|table)/gi, '-'); // Keep these convert them to - chars\r
-               n = n.replace(/<[^>]+>/g, ''); // Remove all tags\r
-\r
-               return n.replace(/[ \t\r\n]+/g, '') == '';\r
-       };\r
+       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, extend = tinymce.extend;\r
 \r
-       tinymce.create('tinymce.ForceBlocks', {\r
-               ForceBlocks : function(ed) {\r
-                       var t = this, s = ed.settings, elm;\r
+       tinymce.create('tinymce.ControlManager', {\r
+               ControlManager : function(ed, s) {\r
+                       var t = this, i;\r
 \r
+                       s = s || {};\r
                        t.editor = ed;\r
-                       t.dom = ed.dom;\r
-                       elm = (s.forced_root_block || 'p').toLowerCase();\r
-                       s.element = elm.toUpperCase();\r
-\r
-                       ed.onPreInit.add(t.setup, t);\r
-\r
-                       t.reOpera = new RegExp('(\\u00a0|&#160;|&nbsp;)<\/' + elm + '>', 'gi');\r
-                       t.rePadd = new RegExp('<p( )([^>]+)><\\\/p>|<p( )([^>]+)\\\/>|<p( )([^>]+)>\\s+<\\\/p>|<p><\\\/p>|<p\\\/>|<p>\\s+<\\\/p>'.replace(/p/g, elm), 'gi');\r
-                       t.reNbsp2BR1 = new RegExp('<p( )([^>]+)>[\\s\\u00a0]+<\\\/p>|<p>[\\s\\u00a0]+<\\\/p>'.replace(/p/g, elm), 'gi');\r
-                       t.reNbsp2BR2 = new RegExp('<%p()([^>]+)>(&nbsp;|&#160;)<\\\/%p>|<%p>(&nbsp;|&#160;)<\\\/%p>'.replace(/%p/g, elm), 'gi');\r
-                       t.reBR2Nbsp = new RegExp('<p( )([^>]+)>\\s*<br \\\/>\\s*<\\\/p>|<p>\\s*<br \\\/>\\s*<\\\/p>'.replace(/p/g, elm), 'gi');\r
+                       t.controls = {};\r
+                       t.onAdd = new tinymce.util.Dispatcher(t);\r
+                       t.onPostRender = new tinymce.util.Dispatcher(t);\r
+                       t.prefix = s.prefix || ed.id + '_';\r
+                       t._cls = {};\r
 \r
-                       function padd(ed, o) {\r
-                               if (isOpera)\r
-                                       o.content = o.content.replace(t.reOpera, '</' + elm + '>');\r
+                       t.onPostRender.add(function() {\r
+                               each(t.controls, function(c) {\r
+                                       c.postRender();\r
+                               });\r
+                       });\r
+               },\r
 \r
-                               o.content = o.content.replace(t.rePadd, '<' + elm + '$1$2$3$4$5$6>\u00a0</' + elm + '>');\r
+               get : function(id) {\r
+                       return this.controls[this.prefix + id] || this.controls[id];\r
+               },\r
 \r
-                               if (!isIE && !isOpera && o.set) {\r
-                                       // Use &nbsp; instead of BR in padded paragraphs\r
-                                       o.content = o.content.replace(t.reNbsp2BR1, '<' + elm + '$1$2><br /></' + elm + '>');\r
-                                       o.content = o.content.replace(t.reNbsp2BR2, '<' + elm + '$1$2><br /></' + elm + '>');\r
-                               } else\r
-                                       o.content = o.content.replace(t.reBR2Nbsp, '<' + elm + '$1$2>\u00a0</' + elm + '>');\r
-                       };\r
+               setActive : function(id, s) {\r
+                       var c = null;\r
 \r
-                       ed.onBeforeSetContent.add(padd);\r
-                       ed.onPostProcess.add(padd);\r
+                       if (c = this.get(id))\r
+                               c.setActive(s);\r
 \r
-                       if (s.forced_root_block) {\r
-                               ed.onInit.add(t.forceRoots, t);\r
-                               ed.onSetContent.add(t.forceRoots, t);\r
-                               ed.onBeforeGetContent.add(t.forceRoots, t);\r
-                       }\r
+                       return c;\r
                },\r
 \r
-               setup : function() {\r
-                       var t = this, ed = t.editor, s = ed.settings;\r
+               setDisabled : function(id, s) {\r
+                       var c = null;\r
 \r
-                       // Force root blocks when typing and when getting output\r
-                       if (s.forced_root_block) {\r
-                               ed.onKeyUp.add(t.forceRoots, t);\r
-                               ed.onPreProcess.add(t.forceRoots, t);\r
-                       }\r
+                       if (c = this.get(id))\r
+                               c.setDisabled(s);\r
 \r
-                       if (s.force_br_newlines) {\r
-                               // Force IE to produce BRs on enter\r
-                               if (isIE) {\r
-                                       ed.onKeyPress.add(function(ed, e) {\r
-                                               var n, s = ed.selection;\r
+                       return c;\r
+               },\r
 \r
-                                               if (e.keyCode == 13 && s.getNode().nodeName != 'LI') {\r
-                                                       s.setContent('<br id="__" /> ', {format : 'raw'});\r
-                                                       n = ed.dom.get('__');\r
-                                                       n.removeAttribute('id');\r
-                                                       s.select(n);\r
-                                                       s.collapse();\r
-                                                       return Event.cancel(e);\r
-                                               }\r
-                                       });\r
-                               }\r
+               add : function(c) {\r
+                       var t = this;\r
 \r
-                               return;\r
+                       if (c) {\r
+                               t.controls[c.id] = c;\r
+                               t.onAdd.dispatch(c, t);\r
                        }\r
 \r
-                       if (!isIE && s.force_p_newlines) {\r
-/*                             ed.onPreProcess.add(function(ed, o) {\r
-                                       each(ed.dom.select('br', o.node), function(n) {\r
-                                               var p = n.parentNode;\r
+                       return c;\r
+               },\r
 \r
-                                               // Replace <p><br /></p> with <p>&nbsp;</p>\r
-                                               if (p && p.nodeName == 'p' && (p.childNodes.length == 1 || p.lastChild == n)) {\r
-                                                       p.replaceChild(ed.getDoc().createTextNode('\u00a0'), n);\r
-                                               }\r
-                                       });\r
-                               });*/\r
+               createControl : function(n) {\r
+                       var c, t = this, ed = t.editor;\r
 \r
-                               ed.onKeyPress.add(function(ed, e) {\r
-                                       if (e.keyCode == 13 && !e.shiftKey) {\r
-                                               if (!t.insertPara(e))\r
-                                                       Event.cancel(e);\r
-                                       }\r
-                               });\r
+                       each(ed.plugins, function(p) {\r
+                               if (p.createControl) {\r
+                                       c = p.createControl(n, t);\r
 \r
-                               if (isGecko) {\r
-                                       ed.onKeyDown.add(function(ed, e) {\r
-                                               if ((e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey)\r
-                                                       t.backspaceDelete(e, e.keyCode == 8);\r
-                                       });\r
+                                       if (c)\r
+                                               return false;\r
                                }\r
+                       });\r
+\r
+                       switch (n) {\r
+                               case "|":\r
+                               case "separator":\r
+                                       return t.createSeparator();\r
                        }\r
 \r
-                       function ren(rn, na) {\r
-                               var ne = ed.dom.create(na);\r
+                       if (!c && ed.buttons && (c = ed.buttons[n]))\r
+                               return t.createButton(n, c);\r
 \r
-                               each(rn.attributes, function(a) {\r
-                                       if (a.specified && a.nodeValue)\r
-                                               ne.setAttribute(a.nodeName.toLowerCase(), a.nodeValue);\r
-                               });\r
+                       return t.add(c);\r
+               },\r
 \r
-                               each(rn.childNodes, function(n) {\r
-                                       ne.appendChild(n.cloneNode(true));\r
-                               });\r
+               createDropMenu : function(id, s, cc) {\r
+                       var t = this, ed = t.editor, c, bm, v, cls;\r
 \r
-                               rn.parentNode.replaceChild(ne, rn);\r
+                       s = extend({\r
+                               'class' : 'mceDropDown',\r
+                               constrain : ed.settings.constrain_menus\r
+                       }, s);\r
 \r
-                               return ne;\r
-                       };\r
+                       s['class'] = s['class'] + ' ' + ed.getParam('skin') + 'Skin';\r
+                       if (v = ed.getParam('skin_variant'))\r
+                               s['class'] += ' ' + ed.getParam('skin') + 'Skin' + v.substring(0, 1).toUpperCase() + v.substring(1);\r
 \r
-                       // IE specific fixes\r
-                       if (isIE) {\r
-                               // Remove empty inline elements within block elements\r
-                               // For example: <p><strong><em></em></strong></p>\r
-                               ed.onPreProcess.add(function(ed, o) {\r
-                                       each(ed.dom.select('p,h1,h2,h3,h4,h5,h6,div', o.node), function(p) {\r
-                                               if (isEmpty(p))\r
-                                                       p.innerHTML = '';\r
-                                       });\r
+                       id = t.prefix + id;\r
+                       cls = cc || t._cls.dropmenu || tinymce.ui.DropMenu;\r
+                       c = t.controls[id] = new cls(id, s);\r
+                       c.onAddItem.add(function(c, o) {\r
+                               var s = o.settings;\r
+\r
+                               s.title = ed.getLang(s.title, s.title);\r
+\r
+                               if (!s.onclick) {\r
+                                       s.onclick = function(v) {\r
+                                               if (s.cmd)\r
+                                                       ed.execCommand(s.cmd, s.ui || false, s.value);\r
+                                       };\r
+                               }\r
+                       });\r
+\r
+                       ed.onRemove.add(function() {\r
+                               c.destroy();\r
+                       });\r
+\r
+                       // Fix for bug #1897785, #1898007\r
+                       if (tinymce.isIE) {\r
+                               c.onShowMenu.add(function() {\r
+                                       // IE 8 needs focus in order to store away a range with the current collapsed caret location\r
+                                       ed.focus();\r
+\r
+                                       bm = ed.selection.getBookmark(1);\r
                                });\r
 \r
-                               // Replaces IE:s auto generated paragraphs with the specified element name\r
-                               if (s.element != 'P') {\r
-                                       ed.onKeyPress.add(function(ed, e) {\r
-                                               t.lastElm = ed.selection.getNode().nodeName;\r
-                                       });\r
+                               c.onHideMenu.add(function() {\r
+                                       if (bm) {\r
+                                               ed.selection.moveToBookmark(bm);\r
+                                               bm = 0;\r
+                                       }\r
+                               });\r
+                       }\r
 \r
-                                       ed.onKeyUp.add(function(ed, e) {\r
-                                               var bl, sel = ed.selection, n = sel.getNode(), b = ed.getBody();\r
+                       return t.add(c);\r
+               },\r
 \r
-                                               if (b.childNodes.length === 1 && n.nodeName == 'P') {\r
-                                                       n = ren(n, s.element);\r
-                                                       sel.select(n);\r
-                                                       sel.collapse();\r
-                                                       ed.nodeChanged();\r
-                                               } else if (e.keyCode == 13 && !e.shiftKey && t.lastElm != 'P') {\r
-                                                       bl = ed.dom.getParent(n, 'p');\r
+               createListBox : function(id, s, cc) {\r
+                       var t = this, ed = t.editor, cmd, c, cls;\r
 \r
-                                                       if (bl) {\r
-                                                               ren(bl, s.element);\r
-                                                               ed.nodeChanged();\r
-                                                       }\r
-                                               }\r
+                       if (t.get(id))\r
+                               return null;\r
+\r
+                       s.title = ed.translate(s.title);\r
+                       s.scope = s.scope || ed;\r
+\r
+                       if (!s.onselect) {\r
+                               s.onselect = function(v) {\r
+                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
+                               };\r
+                       }\r
+\r
+                       s = extend({\r
+                               title : s.title,\r
+                               'class' : 'mce_' + id,\r
+                               scope : s.scope,\r
+                               control_manager : t\r
+                       }, s);\r
+\r
+                       id = t.prefix + id;\r
+\r
+                       if (ed.settings.use_native_selects)\r
+                               c = new tinymce.ui.NativeListBox(id, s);\r
+                       else {\r
+                               cls = cc || t._cls.listbox || tinymce.ui.ListBox;\r
+                               c = new cls(id, s);\r
+                       }\r
+\r
+                       t.controls[id] = c;\r
+\r
+                       // Fix focus problem in Safari\r
+                       if (tinymce.isWebKit) {\r
+                               c.onPostRender.add(function(c, n) {\r
+                                       // Store bookmark on mousedown\r
+                                       Event.add(n, 'mousedown', function() {\r
+                                               ed.bookmark = ed.selection.getBookmark(1);\r
                                        });\r
-                               }\r
+\r
+                                       // Restore on focus, since it might be lost\r
+                                       Event.add(n, 'focus', function() {\r
+                                               ed.selection.moveToBookmark(ed.bookmark);\r
+                                               ed.bookmark = null;\r
+                                       });\r
+                               });\r
                        }\r
+\r
+                       if (c.hideMenu)\r
+                               ed.onMouseDown.add(c.hideMenu, c);\r
+\r
+                       return t.add(c);\r
                },\r
 \r
-               find : function(n, t, s) {\r
-                       var ed = this.editor, w = ed.getDoc().createTreeWalker(n, 4, null, false), c = -1;\r
+               createButton : function(id, s, cc) {\r
+                       var t = this, ed = t.editor, o, c, cls;\r
 \r
-                       while (n = w.nextNode()) {\r
-                               c++;\r
+                       if (t.get(id))\r
+                               return null;\r
 \r
-                               // Index by node\r
-                               if (t == 0 && n == s)\r
-                                       return c;\r
+                       s.title = ed.translate(s.title);\r
+                       s.label = ed.translate(s.label);\r
+                       s.scope = s.scope || ed;\r
 \r
-                               // Node by index\r
-                               if (t == 1 && c == s)\r
-                                       return n;\r
+                       if (!s.onclick && !s.menu_button) {\r
+                               s.onclick = function() {\r
+                                       ed.execCommand(s.cmd, s.ui || false, s.value);\r
+                               };\r
                        }\r
 \r
-                       return -1;\r
+                       s = extend({\r
+                               title : s.title,\r
+                               'class' : 'mce_' + id,\r
+                               unavailable_prefix : ed.getLang('unavailable', ''),\r
+                               scope : s.scope,\r
+                               control_manager : t\r
+                       }, s);\r
+\r
+                       id = t.prefix + id;\r
+\r
+                       if (s.menu_button) {\r
+                               cls = cc || t._cls.menubutton || tinymce.ui.MenuButton;\r
+                               c = new cls(id, s);\r
+                               ed.onMouseDown.add(c.hideMenu, c);\r
+                       } else {\r
+                               cls = t._cls.button || tinymce.ui.Button;\r
+                               c = new cls(id, s);\r
+                       }\r
+\r
+                       return t.add(c);\r
                },\r
 \r
-               forceRoots : function(ed, e) {\r
-                       var t = this, ed = t.editor, b = ed.getBody(), d = ed.getDoc(), se = ed.selection, s = se.getSel(), r = se.getRng(), si = -2, ei, so, eo, tr, c = -0xFFFFFF;\r
-                       var nx, bl, bp, sp, le, nl = b.childNodes, i, n, eid;\r
+               createMenuButton : function(id, s, cc) {\r
+                       s = s || {};\r
+                       s.menu_button = 1;\r
 \r
-                       // Fix for bug #1863847\r
-                       //if (e && e.keyCode == 13)\r
-                       //      return true;\r
+                       return this.createButton(id, s, cc);\r
+               },\r
 \r
-                       // Wrap non blocks into blocks\r
-                       for (i = nl.length - 1; i >= 0; i--) {\r
-                               nx = nl[i];\r
+               createSplitButton : function(id, s, cc) {\r
+                       var t = this, ed = t.editor, cmd, c, cls;\r
 \r
-                               // Is text or non block element\r
-                               if (nx.nodeType == 3 || (!t.dom.isBlock(nx) && nx.nodeType != 8)) {\r
-                                       if (!bl) {\r
-                                               // Create new block but ignore whitespace\r
-                                               if (nx.nodeType != 3 || /[^\s]/g.test(nx.nodeValue)) {\r
-                                                       // Store selection\r
-                                                       if (si == -2 && r) {\r
-                                                               if (!isIE) {\r
-                                                                       // If selection is element then mark it\r
-                                                                       if (r.startContainer.nodeType == 1 && (n = r.startContainer.childNodes[r.startOffset]) && n.nodeType == 1) {\r
-                                                                               // Save the id of the selected element\r
-                                                                               eid = n.getAttribute("id");\r
-                                                                               n.setAttribute("id", "__mce");\r
-                                                                       } else {\r
-                                                                               // If element is inside body, might not be the case in contentEdiable mode\r
-                                                                               if (ed.dom.getParent(r.startContainer, function(e) {return e === b;})) {\r
-                                                                                       so = r.startOffset;\r
-                                                                                       eo = r.endOffset;\r
-                                                                                       si = t.find(b, 0, r.startContainer);\r
-                                                                                       ei = t.find(b, 0, r.endContainer);\r
-                                                                               }\r
-                                                                       }\r
-                                                               } else {\r
-                                                                       tr = d.body.createTextRange();\r
-                                                                       tr.moveToElementText(b);\r
-                                                                       tr.collapse(1);\r
-                                                                       bp = tr.move('character', c) * -1;\r
+                       if (t.get(id))\r
+                               return null;\r
 \r
-                                                                       tr = r.duplicate();\r
-                                                                       tr.collapse(1);\r
-                                                                       sp = tr.move('character', c) * -1;\r
+                       s.title = ed.translate(s.title);\r
+                       s.scope = s.scope || ed;\r
 \r
-                                                                       tr = r.duplicate();\r
-                                                                       tr.collapse(0);\r
-                                                                       le = (tr.move('character', c) * -1) - sp;\r
+                       if (!s.onclick) {\r
+                               s.onclick = function(v) {\r
+                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
+                               };\r
+                       }\r
 \r
-                                                                       si = sp - bp;\r
-                                                                       ei = le;\r
-                                                               }\r
-                                                       }\r
+                       if (!s.onselect) {\r
+                               s.onselect = function(v) {\r
+                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
+                               };\r
+                       }\r
 \r
-                                                       bl = ed.dom.create(ed.settings.forced_root_block);\r
-                                                       bl.appendChild(nx.cloneNode(1));\r
-                                                       nx.parentNode.replaceChild(bl, nx);\r
-                                               }\r
-                                       } else {\r
-                                               if (bl.hasChildNodes())\r
-                                                       bl.insertBefore(nx, bl.firstChild);\r
-                                               else\r
-                                                       bl.appendChild(nx);\r
+                       s = extend({\r
+                               title : s.title,\r
+                               'class' : 'mce_' + id,\r
+                               scope : s.scope,\r
+                               control_manager : t\r
+                       }, s);\r
+\r
+                       id = t.prefix + id;\r
+                       cls = cc || t._cls.splitbutton || tinymce.ui.SplitButton;\r
+                       c = t.add(new cls(id, s));\r
+                       ed.onMouseDown.add(c.hideMenu, c);\r
+\r
+                       return c;\r
+               },\r
+\r
+               createColorSplitButton : function(id, s, cc) {\r
+                       var t = this, ed = t.editor, cmd, c, cls, bm;\r
+\r
+                       if (t.get(id))\r
+                               return null;\r
+\r
+                       s.title = ed.translate(s.title);\r
+                       s.scope = s.scope || ed;\r
+\r
+                       if (!s.onclick) {\r
+                               s.onclick = function(v) {\r
+                                       if (tinymce.isIE)\r
+                                               bm = ed.selection.getBookmark(1);\r
+\r
+                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
+                               };\r
+                       }\r
+\r
+                       if (!s.onselect) {\r
+                               s.onselect = function(v) {\r
+                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
+                               };\r
+                       }\r
+\r
+                       s = extend({\r
+                               title : s.title,\r
+                               'class' : 'mce_' + id,\r
+                               'menu_class' : ed.getParam('skin') + 'Skin',\r
+                               scope : s.scope,\r
+                               more_colors_title : ed.getLang('more_colors')\r
+                       }, s);\r
+\r
+                       id = t.prefix + id;\r
+                       cls = cc || t._cls.colorsplitbutton || tinymce.ui.ColorSplitButton;\r
+                       c = new cls(id, s);\r
+                       ed.onMouseDown.add(c.hideMenu, c);\r
+\r
+                       // Remove the menu element when the editor is removed\r
+                       ed.onRemove.add(function() {\r
+                               c.destroy();\r
+                       });\r
+\r
+                       // Fix for bug #1897785, #1898007\r
+                       if (tinymce.isIE) {\r
+                               c.onShowMenu.add(function() {\r
+                                       // IE 8 needs focus in order to store away a range with the current collapsed caret location\r
+                                       ed.focus();\r
+                                       bm = ed.selection.getBookmark(1);\r
+                               });\r
+\r
+                               c.onHideMenu.add(function() {\r
+                                       if (bm) {\r
+                                               ed.selection.moveToBookmark(bm);\r
+                                               bm = 0;\r
                                        }\r
+                               });\r
+                       }\r
+\r
+                       return t.add(c);\r
+               },\r
+\r
+               createToolbar : function(id, s, cc) {\r
+                       var c, t = this, cls;\r
+\r
+                       id = t.prefix + id;\r
+                       cls = cc || t._cls.toolbar || tinymce.ui.Toolbar;\r
+                       c = new cls(id, s);\r
+\r
+                       if (t.get(id))\r
+                               return null;\r
+\r
+                       return t.add(c);\r
+               },\r
+\r
+               createSeparator : function(cc) {\r
+                       var cls = cc || this._cls.separator || tinymce.ui.Separator;\r
+\r
+                       return new cls();\r
+               },\r
+\r
+               setControlType : function(n, c) {\r
+                       return this._cls[n.toLowerCase()] = c;\r
+               },\r
+       \r
+               destroy : function() {\r
+                       each(this.controls, function(c) {\r
+                               c.destroy();\r
+                       });\r
+\r
+                       this.controls = null;\r
+               }\r
+       });\r
+})(tinymce);\r
+\r
+(function(tinymce) {\r
+       var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isIE = tinymce.isIE, isOpera = tinymce.isOpera;\r
+\r
+       tinymce.create('tinymce.WindowManager', {\r
+               WindowManager : function(ed) {\r
+                       var t = this;\r
+\r
+                       t.editor = ed;\r
+                       t.onOpen = new Dispatcher(t);\r
+                       t.onClose = new Dispatcher(t);\r
+                       t.params = {};\r
+                       t.features = {};\r
+               },\r
+\r
+               open : function(s, p) {\r
+                       var t = this, f = '', x, y, mo = t.editor.settings.dialog_type == 'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(), u;\r
+\r
+                       // Default some options\r
+                       s = s || {};\r
+                       p = p || {};\r
+                       sw = isOpera ? vp.w : screen.width; // Opera uses windows inside the Opera window\r
+                       sh = isOpera ? vp.h : screen.height;\r
+                       s.name = s.name || 'mc_' + new Date().getTime();\r
+                       s.width = parseInt(s.width || 320);\r
+                       s.height = parseInt(s.height || 240);\r
+                       s.resizable = true;\r
+                       s.left = s.left || parseInt(sw / 2.0) - (s.width / 2.0);\r
+                       s.top = s.top || parseInt(sh / 2.0) - (s.height / 2.0);\r
+                       p.inline = false;\r
+                       p.mce_width = s.width;\r
+                       p.mce_height = s.height;\r
+                       p.mce_auto_focus = s.auto_focus;\r
+\r
+                       if (mo) {\r
+                               if (isIE) {\r
+                                       s.center = true;\r
+                                       s.help = false;\r
+                                       s.dialogWidth = s.width + 'px';\r
+                                       s.dialogHeight = s.height + 'px';\r
+                                       s.scroll = s.scrollbars || false;\r
+                               }\r
+                       }\r
+\r
+                       // Build features string\r
+                       each(s, function(v, k) {\r
+                               if (tinymce.is(v, 'boolean'))\r
+                                       v = v ? 'yes' : 'no';\r
+\r
+                               if (!/^(name|url)$/.test(k)) {\r
+                                       if (isIE && mo)\r
+                                               f += (f ? ';' : '') + k + ':' + v;\r
+                                       else\r
+                                               f += (f ? ',' : '') + k + '=' + v;\r
+                               }\r
+                       });\r
+\r
+                       t.features = s;\r
+                       t.params = p;\r
+                       t.onOpen.dispatch(t, s, p);\r
+\r
+                       u = s.url || s.file;\r
+                       u = tinymce._addVer(u);\r
+\r
+                       try {\r
+                               if (isIE && mo) {\r
+                                       w = 1;\r
+                                       window.showModalDialog(u, window, f);\r
                                } else\r
-                                       bl = null; // Time to create new block\r
+                                       w = window.open(u, s.name, f);\r
+                       } catch (ex) {\r
+                               // Ignore\r
                        }\r
 \r
-                       // Restore selection\r
-                       if (si != -2) {\r
-                               if (!isIE) {\r
-                                       bl = b.getElementsByTagName(ed.settings.element)[0];\r
-                                       r = d.createRange();\r
+                       if (!w)\r
+                               alert(t.editor.getLang('popup_blocked'));\r
+               },\r
+\r
+               close : function(w) {\r
+                       w.close();\r
+                       this.onClose.dispatch(this);\r
+               },\r
 \r
-                                       // Select last location or generated block\r
-                                       if (si != -1)\r
-                                               r.setStart(t.find(b, 1, si), so);\r
-                                       else\r
-                                               r.setStart(bl, 0);\r
+               createInstance : function(cl, a, b, c, d, e) {\r
+                       var f = tinymce.resolve(cl);\r
 \r
-                                       // Select last location or generated block\r
-                                       if (ei != -1)\r
-                                               r.setEnd(t.find(b, 1, ei), eo);\r
-                                       else\r
-                                               r.setEnd(bl, 0);\r
+                       return new f(a, b, c, d, e);\r
+               },\r
 \r
-                                       if (s) {\r
-                                               s.removeAllRanges();\r
-                                               s.addRange(r);\r
-                                       }\r
-                               } else {\r
-                                       try {\r
-                                               r = s.createRange();\r
-                                               r.moveToElementText(b);\r
-                                               r.collapse(1);\r
-                                               r.moveStart('character', si);\r
-                                               r.moveEnd('character', ei);\r
-                                               r.select();\r
-                                       } catch (ex) {\r
-                                               // Ignore\r
-                                       }\r
-                               }\r
-                       } else if (!isIE && (n = ed.dom.get('__mce'))) {\r
-                               // Restore the id of the selected element\r
-                               if (eid)\r
-                                       n.setAttribute('id', eid);\r
-                               else\r
-                                       n.removeAttribute('id');\r
+               confirm : function(t, cb, s, w) {\r
+                       w = w || window;\r
 \r
-                               // Move caret before selected element\r
-                               r = d.createRange();\r
-                               r.setStartBefore(n);\r
-                               r.setEndBefore(n);\r
-                               se.setRng(r);\r
-                       }\r
+                       cb.call(s || this, w.confirm(this._decode(this.editor.getLang(t, t))));\r
                },\r
 \r
-               getParentBlock : function(n) {\r
-                       var d = this.dom;\r
+               alert : function(tx, cb, s, w) {\r
+                       var t = this;\r
 \r
-                       return d.getParent(n, d.isBlock);\r
+                       w = w || window;\r
+                       w.alert(t._decode(t.editor.getLang(tx, tx)));\r
+\r
+                       if (cb)\r
+                               cb.call(s || t);\r
                },\r
 \r
-               insertPara : function(e) {\r
-                       var t = this, ed = t.editor, dom = ed.dom, d = ed.getDoc(), se = ed.settings, s = ed.selection.getSel(), r = s.getRangeAt(0), b = d.body;\r
-                       var rb, ra, dir, sn, so, en, eo, sb, eb, bn, bef, aft, sc, ec, n, vp = dom.getViewPort(ed.getWin()), y, ch, car;\r
+               resizeBy : function(dw, dh, win) {\r
+                       win.resizeBy(dw, dh);\r
+               },\r
 \r
-                       // If root blocks are forced then use Operas default behavior since it's really good\r
-// Removed due to bug: #1853816\r
-//                     if (se.forced_root_block && isOpera)\r
-//                             return true;\r
+               // Internal functions\r
 \r
-                       // Setup before range\r
-                       rb = d.createRange();\r
+               _decode : function(s) {\r
+                       return tinymce.DOM.decode(s).replace(/\\n/g, '\n');\r
+               }\r
+       });\r
+}(tinymce));\r
+(function(tinymce) {\r
+       function CommandManager() {\r
+               var execCommands = {}, queryStateCommands = {}, queryValueCommands = {};\r
 \r
-                       // If is before the first block element and in body, then move it into first block element\r
-                       rb.setStart(s.anchorNode, s.anchorOffset);\r
-                       rb.collapse(true);\r
+               function add(collection, cmd, func, scope) {\r
+                       if (typeof(cmd) == 'string')\r
+                               cmd = [cmd];\r
 \r
-                       // Setup after range\r
-                       ra = d.createRange();\r
+                       tinymce.each(cmd, function(cmd) {\r
+                               collection[cmd.toLowerCase()] = {func : func, scope : scope};\r
+                       });\r
+               };\r
 \r
-                       // If is before the first block element and in body, then move it into first block element\r
-                       ra.setStart(s.focusNode, s.focusOffset);\r
-                       ra.collapse(true);\r
+               tinymce.extend(this, {\r
+                       add : function(cmd, func, scope) {\r
+                               add(execCommands, cmd, func, scope);\r
+                       },\r
 \r
-                       // Setup start/end points\r
-                       dir = rb.compareBoundaryPoints(rb.START_TO_END, ra) < 0;\r
-                       sn = dir ? s.anchorNode : s.focusNode;\r
-                       so = dir ? s.anchorOffset : s.focusOffset;\r
-                       en = dir ? s.focusNode : s.anchorNode;\r
-                       eo = dir ? s.focusOffset : s.anchorOffset;\r
+                       addQueryStateHandler : function(cmd, func, scope) {\r
+                               add(queryStateCommands, cmd, func, scope);\r
+                       },\r
 \r
-                       // If selection is in empty table cell\r
-                       if (sn === en && /^(TD|TH)$/.test(sn.nodeName)) {\r
-                               dom.remove(sn.firstChild); // Remove BR\r
+                       addQueryValueHandler : function(cmd, func, scope) {\r
+                               add(queryValueCommands, cmd, func, scope);\r
+                       },\r
 \r
-                               // Create two new block elements\r
-                               ed.dom.add(sn, se.element, null, '<br />');\r
-                               aft = ed.dom.add(sn, se.element, null, '<br />');\r
+                       execCommand : function(scope, cmd, ui, value, args) {\r
+                               if (cmd = execCommands[cmd.toLowerCase()]) {\r
+                                       if (cmd.func.call(scope || cmd.scope, ui, value, args) !== false)\r
+                                               return true;\r
+                               }\r
+                       },\r
 \r
-                               // Move caret into the last one\r
-                               r = d.createRange();\r
-                               r.selectNodeContents(aft);\r
-                               r.collapse(1);\r
-                               ed.selection.setRng(r);\r
+                       queryCommandValue : function() {\r
+                               if (cmd = queryValueCommands[cmd.toLowerCase()])\r
+                                       return cmd.func.call(scope || cmd.scope, ui, value, args);\r
+                       },\r
 \r
-                               return false;\r
+                       queryCommandState : function() {\r
+                               if (cmd = queryStateCommands[cmd.toLowerCase()])\r
+                                       return cmd.func.call(scope || cmd.scope, ui, value, args);\r
                        }\r
+               });\r
+       };\r
 \r
-                       // If the caret is in an invalid location in FF we need to move it into the first block\r
-                       if (sn == b && en == b && b.firstChild && ed.dom.isBlock(b.firstChild)) {\r
-                               sn = en = sn.firstChild;\r
-                               so = eo = 0;\r
-                               rb = d.createRange();\r
-                               rb.setStart(sn, 0);\r
-                               ra = d.createRange();\r
-                               ra.setStart(en, 0);\r
-                       }\r
+       tinymce.GlobalCommands = new CommandManager();\r
+})(tinymce);\r
+(function(tinymce) {\r
+       tinymce.Formatter = function(ed) {\r
+               var formats = {},\r
+                       each = tinymce.each,\r
+                       dom = ed.dom,\r
+                       selection = ed.selection,\r
+                       TreeWalker = tinymce.dom.TreeWalker,\r
+                       rangeUtils = new tinymce.dom.RangeUtils(dom),\r
+                       isValid = ed.schema.isValid,\r
+                       isBlock = dom.isBlock,\r
+                       forcedRootBlock = ed.settings.forced_root_block,\r
+                       nodeIndex = dom.nodeIndex,\r
+                       INVISIBLE_CHAR = '\uFEFF',\r
+                       MCE_ATTR_RE = /^(src|href|style)$/,\r
+                       FALSE = false,\r
+                       TRUE = true,\r
+                       undefined,\r
+                       pendingFormats = {apply : [], remove : []};\r
+\r
+               function isArray(obj) {\r
+                       return obj instanceof Array;\r
+               };\r
 \r
-                       // Never use body as start or end node\r
-                       sn = sn.nodeName == "HTML" ? d.body : sn; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes\r
-                       sn = sn.nodeName == "BODY" ? sn.firstChild : sn;\r
-                       en = en.nodeName == "HTML" ? d.body : en; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes\r
-                       en = en.nodeName == "BODY" ? en.firstChild : en;\r
+               function getParents(node, selector) {\r
+                       return dom.getParents(node, selector, dom.getRoot());\r
+               };\r
 \r
-                       // Get start and end blocks\r
-                       sb = t.getParentBlock(sn);\r
-                       eb = t.getParentBlock(en);\r
-                       bn = sb ? sb.nodeName : se.element; // Get block name to create\r
+               function isCaretNode(node) {\r
+                       return node.nodeType === 1 && (node.face === 'mceinline' || node.style.fontFamily === 'mceinline');\r
+               };\r
 \r
-                       // Return inside list use default browser behavior\r
-                       if (t.dom.getParent(sb, 'ol,ul,pre'))\r
-                               return true;\r
+               // Public functions\r
 \r
-                       // If caption or absolute layers then always generate new blocks within\r
-                       if (sb && (sb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) {\r
-                               bn = se.element;\r
-                               sb = null;\r
-                       }\r
+               function get(name) {\r
+                       return name ? formats[name] : formats;\r
+               };\r
 \r
-                       // If caption or absolute layers then always generate new blocks within\r
-                       if (eb && (eb.nodeName == 'CAPTION' || /absolute|relative|fixed/gi.test(dom.getStyle(sb, 'position', 1)))) {\r
-                               bn = se.element;\r
-                               eb = null;\r
-                       }\r
+               function register(name, format) {\r
+                       if (name) {\r
+                               if (typeof(name) !== 'string') {\r
+                                       each(name, function(format, name) {\r
+                                               register(name, format);\r
+                                       });\r
+                               } else {\r
+                                       // Force format into array and add it to internal collection\r
+                                       format = format.length ? format : [format];\r
+\r
+                                       each(format, function(format) {\r
+                                               // Set deep to false by default on selector formats this to avoid removing\r
+                                               // alignment on images inside paragraphs when alignment is changed on paragraphs\r
+                                               if (format.deep === undefined)\r
+                                                       format.deep = !format.selector;\r
+\r
+                                               // Default to true\r
+                                               if (format.split === undefined)\r
+                                                       format.split = !format.selector || format.inline;\r
+\r
+                                               // Default to true\r
+                                               if (format.remove === undefined && format.selector && !format.inline)\r
+                                                       format.remove = 'none';\r
+\r
+                                               // Mark format as a mixed format inline + block level\r
+                                               if (format.selector && format.inline) {\r
+                                                       format.mixed = true;\r
+                                                       format.block_expand = true;\r
+                                               }\r
 \r
-                       // Use P instead\r
-                       if (/(TD|TABLE|TH|CAPTION)/.test(bn) || (sb && bn == "DIV" && /left|right/gi.test(dom.getStyle(sb, 'float', 1)))) {\r
-                               bn = se.element;\r
-                               sb = eb = null;\r
+                                               // Split classes if needed\r
+                                               if (typeof(format.classes) === 'string')\r
+                                                       format.classes = format.classes.split(/\s+/);\r
+                                       });\r
+\r
+                                       formats[name] = format;\r
+                               }\r
                        }\r
+               };\r
 \r
-                       // Setup new before and after blocks\r
-                       bef = (sb && sb.nodeName == bn) ? sb.cloneNode(0) : ed.dom.create(bn);\r
-                       aft = (eb && eb.nodeName == bn) ? eb.cloneNode(0) : ed.dom.create(bn);\r
+               function apply(name, vars, node) {\r
+                       var formatList = get(name), format = formatList[0], bookmark, rng, i;\r
 \r
-                       // Remove id from after clone\r
-                       aft.removeAttribute('id');\r
+                       function moveStart(rng) {\r
+                               var container = rng.startContainer,\r
+                                       offset = rng.startOffset,\r
+                                       walker, node;\r
 \r
-                       // Is header and cursor is at the end, then force paragraph under\r
-                       if (/^(H[1-6])$/.test(bn) && sn.nodeValue && so == sn.nodeValue.length)\r
-                               aft = ed.dom.create(se.element);\r
+                               // Move startContainer/startOffset in to a suitable node\r
+                               if (container.nodeType == 1 || container.nodeValue === "") {\r
+                                       container = container.nodeType == 1 ? container.childNodes[offset] : container;\r
 \r
-                       // Find start chop node\r
-                       n = sc = sn;\r
-                       do {\r
-                               if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName))\r
-                                       break;\r
+                                       // Might fail if the offset is behind the last element in it's container\r
+                                       if (container) {\r
+                                               walker = new TreeWalker(container, container.parentNode);\r
+                                               for (node = walker.current(); node; node = walker.next()) {\r
+                                                       if (node.nodeType == 3 && !isWhiteSpaceNode(node)) {\r
+                                                               rng.setStart(node, 0);\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
 \r
-                               sc = n;\r
-                       } while ((n = n.previousSibling ? n.previousSibling : n.parentNode));\r
+                               return rng;\r
+                       };\r
 \r
-                       // Find end chop node\r
-                       n = ec = en;\r
-                       do {\r
-                               if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName))\r
-                                       break;\r
+                       function setElementFormat(elm, fmt) {\r
+                               fmt = fmt || format;\r
 \r
-                               ec = n;\r
-                       } while ((n = n.nextSibling ? n.nextSibling : n.parentNode));\r
+                               if (elm) {\r
+                                       each(fmt.styles, function(value, name) {\r
+                                               dom.setStyle(elm, name, replaceVars(value, vars));\r
+                                       });\r
 \r
-                       // Place first chop part into before block element\r
-                       if (sc.nodeName == bn)\r
-                               rb.setStart(sc, 0);\r
-                       else\r
-                               rb.setStartBefore(sc);\r
+                                       each(fmt.attributes, function(value, name) {\r
+                                               dom.setAttrib(elm, name, replaceVars(value, vars));\r
+                                       });\r
 \r
-                       rb.setEnd(sn, so);\r
-                       bef.appendChild(rb.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari\r
+                                       each(fmt.classes, function(value) {\r
+                                               value = replaceVars(value, vars);\r
 \r
-                       // Place secnd chop part within new block element\r
-                       try {\r
-                               ra.setEndAfter(ec);\r
-                       } catch(ex) {\r
-                               //console.debug(s.focusNode, s.focusOffset);\r
-                       }\r
+                                               if (!dom.hasClass(elm, value))\r
+                                                       dom.addClass(elm, value);\r
+                                       });\r
+                               }\r
+                       };\r
 \r
-                       ra.setStart(en, eo);\r
-                       aft.appendChild(ra.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari\r
+                       function applyRngStyle(rng) {\r
+                               var newWrappers = [], wrapName, wrapElm;\r
 \r
-                       // Create range around everything\r
-                       r = d.createRange();\r
-                       if (!sc.previousSibling && sc.parentNode.nodeName == bn) {\r
-                               r.setStartBefore(sc.parentNode);\r
-                       } else {\r
-                               if (rb.startContainer.nodeName == bn && rb.startOffset == 0)\r
-                                       r.setStartBefore(rb.startContainer);\r
-                               else\r
-                                       r.setStart(rb.startContainer, rb.startOffset);\r
-                       }\r
+                               // Setup wrapper element\r
+                               wrapName = format.inline || format.block;\r
+                               wrapElm = dom.create(wrapName);\r
+                               setElementFormat(wrapElm);\r
 \r
-                       if (!ec.nextSibling && ec.parentNode.nodeName == bn)\r
-                               r.setEndAfter(ec.parentNode);\r
-                       else\r
-                               r.setEnd(ra.endContainer, ra.endOffset);\r
+                               rangeUtils.walk(rng, function(nodes) {\r
+                                       var currentWrapElm;\r
 \r
-                       // Delete and replace it with new block elements\r
-                       r.deleteContents();\r
+                                       function process(node) {\r
+                                               var nodeName = node.nodeName.toLowerCase(), parentName = node.parentNode.nodeName.toLowerCase(), found;\r
 \r
-                       if (isOpera)\r
-                               ed.getWin().scrollTo(0, vp.y);\r
+                                               // Stop wrapping on br elements\r
+                                               if (isEq(nodeName, 'br')) {\r
+                                                       currentWrapElm = 0;\r
+\r
+                                                       // Remove any br elements when we wrap things\r
+                                                       if (format.block)\r
+                                                               dom.remove(node);\r
+\r
+                                                       return;\r
+                                               }\r
+\r
+                                               // If node is wrapper type\r
+                                               if (format.wrapper && matchNode(node, name, vars)) {\r
+                                                       currentWrapElm = 0;\r
+                                                       return;\r
+                                               }\r
+\r
+                                               // Can we rename the block\r
+                                               if (format.block && !format.wrapper && isTextBlock(nodeName)) {\r
+                                                       node = dom.rename(node, wrapName);\r
+                                                       setElementFormat(node);\r
+                                                       newWrappers.push(node);\r
+                                                       currentWrapElm = 0;\r
+                                                       return;\r
+                                               }\r
 \r
-                       // Never wrap blocks in blocks\r
-                       if (bef.firstChild && bef.firstChild.nodeName == bn)\r
-                               bef.innerHTML = bef.firstChild.innerHTML;\r
+                                               // Handle selector patterns\r
+                                               if (format.selector) {\r
+                                                       // Look for matching formats\r
+                                                       each(formatList, function(format) {\r
+                                                               if (dom.is(node, format.selector) && !isCaretNode(node)) {\r
+                                                                       setElementFormat(node, format);\r
+                                                                       found = true;\r
+                                                               }\r
+                                                       });\r
 \r
-                       if (aft.firstChild && aft.firstChild.nodeName == bn)\r
-                               aft.innerHTML = aft.firstChild.innerHTML;\r
+                                                       // Continue processing if a selector match wasn't found and a inline element is defined\r
+                                                       if (!format.inline || found) {\r
+                                                               currentWrapElm = 0;\r
+                                                               return;\r
+                                                       }\r
+                                               }\r
 \r
-                       // Padd empty blocks\r
-                       if (isEmpty(bef))\r
-                               bef.innerHTML = '<br />';\r
+                                               // Is it valid to wrap this item\r
+                                               if (isValid(wrapName, nodeName) && isValid(parentName, wrapName)) {\r
+                                                       // Start wrapping\r
+                                                       if (!currentWrapElm) {\r
+                                                               // Wrap the node\r
+                                                               currentWrapElm = wrapElm.cloneNode(FALSE);\r
+                                                               node.parentNode.insertBefore(currentWrapElm, node);\r
+                                                               newWrappers.push(currentWrapElm);\r
+                                                       }\r
 \r
-                       function appendStyles(e, en) {\r
-                               var nl = [], nn, n, i;\r
+                                                       currentWrapElm.appendChild(node);\r
+                                               } else {\r
+                                                       // Start a new wrapper for possible children\r
+                                                       currentWrapElm = 0;\r
 \r
-                               e.innerHTML = '';\r
+                                                       each(tinymce.grep(node.childNodes), process);\r
 \r
-                               // Make clones of style elements\r
-                               if (se.keep_styles) {\r
-                                       n = en;\r
-                                       do {\r
-                                               // We only want style specific elements\r
-                                               if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(n.nodeName)) {\r
-                                                       nn = n.cloneNode(false);\r
-                                                       dom.setAttrib(nn, 'id', ''); // Remove ID since it needs to be unique\r
-                                                       nl.push(nn);\r
+                                                       // End the last wrapper\r
+                                                       currentWrapElm = 0;\r
                                                }\r
-                                       } while (n = n.parentNode);\r
-                               }\r
+                                       };\r
 \r
-                               // Append style elements to aft\r
-                               if (nl.length > 0) {\r
-                                       for (i = nl.length - 1, nn = e; i >= 0; i--)\r
-                                               nn = nn.appendChild(nl[i]);\r
+                                       // Process siblings from range\r
+                                       each(nodes, process);\r
+                               });\r
 \r
-                                       // Padd most inner style element\r
-                                       nl[0].innerHTML = isOpera ? '&nbsp;' : '<br />'; // Extra space for Opera so that the caret can move there\r
-                                       return nl[0]; // Move caret to most inner element\r
-                               } else\r
-                                       e.innerHTML = isOpera ? '&nbsp;' : '<br />'; // Extra space for Opera so that the caret can move there\r
-                       };\r
+                               // Cleanup\r
+                               each(newWrappers, function(node) {\r
+                                       var childCount;\r
 \r
-                       // Fill empty afterblook with current style\r
-                       if (isEmpty(aft))\r
-                               car = appendStyles(aft, en);\r
+                                       function getChildCount(node) {\r
+                                               var count = 0;\r
 \r
-                       // Opera needs this one backwards for older versions\r
-                       if (isOpera && parseFloat(opera.version()) < 9.5) {\r
-                               r.insertNode(bef);\r
-                               r.insertNode(aft);\r
-                       } else {\r
-                               r.insertNode(aft);\r
-                               r.insertNode(bef);\r
-                       }\r
+                                               each(node.childNodes, function(node) {\r
+                                                       if (!isWhiteSpaceNode(node) && !isBookmarkNode(node))\r
+                                                               count++;\r
+                                               });\r
 \r
-                       // Normalize\r
-                       aft.normalize();\r
-                       bef.normalize();\r
+                                               return count;\r
+                                       };\r
 \r
-                       function first(n) {\r
-                               return d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false).nextNode() || n;\r
-                       };\r
+                                       function mergeStyles(node) {\r
+                                               var child, clone;\r
 \r
-                       // Move cursor and scroll into view\r
-                       r = d.createRange();\r
-                       r.selectNodeContents(isGecko ? first(car || aft) : car || aft);\r
-                       r.collapse(1);\r
-                       s.removeAllRanges();\r
-                       s.addRange(r);\r
+                                               each(node.childNodes, function(node) {\r
+                                                       if (node.nodeType == 1 && !isBookmarkNode(node) && !isCaretNode(node)) {\r
+                                                               child = node;\r
+                                                               return FALSE; // break loop\r
+                                                       }\r
+                                               });\r
 \r
-                       // scrollIntoView seems to scroll the parent window in most browsers now including FF 3.0b4 so it's time to stop using it and do it our selfs\r
-                       y = ed.dom.getPos(aft).y;\r
-                       ch = aft.clientHeight;\r
+                                               // If child was found and of the same type as the current node\r
+                                               if (child && matchName(child, format)) {\r
+                                                       clone = child.cloneNode(FALSE);\r
+                                                       setElementFormat(clone);\r
 \r
-                       // Is element within viewport\r
-                       if (y < vp.y || y + ch > vp.y + vp.h) {\r
-                               ed.getWin().scrollTo(0, y < vp.y ? y : y - vp.h + 25); // Needs to be hardcoded to roughly one line of text if a huge text block is broken into two blocks\r
-                               //console.debug('SCROLL!', 'vp.y: ' + vp.y, 'y' + y, 'vp.h' + vp.h, 'clientHeight' + aft.clientHeight, 'yyy: ' + (y < vp.y ? y : y - vp.h + aft.clientHeight));\r
-                       }\r
+                                                       dom.replace(clone, node, TRUE);\r
+                                                       dom.remove(child, 1);\r
+                                               }\r
 \r
-                       return false;\r
-               },\r
+                                               return clone || node;\r
+                                       };\r
 \r
-               backspaceDelete : function(e, bs) {\r
-                       var t = this, ed = t.editor, b = ed.getBody(), n, se = ed.selection, r = se.getRng(), sc = r.startContainer, n, w, tn;\r
+                                       childCount = getChildCount(node);\r
 \r
-                       // The caret sometimes gets stuck in Gecko if you delete empty paragraphs\r
-                       // This workaround removes the element by hand and moves the caret to the previous element\r
-                       if (sc && ed.dom.isBlock(sc) && !/^(TD|TH)$/.test(sc.nodeName) && bs) {\r
-                               if (sc.childNodes.length == 0 || (sc.childNodes.length == 1 && sc.firstChild.nodeName == 'BR')) {\r
-                                       // Find previous block element\r
-                                       n = sc;\r
-                                       while ((n = n.previousSibling) && !ed.dom.isBlock(n)) ;\r
+                                       // Remove empty nodes\r
+                                       if (childCount === 0) {\r
+                                               dom.remove(node, 1);\r
+                                               return;\r
+                                       }\r
 \r
-                                       if (n) {\r
-                                               if (sc != b.firstChild) {\r
-                                                       // Find last text node\r
-                                                       w = ed.dom.doc.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);\r
-                                                       while (tn = w.nextNode())\r
-                                                               n = tn;\r
+                                       if (format.inline || format.wrapper) {\r
+                                               // Merges the current node with it's children of similar type to reduce the number of elements\r
+                                               if (!format.exact && childCount === 1)\r
+                                                       node = mergeStyles(node);\r
+\r
+                                               // Remove/merge children\r
+                                               each(formatList, function(format) {\r
+                                                       // Merge all children of similar type will move styles from child to parent\r
+                                                       // this: <span style="color:red"><b><span style="color:red; font-size:10px">text</span></b></span>\r
+                                                       // will become: <span style="color:red"><b><span style="font-size:10px">text</span></b></span>\r
+                                                       each(dom.select(format.inline, node), function(child) {\r
+                                                               removeFormat(format, vars, child, format.exact ? child : null);\r
+                                                       });\r
+                                               });\r
 \r
-                                                       // Place caret at the end of last text node\r
-                                                       r = ed.getDoc().createRange();\r
-                                                       r.setStart(n, n.nodeValue ? n.nodeValue.length : 0);\r
-                                                       r.setEnd(n, n.nodeValue ? n.nodeValue.length : 0);\r
-                                                       se.setRng(r);\r
+                                               // Remove child if direct parent is of same type\r
+                                               if (matchNode(node.parentNode, name, vars)) {\r
+                                                       dom.remove(node, 1);\r
+                                                       node = 0;\r
+                                                       return TRUE;\r
+                                               }\r
 \r
-                                                       // Remove the target container\r
-                                                       ed.dom.remove(sc);\r
+                                               // Look for parent with similar style format\r
+                                               if (format.merge_with_parents) {\r
+                                                       dom.getParent(node.parentNode, function(parent) {\r
+                                                               if (matchNode(parent, name, vars)) {\r
+                                                                       dom.remove(node, 1);\r
+                                                                       node = 0;\r
+                                                                       return TRUE;\r
+                                                               }\r
+                                                       });\r
                                                }\r
 \r
-                                               return Event.cancel(e);\r
+                                               // Merge next and previous siblings if they are similar <b>text</b><b>text</b> becomes <b>texttext</b>\r
+                                               if (node) {\r
+                                                       node = mergeSiblings(getNonWhiteSpaceSibling(node), node);\r
+                                                       node = mergeSiblings(node, getNonWhiteSpaceSibling(node, TRUE));\r
+                                               }\r
                                        }\r
+                               });\r
+                       };\r
+\r
+                       if (format) {\r
+                               if (node) {\r
+                                       rng = dom.createRng();\r
+\r
+                                       rng.setStartBefore(node);\r
+                                       rng.setEndAfter(node);\r
+\r
+                                       applyRngStyle(expandRng(rng, formatList));\r
+                               } else {\r
+                                       if (!selection.isCollapsed() || !format.inline) {\r
+                                               // Apply formatting to selection\r
+                                               bookmark = selection.getBookmark();\r
+                                               applyRngStyle(expandRng(selection.getRng(TRUE), formatList));\r
+\r
+                                               selection.moveToBookmark(bookmark);\r
+                                               selection.setRng(moveStart(selection.getRng(TRUE)));\r
+                                               ed.nodeChanged();\r
+                                       } else\r
+                                               performCaretAction('apply', name, vars);\r
                                }\r
                        }\r
+               };\r
 \r
-                       // Gecko generates BR elements here and there, we don't like those so lets remove them\r
-                       function handler(e) {\r
-                               var pr;\r
-\r
-                               e = e.target;\r
+               function remove(name, vars, node) {\r
+                       var formatList = get(name), format = formatList[0], bookmark, i, rng;\r
 \r
-                               // A new BR was created in a block element, remove it\r
-                               if (e && e.parentNode && e.nodeName == 'BR' && (n = t.getParentBlock(e))) {\r
-                                       pr = e.previousSibling;\r
+                       // Merges the styles for each node\r
+                       function process(node) {\r
+                               var children, i, l;\r
 \r
-                                       Event.remove(b, 'DOMNodeInserted', handler);\r
+                               // Grab the children first since the nodelist might be changed\r
+                               children = tinymce.grep(node.childNodes);\r
 \r
-                                       // Is there whitespace at the end of the node before then we might need the pesky BR\r
-                                       // to place the caret at a correct location see bug: #2013943\r
-                                       if (pr && pr.nodeType == 3 && /\s+$/.test(pr.nodeValue))\r
-                                               return;\r
+                               // Process current node\r
+                               for (i = 0, l = formatList.length; i < l; i++) {\r
+                                       if (removeFormat(formatList[i], vars, node, node))\r
+                                               break;\r
+                               }\r
 \r
-                                       // Only remove BR elements that got inserted in the middle of the text\r
-                                       if (e.previousSibling || e.nextSibling)\r
-                                               ed.dom.remove(e);\r
+                               // Process the children\r
+                               if (format.deep) {\r
+                                       for (i = 0, l = children.length; i < l; i++)\r
+                                               process(children[i]);\r
                                }\r
                        };\r
 \r
-                       // Listen for new nodes\r
-                       Event._add(b, 'DOMNodeInserted', handler);\r
+                       function findFormatRoot(container) {\r
+                               var formatRoot;\r
 \r
-                       // Remove listener\r
-                       window.setTimeout(function() {\r
-                               Event._remove(b, 'DOMNodeInserted', handler);\r
-                       }, 1);\r
-               }\r
-       });\r
-})(tinymce);\r
-(function(tinymce) {\r
-       // Shorten names\r
-       var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, extend = tinymce.extend;\r
+                               // Find format root\r
+                               each(getParents(container.parentNode).reverse(), function(parent) {\r
+                                       var format;\r
 \r
-       tinymce.create('tinymce.ControlManager', {\r
-               ControlManager : function(ed, s) {\r
-                       var t = this, i;\r
+                                       // Find format root element\r
+                                       if (!formatRoot && parent.id != '_start' && parent.id != '_end') {\r
+                                               // Is the node matching the format we are looking for\r
+                                               format = matchNode(parent, name, vars);\r
+                                               if (format && format.split !== false)\r
+                                                       formatRoot = parent;\r
+                                       }\r
+                               });\r
 \r
-                       s = s || {};\r
-                       t.editor = ed;\r
-                       t.controls = {};\r
-                       t.onAdd = new tinymce.util.Dispatcher(t);\r
-                       t.onPostRender = new tinymce.util.Dispatcher(t);\r
-                       t.prefix = s.prefix || ed.id + '_';\r
-                       t._cls = {};\r
+                               return formatRoot;\r
+                       };\r
 \r
-                       t.onPostRender.add(function() {\r
-                               each(t.controls, function(c) {\r
-                                       c.postRender();\r
-                               });\r
-                       });\r
-               },\r
+                       function wrapAndSplit(format_root, container, target, split) {\r
+                               var parent, clone, lastClone, firstClone, i, formatRootParent;\r
 \r
-               get : function(id) {\r
-                       return this.controls[this.prefix + id] || this.controls[id];\r
-               },\r
+                               // Format root found then clone formats and split it\r
+                               if (format_root) {\r
+                                       formatRootParent = format_root.parentNode;\r
 \r
-               setActive : function(id, s) {\r
-                       var c = null;\r
+                                       for (parent = container.parentNode; parent && parent != formatRootParent; parent = parent.parentNode) {\r
+                                               clone = parent.cloneNode(FALSE);\r
 \r
-                       if (c = this.get(id))\r
-                               c.setActive(s);\r
+                                               for (i = 0; i < formatList.length; i++) {\r
+                                                       if (removeFormat(formatList[i], vars, clone, clone)) {\r
+                                                               clone = 0;\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
 \r
-                       return c;\r
-               },\r
+                                               // Build wrapper node\r
+                                               if (clone) {\r
+                                                       if (lastClone)\r
+                                                               clone.appendChild(lastClone);\r
 \r
-               setDisabled : function(id, s) {\r
-                       var c = null;\r
+                                                       if (!firstClone)\r
+                                                               firstClone = clone;\r
 \r
-                       if (c = this.get(id))\r
-                               c.setDisabled(s);\r
+                                                       lastClone = clone;\r
+                                               }\r
+                                       }\r
 \r
-                       return c;\r
-               },\r
+                                       // Never split block elements if the format is mixed\r
+                                       if (split && (!format.mixed || !isBlock(format_root)))\r
+                                               container = dom.split(format_root, container);\r
 \r
-               add : function(c) {\r
-                       var t = this;\r
+                                       // Wrap container in cloned formats\r
+                                       if (lastClone) {\r
+                                               target.parentNode.insertBefore(lastClone, target);\r
+                                               firstClone.appendChild(target);\r
+                                       }\r
+                               }\r
 \r
-                       if (c) {\r
-                               t.controls[c.id] = c;\r
-                               t.onAdd.dispatch(c, t);\r
-                       }\r
+                               return container;\r
+                       };\r
 \r
-                       return c;\r
-               },\r
+                       function splitToFormatRoot(container) {\r
+                               return wrapAndSplit(findFormatRoot(container), container, container, true);\r
+                       };\r
 \r
-               createControl : function(n) {\r
-                       var c, t = this, ed = t.editor;\r
+                       function unwrap(start) {\r
+                               var node = dom.get(start ? '_start' : '_end'),\r
+                                       out = node[start ? 'firstChild' : 'lastChild'];\r
 \r
-                       each(ed.plugins, function(p) {\r
-                               if (p.createControl) {\r
-                                       c = p.createControl(n, t);\r
+                               // If the end is placed within the start the result will be removed\r
+                               // So this checks if the out node is a bookmark node if it is it\r
+                               // checks for another more suitable node\r
+                               if (isBookmarkNode(out))\r
+                                       out = out[start ? 'firstChild' : 'lastChild'];\r
 \r
-                                       if (c)\r
-                                               return false;\r
+                               dom.remove(node, true);\r
+\r
+                               return out;\r
+                       };\r
+\r
+                       function removeRngStyle(rng) {\r
+                               var startContainer, endContainer;\r
+\r
+                               rng = expandRng(rng, formatList, TRUE);\r
+\r
+                               if (format.split) {\r
+                                       startContainer = getContainer(rng, TRUE);\r
+                                       endContainer = getContainer(rng);\r
+\r
+                                       if (startContainer != endContainer) {\r
+                                               // Wrap start/end nodes in span element since these might be cloned/moved\r
+                                               startContainer = wrap(startContainer, 'span', {id : '_start', _mce_type : 'bookmark'});\r
+                                               endContainer = wrap(endContainer, 'span', {id : '_end', _mce_type : 'bookmark'});\r
+\r
+                                               // Split start/end\r
+                                               splitToFormatRoot(startContainer);\r
+                                               splitToFormatRoot(endContainer);\r
+\r
+                                               // Unwrap start/end to get real elements again\r
+                                               startContainer = unwrap(TRUE);\r
+                                               endContainer = unwrap();\r
+                                       } else\r
+                                               startContainer = endContainer = splitToFormatRoot(startContainer);\r
+\r
+                                       // Update range positions since they might have changed after the split operations\r
+                                       rng.startContainer = startContainer.parentNode;\r
+                                       rng.startOffset = nodeIndex(startContainer);\r
+                                       rng.endContainer = endContainer.parentNode;\r
+                                       rng.endOffset = nodeIndex(endContainer) + 1;\r
                                }\r
-                       });\r
 \r
-                       switch (n) {\r
-                               case "|":\r
-                               case "separator":\r
-                                       return t.createSeparator();\r
-                       }\r
+                               // Remove items between start/end\r
+                               rangeUtils.walk(rng, function(nodes) {\r
+                                       each(nodes, function(node) {\r
+                                               process(node);\r
+                                       });\r
+                               });\r
+                       };\r
 \r
-                       if (!c && ed.buttons && (c = ed.buttons[n]))\r
-                               return t.createButton(n, c);\r
+                       // Handle node\r
+                       if (node) {\r
+                               rng = dom.createRng();\r
+                               rng.setStartBefore(node);\r
+                               rng.setEndAfter(node);\r
+                               removeRngStyle(rng);\r
+                               return;\r
+                       }\r
 \r
-                       return t.add(c);\r
-               },\r
+                       if (!selection.isCollapsed() || !format.inline) {\r
+                               bookmark = selection.getBookmark();\r
+                               removeRngStyle(selection.getRng(TRUE));\r
+                               selection.moveToBookmark(bookmark);\r
+                               ed.nodeChanged();\r
+                       } else\r
+                               performCaretAction('remove', name, vars);\r
+               };\r
 \r
-               createDropMenu : function(id, s, cc) {\r
-                       var t = this, ed = t.editor, c, bm, v, cls;\r
+               function toggle(name, vars, node) {\r
+                       if (match(name, vars, node))\r
+                               remove(name, vars, node);\r
+                       else\r
+                               apply(name, vars, node);\r
+               };\r
 \r
-                       s = extend({\r
-                               'class' : 'mceDropDown',\r
-                               constrain : ed.settings.constrain_menus\r
-                       }, s);\r
+               function matchNode(node, name, vars, similar) {\r
+                       var formatList = get(name), format, i, classes;\r
 \r
-                       s['class'] = s['class'] + ' ' + ed.getParam('skin') + 'Skin';\r
-                       if (v = ed.getParam('skin_variant'))\r
-                               s['class'] += ' ' + ed.getParam('skin') + 'Skin' + v.substring(0, 1).toUpperCase() + v.substring(1);\r
+                       function matchItems(node, format, item_name) {\r
+                               var key, value, items = format[item_name], i;\r
 \r
-                       id = t.prefix + id;\r
-                       cls = cc || t._cls.dropmenu || tinymce.ui.DropMenu;\r
-                       c = t.controls[id] = new cls(id, s);\r
-                       c.onAddItem.add(function(c, o) {\r
-                               var s = o.settings;\r
+                               // Check all items\r
+                               if (items) {\r
+                                       // Non indexed object\r
+                                       if (items.length === undefined) {\r
+                                               for (key in items) {\r
+                                                       if (items.hasOwnProperty(key)) {\r
+                                                               if (item_name === 'attributes')\r
+                                                                       value = dom.getAttrib(node, key);\r
+                                                               else\r
+                                                                       value = getStyle(node, key);\r
 \r
-                               s.title = ed.getLang(s.title, s.title);\r
+                                                               if (similar && !value && !format.exact)\r
+                                                                       return;\r
 \r
-                               if (!s.onclick) {\r
-                                       s.onclick = function(v) {\r
-                                               ed.execCommand(s.cmd, s.ui || false, s.value);\r
-                                       };\r
+                                                               if ((!similar || format.exact) && !isEq(value, replaceVars(items[key], vars)))\r
+                                                                       return;\r
+                                                       }\r
+                                               }\r
+                                       } else {\r
+                                               // Only one match needed for indexed arrays\r
+                                               for (i = 0; i < items.length; i++) {\r
+                                                       if (item_name === 'attributes' ? dom.getAttrib(node, items[i]) : getStyle(node, items[i]))\r
+                                                               return format;\r
+                                               }\r
+                                       }\r
                                }\r
-                       });\r
-\r
-                       ed.onRemove.add(function() {\r
-                               c.destroy();\r
-                       });\r
 \r
-                       // Fix for bug #1897785, #1898007\r
-                       if (tinymce.isIE) {\r
-                               c.onShowMenu.add(function() {\r
-                                       // IE 8 needs focus in order to store away a range with the current collapsed caret location\r
-                                       ed.focus();\r
+                               return format;\r
+                       };\r
 \r
-                                       bm = ed.selection.getBookmark(1);\r
-                               });\r
+                       if (formatList && node) {\r
+                               // Check each format in list\r
+                               for (i = 0; i < formatList.length; i++) {\r
+                                       format = formatList[i];\r
+\r
+                                       // Name name, attributes, styles and classes\r
+                                       if (matchName(node, format) && matchItems(node, format, 'attributes') && matchItems(node, format, 'styles')) {\r
+                                               // Match classes\r
+                                               if (classes = format.classes) {\r
+                                                       for (i = 0; i < classes.length; i++) {\r
+                                                               if (!dom.hasClass(node, classes[i]))\r
+                                                                       return;\r
+                                                       }\r
+                                               }\r
 \r
-                               c.onHideMenu.add(function() {\r
-                                       if (bm) {\r
-                                               ed.selection.moveToBookmark(bm);\r
-                                               bm = 0;\r
+                                               return format;\r
                                        }\r
-                               });\r
+                               }\r
                        }\r
+               };\r
 \r
-                       return t.add(c);\r
-               },\r
-\r
-               createListBox : function(id, s, cc) {\r
-                       var t = this, ed = t.editor, cmd, c, cls;\r
+               function match(name, vars, node) {\r
+                       var startNode, i;\r
 \r
-                       if (t.get(id))\r
-                               return null;\r
+                       function matchParents(node) {\r
+                               // Find first node with similar format settings\r
+                               node = dom.getParent(node, function(node) {\r
+                                       return !!matchNode(node, name, vars, true);\r
+                               });\r
 \r
-                       s.title = ed.translate(s.title);\r
-                       s.scope = s.scope || ed;\r
+                               // Do an exact check on the similar format element\r
+                               return matchNode(node, name, vars);\r
+                       };\r
 \r
-                       if (!s.onselect) {\r
-                               s.onselect = function(v) {\r
-                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
-                               };\r
-                       }\r
+                       // Check specified node\r
+                       if (node)\r
+                               return matchParents(node);\r
 \r
-                       s = extend({\r
-                               title : s.title,\r
-                               'class' : 'mce_' + id,\r
-                               scope : s.scope,\r
-                               control_manager : t\r
-                       }, s);\r
+                       // Check pending formats\r
+                       if (selection.isCollapsed()) {\r
+                               for (i = pendingFormats.apply.length - 1; i >= 0; i--) {\r
+                                       if (pendingFormats.apply[i].name == name)\r
+                                               return true;\r
+                               }\r
 \r
-                       id = t.prefix + id;\r
+                               for (i = pendingFormats.remove.length - 1; i >= 0; i--) {\r
+                                       if (pendingFormats.remove[i].name == name)\r
+                                               return false;\r
+                               }\r
 \r
-                       if (ed.settings.use_native_selects)\r
-                               c = new tinymce.ui.NativeListBox(id, s);\r
-                       else {\r
-                               cls = cc || t._cls.listbox || tinymce.ui.ListBox;\r
-                               c = new cls(id, s);\r
+                               return matchParents(selection.getNode());\r
                        }\r
 \r
-                       t.controls[id] = c;\r
-\r
-                       // Fix focus problem in Safari\r
-                       if (tinymce.isWebKit) {\r
-                               c.onPostRender.add(function(c, n) {\r
-                                       // Store bookmark on mousedown\r
-                                       Event.add(n, 'mousedown', function() {\r
-                                               ed.bookmark = ed.selection.getBookmark('simple');\r
-                                       });\r
+                       // Check selected node\r
+                       node = selection.getNode();\r
+                       if (matchParents(node))\r
+                               return TRUE;\r
 \r
-                                       // Restore on focus, since it might be lost\r
-                                       Event.add(n, 'focus', function() {\r
-                                               ed.selection.moveToBookmark(ed.bookmark);\r
-                                               ed.bookmark = null;\r
-                                       });\r
-                               });\r
+                       // Check start node if it's different\r
+                       startNode = selection.getStart();\r
+                       if (startNode != node) {\r
+                               if (matchParents(startNode))\r
+                                       return TRUE;\r
                        }\r
 \r
-                       if (c.hideMenu)\r
-                               ed.onMouseDown.add(c.hideMenu, c);\r
+                       return FALSE;\r
+               };\r
 \r
-                       return t.add(c);\r
-               },\r
+               function matchAll(names, vars) {\r
+                       var startElement, matchedFormatNames = [], checkedMap = {}, i, ni, name;\r
 \r
-               createButton : function(id, s, cc) {\r
-                       var t = this, ed = t.editor, o, c, cls;\r
+                       // If the selection is collapsed then check pending formats\r
+                       if (selection.isCollapsed()) {\r
+                               for (ni = 0; ni < names.length; ni++) {\r
+                                       // If the name is to be removed, then stop it from being added\r
+                                       for (i = pendingFormats.remove.length - 1; i >= 0; i--) {\r
+                                               name = names[ni];\r
 \r
-                       if (t.get(id))\r
-                               return null;\r
+                                               if (pendingFormats.remove[i].name == name) {\r
+                                                       checkedMap[name] = true;\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
 \r
-                       s.title = ed.translate(s.title);\r
-                       s.label = ed.translate(s.label);\r
-                       s.scope = s.scope || ed;\r
+                               // If the format is to be applied\r
+                               for (i = pendingFormats.apply.length - 1; i >= 0; i--) {\r
+                                       for (ni = 0; ni < names.length; ni++) {\r
+                                               name = names[ni];\r
 \r
-                       if (!s.onclick && !s.menu_button) {\r
-                               s.onclick = function() {\r
-                                       ed.execCommand(s.cmd, s.ui || false, s.value);\r
-                               };\r
+                                               if (!checkedMap[name] && pendingFormats.apply[i].name == name) {\r
+                                                       checkedMap[name] = true;\r
+                                                       matchedFormatNames.push(name);\r
+                                               }\r
+                                       }\r
+                               }\r
                        }\r
 \r
-                       s = extend({\r
-                               title : s.title,\r
-                               'class' : 'mce_' + id,\r
-                               unavailable_prefix : ed.getLang('unavailable', ''),\r
-                               scope : s.scope,\r
-                               control_manager : t\r
-                       }, s);\r
-\r
-                       id = t.prefix + id;\r
+                       // Check start of selection for formats\r
+                       startElement = selection.getStart();\r
+                       dom.getParent(startElement, function(node) {\r
+                               var i, name;\r
 \r
-                       if (s.menu_button) {\r
-                               cls = cc || t._cls.menubutton || tinymce.ui.MenuButton;\r
-                               c = new cls(id, s);\r
-                               ed.onMouseDown.add(c.hideMenu, c);\r
-                       } else {\r
-                               cls = t._cls.button || tinymce.ui.Button;\r
-                               c = new cls(id, s);\r
-                       }\r
+                               for (i = 0; i < names.length; i++) {\r
+                                       name = names[i];\r
 \r
-                       return t.add(c);\r
-               },\r
+                                       if (!checkedMap[name] && matchNode(node, name, vars)) {\r
+                                               checkedMap[name] = true;\r
+                                               matchedFormatNames.push(name);\r
+                                       }\r
+                               }\r
+                       });\r
 \r
-               createMenuButton : function(id, s, cc) {\r
-                       s = s || {};\r
-                       s.menu_button = 1;\r
+                       return matchedFormatNames;\r
+               };\r
 \r
-                       return this.createButton(id, s, cc);\r
-               },\r
+               function canApply(name) {\r
+                       var formatList = get(name), startNode, parents, i, x, selector;\r
 \r
-               createSplitButton : function(id, s, cc) {\r
-                       var t = this, ed = t.editor, cmd, c, cls;\r
+                       if (formatList) {\r
+                               startNode = selection.getStart();\r
+                               parents = getParents(startNode);\r
 \r
-                       if (t.get(id))\r
-                               return null;\r
+                               for (x = formatList.length - 1; x >= 0; x--) {\r
+                                       selector = formatList[x].selector;\r
 \r
-                       s.title = ed.translate(s.title);\r
-                       s.scope = s.scope || ed;\r
+                                       // Format is not selector based, then always return TRUE\r
+                                       if (!selector)\r
+                                               return TRUE;\r
 \r
-                       if (!s.onclick) {\r
-                               s.onclick = function(v) {\r
-                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
-                               };\r
+                                       for (i = parents.length - 1; i >= 0; i--) {\r
+                                               if (dom.is(parents[i], selector))\r
+                                                       return TRUE;\r
+                                       }\r
+                               }\r
                        }\r
 \r
-                       if (!s.onselect) {\r
-                               s.onselect = function(v) {\r
-                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
-                               };\r
-                       }\r
+                       return FALSE;\r
+               };\r
 \r
-                       s = extend({\r
-                               title : s.title,\r
-                               'class' : 'mce_' + id,\r
-                               scope : s.scope,\r
-                               control_manager : t\r
-                       }, s);\r
+               // Expose to public\r
+               tinymce.extend(this, {\r
+                       get : get,\r
+                       register : register,\r
+                       apply : apply,\r
+                       remove : remove,\r
+                       toggle : toggle,\r
+                       match : match,\r
+                       matchAll : matchAll,\r
+                       matchNode : matchNode,\r
+                       canApply : canApply\r
+               });\r
 \r
-                       id = t.prefix + id;\r
-                       cls = cc || t._cls.splitbutton || tinymce.ui.SplitButton;\r
-                       c = t.add(new cls(id, s));\r
-                       ed.onMouseDown.add(c.hideMenu, c);\r
+               // Private functions\r
 \r
-                       return c;\r
-               },\r
+               function matchName(node, format) {\r
+                       // Check for inline match\r
+                       if (isEq(node, format.inline))\r
+                               return TRUE;\r
 \r
-               createColorSplitButton : function(id, s, cc) {\r
-                       var t = this, ed = t.editor, cmd, c, cls, bm;\r
+                       // Check for block match\r
+                       if (isEq(node, format.block))\r
+                               return TRUE;\r
 \r
-                       if (t.get(id))\r
-                               return null;\r
+                       // Check for selector match\r
+                       if (format.selector)\r
+                               return dom.is(node, format.selector);\r
+               };\r
 \r
-                       s.title = ed.translate(s.title);\r
-                       s.scope = s.scope || ed;\r
+               function isEq(str1, str2) {\r
+                       str1 = str1 || '';\r
+                       str2 = str2 || '';\r
 \r
-                       if (!s.onclick) {\r
-                               s.onclick = function(v) {\r
-                                       if (tinymce.isIE)\r
-                                               bm = ed.selection.getBookmark(1);\r
-       \r
-                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
-                               };\r
-                       }\r
+                       str1 = '' + (str1.nodeName || str1);\r
+                       str2 = '' + (str2.nodeName || str2);\r
 \r
-                       if (!s.onselect) {\r
-                               s.onselect = function(v) {\r
-                                       ed.execCommand(s.cmd, s.ui || false, v || s.value);\r
-                               };\r
-                       }\r
+                       return str1.toLowerCase() == str2.toLowerCase();\r
+               };\r
 \r
-                       s = extend({\r
-                               title : s.title,\r
-                               'class' : 'mce_' + id,\r
-                               'menu_class' : ed.getParam('skin') + 'Skin',\r
-                               scope : s.scope,\r
-                               more_colors_title : ed.getLang('more_colors')\r
-                       }, s);\r
+               function getStyle(node, name) {\r
+                       var styleVal = dom.getStyle(node, name);\r
 \r
-                       id = t.prefix + id;\r
-                       cls = cc || t._cls.colorsplitbutton || tinymce.ui.ColorSplitButton;\r
-                       c = new cls(id, s);\r
-                       ed.onMouseDown.add(c.hideMenu, c);\r
+                       // Force the format to hex\r
+                       if (name == 'color' || name == 'backgroundColor')\r
+                               styleVal = dom.toHex(styleVal);\r
 \r
-                       // Remove the menu element when the editor is removed\r
-                       ed.onRemove.add(function() {\r
-                               c.destroy();\r
-                       });\r
+                       // Opera will return bold as 700\r
+                       if (name == 'fontWeight' && styleVal == 700)\r
+                               styleVal = 'bold';\r
 \r
-                       // Fix for bug #1897785, #1898007\r
-                       if (tinymce.isIE) {\r
-                               c.onHideMenu.add(function() {\r
-                                       if (bm) {\r
-                                               ed.selection.moveToBookmark(bm);\r
-                                               bm = 0;\r
-                                       }\r
+                       return '' + styleVal;\r
+               };\r
+\r
+               function replaceVars(value, vars) {\r
+                       if (typeof(value) != "string")\r
+                               value = value(vars);\r
+                       else if (vars) {\r
+                               value = value.replace(/%(\w+)/g, function(str, name) {\r
+                                       return vars[name] || str;\r
                                });\r
                        }\r
 \r
-                       return t.add(c);\r
-               },\r
-\r
-               createToolbar : function(id, s, cc) {\r
-                       var c, t = this, cls;\r
-\r
-                       id = t.prefix + id;\r
-                       cls = cc || t._cls.toolbar || tinymce.ui.Toolbar;\r
-                       c = new cls(id, s);\r
-\r
-                       if (t.get(id))\r
-                               return null;\r
-\r
-                       return t.add(c);\r
-               },\r
-\r
-               createSeparator : function(cc) {\r
-                       var cls = cc || this._cls.separator || tinymce.ui.Separator;\r
+                       return value;\r
+               };\r
 \r
-                       return new cls();\r
-               },\r
+               function isWhiteSpaceNode(node) {\r
+                       return node && node.nodeType === 3 && /^([\s\r\n]+|)$/.test(node.nodeValue);\r
+               };\r
 \r
-               setControlType : function(n, c) {\r
-                       return this._cls[n.toLowerCase()] = c;\r
-               },\r
+               function wrap(node, name, attrs) {\r
+                       var wrapper = dom.create(name, attrs);\r
 \r
-               destroy : function() {\r
-                       each(this.controls, function(c) {\r
-                               c.destroy();\r
-                       });\r
+                       node.parentNode.insertBefore(wrapper, node);\r
+                       wrapper.appendChild(node);\r
 \r
-                       this.controls = null;\r
-               }\r
+                       return wrapper;\r
+               };\r
 \r
-               });\r
-})(tinymce);\r
-(function(tinymce) {\r
-       var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isIE = tinymce.isIE, isOpera = tinymce.isOpera;\r
+               function expandRng(rng, format, remove) {\r
+                       var startContainer = rng.startContainer,\r
+                               startOffset = rng.startOffset,\r
+                               endContainer = rng.endContainer,\r
+                               endOffset = rng.endOffset, sibling, lastIdx;\r
 \r
-       tinymce.create('tinymce.WindowManager', {\r
-               WindowManager : function(ed) {\r
-                       var t = this;\r
+                       // This function walks up the tree if there is no siblings before/after the node\r
+                       function findParentContainer(container, child_name, sibling_name, root) {\r
+                               var parent, child;\r
 \r
-                       t.editor = ed;\r
-                       t.onOpen = new Dispatcher(t);\r
-                       t.onClose = new Dispatcher(t);\r
-                       t.params = {};\r
-                       t.features = {};\r
-               },\r
+                               root = root || dom.getRoot();\r
 \r
-               open : function(s, p) {\r
-                       var t = this, f = '', x, y, mo = t.editor.settings.dialog_type == 'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(), u;\r
+                               for (;;) {\r
+                                       // Check if we can move up are we at root level or body level\r
+                                       parent = container.parentNode;\r
 \r
-                       // Default some options\r
-                       s = s || {};\r
-                       p = p || {};\r
-                       sw = isOpera ? vp.w : screen.width; // Opera uses windows inside the Opera window\r
-                       sh = isOpera ? vp.h : screen.height;\r
-                       s.name = s.name || 'mc_' + new Date().getTime();\r
-                       s.width = parseInt(s.width || 320);\r
-                       s.height = parseInt(s.height || 240);\r
-                       s.resizable = true;\r
-                       s.left = s.left || parseInt(sw / 2.0) - (s.width / 2.0);\r
-                       s.top = s.top || parseInt(sh / 2.0) - (s.height / 2.0);\r
-                       p.inline = false;\r
-                       p.mce_width = s.width;\r
-                       p.mce_height = s.height;\r
-                       p.mce_auto_focus = s.auto_focus;\r
+                                       // Stop expanding on block elements or root depending on format\r
+                                       if (parent == root || (!format[0].block_expand && isBlock(parent)))\r
+                                               return container;\r
 \r
-                       if (mo) {\r
-                               if (isIE) {\r
-                                       s.center = true;\r
-                                       s.help = false;\r
-                                       s.dialogWidth = s.width + 'px';\r
-                                       s.dialogHeight = s.height + 'px';\r
-                                       s.scroll = s.scrollbars || false;\r
-                               }\r
-                       }\r
+                                       for (sibling = parent[child_name]; sibling && sibling != container; sibling = sibling[sibling_name]) {\r
+                                               if (sibling.nodeType == 1 && !isBookmarkNode(sibling))\r
+                                                       return container;\r
 \r
-                       // Build features string\r
-                       each(s, function(v, k) {\r
-                               if (tinymce.is(v, 'boolean'))\r
-                                       v = v ? 'yes' : 'no';\r
+                                               if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling))\r
+                                                       return container;\r
+                                       }\r
 \r
-                               if (!/^(name|url)$/.test(k)) {\r
-                                       if (isIE && mo)\r
-                                               f += (f ? ';' : '') + k + ':' + v;\r
-                                       else\r
-                                               f += (f ? ',' : '') + k + '=' + v;\r
+                                       container = container.parentNode;\r
                                }\r
-                       });\r
 \r
-                       t.features = s;\r
-                       t.params = p;\r
-                       t.onOpen.dispatch(t, s, p);\r
+                               return container;\r
+                       };\r
 \r
-                       u = s.url || s.file;\r
-                       u = tinymce._addVer(u);\r
+                       // If index based start position then resolve it\r
+                       if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) {\r
+                               lastIdx = startContainer.childNodes.length - 1;\r
+                               startContainer = startContainer.childNodes[startOffset > lastIdx ? lastIdx : startOffset];\r
 \r
-                       try {\r
-                               if (isIE && mo) {\r
-                                       w = 1;\r
-                                       window.showModalDialog(u, window, f);\r
-                               } else\r
-                                       w = window.open(u, s.name, f);\r
-                       } catch (ex) {\r
-                               // Ignore\r
+                               if (startContainer.nodeType == 3)\r
+                                       startOffset = 0;\r
                        }\r
 \r
-                       if (!w)\r
-                               alert(t.editor.getLang('popup_blocked'));\r
-               },\r
+                       // If index based end position then resolve it\r
+                       if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) {\r
+                               lastIdx = endContainer.childNodes.length - 1;\r
+                               endContainer = endContainer.childNodes[endOffset > lastIdx ? lastIdx : endOffset - 1];\r
 \r
-               close : function(w) {\r
-                       w.close();\r
-                       this.onClose.dispatch(this);\r
-               },\r
+                               if (endContainer.nodeType == 3)\r
+                                       endOffset = endContainer.nodeValue.length;\r
+                       }\r
 \r
-               createInstance : function(cl, a, b, c, d, e) {\r
-                       var f = tinymce.resolve(cl);\r
+                       // Exclude bookmark nodes if possible\r
+                       if (isBookmarkNode(startContainer.parentNode))\r
+                               startContainer = startContainer.parentNode;\r
 \r
-                       return new f(a, b, c, d, e);\r
-               },\r
+                       if (isBookmarkNode(startContainer))\r
+                               startContainer = startContainer.nextSibling || startContainer;\r
 \r
-               confirm : function(t, cb, s, w) {\r
-                       w = w || window;\r
+                       if (isBookmarkNode(endContainer.parentNode))\r
+                               endContainer = endContainer.parentNode;\r
 \r
-                       cb.call(s || this, w.confirm(this._decode(this.editor.getLang(t, t))));\r
-               },\r
+                       if (isBookmarkNode(endContainer))\r
+                               endContainer = endContainer.previousSibling || endContainer;\r
 \r
-               alert : function(tx, cb, s, w) {\r
-                       var t = this;\r
+                       // Move start/end point up the tree if the leaves are sharp and if we are in different containers\r
+                       // Example * becomes !: !<p><b><i>*text</i><i>text*</i></b></p>!\r
+                       // This will reduce the number of wrapper elements that needs to be created\r
+                       // Move start point up the tree\r
+                       if (format[0].inline || format[0].block_expand) {\r
+                               startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling');\r
+                               endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling');\r
+                       }\r
 \r
-                       w = w || window;\r
-                       w.alert(t._decode(t.editor.getLang(tx, tx)));\r
+                       // Expand start/end container to matching selector\r
+                       if (format[0].selector && format[0].expand !== FALSE && !format[0].inline) {\r
+                               function findSelectorEndPoint(container, sibling_name) {\r
+                                       var parents, i, y;\r
 \r
-                       if (cb)\r
-                               cb.call(s || t);\r
-               },\r
+                                       if (container.nodeType == 3 && container.nodeValue.length == 0 && container[sibling_name])\r
+                                               container = container[sibling_name];\r
 \r
-               // Internal functions\r
+                                       parents = getParents(container);\r
+                                       for (i = 0; i < parents.length; i++) {\r
+                                               for (y = 0; y < format.length; y++) {\r
+                                                       if (dom.is(parents[i], format[y].selector))\r
+                                                               return parents[i];\r
+                                               }\r
+                                       }\r
 \r
-               _decode : function(s) {\r
-                       return tinymce.DOM.decode(s).replace(/\\n/g, '\n');\r
-               }\r
+                                       return container;\r
+                               };\r
 \r
-               });\r
-}(tinymce));(function(tinymce) {\r
-       tinymce.CommandManager = function() {\r
-               var execCommands = {}, queryStateCommands = {}, queryValueCommands = {};\r
+                               // Find new startContainer/endContainer if there is better one\r
+                               startContainer = findSelectorEndPoint(startContainer, 'previousSibling');\r
+                               endContainer = findSelectorEndPoint(endContainer, 'nextSibling');\r
+                       }\r
 \r
-               function add(collection, cmd, func, scope) {\r
-                       if (typeof(cmd) == 'string')\r
-                               cmd = [cmd];\r
+                       // Expand start/end container to matching block element or text node\r
+                       if (format[0].block || format[0].selector) {\r
+                               function findBlockEndPoint(container, sibling_name, sibling_name2) {\r
+                                       var node;\r
 \r
-                       tinymce.each(cmd, function(cmd) {\r
-                               collection[cmd.toLowerCase()] = {func : func, scope : scope};\r
-                       });\r
-               };\r
+                                       // Expand to block of similar type\r
+                                       if (!format[0].wrapper)\r
+                                               node = dom.getParent(container, format[0].block);\r
 \r
-               tinymce.extend(this, {\r
-                       add : function(cmd, func, scope) {\r
-                               add(execCommands, cmd, func, scope);\r
-                       },\r
+                                       // Expand to first wrappable block element or any block element\r
+                                       if (!node)\r
+                                               node = dom.getParent(container.nodeType == 3 ? container.parentNode : container, isBlock);\r
 \r
-                       addQueryStateHandler : function(cmd, func, scope) {\r
-                               add(queryStateCommands, cmd, func, scope);\r
-                       },\r
+                                       // Exclude inner lists from wrapping\r
+                                       if (node && format[0].wrapper)\r
+                                               node = getParents(node, 'ul,ol').reverse()[0] || node;\r
 \r
-                       addQueryValueHandler : function(cmd, func, scope) {\r
-                               add(queryValueCommands, cmd, func, scope);\r
-                       },\r
+                                       // Didn't find a block element look for first/last wrappable element\r
+                                       if (!node) {\r
+                                               node = container;\r
 \r
-                       execCommand : function(scope, cmd, ui, value, args) {\r
-                               if (cmd = execCommands[cmd.toLowerCase()]) {\r
-                                       if (cmd.func.call(scope || cmd.scope, ui, value, args) !== false)\r
-                                               return true;\r
+                                               while (node[sibling_name] && !isBlock(node[sibling_name])) {\r
+                                                       node = node[sibling_name];\r
+\r
+                                                       // Break on BR but include it will be removed later on\r
+                                                       // we can't remove it now since we need to check if it can be wrapped\r
+                                                       if (isEq(node, 'br'))\r
+                                                               break;\r
+                                               }\r
+                                       }\r
+\r
+                                       return node || container;\r
+                               };\r
+\r
+                               // Find new startContainer/endContainer if there is better one\r
+                               startContainer = findBlockEndPoint(startContainer, 'previousSibling');\r
+                               endContainer = findBlockEndPoint(endContainer, 'nextSibling');\r
+\r
+                               // Non block element then try to expand up the leaf\r
+                               if (format[0].block) {\r
+                                       if (!isBlock(startContainer))\r
+                                               startContainer = findParentContainer(startContainer, 'firstChild', 'nextSibling');\r
+\r
+                                       if (!isBlock(endContainer))\r
+                                               endContainer = findParentContainer(endContainer, 'lastChild', 'previousSibling');\r
                                }\r
-                       },\r
+                       }\r
 \r
-                       queryCommandValue : function() {\r
-                               if (cmd = queryValueCommands[cmd.toLowerCase()])\r
-                                       return cmd.func.call(scope || cmd.scope, ui, value, args);\r
-                       },\r
+                       // Setup index for startContainer\r
+                       if (startContainer.nodeType == 1) {\r
+                               startOffset = nodeIndex(startContainer);\r
+                               startContainer = startContainer.parentNode;\r
+                       }\r
 \r
-                       queryCommandState : function() {\r
-                               if (cmd = queryStateCommands[cmd.toLowerCase()])\r
-                                       return cmd.func.call(scope || cmd.scope, ui, value, args);\r
+                       // Setup index for endContainer\r
+                       if (endContainer.nodeType == 1) {\r
+                               endOffset = nodeIndex(endContainer) + 1;\r
+                               endContainer = endContainer.parentNode;\r
                        }\r
-               });\r
-       };\r
 \r
-       tinymce.GlobalCommands = new tinymce.CommandManager();\r
-})(tinymce);(function(tinymce) {\r
-       function processRange(dom, start, end, callback) {\r
-               var ancestor, n, startPoint, endPoint, sib;\r
+                       // Return new range like object\r
+                       return {\r
+                               startContainer : startContainer,\r
+                               startOffset : startOffset,\r
+                               endContainer : endContainer,\r
+                               endOffset : endOffset\r
+                       };\r
+               }\r
 \r
-               function findEndPoint(n, c) {\r
-                       do {\r
-                               if (n.parentNode == c)\r
-                                       return n;\r
+               function removeFormat(format, vars, node, compare_node) {\r
+                       var i, attrs, stylesModified;\r
 \r
-                               n = n.parentNode;\r
-                       } while(n);\r
-               };\r
+                       // Check if node matches format\r
+                       if (!matchName(node, format))\r
+                               return FALSE;\r
 \r
-               function process(n) {\r
-                       callback(n);\r
-                       tinymce.walk(n, callback, 'childNodes');\r
-               };\r
+                       // Should we compare with format attribs and styles\r
+                       if (format.remove != 'all') {\r
+                               // Remove styles\r
+                               each(format.styles, function(value, name) {\r
+                                       value = replaceVars(value, vars);\r
 \r
-               // Find common ancestor and end points\r
-               ancestor = dom.findCommonAncestor(start, end);\r
-               startPoint = findEndPoint(start, ancestor) || start;\r
-               endPoint = findEndPoint(end, ancestor) || end;\r
+                                       // Indexed array\r
+                                       if (typeof(name) === 'number') {\r
+                                               name = value;\r
+                                               compare_node = 0;\r
+                                       }\r
 \r
-               // Process left leaf\r
-               for (n = start; n && n != startPoint; n = n.parentNode) {\r
-                       for (sib = n.nextSibling; sib; sib = sib.nextSibling)\r
-                               process(sib);\r
-               }\r
+                                       if (!compare_node || isEq(getStyle(compare_node, name), value))\r
+                                               dom.setStyle(node, name, '');\r
 \r
-               // Process middle from start to end point\r
-               if (startPoint != endPoint) {\r
-                       for (n = startPoint.nextSibling; n && n != endPoint; n = n.nextSibling)\r
-                               process(n);\r
-               } else\r
-                       process(startPoint);\r
-\r
-               // Process right leaf\r
-               for (n = end; n && n != endPoint; n = n.parentNode) {\r
-                       for (sib = n.previousSibling; sib; sib = sib.previousSibling)\r
-                               process(sib);\r
-               }\r
-       };\r
+                                       stylesModified = 1;\r
+                               });\r
+\r
+                               // Remove style attribute if it's empty\r
+                               if (stylesModified && dom.getAttrib(node, 'style') == '') {\r
+                                       node.removeAttribute('style');\r
+                                       node.removeAttribute('_mce_style');\r
+                               }\r
 \r
-       tinymce.GlobalCommands.add('RemoveFormat', function() {\r
-               var ed = this, dom = ed.dom, s = ed.selection, r = s.getRng(1), nodes = [], bm, start, end, sc, so, ec, eo, n;\r
+                               // Remove attributes\r
+                               each(format.attributes, function(value, name) {\r
+                                       var valueOut;\r
 \r
-               function findFormatRoot(n) {\r
-                       var sp;\r
+                                       value = replaceVars(value, vars);\r
 \r
-                       dom.getParent(n, function(n) {\r
-                               if (dom.is(n, ed.getParam('removeformat_selector')))\r
-                                       sp = n;\r
+                                       // Indexed array\r
+                                       if (typeof(name) === 'number') {\r
+                                               name = value;\r
+                                               compare_node = 0;\r
+                                       }\r
 \r
-                               return dom.isBlock(n);\r
-                       }, ed.getBody());\r
+                                       if (!compare_node || isEq(dom.getAttrib(compare_node, name), value)) {\r
+                                               // Keep internal classes\r
+                                               if (name == 'class') {\r
+                                                       value = dom.getAttrib(node, name);\r
+                                                       if (value) {\r
+                                                               // Build new class value where everything is removed except the internal prefixed classes\r
+                                                               valueOut = '';\r
+                                                               each(value.split(/\s+/), function(cls) {\r
+                                                                       if (/mce\w+/.test(cls))\r
+                                                                               valueOut += (valueOut ? ' ' : '') + cls;\r
+                                                               });\r
 \r
-                       return sp;\r
-               };\r
+                                                               // We got some internal classes left\r
+                                                               if (valueOut) {\r
+                                                                       dom.setAttrib(node, name, valueOut);\r
+                                                                       return;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
 \r
-               function collect(n) {\r
-                       if (dom.is(n, ed.getParam('removeformat_selector')))\r
-                               nodes.push(n);\r
-               };\r
+                                               // IE6 has a bug where the attribute doesn't get removed correctly\r
+                                               if (name == "class")\r
+                                                       node.removeAttribute('className');\r
 \r
-               function walk(n) {\r
-                       collect(n);\r
-                       tinymce.walk(n, collect, 'childNodes');\r
-               };\r
+                                               // Remove mce prefixed attributes\r
+                                               if (MCE_ATTR_RE.test(name))\r
+                                                       node.removeAttribute('_mce_' + name);\r
 \r
-               bm = s.getBookmark();\r
-               sc = r.startContainer;\r
-               ec = r.endContainer;\r
-               so = r.startOffset;\r
-               eo = r.endOffset;\r
-               sc = sc.nodeType == 1 ? sc.childNodes[Math.min(so, sc.childNodes.length - 1)] : sc;\r
-               ec = ec.nodeType == 1 ? ec.childNodes[Math.min(so == eo ? eo : eo - 1, ec.childNodes.length - 1)] : ec;\r
+                                               node.removeAttribute(name);\r
+                                       }\r
+                               });\r
 \r
-               // Same container\r
-               if (sc == ec) { // TEXT_NODE\r
-                       start = findFormatRoot(sc);\r
+                               // Remove classes\r
+                               each(format.classes, function(value) {\r
+                                       value = replaceVars(value, vars);\r
 \r
-                       // Handle single text node\r
-                       if (sc.nodeType == 3) {\r
-                               if (start && start.nodeType == 1) { // ELEMENT\r
-                                       n = sc.splitText(so);\r
-                                       n.splitText(eo - so);\r
-                                       dom.split(start, n);\r
+                                       if (!compare_node || dom.hasClass(compare_node, value))\r
+                                               dom.removeClass(node, value);\r
+                               });\r
 \r
-                                       s.moveToBookmark(bm);\r
+                               // Check for non internal attributes\r
+                               attrs = dom.getAttribs(node);\r
+                               for (i = 0; i < attrs.length; i++) {\r
+                                       if (attrs[i].nodeName.indexOf('_') !== 0)\r
+                                               return FALSE;\r
                                }\r
+                       }\r
 \r
-                               return;\r
+                       // Remove the inline child if it's empty for example <b> or <span>\r
+                       if (format.remove != 'none') {\r
+                               removeNode(node, format);\r
+                               return TRUE;\r
                        }\r
+               };\r
 \r
-                       // Handle single element\r
-                       walk(dom.split(start, sc) || sc);\r
-               } else {\r
-                       // Find start/end format root\r
-                       start = findFormatRoot(sc);\r
-                       end = findFormatRoot(ec);\r
+               function removeNode(node, format) {\r
+                       var parentNode = node.parentNode, rootBlockElm;\r
+\r
+                       if (format.block) {\r
+                               if (!forcedRootBlock) {\r
+                                       function find(node, next, inc) {\r
+                                               node = getNonWhiteSpaceSibling(node, next, inc);\r
+\r
+                                               return !node || (node.nodeName == 'BR' || isBlock(node));\r
+                                       };\r
 \r
-                       // Split start text node\r
-                       if (start) {\r
-                               if (sc.nodeType == 3) { // TEXT\r
-                                       // Since IE doesn't support white space nodes in the DOM we need to\r
-                                       // add this invisible character so that the splitText function can split the contents\r
-                                       if (so == sc.nodeValue.length)\r
-                                               sc.nodeValue += '\uFEFF'; // Yet another pesky IE fix\r
+                                       // Append BR elements if needed before we remove the block\r
+                                       if (isBlock(node) && !isBlock(parentNode)) {\r
+                                               if (!find(node, FALSE) && !find(node.firstChild, TRUE, 1))\r
+                                                       node.insertBefore(dom.create('br'), node.firstChild);\r
 \r
-                                       sc = sc.splitText(so);\r
+                                               if (!find(node, TRUE) && !find(node.lastChild, FALSE, 1))\r
+                                                       node.appendChild(dom.create('br'));\r
+                                       }\r
+                               } else {\r
+                                       // Wrap the block in a forcedRootBlock if we are at the root of document\r
+                                       if (parentNode == dom.getRoot()) {\r
+                                               if (!format.list_block || !isEq(node, format.list_block)) {\r
+                                                       each(tinymce.grep(node.childNodes), function(node) {\r
+                                                               if (isValid(forcedRootBlock, node.nodeName.toLowerCase())) {\r
+                                                                       if (!rootBlockElm)\r
+                                                                               rootBlockElm = wrap(node, forcedRootBlock);\r
+                                                                       else\r
+                                                                               rootBlockElm.appendChild(node);\r
+                                                               } else\r
+                                                                       rootBlockElm = 0;\r
+                                                       });\r
+                                               }\r
+                                       }\r
                                }\r
                        }\r
 \r
-                       // Split end text node\r
-                       if (end) {\r
-                               if (ec.nodeType == 3) // TEXT\r
-                                       ec.splitText(eo);\r
-                       }\r
+                       // Never remove nodes that isn't the specified inline element if a selector is specified too\r
+                       if (format.selector && format.inline && !isEq(format.inline, node))\r
+                               return;\r
 \r
-                       // If the start and end format root is the same then we need to wrap\r
-                       // the end node in a span since the split calls might change the reference\r
-                       // Example: <p><b><em>x[yz<span>---</span>12]3</em></b></p>\r
-                       if (start && start == end)\r
-                               dom.replace(dom.create('span', {id : '__end'}, ec.cloneNode(true)), ec);\r
+                       dom.remove(node, 1);\r
+               };\r
 \r
-                       // Split all start containers down to the format root\r
-                       if (start)\r
-                               start = dom.split(start, sc);\r
-                       else\r
-                               start = sc;\r
+               function getNonWhiteSpaceSibling(node, next, inc) {\r
+                       if (node) {\r
+                               next = next ? 'nextSibling' : 'previousSibling';\r
 \r
-                       // If there is a span wrapper use that one instead\r
-                       if (n = dom.get('__end')) {\r
-                               ec = n;\r
-                               end = findFormatRoot(ec);\r
+                               for (node = inc ? node : node[next]; node; node = node[next]) {\r
+                                       if (node.nodeType == 1 || !isWhiteSpaceNode(node))\r
+                                               return node;\r
+                               }\r
                        }\r
+               };\r
 \r
-                       // Split all end containers down to the format root\r
-                       if (end)\r
-                               end = dom.split(end, ec);\r
-                       else\r
-                               end = ec;\r
+               function isBookmarkNode(node) {\r
+                       return node && node.nodeType == 1 && node.getAttribute('_mce_type') == 'bookmark';\r
+               };\r
 \r
-                       // Collect nodes in between\r
-                       processRange(dom, start, end, collect);\r
+               function mergeSiblings(prev, next) {\r
+                       var marker, sibling, tmpSibling;\r
 \r
-                       // Remove invisible character for IE workaround if we find it\r
-                       if (sc.nodeValue == '\uFEFF')\r
-                               sc.nodeValue = '';\r
+                       function compareElements(node1, node2) {\r
+                               // Not the same name\r
+                               if (node1.nodeName != node2.nodeName)\r
+                                       return FALSE;\r
 \r
-                       // Process start/end container elements\r
-                       walk(ec);\r
-                       walk(sc);\r
-               }\r
+                               function getAttribs(node) {\r
+                                       var attribs = {};\r
 \r
-               // Remove all collected nodes\r
-               tinymce.each(nodes, function(n) {\r
-                       dom.remove(n, 1);\r
-               });\r
+                                       each(dom.getAttribs(node), function(attr) {\r
+                                               var name = attr.nodeName.toLowerCase();\r
 \r
-               // Remove leftover wrapper\r
-               dom.remove('__end', 1);\r
+                                               // Don't compare internal attributes or style\r
+                                               if (name.indexOf('_') !== 0 && name !== 'style')\r
+                                                       attribs[name] = dom.getAttrib(node, name);\r
+                                       });\r
 \r
-               s.moveToBookmark(bm);\r
-       });\r
-})(tinymce);\r
-(function(tinymce) {\r
-       tinymce.GlobalCommands.add('mceBlockQuote', function() {\r
-               var ed = this, s = ed.selection, dom = ed.dom, sb, eb, n, bm, bq, r, bq2, i, nl;\r
+                                       return attribs;\r
+                               };\r
 \r
-               function getBQ(e) {\r
-                       return dom.getParent(e, function(n) {return n.nodeName === 'BLOCKQUOTE';});\r
-               };\r
+                               function compareObjects(obj1, obj2) {\r
+                                       var value, name;\r
 \r
-               // Get start/end block\r
-               sb = dom.getParent(s.getStart(), dom.isBlock);\r
-               eb = dom.getParent(s.getEnd(), dom.isBlock);\r
+                                       for (name in obj1) {\r
+                                               // Obj1 has item obj2 doesn't have\r
+                                               if (obj1.hasOwnProperty(name)) {\r
+                                                       value = obj2[name];\r
 \r
-               // Remove blockquote(s)\r
-               if (bq = getBQ(sb)) {\r
-                       if (sb != eb || sb.childNodes.length > 1 || (sb.childNodes.length == 1 && sb.firstChild.nodeName != 'BR'))\r
-                               bm = s.getBookmark();\r
+                                                       // Obj2 doesn't have obj1 item\r
+                                                       if (value === undefined)\r
+                                                               return FALSE;\r
 \r
-                       // Move all elements after the end block into new bq\r
-                       if (getBQ(eb)) {\r
-                               bq2 = bq.cloneNode(false);\r
+                                                       // Obj2 item has a different value\r
+                                                       if (obj1[name] != value)\r
+                                                               return FALSE;\r
 \r
-                               while (n = eb.nextSibling)\r
-                                       bq2.appendChild(n.parentNode.removeChild(n));\r
-                       }\r
+                                                       // Delete similar value\r
+                                                       delete obj2[name];\r
+                                               }\r
+                                       }\r
+\r
+                                       // Check if obj 2 has something obj 1 doesn't have\r
+                                       for (name in obj2) {\r
+                                               // Obj2 has item obj1 doesn't have\r
+                                               if (obj2.hasOwnProperty(name))\r
+                                                       return FALSE;\r
+                                       }\r
 \r
-                       // Add new bq after\r
-                       if (bq2)\r
-                               dom.insertAfter(bq2, bq);\r
+                                       return TRUE;\r
+                               };\r
 \r
-                       // Move all selected blocks after the current bq\r
-                       nl = s.getSelectedBlocks(sb, eb);\r
-                       for (i = nl.length - 1; i >= 0; i--) {\r
-                               dom.insertAfter(nl[i], bq);\r
-                       }\r
+                               // Attribs are not the same\r
+                               if (!compareObjects(getAttribs(node1), getAttribs(node2)))\r
+                                       return FALSE;\r
 \r
-                       // Empty bq, then remove it\r
-                       if (/^\s*$/.test(bq.innerHTML))\r
-                               dom.remove(bq, 1); // Keep children so boomark restoration works correctly\r
+                               // Styles are not the same\r
+                               if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style'))))\r
+                                       return FALSE;\r
 \r
-                       // Empty bq, then remote it\r
-                       if (bq2 && /^\s*$/.test(bq2.innerHTML))\r
-                               dom.remove(bq2, 1); // Keep children so boomark restoration works correctly\r
+                               return TRUE;\r
+                       };\r
 \r
-                       if (!bm) {\r
-                               // Move caret inside empty block element\r
-                               if (!tinymce.isIE) {\r
-                                       r = ed.getDoc().createRange();\r
-                                       r.setStart(sb, 0);\r
-                                       r.setEnd(sb, 0);\r
-                                       s.setRng(r);\r
-                               } else {\r
-                                       s.select(sb);\r
-                                       s.collapse(0);\r
+                       // Check if next/prev exists and that they are elements\r
+                       if (prev && next) {\r
+                               function findElementSibling(node, sibling_name) {\r
+                                       for (sibling = node; sibling; sibling = sibling[sibling_name]) {\r
+                                               if (sibling.nodeType == 3 && !isWhiteSpaceNode(sibling))\r
+                                                       return node;\r
 \r
-                                       // IE misses the empty block some times element so we must move back the caret\r
-                                       if (dom.getParent(s.getStart(), dom.isBlock) != sb) {\r
-                                               r = s.getRng();\r
-                                               r.move('character', -1);\r
-                                               r.select();\r
+                                               if (sibling.nodeType == 1 && !isBookmarkNode(sibling))\r
+                                                       return sibling;\r
                                        }\r
-                               }\r
-                       } else\r
-                               ed.selection.moveToBookmark(bm);\r
 \r
-                       return;\r
-               }\r
+                                       return node;\r
+                               };\r
 \r
-               // Since IE can start with a totally empty document we need to add the first bq and paragraph\r
-               if (tinymce.isIE && !sb && !eb) {\r
-                       ed.getDoc().execCommand('Indent');\r
-                       n = getBQ(s.getNode());\r
-                       n.style.margin = n.dir = ''; // IE adds margin and dir to bq\r
-                       return;\r
-               }\r
+                               // If previous sibling is empty then jump over it\r
+                               prev = findElementSibling(prev, 'previousSibling');\r
+                               next = findElementSibling(next, 'nextSibling');\r
+\r
+                               // Compare next and previous nodes\r
+                               if (compareElements(prev, next)) {\r
+                                       // Append nodes between\r
+                                       for (sibling = prev.nextSibling; sibling && sibling != next;) {\r
+                                               tmpSibling = sibling;\r
+                                               sibling = sibling.nextSibling;\r
+                                               prev.appendChild(tmpSibling);\r
+                                       }\r
 \r
-               if (!sb || !eb)\r
-                       return;\r
+                                       // Remove next node\r
+                                       dom.remove(next);\r
 \r
-               // If empty paragraph node then do not use bookmark\r
-               if (sb != eb || sb.childNodes.length > 1 || (sb.childNodes.length == 1 && sb.firstChild.nodeName != 'BR'))\r
-                       bm = s.getBookmark();\r
+                                       // Move children into prev node\r
+                                       each(tinymce.grep(next.childNodes), function(node) {\r
+                                               prev.appendChild(node);\r
+                                       });\r
 \r
-               // Move selected block elements into a bq\r
-               tinymce.each(s.getSelectedBlocks(getBQ(s.getStart()), getBQ(s.getEnd())), function(e) {\r
-                       // Found existing BQ add to this one\r
-                       if (e.nodeName == 'BLOCKQUOTE' && !bq) {\r
-                               bq = e;\r
-                               return;\r
+                                       return prev;\r
+                               }\r
                        }\r
 \r
-                       // No BQ found, create one\r
-                       if (!bq) {\r
-                               bq = dom.create('blockquote');\r
-                               e.parentNode.insertBefore(bq, e);\r
+                       return next;\r
+               };\r
+\r
+               function isTextBlock(name) {\r
+                       return /^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(name);\r
+               };\r
+\r
+               function getContainer(rng, start) {\r
+                       var container, offset, lastIdx;\r
+\r
+                       container = rng[start ? 'startContainer' : 'endContainer'];\r
+                       offset = rng[start ? 'startOffset' : 'endOffset'];\r
+\r
+                       if (container.nodeType == 1) {\r
+                               lastIdx = container.childNodes.length - 1;\r
+\r
+                               if (!start && offset)\r
+                                       offset--;\r
+\r
+                               container = container.childNodes[offset > lastIdx ? lastIdx : offset];\r
                        }\r
 \r
-                       // Add children from existing BQ\r
-                       if (e.nodeName == 'BLOCKQUOTE' && bq) {\r
-                               n = e.firstChild;\r
+                       return container;\r
+               };\r
 \r
-                               while (n) {\r
-                                       bq.appendChild(n.cloneNode(true));\r
-                                       n = n.nextSibling;\r
-                               }\r
+               function performCaretAction(type, name, vars) {\r
+                       var i, currentPendingFormats = pendingFormats[type],\r
+                               otherPendingFormats = pendingFormats[type == 'apply' ? 'remove' : 'apply'];\r
 \r
-                               dom.remove(e);\r
-                               return;\r
+                       function hasPending() {\r
+                               return pendingFormats.apply.length || pendingFormats.remove.length;\r
+                       };\r
+\r
+                       function resetPending() {\r
+                               pendingFormats.apply = [];\r
+                               pendingFormats.remove = [];\r
+                       };\r
+\r
+                       function perform(caret_node) {\r
+                               // Apply pending formats\r
+                               each(pendingFormats.apply.reverse(), function(item) {\r
+                                       apply(item.name, item.vars, caret_node);\r
+                               });\r
+\r
+                               // Remove pending formats\r
+                               each(pendingFormats.remove.reverse(), function(item) {\r
+                                       remove(item.name, item.vars, caret_node);\r
+                               });\r
+\r
+                               dom.remove(caret_node, 1);\r
+                               resetPending();\r
+                       };\r
+\r
+                       // Check if it already exists then ignore it\r
+                       for (i = currentPendingFormats.length - 1; i >= 0; i--) {\r
+                               if (currentPendingFormats[i].name == name)\r
+                                       return;\r
                        }\r
 \r
-                       // Add non BQ element to BQ\r
-                       bq.appendChild(dom.remove(e));\r
-               });\r
+                       currentPendingFormats.push({name : name, vars : vars});\r
 \r
-               if (!bm) {\r
-                       // Move caret inside empty block element\r
-                       if (!tinymce.isIE) {\r
-                               r = ed.getDoc().createRange();\r
-                               r.setStart(sb, 0);\r
-                               r.setEnd(sb, 0);\r
-                               s.setRng(r);\r
-                       } else {\r
-                               s.select(sb);\r
-                               s.collapse(1);\r
+                       // Check if it's in the other type, then remove it\r
+                       for (i = otherPendingFormats.length - 1; i >= 0; i--) {\r
+                               if (otherPendingFormats[i].name == name)\r
+                                       otherPendingFormats.splice(i, 1);\r
                        }\r
-               } else\r
-                       s.moveToBookmark(bm);\r
-       });\r
-})(tinymce);\r
-(function(tinymce) {\r
-       tinymce.each(['Cut', 'Copy', 'Paste'], function(cmd) {\r
-               tinymce.GlobalCommands.add(cmd, function() {\r
-                       var ed = this, doc = ed.getDoc();\r
 \r
-                       try {\r
-                               doc.execCommand(cmd, false, null);\r
+                       // Pending apply or remove formats\r
+                       if (hasPending()) {\r
+                               ed.getDoc().execCommand('FontName', false, 'mceinline');\r
+                               pendingFormats.lastRng = selection.getRng();\r
 \r
-                               // On WebKit the command will just be ignored if it's not enabled\r
-                               if (!doc.queryCommandSupported(cmd))\r
-                                       throw 'Error';\r
-                       } catch (ex) {\r
-                               ed.windowManager.alert(ed.getLang('clipboard_no_support'));\r
+                               // IE will convert the current word\r
+                               each(dom.select('font,span'), function(node) {\r
+                                       var bookmark;\r
+\r
+                                       if (isCaretNode(node)) {\r
+                                               bookmark = selection.getBookmark();\r
+                                               perform(node);\r
+                                               selection.moveToBookmark(bookmark);\r
+                                               ed.nodeChanged();\r
+                                       }\r
+                               });\r
+\r
+                               // Only register listeners once if we need to\r
+                               if (!pendingFormats.isListening && hasPending()) {\r
+                                       pendingFormats.isListening = true;\r
+\r
+                                       each('onKeyDown,onKeyUp,onKeyPress,onMouseUp'.split(','), function(event) {\r
+                                               ed[event].addToTop(function(ed, e) {\r
+                                                       // Do we have pending formats and is the selection moved has moved\r
+                                                       if (hasPending() && !tinymce.dom.RangeUtils.compareRanges(pendingFormats.lastRng, selection.getRng())) {\r
+                                                               each(dom.select('font,span'), function(node) {\r
+                                                                       var textNode, rng;\r
+\r
+                                                                       // Look for marker\r
+                                                                       if (isCaretNode(node)) {\r
+                                                                               textNode = node.firstChild;\r
+\r
+                                                                               if (textNode) {\r
+                                                                                       perform(node);\r
+\r
+                                                                                       rng = dom.createRng();\r
+                                                                                       rng.setStart(textNode, textNode.nodeValue.length);\r
+                                                                                       rng.setEnd(textNode, textNode.nodeValue.length);\r
+                                                                                       selection.setRng(rng);\r
+                                                                                       ed.nodeChanged();\r
+                                                                               } else\r
+                                                                                       dom.remove(node);\r
+                                                                       }\r
+                                                               });\r
+\r
+                                                               // Always unbind and clear pending styles on keyup\r
+                                                               if (e.type == 'keyup' || e.type == 'mouseup')\r
+                                                                       resetPending();\r
+                                                       }\r
+                                               });\r
+                                       });\r
+                               }\r
                        }\r
-               });\r
-       });\r
+               };\r
+       };\r
 })(tinymce);\r
-(function(tinymce) {\r
-       tinymce.GlobalCommands.add('InsertHorizontalRule', function() {\r
-               if (tinymce.isOpera)\r
-                       return this.getDoc().execCommand('InsertHorizontalRule', false, '');\r
 \r
-               this.selection.setContent('<hr />');\r
-       });\r
-})(tinymce);\r
-(function() {\r
-       var cmds = tinymce.GlobalCommands;\r
+tinymce.onAddEditor.add(function(tinymce, ed) {\r
+       var filters, fontSizes, dom, settings = ed.settings;\r
 \r
-       cmds.add(['mceEndUndoLevel', 'mceAddUndoLevel'], function() {\r
-               this.undoManager.add();\r
-       });\r
+       if (settings.inline_styles) {\r
+               fontSizes = tinymce.explode(settings.font_size_style_values);\r
 \r
-       cmds.add('Undo', function() {\r
-               var ed = this;\r
+               function replaceWithSpan(node, styles) {\r
+                       dom.replace(dom.create('span', {\r
+                               style : styles\r
+                       }), node, 1);\r
+               };\r
 \r
-               if (ed.settings.custom_undo_redo) {\r
-                       ed.undoManager.undo();\r
-                       ed.nodeChanged();\r
-                       return true;\r
-               }\r
+               filters = {\r
+                       font : function(dom, node) {\r
+                               replaceWithSpan(node, {\r
+                                       backgroundColor : node.style.backgroundColor,\r
+                                       color : node.color,\r
+                                       fontFamily : node.face,\r
+                                       fontSize : fontSizes[parseInt(node.size) - 1]\r
+                               });\r
+                       },\r
 \r
-               return false; // Run browser command\r
-       });\r
+                       u : function(dom, node) {\r
+                               replaceWithSpan(node, {\r
+                                       textDecoration : 'underline'\r
+                               });\r
+                       },\r
 \r
-       cmds.add('Redo', function() {\r
-               var ed = this;\r
+                       strike : function(dom, node) {\r
+                               replaceWithSpan(node, {\r
+                                       textDecoration : 'line-through'\r
+                               });\r
+                       }\r
+               };\r
 \r
-               if (ed.settings.custom_undo_redo) {\r
-                       ed.undoManager.redo();\r
-                       ed.nodeChanged();\r
-                       return true;\r
-               }\r
+               function convert(editor, params) {\r
+                       dom = editor.dom;\r
+\r
+                       if (settings.convert_fonts_to_spans) {\r
+                               tinymce.each(dom.select('font,u,strike', params.node), function(node) {\r
+                                       filters[node.nodeName.toLowerCase()](ed.dom, node);\r
+                               });\r
+                       }\r
+               };\r
+\r
+               ed.onPreProcess.add(convert);\r
+\r
+               ed.onInit.add(function() {\r
+                       ed.selection.onSetContent.add(convert);\r
+               });\r
+       }\r
+});\r
 \r
-               return false; // Run browser command\r
-       });\r
-})();\r
index fff4963922fc308353ee186715b162d2f4c240ce..fd943c0f878b33330df3c060f67cdab711f0c4d6 100644 (file)
@@ -1,10 +1,11 @@
 /**\r
- * $Id: editable_selects.js 867 2008-06-09 20:33:40Z spocke $\r
+ * editable_selects.js\r
  *\r
- * Makes select boxes editable.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 var TinyMCE_EditableSelects = {\r
index dd45e730de2c72c5af2278f1ed117b327c5f1755..2617a26edb2b0a60f2fc986c586214a6e3fa56bb 100644 (file)
@@ -1,10 +1,11 @@
 /**\r
- * $Id: form_utils.js 996 2009-02-06 17:32:20Z spocke $\r
+ * form_utils.js\r
  *\r
- * Various form utilitiy functions.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 var themeBaseURL = tinyMCEPopup.editor.baseURI.toAbsolute('themes/' + tinyMCEPopup.getParam("theme"));\r
@@ -92,7 +93,7 @@ function selectByValue(form_obj, field_name, value, add_custom, ignore_case) {
 function getSelectValue(form_obj, field_name) {\r
        var elm = form_obj.elements[field_name];\r
 \r
-       if (elm == null || elm.options == null)\r
+       if (elm == null || elm.options == null || elm.selectedIndex === -1)\r
                return "";\r
 \r
        return elm.options[elm.selectedIndex].value;\r
index 284501ee9470f0598bef0c174073cf65c5c8e83d..825d4c143357516f0be55e2b8e9c8be10c429ceb 100644 (file)
@@ -1,10 +1,11 @@
 /**\r
- * $Id: mctabs.js 758 2008-03-30 13:53:29Z spocke $\r
+ * mctabs.js\r
  *\r
- * Moxiecode DHTML Tabs script.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 function MCTabs() {\r
index cde4c979851f50539fc9d8fea3198cce47b72cec..a6fcf970153598b4acb9db56ff55f49e7fdca72f 100644 (file)
@@ -1,10 +1,11 @@
 /**\r
- * $Id: validate.js 758 2008-03-30 13:53:29Z spocke $\r
+ * validate.js\r
  *\r
- * Various form validation methods.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
  *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
  */\r
 \r
 /**\r
index dbf0943d54f8e0c6d77d49dea859e350113218f6..3b98e8df7827f56381937611ac124a22804c1459 100644 (file)
@@ -148,7 +148,6 @@ class html2text
         '/[ ]{2,}/',                             // Runs of spaces, pre-handling
         '/<script[^>]*>.*?<\/script>/i',         // <script>s -- which strip_tags supposedly has problems with
         '/<style[^>]*>.*?<\/style>/i',           // <style>s -- which strip_tags supposedly has problems with
-        //'/<!-- .* -->/',                         // Comments -- which strip_tags might have problem a with
         '/<p[^>]*>/i',                           // <P>
         '/<br[^>]*>/i',                          // <br>
         '/<i[^>]*>(.*?)<\/i>/i',                 // <i>
@@ -158,6 +157,7 @@ class html2text
         '/<li[^>]*>(.*?)<\/li>/i',               // <li> and </li>
         '/<li[^>]*>/i',                          // <li>
         '/<hr[^>]*>/i',                          // <hr>
+        '/<div[^>]*>/i',                         // <div>
         '/(<table[^>]*>|<\/table>)/i',           // <table> and </table>
         '/(<tr[^>]*>|<\/tr>)/i',                 // <tr> and </tr>
         '/<td[^>]*>(.*?)<\/td>/i',               // <td> and </td>
@@ -167,7 +167,6 @@ class html2text
         '/&(apos|rsquo|lsquo|#8216|#8217);/i',   // Single quotes
         '/&gt;/i',                               // Greater-than
         '/&lt;/i',                               // Less-than
-        '/&(amp|#38);/i',                        // Ampersand
         '/&(copy|#169);/i',                      // Copyright
         '/&(trade|#8482|#153);/i',               // Trademark
         '/&(reg|#174);/i',                       // Registered
@@ -176,6 +175,7 @@ class html2text
         '/&(bull|#149|#8226);/i',                // Bullet
         '/&(pound|#163);/i',                     // Pound sign
         '/&(euro|#8364);/i',                     // Euro sign
+        '/&(amp|#38);/i',                        // Ampersand: see _converter()
         '/[ ]{2,}/'                              // Runs of spaces, post-handling
     );
 
@@ -192,8 +192,7 @@ class html2text
         ' ',                                    // Runs of spaces, pre-handling
         '',                                     // <script>s -- which strip_tags supposedly has problems with
         '',                                     // <style>s -- which strip_tags supposedly has problems with
-        //'',                                     // Comments -- which strip_tags might have problem a with
-        "\n\n",                               // <P>
+        "\n\n",                                 // <P>
         "\n",                                   // <br>
         '_\\1_',                                // <i>
         '_\\1_',                                // <em>
@@ -202,6 +201,7 @@ class html2text
         "\t* \\1\n",                            // <li> and </li>
         "\n\t* ",                               // <li>
         "\n-------------------------\n",        // <hr>
+        "<div>\n",                              // <div>
         "\n\n",                                 // <table> and </table>
         "\n",                                   // <tr> and </tr>
         "\t\t\\1\n",                            // <td> and </td>
@@ -210,7 +210,6 @@ class html2text
         "'",                                    // Single quotes
         '>',
         '<',
-        '&',
         '(c)',
         '(tm)',
         '(R)',
@@ -219,6 +218,7 @@ class html2text
         '*',
         '£',
         'EUR',                                  // Euro sign. \80 ?
+        '|+|amp|+|',                            // Ampersand: see _converter()
         ' '                                     // Runs of spaces, post-handling
     );
 
@@ -445,12 +445,7 @@ class html2text
     }
 
     /**
-     *  Workhorse function that does actual conversion.
-     *
-     *  First performs custom tag replacement specified by $search and
-     *  $replace arrays. Then strips any remaining HTML tags, reduces whitespace
-     *  and newlines to a readable format, and word wraps the text to
-     *  $width characters.
+     *  Workhorse function that does actual conversion (calls _converter() method).
      *
      *  @access private
      *  @return void
@@ -463,18 +458,55 @@ class html2text
 
         $text = trim(stripslashes($this->html));
 
+        // Convert HTML to TXT
+        $this->_converter($text);
+
+        // Add link list
+        if ( !empty($this->_link_list) ) {
+            $text .= "\n\nLinks:\n------\n" . $this->_link_list;
+        }
+
+        $this->text = $text;
+
+        $this->_converted = true;
+    }
+
+    /**
+     *  Workhorse function that does actual conversion.
+     *
+     *  First performs custom tag replacement specified by $search and
+     *  $replace arrays. Then strips any remaining HTML tags, reduces whitespace
+     *  and newlines to a readable format, and word wraps the text to
+     *  $width characters.
+     *
+     *  @param string Reference to HTML content string
+     *
+     *  @access private
+     *  @return void
+     */
+    function _converter(&$text)
+    {
+        // Convert <BLOCKQUOTE> (before PRE!)
+        $this->_convert_blockquotes($text);
+
         // Convert <PRE>
         $this->_convert_pre($text);
 
         // Run our defined search-and-replace
         $text = preg_replace($this->search, $this->replace, $text);
-        $text = preg_replace_callback($this->callback_search, array('html2text', '_preg_callback'), $text);
 
         // Replace known html entities
         $text = html_entity_decode($text, ENT_COMPAT, 'UTF-8');
 
+        // Run our defined search-and-replace with callback
+        $text = preg_replace_callback($this->callback_search, array('html2text', '_preg_callback'), $text);
+
         // Remove unknown/unhandled entities (this cannot be done in search-and-replace block)
-        $text = preg_replace('/&[^&;]+;/i', '', $text); 
+        $text = preg_replace('/&([a-zA-Z0-9]{2,6}|#[0-9]{2,4});/', '', $text);
+
+        // Convert "|+|amp|+|" into "&", need to be done after handling of unknown entities
+        // This properly handles situation of "&amp;quot;" in input string
+        $text = str_replace('|+|amp|+|', '&', $text);
 
         // Strip any other HTML tags
         $text = strip_tags($text, $this->allowed_tags);
@@ -483,21 +515,12 @@ class html2text
         $text = preg_replace("/\n\s+\n/", "\n\n", $text);
         $text = preg_replace("/[\n]{3,}/", "\n\n", $text);
 
-        // Add link list
-        if ( !empty($this->_link_list) ) {
-            $text .= "\n\nLinks:\n------\n" . $this->_link_list;
-        }
-
         // Wrap the text to a readable format
         // for PHP versions >= 4.0.2. Default width is 75
         // If width is 0 or less, don't wrap the text.
         if ( $this->width > 0 ) {
                $text = wordwrap($text, $this->width);
         }
-
-        $this->text = $text;
-
-        $this->_converted = true;
     }
 
     /**
@@ -515,20 +538,22 @@ class html2text
      */
     function _build_link_list( $link, $display )
     {
-       if ( !$this->_do_links ) return $display;
-       
-       if ( substr($link, 0, 7) == 'http://' || substr($link, 0, 8) == 'https://' ||
-             substr($link, 0, 7) == 'mailto:' ) {
+           if ( !$this->_do_links )
+               return $display;
+
+           if ( substr($link, 0, 7) == 'http://' || substr($link, 0, 8) == 'https://' ||
+            substr($link, 0, 7) == 'mailto:'
+        ) {
             $this->_link_count++;
-            $this->_link_list .= "[" . $this->_link_count . "] $link\n";
+            $this->_link_list .= '[' . $this->_link_count . "] $link\n";
             $additional = ' [' . $this->_link_count . ']';
-       } elseif ( substr($link, 0, 11) == 'javascript:' ) {
-               // Don't count the link; ignore it
-               $additional = '';
+           } elseif ( substr($link, 0, 11) == 'javascript:' ) {
+                   // Don't count the link; ignore it
+                   $additional = '';
                // what about href="#anchor" ?
         } else {
             $this->_link_count++;
-            $this->_link_list .= "[" . $this->_link_count . "] " . $this->url;
+            $this->_link_list .= '[' . $this->_link_count . '] ' . $this->url;
             if ( substr($link, 0, 1) != '/' ) {
                 $this->_link_list .= '/';
             }
@@ -538,7 +563,7 @@ class html2text
 
         return $display . $additional;
     }
-    
+
     /**
      *  Helper function for PRE body conversion.
      *
@@ -547,12 +572,68 @@ class html2text
      */
     function _convert_pre(&$text)
     {
-        while(preg_match('/<pre[^>]*>(.*)<\/pre>/ismU', $text, $matches)) {
+        while (preg_match('/<pre[^>]*>(.*)<\/pre>/ismU', $text, $matches)) {
             $result = preg_replace($this->pre_search, $this->pre_replace, $matches[1]);
             $text = preg_replace('/<pre[^>]*>.*<\/pre>/ismU', '<div><br>' . $result . '<br></div>', $text, 1);
         }
     }
 
+    /**
+     *  Helper function for BLOCKQUOTE body conversion.
+     *
+     *  @param string HTML content
+     *  @access private
+     */
+    function _convert_blockquotes(&$text)
+    {
+        if (preg_match_all('/<\/*blockquote[^>]*>/i', $text, $matches, PREG_OFFSET_CAPTURE)) {
+            $level = 0;
+            $diff = 0;
+            foreach ($matches[0] as $m) {
+                if ($m[0][0] == '<' && $m[0][1] == '/') {
+                    $level--;
+                    if ($level < 0) {
+                        $level = 0; // malformed HTML: go to next blockquote
+                    }
+                    else if ($level > 0) {
+                        // skip inner blockquote
+                    }
+                    else {
+                        $end  = $m[1];
+                        $len  = $end - $taglen - $start;
+                        // Get blockquote content
+                        $body = substr($text, $start + $taglen - $diff, $len);
+
+                        // Set text width
+                        $p_width = $this->width;
+                        if ($this->width > 0) $this->width -= 2;
+                        // Convert blockquote content
+                        $body = trim($body);
+                        $this->_converter($body);
+                        // Add citation markers and create PRE block
+                        $body = preg_replace('/((^|\n)>*)/', '\\1> ', trim($body));
+                        $body = '<pre>' . htmlspecialchars($body) . '</pre>';
+                        // Re-set text width
+                        $this->width = $p_width;
+                        // Replace content
+                        $text = substr($text, 0, $start - $diff)
+                            . $body . substr($text, $end + strlen($m[0]) - $diff);
+
+                        $diff = $len + $taglen + strlen($m[0]) - strlen($body);
+                        unset($body);
+                    }
+                }
+                else {
+                    if ($level == 0) {
+                        $start = $m[1];
+                        $taglen = strlen($m[0]);
+                    }
+                    $level ++;
+                }
+            }
+        }
+    }
+
     /**
      *  Callback function for preg_replace_callback use.
      *
@@ -566,7 +647,7 @@ class html2text
         case 'b':
         case 'strong':
             return $this->_strtoupper($matches[2]);
-        case 'hr':
+        case 'th':
             return $this->_strtoupper("\t\t". $matches[2] ."\n");
         case 'h':
             return $this->_strtoupper("\n\n". $matches[2] ."\n\n");
@@ -590,5 +671,3 @@ class html2text
             return strtoupper($str);
     }
 }
-
-?>
diff --git a/program/lib/imap.inc b/program/lib/imap.inc
deleted file mode 100644 (file)
index 9d896ff..0000000
+++ /dev/null
@@ -1,2534 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////
-//     
-//     Iloha IMAP Library (IIL)
-//
-//     (C)Copyright 2002 Ryo Chijiiwa <Ryo@IlohaMail.org>
-//
-//     This file is part of IlohaMail. IlohaMail is free software released 
-//     under the GPL license.  See enclosed file COPYING for details, or 
-//     see http://www.fsf.org/copyleft/gpl.html
-//
-/////////////////////////////////////////////////////////
-
-/********************************************************
-
-       FILE: include/imap.inc
-       PURPOSE:
-               Provide alternative IMAP library that doesn't rely on the standard 
-               C-Client based version.  This allows IlohaMail to function regardless
-               of whether or not the PHP build it's running on has IMAP functionality
-               built-in.
-       USEAGE:
-               Function containing "_C_" in name require connection handler to be
-               passed as one of the parameters.  To obtain connection handler, use
-               iil_Connect()
-       VERSION:
-               IlohaMail-0.9-20050415
-       CHANGES:
-               File altered by Thomas Bruederli <roundcube@gmail.com>
-               to fit enhanced equirements by the RoundCube Webmail:
-               - Added list of server capabilites and check these before invoking commands
-               - Added junk flag to iilBasicHeader
-               - Enhanced error reporting on fsockopen()
-               - Additional parameter for SORT command
-               - Removed Call-time pass-by-reference because deprecated
-               - Parse charset from content-type in iil_C_FetchHeaders()
-               - Enhanced heaer sorting
-               - Pass message as reference in iil_C_Append (to save memory)
-               - Added BCC and REFERENCE to the list of headers to fetch in iil_C_FetchHeaders()
-               - Leave messageID unchanged in iil_C_FetchHeaders()
-               - Avoid stripslahes in iil_Connect()
-               - Escape quotes and backslashes in iil_C_Login()
-               - Added patch to iil_SortHeaders() by Richard Green
-               - Removed <br> from error messages (better for logging)
-               - Added patch to iil_C_Sort() enabling UID SORT commands
-               - Added function iil_C_ID2UID()
-               - Casting date parts in iil_StrToTime() to avoid mktime() warnings
-               - Also acceppt LIST responses in iil_C_ListSubscribed()
-               - Sanity check of $message_set in iil_C_FetchHeaders(), iil_C_FetchHeaderIndex(), iil_C_FetchThreadHeaders()
-               - Implemented UID FETCH in iil_C_FetchHeaders()
-               - Abort do-loop on socket errors (fgets returns false)
-               - $ICL_SSL is not boolean anymore but contains the connection schema (ssl or tls)
-               - Removed some debuggers (echo ...)
-               File altered by Aleksander Machniak <alec@alec.pl>
-               - trim(chop()) replaced by trim()
-               - added iil_Escape()/iil_UnEscape() with support for " and \ in folder names
-               - support \ character in username in iil_C_Login()
-               - fixed iil_MultLine(): use iil_ReadBytes() instead of iil_ReadLine()
-               - fixed iil_C_FetchStructureString() to handle many literal strings in response
-               - removed hardcoded data size in iil_ReadLine() 
-               - added iil_PutLine() wrapper for fputs()
-               - code cleanup and identation fixes
-               - removed flush() calls in iil_C_HandlePartBody() to prevent from memory leak (#1485187)
-               - don't return "??" from iil_C_GetQuota()
-               - RFC3501 [7.1] don't call CAPABILITY if was returned in server 
-                 optional resposne in iil_Connect(), added iil_C_GetCapability()
-               - remove 'undisclosed-recipients' string from 'To' header
-               - iil_C_HandlePartBody(): added 6th argument and fixed endless loop
-               - added iil_PutLineC() 
-               - fixed iil_C_Sort() to support very long and/or divided responses
-               - added BYE/BAD response simple support for endless loop prevention
-               - added 3rd argument in iil_StartsWith* functions
-               - fix iil_C_FetchPartHeader() in some cases by use of iil_C_HandlePartBody()
-               - allow iil_C_HandlePartBody() to fetch whole message
-               - optimize iil_C_FetchHeaders() to use only one FETCH command
-               - added 4th argument to iil_Connect()
-               - allow setting rootdir and delimiter before connect
-               - support multiquota result
-               - include BODYSTRUCTURE in iil_C_FetchHeaders()
-               - added iil_C_FetchMIMEHeaders() function
-               - added \* flag support 
-               - use PREG instead of EREG
-               - removed caching functions
-               - handling connection startup response
-               - added UID EXPUNGE support
-               - fixed problem with double quotes and spaces in folder names in LIST and LSUB 
-               - rewritten iil_C_FetchHeaderIndex()
-
-********************************************************/
-
-/**
- * @todo Possibly clean up more CS.
- * @todo Try to replace most double-quotes with single-quotes.
- * @todo Split this file into smaller files.
- * @todo Refactor code.
- * @todo Replace echo-debugging (make it adhere to config setting and log)
- */
-
-
-if (!isset($IMAP_USE_HEADER_DATE) || !$IMAP_USE_HEADER_DATE) {
-    $IMAP_USE_INTERNAL_DATE = true;
-}
-
-$GLOBALS['IMAP_FLAGS'] = array(
-    'SEEN'     => '\\Seen',
-    'DELETED'  => '\\Deleted',
-    'RECENT'   => '\\Recent',
-    'ANSWERED' => '\\Answered',
-    'DRAFT'    => '\\Draft',
-    'FLAGGED'  => '\\Flagged',
-    'FORWARDED' => '$Forwarded',
-    'MDNSENT'  => '$MDNSent',
-    '*'        => '\\*',
-);
-
-$iil_error;
-$iil_errornum;
-$iil_selected;
-
-/**
- * @todo Change class vars to public/private
- */
-class iilConnection
-{
-       var $fp;
-       var $error;
-       var $errorNum;
-       var $selected;
-       var $message;
-       var $host;
-       var $exists;
-       var $recent;
-       var $rootdir;
-       var $delimiter;
-       var $capability = array();
-       var $permanentflags = array();
-       var $capability_readed = false;
-}
-
-/**
- * @todo Change class vars to public/private
- */
-class iilBasicHeader
-{
-       var $id;
-       var $uid;
-       var $subject;
-       var $from;
-       var $to;
-       var $cc;
-       var $replyto;
-       var $in_reply_to;
-       var $date;
-       var $messageID;
-       var $size;
-       var $encoding;
-       var $charset;
-       var $ctype;
-       var $flags;
-       var $timestamp;
-       var $f;
-       var $body_structure;
-       var $internaldate;
-       var $references;
-       var $priority;
-       var $mdn_to;
-       var $mdn_sent = false;
-       var $is_draft = false;
-       var $seen = false;
-       var $deleted = false;
-       var $recent = false;
-       var $answered = false;
-       var $forwarded = false;
-       var $junk = false;
-       var $flagged = false;
-       var $others = array();
-}
-
-/**
- * @todo Change class vars to public/private
- */
-class iilThreadHeader
-{
-       var $id;
-       var $sbj;
-       var $irt;
-       var $mid;
-}
-
-function iil_xor($string, $string2) {
-       $result = '';
-       $size = strlen($string);
-       for ($i=0; $i<$size; $i++) {
-               $result .= chr(ord($string[$i]) ^ ord($string2[$i]));
-       }
-       return $result;
-}
-
-function iil_PutLine($fp, $string, $endln=true) {
-       global $my_prefs;
-       
-       if (!empty($my_prefs['debug_mode']))
-               write_log('imap', 'C: '. rtrim($string));
-       
-        return fputs($fp, $string . ($endln ? "\r\n" : ''));
-}
-
-// iil_PutLine replacement with Command Continuation Requests (RFC3501 7.5) support
-function iil_PutLineC($fp, $string, $endln=true) {
-       if ($endln)
-               $string .= "\r\n";
-
-       $res = 0;
-       if ($parts = preg_split('/(\{[0-9]+\}\r\n)/m', $string, -1, PREG_SPLIT_DELIM_CAPTURE)) {
-               for($i=0, $cnt=count($parts); $i<$cnt; $i++) {
-                       if(preg_match('/^\{[0-9]+\}\r\n$/', $parts[$i+1])) {
-                               $res += iil_PutLine($fp, $parts[$i].$parts[$i+1], false);
-                               $line = iil_ReadLine($fp, 1000);
-                               // handle error in command
-                               if ($line[0] != '+')
-                                       return false;
-                               $i++;
-                       }
-                       else
-                               $res += iil_PutLine($fp, $parts[$i], false);
-               }
-       }
-       return $res;
-}
-
-function iil_ReadLine($fp, $size=1024) {
-       global $my_prefs;
-       
-       $line = '';
-
-       if (!$fp) {
-               return $line;
-       }
-    
-       if (!$size) {
-               $size = 1024;
-       }
-    
-       do {
-               $buffer = fgets($fp, $size);
-
-               if ($buffer === false) {
-                       break;
-               }
-               if (!empty($my_prefs['debug_mode']))
-                       write_log('imap', 'S: '. chop($buffer));
-               $line .= $buffer;
-       } while ($buffer[strlen($buffer)-1] != "\n");
-
-       return $line;
-}
-
-function iil_MultLine($fp, $line, $escape=false) {
-       $line = chop($line);
-       if (preg_match('/\{[0-9]+\}$/', $line)) {
-               $out = '';
-        
-               preg_match_all('/(.*)\{([0-9]+)\}$/', $line, $a);
-               $bytes = $a[2][0];
-               while (strlen($out) < $bytes) {
-                       $line = iil_ReadBytes($fp, $bytes); 
-                       $out .= $line;
-               }
-
-               $line = $a[1][0] . '"' . ($escape ? iil_Escape($out) : $out) . '"';
-       }
-       return $line;
-}
-
-function iil_ReadBytes($fp, $bytes) {
-       global $my_prefs;
-       $data = '';
-       $len  = 0;
-       do {
-               $d = fread($fp, $bytes-$len);
-               if (!empty($my_prefs['debug_mode']))
-                       write_log('imap', 'S: '. $d);
-                $data .= $d;
-               $data_len = strlen($data);
-               if ($len == $data_len) {
-                       break; //nothing was read -> exit to avoid apache lockups
-               }
-               $len = $data_len;
-       } while ($len < $bytes);
-       
-       return $data;
-}
-
-// don't use it in loops, until you exactly know what you're doing
-function iil_ReadReply($fp) {
-       do {
-               $line = trim(iil_ReadLine($fp, 1024));
-       } while ($line[0] == '*');
-
-       return $line;
-}
-
-function iil_ParseResult($string) {
-       $a = explode(' ', trim($string));
-       if (count($a) >= 2) {
-               $res = strtoupper($a[1]);
-               if ($res == 'OK') {
-                       return 0;
-               } else if ($res == 'NO') {
-                       return -1;
-               } else if ($res == 'BAD') {
-                       return -2;
-               } else if ($res == 'BYE') {
-                       return -3;
-               }
-       }
-       return -4;
-}
-
-// check if $string starts with $match (or * BYE/BAD)
-function iil_StartsWith($string, $match, $error=false) {
-       $len = strlen($match);
-       if ($len == 0) {
-               return false;
-       }
-       if (strncmp($string, $match, $len) == 0) {
-               return true;
-       }
-       if ($error && preg_match('/^\* (BYE|BAD) /i', $string)) {
-               return true;
-       }
-       return false;
-}
-
-function iil_StartsWithI($string, $match, $error=false) {
-       $len = strlen($match);
-       if ($len == 0) {
-               return false;
-       }
-       if (strncasecmp($string, $match, $len) == 0) {
-               return true;
-       }
-       if ($error && preg_match('/^\* (BYE|BAD) /i', $string)) {
-               return true;
-       }
-       return false;
-}
-
-function iil_Escape($string)
-{
-       return strtr($string, array('"'=>'\\"', '\\' => '\\\\')); 
-}
-
-function iil_UnEscape($string)
-{
-       return strtr($string, array('\\"'=>'"', '\\\\' => '\\')); 
-}
-
-function iil_C_GetCapability(&$conn, $name)
-{
-       if (in_array($name, $conn->capability)) {
-               return true;
-       }
-       else if ($conn->capability_readed) {
-               return false;
-       }
-
-       // get capabilities (only once) because initial 
-       // optional CAPABILITY response may differ
-       $conn->capability = array();
-
-       iil_PutLine($conn->fp, "cp01 CAPABILITY");
-       do {
-               $line = trim(iil_ReadLine($conn->fp, 1024));
-               $a = explode(' ', $line);
-               if ($line[0] == '*') {
-                       while (list($k, $w) = each($a)) {
-                               if ($w != '*' && $w != 'CAPABILITY')
-                                       $conn->capability[] = strtoupper($w);
-                       }
-               }
-       } while ($a[0] != 'cp01');
-       
-       $conn->capability_readed = true;
-
-       if (in_array($name, $conn->capability)) {
-               return true;
-       }
-
-       return false;
-}
-
-function iil_C_ClearCapability(&$conn)
-{
-       $conn->capability = array();
-       $conn->capability_readed = false;
-}
-
-function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge) {
-    
-    $ipad = '';
-    $opad = '';
-    
-    // initialize ipad, opad
-    for ($i=0;$i<64;$i++) {
-        $ipad .= chr(0x36);
-        $opad .= chr(0x5C);
-    }
-
-    // pad $pass so it's 64 bytes
-    $padLen = 64 - strlen($pass);
-    for ($i=0;$i<$padLen;$i++) {
-        $pass .= chr(0);
-    }
-    
-    // generate hash
-    $hash  = md5(iil_xor($pass,$opad) . pack("H*", md5(iil_xor($pass, $ipad) . base64_decode($encChallenge))));
-    
-    // generate reply
-    $reply = base64_encode($user . ' ' . $hash);
-    
-    // send result, get reply
-    iil_PutLine($conn->fp, $reply);
-    $line = iil_ReadLine($conn->fp, 1024);
-    
-    // process result
-    $result = iil_ParseResult($line);
-    if ($result == 0) {
-        $conn->error    .= '';
-        $conn->errorNum  = 0;
-        return $conn->fp;
-    }
-
-    if ($result == -3) fclose($conn->fp); // BYE response
-
-    $conn->error    .= 'Authentication for ' . $user . ' failed (AUTH): "';
-    $conn->error    .= htmlspecialchars($line) . '"';
-    $conn->errorNum  = $result;
-
-    return $result;
-}
-
-function iil_C_Login(&$conn, $user, $password) {
-
-    iil_PutLine($conn->fp, 'a001 LOGIN "'.iil_Escape($user).'" "'.iil_Escape($password).'"');
-
-    $line = iil_ReadReply($conn->fp);
-
-    // process result
-    $result = iil_ParseResult($line);
-
-    if ($result == 0) {
-        $conn->error    .= '';
-        $conn->errorNum  = 0;
-        return $conn->fp;
-    }
-
-    fclose($conn->fp);
-    
-    $conn->error    .= 'Authentication for ' . $user . ' failed (LOGIN): "';
-    $conn->error    .= htmlspecialchars($line)."\"";
-    $conn->errorNum  = $result;
-
-    return $result;
-}
-
-function iil_ParseNamespace2($str, &$i, $len=0, $l) {
-       if (!$l) {
-           $str = str_replace('NIL', '()', $str);
-       }
-       if (!$len) {
-           $len = strlen($str);
-       }
-       $data      = array();
-       $in_quotes = false;
-       $elem      = 0;
-       for ($i;$i<$len;$i++) {
-               $c = (string)$str[$i];
-               if ($c == '(' && !$in_quotes) {
-                       $i++;
-                       $data[$elem] = iil_ParseNamespace2($str, $i, $len, $l++);
-                       $elem++;
-               } else if ($c == ')' && !$in_quotes) {
-                       return $data;
-               } else if ($c == '\\') {
-                       $i++;
-                       if ($in_quotes) {
-                               $data[$elem] .= $c.$str[$i];
-                       }
-               } else if ($c == '"') {
-                       $in_quotes = !$in_quotes;
-                       if (!$in_quotes) {
-                               $elem++;
-                       }
-               } else if ($in_quotes) {
-                       $data[$elem].=$c;
-               }
-       }
-       return $data;
-}
-
-function iil_C_NameSpace(&$conn) {
-       global $my_prefs;
-
-       if (isset($my_prefs['rootdir']) && is_string($my_prefs['rootdir'])) {
-               $conn->rootdir = $my_prefs['rootdir'];
-               return true;
-       }
-       
-       if (!iil_C_GetCapability($conn, 'NAMESPACE')) {
-           return false;
-       }
-    
-       iil_PutLine($conn->fp, "ns1 NAMESPACE");
-       do {
-               $line = iil_ReadLine($conn->fp, 1024);
-               if (iil_StartsWith($line, '* NAMESPACE')) {
-                       $i    = 0;
-                       $line = iil_UnEscape($line);
-                       $data = iil_ParseNamespace2(substr($line,11), $i, 0, 0);
-               }
-       } while (!iil_StartsWith($line, 'ns1', true));
-       
-       if (!is_array($data)) {
-           return false;
-       }
-    
-       $user_space_data = $data[0];
-       if (!is_array($user_space_data)) {
-           return false;
-       }
-    
-       $first_userspace = $user_space_data[0];
-       if (count($first_userspace)!=2) {
-           return false;
-       }
-    
-       $conn->rootdir       = $first_userspace[0];
-       $conn->delimiter     = $first_userspace[1];
-       $my_prefs['rootdir'] = substr($conn->rootdir, 0, -1);
-       $my_prefs['delimiter'] = $conn->delimiter;
-       
-       return true;
-}
-
-function iil_Connect($host, $user, $password, $options=null) { 
-       global $iil_error, $iil_errornum;
-       global $ICL_SSL, $ICL_PORT;
-       global $my_prefs, $IMAP_USE_INTERNAL_DATE;
-       
-       $iil_error = '';
-       $iil_errornum = 0;
-
-       // set some imap options
-       if (is_array($options)) {
-               foreach($options as $optkey => $optval) {
-                       if ($optkey == 'imap') {
-                               $auth_method = strtoupper($optval);
-                       } else if ($optkey == 'rootdir') {
-                               $my_prefs['rootdir'] = $optval;
-                       } else if ($optkey == 'delimiter') {
-                               $my_prefs['delimiter'] = $optval;
-                       } else if ($optkey == 'debug_mode') {
-                               $my_prefs['debug_mode'] = $optval;
-                       }
-               }
-       }
-
-       if (empty($auth_method))
-               $auth_method = 'CHECK';
-               
-       $message = "INITIAL: $auth_method\n";
-               
-       $result = false;
-       
-       // initialize connection
-       $conn              = new iilConnection;
-       $conn->error       = '';
-       $conn->errorNum    = 0;
-       $conn->selected    = '';
-       $conn->user        = $user;
-       $conn->host        = $host;
-       
-       if ($my_prefs['sort_field'] == 'INTERNALDATE') {
-               $IMAP_USE_INTERNAL_DATE = true;
-       } else if ($my_prefs['sort_field'] == 'DATE') {
-               $IMAP_USE_INTERNAL_DATE = false;
-       }
-       
-       //check input
-       if (empty($host)) {
-               $iil_error = "Empty host";
-               $iil_errornum = -1;
-               return false;
-       }
-       if (empty($user)) {
-               $iil_error = "Empty user";
-               $iil_errornum = -1;
-               return false;
-       }
-       if (empty($password)) {
-               $iil_error = "Empty password";
-               $iil_errornum = -1;
-               return false;
-       }
-
-       if (!$ICL_PORT) {
-               $ICL_PORT = 143;
-       }
-       //check for SSL
-       if ($ICL_SSL && $ICL_SSL != 'tls') {
-               $host = $ICL_SSL . '://' . $host;
-       }
-
-       $conn->fp = @fsockopen($host, $ICL_PORT, $errno, $errstr, 10);
-       if (!$conn->fp) {
-               $iil_error = "Could not connect to $host at port $ICL_PORT: $errstr";
-               $iil_errornum = -2;
-               return false;
-       }
-
-       stream_set_timeout($conn->fp, 10);
-       $line = trim(fgets($conn->fp, 8192));
-
-       if ($my_prefs['debug_mode'] && $line)
-               write_log('imap', 'S: '. $line);
-
-       // Connected to wrong port or connection error?
-       if (!preg_match('/^\* (OK|PREAUTH)/i', $line)) {
-               if ($line)
-                       $iil_error = "Wrong startup greeting ($host:$ICL_PORT): $line";
-               else
-                       $iil_error = "Empty startup greeting ($host:$ICL_PORT)";
-               $iil_errornum = -2;
-               return false;
-       }
-
-       // RFC3501 [7.1] optional CAPABILITY response
-       if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) {
-               $conn->capability = explode(' ', strtoupper($matches[1]));
-       }
-
-       $conn->message .= $line . "\n";
-
-       // TLS connection
-       if ($ICL_SSL == 'tls' && iil_C_GetCapability($conn, 'STARTTLS')) {
-               if (version_compare(PHP_VERSION, '5.1.0', '>=')) {
-                               iil_PutLine($conn->fp, 'stls000 STARTTLS');
-
-                       $line = iil_ReadLine($conn->fp, 4096);
-                       if (!iil_StartsWith($line, 'stls000 OK')) {
-                               $iil_error = "Server responded to STARTTLS with: $line";
-                               $iil_errornum = -2;
-                               return false;
-                       }
-
-                       if (!stream_socket_enable_crypto($conn->fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
-                               $iil_error = "Unable to negotiate TLS";
-                               $iil_errornum = -2;
-                               return false;
-                       }
-                       
-                       // Now we're authenticated, capabilities need to be reread
-                       iil_C_ClearCapability($conn);
-               }
-       }
-
-       if ($auth_method == 'CHECK') {
-               //check for supported auth methods
-               if (iil_C_GetCapability($conn, 'AUTH=CRAM-MD5') || iil_C_GetCapability($conn, 'AUTH=CRAM_MD5')) {
-                       $auth_method = 'AUTH';
-               }
-               else {
-                       //default to plain text auth
-                       $auth_method = 'PLAIN';
-               }
-       }
-
-       if ($auth_method == 'AUTH') {
-               //do CRAM-MD5 authentication
-               iil_PutLine($conn->fp, "a000 AUTHENTICATE CRAM-MD5");
-               $line = trim(iil_ReadLine($conn->fp, 1024));
-
-               if ($line[0] == '+') {
-                       //got a challenge string, try CRAM-5
-                       $result = iil_C_Authenticate($conn, $user, $password, substr($line,2));
-                       
-                       // stop if server sent BYE response
-                       if($result == -3) {
-                               $iil_error = $conn->error;
-                               $iil_errornum = $conn->errorNum;
-                               return false;
-                       }
-                       $conn->message .= "AUTH CRAM-MD5: $result\n";
-               } else {
-                       $conn->message .= "AUTH CRAM-MD5: failed\n";
-                       $auth_method = 'PLAIN';
-               }
-       }
-               
-       if (!$result || $auth_method == 'PLAIN') {
-               //do plain text auth
-               $result = iil_C_Login($conn, $user, $password);
-               $conn->message .= "AUTH PLAIN: $result\n";
-       }
-               
-       if (!is_int($result)) {
-               iil_C_Namespace($conn);
-               return $conn;
-       } else {
-               $iil_error = $conn->error;
-               $iil_errornum = $conn->errorNum;
-               return false;
-       }
-}
-
-function iil_Close(&$conn) {
-       if (iil_PutLine($conn->fp, "I LOGOUT")) {
-               fgets($conn->fp, 1024);
-               fclose($conn->fp);
-               $conn->fp = false;
-       }
-}
-
-function iil_ExplodeQuotedString($delimiter, $string) {
-       $result = array();
-       $strlen = strlen($string);
-         
-       for ($q=$p=$i=0; $i < $strlen; $i++) {
-               if ($string[$i] == "\"" && $string[$i-1] != "\\") {
-                       $q = $q ? false : true;
-               }
-               else if (!$q && preg_match("/$delimiter/", $string[$i])) {
-                       $result[] = substr($string, $p, $i - $p);
-                       $p = $i + 1;
-               }
-       }
-
-       $result[] = substr($string, $p);
-       return $result;
-}
-
-function iil_CheckForRecent($host, $user, $password, $mailbox) {
-       if (empty($mailbox)) {
-               $mailbox = 'INBOX';
-       }
-    
-       $conn = iil_Connect($host, $user, $password, 'plain');
-       $fp   = $conn->fp;
-       if ($fp) {
-               iil_PutLine($fp, "a002 EXAMINE \"".iil_Escape($mailbox)."\"");
-               do {
-                       $line=chop(iil_ReadLine($fp, 300));
-                       $a=explode(' ', $line);
-                       if (($a[0] == '*') && (strcasecmp($a[2], 'RECENT') == 0)) {
-                           $result = (int) $a[1];
-                       }
-               } while (!iil_StartsWith($a[0], 'a002', true));
-
-               iil_PutLine($fp, "a003 LOGOUT");
-               fclose($fp);
-       } else {
-           $result = -2;
-       }
-    
-       return $result;
-}
-
-function iil_C_Select(&$conn, $mailbox) {
-
-       if (empty($mailbox)) {
-               return false;
-       }
-       if ($conn->selected == $mailbox) {
-               return true;
-       }
-    
-       if (iil_PutLine($conn->fp, "sel1 SELECT \"".iil_Escape($mailbox).'"')) {
-               do {
-                       $line = chop(iil_ReadLine($conn->fp, 300));
-                       $a = explode(' ', $line);
-                       if (count($a) == 3) {
-                               $token = strtoupper($a[2]);
-                               if ($token == 'EXISTS') {
-                                       $conn->exists = (int) $a[1];
-                               }
-                               else if ($token == 'RECENT') {
-                                       $conn->recent = (int) $a[1];
-                               }
-                       }
-                       else if (preg_match('/\[?PERMANENTFLAGS\s+\(([^\)]+)\)\]/U', $line, $match)) {
-                               $conn->permanentflags = explode(' ', $match[1]);
-                       }
-               } while (!iil_StartsWith($line, 'sel1', true));
-
-               if (strcasecmp($a[1], 'OK') == 0) {
-                       $conn->selected = $mailbox;
-                       return true;
-               }
-       }
-       return false;
-}
-
-function iil_C_CheckForRecent(&$conn, $mailbox) {
-       if (empty($mailbox)) {
-               $mailbox = 'INBOX';
-       }
-    
-       iil_C_Select($conn, $mailbox);
-       if ($conn->selected == $mailbox) {
-               return $conn->recent;
-       }
-       return false;
-}
-
-function iil_C_CountMessages(&$conn, $mailbox, $refresh = false) {
-       if ($refresh) {
-               $conn->selected = '';
-       }
-       
-       iil_C_Select($conn, $mailbox);
-       if ($conn->selected == $mailbox) {
-               return $conn->exists;
-       }
-       return false;
-}
-
-function iil_SplitHeaderLine($string) {
-       $pos=strpos($string, ':');
-       if ($pos>0) {
-               $res[0] = substr($string, 0, $pos);
-               $res[1] = trim(substr($string, $pos+1));
-               return $res;
-       }
-       return $string;
-}
-
-function iil_StrToTime($date) {
-
-       // support non-standard "GMTXXXX" literal
-       $date = preg_replace('/GMT\s*([+-][0-9]+)/', '\\1', $date);
-        // if date parsing fails, we have a date in non-rfc format.
-       // remove token from the end and try again
-       while ((($ts = @strtotime($date))===false) || ($ts < 0))
-       {
-               $d = explode(' ', $date);
-               array_pop($d);
-               if (!$d) break;
-               $date = implode(' ', $d);
-       }
-
-       $ts = (int) $ts;
-
-       return $ts < 0 ? 0 : $ts;       
-}
-
-function iil_C_Sort(&$conn, $mailbox, $field, $add='', $is_uid=FALSE,
-    $encoding = 'US-ASCII') {
-
-       $field = strtoupper($field);
-       if ($field == 'INTERNALDATE') {
-           $field = 'ARRIVAL';
-       }
-       
-       $fields = array('ARRIVAL' => 1,'CC' => 1,'DATE' => 1,
-        'FROM' => 1, 'SIZE' => 1, 'SUBJECT' => 1, 'TO' => 1);
-       
-       if (!$fields[$field]) {
-           return false;
-       }
-
-       /*  Do "SELECT" command */
-       if (!iil_C_Select($conn, $mailbox)) {
-           return false;
-       }
-    
-       $is_uid = $is_uid ? 'UID ' : '';
-       
-       if (!empty($add)) {
-           $add = " $add";
-       }
-
-       $command  = 's ' . $is_uid . 'SORT (' . $field . ') ';
-       $command .= $encoding . ' ALL' . $add;
-       $line     = $data = '';
-
-       if (!iil_PutLineC($conn->fp, $command)) {
-           return false;
-       }
-       do {
-               $line = chop(iil_ReadLine($conn->fp));
-               if (iil_StartsWith($line, '* SORT')) {
-                       $data .= substr($line, 7);
-               } else if (preg_match('/^[0-9 ]+$/', $line)) {
-                       $data .= $line;
-               }
-       } while (!iil_StartsWith($line, 's ', true));
-       
-       $result_code = iil_ParseResult($line);
-       
-       if ($result_code != 0) {
-                $conn->error = 'iil_C_Sort: ' . $line . "\n";
-                return false;
-       }
-       
-       return preg_split('/\s+/', $data, -1, PREG_SPLIT_NO_EMPTY);
-}
-
-function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field='', $skip_deleted=true) {
-
-       list($from_idx, $to_idx) = explode(':', $message_set);
-       if (empty($message_set) ||
-               (isset($to_idx) && $to_idx != '*' && (int)$from_idx > (int)$to_idx)) {
-               return false;
-       }
-
-       $index_field = empty($index_field) ? 'DATE' : strtoupper($index_field);
-       
-       $fields_a['DATE']         = 1;
-       $fields_a['INTERNALDATE'] = 4;
-       $fields_a['FROM']         = 1;
-       $fields_a['REPLY-TO']     = 1;
-       $fields_a['SENDER']       = 1;
-       $fields_a['TO']           = 1;
-       $fields_a['SUBJECT']      = 1;
-       $fields_a['UID']          = 2;
-       $fields_a['SIZE']         = 2;
-       $fields_a['SEEN']         = 3;
-       $fields_a['RECENT']       = 3;
-       $fields_a['DELETED']      = 3;
-
-       if (!($mode = $fields_a[$index_field])) {
-               return false;
-       }
-
-       /*  Do "SELECT" command */
-       if (!iil_C_Select($conn, $mailbox)) {
-               return false;
-       }
-       
-       // build FETCH command string
-       $key     = 'fhi0';
-       $deleted = $skip_deleted ? ' FLAGS' : '';
-
-       if ($mode == 1)
-               $request = " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)]$deleted)";
-       else if ($mode == 2) {
-               if ($index_field == 'SIZE')
-                       $request = " FETCH $message_set (RFC822.SIZE$deleted)";
-               else
-                       $request = " FETCH $message_set ($index_field$deleted)";
-       } else if ($mode == 3)
-               $request = " FETCH $message_set (FLAGS)";
-       else // 4
-               $request = " FETCH $message_set (INTERNALDATE$deleted)";
-
-       $request = $key . $request;
-
-       if (!iil_PutLine($conn->fp, $request))
-               return false;
-
-       $result = array();
-
-       do {
-               $line = chop(iil_ReadLine($conn->fp, 200));
-               $line = iil_MultLine($conn->fp, $line);
-
-               if (preg_match('/^\* ([0-9]+) FETCH/', $line, $m)) {
-
-                       $id = $m[1];
-                       $flags = NULL;
-                                       
-                       if ($skip_deleted && preg_match('/FLAGS \(([^)]+)\)/', $line, $matches)) {
-                               $flags = explode(' ', strtoupper($matches[1]));
-                               if (in_array('\\DELETED', $flags)) {
-                                       $deleted[$id] = $id;
-                                       continue;
-                               }
-                       }
-
-                       if ($mode == 1) {
-                               if (preg_match('/BODY\[HEADER\.FIELDS \("?(DATE|FROM|REPLY-TO|SENDER|TO|SUBJECT)"?\)\] (.*)/', $line, $matches)) {
-                                       $value = preg_replace(array('/^"*[a-z]+:/i', '/\s+$/sm'), array('', ''), $matches[2]);
-                                       $value = trim($value);
-                                       if ($index_field == 'DATE') {
-                                               $result[$id] = iil_StrToTime($value);
-                                       } else {
-                                               $result[$id] = $value;
-                                       }
-                               } else {
-                                       $result[$id] = '';
-                               }
-                       } else if ($mode == 2) {
-                               if (preg_match('/\((UID|RFC822\.SIZE) ([0-9]+)/', $line, $matches)) {
-                                       $result[$id] = trim($matches[2]);
-                               } else {
-                                       $result[$id] = 0;
-                               }
-                       } else if ($mode == 3) {
-                               if (!$flags && preg_match('/FLAGS \(([^)]+)\)/', $line, $matches)) {
-                                       $flags = explode(' ', $matches[1]);
-                               }
-                               $result[$id] = in_array('\\'.$index_field, $flags) ? 1 : 0;
-                       } else if ($mode == 4) {
-                               if (preg_match('/INTERNALDATE "([^"]+)"/', $line, $matches)) {
-                                       $result[$id] = iil_StrToTime($matches[1]);
-                               } else {
-                                       $result[$id] = 0;
-                               }
-                       }
-               }
-       } while (!iil_StartsWith($line, $key, true));
-
-/*
-       //check number of elements...
-       if (is_numeric($from_idx) && is_numeric($to_idx)) {
-               //count how many we should have
-               $should_have = $to_idx - $from_idx + 1;
-               
-               //if we have less, try and fill in the "gaps"
-               if (count($result) < $should_have) {
-                       for ($i=$from_idx; $i<=$to_idx; $i++) {
-                               if (!isset($result[$i])) {
-                                       $result[$i] = '';
-                               }
-                       }
-               }
-       }
-*/
-       return $result; 
-}
-
-function iil_CompressMessageSet($message_set) {
-       //given a comma delimited list of independent mid's, 
-       //compresses by grouping sequences together
-       
-       //if less than 255 bytes long, let's not bother
-       if (strlen($message_set)<255) {
-           return $message_set;
-       }
-    
-       //see if it's already been compress
-       if (strpos($message_set, ':') !== false) {
-           return $message_set;
-       }
-    
-       //separate, then sort
-       $ids = explode(',', $message_set);
-       sort($ids);
-       
-       $result = array();
-       $start  = $prev = $ids[0];
-
-       foreach ($ids as $id) {
-               $incr = $id - $prev;
-               if ($incr > 1) {                        //found a gap
-                       if ($start == $prev) {
-                           $result[] = $prev;  //push single id
-                       } else {
-                           $result[] = $start . ':' . $prev;   //push sequence as start_id:end_id
-                       }
-                       $start = $id;                   //start of new sequence
-               }
-               $prev = $id;
-       }
-
-       //handle the last sequence/id
-       if ($start==$prev) {
-           $result[] = $prev;
-       } else {
-           $result[] = $start.':'.$prev;
-       }
-    
-       //return as comma separated string
-       return implode(',', $result);
-}
-
-function iil_C_UIDsToMIDs(&$conn, $mailbox, $uids) {
-       if (!is_array($uids) || count($uids) == 0) {
-           return array();
-       }
-       return iil_C_Search($conn, $mailbox, 'UID ' . implode(',', $uids));
-}
-
-function iil_C_UIDToMID(&$conn, $mailbox, $uid) {
-       $result = iil_C_UIDsToMIDs($conn, $mailbox, array($uid));
-       if (count($result) == 1) {
-           return $result[0];
-       }
-        return false;
-}
-
-function iil_C_FetchUIDs(&$conn,$mailbox) {
-       global $clock;
-       
-       $num = iil_C_CountMessages($conn, $mailbox);
-       if ($num == 0) {
-           return array();
-       }
-       $message_set = '1' . ($num>1?':' . $num:'');
-       
-       return iil_C_FetchHeaderIndex($conn, $mailbox, $message_set, 'UID');
-}
-
-function iil_SortThreadHeaders($headers, $index_a, $uids) {
-       asort($index_a);
-       $result = array();
-       foreach ($index_a as $mid=>$foobar) {
-               $uid = $uids[$mid];
-               $result[$uid] = $headers[$uid];
-       }
-       return $result;
-}
-
-function iil_C_FetchThreadHeaders(&$conn, $mailbox, $message_set) {
-       global $clock;
-       global $index_a;
-       
-       list($from_idx, $to_idx) = explode(':', $message_set);
-       if (empty($message_set) || (isset($to_idx)
-        && (int)$from_idx > (int)$to_idx)) {
-               return false;
-       }
-
-       $result = array();
-       $uids   = iil_C_FetchUIDs($conn, $mailbox);
-       $debug  = false;
-       
-       $message_set = iil_CompressMessageSet($message_set);
-    
-       /* if we're missing any, get them */
-       if ($message_set) {
-               /* FETCH date,from,subject headers */
-               $key        = 'fh';
-               $fp         = $conn->fp;
-               $request    = $key . " FETCH $message_set ";
-               $request   .= "(BODY.PEEK[HEADER.FIELDS (SUBJECT MESSAGE-ID IN-REPLY-TO)])";
-               $mid_to_id  = array();
-               if (!iil_PutLine($fp, $request)) {
-                   return false;
-               }
-               do {
-                       $line = chop(iil_ReadLine($fp, 1024));
-                       if ($debug) {
-                           echo $line . "\n";
-                       }
-                       if (preg_match('/\{[0-9]+\}$/', $line)) {
-                               $a       = explode(' ', $line);
-                               $new = array();
-
-                               $new_thhd = new iilThreadHeader;
-                               $new_thhd->id = $a[1];
-                               do {
-                                       $line = chop(iil_ReadLine($fp, 1024), "\r\n");
-                                       if (iil_StartsWithI($line, 'Message-ID:')
-                                               || (iil_StartsWithI($line,'In-Reply-To:'))
-                                               || (iil_StartsWithI($line,'SUBJECT:'))) {
-
-                                               $pos        = strpos($line, ':');
-                                               $field_name = substr($line, 0, $pos);
-                                               $field_val  = substr($line, $pos+1);
-
-                                               $new[strtoupper($field_name)] = trim($field_val);
-
-                                       } else if (preg_match('/^\s+/', $line)) {
-                                               $new[strtoupper($field_name)] .= trim($line);
-                                       }
-                               } while ($line[0] != ')');
-                
-                               $new_thhd->sbj = $new['SUBJECT'];
-                               $new_thhd->mid = substr($new['MESSAGE-ID'], 1, -1);
-                               $new_thhd->irt = substr($new['IN-REPLY-TO'], 1, -1);
-                               
-                               $result[$uids[$new_thhd->id]] = $new_thhd;
-                       }
-               } while (!iil_StartsWith($line, 'fh'));
-       }
-       
-       /* sort headers */
-       if (is_array($index_a)) {
-               $result = iil_SortThreadHeaders($result, $index_a, $uids);      
-       }
-       
-       //echo 'iil_FetchThreadHeaders:'."\n";
-       //print_r($result);
-       
-       return $result;
-}
-
-function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock) {
-       global $index_a;
-
-       list($from_idx, $to_idx) = explode(':', $message_set);
-       if (empty($message_set) || (isset($to_idx)
-               && (int)$from_idx > (int)$to_idx)) {
-               return false;
-       }
-    
-       $result    = array();
-       $roots     = array();
-       $root_mids = array();
-       $sub_mids  = array();
-       $strays    = array();
-       $messages  = array();
-       $fp        = $conn->fp;
-       $debug     = false;
-       
-       $sbj_filter_pat = '/[a-z]{2,3}(\[[0-9]*\])?:(\s*)/i';
-       
-       /*  Do "SELECT" command */
-       if (!iil_C_Select($conn, $mailbox)) {
-           return false;
-       }
-    
-       /* FETCH date,from,subject headers */
-       $mid_to_id = array();
-       $messages  = array();
-       $headers   = iil_C_FetchThreadHeaders($conn, $mailbox, $message_set);
-       if ($clock) {
-           $clock->register('fetched headers');
-       }
-    
-       if ($debug) {
-           print_r($headers);
-       }
-    
-       /* go through header records */
-       foreach ($headers as $header) {
-               //$id = $header['i'];
-               //$new = array('id'=>$id, 'MESSAGE-ID'=>$header['m'], 
-               //                      'IN-REPLY-TO'=>$header['r'], 'SUBJECT'=>$header['s']);
-               $id  = $header->id;
-               $new = array('id' => $id, 'MESSAGE-ID' => $header->mid, 
-                       'IN-REPLY-TO' => $header->irt, 'SUBJECT' => $header->sbj);
-
-               /* add to message-id -> mid lookup table */
-               $mid_to_id[$new['MESSAGE-ID']] = $id;
-               
-               /* if no subject, use message-id */
-               if (empty($new['SUBJECT'])) {
-                   $new['SUBJECT'] = $new['MESSAGE-ID'];
-               }
-        
-               /* if subject contains 'RE:' or has in-reply-to header, it's a reply */
-               $sbj_pre = '';
-               $has_re = false;
-               if (preg_match($sbj_filter_pat, $new['SUBJECT'])) {
-                   $has_re = true;
-               }
-               if ($has_re || $new['IN-REPLY-TO']) {
-                   $sbj_pre = 'RE:';
-               }
-        
-               /* strip out 're:', 'fw:' etc */
-               if ($has_re) {
-                   $sbj = preg_replace($sbj_filter_pat, '', $new['SUBJECT']);
-               } else {
-                   $sbj = $new['SUBJECT'];
-               }
-               $new['SUBJECT'] = $sbj_pre.$sbj;
-               
-               
-               /* if subject not a known thread-root, add to list */
-               if ($debug) {
-                   echo $id . ' ' . $new['SUBJECT'] . "\t" . $new['MESSAGE-ID'] . "\n";
-               }
-               $root_id = $roots[$sbj];
-               
-               if ($root_id && ($has_re || !$root_in_root[$root_id])) {
-                       if ($debug) {
-                           echo "\tfound root: $root_id\n";
-                       }
-                       $sub_mids[$new['MESSAGE-ID']] = $root_id;
-                       $result[$root_id][]           = $id;
-               } else if (!isset($roots[$sbj]) || (!$has_re && $root_in_root[$root_id])) {
-                       /* try to use In-Reply-To header to find root 
-                               unless subject contains 'Re:' */
-                       if ($has_re&&$new['IN-REPLY-TO']) {
-                               if ($debug) {
-                                   echo "\tlooking: ".$new['IN-REPLY-TO']."\n";
-                               }
-                               //reply to known message?
-                               $temp = $sub_mids[$new['IN-REPLY-TO']];
-                               
-                               if ($temp) {
-                                       //found it, root:=parent's root
-                                       if ($debug) {
-                                           echo "\tfound parent: ".$new['SUBJECT']."\n";
-                                       }
-                                       $result[$temp][]              = $id;
-                                       $sub_mids[$new['MESSAGE-ID']] = $temp;
-                                       $sbj                          = '';
-                               } else {
-                                       //if we can't find referenced parent, it's a "stray"
-                                       $strays[$id] = $new['IN-REPLY-TO'];
-                               }
-                       }
-                       
-                       //add subject as root
-                       if ($sbj) {
-                               if ($debug) {
-                                   echo "\t added to root\n";
-                               }
-                               $roots[$sbj]                  = $id;
-                               $root_in_root[$id]            = !$has_re;
-                               $sub_mids[$new['MESSAGE-ID']] = $id;
-                               $result[$id]                  = array($id);
-                       }
-                       if ($debug) {
-                           echo $new['MESSAGE-ID'] . "\t" . $sbj . "\n";
-                       }
-               }
-       }
-       
-       //now that we've gone through all the messages,
-       //go back and try and link up the stray threads
-       if (count($strays) > 0) {
-               foreach ($strays as $id=>$irt) {
-                       $root_id = $sub_mids[$irt];
-                       if (!$root_id || $root_id==$id) {
-                           continue;
-                       }
-                       $result[$root_id] = array_merge($result[$root_id],$result[$id]);
-                       unset($result[$id]);
-               }
-       }
-       
-       if ($clock) {
-           $clock->register('data prepped');
-       }
-    
-       if ($debug) {
-           print_r($roots);
-       }
-
-       return $result;
-}
-
-function iil_SortThreads(&$tree, $index, $sort_order = 'ASC') {
-       if (!is_array($tree) || !is_array($index)) {
-           return false;
-       }
-    
-       //create an id to position lookup table
-       $i = 0;
-       foreach ($index as $id=>$val) {
-               $i++;
-               $index[$id] = $i;
-       }
-       $max = $i+1;
-       
-       //for each tree, set array key to position
-       $itree = array();
-       foreach ($tree as $id=>$node) {
-               if (count($tree[$id])<=1) {
-                       //for "threads" with only one message, key is position of that message
-                       $n         = $index[$id];
-                       $itree[$n] = array($n=>$id);
-               } else {
-                       //for "threads" with multiple messages, 
-                       $min   = $max;
-                       $new_a = array();
-                       foreach ($tree[$id] as $mid) {
-                               $new_a[$index[$mid]] = $mid;            //create new sub-array mapping position to id
-                               $pos                 = $index[$mid];
-                               if ($pos&&$pos<$min) {
-                                   $min = $index[$mid];        //find smallest position
-                               }
-                       }
-                       $n = $min;      //smallest position of child is thread position
-                       
-                       //assign smallest position to root level key
-                       //set children array to one created above
-                       ksort($new_a);
-                       $itree[$n] = $new_a;
-               }
-       }
-       
-       //sort by key, this basically sorts all threads
-       ksort($itree);
-       $i   = 0;
-       $out = array();
-       foreach ($itree as $k=>$node) {
-               $out[$i] = $itree[$k];
-               $i++;
-       }
-       
-       return $out;
-}
-
-function iil_IndexThreads(&$tree) {
-       /* creates array mapping mid to thread id */
-       
-       if (!is_array($tree)) {
-           return false;
-       }
-    
-       $t_index = array();
-       foreach ($tree as $pos=>$kids) {
-               foreach ($kids as $kid) $t_index[$kid] = $pos;
-       }
-       
-       return $t_index;
-}
-
-function iil_C_FetchHeaders(&$conn, $mailbox, $message_set, $uidfetch=false, $bodystr=false, $add='')
-{
-       global $IMAP_USE_INTERNAL_DATE;
-       
-       $result = array();
-       $fp     = $conn->fp;
-       
-       /*  Do "SELECT" command */
-       if (!iil_C_Select($conn, $mailbox)) {
-               $conn->error = "Couldn't select $mailbox";
-               return false;
-       }
-
-       $message_set = iil_CompressMessageSet($message_set);
-
-       if ($add)
-               $add = ' '.strtoupper(trim($add));
-
-       /* FETCH uid, size, flags and headers */
-       $key      = 'FH12';
-       $request  = $key . ($uidfetch ? ' UID' : '') . " FETCH $message_set ";
-       $request .= "(UID RFC822.SIZE FLAGS INTERNALDATE ";
-       if ($bodystr)
-               $request .= "BODYSTRUCTURE ";
-       $request .= "BODY.PEEK[HEADER.FIELDS ";
-       $request .= "(DATE FROM TO SUBJECT REPLY-TO IN-REPLY-TO CC BCC ";
-       $request .= "CONTENT-TRANSFER-ENCODING CONTENT-TYPE MESSAGE-ID ";
-       $request .= "REFERENCES DISPOSITION-NOTIFICATION-TO X-PRIORITY".$add.")])";
-
-       if (!iil_PutLine($fp, $request)) {
-               return false;
-       }
-       do {
-               $line = iil_ReadLine($fp, 1024);
-               $line = iil_MultLine($fp, $line);
-
-               $a    = explode(' ', $line);
-               if (($line[0] == '*') && ($a[2] == 'FETCH')) {
-                       $id = $a[1];
-            
-                       $result[$id]            = new iilBasicHeader;
-                       $result[$id]->id        = $id;
-                       $result[$id]->subject   = '';
-                       $result[$id]->messageID = 'mid:' . $id;
-
-                       $lines = array();
-                       $ln = 0;
-                       /*
-                           Sample reply line:
-                           * 321 FETCH (UID 2417 RFC822.SIZE 2730 FLAGS (\Seen)
-                           INTERNALDATE "16-Nov-2008 21:08:46 +0100" BODYSTRUCTURE (...)
-                           BODY[HEADER.FIELDS ...
-                       */
-
-                       if (preg_match('/^\* [0-9]+ FETCH \((.*) BODY/s', $line, $matches)) {
-                               $str = $matches[1];
-
-                               // swap parents with quotes, then explode
-                               $str = preg_replace('/[()]/', '"', $str);
-                               $a = iil_ExplodeQuotedString(' ', $str);
-
-                               // did we get the right number of replies?
-                               $parts_count = count($a);
-                               if ($parts_count>=6) {
-                                       for ($i=0; $i<$parts_count; $i=$i+2) {
-                                               if ($a[$i] == 'UID')
-                                                       $result[$id]->uid = $a[$i+1];
-                                               else if ($a[$i] == 'RFC822.SIZE')
-                                                       $result[$id]->size = $a[$i+1];
-                                               else if ($a[$i] == 'INTERNALDATE')
-                                                       $time_str = $a[$i+1];
-                                               else if ($a[$i] == 'FLAGS')
-                                                       $flags_str = $a[$i+1];
-                                       }
-
-                                       $time_str = str_replace('"', '', $time_str);
-                                       
-                                       // if time is gmt...
-                                       $time_str = str_replace('GMT','+0000',$time_str);
-                                       
-                                       $result[$id]->internaldate = $time_str;
-                                       $result[$id]->timestamp = iil_StrToTime($time_str);
-                                       $result[$id]->date = $time_str;
-                               }
-
-                               // BODYSTRUCTURE 
-                               if($bodystr) {
-                                       while (!preg_match('/ BODYSTRUCTURE (.*) BODY\[HEADER.FIELDS/s', $line, $m)) {
-                                               $line2 = iil_ReadLine($fp, 1024);
-                                               $line .= iil_MultLine($fp, $line2, true);
-                                       }
-                                       $result[$id]->body_structure = $m[1];
-                               }
-
-                               // the rest of the result
-                               preg_match('/ BODY\[HEADER.FIELDS \(.*?\)\]\s*(.*)$/s', $line, $m);
-                               $reslines = explode("\n", trim($m[1], '"'));
-                               // re-parse (see below)
-                               foreach ($reslines as $resln) {
-                                       if (ord($resln[0])<=32) {
-                                               $lines[$ln] .= (empty($lines[$ln])?'':"\n").trim($resln);
-                                       } else {
-                                               $lines[++$ln] = trim($resln);
-                                       }
-                               }
-                       }
-
-                       /*
-                               Start parsing headers.  The problem is, some header "lines" take up multiple lines.
-                               So, we'll read ahead, and if the one we're reading now is a valid header, we'll
-                               process the previous line.  Otherwise, we'll keep adding the strings until we come
-                               to the next valid header line.
-                       */
-       
-                       do {
-                               $line = chop(iil_ReadLine($fp, 300), "\r\n");
-
-                               // The preg_match below works around communigate imap, which outputs " UID <number>)".
-                               // Without this, the while statement continues on and gets the "FH0 OK completed" message.
-                               // If this loop gets the ending message, then the outer loop does not receive it from radline on line 1249.  
-                               // This in causes the if statement on line 1278 to never be true, which causes the headers to end up missing
-                               // If the if statement was changed to pick up the fh0 from this loop, then it causes the outer loop to spin
-                               // An alternative might be:
-                               // if (!preg_match("/:/",$line) && preg_match("/\)$/",$line)) break;
-                               // however, unsure how well this would work with all imap clients.
-                               if (preg_match("/^\s*UID [0-9]+\)$/", $line)) {
-                                   break;
-                               }
-
-                               // handle FLAGS reply after headers (AOL, Zimbra?)
-                               if (preg_match('/\s+FLAGS \((.*)\)\)$/', $line, $matches)) {
-                                       $flags_str = $matches[1];
-                                       break;
-                               }
-
-                               if (ord($line[0])<=32) {
-                                       $lines[$ln] .= (empty($lines[$ln])?'':"\n").trim($line);
-                               } else {
-                                       $lines[++$ln] = trim($line);
-                               }
-                       // patch from "Maksim Rubis" <siburny@hotmail.com>
-                       } while ($line[0] != ')' && !iil_StartsWith($line, $key, true));
-
-                       if (strncmp($line, $key, strlen($key))) { 
-                               // process header, fill iilBasicHeader obj.
-                               // initialize
-                               if (is_array($headers)) {
-                                       reset($headers);
-                                       while (list($k, $bar) = each($headers)) {
-                                               $headers[$k] = '';
-                                       }
-                               }
-
-                               // create array with header field:data
-                               while ( list($lines_key, $str) = each($lines) ) {
-                                       list($field, $string) = iil_SplitHeaderLine($str);
-                                       
-                                       $field  = strtolower($field);
-                                       $string = preg_replace('/\n\s*/', ' ', $string);
-                                       
-                                       switch ($field) {
-                                       case 'date';
-                                               if (!$IMAP_USE_INTERNAL_DATE) {
-                                                       $result[$id]->date = $string;
-                                                       $result[$id]->timestamp = iil_StrToTime($string);
-                                               }
-                                               break;
-                                       case 'from':
-                                               $result[$id]->from = $string;
-                                               break;
-                                       case 'to':
-                                               $result[$id]->to = preg_replace('/undisclosed-recipients:[;,]*/', '', $string);
-                                               break;
-                                       case 'subject':
-                                               $result[$id]->subject = $string;
-                                               break;
-                                       case 'reply-to':
-                                               $result[$id]->replyto = $string;
-                                               break;
-                                       case 'cc':
-                                               $result[$id]->cc = $string;
-                                               break;
-                                       case 'bcc':
-                                               $result[$id]->bcc = $string;
-                                               break;
-                                       case 'content-transfer-encoding':
-                                               $result[$id]->encoding = $string;
-                                               break;
-                                       case 'content-type':
-                                               $ctype_parts = preg_split('/[; ]/', $string);
-                                               $result[$id]->ctype = array_shift($ctype_parts);
-                                               if (preg_match('/charset\s*=\s*"?([a-z0-9\-\.\_]+)"?/i', $string, $regs)) {
-                                                       $result[$id]->charset = $regs[1];
-                                               }
-                                               break;
-                                       case 'in-reply-to':
-                                               $result[$id]->in_reply_to = preg_replace('/[\n<>]/', '', $string);
-                                               break;
-                                       case 'references':
-                                               $result[$id]->references = $string;
-                                               break;
-                                       case 'return-receipt-to':
-                                       case 'disposition-notification-to':
-                                       case 'x-confirm-reading-to':
-                                               $result[$id]->mdn_to = $string;
-                                               break;
-                                       case 'message-id':
-                                               $result[$id]->messageID = $string;
-                                               break;
-                                       case 'x-priority':
-                                               if (preg_match('/^(\d+)/', $string, $matches))
-                                                       $result[$id]->priority = intval($matches[1]);
-                                               break;
-                                       default:
-                                               if (strlen($field) > 2)
-                                                       $result[$id]->others[$field] = $string;
-                                               break;
-                                       } // end switch ()
-                               } // end while ()
-                       } else {
-                               $a = explode(' ', $line);
-                       }
-
-                       // process flags
-                       if (!empty($flags_str)) {
-                               $flags_str = preg_replace('/[\\\"]/', '', $flags_str);
-                               $flags_a   = explode(' ', $flags_str);
-                                       
-                               if (is_array($flags_a)) {
-                               //      reset($flags_a);
-                                       foreach($flags_a as $flag) {
-                                               $flag = strtoupper($flag);
-                                               if ($flag == 'SEEN') {
-                                                   $result[$id]->seen = true;
-                                               } else if ($flag == 'DELETED') {
-                                                   $result[$id]->deleted = true;
-                                               } else if ($flag == 'RECENT') {
-                                                   $result[$id]->recent = true;
-                                               } else if ($flag == 'ANSWERED') {
-                                                       $result[$id]->answered = true;
-                                               } else if ($flag == '$FORWARDED') {
-                                                       $result[$id]->forwarded = true;
-                                               } else if ($flag == 'DRAFT') {
-                                                       $result[$id]->is_draft = true;
-                                               } else if ($flag == '$MDNSENT') {
-                                                       $result[$id]->mdn_sent = true;
-                                               } else if ($flag == 'FLAGGED') {
-                                                        $result[$id]->flagged = true;
-                                               }
-                                       }
-                                       $result[$id]->flags = $flags_a;
-                               }
-                       }
-               }
-       } while (!iil_StartsWith($line, $key, true));
-
-       return $result;
-}
-
-function iil_C_FetchHeader(&$conn, $mailbox, $id, $uidfetch=false, $bodystr=false, $add='') {
-
-       $a  = iil_C_FetchHeaders($conn, $mailbox, $id, $uidfetch, $bodystr, $add);
-       if (is_array($a)) {
-               return array_shift($a);
-       }
-       return false;
-}
-
-function iil_SortHeaders($a, $field, $flag) {
-       if (empty($field)) {
-           $field = 'uid';
-       }
-       $field = strtolower($field);
-       if ($field == 'date' || $field == 'internaldate') {
-           $field = 'timestamp';
-       }
-       if (empty($flag)) {
-           $flag = 'ASC';
-       }
-    
-       $flag     = strtoupper($flag);
-       $stripArr = ($field=='subject') ? array('Re: ','Fwd: ','Fw: ','"') : array('"');
-
-       $c=count($a);
-       if ($c > 0) {
-               /*
-                       Strategy:
-                       First, we'll create an "index" array.
-                       Then, we'll use sort() on that array, 
-                       and use that to sort the main array.
-               */
-                
-               // create "index" array
-               $index = array();
-               reset($a);
-               while (list($key, $val)=each($a)) {
-
-                       if ($field == 'timestamp') {
-                               $data = iil_StrToTime($val->date);
-                               if (!$data) {
-                                       $data = $val->timestamp;
-                               }
-                       } else {
-                               $data = $val->$field;
-                               if (is_string($data)) {
-                                       $data=strtoupper(str_replace($stripArr, '', $data));
-                               }
-                       }
-                       $index[$key]=$data;
-               }
-               
-               // sort index
-               $i = 0;
-               if ($flag == 'ASC') {
-                       asort($index);
-               } else {
-                       arsort($index);
-               }
-        
-               // form new array based on index 
-               $result = array();
-               reset($index);
-               while (list($key, $val)=each($index)) {
-                       $result[$key]=$a[$key];
-                       $i++;
-               }
-       }
-       
-       return $result;
-}
-
-function iil_C_Expunge(&$conn, $mailbox, $messages=NULL) {
-
-       if (iil_C_Select($conn, $mailbox)) {
-               $c = 0;
-               $command = $messages ? "UID EXPUNGE $messages" : "EXPUNGE";
-
-               iil_PutLine($conn->fp, "exp1 $command");
-               do {
-                       $line=chop(iil_ReadLine($conn->fp, 100));
-                       if ($line[0] == '*') {
-                               $c++;
-                       }
-               } while (!iil_StartsWith($line, 'exp1', true));
-               
-               if (iil_ParseResult($line) == 0) {
-                       $conn->selected = ''; //state has changed, need to reselect                     
-                       //$conn->exists-=$c;
-                       return $c;
-               }
-               $conn->error = $line;
-       }
-       
-       return -1;
-}
-
-function iil_C_ModFlag(&$conn, $mailbox, $messages, $flag, $mod) {
-       if ($mod != '+' && $mod != '-') {
-           return -1;
-       }
-    
-       $fp    = $conn->fp;
-       $flags = $GLOBALS['IMAP_FLAGS'];
-        
-       $flag = strtoupper($flag);
-       $flag = $flags[$flag];
-    
-       if (iil_C_Select($conn, $mailbox)) {
-               $c = 0;
-               iil_PutLine($fp, "flg UID STORE $messages " . $mod . "FLAGS (" . $flag . ")");
-               do {
-                       $line=chop(iil_ReadLine($fp, 100));
-                       if ($line[0] == '*') {
-                           $c++;
-                       }
-               } while (!iil_StartsWith($line, 'flg', true));
-
-               if (iil_ParseResult($line) == 0) {
-                       return $c;
-               }
-               $conn->error = $line;
-               return -1;
-       }
-       $conn->error = 'Select failed';
-       return -1;
-}
-
-function iil_C_Flag(&$conn, $mailbox, $messages, $flag) {
-       return iil_C_ModFlag($conn, $mailbox, $messages, $flag, '+');
-}
-
-function iil_C_Unflag(&$conn, $mailbox, $messages, $flag) {
-       return iil_C_ModFlag($conn, $mailbox, $messages, $flag, '-');
-}
-
-function iil_C_Delete(&$conn, $mailbox, $messages) {
-       return iil_C_ModFlag($conn, $mailbox, $messages, 'DELETED', '+');
-}
-
-function iil_C_Copy(&$conn, $messages, $from, $to) {
-       $fp = $conn->fp;
-
-       if (empty($from) || empty($to)) {
-           return -1;
-       }
-    
-       if (iil_C_Select($conn, $from)) {
-               $c=0;
-               
-               iil_PutLine($fp, "cpy1 UID COPY $messages \"".iil_Escape($to)."\"");
-               $line = iil_ReadReply($fp);
-               return iil_ParseResult($line);
-       } else {
-               return -1;
-       }
-}
-
-function iil_C_CountUnseen(&$conn, $folder) {
-        $index = iil_C_Search($conn, $folder, 'ALL UNSEEN');
-        if (is_array($index))
-                return count($index);
-        return false;
-}
-
-function iil_C_UID2ID(&$conn, $folder, $uid) {
-       if ($uid > 0) {
-               $id_a = iil_C_Search($conn, $folder, "UID $uid");
-               if (is_array($id_a) && count($id_a) == 1) {
-                       return $id_a[0];
-               }
-       }
-       return false;
-}
-
-function iil_C_ID2UID(&$conn, $folder, $id) {
-
-       if ($id == 0) {
-           return      -1;
-       }
-       $result = -1;
-       if (iil_C_Select($conn, $folder)) {
-               $key = 'fuid';
-               if (iil_PutLine($conn->fp, "$key FETCH $id (UID)")) {
-                       do {
-                               $line = chop(iil_ReadLine($conn->fp, 1024));
-                               if (preg_match("/^\* $id FETCH \(UID (.*)\)/i", $line, $r)) {
-                                       $result = $r[1];
-                               }
-                       } while (!iil_StartsWith($line, $key, true));
-               }
-       }
-       return $result;
-}
-
-function iil_C_Search(&$conn, $folder, $criteria) {
-
-       if (iil_C_Select($conn, $folder)) {
-               $data = '';
-               
-               $query = 'srch1 SEARCH ' . chop($criteria);
-               if (!iil_PutLineC($conn->fp, $query)) {
-                       return false;
-               }
-               do {
-                       $line = trim(iil_ReadLine($conn->fp));
-                       if (iil_StartsWith($line, '* SEARCH')) {
-                               $data .= substr($line, 8);
-                       } else if (preg_match('/^[0-9 ]+$/', $line)) {
-                               $data .= $line;
-                       }
-               } while (!iil_StartsWith($line, 'srch1', true));
-
-               $result_code = iil_ParseResult($line);
-               if ($result_code == 0) {
-                   return preg_split('/\s+/', $data, -1, PREG_SPLIT_NO_EMPTY);
-               }
-               $conn->error = 'iil_C_Search: ' . $line . "\n";
-               return false;   
-       }
-       $conn->error = "iil_C_Search: Couldn't select \"$folder\"\n";
-       return false;
-}
-
-function iil_C_Move(&$conn, $messages, $from, $to) {
-
-    if (!$from || !$to) {
-        return -1;
-    }
-    
-    $r = iil_C_Copy($conn, $messages, $from, $to);
-
-    if ($r==0) {
-        return iil_C_Delete($conn, $from, $messages);
-    }
-    return $r;
-}
-
-/**
- * Gets the delimiter, for example:
- * INBOX.foo -> .
- * INBOX/foo -> /
- * INBOX\foo -> \
- * 
- * @return mixed A delimiter (string), or false. 
- * @param object $conn The current connection.
- * @see iil_Connect()
- */
-function iil_C_GetHierarchyDelimiter(&$conn) {
-
-       global $my_prefs;
-       
-       if ($conn->delimiter) {
-               return $conn->delimiter;
-       }
-       if (!empty($my_prefs['delimiter'])) {
-           return ($conn->delimiter = $my_prefs['delimiter']);
-       }
-    
-       $fp        = $conn->fp;
-       $delimiter = false;
-       
-       //try (LIST "" ""), should return delimiter (RFC2060 Sec 6.3.8)
-       if (!iil_PutLine($fp, 'ghd LIST "" ""')) {
-           return false;
-       }
-    
-       do {
-               $line=iil_ReadLine($fp, 500);
-               if ($line[0] == '*') {
-                       $line = rtrim($line);
-                       $a=iil_ExplodeQuotedString(' ', iil_UnEscape($line));
-                       if ($a[0] == '*') {
-                           $delimiter = str_replace('"', '', $a[count($a)-2]);
-                       }
-               }
-       } while (!iil_StartsWith($line, 'ghd', true));
-
-       if (strlen($delimiter)>0) {
-           return $delimiter;
-       }
-
-       //if that fails, try namespace extension
-       //try to fetch namespace data
-       iil_PutLine($conn->fp, "ns1 NAMESPACE");
-       do {
-               $line = iil_ReadLine($conn->fp, 1024);
-               if (iil_StartsWith($line, '* NAMESPACE')) {
-                       $i = 0;
-                       $line = iil_UnEscape($line);
-                       $data = iil_ParseNamespace2(substr($line,11), $i, 0, 0);
-               }
-       } while (!iil_StartsWith($line, 'ns1', true));
-               
-       if (!is_array($data)) {
-           return false;
-       }
-    
-       //extract user space data (opposed to global/shared space)
-       $user_space_data = $data[0];
-       if (!is_array($user_space_data)) {
-           return false;
-       }
-    
-       //get first element
-       $first_userspace = $user_space_data[0];
-       if (!is_array($first_userspace)) {
-           return false;
-       }
-    
-       //extract delimiter
-       $delimiter = $first_userspace[1];       
-
-       return $delimiter;
-}
-
-function iil_C_ListMailboxes(&$conn, $ref, $mailbox) {
-       global $IGNORE_FOLDERS;
-       
-       $ignore = $IGNORE_FOLDERS[strtolower($conn->host)];
-               
-       $fp = $conn->fp;
-       
-       if (empty($mailbox)) {
-           $mailbox = '*';
-       }
-       
-       if (empty($ref) && $conn->rootdir) {
-           $ref = $conn->rootdir;
-       }
-    
-       // send command
-       if (!iil_PutLine($fp, "lmb LIST \"".$ref."\" \"".iil_Escape($mailbox)."\"")) {
-           return false;
-       }
-    
-       $i = 0;
-       // get folder list
-       do {
-               $line = iil_ReadLine($fp, 500);
-               $line = iil_MultLine($fp, $line, true);
-
-               $a = explode(' ', $line);
-               if (($line[0] == '*') && ($a[1] == 'LIST')) {
-                       $line = rtrim($line);
-                       // split one line
-                       $a = iil_ExplodeQuotedString(' ', $line);
-                       // last string is folder name
-                       $folder = preg_replace(array('/^"/', '/"$/'), '', iil_UnEscape($a[count($a)-1]));
-            
-                       if (empty($ignore) || (!empty($ignore)
-                               && !preg_match('/'.preg_quote(ignore, '/').'/i', $folder))) {
-                               $folders[$i] = $folder;
-                       }
-            
-                       // second from last is delimiter
-                       $delim = trim($a[count($a)-2], '"');
-                       // is it a container?
-                       $i++;
-               }
-       } while (!iil_StartsWith($line, 'lmb', true));
-
-       if (is_array($folders)) {
-           if (!empty($ref)) {
-               // if rootdir was specified, make sure it's the first element
-               // some IMAP servers (i.e. Courier) won't return it
-               if ($ref[strlen($ref)-1]==$delim)
-                   $ref = substr($ref, 0, strlen($ref)-1);
-               if ($folders[0]!=$ref)
-                   array_unshift($folders, $ref);
-           }
-           return $folders;
-       } else if (iil_ParseResult($line) == 0) {
-               return array('INBOX');
-       } else {
-               $conn->error = $line;
-               return false;
-       }
-}
-
-function iil_C_ListSubscribed(&$conn, $ref, $mailbox) {
-       global $IGNORE_FOLDERS;
-       
-       $ignore = $IGNORE_FOLDERS[strtolower($conn->host)];
-       
-       $fp = $conn->fp;
-       if (empty($mailbox)) {
-               $mailbox = '*';
-       }
-       if (empty($ref) && $conn->rootdir) {
-               $ref = $conn->rootdir;
-       }
-       $folders = array();
-
-       // send command
-       if (!iil_PutLine($fp, 'lsb LSUB "' . $ref . '" "' . iil_Escape($mailbox).'"')) {
-               $conn->error = "Couldn't send LSUB command\n";
-               return false;
-       }
-       
-       $i = 0;
-       
-       // get folder list
-       do {
-               $line = iil_ReadLine($fp, 500);
-               $line = iil_MultLine($fp, $line, true);
-               $a    = explode(' ', $line);
-        
-               if (($line[0] == '*') && ($a[1] == 'LSUB' || $a[1] == 'LIST')) {
-                       $line = rtrim($line);
-            
-                       // split one line
-                       $a = iil_ExplodeQuotedString(' ', $line);
-                       // last string is folder name
-                       $folder = preg_replace(array('/^"/', '/"$/'), '', iil_UnEscape($a[count($a)-1]));
-        
-                       if ((!in_array($folder, $folders)) && (empty($ignore)
-                               || (!empty($ignore) && !preg_match('/'.preg_quote(ignore, '/').'/i', $folder)))) {
-                           $folders[$i] = $folder;
-                       }
-            
-                       // second from last is delimiter
-                       $delim = trim($a[count($a)-2], '"');
-            
-                       // is it a container?
-                       $i++;
-               }
-       } while (!iil_StartsWith($line, 'lsb', true));
-
-       if (is_array($folders)) {
-           if (!empty($ref)) {
-               // if rootdir was specified, make sure it's the first element
-               // some IMAP servers (i.e. Courier) won't return it
-               if ($ref[strlen($ref)-1]==$delim) {
-                   $ref = substr($ref, 0, strlen($ref)-1);
-               }
-               if ($folders[0]!=$ref) {
-                   array_unshift($folders, $ref);
-               }
-           }
-           return $folders;
-       }
-       $conn->error = $line;
-       return false;
-}
-
-function iil_C_Subscribe(&$conn, $folder) {
-       $fp = $conn->fp;
-
-       $query = 'sub1 SUBSCRIBE "' . iil_Escape($folder). '"';
-       iil_PutLine($fp, $query);
-
-       $line = trim(iil_ReadLine($fp, 512));
-       return (iil_ParseResult($line) == 0);
-}
-
-function iil_C_UnSubscribe(&$conn, $folder) {
-       $fp = $conn->fp;
-
-       $query = 'usub1 UNSUBSCRIBE "' . iil_Escape($folder) . '"';
-       iil_PutLine($fp, $query);
-    
-       $line = trim(iil_ReadLine($fp, 512));
-       return (iil_ParseResult($line) == 0);
-}
-
-function iil_C_FetchMIMEHeaders(&$conn, $mailbox, $id, $parts) {
-       
-       $fp     = $conn->fp;
-
-       if (!iil_C_Select($conn, $mailbox)) {
-               return false;
-       }
-       
-       $result = false;
-       $parts = (array) $parts;
-       $key = 'fmh0';
-       $peeks = '';
-       $idx = 0;
-
-       // format request
-       foreach($parts as $part)
-               $peeks[] = "BODY.PEEK[$part.MIME]";
-       
-       $request = "$key FETCH $id (" . implode(' ', $peeks) . ')';
-
-       // send request
-       if (!iil_PutLine($fp, $request)) {
-           return false;
-       }
-        
-       do {
-               $line = iil_ReadLine($fp, 1000);
-               $line = iil_MultLine($fp, $line);
-
-               if (preg_match('/BODY\[([0-9\.]+)\.MIME\]/', $line, $matches)) {
-                       $idx = $matches[1];
-                       $result[$idx] = preg_replace('/^(\* '.$id.' FETCH \()?\s*BODY\['.$idx.'\.MIME\]\s+/', '', $line);
-                       $result[$idx] = trim($result[$idx], '"');
-                       $result[$idx] = rtrim($result[$idx], "\t\r\n\0\x0B");
-               }
-       } while (!iil_StartsWith($line, $key, true));
-
-       return $result;
-}
-
-function iil_C_FetchPartHeader(&$conn, $mailbox, $id, $is_uid=false, $part=NULL) {
-
-       $part = empty($part) ? 'HEADER' : $part.'.MIME';
-
-        return iil_C_HandlePartBody($conn, $mailbox, $id, $is_uid, $part);
-}
-
-function iil_C_HandlePartBody(&$conn, $mailbox, $id, $is_uid=false, $part='', $encoding=NULL, $print=NULL, $file=NULL) {
-       
-       $fp     = $conn->fp;
-       $result = false;
-       
-       switch ($encoding) {
-               case 'base64':
-                       $mode = 1;
-               break;
-               case 'quoted-printable':
-                       $mode = 2;
-               break;
-               case 'x-uuencode':
-               case 'x-uue':
-               case 'uue':
-               case 'uuencode':
-                       $mode = 3;
-               break;
-               default:
-                       $mode = 0;
-       }
-       
-       if (iil_C_Select($conn, $mailbox)) {
-               $reply_key = '* ' . $id;
-
-               // format request
-               $key     = 'ftch0';
-               $request = $key . ($is_uid ? ' UID' : '') . " FETCH $id (BODY.PEEK[$part])";
-               // send request
-               if (!iil_PutLine($fp, $request)) {
-                   return false;
-               }
-
-               // receive reply line
-               do {
-                       $line = chop(iil_ReadLine($fp, 1000));
-                       $a    = explode(' ', $line);
-               } while (!($end = iil_StartsWith($line, $key, true)) && $a[2] != 'FETCH');
-               $len = strlen($line);
-
-               // handle empty "* X FETCH ()" response
-               if ($line[$len-1] == ')' && $line[$len-2] != '(') {
-                       // one line response, get everything between first and last quotes
-                       if (substr($line, -4, 3) == 'NIL') {
-                               // NIL response
-                               $result = '';
-                       } else {
-                               $from = strpos($line, '"') + 1;
-                               $to   = strrpos($line, '"');
-                               $len  = $to - $from;
-                               $result = substr($line, $from, $len);
-                       }
-
-                       if ($mode == 1)
-                               $result = base64_decode($result);
-                       else if ($mode == 2)
-                               $result = quoted_printable_decode($result);
-                       else if ($mode == 3)
-                               $result = convert_uudecode($result);
-
-               } else if ($line[$len-1] == '}') {
-                       //multi-line request, find sizes of content and receive that many bytes
-                       $from     = strpos($line, '{') + 1;
-                       $to       = strrpos($line, '}');
-                       $len      = $to - $from;
-                       $sizeStr  = substr($line, $from, $len);
-                       $bytes    = (int)$sizeStr;
-                       $prev     = '';
-                       
-                       while ($bytes > 0) {
-                               $line      = iil_ReadLine($fp, 1024);
-                               $len       = strlen($line);
-                
-                               if ($len > $bytes) {
-                                       $line = substr($line, 0, $bytes);
-                                       $len = strlen($line);
-                               }
-                               $bytes -= $len;
-
-                               if ($mode == 1) {
-                                       $line = rtrim($line, "\t\r\n\0\x0B");
-                                       // create chunks with proper length for base64 decoding
-                                       $line = $prev.$line;
-                                       $length = strlen($line);
-                                       if ($length % 4) {
-                                               $length = floor($length / 4) * 4;
-                                               $prev = substr($line, $length);
-                                               $line = substr($line, 0, $length);
-                                       }
-                                       else
-                                               $prev = '';
-                                               
-                                       if ($file)
-                                               fwrite($file, base64_decode($line));
-                                       else if ($print)
-                                               echo base64_decode($line);
-                                       else
-                                               $result .= base64_decode($line);
-                               } else if ($mode == 2) {
-                                       $line = rtrim($line, "\t\r\0\x0B");
-                                       if ($file)
-                                               fwrite($file, quoted_printable_decode($line));
-                                       else if ($print)
-                                               echo quoted_printable_decode($line);
-                                       else
-                                               $result .= quoted_printable_decode($line);
-                               } else if ($mode == 3) {
-                                       $line = rtrim($line, "\t\r\n\0\x0B");
-                                       if ($line == 'end' || preg_match('/^begin\s+[0-7]+\s+.+$/', $line))
-                                               continue;
-                                       if ($file)
-                                               fwrite($file, convert_uudecode($line));
-                                       else if ($print)
-                                               echo convert_uudecode($line);
-                                       else
-                                               $result .= convert_uudecode($line);
-                               } else {
-                                       $line = rtrim($line, "\t\r\n\0\x0B");
-                                       if ($file)
-                                               fwrite($file, $line . "\n");
-                                       else if ($print)
-                                               echo $line . "\n";
-                                       else
-                                               $result .= $line . "\n";
-                               }
-                       }
-               }
-               // read in anything up until last line
-               if (!$end)
-                       do {
-                               $line = iil_ReadLine($fp, 1024);
-                       } while (!iil_StartsWith($line, $key, true));
-
-               if ($result) {
-                       if ($file) {
-                               fwrite($file, $result);
-                       } else if ($print) {
-                               echo $result;
-                       } else
-                               return $result;
-
-                       return true;
-               }
-       }
-
-       return false;
-}
-
-function iil_C_CreateFolder(&$conn, $folder) {
-       $fp = $conn->fp;
-       if (iil_PutLine($fp, 'c CREATE "' . iil_Escape($folder) . '"')) {
-               do {
-                       $line=iil_ReadLine($fp, 300);
-               } while (!iil_StartsWith($line, 'c ', true));
-               return (iil_ParseResult($line) == 0);
-       }
-       return false;
-}
-
-function iil_C_RenameFolder(&$conn, $from, $to) {
-       $fp = $conn->fp;
-       if (iil_PutLine($fp, 'r RENAME "' . iil_Escape($from) . '" "' . iil_Escape($to) . '"')) {
-               do {
-                       $line = iil_ReadLine($fp, 300);
-               } while (!iil_StartsWith($line, 'r ', true));
-               return (iil_ParseResult($line) == 0);
-       }
-       return false;
-}
-
-function iil_C_DeleteFolder(&$conn, $folder) {
-       $fp = $conn->fp;
-       if (iil_PutLine($fp, 'd DELETE "' . iil_Escape($folder). '"')) {
-               do {
-                       $line=iil_ReadLine($fp, 300);
-               } while (!iil_StartsWith($line, 'd ', true));
-               return (iil_ParseResult($line) == 0);
-       }
-       return false;
-}
-
-function iil_C_Append(&$conn, $folder, &$message) {
-       if (!$folder) {
-               return false;
-       }
-       $fp = $conn->fp;
-
-       $message = str_replace("\r", '', $message);
-       $message = str_replace("\n", "\r\n", $message);
-
-       $len = strlen($message);
-       if (!$len) {
-               return false;
-       }
-
-       $request = 'a APPEND "' . iil_Escape($folder) .'" (\\Seen) {' . $len . '}';
-
-       if (iil_PutLine($fp, $request)) {
-               $line = iil_ReadLine($fp, 512);
-
-               if ($line[0] != '+') {
-                       // $errornum = iil_ParseResult($line);
-                       $conn->error .= "Cannot write to folder: $line\n";
-                       return false;
-               }
-
-               iil_PutLine($fp, $message);
-
-               do {
-                       $line = iil_ReadLine($fp);
-               } while (!iil_StartsWith($line, 'a ', true));
-       
-               $result = (iil_ParseResult($line) == 0);
-               if (!$result) {
-                   $conn->error .= $line . "\n";
-               }
-               return $result;
-       }
-
-       $conn->error .= "Couldn't send command \"$request\"\n";
-       return false;
-}
-
-function iil_C_AppendFromFile(&$conn, $folder, $path) {
-       if (!$folder) {
-           return false;
-       }
-    
-       //open message file
-       $in_fp = false;
-       if (file_exists(realpath($path))) {
-               $in_fp = fopen($path, 'r');
-       }
-       if (!$in_fp) { 
-               $conn->error .= "Couldn't open $path for reading\n";
-               return false;
-       }
-       
-       $fp  = $conn->fp;
-       $len = filesize($path);
-       if (!$len) {
-               return false;
-       }
-    
-       //send APPEND command
-       $request    = 'a APPEND "' . iil_Escape($folder) . '" (\\Seen) {' . $len . '}';
-       if (iil_PutLine($fp, $request)) {
-               $line = iil_ReadLine($fp, 512);
-
-               if ($line[0] != '+') {
-                       //$errornum = iil_ParseResult($line);
-                       $conn->error .= "Cannot write to folder: $line\n";
-                       return false;
-               }
-
-               //send file
-               while (!feof($in_fp)) {
-                       $buffer      = fgets($in_fp, 4096);
-                       iil_PutLine($fp, $buffer, false);
-               }
-               fclose($in_fp);
-
-               iil_PutLine($fp, ''); // \r\n
-
-               //read response
-               do {
-                       $line = iil_ReadLine($fp);
-               } while (!iil_StartsWith($line, 'a ', true));
-
-               $result = (iil_ParseResult($line) == 0);
-               if (!$result) {
-                   $conn->error .= $line . "\n";
-               }
-
-               return $result;
-       }
-       
-       $conn->error .= "Couldn't send command \"$request\"\n";
-       return false;
-}
-
-function iil_C_FetchStructureString(&$conn, $folder, $id, $is_uid=false) {
-       $fp     = $conn->fp;
-       $result = false;
-       
-       if (iil_C_Select($conn, $folder)) {
-               $key = 'F1247';
-
-               if (iil_PutLine($fp, $key . ($is_uid ? ' UID' : '') ." FETCH $id (BODYSTRUCTURE)")) {
-                       do {
-                               $line = iil_ReadLine($fp, 5000);
-                               $line = iil_MultLine($fp, $line, true);
-                               if (!preg_match("/^$key/", $line))
-                                       $result .= $line;
-                       } while (!iil_StartsWith($line, $key, true));
-
-                       $result = trim(substr($result, strpos($result, 'BODYSTRUCTURE')+13, -1));
-               }
-       }
-       return $result;
-}
-
-function iil_C_GetQuota(&$conn) {
-/*
- * GETQUOTAROOT "INBOX"
- * QUOTAROOT INBOX user/rchijiiwa1
- * QUOTA user/rchijiiwa1 (STORAGE 654 9765)
- * OK Completed
- */
-       $fp         = $conn->fp;
-       $result     = false;
-       $quota_lines = array();
-       
-       // get line(s) containing quota info
-       if (iil_PutLine($fp, 'QUOT1 GETQUOTAROOT "INBOX"')) {
-               do {
-                       $line=chop(iil_ReadLine($fp, 5000));
-                       if (iil_StartsWith($line, '* QUOTA ')) {
-                               $quota_lines[] = $line;
-                       }
-               } while (!iil_StartsWith($line, 'QUOT1', true));
-       }
-       
-       // return false if not found, parse if found
-       $min_free = PHP_INT_MAX;
-       foreach ($quota_lines as $key => $quota_line) {
-               $quota_line   = preg_replace('/[()]/', '', $quota_line);
-               $parts        = explode(' ', $quota_line);
-               $storage_part = array_search('STORAGE', $parts);
-               
-               if (!$storage_part) continue;
-       
-               $used   = intval($parts[$storage_part+1]);
-               $total  = intval($parts[$storage_part+2]);
-               $free   = $total - $used; 
-       
-               // return lowest available space from all quotas
-               if ($free < $min_free) { 
-                       $min_free = $free; 
-                       $result['used']    = $used;
-                       $result['total']   = $total;
-                       $result['percent'] = min(100, round(($used/max(1,$total))*100));
-                       $result['free']    = 100 - $result['percent'];
-               }
-       }
-       return $result;
-}
-
-function iil_C_ClearFolder(&$conn, $folder) {
-       $num_in_trash = iil_C_CountMessages($conn, $folder);
-       if ($num_in_trash > 0) {
-               iil_C_Delete($conn, $folder, '1:*');
-       }
-       return (iil_C_Expunge($conn, $folder) >= 0);
-}
-
-?>
diff --git a/program/lib/mime.inc b/program/lib/mime.inc
deleted file mode 100644 (file)
index 860edbf..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-<?php
-/////////////////////////////////////////////////////////
-//     
-//     Iloha MIME Library (IML)
-//
-//     (C)Copyright 2002 Ryo Chijiiwa <Ryo@IlohaMail.org>
-//
-//     This file is part of IlohaMail. IlohaMail is free software released 
-//     under the GPL license.  See enclosed file COPYING for details, or 
-//     see http://www.fsf.org/copyleft/gpl.html
-//
-/////////////////////////////////////////////////////////
-
-/********************************************************
-
-       FILE: include/mime.inc
-       PURPOSE:
-               Provide functions for handling mime messages.
-       USAGE:
-               Use iil_C_FetchStructureString to get IMAP structure stirng, then pass that through
-               iml_GetRawStructureArray() to get root node to a nested data structure.
-               Pass root node to the iml_GetPart*() functions to retreive individual bits of info.
-
-********************************************************/
-$MIME_INVALID = -1;
-$MIME_TEXT = 0;
-$MIME_MULTIPART = 1;
-$MIME_MESSAGE = 2;
-$MIME_APPLICATION = 3;
-$MIME_AUDIO = 4;
-$MIME_IMAGE = 5;
-$MIME_VIDEO = 6;
-$MIME_OTHER = 7;
-
-function iml_ClosingParenPos($str, $start) {
-    $level=0;
-    $len = strlen($str);
-    $in_quote = 0;
-
-    for ($i=$start; $i<$len; $i++) {
-       if ($str[$i] == '"' && $str[$i-1] != "\\")
-               $in_quote = ($in_quote + 1) % 2;
-       if (!$in_quote) {
-               if ($str[$i]=="(") $level++;
-               else if (($level > 0) && ($str[$i]==")")) $level--;
-               else if (($level == 0) && ($str[$i]==")")) return $i;
-       }
-    }
-}
-
-function iml_ParseBSString($str){      
-    
-    $id = 0;
-    $a = array();
-    $len = strlen($str);
-    $in_quote = 0;
-
-    for ($i=0; $i<$len; $i++) {
-        if ($str[$i] == '"') {
-           $in_quote = ($in_quote + 1) % 2;
-        } else if (!$in_quote) {
-            if ($str[$i] == " ") { //space means new element
-                $id++;
-                while ($str[$i+1] == " ") $i++;  // skip additional spaces
-            } else if ($str[$i]=="(") { //new part
-                $i++;
-                $endPos = iml_ClosingParenPos($str, $i);
-                $partLen = $endPos - $i;
-                if ($partLen < 0) break;
-                $part = substr($str, $i, $partLen);
-                $a[$id] = iml_ParseBSString($part); //send part string
-                $i = $endPos;
-            } else
-               $a[$id].=$str[$i]; //add to current element in array
-        } else if ($in_quote) {
-            if ($str[$i]=="\\") {
-               $i++; //escape backslashes
-               if ($str[$i] == '"' || $str[$i] == "\\")
-                   $a[$id] .= $str[$i];
-            } else
-               $a[$id] .= $str[$i]; //add to current element in array
-        }
-    }
-        
-    reset($a);
-    return $a;
-}
-
-function iml_GetRawStructureArray($str){
-    $line=substr($str, 1, strlen($str) - 2);
-    $line = str_replace(")(", ") (", $line);
-
-       $struct = iml_ParseBSString($line);
-       if (!is_array($struct[0]) && (strcasecmp($struct[0], "message")==0)
-               && (strcasecmp($struct[1], "rfc822")==0)) {
-               $struct = array($struct);
-       }
-    return $struct;
-}
-
-function iml_GetPartArray($a, $part){
-       if (!is_array($a)) return false;
-       if (strpos($part, ".") > 0){
-               $original_part = $part;
-               $pos = strpos($part, ".");
-               $rest = substr($original_part, $pos+1);
-               $part = substr($original_part, 0, $pos);
-               if ((strcasecmp($a[0], "message")==0) && (strcasecmp($a[1], "rfc822")==0)){
-                       $a = $a[8];
-               }
-               //echo "m - part: $original_part current: $part rest: $rest array: ".implode(" ", $a)."<br>\n";
-               return iml_GetPartArray($a[$part-1], $rest);
-       }else if ($part>0){
-               if ((strcasecmp($a[0], "message")==0) && (strcasecmp($a[1], "rfc822")==0)){
-                       $a = $a[8];
-               }
-               //echo "s - part: $part rest: $rest array: ".implode(" ", $a)."<br>\n";
-               if (is_array($a[$part-1])) return $a[$part-1];
-               else return $a;
-       }else if (($part==0) || (empty($part))){
-               return $a;
-       }
-}
-
-function iml_GetNumParts($a, $part){
-       if (is_array($a)){
-               $parent=iml_GetPartArray($a, $part);
-               
-               if ((strcasecmp($parent[0], "message")==0) && (strcasecmp($parent[1], "rfc822")==0)){
-                       $parent = $parent[8];
-               }
-
-               $is_array=true;
-               $c=0;
-               while (( list ($key, $val) = each ($parent) )&&($is_array)){
-                       $is_array=is_array($parent[$key]);
-                       if ($is_array) $c++;
-               }
-               return $c;
-       }
-       
-       return false;
-}
-
-function iml_GetPartTypeString($a, $part){
-       $part_a=iml_GetPartArray($a, $part);
-       if ($part_a){
-               if (is_array($part_a[0])){
-                       $type_str = "MULTIPART/";
-                       reset($part_a);
-                       while(list($n,$element)=each($part_a)){
-                               if (!is_array($part_a[$n])){
-                                       $type_str.=$part_a[$n];
-                                       break;
-                               }
-                       }
-                       return $type_str;
-               }else return $part_a[0]."/".$part_a[1];
-       }else return false;
-}
-
-function iml_GetFirstTextPart($structure,$part){
-    if ($part==0) $part="";
-    $typeCode = -1;
-    while ($typeCode!=0){
-        $typeCode = iml_GetPartTypeCode($structure, $part);
-        if ($typeCode == 1){
-            $part .= (empty($part)?"":".")."1";
-        }else if ($typeCode > 0){
-            $parts_a = explode(".", $part);
-            $lastPart = count($parts_a) - 1;
-            $parts_a[$lastPart] = (int)$parts_a[$lastPart] + 1;
-            $part = implode(".", $parts_a);
-        }else if ($typeCode == -1){
-            return "";
-        }
-    }
-    
-    return $part;
-}
-
-function iml_GetPartTypeCode($a, $part){
-       $types=array(0=>"text",1=>"multipart",2=>"message",3=>"application",4=>"audio",5=>"image",6=>"video",7=>"other");
-
-       $part_a=iml_GetPartArray($a, $part);
-       if ($part_a){
-               if (is_array($part_a[0])) $str="multipart";
-               else $str=$part_a[0];
-
-               $code=7;
-               while ( list($key, $val) = each($types)) if (strcasecmp($val, $str)==0) $code=$key;
-               return $code;
-       }else return -1;
-}
-
-function iml_GetPartEncodingCode($a, $part){
-       $encodings=array("7BIT", "8BIT", "BINARY", "BASE64", "QUOTED-PRINTABLE", "OTHER");
-
-       $part_a=iml_GetPartArray($a, $part);
-       if ($part_a){
-               if (is_array($part_a[0])) return -1;
-               else $str=$part_a[5];
-
-               $code=5;
-               while ( list($key, $val) = each($encodings)) if (strcasecmp($val, $str)==0) $code=$key;
-
-               return $code;
-
-       }else return -1;
-}
-
-function iml_GetPartEncodingString($a, $part){
-       $part_a=iml_GetPartArray($a, $part);
-       if ($part_a){
-               if (is_array($part_a[0])) return -1;
-               else return $part_a[5];
-       }else return -1;
-}
-
-function iml_GetPartSize($a, $part){
-       $part_a=iml_GetPartArray($a, $part);
-       if ($part_a){
-               if (is_array($part_a[0])) return -1;
-               else return $part_a[6];
-       }else return -1;
-}
-
-function iml_GetPartID($a, $part){
-       $part_a=iml_GetPartArray($a, $part);
-       if ($part_a){
-               if (is_array($part_a[0])) return -1;
-               else return $part_a[3];
-       }else return -1;
-}
-
-function iml_GetPartDisposition($a, $part){
-       $part_a=iml_GetPartArray($a, $part);
-       if ($part_a){
-               if (is_array($part_a[0])) return -1;
-               else{
-            $id = count($part_a) - 2;
-                       if (is_array($part_a[$id])) return $part_a[$id][0];
-                       else return "";
-               }
-       }else return "";
-}
-
-function iml_GetPartName($a, $part){
-       $part_a=iml_GetPartArray($a, $part);
-       if ($part_a){
-               if (is_array($part_a[0])) return -1;
-               else{
-            $name = "";
-                       if (is_array($part_a[2])){
-                //first look in content type
-                               $name="";
-                               while ( list($key, $val) = each ($part_a[2])){
-                    if ((strcasecmp($val, "NAME")==0)||(strcasecmp($val, "FILENAME")==0)) 
-                        $name=$part_a[2][$key+1];
-                }
-                       }
-            if (empty($name)){
-                //check in content disposition
-                $id = count($part_a) - 2;
-                if ((is_array($part_a[$id])) && (is_array($part_a[$id][1]))){
-                    $array = $part_a[$id][1];
-                    while ( list($key, $val) = each($array)){
-                        if ((strcasecmp($val, "NAME")==0)||(strcasecmp($val, "FILENAME")==0)) 
-                            $name=$array[$key+1];
-                    }
-                }
-            }
-                       return $name;
-               }
-       }else return "";
-}
-
-
-function iml_GetPartCharset($a, $part){
-       $part_a=iml_GetPartArray($a, $part);
-       if ($part_a){
-               if (is_array($part_a[0])) return -1;
-               else{
-                       if (is_array($part_a[2])){
-                               $name="";
-                               while ( list($key, $val) = each ($part_a[2])) if (strcasecmp($val, "charset")==0) $name=$part_a[2][$key+1];
-                               return $name;
-                       }
-                       else return "";
-               }
-       }else return "";
-}
-
-function iml_GetPartList($a, $part){
-       //echo "MOO?"; flush();
-       $data = array();
-       $num_parts = iml_GetNumParts($a, $part);
-       //echo "($num_parts)"; flush();
-       if ($num_parts !== false){
-               //echo "<!-- ($num_parts parts)//-->\n";
-               for ($i = 0; $i<$num_parts; $i++){
-                       $part_code = $part.(empty($part)?"":".").($i+1);
-                       $part_type = iml_GetPartTypeCode($a, $part_code);
-                       $part_disposition = iml_GetPartDisposition($a, $part_code);
-                       //echo "<!-- part: $part_code type: $part_type //-->\n";
-                       if (strcasecmp($part_disposition, "attachment")!=0 && 
-                               (($part_type == 1) || ($part_type==2))){
-                               $data = array_merge($data, iml_GetPartList($a, $part_code));
-                       }else{
-                               $data[$part_code]["typestring"] = iml_GetPartTypeString($a, $part_code);
-                               $data[$part_code]["disposition"] = $part_disposition;
-                               $data[$part_code]["size"] = iml_GetPartSize($a, $part_code);
-                               $data[$part_code]["name"] = iml_GetPartName($a, $part_code);
-                               $data[$part_code]["id"] = iml_GetPartID($a, $part_code);
-                       }
-               }
-       }
-       return $data;
-}
-
-function iml_GetNextPart($part){
-       if (strpos($part, ".")===false) return $part++;
-       else{
-               $parts_a = explode(".", $part);
-               $num_levels = count($parts_a);
-               $parts_a[$num_levels-1]++;
-               return implode(".", $parts_a);
-       }
-}
-?>
\ No newline at end of file
diff --git a/program/lib/tnef_decoder.inc b/program/lib/tnef_decoder.inc
deleted file mode 100644 (file)
index 750faf6..0000000
+++ /dev/null
@@ -1,352 +0,0 @@
-<?php
-/*
- * tnef_decoder.php
- *  Graham Norbury <gnorbury@bondcar.com>
- *  (c) 2002 (GNU GPL - see ../../COPYING)
- *
- *  Functions for decoding TNEF attachments in native PHP
- *
- *  Adapted from original designs by:
- *    Thomas Boll <tb@boll.ch>             [tnef.c]
- *    Mark Simpson <damned@world.std.com>  [tnef-1.1.1]
- *
- */
-
-define("TNEF_SIGNATURE",      0x223e9f78);
-define("TNEF_LVL_MESSAGE",    0x01);
-define("TNEF_LVL_ATTACHMENT", 0x02);
-
-define("TNEF_STRING", 0x00010000);
-define("TNEF_TEXT",   0x00020000);
-define("TNEF_BYTE",   0x00060000);
-define("TNEF_WORD",   0x00070000);
-define("TNEF_DWORD",  0x00080000);
-
-define("TNEF_ASUBJECT",   TNEF_DWORD  | 0x8004);
-define("TNEF_AMCLASS",    TNEF_WORD   | 0x8008);
-define("TNEF_BODYTEXT",   TNEF_TEXT   | 0x800c);
-define("TNEF_ATTACHDATA", TNEF_BYTE   | 0x800f);
-define("TNEF_AFILENAME",  TNEF_STRING | 0x8010);
-define("TNEF_ARENDDATA",  TNEF_BYTE   | 0x9002);
-define("TNEF_AMAPIATTRS", TNEF_BYTE   | 0x9005);
-define("TNEF_AVERSION",   TNEF_DWORD  | 0x9006);
-
-define("TNEF_MAPI_NULL",           0x0001);
-define("TNEF_MAPI_SHORT",          0x0002);
-define("TNEF_MAPI_INT",            0x0003);
-define("TNEF_MAPI_FLOAT",          0x0004);
-define("TNEF_MAPI_DOUBLE",         0x0005);
-define("TNEF_MAPI_CURRENCY",       0x0006);
-define("TNEF_MAPI_APPTIME",        0x0007);
-define("TNEF_MAPI_ERROR",          0x000a);
-define("TNEF_MAPI_BOOLEAN",        0x000b);
-define("TNEF_MAPI_OBJECT",         0x000d);
-define("TNEF_MAPI_INT8BYTE",       0x0014);
-define("TNEF_MAPI_STRING",         0x001e);
-define("TNEF_MAPI_UNICODE_STRING", 0x001f);
-define("TNEF_MAPI_SYSTIME",        0x0040);
-define("TNEF_MAPI_CLSID",          0x0048);
-define("TNEF_MAPI_BINARY",         0x0102);
-
-define("TNEF_MAPI_ATTACH_MIME_TAG",      0x370E);
-define("TNEF_MAPI_ATTACH_LONG_FILENAME", 0x3707);
-define("TNEF_MAPI_ATTACH_DATA",          0x3701);
-
-function tnef_getx($size, &$buf)
-{
-   $value = null;
-   if (strlen($buf) >= $size)
-   {
-      $value = substr($buf, 0, $size);
-      $buf = substr_replace($buf, '', 0, $size);
-   }
-   return $value;
-}
-
-function tnef_geti8(&$buf)
-{
-   $value = null;
-   if (strlen($buf) >= 1)
-   {
-      $value = ord($buf{0});
-      $buf = substr_replace($buf, '', 0, 1);
-   }
-   return $value;
-}
-
-function tnef_geti16(&$buf)
-{
-   $value = null;
-   if (strlen($buf) >= 2)
-   {
-      $value = ord($buf{0}) +
-               (ord($buf{1}) << 8);
-      $buf = substr_replace($buf, '', 0, 2);
-   }
-   return $value;
-}
-
-function tnef_geti32(&$buf)
-{
-   $value = null;
-   if (strlen($buf) >= 4)
-   {
-      $value = ord($buf{0}) +
-               (ord($buf{1}) << 8) +
-               (ord($buf{2}) << 16) +
-               (ord($buf{3}) << 24);
-      $buf = substr_replace($buf, '', 0, 4);
-   }
-   return $value;
-}
-
-function tnef_decode_attribute($attribute, &$buf)
-{
-   global $debug;
-
-   $length = tnef_geti32($buf);
-   $value = tnef_getx($length, $buf); //data
-   tnef_geti16($buf); //checksum
-
-   if ($debug)
-   {
-      printf("ATTRIBUTE[%08x] %d bytes\n", $attribute, $length);
-   }
-
-   switch($attribute)
-   {
-      case TNEF_BODYTEXT:
-         if ($debug)
-         {
-            printf("<b>Embedded message:</b><pre>%s</pre>", $value);
-         }
-         break;
-
-      default:
-   }
-}
-
-function extract_mapi_attrs($buf, &$attachment_data)
-{
-   global $debug;
-
-   tnef_geti32($buf); // number of attributes
-   while(strlen($buf) > 0)
-   {
-      $value = null;
-      $length = 0;
-      $attr_type = tnef_geti16($buf);
-      $attr_name = tnef_geti16($buf);
-      if ($debug)
-      {
-         printf("mapi attribute: %04x:%04x\n", $attr_type, $attr_name);
-      }
-      switch($attr_type)
-      {
-         case TNEF_MAPI_SHORT:
-            $value = tnef_geti16($buf);
-            break;
-
-         case TNEF_MAPI_INT:
-         case TNEF_MAPI_BOOLEAN:
-            $value = tnef_geti32($buf);
-            break;
-
-         case TNEF_MAPI_FLOAT:
-            $value = tnef_getx(4, $buf);
-            break;
-
-         case TNEF_MAPI_DOUBLE:
-         case TNEF_MAPI_SYSTIME:
-            $value = tnef_getx(8, $buf);
-            break;
-
-         case TNEF_MAPI_STRING:
-         case TNEF_MAPI_UNICODE_STRING:
-         case TNEF_MAPI_BINARY:
-         case TNEF_MAPI_OBJECT:
-            $num_vals = tnef_geti32($buf);
-            for ($i = 0; $i < $num_vals; $i++) // usually just 1
-            {
-               $length = tnef_geti32($buf);
-               $buflen = $length + ((4 - ($length % 4)) % 4); // pad to next 4 byte boundary
-               $value = substr(tnef_getx($buflen, $buf), 0, $length); // read and truncate to length
-            }
-            break;
-
-         default:
-            if ($debug)
-            {
-               echo("Unknown mapi attribute!\n");
-            }
-      }
-
-      // store any interesting attributes
-      switch($attr_name)
-      {
-         case TNEF_MAPI_ATTACH_LONG_FILENAME: // used in preference to AFILENAME value
-            $attachment_data[0]['name'] = preg_replace('/.*[\/](.*)$/', '\1', $value); // strip path
-            break;
-
-         case TNEF_MAPI_ATTACH_MIME_TAG: // Is this ever set, and what is format?
-            $attachment_data[0]['type0'] = preg_replace('/^(.*)\/.*/', '\1', $value);
-            $attachment_data[0]['type1'] = preg_replace('/.*\/(.*)$/', '\1', $value);
-            break;
-
-         case TNEF_MAPI_ATTACH_DATA:
-            tnef_getx(16, $value); // skip the next 16 bytes (unknown data)
-           array_shift($attachment_data); // eliminate the current (bogus) attachment
-            do_tnef_decode($value, $attachment_data); // recursively process the attached message
-            break;
-
-         default:
-      }
-   }
-}
-
-function tnef_decode_message(&$buf)
-{
-   global $debug;
-
-   if ($debug)
-   {
-      echo("MESSAGE ");
-   }
-
-   $attribute = tnef_geti32($buf);
-   tnef_decode_attribute($attribute, $buf);
-}
-
-function tnef_decode_attachment(&$buf, &$attachment_data)
-{
-   global $debug;
-
-   if ($debug)
-   {
-      echo("ATTACHMENT ");
-   }
-
-   $attribute = tnef_geti32($buf);
-   switch($attribute)
-   {    
-      case TNEF_ARENDDATA: // marks start of new attachment
-         $length = tnef_geti32($buf);
-         tnef_getx($length, $buf);
-         tnef_geti16($buf); //checksum
-         if ($debug)
-         {
-            printf("ARENDDATA[%08x]: %d bytes\n", $attribute, $length);
-         }
-         // add a new default data block to hold details of this attachment
-         // reverse order is easier to handle later!
-         array_unshift($attachment_data, array('type0'  => 'application',
-                                               'type1'  => 'octet-stream',
-                                               'name'   => 'unknown',
-                                               'stream' => ''));
-         break;
-
-      case TNEF_AFILENAME: // filename
-         $length = tnef_geti32($buf);
-         $attachment_data[0]['name'] = preg_replace('/.*[\/](.*)$/',
-                                                    '\1',
-                                                    tnef_getx($length, $buf)); // strip path
-         tnef_geti16($buf); //checksum
-         if ($debug)
-         {
-            printf("AFILENAME[%08x]: %s\n", $attribute, $attachment_data[0]['name']);
-         }
-         break;
-
-      case TNEF_ATTACHDATA: // the attachment itself
-         $length = tnef_geti32($buf);
-         $attachment_data[0]['size'] = $length;
-         $attachment_data[0]['stream'] = tnef_getx($length, $buf);
-         tnef_geti16($buf); //checksum
-         if ($debug)
-         {
-            printf("ATTACHDATA[%08x]: %d bytes\n", $attribute, $length);
-         }
-         break;
-
-      case TNEF_AMAPIATTRS:
-         $length = tnef_geti32($buf);
-         $value = tnef_getx($length, $buf);
-         tnef_geti16($buf); //checksum
-         if ($debug)
-         {
-            printf("AMAPIATTRS[%08x]: %d bytes\n", $attribute, $length);
-         }
-         extract_mapi_attrs($value, $attachment_data);
-         break;
-
-      default:
-         tnef_decode_attribute($attribute, $buf);
-   }
-}
-
-function do_tnef_decode(&$buf, &$attachment_data)
-{
-   global $debug;
-
-   $tnef_signature = tnef_geti32($buf);
-   if ($tnef_signature == TNEF_SIGNATURE)
-   {
-      $tnef_key = tnef_geti16($buf);
-      if ($debug)
-      {
-         printf("Signature: 0x%08x\nKey: 0x%04x\n", $tnef_signature, $tnef_key);
-      }
-
-      while (strlen($buf) > 0)
-      {
-         $lvl_type = tnef_geti8($buf);
-         switch($lvl_type)
-         {
-            case TNEF_LVL_MESSAGE:
-               tnef_decode_message($buf);
-               break;
-
-            case TNEF_LVL_ATTACHMENT:
-               tnef_decode_attachment($buf, $attachment_data);
-               break;
-
-            default:
-               if ($debug)
-               {
-                  echo("Invalid file format!");
-               }
-               break 2;
-         }
-      }
-   }
-   else
-   {
-      if ($debug)
-      {
-         echo("Invalid file format!");
-      }
-   }
-}
-
-function tnef_decode($buf)
-{
-   global $debug;
-
-   $attachment_data = array();
-
-   if ($debug)
-   {
-      echo("<pre>");
-   }
-
-   do_tnef_decode($buf, $attachment_data);
-
-   if ($debug)
-   {
-      echo("</pre>");
-   }
-   return array_reverse($attachment_data);
-
-}
-
-?>
diff --git a/program/lib/tnef_decoder.php b/program/lib/tnef_decoder.php
new file mode 100644 (file)
index 0000000..28d3689
--- /dev/null
@@ -0,0 +1,330 @@
+<?php
+/**
+ * The Horde's class allows MS-TNEF data to be displayed.
+ *
+ * The TNEF rendering is based on code by:
+ *   Graham Norbury <gnorbury@bondcar.com>
+ * Original design by:
+ *   Thomas Boll <tb@boll.ch>, Mark Simpson <damned@world.std.com>
+ *
+ * Copyright 2002-2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Jan Schneider <jan@horde.org>
+ * @author  Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Compress
+ */
+class tnef_decoder
+{
+    const SIGNATURE = 0x223e9f78;
+    const LVL_MESSAGE = 0x01;
+    const LVL_ATTACHMENT = 0x02;
+
+    const ASUBJECT = 0x88004;
+    const AMCLASS = 0x78008;
+    const ATTACHDATA = 0x6800f;
+    const AFILENAME = 0x18010;
+    const ARENDDATA = 0x69002;
+    const AMAPIATTRS = 0x69005;
+    const AVERSION = 0x89006;
+
+    const MAPI_NULL = 0x0001;
+    const MAPI_SHORT = 0x0002;
+    const MAPI_INT = 0x0003;
+    const MAPI_FLOAT = 0x0004;
+    const MAPI_DOUBLE = 0x0005;
+    const MAPI_CURRENCY = 0x0006;
+    const MAPI_APPTIME = 0x0007;
+    const MAPI_ERROR = 0x000a;
+    const MAPI_BOOLEAN = 0x000b;
+    const MAPI_OBJECT = 0x000d;
+    const MAPI_INT8BYTE = 0x0014;
+    const MAPI_STRING = 0x001e;
+    const MAPI_UNICODE_STRING = 0x001f;
+    const MAPI_SYSTIME = 0x0040;
+    const MAPI_CLSID = 0x0048;
+    const MAPI_BINARY = 0x0102;
+
+    const MAPI_ATTACH_LONG_FILENAME = 0x3707;
+    const MAPI_ATTACH_MIME_TAG = 0x370E;
+
+    const MAPI_NAMED_TYPE_ID = 0x0000;
+    const MAPI_NAMED_TYPE_STRING = 0x0001;
+    const MAPI_MV_FLAG = 0x1000;
+
+    /**
+     * Decompress the data.
+     *
+     * @param string $data   The data to decompress.
+     * @param array $params  An array of arguments needed to decompress the
+     *                       data.
+     *
+     * @return mixed  The decompressed data.
+     */
+    public function decompress($data, $params = array())
+    {
+        $out = array();
+
+        if ($this->_geti($data, 32) == self::SIGNATURE) {
+            $this->_geti($data, 16);
+
+            while (strlen($data) > 0) {
+                switch ($this->_geti($data, 8)) {
+                case self::LVL_MESSAGE:
+                    $this->_decodeMessage($data);
+                    break;
+
+                case self::LVL_ATTACHMENT:
+                    $this->_decodeAttachment($data, $out);
+                    break;
+                }
+            }
+        }
+
+        return array_reverse($out);
+    }
+
+    /**
+     * TODO
+     *
+     * @param string &$data  The data string.
+     * @param integer $bits  How many bits to retrieve.
+     *
+     * @return TODO
+     */
+    protected function _getx(&$data, $bits)
+    {
+        $value = null;
+
+        if (strlen($data) >= $bits) {
+            $value = substr($data, 0, $bits);
+            $data = substr_replace($data, '', 0, $bits);
+        }
+
+        return $value;
+    }
+
+    /**
+     * TODO
+     *
+     * @param string &$data  The data string.
+     * @param integer $bits  How many bits to retrieve.
+     *
+     * @return TODO
+     */
+    protected function _geti(&$data, $bits)
+    {
+        $bytes = $bits / 8;
+        $value = null;
+
+        if (strlen($data) >= $bytes) {
+            $value = ord($data[0]);
+            if ($bytes >= 2) {
+                $value += (ord($data[1]) << 8);
+            }
+            if ($bytes >= 4) {
+                $value += (ord($data[2]) << 16) + (ord($data[3]) << 24);
+            }
+            $data = substr_replace($data, '', 0, $bytes);
+        }
+
+        return $value;
+    }
+
+    /**
+     * TODO
+     *
+     * @param string &$data      The data string.
+     * @param string $attribute  TODO
+     */
+    protected function _decodeAttribute(&$data, $attribute)
+    {
+        /* Data. */
+        $this->_getx($data, $this->_geti($data, 32));
+
+        /* Checksum. */
+        $this->_geti($data, 16);
+    }
+
+    /**
+     * TODO
+     *
+     * @param string $data             The data string.
+     * @param array &$attachment_data  TODO
+     */
+    protected function _extractMapiAttributes($data, &$attachment_data)
+    {
+        /* Number of attributes. */
+        $number = $this->_geti($data, 32);
+
+        while ((strlen($data) > 0) && $number--) {
+            $have_mval = false;
+            $num_mval = 1;
+            $named_id = $value = null;
+            $attr_type = $this->_geti($data, 16);
+            $attr_name = $this->_geti($data, 16);
+
+            if (($attr_type & self::MAPI_MV_FLAG) != 0) {
+                $have_mval = true;
+                $attr_type = $attr_type & ~self::MAPI_MV_FLAG;
+            }
+
+            if (($attr_name >= 0x8000) && ($attr_name < 0xFFFE)) {
+                $this->_getx($data, 16);
+                $named_type = $this->_geti($data, 32);
+
+                switch ($named_type) {
+                case self::MAPI_NAMED_TYPE_ID:
+                    $named_id = $this->_geti($data, 32);
+                    $attr_name = $named_id;
+                    break;
+
+                case self::MAPI_NAMED_TYPE_STRING:
+                    $attr_name = 0x9999;
+                    $idlen = $this->_geti($data, 32);
+                    $datalen = $idlen + ((4 - ($idlen % 4)) % 4);
+                    $named_id = substr($this->_getx($data, $datalen), 0, $idlen);
+                    break;
+                }
+            }
+
+            if ($have_mval) {
+                $num_mval = $this->_geti($data, 32);
+            }
+
+            switch ($attr_type) {
+            case self::MAPI_SHORT:
+                $value = $this->_geti($data, 16);
+                break;
+
+            case self::MAPI_INT:
+            case self::MAPI_BOOLEAN:
+                for ($i = 0; $i < $num_mval; $i++) {
+                    $value = $this->_geti($data, 32);
+                }
+                break;
+
+            case self::MAPI_FLOAT:
+            case self::MAPI_ERROR:
+                $value = $this->_getx($data, 4);
+                break;
+
+            case self::MAPI_DOUBLE:
+            case self::MAPI_APPTIME:
+            case self::MAPI_CURRENCY:
+            case self::MAPI_INT8BYTE:
+            case self::MAPI_SYSTIME:
+                $value = $this->_getx($data, 8);
+                break;
+
+            case self::MAPI_STRING:
+            case self::MAPI_UNICODE_STRING:
+            case self::MAPI_BINARY:
+            case self::MAPI_OBJECT:
+                $num_vals = ($have_mval) ? $num_mval : $this->_geti($data, 32);
+                for ($i = 0; $i < $num_vals; $i++) {
+                    $length = $this->_geti($data, 32);
+
+                    /* Pad to next 4 byte boundary. */
+                    $datalen = $length + ((4 - ($length % 4)) % 4);
+
+                    if ($attr_type == self::MAPI_STRING) {
+                        --$length;
+                    }
+
+                    /* Read and truncate to length. */
+                    $value = substr($this->_getx($data, $datalen), 0, $length);
+                }
+                break;
+            }
+
+            /* Store any interesting attributes. */
+            switch ($attr_name) {
+            case self::MAPI_ATTACH_LONG_FILENAME:
+                /* Used in preference to AFILENAME value. */
+                $attachment_data[0]['name'] = preg_replace('/.*[\/](.*)$/', '\1', $value);
+                $attachment_data[0]['name'] = str_replace("\0", '', $attachment_data[0]['name']);
+                break;
+
+            case self::MAPI_ATTACH_MIME_TAG:
+                /* Is this ever set, and what is format? */
+                $attachment_data[0]['type'] = preg_replace('/^(.*)\/.*/', '\1', $value);
+                $attachment_data[0]['subtype'] = preg_replace('/.*\/(.*)$/', '\1', $value);
+                $attachment_data[0]['subtype'] = str_replace("\0", '', $attachment_data[0]['subtype']);
+                break;
+            }
+        }
+    }
+
+    /**
+     * TODO
+     *
+     * @param string &$data  The data string.
+     */
+    protected function _decodeMessage(&$data)
+    {
+        $this->_decodeAttribute($data, $this->_geti($data, 32));
+    }
+
+    /**
+     * TODO
+     *
+     * @param string &$data            The data string.
+     * @param array &$attachment_data  TODO
+     */
+    protected function _decodeAttachment(&$data, &$attachment_data)
+    {
+        $attribute = $this->_geti($data, 32);
+
+        switch ($attribute) {
+        case self::ARENDDATA:
+            /* Marks start of new attachment. */
+            $this->_getx($data, $this->_geti($data, 32));
+
+            /* Checksum */
+            $this->_geti($data, 16);
+
+            /* Add a new default data block to hold details of this
+               attachment. Reverse order is easier to handle later! */
+            array_unshift($attachment_data, array('type'    => 'application',
+                                                  'subtype' => 'octet-stream',
+                                                  'name'    => 'unknown',
+                                                  'stream'  => ''));
+            break;
+
+        case self::AFILENAME:
+            /* Strip path. */
+            $attachment_data[0]['name'] = preg_replace('/.*[\/](.*)$/', '\1', $this->_getx($data, $this->_geti($data, 32)));
+            $attachment_data[0]['name'] = str_replace("\0", '', $attachment_data[0]['name']);
+
+            /* Checksum */
+            $this->_geti($data, 16);
+            break;
+
+        case self::ATTACHDATA:
+            /* The attachment itself. */
+            $length = $this->_geti($data, 32);
+            $attachment_data[0]['size'] = $length;
+            $attachment_data[0]['stream'] = $this->_getx($data, $length);
+
+            /* Checksum */
+            $this->_geti($data, 16);
+            break;
+
+        case self::AMAPIATTRS:
+            $length = $this->_geti($data, 32);
+            $value = $this->_getx($data, $length);
+
+            /* Checksum */
+            $this->_geti($data, 16);
+            $this->_extractMapiAttributes($value, $attachment_data);
+            break;
+
+        default:
+            $this->_decodeAttribute($data, $attribute);
+        }
+    }
+
+}
index 01b0488fc8bde9e92bca73b1bd8b74fc8d088183..7f49fec283000286c418883ccfddfc41071bf600 100644 (file)
@@ -73,6 +73,8 @@
  * Roundcube Changes:
  * - added $block_elements
  * - changed $ignore_elements behaviour
+ * - added RFC2397 support
+ * - base URL support
  */
 
 class washtml
@@ -87,7 +89,7 @@ class washtml
   static $html_attribs = array('name', 'class', 'title', 'alt', 'width', 'height', 'align', 'nowrap', 'col', 'row', 'id', 'rowspan', 'colspan', 'cellspacing', 'cellpadding', 'valign', 'bgcolor', 'color', 'border', 'bordercolorlight', 'bordercolordark', 'face', 'marginwidth', 'marginheight', 'axis', 'border', 'abbr', 'char', 'charoff', 'clear', 'compact', 'coords', 'vspace', 'hspace', 'cellborder', 'size', 'lang', 'dir');  
 
   /* Block elements which could be empty but cannot be returned in short form (<tag />) */
-  static $block_elements = array('div', 'p', 'pre', 'blockquote');
+  static $block_elements = array('div', 'p', 'pre', 'blockquote', 'a', 'font', 'center', 'table', 'ul', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ol', 'dl', 'strong', 'i', 'b');
   
   /* State for linked objects in HTML */
   public $extlinks = false;
@@ -131,31 +133,37 @@ class washtml
   private function wash_style($style) {
     $s = '';
 
-    foreach(explode(';', $style) as $declaration) {
-      if(preg_match('/^\s*([a-z\-]+)\s*:\s*(.*)\s*$/i', $declaration, $match)) {
+    foreach (explode(';', $style) as $declaration) {
+      if (preg_match('/^\s*([a-z\-]+)\s*:\s*(.*)\s*$/i', $declaration, $match)) {
         $cssid = $match[1];
         $str = $match[2];
         $value = '';
-        while(sizeof($str) > 0 &&
+        while (sizeof($str) > 0 &&
           preg_match('/^(url\(\s*[\'"]?([^\'"\)]*)[\'"]?\s*\)'./*1,2*/
                  '|rgb\(\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[0-9]+\s*\)'.
                  '|-?[0-9.]+\s*(em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)?'.
                  '|#[0-9a-f]{3,6}|[a-z0-9\-]+'.
                  ')\s*/i', $str, $match)) {
-          if($match[2]) {
-            if($src = $this->config['cid_map'][$match[2]])
-              $value .= ' url(\''.htmlspecialchars($src, ENT_QUOTES) . '\')';
-            else if(preg_match('/^(http|https|ftp):.*$/i', $match[2], $url)) {
-              if($this->config['allow_remote'])
-                $value .= ' url(\''.htmlspecialchars($url[0], ENT_QUOTES).'\')';
+          if ($match[2]) {
+            if (($src = $this->config['cid_map'][$match[2]])
+                || ($src = $this->config['cid_map'][$this->config['base_url'].$match[2]])) {
+              $value .= ' url('.htmlspecialchars($src, ENT_QUOTES) . ')';
+            }
+            else if (preg_match('/^(http|https|ftp):.*$/i', $match[2], $url)) {
+              if ($this->config['allow_remote'])
+                $value .= ' url('.htmlspecialchars($url[0], ENT_QUOTES).')';
               else
                 $this->extlinks = true;
             }
-          } else if($match[0] != 'url' && $match[0] != 'rbg')//whitelist ?
+            else if (preg_match('/^data:.+/i', $match[2])) { // RFC2397
+              $value .= ' url('.htmlspecialchars($match[2], ENT_QUOTES).')';
+            }
+          }
+          else if ($match[0] != 'url' && $match[0] != 'rbg') //whitelist ?
             $value .= ' ' . $match[0];
           $str = substr($str, strlen($match[0]));
         }
-        if($value)
+        if ($value)
           $s .= ($s?' ':'') . $cssid . ':' . $value . ';';
       }
     }
@@ -167,20 +175,21 @@ class washtml
     $t = '';
     $washed;
 
-    foreach($node->attributes as $key => $plop) {
+    foreach ($node->attributes as $key => $plop) {
       $key = strtolower($key);
       $value = $node->getAttribute($key);
-      if(isset($this->_html_attribs[$key]) ||
+      if (isset($this->_html_attribs[$key]) ||
          ($key == 'href' && preg_match('/^(http:|https:|ftp:|mailto:|#).+/i', $value)))
         $t .= ' ' . $key . '="' . htmlspecialchars($value, ENT_QUOTES) . '"';
-      else if($key == 'style' && ($style = $this->wash_style($value)))
+      else if ($key == 'style' && ($style = $this->wash_style($value)))
         $t .= ' style="' . $style . '"';
-      else if($key == 'background' || ($key == 'src' && strtolower($node->tagName) == 'img')) { //check tagName anyway
-        if($src = $this->config['cid_map'][$value]) {
+      else if ($key == 'background' || ($key == 'src' && strtolower($node->tagName) == 'img')) { //check tagName anyway
+        if (($src = $this->config['cid_map'][$value])
+            || ($src = $this->config['cid_map'][$this->config['base_url'].$value])) {
           $t .= ' ' . $key . '="' . htmlspecialchars($src, ENT_QUOTES) . '"';
         }
-        else if(preg_match('/^(http|https|ftp):.+/i', $value)) {
-          if($this->config['allow_remote'])
+        else if (preg_match('/^(http|https|ftp):.+/i', $value)) {
+          if ($this->config['allow_remote'])
             $t .= ' ' . $key . '="' . htmlspecialchars($value, ENT_QUOTES) . '"';
           else {
             $this->extlinks = true;
@@ -188,6 +197,9 @@ class washtml
               $t .= ' ' . $key . '="' . htmlspecialchars($this->config['blocked_src'], ENT_QUOTES) . '"';
           }
         }
+        else if (preg_match('/^data:.+/i', $value)) { // RFC2397
+          $t .= ' ' . $key . '="' . htmlspecialchars($value, ENT_QUOTES) . '"';
+        }
       } else
         $washed .= ($washed?' ':'') . $key;
     }
@@ -208,18 +220,23 @@ class washtml
       switch($node->nodeType) {
       case XML_ELEMENT_NODE: //Check element
         $tagName = strtolower($node->tagName);
-        if($callback = $this->handlers[$tagName]) {
+        if ($callback = $this->handlers[$tagName]) {
           $dump .= call_user_func($callback, $tagName, $this->wash_attribs($node), $this->dumpHtml($node));
-        } else if(isset($this->_html_elements[$tagName])) {
+        }
+        else if (isset($this->_html_elements[$tagName])) {
           $content = $this->dumpHtml($node);
           $dump .= '<' . $tagName . $this->wash_attribs($node) .
-            ($content || isset($this->_block_elements[$tagName]) ? ">$content</$tagName>" : ' />');
-        } else if(isset($this->_ignore_elements[$tagName])) {
+            // create closing tag for block elements, but also for elements
+            // with content or with some attributes (eg. style, class) (#1486812)
+            ($content != '' || $node->hasAttributes() || isset($this->_block_elements[$tagName]) ? ">$content</$tagName>" : ' />');
+        }
+        else if (isset($this->_ignore_elements[$tagName])) {
           $dump .= '<!-- ' . htmlspecialchars($tagName, ENT_QUOTES) . ' not allowed -->';
-        } else {
+        }
+        else {
           $dump .= '<!-- ' . htmlspecialchars($tagName, ENT_QUOTES) . ' ignored -->';
           $dump .= $this->dumpHtml($node); // ignore tags not its content
-       }
+        }
         break;
       case XML_CDATA_SECTION_NODE:
         $dump .= $node->nodeValue;
@@ -242,10 +259,18 @@ class washtml
 
   /* Main function, give it untrusted HTML, tell it if you allow loading
    * remote images and give it a map to convert "cid:" urls. */
-  public function wash($html) {
-    //Charset seems to be ignored (probably if defined in the HTML document)
+  public function wash($html)
+  {
+    // Charset seems to be ignored (probably if defined in the HTML document)
     $node = new DOMDocument('1.0', $this->config['charset']);
     $this->extlinks = false;
+
+    // Find base URL for images
+    if (preg_match('/<base\s+href=[\'"]*([^\'"]+)/is', $html, $matches))
+      $this->config['base_url'] = $matches[1];
+    else
+      $this->config['base_url'] = '';
+
     @$node->loadHTML($html);
     return $this->dumpHtml($node);
   }
index a9b8902ac0450617d79bd7093bdce3c45afc3c02..e113fe106c76d47ec13ff0d346fb74a07f15d618 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/ar_SA/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Ossama Khayat <okhayat@yahoo.com>                             |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2513 2009-05-21 12:59:19Z alec $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -38,29 +38,33 @@ $labels['to'] = 'المستقبل';
 $labels['cc'] = 'نسخة';
 $labels['bcc'] = 'نسخة مخفية';
 $labels['replyto'] = 'الرد إلى';
+$labels['followupto'] = 'Mail-Followup-To';
 $labels['date'] = 'التاريخ';
 $labels['size'] = 'الحجم';
 $labels['priority'] = 'الأولوية';
 $labels['organization'] = 'المنظمة';
+$labels['readstatus'] = 'حالة القراءة';
 $labels['reply-to'] = 'الرد إلى';
+$labels['mail-reply-to'] = 'Mail-Reply-To';
+$labels['mail-followup-to'] = 'Mail-Followup-To';
 $labels['mailboxlist'] = 'المجلدات';
-$labels['messagesfromto'] = 'الرسالة $from إلى $to من $count';
+$labels['messagesfromto'] = 'الرسالة $from إلى $to من مجموع $count';
+$labels['threadsfromto'] = 'جهات الإتصال $from إلى $to من مجموع $count';
 $labels['messagenrof'] = 'الرسالة $nr من $count';
+$labels['copy'] = 'نسخ';
+$labels['move'] = 'نقل';
 $labels['moveto'] = 'نقل إلى...';
 $labels['download'] = 'تنزيل';
 $labels['filename'] = 'اسم الملف';
 $labels['filesize'] = 'حجم الملف';
-$labels['preferhtml'] = 'تفضيل صيغة HTML';
-$labels['htmlmessage'] = 'رسالة بنسق HTML';
-$labels['prettydate'] = 'تواريخ منمقة';
 $labels['addtoaddressbook'] = 'إضافة إلى دفتر العناوين';
-$labels['sun'] = 'أح';
-$labels['mon'] = 'إث';
-$labels['tue'] = 'ثل';
-$labels['wed'] = 'أر';
-$labels['thu'] = 'خم';
-$labels['fri'] = 'جم';
-$labels['sat'] = 'سب';
+$labels['sun'] = 'أحد';
+$labels['mon'] = 'إثنين';
+$labels['tue'] = 'ثلاثاء';
+$labels['wed'] = 'أربعاء';
+$labels['thu'] = 'خميس';
+$labels['fri'] = 'جمعة';
+$labels['sat'] = 'سبت';
 $labels['sunday'] = 'الأحد';
 $labels['monday'] = 'الإثنين';
 $labels['tuesday'] = 'الثلاثاء';
@@ -68,22 +72,22 @@ $labels['wednesday'] = 'الأربعاء';
 $labels['thursday'] = 'الخميس';
 $labels['friday'] = 'الجمعة';
 $labels['saturday'] = 'السبت';
-$labels['jan'] = 'ينا';
-$labels['feb'] = 'فبر';
-$labels['mar'] = 'مار';
-$labels['apr'] = 'أبر';
-$labels['may'] = 'ماي';
-$labels['jun'] = 'يون';
-$labels['jul'] = 'يول';
-$labels['aug'] = 'أغس';
-$labels['sep'] = 'سبت';
-$labels['oct'] = 'أكت';
-$labels['nov'] = 'نوف';
-$labels['dec'] = 'ديس';
+$labels['jan'] = 'يناير';
+$labels['feb'] = 'فبراير';
+$labels['mar'] = 'مارس';
+$labels['apr'] = 'أبريل';
+$labels['may'] = 'مايو';
+$labels['jun'] = 'يونيو';
+$labels['jul'] = 'يوليو';
+$labels['aug'] = 'أغسطس';
+$labels['sep'] = 'سبتمبر';
+$labels['oct'] = 'أكتوبر';
+$labels['nov'] = 'نوفمبر';
+$labels['dec'] = 'ديسمبر';
 $labels['longjan'] = 'يناير';
 $labels['longfeb'] = 'فبراير';
 $labels['longmar'] = 'مارس';
-$labels['longapr'] = 'Ø£بريل';
+$labels['longapr'] = 'Ø¥بريل';
 $labels['longmay'] = 'مايو';
 $labels['longjun'] = 'يونيو';
 $labels['longjul'] = 'يوليو';
@@ -97,6 +101,8 @@ $labels['checkmail'] = 'التحقق من وجود رسائل جديدة';
 $labels['writenewmessage'] = 'إنشاء رسالة جديدة';
 $labels['replytomessage'] = 'الرد على الرسالة';
 $labels['replytoallmessage'] = 'الرد على المرسل وجميع مستقبلي الرسالة';
+$labels['replyall'] = 'الرد على الجميع';
+$labels['replylist'] = 'الرد على القائمة';
 $labels['forwardmessage'] = 'تمرير الرسالة';
 $labels['deletemessage'] = 'حذف الرسالة إلى المهملات';
 $labels['movemessagetotrash'] = 'انقل الرسالة إلى سلة المهملات';
@@ -116,10 +122,39 @@ $labels['markread'] = 'كمقروءة';
 $labels['markunread'] = 'كغير مقروءة';
 $labels['markflagged'] = 'كموْسومة';
 $labels['markunflagged'] = 'كغير موْسومة';
+$labels['messageactions'] = 'إجراءات إضافية...';
 $labels['select'] = 'تحديد';
 $labels['all'] = 'الكل';
 $labels['none'] = 'لا شيء';
+$labels['currpage'] = 'الصفحة الحالية';
 $labels['unread'] = 'غير المقروءة';
+$labels['flagged'] = 'موسوم';
+$labels['unanswered'] = 'بلا رد';
+$labels['deleted'] = 'محذوف';
+$labels['invert'] = 'عكس';
+$labels['filter'] = 'تصفية';
+$labels['list'] = 'قائمة';
+$labels['threads'] = 'تتابعات';
+$labels['expand-all'] = 'إظهار الكل';
+$labels['expand-unread'] = 'إظهار الغير مقروءة';
+$labels['collapse-all'] = 'ضمّ الكل';
+$labels['threaded'] = 'متتابع';
+$labels['autoexpand_threads'] = 'إظهار تتابعات الرسائل';
+$labels['do_expand'] = 'جميع التتابعات';
+$labels['expand_only_unread'] = 'فقط مع الرسائل الغير مقروءة';
+$labels['fromto'] = 'المرسل/المستلم';
+$labels['flag'] = 'وسم';
+$labels['attachment'] = 'مرفق';
+$labels['nonesort'] = 'لاشيء';
+$labels['sentdate'] = 'تاريخ إرسالها';
+$labels['arrival'] = 'تاريخ وصولها';
+$labels['asc'] = 'تصاعدي';
+$labels['desc'] = 'تنازلي';
+$labels['listcolumns'] = 'أعمدة السرد';
+$labels['listsorting'] = 'أعمدة الترتيب';
+$labels['listorder'] = 'طريقة الترتيب';
+$labels['listmode'] = 'وضع طريقة السرد';
+$labels['folderactions'] = 'إجراءات المجلد...';
 $labels['compact'] = 'ضغط';
 $labels['empty'] = 'تفريغ';
 $labels['purge'] = 'إزالة';
@@ -128,20 +163,27 @@ $labels['unknown'] = 'مجهول';
 $labels['unlimited'] = 'غير محدود';
 $labels['quicksearch'] = 'البحث السريع';
 $labels['resetsearch'] = 'استعادة البحث للافتراضي';
+$labels['searchmod'] = 'أماكن البحث';
+$labels['msgtext'] = 'كامل الرسالة';
 $labels['openinextwin'] = 'افتح في نافذة جديدة';
+$labels['emlsave'] = 'تنزيل (.eml)';
 $labels['compose'] = 'إنشاء رسالة';
+$labels['editasnew'] = 'تعديل كجديد';
 $labels['savemessage'] = 'حفظ هذه المسودة';
 $labels['sendmessage'] = 'إرسال الرسالة الآن';
 $labels['addattachment'] = 'إرفاق ملف';
 $labels['charset'] = 'مجموعة المحارف';
 $labels['editortype'] = 'نوع المُحرّر';
 $labels['returnreceipt'] = 'ايصال استلام';
+$labels['dsn'] = 'تنويه حالة التوصيل';
+$labels['editidents'] = 'تعديل الهويات';
 $labels['checkspelling'] = 'التدقيق الإملائي';
 $labels['resumeediting'] = 'متابعة التحرير';
 $labels['revertto'] = 'استعادة إلى';
 $labels['attachments'] = 'مرفقات';
 $labels['upload'] = 'تحميل';
 $labels['close'] = 'إغلاق';
+$labels['messageoptions'] = 'خيارات الرسائل...';
 $labels['low'] = 'منخض';
 $labels['lowest'] = 'الأقل';
 $labels['normal'] = 'عادي';
@@ -158,6 +200,7 @@ $labels['maxuploadsize'] = 'أقصى حجم للملف هو $size';
 $labels['addcc'] = 'أضف CC';
 $labels['addbcc'] = 'أضف BCC';
 $labels['addreplyto'] = 'أضيف Reply-To';
+$labels['addfollowupto'] = 'إضافة Mail-Followup-To';
 $labels['mdnrequest'] = 'طلب المرسل إعلامه عند قراءتك لرسالته. هل تود إعلام المرسل؟';
 $labels['receiptread'] = 'إيصال الاستلام )بالقراءة)';
 $labels['yourmessage'] = 'هذا إيصال بقراءة رسالتك';
@@ -168,6 +211,8 @@ $labels['surname'] = 'الإسم الأخير';
 $labels['email'] = 'البريد الإلكتروني';
 $labels['addcontact'] = 'إضافة المراسل المحدد إلى دفتر عناويني';
 $labels['editcontact'] = 'تحرير بيانات المراسل';
+$labels['contacts'] = 'المراسلين';
+$labels['contactproperties'] = 'خواص جهة الإتصال';
 $labels['edit'] = 'تحرير';
 $labels['cancel'] = 'إلغاء';
 $labels['save'] = 'حفظ';
@@ -179,10 +224,13 @@ $labels['contactsfromto'] = 'المراسلون $from إلى $to من $count';
 $labels['print'] = 'طباعة';
 $labels['export'] = 'تصدير';
 $labels['exportvcards'] = 'صدّر المراسلين بنسق vCard';
+$labels['newcontactgroup'] = 'إنشاء مجموعة مراسلين جديدة';
+$labels['groupactions'] = 'إجراءات مجموعات المراسلين...';
 $labels['previouspage'] = 'عرض المجموعة السابقة';
 $labels['firstpage'] = 'عرض المجموعة الأولى';
 $labels['nextpage'] = 'عرض المجموعة التالية';
 $labels['lastpage'] = 'عرض المجموعة الأخيرة';
+$labels['group'] = 'مجموعة';
 $labels['groups'] = 'المجموعات';
 $labels['personaladrbook'] = 'العناوين الشخصية';
 $labels['import'] = 'استورد';
@@ -200,42 +248,79 @@ $labels['manageidentities'] = 'إدارة هويات هذا الحساب';
 $labels['newidentity'] = 'هوية جديدة';
 $labels['newitem'] = 'عنصر جديد';
 $labels['edititem'] = 'تحرير عنصر';
+$labels['preferhtml'] = 'تفضيل صيغة HTML';
+$labels['defaultcharset'] = 'ترميز المحارف الافتراضي';
+$labels['htmlmessage'] = 'رسالة بنسق HTML';
+$labels['prettydate'] = 'تواريخ منمقة';
 $labels['setdefault'] = 'تعيين كإفتراضي';
 $labels['autodetect'] = 'آلي';
 $labels['language'] = 'اللغة';
 $labels['timezone'] = 'المنطقة الزمنية';
-$labels['pagesize'] = 'أسطر في الصفحة';
+$labels['pagesize'] = 'عدد Ø§Ù\84رسائÙ\84 في الصفحة';
 $labels['signature'] = 'التوقيع';
 $labels['dstactive'] = 'التوقيت الصيفي';
 $labels['htmleditor'] = 'إنشاء رسائل بنسق HTML';
+$labels['htmlonreply'] = 'حال الرد على الرسائل بصيغة HTML فقط';
 $labels['htmlsignature'] = 'توقيع HTML';
 $labels['previewpane'] = 'إظهار قسم المعاينة';
 $labels['skin'] = 'شكل الواجهة';
-$labels['logoutclear'] = 'Ø£Ù\81رغ المحذوفات عند الخروج';
-$labels['logoutcompact'] = 'اضغط الوارد عن الخروج';
+$labels['logoutclear'] = 'Ø¥Ù\81راغ Ø³Ù\84Ø© المحذوفات عند الخروج';
+$labels['logoutcompact'] = 'ضغط ØµÙ\86دÙ\88Ù\82 الوارد عن الخروج';
 $labels['uisettings'] = 'واجهة المستخدم';
 $labels['serversettings'] = 'إعدادات الخادم';
 $labels['mailboxview'] = 'مظهر صندوق البريد';
-$labels['mdnrequests'] = 'تÙ\86Ù\88Ù\8aÙ\87ات Ø§Ù\84Ù\85Ù\8fرسÙ\90Ù\84';
+$labels['mdnrequests'] = 'عÙ\86د Ø·Ù\84ب Ø¥Ø´Ø¹Ø§Ø± Ø§Ø³ØªÙ\84اÙ\85';
 $labels['askuser'] = 'اسأل المستخدم';
-$labels['autosend'] = 'أأرسلها تلقائياً';
+$labels['autosend'] = 'أرسلها تلقائياً';
+$labels['autosendknown'] = 'أرسل إشعار استلام إلى جهات اتصالي، وإلا اسألني';
+$labels['autosendknownignore'] = 'أرسل إشعار استلام إلى جهات اتصالي، وإلا تجاهل الأمر';
 $labels['ignore'] = 'تجاهلها';
-$labels['readwhendeleted'] = 'حدد الرسالة كمقروءة عند حذفها';
-$labels['flagfordeletion'] = 'ضع علامة على الرسالة لحذفها بدلاً من حذفها';
+$labels['readwhendeleted'] = 'تحدÙ\8aد الرسالة كمقروءة عند حذفها';
+$labels['flagfordeletion'] = 'وضع علامة على الرسالة لحذفها بدلاً من حذفها';
 $labels['skipdeleted'] = 'لا تظهر الرسائل المحذوفة';
-$labels['showinlineimages'] = 'أظهر الصّور المرفقة أسفل الرسالة';
+$labels['deletealways'] = 'حذف الرسائل مباشرة، إن تعذر نقلها إلى المهملات';
+$labels['showremoteimages'] = 'إظهار الصور الخارجية المدمجة';
+$labels['fromknownsenders'] = 'للمرسلين المعلومين';
+$labels['always'] = 'دائماً';
+$labels['showinlineimages'] = 'إظهار الصّور المرفقة أسفل الرسالة';
 $labels['autosavedraft'] = 'حفظ المسودة تلقائياً';
 $labels['everynminutes'] = 'كل $n دقيقة';
-$labels['keepalive'] = 'تحقق من وجود رسائل جديدة عند';
+$labels['keepalive'] = 'اÙ\84تحÙ\82Ù\82 Ù\85Ù\86 Ù\88جÙ\88د Ø±Ø³Ø§Ø¦Ù\84 Ø¬Ø¯Ù\8aدة Ø¹Ù\86د';
 $labels['never'] = 'أبداً';
+$labels['immediately'] = 'حالاً';
 $labels['messagesdisplaying'] = 'إظهار الرسائل';
 $labels['messagescomposition'] = 'إنشاء الرسائل';
 $labels['mimeparamfolding'] = 'أسماء الملفات المرفقة';
 $labels['2231folding'] = 'RFC 2231 بأكملها (ثندربيرد)';
 $labels['miscfolding'] = 'RFC 2047/2231 (ميكروسوفت آوتلوك)';
 $labels['2047folding'] = 'RFC 2047 بأكملها (غيرها)';
+$labels['force7bit'] = 'استخدام ترميز MIME للحروف ذات الثمانية بتّات';
 $labels['advancedoptions'] = 'خيارات متقدّمة';
-$labels['focusonnewmessage'] = 'وجّه نافذة المتصفح عند وجود رسالة جديدة';
+$labels['focusonnewmessage'] = 'التركيز على نافذة المتصفح عند وجود رسالة جديدة';
+$labels['checkallfolders'] = 'التحقق من وجود رسائل جديدة في جميع المجلدات';
+$labels['displaynext'] = 'إظهار الرسالة التالية بعد حذف/نقل الرسالة الحالية';
+$labels['mainoptions'] = 'الخيارات الأساسية';
+$labels['section'] = 'قسم';
+$labels['maintenance'] = 'الصيانة';
+$labels['newmessage'] = 'رسالة جديدة';
+$labels['listoptions'] = 'خيارات السرد';
+$labels['signatureoptions'] = 'خيارات التوقيع';
+$labels['whenreplying'] = 'عند الرد';
+$labels['replytopposting'] = 'بدء رسالة جديدة ووضع النص أعلى الأصلية';
+$labels['replybottomposting'] = 'بدء رسالة جديدة ووضع النص أسفل الأصلية';
+$labels['replyremovesignature'] = 'إزالة التوقيع من الرسالة عند الرد';
+$labels['autoaddsignature'] = 'إضافة التوقيع آلياً';
+$labels['newmessageonly'] = 'الرسالة الجديدة فقط';
+$labels['replyandforwardonly'] = 'الردود والتمريرات فقط';
+$labels['replysignaturepos'] = 'إضافة التوقيع عند الرد أو التمرير';
+$labels['belowquote'] = 'بعد الاقتباس';
+$labels['abovequote'] = 'قبل الاقتباس';
+$labels['insertsignature'] = 'إضافة التوقيع';
+$labels['previewpanemarkread'] = 'تحديد الرسائل المُعاينة كمقروءة';
+$labels['afternseconds'] = 'بعد $n ثواني';
+$labels['reqmdn'] = 'طلب إشعار استلام دائماً';
+$labels['reqdsn'] = 'طلب تنويه لحالة التوصيل دائماً';
+$labels['replysamefolder'] = 'وضع الردود في المجلد الذي يحوي الرسالة المردود عليها';
 $labels['folder'] = 'مجلد';
 $labels['folders'] = 'مجلدات';
 $labels['foldername'] = 'اسم المجلد';
@@ -243,11 +328,15 @@ $labels['subscribed'] = 'مشترك';
 $labels['messagecount'] = 'الرسائل';
 $labels['create'] = 'أنشئ';
 $labels['createfolder'] = 'أنشئ مجلد جديد';
-$labels['rename'] = 'إعادة التسمية';
-$labels['renamefolder'] = 'إعادة تسمية المجلد';
-$labels['deletefolder'] = 'احذف المجلد';
 $labels['managefolders'] = 'إدارة المجلدات';
 $labels['specialfolders'] = 'المجلّدات المُميّزة';
+$labels['properties'] = 'الخواص';
+$labels['folderproperties'] = 'خواص المجلد';
+$labels['parentfolder'] = 'المجلد الحاوي';
+$labels['location'] = 'الموضع';
+$labels['info'] = 'معلومات';
+$labels['getfoldersize'] = 'اضغط لمعرفة حجم المجلد';
+$labels['changesubscription'] = 'اضغط لتغيير حالة الإشتراك';
 $labels['sortby'] = 'ترتيب بحسب';
 $labels['sortasc'] = 'ترتيب تصاعدي';
 $labels['sortdesc'] = 'ترتيب تنازلي';
@@ -255,5 +344,23 @@ $labels['B'] = 'ب';
 $labels['KB'] = 'ك.ب';
 $labels['MB'] = 'م.ب';
 $labels['GB'] = 'ج.ب';
+$labels['unicode'] = 'يونيكود';
+$labels['english'] = 'الإنجليزية';
+$labels['westerneuropean'] = 'الغرب أوروبية';
+$labels['easterneuropean'] = 'الشرق أوروبية';
+$labels['southeasterneuropean'] = 'الجنوب شرق أوروبية';
+$labels['baltic'] = 'البلطيقية';
+$labels['cyrillic'] = 'الكيريلية';
+$labels['arabic'] = 'العربية';
+$labels['greek'] = 'اليونانية';
+$labels['hebrew'] = 'العبرية';
+$labels['turkish'] = 'التركية';
+$labels['nordic'] = 'النرويجية';
+$labels['thai'] = 'التايلندية';
+$labels['celtic'] = 'الكلتية';
+$labels['vietnamese'] = 'الفيتنامية';
+$labels['japanese'] = 'اليابانية';
+$labels['korean'] = 'الكورية';
+$labels['chinese'] = 'الصينية';
 
 ?>
index 03730d38680f388e87c8f4eb684e248f5f707a36..175ff835264f3cee9dd98bc84320174b8f2c0e81 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/ar_SA/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Ossama Khayat <okhayat@yahoo.com>                             |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2237 2009-01-17 01:55:39Z till $
+@version $Id: messages.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -22,10 +22,16 @@ $messages['loginfailed'] = 'فشل تسجيل الدخول';
 $messages['cookiesdisabled'] = 'المتصفح الخاص بك لا يقبل الكوكيز';
 $messages['sessionerror'] = 'انتهت صلاحية الجلسة الحالية أو أنها غير صالحة';
 $messages['imaperror'] = 'فشل الاتصال بخادم IMAP';
+$messages['servererror'] = 'خطأ في الخادم!';
+$messages['servererrormsg'] = 'خطأ خادم: $msg';
+$messages['errorreadonly'] = 'تعذر تنفيذ العملية. المجلد للقراءة فقط.';
+$messages['errornoperm'] = 'تعذر تنفيذ العملية. ليست لديك الصلاحية.';
+$messages['invalidrequest'] = 'طلب غير صالح! لم تحفظ أية بيانات.';
 $messages['nomessagesfound'] = 'لم يعثر على أية رسائل في صندوق البريد هذا';
-$messages['loggedout'] = 'Ù\84Ù\82د Ù\82Ù\85ت Ø¨Ø¥Ù\86Ù\87اء Ù\87Ø°Ù\87 Ø§Ù\84جÙ\84سة Ø¨Ù\86جاح. Ø¥Ù\84Ù\89 Ø§Ù\84Ù\84Ù\82اء!';
+$messages['loggedout'] = 'قمت بإنهاء هذه الجلسة بنجاح. إلى اللقاء!';
 $messages['mailboxempty'] = 'صندوق البريد فارغ';
 $messages['loading'] = 'جاري العمل...';
+$messages['uploading'] = 'جاري رفع الملف...';
 $messages['loadingdata'] = 'تحميل البيانات...';
 $messages['checkingmail'] = 'التحقق من وجود رسائل جديدة...';
 $messages['sendingmessage'] = 'إرسال الرسالة...';
@@ -44,33 +50,40 @@ $messages['senttooquickly'] = 'رجاء انتظر $sec ثوان قبل إرسا
 $messages['errorsavingsent'] = 'حدث خطأ أثناء حفظ الرسالة المُرسلة';
 $messages['errorsaving'] = 'حدث خطأ أثناء الحفظ';
 $messages['errormoving'] = 'تعذر نقل هذه الرسالة';
+$messages['errorcopying'] = 'تعذر نسخ الرسائل';
 $messages['errordeleting'] = 'تعذر حذف هذه الرسالة';
+$messages['errormarking'] = 'تعذر تحديد الرسائل';
 $messages['deletecontactconfirm'] = 'هل تريد حقاً حذف المراسلـ(ين) المحدد(ين)؟';
 $messages['deletemessagesconfirm'] = 'هل تريد حذف الرسائل المحددة؟';
 $messages['deletefolderconfirm'] = 'هل تريد حقاً حذف هذا المجلد؟';
 $messages['purgefolderconfirm'] = 'هل تريد حقاً حذف جميع الرسائل في هذا المجلد؟';
-$messages['foldercreating'] = 'جاري إنشاء المجلد...';
 $messages['folderdeleting'] = 'جاري حذف المجلد...';
-$messages['folderrenaming'] = 'جاري إعادة تسمية المجلد...';
 $messages['foldermoving'] = 'جاري نقل المجلد...';
+$messages['foldersubscribing'] = 'الإشتراك في المجلد...';
+$messages['folderunsubscribing'] = 'إلغاء الإشتراك في المجد...';
 $messages['formincomplete'] = 'لم يتم تعبئة بيانات الاستمارة بالكامل';
 $messages['noemailwarning'] = 'الرجاء إدخال عنوان بريد إلكتروني صالح';
 $messages['nonamewarning'] = 'الرجاء إدخال اسم';
 $messages['nopagesizewarning'] = 'الرجاء إدخال حجم الصفحة';
 $messages['nosenderwarning'] = 'رجاء اكتب عنوان البريد الالكتروني للمُرسل';
 $messages['norecipientwarning'] = 'الرجاء إدخال اسم مستقبل واحد على الأقل';
-$messages['nosubjectwarning'] = 'حقل \\\"الموضوع\\\" فارغ. هل تريد كتابة موضوع للرسالة؟';
+$messages['nosubjectwarning'] = 'حقل \"الموضوع\" فارغ. هل تريد كتابة موضوع للرسالة؟';
 $messages['nobodywarning'] = 'إرسال هذه الرسالة دون نص؟';
 $messages['notsentwarning'] = 'لم يتم إرسال الرسالة. هل تريد تجاهل الرسالة؟';
 $messages['noldapserver'] = 'الرجاء اختيار خادم ldap للبحث فيه';
 $messages['nocontactsreturned'] = 'لم يعثر على أي مراسلين';
 $messages['nosearchname'] = 'الرجاء إدخال اسم مراسل أو عنوان بريد إلكتروني';
+$messages['notuploadedwarning'] = 'لم يتم رفع جميع المرفقات بعد. رجاءً الانتظار أو إلغاء عملية الرفع.';
 $messages['searchsuccessful'] = 'عثر على $nr رسائل';
 $messages['searchnomatch'] = 'لم يعثر على شيء';
 $messages['searching'] = 'جاري البحث...';
 $messages['checking'] = 'جاري التحقق...';
 $messages['nospellerrors'] = 'لم يعثر على أية أخطاء إملائية';
 $messages['folderdeleted'] = 'تم حذف المجلد بنجاح';
+$messages['foldersubscribed'] = 'تم الإشتراك في المجلد بنجاح';
+$messages['folderunsubscribed'] = 'تم إلغاء الإشتراك في المجلد بنجاح';
+$messages['folderpurged'] = 'تم تفريغ المجلد بنجاح';
+$messages['folderexpunged'] = 'تم إفراغ المجلد بنجاح.';
 $messages['deletedsuccessfully'] = 'تم الحذف بنجاح';
 $messages['converting'] = 'إزالة التنسيق من الرسالة...';
 $messages['messageopenerror'] = 'تعذرت قراءة الرسالة من الخادم';
@@ -81,18 +94,48 @@ $messages['copyerror'] = 'لم يمكن نسخ أية عناوين';
 $messages['sourceisreadonly'] = 'لا يمكن تعديل مصدر العنوان هذا';
 $messages['errorsavingcontact'] = 'تعذر حفظ عنوان المراسل';
 $messages['movingmessage'] = 'جاري نقل الرسالة...';
+$messages['copyingmessage'] = 'جاري نسخ الرسالة...';
+$messages['deletingmessage'] = 'جاري حذف الرسائل...';
+$messages['markingmessage'] = 'جاري تحديد الرسائل...';
 $messages['receiptsent'] = 'أرسل إيصال الاستلام بنجاح';
 $messages['errorsendingreceipt'] = 'تعذر إرسال إيصال الاستلام';
 $messages['nodeletelastidentity'] = 'لا يمكن حذف هذا السجل حيث أنه الوحيد المتبقي.';
-$messages['addsubfolderhint'] = 'سيتم إنشاء هذا المجلد كمجلد فرعي للمحدد.';
 $messages['forbiddencharacter'] = 'اسم المجلّد يحتوي حروفاً ممنوعة';
 $messages['selectimportfile'] = 'رجاء اختر ملفاً لرفعه';
 $messages['addresswriterror'] = 'دفتر العناوين المحدد غير قابل للكتابة';
+$messages['contactaddedtogroup'] = 'تمت إضافة المراسلين إلى هذه المجموعة بنجاح';
+$messages['contactremovedfromgroup'] = 'تمت إزالة المراسلين من هذه المجموعة بنجاح';
 $messages['importwait'] = 'جاري الاستيراد، رجاء انتظر...';
 $messages['importerror'] = 'فشل الاستيراد! الملف المرفوع ليس ملف vCard صالح.';
 $messages['importconfirm'] = '<b>تم استيراد $inserted مراسلين بنجاح، وتجاهل $skipped موجودين مسبقاً</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'العملية ممنوعة!';
 $messages['nofromaddress'] = 'عنوان البريد الالكتروني غير محدد في الهويّة المنتقاة';
 $messages['editorwarning'] = 'يتسبب الانتقال إلى محرر النص البسيط بضياع جميع التنسيق. هل تريد الاستمرار؟';
+$messages['httpreceivedencrypterror'] = 'حدث خطأ جسيم في التهيئة. رجاءً اتصال بمدير الخادم حالاً. <b>لا يمكن إرسال بريدك.</b>';
+$messages['smtpconnerror'] = 'خطأ SMTP ($code): تعذر الاتصال بالخادم';
+$messages['smtpautherror'] = 'خطأ SMTP ($code): تعذر التحقق من هويتك';
+$messages['smtpfromerror'] = 'خطأ SMTP ($code): تعذر تحديد المرسل "$from" ($msg)';
+$messages['smtptoerror'] = 'خطأ SMTP ($code): تعذرت إضافة المستلم "$to" ($msg)';
+$messages['smtprecipientserror'] = 'خطأ SMTP: تعذرت قراءة قائمة المرسل إليهم';
+$messages['smtpdsnerror'] = 'خطأ SMTP: لا يوجد دعم لتنويهات حالة التوصيل';
+$messages['smtperror'] = 'خطأ SMTP: $msg';
+$messages['emailformaterror'] = 'عنوان بريد إلكتروني غير صالح: $email';
+$messages['toomanyrecipients'] = 'عدد المرسل إليهم كبير. قلص العدد إلى $max.';
+$messages['maxgroupmembersreached'] = 'عدد أعضاء المجموعة أكثر من $max';
+$messages['internalerror'] = 'حدث خطأ داخلي. الرجاء المحاولة مرة أخرى';
+$messages['contactdelerror'] = 'تعذر حذف أسماء جهات الإتصال';
+$messages['contactdeleted'] = 'تم حذف أسماء جهات الإتصال بنجاح';
+$messages['groupdeleted'] = 'تم حذف المجموعة بنجاح';
+$messages['grouprenamed'] = 'تم تغيير إسم المجموعة بنجاح';
+$messages['groupcreated'] = 'تم إنشاء المجموعة بنجاح';
+$messages['messagedeleted'] = 'تم حذف الرسائل بنجاح';
+$messages['messagemoved'] = 'تم نقل الرسائل بنجاح';
+$messages['messagecopied'] = 'تم نسخ الرسائل بنجاح';
+$messages['messagemarked'] = 'تم تحديد الرسائل بنجاح';
+$messages['autocompletechars'] = 'إكتب $min أحرف على الأقل للحصول على التكملة التلقائية';
+$messages['namecannotbeempty'] = 'لا يمكن ترك الإسم فارغاً';
+$messages['nametoolong'] = 'الإسم طويل جداً';
+$messages['folderupdated'] = 'تم تحديث المجلد بنجاح';
+$messages['foldercreated'] = 'تم إنشاء المجلد بنجاح';
 
 ?>
index 1f1927e217bcec94ec3b4879d1e08964ef24ecbc..5bb0a07af05177246db9c3d1f7f7fd1abc262c17 100644 (file)
@@ -3,10 +3,10 @@
 /*
 
 +-----------------------------------------------------------------------+
-| language/ast/labels.inc                                             |
+| language/ast/labels.inc                                               |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -15,7 +15,7 @@
 |         http://softastur.org                                          |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2124 2009-02-02 03:55:53Z mikelg $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -253,7 +253,6 @@ $labels['advancedoptions'] = 'Opciones avanzaes';
 $labels['focusonnewmessage'] = 'Poner el focu nos mensaxes nuevos';
 $labels['checkallfolders'] = 'Guetar mensaxes nuevos en toles bandexes';
 $labels['displaynext'] = 'Depués de mover/desaniciar amosar el mensaxe que sigue darréu';
-$labels['indexsort'] = 'Usar l\'indiz del mensaxe pa ordenalu por fecha';
 $labels['mainoptions'] = 'Opciones principales';
 $labels['section'] = 'Seición';
 $labels['maintenance'] = 'Mantenimientu';
@@ -266,9 +265,6 @@ $labels['subscribed'] = 'Soscrita';
 $labels['messagecount'] = 'Mensaxes';
 $labels['create'] = 'Facer';
 $labels['createfolder'] = 'Facer una bandexa nueva';
-$labels['rename'] = 'Renomar';
-$labels['renamefolder'] = 'Renomar bandexa';
-$labels['deletefolder'] = 'Desaniciar bandexa';
 $labels['managefolders'] = 'Alministrar bandexes';
 $labels['specialfolders'] = 'Bandexes especiales';
 $labels['sortby'] = 'Ordenar por';
index ed8b31d1a1a1013455fbffb63e3bf08ef8c8664d..4040d9d601dad41549f461bf024fbae371c65661 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/ast/messages.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2008, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -15,7 +15,7 @@
 |         http://softastur.org                                          |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2036 2009-02-02 04:37:58Z mikelg $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -54,9 +54,7 @@ $messages['deletecontactconfirm'] = '¿Tas seguru de desaniciar los contautos qu
 $messages['deletemessagesconfirm'] = '¿Tas seguru de desaniciar los mensaxes que marcaste?';
 $messages['deletefolderconfirm'] = '¿Tas seguru de desaniciar esta bandexa?';
 $messages['purgefolderconfirm'] = '¿Tas seguru de desaniciar tolos mensaxes d\'esta bandexa?';
-$messages['foldercreating'] = 'Faciendo la bandexa...';
 $messages['folderdeleting'] = 'Desaniciando la bandexa...';
-$messages['folderrenaming'] = 'Renomando la bandexa...';
 $messages['foldermoving'] = 'Moviendo la bandexa...';
 $messages['formincomplete'] = 'Tienes de rellenar tolos campos del formulariu';
 $messages['noemailwarning'] = 'Por favor, dame un corréu válidu';
@@ -89,7 +87,6 @@ $messages['movingmessage'] = 'Moviendo\'l mensaxe...';
 $messages['receiptsent'] = 'Unviose correchamente l\'avisu de llectura.';
 $messages['errorsendingreceipt'] = 'Nun fui a unviar l\'avisu de llectura.';
 $messages['nodeletelastidentity'] = 'Nun puedo desaniciar esa identidá porque ye la última.';
-$messages['addsubfolderhint'] = 'Esta bandexa va ser subandexa de la que ta marcada';
 $messages['forbiddencharacter'] = 'El nome de la bandexa tien un caráuter que nun val';
 $messages['selectimportfile'] = 'Por favor escueye el ficheru que quies xubir';
 $messages['addresswriterror'] = 'Nun puedo escribir nel llibru de direiciones qu\'escoyisti';
@@ -102,8 +99,8 @@ $messages['editorwarning'] = 'Si pases a editor en modu testu vas perder tol est
 $messages['httpreceivedencrypterror'] = 'Hai un fallu garrafal de configuración. Contauta col alministrador de secute. <b>Nun se pude unviar el mesaxe</b>';
 $messages['smtpconnerror'] = 'Fallu SMTP ($code): Fallu de conexón col sirvidor';
 $messages['smtpautherror'] = 'Fallu SMTP ($code): Fallu d\'autorización';
-$messages['smtpfromerror'] = 'Fallu SMTP ($code): Fallu al aficar el remitente "$from"';
-$messages['smtptoerror'] = 'Fallu SMTP ($code): Fallu al amestar el destinatariu "$to"';
+$messages['smtpfromerror'] = 'Fallu SMTP ($code): Fallu al aficar el remitente "$from" ($msg)';
+$messages['smtptoerror'] = 'Fallu SMTP ($code): Fallu al amestar el destinatariu "$to" ($msg)';
 $messages['smtprecipientserror'] = 'Fallu SMTP: Nun soi a amosar la llista de destinatarios';
 $messages['smtperror'] = 'Fallu SMTP: $msg';
 
index 73f7d97dee9bb0de474637a325a862a2ea106538..ce515e2d424b0b5f1e110dffd2a5e9e6228d439d 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/az_AZ/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 */
 
 $labels = array();
-$labels['welcome'] = '$product \-a xoş gəldiniz';
-$labels['username'] = 'İstifadəçi Adı';
+$labels['welcome'] = '$product-a xoş gəldiniz!';
+$labels['username'] = 'İstifadəçi adı';
 $labels['password'] = 'Şifrə';
 $labels['server'] = 'Server';
 $labels['login'] = 'Daxil ol';
-$labels['logout'] = 'Çıxış';
-$labels['mail'] = 'E-Poçt';
-$labels['settings'] = 'Şəxsi Nizamlamalar';
-$labels['addressbook'] = 'Ünvan Kitabçası';
+$labels['logout'] = 'Çıx';
+$labels['mail'] = 'Poçt';
+$labels['settings'] = 'Nizamlamalar';
+$labels['addressbook'] = 'Ünvanlar';
 $labels['inbox'] = 'Gələnlər';
 $labels['drafts'] = 'Qaralamalar';
 $labels['sent'] = 'Göndərilənlər';
-$labels['trash'] = 'Zibil qutusu';
-$labels['junk'] = 'Lazımsızlar(spam)';
+$labels['trash'] = 'Səbət';
+$labels['junk'] = 'Spam';
 $labels['subject'] = 'Mövzu';
-$labels['from'] = 'Göndərən';
+$labels['from'] = 'Kimdən';
 $labels['to'] = 'Kimə';
-$labels['cc'] = 'Surət';
-$labels['bcc'] = 'BCC';
-$labels['replyto'] = 'Cavabların Göndəriləcəyi Ünvan';
+$labels['cc'] = 'Nüsxə';
+$labels['bcc'] = 'Gizli';
+$labels['replyto'] = 'Cavabla';
 $labels['date'] = 'Tarix';
 $labels['size'] = 'Ölçü';
-$labels['priority'] = 'Vacib';
-$labels['organization'] = 'Quruluş';
-$labels['reply-to'] = 'Cavabların Göndəriləcəyi Ünvan';
+$labels['priority'] = 'Vaciblik';
+$labels['organization'] = 'Təşkilat';
+$labels['reply-to'] = 'Cavab ünvanı';
 $labels['mailboxlist'] = 'Qovluqlar';
-$labels['messagesfromto'] = '$count Mesajın $from - $to Arasındakı Mesajlar';
-$labels['messagenrof'] = '$count Mesajın $nr .';
-$labels['moveto'] = 'buraya daşı...';
+$labels['messagesfromto'] = '$count mesajdan $from - $to arası mesajlar';
+$labels['threadsfromto'] = 'Müzakirə: $from - $to Toplam: $count';
+$labels['messagenrof'] = 'Məktub: $nr / $count';
+$labels['copy'] = 'Kopyala';
+$labels['move'] = 'Köçür';
+$labels['moveto'] = 'Burada köçür...';
 $labels['download'] = 'Endir';
-$labels['filename'] = 'Fayl Adı';
-$labels['filesize'] = 'Fayl Ölçüsü';
-$labels['preferhtml'] = 'HTML göstərməyi dəstəklə';
-$labels['htmlmessage'] = 'HTML Mesaj';
-$labels['prettydate'] = 'Tarixi qısaltaraq göstər';
-$labels['addtoaddressbook'] = 'Ünvan Kitabçasına Əlavə Et';
+$labels['filename'] = 'Faylın adı';
+$labels['filesize'] = 'Faylın ölçüsü';
+$labels['addtoaddressbook'] = 'Ünvanlara əlavə et';
 $labels['sun'] = 'B';
 $labels['mon'] = 'Be';
 $labels['tue'] = 'Ç';
@@ -62,203 +62,280 @@ $labels['sat'] = 'Ş';
 $labels['sunday'] = 'Bazar';
 $labels['monday'] = 'Bazar ertəsi';
 $labels['tuesday'] = 'Çərçənbə';
-$labels['wednesday'] = 'Çərşənbə axşam';
+$labels['wednesday'] = 'Çərşənbə axşamı';
 $labels['thursday'] = 'Cümə';
-$labels['friday'] = 'Cümə axşam';
+$labels['friday'] = 'Cümə axşamı';
 $labels['saturday'] = 'Şənbə';
-$labels['jan'] = 'yan';
-$labels['feb'] = 'fev';
-$labels['mar'] = 'mar';
-$labels['apr'] = 'apr';
-$labels['may'] = 'may';
-$labels['jun'] = 'iyn';
-$labels['jul'] = 'iyl';
-$labels['aug'] = 'avq';
-$labels['sep'] = 'sen';
-$labels['oct'] = 'okt';
-$labels['nov'] = 'noy';
-$labels['dec'] = 'dek';
-$labels['longjan'] = 'yanvar';
-$labels['longfeb'] = 'fevral';
-$labels['longmar'] = 'mart';
-$labels['longapr'] = 'aprel';
-$labels['longmay'] = 'may';
-$labels['longjun'] = 'iyun';
-$labels['longjul'] = 'iyul';
-$labels['longaug'] = 'avqust';
-$labels['longsep'] = 'sentyabr';
-$labels['longoct'] = 'oktyabr';
-$labels['longnov'] = 'noyabr';
-$labels['longdec'] = 'dekabr';
+$labels['jan'] = 'Yan';
+$labels['feb'] = 'Fev';
+$labels['mar'] = 'Mar';
+$labels['apr'] = 'Apr';
+$labels['may'] = 'May';
+$labels['jun'] = 'İyn';
+$labels['jul'] = 'İyl';
+$labels['aug'] = 'Avq';
+$labels['sep'] = 'Sen';
+$labels['oct'] = 'Okt';
+$labels['nov'] = 'Noy';
+$labels['dec'] = 'Dek';
+$labels['longjan'] = 'Yanvar';
+$labels['longfeb'] = 'Fevral';
+$labels['longmar'] = 'Mart';
+$labels['longapr'] = 'Aprel';
+$labels['longmay'] = 'May';
+$labels['longjun'] = 'İyun';
+$labels['longjul'] = 'İyul';
+$labels['longaug'] = 'Avqust';
+$labels['longsep'] = 'Sentyabr';
+$labels['longoct'] = 'Oktyabr';
+$labels['longnov'] = 'Noyabr';
+$labels['longdec'] = 'Dekabr';
 $labels['today'] = 'Bu gün';
-$labels['checkmail'] = 'Yeni məktub olub-olmadığını yoxla';
-$labels['writenewmessage'] = 'Məktub yaz';
-$labels['replytomessage'] = 'Məktuba cavab yaz';
-$labels['replytoallmessage'] = 'Bu məktubun göndərildiyi hər kəsə cavab yaz';
-$labels['forwardmessage'] = 'Məktubu başqa ünvana göndər';
-$labels['deletemessage'] = 'Məktubu sil';
-$labels['movemessagetotrash'] = 'Zibil Qutusuna At';
+$labels['checkmail'] = 'Gələnləri yoxla';
+$labels['writenewmessage'] = 'Yeni məktub';
+$labels['replytomessage'] = 'Göndərənə cavabla';
+$labels['replytoallmessage'] = 'Hamıya cavabla';
+$labels['forwardmessage'] = 'Yönəlt';
+$labels['deletemessage'] = 'Sil';
+$labels['movemessagetotrash'] = 'Məktubu səbətə köçür';
 $labels['printmessage'] = 'Çap et';
 $labels['previousmessage'] = 'Əvvəlki məktubu göstər';
 $labels['previousmessages'] = 'Əvvəlki məktubları göstər';
-$labels['firstmessage'] = 'İlk məktubu göstər';
-$labels['firstmessages'] = 'İlk məktubları göstər';
+$labels['firstmessage'] = 'Birinci məktubu göstər';
+$labels['firstmessages'] = 'Birinci məktubları göstər';
 $labels['nextmessage'] = 'Sonrakı məktubu göstər';
 $labels['nextmessages'] = 'Sonrakı məktubları göstər';
-$labels['lastmessage'] = 'Son məktubu göstər';
-$labels['lastmessages'] = 'Son məktubları göstər';
-$labels['backtolist'] = 'Poçt qutusuna qayıt';
-$labels['viewsource'] = 'Qaynağı göstər';
-$labels['markmessages'] = 'Məktubları qeyd et';
-$labels['markread'] = 'Oxunmuş kimi';
-$labels['markunread'] = 'Oxunmamış kimi';
-$labels['markflagged'] = 'Qeydə alındı';
-$labels['markunflagged'] = 'Qeyddən çıxdı';
-$labels['select'] = 'Seç';
-$labels['all'] = 'Hamısı';
-$labels['none'] = 'Heç biri';
-$labels['unread'] = 'Oxunmamış';
-$labels['flagged'] = 'İşarəli';
-$labels['unanswered'] = 'Cavabsız';
+$labels['lastmessage'] = 'Sonuncu məktubu göstər';
+$labels['lastmessages'] = 'Sonuncu məktubları göstər';
+$labels['backtolist'] = 'Məktublar siyahısına qayıt';
+$labels['viewsource'] = 'Mənbəni göstər';
+$labels['markmessages'] = 'Məktubları işarələ';
+$labels['markread'] = 'Oxunmuş';
+$labels['markunread'] = 'Oxunmamış';
+$labels['markflagged'] = 'Qeyd et';
+$labels['markunflagged'] = 'Qeydi çıxar';
+$labels['messageactions'] = 'Əlavə işlər...';
+$labels['select'] = 'Seçin';
+$labels['all'] = 'Hamısını';
+$labels['none'] = 'Heç birini';
+$labels['currpage'] = 'Hazırki səhifəni';
+$labels['unread'] = 'Oxunmamışları';
+$labels['flagged'] = 'İşarəliləri';
+$labels['unanswered'] = 'Cavabsızları';
+$labels['deleted'] = 'Silinmişləri';
+$labels['invert'] = 'İnvertliləri';
 $labels['filter'] = 'Süzgəc';
-$labels['compact'] = 'Yığcam';
+$labels['list'] = 'Siyahı';
+$labels['threads'] = 'Müzakirələr';
+$labels['expand-all'] = 'Hamısını aç';
+$labels['expand-unread'] = 'Oxunmamışları aç';
+$labels['collapse-all'] = 'Hamısını bük';
+$labels['threaded'] = 'Müzakirə';
+$labels['autoexpand_threads'] = 'Müzakirəni aç';
+$labels['do_expand'] = 'bütün müzakirələr';
+$labels['expand_only_unread'] = 'yalnız oxunmamış məktublarla';
+$labels['fromto'] = 'Göndərən/Qəbul edən';
+$labels['flag'] = 'Bayrağ';
+$labels['attachment'] = 'Əlavə';
+$labels['nonesort'] = 'Yoxdur';
+$labels['sentdate'] = 'Göndərilmə tarixi';
+$labels['arrival'] = 'Çatdırılma tarixi';
+$labels['asc'] = 'Çoxalan';
+$labels['desc'] = 'Azalan';
+$labels['listcolumns'] = 'Sütunlar';
+$labels['listsorting'] = 'Sütunları çeşidlə';
+$labels['listorder'] = 'Çeşidləmə qaydası';
+$labels['listmode'] = 'Görünüş rejimi';
+$labels['folderactions'] = 'Qovluq işləri...';
+$labels['compact'] = 'Sıx';
 $labels['empty'] = 'Boşalt';
-$labels['purge'] = 'Sil';
+$labels['purge'] = 'Təmizlə';
 $labels['quota'] = 'Disk istifadəsi';
-$labels['unknown'] = 'bilinməyən';
+$labels['unknown'] = 'naməlum';
 $labels['unlimited'] = 'limitsiz';
 $labels['quicksearch'] = 'Sürətli axtarış';
 $labels['resetsearch'] = 'Axtarışı yenilə';
+$labels['searchmod'] = 'Axtarış variantları';
+$labels['msgtext'] = 'Bütün məktub';
 $labels['openinextwin'] = 'Yeni pəncərədə aç';
-$labels['compose'] = 'Yeni məktub yaz';
-$labels['savemessage'] = 'Qaralama olaraq məktubu saxla';
-$labels['sendmessage'] = 'Məktubu göndər';
+$labels['emlsave'] = 'Saxla (.eml)';
+$labels['compose'] = 'Məktub yaz';
+$labels['editasnew'] = 'Yeni kimi redaktə et';
+$labels['savemessage'] = 'Qaralama saxla';
+$labels['sendmessage'] = 'İndi göndər';
 $labels['addattachment'] = 'Fayl əlavə et';
-$labels['charset'] = 'Xarakter seti';
-$labels['editortype'] = 'Düzənləyici tipi';
-$labels['returnreceipt'] = 'Return receipt';
-$labels['checkspelling'] = 'Qrammatika alətini aktiv et';
-$labels['resumeediting'] = 'Redaktə etməyə davam et';
-$labels['revertto'] = 'Revert to';
+$labels['charset'] = 'Kodlaşdırma';
+$labels['editortype'] = 'Redaktor';
+$labels['returnreceipt'] = 'Cavab sorğusu';
+$labels['checkspelling'] = 'Orfoqrafiyanı yoxla';
+$labels['resumeediting'] = 'Redaktəni davam et';
+$labels['revertto'] = 'Dəyişiklikləri ləğv et';
 $labels['attachments'] = 'Əlavələr';
 $labels['upload'] = 'Yüklə';
 $labels['close'] = 'Bağla';
+$labels['messageoptions'] = 'Məktub xüsusiyyətləri...';
 $labels['low'] = 'Alçaq';
 $labels['lowest'] = 'Çox alçaq';
 $labels['normal'] = 'Normal';
 $labels['high'] = 'Yüksək';
 $labels['highest'] = 'Çox yüksək';
-$labels['nosubject'] = '(Mövzu Yoxdur)';
-$labels['showimages'] = 'Qrafikləri göstər';
-$labels['alwaysshow'] = 'Həmişə göstər';
+$labels['nosubject'] = '(mövzu yoxdur)';
+$labels['showimages'] = 'Şəkilləri göstər';
+$labels['alwaysshow'] = '$sender-dən olan məktublarda həmişə şəkilləri göstər';
 $labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Düz metn';
-$labels['savesentmessagein'] = 'Göndərilmiş məktubu saxla...';
-$labels['dontsave'] = 'Saxlama';
-$labels['maxuploadsize'] = 'Maksimal hədd $size qədərdir';
-$labels['addcc'] = 'CC əlavə et';
-$labels['addbcc'] = 'BCC əlavə et';
-$labels['addreplyto'] = 'Reply-To əlavə et';
-$labels['mdnrequest'] = 'Məktubu göndərən məktubu oxuduğunuzu bilmək istəyir. Bu barədə ona məlumat verilsin?';
-$labels['receiptread'] = 'Return Receipt';
-$labels['yourmessage'] = 'Bu sizin məktubunuz üçün Return Receipt-dir';
-$labels['receiptnote'] = 'Bu receipt yalnız təsdiq edir ki, məlumat alanın kompüterində göstərildi. Heç bir zəmanət yoxdur - hansı ki, alan oxumuşdur və ya məlumatın içindəkilərini başa düşmüşdür.';
-$labels['name'] = 'Adı göstər';
-$labels['firstname'] = 'Ad';
-$labels['surname'] = 'Soyad';
+$labels['plaintoggle'] = 'tn';
+$labels['savesentmessagein'] = 'Məktubu saxla...';
+$labels['dontsave'] = 'saxlama';
+$labels['maxuploadsize'] = 'Faylın maksimal ölçüsü: $size';
+$labels['addcc'] = 'Kopya əlavə et';
+$labels['addbcc'] = 'Gizli kopya əlavə et';
+$labels['addreplyto'] = 'Yönəltmə əlavə et';
+$labels['mdnrequest'] = 'Məktubu göndərən onu oxuduğunuz haqda sorğu almaq istəyir. Göndərilsin?';
+$labels['receiptread'] = 'Oxunulma haqda soğru';
+$labels['yourmessage'] = 'Bu məktubunuzun oxunulduğu haqda sorğudur';
+$labels['receiptnote'] = 'Bu sorğu yalnız qəbul edilən tərəfindən məktubun açıldığına göstərir. Onun oxunulduğuna zəmanət vermir.';
+$labels['name'] = 'Göstərilən ad';
+$labels['firstname'] = 'Adı';
+$labels['surname'] = 'Soyadı';
 $labels['email'] = 'E-Poçt';
-$labels['addcontact'] = 'Seçiləni ünvan kitabçasına əlavə et';
-$labels['editcontact'] = 'Əlaqəni redaktə et';
+$labels['addcontact'] = 'Ünvanlara əlavə et';
+$labels['editcontact'] = 'Ünvanı redaktə et';
+$labels['contacts'] = 'Əlaqələr';
 $labels['edit'] = 'Redaktə et';
 $labels['cancel'] = 'Ləğv et';
 $labels['save'] = 'Saxla';
 $labels['delete'] = 'Sil';
-$labels['newcontact'] = 'Yeni əlaqə Kartı Əlavə et';
-$labels['deletecontact'] = 'Seçilən əlaqələri sil';
-$labels['composeto'] = 'Seçilən əlaqəyə məktub göndər';
-$labels['contactsfromto'] = '$count Əlaqənin $from - $to arası ';
+$labels['newcontact'] = 'Yeni ünvan kartı əlavə et';
+$labels['deletecontact'] = 'Seçilmiş ünvanları sil';
+$labels['composeto'] = 'Seçilmiş ünvanlara məktub yaz';
+$labels['contactsfromto'] = '$count ünvanının $from - $to arası';
 $labels['print'] = 'Çap et';
 $labels['export'] = 'İxrac et';
-$labels['exportvcards'] = 'Əlaqələri vCards formatına ixrac et';
-$labels['previouspage'] = 'Əvvəlki səhifə';
-$labels['firstpage'] = 'İlk səhifə';
-$labels['nextpage'] = 'Sonrakı səhifə';
-$labels['lastpage'] = 'Son səhifə';
+$labels['exportvcards'] = 'Ünvanları vCards formatında ixrac et';
+$labels['newcontactgroup'] = 'Ünvanlar qrupunu yarat';
+$labels['groupactions'] = 'Ünvanlar qrupu üçün işlər';
+$labels['previouspage'] = 'Əvvəlkini göstər';
+$labels['firstpage'] = 'Birincini göstər';
+$labels['nextpage'] = 'Sonrakını göstər';
+$labels['lastpage'] = 'Sonuncunu göstər';
+$labels['group'] = 'Qrup';
 $labels['groups'] = 'Qruplar';
-$labels['personaladrbook'] = 'Ünvanlar';
+$labels['personaladrbook'] = 'Şəxsi ünvanlar';
 $labels['import'] = 'İdxal';
-$labels['importcontacts'] = 'Əlaqələrin idxalı';
+$labels['importcontacts'] = 'Ünvanların idxalı ';
 $labels['importfromfile'] = 'Fayldan idxal:';
-$labels['importreplace'] = 'Daxil edilən ünvan kitabçasını dəyiş';
-$labels['importtext'] = 'Əlaqələri mövcud ünvan kitabçasından yüklə. Biz hal-hazırda vCard data formatından ünvanların idxalını dəstəkləyirik.';
+$labels['importreplace'] = 'Ünvan kitabçasını dəyiş';
+$labels['importtext'] = 'Siz ünvanları mövcud ünvan kitabçasından yükləyə bilərsiniz. Hal-hazırda ünvanların idxalını <a href="http://az.wikipedia.org/wiki/vCard">vCard</a> formatında dəstəkləyirik.';
 $labels['done'] = 'Bitdi';
-$labels['settingsfor'] = 'Nizamlamalar';
-$labels['preferences'] = 'Seçimlər';
-$labels['userpreferences'] = 'İstifadəçi seçimləri';
-$labels['editpreferences'] = 'İstifadəçi seçimlərini redaktə et';
+$labels['settingsfor'] = 'Nizamlamaları';
+$labels['preferences'] = 'Nizamlamalar';
+$labels['userpreferences'] = 'İstifadəçi nizamlamaları';
+$labels['editpreferences'] = 'İstifadəçi nizamlamalarını redaktə et';
 $labels['identities'] = 'Kimliklər';
-$labels['manageidentities'] = 'Bu hesab üçün kimlikləri redaktə et';
+$labels['manageidentities'] = 'Bu hesab üçün kimlikləri idarə et';
 $labels['newidentity'] = 'Yeni kimlik';
-$labels['newitem'] = 'Yeni etiket';
-$labels['edititem'] = 'Etiket redaktə et';
-$labels['setdefault'] = 'Fərz edilən olaraq nizamla';
+$labels['newitem'] = 'Yeni maddə';
+$labels['edititem'] = 'Maddəni redaktə et';
+$labels['preferhtml'] = 'HTML-də göstər';
+$labels['defaultcharset'] = 'İlkin vəziyyətdəki kodlaşdırma';
+$labels['htmlmessage'] = 'HTML məktub';
+$labels['prettydate'] = 'Qəşəng tarixlər';
+$labels['setdefault'] = 'İlkin vəziyyətə qaytar';
 $labels['autodetect'] = 'Avto';
 $labels['language'] = 'Dil';
 $labels['timezone'] = 'Saat qurşağı';
-$labels['pagesize'] = 'Bir səhifədə neçə məktub göstərilsin';
+$labels['pagesize'] = 'Səhifədə sətrlər';
 $labels['signature'] = 'İmza';
-$labels['dstactive'] = 'Yay vaxt;';
-$labels['htmleditor'] = 'HTML redaktorda mesaj redaktə et';
+$labels['dstactive'] = 'Yay vaxtı';
+$labels['htmleditor'] = 'HTML-də mesaj yaz';
 $labels['htmlsignature'] = 'HTML imza';
-$labels['previewpane'] = 'İlk paneli göstər';
+$labels['previewpane'] = 'Prevyu paneli göstər';
 $labels['skin'] = 'İnterfeys stili';
-$labels['logoutclear'] = 'Poçtdan çıxış vaxtı zibil qutusu təmizlənsin';
-$labels['logoutcompact'] = 'Poçtdan çıxış vaxtı gələnlər yığcam olunsun';
-$labels['uisettings'] = 'İstifadəçi İnterfeysi';
-$labels['serversettings'] = 'Server Nizamlamalrı';
-$labels['mailboxview'] = 'Poçt qutusunu göstər';
-$labels['mdnrequests'] = 'Göndərən bildirişləri';
-$labels['askuser'] = 'istifadəçini soruş';
+$labels['logoutclear'] = 'Poçtdan çıxan zaman səbəti təmizlə';
+$labels['logoutcompact'] = 'Poçtdan çıxan zaman gələnləri sıx';
+$labels['uisettings'] = 'İstifadəçi interfeysi';
+$labels['serversettings'] = 'Server nizamlamaları';
+$labels['mailboxview'] = 'Poçt qutusunun görünüşü';
+$labels['mdnrequests'] = 'Göndərilmə bildirişi';
+$labels['askuser'] = 'göndərilmə zamanı istifadəçidən soruş';
 $labels['autosend'] = 'avtomatik göndər';
 $labels['ignore'] = 'iqnor';
 $labels['readwhendeleted'] = 'Məktubu siləndə oxunmuş kimi qeyd et';
-$labels['flagfordeletion'] = 'Silinmə üçün bayraq';
+$labels['flagfordeletion'] = 'Silmə əvəzi silinmə işarəsilə qeyd et';
 $labels['skipdeleted'] = 'Silinmiş məktubları göstərmə';
-$labels['showremoteimages'] = 'Uzaq fəaliyyətdəki şəkilləri göstər';
-$labels['fromknownsenders'] = 'bilinən göndərilənlərdən';
+$labels['deletealways'] = 'Məktubu səbətə köçürmək alınmırsa, silinsin';
+$labels['showremoteimages'] = 'Silinmiç şəkilləri göstər';
+$labels['fromknownsenders'] = 'məlum göndərənlərdən';
 $labels['always'] = 'hər zaman';
-$labels['showinlineimages'] = 'Əlavə olunmuş qrafikləri məktubun aşağısında göstər';
-$labels['autosavedraft'] = 'Qaralamanı avtomatik olaraq yaddaşda saxla';
+$labels['showinlineimages'] = 'Əlavə olunmuş şəkili məktubun aşağısında göstər';
+$labels['autosavedraft'] = 'Qaralamanı avtomatik saxla';
 $labels['everynminutes'] = 'hər $n dəqiqə(lər)';
-$labels['keepalive'] = 'Yeni məktubları burada yoxlayın:';
-$labels['never'] = 'heç bir zaman';
+$labels['keepalive'] = 'Yeni məktubları yoxla';
+$labels['never'] = 'heç vaxt';
+$labels['immediately'] = 'dərhal';
 $labels['messagesdisplaying'] = 'Məktubların göstərilməsi';
 $labels['messagescomposition'] = 'Məktubların yazılması';
-$labels['mimeparamfolding'] = 'Bərkidilən adlan';
+$labels['mimeparamfolding'] = 'Bərkidilənlərin adları';
 $labels['2231folding'] = 'Full RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
-$labels['2047folding'] = 'Full RFC 2047 (other)';
-$labels['advancedoptions'] = 'Geniş xüsusiyyətlər';
-$labels['focusonnewmessage'] = 'Yeni məktubda mərkəzi səyyah pəncərəsi';
-$labels['checkallfolders'] = 'Qovluqları yeni məktublar üçün yoxlayın';
+$labels['2047folding'] = 'Full RFC 2047 (başqa)';
+$labels['force7bit'] = '8-bitli simvollar üçün MIME istifadə et';
+$labels['advancedoptions'] = 'Ətraflı nizamlama';
+$labels['focusonnewmessage'] = 'Yeni məktub zamanı brauzerin pəncərəsini fokusla';
+$labels['checkallfolders'] = 'Bütün qovluqlarda yeni məktubları yoxla';
+$labels['displaynext'] = 'Hazırkini sildikdə/köçürdükdə növbəti məktubu göstər';
+$labels['mainoptions'] = 'Əsas nizamlamalar';
+$labels['section'] = 'Bölmə';
+$labels['maintenance'] = 'Xidmət';
+$labels['newmessage'] = 'Yeni məktub';
+$labels['listoptions'] = 'Nizamlamaların siyahısı';
+$labels['signatureoptions'] = 'İmzanın nizamlamaları';
+$labels['whenreplying'] = 'Cavab zamanı';
+$labels['replytopposting'] = 'orijinaldan əvvəl yeni məktub yaz';
+$labels['replybottomposting'] = 'orijinaldan sonra yeni məktub yaz';
+$labels['replyremovesignature'] = 'Cavab zamanı imzanı sil';
+$labels['autoaddsignature'] = 'İmzanı avtomatik əlavə et';
+$labels['newmessageonly'] = 'yalnız yeni məktublarda';
+$labels['replyandforwardonly'] = 'Yalnız cavab və yönəldilənlərdə';
+$labels['replysignaturepos'] = 'Cavab və yönəltmə zamanı imzanı bərkid';
+$labels['belowquote'] = 'sitatdan sonra';
+$labels['abovequote'] = 'sitatdan əvvəl';
+$labels['insertsignature'] = 'İmza əlavə et';
+$labels['previewpanemarkread'] = 'Baxılmış şəkilləri oxunmuş kimi qeyd et';
+$labels['afternseconds'] = '$n saniyədən sonra';
 $labels['folder'] = 'Qovluq';
 $labels['folders'] = 'Qovluqlar';
 $labels['foldername'] = 'Qovluq adı';
-$labels['subscribed'] = 'Görüləbilinən';
+$labels['subscribed'] = 'İmzalanıb';
 $labels['messagecount'] = 'Məktublar';
-$labels['create'] = 'Yani Yarat';
-$labels['createfolder'] = 'Yeni qovluq yarat';
-$labels['rename'] = 'Yenidən adlandır';
-$labels['renamefolder'] = 'Qovluğu yenidən adlandır';
-$labels['deletefolder'] = 'Qovluğu sil';
+$labels['create'] = 'Yarad';
+$labels['createfolder'] = 'Yeni qovluq yarad';
 $labels['managefolders'] = 'Qovluqlarla iş';
 $labels['specialfolders'] = 'Xüsusi qovluqlar';
-$labels['sortby'] = 'Sırala';
+$labels['sortby'] = 'Çeşidlə';
 $labels['sortasc'] = 'Azdan çoxa';
 $labels['sortdesc'] = 'Çoxdan aza';
 $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'İngilis dili';
+$labels['westerneuropean'] = 'Qərbi Avropa';
+$labels['easterneuropean'] = 'Şərqi Avropa';
+$labels['southeasterneuropean'] = 'Cənub-Şərqi Avropa';
+$labels['baltic'] = 'Baltik';
+$labels['cyrillic'] = 'Kirillə';
+$labels['arabic'] = 'Ərəbcə';
+$labels['greek'] = 'Yunanca';
+$labels['hebrew'] = 'Yəhudicə';
+$labels['turkish'] = 'Türkcə';
+$labels['nordic'] = 'Skandinav';
+$labels['thai'] = 'Tayca';
+$labels['celtic'] = 'Keltcə';
+$labels['vietnamese'] = 'Vyetnamca';
+$labels['japanese'] = 'Yaponca';
+$labels['korean'] = 'Koreya';
+$labels['chinese'] = 'Çincə';
 
 ?>
index 543a316e32c7a2399ed0452bf533370401dccb12..dcef7c5436a81ecced745b125aaee931cf05f5e6 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/az_AZ/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 
 $messages = array();
 $messages['loginfailed'] = 'Giriş uğursuz oldu';
-$messages['cookiesdisabled'] = 'Darayıcınız cookiləri kəbul etmir';
-$messages['sessionerror'] = 'Sessiyanız sona çatmışdır və ya xətalıdır';
-$messages['imaperror'] = 'IMAP Serverləə əlaqə yaratmaq mümkün olmadı';
+$messages['cookiesdisabled'] = 'Sizin brauzer kukiləri qəbul etmir';
+$messages['sessionerror'] = 'Sizin sessiya köhnəlib';
+$messages['imaperror'] = 'IMAP serverlə bağlantı alınmadı';
+$messages['servererror'] = 'Server xətası!';
+$messages['invalidrequest'] = 'Səhv sorğu! Məlumat yaddaşda qalmadı.';
 $messages['nomessagesfound'] = 'Poçt qutusunda məktub tapılmadı';
-$messages['loggedout'] = 'Çıxış uğurlu oldu. Gülə-gülə!';
+$messages['loggedout'] = 'Çıxış uğurlu oldu. Sağ olun!';
 $messages['mailboxempty'] = 'Poçt qutusu boşdur';
 $messages['loading'] = 'Yüklənir...';
-$messages['loadingdata'] = 'Verilənlər yüklənir...';
-$messages['checkingmail'] = 'Yeni məktub olub-olmadığı yoxlanılır...';
+$messages['uploading'] = 'Fayl yüklənir...';
+$messages['loadingdata'] = 'Məlumatlar yüklənir...';
+$messages['checkingmail'] = 'Yeni məktubları yoxla...';
 $messages['sendingmessage'] = 'Məktub göndərilir...';
-$messages['messagesent'] = 'Məktub göndərildi';
-$messages['savingmessage'] = 'Poçt yaddaşa salınır...';
-$messages['messagesaved'] = 'Məktub yaddaşa salındı';
-$messages['successfullysaved'] = 'Yaddaşda saxlanıldı';
+$messages['messagesent'] = 'Məktub uğurla göndərildi';
+$messages['savingmessage'] = 'Məktubu saxla...';
+$messages['messagesaved'] = 'Məktub qaralamada saxlandı';
+$messages['successfullysaved'] = 'Yaddaşa yazıldı';
 $messages['addedsuccessfully'] = 'Əlaqə ünvan kitabçasına əlavə olundu';
-$messages['contactexists'] = 'Ünvan kitabçasında bu e-poçt ünvanı mövcuddur';
-$messages['blockedimages'] = 'Gizliliyinizi qorumaq məqsədilə məktubdakı qrafiklər blok edildi.';
-$messages['encryptedmessage'] = 'Bu şifrələnmiş bir məktubdur və bu səbəbə görə göstərilməsi mümkün deyil. Üzr istəyirik!';
-$messages['nocontactsfound'] = 'Əlaqə tapılmadı';
-$messages['contactnotfound'] = 'İstənən bağlantı tapılmadı';
-$messages['sendingfailed'] = 'Məktub göndəriləmədi';
-$messages['senttooquickly'] = 'Zəhmət olmasa, bu məktubu göndərməzdən əvvəl $sec gözləyin';
-$messages['errorsavingsent'] = 'Məktub saxlanılan zaman xəta baş verdi';
-$messages['errorsaving'] = 'Yaddaşda saxlanılarkən bir problem baş verdi';
-$messages['errormoving'] = 'Məktubun yerini dəyişmək mümkün olmadı';
-$messages['errordeleting'] = 'Məktubu silmək mümkün olmadı';
-$messages['deletecontactconfirm'] = 'Seçilən əlaqələri silməyə əminsinizmi?';
-$messages['deletemessagesconfirm'] = 'Seçilən mesajları silmək istəyirsiz?';
-$messages['deletefolderconfirm'] = 'Bu qovluğu silməyə əminmisiniz?';
-$messages['purgefolderconfirm'] = 'Bu qovluqdakı bütün məktubları silməyə əminmisiniz?';
-$messages['foldercreating'] = 'Qovluğun yaradılması...';
-$messages['folderdeleting'] = 'Qovluğun silinməsi...';
-$messages['folderrenaming'] = 'Qovluğun adının dəyişdirilməsi...';
+$messages['contactexists'] = 'Ünvan kitabçasında bu e-poçtla əlaqə mövcuddur';
+$messages['blockedimages'] = 'Təhlükəsizlik məqsədi ilə şəkillərin yüklənməsi bloklanıb.';
+$messages['encryptedmessage'] = 'Məktub şifrələnib və göstərilə bilməz. Server inzibatçısına müraciət edin.';
+$messages['nocontactsfound'] = 'Ünvanlar tapılmadı';
+$messages['contactnotfound'] = 'Tələb olunan ünvan tapılmadı';
+$messages['sendingfailed'] = 'Məktub göndərilmədi';
+$messages['senttooquickly'] = 'Məktub göndərmək üçün $sec saniyə gözləmək gərəkir';
+$messages['errorsavingsent'] = 'Göndərilən məktub saxlanılan zaman xəta baş verdi';
+$messages['errorsaving'] = 'Saxlanma prosesi zamanı problem baş verdi';
+$messages['errormoving'] = 'Məktubu (məktubları) köçürmək alnmadı';
+$messages['errorcopying'] = 'Məktubu (məktubları) kopyalamaq alınmadı';
+$messages['errordeleting'] = 'Məktubu (məktubları) silmək alınmadı';
+$messages['errormarking'] = 'Məktubu (məktubları) işarələmək mümkün deyil';
+$messages['deletecontactconfirm'] = 'Seçilən ünvanı (ünvanları) silməyə əminsiniz?';
+$messages['deletemessagesconfirm'] = 'Seçilən məktubu (məktubları) silməyə əminsiniz?';
+$messages['deletefolderconfirm'] = 'Bu qovluğu silməyə əminsiniz?';
+$messages['purgefolderconfirm'] = 'Bu qovluqdakı bütün məktubları silməyə əminsiniz?';
+$messages['folderdeleting'] = 'Qovluğ silinir...';
 $messages['foldermoving'] = 'Qovluq köçürülür...';
-$messages['formincomplete'] = 'Form tam olaraq doldurulmadı';
-$messages['noemailwarning'] = 'Xahiş olunur düzgün e-poçt ünvanı daxil edin';
-$messages['nonamewarning'] = 'Xahiş olunur bir ad daxil edin';
-$messages['nopagesizewarning'] = 'Xahiş olunur bir səhifə ölçüsü daxil edin';
-$messages['nosenderwarning'] = 'Zəhmət olmasa, göndərənin e-poçt ünvanını daxil edin';
-$messages['norecipientwarning'] = 'Xahiş olunur ən az bir qəbul edən göstərin';
-$messages['nosubjectwarning'] = '"Mövzu" daxil edilməmişdir. İndi bir mövzu daxil etmək istəyirsinizmi?';
-$messages['nobodywarning'] = 'Məktubu boş olaraq göndər?';
-$messages['notsentwarning'] = 'Məktub göndərilmədi. Məktubunuzu ləğv etmək istəyirsinizmi?';
-$messages['noldapserver'] = 'Xahiş olunur axtarmaq üçün bir Ldap server seçin';
-$messages['nocontactsreturned'] = 'Əlaqə tapılmadı';
-$messages['nosearchname'] = 'Xahiş olunur bir ad və ya e-poçt ünvanı daxil edin';
-$messages['searchsuccessful'] = '$nr məktub tapıldı';
-$messages['searchnomatch'] = 'Axtardığınıza uyğun heç bir nəticə tapılmadı';
+$messages['formincomplete'] = 'Bütün sətrlər doldurulmayıb';
+$messages['noemailwarning'] = 'Lütfən, düzgün e-poçt ünvanı daxil edin';
+$messages['nonamewarning'] = 'Lütfən, ad daxil edin';
+$messages['nopagesizewarning'] = 'Lütfən, səhifənin ölçüsünü daxil edin';
+$messages['nosenderwarning'] = 'Lütfən, göndərənin elektron poçt ünvanını daxil edin';
+$messages['norecipientwarning'] = 'Lütfən, qəbul edənin ünvanını daxil edin';
+$messages['nosubjectwarning'] = '"Mövzu" sahəsi boşdur. Mövzu daxil etmək istəyirsiniz?';
+$messages['nobodywarning'] = 'Məktub boş göndərilsin?';
+$messages['notsentwarning'] = 'Məktub göndərilmədi. Göndərilmədən imtina etmək istəyirsiniz?';
+$messages['noldapserver'] = 'Lütfən, axtarış üçün LDAP server seçin';
+$messages['nocontactsreturned'] = 'Ünvanlar tapılmadı';
+$messages['nosearchname'] = 'Lütfən, ad və ya e-poçt əlavə edin';
+$messages['notuploadedwarning'] = 'Əlavələr tam yüklənilməyib. Gözləyin və ya yükləməni ləğv edin.';
+$messages['searchsuccessful'] = 'Tapılan məktublar: $nr';
+$messages['searchnomatch'] = 'Məktub tapılmadı';
 $messages['searching'] = 'Axtarılır...';
 $messages['checking'] = 'Yoxlanılır...';
-$messages['nospellerrors'] = 'Qrammatik səhv tapılmadı';
-$messages['folderdeleted'] = 'Qovluq uğurlu olaraq silindi';
+$messages['nospellerrors'] = 'Orfoqrafik səhvlət tapılmadı';
+$messages['folderdeleted'] = 'Qovluq uğurla silindi';
 $messages['deletedsuccessfully'] = 'Silindi';
-$messages['converting'] = 'Mesajın formalandırılması prosesi gedir..';
-$messages['messageopenerror'] = 'Mesajın serverdən yüklənilməsi mümkün olmadı';
-$messages['fileuploaderror'] = 'Fayl yüklənməsi uğursuz oldu';
-$messages['filesizeerror'] = 'Yüklənilən faylın ölçüsü $size çoxdur';
-$messages['copysuccess'] = '$nr ünvan nüsxələndi';
-$messages['copyerror'] = 'Heç bir ünvanı nüsxələmək mümkün olmadı';
-$messages['sourceisreadonly'] = 'Ünvan qaynağı tam oxunar vəziyyətdə';
-$messages['errorsavingcontact'] = 'Əlaqə ünvanını yaddaşa salmaq mümkün olmadı';
-$messages['movingmessage'] = 'Məktubun yeri dəyişdirilir';
-$messages['receiptsent'] = 'Oxuma receipt-i uğurlu olaraq göndərildi';
-$messages['errorsendingreceipt'] = 'Receipt göndərmək mümkün olmadı';
-$messages['nodeletelastidentity'] = 'Siz bu eyniliyi silə bilməzsiniz.';
-$messages['addsubfolderhint'] = 'Bu qovluq seçilmiş qovluqda alt qovluq olaraq yaradıldı';
-$messages['forbiddencharacter'] = 'Qovluq adında qadağan olunmuş xarakter(lər) var';
-$messages['selectimportfile'] = 'Zəhmət olmasa, yüklənilən faylı seç';
-$messages['addresswriterror'] = 'Seçilmiş ünvan kitabçası yazılmayandır';
-$messages['importwait'] = 'İdxal, gözləyin...';
-$messages['importerror'] = 'İdxal alınmadı! Yüklənilən fayl vCard fayla uyğun deyil.';
-$messages['importconfirm'] = '<b>$inserted ünvanlar müvəffəqiyyətlə idxal edildi, mövcud daxil edilən $skipped atla</b>:<p><em>$names</em></p>';
-$messages['opnotpermitted'] = 'Əməliyyata icazə verilmir!';
-$messages['nofromaddress'] = 'Seçilmiş eynilikdə e-poçt ünvanı axtarılır';
-$messages['editorwarning'] = 'Adi mətn redaktoruna keçid, bütün mətn formatlarının itkisinə gətirəcək. Davam edim?';
+$messages['converting'] = 'Məktubun formatlaşması silinir...';
+$messages['messageopenerror'] = 'Məktubu serverdən yükləmək alınmır';
+$messages['fileuploaderror'] = 'Fayl yüklənilmədi';
+$messages['filesizeerror'] = 'Yüklənilən fayl maksimal ölçüdən çoxdur - $size';
+$messages['copysuccess'] = '$nr ünvan kopyalandı';
+$messages['copyerror'] = 'Ünvanları kopyalamaq alınmır';
+$messages['sourceisreadonly'] = 'Verilən ünvanlar mənbəyi yalnız oxunmaq üçün';
+$messages['errorsavingcontact'] = 'Əlaqəni ünvanda saxlamaq mümkün deyil';
+$messages['movingmessage'] = 'Məktub köçürülür...';
+$messages['copyingmessage'] = 'Məktub kopyalanır...';
+$messages['receiptsent'] = 'Oxunulma haqda bildiriş göndərildi';
+$messages['errorsendingreceipt'] = 'Oxunulma haqda bildiriş göndərilmədi';
+$messages['nodeletelastidentity'] = 'Siz bu kimliyi silə bilməzsiniz. Bu axırıncıdır. ';
+$messages['forbiddencharacter'] = 'Qovlu adı qadağan olunmuş simvollar təşkil edir';
+$messages['selectimportfile'] = 'Yüklənilən faylı seçin';
+$messages['addresswriterror'] = 'Seçilmiş ünvan kitabçası yaddaşa yazıla bilməz';
+$messages['contactaddedtogroup'] = 'Ünvanlar qrupa əlavə edildi';
+$messages['contactremovedfromgroup'] = 'Ünvanlar qrupdan silindi';
+$messages['importwait'] = 'İdxal gedir, lütfən gözləyin...';
+$messages['importerror'] = 'İdxal alınmadı! Yüklənilən fayl düzgün vCard fayl deyil.';
+$messages['importconfirm'] = '<b>$inserted ünvanlar müvəffəqiyyətlə idxal edildi, mövcud $skipped buraxılıb</b>:<p><em>$names</em></p>';
+$messages['opnotpermitted'] = 'Əməliyyat qadağandır!';
+$messages['nofromaddress'] = 'Seçilmiş kimlikdə e-poçt ünvanları yoxdur';
+$messages['editorwarning'] = 'Adi mətn redaktoruna keçid, bütün mətn formatlarının itkisinə gətirəcək. Davam edilsin?';
+$messages['httpreceivedencrypterror'] = 'Serverdə qaçıımaz xəta baş verib. Təcili öz inzibatçınız ilə əlaqə qurun. <b>Sizin məktub göndərilməyə bilər.</b>';
+$messages['smtpconnerror'] = 'SMTP Error ($code): Serverlə bağlantı alınmadı';
+$messages['smtpautherror'] = 'SMTP Error ($code): İdentifikasiya xətası';
+$messages['smtpfromerror'] = 'SMTP Error ($code): Göndərəni səlavə etmək mümkün deyil - "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP Error ($code): Qəbul edəni əlavə etmək mümkün deyil - "$to" ($msg)';
+$messages['smtprecipientserror'] = 'SMTP Error ($code): Qəbul edənlərin siyahısını emal etmək mümkün deyil';
+$messages['smtperror'] = 'SMTP Error ($code): $msg';
+$messages['emailformaterror'] = 'Səhv ünvan: $email';
+$messages['toomanyrecipients'] = 'Qəbul edənlər həddindən artıq çoxdur. Lütfən, $max qədər azaldın.';
+$messages['maxgroupmembersreached'] = 'Qrupun ölçüsü imkan verilən maksimumdan artıqdır - $max';
+$messages['internalerror'] = 'Daxili xəta baş verdi. Lütfən, bir daha cəhd edin';
 
 ?>
index 7790f3617a00382d2002576f9d20cf25d528f354..3b06fc280d4131b2f6ddc5c45e16275edfa68a06 100644 (file)
@@ -3,18 +3,18 @@
 /*
 
 +-----------------------------------------------------------------------+
-| language/bg/labels.inc                                                |
+| language/bg_BG/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Todor Dragnev <todor.dragnev@gmail.com>                                              |
-|        Nickolay Bunev <just4nick@gmail.com>                                                          |
+| Author: Todor Dragnev <todor.dragnev@gmail.com>                       |
+|   Nickolay Bunev <just4nick@gmail.com>                                |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -39,21 +39,25 @@ $labels['to'] = 'Получател';
 $labels['cc'] = 'Копие до';
 $labels['bcc'] = 'Скрито копие до';
 $labels['replyto'] = 'Отговор до';
+$labels['followupto'] = 'Препращане към';
 $labels['date'] = 'Дата';
 $labels['size'] = 'Размер';
 $labels['priority'] = 'Приоритет';
 $labels['organization'] = 'Организация';
+$labels['readstatus'] = 'Статут (прочетено/непрочетено)';
 $labels['reply-to'] = 'Отговор до';
+$labels['mail-reply-to'] = 'Отговор към';
+$labels['mail-followup-to'] = 'Препращане към';
 $labels['mailboxlist'] = 'Папки';
 $labels['messagesfromto'] = 'Съобщения $from до $to от $count';
+$labels['threadsfromto'] = 'Съобщения $from до $to от $count';
 $labels['messagenrof'] = 'Съобщение $nr от $count';
+$labels['copy'] = 'Копиране';
+$labels['move'] = 'Преместване';
 $labels['moveto'] = 'Премести в...';
 $labels['download'] = 'Изтегли';
 $labels['filename'] = 'Име на файла';
 $labels['filesize'] = 'Размер на файла';
-$labels['preferhtml'] = 'Показвай първо HTML версия';
-$labels['htmlmessage'] = 'HTML съобщение';
-$labels['prettydate'] = 'Кратки дати';
 $labels['addtoaddressbook'] = 'Добави в адресната книга';
 $labels['sun'] = 'Нед';
 $labels['mon'] = 'Пон';
@@ -98,6 +102,8 @@ $labels['checkmail'] = 'Провери за нови писма';
 $labels['writenewmessage'] = 'Създай ново писмо';
 $labels['replytomessage'] = 'Отговори на писмото';
 $labels['replytoallmessage'] = 'Отговор до изпращача и всички получатели';
+$labels['replyall'] = 'Отговор на всички';
+$labels['replylist'] = 'Списък за отговор';
 $labels['forwardmessage'] = 'Препрати писмото';
 $labels['deletemessage'] = 'Изтрий писмото';
 $labels['movemessagetotrash'] = 'Премести писмото в кошчето';
@@ -121,12 +127,35 @@ $labels['messageactions'] = 'Още действия';
 $labels['select'] = 'Избери';
 $labels['all'] = 'Всички';
 $labels['none'] = 'Нищо';
+$labels['currpage'] = 'Страница';
 $labels['unread'] = 'Нови';
 $labels['flagged'] = 'Отбелязано';
 $labels['unanswered'] = 'Неотговорено';
 $labels['deleted'] = 'Изтрито';
 $labels['invert'] = 'Инвертирай';
 $labels['filter'] = 'Филтър';
+$labels['list'] = 'Списък';
+$labels['threads'] = 'Съобщения';
+$labels['expand-all'] = 'Отваряне на всички';
+$labels['expand-unread'] = 'Отваряне на непрочетени';
+$labels['collapse-all'] = 'Затваряне на всички';
+$labels['threaded'] = 'Съобщения с отговори';
+$labels['autoexpand_threads'] = 'Отваряне на съобщения и отговори';
+$labels['do_expand'] = 'всички отговори';
+$labels['expand_only_unread'] = 'само с непрочетени съобщения';
+$labels['fromto'] = 'Изпращащ/Получаващ';
+$labels['flag'] = 'Флаг';
+$labels['attachment'] = 'Прикачен файл';
+$labels['nonesort'] = 'Никакъв';
+$labels['sentdate'] = 'Дата на изпращане';
+$labels['arrival'] = 'Дата на пристигане';
+$labels['asc'] = 'възходящ';
+$labels['desc'] = 'низходящ';
+$labels['listcolumns'] = 'Колони за списък';
+$labels['listsorting'] = 'Колона за сортиране';
+$labels['listorder'] = 'Режим на сортиране';
+$labels['listmode'] = 'Кратък списък';
+$labels['folderactions'] = 'Десйтвия за папки...';
 $labels['compact'] = 'Свий';
 $labels['empty'] = 'Изпразни';
 $labels['purge'] = 'Изчисти';
@@ -147,12 +176,15 @@ $labels['addattachment'] = 'Прикачи файл';
 $labels['charset'] = 'Кодировка';
 $labels['editortype'] = 'Вид редактор';
 $labels['returnreceipt'] = 'Обратна разписка';
+$labels['dsn'] = 'Информиране при доставка';
+$labels['editidents'] = 'Редактиране на самоличности';
 $labels['checkspelling'] = 'Провери правописа';
 $labels['resumeediting'] = 'Продължи черновата';
 $labels['revertto'] = 'Върни се към';
 $labels['attachments'] = 'Прикачени файлове';
 $labels['upload'] = 'Качи';
 $labels['close'] = 'Затвори';
+$labels['messageoptions'] = 'Настройки на съобщения...';
 $labels['low'] = 'Нисък';
 $labels['lowest'] = 'Най-нисък';
 $labels['normal'] = 'Нормален';
@@ -169,6 +201,7 @@ $labels['maxuploadsize'] = 'Максимално позволен размер $
 $labels['addcc'] = 'Копие до';
 $labels['addbcc'] = 'Скрито копие до';
 $labels['addreplyto'] = 'Отговор на';
+$labels['addfollowupto'] = 'Добавяне на препращане към';
 $labels['mdnrequest'] = 'Подателят на писмото е пожелал да бъде уведомен, че сте го прочели. Желаете ли да изпратите обратна разписка?';
 $labels['receiptread'] = 'Обратна разписка (прочетено)';
 $labels['yourmessage'] = 'Това е обратна разписка за писмото Ви';
@@ -179,6 +212,8 @@ $labels['surname'] = 'Фамилия';
 $labels['email'] = 'E-Mail';
 $labels['addcontact'] = 'Добави';
 $labels['editcontact'] = 'Редактирай';
+$labels['contacts'] = 'Контакти';
+$labels['contactproperties'] = 'Свойства на контакт';
 $labels['edit'] = 'Редактирай';
 $labels['cancel'] = 'Отказ';
 $labels['save'] = 'Запиши';
@@ -190,10 +225,13 @@ $labels['contactsfromto'] = 'Контакти $from до $to от $count';
 $labels['print'] = 'Разпечатай';
 $labels['export'] = 'Изнасяне';
 $labels['exportvcards'] = 'Изнасяне във vCard формат';
+$labels['newcontactgroup'] = 'Създаване на нова група';
+$labels['groupactions'] = 'Действия за групи от контакти...';
 $labels['previouspage'] = 'Предна страница';
 $labels['firstpage'] = 'Първа страница';
 $labels['nextpage'] = 'Следваща страница';
 $labels['lastpage'] = 'Последна страница';
+$labels['group'] = 'Група';
 $labels['groups'] = 'Групи';
 $labels['personaladrbook'] = 'Лични адреси';
 $labels['import'] = 'Внасяне';
@@ -211,6 +249,10 @@ $labels['manageidentities'] = 'Промяна на самоличностите
 $labels['newidentity'] = 'Нова самоличност';
 $labels['newitem'] = 'Нова самоличност';
 $labels['edititem'] = 'Редактиране на самоличност';
+$labels['preferhtml'] = 'Показвай първо HTML версия';
+$labels['defaultcharset'] = 'Подразбиращо се кодиране';
+$labels['htmlmessage'] = 'HTML съобщение';
+$labels['prettydate'] = 'Кратки дати';
 $labels['setdefault'] = 'По подразбиране';
 $labels['autodetect'] = 'Автоматично';
 $labels['language'] = 'Език';
@@ -219,6 +261,7 @@ $labels['pagesize'] = 'Редове на страница';
 $labels['signature'] = 'Подпис';
 $labels['dstactive'] = 'Маркирай при лятно време';
 $labels['htmleditor'] = 'Писане на съобщениe като HTML';
+$labels['htmlonreply'] = 'само при отговор на HTML събощения';
 $labels['htmlsignature'] = 'HTML подпис';
 $labels['previewpane'] = 'Панел за преглед';
 $labels['skin'] = 'Смяна изгледа на интерфейса';
@@ -230,10 +273,13 @@ $labels['mailboxview'] = 'Преглед на Кутия';
 $labels['mdnrequests'] = 'Уведомление на изпращача';
 $labels['askuser'] = 'Питай';
 $labels['autosend'] = 'Изпрати автоматично';
+$labels['autosendknown'] = 'да се изпрати обратна разписка на моите контакти и да се при външни контакти';
+$labels['autosendknownignore'] = 'да се изпрати обратна разписка на моите контакти, а на външни не';
 $labels['ignore'] = 'Отхвърли';
 $labels['readwhendeleted'] = 'Отбележи като прочетено при изтриване';
 $labels['flagfordeletion'] = 'Отбележи съобщението за изтриване';
 $labels['skipdeleted'] = 'Не показвай изтритите съобщения';
+$labels['deletealways'] = 'При неуспешн преместване на съобщение в Кошчето, да се изтрие';
 $labels['showremoteimages'] = 'Покажи блокираните изображения';
 $labels['fromknownsenders'] = 'Oт познати изпращачи';
 $labels['always'] = 'Винаги';
@@ -242,22 +288,39 @@ $labels['autosavedraft'] = 'Автоматично записвай чернов
 $labels['everynminutes'] = 'всеки $n минути';
 $labels['keepalive'] = 'Проверявай за нови съобщения на';
 $labels['never'] = 'никога';
+$labels['immediately'] = 'веднага';
 $labels['messagesdisplaying'] = 'Показване на събщенията';
 $labels['messagescomposition'] = 'Писане на съобщения';
 $labels['mimeparamfolding'] = 'Добавяне име на прикрепените файлове';
 $labels['2231folding'] = 'Според RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Според RFC 2047 (други)';
+$labels['force7bit'] = 'Използване на MIME кодиране за 8-битови символи';
 $labels['advancedoptions'] = 'Настройки за напреднали';
 $labels['focusonnewmessage'] = 'Премигване на прозореца при ново писмо';
 $labels['checkallfolders'] = 'Провери всички папки за нови писма';
 $labels['displaynext'] = 'След изтриване / премини към следващото писмо';
-$labels['indexsort'] = 'Използвай индекса на писмата при сортиране по дата';
 $labels['mainoptions'] = 'Основни настройки';
 $labels['section'] = 'Раздел';
 $labels['maintenance'] = 'Поддръжка';
 $labels['newmessage'] = 'Ново съобщение';
 $labels['listoptions'] = 'Покажи списък с настройки';
+$labels['signatureoptions'] = 'Настройки на подпис';
+$labels['whenreplying'] = 'При отговор';
+$labels['replytopposting'] = 'започване на ново съобщение преди получения текст';
+$labels['replybottomposting'] = 'започване на ново съобщение след получения текст';
+$labels['replyremovesignature'] = 'Премахване на предишния подпис от съобщението при отговор';
+$labels['autoaddsignature'] = 'Автоматично добавяне на подпис';
+$labels['newmessageonly'] = 'само на нови съобщения';
+$labels['replyandforwardonly'] = 'само на отговори и препратени';
+$labels['replysignaturepos'] = 'Поставяне на подпис при отговор или препращане';
+$labels['belowquote'] = 'над цитатът';
+$labels['abovequote'] = 'под цитатът';
+$labels['insertsignature'] = 'Вмъкване на подпис';
+$labels['previewpanemarkread'] = 'Маркиране на прегледаните съобщения като прочетени';
+$labels['afternseconds'] = 'след $n секунди';
+$labels['reqmdn'] = 'Винаги връщай обратна разписка';
+$labels['reqdsn'] = 'Винаги изисквай отговор при доставка на съобщение';
 $labels['folder'] = 'Папка';
 $labels['folders'] = 'Папки';
 $labels['foldername'] = 'Име на папката';
@@ -265,9 +328,6 @@ $labels['subscribed'] = 'Използвай';
 $labels['messagecount'] = 'Писма';
 $labels['create'] = 'Създай';
 $labels['createfolder'] = 'Направи нова папка';
-$labels['rename'] = 'Преименувай';
-$labels['renamefolder'] = 'Преименувай папката';
-$labels['deletefolder'] = 'Изтрий';
 $labels['managefolders'] = 'Настройки на папките';
 $labels['specialfolders'] = 'Служебни папки';
 $labels['sortby'] = 'Сортирай по';
@@ -277,5 +337,23 @@ $labels['B'] = 'Б';
 $labels['KB'] = 'КБ';
 $labels['MB'] = 'МБ';
 $labels['GB'] = 'ГБ';
+$labels['unicode'] = 'Уникод';
+$labels['english'] = 'Английски';
+$labels['westerneuropean'] = 'Западна Европа';
+$labels['easterneuropean'] = 'Източна Европа';
+$labels['southeasterneuropean'] = 'Югоизточна Европа';
+$labels['baltic'] = 'Балтийски';
+$labels['cyrillic'] = 'Кирилица';
+$labels['arabic'] = 'Арабски';
+$labels['greek'] = 'Гръцки';
+$labels['hebrew'] = 'Иврит';
+$labels['turkish'] = 'Турски';
+$labels['nordic'] = 'Скандинавски';
+$labels['thai'] = 'Тайландски';
+$labels['celtic'] = 'Келтски';
+$labels['vietnamese'] = 'Виетнамски';
+$labels['japanese'] = 'Японски';
+$labels['korean'] = 'Корейски';
+$labels['chinese'] = 'Китайски';
 
-?>
\ No newline at end of file
+?>
index a2af5e08c320b3f3b70b97f5ca39a9cc084730f5..3f6df84adcc40a0cfa5fe602cd1a3f9f1114a70d 100644 (file)
@@ -3,10 +3,10 @@
 /*
 
 +-----------------------------------------------------------------------+
-| language/bg/messages.inc                                              |
+| language/bg_BG/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 |        Nickolay Bunev <just4nick@gmail.com>                                                          |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -24,6 +24,7 @@ $messages['cookiesdisabled'] = 'Вашият браузър не приема co
 $messages['sessionerror'] = 'Невалидна или изтекла сесия';
 $messages['imaperror'] = 'Неуспешно свързване към IMAP сървъра';
 $messages['servererror'] = 'Грешка!';
+$messages['servererrormsg'] = 'Сървърна грешка: $msg';
 $messages['invalidrequest'] = 'Невалидна заявка! Данните не са съхранени.';
 $messages['nomessagesfound'] = 'Няма съобщения';
 $messages['loggedout'] = 'Довиждане!';
@@ -48,15 +49,14 @@ $messages['senttooquickly'] = 'Моля, изчакайте $sec секунда(
 $messages['errorsavingsent'] = 'Възникна грешка при записването на съобщението';
 $messages['errorsaving'] = 'Възникна грешка при записването';
 $messages['errormoving'] = 'Писмото не може да бъде преместено';
+$messages['errorcopying'] = 'Съобщенията не могат да бъдат копирани';
 $messages['errordeleting'] = 'Писмото не може да бъде изтрито';
 $messages['errormarking'] = 'Съобщението не може да бъде маркирано';
 $messages['deletecontactconfirm'] = 'Искате ли да изтриете маркираните контакти?';
 $messages['deletemessagesconfirm'] = 'Искате ли да изтриете маркираните съобщения?';
 $messages['deletefolderconfirm'] = 'Искате ли да изтриете тази папка?';
 $messages['purgefolderconfirm'] = 'Искате ли да изтриете всички писма в тази папка?';
-$messages['foldercreating'] = 'Създаване на папка...';
 $messages['folderdeleting'] = 'Изтриване на папка...';
-$messages['folderrenaming'] = 'Преименуване на папка...';
 $messages['foldermoving'] = 'Преместване на папка...';
 $messages['formincomplete'] = 'Не сте попълнили всички полета';
 $messages['noemailwarning'] = 'Моля, въведете валиден e-mail адрес';
@@ -87,13 +87,17 @@ $messages['copyerror'] = 'Грешка при копирането на адре
 $messages['sourceisreadonly'] = 'Този източник на адреси е само за четене';
 $messages['errorsavingcontact'] = 'Грешка при записването на адреса';
 $messages['movingmessage'] = 'Преместване на писмото...';
+$messages['copyingmessage'] = 'Копиране на съобщение...';
+$messages['deletingmessage'] = 'Изтриване на съобщение';
+$messages['markingmessage'] = 'Маркиране на съобщение';
 $messages['receiptsent'] = 'Обратната разписка е изпратена.';
 $messages['errorsendingreceipt'] = 'Грешка при изпращането на обратна разписка.';
 $messages['nodeletelastidentity'] = 'Не можете да изтриете тази самоличност, трябва да имате поне една.';
-$messages['addsubfolderhint'] = 'Тази папка ще бъде създадена като подпапка на текущо избраната';
 $messages['forbiddencharacter'] = 'Името на папката съдържа непозволени символи';
 $messages['selectimportfile'] = 'Моля изберете файл за качване';
 $messages['addresswriterror'] = 'Избраната адресна книга не може да бъде записвана';
+$messages['contactaddedtogroup'] = 'Контактите бяха успешно добавени към групата';
+$messages['contactremovedfromgroup'] = 'Контактите бяха успешно премахнати от групата';
 $messages['importwait'] = 'Внасяне, моля изчакайте...';
 $messages['importerror'] = 'Внасянето неуспешно! Каченият файл не е във валиден vCard формат.';
 $messages['importconfirm'] = '<b>Успешно са внесени $inserted контакта, вече съществуващите $skipped контакта са пропуснати</b>:<p><em>$names</em></p>';
@@ -103,10 +107,24 @@ $messages['editorwarning'] = 'Превключването на редактор
 $messages['httpreceivedencrypterror'] = 'Фатална конфигурационна грешка. Моля, свържете се веднага с администратора. <b>Съобщението Ви не може да бъде изпратено.</b>';
 $messages['smtpconnerror'] = 'SMTP грешка ($code): Няма връзка със сървъра';
 $messages['smtpautherror'] = 'SMTP грешка ($code): Грешни потребител/парола';
-$messages['smtpfromerror'] = 'SMTP грешка ($code): Не може да бъде изпратено писмо от "$from"';
-$messages['smtptoerror'] = 'SMTP грешка ($code): Не може да бъде изпратено писмо до "$to"';
+$messages['smtpfromerror'] = 'SMTP грешка ($code): Не може да бъде изпратено писмо от "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP грешка ($code): Не може да бъде изпратено писмо до "$to" ($msg)';
 $messages['smtprecipientserror'] = 'SMTP грешка: Не може да бъде обработен списъка с получатели';
+$messages['smtpdsnerror'] = 'SMTP грешка: Не се поддържа съобщаване за успешни получено съобщение';
 $messages['smtperror'] = 'SMTP грешка: $msg';
 $messages['emailformaterror'] = 'Невалиден e-mail адрес: $email';
+$messages['toomanyrecipients'] = 'Прекалено много адреси за изпращане (максимум: $max).';
+$messages['maxgroupmembersreached'] = 'Броя на членовете на групата е повече от максималния: $max.';
+$messages['internalerror'] = 'Възникна вътрешна грешка. Моля опитайте отново';
+$messages['contactdelerror'] = 'Не мога да изтрия контакта';
+$messages['contactdeleted'] = 'Контактът беше изтрит';
+$messages['groupdeleted'] = 'Групата беше  изтрита';
+$messages['grouprenamed'] = 'Групата беше преименувана ';
+$messages['groupcreated'] = 'Групата беше създадена';
+$messages['messagedeleted'] = 'Съобщението  беше  изтрито';
+$messages['messagemoved'] = 'Съобщението беше преместено';
+$messages['messagecopied'] = 'Съобщението беше копирано';
+$messages['messagemarked'] = 'Съобщението беше маркирано';
+$messages['autocompletechars'] = 'Въведете минимум $min знака, за да започне автоматичното попълване';
 
-?>
\ No newline at end of file
+?>
index e03a1a8b0a67bc5c3304d85dc3c567486dada876..37fcc867b05a31e286c1f444690f83e12326b9ea 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/bn_BD/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2008, RoundQube Dev. - Switzerland                      |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2008, Roundcube Dev. - Switzerland                      |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -243,13 +243,10 @@ $labels['checkallfolders'] = 'সবগুলো মেইলবক্সে ন
 $labels['folder'] = 'ফোল্ডার/মেইলবক্স';
 $labels['folders'] = 'ফোল্ডার/মেইলবক্স';
 $labels['foldername'] = 'ফোল্ডার/মেইলবক্স এর নাম';
-$labels['subscribed'] = 'গ্রহনকারি(Subscribed) ';
+$labels['subscribed'] = 'গ্রহনকারি';
 $labels['messagecount'] = 'মেইল/চিঠি';
 $labels['create'] = 'প্রস্তুত করুন';
 $labels['createfolder'] = 'নতুন ফোল্ডার / মেইলবক্স প্রস্তুত করুন';
-$labels['rename'] = 'নাম বদলান';
-$labels['renamefolder'] = 'ফোল্ডার/মেইলবক্স এর নাম বদলান';
-$labels['deletefolder'] = 'ফোল্ডার/মেইলবক্স ফেলে দিন';
 $labels['managefolders'] = 'ফোল্ডার/মেইলবক্স গুলো কে গুছান';
 $labels['specialfolders'] = 'বিশেষ ফোল্ডার/মেইলবক্স';
 $labels['sortby'] = 'সাজান';
index a55c8479a4b915cd91f1562599286786ff734ecd..6383242cee91fb6611f0b63288a6dcb764443799 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/bn_BD/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2008, RoundQube Dev. - Switzerland                      |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2008, Roundcube Dev. - Switzerland                      |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -46,9 +46,7 @@ $messages['deletecontactconfirm'] = 'আপনি কি আসলেই এই
 $messages['deletemessagesconfirm'] = 'আপনি কি আসলেই এই চিঠি(গুলো) ফেলো দিতে চান?';
 $messages['deletefolderconfirm'] = 'আপনি কি আসলেই এই ফোল্ডার/মেইলবক্স ফেলো দিতে চান?';
 $messages['purgefolderconfirm'] = 'আপনি কি আসলেই এই ফোল্ডার/মেইলবক্স এর সব চিঠি ফেলো দিতে চান?';
-$messages['foldercreating'] = 'ফোল্ডার/মেইলবক্স প্রস্তুত করা হচ্ছে';
 $messages['folderdeleting'] = 'ফোল্ডার/মেইলবক্স ফেলে দেওয়া হচ্ছে';
-$messages['folderrenaming'] = 'ফোল্ডার/মেইলবক্স এর নাম বদলানো হচ্ছে';
 $messages['foldermoving'] = 'ফোল্ডার/মেইলবক্স সরানো হচ্ছে';
 $messages['formincomplete'] = 'আপনি সবগুলো জিনিষ লেখেননি';
 $messages['noemailwarning'] = 'একটি সঠিক ই-মেইল লিখুন';
@@ -81,7 +79,6 @@ $messages['movingmessage'] = 'চিঠি সরানো হচ্ছে..';
 $messages['receiptsent'] = 'ঠিকঠাক মতো ফিরতি রশিদ পাঠানো হয়েছে';
 $messages['errorsendingreceipt'] = 'রশিদ পাঠানো গেলোনা';
 $messages['nodeletelastidentity'] = 'আপনি এই পরিচিতি ফেলতে পারবেন না কারন এইটায় বর্তমানে আপনার একমাত্র পরিচিতি। ';
-$messages['addsubfolderhint'] = 'এই ফোল্ডারটি বর্তমান ফোল্ডার এর সাব-ফোল্ডার হিসাবে তৈরি হবে';
 $messages['forbiddencharacter'] = 'ফোল্ডার এর নামের মধ্যে নিষিদ্ধ অক্ষর আছে';
 $messages['selectimportfile'] = 'একটা ফাইল বেছে নিন তোলার জন্য';
 $messages['addresswriterror'] = 'বেছে নেওয়া ঠিকানার বইটিতে লেখাযায় না';
index 726662b9d71dc174a8eaab806a377bfcde608476..51ed87a459e34e123e13dc056e7ab7498df41104 100644 (file)
@@ -5,8 +5,8 @@
  +-----------------------------------------------------------------------+
  | language/bzg/labels.inc                                                |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -15,7 +15,7 @@
  |         Mickaël Wolff <rcw@lupusmic.org>                              |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -171,9 +171,6 @@ $labels['foldername'] = 'Anv ar renkell';
 $labels['subscribed'] = 'Koumananer';
 $labels['create'] = 'Krouiñ';
 $labels['createfolder'] = 'Krouiñ ur renkell nevez';
-$labels['rename'] = 'Adanviñ';
-$labels['renamefolder'] = 'Adanviñ ar renkell';
-$labels['deletefolder'] = 'Dilemel ar renkell';
 $labels['managefolders'] = 'Aozañ ar renkelloù';
 $labels['sortby'] = 'Rummañ dre';
 $labels['sortasc'] = 'Rumm diagentad';
index 1d71c1841e071430f4c8997c3f8328afc5eb56ef..b763de765fb3dc40196759046e47c9dc465c311f 100644 (file)
@@ -5,8 +5,8 @@
  +-----------------------------------------------------------------------+
  | language/bzg/messages.inc                                              |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -15,7 +15,7 @@
  |         Mickaël Wolff <rcw@lupusmic.org>                              |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: messages.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
index f01248f21cb72b4bc0cdf2c3d90fa1e821b6be53..9e6f2a661f6efafd6ddfef7ccf088231c9c718b6 100644 (file)
@@ -5,15 +5,15 @@
  +-----------------------------------------------------------------------+
  | language/bs_BA/labels.inc                                             |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Begzudin Omerovic <Begzudin.Omerovic@gmail.com>               |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 2513 2009-05-21 12:59:19Z alec $
+ @version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -221,9 +221,6 @@ $labels['foldername']  = 'Ime fascikle';
 $labels['subscribed']  = 'Pretplaćen';
 $labels['create']  = 'Napravi';
 $labels['createfolder']  = 'Napravi novu fasciklu';
-$labels['rename'] = 'Preimenuj';
-$labels['renamefolder'] = 'Preimenuj fasciklu';
-$labels['deletefolder']  = 'Obriši fasciklu';
 $labels['managefolders']  = 'Podesi fasciklu';
 
 $labels['sortby'] = 'Sortiraj po';
index 84e683f8aea6de242d4e9e1ad0b27671e20d7e7b..d23b1420e5bf9d020a57eb4adc7c2be831e7e68d 100644 (file)
@@ -5,15 +5,15 @@
  +-----------------------------------------------------------------------+
  | language/bs_BA/messages.inc                                           |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Begzudin Omerovic <Begzudin.Omerovic@gmail.com>               |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 2237 2009-01-17 01:55:39Z till $
+ @version $Id: messages.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
index 479ae171bb092443a002ad976f5a6d01b7e08ac6..04b4492bc9e492f789a4e938deaa2d01117b5195 100644 (file)
@@ -5,16 +5,17 @@
 +-----------------------------------------------------------------------+
 | language/ca_ES/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Miguel Canteras i Cañizares <miguel@canteras.org>             |
 |         Simo <sim6@graciasensefils.net>                               |
+|         Jordi Sanfeliu <jordi@fibranet.cat>                           |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2850 2009-08-07 21:17:12Z yllar $
+@version $Id: labels.inc 4386 2011-01-04 08:35:46Z yllar $
 
 */
 
@@ -23,8 +24,8 @@ $labels['welcome'] = 'Benvingut a $product';
 $labels['username'] = 'Nom d\'usuari';
 $labels['password'] = 'Contrasenya';
 $labels['server'] = 'Servidor';
-$labels['login'] = 'Entrar';
-$labels['logout'] = 'Tancar sessió';
+$labels['login'] = 'Entra';
+$labels['logout'] = 'Tanca sessió';
 $labels['mail'] = 'E-Mail';
 $labels['settings'] = 'Configuració';
 $labels['addressbook'] = 'Contactes';
@@ -38,23 +39,24 @@ $labels['from'] = 'Remitent';
 $labels['to'] = 'Destinatari';
 $labels['cc'] = 'CC';
 $labels['bcc'] = 'BCC';
-$labels['replyto'] = 'Respondre a';
+$labels['replyto'] = 'Respon a';
+$labels['followupto'] = 'Seguiment-Per';
 $labels['date'] = 'Data';
 $labels['size'] = 'Grandària';
 $labels['priority'] = 'Prioritat';
 $labels['organization'] = 'Organització';
-$labels['reply-to'] = 'Respondre a';
+$labels['readstatus'] = 'Estat de lectura';
 $labels['mailboxlist'] = 'Carpetes';
 $labels['messagesfromto'] = 'Missatges des de $from a $to de $count';
+$labels['threadsfromto'] = 'Fils $from a $to de $count';
 $labels['messagenrof'] = 'Missatge $nr de $count';
-$labels['moveto'] = 'moure a...';
-$labels['download'] = 'descarregar';
+$labels['copy'] = 'Copia';
+$labels['move'] = 'Mou';
+$labels['moveto'] = 'mou a...';
+$labels['download'] = 'descarrega';
 $labels['filename'] = 'Nom del fitxer';
 $labels['filesize'] = 'Grandària de fitxer';
-$labels['preferhtml'] = 'Preferisc HTML';
-$labels['htmlmessage'] = 'Missatge HTML';
-$labels['prettydate'] = 'Dates curtes';
-$labels['addtoaddressbook'] = 'Afegir a contactes';
+$labels['addtoaddressbook'] = 'Afegeix a contactes';
 $labels['sun'] = 'DG';
 $labels['mon'] = 'DL';
 $labels['tue'] = 'DM';
@@ -95,22 +97,24 @@ $labels['longnov'] = 'novembre';
 $labels['longdec'] = 'desembre';
 $labels['today'] = 'Avui';
 $labels['checkmail'] = 'Recupera missatges nous';
-$labels['writenewmessage'] = 'Crear nou missatge';
-$labels['replytomessage'] = 'Respondre al missatge';
-$labels['replytoallmessage'] = 'Respondre al remitent i a tots els destinataris';
-$labels['forwardmessage'] = 'Reenviar missatge';
-$labels['deletemessage'] = 'Eliminar missatge';
-$labels['movemessagetotrash'] = 'Moure missatge a la paperera';
-$labels['printmessage'] = 'Imprimir aquest missatge';
-$labels['previousmessage'] = 'Mostrar el missatge anterior';
-$labels['previousmessages'] = 'Mostrar missatges anteriors';
-$labels['firstmessage'] = 'Mostrar el primer missatge';
-$labels['firstmessages'] = 'Mostrar els primers missatges';
-$labels['nextmessage'] = 'Mostrar el missatge següent';
-$labels['nextmessages'] = 'Mostrar missatges següents';
-$labels['lastmessage'] = 'Mostrar l\'últim missatge';
-$labels['lastmessages'] = 'Mostrar els últims missatges';
-$labels['backtolist'] = 'Tornar a la llista de missatges';
+$labels['writenewmessage'] = 'Crea nou missatge';
+$labels['replytomessage'] = 'Respon al missatge';
+$labels['replytoallmessage'] = 'Respon al remitent i a tots els destinataris';
+$labels['replyall'] = 'Respondre a tots';
+$labels['replylist'] = 'Llista de resposta';
+$labels['forwardmessage'] = 'Reenvia missatge';
+$labels['deletemessage'] = 'Suprimeix missatge';
+$labels['movemessagetotrash'] = 'Mou missatge a la paperera';
+$labels['printmessage'] = 'Imprimeix aquest missatge';
+$labels['previousmessage'] = 'Mostra el missatge anterior';
+$labels['previousmessages'] = 'Mostra missatges anteriors';
+$labels['firstmessage'] = 'Mostra el primer missatge';
+$labels['firstmessages'] = 'Mostra els primers missatges';
+$labels['nextmessage'] = 'Mostra el missatge següent';
+$labels['nextmessages'] = 'Mostra missatges següents';
+$labels['lastmessage'] = 'Mostra l\'últim missatge';
+$labels['lastmessages'] = 'Mostra els últims missatges';
+$labels['backtolist'] = 'Torna a la llista de missatges';
 $labels['viewsource'] = 'Visualitza el codi font';
 $labels['markmessages'] = 'Marca missatges';
 $labels['markread'] = 'Com a llegits';
@@ -118,41 +122,66 @@ $labels['markunread'] = 'Com a no llegits';
 $labels['markflagged'] = 'Com marcat';
 $labels['markunflagged'] = 'Com no marcat';
 $labels['messageactions'] = 'Més accions...';
-$labels['select'] = 'Seleccionar';
+$labels['select'] = 'Selecciona';
 $labels['all'] = 'Tots';
 $labels['none'] = 'Cap';
+$labels['currpage'] = 'Pàgina actual';
 $labels['unread'] = 'No llegits';
 $labels['flagged'] = 'Marcat';
 $labels['unanswered'] = 'No respost';
 $labels['deleted'] = 'Esborrat';
-$labels['invert'] = 'Invertir';
+$labels['invert'] = 'Inverteix';
 $labels['filter'] = 'Filtre';
+$labels['list'] = 'Llista';
+$labels['threads'] = 'Fils';
+$labels['expand-all'] = 'Expandeix tots';
+$labels['expand-unread'] = 'Expandeix No llegits';
+$labels['collapse-all'] = 'Col·lapsa tots';
+$labels['threaded'] = 'Encadenat';
+$labels['autoexpand_threads'] = 'Expandeix els missatges encadenats';
+$labels['do_expand'] = 'tots els fils';
+$labels['expand_only_unread'] = 'només amb missatges no llegits';
+$labels['fromto'] = 'Remitent/Destinatari';
+$labels['flag'] = 'Marca';
+$labels['attachment'] = 'Adjunt';
+$labels['nonesort'] = 'Cap';
+$labels['sentdate'] = 'Data d\'enviament';
+$labels['arrival'] = 'Data d\'arribada';
+$labels['asc'] = 'ascendent';
+$labels['desc'] = 'descendent';
+$labels['listcolumns'] = 'Llista les columnes';
+$labels['listsorting'] = 'Columna d\'ordenació';
+$labels['listorder'] = 'Ordre d\'ordenació';
+$labels['listmode'] = 'Mode de vista de llista';
+$labels['folderactions'] = 'Accions de carpeta';
 $labels['compact'] = 'Compacta';
 $labels['empty'] = 'Buida';
-$labels['purge'] = 'Purga';
 $labels['quota'] = 'Utilització de disc';
 $labels['unknown'] = 'desconegut';
 $labels['unlimited'] = 'il·limitat';
 $labels['quicksearch'] = 'Cerca ràpida';
 $labels['resetsearch'] = 'Neteja cerca';
-$labels['searchmod'] = 'Cercar modificadors';
+$labels['searchmod'] = 'Cerca modificadors';
 $labels['msgtext'] = 'Missatge sencer';
-$labels['openinextwin'] = 'Obrir a una nova finestra';
-$labels['emlsave'] = 'Descarregar (.eml)';
-$labels['compose'] = 'Escriure un missatge';
-$labels['editasnew'] = 'Editar com a nou';
+$labels['openinextwin'] = 'Obre a una nova finestra';
+$labels['emlsave'] = 'Descarrega (.eml)';
+$labels['compose'] = 'Escriu un missatge';
+$labels['editasnew'] = 'Edita com a nou';
 $labels['savemessage'] = 'Desa aquest esborrany';
-$labels['sendmessage'] = 'Enviar ara el missatge';
-$labels['addattachment'] = 'Afegir un fitxer';
+$labels['sendmessage'] = 'Envia ara el missatge';
+$labels['addattachment'] = 'Afegeix un fitxer';
 $labels['charset'] = 'Codificació de caràcters';
 $labels['editortype'] = 'Tipus d\'editor';
 $labels['returnreceipt'] = 'Confirmació de recepció';
+$labels['dsn'] = 'Notificació d\'estat de lliurament';
+$labels['editidents'] = 'Editar identitats';
 $labels['checkspelling'] = 'Comprova l\'ortografia';
 $labels['resumeediting'] = 'Continua l\'edició';
-$labels['revertto'] = 'Tornar a';
+$labels['revertto'] = 'Torna a';
 $labels['attachments'] = 'Adjunts';
-$labels['upload'] = 'Afegir';
-$labels['close'] = 'Cancel·lar';
+$labels['upload'] = 'Afegeix';
+$labels['close'] = 'Cancel·la';
+$labels['messageoptions'] = 'Opcions de missatge...';
 $labels['low'] = 'Baixa';
 $labels['lowest'] = 'Molt baixa';
 $labels['normal'] = 'Normal';
@@ -160,115 +189,153 @@ $labels['high'] = 'Alta';
 $labels['highest'] = 'Molt alta';
 $labels['nosubject'] = '(sense assumpte)';
 $labels['showimages'] = 'Mostra imatges';
-$labels['alwaysshow'] = 'Sempre mostrar imatges de $sender';
+$labels['alwaysshow'] = 'Sempre mostra imatges de $sender';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Text pla';
-$labels['savesentmessagein'] = 'Desar el missatge enviat a';
+$labels['savesentmessagein'] = 'Desa el missatge enviat a';
 $labels['dontsave'] = 'no deseu';
 $labels['maxuploadsize'] = 'El tamany màxim de fitxer és $size';
-$labels['addcc'] = 'Afegir Cc';
-$labels['addbcc'] = 'Afegir Bcc';
-$labels['addreplyto'] = 'Afegir Reply-To';
-$labels['mdnrequest'] = 'El remitent d\'aquest missatge ha demanat ser notificat quan llegeixis aquest missatge. Vols notificar al remitent?';
+$labels['addcc'] = 'Afegeix Cc';
+$labels['addbcc'] = 'Afegeix Bcc';
+$labels['addreplyto'] = 'Afegeix Reply-To';
+$labels['addfollowupto'] = 'Afegir Seguiment-Per';
+$labels['mdnrequest'] = 'El remitent d\'aquest missatge ha demanat ser notificat quan llegiu aquest missatge. Voleu notificar al remitent?';
 $labels['receiptread'] = 'Confirmació de recepció';
-$labels['yourmessage'] = 'Aquesta és una confirmació de recepció per al teu missatge';
-$labels['receiptnote'] = 'Nota: Aquesta confirmació solament indica que el missatge ha estat mostrat a l\'ordinador del destinatari. No hi ha garantia que el destinatari hagi llegit o entès el contingut del missatge.';
+$labels['yourmessage'] = 'Aquesta és una confirmació de recepció per al vostre missatge';
+$labels['receiptnote'] = 'Nota: Aquesta confirmació només indica que el missatge ha estat mostrat a l\'ordinador del destinatari. No hi ha garantia que el destinatari hagi llegit o entès el contingut del missatge.';
 $labels['name'] = 'Nom a mostrar';
 $labels['firstname'] = 'Nom';
 $labels['surname'] = 'Cognom';
 $labels['email'] = 'E-Mail';
-$labels['addcontact'] = 'Afegir nou contacte';
-$labels['editcontact'] = 'Editar contacte';
-$labels['edit'] = 'Editar';
-$labels['cancel'] = 'Cancel·lar';
-$labels['save'] = 'Desar';
-$labels['delete'] = 'Suprimir';
-$labels['newcontact'] = 'Crear nou contacte';
-$labels['deletecontact'] = 'Suprimir contactes seleccionats';
-$labels['composeto'] = 'Redactar correu per a';
+$labels['addcontact'] = 'Afegeix nou contacte';
+$labels['editcontact'] = 'Edita contacte';
+$labels['contacts'] = 'Contactes';
+$labels['contactproperties'] = 'Propietats del contacte';
+$labels['edit'] = 'Edita';
+$labels['cancel'] = 'Cancel·la';
+$labels['save'] = 'Desa';
+$labels['delete'] = 'Suprimeix';
+$labels['rename'] = 'Renombrar';
+$labels['newcontact'] = 'Crea nou contacte';
+$labels['deletecontact'] = 'Suprimeix contactes seleccionats';
+$labels['composeto'] = 'Redacta correu per a';
 $labels['contactsfromto'] = 'Contactes $from a $to de $count';
 $labels['print'] = 'Imprimeix';
-$labels['export'] = 'Exportar';
-$labels['exportvcards'] = 'Exportar contactes en format vCard';
-$labels['previouspage'] = 'Mostrar anteriors';
-$labels['firstpage'] = 'Mostrar primers';
-$labels['nextpage'] = 'Mostrar següents';
-$labels['lastpage'] = 'Mostrar últims';
+$labels['export'] = 'Exporta';
+$labels['exportvcards'] = 'Exporta contactes en format vCard';
+$labels['newcontactgroup'] = 'Crea un nou grup de contactes';
+$labels['groupactions'] = 'Accions per grups de contacte...';
+$labels['previouspage'] = 'Mostra anteriors';
+$labels['firstpage'] = 'Mostra primers';
+$labels['nextpage'] = 'Mostra següents';
+$labels['lastpage'] = 'Mostra darrers';
+$labels['group'] = 'Grup';
 $labels['groups'] = 'Grups';
 $labels['personaladrbook'] = 'Llibreta d\'adreces';
-$labels['import'] = 'Importar';
-$labels['importcontacts'] = 'Importar contactes';
-$labels['importfromfile'] = 'Importar des d\'un fitxer:';
-$labels['importreplace'] = 'Reemplaçar la llibreta d\'adreçes sencera';
+$labels['import'] = 'Importa';
+$labels['importcontacts'] = 'Importa contactes';
+$labels['importfromfile'] = 'Importa des d\'un fitxer:';
+$labels['importreplace'] = 'Reemplaça la llibreta d\'adreçes sencera';
 $labels['importtext'] = 'Podeu importar contactes des d\'una llibreta d\'adreces existent.<br/>Actualment suportem l\'importació d\'adreces amb el format <a href="http://en.wikipedia.org/wiki/VCard">vCard</a>.';
 $labels['done'] = 'Fet';
 $labels['settingsfor'] = 'Configuració per a';
 $labels['preferences'] = 'Preferències';
 $labels['userpreferences'] = 'Preferències d\'usuari';
-$labels['editpreferences'] = 'Editar preferències d\'usuari';
+$labels['editpreferences'] = 'Edita preferències d\'usuari';
 $labels['identities'] = 'Identitats';
-$labels['manageidentities'] = 'Gestionar identitats per a aquest compte';
+$labels['manageidentities'] = 'Gestiona identitats per a aquest compte';
 $labels['newidentity'] = 'Nova identitat';
 $labels['newitem'] = 'Nou';
-$labels['edititem'] = 'Editar';
-$labels['setdefault'] = 'Seleccionar opció per defecte';
+$labels['edititem'] = 'Edita';
+$labels['preferhtml'] = 'Mostra HTML';
+$labels['defaultcharset'] = 'Joc de caracters per defecte';
+$labels['htmlmessage'] = 'Missatge HTML';
+$labels['prettydate'] = 'Dates curtes';
+$labels['setdefault'] = 'Selecciona opció per defecte';
 $labels['autodetect'] = 'Auto';
 $labels['language'] = 'Idioma';
-$labels['timezone'] = 'Zona horària';
+$labels['timezone'] = 'Fus horari';
 $labels['pagesize'] = 'Files per pàgina';
 $labels['signature'] = 'Signatura';
 $labels['dstactive'] = 'Horari d\'estiu';
-$labels['htmleditor'] = 'Escriure missatges HTML';
+$labels['htmleditor'] = 'Escriu missatges en HTML';
+$labels['htmlonreply'] = 'només en resposta a missatge HTML';
 $labels['htmlsignature'] = 'Signatura HTML';
-$labels['previewpane'] = 'Mostrar el panell de previsualització';
+$labels['previewpane'] = 'Mostra el panell de previsualització';
 $labels['skin'] = 'Aparença d\'interfície';
-$labels['logoutclear'] = 'Esborrar la paperera al tancar sessió';
-$labels['logoutcompact'] = 'Compactar la safata d\'entrada al tancar sessió';
+$labels['logoutclear'] = 'Buida la paperera al tancar sessió';
+$labels['logoutcompact'] = 'Compacta la safata d\'entrada al tancar sessió';
 $labels['uisettings'] = 'Interfície d\'usuari';
 $labels['serversettings'] = 'Configuració del servidor';
 $labels['mailboxview'] = 'Vista de la bústia';
 $labels['mdnrequests'] = 'Notificacions de recepció';
 $labels['askuser'] = 'Pregunta-ho a l\'usuari';
 $labels['autosend'] = 'Envia-les automàticament';
+$labels['autosendknown'] = 'Envia-les automàticament només als meus contactes';
+$labels['autosendknownignore'] = 'enviar recepció als meus contactes, sinó ignora';
 $labels['ignore'] = 'Ignora-les';
-$labels['readwhendeleted'] = 'Marca el missatge com a llegit quan s\'esborri';
+$labels['readwhendeleted'] = 'Marca el missatge com a llegit quan se suprimeixi';
 $labels['flagfordeletion'] = 'Afegeix marca d\'esborrat en comptes d\'esborrar-lo';
-$labels['skipdeleted'] = 'No mostrar els missatges esborrats';
-$labels['showremoteimages'] = 'Mostrar imatges remotes sota el missatge';
+$labels['skipdeleted'] = 'No mostris els missatges suprimits';
+$labels['deletealways'] = 'Si falla quan es mou un missatge a la Paperera, aleshores esborra\'l';
+$labels['showremoteimages'] = 'Mostra imatges remotes sota el missatge';
 $labels['fromknownsenders'] = 'de remitent conegut';
 $labels['always'] = 'sempre';
 $labels['showinlineimages'] = 'Mostra les imatges adjuntes sota el missatge';
-$labels['autosavedraft'] = 'Desar esborrany automàticament';
+$labels['autosavedraft'] = 'Desa esborrany automàticament';
 $labels['everynminutes'] = 'cada $n minut(s)';
-$labels['keepalive'] = 'Comprovar nous missatges a';
+$labels['keepalive'] = 'Comprova nous missatges a';
 $labels['never'] = 'mai';
+$labels['immediately'] = 'immediatament';
 $labels['messagesdisplaying'] = 'Vista de missatges';
 $labels['messagescomposition'] = 'Composició de missatges';
 $labels['mimeparamfolding'] = 'Noms dels adjunts';
-$labels['2231folding'] = 'Complet RFC 2231 (Thunderbird)';
+$labels['2231folding'] = 'Compleix RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
-$labels['2047folding'] = 'Complet RFC 2047 (un altre)';
+$labels['2047folding'] = 'Compleix RFC 2047 (un altre)';
+$labels['force7bit'] = 'Fes servir la codificació MIME per a caracters de 8-bits';
 $labels['advancedoptions'] = 'Opcions avançades';
-$labels['focusonnewmessage'] = 'Enviar el focus al navegador quan hi hagi un nou missatge';
-$labels['checkallfolders'] = 'Comprovar totes les carpetes per missatges nous';
-$labels['displaynext'] = 'Mostrar el següent missatge després de esborrar-ne o moure\'n un';
+$labels['focusonnewmessage'] = 'Envia el focus al navegador quan hi hagi un nou missatge';
+$labels['checkallfolders'] = 'Comprova totes les carpetes per missatges nous';
+$labels['displaynext'] = 'Mostra el següent missatge després de esborrar-ne o moure\'n un';
 $labels['mainoptions'] = 'Opcions principals';
 $labels['section'] = 'Secció';
 $labels['maintenance'] = 'Manteniment';
 $labels['newmessage'] = 'Missatge nou';
 $labels['listoptions'] = 'Opcions de llista';
+$labels['signatureoptions'] = 'Opcions de signatura';
+$labels['whenreplying'] = 'Quan es respon';
+$labels['replytopposting'] = 'comença un nou missatge per sobre de l\'original';
+$labels['replybottomposting'] = 'comença un nou missatge per sota de l\'original';
+$labels['replyremovesignature'] = 'Quan es contesti, elimina la signatura original del missatge';
+$labels['autoaddsignature'] = 'Afegeix la signatura automàticament';
+$labels['newmessageonly'] = 'només missatge nou';
+$labels['replyandforwardonly'] = 'només respostes i reenviaments';
+$labels['replysignaturepos'] = 'Quan es contesti o reenviï, posa la signatura';
+$labels['belowquote'] = 'sota les cometes';
+$labels['abovequote'] = 'sobre les cometes';
+$labels['insertsignature'] = 'Inserta signatura';
+$labels['previewpanemarkread'] = 'Marca missatges previsualitzats com a llegits';
+$labels['afternseconds'] = 'després de $n segons';
+$labels['reqmdn'] = 'Demana sempre la confirmació de recepció';
+$labels['reqdsn'] = 'Sempre demanar una notificació d\'estat de lliurament';
+$labels['replysamefolder'] = 'Col·locar respostes a la carpeta del missatge que es respon';
 $labels['folder'] = 'Carpeta';
 $labels['folders'] = 'Carpetes';
 $labels['foldername'] = 'Nom de carpeta';
 $labels['subscribed'] = 'Subscriure\'s';
 $labels['messagecount'] = 'Missatges';
-$labels['create'] = 'Crear';
-$labels['createfolder'] = 'Crear nova carpeta';
-$labels['rename'] = 'Canvia el nom';
-$labels['renamefolder'] = 'Canvia el nom de la carpeta';
-$labels['deletefolder'] = 'Suprimir carpeta';
-$labels['managefolders'] = 'Gestionar carpetes';
+$labels['create'] = 'Crea';
+$labels['createfolder'] = 'Crea nova carpeta';
+$labels['managefolders'] = 'Gestiona carpetes';
 $labels['specialfolders'] = 'Carpetes Especials';
+$labels['properties'] = 'Propietats';
+$labels['folderproperties'] = 'Propietats de la carpeta';
+$labels['parentfolder'] = 'Carpeta pare';
+$labels['location'] = 'Localització';
+$labels['info'] = 'Informació';
+$labels['getfoldersize'] = 'Clica per a veure la mida de la carpeta';
+$labels['changesubscription'] = 'Clica per a canviar la subscripció';
 $labels['sortby'] = 'Ordena per';
 $labels['sortasc'] = 'Ordena ascendentment';
 $labels['sortdesc'] = 'Ordena descendentment';
@@ -276,5 +343,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Anglés';
+$labels['westerneuropean'] = 'Europeu Occidental';
+$labels['easterneuropean'] = 'Europeu Oriental';
+$labels['southeasterneuropean'] = 'Europeu Sud-Oriental';
+$labels['baltic'] = 'Bàltic';
+$labels['cyrillic'] = 'Cirilic';
+$labels['arabic'] = 'Àrab';
+$labels['greek'] = 'Grec';
+$labels['hebrew'] = 'Hebreu';
+$labels['turkish'] = 'Turc';
+$labels['nordic'] = 'Nòrdic';
+$labels['thai'] = 'Tailandés';
+$labels['celtic'] = 'Celta';
+$labels['vietnamese'] = 'Vietnamita';
+$labels['japanese'] = 'Japonés';
+$labels['korean'] = 'Koreà';
+$labels['chinese'] = 'Xinés';
 
 ?>
index 01d23d974828a068429c54ecb62c3cf8a578d300..6b6ef38a7799885d00bfdc1b09efa185a8f4a1e1 100644 (file)
@@ -5,30 +5,35 @@
 +-----------------------------------------------------------------------+
 | language/ca_ES/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Miguel Canteras i Cañizares <miguel@canteras.org>             |
 |         Simo <sim6@graciasensefils.net>                               |
+|         Jordi Sanfeliu <jordi@fibranet.cat>                           |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2850 2009-08-07 21:17:12Z yllar $
+@version $Id: messages.inc 4386 2011-01-04 08:35:46Z yllar $
 
 */
 
 $messages = array();
 $messages['loginfailed'] = 'Contrasenya incorrecta';
-$messages['cookiesdisabled'] = 'El seu navegador no accepta cookies';
-$messages['sessionerror'] = 'La seva sessió no existeix o ha expirat';
+$messages['cookiesdisabled'] = 'El vostre navegador no accepta cookies';
+$messages['sessionerror'] = 'La vostra sessió no existeix o ha expirat';
 $messages['imaperror'] = 'Error de conexió amb el servidor IMAP';
 $messages['servererror'] = 'Error del Servidor!';
-$messages['invalidrequest'] = 'Petició invàlida! No s\'ha desat les dades.';
+$messages['servererrormsg'] = 'Error del Servidor: $msg';
+$messages['errorreadonly'] = 'Impossible de realitzar l\'operació. La carpeta és de només lectura';
+$messages['errornoperm'] = 'Impossible de realitzar l\'operació. Permís denegat';
+$messages['invalidrequest'] = 'Petició no vàlida! No s\'ha desat les dades.';
 $messages['nomessagesfound'] = 'No s\'han trobat missatges en aquesta bústia';
-$messages['loggedout'] = 'Ha tancat la sessió. Fins aviat!';
-$messages['mailboxempty'] = 'La bústia està buida';
+$messages['loggedout'] = 'Heu tancat la sessió. Fins aviat!';
+$messages['mailboxempty'] = 'La bústia és buida';
 $messages['loading'] = 'Carregant...';
+$messages['uploading'] = 'Pujant fitxer...';
 $messages['loadingdata'] = 'Carregant dades...';
 $messages['checkingmail'] = 'Cercant nous missatges...';
 $messages['sendingmessage'] = 'Enviant missatge...';
@@ -38,72 +43,101 @@ $messages['messagesaved'] = 'Missatge desat a Esborranys';
 $messages['successfullysaved'] = 'Desat correctament';
 $messages['addedsuccessfully'] = 'Contacte afegit correctament a la llibreta d\'adreces';
 $messages['contactexists'] = 'Ja hi ha un contacte amb aquesta adreça de correu';
-$messages['blockedimages'] = 'Per a protegir la seva privacitat, les imatges remotes han sigut bloquejades en aquest missatge';
+$messages['blockedimages'] = 'Per a protegir la vostra privacitat, les imatges remotes han estat bloquejades en aquest missatge';
 $messages['encryptedmessage'] = 'Aquest és un missatge xifrat i no pot ser mostrat. Ho sento!';
 $messages['nocontactsfound'] = 'No hi ha contactes';
 $messages['contactnotfound'] = 'No s\'ha trobat el contacte sol·licitat';
 $messages['sendingfailed'] = 'Error enviant missatge';
 $messages['senttooquickly'] = 'Si us plau, espereu $sec segon(s) abans d\'enviar aquest missatge';
-$messages['errorsavingsent'] = 'Va ocòrrer un error mentre es desava el missatge enviat';
-$messages['errorsaving'] = 'Va ocòrrer un error mentre es desava';
+$messages['errorsavingsent'] = 'Hi ha hagut un error mentre es desava el missatge enviat';
+$messages['errorsaving'] = 'Hi ha hagut un error mentre es desava';
 $messages['errormoving'] = 'No s\'ha pogut moure el missatge';
+$messages['errorcopying'] = 'No s\'ha pogut copiar el(s) missatge(s)';
 $messages['errordeleting'] = 'No s\'ha pogut eliminar el missatge';
 $messages['errormarking'] = 'No s\'ha pogut marcar el missatge.';
-$messages['deletecontactconfirm'] = 'Realment vol suprimir el(s) contacte(s) selecionat(s)?';
-$messages['deletemessagesconfirm'] = 'Realment vol suprimir el(s) missatge(s) selecionat(s)?';
-$messages['deletefolderconfirm'] = 'Realment vol suprimir aquesta carpeta?';
-$messages['purgefolderconfirm'] = 'Realment vol suprimir tots els missatges d\'aquesta carpeta?';
-$messages['foldercreating'] = 'Creant la carpeta...';
-$messages['folderdeleting'] = 'Eliminant la carpeta...';
-$messages['folderrenaming'] = 'Reanomenant la carpeta...';
+$messages['deletecontactconfirm'] = 'Esteu segurs de voler suprimir el(s) contacte(s) selecionat(s)?';
+$messages['deletemessagesconfirm'] = 'Esteu segurs de voler suprimir el(s) missatge(s) selecionat(s)?';
+$messages['deletefolderconfirm'] = 'Esteu segurs de voler suprimir aquesta carpeta?';
+$messages['purgefolderconfirm'] = 'Esteu segurs de voler suprimir tots els missatges d\'aquesta carpeta?';
+$messages['folderdeleting'] = 'Suprimint la carpeta...';
 $messages['foldermoving'] = 'Movent la carpeta...';
+$messages['foldersubscribing'] = 'Subscribint la carpeta...';
+$messages['folderunsubscribing'] = 'Desubscribint la carpeta...';
 $messages['formincomplete'] = 'El formulari no ha sigut emplenat totalment';
-$messages['noemailwarning'] = 'Introdueixi una adreça d\'e-mail vàlida';
-$messages['nonamewarning'] = 'Introdueixi un nom';
-$messages['nopagesizewarning'] = 'Introdueixi un tamany de pàgina';
+$messages['noemailwarning'] = 'Introduïu una adreça d\'e-mail vàlida';
+$messages['nonamewarning'] = 'Introduïu un nom';
+$messages['nopagesizewarning'] = 'Introduïu una mida de pàgina';
 $messages['nosenderwarning'] = 'Si us plau, entreu l\'adreça d\'e-mail del remitent';
-$messages['norecipientwarning'] = 'Introdueixi al menys un destinatari';
-$messages['nosubjectwarning'] = 'El camp \"Assumpte\" està buit. Vol introduir-ne un ara?';
-$messages['nobodywarning'] = 'Vol enviar aquest missatge sense text?';
-$messages['notsentwarning'] = 'El missatge no s\'ha enviat. Vol descartar el seu missatge?';
-$messages['noldapserver'] = 'Seleccioni un servidor LDAP per a cercar';
+$messages['norecipientwarning'] = 'Introduïu com a mínim un destinatari';
+$messages['nosubjectwarning'] = 'El camp \"Assumpte\" és buit. Voleu introduir-ne un ara?';
+$messages['nobodywarning'] = 'Voleu enviar aquest missatge sense text?';
+$messages['notsentwarning'] = 'El missatge no s\'ha enviat. Voleu descartar el vostre missatge?';
+$messages['noldapserver'] = 'Seleccioneu un servidor LDAP per a cercar';
 $messages['nocontactsreturned'] = 'No s\'han trobat contactes';
-$messages['nosearchname'] = 'Introdueixi un nom de contacte o una adreça e-mail';
+$messages['nosearchname'] = 'Introduïu un nom de contacte o una adreça e-mail';
+$messages['notuploadedwarning'] = 'Encara no s\'han pujat tots els adjunts. Si us plau, espereu o cancel·leu la pujada.';
 $messages['searchsuccessful'] = '$nr missatges trobats';
 $messages['searchnomatch'] = 'No s\'ha trobat cap coincidència';
 $messages['searching'] = 'Cercant...';
 $messages['checking'] = 'Comprovant...';
 $messages['nospellerrors'] = 'No s\'han trobat errors d\'ortografia';
 $messages['folderdeleted'] = 'Carpeta eliminada correctament';
+$messages['foldersubscribed'] = 'Carpeta subscrita correctament';
+$messages['folderunsubscribed'] = 'Carpeta desubscrita correctament';
+$messages['folderpurged'] = 'La carpeta ha estat buidada satisfactòriament';
+$messages['folderexpunged'] = 'La carpeta ha estat compactada satisfactòriament';
 $messages['deletedsuccessfully'] = 'Eliminat correctament';
 $messages['converting'] = 'Traient format del missatge...';
 $messages['messageopenerror'] = 'No s\'ha pogut carregar el missatge del servidor';
-$messages['fileuploaderror'] = 'Pujada de fitxer fallida';
+$messages['fileuploaderror'] = 'La pujada del fitxer ha fallat';
 $messages['filesizeerror'] = 'El fitxer pujat excedeix la grandària màxima de $size';
 $messages['copysuccess'] = 'S\'han copiat $nr adreces correctament';
 $messages['copyerror'] = 'No s\'ha pogut copiar cap adreça';
 $messages['sourceisreadonly'] = 'Aquesta adreça és només de lectura';
-$messages['errorsavingcontact'] = 'No s\'ha pogut guardar l\'adreça de contacte';
+$messages['errorsavingcontact'] = 'No s\'ha pogut desar l\'adreça de contacte';
 $messages['movingmessage'] = 'Movent el missatge...';
+$messages['copyingmessage'] = 'Copiant missatge...';
+$messages['deletingmessage'] = 'Esborrant missatge(s)...';
+$messages['markingmessage'] = 'Marcant missatge(s)...';
 $messages['receiptsent'] = 'Confirmació de lectura enviada satisfactòriament';
 $messages['errorsendingreceipt'] = 'No es pot enviar la confirmació';
-$messages['nodeletelastidentity'] = 'No pots eliminar aquesta identitat, és l\'última.';
-$messages['addsubfolderhint'] = 'Aquesta carpeta serà creada com a subcarpeta de la seleccionada actualment';
+$messages['nodeletelastidentity'] = 'No podeu suprimir aquesta identitat, és l\'última.';
 $messages['forbiddencharacter'] = 'El nom de carpeta conté un caràcter prohibit';
 $messages['selectimportfile'] = 'Si us plau, seleccioneu un fitxer per pujar';
 $messages['addresswriterror'] = 'La llibreta d\'adreces seleccionada no és modificable';
-$messages['importwait'] = 'Important, espereu si us plau...';
-$messages['importerror'] = 'Importació fallida! El fitxer pujat no és un fitxer vCard vàlid';
+$messages['contactaddedtogroup'] = 'S\'han afegit correctament els contactes a aquest grup';
+$messages['contactremovedfromgroup'] = 'S\'han suprimit correctament els contactes d\'aquest grup';
+$messages['importwait'] = 'S\'està important, espereu si us plau...';
+$messages['importerror'] = 'La importació ha fallt! El fitxer pujat no és un fitxer vCard vàlid';
 $messages['importconfirm'] = '<b>S\'han importat $inserted contactes satisfactòriament, s\'han descartat $skipped entrades ja existents</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Operació no permesa!';
 $messages['nofromaddress'] = 'Falta l\'adreça d\'e-mail a la identitat seleccionada';
 $messages['editorwarning'] = 'Si canvieu a l\'editor de text pla perdreu tot el format del text. Voleu continuar?';
-$messages['httpreceivedencrypterror'] = 'Ha ocorregut un error fatal de configuració. Contacta amb el teu administrador inmediatament. <b>El teu missatge no pot ser enviat.</b>';
+$messages['httpreceivedencrypterror'] = 'Hi ha hagut un error fatal de configuració. Contacteu amb el vostre administrador immediatament. <b>El vostre missatge no pot ser enviat.</b>';
 $messages['smtpconnerror'] = 'Error SMTP ($code): La connexió al servidor ha fallat.';
-$messages['smtpautherror'] = 'Error SMTP ($code): Identificació fallida.';
-$messages['smtpfromerror'] = 'Error SMTP ($code): No s\'ha pogut posar "$from" com a remitent';
-$messages['smtptoerror'] = 'Error SMTP ($code): No s\'ha pogut posar "$to" com a destinatari';
+$messages['smtpautherror'] = 'Error SMTP ($code): La identificació ha fallat.';
+$messages['smtpfromerror'] = 'Error SMTP ($code): No s\'ha pogut posar "$from" com a remitent ($msg)';
+$messages['smtptoerror'] = 'Error SMTP ($code): No s\'ha pogut posar "$to" com a destinatari ($msg)';
 $messages['smtprecipientserror'] = 'Error SMTP: No s\'ha pogut analitzar la lista de destinataris';
+$messages['smtpdsnerror'] = 'Error SMTP: No es suporten les notificacions d\'estat de lliuraments';
 $messages['smtperror'] = 'Error SMTP: $msg';
+$messages['emailformaterror'] = 'Adreça d\'e-mail incorrecta: $email';
+$messages['toomanyrecipients'] = 'Massa destinataris. Reduïu el nombre de destinataris a $max.';
+$messages['maxgroupmembersreached'] = 'El nombre de membres del grup excedeix el màxim de $max.';
+$messages['internalerror'] = 'Hi ha hagut un error intern. Si us plau torneu-ho a provar';
+$messages['contactdelerror'] = 'No s\'ha pogut esborrar el(s) contacte(s)';
+$messages['contactdeleted'] = 'Contacte(s) esborrat(s) satisfactòriament';
+$messages['groupdeleted'] = 'Grup esborrat satisfactòriament';
+$messages['grouprenamed'] = 'Grup renombrat satisfactòriament';
+$messages['groupcreated'] = 'Grup creat satisfactòriament';
+$messages['messagedeleted'] = 'Missatge(s) esborrat(s) satisfactòriament';
+$messages['messagemoved'] = 'Missatge(s) mogut(s) satisfactòriament';
+$messages['messagecopied'] = 'Missatge(s) copiat(s) satisfactòriament';
+$messages['messagemarked'] = 'Missatge(s) marcat(s) satisfactòriament';
+$messages['autocompletechars'] = 'Introdueix al menys $min caracters per a l\'autocompleció';
+$messages['namecannotbeempty'] = 'El nom no pot estar buit';
+$messages['nametoolong'] = 'El nom és massa llarg';
+$messages['folderupdated'] = 'La carpeta ha estat actualitzada satisfactòriament';
+$messages['foldercreated'] = 'La carpeta ha estat creada satisfactòriament';
 
 ?>
index a814f3a7a1b1f994356ecb49f69f88da0bd965fb..2e66fb82a0931b3897987b50351999349b7b9b76 100644 (file)
@@ -5,18 +5,19 @@
 +-----------------------------------------------------------------------+
 | language/cs_CZ/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Martin Mrajca <martin@moonlake.cz>                            |
 |        joe <joe@humlak.cz>                                            |
 |        Jiri Kaderavek <jiri.kaderavek@webstep.net>                    |
-|        Milan Kozak <hodza@hodza.net>                                 |
+|        Milan Kozak <hodza@hodza.net>                                  |
+|        Ales Pospichal <ales@pospichalales.info>                       |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2994 2009-09-27 14:16:33Z yllar $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -48,14 +49,14 @@ $labels['organization'] = 'Organizace';
 $labels['reply-to'] = 'Odpověď na';
 $labels['mailboxlist'] = 'Složky';
 $labels['messagesfromto'] = 'Zprávy $from až $to z celkem $count';
+$labels['threadsfromto'] = 'Konverzace $from až $to z celkem $count';
 $labels['messagenrof'] = 'Zpráva $nr z $count';
+$labels['copy'] = 'Kopírovat';
+$labels['move'] = 'Přesunout';
 $labels['moveto'] = 'přesunout do...';
 $labels['download'] = 'stáhnout';
 $labels['filename'] = 'Jméno přílohy';
 $labels['filesize'] = 'Velikost přílohy';
-$labels['preferhtml'] = 'Upřednostňovat HTML zobrazení';
-$labels['htmlmessage'] = 'HTML zpráva';
-$labels['prettydate'] = 'Hezčí datum';
 $labels['addtoaddressbook'] = 'Přidat do adresáře';
 $labels['sun'] = 'Ne';
 $labels['mon'] = 'Po';
@@ -101,7 +102,7 @@ $labels['writenewmessage'] = 'Vytvořit novou zprávu';
 $labels['replytomessage'] = 'Odpovědět odesílateli';
 $labels['replytoallmessage'] = 'Odpovědět všem';
 $labels['forwardmessage'] = 'Předat zprávu';
-$labels['deletemessage'] = 'Přesunout do koše';
+$labels['deletemessage'] = 'Odstranit zprávu';
 $labels['movemessagetotrash'] = 'Přesunout zprávu do koše';
 $labels['printmessage'] = 'Vytisknout zprávu';
 $labels['previousmessage'] = 'Zobrazit předchozí zprávu';
@@ -123,12 +124,35 @@ $labels['messageactions'] = 'Další akce ...';
 $labels['select'] = 'Vybrat';
 $labels['all'] = 'Vše';
 $labels['none'] = 'Nic';
+$labels['currpage'] = 'Aktuální stránka';
 $labels['unread'] = 'Nepřečtené';
 $labels['flagged'] = 'Označené';
 $labels['unanswered'] = 'Neoznačené';
 $labels['deleted'] = 'Smazané';
 $labels['invert'] = 'Převrátit';
 $labels['filter'] = 'Filtr';
+$labels['list'] = 'Seznam';
+$labels['threads'] = 'Konverzace';
+$labels['expand-all'] = 'Rozbalit všechny';
+$labels['expand-unread'] = 'Rozbalit nepřečtené';
+$labels['collapse-all'] = 'Sbalit všechny';
+$labels['threaded'] = 'Spojovat do konverzací';
+$labels['autoexpand_threads'] = 'Rozbalit konverzace';
+$labels['do_expand'] = 'všechny konverzace';
+$labels['expand_only_unread'] = 'pouze s nepřečtenými zprávami';
+$labels['fromto'] = 'Odesílatel/Příjemce';
+$labels['flag'] = 'Vlajka';
+$labels['attachment'] = 'Příloha';
+$labels['nonesort'] = 'Nic';
+$labels['sentdate'] = 'Datum odeslání';
+$labels['arrival'] = 'Datum přijetí';
+$labels['asc'] = 'vzestupně';
+$labels['desc'] = 'sestupně';
+$labels['listcolumns'] = 'Seznam sloupců';
+$labels['listsorting'] = 'Třídění sloupců';
+$labels['listorder'] = 'Uspořádání';
+$labels['listmode'] = 'Režim zobrazení seznamu';
+$labels['folderactions'] = 'Akce se složkou...';
 $labels['compact'] = 'Zmenšit';
 $labels['empty'] = 'Vymazat';
 $labels['purge'] = 'Vyprázdnit';
@@ -149,12 +173,14 @@ $labels['addattachment'] = 'Přidat přílohu';
 $labels['charset'] = 'Znaková sada';
 $labels['editortype'] = 'Typ editoru zpráv';
 $labels['returnreceipt'] = 'Doručenka';
+$labels['editidents'] = 'Editovat identity';
 $labels['checkspelling'] = 'Zkontrolovat pravopis';
 $labels['resumeediting'] = 'Pokračovat v úpravách';
 $labels['revertto'] = 'Přejít na';
 $labels['attachments'] = 'Přílohy';
 $labels['upload'] = 'Nahrát';
 $labels['close'] = 'Zavřít';
+$labels['messageoptions'] = 'Nastavení zprávy...';
 $labels['low'] = 'Nízká';
 $labels['lowest'] = 'Nejnižší';
 $labels['normal'] = 'Normální';
@@ -181,6 +207,7 @@ $labels['surname'] = 'Příjmení';
 $labels['email'] = 'E-mail';
 $labels['addcontact'] = 'Přidat kontakt';
 $labels['editcontact'] = 'Upravit kontakt';
+$labels['contacts'] = 'Kontakty';
 $labels['edit'] = 'Upravit';
 $labels['cancel'] = 'Konec';
 $labels['save'] = 'Uložit';
@@ -192,10 +219,13 @@ $labels['contactsfromto'] = 'Kontakty $from až $to z celkem $count';
 $labels['print'] = 'Tisk';
 $labels['export'] = 'Export';
 $labels['exportvcards'] = 'Exportovat kontakty ve formátu vCard';
+$labels['newcontactgroup'] = 'Vytvořit novou skupinu kontaktů';
+$labels['groupactions'] = 'Akce pro skupiny kontaktů...';
 $labels['previouspage'] = 'Předchozí';
 $labels['firstpage'] = 'Zobrazit první zprávy';
 $labels['nextpage'] = 'Další';
 $labels['lastpage'] = 'Zobrazit poslední zprávy';
+$labels['group'] = 'Skupina';
 $labels['groups'] = 'Skupiny';
 $labels['personaladrbook'] = 'Osobní kontakty';
 $labels['import'] = 'Import';
@@ -213,6 +243,10 @@ $labels['manageidentities'] = 'Spravovat profily u tohoto účtu';
 $labels['newidentity'] = 'Nový profil';
 $labels['newitem'] = 'Nová položka';
 $labels['edititem'] = 'Upravit položku';
+$labels['preferhtml'] = 'Upřednostňovat HTML zobrazení';
+$labels['defaultcharset'] = 'Výchozí kódování';
+$labels['htmlmessage'] = 'HTML zpráva';
+$labels['prettydate'] = 'Hezčí datum';
 $labels['setdefault'] = 'Nastavit výchozí';
 $labels['autodetect'] = 'Automaticky';
 $labels['language'] = 'Jazyk';
@@ -231,11 +265,13 @@ $labels['serversettings'] = 'Nastavení serveru';
 $labels['mailboxview'] = 'Zobrazení schránky';
 $labels['mdnrequests'] = 'Oznámení o doručení';
 $labels['askuser'] = 'zeptat se';
-$labels['autosend'] = 'poslat automaticky';
+$labels['autosend'] = 'poslat potvrzení automaticky';
+$labels['autosendknown'] = 'poslat potvrzení pouze mým kontaktům';
 $labels['ignore'] = 'ignorovat';
 $labels['readwhendeleted'] = 'Při odstranění označit zprávu jako přečtenou';
 $labels['flagfordeletion'] = 'Zprávu nemazat, pouze označit pro odstranění';
 $labels['skipdeleted'] = 'Nezobrazovat smazané zprávy';
+$labels['deletealways'] = 'Odstranit zprávy, pokud selže jejich přesun do koše';
 $labels['showremoteimages'] = 'Zobrazovat obrázky uložené mimo mail';
 $labels['fromknownsenders'] = 'od známých uživatelů';
 $labels['always'] = 'vždy';
@@ -244,22 +280,38 @@ $labels['autosavedraft'] = 'Automaticky uložit rozepsané zprávy';
 $labels['everynminutes'] = 'každých $n minut';
 $labels['keepalive'] = 'Zkontrolovat nové zprávy';
 $labels['never'] = 'nikdy';
+$labels['immediately'] = 'ihned';
 $labels['messagesdisplaying'] = 'Zobrazování zpráv';
 $labels['messagescomposition'] = 'Psaní zpráv';
 $labels['mimeparamfolding'] = 'Jména příloh';
 $labels['2231folding'] = 'Podle RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Podle RFC 2047 (ostatní)';
+$labels['force7bit'] = 'Použít kódování MIME pro 8-bitové znaky';
 $labels['advancedoptions'] = 'Pokročilá nastavení';
-$labels['focusonnewmessage'] = 'Aktivovat okno prohlížeče při príchozí zprávě';
+$labels['focusonnewmessage'] = 'Aktivovat okno prohlížeče při příchozí zprávě';
 $labels['checkallfolders'] = 'Kontrolovat nové zprávy ve všech složkách';
 $labels['displaynext'] = 'Zobrazit další zprávu po smazání/přesunu zprávy';
-$labels['indexsort'] = 'Používat index k řazení zpráv podle data';
 $labels['mainoptions'] = 'Hlavní nastavení';
 $labels['section'] = 'Sekce';
 $labels['maintenance'] = 'Údržba';
 $labels['newmessage'] = 'Nová zpráva';
 $labels['listoptions'] = 'Nastavení stránkování';
+$labels['signatureoptions'] = 'Nastavení podpisu';
+$labels['whenreplying'] = 'Při odpovídání';
+$labels['replytopposting'] = 'začít novou zprávu nad původní';
+$labels['replybottomposting'] = 'začít novou zprávu pod původní';
+$labels['replyremovesignature'] = 'Při odpovídání odstranit ze zprávy původní podpis';
+$labels['autoaddsignature'] = 'Automaticky přidat podpis';
+$labels['newmessageonly'] = 'pouze k novým zprávám';
+$labels['replyandforwardonly'] = 'jen k odpovědi a přeposílané zprávě';
+$labels['replysignaturepos'] = 'Při odpovídání nebo přeposílání zprávy vložit podpis';
+$labels['belowquote'] = 'pod citaci';
+$labels['abovequote'] = 'nad citaci';
+$labels['insertsignature'] = 'Vložit podpis';
+$labels['previewpanemarkread'] = 'Označit zobrazené zprávy jako přečtené';
+$labels['afternseconds'] = 'po $n sekundách';
+$labels['reqmdn'] = 'Vždy požadovat doručenku';
 $labels['folder'] = 'Složka';
 $labels['folders'] = 'Složky';
 $labels['foldername'] = 'Jméno složky';
@@ -267,9 +319,6 @@ $labels['subscribed'] = 'Vybráno';
 $labels['messagecount'] = 'Počet zpráv';
 $labels['create'] = 'Vytvořit';
 $labels['createfolder'] = 'Vytvořit novou složku';
-$labels['rename'] = 'Přejmenovat';
-$labels['renamefolder'] = 'Přejmenovat složku';
-$labels['deletefolder'] = 'Smazat složku';
 $labels['managefolders'] = 'Spravovat složky';
 $labels['specialfolders'] = 'Speciální složky';
 $labels['sortby'] = 'Seřadit podle';
@@ -279,5 +328,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Angličtina';
+$labels['westerneuropean'] = 'Západní Evropa';
+$labels['easterneuropean'] = 'Východní Evropa';
+$labels['southeasterneuropean'] = 'Jiho-východní Evropa';
+$labels['baltic'] = 'Baltština';
+$labels['cyrillic'] = 'Cyrilice';
+$labels['arabic'] = 'Arabština';
+$labels['greek'] = 'Řečtina';
+$labels['hebrew'] = 'Hebrejština';
+$labels['turkish'] = 'Turečtina';
+$labels['nordic'] = 'Nordština';
+$labels['thai'] = 'Thajština';
+$labels['celtic'] = 'Keltština';
+$labels['vietnamese'] = 'Vietnamština';
+$labels['japanese'] = 'Japonština';
+$labels['korean'] = 'Korejština';
+$labels['chinese'] = 'Čínština';
 
-?>
+?>
\ No newline at end of file
index 86b09a1f577997651a4006d9e8d4f61b94c12076..b5f0165409868d318ca787b23e768d09bc7e6cb1 100644 (file)
@@ -5,17 +5,18 @@
 +-----------------------------------------------------------------------+
 | language/cs_CZ/messages.inc                                              |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Martin Mrajca <martin@moonlake.cz>                            |
 |        joe <joe@humlak.cz>                                            |
 |        Jiri Kaderavek <jiri.kaderavek@webstep.net>                    |
+|        Ales Pospichal <ales@pospichalales.info>                       |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 3061 2009-10-26 21:42:58Z yllar $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -25,6 +26,7 @@ $messages['cookiesdisabled'] = 'Váš prohlížeč nepodporuje cookies, které j
 $messages['sessionerror'] = 'Vaše přihlášení je neplatné nebo vypršelo';
 $messages['imaperror'] = 'Připojení na IMAP server selhalo';
 $messages['servererror'] = 'Chyba serveru!';
+$messages['servererrormsg'] = 'Chyba serveru: $msg';
 $messages['invalidrequest'] = 'Nesprávný požadavek. Data nebyla uložena.';
 $messages['nomessagesfound'] = 'Ve schránce nebyla nalezena žádná zpráva';
 $messages['loggedout'] = 'Byli jste úspěšně odhlášeni. Nashledanou!';
@@ -49,18 +51,17 @@ $messages['senttooquickly'] = 'Prosím počkejte $sec sekund před odesláním z
 $messages['errorsavingsent'] = 'Nastala chyba při ukládání odeslané zprávy';
 $messages['errorsaving'] = 'Vyskytla se chyba při ukládání';
 $messages['errormoving'] = 'Nemohu přesunout zprávu';
+$messages['errorcopying'] = 'Nemohu zkopírovat zprávu';
 $messages['errordeleting'] = 'Nemohu smazat zprávu';
-$messages['errormarking'] = 'Zpráva nelze označit';
+$messages['errormarking'] = 'Zprávu nelze označit';
 $messages['deletecontactconfirm'] = 'Opravdu chcete smazat označené kontakty?';
 $messages['deletemessagesconfirm'] = 'Opravdu chcete smazat označené zprávy?';
 $messages['deletefolderconfirm'] = 'Chcete opravdu smazat tento adresář?';
 $messages['purgefolderconfirm'] = 'Opravdu chcete smazat všechny zprávy v této složce?';
-$messages['foldercreating'] = 'Vytvářím složku...';
-$messages['folderdeleting'] = 'Mažu složku...';
-$messages['folderrenaming'] = 'Přejmenovávám složku...';
+$messages['folderdeleting'] = 'Odstraňuji složku...';
 $messages['foldermoving'] = 'Přesouvám složku...';
 $messages['formincomplete'] = 'Formulář nebyl korektně vyplněn';
-$messages['noemailwarning'] = 'Zadejte, prosím, platnou adresu';
+$messages['noemailwarning'] = 'Zadejte, prosím, platnou e-mailovou adresu';
 $messages['nonamewarning'] = 'Zadejte, prosím, jméno';
 $messages['nopagesizewarning'] = 'Zadejte, prosím, velikost stránky';
 $messages['nosenderwarning'] = 'Zadejte e-mailovou adresu odesílatele';
@@ -79,7 +80,7 @@ $messages['checking'] = 'Kontroluji...';
 $messages['nospellerrors'] = 'Nebyly nalezeny žádné chyby';
 $messages['folderdeleted'] = 'Složka byla úspěšně vymazána';
 $messages['deletedsuccessfully'] = 'Úspěšně smazáno';
-$messages['converting'] = 'Odstranuji formátování ze zprávy...';
+$messages['converting'] = 'Odstraňuji formátování ze zprávy...';
 $messages['messageopenerror'] = 'Nemohu načíst zprávu ze serveru';
 $messages['fileuploaderror'] = 'Nahrávání souboru selhalo';
 $messages['filesizeerror'] = 'Soubor přesáhl maximální velikost $size';
@@ -88,26 +89,44 @@ $messages['copyerror'] = 'Nemohu zkopírovat žádnou adresu';
 $messages['sourceisreadonly'] = 'Tento zdroj adres je pouze pro čtení';
 $messages['errorsavingcontact'] = 'Nemohu uložit adresu kontaktu';
 $messages['movingmessage'] = 'Přesouvám zprávu...';
+$messages['copyingmessage'] = 'Kopíruji zprávu...';
+$messages['deletingmessage'] = 'Odstraňuji zprávu...';
+$messages['markingmessage'] = 'Označuji zprávu...';
 $messages['receiptsent'] = 'Potvrzení o přřijetí zprávy odesláno';
 $messages['errorsendingreceipt'] = 'Potvrzení o přijetí zprávy nebylo možné odeslat';
 $messages['nodeletelastidentity'] = 'Alespoň jedna identita musí být ponechána. Identitu nelze odstranit.';
-$messages['addsubfolderhint'] = 'Tato složka bude vytvořena jako podsložka aktuálně zvolené složky';
 $messages['forbiddencharacter'] = 'Název složky obsahuje zakázaný znak';
 $messages['selectimportfile'] = 'Prosím vyberte soubor k nahrání';
 $messages['addresswriterror'] = 'Vybraný seznam kontaktů není zapisovatelný';
+$messages['contactaddedtogroup'] = 'Kontakty byly úspěšně přidány do této skupiny';
+$messages['contactremovedfromgroup'] = 'Kontakty byly odstraněny z této skupiny';
 $messages['importwait'] = 'Importuji, prosím čekejte...';
 $messages['importerror'] = 'Během importu nastala chyba! Nahraný soubor není ve formátu vCard.';
-$messages['importconfirm'] = '<b>Úspěšně naimportováno $inserted kontaktů, $skipped existujících záznamů přeskočeno</b>:<p><em>$names</em></p>';
+$messages['importconfirm'] = 'Úspěšně naimportováno $inserted kontaktů, $skipped existujících záznamů přeskočeno:$names';
 $messages['opnotpermitted'] = 'Operace není povolena!';
 $messages['nofromaddress'] = 'Chybějící e-mailová adresa v označeném profilu';
 $messages['editorwarning'] = 'Přepnutím do režimu prostého textu ztratíte veškeré formátování. Chcete pokračovat?';
-$messages['httpreceivedencrypterror'] = 'Vyskytla se vážná chyba v konfiguraci. Kontaktujte neprodleně administátora. <b>Vaše zpráva nemohla být odeslána.</b>';
+$messages['httpreceivedencrypterror'] = 'Vyskytla se vážná chyba v konfiguraci. Kontaktujte neprodleně administátora. Vaše zpráva nemohla být odeslána.';
 $messages['smtpconnerror'] = 'Chyba SMTP ($code): Připojení k serveru selhalo';
 $messages['smtpautherror'] = 'Chyba SMTP ($code): Chyba přihlášení';
-$messages['smtpfromerror'] = 'Chyba SMTP ($code): Nelze nastavit odesílatele "$from"';
-$messages['smtptoerror'] = 'Chyba SMTP ($code): Nelze přidat příjemce "$to"';
+$messages['smtpfromerror'] = 'Chyba SMTP ($code): Nelze nastavit odesílatele "$from" ($msg)';
+$messages['smtptoerror'] = 'Chyba SMTP ($code): Nelze přidat příjemce "$to" ($msg)';
 $messages['smtprecipientserror'] = 'Chyba SMTP: Nelze zpracovat seznam příjemců';
+$messages['smtpdsnerror'] = 'Chyba SMTP: Není podporováno oznamení o stavu doručení (DSN)';
 $messages['smtperror'] = 'Chyba SMTP: $msg';
 $messages['emailformaterror'] = 'Neplatná e-mailová adresa: $email';
+$messages['toomanyrecipients'] = 'Příliš mnoho příjemců. Změňte počet příjemců na $max.';
+$messages['maxgroupmembersreached'] = 'Počet členských skupin dosáhl maximum z $max';
+$messages['internalerror'] = 'Došlo k interní chybě. Zkuste to znovu';
+$messages['contactdelerror'] = 'Kontakty nelze odstranit';
+$messages['contactdeleted'] = 'Kontakty byly odstraněny';
+$messages['groupdeleted'] = 'Skupina byla odstraněna';
+$messages['grouprenamed'] = 'Skupina byla přejmenována';
+$messages['groupcreated'] = 'Skupina vytvořena';
+$messages['messagedeleted'] = 'Zpráva odstraněna';
+$messages['messagemoved'] = 'Zpráva byla přesunuta';
+$messages['messagecopied'] = 'Zpráva byla zkopirována';
+$messages['messagemarked'] = 'Zpráva označena';
+$messages['autocompletechars'] = 'Napište alespoň $min znaků pro automatické doplnění';
 
 ?>
index cdbf86037d1a382771949302c0d50b3e75962903..3e22ee4d4b6df2188cd85effd3f109d81d58cc8e 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/cy_GB/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2008-2009, RoundQube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2008-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -35,21 +35,22 @@ $labels['to'] = 'Derbyniwr';
 $labels['cc'] = 'Copi';
 $labels['bcc'] = 'Bcc';
 $labels['replyto'] = 'Ateb-I';
+$labels['followupto'] = 'Followup-To';
 $labels['date'] = 'Dyddiad';
 $labels['size'] = 'Maint';
 $labels['priority'] = 'Blaenoriaeth';
 $labels['organization'] = 'Enw\'r Sefydliad';
-$labels['reply-to'] = 'Ateb-I';
+$labels['readstatus'] = 'Statws darllen';
 $labels['mailboxlist'] = 'Ffolderi';
 $labels['messagesfromto'] = 'Negeseuon $from i $to o $count';
+$labels['threadsfromto'] = 'Edefau $from i $to o $count';
 $labels['messagenrof'] = 'Neges $nr o $count';
+$labels['copy'] = 'Copio';
+$labels['move'] = 'Symud';
 $labels['moveto'] = 'Symud i...';
 $labels['download'] = 'Llwytho lawr';
 $labels['filename'] = 'Enw ffeil';
 $labels['filesize'] = 'Maint ffeil';
-$labels['preferhtml'] = 'Dangos HTML';
-$labels['htmlmessage'] = 'Neges HTML';
-$labels['prettydate'] = 'Dyddiadau pert';
 $labels['addtoaddressbook'] = 'Ychwanegu i\'r llyfr cyfeiriadau';
 $labels['sun'] = 'Sul';
 $labels['mon'] = 'Llun';
@@ -94,6 +95,8 @@ $labels['checkmail'] = 'Edrych am negeseuon newydd';
 $labels['writenewmessage'] = 'Creu neges newydd';
 $labels['replytomessage'] = 'Ymateb i\'r anfonwr';
 $labels['replytoallmessage'] = 'Ymateb i\'r anfonwr a phob derbyniwr';
+$labels['replyall'] = 'Ymateb i bawb';
+$labels['replylist'] = 'Ymateb i\'r rhestr';
 $labels['forwardmessage'] = 'Danfon y neges ymlaen';
 $labels['deletemessage'] = 'Dileu\'r neges';
 $labels['movemessagetotrash'] = 'Symud y neges i\'r sbwriel';
@@ -117,12 +120,35 @@ $labels['messageactions'] = 'Mwy o weithredoedd...';
 $labels['select'] = 'Dewis';
 $labels['all'] = 'Popeth';
 $labels['none'] = 'Dim byd';
+$labels['currpage'] = 'Tudalen gyfredol';
 $labels['unread'] = 'Heb eu darllen';
 $labels['flagged'] = 'Nodwyd';
 $labels['unanswered'] = 'Heb ei ateb';
 $labels['deleted'] = 'Dilewyd';
 $labels['invert'] = 'Gwrth-droi';
 $labels['filter'] = 'Hidlo';
+$labels['list'] = 'Rhestr';
+$labels['threads'] = 'Edafedd';
+$labels['expand-all'] = 'Ehangu Popeth';
+$labels['expand-unread'] = 'Ehangu Negeseuon Heb eu darllen';
+$labels['collapse-all'] = 'Crebachu Popeth';
+$labels['threaded'] = 'Edafedd';
+$labels['autoexpand_threads'] = 'Ehangu edefau neges';
+$labels['do_expand'] = 'pob edefyn';
+$labels['expand_only_unread'] = 'dim ond gyda negeseuon heb eu darllen';
+$labels['fromto'] = 'Danfonwr/Derbynnydd';
+$labels['flag'] = 'Fflag';
+$labels['attachment'] = 'Atodiad';
+$labels['nonesort'] = 'Dim';
+$labels['sentdate'] = 'Dyddiad danfon';
+$labels['arrival'] = 'Dyddiad derbyn';
+$labels['asc'] = 'esgynnol';
+$labels['desc'] = 'disgynnol';
+$labels['listcolumns'] = 'Rhestr colofnau';
+$labels['listsorting'] = 'Colofn trefnu';
+$labels['listorder'] = 'Trefn didoli';
+$labels['listmode'] = 'Golwg rhestr';
+$labels['folderactions'] = 'Gweithredoedd ffolder...';
 $labels['compact'] = 'Crynhoi';
 $labels['empty'] = 'Gwagio';
 $labels['purge'] = 'Glanhau';
@@ -143,12 +169,15 @@ $labels['addattachment'] = 'Atodi ffeil';
 $labels['charset'] = 'Set nodiau';
 $labels['editortype'] = 'Math golygydd';
 $labels['returnreceipt'] = 'Cadarnhau derbyn';
+$labels['dsn'] = 'Hysbysiad statws danfon';
+$labels['editidents'] = 'Golygu personoliaethau';
 $labels['checkspelling'] = 'Gwirio sillafu';
 $labels['resumeediting'] = 'Ail-ddechrau golygu';
 $labels['revertto'] = 'Dychwelyd i';
 $labels['attachments'] = 'Atodiadau';
 $labels['upload'] = 'Llwytho fyny';
 $labels['close'] = 'Cau';
+$labels['messageoptions'] = 'Dewisiadau neges...';
 $labels['low'] = 'Isel';
 $labels['lowest'] = 'Isaf';
 $labels['normal'] = 'Cyffredin';
@@ -165,6 +194,7 @@ $labels['maxuploadsize'] = 'Y maint ffeil uchaf a ganiateir yw $size';
 $labels['addcc'] = 'Ychwanegu Cc';
 $labels['addbcc'] = 'Ychwanegu Bcc';
 $labels['addreplyto'] = 'Ychwanegu Ateb-I';
+$labels['addfollowupto'] = 'Ychwanegu Followup-To';
 $labels['mdnrequest'] = 'Mae anfonwr y neges hwn wedi gofyn am hysbysiad eich bod wedi darllen y neges. Hoffech chi hysbysu\'r anfonwr?';
 $labels['receiptread'] = 'Cadarnhad Derbyn (darllenwyd)';
 $labels['yourmessage'] = 'Mae hwn yn gadarnhad o dderbyn eich neges';
@@ -175,6 +205,8 @@ $labels['surname'] = 'Enw olaf';
 $labels['email'] = 'E-bost';
 $labels['addcontact'] = 'Ychwanegu cyswllt newydd';
 $labels['editcontact'] = 'Golygu cyswllt';
+$labels['contacts'] = 'Cysylltiadau';
+$labels['contactproperties'] = 'Nodweddion cyswllt';
 $labels['edit'] = 'Golygu';
 $labels['cancel'] = 'Canslo';
 $labels['save'] = 'Cadw';
@@ -186,10 +218,13 @@ $labels['contactsfromto'] = 'Cysylltiadau $from i $to o $count';
 $labels['print'] = 'Argraffu';
 $labels['export'] = 'Allforio';
 $labels['exportvcards'] = 'Allforio cysylltiadau mewn fformat vCard';
+$labels['newcontactgroup'] = 'Creu grŵp cysylltiadau newydd';
+$labels['groupactions'] = 'Gweithredoedd ar gyfer grwpiau cysylltiadau...';
 $labels['previouspage'] = 'Dangos y set flaenorol';
 $labels['firstpage'] = 'Dangos y set gyntaf';
 $labels['nextpage'] = 'Dangos y set nesaf';
 $labels['lastpage'] = 'Dangos y set olaf';
+$labels['group'] = 'Grŵp';
 $labels['groups'] = 'Grwpiau';
 $labels['personaladrbook'] = 'Cyfeiriadau Personol';
 $labels['import'] = 'Mewnforio';
@@ -207,6 +242,10 @@ $labels['manageidentities'] = 'Rheoli personoliaethau ar gyfer y cyfri hwn';
 $labels['newidentity'] = 'Personoliaeth newydd';
 $labels['newitem'] = 'Eitem newydd';
 $labels['edititem'] = 'Golygu eitem';
+$labels['preferhtml'] = 'Dangos HTML';
+$labels['defaultcharset'] = 'Set Nodau Diofyn';
+$labels['htmlmessage'] = 'Neges HTML';
+$labels['prettydate'] = 'Dyddiadau pert';
 $labels['setdefault'] = 'Rhagosod';
 $labels['autodetect'] = 'Awto';
 $labels['language'] = 'Iaith';
@@ -215,6 +254,7 @@ $labels['pagesize'] = 'Rhesi ar bob tudalen';
 $labels['signature'] = 'Llofnod';
 $labels['dstactive'] = 'Amser arbed golau ddydd';
 $labels['htmleditor'] = 'Ysgrifennu negeseuon HTML';
+$labels['htmlonreply'] = 'wrth ateb i neges HTML yn unig';
 $labels['htmlsignature'] = 'Llofnod HTML';
 $labels['previewpane'] = 'Dangos ffenest rhagolwg';
 $labels['skin'] = 'Croen rhyngwyneb';
@@ -226,10 +266,13 @@ $labels['mailboxview'] = 'Ymddangosiad y Blychau';
 $labels['mdnrequests'] = 'Hysbysiadau anfonwr';
 $labels['askuser'] = 'gofyn i\'r defnyddiwr';
 $labels['autosend'] = 'danfon yn awtomatig';
+$labels['autosendknown'] = 'danfon y derbynneb i fy nghsylltiadau yn unig';
+$labels['autosendknownignore'] = 'danfon derbynneb i fy nghysylltiadau, anwybyddu fel arall';
 $labels['ignore'] = 'anwybyddu';
 $labels['readwhendeleted'] = 'Nodi\'r neges fel darllenwyd wrth ddileu';
 $labels['flagfordeletion'] = 'Fflagio\'r neges i\'w ddileu yn hytrach na dileu yn syth';
 $labels['skipdeleted'] = 'Peidio dangos negesuon wedi ei dileu';
+$labels['deletealways'] = 'Pan fod symud negeseuon i\'r Sbwriel yn methu, dileu nhw';
 $labels['showremoteimages'] = 'Dangos lluniau o wefannau allanol';
 $labels['fromknownsenders'] = 'o ddanfonwyr hysbys';
 $labels['always'] = 'bob amser';
@@ -238,22 +281,40 @@ $labels['autosavedraft'] = 'Cadw drafft yn awtomatig';
 $labels['everynminutes'] = 'bob $n munud';
 $labels['keepalive'] = 'Gofyn am negeseuon newydd ymlaen';
 $labels['never'] = 'byth';
+$labels['immediately'] = 'ar unwaith';
 $labels['messagesdisplaying'] = 'Dangos Negeseuon';
 $labels['messagescomposition'] = 'Ysgrifennu Negeseuon';
 $labels['mimeparamfolding'] = 'Enw atodiadau';
 $labels['2231folding'] = 'RFC 2231 llawn (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'RFC 2047 llawn (arall)';
+$labels['force7bit'] = 'Defnyddio amgodi MIME ar gyfer llythrennau 8-did';
 $labels['advancedoptions'] = 'Dewisiadau uwch';
 $labels['focusonnewmessage'] = 'Ffocysu\'r porwr ar y neges newydd';
 $labels['checkallfolders'] = 'Chwilio pob ffolder am negeseuon newydd';
 $labels['displaynext'] = 'Ar ôl dileu/symud neges dangos y neges nesaf';
-$labels['indexsort'] = 'Defnyddio mynegai negeseuon i drefnu yn ôl dyddiad';
 $labels['mainoptions'] = 'Prif Ddewisiadau';
 $labels['section'] = 'Adran';
 $labels['maintenance'] = 'Gwaith cynnal a chadw';
 $labels['newmessage'] = 'Neges Newydd';
 $labels['listoptions'] = 'Rhestru Dewisiadau';
+$labels['signatureoptions'] = 'Dewisiadau Llofnod';
+$labels['whenreplying'] = 'Wrth ateb';
+$labels['replytopposting'] = 'dechrau\'r neges newydd uwchben y neges wreiddiol';
+$labels['replybottomposting'] = 'dechrau\'r neges newydd o dan y neges wreiddiol';
+$labels['replyremovesignature'] = 'Wrth ateb, dileu\'r llofnod gwreiddiol o\'r neges';
+$labels['autoaddsignature'] = 'Ychwanegu llofnod yn awtomatig';
+$labels['newmessageonly'] = 'negeseuon newydd yn unig';
+$labels['replyandforwardonly'] = 'atebion a danfon ymlaen yn unig';
+$labels['replysignaturepos'] = 'Wrth ateb neu ddanfon ymlaen, rhoi\'r llofnod';
+$labels['belowquote'] = 'o dan y dyfynniad';
+$labels['abovequote'] = 'uwchben y dyfynniad';
+$labels['insertsignature'] = 'Mewnosod llofnod';
+$labels['previewpanemarkread'] = 'Nodi negeseuon rhagolwg fel darllenwyd';
+$labels['afternseconds'] = 'ar ôl $n eiliad';
+$labels['reqmdn'] = 'Bob amser gofyn am dderbynneb danfon';
+$labels['reqdsn'] = 'Gofyn am hysbysiad statws danfon bob amser';
+$labels['replysamefolder'] = 'Rhoi atebion yn yr un ffolder i\'r neges sy\'n cael ei ateb';
 $labels['folder'] = 'Ffolder';
 $labels['folders'] = 'Ffolderi';
 $labels['foldername'] = 'Enw ffolder';
@@ -261,11 +322,15 @@ $labels['subscribed'] = 'Tanysgrifwyd';
 $labels['messagecount'] = 'Negeseuon';
 $labels['create'] = 'Creu';
 $labels['createfolder'] = 'Creu ffolder newydd';
-$labels['rename'] = 'Ailenwi';
-$labels['renamefolder'] = 'Ailenwi ffolder';
-$labels['deletefolder'] = 'Dileu ffolder';
 $labels['managefolders'] = 'Rheoli ffolderi';
 $labels['specialfolders'] = 'Ffolderi arbennig';
+$labels['properties'] = 'Nodweddion';
+$labels['folderproperties'] = 'Ffolder nodweddion';
+$labels['parentfolder'] = 'Ffolder uwchben';
+$labels['location'] = 'Lleoliad';
+$labels['info'] = 'Gwybodaeth';
+$labels['getfoldersize'] = 'Cliciwch i gael maint ffolder';
+$labels['changesubscription'] = 'Cliciwch i newid y tanysgrifiad';
 $labels['sortby'] = 'Trefnu yn ôl';
 $labels['sortasc'] = 'Trefn esgynnol';
 $labels['sortdesc'] = 'Trefn ddisgynnol';
@@ -273,5 +338,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Saesneg';
+$labels['westerneuropean'] = 'Gorllewin Ewropeaidd';
+$labels['easterneuropean'] = 'Dwyrain Ewropeaidd';
+$labels['southeasterneuropean'] = 'De-Ddwyrain Ewropeaidd';
+$labels['baltic'] = 'Baltig';
+$labels['cyrillic'] = 'Cyrilig';
+$labels['arabic'] = 'Arabeg';
+$labels['greek'] = 'Groegaidd';
+$labels['hebrew'] = 'Hebraeg';
+$labels['turkish'] = 'Twrceg';
+$labels['nordic'] = 'Nordeg';
+$labels['thai'] = 'Thai';
+$labels['celtic'] = 'Celtaidd';
+$labels['vietnamese'] = 'Fietnamaidd';
+$labels['japanese'] = 'Japaneaidd';
+$labels['korean'] = 'Corëeg';
+$labels['chinese'] = 'Tsieineaidd';
 
 ?>
index c7d5886e4e834e8962b47cea764f3c42c457683f..486455b5df66ed38a8a3f293308d00b1af434a83 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/cy_GB/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2008-2009, RoundQube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2008-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -20,6 +20,9 @@ $messages['cookiesdisabled'] = 'Nid yw eich porwr yn derbyn cwcis';
 $messages['sessionerror'] = 'Mae\'r sesiwn yn anghywir neu wedi dod i ben';
 $messages['imaperror'] = 'Methwyd cysylltu a\'r gweinydd IMAP';
 $messages['servererror'] = 'Gwall Gweinydd!';
+$messages['servererrormsg'] = 'Gwall Gweinydd: $msg';
+$messages['errorreadonly'] = 'Methwyd gweithredu. Mae\'r ffolder yn darllen-yn-unig';
+$messages['errornoperm'] = 'Methwyd gweithredu. Gwrthodwyd caniatad';
 $messages['invalidrequest'] = 'Cais annilys! Ni chadwyd unrhyw wybodaeth.';
 $messages['nomessagesfound'] = 'Dim negeseuon wedi eu canfod yn y blwch hwn';
 $messages['loggedout'] = 'Rydych wedi gorffen y sesiwn yn llwyddianus. Hwyl fawr!';
@@ -44,16 +47,17 @@ $messages['senttooquickly'] = 'Arhoswch $sec eiliad cyn danfon y neges';
 $messages['errorsavingsent'] = 'Fe gafwyd gwall wrth cadw\'r neges ddanfonwyd';
 $messages['errorsaving'] = 'Fe gafwyd gwall wrth gadw';
 $messages['errormoving'] = 'Methwyd symud y neges';
+$messages['errorcopying'] = 'Methwyd copïo\'r neges(euon)';
 $messages['errordeleting'] = 'Methwyd dileu y neges';
 $messages['errormarking'] = 'Methwyd nodi y neges';
 $messages['deletecontactconfirm'] = 'Ydych chi wir am ddileu y cysylltiadau ddewiswyd?';
 $messages['deletemessagesconfirm'] = 'Ydych chi wir am ddileu y neges(euon) ddewiswyd?';
 $messages['deletefolderconfirm'] = 'Ydych chi wir am ddileu y ffolder yma?';
 $messages['purgefolderconfirm'] = 'Ydych chi wir am ddileu yr holl negeseuon yn y ffolder yma?';
-$messages['foldercreating'] = 'Yn creu ffolder...';
 $messages['folderdeleting'] = 'Yn dileu ffolder...';
-$messages['folderrenaming'] = 'Yn ailenwi ffolder...';
 $messages['foldermoving'] = 'Yn symud ffolder...';
+$messages['foldersubscribing'] = 'Yn tanysgrifio i\'r ffolder...';
+$messages['folderunsubscribing'] = 'Yn dad-danysgrifio i\'r ffolder...';
 $messages['formincomplete'] = 'Nid oedd y ffurflen wedi ei gwblhau yn llawn';
 $messages['noemailwarning'] = 'Rhowch gyfeiriad e-bost dilys';
 $messages['nonamewarning'] = 'Rhowch enw';
@@ -73,6 +77,10 @@ $messages['searching'] = 'Yn chwilio...';
 $messages['checking'] = 'Yn gofyn...';
 $messages['nospellerrors'] = 'Ni gafwyd hyd i unrhyw wallau gwirio';
 $messages['folderdeleted'] = 'Dilëwyd y ffolder yn llwyddiannus';
+$messages['foldersubscribed'] = 'Ffolder wedi ei danysgrifio yn llwyddiannus';
+$messages['folderunsubscribed'] = 'Ffolder wedi ei ddad-danysgrifio yn llwyddiannus';
+$messages['folderpurged'] = 'Ffolder wedi ei lanhau yn llwyddiannus';
+$messages['folderexpunged'] = 'Ffolder wedi ei wagio yn llwyddiannus';
 $messages['deletedsuccessfully'] = 'Dilëwyd yn llwyddiannus';
 $messages['converting'] = 'Yn cael gwared a\'r fformatio...';
 $messages['messageopenerror'] = 'Methwyd llwytho\'r neges o\'r gweinydd';
@@ -83,13 +91,17 @@ $messages['copyerror'] = 'Methwyd copïo unrhyw gyfeiriad';
 $messages['sourceisreadonly'] = 'Mae ffynhonnell y cyfeiriadau i\'w ddarllen yn unig';
 $messages['errorsavingcontact'] = 'Methwyd cadw cyfeiriad y cyswllt';
 $messages['movingmessage'] = 'Yn symud neges...';
+$messages['copyingmessage'] = 'Yn copïo\'r neges';
+$messages['deletingmessage'] = 'Yn dileu neges(euon)...';
+$messages['markingmessage'] = 'Yn marcio neges(euon)...';
 $messages['receiptsent'] = 'Danfonwyd cadarnhad derbyn yn llwyddiannus';
 $messages['errorsendingreceipt'] = 'Methwyd danfon cadarnhad derbyn';
 $messages['nodeletelastidentity'] = 'Allwch chi ddim dileu\'r personoliaeth yma, hwn yw\'r un olaf.';
-$messages['addsubfolderhint'] = 'Mi fydd y ffolder yma\'n cael ei greu fel is-ffolder o\'r un sydd wedi ei ddewis ar hyn o bryd';
 $messages['forbiddencharacter'] = 'Mae enw\'r ffolder yn cynnwys llythyren annerbynniol';
 $messages['selectimportfile'] = 'Dewiswch ffeil i\'w lwytho fyny';
 $messages['addresswriterror'] = 'Nid yw\'n bosib ysgrifennu i\'r llyfr cyfeiriadau ';
+$messages['contactaddedtogroup'] = 'Ychwanegwyd y cysylltiadau i\'r grŵp yma yn llwyddiannus';
+$messages['contactremovedfromgroup'] = 'Dilëwyd y cysylltiadau o\'r grŵp yma yn llwyddiannus';
 $messages['importwait'] = 'Yn mewnforio, arhoswch os gwelwch yn dda...';
 $messages['importerror'] = 'Methwyd a mewnforio! Nid yw\'r ffeil a lwythwyd fyny yn ffeil vCard dilys.';
 $messages['importconfirm'] = '<b>Fe mewnforiwyd $inserted cyswllt yn llwyddiannus, anwybyddwyd $skipped cofnod presennol</b>:<p><em>$names</em></p>';
@@ -99,10 +111,28 @@ $messages['editorwarning'] = 'Mi fydd newid i\'r golygydd testun plaen yn golygu
 $messages['httpreceivedencrypterror'] = 'Fe gafwyd gwall angheuol yn y ffurfweddiad. Cysylltwch â\'ch gweinyddwr ar unwaith. <b>Nid oedd yn bosib dangos eich neges.</b>';
 $messages['smtpconnerror'] = 'Gwall SMTP ($code): Methwyd cysylltu a\'r gweinydd';
 $messages['smtpautherror'] = 'Gwall SMTP ($code): Methwyd dilysu\'r cyfrif';
-$messages['smtpfromerror'] = 'Gwall SMTP ($code): Methwyd gosod y danfonwr "$from"';
-$messages['smtptoerror'] = 'Gwall SMTP ($code): Methwyd ychwanegu derbynwr "$to"';
+$messages['smtpfromerror'] = 'Gwall SMTP ($code): Methwyd gosod y danfonwr "$from" ($msg)';
+$messages['smtptoerror'] = 'Gwall SMTP ($code): Methwyd ychwanegu derbynwr "$to" ($msg)';
 $messages['smtprecipientserror'] = 'Gwall SMTP: Nid oedd yn bosib darllen y rhestr o dderbynnwyr';
+$messages['smtpdsnerror'] = 'Gwall SMTP: Dim cefnogaeth i Hysbysiadau Statws Danfon';
 $messages['smtperror'] = 'Gwall SMTP: $msg';
 $messages['emailformaterror'] = 'Cyfeiriad e-bost anghywir: $email';
+$messages['toomanyrecipients'] = 'Gormod o dderbynnwyr. Lleihewch y nifer i $max';
+$messages['maxgroupmembersreached'] = 'Mae nifer o aelodau\'r grŵp yn fwy na\'r uchafswm o $max';
+$messages['internalerror'] = 'Fe gafwyd gwall mewnol. Rhowch gynnig arni eto.';
+$messages['contactdelerror'] = 'Methwyd dileu cyswllt';
+$messages['contactdeleted'] = 'Cyswllt wedi ei ddileu yn llwyddiannus';
+$messages['groupdeleted'] = 'Grŵp wedi ei ddileu yn llwyddiannus';
+$messages['grouprenamed'] = 'Grŵp wedi ei ailenwi yn llwyddiannus';
+$messages['groupcreated'] = 'Grŵp wedi ei greu yn llwyddiannus';
+$messages['messagedeleted'] = 'Neges(euon) wedi eu dileu yn llwyddiannus';
+$messages['messagemoved'] = 'Neges(euon) wedi eu symud yn llwyddiannus';
+$messages['messagecopied'] = 'Neges(euon) wedi eu copïo yn llwyddiannus';
+$messages['messagemarked'] = 'Neges(euon) wedi eu marcio yn llwyddiannus';
+$messages['autocompletechars'] = 'Rhowch o leia $min llythyren ar gyfer awto-gwblhau';
+$messages['namecannotbeempty'] = 'Ni all yr enw fod yn wag';
+$messages['nametoolong'] = 'Mae\'r enw yn rhy hir';
+$messages['folderupdated'] = 'Diweddarwyd y ffolder yn llwyddiannus';
+$messages['foldercreated'] = 'Crëwyd y ffolder yn llwyddiannus';
 
 ?>
index 9f8bee63d5c6c3577749edbdbba0bcb10aa4db8e..50d7688fbbdc9b2b4e6dfe349aa39c2aca3f10b9 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/da_DK/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 |         Søren Aggeboe <soren@aggeboe.dk>                              |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2513 2009-05-21 12:59:19Z alec $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -45,15 +45,15 @@ $labels['priority'] = 'Prioritet';
 $labels['organization'] = 'Organisation';
 $labels['reply-to'] = 'Svar til';
 $labels['mailboxlist'] = 'Mapper';
-$labels['messagesfromto'] = 'Beskeder $from til $to af $count';
+$labels['messagesfromto'] = 'Besked $from til $to af $count';
+$labels['threadsfromto'] = 'Tråd $from til $to af $count';
 $labels['messagenrof'] = 'Besked $nr af $count';
-$labels['moveto'] = 'flyt til...';
-$labels['download'] = 'download';
+$labels['copy'] = 'Kopier';
+$labels['move'] = 'Flyt';
+$labels['moveto'] = 'Flyt til...';
+$labels['download'] = 'Download';
 $labels['filename'] = 'Filnavn';
 $labels['filesize'] = 'Filstørrelse';
-$labels['preferhtml'] = 'Foretræk HTML';
-$labels['htmlmessage'] = 'HTML-besked';
-$labels['prettydate'] = 'Pæn datovisning';
 $labels['addtoaddressbook'] = 'Tilføj til adressebogen';
 $labels['sun'] = 'Søn';
 $labels['mon'] = 'Man';
@@ -117,13 +117,38 @@ $labels['markread'] = 'Som læst';
 $labels['markunread'] = 'Som ulæst';
 $labels['markflagged'] = 'Som markeret';
 $labels['markunflagged'] = 'Som umarkeret';
+$labels['messageactions'] = 'Flere funktioner...';
 $labels['select'] = 'Vælg';
 $labels['all'] = 'Alle';
 $labels['none'] = 'Ingen';
+$labels['currpage'] = 'Aktuel side';
 $labels['unread'] = 'Ulæste';
 $labels['flagged'] = 'Markeret';
 $labels['unanswered'] = 'Ubesvaret';
-$labels['filter'] = 'Filter';
+$labels['deleted'] = 'Slettede';
+$labels['invert'] = 'Invertér';
+$labels['filter'] = 'Filtrer';
+$labels['list'] = 'Liste';
+$labels['threads'] = 'Tråde';
+$labels['expand-all'] = 'Udfold alle';
+$labels['expand-unread'] = 'Udfold ulæste';
+$labels['collapse-all'] = 'Fold alle';
+$labels['threaded'] = 'Tråded';
+$labels['autoexpand_threads'] = 'Udfold besked tråde';
+$labels['do_expand'] = 'alle tråde';
+$labels['expand_only_unread'] = 'kun dem med ulæste beskeder';
+$labels['fromto'] = 'Afsender/Modtager';
+$labels['flag'] = 'Flag';
+$labels['attachment'] = 'Vedhæftning';
+$labels['nonesort'] = 'Ingen';
+$labels['sentdate'] = 'Sendt dato';
+$labels['arrival'] = 'Modtaget dato';
+$labels['asc'] = 'opstigende';
+$labels['desc'] = 'faldende';
+$labels['listcolumns'] = 'Vist kolonne';
+$labels['listsorting'] = 'Sorterings kolonne';
+$labels['listorder'] = 'Sorter efter';
+$labels['listmode'] = 'Listevisningsmode';
 $labels['compact'] = 'Ryd op';
 $labels['empty'] = 'Tøm';
 $labels['purge'] = 'Udrens';
@@ -132,8 +157,11 @@ $labels['unknown'] = 'ukendt';
 $labels['unlimited'] = 'ubegrænset';
 $labels['quicksearch'] = 'Hurtigsøgning';
 $labels['resetsearch'] = 'Nulstil søgning';
+$labels['msgtext'] = 'Hele beskeden';
 $labels['openinextwin'] = 'Åbn i nyt vindue';
+$labels['emlsave'] = 'Download (.eml)';
 $labels['compose'] = 'Forfat en besked';
+$labels['editasnew'] = 'Redigér som ny';
 $labels['savemessage'] = 'Gem denne kladde';
 $labels['sendmessage'] = 'Send beskeden nu';
 $labels['addattachment'] = 'Vedhæft en fil';
@@ -183,10 +211,13 @@ $labels['contactsfromto'] = 'Kontakter $from til $to af $count';
 $labels['print'] = 'Print';
 $labels['export'] = 'Eksport';
 $labels['exportvcards'] = 'Eksportér kontakter i vCard format';
+$labels['newcontactgroup'] = 'Opret ny kontaktgruppe';
+$labels['groupactions'] = 'Funktioner for kontaktgrupper...';
 $labels['previouspage'] = 'Vis forrige sæt';
 $labels['firstpage'] = 'Vis første sæt';
 $labels['nextpage'] = 'Vis næste sæt';
 $labels['lastpage'] = 'Vis sidste sæt';
+$labels['group'] = 'Gruppe';
 $labels['groups'] = 'Grupper';
 $labels['personaladrbook'] = 'Personlige Adresser';
 $labels['import'] = 'Importér';
@@ -204,6 +235,10 @@ $labels['manageidentities'] = 'Styr identiteterne for denne konto';
 $labels['newidentity'] = 'Ny identitet';
 $labels['newitem'] = 'Nyt punkt';
 $labels['edititem'] = 'Redigér punkt';
+$labels['preferhtml'] = 'Foretræk HTML';
+$labels['defaultcharset'] = 'Standard tegnkodning';
+$labels['htmlmessage'] = 'HTML-besked';
+$labels['prettydate'] = 'Pæn datovisning';
 $labels['setdefault'] = 'Sæt standard';
 $labels['autodetect'] = 'Automatisk';
 $labels['language'] = 'Sprog';
@@ -219,6 +254,7 @@ $labels['logoutclear'] = 'Tøm Skrald når jeg logger af';
 $labels['logoutcompact'] = 'Komprimér Indbakke når jeg logger af';
 $labels['uisettings'] = 'Brugerinterface';
 $labels['serversettings'] = 'Serverindstillinger';
+$labels['mailboxview'] = 'Mailbox visning';
 $labels['mdnrequests'] = 'Kvitteringer';
 $labels['askuser'] = 'spørg brugeren';
 $labels['autosend'] = 'send automatisk';
@@ -226,22 +262,46 @@ $labels['ignore'] = 'ignorér';
 $labels['readwhendeleted'] = 'Markér beskeden som læst ved sletning';
 $labels['flagfordeletion'] = 'Markér beskeden til sletning istedet for at slette';
 $labels['skipdeleted'] = 'Skjul slettede beskeder';
+$labels['deletealways'] = 'Slet besked, hvis det mislykkes at flytte den til skrald';
 $labels['showremoteimages'] = 'Vis eksterne indlejrede billeder';
 $labels['fromknownsenders'] = 'fra kendte afsendere';
 $labels['always'] = 'altid';
 $labels['showinlineimages'] = 'Vis vedhæftede billeder under beskeden';
 $labels['autosavedraft'] = 'Gem kladde automatisk';
 $labels['everynminutes'] = 'hver $n. minut';
+$labels['keepalive'] = 'Tjek for nye beskeder på';
 $labels['never'] = 'aldrig';
+$labels['immediately'] = 'straks';
 $labels['messagesdisplaying'] = 'Viser beskeder';
 $labels['messagescomposition'] = 'Skriver nye beskeder';
 $labels['mimeparamfolding'] = 'Navne på vedhæftninger';
 $labels['2231folding'] = 'Fuld RFC 2231 understøttelse (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 understøttelse (MS Outlook)';
 $labels['2047folding'] = 'Fuld RFC 2047 understøttelse (andre)';
+$labels['force7bit'] = 'Brug MIME indkodning for 8-bits tegn';
 $labels['advancedoptions'] = 'Advancerede muligheder';
 $labels['focusonnewmessage'] = 'Fokusér browservindue når der kommer nye beskeder';
 $labels['checkallfolders'] = 'Tjek alle mapper for nye beskeder';
+$labels['displaynext'] = 'Efter slet/flyt besked, vis næste besked';
+$labels['mainoptions'] = 'Generelle indstillinger';
+$labels['section'] = 'Sektion';
+$labels['maintenance'] = 'Vedligeholdelse';
+$labels['newmessage'] = 'Ny besked';
+$labels['listoptions'] = 'Liste-indstillinger';
+$labels['signatureoptions'] = 'Signatur-indstillinger';
+$labels['whenreplying'] = 'Når der svares';
+$labels['replytopposting'] = 'start svar over originalen';
+$labels['replybottomposting'] = 'start svar under originalen';
+$labels['replyremovesignature'] = 'Fjern original signatur fra besked, når der svares';
+$labels['autoaddsignature'] = 'Indsæt automatisk signatur';
+$labels['newmessageonly'] = 'kun på nye beskeder';
+$labels['replyandforwardonly'] = 'kun på svar og videresende beskeder';
+$labels['replysignaturepos'] = 'Når beskeder besvares eller videresendes: placér signatur';
+$labels['belowquote'] = 'under det citerede';
+$labels['abovequote'] = 'over det citerede';
+$labels['insertsignature'] = 'Indsæt signatur';
+$labels['previewpanemarkread'] = 'Markér forhåndsviste beskeder som læst';
+$labels['afternseconds'] = 'efter $n sekunder';
 $labels['folder'] = 'Mappe';
 $labels['folders'] = 'Mapper';
 $labels['foldername'] = 'Mappenavn';
@@ -249,9 +309,6 @@ $labels['subscribed'] = 'Abonneret';
 $labels['messagecount'] = 'Beskeder';
 $labels['create'] = 'Opret';
 $labels['createfolder'] = 'Opret ny mappe';
-$labels['rename'] = 'Omdøb';
-$labels['renamefolder'] = 'Omdøb mappe';
-$labels['deletefolder'] = 'Slet mappe';
 $labels['managefolders'] = 'Administrér mapper';
 $labels['specialfolders'] = 'Specielle mapper';
 $labels['sortby'] = 'Sortér efter';
@@ -261,5 +318,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Engelsk';
+$labels['westerneuropean'] = 'Vestlig europæisk';
+$labels['easterneuropean'] = 'Østlig europæisk';
+$labels['southeasterneuropean'] = 'Syd-østlig europæisk';
+$labels['baltic'] = 'Baltisk';
+$labels['cyrillic'] = 'Kyrillisk';
+$labels['arabic'] = 'Arabisk';
+$labels['greek'] = 'Græsk';
+$labels['hebrew'] = 'Hebræisk';
+$labels['turkish'] = 'Tyrkisk';
+$labels['nordic'] = 'Nordisk';
+$labels['thai'] = 'Thai';
+$labels['celtic'] = 'Keltisk';
+$labels['vietnamese'] = 'Vietnamesisk';
+$labels['japanese'] = 'Japansk';
+$labels['korean'] = 'Koreansk';
+$labels['chinese'] = 'Kinesisk';
 
 ?>
index 56f4ef446adf25d7e9d84af53c8fe713030e5d7b..2762dda8f50ed266072145523b2a2993262c69f4 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/da_DK/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 |         Søren Aggeboe <soren@aggeboe.dk>                              |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2494 2009-05-17 11:56:53Z yllar $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -23,10 +23,13 @@ $messages['loginfailed'] = 'Det lykkedes ikke at logge på';
 $messages['cookiesdisabled'] = 'Din browser accepterer ikke cookies';
 $messages['sessionerror'] = 'Din session er ugyldig eller udløbet';
 $messages['imaperror'] = 'Forbindelse til IMAP serveren fejlede';
+$messages['servererror'] = 'Server fejl!';
+$messages['invalidrequest'] = 'Ugyldig forespørgsel! Ingen data blev gemt.';
 $messages['nomessagesfound'] = 'Der blev ikke fundet nogen beskeder i denne postkasse';
 $messages['loggedout'] = 'Du er nu logget af webmail. Farvel så længe!';
 $messages['mailboxempty'] = 'Postkassen er tom!';
 $messages['loading'] = 'Indlæser...';
+$messages['uploading'] = 'Uploader fil...';
 $messages['loadingdata'] = 'Indlæser data...';
 $messages['checkingmail'] = 'Tjekker for nye beskeder...';
 $messages['sendingmessage'] = 'Sender besked...';
@@ -45,14 +48,14 @@ $messages['senttooquickly'] = 'Vent venligst $sec sekunder før du sender denne
 $messages['errorsavingsent'] = 'Der opstod en fejl da den sendte besked blev gemt';
 $messages['errorsaving'] = 'Der opstod en fejl ved lagring af data';
 $messages['errormoving'] = 'Beskeden kunne ikke flyttes';
+$messages['errorcopying'] = 'Beskeden kunne ikke kopieres';
 $messages['errordeleting'] = 'Beskeden kunne ikke slettes';
+$messages['errormarking'] = 'Beskeden kunne ikke markeres';
 $messages['deletecontactconfirm'] = 'Vil du virkelig slette den/de valgte kontakt(er)?';
 $messages['deletemessagesconfirm'] = 'Vil du virkelig slette den/de valgte besked(er)?';
 $messages['deletefolderconfirm'] = 'Vil du virkelig slette den valgte mappe';
 $messages['purgefolderconfirm'] = 'Vil du virkelig slette alle beskeder i denne mappe?';
-$messages['foldercreating'] = 'Opretter mappen...';
 $messages['folderdeleting'] = 'Sletter mappen...';
-$messages['folderrenaming'] = 'Omdøber mappen...';
 $messages['foldermoving'] = 'Flytter mappen...';
 $messages['formincomplete'] = 'Formularen var ikke fuldstændig fyldt ud';
 $messages['noemailwarning'] = 'Indtast venligst en gyldig e-mail adresse';
@@ -66,6 +69,7 @@ $messages['notsentwarning'] = 'Beskeden er ikke blevet sendt. Vil du kassere din
 $messages['noldapserver'] = 'Vælg venligst hvilken LDAP-server der skal søges i';
 $messages['nocontactsreturned'] = 'Ingen kontakter blev fundet';
 $messages['nosearchname'] = 'Indtast venligst en kontakts navn eller e-mail adresse';
+$messages['notuploadedwarning'] = 'Ikke alle vedhæftede filer er blevet uploadet endnu. Vent venligst eller afbryd upload.';
 $messages['searchsuccessful'] = 'Fandt $nr beskeder';
 $messages['searchnomatch'] = 'Søgningen fandt ingen beskeder';
 $messages['searching'] = 'Søger...';
@@ -82,18 +86,30 @@ $messages['copyerror'] = 'Kunne ikke kopiere adresserne';
 $messages['sourceisreadonly'] = 'Denne adressekilde er kun til læsning';
 $messages['errorsavingcontact'] = 'Kunne ikke gemme kontakt adressen';
 $messages['movingmessage'] = 'Flytter besked...';
+$messages['copyingmessage'] = 'Kopierer besked...';
 $messages['receiptsent'] = 'Kvittering for læsning er sendt';
 $messages['errorsendingreceipt'] = 'Kvitteringen kunne ikke sendes';
 $messages['nodeletelastidentity'] = 'Du kan ikke slette denne identitet, da det er den eneste der er tilbage.';
-$messages['addsubfolderhint'] = 'Denne mappe vil blive oprettet som en undermappe til den mappe der er valgt i øjeblikket.';
 $messages['forbiddencharacter'] = 'Mappe-navnet indeholder ugyldige tegn';
 $messages['selectimportfile'] = 'Vælg venligst den fil der skal uploades';
 $messages['addresswriterror'] = 'Der kan ikke skrives i den valgte adressebog';
+$messages['contactaddedtogroup'] = 'Succesfuldt tilføjet kontakten til denne gruppe';
+$messages['contactremovedfromgroup'] = 'Succesfuldt fjernet kontakten fra denne gruppe';
 $messages['importwait'] = 'Importerer, vent venligst...';
 $messages['importerror'] = 'Fejl i importen! Den uploadede fil er ikke en gyldig vCard fil.';
 $messages['importconfirm'] = '<b>Importerede $inserted kontakter, sprang over $skipped allerede eksisterende kontakter</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Handlingen er ikke tilladt!';
 $messages['nofromaddress'] = 'Der mangler en email-adresse i den valgte identitet';
 $messages['editorwarning'] = 'Al formatering af teksten forsvinder, hvis der skiftes til ren tekst. Vil du fortsætte?';
+$messages['httpreceivedencrypterror'] = 'Der er opstået en fatal konfigurationsfejl. Kontakt venligst din system-administrator med det samme.<b>Din besked kunne ikke afsendes.</b>';
+$messages['smtpconnerror'] = 'SMTP fejl ($code): Forbindelsen til serveren afbrudt';
+$messages['smtpautherror'] = 'SMTP fejl ($code): Autenticering fejlede';
+$messages['smtpfromerror'] = 'SMTP fejl ($code): Kunne ikke afsende som "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP fejl ($code): Kunne ikke tilføje modtageren "$to" ($msg)';
+$messages['smtprecipientserror'] = 'SMTP fejl: kan ikke fortolke listen af modtagere';
+$messages['smtperror'] = 'SMTP fejl: $msg';
+$messages['emailformaterror'] = 'Ugyldig email-adresse: $email';
+$messages['toomanyrecipients'] = 'For mange modtagere. Reducer antallet af modtagere til $max';
+$messages['maxgroupmembersreached'] = 'Antallet af gruppemedlemmer overstiger maksimum på $max';
 
 ?>
index 1f4edf9f53ce4d9492d657f7251db5a9a234becc..bb08d33fc891506585fdbb2bb31f5788b087e3c5 100644 (file)
@@ -5,16 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/de_CH/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author:      Thomas Bruederli <roundcube@gmail.com>                   |
-| Corrections: Alexander Stiebing <ja.stiebing[NOSPAM]@web.de>          |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 3065 2009-10-27 16:08:00Z thomasb $
+@version $Id: labels.inc 4346 2010-12-17 14:36:47Z thomasb $
 
 */
 
@@ -32,28 +31,32 @@ $labels['inbox'] = 'Posteingang';
 $labels['drafts'] = 'Entwürfe';
 $labels['sent'] = 'Gesendet';
 $labels['trash'] = 'Gelöscht';
-$labels['junk'] = 'Junk';
+$labels['junk'] = 'Spam';
 $labels['subject'] = 'Betreff';
 $labels['from'] = 'Absender';
 $labels['to'] = 'Empfänger';
 $labels['cc'] = 'Kopie (CC)';
 $labels['bcc'] = 'Blind-Kopie';
 $labels['replyto'] = 'Antwort an';
+$labels['followupto'] = 'Followup-To';
 $labels['date'] = 'Datum';
 $labels['size'] = 'Grösse';
 $labels['priority'] = 'Priorität';
 $labels['organization'] = 'Organisation';
+$labels['readstatus'] = 'Gelesen/Ungelesen';
 $labels['reply-to'] = 'Antwort an';
+$labels['mail-reply-to'] = 'Mail-Reply-To';
+$labels['mail-followup-to'] = 'Mail-Followup-To';
 $labels['mailboxlist'] = 'Ordner';
 $labels['messagesfromto'] = 'Nachrichten $from bis $to von $count';
+$labels['threadsfromto'] = 'Konversationen $from bis $to von $count';
 $labels['messagenrof'] = 'Nachricht $nr von $count';
+$labels['copy'] = 'Kopieren';
+$labels['move'] = 'Verschieben';
 $labels['moveto'] = 'Verschieben nach...';
 $labels['download'] = 'Download';
 $labels['filename'] = 'Dateiname';
 $labels['filesize'] = 'Dateigrösse';
-$labels['preferhtml'] = 'HTML bevorzugen';
-$labels['htmlmessage'] = 'HTML Nachricht';
-$labels['prettydate'] = 'Kurze Datumsanzeige';
 $labels['addtoaddressbook'] = 'Ins Adressbuch übernehmen';
 $labels['sun'] = 'So';
 $labels['mon'] = 'Mo';
@@ -98,6 +101,8 @@ $labels['checkmail'] = 'Auf neue Nachrichten prüfen';
 $labels['writenewmessage'] = 'Neue Nachricht schreiben';
 $labels['replytomessage'] = 'Antwort verfassen';
 $labels['replytoallmessage'] = 'Antwort an Absender und alle Empfänger verfassen';
+$labels['replyall'] = 'Allen antworten';
+$labels['replylist'] = 'Liste antworten';
 $labels['forwardmessage'] = 'Nachricht weiterleiten';
 $labels['deletemessage'] = 'Nachricht löschen';
 $labels['movemessagetotrash'] = 'Nachricht in den Papierkorb verschieben';
@@ -117,16 +122,39 @@ $labels['markread'] = 'Als gelesen';
 $labels['markunread'] = 'Als ungelesen';
 $labels['markflagged'] = 'Stern hinzufügen';
 $labels['markunflagged'] = 'Stern entfernen';
-$labels['messageactions']   = 'Weitere Aktionen...';
+$labels['messageactions'] = 'Weitere Aktionen...';
 $labels['select'] = 'Auswählen';
 $labels['all'] = 'Alle';
 $labels['none'] = 'Keine';
+$labels['currpage'] = 'Aktuelle Seite';
 $labels['unread'] = 'Ungelesene';
 $labels['flagged'] = 'Markierte';
 $labels['unanswered'] = 'Unbeantwortete';
 $labels['deleted'] = 'Gelöschte';
 $labels['invert'] = 'Umkehren';
 $labels['filter'] = 'Filter';
+$labels['list'] = 'Liste';
+$labels['threads'] = 'Konversationen';
+$labels['expand-all'] = 'Alle aufklappen';
+$labels['expand-unread'] = 'Ungelesene aufklappen';
+$labels['collapse-all'] = 'Alle zuklappen';
+$labels['threaded'] = 'Gruppiert';
+$labels['autoexpand_threads'] = 'Konversationen aufklappen';
+$labels['do_expand'] = 'alle';
+$labels['expand_only_unread'] = 'nur ungelesene';
+$labels['fromto'] = 'Sender/Empfänger';
+$labels['flag'] = 'Markierung';
+$labels['attachment'] = 'Anhang';
+$labels['nonesort'] = 'Keine';
+$labels['sentdate'] = 'Sendedatum';
+$labels['arrival'] = 'Empfangsdatum';
+$labels['asc'] = 'aufsteigend';
+$labels['desc'] = 'absteigend';
+$labels['listcolumns'] = 'Spalten';
+$labels['listsorting'] = 'Sortierung';
+$labels['listorder'] = 'Ordnung';
+$labels['listmode'] = 'Anzeigemodus';
+$labels['folderactions'] = 'Ordneraktionen...';
 $labels['compact'] = 'Packen';
 $labels['empty'] = 'Leeren';
 $labels['purge'] = 'Aufräumen';
@@ -135,8 +163,8 @@ $labels['unknown'] = 'unbekannt';
 $labels['unlimited'] = 'unlimitiert';
 $labels['quicksearch'] = 'Schnellsuche';
 $labels['resetsearch'] = 'Löschen';
-$labels['searchmod']  = 'Suchkriterien ändern';
-$labels['msgtext']  = 'Ganze Nachricht';
+$labels['searchmod'] = 'Suchkriterien ändern';
+$labels['msgtext'] = 'Ganze Nachricht';
 $labels['openinextwin'] = 'In neuem Fenster öffnen';
 $labels['emlsave'] = 'Herunterladen (.eml)';
 $labels['compose'] = 'Neue Nachricht verfassen';
@@ -146,13 +174,16 @@ $labels['sendmessage'] = 'Nachricht jetzt senden';
 $labels['addattachment'] = 'Datei anfügen';
 $labels['charset'] = 'Zeichensatz';
 $labels['editortype'] = 'Editor-Typ';
-$labels['returnreceipt'] = 'Empfangsbestätigung';
+$labels['returnreceipt'] = 'Empfangsbestätigung (MSN)';
+$labels['dsn'] = 'Übermittlungsbestätigung (DSN)';
+$labels['editidents'] = 'Absender bearbeiten';
 $labels['checkspelling'] = 'Rechtschreibung prüfen';
 $labels['resumeediting'] = 'Bearbeitung fortsetzen';
 $labels['revertto'] = 'Zurück zu';
 $labels['attachments'] = 'Anhänge';
 $labels['upload'] = 'Hochladen';
 $labels['close'] = 'Schliessen';
+$labels['messageoptions'] = 'Optionen...';
 $labels['low'] = 'Niedrig';
 $labels['lowest'] = 'Niedrigste';
 $labels['normal'] = 'Normal';
@@ -169,6 +200,7 @@ $labels['maxuploadsize'] = 'Maximal erlaubte Dateigrösse ist $size';
 $labels['addcc'] = 'Cc hinzufügen';
 $labels['addbcc'] = 'Bcc hinzufügen';
 $labels['addreplyto'] = 'Antwortadresse hinzufügen';
+$labels['addfollowupto'] = 'Followup-To hinzufügen';
 $labels['mdnrequest'] = 'Der Sender dieser Nachricht hat eine Empfangsbestätigung angefordert. Möchten Sie diese jetzt senden?';
 $labels['receiptread'] = 'Empfangsbestätigung (gelesen)';
 $labels['yourmessage'] = 'Dieses ist eine Empfangsbestätigung für Ihre Nachricht';
@@ -179,6 +211,8 @@ $labels['surname'] = 'Nachname';
 $labels['email'] = 'E-Mail';
 $labels['addcontact'] = 'Kontakt hinzufügen';
 $labels['editcontact'] = 'Kontakt bearbeiten';
+$labels['contacts'] = 'Kontakte';
+$labels['contactproperties'] = 'Kontaktdaten';
 $labels['edit'] = 'Bearbeiten';
 $labels['cancel'] = 'Abbrechen';
 $labels['save'] = 'Speichern';
@@ -190,10 +224,13 @@ $labels['contactsfromto'] = 'Kontakte $from bis $to von $count';
 $labels['print'] = 'Drucken';
 $labels['export'] = 'Exportieren';
 $labels['exportvcards'] = 'Kontakte im vCard-Format exportieren';
+$labels['newcontactgroup'] = 'Neue Adressgruppe erstellen';
+$labels['groupactions'] = 'Aktionen für Kontaktgruppen...';
 $labels['previouspage'] = 'Eine Seite zurück';
 $labels['firstpage'] = 'Erste Seite';
 $labels['nextpage'] = 'Nächste Seite';
 $labels['lastpage'] = 'Letzte Seite';
+$labels['group'] = 'Gruppe';
 $labels['groups'] = 'Gruppen';
 $labels['personaladrbook'] = 'Persönliches Adressbuch';
 $labels['import'] = 'Importieren';
@@ -211,6 +248,10 @@ $labels['manageidentities'] = 'Absender für dieses Konto verwalten';
 $labels['newidentity'] = 'Neuer Absender';
 $labels['newitem'] = 'Neuer Eintrag';
 $labels['edititem'] = 'Eintrag bearbeiten';
+$labels['preferhtml'] = 'HTML bevorzugen';
+$labels['defaultcharset'] = 'Standard-Zeichensatz';
+$labels['htmlmessage'] = 'HTML Nachricht';
+$labels['prettydate'] = 'Kurze Datumsanzeige';
 $labels['setdefault'] = 'Als Standard';
 $labels['autodetect'] = 'Automatisch';
 $labels['language'] = 'Sprache';
@@ -219,6 +260,7 @@ $labels['pagesize'] = 'Einträge pro Seite';
 $labels['signature'] = 'Signatur';
 $labels['dstactive'] = 'Sommerzeit';
 $labels['htmleditor'] = 'HTML-Nachrichten verfassen';
+$labels['htmlonreply'] = 'nur Antworten auf HTML-Nachrichten';
 $labels['htmlsignature'] = 'HTML-Signatur';
 $labels['previewpane'] = 'Nachrichtenvorschau anzeigen';
 $labels['skin'] = 'Oberflächendesign';
@@ -227,13 +269,16 @@ $labels['logoutcompact'] = 'Posteingang beim Abmelden packen';
 $labels['uisettings'] = 'Benutzeroberfläche';
 $labels['serversettings'] = 'Server-Einstellungen';
 $labels['mailboxview'] = 'Mailbox-Ansicht';
-$labels['mdnrequests'] = 'Lesebestätigung senden';
+$labels['mdnrequests'] = 'Empfangsbestätigung senden';
 $labels['askuser'] = 'immer fragen';
 $labels['autosend'] = 'automatisch senden';
+$labels['autosendknown'] = 'für bekannte Absender, sonst fragen';
+$labels['autosendknownignore'] = 'für bekannte Absender, sonst ignorieren';
 $labels['ignore'] = 'ignorieren';
 $labels['readwhendeleted'] = 'Beim Löschen als gelesen markieren';
 $labels['flagfordeletion'] = 'Als gelöscht markieren anstatt in den Papierkorb verschieben';
 $labels['skipdeleted'] = 'Zeige keine gelöschten Nachrichten an';
+$labels['deletealways'] = 'Löschen wenn Verschieben in den Papierkorb nicht möglich';
 $labels['showremoteimages'] = 'Eingebettete Bilder vom Internet laden';
 $labels['fromknownsenders'] = 'bei bekannten Absendern';
 $labels['always'] = 'immer';
@@ -242,22 +287,40 @@ $labels['autosavedraft'] = 'Entwurf autom. speichern';
 $labels['everynminutes'] = '$n Minute(n)';
 $labels['keepalive'] = 'Auf neue Nachrichten prüfen nach';
 $labels['never'] = 'nie';
+$labels['immediately'] = 'sofort';
 $labels['messagesdisplaying'] = 'Nachrichtendarstellung';
 $labels['messagescomposition'] = 'Nachrichtenerstellung';
 $labels['mimeparamfolding'] = 'Namen der Dateianhänge';
 $labels['2231folding'] = 'Vollständig RFC 2231 kompatibel (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 kompatibel (Microsoft Outlook)';
 $labels['2047folding'] = 'Vollständig RFC 2047 kompatibel (andere)';
+$labels['force7bit'] = 'MIME-Kodierung für 8-bit Zeichen';
 $labels['advancedoptions'] = 'Erweiterte Einstellungen';
 $labels['focusonnewmessage'] = 'Fokussiere Browserfenster bei neuen Nachrichten';
 $labels['checkallfolders'] = 'Alle Ordner auf neue Nachrichten prüfen';
 $labels['displaynext'] = 'Zeige nächste Nachricht nach verschieben/löschen';
-$labels['indexsort'] = 'Benutze Index für Sortierung nach Datum (schneller)';
 $labels['mainoptions'] = 'Allgemein';
 $labels['section'] = 'Bereich';
 $labels['maintenance'] = 'Wartung';
 $labels['newmessage'] = 'Neue Nachrichten';
 $labels['listoptions'] = 'Listendarstellung';
+$labels['signatureoptions'] = 'Signatur';
+$labels['whenreplying'] = 'Beantworten einer Nachricht';
+$labels['replytopposting'] = 'Antwort über der Originalnachricht';
+$labels['replybottomposting'] = 'Antwort unter der Originalnachricht';
+$labels['replyremovesignature'] = 'Beim Antworten die Signatur der Originalnachricht entfernen';
+$labels['autoaddsignature'] = 'Signatur automatisch einfügen';
+$labels['newmessageonly'] = 'nur bei neuen Nachrichten';
+$labels['replyandforwardonly'] = 'nur bei Antworten und Weiterleitungen';
+$labels['replysignaturepos'] = 'Beim Antworten oder Weiterleiten die Signatur';
+$labels['belowquote'] = 'unter der Originalnachricht einfügen';
+$labels['abovequote'] = 'über der Originalnachricht einfügen';
+$labels['insertsignature'] = 'Signatur einfügen';
+$labels['previewpanemarkread'] = 'Nachricht in Vorschau als gelesen markieren';
+$labels['afternseconds'] = 'nach $n Sekuden';
+$labels['reqmdn'] = 'Empfangsbestätigung (MSN) immer anfordern';
+$labels['reqdsn'] = 'Übermittlungsbestätigung (DSN) immer anfordern';
+$labels['replysamefolder'] = 'Antworten im selben Ordner wie Original speichern';
 $labels['folder'] = 'Ordner';
 $labels['folders'] = 'Ordner';
 $labels['foldername'] = 'Ordnername';
@@ -265,11 +328,15 @@ $labels['subscribed'] = 'Abonniert';
 $labels['messagecount'] = 'Nachrichten';
 $labels['create'] = 'Erstellen';
 $labels['createfolder'] = 'Neuen Ordner erstellen';
-$labels['rename'] = 'Umbenennen';
-$labels['renamefolder'] = 'Ordner umbenennen';
-$labels['deletefolder'] = 'Ordner löschen';
 $labels['managefolders'] = 'Ordner verwalten';
 $labels['specialfolders'] = 'Spezialordner';
+$labels['properties'] = 'Eigenschaften';
+$labels['folderproperties'] = 'Ordnereigenschaften';
+$labels['parentfolder'] = 'Eltern';
+$labels['location'] = 'Speicherort';
+$labels['info'] = 'Informationen';
+$labels['getfoldersize'] = 'Ordnergrösse anzeigen';
+$labels['changesubscription'] = 'Abonnieren';
 $labels['sortby'] = 'Sortieren nach';
 $labels['sortasc'] = 'aufsteigend sortieren';
 $labels['sortdesc'] = 'absteigend sortieren';
@@ -277,5 +344,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Englisch';
+$labels['westerneuropean'] = 'Westeuropäisch';
+$labels['easterneuropean'] = 'Osteuropäisch';
+$labels['southeasterneuropean'] = 'Südosteuropäisch';
+$labels['baltic'] = 'Baltisch';
+$labels['cyrillic'] = 'Kyrillisch';
+$labels['arabic'] = 'Arabisch';
+$labels['greek'] = 'Griechisch';
+$labels['hebrew'] = 'Hebräisch';
+$labels['turkish'] = 'Türkisch';
+$labels['nordic'] = 'Skandinavisch';
+$labels['thai'] = 'Thailändisch';
+$labels['celtic'] = 'Keltisch';
+$labels['vietnamese'] = 'Vietnamesisch';
+$labels['japanese'] = 'Japanisch';
+$labels['korean'] = 'Koreanisch';
+$labels['chinese'] = 'Chinesisch';
 
 ?>
index 10deef7a38252527e35ba9409375fc66bfaabfbd..5839c410c29afef9d025cfbafdfd443f2d9c3418 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/de_CH/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Thomas Bruederli <roundcube@gmail.com>                        |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 3065 2009-10-27 16:08:00Z thomasb $
+@version $Id: messages.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -23,13 +23,14 @@ $messages['cookiesdisabled'] = 'Ihr Browser akzeptiert keine Cookies';
 $messages['sessionerror'] = 'Ihre Session ist ungültig oder abgelaufen';
 $messages['imaperror'] = 'Keine Verbindung zum IMAP Server';
 $messages['servererror'] = 'Serverfehler!';
+$messages['servererrormsg'] = 'Serverfehler: $msg';
 $messages['invalidrequest'] = 'Ungültige Anfrage! Es wurden keine Daten gespeichert.';
 $messages['nomessagesfound'] = 'Keine Nachrichten in diesem Ordner';
 $messages['loggedout'] = 'Sie haben Ihre Session erfolgreich beendet. Auf Wiedersehen!';
 $messages['mailboxempty'] = 'Ordner ist leer';
 $messages['loading'] = 'Daten werden geladen...';
-$messages['loadingdata'] = 'Daten werden geladen...';
 $messages['uploading'] = 'Datei wird hochgeladen...';
+$messages['loadingdata'] = 'Daten werden geladen...';
 $messages['checkingmail'] = 'Überprüfung auf neue Nachrichten...';
 $messages['sendingmessage'] = 'Nachricht wird gesendet...';
 $messages['messagesent'] = 'Nachricht erfolgreich gesendet';
@@ -47,20 +48,21 @@ $messages['senttooquickly'] = 'Bitte warten Sie $sec Sekunde(n) vor dem Senden d
 $messages['errorsavingsent'] = 'Ein Fehler ist beim Speichern der gesendeten Nachricht aufgetreten';
 $messages['errorsaving'] = 'Beim Speichern ist ein Fehler aufgetreten';
 $messages['errormoving'] = 'Nachricht konnte nicht verschoben werden';
+$messages['errorcopying'] = 'Konnte Nachrichten nicht kopieren';
 $messages['errordeleting'] = 'Nachricht konnte nicht gelöscht werden';
 $messages['errormarking'] = 'Nachricht konnte nicht markiert werden';
-$messages['deletecontactconfirm'] = 'Wollen Sie die ausgewählten Kontakte wirklich löschen';
+$messages['deletecontactconfirm'] = 'Wollen Sie die ausgewählten Kontakte wirklich löschen?';
 $messages['deletemessagesconfirm'] = 'Wollen Sie die ausgewählten Nachrichten wirklich löschen?';
 $messages['deletefolderconfirm'] = 'Wollen Sie diesen Ordner wirklich löschen?';
 $messages['purgefolderconfirm'] = 'Wollen Sie diesen Ordner wirklich leeren?';
-$messages['foldercreating'] = 'Erstelle Ordner...';
 $messages['folderdeleting'] = 'Lösche Ordner...';
-$messages['folderrenaming'] = 'Nenne Ordner um...';
 $messages['foldermoving'] = 'Verschiebe Ordner...';
+$messages['foldersubscribing'] = 'Abonniere Ordner...';
+$messages['folderunsubscribing'] = 'Ordner abbstellen...';
 $messages['formincomplete'] = 'Das Formular wurde nicht vollständig ausgefüllt';
 $messages['noemailwarning'] = 'Bitte geben Sie eine gültige E-Mail-Adresse ein';
 $messages['nonamewarning'] = 'Bitte geben Sie einen Namen ein';
-$messages['nopagesizewarning'] = 'Bitte geben Sie eine Einträge pro Seite ein';
+$messages['nopagesizewarning'] = 'Bitte geben Sie die Einträge pro Seite an';
 $messages['nosenderwarning'] = 'Bitte geben Sie die E-Mail-Adresse des Senders an';
 $messages['norecipientwarning'] = 'Bitte geben Sie mindestens einen Empfänger an';
 $messages['nosubjectwarning'] = 'Die Betreffzeile ist leer. Möchten Sie jetzt einen Betreff eingeben?';
@@ -71,11 +73,15 @@ $messages['nocontactsreturned'] = 'Es wurden keine Kontakte gefunden';
 $messages['nosearchname'] = 'Bitte geben Sie einen Namen oder eine E-Mail-Adresse ein';
 $messages['notuploadedwarning'] = 'Es wurden noch nicht alle Dateien hochgeladen. Bitte warten oder Upload abbrechen.';
 $messages['searchsuccessful'] = '$nr Nachrichten gefunden';
-$messages['searchnomatch'] = 'Keine Treffer';
+$messages['searchnomatch'] = 'Die Suche lieferte keine Treffer';
 $messages['searching'] = 'Suche...';
 $messages['checking'] = 'Prüfe...';
 $messages['nospellerrors'] = 'Keine Rechtschreibfehler gefunden';
 $messages['folderdeleted'] = 'Ordner erfolgreich gelöscht';
+$messages['foldersubscribed'] = 'Der Ordner wurde erfolgreich abonniert';
+$messages['folderunsubscribed'] = 'Der Ordner wurde erfolgreich abbestellt';
+$messages['folderpurged'] = 'Der Ordner wurde erfolgreich gelöscht';
+$messages['folderexpunged'] = 'Der Ordner wurde erfolgreich gepackt';
 $messages['deletedsuccessfully'] = 'Erfolgreich gelöscht';
 $messages['converting'] = 'Entferne Formatierungen...';
 $messages['messageopenerror'] = 'Die Nachricht konnte nicht vom Server geladen werden';
@@ -86,13 +92,17 @@ $messages['copyerror'] = 'Die Adressen konnten nicht kopiert werden';
 $messages['sourceisreadonly'] = 'Das Adressverzeichnis kann nicht verändert werden';
 $messages['errorsavingcontact'] = 'Die Änderungen konnten nicht gespeichert werden';
 $messages['movingmessage'] = 'Die E-Mail wird verschoben...';
-$messages['receiptsent'] = 'Bestätigung erfolgreich gesendet';
+$messages['copyingmessage'] = 'Kopiere Nachrichten...';
+$messages['deletingmessage'] = 'Lösche Nachricht(en)...';
+$messages['markingmessage'] = 'Markiere Nachricht(en)...';
+$messages['receiptsent'] = 'Lesebestätigung erfolgreich gesendet';
 $messages['errorsendingreceipt'] = 'Bestätigung konnte nicht gesendet werden';
-$messages['nodeletelastidentity'] = 'Sie können diesen Absender nicht löschen';
-$messages['addsubfolderhint'] = 'Wird als Unterdornder des aktuell selektieren Ordners erstellt';
+$messages['nodeletelastidentity'] = 'Diese Identität kann nicht gelöscht werden, da dies die letzte ist.';
 $messages['forbiddencharacter'] = 'Der Ordnername enthält ein ungültiges Zeichen';
 $messages['selectimportfile'] = 'Bitte wählen Sie eine Datei zum Importieren aus';
 $messages['addresswriterror'] = 'Das gewählte Adressbuch kann nicht verändert werden';
+$messages['contactaddedtogroup'] = 'Kontakte wurden dieser Gruppe hinzugefügt';
+$messages['contactremovedfromgroup'] = 'Kontakte wurden aus dieser Gruppe entfernt';
 $messages['importwait'] = 'Daten werden importiert, bitte warten...';
 $messages['importerror'] = 'Import fehlgeschlagen! Die hochgeladene Datei ist nicht im vCard-Format.';
 $messages['importconfirm'] = '<b>Es wurden $inserted Adressen erfolgreich importiert und $skipped bestehende Einträge übersprungen</b>:<p><em>$names</em></p>';
@@ -102,10 +112,30 @@ $messages['editorwarning'] = 'Beim Wechseln in den Texteditor gehen alle Textfor
 $messages['httpreceivedencrypterror'] = 'Ein gravierender Konfigurationsfehler ist aufgetreten. Kontaktieren Sie den Server-Administrator. <b>Die Nachricht wurde nicht gesendet!</b>';
 $messages['smtpconnerror'] = 'SMTP Fehler ($code): Die Verbindung ist fehlgeschlagen';
 $messages['smtpautherror'] = 'SMTP Fehler ($code): Die Authentisierung ist fehlgeschlagen';
-$messages['smtpfromerror'] = 'SMTP Fehler ($code): Der Absender ("$from") konnte nicht gesetzt werden';
-$messages['smtptoerror'] = 'SMTP Fehler ($code): Der Empfänger ("$to") konnte nicht gesetzt werden';
+$messages['smtpfromerror'] = 'SMTP Fehler ($code): Der Absender "$from" konnte nicht gesetzt werden ($msg)';
+$messages['smtptoerror'] = 'SMTP Fehler ($code): Der Empfänger "$to" konnte nicht gesetzt werden ($msg)';
 $messages['smtprecipientserror'] = 'SMTP Fehler: Die Empfängerliste konnte nicht verarbeitet werden';
+$messages['smtpdsnerror'] = 'SMTP-Fehler: Empfangsbestätigung werden nicht unterstützt';
 $messages['smtperror'] = 'SMTP Fehler: $msg';
 $messages['emailformaterror'] = 'Ungültige E-Mail-Adresse: $email';
+$messages['toomanyrecipients'] = 'Zuviele Empfänger angegeben. Reduzieren Sie die Empfängeradressen auf $max.';
+$messages['maxgroupmembersreached'] = 'Die Anzahl Adressen in dieser Gruppe überschreitet das Maximum von $max';
+$messages['internalerror'] = 'Ein interner Fehler ist aufgetreten. Bitte versuchen Sie den Vorgang erneut.';
+$messages['contactdelerror'] = 'Fehler beim Löschen';
+$messages['contactdeleted'] = 'Kontakt(e) erfolgreich gelöscht';
+$messages['groupdeleted'] = 'Gruppe erfolgreich gelöscht';
+$messages['grouprenamed'] = 'Gruppe erlogreich umbenannt';
+$messages['groupcreated'] = 'Gruppe erlogreich erstellt';
+$messages['messagedeleted'] = 'Nachricht(en) erfolgreich gelöscht';
+$messages['messagemoved'] = 'Nachricht(en) erfolgreich verschoben';
+$messages['messagecopied'] = 'Nachricht(en) erfolgreich kopiert';
+$messages['messagemarked'] = 'Nachricht(en) erfolgreich markiert';
+$messages['autocompletechars'] = 'Geben Sie mind. $min Zeichen für die Auto-Vervollständigung ein';
+$messages['namecannotbeempty'] = 'Der Name darf nicht leer sein';
+$messages['nametoolong'] = 'Der Name ist zu lang';
+$messages['folderupdated'] = 'Der Ordner wurde erfolgreich aktualisiert';
+$messages['foldercreated'] = 'Der Ordner wurde erfolgreich erstellt';
+$messages['errorreadonly'] = 'Die Aktion nicht ausgeführt werden. Der Ordner ist schreibgeschützt.';
+$messages['errornoperm'] = 'Die Aktion nicht ausgeführt werden. Zugriff verweigert.';
 
 ?>
index 0a5b25a131167d9b052bbf2f6bec900511809d8e..86483d86441f49a1d29f2f256e2c49ebc8d33069 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/de_DE/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Marcel Schlesinger <info@marcel-schlesinger.de>               |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 3065 2009-10-27 16:08:00Z thomasb $
+@version $Id: labels.inc 4346 2010-12-17 14:36:47Z thomasb $
 
 */
 
@@ -38,21 +38,25 @@ $labels['to'] = 'Empfänger';
 $labels['cc'] = 'Kopie';
 $labels['bcc'] = 'Blindkopie';
 $labels['replyto'] = 'Antwort an';
+$labels['followupto'] = 'Followup-To';
 $labels['date'] = 'Datum';
 $labels['size'] = 'Größe';
 $labels['priority'] = 'Priorität';
 $labels['organization'] = 'Organisation';
+$labels['readstatus'] = 'Gelesen/Ungelesen';
 $labels['reply-to'] = 'Antwort an';
+$labels['mail-reply-to'] = 'Mail-Reply-To';
+$labels['mail-followup-to'] = 'Mail-Followup-To';
 $labels['mailboxlist'] = 'Ordner';
 $labels['messagesfromto'] = 'Nachrichten $from bis $to von $count';
+$labels['threadsfromto'] = 'Konversationen $from bis $to von $count';
 $labels['messagenrof'] = 'Nachricht $nr von $count';
+$labels['copy'] = 'Kopieren';
+$labels['move'] = 'Verschieben';
 $labels['moveto'] = 'Verschieben nach...';
 $labels['download'] = 'Download';
 $labels['filename'] = 'Dateiname';
 $labels['filesize'] = 'Dateigröße';
-$labels['preferhtml'] = 'HTML anzeigen';
-$labels['htmlmessage'] = 'HTML-Nachricht';
-$labels['prettydate'] = 'Kurze Datumsanzeige';
 $labels['addtoaddressbook'] = 'Ins Adressbuch übernehmen';
 $labels['sun'] = 'So';
 $labels['mon'] = 'Mo';
@@ -97,6 +101,8 @@ $labels['checkmail'] = 'Auf neue Nachrichten überprüfen';
 $labels['writenewmessage'] = 'Neue Nachricht schreiben';
 $labels['replytomessage'] = 'Antwort verfassen';
 $labels['replytoallmessage'] = 'Antwort an Absender und alle Empfänger verfassen';
+$labels['replyall'] = 'Allen antworten';
+$labels['replylist'] = 'Liste antworten';
 $labels['forwardmessage'] = 'Nachricht weiterleiten';
 $labels['deletemessage'] = 'Nachricht löschen';
 $labels['movemessagetotrash'] = 'Nachricht in den Papierkorb verschieben';
@@ -120,12 +126,35 @@ $labels['messageactions'] = 'Weitere Aktionen...';
 $labels['select'] = 'Auswählen';
 $labels['all'] = 'Alle';
 $labels['none'] = 'Keine';
+$labels['currpage'] = 'Aktuelle Seite';
 $labels['unread'] = 'Ungelesene';
 $labels['flagged'] = 'Markierte';
 $labels['unanswered'] = 'Unbeantwortete';
 $labels['deleted'] = 'Gelöschte';
 $labels['invert'] = 'Invertieren';
 $labels['filter'] = 'Filter';
+$labels['list'] = 'Liste';
+$labels['threads'] = 'Konversationen';
+$labels['expand-all'] = 'Alle aufklappen';
+$labels['expand-unread'] = 'Ungelesene aufklappen';
+$labels['collapse-all'] = 'Alle zuklappen';
+$labels['threaded'] = 'Gruppiert';
+$labels['autoexpand_threads'] = 'Konversationen aufklappen';
+$labels['do_expand'] = 'alle';
+$labels['expand_only_unread'] = 'nur ungelesene';
+$labels['fromto'] = 'Sender/Empfänger';
+$labels['flag'] = 'Markierung';
+$labels['attachment'] = 'Anhang';
+$labels['nonesort'] = 'Keine';
+$labels['sentdate'] = 'Sendedatum';
+$labels['arrival'] = 'Empfangsdatum';
+$labels['asc'] = 'aufsteigend';
+$labels['desc'] = 'absteigend';
+$labels['listcolumns'] = 'Spalten';
+$labels['listsorting'] = 'Sortierung';
+$labels['listorder'] = 'Ordnung';
+$labels['listmode'] = 'Anzeigemodus';
+$labels['folderactions'] = 'Ordneraktionen...';
 $labels['compact'] = 'Packen';
 $labels['empty'] = 'Leeren';
 $labels['purge'] = 'Bereinigen';
@@ -145,13 +174,16 @@ $labels['sendmessage'] = 'Nachricht jetzt senden';
 $labels['addattachment'] = 'Datei anfügen';
 $labels['charset'] = 'Zeichensatz';
 $labels['editortype'] = 'Editor Typ';
-$labels['returnreceipt'] = 'Empfangsbestätigung';
+$labels['returnreceipt'] = 'Empfangsbestätigung (MSN)';
+$labels['dsn'] = 'Übermittlungsbestätigung (DSN)';
+$labels['editidents'] = 'Absender ändern';
 $labels['checkspelling'] = 'Rechtschreibung prüfen';
 $labels['resumeediting'] = 'Bearbeitung fortsetzen';
 $labels['revertto'] = 'Zurück zu';
 $labels['attachments'] = 'Anhänge';
 $labels['upload'] = 'Hochladen';
 $labels['close'] = 'Schließen';
+$labels['messageoptions'] = 'Optionen...';
 $labels['low'] = 'Niedrig';
 $labels['lowest'] = 'Niedrigste';
 $labels['normal'] = 'Normal';
@@ -168,6 +200,7 @@ $labels['maxuploadsize'] = 'Maximal erlaubte Dateigröße ist $size';
 $labels['addcc'] = 'Cc hinzufügen';
 $labels['addbcc'] = 'Bcc hinzufügen';
 $labels['addreplyto'] = 'Antwortadresse hinzufügen';
+$labels['addfollowupto'] = 'Followup-To hinzufügen';
 $labels['mdnrequest'] = 'Der Sender dieser Nachricht möchte gerne eine Lesebestätigung. Wollen Sie dieses bestätigen?';
 $labels['receiptread'] = 'Empfangsbestätigung (gelesen)';
 $labels['yourmessage'] = 'Dies ist eine Empfangsbestätigung für Ihre Nachricht';
@@ -178,6 +211,8 @@ $labels['surname'] = 'Nachname';
 $labels['email'] = 'E-Mail';
 $labels['addcontact'] = 'Kontakt hinzufügen';
 $labels['editcontact'] = 'Kontakt bearbeiten';
+$labels['contacts'] = 'Kontakte';
+$labels['contactproperties'] = 'Kontaktdaten';
 $labels['edit'] = 'Bearbeiten';
 $labels['cancel'] = 'Abbrechen';
 $labels['save'] = 'Speichern';
@@ -189,10 +224,13 @@ $labels['contactsfromto'] = 'Kontakte $from bis $to von $count';
 $labels['print'] = 'Drucken';
 $labels['export'] = 'Exportieren';
 $labels['exportvcards'] = 'Kontakte im vCard-Format exportieren';
+$labels['newcontactgroup'] = 'Neue Kontaktgruppen erstellen';
+$labels['groupactions'] = 'Aktionen für Kontaktgruppen...';
 $labels['previouspage'] = 'Seite zurück';
 $labels['firstpage'] = 'Erste Seite';
 $labels['nextpage'] = 'Nächste Seite';
 $labels['lastpage'] = 'Letzte Seite';
+$labels['group'] = 'Gruppe';
 $labels['groups'] = 'Gruppen';
 $labels['personaladrbook'] = 'Persönliches Adressbuch';
 $labels['import'] = 'Importieren';
@@ -210,6 +248,10 @@ $labels['manageidentities'] = 'Absender für dieses Konto verwalten';
 $labels['newidentity'] = 'Neuer Absender';
 $labels['newitem'] = 'Neuer Eintrag';
 $labels['edititem'] = 'Eintrag bearbeiten';
+$labels['preferhtml'] = 'HTML anzeigen';
+$labels['defaultcharset'] = 'Standard Zeichensatz';
+$labels['htmlmessage'] = 'HTML-Nachricht';
+$labels['prettydate'] = 'Kurze Datumsanzeige';
 $labels['setdefault'] = 'Als Standard';
 $labels['autodetect'] = 'Automatisch';
 $labels['language'] = 'Sprache';
@@ -218,6 +260,7 @@ $labels['pagesize'] = 'Einträge pro Seite';
 $labels['signature'] = 'Signatur';
 $labels['dstactive'] = 'Sommerzeit';
 $labels['htmleditor'] = 'HTML-Nachrichten verfassen';
+$labels['htmlonreply'] = 'nur Antworten auf HTML-Nachrichten';
 $labels['htmlsignature'] = 'HTML-Signatur';
 $labels['previewpane'] = 'Nachrichtenvorschau anzeigen';
 $labels['skin'] = 'Oberflächendesign';
@@ -226,13 +269,16 @@ $labels['logoutcompact'] = 'Posteingang beim Abmelden packen';
 $labels['uisettings'] = 'Benutzeroberfläche';
 $labels['serversettings'] = 'Server-Einstellungen';
 $labels['mailboxview'] = 'Mailbox-Ansicht';
-$labels['mdnrequests'] = 'Lesebestätigung senden';
+$labels['mdnrequests'] = 'Empfangsbestätigung senden';
 $labels['askuser'] = 'immer fragen';
-$labels['autosend'] = 'automatisch senden';
+$labels['autosend'] = 'Lesebestätigung automatisch senden';
+$labels['autosendknown'] = 'Lesebestätigung nur an meine Kontakte senden';
+$labels['autosendknownignore'] = 'für bekannte Absender, sonst ignorieren';
 $labels['ignore'] = 'ignorieren';
 $labels['readwhendeleted'] = 'Beim Löschen als gelesen markieren';
 $labels['flagfordeletion'] = 'Als gelöscht markieren anstatt in den Papierkorb verschieben';
 $labels['skipdeleted'] = 'Zeige keine gelöschten Nachrichten an';
+$labels['deletealways'] = 'Wenn verschieben in den Papierkorb fehlschlägt, Nachricht löschen';
 $labels['showremoteimages'] = 'Eingebettete Bilder vom Internet laden';
 $labels['fromknownsenders'] = 'bei bekannten Absendern';
 $labels['always'] = 'immer';
@@ -241,22 +287,40 @@ $labels['autosavedraft'] = 'Entwurf automatisch speichern';
 $labels['everynminutes'] = '$n Minute(n)';
 $labels['keepalive'] = 'Auf neue Nachrichten prüfen nach';
 $labels['never'] = 'nie';
+$labels['immediately'] = 'sofort';
 $labels['messagesdisplaying'] = 'Nachrichtendarstellung';
 $labels['messagescomposition'] = 'Nachrichtenerstellung';
 $labels['mimeparamfolding'] = 'Namen der Dateianhänge';
 $labels['2231folding'] = 'Vollständig RFC 2231 kompatibel (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 kompatibel (Microsoft Outlook)';
 $labels['2047folding'] = 'Vollständig RFC 2047 kompatibel (andere)';
+$labels['force7bit'] = 'MIME-Kodierung für 8-bit Zeichen';
 $labels['advancedoptions'] = 'Erweiterte Einstellungen';
 $labels['focusonnewmessage'] = 'Fokussiere Browserfenster bei neuen Nachrichten';
 $labels['checkallfolders'] = 'Alle Ordner auf neue Nachrichten prüfen';
 $labels['displaynext'] = 'Zeige nächste Nachricht nach verschieben/löschen';
-$labels['indexsort'] = 'Benutze Index für Sortierung nach Datum (schneller)';
 $labels['mainoptions'] = 'Allgemein';
 $labels['section'] = 'Bereich';
 $labels['maintenance'] = 'Wartung';
 $labels['newmessage'] = 'Neue Nachrichten';
 $labels['listoptions'] = 'Listendarstellung';
+$labels['signatureoptions'] = 'Signatur';
+$labels['whenreplying'] = 'Beantworten einer Nachricht';
+$labels['replytopposting'] = 'Antwort über der Originalnachricht';
+$labels['replybottomposting'] = 'Antwort unter der Originalnachricht';
+$labels['replyremovesignature'] = 'Beim Antworten Signatur der Originalnachricht entfernen';
+$labels['autoaddsignature'] = 'Signatur automatisch einfügen';
+$labels['newmessageonly'] = 'nur bei neuen Nachrichten';
+$labels['replyandforwardonly'] = 'nur bei Antworten und Weiterleitungen';
+$labels['replysignaturepos'] = 'Beim Antworten die Signatur';
+$labels['belowquote'] = 'unter der Originalnachricht einfügen';
+$labels['abovequote'] = 'über der Originalnachricht einfügen';
+$labels['insertsignature'] = 'Signatur einfügen';
+$labels['previewpanemarkread'] = 'Nachricht in Vorschau als gelesen markieren';
+$labels['afternseconds'] = 'nach $n Sekuden';
+$labels['reqmdn'] = 'Empfangsbestätigung (MSN) immer anfordern';
+$labels['reqdsn'] = 'Übermittlungsbestätigung (DSN) immer anfordern';
+$labels['replysamefolder'] = 'Antworten im selben Ordner wie Original speichern';
 $labels['folder'] = 'Ordner';
 $labels['folders'] = 'Ordner';
 $labels['foldername'] = 'Ordnername';
@@ -264,11 +328,15 @@ $labels['subscribed'] = 'Abonniert';
 $labels['messagecount'] = 'Nachrichten';
 $labels['create'] = 'Erstellen';
 $labels['createfolder'] = 'Neuen Ordner erstellen';
-$labels['rename'] = 'Umbenennen';
-$labels['renamefolder'] = 'Ordner umbenennen';
-$labels['deletefolder'] = 'Ordner löschen';
 $labels['managefolders'] = 'Ordner verwalten';
 $labels['specialfolders'] = 'Spezialordner';
+$labels['properties'] = 'Eigenschaften';
+$labels['folderproperties'] = 'Ordnereigenschaften';
+$labels['parentfolder'] = 'Eltern';
+$labels['location'] = 'Speicherort';
+$labels['info'] = 'Informationen';
+$labels['getfoldersize'] = 'Ordnergröße anzeigen';
+$labels['changesubscription'] = 'Abonnieren';
 $labels['sortby'] = 'Sortieren nach';
 $labels['sortasc'] = 'Aufsteigend sortieren';
 $labels['sortdesc'] = 'Absteigend sortieren';
@@ -276,5 +344,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Englisch';
+$labels['westerneuropean'] = 'West Europäisch';
+$labels['easterneuropean'] = 'Ost Europäisch';
+$labels['southeasterneuropean'] = 'Süd-Ost Europäisch';
+$labels['baltic'] = 'Baltisch';
+$labels['cyrillic'] = 'Kyrillisch';
+$labels['arabic'] = 'Arabisch';
+$labels['greek'] = 'Griechisch';
+$labels['hebrew'] = 'Hebräisch';
+$labels['turkish'] = 'Türkisch';
+$labels['nordic'] = 'Nordisch';
+$labels['thai'] = 'Thailändisch';
+$labels['celtic'] = 'Keltisch';
+$labels['vietnamese'] = 'Vietnamesisch';
+$labels['japanese'] = 'Japanisch';
+$labels['korean'] = 'Koreanisch';
+$labels['chinese'] = 'Chinesisch';
 
 ?>
index 05d3905a3246d3879aa71f5d44bcff6ac5ebd1a0..5ba65be6ddc51dccea460391b1d90bfcd5a536fd 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/de_DE/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Marcel Schlesinger <info@marcel-schlesinger.de>               |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 3065 2009-10-27 16:08:00Z thomasb $
+@version $Id: messages.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -23,13 +23,14 @@ $messages['cookiesdisabled'] = 'Ihr Browser akzeptiert keine Cookies';
 $messages['sessionerror'] = 'Ihre Session ist ungültig oder abgelaufen';
 $messages['imaperror'] = 'Keine Verbindung zum IMAP-Server';
 $messages['servererror'] = 'Serverfehler!';
+$messages['servererrormsg'] = 'Serverfehler: $msg';
 $messages['invalidrequest'] = 'Ungültige Anfrage! Es wurden keine Daten gespeichert.';
 $messages['nomessagesfound'] = 'Keine Nachrichten in diesem Ordner';
 $messages['loggedout'] = 'Sie haben Ihre Session erfolgreich beendet. Auf Wiedersehen!';
 $messages['mailboxempty'] = 'Ordner ist leer';
 $messages['loading'] = 'Lade...';
-$messages['loadingdata'] = 'Daten werden geladen...';
 $messages['uploading'] = 'Datei wird hochgeladen...';
+$messages['loadingdata'] = 'Daten werden geladen...';
 $messages['checkingmail'] = 'Überprüfung auf neue Nachrichten...';
 $messages['sendingmessage'] = 'Nachricht wird gesendet...';
 $messages['messagesent'] = 'Nachricht erfolgreich gesendet';
@@ -47,16 +48,17 @@ $messages['senttooquickly'] = 'Bitte warten Sie $sec Sekunde(n) vor dem Senden d
 $messages['errorsavingsent'] = 'Ein Fehler ist beim Speichern der gesendeten Nachricht aufgetreten';
 $messages['errorsaving'] = 'Beim Speichern ist ein Fehler aufgetreten';
 $messages['errormoving'] = 'Nachricht konnte nicht verschoben werden';
+$messages['errorcopying'] = 'Konnte Nachrichten nicht kopieren';
 $messages['errordeleting'] = 'Nachricht konnte nicht gelöscht werden';
 $messages['errormarking'] = 'Nachricht konnte nicht markiert werden';
 $messages['deletecontactconfirm'] = 'Wollen Sie die ausgewählten Kontakte wirklich löschen?';
 $messages['deletemessagesconfirm'] = 'Wollen Sie die ausgewählten Nachrichten wirklich löschen?';
 $messages['deletefolderconfirm'] = 'Wollen Sie diesen Ordner wirklich löschen?';
 $messages['purgefolderconfirm'] = 'Wollen Sie diesen Ordner wirklich leeren?';
-$messages['foldercreating'] = 'Erstelle Ordner...';
 $messages['folderdeleting'] = 'Lösche Ordner...';
-$messages['folderrenaming'] = 'Nenne Ordner um...';
 $messages['foldermoving'] = 'Verschiebe Ordner...';
+$messages['foldersubscribing'] = 'Abonniere Ordner...';
+$messages['folderunsubscribing'] = 'Ordner abbstellen...';
 $messages['formincomplete'] = 'Das Formular wurde nicht vollständig ausgefüllt';
 $messages['noemailwarning'] = 'Bitte geben Sie eine gültige E-Mail-Adresse ein';
 $messages['nonamewarning'] = 'Bitte geben Sie einen Namen ein';
@@ -76,6 +78,10 @@ $messages['searching'] = 'Suche...';
 $messages['checking'] = 'Prüfe...';
 $messages['nospellerrors'] = 'Keine Rechtschreibfehler gefunden';
 $messages['folderdeleted'] = 'Ordner erfolgreich gelöscht';
+$messages['foldersubscribed'] = 'Der Ordner wurde erfolgreich abonniert';
+$messages['folderunsubscribed'] = 'Der Ordner wurde erfolgreich abbestellt';
+$messages['folderpurged'] = 'Der Ordner wurde erfolgreich gelöscht';
+$messages['folderexpunged'] = 'Der Ordner wurde erfolgreich gepackt';
 $messages['deletedsuccessfully'] = 'Erfolgreich gelöscht';
 $messages['converting'] = 'Entferne Formatierungen der Nachricht...';
 $messages['messageopenerror'] = 'Die Nachricht konnte nicht vom Server geladen werden';
@@ -86,13 +92,17 @@ $messages['copyerror'] = 'Die Adressen konnten nicht kopiert werden';
 $messages['sourceisreadonly'] = 'Das Adressverzeichnis kann nicht verändert werden';
 $messages['errorsavingcontact'] = 'Die Änderungen konnten nicht gespeichert werden';
 $messages['movingmessage'] = 'Die E-Mail wird verschoben...';
+$messages['copyingmessage'] = 'Kopiere Nachrichten...';
+$messages['deletingmessage'] = 'Lösche Nachricht(en)...';
+$messages['markingmessage'] = 'Markiere Nachricht(en)...';
 $messages['receiptsent'] = 'Lesebestätigung erfolgreich gesendet';
 $messages['errorsendingreceipt'] = 'Bestätigung konnte nicht gesendet werden';
 $messages['nodeletelastidentity'] = 'Diese Identität kann nicht gelöscht werden, da dies die letzte ist.';
-$messages['addsubfolderhint'] = 'Wird als Unterordner des aktuell selektieren Ordners erstellt';
 $messages['forbiddencharacter'] = 'Der Ordnername enthält ein ungültiges Zeichen';
 $messages['selectimportfile'] = 'Bitte wählen Sie eine Datei zum Importieren aus';
 $messages['addresswriterror'] = 'Das ausgewählte Adressbuch kann nicht verändert werden';
+$messages['contactaddedtogroup'] = 'Kontakte wurden dieser Gruppe hinzugefügt';
+$messages['contactremovedfromgroup'] = 'Kontakte wurden aus dieser Gruppe entfernt';
 $messages['importwait'] = 'Daten werden importiert, bitte warten...';
 $messages['importerror'] = 'Import fehlgeschlagen! Die hochgeladene Datei ist nicht im vCard-Format.';
 $messages['importconfirm'] = '<b>Es wurden $inserted Adressen erfolgreich importiert und $skipped bestehende Einträge übersprungen</b>:<p><em>$names</em></p>';
@@ -102,10 +112,30 @@ $messages['editorwarning'] = 'Beim Wechseln in den Texteditor gehen alle Textfor
 $messages['httpreceivedencrypterror'] = 'Ein fataler Konfigurationsfehler ist aufgetreten. Kontaktieren Sie bitte sofort Ihren Administrator. <b>Ihre Nachricht konnte nicht versendet werden.</b>';
 $messages['smtpconnerror'] = 'SMTP Fehler ($code): Die Verbindung ist fehlgeschlagen';
 $messages['smtpautherror'] = 'SMTP Fehler ($code): Die Authentisierung ist fehlgeschlagen';
-$messages['smtpfromerror'] = 'SMTP Fehler ($code): Der Absender ("$from") konnte nicht gesetzt werden';
-$messages['smtptoerror'] = 'SMTP Fehler ($code): Der Empfänger ("$to") konnte nicht gesetzt werden';
+$messages['smtpfromerror'] = 'SMTP Fehler ($code): Der Absender "$from" konnte nicht gesetzt werden ($msg)';
+$messages['smtptoerror'] = 'SMTP Fehler ($code): Der Empfänger "$to" konnte nicht gesetzt werden ($msg)';
 $messages['smtprecipientserror'] = 'SMTP Fehler: Die Empfängerliste konnte nicht verarbeitet werden';
+$messages['smtpdsnerror'] = 'SMTP-Fehler: Empfangsbestätigung werden nicht unterstützt';
 $messages['smtperror'] = 'SMTP Fehler: $msg';
 $messages['emailformaterror'] = 'Ungültige E-Mail-Adresse: $email';
+$messages['toomanyrecipients'] = 'Zuviele Empfänger. Reduzieren Sie die Anzahl Empfängeradressen auf $max.';
+$messages['maxgroupmembersreached'] = 'Die Anzahl Adressen in dieser Gruppe überschreitet das Maximum von $max';
+$messages['internalerror'] = 'Ein interner Fehler ist aufgetreten. Bitte versuchen Sie den Vorgang erneut.';
+$messages['contactdelerror'] = 'Fehler beim Löschen';
+$messages['contactdeleted'] = 'Kontakt(e) erfolgreich gelöscht';
+$messages['groupdeleted'] = 'Gruppe erfolgreich gelöscht';
+$messages['grouprenamed'] = 'Gruppe erlogreich umbenannt';
+$messages['groupcreated'] = 'Gruppe erlogreich erstellt';
+$messages['messagedeleted'] = 'Nachricht(en) erfolgreich gelöscht';
+$messages['messagemoved'] = 'Nachricht(en) erfolgreich verschoben';
+$messages['messagecopied'] = 'Nachricht(en) erfolgreich kopiert';
+$messages['messagemarked'] = 'Nachricht(en) erfolgreich markiert';
+$messages['autocompletechars'] = 'Geben Sie mind. $min Zeichen für die Auto-Vervollständigung ein';
+$messages['namecannotbeempty'] = 'Der Name darf nicht leer sein';
+$messages['nametoolong'] = 'Der Name ist zu lang';
+$messages['folderupdated'] = 'Der Ordner wurde erfolgreich aktualisiert';
+$messages['foldercreated'] = 'Der Ordner wurde erfolgreich erstellt';
+$messages['errorreadonly'] = 'Die Aktion nicht ausgeführt werden. Der Ordner ist schreibgeschützt.';
+$messages['errornoperm'] = 'Die Aktion nicht ausgeführt werden. Zugriff verweigert.';
 
 ?>
index f86318406dc89db9e1424db1330feca503b74644..de4fa81d2af8237ec6745da7765de24f331d1c32 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/el/labels.inc                                                |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 |         John Economou <hsoc@irc.gr>                                   |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 3075 2009-10-28 18:37:59Z yllar $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -211,7 +211,7 @@ $labels['signature'] = 'Υπογραφή';
 $labels['dstactive'] = 'Daylight savings';
 $labels['htmleditor'] = 'Σύνθεση HTML μηνύματος';
 $labels['htmlsignature'] = 'Υπογραφή HTML';
-$labels['previewpane'] = 'Εμφάνιση προηγούμενου παραθύρου';
+$labels['previewpane'] = 'Εμφάνιση παραθύρου προεπισκόπησης';
 $labels['skin'] = 'Θεματική παραλλαγή';
 $labels['logoutclear'] = 'Άδειασμα κάδου στην έξοδο';
 $labels['logoutcompact'] = 'Συμπίεση εισερχομένων στην έξοδο';
@@ -238,9 +238,6 @@ $labels['subscribed'] = 'Εγγραφή';
 $labels['messagecount'] = 'Μηνύματα';
 $labels['create'] = 'Δημιουργία';
 $labels['createfolder'] = 'Δημιουργία νέου φακέλου';
-$labels['rename'] = 'Μετονομασία';
-$labels['renamefolder'] = 'Μετονομασία φακέλου';
-$labels['deletefolder'] = 'Διαγραφή φακέλου';
 $labels['managefolders'] = 'Διαχείριση φακέλων';
 $labels['specialfolders'] = 'Ειδικοί Φάκελοι';
 $labels['sortby'] = 'Ταξινόμηση κατά';
index dea38eeb7da3262570fdfcd6ca5a7623fde48100..4686146087dc11dc7fa0ca70f6e5e659b198e736 100644 (file)
@@ -1,12 +1,10 @@
 <?php
-
 /*
-
 +-----------------------------------------------------------------------+
 | language/el/messages.inc                                              |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 |         John Economou <hsoc@irc.gr>                                   |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 3061 2009-10-26 21:42:58Z yllar $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
 $messages = array();
-$messages['loginfailed'] = 'Î\95ίÏ\83οδοÏ\82 Î\91πέτυχε';
+$messages['loginfailed'] = 'Î\95ίÏ\83οδοÏ\82 Î±πέτυχε';
 $messages['cookiesdisabled'] = 'Ο περιηγητής σας (browser) δεν αποδέχεται cookies';
-$messages['sessionerror'] = 'Î\97 Ï\83Ï\85νεδÏ\81ία Ï\83αÏ\82 ÎµÎ¯Î½Î±Î¹ Î¬ÎºÏ\85Ï\81η Î® Î­Ï\87ει Î»Î®Î¾Î·';
+$messages['sessionerror'] = 'Î\97 Ï\83Ï\85νεδÏ\81ία Ï\83αÏ\82 ÎµÎ¯Î½Î±Î¹ Î¬ÎºÏ\85Ï\81η Î® Î­Ï\87ει Î»Î®Î¾ÎµÎ¹';
 $messages['imaperror'] = 'Η σύνδεση με το διακομιστή IMAP απέτυχε';
+$messages['servererror'] = 'Σφάλμα του εξυπηρετητή!';
+$messages['invalidrequest'] = 'Λανθασμένο αίτημα! Δεν αποθηκεύτηκαν δεδομένα.';
 $messages['nomessagesfound'] = 'Δε βρέθηκαν μηνύματα σε αυτή τη θυρίδα';
 $messages['loggedout'] = 'Έχετε τερματίσει επιτυχώς τη συνεδρία. Αντίο!';
 $messages['mailboxempty'] = 'Η θυρίδα είναι άδεια';
 $messages['loading'] = 'Φόρτωση...';
+$messages['uploading'] = 'Το αρχείο φορτώνεται...';
 $messages['loadingdata'] = 'Φόρτωση δεδομένων...';
 $messages['checkingmail'] = 'Έλεγχος για νέα μηνύματα...';
 $messages['sendingmessage'] = 'Αποστολή μηνύματος...';
@@ -41,21 +42,23 @@ $messages['encryptedmessage'] = 'Αυτό το μήνυμα είναι κρυπ
 $messages['nocontactsfound'] = 'Δε βρέθηκαν επαφές';
 $messages['contactnotfound'] = 'Η ζητούμενη επαφή δεν βρέθηκε';
 $messages['sendingfailed'] = 'Αποστολή μηνύματος απέτυχε';
+$messages['senttooquickly'] = 'Παρακαλώ περιμένετε $sec δευτερόλεπτα, πριν στείλετε το μήνυμα';
+$messages['errorsavingsent'] = 'Παρουσιάστηκε σφάλμα, κατά την αποθήκευση του απεσταλμένου μηνύματος';
 $messages['errorsaving'] = 'Παρουσιάστηκε σφάλμα κατά την αποθήκευση';
 $messages['errormoving'] = 'Το μήνυμα δε μπορούσε να μετακινηθεί';
 $messages['errordeleting'] = 'Το μήνυμα δε μπορούσε να διαγραφεί';
+$messages['errormarking'] = 'Δεν έγινε επισήμανση στο μύνημα';
 $messages['deletecontactconfirm'] = 'Θέλετε να διαγράψετε τη συγκεκριμένη επαφή/ές;';
 $messages['deletemessagesconfirm'] = 'Θέλετε να διαγράψετε το συγκεκριμένο μήνυμα/τα;';
 $messages['deletefolderconfirm'] = 'Θέλετε να διαγράψετε το συγκεκριμένο φάκελο;';
 $messages['purgefolderconfirm'] = 'Θέλετε να διαγράψετε όλα τα μηνύματα στο συγκεκριμένο φάκελο;';
-$messages['foldercreating'] = 'Δημιουργία φακέλου';
 $messages['folderdeleting'] = 'Διαγραφή φακέλου';
-$messages['folderrenaming'] = 'Μετονομασία φακέλου';
 $messages['foldermoving'] = 'Μεταφορά φακέλου';
 $messages['formincomplete'] = 'Η φόρμα δεν έχει συμπληρωθεί πλήρως';
-$messages['noemailwarning'] = 'Παρακαλώ εισάγεται έγκυρη διεύθυνση email';
-$messages['nonamewarning'] = 'Παρακαλώ εισάγεται όνομα';
-$messages['nopagesizewarning'] = 'Παρακαλώ εισάγεται μέγεθος σελίδας';
+$messages['noemailwarning'] = 'Παρακαλώ εισάγετε έγκυρη διεύθυνση email';
+$messages['nonamewarning'] = 'Παρακαλώ εισάγετε όνομα';
+$messages['nopagesizewarning'] = 'Παρακαλώ εισάγετε μέγεθος σελίδας';
+$messages['nosenderwarning'] = 'Παρακαλώ εισάγετε την email διεύθυνση αποστολέα';
 $messages['norecipientwarning'] = 'Παρακαλώ εισάγεται τουλάχιστον έναν παραλήπτη';
 $messages['nosubjectwarning'] = 'Το πεδίο "Θέμα" είναι άδειο. Θέλετε να εισάγεται ένα τώρα;';
 $messages['nobodywarning'] = 'Αποστολή μηνύματος χωρίς κείμενο;';
@@ -63,26 +66,40 @@ $messages['notsentwarning'] = 'Το μήνυμα δεν έχει σταλεί. 
 $messages['noldapserver'] = 'Παρακαλώ επιλέξτε έναν LDAP διακομιστή για αναζήτηση';
 $messages['nocontactsreturned'] = 'Δε βρέθηκαν επαφές';
 $messages['nosearchname'] = 'Παρακαλώ εισάγεται όνομα επαφής ή διεύθυνση email';
+$messages['notuploadedwarning'] = 'Δεν έχουν φορτωθεί όλα τα συνημένα. Παρακαλώ περιμένετε ή ακυρώστε το ανέβασμα.';
 $messages['searchsuccessful'] = '$nr μηνύματα βρέθηκαν';
-$messages['searchnomatch'] = 'Î\97 Î\95Ï\8dÏ\81εση δεν επέστρεψε αποτελέσματα';
-$messages['searching'] = 'Î\95Ï\8dÏ\81εση...';
+$messages['searchnomatch'] = 'Î\97 Î±Î½Î±Î¶Î®Ï\84ηση δεν επέστρεψε αποτελέσματα';
+$messages['searching'] = 'Î\91ναζήÏ\84ηση...';
 $messages['checking'] = 'Έλεγχος...';
 $messages['nospellerrors'] = 'Δε βρέθηκαν ορθογραφικά λάθη';
 $messages['folderdeleted'] = 'Ο φάκελος διαγράφηκε επιτυχώς';
 $messages['deletedsuccessfully'] = 'Διαγραφή Επιτυχώς';
 $messages['converting'] = 'Μετακίνηση διαμορφώσεων κειμένου...';
-$messages['messageopenerror'] = 'Φόρτωση μηνυμάτων από τον διακομιστή απέτυχε';
+$messages['messageopenerror'] = 'Î\97 Ï\86όρτωση μηνυμάτων από τον διακομιστή απέτυχε';
 $messages['fileuploaderror'] = 'Ανέβασμα αρχείου απέτυχε';
 $messages['filesizeerror'] = 'Το ανεβασμένο αρχείο ξεπερνάει το μέγιστο μέγεθος των $size';
-$messages['copysuccess'] = 'Επιτυχή αντιγραφή $nr διευθύνσεων';
+$messages['copysuccess'] = 'Επιτυχής αντιγραφή $nr διευθύνσεων';
 $messages['copyerror'] = 'Αποτυχία αντιγραφής διευθύνσεων';
 $messages['sourceisreadonly'] = 'Η διεύθυνση έχει μόνο δικαίωμα ανάγνωσης';
-$messages['errorsavingcontact'] = 'ΣÏ\8eÏ\83ιμο επαφής απέτυχε';
+$messages['errorsavingcontact'] = 'Î\91Ï\80οθήκεÏ\85Ï\83η επαφής απέτυχε';
 $messages['movingmessage'] = 'Μετακίνηση μηνύματος...';
 $messages['receiptsent'] = 'Επιτυχής αποστολή αναφοράς ανάγνωσης';
 $messages['errorsendingreceipt'] = 'Αποστολή αναφοράς απέτυχε';
 $messages['nodeletelastidentity'] = 'Δε μπορείτε να διαγράψετε αυτήν την ταυτότητα, είναι η τελευταία.';
-$messages['addsubfolderhint'] = 'Αυτός ο φάκελος θα δημιουργηθεί ως υποφάκελος του επιλεγμένου';
+$messages['forbiddencharacter'] = 'Η ονομασία φακέλου περιέχει μη επιτρεπτό χαρακτήρα';
+$messages['selectimportfile'] = 'Επιλέξτε αρχείο για ανέβασμα';
+$messages['addresswriterror'] = 'Η επιλεγμένη ατζέντα διευθύνσεων δεν είνα εγγράψιμη';
 $messages['importwait'] = 'Εισαγωγή, παρακαλώ περιμένετε...';
+$messages['importerror'] = 'Η εισαγωγή απέτυχε! Το αρχείο δεν είναι έγκυρο vcard αρχείο.';
+$messages['opnotpermitted'] = 'Η λειτουργία δεν επιτρέπεται!';
+$messages['nofromaddress'] = 'Στην επιλεγμένη ταυτότητα, λείπει η email διεύθυνση';
+$messages['httpreceivedencrypterror'] = 'Ούπς! Ανεπανόθωτο σφάλμα. Επικοινωνήστε με το διαχειριστή του εξυπηρετητή. <b>Το μηνυμά σας δεν στάλθηκε.</b>';
+$messages['smtpconnerror'] = 'Σφάλμα SMTP ($code): Απέτυχε η σύνδεση με τον εξυπηρετητή';
+$messages['smtpautherror'] = 'Σφάλμα SMTP ($code): Σφάλμα ταυτοποίησης';
+$messages['smtpfromerror'] = 'Σφάλμα SMTP ($code): Αποτυχία ορισμού αποστολέα "$from" ($msg)';
+$messages['smtptoerror'] = 'Σφάλμα SMTP ($code): Αποτυχία προσθήκης παραλήπτη "$to" ($msg)';
+$messages['smtprecipientserror'] = 'Σφάλμα SMTP: Αδύνατο να προσπελαστεί η λίστα παραληπτών';
+$messages['smtperror'] = 'Σφάλμα SMTP: $msg';
+$messages['emailformaterror'] = 'Λανθασμένη διεύθνση email: $email';
 
-?>
\ No newline at end of file
+?>
index ff96e5e96c6ea2e219d2cded8e2f7cd7b68d4fb6..4a17aed1f56b5f5835476f65cd2c3f5d16f520dd 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/en_GB/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2616 2009-06-05 16:24:10Z alec $
+@version $Id: labels.inc 4376 2010-12-29 07:21:30Z alec $
 
 */
 
@@ -38,21 +38,22 @@ $labels['to'] = 'Recipient';
 $labels['cc'] = 'Copy';
 $labels['bcc'] = 'Bcc';
 $labels['replyto'] = 'Reply-To';
+$labels['followupto'] = 'Followup-To';
 $labels['date'] = 'Date';
 $labels['size'] = 'Size';
 $labels['priority'] = 'Priority';
 $labels['organization'] = 'Organisation';
-$labels['reply-to'] = 'Reply-To';
+$labels['readstatus'] = 'Read status';
 $labels['mailboxlist'] = 'Folders';
 $labels['messagesfromto'] = 'Messages $from to $to of $count';
+$labels['threadsfromto'] = 'Threads $from to $to of $count';
 $labels['messagenrof'] = 'Message $nr of $count';
+$labels['copy'] = 'Copy';
+$labels['move'] = 'Move';
 $labels['moveto'] = 'Move to...';
 $labels['download'] = 'Download';
 $labels['filename'] = 'File name';
 $labels['filesize'] = 'File size';
-$labels['preferhtml'] = 'Display HTML';
-$labels['htmlmessage'] = 'HTML Message';
-$labels['prettydate'] = 'Pretty dates';
 $labels['addtoaddressbook'] = 'Add to address book';
 $labels['sun'] = 'Sun';
 $labels['mon'] = 'Mon';
@@ -96,7 +97,9 @@ $labels['today'] = 'Today';
 $labels['checkmail'] = 'Check for new messages';
 $labels['writenewmessage'] = 'Create a new message';
 $labels['replytomessage'] = 'Reply to sender';
-$labels['replytoallmessage'] = 'Reply to sender and all recipients';
+$labels['replytoallmessage'] = 'Reply to list or to sender and all recipients';
+$labels['replyall']  = 'Reply all';
+$labels['replylist'] = 'Reply list';
 $labels['forwardmessage'] = 'Forward the message';
 $labels['deletemessage'] = 'Delete message';
 $labels['movemessagetotrash'] = 'Move message to "Deleted Items"';
@@ -116,40 +119,67 @@ $labels['markread'] = 'As read';
 $labels['markunread'] = 'As unread';
 $labels['markflagged'] = 'As flagged';
 $labels['markunflagged'] = 'As unflagged';
+$labels['messageactions'] = 'More actions...';
 $labels['select'] = 'Select';
 $labels['all'] = 'All';
 $labels['none'] = 'None';
+$labels['currpage'] = 'Current page';
 $labels['unread'] = 'Unread';
 $labels['flagged'] = 'Flagged';
 $labels['unanswered'] = 'Unanswered';
 $labels['deleted'] = 'Deleted';
 $labels['invert'] = 'Invert';
 $labels['filter'] = 'Filter';
+$labels['list'] = 'List';
+$labels['threads'] = 'Threads';
+$labels['expand-all'] = 'Expand All';
+$labels['expand-unread'] = 'Expand Unread';
+$labels['collapse-all'] = 'Collapse All';
+$labels['threaded'] = 'Threaded';
+$labels['autoexpand_threads'] = 'Expand message threads';
+$labels['do_expand'] = 'all threads';
+$labels['expand_only_unread'] = 'only with unread messages';
+$labels['fromto'] = 'Sender/Recipient';
+$labels['flag'] = 'Flag';
+$labels['attachment'] = 'Attachment';
+$labels['nonesort'] = 'None';
+$labels['sentdate'] = 'Sent date';
+$labels['arrival'] = 'Arrival date';
+$labels['asc'] = 'ascending';
+$labels['desc'] = 'descending';
+$labels['listcolumns'] = 'List columns';
+$labels['listsorting'] = 'Sorting column';
+$labels['listorder'] = 'Sorting order';
+$labels['listmode'] = 'List view mode';
+$labels['folderactions'] = 'Folder actions...';
 $labels['compact'] = 'Compact';
 $labels['empty'] = 'Empty';
-$labels['purge'] = 'Purge';
 $labels['quota'] = 'Disk usage';
 $labels['unknown'] = 'unknown';
 $labels['unlimited'] = 'unlimited';
 $labels['quicksearch'] = 'Quick search';
 $labels['resetsearch'] = 'Reset search';
-$labels['searchmod']  = 'Search modifiers';
-$labels['msgtext']  = 'Entire message';
+$labels['searchmod'] = 'Search modifiers';
+$labels['msgtext'] = 'Entire message';
 $labels['openinextwin'] = 'Open in new window';
-$labels['emlsave'] = 'Save (.eml)';
+$labels['emlsave'] = 'Download (.eml)';
 $labels['compose'] = 'Compose a message';
+$labels['editasnew'] = 'Edit as new';
 $labels['savemessage'] = 'Save this draft';
 $labels['sendmessage'] = 'Send now';
 $labels['addattachment'] = 'Attach a file';
 $labels['charset'] = 'Charset';
 $labels['editortype'] = 'Editor type';
 $labels['returnreceipt'] = 'Return receipt';
+$labels['dsn'] = 'Delivery status notification';
+$labels['editidents'] = 'Edit identities';
 $labels['checkspelling'] = 'Check spelling';
 $labels['resumeediting'] = 'Resume editing';
 $labels['revertto'] = 'Revert to';
 $labels['attachments'] = 'Attachments';
 $labels['upload'] = 'Upload';
 $labels['close'] = 'Close';
+$labels['messageoptions'] = 'Message options...';
 $labels['low'] = 'Low';
 $labels['lowest'] = 'Lowest';
 $labels['normal'] = 'Normal';
@@ -166,6 +196,7 @@ $labels['maxuploadsize'] = 'Maximum allowed file size is $size';
 $labels['addcc'] = 'Add Cc';
 $labels['addbcc'] = 'Add Bcc';
 $labels['addreplyto'] = 'Add Reply-To';
+$labels['addfollowupto'] = 'Add Followup-To';
 $labels['mdnrequest'] = 'The sender of this message has asked to be notified when you read this message. Do you wish to notify the sender?';
 $labels['receiptread'] = 'Return Receipt (read)';
 $labels['yourmessage'] = 'This is a Return Receipt for your message';
@@ -176,10 +207,13 @@ $labels['surname'] = 'Last name';
 $labels['email'] = 'E-Mail';
 $labels['addcontact'] = 'Add new contact';
 $labels['editcontact'] = 'Edit contact';
+$labels['contacts'] = 'Contacts';
+$labels['contactproperties'] = 'Contact properties';
 $labels['edit'] = 'Edit';
 $labels['cancel'] = 'Cancel';
 $labels['save'] = 'Save';
 $labels['delete'] = 'Delete';
+$labels['rename'] = 'Rename';
 $labels['newcontact'] = 'Create new contact card';
 $labels['deletecontact'] = 'Delete selected contacts';
 $labels['composeto'] = 'Compose mail to';
@@ -187,17 +221,20 @@ $labels['contactsfromto'] = 'Contacts $from to $to of $count';
 $labels['print'] = 'Print';
 $labels['export'] = 'Export';
 $labels['exportvcards'] = 'Export contacts in vCard format';
+$labels['newcontactgroup'] = 'Create new contact group';
+$labels['groupactions'] = 'Actions for contact groups...';
 $labels['previouspage'] = 'Show previous set';
 $labels['firstpage'] = 'Show first set';
 $labels['nextpage'] = 'Show next set';
 $labels['lastpage'] = 'Show last set';
+$labels['group'] = 'Group';
 $labels['groups'] = 'Groups';
 $labels['personaladrbook'] = 'Personal Addresses';
 $labels['import'] = 'Import';
 $labels['importcontacts'] = 'Import contacts';
 $labels['importfromfile'] = 'Import from file:';
 $labels['importreplace'] = 'Replace the entire address book';
-$labels['importtext'] = 'You can upload contacts from an existing address book. We currently support importing addresses from the vCard data format.';
+$labels['importtext'] = 'You can upload contacts from an existing address book.<br/>We currently support importing addresses from the <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> data format.';
 $labels['done'] = 'Done';
 $labels['settingsfor'] = 'Settings for';
 $labels['preferences'] = 'Preferences';
@@ -208,6 +245,10 @@ $labels['manageidentities'] = 'Manage identities for this account';
 $labels['newidentity'] = 'New identity';
 $labels['newitem'] = 'New item';
 $labels['edititem'] = 'Edit item';
+$labels['preferhtml'] = 'Display HTML';
+$labels['defaultcharset'] = 'Default Character Set';
+$labels['htmlmessage'] = 'HTML Message';
+$labels['prettydate'] = 'Pretty dates';
 $labels['setdefault'] = 'Set default';
 $labels['autodetect'] = 'Auto';
 $labels['language'] = 'Language';
@@ -216,6 +257,7 @@ $labels['pagesize'] = 'Rows per page';
 $labels['signature'] = 'Signature';
 $labels['dstactive'] = 'Summer time';
 $labels['htmleditor'] = 'Compose HTML messages';
+$labels['htmlonreply'] = 'on reply to HTML message only';
 $labels['htmlsignature'] = 'HTML signature';
 $labels['previewpane'] = 'Show preview pane';
 $labels['skin'] = 'Interface skin';
@@ -224,13 +266,16 @@ $labels['logoutcompact'] = 'Compact Inbox on logout';
 $labels['uisettings'] = 'User Interface';
 $labels['serversettings'] = 'Server Settings';
 $labels['mailboxview'] = 'Mailbox View';
-$labels['mdnrequests'] = 'Sender notifications';
-$labels['askuser'] = 'ask the user';
+$labels['mdnrequests'] = 'On request for return receipt';
+$labels['askuser'] = 'ask each time';
 $labels['autosend'] = 'send automatically';
+$labels['autosendknown'] = 'send receipt to my contacts, otherwise ask';
+$labels['autosendknownignore'] = 'send receipt to my contacts, otherwise ignore';
 $labels['ignore'] = 'ignore';
 $labels['readwhendeleted'] = 'Mark the message as read on delete';
 $labels['flagfordeletion'] = 'Flag the message for deletion instead of delete';
 $labels['skipdeleted'] = 'Do not show deleted messages';
+$labels['deletealways'] = 'If moving messages to "Deleted Items" fails, permanently delete them';
 $labels['showremoteimages'] = 'Display remote inline images';
 $labels['fromknownsenders'] = 'from known senders';
 $labels['always'] = 'always';
@@ -239,27 +284,56 @@ $labels['autosavedraft'] = 'Automatically save draft';
 $labels['everynminutes'] = 'every $n minute(s)';
 $labels['keepalive'] = 'Check for new messages on';
 $labels['never'] = 'never';
+$labels['immediately'] = 'immediately';
 $labels['messagesdisplaying'] = 'Displaying Messages';
 $labels['messagescomposition'] = 'Composing Messages';
 $labels['mimeparamfolding'] = 'Attachment names';
 $labels['2231folding'] = 'Full RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Full RFC 2047 (other)';
+$labels['force7bit'] = 'Use MIME encoding for 8-bit characters';
 $labels['advancedoptions'] = 'Advanced options';
 $labels['focusonnewmessage'] = 'Focus browser window on new message';
 $labels['checkallfolders'] = 'Check all folders for new messages';
+$labels['displaynext'] = 'After message delete/move display the next message';
+$labels['mainoptions'] = 'Main Options';
+$labels['section'] = 'Section';
+$labels['maintenance'] = 'Maintenance';
+$labels['newmessage'] = 'New Message';
+$labels['listoptions'] = 'List Options';
+$labels['signatureoptions'] = 'Signature Options';
+$labels['whenreplying'] = 'When replying';
+$labels['replytopposting'] = 'start new message above original';
+$labels['replybottomposting'] = 'start new message below original';
+$labels['replyremovesignature'] = 'When replying remove original signature from message';
+$labels['autoaddsignature'] = 'Automatically add signature';
+$labels['newmessageonly'] = 'new message only';
+$labels['replyandforwardonly'] = 'replies and forwards only';
+$labels['replysignaturepos'] = 'When replying or forwarding place signature';
+$labels['belowquote'] = 'below the quote';
+$labels['abovequote'] = 'above the quote';
+$labels['insertsignature'] = 'Insert signature';
+$labels['previewpanemarkread'] = 'Mark previewed messages as read';
+$labels['afternseconds'] = 'after $n seconds';
+$labels['reqmdn'] = 'Always request a return receipt';
+$labels['reqdsn'] = 'Always request a delivery status notification';
+$labels['replysamefolder'] = 'Place replies in the folder of the message being replied to';
 $labels['folder'] = 'Folder';
 $labels['folders'] = 'Folders';
 $labels['foldername'] = 'Folder name';
-$labels['subscribed'] = 'Subscribed';
+$labels['subscribed']  = 'Subscribed';
 $labels['messagecount'] = 'Messages';
 $labels['create'] = 'Create';
 $labels['createfolder'] = 'Create new folder';
-$labels['rename'] = 'Rename';
-$labels['renamefolder'] = 'Rename folder';
-$labels['deletefolder'] = 'Delete folder';
 $labels['managefolders'] = 'Manage folders';
 $labels['specialfolders'] = 'Special Folders';
+$labels['properties'] = 'Properties';
+$labels['folderproperties'] = 'Folder properties';
+$labels['parentfolder'] = 'Parent folder';
+$labels['location'] = 'Location';
+$labels['info'] = 'Information';
+$labels['getfoldersize'] = 'Click to get folder size';
+$labels['changesubscription'] = 'Click to change subscription';
 $labels['sortby'] = 'Sort by';
 $labels['sortasc'] = 'Sort ascending';
 $labels['sortdesc'] = 'Sort descending';
@@ -267,5 +341,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'English';
+$labels['westerneuropean'] = 'Western European';
+$labels['easterneuropean'] = 'Eastern European';
+$labels['southeasterneuropean'] = 'South-Eastern European';
+$labels['baltic'] = 'Baltic';
+$labels['cyrillic'] = 'Cyrillic';
+$labels['arabic'] = 'Arabic';
+$labels['greek'] = 'Greek';
+$labels['hebrew'] = 'Hebrew';
+$labels['turkish'] = 'Turkish';
+$labels['nordic'] = 'Nordic';
+$labels['thai'] = 'Thai';
+$labels['celtic'] = 'Celtic';
+$labels['vietnamese'] = 'Vietnamese';
+$labels['japanese'] = 'Japanese';
+$labels['korean'] = 'Korean';
+$labels['chinese'] = 'Chinese';
 
-?>
+?>
\ No newline at end of file
index 08de1aaac1b495c93da3808756e81a6ae6202a10..da727d0953de08cc68f8e3c7157d27c89fbc88cc 100644 (file)
@@ -2,18 +2,18 @@
 
 /*
 
- +-----------------------------------------------------------------------+
- | language/en_GB/messages.inc                                           |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
- +-----------------------------------------------------------------------+
++-----------------------------------------------------------------------+
+| language/en_GB/messages.inc                                           |
+|                                                                       |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Weiran Zhang (weiran@weiran.co.uk)                            |
++-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 2713 2009-07-06 09:13:10Z alec $
+@version $Id: messages.inc 4376 2010-12-29 07:21:30Z alec $
 
 */
 
@@ -23,10 +23,15 @@ $messages['cookiesdisabled'] = 'Your browser does not accept cookies';
 $messages['sessionerror'] = 'Your session is invalid or has expired';
 $messages['imaperror'] = 'Connection to IMAP server failed';
 $messages['servererror'] = 'Server Error!';
+$messages['servererrormsg'] = 'Server Error: $msg';
+$messages['errorreadonly'] = 'Unable to perform operation. Folder is read-only';
+$messages['errornoperm'] = 'Unable to perform operation. Permission denied';
+$messages['invalidrequest'] = 'Invalid request! No data was saved.';
 $messages['nomessagesfound'] = 'No messages found in this mailbox';
 $messages['loggedout'] = 'You have successfully terminated the session. Good bye!';
 $messages['mailboxempty'] = 'Mailbox is empty';
 $messages['loading'] = 'Loading...';
+$messages['uploading'] = 'Uploading file...';
 $messages['loadingdata'] = 'Loading data...';
 $messages['checkingmail'] = 'Checking for new messages...';
 $messages['sendingmessage'] = 'Sending message...';
@@ -44,17 +49,18 @@ $messages['sendingfailed'] = 'Failed to send message';
 $messages['senttooquickly'] = 'Please wait $sec sec(s). before sending this message';
 $messages['errorsavingsent'] = 'An error occurred while saving sent message';
 $messages['errorsaving'] = 'An error occurred while saving';
-$messages['errormoving'] = 'Could not move the message';
-$messages['errordeleting'] = 'Could not delete the message';
-$messages['errormarking'] = 'Could not mark the message';
+$messages['errormoving'] = 'Could not move the message(s)';
+$messages['errorcopying'] = 'Could not copy the message(s)';
+$messages['errordeleting'] = 'Could not delete the message(s)';
+$messages['errormarking'] = 'Could not mark the message(s)';
 $messages['deletecontactconfirm'] = 'Do you really want to delete the selected contact(s)?';
 $messages['deletemessagesconfirm'] = 'Do you really want to delete the selected message(s)?';
 $messages['deletefolderconfirm'] = 'Do you really want to delete this folder?';
 $messages['purgefolderconfirm'] = 'Do you really want to delete all messages in this folder?';
-$messages['foldercreating'] = 'Creating folder...';
 $messages['folderdeleting'] = 'Deleting folder...';
-$messages['folderrenaming'] = 'Renaming folder...';
 $messages['foldermoving'] = 'Moving folder...';
+$messages['foldersubscribing'] = 'Subscribing to folder...';
+$messages['folderunsubscribing'] = 'Unsubscribing from folder...';
 $messages['formincomplete'] = 'The form was not completely filled out';
 $messages['noemailwarning'] = 'Please enter a valid email address';
 $messages['nonamewarning'] = 'Please enter a name';
@@ -67,12 +73,17 @@ $messages['notsentwarning'] = 'Your message has not been sent. Do you want to di
 $messages['noldapserver'] = 'Please select an LDAP server to search';
 $messages['nocontactsreturned'] = 'No contacts were found';
 $messages['nosearchname'] = 'Please enter a contact name or email address';
+$messages['notuploadedwarning'] = 'Not all attachments have been uploaded yet. Please wait or cancel the upload.';
 $messages['searchsuccessful'] = '$nr messages found';
 $messages['searchnomatch'] = 'Search found no matches';
 $messages['searching'] = 'Searching...';
 $messages['checking'] = 'Checking...';
 $messages['nospellerrors'] = 'No spelling errors found';
-$messages['folderdeleted'] = 'Folder successfully deleted';
+$messages['folderdeleted'] = 'Successfully deleted folder';
+$messages['foldersubscribed'] = 'Successfully subscribed to folder';
+$messages['folderunsubscribed'] = 'Successfully unsubscribed from folder';
+$messages['folderpurged'] = 'Successfully emptied folder';
+$messages['folderexpunged'] = 'Successfully compacted folder';
 $messages['deletedsuccessfully'] = 'Successfully deleted';
 $messages['converting'] = 'Removing formatting...';
 $messages['messageopenerror'] = 'Could not load message from server';
@@ -80,16 +91,20 @@ $messages['fileuploaderror'] = 'File upload failed';
 $messages['filesizeerror'] = 'The uploaded file exceeds the maximum size of $size';
 $messages['copysuccess'] = 'Successfully copied $nr addresses';
 $messages['copyerror'] = 'Could not copy any addresses';
-$messages['sourceisreadonly'] = 'This address source is read-only';
+$messages['sourceisreadonly'] = 'This address book is read-only';
 $messages['errorsavingcontact'] = 'Could not save the contact address';
-$messages['movingmessage'] = 'Moving message...';
+$messages['movingmessage'] = 'Moving message(s)...';
+$messages['copyingmessage'] = 'Copying message(s)...';
+$messages['deletingmessage'] = 'Deleting message(s)...';
+$messages['markingmessage'] = 'Marking message(s)...';
 $messages['receiptsent'] = 'Successfully sent a read receipt';
 $messages['errorsendingreceipt'] = 'Could not send the receipt';
 $messages['nodeletelastidentity'] = 'You cannot delete this identity, it\'s your last one.';
-$messages['addsubfolderhint'] = 'This folder will be created as subfolder of the currently selected one';
 $messages['forbiddencharacter'] = 'Folder name contains a forbidden character';
 $messages['selectimportfile'] = 'Please select a file to upload';
 $messages['addresswriterror'] = 'The selected address book is not writeable';
+$messages['contactaddedtogroup'] = 'Successfully added the contacts to this group';
+$messages['contactremovedfromgroup'] = 'Successfully remove contacts from this group';
 $messages['importwait'] = 'Importing, please wait...';
 $messages['importerror'] = 'Import failed! The uploaded file is not a valid vCard file.';
 $messages['importconfirm'] = '<b>Successfully imported $inserted contacts, $skipped existing entries skipped</b>:<p><em>$names</em></p>';
@@ -99,9 +114,28 @@ $messages['editorwarning'] = 'Switching to the plain text editor will cause all
 $messages['httpreceivedencrypterror'] = 'A fatal configuration error occurred. Contact your administrator immediately. <b>Your message can not be sent.</b>';
 $messages['smtpconnerror'] = 'SMTP Error ($code): Connection to server failed';
 $messages['smtpautherror'] = 'SMTP Error ($code): Authentication failed';
-$messages['smtpfromerror'] = 'SMTP Error ($code): Failed to set sender "$from"';
-$messages['smtptoerror'] = 'SMTP Error ($code): Failed to add recipient "$to"';
+$messages['smtpfromerror'] = 'SMTP Error ($code): Failed to set sender "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP Error ($code): Failed to add recipient "$to" ($msg)';
 $messages['smtprecipientserror'] = 'SMTP Error: Unable to parse recipients list';
+$messages['smtpdsnerror'] = 'SMTP Error: Server does not support Delivery Status Notifications';
 $messages['smtperror'] = 'SMTP Error: $msg';
+$messages['emailformaterror'] = 'Incorrect e-mail address: $email';
+$messages['toomanyrecipients'] = 'Too many recipients. Reduce the number of recipients to $max.';
+$messages['maxgroupmembersreached'] = 'The number of group members exceeds the maximum of $max';
+$messages['internalerror'] = 'An internal error occured. Please try again';
+$messages['contactdelerror'] = 'Could not delete contact(s)';
+$messages['contactdeleted'] = 'Contact(s) deleted successfully';
+$messages['groupdeleted'] = 'Group deleted successfully';
+$messages['grouprenamed'] = 'Group renamed successfully';
+$messages['groupcreated'] = 'Group created successfully';
+$messages['messagedeleted'] = 'Message(s) deleted successfully';
+$messages['messagemoved'] = 'Message(s) moved successfully';
+$messages['messagecopied'] = 'Message(s) copied successfully';
+$messages['messagemarked'] = 'Message(s) marked successfully';
+$messages['autocompletechars'] = 'Enter at least $min characters for autocompletion';
+$messages['namecannotbeempty'] = 'Name cannot be empty';
+$messages['nametoolong'] = 'Name is too long';
+$messages['folderupdated'] = 'Folder updated successfully';
+$messages['foldercreated'] = 'Folder created successfully';
 
-?>
+?>
\ No newline at end of file
index 659631db7bdbee9f94a763b984560b6b6a58161d..87a63b25f78bca5835336b8678b140c223c507f4 100644 (file)
@@ -5,15 +5,15 @@
  +-----------------------------------------------------------------------+
  | language/en_US/labels.inc                                             |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 2983 2009-09-23 12:32:09Z alec $
+ @version $Id: labels.inc 4362 2010-12-22 18:45:15Z alec $
 
 */
 
@@ -46,28 +46,26 @@ $labels['to']      = 'Recipient';
 $labels['cc']      = 'Copy';
 $labels['bcc']     = 'Bcc';
 $labels['replyto'] = 'Reply-To';
+$labels['followupto'] = 'Followup-To';
 $labels['date']    = 'Date';
 $labels['size']    = 'Size';
 $labels['priority'] = 'Priority';
 $labels['organization'] = 'Organization';
-
-// aliases
-$labels['reply-to'] = $labels['replyto'];
+$labels['readstatus'] = 'Read status';
 
 $labels['mailboxlist'] = 'Folders';
 $labels['messagesfromto'] = 'Messages $from to $to of $count';
+$labels['threadsfromto'] = 'Threads $from to $to of $count';
 $labels['messagenrof'] = 'Message $nr of $count';
 
+$labels['copy']     = 'Copy';
+$labels['move']     = 'Move';
 $labels['moveto']   = 'Move to...';
 $labels['download'] = 'Download';
 
 $labels['filename'] = 'File name';
 $labels['filesize'] = 'File size';
 
-$labels['preferhtml'] = 'Display HTML';
-$labels['htmlmessage'] = 'HTML Message';
-$labels['prettydate'] = 'Pretty dates';
-
 $labels['addtoaddressbook'] = 'Add to address book';
 
 // weekdays short
@@ -122,7 +120,9 @@ $labels['today'] = 'Today';
 $labels['checkmail']        = 'Check for new messages';
 $labels['writenewmessage']  = 'Create a new message';
 $labels['replytomessage']   = 'Reply to sender';
-$labels['replytoallmessage'] = 'Reply to sender and all recipients';
+$labels['replytoallmessage'] = 'Reply to list or to sender and all recipients';
+$labels['replyall']         = 'Reply all';
+$labels['replylist']        = 'Reply list';
 $labels['forwardmessage']   = 'Forward the message';
 $labels['deletemessage']    = 'Delete message';
 $labels['movemessagetotrash'] = 'Move message to trash';
@@ -147,6 +147,7 @@ $labels['messageactions']   = 'More actions...';
 $labels['select'] = 'Select';
 $labels['all'] = 'All';
 $labels['none'] = 'None';
+$labels['currpage'] = 'Current page';
 $labels['unread'] = 'Unread';
 $labels['flagged'] = 'Flagged';
 $labels['unanswered'] = 'Unanswered';
@@ -154,9 +155,32 @@ $labels['deleted'] = 'Deleted';
 $labels['invert'] = 'Invert';
 $labels['filter'] = 'Filter';
 
+$labels['list'] = 'List';
+$labels['threads'] = 'Threads';
+$labels['expand-all'] = 'Expand All';
+$labels['expand-unread'] = 'Expand Unread';
+$labels['collapse-all'] = 'Collapse All';
+$labels['threaded'] = 'Threaded';
+
+$labels['autoexpand_threads'] = 'Expand message threads';
+$labels['do_expand'] = 'all threads';
+$labels['expand_only_unread'] = 'only with unread messages';
+$labels['fromto'] = 'Sender/Recipient';
+$labels['flag'] = 'Flag';
+$labels['attachment'] = 'Attachment';
+$labels['nonesort'] = 'None';
+$labels['sentdate'] = 'Sent date';
+$labels['arrival'] = 'Arrival date';
+$labels['asc'] = 'ascending';
+$labels['desc'] = 'descending';
+$labels['listcolumns'] = 'List columns';
+$labels['listsorting'] = 'Sorting column';
+$labels['listorder'] = 'Sorting order';
+$labels['listmode'] = 'List view mode';
+
+$labels['folderactions'] = 'Folder actions...';
 $labels['compact'] = 'Compact';
 $labels['empty'] = 'Empty';
-$labels['purge'] = 'Purge';
 
 $labels['quota'] = 'Disk usage';
 $labels['unknown']  = 'unknown';
@@ -179,7 +203,9 @@ $labels['addattachment']  = 'Attach a file';
 $labels['charset']        = 'Charset';
 $labels['editortype']     = 'Editor type';
 $labels['returnreceipt']  = 'Return receipt';
+$labels['dsn']            = 'Delivery status notification';
 
+$labels['editidents']    = 'Edit identities';
 $labels['checkspelling'] = 'Check spelling';
 $labels['resumeediting'] = 'Resume editing';
 $labels['revertto']      = 'Revert to';
@@ -187,6 +213,7 @@ $labels['revertto']      = 'Revert to';
 $labels['attachments'] = 'Attachments';
 $labels['upload'] = 'Upload';
 $labels['close']  = 'Close';
+$labels['messageoptions']  = 'Message options...';
 
 $labels['low']     = 'Low';
 $labels['lowest']  = 'Lowest';
@@ -207,6 +234,7 @@ $labels['maxuploadsize'] = 'Maximum allowed file size is $size';
 $labels['addcc'] = 'Add Cc';
 $labels['addbcc'] = 'Add Bcc';
 $labels['addreplyto'] = 'Add Reply-To';
+$labels['addfollowupto'] = 'Add Followup-To';
 
 // mdn
 $labels['mdnrequest'] = 'The sender of this message has asked to be notified when you read this message. Do you wish to notify the sender?';
@@ -222,11 +250,14 @@ $labels['email']     = 'E-Mail';
 
 $labels['addcontact'] = 'Add new contact';
 $labels['editcontact'] = 'Edit contact';
+$labels['contacts'] = 'Contacts';
+$labels['contactproperties'] = 'Contact properties';
 
 $labels['edit']   = 'Edit';
 $labels['cancel'] = 'Cancel';
 $labels['save']   = 'Save';
 $labels['delete'] = 'Delete';
+$labels['rename'] = 'Rename';
 
 $labels['newcontact']     = 'Create new contact card';
 $labels['deletecontact']  = 'Delete selected contacts';
@@ -235,12 +266,15 @@ $labels['contactsfromto'] = 'Contacts $from to $to of $count';
 $labels['print']          = 'Print';
 $labels['export']         = 'Export';
 $labels['exportvcards']   = 'Export contacts in vCard format';
+$labels['newcontactgroup'] = 'Create new contact group';
+$labels['groupactions']   = 'Actions for contact groups...';
 
 $labels['previouspage']   = 'Show previous set';
 $labels['firstpage']      = 'Show first set';
 $labels['nextpage']       = 'Show next set';
 $labels['lastpage']       = 'Show last set';
 
+$labels['group'] = 'Group';
 $labels['groups'] = 'Groups';
 $labels['personaladrbook'] = 'Personal Addresses';
 
@@ -265,6 +299,10 @@ $labels['newidentity']  = 'New identity';
 $labels['newitem']  = 'New item';
 $labels['edititem']  = 'Edit item';
 
+$labels['preferhtml'] = 'Display HTML';
+$labels['defaultcharset'] = 'Default Character Set';
+$labels['htmlmessage'] = 'HTML Message';
+$labels['prettydate'] = 'Pretty dates';
 $labels['setdefault']  = 'Set default';
 $labels['autodetect']  = 'Auto';
 $labels['language']  = 'Language';
@@ -273,6 +311,7 @@ $labels['pagesize']  = 'Rows per page';
 $labels['signature'] = 'Signature';
 $labels['dstactive']  = 'Daylight saving time';
 $labels['htmleditor'] = 'Compose HTML messages';
+$labels['htmlonreply'] = 'on reply to HTML message only';
 $labels['htmlsignature'] = 'HTML signature';
 $labels['previewpane'] = 'Show preview pane';
 $labels['skin'] = 'Interface skin';
@@ -281,13 +320,16 @@ $labels['logoutcompact'] = 'Compact Inbox on logout';
 $labels['uisettings'] = 'User Interface';
 $labels['serversettings'] = 'Server Settings';
 $labels['mailboxview'] = 'Mailbox View';
-$labels['mdnrequests'] = 'Sender notifications';
-$labels['askuser'] = 'ask the user';
-$labels['autosend'] = 'send automatically';
+$labels['mdnrequests'] = 'On request for return receipt';
+$labels['askuser'] = 'ask me';
+$labels['autosend'] = 'send receipt';
+$labels['autosendknown'] = 'send receipt to my contacts, otherwise ask me';
+$labels['autosendknownignore'] = 'send receipt to my contacts, otherwise ignore';
 $labels['ignore'] = 'ignore';
 $labels['readwhendeleted'] = 'Mark the message as read on delete';
 $labels['flagfordeletion'] = 'Flag the message for deletion instead of delete';
 $labels['skipdeleted'] = 'Do not show deleted messages';
+$labels['deletealways'] = 'If moving messages to Trash fails, delete them';
 $labels['showremoteimages'] = 'Display remote inline images';
 $labels['fromknownsenders'] = 'from known senders';
 $labels['always'] = 'always';
@@ -296,22 +338,40 @@ $labels['autosavedraft']  = 'Automatically save draft';
 $labels['everynminutes']  = 'every $n minute(s)';
 $labels['keepalive']  = 'Check for new messages on';
 $labels['never']  = 'never';
+$labels['immediately']  = 'immediately';
 $labels['messagesdisplaying'] = 'Displaying Messages';
 $labels['messagescomposition'] = 'Composing Messages';
 $labels['mimeparamfolding'] = 'Attachment names';
 $labels['2231folding'] = 'Full RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Full RFC 2047 (other)';
+$labels['force7bit'] = 'Use MIME encoding for 8-bit characters';
 $labels['advancedoptions'] = 'Advanced options';
 $labels['focusonnewmessage'] = 'Focus browser window on new message';
 $labels['checkallfolders'] = 'Check all folders for new messages';
 $labels['displaynext'] = 'After message delete/move display the next message';
-$labels['indexsort'] = 'Use message index for sorting by date';
 $labels['mainoptions'] = 'Main Options';
 $labels['section'] = 'Section';
 $labels['maintenance'] = 'Maintenance';
 $labels['newmessage'] = 'New Message';
 $labels['listoptions'] = 'List Options';
+$labels['signatureoptions'] = 'Signature Options';
+$labels['whenreplying'] = 'When replying';
+$labels['replytopposting'] = 'start new message above original';
+$labels['replybottomposting'] = 'start new message below original';
+$labels['replyremovesignature'] = 'When replying remove original signature from message';
+$labels['autoaddsignature'] = 'Automatically add signature';
+$labels['newmessageonly'] = 'new message only';
+$labels['replyandforwardonly'] = 'replies and forwards only';
+$labels['replysignaturepos'] = 'When replying or forwarding place signature';
+$labels['belowquote'] = 'below the quote';
+$labels['abovequote'] = 'above the quote';
+$labels['insertsignature'] = 'Insert signature';
+$labels['previewpanemarkread']  = 'Mark previewed messages as read';
+$labels['afternseconds']  = 'after $n seconds';
+$labels['reqmdn'] = 'Always request a return receipt';
+$labels['reqdsn'] = 'Always request a delivery status notification';
+$labels['replysamefolder'] = 'Place replies in the folder of the message being replied to';
 
 $labels['folder']  = 'Folder';
 $labels['folders']  = 'Folders';
@@ -320,11 +380,15 @@ $labels['subscribed']  = 'Subscribed';
 $labels['messagecount'] = 'Messages';
 $labels['create']  = 'Create';
 $labels['createfolder']  = 'Create new folder';
-$labels['rename'] = 'Rename';
-$labels['renamefolder'] = 'Rename folder';
-$labels['deletefolder']  = 'Delete folder';
 $labels['managefolders']  = 'Manage folders';
 $labels['specialfolders'] = 'Special Folders';
+$labels['properties'] = 'Properties';
+$labels['folderproperties'] = 'Folder properties';
+$labels['parentfolder'] = 'Parent folder';
+$labels['location'] = 'Location';
+$labels['info'] = 'Information';
+$labels['getfoldersize'] = 'Click to get folder size';
+$labels['changesubscription'] = 'Click to change subscription';
 
 $labels['sortby'] = 'Sort by';
 $labels['sortasc']  = 'Sort ascending';
@@ -336,4 +400,24 @@ $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
 
+// character sets
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'English';
+$labels['westerneuropean'] = 'Western European';
+$labels['easterneuropean'] = 'Eastern European';
+$labels['southeasterneuropean'] = 'South-Eastern European';
+$labels['baltic'] = 'Baltic';
+$labels['cyrillic'] = 'Cyrillic';
+$labels['arabic'] = 'Arabic';
+$labels['greek'] = 'Greek';
+$labels['hebrew'] = 'Hebrew';
+$labels['turkish'] = 'Turkish';
+$labels['nordic'] = 'Nordic';
+$labels['thai'] = 'Thai';
+$labels['celtic'] = 'Celtic';
+$labels['vietnamese'] = 'Vietnamese';
+$labels['japanese'] = 'Japanese';
+$labels['korean'] = 'Korean';
+$labels['chinese'] = 'Chinese';
+
 ?>
index 15e5c565095e75cc85e21112fe9397eef828ea5f..b81c2478a1b3e5a442816ebbc96cd3a193d0e533 100644 (file)
@@ -5,15 +5,15 @@
  +-----------------------------------------------------------------------+
  | language/en_US/messages.inc                                           |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 3042 2009-10-14 10:52:27Z alec $
+ @version $Id: messages.inc 4359 2010-12-22 17:41:41Z thomasb $
 
 */
 
@@ -23,6 +23,9 @@ $messages['cookiesdisabled'] = 'Your browser does not accept cookies';
 $messages['sessionerror'] = 'Your session is invalid or expired';
 $messages['imaperror'] = 'Connection to IMAP server failed';
 $messages['servererror'] = 'Server Error!';
+$messages['servererrormsg'] = 'Server Error: $msg';
+$messages['errorreadonly'] = 'Unable to perform operation. Folder is read-only';
+$messages['errornoperm'] = 'Unable to perform operation. Permission denied';
 $messages['invalidrequest'] = 'Invalid request! No data was saved.';
 $messages['nomessagesfound'] = 'No messages found in this mailbox';
 $messages['loggedout'] = 'You have successfully terminated the session. Good bye!';
@@ -46,17 +49,18 @@ $messages['sendingfailed'] = 'Failed to send message';
 $messages['senttooquickly'] = 'Please wait $sec sec(s). before sending this message';
 $messages['errorsavingsent'] = 'An error occured while saving sent message';
 $messages['errorsaving'] = 'An error occured while saving';
-$messages['errormoving'] = 'Could not move the message';
-$messages['errordeleting'] = 'Could not delete the message';
-$messages['errormarking'] = 'Could not mark the message';
+$messages['errormoving'] = 'Could not move the message(s)';
+$messages['errorcopying'] = 'Could not copy the message(s)';
+$messages['errordeleting'] = 'Could not delete the message(s)';
+$messages['errormarking'] = 'Could not mark the message(s)';
 $messages['deletecontactconfirm']  = 'Do you really want to delete the selected contact(s)?';
 $messages['deletemessagesconfirm'] = 'Do you really want to delete the selected message(s)?';
 $messages['deletefolderconfirm']  = 'Do you really want to delete this folder?';
 $messages['purgefolderconfirm']  = 'Do you really want to delete all messages in this folder?';
-$messages['foldercreating'] = 'Creating folder...';
 $messages['folderdeleting'] = 'Deleting folder...';
-$messages['folderrenaming'] = 'Renaming folder...';
 $messages['foldermoving'] = 'Moving folder...';
+$messages['foldersubscribing'] = 'Subscribing folder...';
+$messages['folderunsubscribing'] = 'Unsubscribing folder...';
 $messages['formincomplete'] = 'The form was not completely filled out';
 $messages['noemailwarning'] = 'Please enter a valid email address';
 $messages['nonamewarning']  = 'Please enter a name';
@@ -76,7 +80,11 @@ $messages['searching'] = 'Searching...';
 $messages['checking'] = 'Checking...';
 $messages['nospellerrors'] = 'No spelling errors found';
 $messages['folderdeleted'] = 'Folder successfully deleted';
-$messages['deletedsuccessfully'] = "Successfully deleted";
+$messages['foldersubscribed'] = 'Folder successfully subscribed';
+$messages['folderunsubscribed'] = 'Folder successfully unsubscribed';
+$messages['folderpurged'] = 'Folder has successfully been emptied';
+$messages['folderexpunged'] = 'Folder has successfully been compacted';
+$messages['deletedsuccessfully'] = 'Successfully deleted';
 $messages['converting'] = 'Removing formatting...';
 $messages['messageopenerror'] = 'Could not load message from server';
 $messages['fileuploaderror'] = 'File upload failed';
@@ -85,14 +93,18 @@ $messages['copysuccess'] = 'Successfully copied $nr addresses';
 $messages['copyerror'] = 'Could not copy any addresses';
 $messages['sourceisreadonly'] = 'This address source is read only';
 $messages['errorsavingcontact'] = 'Could not save the contact address';
-$messages['movingmessage'] = 'Moving message...';
+$messages['movingmessage'] = 'Moving message(s)...';
+$messages['copyingmessage'] = 'Copying message(s)...';
+$messages['deletingmessage'] = 'Deleting message(s)...';
+$messages['markingmessage'] = 'Marking message(s)...';
 $messages['receiptsent'] = 'Successfully sent a read receipt';
 $messages['errorsendingreceipt'] = 'Could not send the receipt';
 $messages['nodeletelastidentity'] = 'You cannot delete this identity, it\'s your last one.';
-$messages['addsubfolderhint'] = 'This folder will be created as subfolder of the currently selected one';
 $messages['forbiddencharacter'] = 'Folder name contains a forbidden character';
 $messages['selectimportfile'] = 'Please select a file to upload';
 $messages['addresswriterror'] = 'The selected address book is not writeable';
+$messages['contactaddedtogroup'] = 'Successfully added the contacts to this group';
+$messages['contactremovedfromgroup'] = 'Successfully remove contacts from this group';
 $messages['importwait'] = 'Importing, please wait...';
 $messages['importerror'] = 'Import failed! The uploaded file is not a valid vCard file.';
 $messages['importconfirm'] = '<b>Successfully imported $inserted contacts, $skipped existing entries skipped</b>:<p><em>$names</em></p>';
@@ -102,10 +114,28 @@ $messages['editorwarning'] = 'Switching to the plain text editor will cause all
 $messages['httpreceivedencrypterror'] = 'A fatal configuration error occurred. Contact your administrator immediately. <b>Your message can not be sent.</b>';
 $messages['smtpconnerror'] = 'SMTP Error ($code): Connection to server failed';
 $messages['smtpautherror'] = 'SMTP Error ($code): Authentication failed';
-$messages['smtpfromerror'] = 'SMTP Error ($code): Failed to set sender "$from"';
-$messages['smtptoerror'] = 'SMTP Error ($code): Failed to add recipient "$to"';
+$messages['smtpfromerror'] = 'SMTP Error ($code): Failed to set sender "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP Error ($code): Failed to add recipient "$to" ($msg)';
 $messages['smtprecipientserror'] = 'SMTP Error: Unable to parse recipients list';
+$messages['smtpdsnerror'] = 'SMTP Error: No support for Delivery Status Notifications';
 $messages['smtperror'] = 'SMTP Error: $msg';
-$messages['emailformaterror'] = 'Incorrect e-mail address: $email';
+$messages['emailformaterror'] = 'Invalid e-mail address: $email';
+$messages['toomanyrecipients'] = 'Too many recipients. Reduce the number of recipients to $max.';
+$messages['maxgroupmembersreached'] = 'The number of group members exceeds the maximum of $max';
+$messages['internalerror'] = 'An internal error occured. Please try again';
+$messages['contactdelerror'] = 'Could not delete contact(s)';
+$messages['contactdeleted'] = 'Contact(s) deleted successfully';
+$messages['groupdeleted'] = 'Group deleted successfully';
+$messages['grouprenamed'] = 'Group renamed successfully';
+$messages['groupcreated'] = 'Group created successfully';
+$messages['messagedeleted'] = 'Message(s) deleted successfully';
+$messages['messagemoved'] = 'Message(s) moved successfully';
+$messages['messagecopied'] = 'Message(s) copied successfully';
+$messages['messagemarked'] = 'Message(s) marked successfully';
+$messages['autocompletechars'] = 'Enter at least $min characters for autocompletion';
+$messages['namecannotbeempty'] = 'Name cannot be empty';
+$messages['nametoolong'] = 'Name is too long';
+$messages['folderupdated'] = 'Folder updated successfully';
+$messages['foldercreated'] = 'Folder created successfully';
 
 ?>
index 468418822db6139e95cad3d89a8cd72dc6b10ee3..06fafd584f0a157a05be1dd4bc8555e2bc8eb5a7 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/eo/labels.inc                                                |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -220,9 +220,6 @@ $labels['subscribed'] = 'Abonata';
 $labels['messagecount'] = 'Mesaĝoj';
 $labels['create'] = 'Kreu';
 $labels['createfolder'] = 'Kreu novan dosierujon';
-$labels['rename'] = 'Renomu';
-$labels['renamefolder'] = 'Renomu dosierujon';
-$labels['deletefolder'] = 'Forigu dosierujon';
 $labels['managefolders'] = 'Administru dosierujon';
 $labels['sortby'] = 'Ordigu per';
 $labels['sortasc'] = 'Ordigu kreskante';
index ae8bca469a4b4f4e6cea13051ad322da73dfaf23..4aa85224ef38d2cb6b8c4bcc413d8542b6f60d29 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/eo/messages.inc                                              |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -75,7 +75,6 @@ $messages['movingmessage'] = 'Translokanta mesaĝon...';
 $messages['receiptsent'] = 'Sukcese sendis konfirmon';
 $messages['errorsendingreceipt'] = 'Ne povis sendi konfirmon';
 $messages['nodeletelastidentity'] = 'Vi ne povas forigi ĉi tiun identon, ĉar ĝi estas la lasta';
-$messages['addsubfolderhint'] = 'Ĉi tiu dosierujo estos farita kiel subdosierujo de la nune elektita dosierujo';
 $messages['forbiddencharacter'] = 'Dosierujo-nomo enhavas malpermesitan karaktron';
 
 ?>
index a688df673c182dae38727f1413e839b30e1c4129..d78fccdd6d86c91f375d41ff8a7d60c5623f5161 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/es_AR/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -17,7 +17,7 @@
 |         http://www.netsud.com                                         |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2115 2009-01-13 11:40:34Z alec $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -50,13 +50,12 @@ $labels['reply-to'] = 'Responder a';
 $labels['mailboxlist'] = 'Carpetas';
 $labels['messagesfromto'] = 'Mensajes $from a $to de $count';
 $labels['messagenrof'] = 'Mensaje $nr de $count';
-$labels['moveto'] = 'mover a...';
-$labels['download'] = 'descargar';
+$labels['copy'] = 'Copiar';
+$labels['move'] = 'Mover';
+$labels['moveto'] = 'Mover a...';
+$labels['download'] = 'Descargar';
 $labels['filename'] = 'Nombre del archivo';
 $labels['filesize'] = 'Tamaño del archivo';
-$labels['preferhtml'] = 'Prefiero HTML';
-$labels['htmlmessage'] = 'Mensaje HTML';
-$labels['prettydate'] = 'Fecha detallada';
 $labels['addtoaddressbook'] = 'Añadir a contactos';
 $labels['sun'] = 'Dom';
 $labels['mon'] = 'Lun';
@@ -124,12 +123,23 @@ $labels['messageactions'] = 'Más acciones...';
 $labels['select'] = 'Elija';
 $labels['all'] = 'Todos';
 $labels['none'] = 'Ninguno';
+$labels['currpage'] = 'Página actual';
 $labels['unread'] = 'Sin leer';
 $labels['flagged'] = 'Marcado';
 $labels['unanswered'] = 'Sin respuesta';
 $labels['deleted'] = 'Eliminado';
 $labels['invert'] = 'Invertir';
 $labels['filter'] = 'Filtrar';
+$labels['expand-all'] = 'Expandir Todos';
+$labels['expand-unread'] = 'Expandir No Leidos';
+$labels['collapse-all'] = 'Colapsar Todos';
+$labels['expand_only_unread'] = 'solo con mensajes no leídos';
+$labels['attachment'] = 'Adjunto';
+$labels['nonesort'] = 'Ninguno';
+$labels['sentdate'] = 'Fecha de Enviado';
+$labels['arrival'] = 'Fecha de Recepción';
+$labels['asc'] = 'Ascendente';
+$labels['desc'] = 'Descendente';
 $labels['compact'] = 'Compactar';
 $labels['empty'] = 'Vaciar';
 $labels['purge'] = 'Eliminar';
@@ -193,10 +203,13 @@ $labels['contactsfromto'] = 'Contactos $from a $to de $count';
 $labels['print'] = 'Imprimir';
 $labels['export'] = 'Exportar';
 $labels['exportvcards'] = 'Exportar contactos en format vCard';
+$labels['newcontactgroup'] = 'Crear Nuevo Grupo de Contacto';
+$labels['groupactions'] = 'Acción para Grupos de Contacto';
 $labels['previouspage'] = 'Mostrar grupo anterior';
 $labels['firstpage'] = 'Mostrar primer grupo';
 $labels['nextpage'] = 'Mostrar siguiente grupo';
 $labels['lastpage'] = 'Mostrar último grupo';
+$labels['group'] = 'Grupo';
 $labels['groups'] = 'Grupos';
 $labels['personaladrbook'] = 'Direcciones personales';
 $labels['import'] = 'Importar';
@@ -214,6 +227,10 @@ $labels['manageidentities'] = 'Gestionar identidades para esta cuenta';
 $labels['newidentity'] = 'Nueva identidad';
 $labels['newitem'] = 'Nuevo';
 $labels['edititem'] = 'Editar';
+$labels['preferhtml'] = 'Prefiero HTML';
+$labels['defaultcharset'] = 'Juego de Caracteres por Defecto';
+$labels['htmlmessage'] = 'Mensaje HTML';
+$labels['prettydate'] = 'Fecha detallada';
 $labels['setdefault'] = 'Seleccionar opción por defecto';
 $labels['autodetect'] = 'Automático';
 $labels['language'] = 'Idioma';
@@ -237,6 +254,7 @@ $labels['ignore'] = 'ignorar';
 $labels['readwhendeleted'] = 'Marcar el mensage como leído al borrarlo';
 $labels['flagfordeletion'] = 'Marcar el mensage para borrarse en vez de borrarlo';
 $labels['skipdeleted'] = 'No mostrar mensajes eliminados';
+$labels['deletealways'] = 'Cuando no se pueda mover un mensaje a la papelera, eliminarlo';
 $labels['showremoteimages'] = 'Mostrar imágenes remotas';
 $labels['fromknownsenders'] = 'de remitentes conocidos';
 $labels['always'] = 'siempre';
@@ -245,22 +263,37 @@ $labels['autosavedraft'] = 'Guardar borrador automáticamente';
 $labels['everynminutes'] = 'cada $n minuto(s)';
 $labels['keepalive'] = 'Verificar si hay nuevos mensajes en';
 $labels['never'] = 'nunca';
+$labels['immediately'] = 'inmediatamente';
 $labels['messagesdisplaying'] = 'Vista de mensajes';
 $labels['messagescomposition'] = 'Composición de mensajes';
 $labels['mimeparamfolding'] = 'Nombre de adjuntos';
 $labels['2231folding'] = 'RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'RFC 2047 (Otro)';
+$labels['force7bit'] = 'Usar codificación MIME para caracteres de 8 bit';
 $labels['advancedoptions'] = 'Opciones Avanzadas';
 $labels['focusonnewmessage'] = 'Traer al frente la ventana del navegador cuando haya nuevos mensajes';
 $labels['checkallfolders'] = 'Verificar todas las carpetas por nuevos mensajes';
 $labels['displaynext'] = 'Luedo de eliminar/mover, mostrar el próximo mensaje';
-$labels['indexsort'] = 'Usar el índice de mensaje para ordenar por fecha';
 $labels['mainoptions'] = 'Opciones Principales';
 $labels['section'] = 'Selección';
 $labels['maintenance'] = 'Mantenimiento';
 $labels['newmessage'] = 'Nuevo Mensaje';
 $labels['listoptions'] = 'Opciones de Listado';
+$labels['signatureoptions'] = 'Opciones de Firma';
+$labels['whenreplying'] = 'Al Responder';
+$labels['replytopposting'] = 'iniciar el nuevo mensaje sobre el original';
+$labels['replybottomposting'] = 'iniciar el nuevo mensaje debajo del original';
+$labels['replyremovesignature'] = 'Al responder, eliminar la firma del mensaje original';
+$labels['autoaddsignature'] = 'Agregar la firma automáticamente';
+$labels['newmessageonly'] = 'nuevos mensajes solamente';
+$labels['replyandforwardonly'] = 'respuestas o reenvios solamente';
+$labels['replysignaturepos'] = 'Agregar firma al responder o reenviar';
+$labels['belowquote'] = 'debajo de la cita';
+$labels['abovequote'] = 'sobre la cita';
+$labels['insertsignature'] = 'Insertar firma';
+$labels['previewpanemarkread'] = 'Marcar mensajes previsualizados como leidos';
+$labels['afternseconds'] = 'despues de $n segundos';
 $labels['folder'] = 'Carpeta';
 $labels['folders'] = 'Carpetas';
 $labels['foldername'] = 'Nombre de carpeta';
@@ -268,9 +301,6 @@ $labels['subscribed'] = 'Suscripta';
 $labels['messagecount'] = 'Mensajes';
 $labels['create'] = 'Crear';
 $labels['createfolder'] = 'Crear nueva carpeta';
-$labels['rename'] = 'Renombrar';
-$labels['renamefolder'] = 'Renombrar carpeta';
-$labels['deletefolder'] = 'Eliminar carpeta';
 $labels['managefolders'] = 'Administrar carpetas';
 $labels['specialfolders'] = 'Carpetas Especiales';
 $labels['sortby'] = 'Ordenar por';
@@ -280,5 +310,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Ingles';
+$labels['westerneuropean'] = 'Europa Occidental';
+$labels['easterneuropean'] = 'Europa del Este';
+$labels['southeasterneuropean'] = 'Sudeste de Europa';
+$labels['baltic'] = 'Báltico';
+$labels['cyrillic'] = 'Cirílico';
+$labels['arabic'] = 'Árabe';
+$labels['greek'] = 'Griego';
+$labels['hebrew'] = 'Hebreo';
+$labels['turkish'] = 'Turco';
+$labels['nordic'] = 'Nórdico';
+$labels['thai'] = 'Tailandés';
+$labels['celtic'] = 'Céltico';
+$labels['vietnamese'] = 'Vietnamita';
+$labels['japanese'] = 'Japonés';
+$labels['korean'] = 'Coreano';
+$labels['chinese'] = 'Chino';
 
 ?>
index c8d6339c3e1c8c1fe74c5d33f26e404f229d9079..6e99823d87568af149ae0ef66ffb89284976ff18 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/es_ES/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -16,7 +16,7 @@
 |         http://www.netsud.com                                         |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 1600 2009-01-13 11:40:30Z yllar $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -31,6 +31,7 @@ $messages['nomessagesfound'] = 'No se han encontrado mensajes en esta casilla';
 $messages['loggedout'] = 'Ha cerrado la sesión. ¡Hasta pronto!';
 $messages['mailboxempty'] = 'La casilla está vacía';
 $messages['loading'] = 'Cargando...';
+$messages['uploading'] = 'Subiendo archivo...';
 $messages['loadingdata'] = 'Cargando datos...';
 $messages['checkingmail'] = 'Verificando si hay nuevos mensajes...';
 $messages['sendingmessage'] = 'Enviando mensaje...';
@@ -48,16 +49,15 @@ $messages['sendingfailed'] = 'Error al enviar mensaje';
 $messages['senttooquickly'] = 'Por favor, espere $sec segundo(s) antes de enviar este mensaje';
 $messages['errorsavingsent'] = 'Ocurrió un error al guardar el mensaje enviado';
 $messages['errorsaving'] = 'Ocurrió un error al guardar';
-$messages['errormoving'] = 'No se ha podido mover el mensaje';
+$messages['errormoving'] = 'No se pudo mover el mensaje';
+$messages['errorcopying'] = 'No se pudo copiar el mensaje';
 $messages['errordeleting'] = 'No se ha podido eliminar el mensaje';
 $messages['errormarking'] = 'No se puede marcar el mensaje.';
 $messages['deletecontactconfirm'] = '¿Realmente quiere eliminar los contactos seleccionados?';
 $messages['deletemessagesconfirm'] = '¿Realmente quiere eliminar los mensajes seleccionados?';
 $messages['deletefolderconfirm'] = '¿Realmente quiere eliminar esta carpeta?';
 $messages['purgefolderconfirm'] = '¿Realmente quiere eliminar todos los mensajes de esta carpeta?';
-$messages['foldercreating'] = 'Creando carpeta...';
 $messages['folderdeleting'] = 'Eliminando carpeta...';
-$messages['folderrenaming'] = 'Renombrando carpeta...';
 $messages['foldermoving'] = 'Moviendo carpeta...';
 $messages['formincomplete'] = 'No se han llenado todos los campos del formulario';
 $messages['noemailwarning'] = 'Por favor, introduzca un e-mail válido';
@@ -71,6 +71,7 @@ $messages['notsentwarning'] = 'El mensaje no ha sido enviado. ¿Desea descartar
 $messages['noldapserver'] = 'Por favor, seleccione un servidor LDAP para buscar';
 $messages['nocontactsreturned'] = 'No se han encontrado contactos';
 $messages['nosearchname'] = 'Por favor, introduzca un nombre o la dirección de e-mail';
+$messages['notuploadedwarning'] = 'Todavia no se subieron todos los archivos adjuntos. Por favor aguarde o cancele la subida.';
 $messages['searchsuccessful'] = 'Se encontraron $nr mensajes';
 $messages['searchnomatch'] = 'La búsqueda no obtuvo resultados';
 $messages['searching'] = 'Buscando...';
@@ -87,13 +88,15 @@ $messages['copyerror'] = 'No se pudo copiar ninguna dirección';
 $messages['sourceisreadonly'] = 'Esta dirección es de sólo-lectura';
 $messages['errorsavingcontact'] = 'No se pudo guardar la dirección de contacto';
 $messages['movingmessage'] = 'Moviendo mensaje...';
+$messages['copyingmessage'] = 'Copiando mensaje...';
 $messages['receiptsent'] = 'La notificación de lectura se ha enviado con éxito.';
 $messages['errorsendingreceipt'] = 'No se ha podido enviar la notificación de lectura.';
 $messages['nodeletelastidentity'] = 'No se puede borrar esta identidad puesto que es la última.';
-$messages['addsubfolderhint'] = 'Esta carpeta se creará como una subcarpeta dentro de la carpeta seleccionada';
 $messages['forbiddencharacter'] = 'El nombre de la carpeta contiene un carácter prohibido';
 $messages['selectimportfile'] = 'Por favor, seleccione el archivo a subir';
 $messages['addresswriterror'] = 'La libreta de direcciones seleccionada es de solo-lectura';
+$messages['contactaddedtogroup'] = 'Contactos agregados al grupo correctamente';
+$messages['contactremovedfromgroup'] = 'Contactos eliminados del grupo correctamente';
 $messages['importwait'] = 'Importando, aguarde por favor...';
 $messages['importerror'] = 'Falló la importación! El archivo seleccionado parece no ser un archivo del tipo vCard válido.';
 $messages['importconfirm'] = '<b>Se importaron $inserted contactos correctamente. $skipped ya existentes fueron ignorados</b>:<p><em>$names</em></p>';
@@ -103,9 +106,12 @@ $messages['editorwarning'] = 'Si cambia a texto plano se perderán todas las opc
 $messages['httpreceivedencrypterror'] = 'Ha ocurrido un error fatal de configuración. Contacte inmediatamente a su administrador. <b>Su mensaje no ha sido enviado.</b>';
 $messages['smtpconnerror'] = 'Error SMTP ($code): Conexión al servidor falló';
 $messages['smtpautherror'] = 'Error SMTP ($code): Falló la autentificación';
-$messages['smtpfromerror'] = 'Error SMTP ($code): No se pudo establecer el remitente "$from"';
-$messages['smtptoerror'] = 'Error SMTP ($code): No se puedo agregar el destinatario "$to"';
+$messages['smtpfromerror'] = 'Error SMTP ($code): No se pudo establecer el remitente "$from" ($msg)';
+$messages['smtptoerror'] = 'Error SMTP ($code): No se puedo agregar el destinatario "$to" ($msg)';
 $messages['smtprecipientserror'] = 'Error SMTP: No se pudo leer la lista de destinatarios';
 $messages['smtperror'] = 'Error SMTP: $msg';
+$messages['emailformaterror'] = 'La dirección $email no es válida';
+$messages['toomanyrecipients'] = 'Demasiados destinatarios. Reduzca la cantidad a un máximo de $max.';
+$messages['maxgroupmembersreached'] = 'El número de miembros del grupo excede el máximo de $max';
 
 ?>
index bd33497a72a279972d51620f53d891b3d1612947..cc3c175accf63ad046f80fa6b4b984bcde42183c 100644 (file)
@@ -5,20 +5,18 @@
 +-----------------------------------------------------------------------+
 | language/es_ES/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Javier Smaldone <javier@smaldone.com.ar>                      |
-|         http://www.smaldone.com.ar                                    |
 |         David Grajal Blanco <dgrabla@gmail.com>                       |
-|         http://david.grajal.net                                       |
-|         Angel Bueno Prieto <info@mediaiberia.com>                     |
-|         http://www.mediaiberia.com                                    |
+|         Ángel Bueno Prieto <info@mediaiberia.com>                     |
+|         José M. Ciordia <ciordia@gmail.com>                           |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2756 2009-07-15 19:31:05Z yllar $
+@version $Id: labels.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -43,21 +41,22 @@ $labels['to'] = 'Destinatario';
 $labels['cc'] = 'Copia';
 $labels['bcc'] = 'Cco';
 $labels['replyto'] = 'Respuesta a';
+$labels['followupto'] = 'Seguir a';
 $labels['date'] = 'Fecha';
 $labels['size'] = 'Tamaño';
 $labels['priority'] = 'Prioridad';
 $labels['organization'] = 'Organización';
-$labels['reply-to'] = 'Respuesta a';
+$labels['readstatus'] = 'Leer estado';
 $labels['mailboxlist'] = 'Bandejas';
 $labels['messagesfromto'] = 'Mensajes $from a $to de $count';
+$labels['threadsfromto'] = 'Hilos $from a $to de $count';
 $labels['messagenrof'] = 'Mensaje $nr de $count';
+$labels['copy'] = 'Copiar';
+$labels['move'] = 'Mover';
 $labels['moveto'] = 'Mover a...';
 $labels['download'] = 'Descargar';
 $labels['filename'] = 'Nombre del archivo';
 $labels['filesize'] = 'Tamaño del archivo';
-$labels['preferhtml'] = 'Prefiero HTML';
-$labels['htmlmessage'] = 'Mensaje HTML';
-$labels['prettydate'] = 'Fecha detallada';
 $labels['addtoaddressbook'] = 'Añadir a contactos';
 $labels['sun'] = 'Dom';
 $labels['mon'] = 'Lun';
@@ -102,6 +101,8 @@ $labels['checkmail'] = 'Revisar si hay nuevos mensajes';
 $labels['writenewmessage'] = 'Crear nuevo mensaje';
 $labels['replytomessage'] = 'Responder mensaje';
 $labels['replytoallmessage'] = 'Responder al emisor y a todos los destinatarios';
+$labels['replyall'] = 'Responder a todos';
+$labels['replylist'] = 'Responder a la lista';
 $labels['forwardmessage'] = 'Reenviar mensaje';
 $labels['deletemessage'] = 'Eliminar mensaje';
 $labels['movemessagetotrash'] = 'Mover mensaje a la papelera';
@@ -110,10 +111,10 @@ $labels['previousmessage'] = 'Mostrar mensaje anterior';
 $labels['previousmessages'] = 'Mostrar grupo anterior de mensajes';
 $labels['firstmessage'] = 'Mostrar primer mensaje';
 $labels['firstmessages'] = 'Mostrar primer grupo de mensajes';
-$labels['nextmessage'] = 'Mostrar siguente mensaje';
-$labels['nextmessages'] = 'Mostrar siguente grupo de mensajes';
-$labels['lastmessage'] = 'Mostrar último mensaje';
-$labels['lastmessages'] = 'Mostrar último grupo de mensajes';
+$labels['nextmessage'] = 'Mostrar el siguiente mensaje';
+$labels['nextmessages'] = 'Mostrar el siguiente grupo de mensajes';
+$labels['lastmessage'] = 'Mostrar el último mensaje';
+$labels['lastmessages'] = 'Mostrar el último grupo de mensajes';
 $labels['backtolist'] = 'Volver a la lista de mensajes';
 $labels['viewsource'] = 'Mostrar código';
 $labels['markmessages'] = 'Marcar mensajes';
@@ -125,38 +126,64 @@ $labels['messageactions'] = 'Más acciones...';
 $labels['select'] = 'Elija';
 $labels['all'] = 'Todos';
 $labels['none'] = 'Ninguno';
+$labels['currpage'] = 'Página actual';
 $labels['unread'] = 'Sin leer';
 $labels['flagged'] = 'Señalado';
 $labels['unanswered'] = 'Sin respuesta';
 $labels['deleted'] = 'Eliminado';
 $labels['invert'] = 'Invertir';
 $labels['filter'] = 'Filtrar';
+$labels['list'] = 'Lista';
+$labels['threads'] = 'Hilos';
+$labels['expand-all'] = 'Expandir todos';
+$labels['expand-unread'] = 'Expandir no leídos';
+$labels['collapse-all'] = 'Colapsar todos';
+$labels['threaded'] = 'Encadenados';
+$labels['autoexpand_threads'] = 'Expandir hilos de mensajes';
+$labels['do_expand'] = 'todos los hilos';
+$labels['expand_only_unread'] = 'solo con mensajes no leídos';
+$labels['fromto'] = 'Remitente/Destinatario';
+$labels['flag'] = 'Marca';
+$labels['attachment'] = 'Adjunto';
+$labels['nonesort'] = 'Ninguno';
+$labels['sentdate'] = 'Fecha de envío';
+$labels['arrival'] = 'Fecha de llegada';
+$labels['asc'] = 'ascendente';
+$labels['desc'] = 'descendente';
+$labels['listcolumns'] = 'Listar columnas';
+$labels['listsorting'] = 'Columna de listado';
+$labels['listorder'] = 'Orden de listado';
+$labels['listmode'] = 'Modo de vista de lista';
+$labels['folderactions'] = 'Acciones de bandeja...';
 $labels['compact'] = 'Compactar';
 $labels['empty'] = 'Vaciar';
 $labels['purge'] = 'Eliminar';
-$labels['quota'] = 'Uso de cuenta';
+$labels['quota'] = 'Uso de disco';
 $labels['unknown'] = 'desconocido';
 $labels['unlimited'] = 'sin límite';
 $labels['quicksearch'] = 'Búsqueda rápida';
-$labels['resetsearch'] = 'Afinar la búsqueda';
+$labels['resetsearch'] = 'Reiniciar la búsqueda';
 $labels['searchmod'] = 'Opciones de búsqueda';
 $labels['msgtext'] = 'Mensaje completo';
 $labels['openinextwin'] = 'Abrir en nueva ventana';
-$labels['emlsave'] = 'Guardar (.eml)';
+$labels['emlsave'] = 'Descargar (.eml)';
 $labels['compose'] = 'Escribir un mensaje';
 $labels['editasnew'] = 'Editar como nuevo';
 $labels['savemessage'] = 'Guardar como borrador';
 $labels['sendmessage'] = 'Enviar ahora el mensaje';
-$labels['addattachment'] = 'Añadir un archivo';
+$labels['addattachment'] = 'Adjuntar un archivo';
 $labels['charset'] = 'Codificación';
 $labels['editortype'] = 'Tipo de editor';
 $labels['returnreceipt'] = 'Acuse de recibo';
+$labels['dsn'] = 'Entrega de notificaciones de estado';
+$labels['editidents'] = 'Editar identidades';
 $labels['checkspelling'] = 'Revisar ortografía';
 $labels['resumeediting'] = 'Continuar edición';
 $labels['revertto'] = 'Revertir a';
 $labels['attachments'] = 'Adjuntos';
 $labels['upload'] = 'Subir';
 $labels['close'] = 'Cerrar';
+$labels['messageoptions'] = 'Opciones de mensaje...';
 $labels['low'] = 'Bajo';
 $labels['lowest'] = 'Bajísimo';
 $labels['normal'] = 'Normal';
@@ -166,38 +193,44 @@ $labels['nosubject'] = '(sin asunto)';
 $labels['showimages'] = 'Mostrar imágenes';
 $labels['alwaysshow'] = 'Mostrar siempre imágenes de $sender';
 $labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Texto';
+$labels['plaintoggle'] = 'Sólo texto';
 $labels['savesentmessagein'] = 'Guardar mensaje enviado en';
 $labels['dontsave'] = 'No guardar';
-$labels['maxuploadsize'] = 'Tamaño máximo permitido: $size';
+$labels['maxuploadsize'] = 'Tamaño de archivo máximo permitido: $size';
 $labels['addcc'] = 'Añadir Cc';
 $labels['addbcc'] = 'Añadir Cco';
-$labels['addreplyto'] = 'Añadir Respuesta a';
+$labels['addreplyto'] = 'Añadir Responder a';
+$labels['addfollowupto'] = 'Añadir Seguir a';
 $labels['mdnrequest'] = 'El emisor de este mensaje desea ser notificado cuando usted lo lea. ¿Quiere enviar esta notificación?';
 $labels['receiptread'] = 'Notificación de lectura';
-$labels['yourmessage'] = 'Esta es una notificación de lectura de su mensaje';
-$labels['receiptnote'] = 'Nota: Esta notificación sólo significa que su mensaje fue mostrado en la computadora del receptor. No hay garantía de que el receptor haya leído o entendido el contenido del mensaje.';
-$labels['name'] = 'Nombre completo';
+$labels['yourmessage'] = 'Esto es un acuse de recibo de su mensaje';
+$labels['receiptnote'] = 'Nota: Esta notificación sólo significa que su mensaje fue abierto en el ordenador del destinatario. Eso no garantiza que el destinatario haya leído o entendido el contenido del mensaje.';
+$labels['name'] = 'Mostra nombre';
 $labels['firstname'] = 'Nombre';
 $labels['surname'] = 'Apellido';
 $labels['email'] = 'Correo';
 $labels['addcontact'] = 'Añadir nuevo contacto';
 $labels['editcontact'] = 'Editar contacto';
+$labels['contacts'] = 'Contactos';
+$labels['contactproperties'] = 'Propiedades del contacto';
 $labels['edit'] = 'Editar';
 $labels['cancel'] = 'Cancelar';
 $labels['save'] = 'Guardar';
 $labels['delete'] = 'Eliminar';
-$labels['newcontact'] = 'Crear nuevo contacto';
+$labels['newcontact'] = 'Crear nueva tarjeta de contacto';
 $labels['deletecontact'] = 'Eliminar contactos seleccionados';
-$labels['composeto'] = 'Enviar mensaje a';
+$labels['composeto'] = 'Escribir mensaje a';
 $labels['contactsfromto'] = 'Contactos $from a $to de $count';
 $labels['print'] = 'Imprimir';
 $labels['export'] = 'Exportar';
 $labels['exportvcards'] = 'Exportar contactos en formato vCard';
+$labels['newcontactgroup'] = 'Crear un nuevo grupo de contactos';
+$labels['groupactions'] = 'Acciones para grupos de contactos...';
 $labels['previouspage'] = 'Mostrar grupo anterior';
 $labels['firstpage'] = 'Mostrar primer grupo';
 $labels['nextpage'] = 'Mostrar grupo siguiente';
 $labels['lastpage'] = 'Mostrar último grupo';
+$labels['group'] = 'Grupo';
 $labels['groups'] = 'Grupos';
 $labels['personaladrbook'] = 'Direcciones personales';
 $labels['import'] = 'Importar';
@@ -205,7 +238,7 @@ $labels['importcontacts'] = 'Importar contactos';
 $labels['importfromfile'] = 'Importar desde archivo:';
 $labels['importreplace'] = 'Reemplazar toda la lista de contactos';
 $labels['importtext'] = 'Puede importar contactos desde una lista existente.<br/>Actualmente sólo soportamos el formato <a href="http://es.wikipedia.org/wiki/VCard">vCard</a>.';
-$labels['done'] = 'Realizado';
+$labels['done'] = 'Hecho';
 $labels['settingsfor'] = 'Configuración para';
 $labels['preferences'] = 'Preferencias';
 $labels['userpreferences'] = 'Preferencias de usuario';
@@ -215,6 +248,10 @@ $labels['manageidentities'] = 'Gestionar identidades para esta cuenta';
 $labels['newidentity'] = 'Nueva identidad';
 $labels['newitem'] = 'Nuevo';
 $labels['edititem'] = 'Editar';
+$labels['preferhtml'] = 'Prefiero HTML';
+$labels['defaultcharset'] = 'Juego de caracteres por defecto';
+$labels['htmlmessage'] = 'Mensaje HTML';
+$labels['prettydate'] = 'Fecha detallada';
 $labels['setdefault'] = 'Seleccionar opción por defecto';
 $labels['autodetect'] = 'Automático';
 $labels['language'] = 'Idioma';
@@ -223,6 +260,7 @@ $labels['pagesize'] = 'Filas por página';
 $labels['signature'] = 'Firma';
 $labels['dstactive'] = 'Cambio de horario';
 $labels['htmleditor'] = 'Componer mensaje en HTML';
+$labels['htmlonreply'] = 'sólo en respuesta a un mensaje HTML';
 $labels['htmlsignature'] = 'Firma HTML';
 $labels['previewpane'] = 'Mostrar vista preliminar';
 $labels['skin'] = 'Apariencia de la interfaz';
@@ -231,30 +269,58 @@ $labels['logoutcompact'] = 'Compactar la bandeja de entrada al cerrar sesión';
 $labels['uisettings'] = 'Interfaz de usuario';
 $labels['serversettings'] = 'Configuración del servidor';
 $labels['mailboxview'] = 'Vista de buzón';
-$labels['mdnrequests'] = 'Notificaciones de envío';
-$labels['askuser'] = 'preguntar al usuario';
-$labels['autosend'] = 'enviar automáticamente';
+$labels['mdnrequests'] = 'Cuando se pida acuse de recibo';
+$labels['askuser'] = 'preguntarme';
+$labels['autosend'] = 'enviar acuse de recibo';
+$labels['autosendknown'] = 'enviar acuse de recibo a mis contactos, con los demás preguntarme';
+$labels['autosendknownignore'] = 'enviar acuse de recibo a mis contactos, no a los demás';
 $labels['ignore'] = 'ignorar';
 $labels['readwhendeleted'] = 'Marcar el mensaje como leído al borrarlo';
 $labels['flagfordeletion'] = 'Marcar el mensaje para borrarse en vez de borrarlo';
 $labels['skipdeleted'] = 'No mostrar mensajes borrados';
+$labels['deletealways'] = 'Cuando falle trasladar los mensajes a la papelera, borrarlos';
 $labels['showremoteimages'] = 'Mostrar las imágenes externas';
 $labels['fromknownsenders'] = 'de remitentes conocidos';
 $labels['always'] = 'siempre';
 $labels['showinlineimages'] = 'Mostrar imágenes adjuntas debajo del mensaje';
 $labels['autosavedraft'] = 'Guardar borrador automáticamente';
 $labels['everynminutes'] = 'cada $n minuto(s)';
-$labels['keepalive'] = 'Comprobar mensajes en línea';
+$labels['keepalive'] = 'Comprobar si hay mensajes nuevos';
 $labels['never'] = 'nunca';
+$labels['immediately'] = 'inmediatamente';
 $labels['messagesdisplaying'] = 'Vista de mensajes';
 $labels['messagescomposition'] = 'Composición de mensajes';
 $labels['mimeparamfolding'] = 'Nombres de archivos adjuntos';
 $labels['2231folding'] = 'RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'RFC 2047 (otro)';
-$labels['advancedoptions'] = 'Opciones Avanzadas';
-$labels['focusonnewmessage'] = 'Activar la ventana del navegador en un mensaje nuevo';
-$labels['checkallfolders'] = 'Comprobar todas las carpetas para mensajes nuevos';
+$labels['force7bit'] = 'Usar codificación MIME para caracteres de 8 bits';
+$labels['advancedoptions'] = 'Opciones avanzadas';
+$labels['focusonnewmessage'] = 'Activar la ventana del navegador si hay un mensaje nuevo';
+$labels['checkallfolders'] = 'Comprobar en todas las bandejas si hay mensajes nuevos';
+$labels['displaynext'] = 'Después de borrar/mover, mostrar el siguiente mensaje después de borrar/mover un mensaje';
+$labels['mainoptions'] = 'Opciones principales';
+$labels['section'] = 'Sección';
+$labels['maintenance'] = 'Mantenimiento';
+$labels['newmessage'] = 'Nuevo mensaje';
+$labels['listoptions'] = 'Opciones de listado';
+$labels['signatureoptions'] = 'Opciones de firma';
+$labels['whenreplying'] = 'Al responder';
+$labels['replytopposting'] = 'empezar un mensaje nuevo encima del original';
+$labels['replybottomposting'] = 'empezar un mensaje nuevo debajo del original';
+$labels['replyremovesignature'] = 'Eliminar la firma original del mensaje al responder';
+$labels['autoaddsignature'] = 'Añadir firma automáticamente';
+$labels['newmessageonly'] = 'solamente mensaje nuevo';
+$labels['replyandforwardonly'] = 'respuestas y reenvíos solamente';
+$labels['replysignaturepos'] = 'Colocar firma al responder o reenviar';
+$labels['belowquote'] = 'abajo del texto seleccionado';
+$labels['abovequote'] = 'arriba del texto seleccionado';
+$labels['insertsignature'] = 'Insertar firma';
+$labels['previewpanemarkread'] = 'Marcar mensaje previsualizado como leído';
+$labels['afternseconds'] = 'después de $n segundos';
+$labels['reqmdn'] = 'Solicitar siempre un acuse de recibo';
+$labels['reqdsn'] = 'Solicitar siempre la entrega de notificaciones de estado';
+$labels['replysamefolder'] = 'Coloque las respuestas en la bandeja del mensaje que se responde';
 $labels['folder'] = 'Bandeja';
 $labels['folders'] = 'Bandejas';
 $labels['foldername'] = 'Nombre de bandeja';
@@ -262,11 +328,15 @@ $labels['subscribed'] = 'Suscrita';
 $labels['messagecount'] = 'Mensajes';
 $labels['create'] = 'Crear';
 $labels['createfolder'] = 'Crear nueva bandeja';
-$labels['rename'] = 'Renombrar';
-$labels['renamefolder'] = 'Renombrar bandeja';
-$labels['deletefolder'] = 'Eliminar bandeja';
 $labels['managefolders'] = 'Administrar bandejas';
-$labels['specialfolders'] = 'Bandejas Especiales';
+$labels['specialfolders'] = 'Bandejas especiales';
+$labels['properties'] = 'Propiedades';
+$labels['folderproperties'] = 'Propiedades de bandeja';
+$labels['parentfolder'] = 'Bandeja contenedora';
+$labels['location'] = 'Ubicación';
+$labels['info'] = 'Información';
+$labels['getfoldersize'] = 'Clic para saber el tamaño de la bandeja';
+$labels['changesubscription'] = 'Clic para cambiar suscripción';
 $labels['sortby'] = 'Ordenar por';
 $labels['sortasc'] = 'Orden ascendente';
 $labels['sortdesc'] = 'Orden descendente';
@@ -274,5 +344,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Inglés';
+$labels['westerneuropean'] = 'Europeo occidental';
+$labels['easterneuropean'] = 'Europeo oriental';
+$labels['southeasterneuropean'] = 'Europeo sudoriental';
+$labels['baltic'] = 'Báltico';
+$labels['cyrillic'] = 'Cirílico';
+$labels['arabic'] = '√Årabe';
+$labels['greek'] = 'Griego';
+$labels['hebrew'] = 'Hebreo';
+$labels['turkish'] = 'Turco';
+$labels['nordic'] = 'Nórdico';
+$labels['thai'] = 'Tailandés';
+$labels['celtic'] = 'Celta';
+$labels['vietnamese'] = 'Vietnamita';
+$labels['japanese'] = 'Japonés';
+$labels['korean'] = 'Coreano';
+$labels['chinese'] = 'Chino';
 
 ?>
index bf27835b50a22f5e0a3426813cdcd599ff854567..d685fcd482be57163a5d211f56f07ee7cd72b0a4 100644 (file)
@@ -2,36 +2,39 @@
 
 /*
 
-+-----------------------------------------------------------------------+
-| language/es_ES/messages.inc                                           |
-|                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
-| Licensed under the GNU GPL                                            |
-|                                                                       |
-+-----------------------------------------------------------------------+
-| Author: Javier Smaldone <javier@smaldone.com.ar>                      |
-|         http://www.smaldone.com.ar                                    |
-|         David Grajal Blanco <dgrabla@gmail.com>                       |
-|         http://david.grajal.net                                       |
-|         Lito Jornero <jornero@gmail.com>                              |
-|         Angel Bueno Prieto <info@mediaiberia.com>                     |
-|         http://www.mediaiberia.com                                    |
-+-----------------------------------------------------------------------+
++------------------------------------------------------------------------+
+| language/es_ES/messages.inc                                            |
+|                                                                        |
+| Language file of the Roundcube Webmail client                          |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                  |
+| Licensed under the GNU GPL                                             |
+|                                                                        |
++------------------------------------------------------------------------+
+| Authors: Javier Smaldone <javier@smaldone.com.ar>                      |
+|          David Grajal Blanco <dgrabla@gmail.com>                       |
+|          Lito Jornero <jornero@gmail.com>                              |
+|          Ángel Bueno Prieto <info@mediaiberia.com>                     |
+|          José M. Ciordia <ciordia@gmail.com>                           |
++------------------------------------------------------------------------+
 
-@version $Id: messages.inc 2756 2009-07-15 19:31:05Z yllar $
+@version $Id: messages.inc 4368 2010-12-27 08:51:22Z yllar $
 */
 
 $messages = array();
 $messages['loginfailed'] = 'Contraseña o nombre de usuario incorrecto';
 $messages['cookiesdisabled'] = 'Su navegador no acepta cookies';
-$messages['sessionerror'] = 'Su sesión no existe o ha expirado';
+$messages['sessionerror'] = 'Su sesión no es válida o ha expirado';
 $messages['imaperror'] = 'Error de conexión con el servidor IMAP';
-$messages['servererror'] = '¡Error en el servidor!';
+$messages['servererror'] = '¡Error del servidor!';
+$messages['servererrormsg'] = 'Error de servidor: $msg';
+$messages['errorreadonly'] = 'No se ha podido hacer. La bandeja es sólo de lectura';
+$messages['errornoperm'] = 'No se ha podido hacer. Permiso denegado';
+$messages['invalidrequest'] = '¡Petición no válida! No se han guardado los datos.';
 $messages['nomessagesfound'] = 'No se han encontrado mensajes en esta casilla';
-$messages['loggedout'] = 'Ha cerrado la sesión. ¡Hasta pronto!';
+$messages['loggedout'] = 'Ha cerrado bien la sesión. ¡Hasta pronto!';
 $messages['mailboxempty'] = 'La casilla está vacía';
 $messages['loading'] = 'Cargando...';
+$messages['uploading'] = 'Subiendo fichero...';
 $messages['loadingdata'] = 'Cargando datos...';
 $messages['checkingmail'] = 'Verificando si hay nuevos mensajes...';
 $messages['sendingmessage'] = 'Enviando mensaje...';
@@ -50,21 +53,22 @@ $messages['senttooquickly'] = 'Por favor, espere $sec segundo(s) antes de mandar
 $messages['errorsavingsent'] = 'Ha ocurrido un error al guardar el mensaje enviado';
 $messages['errorsaving'] = 'Ocurrió un error mientras se guardaba';
 $messages['errormoving'] = 'No se ha podido mover el mensaje';
+$messages['errorcopying'] = 'No se ha podido copiar el/los mensaje(s)';
 $messages['errordeleting'] = 'No se ha podido eliminar el mensaje';
 $messages['errormarking'] = 'No se ha podido marcar el mensaje';
 $messages['deletecontactconfirm'] = '¿Realmente quiere eliminar los contactos seleccionados?';
 $messages['deletemessagesconfirm'] = '¿Realmente quiere eliminar los mensajes seleccionados?';
-$messages['deletefolderconfirm'] = '¿Realmente quiere eliminar esta carpeta?';
-$messages['purgefolderconfirm'] = '¿Realmente quiere eliminar todos los mensajes de esta carpeta?';
-$messages['foldercreating'] = 'Creando carpeta...';
-$messages['folderdeleting'] = 'Borrando carpeta...';
-$messages['folderrenaming'] = 'Renombrando carpeta...';
-$messages['foldermoving'] = 'Moviendo carpeta...';
+$messages['deletefolderconfirm'] = '¿Realmente quiere eliminar esta bandeja?';
+$messages['purgefolderconfirm'] = '¿Realmente quiere eliminar todos los mensajes de esta bandeja?';
+$messages['folderdeleting'] = 'Borrando bandeja...';
+$messages['foldermoving'] = 'Moviendo bandeja...';
+$messages['foldersubscribing'] = 'Suscribiendo bandeja...';
+$messages['folderunsubscribing'] = 'Anulando suscripción a bandeja...';
 $messages['formincomplete'] = 'No ha rellenado todos los campos del formulario';
-$messages['noemailwarning'] = 'Por favor, introduzca un e-mail válido';
+$messages['noemailwarning'] = 'Por favor, introduzca un email válido';
 $messages['nonamewarning'] = 'Por favor, introduzca su nombre';
 $messages['nopagesizewarning'] = 'Por favor, introduzca un tamaño de página';
-$messages['nosenderwarning'] = 'Por favor, introduzca el e-mail del emisor';
+$messages['nosenderwarning'] = 'Por favor, introduzca el email del emisor';
 $messages['norecipientwarning'] = 'Por favor, introduzca al menos un destinatario';
 $messages['nosubjectwarning'] = 'El campo "Asunto" está vacío. ¿Desea completarlo en este momento?';
 $messages['nobodywarning'] = '¿Quiere enviar este mensaje sin texto?';
@@ -72,29 +76,38 @@ $messages['notsentwarning'] = 'El mensaje no ha sido enviado. ¿Desea descartar
 $messages['noldapserver'] = 'Por favor, seleccione un servidor LDAP para buscar';
 $messages['nocontactsreturned'] = 'No se han encontrado contactos';
 $messages['nosearchname'] = 'Por favor, introduzca un nombre o la dirección de e-mail';
+$messages['notuploadedwarning'] = 'No se han subido aún todos los adjuntos. Por favor espere o cancele la subida.';
 $messages['searchsuccessful'] = 'Se encontraron $nr mensajes';
 $messages['searchnomatch'] = 'No se obtuvieron resultados';
 $messages['searching'] = 'Buscando...';
 $messages['checking'] = 'Revisando...';
 $messages['nospellerrors'] = 'No se encontraron errores ortográficos';
-$messages['folderdeleted'] = 'Carpeta eliminada exitosamente';
-$messages['deletedsuccessfully'] = 'Eliminado exitosamente';
-$messages['converting'] = 'Removiendo el formato del mensaje...';
+$messages['folderdeleted'] = 'Bandeja eliminada correctamente';
+$messages['foldersubscribed'] = 'Suscripción a bandeja anulada correctamente';
+$messages['folderunsubscribed'] = 'Suscrito a bandeja correctamente';
+$messages['folderpurged'] = 'Bandeja purgada correctamente';
+$messages['folderexpunged'] = 'Bandeja vaciada correctamente';
+$messages['deletedsuccessfully'] = 'Eliminado correctamente';
+$messages['converting'] = 'Quitando el formato del mensaje...';
 $messages['messageopenerror'] = 'No puedo descargar el mensaje del servidor';
 $messages['fileuploaderror'] = 'Error al subir archivos';
 $messages['filesizeerror'] = 'El archivo excede el tamaño máximo ($size)';
-$messages['copysuccess'] = '$nr direcciones copiadas con éxito';
+$messages['copysuccess'] = '$nr direcciones copiadas correctamente';
 $messages['copyerror'] = 'No se pudo copiar ninguna dirección';
-$messages['sourceisreadonly'] = 'Esta dirección es de sólo-lectura';
+$messages['sourceisreadonly'] = 'Esta dirección es de sólo lectura';
 $messages['errorsavingcontact'] = 'No se pudo guardar la dirección de contacto';
 $messages['movingmessage'] = 'Moviendo mensaje...';
-$messages['receiptsent'] = 'La notificación de lectura se ha enviado con éxito.';
+$messages['copyingmessage'] = 'Copiando mensaje...';
+$messages['deletingmessage'] = 'Eliminando mensaje(s)...';
+$messages['markingmessage'] = 'Marcando mensaje(s)...';
+$messages['receiptsent'] = 'La notificación de lectura se ha enviado correctamente.';
 $messages['errorsendingreceipt'] = 'No se ha podido enviar la notificación de lectura.';
 $messages['nodeletelastidentity'] = 'No se puede borrar esta identidad puesto que es la última.';
-$messages['addsubfolderhint'] = 'Esta carpeta se creará como una subcarpeta dentro de la carpeta seleccionada';
-$messages['forbiddencharacter'] = 'El nombre de la carpeta contiene un carácter prohibido';
+$messages['forbiddencharacter'] = 'El nombre de la bandeja contiene un carácter prohibido';
 $messages['selectimportfile'] = 'Por favor, seleccione un archivo para subir';
 $messages['addresswriterror'] = 'No se puede escribir la dirección de contacto seleccionada';
+$messages['contactaddedtogroup'] = 'Se han añadido correctamente los contactos a este grupo.';
+$messages['contactremovedfromgroup'] = 'Se han borrado correctamente los contactos de este grupo.';
 $messages['importwait'] = 'Importando, espere...';
 $messages['importerror'] = '¡Error al importar! Este archivo no es un formato válido vCard.';
 $messages['importconfirm'] = '<b>Se han insertado: $inserted contactos, y se han omitido: $skipped porque ya existían</b>:<p><em>$names</em></p>';
@@ -104,9 +117,28 @@ $messages['editorwarning'] = 'Cambiando a texto plano perderá el formato del me
 $messages['httpreceivedencrypterror'] = 'Ha ocurrido un error fatal de configuración. Contacte inmediatamente a su administrador. <b>Su mensaje no ha sido enviado.</b>';
 $messages['smtpconnerror'] = 'Error SMTP ($code): Ha fallado la conexión al servidor';
 $messages['smtpautherror'] = 'Error SMTP ($code): Error de autenticación';
-$messages['smtpfromerror'] = 'Error SMTP ($code): No se ha podido asignar el emisor "$from"';
-$messages['smtptoerror'] = 'Error SMTP ($code): No se ha podido establecer remitente "$to"';
+$messages['smtpfromerror'] = 'Error SMTP ($code): No se ha podido asignar el emisor "$from" ($msg)';
+$messages['smtptoerror'] = 'Error SMTP ($code): No se ha podido establecer remitente "$to" ($msg)';
 $messages['smtprecipientserror'] = 'Error SMTP: No es posible analizar la lista de destinatarios';
+$messages['smtpdsnerror'] = 'Error SMTP: No hay soporte para los acuses de recibo';
 $messages['smtperror'] = 'Error SMTP: $msg';
+$messages['emailformaterror'] = 'Dirección e-mail incorrecta: $email';
+$messages['toomanyrecipients'] = 'Hay demasiados destinatarios. Reduzca el número de destinatarios a $max.';
+$messages['maxgroupmembersreached'] = 'El número de miembros del grupo excede el máximo de $max.';
+$messages['internalerror'] = 'Ocurrió un error interno. Por favor, inténtalo de nuevo';
+$messages['contactdelerror'] = 'No se ha podido eliminar el contacto(s)';
+$messages['contactdeleted'] = 'Contacto(s) eliminado(s) correctamente';
+$messages['groupdeleted'] = 'Grupo eliminado correctamente';
+$messages['grouprenamed'] = 'Grupo renombrado correctamente';
+$messages['groupcreated'] = 'Grupo creado correctamente';
+$messages['messagedeleted'] = 'Mensaje(s) eliminado(s) correctamente';
+$messages['messagemoved'] = 'Mensaje(s) movido(s) correctamente';
+$messages['messagecopied'] = 'Mensaje(s) copiado(s) correctamente';
+$messages['messagemarked'] = 'Mensaje(s) marcado(s) correctamente';
+$messages['autocompletechars'] = 'Introduce al menos $min caracteres para autocompletar';
+$messages['namecannotbeempty'] = 'Hay que poner el nombre';
+$messages['nametoolong'] = 'El nombre es demasiado largo';
+$messages['folderupdated'] = 'Bandeja actualizada correctamente';
+$messages['foldercreated'] = 'Bandeja creada correctamente';
 
 ?>
index 0a0bf1ae0d6f144cc5f218338515c19a8e2c3271..2265edbdfe1bd254c4b215b0e226f08c90cc5487 100644 (file)
@@ -5,20 +5,22 @@
 +-----------------------------------------------------------------------+
 | language/et_EE/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Üllar Pajus <yllar.pajus@gmail.com>                           |
+|         Raivo Hool <raivo.hool@gmail.com>                             |
+|         Elan Ruusamäe <glen@delfi.ee>                                 |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: labels.inc 4370 2010-12-27 14:16:46Z yllar $
 
 */
 
 $labels = array();
-$labels['welcome'] = 'Teretulemast kasutama $product';
+$labels['welcome'] = 'Tere tulemast! See on $product.';
 $labels['username'] = 'Kasutajanimi';
 $labels['password'] = 'Parool';
 $labels['server'] = 'Server';
@@ -27,7 +29,7 @@ $labels['logout'] = 'Logi välja';
 $labels['mail'] = 'Postkast';
 $labels['settings'] = 'Seaded';
 $labels['addressbook'] = 'Aadressiraamat';
-$labels['inbox'] = 'Sissetulevad';
+$labels['inbox'] = 'Saabuvad';
 $labels['drafts'] = 'Mustandid';
 $labels['sent'] = 'Saadetud';
 $labels['trash'] = 'Prügikast';
@@ -38,21 +40,22 @@ $labels['to'] = 'Saaja';
 $labels['cc'] = 'Koopia';
 $labels['bcc'] = 'Pimekoopia';
 $labels['replyto'] = 'Vastus aadressile';
+$labels['followupto'] = 'Followup-To';
 $labels['date'] = 'Kuupäev';
 $labels['size'] = 'Suurus';
 $labels['priority'] = 'Tähtsus';
 $labels['organization'] = 'Organisatsioon';
-$labels['reply-to'] = 'Vastus aadressile';
+$labels['readstatus'] = 'Lugemise staatus';
 $labels['mailboxlist'] = 'Kaustad';
 $labels['messagesfromto'] = 'Kirjed $from kuni $to, kokku $count';
+$labels['threadsfromto'] = 'Lõimed $from kuni $to, kokku $count';
 $labels['messagenrof'] = 'Kiri $nr, kokku $count';
+$labels['copy'] = 'Kopeeri';
+$labels['move'] = 'Liiguta';
 $labels['moveto'] = 'liiguta kausta...';
-$labels['download'] = 'lae arvutisse';
+$labels['download'] = 'laadi arvutisse';
 $labels['filename'] = 'Faili nimi';
 $labels['filesize'] = 'Faili suurus';
-$labels['preferhtml'] = 'Eelista HTMLi';
-$labels['htmlmessage'] = 'HTML kirjad';
-$labels['prettydate'] = 'Kenad kuupäevad';
 $labels['addtoaddressbook'] = 'Lisa aadressiraamatusse';
 $labels['sun'] = 'P';
 $labels['mon'] = 'E';
@@ -97,6 +100,8 @@ $labels['checkmail'] = 'Kontrolli uusi kirju';
 $labels['writenewmessage'] = 'Kirjuta uus kiri';
 $labels['replytomessage'] = 'Vasta kirjale';
 $labels['replytoallmessage'] = 'Vasta saatjale ja teistele kirja saanutele';
+$labels['replyall'] = 'Vasta kõigile';
+$labels['replylist'] = 'Vasta meilinglisti';
 $labels['forwardmessage'] = 'Edasta see kiri';
 $labels['deletemessage'] = 'Kustuta kiri';
 $labels['movemessagetotrash'] = 'Liiguta kiri prügikasti';
@@ -120,16 +125,38 @@ $labels['messageactions'] = 'Veel tegevusi...';
 $labels['select'] = 'Vali';
 $labels['all'] = 'kõik';
 $labels['none'] = 'mitte midagi';
-$labels['unread'] = 'mitte loetud';
+$labels['currpage'] = 'Praegune leht';
+$labels['unread'] = 'Lugemata';
 $labels['flagged'] = 'Märgistatud';
 $labels['unanswered'] = 'Vastamata';
 $labels['deleted'] = 'Kustutatud';
 $labels['invert'] = 'Vaheta';
 $labels['filter'] = 'Filtreeri';
+$labels['list'] = 'Nimekiri';
+$labels['threads'] = 'Lõimed';
+$labels['expand-all'] = 'Laienda kõik';
+$labels['expand-unread'] = 'Laienda lugemata';
+$labels['collapse-all'] = 'Pane kõik kokku';
+$labels['threaded'] = 'Lõimedena';
+$labels['autoexpand_threads'] = 'Laienda kirjade lõimed';
+$labels['do_expand'] = 'kõik lõimed';
+$labels['expand_only_unread'] = 'ainult lugemata kirjadega';
+$labels['fromto'] = 'Saatja/saaja';
+$labels['flag'] = 'Märgista';
+$labels['attachment'] = 'Manus';
+$labels['nonesort'] = 'Puudub';
+$labels['sentdate'] = 'Saatmise kuupäev';
+$labels['arrival'] = 'Saamise kuupäev';
+$labels['asc'] = 'kasvavalt';
+$labels['desc'] = 'kahanevalt';
+$labels['listcolumns'] = 'Näita veerge';
+$labels['listsorting'] = 'Järjestus veerg';
+$labels['listorder'] = 'Järjestus suund';
+$labels['listmode'] = 'Nimekirja vaatamise režiim';
+$labels['folderactions'] = 'Kausta tegevused...';
 $labels['compact'] = 'Tihenda';
 $labels['empty'] = 'Tühjenda';
-$labels['purge'] = 'Puhasta';
-$labels['quota'] = 'Ketta kasutus';
+$labels['quota'] = 'Kettakasutus';
 $labels['unknown'] = 'teadmata';
 $labels['unlimited'] = 'piiramatu';
 $labels['quicksearch'] = 'Kiirotsing';
@@ -139,19 +166,22 @@ $labels['msgtext'] = 'Kogu kirjast';
 $labels['openinextwin'] = 'Ava uues aknas';
 $labels['emlsave'] = 'Salvesta (.eml)';
 $labels['compose'] = 'Koosta kiri';
-$labels['editasnew'] = 'Muuda uuena';
-$labels['savemessage'] = 'Salvesta see mustand';
+$labels['editasnew'] = 'Kasuta uue kirja põhjana';
+$labels['savemessage'] = 'Salvesta mustand';
 $labels['sendmessage'] = 'Saada kiri kohe';
 $labels['addattachment'] = 'Lisa fail';
 $labels['charset'] = 'Märgistik';
 $labels['editortype'] = 'Redaktori tüüp';
 $labels['returnreceipt'] = 'Kättesaamiskinnitus';
+$labels['dsn'] = 'Kohalejõudmise teavitus';
+$labels['editidents'] = 'Muuda Identiteete';
 $labels['checkspelling'] = 'Kontrolli õigekirja';
 $labels['resumeediting'] = 'Jätka muutmist';
-$labels['revertto'] = 'Muuda tagasi';
+$labels['revertto'] = 'Pööra tagasi';
 $labels['attachments'] = 'Manused';
 $labels['upload'] = 'Kinnita manus';
 $labels['close'] = 'Sulge';
+$labels['messageoptions'] = 'Kirja valikud...';
 $labels['low'] = 'Madal';
 $labels['lowest'] = 'Madalaim';
 $labels['normal'] = 'Tavaline';
@@ -159,7 +189,7 @@ $labels['high'] = 'Kõrge';
 $labels['highest'] = 'Kõrgeim';
 $labels['nosubject'] = '(teema puudub)';
 $labels['showimages'] = 'Näita pilte';
-$labels['alwaysshow'] = 'Alati näita $sender saadetud pilte';
+$labels['alwaysshow'] = 'Näita alati $sender saadetud pilte';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Lihttekst';
 $labels['savesentmessagein'] = 'Salvesta saadetud kirjad kausta';
@@ -168,20 +198,24 @@ $labels['maxuploadsize'] = 'Faili maksimaalne lubatud suurus on $size';
 $labels['addcc'] = 'Lisa koopia';
 $labels['addbcc'] = 'Lisa pimekoopia';
 $labels['addreplyto'] = 'Lisa vastus aadressile';
-$labels['mdnrequest'] = 'Selle kirja saatja soovib saada kinnitust kirja lugemise kohta. Soovid kinnituse saata ?';
+$labels['addfollowupto'] = 'Lisa Followup-To';
+$labels['mdnrequest'] = 'Selle kirja saatja soovib saada kinnitust kirja lugemise kohta. Kas soovid kinnituse saata?';
 $labels['receiptread'] = 'Kättesaamiskinnitus (leotud)';
 $labels['yourmessage'] = 'See on sinu saadetud kirja kättesaamiskinnitus';
 $labels['receiptnote'] = 'Märkus: Kättesaamiskinnituse saamine tähendab ainult seda, et saaja on kirja avanud. Pole mingit garantiid, et ta kirja tegelikult luges ja selle sisust aru sai.';
 $labels['name'] = 'Näidatav nimi';
 $labels['firstname'] = 'Eesnimi';
 $labels['surname'] = 'Perekonnanimi';
-$labels['email'] = 'E-Mail';
+$labels['email'] = 'E-post';
 $labels['addcontact'] = 'Uue kontakti lisamine';
 $labels['editcontact'] = 'Muuda kontakti';
+$labels['contacts'] = 'Kontaktid';
+$labels['contactproperties'] = 'Kontakti omadused';
 $labels['edit'] = 'Muuda';
 $labels['cancel'] = 'Katkesta';
 $labels['save'] = 'Salvesta';
 $labels['delete'] = 'Kustuta';
+$labels['rename'] = 'Nimeta ümber';
 $labels['newcontact'] = 'Uue sissekande loomine';
 $labels['deletecontact'] = 'Kustuta märgistatud kontaktid';
 $labels['composeto'] = 'Kirjuta kiri';
@@ -189,17 +223,20 @@ $labels['contactsfromto'] = 'Kirjed $from kuni $to, kokku $count';
 $labels['print'] = 'Trüki';
 $labels['export'] = 'Ekspordi';
 $labels['exportvcards'] = 'Ekspordi kontaktid vCardi formaadis';
+$labels['newcontactgroup'] = 'Loo uus kontaktigrupp';
+$labels['groupactions'] = 'Kontaktigrupi tegevused...';
 $labels['previouspage'] = 'Näita eelmist lehte';
 $labels['firstpage'] = 'Näita esimest komplekti';
 $labels['nextpage'] = 'Näita järgmist lehte';
 $labels['lastpage'] = 'Näita viimast komplekti';
+$labels['group'] = 'Grupp';
 $labels['groups'] = 'Grupid';
 $labels['personaladrbook'] = 'Isiklikud aadressid';
 $labels['import'] = 'Impordi';
 $labels['importcontacts'] = 'Impordi kontakte';
 $labels['importfromfile'] = 'Impordi failist:';
 $labels['importreplace'] = 'Asenda kogu aadressiraamat';
-$labels['importtext'] = 'Sa saad sisestada kontakte olemasolevast aadressiraamatust. Praegu on toetatud <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> formaat.';
+$labels['importtext'] = 'Sa saad üle kanda kontakte olemasolevast aadressiraamatust. Praegu on toetatud <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> formaat.';
 $labels['done'] = 'Valmis';
 $labels['settingsfor'] = 'Kasutajaeelistused kontole';
 $labels['preferences'] = 'Eelistused';
@@ -210,14 +247,19 @@ $labels['manageidentities'] = 'Halda selle konto identiteete';
 $labels['newidentity'] = 'Uus identiteet';
 $labels['newitem'] = 'Uus sissekanne';
 $labels['edititem'] = 'Muuda sissekannet';
+$labels['preferhtml'] = 'Eelista HTMLi';
+$labels['defaultcharset'] = 'Vaikimisi märgistik';
+$labels['htmlmessage'] = 'HTML kirjad';
+$labels['prettydate'] = 'Kenad kuupäevad';
 $labels['setdefault'] = 'Muuda vaikeseadeks';
 $labels['autodetect'] = 'Automaatne';
 $labels['language'] = 'Keel';
-$labels['timezone'] = 'Ajatsoon';
+$labels['timezone'] = 'Ajavöönd';
 $labels['pagesize'] = 'Ridu lehe kohta';
 $labels['signature'] = 'Allkiri';
 $labels['dstactive'] = 'Suveaeg';
 $labels['htmleditor'] = 'Kasuta HTML redaktorit';
+$labels['htmlonreply'] = 'vaid HTML kirja vastamisel';
 $labels['htmlsignature'] = 'HTML allkiri';
 $labels['previewpane'] = 'Näita eelvaate akent';
 $labels['skin'] = 'Kliendi välimus';
@@ -229,10 +271,13 @@ $labels['mailboxview'] = 'Postkasti vaade';
 $labels['mdnrequests'] = 'Kättesaamis kinnitus';
 $labels['askuser'] = 'küsi kasutajalt';
 $labels['autosend'] = 'saada automaatselt';
+$labels['autosendknown'] = 'saada automaatselt minu kontaktidele, teised küsi üle';
+$labels['autosendknownignore'] = 'saada automaatselt minu kontaktidele, teised ignoreeri';
 $labels['ignore'] = 'ignoreeri';
 $labels['readwhendeleted'] = 'Märgi kiri kustutamisel loetuks';
 $labels['flagfordeletion'] = 'Kustutamise asemel märgi kiri kustutatavaks';
 $labels['skipdeleted'] = 'Ära näita kustutatud kirju';
+$labels['deletealways'] = 'Kui kirja prügikasti liigutamine nurjub siis kustuta need';
 $labels['showremoteimages'] = 'Näita kirjas kaugelt kaasatud pilte';
 $labels['fromknownsenders'] = 'tuntud saatjatelt';
 $labels['always'] = 'alati';
@@ -241,22 +286,40 @@ $labels['autosavedraft'] = 'Salvesta mustandid automaatselt';
 $labels['everynminutes'] = 'iga $n minuti tagant';
 $labels['keepalive'] = 'Kontrolli uusi kirju';
 $labels['never'] = 'mitte kunagi';
+$labels['immediately'] = 'otsekohe';
 $labels['messagesdisplaying'] = 'Kirjade näitamine';
 $labels['messagescomposition'] = 'Kirja koostamine ';
 $labels['mimeparamfolding'] = 'Manuste nimed';
 $labels['2231folding'] = 'Täielik RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Täielik RFC 2047 (muu)';
+$labels['force7bit'] = '8-bitiste märkide puhul kasuta MIME kodeerimist';
 $labels['advancedoptions'] = 'Lisaseadistused';
-$labels['focusonnewmessage'] = 'Fokusseeri brauseri aken uue kirja korral';
+$labels['focusonnewmessage'] = 'Fookusta brauseri aken uue kirja korral';
 $labels['checkallfolders'] = 'Kontrolli uusi kirju kõigist kaustadest';
-$labels['displaynext'] = 'Peale kirja kustutamist/liigutamist näita järgmist kirja';
-$labels['indexsort'] = 'Kasuta kuupäeva järgi sorteerimiseks kirjade indeksit';
+$labels['displaynext'] = 'Pärast kirja kustutamist/liigutamist näita järgmist kirja';
 $labels['mainoptions'] = 'Peamised valikud';
 $labels['section'] = 'Osa';
 $labels['maintenance'] = 'Hooldus';
 $labels['newmessage'] = 'Uus kiri';
 $labels['listoptions'] = 'Nimekirja valikud';
+$labels['signatureoptions'] = 'Allkirja valikud';
+$labels['whenreplying'] = 'Vastates';
+$labels['replytopposting'] = 'alusta uue kirjaga esialgse kohal';
+$labels['replybottomposting'] = 'alusta uue kirjaga esialgse all';
+$labels['replyremovesignature'] = 'Vastates eemalda kirjast esialgne allkiri';
+$labels['autoaddsignature'] = 'Lisa allkiri automaatselt';
+$labels['newmessageonly'] = 'ainult uutele';
+$labels['replyandforwardonly'] = 'ainult vastates ja edastades';
+$labels['replysignaturepos'] = 'Vastates või edastades aseta allkiri';
+$labels['belowquote'] = 'tsiteeritu alla';
+$labels['abovequote'] = 'tsiteeritu kohale';
+$labels['insertsignature'] = 'Sisesta allkiri';
+$labels['previewpanemarkread'] = 'Märgi eelvaadatud kirjad loetuks';
+$labels['afternseconds'] = '$n sekundi pärast';
+$labels['reqmdn'] = 'Alati nõua kättesaamise kinnitust';
+$labels['reqdsn'] = 'Alati nõua kohalejõudmise teavitust';
+$labels['replysamefolder'] = 'Paiguta vastused samasse kausta, millele vastatakse';
 $labels['folder'] = 'Kaust';
 $labels['folders'] = 'Kaustad';
 $labels['foldername'] = 'Kausta nimi';
@@ -264,17 +327,39 @@ $labels['subscribed'] = 'Näitan';
 $labels['messagecount'] = 'Kirju';
 $labels['create'] = 'Loo';
 $labels['createfolder'] = 'Uue kausta loomine';
-$labels['rename'] = 'Nimeta ümber';
-$labels['renamefolder'] = 'Nimeta olemasolev kaust ümber';
-$labels['deletefolder'] = 'Kustuta kaust';
 $labels['managefolders'] = 'Halda kaustu';
 $labels['specialfolders'] = 'Erilised kaustad';
+$labels['properties'] = 'Omadused';
+$labels['folderproperties'] = 'Kausta omadused';
+$labels['parentfolder'] = 'Ülemine kaust';
+$labels['location'] = 'Asukoht';
+$labels['info'] = 'Teave';
+$labels['getfoldersize'] = 'Kliki kausta suuruse teadasaamiseks';
+$labels['changesubscription'] = 'Kliki kausta tellimuste muutmiseks';
 $labels['sortby'] = 'Järjesta';
 $labels['sortasc'] = 'Järjesta kasvavalt';
 $labels['sortdesc'] = 'Järjesta kahanevalt';
 $labels['B'] = 'B';
-$labels['KB'] = 'KB';
-$labels['MB'] = 'MB';
-$labels['GB'] = 'GB';
+$labels['KB'] = 'KiB';
+$labels['MB'] = 'MiB';
+$labels['GB'] = 'GiB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'inglise';
+$labels['westerneuropean'] = 'Lääne-Euroopa';
+$labels['easterneuropean'] = 'Ida-Euroopa';
+$labels['southeasterneuropean'] = 'Kagu-Euroopa';
+$labels['baltic'] = 'balti';
+$labels['cyrillic'] = 'kirillitsa';
+$labels['arabic'] = 'araabia';
+$labels['greek'] = 'kreeka';
+$labels['hebrew'] = 'heebrea';
+$labels['turkish'] = 'türgi';
+$labels['nordic'] = 'põhjamaa';
+$labels['thai'] = 'tai';
+$labels['celtic'] = 'keldi';
+$labels['vietnamese'] = 'vietnami';
+$labels['japanese'] = 'jaapani';
+$labels['korean'] = 'korea';
+$labels['chinese'] = 'hiina';
 
 ?>
index 3247ac416560669953bd7dceb2e4cfcdf28b15f0..fec747d58018ad636495cf8e5a40c8ebaedb889a 100644 (file)
@@ -5,39 +5,44 @@
 +-----------------------------------------------------------------------+
 | language/et_EE/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Üllar Pajus <yllar.pajus@gmail.com>                           |
+|         Raivo Hool <raivo.hool@gmail.com>                             |
+|         Elan Ruusamäe <glen@delfi.ee>                                 |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: messages.inc 4370 2010-12-27 14:16:46Z yllar $
 
 */
 
 $messages = array();
 $messages['loginfailed'] = 'Sisselogimine ebaõnnestus';
 $messages['cookiesdisabled'] = 'Sinu veebilehitseja ei võta präänikuid vastu';
-$messages['sessionerror'] = 'Sinu sessioon on aegunud või vigane';
+$messages['sessionerror'] = 'Sinu seanss on aegunud või vigane';
 $messages['imaperror'] = 'Ei õnnestunud IMAP serveriga ühendust luua';
 $messages['servererror'] = 'Serveri tõrge!';
+$messages['servererrormsg'] = 'Serveri tõrge: $msg';
+$messages['errorreadonly'] = 'Operatsioon nurjus. Kaustale on vaid lugemisõigus';
+$messages['errornoperm'] = 'Operatsioon nurjus. Ligipääsu õigused puuduvad';
 $messages['invalidrequest'] = 'Lubamatu päring! Andmeid ei salvestatud.';
 $messages['nomessagesfound'] = 'Postkast paistab tühi olevat';
-$messages['loggedout'] = 'Sinu sessioon on edukalt lõpetatud. Nägemiseni!';
+$messages['loggedout'] = 'Sinu seanss on edukalt lõpetatud. Nägemiseni!';
 $messages['mailboxempty'] = 'Postkast on tühi';
-$messages['loading'] = 'Laadimine...';
-$messages['uploading'] = 'Faili üleslaadimine...';
+$messages['loading'] = 'Laadin...';
+$messages['uploading'] = 'Laadin faili üles...';
 $messages['loadingdata'] = 'Andmete laadimine...';
-$messages['checkingmail'] = 'Uute kirjade kontrollimine...';
-$messages['sendingmessage'] = 'Kirja saatmine...';
+$messages['checkingmail'] = 'Kontrollin uusi kirju...';
+$messages['sendingmessage'] = 'Saadan kirja...';
 $messages['messagesent'] = 'Kiri edukalt saadetud';
-$messages['savingmessage'] = 'Kirja salvestamine...';
-$messages['messagesaved'] = 'Kiri salvestatud Mustanditesse';
+$messages['savingmessage'] = 'Salvestan kirja...';
+$messages['messagesaved'] = 'Kiri salvestatud mustanditesse';
 $messages['successfullysaved'] = 'Edukalt salvestatud';
 $messages['addedsuccessfully'] = 'Kontakt lisati edukalt aadressiraamatusse';
-$messages['contactexists'] = 'Sama e-maili aadressiga kontakt on juba olemas';
+$messages['contactexists'] = 'Sellise e-posti aadressiga kontakt on juba olemas';
 $messages['blockedimages'] = 'Sinu privaatsuse kaitsmiseks on selles kirjas välised pildid blokeeritud.';
 $messages['encryptedmessage'] = 'See on krüpteeritud kiri ja kahjuks pole seda võimalik näidata. Andestust!';
 $messages['nocontactsfound'] = 'Ei leitud ühtegi kontakti';
@@ -47,37 +52,42 @@ $messages['senttooquickly'] = 'Palun oota enne selle kirja saatmist $sec sekundi
 $messages['errorsavingsent'] = 'Saadetud kirja salvestamisel ilmnes tõrge';
 $messages['errorsaving'] = 'Salvestamise ajal ilmnes viga';
 $messages['errormoving'] = 'Ei suutnud seda kirja liigutada';
+$messages['errorcopying'] = 'Kirju ei õnnestunud kopeerida';
 $messages['errordeleting'] = 'Ei suutnud seda kirja kustutada';
 $messages['errormarking'] = 'Kirja märkimine nurjus';
-$messages['deletecontactconfirm'] = 'Soovid valitud kontaktid kustutada ?';
-$messages['deletemessagesconfirm'] = 'Soovid valitud kirja(d) kustutada ?';
-$messages['deletefolderconfirm'] = 'Soovid selle kataloogi kindlasti kustutada ?';
-$messages['purgefolderconfirm'] = 'Soovid sellest kaustast kõik kirjad kustutada ?';
-$messages['foldercreating'] = 'Kausta loomine...';
-$messages['folderdeleting'] = 'Kausta kustutamine...';
-$messages['folderrenaming'] = 'Kausta ümber nimetamine...';
-$messages['foldermoving'] = 'Kausta liigutamine...';
+$messages['deletecontactconfirm'] = 'Soovid valitud kontaktid kustutada?';
+$messages['deletemessagesconfirm'] = 'Soovid valitud kirja(d) kustutada?';
+$messages['deletefolderconfirm'] = 'Soovid selle kataloogi kindlasti kustutada?';
+$messages['purgefolderconfirm'] = 'Soovid sellest kaustast kõik kirjad kustutada?';
+$messages['folderdeleting'] = 'Kustutan kausta...';
+$messages['foldermoving'] = 'Liigutan kausta...';
+$messages['foldersubscribing'] = 'Tellin kausta...';
+$messages['folderunsubscribing'] = 'Peatan kausta tellimuse...';
 $messages['formincomplete'] = 'Vormi kõik väljad ei ole täidetud';
-$messages['noemailwarning'] = 'Palun sisesta toimiv e-maili aadress';
+$messages['noemailwarning'] = 'Palun sisesta toimiv e-posti aadress';
 $messages['nonamewarning'] = 'Palun sisesta nimi';
 $messages['nopagesizewarning'] = 'Palun sisesta lehekülje suurus';
 $messages['nosenderwarning'] = 'Palun sisesta saatja e-posti aadress';
-$messages['norecipientwarning'] = 'Palun sisesta vähemalt üks kirjasaaja';
-$messages['nosubjectwarning'] = 'Väli "Pealkiri" on tühi. Soovid selle ära täita ?';
-$messages['nobodywarning'] = 'Saadan selle kirja ilma tekstita ?';
-$messages['notsentwarning'] = 'Kirja ei suudetud saata. Soovid selle ära visata ?';
+$messages['norecipientwarning'] = 'Palun sisesta vähemalt üks adressaat';
+$messages['nosubjectwarning'] = 'Väli „Pealkiri“ on tühi. Soovid selle ära täita?';
+$messages['nobodywarning'] = 'Saadan selle kirja ilma tekstita?';
+$messages['notsentwarning'] = 'Kirja saatmine nurjus. Soovid selle ära visata?';
 $messages['noldapserver'] = 'Palun vali otsinguks LDAPi server';
 $messages['nocontactsreturned'] = 'Ühtegi kontakti ei leitud';
-$messages['nosearchname'] = 'Palun sisesta kontakti nimi või e-maili aadress';
-$messages['notuploadedwarning'] = 'Kõik manused pole veel üles laaditud. Palun oota või tühista üleslaadimine.';
+$messages['nosearchname'] = 'Palun sisesta kontakti nimi või e-posti aadress';
+$messages['notuploadedwarning'] = 'Kõiki manuseid ei ole veel üles laaditud. Palun oota või tühista üleslaadimine.';
 $messages['searchsuccessful'] = 'Leiti $nr kirja';
 $messages['searchnomatch'] = 'Otsingule vastavaid kirju ei leitud';
-$messages['searching'] = 'Otsimine...';
-$messages['checking'] = 'Kontrollimine...';
-$messages['nospellerrors'] = 'Õigekirja vigu ei leitud';
+$messages['searching'] = 'Otsin...';
+$messages['checking'] = 'Kontrollin...';
+$messages['nospellerrors'] = 'Õigekirjavigu ei leitud';
 $messages['folderdeleted'] = 'Kausta kustutamine õnnestus';
+$messages['foldersubscribed'] = 'Kausta tellimine õnnestus';
+$messages['folderunsubscribed'] = 'Kausta tellimise peatamine õnnestus';
+$messages['folderpurged'] = 'Kaust puhastatud edukalt';
+$messages['folderexpunged'] = 'Kaust tühjendatud edukalt';
 $messages['deletedsuccessfully'] = 'Edukalt kustutatud';
-$messages['converting'] = 'Kirjast vorminduse eemaldamine...';
+$messages['converting'] = 'Eemaldan kirjast vormindust...';
 $messages['messageopenerror'] = 'Kirjade serverist laadimine ebaõnnestus';
 $messages['fileuploaderror'] = 'Faili üleslaadimine ebaõnnestus';
 $messages['filesizeerror'] = 'Üleslaetava faili suurus ületab maksimaalse suuruse $size';
@@ -85,27 +95,49 @@ $messages['copysuccess'] = '$nr aadressi edukalt kopeeritud';
 $messages['copyerror'] = 'Ühegi aadressi kopeerimine ei õnnestunud ';
 $messages['sourceisreadonly'] = 'Aadressi asukohas puuduvad kirjutusõigused';
 $messages['errorsavingcontact'] = 'Kontakti aadressi salvestamine ebaõnnestus';
-$messages['movingmessage'] = 'Kirja liigutamine...';
+$messages['movingmessage'] = 'Liigutan kirja...';
+$messages['copyingmessage'] = 'Kopeerin kirja...';
+$messages['deletingmessage'] = 'Kustutan kirja...';
+$messages['markingmessage'] = 'Märgin kirja...';
 $messages['receiptsent'] = 'Kättesaamiskinnitus saadetud';
 $messages['errorsendingreceipt'] = 'Ei õnnestunud kättesaamiskinnitust saata';
 $messages['nodeletelastidentity'] = 'See identiteet on viimane ja seda ei saa kustutada.';
-$messages['addsubfolderhint'] = 'See kataloog luuakse valitud kausta alamkataloogina.';
 $messages['forbiddencharacter'] = 'Kausta nimi sisaldab keelatud sümbolit';
 $messages['selectimportfile'] = 'Palun vali üleslaadimiseks fail';
 $messages['addresswriterror'] = 'Valitud aadressiraamat pole kirjutatav';
-$messages['importwait'] = 'Importimine, palun oota...';
+$messages['contactaddedtogroup'] = 'Kontaktide lisamine gruppi õnnestus';
+$messages['contactremovedfromgroup'] = 'Kontaktide eemaldamine grupist õnnestus';
+$messages['importwait'] = 'Impordin, palun oota...';
 $messages['importerror'] = 'Import nurjus! Üleslaaditud fail ei ole vCard formaadis.';
 $messages['importconfirm'] = '<b>Edukalt imporditud $inserted kontakti, $skipped olemasolevat sissekannet vahele jäetud</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Tegevus pole lubatud!';
 $messages['nofromaddress'] = 'Valitud identiteedil puudub e-posti aadress';
 $messages['editorwarning'] = 'Klaarteksti redaktorile lülitamine kaotab kogu teksti vorminduse. Soovid jätkata?';
-$messages['httpreceivedencrypterror'] = 'Ilmnes saatuslik konfiguratsiooniviga. Võta koheselt oma süsteemiadministraatoriga ühendust. <b> Sinu kirja polnud võimalik ära saata. </b>';
-$messages['smtpconnerror'] = 'SMTP Tõrge ($code): Serveriga ühendumine nurjus';
-$messages['smtpautherror'] = 'SMTP Tõrge ($code): Autentimine nurjus';
-$messages['smtpfromerror'] = 'SMTP Tõrge ($code): "$from" saatjaks määramine nurjus';
-$messages['smtptoerror'] = 'SMTP Tõrge ($code): "$to" saajaks määramine nurjus';
-$messages['smtprecipientserror'] = 'SMTP Tõrge: Saajate nimekirja parsimine nurjus';
-$messages['smtperror'] = 'SMTP Tõrge: $msg';
+$messages['httpreceivedencrypterror'] = 'Viga seadistustes. Võta kohe oma süsteemiadministraatoriga ühendust. <b>Sinu kirja polnud võimalik ära saata.</b>';
+$messages['smtpconnerror'] = 'SMTP tõrge ($code): serveriga ühendumine nurjus';
+$messages['smtpautherror'] = 'SMTP tõrge ($code): autentimine nurjus';
+$messages['smtpfromerror'] = 'SMTP tõrge ($code): "$from" saatjaks määramine nurjus ($msg)';
+$messages['smtptoerror'] = 'SMTP tõrge ($code): "$to" saajaks määramine nurjus ($msg)';
+$messages['smtprecipientserror'] = 'SMTP tõrge: saajate nimekirja parsimine nurjus';
+$messages['smtpdsnerror'] = 'SMTP tõrge: puudub kohalejõudmise teavituse toetus';
+$messages['smtperror'] = 'SMTP tõrge: $msg';
 $messages['emailformaterror'] = 'Lubamatu e-posti aadress: $email';
+$messages['toomanyrecipients'] = 'Liiga palju adressaate. Vähenda kirja saajate hulka $max-ni.';
+$messages['maxgroupmembersreached'] = 'Grupi liikmete arv ületab suurima lubatud $max';
+$messages['internalerror'] = 'Ilmnes sisemine tõrge. Palun proovi uuesti.';
+$messages['contactdelerror'] = 'Kontaktide kustutamine nurjus';
+$messages['contactdeleted'] = 'Kontaktide kustutamine õnnestus';
+$messages['groupdeleted'] = 'Grupi kustutamine õnnestus';
+$messages['grouprenamed'] = 'Grupi ümbernimetamine õnnestus';
+$messages['groupcreated'] = 'Grupi loomine õnnestus';
+$messages['messagedeleted'] = 'Kiri edukalt kustutatud';
+$messages['messagemoved'] = 'Kiri edukalt liigutatud';
+$messages['messagecopied'] = 'Kiri edukalt kopeeritud';
+$messages['messagemarked'] = 'Kiri edukalt märgitud';
+$messages['autocompletechars'] = 'Sisesta vähemalt $min märki autom. lõpetuseks';
+$messages['namecannotbeempty'] = 'Nimi ei saa olla tühi';
+$messages['nametoolong'] = 'Nimi liiga pikk';
+$messages['folderupdated'] = 'Kaust uuendatud edukalt';
+$messages['foldercreated'] = 'Kaust loodud edukalt';
 
 ?>
index bd2dfd3818b78d34f450e45a7c8bcbbbeab7ffc7..bf330b94bd5dceaceb39515c1724d7a9157c0e85 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/eu_ES/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -13,7 +13,7 @@
 |         Bihar <gaurdabihar@gmail.com>                                 |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2513 2009-05-21 12:59:19Z alec $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -224,9 +224,6 @@ $labels['subscribed'] = 'Harpideturik';
 $labels['messagecount'] = 'Mezuak';
 $labels['create'] = 'Sortu';
 $labels['createfolder'] = 'Karpeta berria sortu';
-$labels['rename'] = 'Berrizendatu';
-$labels['renamefolder'] = 'Karpeta berrizendatu';
-$labels['deletefolder'] = 'Karpeta ezabatu';
 $labels['managefolders'] = 'Karpeta kudeaketa';
 $labels['specialfolders'] = 'Karpeta bereziak';
 $labels['sortby'] = 'Honela ordenatu';
index 55a82eec7b11762d10d05b07b54650a7339de663..f0878fce28a81320165166e55f4cb4c0b3204690 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/eu_ES/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -13,7 +13,7 @@
 |         Bihar <gaurdabihar@gmail.com>                                 |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2237 2009-01-17 01:55:39Z till $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -78,7 +78,6 @@ $messages['movingmessage'] = 'Mezua mugitzen...';
 $messages['receiptsent'] = 'Ondo bidalia irakurritako agiria';
 $messages['errorsendingreceipt'] = 'Ezin da agiria bidali';
 $messages['nodeletelastidentity'] = 'Ezin da izaera hau ezabatu, zure bakarra da';
-$messages['addsubfolderhint'] = 'Aukeratutakoaren azpikarpeta bezala sortuko da karpeta hau';
 $messages['forbiddencharacter'] = 'Karpeta izenak debekatutako karaktereak ditu';
 
 ?>
index aefff490127006b3f4a39738d92e6a12183a7b98..311362caa460aa44c12481e6e0a5906cef7540a1 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/fa/labels.inc                                                |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 |         Nader Aghazadeh <Nader.aghazadeh at gmail.com>                |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: labels.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -247,13 +247,9 @@ $labels['checkallfolders'] = 'همه پوشه ها رو برای مشاهده پ
 $labels['folder'] = 'پوشه';
 $labels['folders'] = 'پوشه‌ها';
 $labels['foldername'] = 'نام پوشه';
-$labels['subscribed'] = 'مورد اشتراک';
 $labels['messagecount'] = 'پیغام‌ها';
 $labels['create'] = 'ایجاد';
 $labels['createfolder'] = 'ایجاد پوشه‌ی جدید';
-$labels['rename'] = 'تغییر نام';
-$labels['renamefolder'] = 'تغییر نام پوشه';
-$labels['deletefolder'] = 'حذف پوشه';
 $labels['managefolders'] = 'مدیریت پوشه‌ها';
 $labels['specialfolders'] = 'پوشه های ویژه';
 $labels['sortby'] = 'مرتب‌سازی بر اساس';
index 9fa8373a789193b4f3379fae7fac8d5889676c93..bd1ae13c5020953eb45bc0541b2adaaece58db4d 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/fa/messages.inc                                              |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 |         Nader Aghazadeh <Nader.aghazadeh at gmail.com>                |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -50,9 +50,7 @@ $messages['deletecontactconfirm'] = 'آیا واقعاً می‌خواهید ت
 $messages['deletemessagesconfirm'] = 'آیا واقعاً می‌خواهید پیغام (های) انتخاب شده را حذف کنید؟';
 $messages['deletefolderconfirm'] = 'آیا واقعاً می‌خواهید این پوشه را حذف کنید؟';
 $messages['purgefolderconfirm'] = 'آیا واقعاً می‌خواهید همه‌ی پیغام‌های داخل این پوشه را حذف کنید؟';
-$messages['foldercreating'] = '...در حال ایجاد پوشه ';
 $messages['folderdeleting'] = '...در حال حذف پوشه ';
-$messages['folderrenaming'] = '...در حال تغییر نام پوشه ';
 $messages['foldermoving'] = '...در حال انتقال پوشه ';
 $messages['formincomplete'] = 'فرم کاملاً پر نشده بود';
 $messages['noemailwarning'] = 'لطفاً یک نشانی ایمیل معتبر وارد کنید';
@@ -85,7 +83,6 @@ $messages['movingmessage'] = '...در حال انتقال پیغام';
 $messages['receiptsent'] = 'رسید خواندن با موفقیت ارسال شد';
 $messages['errorsendingreceipt'] = 'ناتوان در ارسال رسید';
 $messages['nodeletelastidentity'] = '.نمی‌توانید این هویت را حذف کنید، زیرا آخرین هویت شماست';
-$messages['addsubfolderhint'] = 'پوشه به عنوان زیرپوشه ای ساخته خواهد شد که هم اکنون انتخاب شده است';
 $messages['forbiddencharacter'] = 'نام پوشه شامل یک حرف غیر مجاز است';
 $messages['selectimportfile'] = 'لطفاً فایل را جهت بارگذاری انتخاب کنید';
 $messages['addresswriterror'] = 'در دفترچه تلفن انتخابی ، اجازه نوشتن ندارید';
index 1fc3a01e1fea08cbb703da14fc77a9b5b52aeb7a..19700a5dab6587fb0bbe03a27228e5a6a7797db6 100644 (file)
@@ -287,9 +287,6 @@ $labels['subscribed']  = 'مشترک ';
 $labels['messagecount'] = 'پيغام ها ';
 $labels['create']  = 'ایجاد کردن';
 $labels['createfolder']  = 'ایجاد پوشه جدید';
-$labels['rename'] = 'تغيير نام ';
-$labels['renamefolder'] = 'تغييرنام پوشه ';
-$labels['deletefolder']  = 'حذف کردن پوشه ';
 $labels['managefolders']  = 'اداره کردن پوشه ها ';
 $labels['specialfolders'] = 'پوشه های مخصوص';
 
index 17394ac1cd0688121f7909d918c58d7fa917280b..f298e0f254e106bc368d052637b0c1304ec90fc7 100644 (file)
@@ -31,9 +31,7 @@ $messages['deletecontactconfirm']  = 'آيا واقعاً شما ميخواهي
 $messages['deletemessagesconfirm'] = 'آيا واقعاً شما ميخواهيد که پيغام هاي انتخاب شده را حذف کنيد؟ ';
 $messages['deletefolderconfirm']  = 'آيا واقعاً شما ميخواهيد که اين پوشه را حذف کنيد؟ ';
 $messages['purgefolderconfirm']  = 'آيا واقعاً شما ميخواهيد  تمام پيغام های که  در اين پوشه وجود دارد حذف کنيد؟ ';
-$messages['foldercreating'] = 'در حال ایجاد پوشه';
 $messages['folderdeleting'] = 'در حال حذف پوشه';
-$messages['folderrenaming'] = 'در حال تغییر نام پوشه';
 $messages['foldermoving'] = 'در حال انتقال پوشه';
 $messages['formincomplete'] = 'فورمه بصورت مکمل خانه پري نه شده است ';
 $messages['noemailwarning'] = 'لطفاً يک ايميل ادرس موجود را داخل کنيد ';
@@ -66,7 +64,6 @@ $messages['movingmessage'] = 'ذر حال انتقال پیام...';
 $messages['receiptsent'] = 'یک رسید برای ارسال کننده این پیام فرستاده شد.';
 $messages['errorsendingreceipt'] = 'رسيد ارسال شده نتوانست  ';
 $messages['nodeletelastidentity'] = 'شما این شناخت نامه را حذف کرده نمیتوانید. این آخرین شناخت نامه شما است.';
-$messages['addsubfolderhint'] = 'این پوشه به حیث پوشه فرعی پوشه انتخاب شده فعلی ساخته خواهد شد.';
 $messages['forbiddencharacter'] = 'نام پوشه دارای یک کرکتر ممنوعه است.';
 $messages['selectimportfile'] = 'لطفاً یک فایل را برای آپلود کردن انتخاب نمایید.';
 $messages['addresswriterror'] = 'کتابچه آدرس انتخاب شده دارای اجازه نامه نوشتاری نیست.';
index 2a1643616adeef9c592f3cce9c41384fb1288ace..907202d72c34d88872045109d658c9419991f25b 100644 (file)
@@ -1,21 +1,21 @@
 <?php
 
 /*
-
 +-----------------------------------------------------------------------+
-| language/fi/labels.inc                                                |
+| language/fi_FI/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Ville Alatalo <ville@alatalo.org>                             |
 |         Veljo Velling <veve@utu.fi>                                   |
 |         Jorma Tuomainen <jt@wiza.fi>                                  |
+|         Olli <ollinpostit@gmail.com>                                  |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2581 2009-05-31 11:12:04Z alec $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -47,14 +47,14 @@ $labels['organization'] = 'Organisaatio';
 $labels['reply-to'] = 'Vastaus osoitteeseen';
 $labels['mailboxlist'] = 'Kansiot';
 $labels['messagesfromto'] = 'Viestit $from-$to/$count';
+$labels['threadsfromto'] = 'Viestiketjut $from-$to/$count';
 $labels['messagenrof'] = 'Viesti $nr/$count';
+$labels['copy'] = 'Kopioi';
+$labels['move'] = 'Siirrä';
 $labels['moveto'] = 'siirrä kansioon...';
 $labels['download'] = 'lataa';
 $labels['filename'] = 'Tiedoston nimi';
 $labels['filesize'] = 'Tiedoston koko';
-$labels['preferhtml'] = 'Käytä HTML:aa';
-$labels['htmlmessage'] = 'HTML-viesti';
-$labels['prettydate'] = 'Nätit päiväykset';
 $labels['addtoaddressbook'] = 'Lisää osoitekirjaan';
 $labels['sun'] = 'Su';
 $labels['mon'] = 'Ma';
@@ -118,13 +118,35 @@ $labels['markread'] = 'luetuiksi';
 $labels['markunread'] = 'ei-luetuiksi';
 $labels['markflagged'] = 'korostetuiksi';
 $labels['markunflagged'] = 'ei-korostetuiksi';
+$labels['messageactions'] = 'Lisää toimintoja...';
 $labels['select'] = 'Valitse';
 $labels['all'] = 'Kaikki';
 $labels['none'] = 'Ei mitään';
+$labels['currpage'] = 'Nykyinen sivu';
 $labels['unread'] = 'Lukemattomat';
 $labels['flagged'] = 'Korostettu';
 $labels['unanswered'] = 'Vastaamaton';
+$labels['deleted'] = 'Poistettu';
+$labels['invert'] = 'Käännä';
 $labels['filter'] = 'Suodin';
+$labels['list'] = 'Listaus';
+$labels['threads'] = 'Viestiketjut';
+$labels['expand-all'] = 'Laajenna kaikki';
+$labels['expand-unread'] = 'Laajenna lukemattomat';
+$labels['collapse-all'] = 'Kutista kaikki';
+$labels['autoexpand_threads'] = 'Laajenna viestiketjut automaattisesti';
+$labels['do_expand'] = 'kaikki viestiketjut';
+$labels['expand_only_unread'] = 'vain ne joissa lukemattomia viestejä';
+$labels['fromto'] = 'Lähettäjä/Vastaanottaja';
+$labels['attachment'] = 'Liite';
+$labels['nonesort'] = 'Ei mikään';
+$labels['sentdate'] = 'Lähetysaika';
+$labels['arrival'] = 'Saapumisaika';
+$labels['asc'] = 'nouseva';
+$labels['desc'] = 'laskeva';
+$labels['listcolumns'] = 'Näkyvät kentät';
+$labels['listsorting'] = 'Lajittelu kenttä';
+$labels['listorder'] = 'Lajittelu järjestys';
 $labels['compact'] = 'Tiivistä';
 $labels['empty'] = 'Tyhjennä';
 $labels['purge'] = 'Puhdista';
@@ -138,6 +160,7 @@ $labels['msgtext'] = 'Koko viesti';
 $labels['openinextwin'] = 'Avaa uudessa ikkunassa';
 $labels['emlsave'] = 'Tallenna (.eml)';
 $labels['compose'] = 'Viestin kirjoitus';
+$labels['editasnew'] = 'Muokkaa uutena';
 $labels['savemessage'] = 'Tallenna tämä luonnos';
 $labels['sendmessage'] = 'Lähetä viesti';
 $labels['addattachment'] = 'Liitetiedosto';
@@ -187,10 +210,13 @@ $labels['contactsfromto'] = 'Kontaktit $from-$to/$count';
 $labels['print'] = 'Tulosta';
 $labels['export'] = 'Vie (export)';
 $labels['exportvcards'] = 'Vie kontaktit vCard-muodossa';
+$labels['newcontactgroup'] = 'Luo uusi kontaktiryhmä';
+$labels['groupactions'] = 'Kontaktiryhmän toiminnot...';
 $labels['previouspage'] = 'Näytä edellinen luettelo';
 $labels['firstpage'] = 'Näytä ensimmäinen luettelo';
 $labels['nextpage'] = 'Näytä seuraava luettelo';
 $labels['lastpage'] = 'Näytä viimeinen luettelo';
+$labels['group'] = 'Ryhmä';
 $labels['groups'] = 'Ryhmät';
 $labels['personaladrbook'] = 'Henkilökohtaiset osoitteet';
 $labels['import'] = 'Tuo';
@@ -208,6 +234,10 @@ $labels['manageidentities'] = 'Muokkaa tunnuksen identiteettejä';
 $labels['newidentity'] = 'Uusi identiteetti';
 $labels['newitem'] = 'Uusi';
 $labels['edititem'] = 'Muokkaa';
+$labels['preferhtml'] = 'Käytä HTML:aa';
+$labels['defaultcharset'] = 'Oletusmerkistökoodaus';
+$labels['htmlmessage'] = 'HTML-viesti';
+$labels['prettydate'] = 'Nätit päiväykset';
 $labels['setdefault'] = 'Aseta vakioksi';
 $labels['autodetect'] = 'Automaattinen';
 $labels['language'] = 'Kieli';
@@ -231,6 +261,7 @@ $labels['ignore'] = 'jätä huomiotta';
 $labels['readwhendeleted'] = 'Merkitse poistettavat viestit luetuiksi';
 $labels['flagfordeletion'] = 'Poistamisen sijaan, merkitse viestit poistettavaksi';
 $labels['skipdeleted'] = 'Älä näytä poistettuja viestejä';
+$labels['deletealways'] = 'Poista viestit, joiden siirtäminen roskakoriin epäonnistuu';
 $labels['showremoteimages'] = 'Näytä ulkopuoliset kuvat viestissä';
 $labels['fromknownsenders'] = 'tunnetuilta lähettäjiltä';
 $labels['always'] = 'aina';
@@ -239,15 +270,37 @@ $labels['autosavedraft'] = 'Tallenna luonnos automaattisesti';
 $labels['everynminutes'] = 'joka $n minuutti';
 $labels['keepalive'] = 'Tarkasta uudet viestit';
 $labels['never'] = 'ei koskaan';
+$labels['immediately'] = 'välittömästi';
 $labels['messagesdisplaying'] = 'Viestien näyttäminen';
 $labels['messagescomposition'] = 'Viestien kirjoittaminen';
 $labels['mimeparamfolding'] = 'Liitetiedostojen nimet';
 $labels['2231folding'] = 'Täysin RFC 2231 mukainen (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 mukainen (MS Outlook)';
 $labels['2047folding'] = 'Täysin RFC 2047 mukainen (muut)';
+$labels['force7bit'] = 'Käytä MIME-koodausta 8-bittisille merkeille';
 $labels['advancedoptions'] = 'Lisäasetukset';
 $labels['focusonnewmessage'] = 'Tarkenna selainikkuna uuteen viestiin';
 $labels['checkallfolders'] = 'Tarkista kaikki kansiot uusien viestien varalta';
+$labels['displaynext'] = 'Viestin siirron tai poiston jälkeen, näytä seuraava viesti';
+$labels['mainoptions'] = 'Pääasetukset';
+$labels['section'] = 'Kohta';
+$labels['maintenance'] = 'Huolto';
+$labels['newmessage'] = 'Uusi viesti';
+$labels['listoptions'] = 'Lista-asetukset';
+$labels['signatureoptions'] = 'Allekirjoituksen asetukset';
+$labels['whenreplying'] = 'Vastattaessa';
+$labels['replytopposting'] = 'aloita uusi viesti alkuperäisen yläpuolelle';
+$labels['replybottomposting'] = 'aloita uusi viesti alkuperäisen alapuolelle';
+$labels['replyremovesignature'] = 'Vastattaessa poista alkuperäinen allekirjoitus viestistä';
+$labels['autoaddsignature'] = 'Lisää allekirjoitus automaattisesti';
+$labels['newmessageonly'] = 'vain uuteen viestiin';
+$labels['replyandforwardonly'] = 'vain vastauksiin ja välityksiin';
+$labels['replysignaturepos'] = 'Vastattaessa tai välitettäessä laita allekirjoitus';
+$labels['belowquote'] = 'lainauksen alle';
+$labels['abovequote'] = 'lainauksen ylle';
+$labels['insertsignature'] = 'Lisää allekirjoitus';
+$labels['previewpanemarkread'] = 'Merkitse esikatsellut viestit luetuiksi';
+$labels['afternseconds'] = '$n sekunnin jälkeen';
 $labels['folder'] = 'Kansio';
 $labels['folders'] = 'Kansiot';
 $labels['foldername'] = 'Kansion nimi';
@@ -255,9 +308,6 @@ $labels['subscribed'] = 'Näytetään';
 $labels['messagecount'] = 'Viestejä';
 $labels['create'] = 'Luo uusi';
 $labels['createfolder'] = 'Luo uusi kansio';
-$labels['rename'] = 'Nimeä uudelleen';
-$labels['renamefolder'] = 'Nimeä kansio uudelleen';
-$labels['deletefolder'] = 'Poista kansio';
 $labels['managefolders'] = 'Kansioiden hallinta';
 $labels['specialfolders'] = 'Erikoiskansiot';
 $labels['sortby'] = 'Järjestä';
@@ -267,5 +317,23 @@ $labels['B'] = 't';
 $labels['KB'] = 'Kt';
 $labels['MB'] = 'Mt';
 $labels['GB'] = 'Gt';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Englantilainen';
+$labels['westerneuropean'] = 'Länsieurooppalainen';
+$labels['easterneuropean'] = 'Itäeurooppalainen';
+$labels['southeasterneuropean'] = 'Eteläeurooppalainen';
+$labels['baltic'] = 'Balttilainen';
+$labels['cyrillic'] = 'Kyrillinen';
+$labels['arabic'] = 'Arabialainen';
+$labels['greek'] = 'Kreikkalainen';
+$labels['hebrew'] = 'Heprealainen';
+$labels['turkish'] = 'Turkkilainen';
+$labels['nordic'] = 'Pohjoismaalainen';
+$labels['thai'] = 'Thaimaalainen';
+$labels['celtic'] = 'Kelttiläinen';
+$labels['vietnamese'] = 'Vietnamilainen';
+$labels['japanese'] = 'Japanilainen';
+$labels['korean'] = 'Korealainen';
+$labels['chinese'] = 'Kiinalainen';
 
 ?>
index a31abbe1a1fb43487a3b9ef13cb8237aad2296c8..ad72a1d7a203707889a1cab8141e546843481067 100644 (file)
@@ -1,12 +1,11 @@
 <?php
 
 /*
-
 +-----------------------------------------------------------------------+
-| language/fi/messages.inc                                              |
+| language/fi_FI/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -15,7 +14,7 @@
 |         Jorma Tuomainen <jt@wiza.fi>                                  |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2572 2009-05-29 17:39:35Z alec $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -25,10 +24,12 @@ $messages['cookiesdisabled'] = 'Selaimesi ei hyväksy evästeitä';
 $messages['sessionerror'] = 'Sessio ei kelpaa tai ei ole enää voimassa';
 $messages['imaperror'] = 'Yhteys IMAP-palvelimeen epäonnistui';
 $messages['servererror'] = 'Palvelin virhe!';
+$messages['invalidrequest'] = 'Kelpaamaton pyyntö! Tietoa ei tallennettu.';
 $messages['nomessagesfound'] = 'Kansiossa ei ole sähköpostiviestejä';
 $messages['loggedout'] = 'Sinut on kirjattu ulos järjestelmästä.';
 $messages['mailboxempty'] = 'Kansio on tyhjä';
 $messages['loading'] = 'Ladataan...';
+$messages['uploading'] = 'Ladataan tiedostoa palvelimelle...';
 $messages['loadingdata'] = 'Ladataan tietoja...';
 $messages['checkingmail'] = 'Tarkistetaan saapuneita viestejä...';
 $messages['sendingmessage'] = 'Lähetetään viestiä...';
@@ -47,14 +48,14 @@ $messages['senttooquickly'] = 'Odota $sec sekunti(a) ennen viestin lähettämist
 $messages['errorsavingsent'] = 'Lähetetyn viestin tallennuksessa tapahtui virhe';
 $messages['errorsaving'] = 'Tallennuksessa tapahtui virhe';
 $messages['errormoving'] = 'Viestiä ei voitu siirtää';
+$messages['errorcopying'] = 'Viestiä ei voitu kopioida';
 $messages['errordeleting'] = 'Viestiä ei voitu poistaa';
+$messages['errormarking'] = 'Viestiä ei voitu merkiä';
 $messages['deletecontactconfirm'] = 'Haluatko varmasti poistaa valitut kontaktit?';
 $messages['deletemessagesconfirm'] = 'Haluatko varmasti poistaa valitut viestit?';
 $messages['deletefolderconfirm'] = 'Haluatko varmasti poistaa kansion?';
 $messages['purgefolderconfirm'] = 'Haluatko varmasti poistaa kaikki viestit kansiosta?';
-$messages['foldercreating'] = 'Luodaan kansiota...';
 $messages['folderdeleting'] = 'Poistetaan kansiota...';
-$messages['folderrenaming'] = 'Nimetään kansiota...';
 $messages['foldermoving'] = 'Siirretään kansiota...';
 $messages['formincomplete'] = 'Lomakkeen tiedot olivat puutteelliset';
 $messages['noemailwarning'] = 'Anna sähköpostiosoite';
@@ -68,6 +69,7 @@ $messages['notsentwarning'] = 'Viestiä ei lähetetty. Haluatko poistaa viestin?
 $messages['noldapserver'] = 'Valitse LDAP -palvelin';
 $messages['nocontactsreturned'] = 'Yhtään kontaktia ei löytynyt';
 $messages['nosearchname'] = 'Anna kontaktin nimi tai sähköpostiosoite';
+$messages['notuploadedwarning'] = 'Kaikkia liitteitä ei ole vielä ladattu palvelimelle. Odota tai peruuta lataus.';
 $messages['searchsuccessful'] = 'Löydetty $nr viestiä';
 $messages['searchnomatch'] = 'Haku ei tuottanut tuloksia';
 $messages['searching'] = 'Etsitään...';
@@ -84,13 +86,15 @@ $messages['copyerror'] = 'Yhtään osoitetta ei voitu kopioida';
 $messages['sourceisreadonly'] = 'Tämän osoitteen lähde on kirjoitussuojattu';
 $messages['errorsavingcontact'] = 'Yhteystietoa ei voitu tallentaa';
 $messages['movingmessage'] = 'Siirretään viestiä...';
+$messages['copyingmessage'] = 'Kopioidaan viestiä...';
 $messages['receiptsent'] = 'Lukukuittaus lähetetty onnistuneesti';
 $messages['errorsendingreceipt'] = 'Lukukuittausta ei voitu lähettää';
 $messages['nodeletelastidentity'] = 'Et voi poistaa tätä identiteettiä, koska se on ainoa jäljelläoleva';
-$messages['addsubfolderhint'] = 'Uusi kansio luodaan valitun kansion alikansiona';
 $messages['forbiddencharacter'] = 'Kansion nimessä on kiellettyjä merkkejä';
 $messages['selectimportfile'] = 'Valitse lähetettävä tiedosto';
 $messages['addresswriterror'] = 'Valittuun osoitekirjaan ei voi kirjoittaa';
+$messages['contactaddedtogroup'] = 'Kontaktit lisätty ryhmään';
+$messages['contactremovedfromgroup'] = 'Kontaktit poistettu ryhmästä';
 $messages['importwait'] = 'Tuodaan, odota...';
 $messages['importerror'] = 'Tuonti epäonnistui! Lähetetty tiedosto ei ole vCard -muodossa.';
 $messages['importconfirm'] = '<b>$inserted kontaktia tuotu onnistuneesti $inserted kontaktioa, $skipped olemassaolevaa kontaktia hypättiin yli</b>:<p><em>$names</em></p>';
@@ -98,5 +102,14 @@ $messages['opnotpermitted'] = 'Toiminto ei ole sallittu!';
 $messages['nofromaddress'] = 'Valittu identiteetti ei sisällä sähköpostiosoitetta';
 $messages['editorwarning'] = 'Vaihtaminen tekstieditoriin aiheuttaa viestin muotoilun katoamisen. Haluatko jatkaa?';
 $messages['httpreceivedencrypterror'] = 'Vakava virhe asetuksissa. Ota välittömästi yhteys ylläpitoon. <b>Viestiäsi ei voida lähettää.</b>';
+$messages['smtpconnerror'] = 'SMTP-virhe ($code): Palvelimelle yhdistäminen epäonnistui';
+$messages['smtpautherror'] = 'SMTP-virhe ($code): Tunnistus epäonnistui';
+$messages['smtpfromerror'] = 'SMTP-virhe ($code): Lähettäjän "$from" asettaminen epäonnistui ($msg)';
+$messages['smtptoerror'] = 'SMTP-virhe ($code): Vastaanottajan "$to" lisääminen epäonnistui ($msg)';
+$messages['smtprecipientserror'] = 'SMTP-virhe: Ei voida jäsentää vastaanottajien listaa';
+$messages['smtperror'] = 'SMTP-virhe: $msg';
+$messages['emailformaterror'] = 'Väärä sähköpostiosoite: $email';
+$messages['toomanyrecipients'] = 'Liikaa vastaanottajia. Vähennä vastaanottajien määrä maksimiin $max.';
+$messages['maxgroupmembersreached'] = 'Ryhmän jäsenten määrä ylittää maksimin $max';
 
 ?>
index 9e8a24cb89a9129ad7f9651f649ef69602d03f54..ed367d0f3f0d9909b82b0c64a00b5252a57c1f60 100644 (file)
@@ -5,17 +5,17 @@
 +-----------------------------------------------------------------------+
 | language/fr_FR/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Joel S. <joel.s@spijoprod.net>                                |
+| Author: Joel S. <joel.s@spijoprod.com>                                |
 |         Jerome Lipowicz <jerome@yayel.com>                            |
 |         Maximilien Cuony <theglu@theglu.org>                          |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -44,17 +44,18 @@ $labels['date'] = 'Date';
 $labels['size'] = 'Taille';
 $labels['priority'] = 'Priorité';
 $labels['organization'] = 'Organisation';
+$labels['readstatus'] = 'Status de lecture';
 $labels['reply-to'] = 'Répondre à';
 $labels['mailboxlist'] = 'Dossiers';
 $labels['messagesfromto'] = 'Messages de $from à $to sur $count';
+$labels['threadsfromto'] = 'Fil de $from à $to sur $count';
 $labels['messagenrof'] = 'Message $nr sur $count';
+$labels['copy'] = 'Copier';
+$labels['move'] = 'Déplacer';
 $labels['moveto'] = 'Déplacer vers...';
 $labels['download'] = 'Télécharger';
 $labels['filename'] = 'Nom du fichier';
 $labels['filesize'] = 'Taille du fichier';
-$labels['preferhtml'] = 'Afficher en HTML';
-$labels['htmlmessage'] = 'Message en HTML';
-$labels['prettydate'] = 'Affichage court des dates';
 $labels['addtoaddressbook'] = 'Ajouter au carnet d\'adresses';
 $labels['sun'] = 'Dim';
 $labels['mon'] = 'Lun';
@@ -99,6 +100,8 @@ $labels['checkmail'] = 'Vérification des nouveaux messages';
 $labels['writenewmessage'] = 'Écrire un nouveau message';
 $labels['replytomessage'] = 'Répondre au message';
 $labels['replytoallmessage'] = 'Répondre à tous';
+$labels['replyall'] = 'Répondre à tous';
+$labels['replylist'] = 'Répondre à la liste';
 $labels['forwardmessage'] = 'Transmettre le message';
 $labels['deletemessage'] = 'Déplacer le message dans la corbeille';
 $labels['movemessagetotrash'] = 'Déplacer le message dans la corbeille';
@@ -122,12 +125,35 @@ $labels['messageactions'] = 'Actions supplémentaires...';
 $labels['select'] = 'Sélectionner';
 $labels['all'] = 'Tous';
 $labels['none'] = 'Aucun';
+$labels['currpage'] = 'Page courante';
 $labels['unread'] = 'Non lus';
 $labels['flagged'] = 'Marqué';
 $labels['unanswered'] = 'Non répondu';
 $labels['deleted'] = 'Supprimé';
 $labels['invert'] = 'Inverser';
 $labels['filter'] = 'Filtre';
+$labels['list'] = 'Lister';
+$labels['threads'] = 'Sujets';
+$labels['expand-all'] = 'Afficher Tous';
+$labels['expand-unread'] = 'Afficher Non-lus';
+$labels['collapse-all'] = 'Fermer Tous';
+$labels['threaded'] = 'Par sujet';
+$labels['autoexpand_threads'] = 'Développer les sujets';
+$labels['do_expand'] = 'Tous les sujets';
+$labels['expand_only_unread'] = 'uniquement avec des messages non-lus';
+$labels['fromto'] = 'Expéditeur/Destinataire';
+$labels['flag'] = 'Drapeau';
+$labels['attachment'] = 'Pièce jointe';
+$labels['nonesort'] = 'Aucun';
+$labels['sentdate'] = 'Date d\'envoi';
+$labels['arrival'] = 'Date d\'arrivée';
+$labels['asc'] = 'Ascendant';
+$labels['desc'] = 'Descendant';
+$labels['listcolumns'] = 'Lister les colonnes';
+$labels['listsorting'] = 'Colonne de tri';
+$labels['listorder'] = 'Ordre de tri';
+$labels['listmode'] = 'Mode d\'affichage de la liste';
+$labels['folderactions'] = 'Actions du dossier';
 $labels['compact'] = 'Compacter';
 $labels['empty'] = 'Vider';
 $labels['purge'] = 'Purger';
@@ -148,12 +174,15 @@ $labels['addattachment'] = 'Joindre un fichier';
 $labels['charset'] = 'Encodage';
 $labels['editortype'] = 'Type d\'éditeur';
 $labels['returnreceipt'] = 'Accusé de réception';
+$labels['dsn'] = 'Notification d\'état de distribution';
+$labels['editidents'] = 'Modifier les identités';
 $labels['checkspelling'] = 'Vérifier l\'orthographe';
 $labels['resumeediting'] = 'Retourner à l\'édition';
 $labels['revertto'] = 'Revenir à';
 $labels['attachments'] = 'Fichiers joints';
 $labels['upload'] = 'Joindre';
 $labels['close'] = 'Fermer';
+$labels['messageoptions'] = 'Options du message';
 $labels['low'] = 'Basse';
 $labels['lowest'] = 'La plus basse';
 $labels['normal'] = 'Normale';
@@ -180,6 +209,8 @@ $labels['surname'] = 'Nom';
 $labels['email'] = 'Courriel';
 $labels['addcontact'] = 'Ajouter le contact sélectionné à votre Carnet d\'adresses';
 $labels['editcontact'] = 'Modifier le contact';
+$labels['contacts'] = 'Contacts';
+$labels['contactproperties'] = 'Propriétés de contact';
 $labels['edit'] = 'Modifier';
 $labels['cancel'] = 'Annuler';
 $labels['save'] = 'Sauvegarder';
@@ -191,10 +222,13 @@ $labels['contactsfromto'] = 'Contacts de $from à $to sur $count';
 $labels['print'] = 'Imprimer';
 $labels['export'] = 'Exporter';
 $labels['exportvcards'] = 'Exporter les contacts au format vCard';
+$labels['newcontactgroup'] = 'Créer un nouveau groupe de contacts';
+$labels['groupactions'] = 'Actions pour les groupes de contacts';
 $labels['previouspage'] = 'Montrer page précédente';
 $labels['firstpage'] = 'Voir la première page';
 $labels['nextpage'] = 'Montrer page suivante';
 $labels['lastpage'] = 'Voir la dernière page';
+$labels['group'] = 'Groupe';
 $labels['groups'] = 'Groupes';
 $labels['personaladrbook'] = 'Adresses personnelles';
 $labels['import'] = 'Importer';
@@ -212,6 +246,10 @@ $labels['manageidentities'] = 'Gérer les identités pour ce compte';
 $labels['newidentity'] = 'Nouvelle identité';
 $labels['newitem'] = 'Nouvel élément';
 $labels['edititem'] = 'Modifier l\'élément';
+$labels['preferhtml'] = 'Afficher en HTML';
+$labels['defaultcharset'] = 'Encodage par défaut';
+$labels['htmlmessage'] = 'Message en HTML';
+$labels['prettydate'] = 'Affichage court des dates';
 $labels['setdefault'] = 'Paramètres par défaut';
 $labels['autodetect'] = 'Automatique';
 $labels['language'] = 'Langue';
@@ -220,6 +258,7 @@ $labels['pagesize'] = 'Nombre de lignes par page';
 $labels['signature'] = 'Signature';
 $labels['dstactive'] = 'Heure d\'été';
 $labels['htmleditor'] = 'Composer un message au format HTML';
+$labels['htmlonreply'] = 'en réponse aux messages HTML uniquement';
 $labels['htmlsignature'] = 'Signature HTML';
 $labels['previewpane'] = 'Afficher le panneau d\'aperçu';
 $labels['skin'] = 'Thème de l\'interface';
@@ -231,10 +270,13 @@ $labels['mailboxview'] = 'Vue du courrier';
 $labels['mdnrequests'] = 'Notifications à l\'expéditeur';
 $labels['askuser'] = 'demander à l\'utilisateur';
 $labels['autosend'] = 'envoyer automatiquement';
+$labels['autosendknown'] = 'Envoyer un avis de réception uniquement à mes contacts';
+$labels['autosendknownignore'] = 'envoie un accusé à mes contacts, sinon ignorer';
 $labels['ignore'] = 'ignorer';
 $labels['readwhendeleted'] = 'Marquer le message comme lu à la suppression';
 $labels['flagfordeletion'] = 'Mettre le drapeau de suppression au lieu de supprimer';
 $labels['skipdeleted'] = 'Ne pas montrer les messages supprimés';
+$labels['deletealways'] = 'Lorsque le déplacement des messages à la corbeille échoue, supprimez-les';
 $labels['showremoteimages'] = 'Afficher les images distantes';
 $labels['fromknownsenders'] = 'venant d\'expéditeurs connus';
 $labels['always'] = 'toujours';
@@ -243,15 +285,40 @@ $labels['autosavedraft'] = 'Sauvegarde automatique des brouillons';
 $labels['everynminutes'] = 'toutes les $n minute(s)';
 $labels['keepalive'] = 'Chercher les nouveaux messages';
 $labels['never'] = 'jamais';
+$labels['immediately'] = 'Immédiatement';
 $labels['messagesdisplaying'] = 'Affichage des messages';
 $labels['messagescomposition'] = 'Ecriture des messages';
 $labels['mimeparamfolding'] = 'Nom du fichier attaché';
 $labels['2231folding'] = 'RFC 2231 complète (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'RFC 2047 complète (autre)';
+$labels['force7bit'] = 'Encoder les caractères 8 bits au format MIME';
 $labels['advancedoptions'] = 'Options avancées';
 $labels['focusonnewmessage'] = 'Placer le focus sur la fenêtre quand un nouveau message arrive';
 $labels['checkallfolders'] = 'Vérifier tous les dossiers pour les nouveaux messages';
+$labels['displaynext'] = 'Après suppression/déplacement du message, afficher le message suivant';
+$labels['mainoptions'] = 'Options principales';
+$labels['section'] = 'Section';
+$labels['maintenance'] = 'Maintenance';
+$labels['newmessage'] = 'Nouveau Message';
+$labels['listoptions'] = 'Lister les options';
+$labels['signatureoptions'] = 'Options pour la signature';
+$labels['whenreplying'] = 'En répondant';
+$labels['replytopposting'] = 'commencer le nouveau message au-dessus de l\'original';
+$labels['replybottomposting'] = 'commencer le nouveau message en-dessous de l\'original';
+$labels['replyremovesignature'] = 'En répondant, supprimer la signature d\'origine du message';
+$labels['autoaddsignature'] = 'Ajouter la signature automatiquement';
+$labels['newmessageonly'] = 'nouveau message uniquement';
+$labels['replyandforwardonly'] = 'réponses et transferts uniquement';
+$labels['replysignaturepos'] = 'En répondant ou en transférant, placer la signature';
+$labels['belowquote'] = 'en-dessous de la citation';
+$labels['abovequote'] = 'au-dessus de la citation';
+$labels['insertsignature'] = 'Insérer la signature';
+$labels['previewpanemarkread'] = 'Marquer les messages prévisualisés comme lus';
+$labels['afternseconds'] = 'après $n secondes';
+$labels['reqmdn'] = 'Toujours demandé un avis de réception';
+$labels['reqdsn'] = 'Toujours demander une notification d\'état de distribution';
+$labels['replysamefolder'] = 'Placer les réponses dans le dossier du message étant répondu';
 $labels['folder'] = 'Dossier';
 $labels['folders'] = 'Dossiers';
 $labels['foldername'] = 'Nom du dossier';
@@ -259,11 +326,15 @@ $labels['subscribed'] = 'Abonné';
 $labels['messagecount'] = 'Messages';
 $labels['create'] = 'Créer';
 $labels['createfolder'] = 'Créer un nouveau dossier';
-$labels['rename'] = 'Renommer';
-$labels['renamefolder'] = 'Renommer le dossier';
-$labels['deletefolder'] = 'Supprimer le dossier';
 $labels['managefolders'] = 'Organiser les dossiers';
 $labels['specialfolders'] = 'Dossiers spéciaux';
+$labels['properties'] = 'Propriétés';
+$labels['folderproperties'] = 'Propriétés du dossier';
+$labels['parentfolder'] = 'Dossier parant';
+$labels['location'] = 'Localisation';
+$labels['info'] = 'Information';
+$labels['getfoldersize'] = 'Cliquer pour obtenir la taille de dossier';
+$labels['changesubscription'] = 'Cliquer pour modifier l\'inscription';
 $labels['sortby'] = 'Trier par';
 $labels['sortasc'] = 'Tri ascendant';
 $labels['sortdesc'] = 'Tri descendant';
@@ -271,5 +342,23 @@ $labels['B'] = 'o';
 $labels['KB'] = 'Ko';
 $labels['MB'] = 'Mo';
 $labels['GB'] = 'Go';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Anglais';
+$labels['westerneuropean'] = 'Europe de l\'Ouest';
+$labels['easterneuropean'] = 'Europe de l\'Est';
+$labels['southeasterneuropean'] = 'Europe du Sud Est';
+$labels['baltic'] = 'Baltique';
+$labels['cyrillic'] = 'Cyrillique';
+$labels['arabic'] = 'Arabe';
+$labels['greek'] = 'Grec';
+$labels['hebrew'] = 'Hébreu';
+$labels['turkish'] = 'Turque';
+$labels['nordic'] = 'Nordique';
+$labels['thai'] = 'Thaïlandais';
+$labels['celtic'] = 'Celtique';
+$labels['vietnamese'] = 'Vietnamien';
+$labels['japanese'] = 'Japonais';
+$labels['korean'] = 'Coréen';
+$labels['chinese'] = 'Chinois';
 
-?>
\ No newline at end of file
+?>
index fd4451bd53eeaad5ef94de3f3f04fe84ce2a20e5..e8dca4e7063e6f5a084cc86a19381360dbf0bccd 100644 (file)
@@ -5,17 +5,17 @@
 +-----------------------------------------------------------------------+
 | language/fr_FR/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Joel S. <joel.s@spijoprod.net>                                |
+| Author: Joel S. <joel.s@spijoprod.com>                                |
 |         Jerome Lipowicz <jerome@yayel.com>                            |
 |         Maximilien Cuony <theglu@theglu.org>                          |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -25,11 +25,13 @@ $messages['cookiesdisabled'] = 'Votre navigateur n\'accepte pas les cookies';
 $messages['sessionerror'] = 'Votre session est invalide ou a expiré';
 $messages['imaperror'] = 'Erreur de connexion au serveur IMAP';
 $messages['servererror'] = 'Erreur Serveur !';
+$messages['servererrormsg'] = 'Erreur du serveur: $msg';
 $messages['invalidrequest'] = 'Requête invalide ! Aucune donnée n\'a été sauvegardée.';
 $messages['nomessagesfound'] = 'Aucun message trouvé dans cette boîte aux lettres';
 $messages['loggedout'] = 'Vous venez de vous déconnecter avec succès. Au revoir !';
 $messages['mailboxempty'] = 'Boîte aux lettres vide';
 $messages['loading'] = 'Chargement...';
+$messages['uploading'] = 'Envoi du fichier...';
 $messages['loadingdata'] = 'Chargement des données...';
 $messages['checkingmail'] = 'Vérification des nouveaux messages...';
 $messages['sendingmessage'] = 'Message en cours d\'envoi...';
@@ -48,15 +50,14 @@ $messages['senttooquickly'] = 'Vous devez attendre $sec sec. pour envoyer le mes
 $messages['errorsavingsent'] = 'Une erreur est survenue pendant la sauvegarde du message envoyé';
 $messages['errorsaving'] = 'Une erreur a empêché la sauvegarde';
 $messages['errormoving'] = 'Impossible de déplacer le message';
+$messages['errorcopying'] = 'Le(s) message(s) n\'a/ont pas pu être copié(s)';
 $messages['errordeleting'] = 'Impossible d\'effacer le message';
 $messages['errormarking'] = 'Impossible de marquer le message';
 $messages['deletecontactconfirm'] = 'Voulez-vous vraiment effacer le(s) contact(s) sélectionné(s) ?';
-$messages['deletemessagesconfirm'] = 'Voulez-vous vraiment supprimer le(s) message(s) séléctionné(s) ?';
+$messages['deletemessagesconfirm'] = 'Voulez-vous vraiment supprimer le(s) message(s) sélectionné(s) ?';
 $messages['deletefolderconfirm'] = 'Voulez-vous vraiment effacer ce dossier ?';
 $messages['purgefolderconfirm'] = 'Voulez-vous vraiment effacer tous les messages de ce dossier ?';
-$messages['foldercreating'] = 'Création du dossier...';
 $messages['folderdeleting'] = 'Suppression du dossier...';
-$messages['folderrenaming'] = 'Renommage du dossier...';
 $messages['foldermoving'] = 'Déplacement du dossier...';
 $messages['formincomplete'] = 'Le formulaire n\'a pas été entièrement rempli';
 $messages['noemailwarning'] = 'Veuillez spécifier un courriel valide';
@@ -70,6 +71,7 @@ $messages['notsentwarning'] = 'Le message n\'a pas été envoyé. Voulez-vous ab
 $messages['noldapserver'] = 'Choisissez un serveur LDAP pour la recherche';
 $messages['nocontactsreturned'] = 'Aucun contact trouvé';
 $messages['nosearchname'] = 'Entrez un nom de contact ou un courriel';
+$messages['notuploadedwarning'] = 'Toutes les pièces jointes ne sont pas encore envoyées pour le moment. Merci d\'attendre ou d\'annuler l\'envoi.';
 $messages['searchsuccessful'] = '$nr messages trouvés';
 $messages['searchnomatch'] = 'La recherche ne donne aucun résultat';
 $messages['searching'] = 'En cours de recherche...';
@@ -79,32 +81,51 @@ $messages['folderdeleted'] = 'Dossier effacé';
 $messages['deletedsuccessfully'] = 'Supprimé(s) avec succès';
 $messages['converting'] = 'Suppression de la mise en forme...';
 $messages['messageopenerror'] = 'Impossible de charger le message depuis serveur';
-$messages['fileuploaderror'] = 'Transfert du fichier echoué';
+$messages['fileuploaderror'] = 'Transfert du fichier échoué';
 $messages['filesizeerror'] = 'Le fichier transféré dépasse la taille maximale de $size';
 $messages['copysuccess'] = 'Succès de la copie des $nr adresses';
 $messages['copyerror'] = 'Ne peut pas copier les adresses';
 $messages['sourceisreadonly'] = 'Cette source d\'adresse est en lecture seule';
 $messages['errorsavingcontact'] = 'Ne peut pas enregistrer l\'adresse du contact';
 $messages['movingmessage'] = 'Déplacement du message...';
+$messages['copyingmessage'] = 'Copie du message ...';
+$messages['deletingmessage'] = 'Suppression des messages...';
+$messages['markingmessage'] = 'Marquage des messages...';
 $messages['receiptsent'] = 'L\'accusé de réception a bien été envoyé';
 $messages['errorsendingreceipt'] = 'L\'accusé de réception n\'a pas pu être envoyé';
 $messages['nodeletelastidentity'] = 'Vous ne pouvez pas effacer votre seule identité.';
-$messages['addsubfolderhint'] = 'Ce dossier sera créé comme sous-dossier de celui sélectionné.';
 $messages['forbiddencharacter'] = 'Le nom du dossier contient un caractère interdit';
 $messages['selectimportfile'] = 'Veuillez sélectionner un fichier à envoyer';
 $messages['addresswriterror'] = 'Impossible d\'écrire dans le carnet d\'adresse sélectionné';
+$messages['contactaddedtogroup'] = 'Les contacts ont bien été ajoutés à ce groupe';
+$messages['contactremovedfromgroup'] = 'Les contacts ont bien été supprimés de ce groupe';
 $messages['importwait'] = 'Importation, veuillez patienter...';
 $messages['importerror'] = 'Importation échouée ! Le fichier envoyé n\'est pas un fichier vCard valide.';
 $messages['importconfirm'] = '<b>$inserted contacts importés avec succès, $skipped entrées existantes ignorées</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Cette opération n\'est pas permise !';
-$messages['nofromaddress'] = 'Il manque une adresse e-mail dans l\'identitée sélectionnée';
+$messages['nofromaddress'] = 'Il manque une adresse e-mail dans l\'identité sélectionnée';
 $messages['editorwarning'] = 'Passer à l\'éditeur texte seul causera la perte du formatage du texte. Voulez-vous continuer ?';
-$messages['httpreceivedencrypterror'] = 'Une erreur fatale de configuration est survenue. Veuillez contacter votre administrateur immédiatement. <b>Votre message n\'a pas pû être envoyé.</b>';
+$messages['httpreceivedencrypterror'] = 'Une erreur fatale de configuration est survenue. Veuillez contacter votre administrateur immédiatement. <b>Votre message n\'a pas pu être envoyé.</b>';
 $messages['smtpconnerror'] = 'Erreur SMTP ($code): Echec de la connexion au serveur';
 $messages['smtpautherror'] = 'Erreur SMTP ($code): Echec de l\'authentification';
-$messages['smtpfromerror'] = 'Erreur SMTP ($code): Impossible de définir l\'expéditeur "$from"';
-$messages['smtptoerror'] = 'Erreur SMTP ($code): Impossible d\'ajouter le destinataire "$to"';
+$messages['smtpfromerror'] = 'Erreur SMTP ($code): Impossible de définir l\'expéditeur "$from" ($msg)';
+$messages['smtptoerror'] = 'Erreur SMTP ($code): Impossible d\'ajouter le destinataire "$to" ($msg)';
 $messages['smtprecipientserror'] = 'Erreur SMTP: Impossible de lire la liste des destinataires';
+$messages['smtpdsnerror'] = 'Erreur SMTP: Pas de support des notifications d\'état de distribution';
 $messages['smtperror'] = 'Erreur SMTP: $msg';
+$messages['emailformaterror'] = 'Adresse email incorrecte: $email';
+$messages['toomanyrecipients'] = 'Trop de destinataires. Réduisez leur nombre à $max maximum.';
+$messages['maxgroupmembersreached'] = 'Le nombre de membres du groupe dépasse le maximum de $max.';
+$messages['internalerror'] = 'Une erreur interne est survenue. Merci de réessayer';
+$messages['contactdelerror'] = 'Les contacts n\'ont pas pu être supprimés';
+$messages['contactdeleted'] = 'Les contacts ont bien été supprimés';
+$messages['groupdeleted'] = 'Le groupe a bien été supprimé';
+$messages['grouprenamed'] = 'Le groupe a bien été renommé';
+$messages['groupcreated'] = 'Le groupe a bien été créé';
+$messages['messagedeleted'] = 'Les messages ont bien été supprimés';
+$messages['messagemoved'] = 'Les messages ont bien été déplacés';
+$messages['messagecopied'] = 'Les messages ont bien été copiés';
+$messages['messagemarked'] = 'Les messages ont bien été marqués';
+$messages['autocompletechars'] = 'Entrez au moins $min caractères pour l\'auto-complétion';
 
 ?>
index 55c0524d5843f1790e106078ef1f7541e21ab617..eca650fb335e814c9c6f7ab800f841b55c25c01f 100755 (executable)
@@ -4,15 +4,15 @@
  +-----------------------------------------------------------------------+
  | language/ga/labels.inc                                                |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author:   Noel Bourke  (cros13)                                       |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -167,9 +167,6 @@ $labels['foldername'] = 'Ainm fillteán';
 $labels['subscribed'] = 'Síntiú';
 $labels['create'] = 'Cruthaigh';
 $labels['createfolder'] = 'Cruthaigh fillteán nua';
-$labels['rename'] = 'Ainmnigh arís';
-$labels['renamefolder'] = 'Ainmnigh fillteán arís';
-$labels['deletefolder'] = 'Scrios fillteán';
 $labels['managefolders'] = 'Stiúir na fillteán';
 $labels['sortby'] = 'Sórtáil trí';
 $labels['sortasc'] = 'Sórtáil in ord méadaitheach';
index 536751da317113239458222eda1735d1983e021b..0ed8b67908a27c647867d57d5406c343d9a13200 100755 (executable)
@@ -4,15 +4,15 @@
  +-----------------------------------------------------------------------+
  | language/ga/messages.inc                                              |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author:   Noel Bourke  (cros13)                                       |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: messages.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
index 27827877b2a932964e473a392aafa3838717f9b8..9b60d18f0958f1a7dac364c3185f2f7ac9bd895b 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/gl_ES/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -28,28 +28,29 @@ $labels['inbox'] = 'Caixa de entrada';
 $labels['drafts'] = 'Borradores';
 $labels['sent'] = 'Enviado';
 $labels['trash'] = 'Cubo do Lixo';
-$labels['junk'] = 'Lixo';
+$labels['junk'] = 'Correo Lixo';
 $labels['subject'] = 'Asunto';
 $labels['from'] = 'Remitente';
 $labels['to'] = 'Destinatario';
-$labels['cc'] = 'Copia';
-$labels['bcc'] = 'Copia Oculta';
-$labels['replyto'] = 'Respostar a';
+$labels['cc'] = 'Copia (CC)';
+$labels['bcc'] = 'Copia Oculta (BCC)';
+$labels['replyto'] = 'Respostar a (Reply-To)';
+$labels['followupto'] = 'Respostar a todos (Followup-To)';
 $labels['date'] = 'Data';
 $labels['size'] = 'Tamaño';
 $labels['priority'] = 'Prioridade';
 $labels['organization'] = 'Organización';
-$labels['reply-to'] = 'Respostar a';
+$labels['readstatus'] = 'Estado da lectura';
 $labels['mailboxlist'] = 'Cartafoles';
 $labels['messagesfromto'] = 'Mensaxes do $from ao $to de $count';
+$labels['threadsfromto'] = 'Fíos do $from ao $to de $count';
 $labels['messagenrof'] = 'Mensaxe $nr de $count';
+$labels['copy'] = 'Copiar';
+$labels['move'] = 'Mover';
 $labels['moveto'] = 'Mover a...';
 $labels['download'] = 'Descargar';
 $labels['filename'] = 'Nome de ficheiro';
 $labels['filesize'] = 'Tamaño de ficheiro';
-$labels['preferhtml'] = 'Prefiro HTML';
-$labels['htmlmessage'] = 'Mensaxe HTML';
-$labels['prettydate'] = 'Data decorada';
 $labels['addtoaddressbook'] = 'Engadir ao caderno de enderezos';
 $labels['sun'] = 'Dom';
 $labels['mon'] = 'Lun';
@@ -93,10 +94,12 @@ $labels['today'] = 'Hoxe';
 $labels['checkmail'] = 'Procurar novas mensaxes';
 $labels['writenewmessage'] = 'Crear unha nova mensaxe';
 $labels['replytomessage'] = 'Respostar a mensaxe';
-$labels['replytoallmessage'] = 'Respostar a todos';
+$labels['replytoallmessage'] = 'Respostar á lista ou ao remitente e a tódolos destinatarios';
+$labels['replyall'] = 'Respostar a todos';
+$labels['replylist'] = 'Respostar á lista de correo';
 $labels['forwardmessage'] = 'Reenviar a mensaxe';
 $labels['deletemessage'] = 'Eliminar a mensaxe';
-$labels['movemessagetotrash'] = 'Mover a mensaxe ó cubo do lixo';
+$labels['movemessagetotrash'] = 'Mover a mensaxe ao cubo do lixo';
 $labels['printmessage'] = 'Imprimir esta mensaxe';
 $labels['previousmessage'] = 'Amosar a mensaxe anterior';
 $labels['previousmessages'] = 'Amosar o grupo anterior de mensaxes';
@@ -117,14 +120,37 @@ $labels['messageactions'] = 'Máis accións...';
 $labels['select'] = 'Seleccionar';
 $labels['all'] = 'Todas';
 $labels['none'] = 'Ningunha';
+$labels['currpage'] = 'Páxina actual';
 $labels['unread'] = 'Non lidas';
 $labels['flagged'] = 'Marcadas';
 $labels['unanswered'] = 'Non respostadas';
 $labels['deleted'] = 'Eliminada';
 $labels['invert'] = 'Inverter';
 $labels['filter'] = 'Filtro';
+$labels['list'] = 'Lista';
+$labels['threads'] = 'Fíos';
+$labels['expand-all'] = 'Expandir todos';
+$labels['expand-unread'] = 'Expandir os non lidos';
+$labels['collapse-all'] = 'Contraer todos';
+$labels['threaded'] = 'Coma fíos de discusión';
+$labels['autoexpand_threads'] = 'Expandir os fíos das mensaxes';
+$labels['do_expand'] = 'tódolos fíos';
+$labels['expand_only_unread'] = 'só con mensaxes non lidas';
+$labels['fromto'] = 'Remitente/Destinatario';
+$labels['flag'] = 'Marca';
+$labels['attachment'] = 'Anexo';
+$labels['nonesort'] = 'Ningunha';
+$labels['sentdate'] = 'Data de envío';
+$labels['arrival'] = 'Data de chegada';
+$labels['asc'] = 'ascendente';
+$labels['desc'] = 'descendente';
+$labels['listcolumns'] = 'Enumerar columnas';
+$labels['listsorting'] = 'Ordenar pola columna';
+$labels['listorder'] = 'Ordenación';
+$labels['listmode'] = 'Modo de vista da lista';
+$labels['folderactions'] = 'Accións cos cartafoles';
 $labels['compact'] = 'Compactar';
-$labels['empty'] = 'Baleiro';
+$labels['empty'] = 'Baleirar';
 $labels['purge'] = 'Baleirar';
 $labels['quota'] = 'Uso de disco';
 $labels['unknown'] = 'desconocido';
@@ -142,13 +168,16 @@ $labels['sendmessage'] = 'Enviar a mensaxe agora';
 $labels['addattachment'] = 'Anexar un ficheiro';
 $labels['charset'] = 'Codificación';
 $labels['editortype'] = 'Tipo de editor';
-$labels['returnreceipt'] = 'Notificación de disposición';
+$labels['returnreceipt'] = 'Notificación da entrega';
+$labels['dsn'] = 'Notificación do estado de envío (DSN)';
+$labels['editidents'] = 'Modificar identidades';
 $labels['checkspelling'] = 'Revisar a ortografía';
 $labels['resumeediting'] = 'Voltar á edición';
 $labels['revertto'] = 'Voltar a';
 $labels['attachments'] = 'Ficheiros anexos';
 $labels['upload'] = 'Cargar';
 $labels['close'] = 'Pechar';
+$labels['messageoptions'] = 'Opcións da mensaxe...';
 $labels['low'] = 'Baixa';
 $labels['lowest'] = 'A máis baixa';
 $labels['normal'] = 'Normal';
@@ -165,9 +194,10 @@ $labels['maxuploadsize'] = 'O tamaño máximo permitido de ficheiro é de $size'
 $labels['addcc'] = 'Engadir Copia (CC)';
 $labels['addbcc'] = 'Engadir Copia Oculta (BCC)';
 $labels['addreplyto'] = 'Engadir Respostar a (Reply-To)';
+$labels['addfollowupto'] = 'Engadir Respostar a todos (Followup-To)';
 $labels['mdnrequest'] = 'O remitente desta mensaxe pediu ser notificado cando vostede a lea. Quere notificar ao remitente?';
-$labels['receiptread'] = 'Notificación da disposición da mensaxe (lectura)';
-$labels['yourmessage'] = 'Esta é unha notificación de disposición para a súa mensaxe';
+$labels['receiptread'] = 'Notificación da entrega da mensaxe (lectura)';
+$labels['yourmessage'] = 'Esta é unha notificación da entrega da súa mensaxe';
 $labels['receiptnote'] = 'Nota: Esta notificación só confirma que a mensaxe se abriu no computador do destinatario. Non asegura que o destinatario o lera ou entendera o seu contido.';
 $labels['name'] = 'Nome completo';
 $labels['firstname'] = 'Nome';
@@ -175,6 +205,8 @@ $labels['surname'] = 'Apelidos';
 $labels['email'] = 'Correo Electrónico';
 $labels['addcontact'] = 'Engadir novo contacto';
 $labels['editcontact'] = 'Editar contacto';
+$labels['contacts'] = 'Contactos';
+$labels['contactproperties'] = 'Propiedades do contacto';
 $labels['edit'] = 'Editar';
 $labels['cancel'] = 'Cancelar';
 $labels['save'] = 'Gardar';
@@ -186,10 +218,13 @@ $labels['contactsfromto'] = 'Contactos do $from ao $to de $count';
 $labels['print'] = 'Imprimir';
 $labels['export'] = 'Exportar';
 $labels['exportvcards'] = 'Exportar os contactos en formato vCard';
+$labels['newcontactgroup'] = 'Crear novo grupo de contactos';
+$labels['groupactions'] = 'Accións cos grupos de contactos...';
 $labels['previouspage'] = 'Amosar o grupo anterior';
 $labels['firstpage'] = 'Amosar o primeiro grupo';
 $labels['nextpage'] = 'Amosar o seguinte grupo';
 $labels['lastpage'] = 'Amosar o último grupo';
+$labels['group'] = 'Grupo';
 $labels['groups'] = 'Grupos';
 $labels['personaladrbook'] = 'Enderezos persoais';
 $labels['import'] = 'Importar';
@@ -207,6 +242,10 @@ $labels['manageidentities'] = 'Administrar as identidades desta conta';
 $labels['newidentity'] = 'Nova identidade';
 $labels['newitem'] = 'Novo';
 $labels['edititem'] = 'Editar';
+$labels['preferhtml'] = 'Prefiro HTML';
+$labels['defaultcharset'] = 'Xogo de caracteres por omisión';
+$labels['htmlmessage'] = 'Mensaxe HTML';
+$labels['prettydate'] = 'Data decorada';
 $labels['setdefault'] = 'Usar coma predeterminada';
 $labels['autodetect'] = 'Detectar automáticamente';
 $labels['language'] = 'Linguaxe';
@@ -215,6 +254,7 @@ $labels['pagesize'] = 'Liñas por páxina';
 $labels['signature'] = 'Sinatura';
 $labels['dstactive'] = 'Cambio de hora';
 $labels['htmleditor'] = 'Redactar mensaxes HTML';
+$labels['htmlonreply'] = 'só cando se resposte a unha mensaxe HTML';
 $labels['htmlsignature'] = 'Sinatura HTML';
 $labels['previewpane'] = 'Amosar panel de previsualización';
 $labels['skin'] = 'Aspecto da interface';
@@ -223,27 +263,32 @@ $labels['logoutcompact'] = 'Compactar a caixa de entrada ao saír.';
 $labels['uisettings'] = 'Interface de usuario';
 $labels['serversettings'] = 'Axustes do servidor';
 $labels['mailboxview'] = 'Vista das caixas de correo';
-$labels['mdnrequests'] = 'Notificacións de envío';
-$labels['askuser'] = 'preguntar ao usuario';
+$labels['mdnrequests'] = 'Cando se solicitan notificacións da entrega';
+$labels['askuser'] = 'preguntarme qué facer';
 $labels['autosend'] = 'enviar automáticamente';
+$labels['autosendknown'] = 'enviar aos meus contactos, noutros casos preguntarme';
+$labels['autosendknownignore'] = 'enviar aos meus contactos, noutros casos ignorar';
 $labels['ignore'] = 'ignorar';
 $labels['readwhendeleted'] = 'Marcar a mensaxe coma lida ao eliminar';
 $labels['flagfordeletion'] = 'Marcar a mensaxe para eliminar no canto de eliminar';
 $labels['skipdeleted'] = 'Non amosar as mensaxes eliminadas';
+$labels['deletealways'] = 'Borrar as mensaxes aínda se non se poden gardar na papeleira';
 $labels['showremoteimages'] = 'Amosar imaxes anexas remotas';
 $labels['fromknownsenders'] = 'de remitentes coñecidos';
 $labels['always'] = 'sempre';
 $labels['showinlineimages'] = 'Amosar as imaxes anexas baixo a mensaxe';
 $labels['autosavedraft'] = 'Gardar borrador automáticamente';
 $labels['everynminutes'] = 'cada $n minuto(s)';
-$labels['keepalive'] = 'Procurar novas mensaxes en';
+$labels['keepalive'] = 'Procurar novas mensaxes';
 $labels['never'] = 'nunca';
+$labels['immediately'] = 'de inmediato';
 $labels['messagesdisplaying'] = 'Visualización das mensaxes';
 $labels['messagescomposition'] = 'Composición das mensaxes';
 $labels['mimeparamfolding'] = 'Nomes dos ficheiros anexos';
 $labels['2231folding'] = 'Conforme ao RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Conforme ao RFC 2047 (other)';
+$labels['force7bit'] = 'Usar MIME para codificar caracteres de 8 bits';
 $labels['advancedoptions'] = 'Opcións avanzadas';
 $labels['focusonnewmessage'] = 'Enfocar o navegador se hai mensaxes novas';
 $labels['checkallfolders'] = 'Procurar novas mensaxes en tódolos cartafoles';
@@ -253,6 +298,23 @@ $labels['section'] = 'Sección';
 $labels['maintenance'] = 'Mantemento';
 $labels['newmessage'] = 'Nova mensaxe';
 $labels['listoptions'] = 'Opcións de lista';
+$labels['signatureoptions'] = 'Opcións da firma';
+$labels['whenreplying'] = 'Ao respostar';
+$labels['replytopposting'] = 'comezar a nova mensaxe enriba da orixinal';
+$labels['replybottomposting'] = 'comezar a nova mensaxe embaixo da orixinal';
+$labels['replyremovesignature'] = 'Eliminar a firma orixinal da mensaxe ao respostar';
+$labels['autoaddsignature'] = 'Engadir firma automáticamente';
+$labels['newmessageonly'] = 'só nas novas mensaxes';
+$labels['replyandforwardonly'] = 'só nas respostas e reenvíos';
+$labels['replysignaturepos'] = 'Ao  respostar ou reenviar colocar a firma ';
+$labels['belowquote'] = 'embaixo do texto citado';
+$labels['abovequote'] = 'enriba do texto citado';
+$labels['insertsignature'] = 'Engadir firma';
+$labels['previewpanemarkread'] = 'Marcar como lidas as mensaxes previsualizadas';
+$labels['afternseconds'] = 'logo de $n segundos';
+$labels['reqmdn'] = 'Solicitar sempre unha notificación da entrega';
+$labels['reqdsn'] = 'Solicitar sempre unha notificación do estado de envío';
+$labels['replysamefolder'] = 'Deixar as respostas no cartafol onde está a mensaxe á que se responde';
 $labels['folder'] = 'Cartafol';
 $labels['folders'] = 'Cartafoles';
 $labels['foldername'] = 'Nome do cartafol';
@@ -260,11 +322,15 @@ $labels['subscribed'] = 'Subscrito';
 $labels['messagecount'] = 'Mensaxes';
 $labels['create'] = 'Crear';
 $labels['createfolder'] = 'Crear novo cartafol';
-$labels['rename'] = 'Renomear';
-$labels['renamefolder'] = 'Renomear cartafol';
-$labels['deletefolder'] = 'Eliminar cartafol';
 $labels['managefolders'] = 'Xestionar cartafoles';
 $labels['specialfolders'] = 'Cartafoles especiais';
+$labels['properties'] = 'Propiedades';
+$labels['folderproperties'] = 'Propiedades do cartafol';
+$labels['parentfolder'] = 'Cartafol padre';
+$labels['location'] = 'Posición';
+$labels['info'] = 'Información';
+$labels['getfoldersize'] = 'Prema para obter o tamaño do cartafol';
+$labels['changesubscription'] = 'Prema para trocar a subscrición';
 $labels['sortby'] = 'Ordenar por';
 $labels['sortasc'] = 'Orde ascendente';
 $labels['sortdesc'] = 'Orde descendente';
@@ -272,5 +338,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Inglés';
+$labels['westerneuropean'] = 'Europeo Occidental';
+$labels['easterneuropean'] = 'Europeo Oriental';
+$labels['southeasterneuropean'] = 'Europeo Suroriental';
+$labels['baltic'] = 'Báltico';
+$labels['cyrillic'] = 'Cirílico';
+$labels['arabic'] = 'Arábigo';
+$labels['greek'] = 'Grego';
+$labels['hebrew'] = 'Hebreo';
+$labels['turkish'] = 'Turco';
+$labels['nordic'] = 'Nórdico';
+$labels['thai'] = 'Thai';
+$labels['celtic'] = 'Celta';
+$labels['vietnamese'] = 'Vietnamita';
+$labels['japanese'] = 'Xaponés';
+$labels['korean'] = 'Coreano';
+$labels['chinese'] = 'Chinés';
 
 ?>
index f1a0d702c333e47aca192eb78abec274431f710a..b945f25ca17b49390148cc465cd622a5bd7411bb 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/gl_ES/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -19,12 +19,16 @@ $messages['loginfailed'] = 'Fallou o acceso';
 $messages['cookiesdisabled'] = 'O seu navegador non acepta galletas';
 $messages['sessionerror'] = 'A súa sesión non é válida ou expirou';
 $messages['imaperror'] = 'Fallou a conexión co servidor IMAP';
-$messages['servererror'] = 'Erro no servidor!';
+$messages['servererror'] = 'Erro do servidor!';
+$messages['servererrormsg'] = 'Erro do servidor: $msg';
+$messages['errorreadonly'] = 'Non foi posible realizar a operación. O cartafol é de só lectura';
+$messages['errornoperm'] = 'Non foi posible realizar a operación. Permiso denegado.';
 $messages['invalidrequest'] = 'Petición inválida!. Non se gardou ningún dato.';
 $messages['nomessagesfound'] = 'Non se atoparon mensaxes nesta caixa de correo';
 $messages['loggedout'] = 'Rematou correctamente a súa sesión. Ata logo!';
 $messages['mailboxempty'] = 'A caixa de correo está vacía';
 $messages['loading'] = 'Cargando...';
+$messages['uploading'] = 'Cargando ficheiro...';
 $messages['loadingdata'] = 'Cargando datos...';
 $messages['checkingmail'] = 'Á procura de novas mensaxes...';
 $messages['sendingmessage'] = 'Enviando mensaxe...';
@@ -42,17 +46,18 @@ $messages['sendingfailed'] = 'Fallou o envío da mensaxe';
 $messages['senttooquickly'] = 'Por favor, espere $sec segundos antes de enviar esta mensaxe';
 $messages['errorsavingsent'] = 'Ocurriu un erro mentres se gardaba a mensaxe enviada';
 $messages['errorsaving'] = 'Ocurriu un erro mentres se gardaba';
-$messages['errormoving'] = 'Non se puido mover a mensaxe';
-$messages['errordeleting'] = 'Non se puido eliminar a mensaxe';
-$messages['errormarking'] = 'Non se puido marcar a mensaxe';
+$messages['errormoving'] = 'Non foi posible mover a(s) mensaxe(s)';
+$messages['errorcopying'] = 'Non foi posible copiar a(s) mensaxe(s)';
+$messages['errordeleting'] = 'Non foi posible eliminar a(s) mensaxe(s)';
+$messages['errormarking'] = 'Non foi posible marcar a(s) mensaxe(s)';
 $messages['deletecontactconfirm'] = 'Quere eliminar o(s) contacto(s) seleccionado(s)?';
 $messages['deletemessagesconfirm'] = 'Quere eliminar a(s) mensaxe(s) seleccionadas?';
 $messages['deletefolderconfirm'] = 'Quere eliminar este cartafol?';
 $messages['purgefolderconfirm'] = 'Quere eliminar tódalas mensaxes neste cartafol?';
-$messages['foldercreating'] = 'Creando o cartafol...';
 $messages['folderdeleting'] = 'Eliminando o cartafol...';
-$messages['folderrenaming'] = 'Renomeando o cartafol...';
 $messages['foldermoving'] = 'Movendo o cartafol...';
+$messages['foldersubscribing'] = 'Subscribindo o cartafol...';
+$messages['folderunsubscribing'] = 'Desuscribindo o cartafol...';
 $messages['formincomplete'] = 'Non se cumprimentou completamente o formulario';
 $messages['noemailwarning'] = 'Por favor, introduza un enderezo de correo electrónico válido';
 $messages['nonamewarning'] = 'Por favor, introduza un nome';
@@ -65,41 +70,69 @@ $messages['notsentwarning'] = 'A mensaxe non se enviou. Quere descartala?';
 $messages['noldapserver'] = 'Por favor, elixa un servidor LDAP para buscar';
 $messages['nocontactsreturned'] = 'Non se atoparon contactos';
 $messages['nosearchname'] = 'Por favor, introduza un contacto ou un enderezo de correo electrónico';
+$messages['notuploadedwarning'] = 'Aínda non se cargaron tódolos ficheiros. Por favor, agarde ou cancele a carga.';
 $messages['searchsuccessful'] = 'Atopáronse $nr mensaxes';
 $messages['searchnomatch'] = 'A busca non atopou coincidencias';
 $messages['searching'] = 'Buscando...';
 $messages['checking'] = 'Comprobando...';
 $messages['nospellerrors'] = 'Non hai erros ortográficos';
-$messages['folderdeleted'] = 'Eliminouse correctamente o cartafol';
+$messages['folderdeleted'] = 'O cartafol eliminouse correctamente';
+$messages['foldersubscribed'] = 'O cartafol suscribiuse correctamente';
+$messages['folderunsubscribed'] = 'O cartafol desuscribiuse correctamente';
+$messages['folderpurged'] = 'O cartafol purgouse correctamente';
+$messages['folderexpunged'] = 'O cartafol baleirouse correctamente';
 $messages['deletedsuccessfully'] = 'Eliminouse correctamente';
 $messages['converting'] = 'Eliminando o formato da mensaxe...';
-$messages['messageopenerror'] = 'Non se puido cargar a mensaxe desde o servidor';
+$messages['messageopenerror'] = 'Non foi posible cargar a mensaxe desde o servidor';
 $messages['fileuploaderror'] = 'Fallou a carga do ficheiro';
 $messages['filesizeerror'] = 'O ficheiro cargado é máis grande que o tamaño máximo de $size';
 $messages['copysuccess'] = 'Copiáronse correctamente $nr enderezos';
-$messages['copyerror'] = 'Non se puido copiar ningún enderezo';
+$messages['copyerror'] = 'Non foi posible copiar ningún enderezo';
 $messages['sourceisreadonly'] = 'A orixe é de só lectura';
-$messages['errorsavingcontact'] = 'Non se puido gardar o contacto';
-$messages['movingmessage'] = 'Movendo mensaxe...';
-$messages['receiptsent'] = 'A notificación de disposición enviouse correctamente';
-$messages['errorsendingreceipt'] = 'Non se puido enviar a notificación de disposición';
+$messages['errorsavingcontact'] = 'Non foi posible gardar o contacto';
+$messages['movingmessage'] = 'Movendo a(s) mensaxe(s)...';
+$messages['copyingmessage'] = 'Copiando a(s) mensaxe(s)...';
+$messages['deletingmessage'] = 'Eliminando a(s) mensaxe(s)...';
+$messages['markingmessage'] = 'Marcando a(s) mensaxe(s)...';
+$messages['receiptsent'] = 'A notificación da entrega enviouse correctamente';
+$messages['errorsendingreceipt'] = 'Non foi posible enviar a notificación da entrega';
 $messages['nodeletelastidentity'] = 'Non pode eliminar esta identidade, é a última';
-$messages['addsubfolderhint'] = 'Este cartafol vaise crear coma un subcartafol do seleccionado';
 $messages['forbiddencharacter'] = 'O nome do cartafol contén un carácter non válido';
 $messages['selectimportfile'] = 'Por favor, escolla un ficheiro para cargar';
 $messages['addresswriterror'] = 'Non se pode escribir no caderno de enderezos que escolleu';
+$messages['contactaddedtogroup'] = 'Engadíronse correctamente os contactos a este grupo';
+$messages['contactremovedfromgroup'] = 'Suprimíronse correctamente os contactos de este grupo';
 $messages['importwait'] = 'Estou a importar. Por favor, agarde...';
 $messages['importerror'] = 'Fallou a importación! O ficheiro que cargou non é un vCard correcto.';
 $messages['importconfirm'] = '<b>Importáronse correctamente $inserted contactos. Ignoráronse $skipped contactos que xa existían</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Operación non permitida';
 $messages['nofromaddress'] = 'Falta o enderezo de correo electrónico na identidade que escolleu';
 $messages['editorwarning'] = 'Se troca neste intre ao editor de texto plano, vai perder todo o formato do texto. Quere continuar?';
-$messages['httpreceivedencrypterror'] = 'Produciuse un erro fatal de configuración. Contacte ao administrador inmediatamente. <b>Non se puido enviar a súa mensaxe.</b>';
+$messages['httpreceivedencrypterror'] = 'Produciuse un erro fatal de configuración. Contacte ao administrador inmediatamente. <b>Non foi posible enviar a súa mensaxe.</b>';
 $messages['smtpconnerror'] = 'Erro SMTP ($code): Fallou a conexión co servidor';
 $messages['smtpautherror'] = 'Erro SMTP ($code): Fallou a autenticación';
-$messages['smtpfromerror'] = 'Erro SMTP ($code): Non se puido establecer o remitente "$from"';
-$messages['smtptoerror'] = 'Erro SMTP ($code): Non se puido engadir o destinatario "$to"';
+$messages['smtpfromerror'] = 'Erro SMTP ($code): Non foi posible establecer o remitente "$from" ($msg)';
+$messages['smtptoerror'] = 'Erro SMTP ($code): Non foi posible engadir o destinatario "$to" ($msg)';
 $messages['smtprecipientserror'] = 'Erro SMTP: Non se pode analizar a lista de destinatarios';
+$messages['smtpdsnerror'] = 'Erro SMTP: Non hai soporte para notificacións do estado de envío (DSN)';
 $messages['smtperror'] = 'Erro SMTP: $msg';
+$messages['emailformaterror'] = 'O enderezo de correo electrónico é incorrecto: $email';
+$messages['toomanyrecipients'] = 'Especificou demasiados destinatarios. Por favor, redúzaos a un máximo de $max.';
+$messages['maxgroupmembersreached'] = 'O número de membros do grupo excede o máximo de $max.';
+$messages['internalerror'] = 'Ocurriu un erro interno. Por favor, probe outra vez.';
+$messages['contactdelerror'] = 'Non foi posible borrar o(s) contacto(s)';
+$messages['contactdeleted'] = 'Borráronse correctamente o(s) contacto(s)';
+$messages['groupdeleted'] = 'Borrouse correctamente o grupo';
+$messages['grouprenamed'] = 'Mudouse correctamente o nome do grupo';
+$messages['groupcreated'] = 'Creouse correctamente o grupo';
+$messages['messagedeleted'] = 'Borráronse correctamente a(s) mensaxe(s)';
+$messages['messagemoved'] = 'Movéronse correctamente a(s) mensaxe(s)';
+$messages['messagecopied'] = 'Copiáronse correctamente a(s) mensaxe(s)';
+$messages['messagemarked'] = 'Marcáronse correctamente a(s) mensaxe(s)';
+$messages['autocompletechars'] = 'Introduza polo menos $min caracteres para autocompletar';
+$messages['namecannotbeempty'] = 'O nome non pode estar baleiro';
+$messages['nametoolong'] = 'O nome é demasiado longo';
+$messages['folderupdated'] = 'O cartafol actualizouse correctamente';
+$messages['foldercreated'] = 'O cartafol creouse correctamente';
 
 ?>
index a3a1eb1c83fd77b3160a83bfbe32936ce8a8e5bf..61f27f769ae1109d52b46ef5f88e4f4d7d48c109 100644 (file)
@@ -4,14 +4,14 @@
 +-----------------------------------------------------------------------+
 | language/he_IL/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Moshe Leibovitch  <moish@mln.co.il>                           |
 | Updates: Noor Dawod <noor@comrax.com>                                 |
-| Updates: Moshe Leibovitch  <moish@mln.co.il>  27092009                |
+| Updates: Moshe Leibovitch  <moish@mln.co.il>  09122010                |
 +-----------------------------------------------------------------------+
 */
 
@@ -36,21 +36,22 @@ $labels['to'] = 'הנמען';
 $labels['cc'] = 'לידיעה';
 $labels['bcc'] = 'מכותב מוסתר';
 $labels['replyto'] = 'כתובת למענה';
+$labels['followupto'] = 'כתובת להעברת הודעה';
 $labels['date'] = 'תאריך';
 $labels['size'] = 'גודל';
 $labels['priority'] = 'עדיפות';
 $labels['organization'] = 'ארגון';
-$labels['reply-to'] = 'כתובת למענה';
+$labels['readstatus'] = 'נקרא';
 $labels['mailboxlist'] = 'תיקים';
 $labels['messagesfromto'] = 'הודעות $from עד $to מתוך $count';
+$labels['threadsfromto'] = 'שרשור $from עד $to מתוך $count';
 $labels['messagenrof'] = 'הודעה $nr מתוך $count';
+$labels['copy'] = 'העתק';
+$labels['move'] = 'העבר';
 $labels['moveto'] = 'תיוק ב...';
 $labels['download'] = 'הורדה';
 $labels['filename'] = 'שם קובץ';
 $labels['filesize'] = 'גודל קובץ';
-$labels['preferhtml'] = 'הצגת HTML';
-$labels['htmlmessage'] = 'תוכן HTML';
-$labels['prettydate'] = 'תאריכים מעוצבים';
 $labels['addtoaddressbook'] = 'הוספה לפנקס כתובות';
 $labels['sun'] = 'יום א';
 $labels['mon'] = 'יום ב';
@@ -95,6 +96,8 @@ $labels['checkmail'] = 'משיכת הודעות חדשות';
 $labels['writenewmessage'] = 'יצירת הודעה חדשה';
 $labels['replytomessage'] = 'מענה לשולח';
 $labels['replytoallmessage'] = 'מענה לשולח ולכל הנמענים';
+$labels['replyall'] = 'מענה לכולם';
+$labels['replylist'] = 'מענה לרשימת תפוצה';
 $labels['forwardmessage'] = 'העבר הודעה';
 $labels['deletemessage'] = 'מחיקה';
 $labels['movemessagetotrash'] = 'השלכה לאשפה';
@@ -118,12 +121,35 @@ $labels['messageactions'] = 'פעולות נוספות';
 $labels['select'] = 'בחירה';
 $labels['all'] = 'הכל';
 $labels['none'] = 'כלום';
+$labels['currpage'] = 'דף נוכחי';
 $labels['unread'] = 'לא נקראו';
 $labels['flagged'] = 'מסומן';
 $labels['unanswered'] = 'לא נענה';
 $labels['deleted'] = 'נמחק';
 $labels['invert'] = 'היפוך הסימון';
 $labels['filter'] = 'סינון';
+$labels['list'] = 'רשימה';
+$labels['threads'] = 'שרשור';
+$labels['expand-all'] = 'הרחבה כלית';
+$labels['expand-unread'] = 'הרחבה טרם נקרא';
+$labels['collapse-all'] = 'כינוס כללי';
+$labels['threaded'] = 'משורשר';
+$labels['autoexpand_threads'] = 'הרחבת הודעות משורשרות';
+$labels['do_expand'] = 'כל השרשורים';
+$labels['expand_only_unread'] = 'רק עם הודעות שטרם נקראו';
+$labels['fromto'] = 'שולח/נמען';
+$labels['flag'] = 'דגל';
+$labels['attachment'] = 'צרופה';
+$labels['nonesort'] = 'כלום';
+$labels['sentdate'] = 'תאריך משלוח';
+$labels['arrival'] = 'תאריך הגעה';
+$labels['asc'] = 'בסדר עולה';
+$labels['desc'] = 'בסדר יורד';
+$labels['listcolumns'] = 'רשימת עמודות';
+$labels['listsorting'] = 'המיון לפי העמודה';
+$labels['listorder'] = 'סדר מיון';
+$labels['listmode'] = 'אופן הצגת רשימה';
+$labels['folderactions'] = 'פעולות על תיקים';
 $labels['compact'] = 'פינוי שטח לא מנוצל';
 $labels['empty'] = 'ריקון';
 $labels['purge'] = 'מחיקה';
@@ -144,12 +170,15 @@ $labels['addattachment'] = 'צירוף קובץ';
 $labels['charset'] = 'קידוד';
 $labels['editortype'] = 'סוג עורך';
 $labels['returnreceipt'] = 'אישור קבלה';
+$labels['dsn'] = 'הודעה על מצב המסירה';
+$labels['editidents'] = 'עריכת זהויות';
 $labels['checkspelling'] = 'בדיקת איות';
 $labels['resumeediting'] = 'המשך עריכה';
 $labels['revertto'] = 'חזור למצב קודם';
 $labels['attachments'] = 'קבצים מצורפים';
 $labels['upload'] = 'העלאה';
 $labels['close'] = 'סגירה';
+$labels['messageoptions'] = 'אפשרויות הודעה...';
 $labels['low'] = 'נמוך';
 $labels['lowest'] = 'נמוך ביותר';
 $labels['normal'] = 'רגיל';
@@ -166,6 +195,7 @@ $labels['maxuploadsize'] = 'גודל מקסימלי לקובץ הוא  $size';
 $labels['addcc'] = 'הוספת מכותב לידיעה';
 $labels['addbcc'] = 'הוספת מכותב נסתר';
 $labels['addreplyto'] = 'הוספת כתובת למענה';
+$labels['addfollowupto'] = 'הוספת כתובת להעברת הודעה';
 $labels['mdnrequest'] = 'השולח ביקש לדעת אם ההודעה נקראה. האם להודיע לשולח?';
 $labels['receiptread'] = 'אישור קבלה (נקרא)';
 $labels['yourmessage'] = 'אישור קבלה להודעתך';
@@ -176,6 +206,8 @@ $labels['surname'] = 'שם משפחה';
 $labels['email'] = 'כתובת דוא"ל';
 $labels['addcontact'] = 'הוספת איש קשר';
 $labels['editcontact'] = 'עריכת איש קשר';
+$labels['contacts'] = 'אנשי קשר';
+$labels['contactproperties'] = 'מאפייני איש קשר';
 $labels['edit'] = 'עריכה';
 $labels['cancel'] = 'ביטול';
 $labels['save'] = 'שמירה';
@@ -187,10 +219,13 @@ $labels['contactsfromto'] = 'אנשי קשר $from עד $to מתוך $count';
 $labels['print'] = 'הדפסה';
 $labels['export'] = 'ייצוא';
 $labels['exportvcards'] = 'ייצוא אנשי קשר בפורמט  vCard ';
+$labels['newcontactgroup'] = 'יצירת קבוצה חדשה של אנשי קשר';
+$labels['groupactions'] = 'פעולות על קבוצת אנשי הקשר...';
 $labels['previouspage'] = 'הצגת הקבוצה הקודמת';
 $labels['firstpage'] = 'הצגת הקבוצה הראשונה';
 $labels['nextpage'] = 'הצגת הקבוצה הבאה';
 $labels['lastpage'] = 'הצגת הקבוצה האחרונה';
+$labels['group'] = 'קבוצה';
 $labels['groups'] = 'קבוצות';
 $labels['personaladrbook'] = 'כתובות פרטיות';
 $labels['import'] = 'ייבוא';
@@ -208,6 +243,10 @@ $labels['manageidentities'] = 'ניהול זהויות לחשבון זה';
 $labels['newidentity'] = 'זהות חדשה';
 $labels['newitem'] = 'רשומה חדשה';
 $labels['edititem'] = 'עריכת רשומה';
+$labels['preferhtml'] = 'הצגת HTML';
+$labels['defaultcharset'] = 'ברירת מחדל של תווים';
+$labels['htmlmessage'] = 'תוכן HTML';
+$labels['prettydate'] = 'תאריכים מעוצבים';
 $labels['setdefault'] = 'קביעה כברירת מחדל';
 $labels['autodetect'] = 'אוטומטי';
 $labels['language'] = 'שפה';
@@ -216,6 +255,7 @@ $labels['pagesize'] = 'מספר שורות בדף';
 $labels['signature'] = 'חתימה';
 $labels['dstactive'] = 'שעון קיץ';
 $labels['htmleditor'] = 'יצירת הודעה מעוצבת';
+$labels['htmlonreply'] = 'רק במענה להודעת HTML';
 $labels['htmlsignature'] = 'חתימה מעוצבת';
 $labels['previewpane'] = 'תצוגה מוקדמת';
 $labels['skin'] = 'ערכת מראה';
@@ -227,10 +267,13 @@ $labels['mailboxview'] = 'הצגת תיבת ההודעות';
 $labels['mdnrequests'] = 'משלוח אישור מסירה';
 $labels['askuser'] = 'שאל את המשתמש';
 $labels['autosend'] = 'שליחה אוטומטית';
+$labels['autosendknown'] = 'משלוח אישור קבלה רק לאנשי הקשר שלי ';
+$labels['autosendknownignore'] = 'משלוח אישור קבלה לאנשי הקשר שלי בלבד ולהתעלם מאחרים';
 $labels['ignore'] = 'התעלם';
 $labels['readwhendeleted'] = 'סימון הודעה כנקראה לאחר מחיקה';
 $labels['flagfordeletion'] = 'סימון הודעה כמחוקה במקום מחיקה';
 $labels['skipdeleted'] = 'הסתרת הודעות שנמחקו';
+$labels['deletealways'] = 'אם העברה לתיקית מחיקה נכשלת יש למחוק לתמיד';
 $labels['showremoteimages'] = 'הצגת תמונות משרת מרוחק בגוף ההודעה';
 $labels['fromknownsenders'] = 'משולחים מוכרים';
 $labels['always'] = 'תמיד';
@@ -239,22 +282,40 @@ $labels['autosavedraft'] = 'שמירה אוטומטית של טיוטה';
 $labels['everynminutes'] = 'כל $n דקות';
 $labels['keepalive'] = 'בדיקת הגעה של הודעות חדשות';
 $labels['never'] = 'אף פעם';
+$labels['immediately'] = 'מיידית';
 $labels['messagesdisplaying'] = 'הצגת הודעות';
 $labels['messagescomposition'] = 'כתיבת הודעות';
 $labels['mimeparamfolding'] = 'שמות קבצים מצורפים';
 $labels['2231folding'] = 'תאימות מלאה 2231 תאנדרבירד';
 $labels['miscfolding'] = 'תאימות 2047/2231 אאוטלוק';
 $labels['2047folding'] = 'תאימות מלאה 2047 אחרים';
+$labels['force7bit'] = 'קידוד MIME עבור תווים בעלי 8 ביטים';
 $labels['advancedoptions'] = 'הגדרות נוספות';
 $labels['focusonnewmessage'] = 'מיקוד הסמן על החלון עם ההודעה החדשה';
 $labels['checkallfolders'] = 'בדיקת הודעות חדשות בכל התיקים';
 $labels['displaynext'] = 'מעבר להודעה הבאה לאחר מחיקה או תיוק';
-$labels['indexsort'] = 'שימוש בשרת המערכת לשם מיון התצוגה לפי תאריך';
 $labels['mainoptions'] = 'אפשרויות עיקריות';
 $labels['section'] = 'קטע';
 $labels['maintenance'] = 'תחזוקה';
 $labels['newmessage'] = 'הודעה חדשה';
 $labels['listoptions'] = 'אפשרויות רשימה';
+$labels['signatureoptions'] = 'אפשרויות לשיבוץ חתימה';
+$labels['whenreplying'] = 'כאשר עונים';
+$labels['replytopposting'] = 'הודעה חדשה תתחיל מעל ההודעה המקורית';
+$labels['replybottomposting'] = 'הודעה חדשה תתחיל מתחת להודעה המקורית';
+$labels['replyremovesignature'] = 'החתימה תוסר מההודעה המקורית במענה להודעה';
+$labels['autoaddsignature'] = 'הוספה אוטומטית של חתימה';
+$labels['newmessageonly'] = 'הודעה חדשה בלבד';
+$labels['replyandforwardonly'] = 'מענה והעברת הודעה בלבד';
+$labels['replysignaturepos'] = 'במענה או בהעברת הודעה, החתימה תופיע';
+$labels['belowquote'] = 'בסוף ההודעה המקורית';
+$labels['abovequote'] = 'בתחילת ההודעה המקורית';
+$labels['insertsignature'] = 'שיבוץ חתימה';
+$labels['previewpanemarkread'] = 'סימון הודעה שנצפתה כנקראה';
+$labels['afternseconds'] = 'לאחר $n שניות';
+$labels['reqmdn'] = 'תמיד יש לדרוש אישור קבלה';
+$labels['reqdsn'] = 'תמיד לבקש הודעה על מצב המסירה';
+$labels['replysamefolder'] = 'המענה ישמר בתיקיה של ההודעה המקורית';
 $labels['folder'] = 'תיק';
 $labels['folders'] = 'תיקים';
 $labels['foldername'] = 'שם תיק';
@@ -262,11 +323,15 @@ $labels['subscribed'] = 'מנוי';
 $labels['messagecount'] = 'הודעות';
 $labels['create'] = 'יצירה';
 $labels['createfolder'] = 'יצירת תיק חדש';
-$labels['rename'] = 'שינוי שם';
-$labels['renamefolder'] = 'שינוי שם תיק';
-$labels['deletefolder'] = 'מחיקת תיק';
 $labels['managefolders'] = 'ניהול תיקים';
 $labels['specialfolders'] = 'תיקים מיוחדים';
+$labels['properties'] = 'מאפיינים';
+$labels['folderproperties'] = 'מאפייני תיק';
+$labels['parentfolder'] = 'תיק אב';
+$labels['location'] = 'מיקום';
+$labels['info'] = 'מידע';
+$labels['getfoldersize'] = 'הקשה להצגה של גודל תיק';
+$labels['changesubscription'] = 'הקשה לשינוי הרשמה';
 $labels['sortby'] = 'מיון לפי';
 $labels['sortasc'] = 'מיון בסדר עולה';
 $labels['sortdesc'] = 'מיון בסדר יורד';
@@ -274,5 +339,23 @@ $labels['B'] = 'בייט';
 $labels['KB'] = 'ק"ב';
 $labels['MB'] = 'מ"ב';
 $labels['GB'] = 'ג"ב';
+$labels['unicode'] = 'יוניקוד';
+$labels['english'] = 'אנגלית';
+$labels['westerneuropean'] = 'מערב אירופי';
+$labels['easterneuropean'] = 'מזרח אירופי';
+$labels['southeasterneuropean'] = 'דרום מזרח אירופה';
+$labels['baltic'] = 'בלטי';
+$labels['cyrillic'] = 'קירילי';
+$labels['arabic'] = 'ערבי';
+$labels['greek'] = 'יווני';
+$labels['hebrew'] = 'עברי';
+$labels['turkish'] = 'טורקי';
+$labels['nordic'] = 'נורדי';
+$labels['thai'] = 'תאי';
+$labels['celtic'] = 'קלטי';
+$labels['vietnamese'] = 'וויטנאמי';
+$labels['japanese'] = 'יפני';
+$labels['korean'] = 'קוריאני';
+$labels['chinese'] = 'סיני';
 
 ?>
index 3cb80c6078e5a90c3bca7ca14d1222e6d3b18e26..9dd3c872b53d9feabbcef52c3b2e41baceb0454d 100644 (file)
@@ -4,14 +4,14 @@
 +-----------------------------------------------------------------------+
 | language/he_IL/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Moshe Leibovitch    <moish@mln.co.il>                         |
 | Updates: Noor Dawod <noor@comrax.com>                                 |
-| Updates: Moshe Leibovitch  <moish@mln.co.il>  25102009                |
+| Updates: Moshe Leibovitch  <moish@mln.co.il>  09122010                |
 +-----------------------------------------------------------------------+
 
 */
@@ -22,6 +22,9 @@ $messages['cookiesdisabled'] = 'הדפדפן אינו מקבל עוגיות';
 $messages['sessionerror'] = 'כניסתך למערכת אינה חוקית או שפג תוקפה';
 $messages['imaperror'] = 'הקשר לשרת הדואר נכשל';
 $messages['servererror'] = '! שגיאת שרת';
+$messages['servererrormsg'] = '$msg  שגיאת שרת';
+$messages['errorreadonly'] = 'לא ניתן לבצע הפעולה כי התיק ניתן לקריאה בלבד';
+$messages['errornoperm'] = 'לא ניתן לבצע הפעולה כי אין הרשאה לבצעה';
 $messages['invalidrequest'] = 'בקשה לא חוקית. המידע לא נשמר';
 $messages['nomessagesfound'] = 'לא נמצאו הודעות בתיבה זו';
 $messages['loggedout'] = 'הקשר הסתיים. להתראות!';
@@ -46,16 +49,17 @@ $messages['senttooquickly'] = 'נא להמתין $sec שניות לפני מסי
 $messages['errorsavingsent'] = 'נגרמה שגיאה במהלך שמירת ההודעה בתיק הודעות יוצאות';
 $messages['errorsaving'] = 'נגרמה שגיאה במהלך השמירה';
 $messages['errormoving'] = 'לא ניתן לתייק את ההודעה';
+$messages['errorcopying'] = 'העתקת ההודעות נכשלה';
 $messages['errordeleting'] = 'לא ניתן למחוק את ההודעה';
 $messages['errormarking'] = 'לא ניתן לסמן ההודעה';
 $messages['deletecontactconfirm'] = 'האם למחוק את איש הקשר?';
 $messages['deletemessagesconfirm'] = 'האם למחוק את ההודעות המסומנות?';
 $messages['deletefolderconfirm'] = 'האם למחוק תיק זה?';
 $messages['purgefolderconfirm'] = 'האם למחוק את כל ההודעות בתיק זה?';
-$messages['foldercreating'] = 'התיקיה נוצרת...';
 $messages['folderdeleting'] = 'התיקיה נמחקת...';
-$messages['folderrenaming'] = 'שינוי שם תיקיה...';
 $messages['foldermoving'] = 'העברת תיקיה...';
+$messages['foldersubscribing'] = 'התיק נרשם...';
+$messages['folderunsubscribing'] = 'רישום התיק בוטל...';
 $messages['formincomplete'] = 'לא הוזנו כל השדות בטופס זה';
 $messages['noemailwarning'] = 'נא להוסיף כתובת דוא\"ל חוקית';
 $messages['nonamewarning'] = 'נא להוסיף שם';
@@ -75,6 +79,10 @@ $messages['searching'] = 'חיפוש...';
 $messages['checking'] = 'בדיקה...';
 $messages['nospellerrors'] = 'לא נמצאו שגיאות כתיב';
 $messages['folderdeleted'] = 'התיק נמחק בהצלחה';
+$messages['foldersubscribed'] = 'התיק נרשם בהצלחה';
+$messages['folderunsubscribed'] = 'ביטול רישום תיק הצליח';
+$messages['folderpurged'] = 'התיק נמחק בהצלחה';
+$messages['folderexpunged'] = 'התיק רוקן בהצלחה';
 $messages['deletedsuccessfully'] = 'המחיקה הסתיימה בהצלחה';
 $messages['converting'] = 'הסרת העיצוב מההודעה';
 $messages['messageopenerror'] = 'לא ניתן לטעון ההודעה מהשרת';
@@ -85,13 +93,17 @@ $messages['copyerror'] = 'לא ניתן להעתיק אף כתובת';
 $messages['sourceisreadonly'] = 'המקור לכתובת הוא לקריאה בלבד';
 $messages['errorsavingcontact'] = 'לא ניתן לשמור את כתובת איש הקשר';
 $messages['movingmessage'] = 'תיוק ההודעה...';
+$messages['copyingmessage'] = 'הודעת מועתקת...';
+$messages['deletingmessage'] = 'המחיקה בתהליך...';
+$messages['markingmessage'] = 'סימון ההודעה בתהליך...';
 $messages['receiptsent'] = 'אישור הקבלה נשלח בהצלחה';
 $messages['errorsendingreceipt'] = 'לא ניתן לשלוח אישור קבלה';
 $messages['nodeletelastidentity'] = 'זו הזהות האחרונה ולכן לא ניתן לבטלה';
-$messages['addsubfolderhint'] = 'תיקיה זו תוקם תחת התיקיה שנבחרה';
 $messages['forbiddencharacter'] = 'שם התיקיה מכיל תוים אסורים';
 $messages['selectimportfile'] = 'נא לבחור קובץ לייבוא';
 $messages['addresswriterror'] = 'פנקס הכתובות שנבחר אינו ניתן לכתיבה';
+$messages['contactaddedtogroup'] = 'אנשי הקשר נוספו בהצלחה לקבוצה';
+$messages['contactremovedfromgroup'] = 'אנשי הקשר הוסרו בהצלחה מהקבוצה';
 $messages['importwait'] = 'ייבוא, נא להמתין..';
 $messages['importerror'] = 'חוקי vCard הייבוא נכשל כי הקובץ אינו בפורמט';
 $messages['importconfirm'] = '<b>יובאו $inserted אנשי קשר, $skipped היו קיימים </b>:<p><em>$names</em></p>';
@@ -101,10 +113,28 @@ $messages['editorwarning'] = 'המעבר לעורך רגיל יגרום לאיב
 $messages['httpreceivedencrypterror'] = 'ארעה שגיאת תצורה חמורה. נא להודיע מייד למנהל/ת המערכת. <B> הודעתך לא תשלח <B> ';
 $messages['smtpconnerror'] = 'SMTP ($code): אבד הקשר לשרת';
 $messages['smtpautherror'] = 'SMTP ($code): ההזדהות נכשלה';
-$messages['smtpfromerror'] = 'SMTP ($code): "$from" לא נרשמה כתובת השולח';
-$messages['smtptoerror'] = 'SMTP ($code): "$to" לא נרשמה כתובת המקבל';
+$messages['smtpfromerror'] = ' ($msg) SMTP ($code): "$from" לא נרשמה כתובת השולח';
+$messages['smtptoerror'] = ' ($msg) SMTP ($code): "$to" לא נרשמה כתובת המקבל';
 $messages['smtprecipientserror'] = 'SMTP : לא ניתן לפענח רשימת נמענים';
+$messages['smtpdsnerror'] = 'שגיאת SMTP: אין תמיכה בהודעה על מצב מסירה';
 $messages['smtperror'] = 'SMTP: $msg';
 $messages['emailformaterror'] = '$email  כתובת דוא"ל שגויה';
+$messages['toomanyrecipients'] = 'יותר מדי נמענים. יש להקטין מספרם ל - $max';
+$messages['maxgroupmembersreached'] = 'מספרם של חברי הקבוצה אינו יכול לעבור $max';
+$messages['internalerror'] = 'שגיאת מערכת. נא לנסות שנית';
+$messages['contactdelerror'] = 'לא ניתן למחוק איש קשר';
+$messages['contactdeleted'] = 'איש הקשר נמחק';
+$messages['groupdeleted'] = 'הקבוצה נמחקה בהצלחה';
+$messages['grouprenamed'] = 'שם הקבוצה שונה בהצלחה';
+$messages['groupcreated'] = 'הקבוצה נוצרה בהצלחה';
+$messages['messagedeleted'] = 'ההודעה נמחקה בהצלחה';
+$messages['messagemoved'] = 'ההודעה הועברה בהצלחה';
+$messages['messagecopied'] = 'ההודעה הועתקה בהצלחה';
+$messages['messagemarked'] = 'ההודעה סומנה בהצלחה';
+$messages['autocompletechars'] = 'יש להקיש לפחות $min תווים להשלמה אוטומטית של המחרוזת';
+$messages['namecannotbeempty'] = 'השם אינו יכול להיות ריק';
+$messages['nametoolong'] = 'השם ארוך מדי';
+$messages['folderupdated'] = 'התיק עודכן בהצלחה';
+$messages['foldercreated'] = 'התיק נוצר בהצלחה';
 
 ?>
index 9216b563176ea876e29513b71931be1716ac3d3a..ba5e7113f11a29075c3de3cb0e4a260a3572c441 100644 (file)
@@ -4,15 +4,15 @@
  +-----------------------------------------------------------------------+
  | localization/hi/labels.inc                                            |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Aniruddha "Karim" Shankar <karim@sarai.net>                   |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -226,9 +226,6 @@ $labels['foldername']               = 'फ़ोल्डर नाम';
 $labels['subscribed']          = 'सबस्क्राईब किया गया';
 $labels['create']              = 'बनाऐं';
 $labels['createfolder']                = 'फ़ोलडर बनाऐं';
-$labels['rename']              = 'नाम बदलें';
-$labels['renamefolder']                = 'फ़ोलडर का नाम बदलें';
-$labels['deletefolder']                = 'फ़ोलडर मिटाऐं';
 $labels['managefolders']       = 'फ़ोलडर को व्यवस्थित करें';
 
 $labels['sortby']              = 'ऐसे तय करें';
index a6d83b2b1cd882b127d17ff77999e98bd4da36f8..a31ffb83456587c2421b0219c4347118b35600b0 100644 (file)
@@ -4,15 +4,15 @@
  +-----------------------------------------------------------------------+
  | localization/hi/messages.inc                                          |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Aniruddha "Karim" Shankar <karim@sarai.net>                   |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: messages.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
index b9bd945e81ae953549ff30525dc5630132da8e41..f74b55874b01d4a74ffc55022d8be852b57a1d1c 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/hr/labels.inc                                                |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Edi Budimilic <edi@gemstudio.hr>                              |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2513 2009-05-21 12:59:19Z alec $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -38,21 +38,25 @@ $labels['to'] = 'Za';
 $labels['cc'] = 'Cc';
 $labels['bcc'] = 'Bcc';
 $labels['replyto'] = 'Odgovor-na';
+$labels['followupto'] = 'Nastavi-na';
 $labels['date'] = 'Datum';
 $labels['size'] = 'Veličina';
 $labels['priority'] = 'Prioritet';
 $labels['organization'] = 'Organizacija';
+$labels['readstatus'] = 'Pročitano';
 $labels['reply-to'] = 'Odgovor-na';
+$labels['mail-reply-to'] = 'Mail-Odogovori-na';
+$labels['mail-followup-to'] = 'Mail-Nastavi-na';
 $labels['mailboxlist'] = 'Mape';
 $labels['messagesfromto'] = 'Poruke od $from do $to od ukupno $count';
+$labels['threadsfromto'] = 'Teme od $from do $to od ukupno $count';
 $labels['messagenrof'] = 'Poruka broj $nr od $count';
-$labels['moveto'] = 'prebaci u...';
-$labels['download'] = 'preuzmi (download)';
+$labels['copy'] = 'Kopiraj';
+$labels['move'] = 'Premjesti';
+$labels['moveto'] = 'Premjesti u...';
+$labels['download'] = 'Preuzmi (download)';
 $labels['filename'] = 'Ime datoteke';
 $labels['filesize'] = 'Veličina datoteke';
-$labels['preferhtml'] = 'HTML format u prednosti';
-$labels['htmlmessage'] = 'HTML format poruke';
-$labels['prettydate'] = 'Formatiran datum';
 $labels['addtoaddressbook'] = 'Dodaj u imenik';
 $labels['sun'] = 'Ned';
 $labels['mon'] = 'Pon';
@@ -97,6 +101,8 @@ $labels['checkmail'] = 'Provjera novih poruka';
 $labels['writenewmessage'] = 'Nova poruka';
 $labels['replytomessage'] = 'Odgovori na poruku';
 $labels['replytoallmessage'] = 'Odgovori pošiljaocu i svim primateljima';
+$labels['replyall'] = 'Odgovori svima';
+$labels['replylist'] = 'Odgovori listi';
 $labels['forwardmessage'] = 'Prosljedi poruku';
 $labels['deletemessage'] = 'Prebaci poruku u mapu smeće';
 $labels['movemessagetotrash'] = 'Preseli poruke u smeće';
@@ -116,12 +122,39 @@ $labels['markread'] = 'Kao pročitano';
 $labels['markunread'] = 'Kao nepročitano';
 $labels['markflagged'] = 'Kao markiranu';
 $labels['markunflagged'] = 'Kao nemarkiranu';
+$labels['messageactions'] = 'Više akcija';
 $labels['select'] = 'Označi';
 $labels['all'] = 'Sve';
 $labels['none'] = 'Nijednu';
+$labels['currpage'] = 'Trenutna stranica';
 $labels['unread'] = 'Nepročitane';
 $labels['flagged'] = 'Markirane';
 $labels['unanswered'] = 'Neodgovrene';
+$labels['deleted'] = 'Obrisano';
+$labels['invert'] = 'Obrni';
+$labels['filter'] = 'Filtriraj';
+$labels['list'] = 'Lista';
+$labels['threads'] = 'Teme';
+$labels['expand-all'] = 'Proširi sve';
+$labels['expand-unread'] = 'Proširi nepročitane';
+$labels['collapse-all'] = 'Zatvori sve';
+$labels['threaded'] = 'Tematski prikaz';
+$labels['autoexpand_threads'] = 'Proširi teme poruka';
+$labels['do_expand'] = 'Sve teme';
+$labels['expand_only_unread'] = 'samo sa nepročitanim porukama';
+$labels['fromto'] = 'Pošiljatelj/Primatelj';
+$labels['flag'] = 'Zastava';
+$labels['attachment'] = 'Privitak';
+$labels['nonesort'] = 'Ništa';
+$labels['sentdate'] = 'Datum slanja';
+$labels['arrival'] = 'Datum primanja';
+$labels['asc'] = 'uzlazno';
+$labels['desc'] = 'silazno';
+$labels['listcolumns'] = 'Kolone';
+$labels['listsorting'] = 'Sortirajuća kolona';
+$labels['listorder'] = 'Sortirajući redoslijed';
+$labels['listmode'] = 'Model pregleda listi';
+$labels['folderactions'] = 'Akcije mapa';
 $labels['compact'] = 'Kompresiranje';
 $labels['empty'] = 'Isprazni ';
 $labels['purge'] = 'Očisti';
@@ -130,20 +163,27 @@ $labels['unknown'] = 'nepoznato';
 $labels['unlimited'] = 'beskonačna';
 $labels['quicksearch'] = 'Brza pretraga';
 $labels['resetsearch'] = 'Prikaži sve poruke';
+$labels['searchmod'] = 'Postavke pretrage';
+$labels['msgtext'] = 'Cijela poruka';
 $labels['openinextwin'] = 'Otvori u novom prozoru';
+$labels['emlsave'] = 'Download (.eml)';
 $labels['compose'] = 'Nova poruka';
+$labels['editasnew'] = 'Uredi kao novo';
 $labels['savemessage'] = 'Spremi u \'Predlošci\'';
 $labels['sendmessage'] = 'Pošalji poruku';
 $labels['addattachment'] = 'Priloži datoteku';
 $labels['charset'] = 'Charset';
 $labels['editortype'] = 'Tip editora';
 $labels['returnreceipt'] = 'Potvrda o primitku poruke';
+$labels['dsn'] = 'Potvrda o poslanoj poruci';
+$labels['editidents'] = 'Promijeni identitete';
 $labels['checkspelling'] = 'Provjera pravopisa';
 $labels['resumeediting'] = 'Povratak u pisanje';
 $labels['revertto'] = 'Vrati na';
 $labels['attachments'] = 'Privitci (Attachments)';
 $labels['upload'] = 'Dodaj';
 $labels['close'] = 'Zatvori';
+$labels['messageoptions'] = 'Opcije poruka...';
 $labels['low'] = 'Nizak';
 $labels['lowest'] = 'Najniži';
 $labels['normal'] = 'Srednji';
@@ -160,6 +200,7 @@ $labels['maxuploadsize'] = 'Maksimalna dozvoljena velicina datoteke je $size';
 $labels['addcc'] = 'Dodaj Cc';
 $labels['addbcc'] = 'Dodaj Bcc';
 $labels['addreplyto'] = 'Dodaj Odgovori-na';
+$labels['addfollowupto'] = 'Dodaj Nastavak-na';
 $labels['mdnrequest'] = 'Pošiljaoc ove poruke je tražio da bude obaviješten o njenom primitku. Želite li obavijestiti pošiljaoca?';
 $labels['receiptread'] = 'Vrati potvrdu (pročitano)';
 $labels['yourmessage'] = 'Ovo je vraćena potvrda vaše poruke';
@@ -170,6 +211,8 @@ $labels['surname'] = 'Prezime';
 $labels['email'] = 'E-Mail';
 $labels['addcontact'] = 'Dodaj novi kontakt';
 $labels['editcontact'] = 'Izmjeni kontakt';
+$labels['contacts'] = 'Kontakti';
+$labels['contactproperties'] = 'Svojstva kontakta';
 $labels['edit'] = 'Izmjeni';
 $labels['cancel'] = 'Odustani';
 $labels['save'] = 'Spremi';
@@ -181,10 +224,13 @@ $labels['contactsfromto'] = 'Kontakti od $from do $to od ukupno $count';
 $labels['print'] = 'Print';
 $labels['export'] = 'Export';
 $labels['exportvcards'] = 'Izvezi kontakte u vCard formatu';
+$labels['newcontactgroup'] = 'Napravi novu kontaktnu grupu';
+$labels['groupactions'] = 'Akcije kontaktne grupe';
 $labels['previouspage'] = 'Prethodna strana';
 $labels['firstpage'] = 'Prva strana';
 $labels['nextpage'] = 'Slijedeća strana';
 $labels['lastpage'] = 'Zadnja strana';
+$labels['group'] = 'Grupa';
 $labels['groups'] = 'Grupe';
 $labels['personaladrbook'] = 'Privatna adresa';
 $labels['import'] = 'Uvoz';
@@ -202,6 +248,10 @@ $labels['manageidentities'] = 'Podesi identitete za ovaj nalog';
 $labels['newidentity'] = 'Dodaj identitet';
 $labels['newitem'] = 'Novo';
 $labels['edititem'] = 'Uredi';
+$labels['preferhtml'] = 'HTML format u prednosti';
+$labels['defaultcharset'] = 'Zadani skup znakova';
+$labels['htmlmessage'] = 'HTML format poruke';
+$labels['prettydate'] = 'Formatiran datum';
 $labels['setdefault'] = 'Postavi predodređeno';
 $labels['autodetect'] = 'Auto';
 $labels['language'] = 'Jezik';
@@ -210,6 +260,7 @@ $labels['pagesize'] = 'Redova po stranici';
 $labels['signature'] = 'Potpis';
 $labels['dstactive'] = 'Automatska promjena vremena';
 $labels['htmleditor'] = 'Sastavi HTML poruke';
+$labels['htmlonreply'] = 'odgovor samo na HTML poruke';
 $labels['htmlsignature'] = 'HTML potpis';
 $labels['previewpane'] = 'Prikaži područje pregleda';
 $labels['skin'] = 'Tema izgleda';
@@ -221,23 +272,55 @@ $labels['mailboxview'] = 'Pregled Mailboxa';
 $labels['mdnrequests'] = 'Obavijest pošiljatelja';
 $labels['askuser'] = 'pitaj korisnika';
 $labels['autosend'] = 'šalji automatski';
-$labels['ignore'] = 'ignoriraj';
+$labels['autosendknown'] = 'Dodaj primatelja u moje kontakte, u suprotnom me pitaj';
+$labels['autosendknownignore'] = 'Dodaj primatelja u moje kontakte, u suprotnom zanemari';
+$labels['ignore'] = 'zanemari';
 $labels['readwhendeleted'] = 'Označi poruku kao pročitanu pri brisanju';
 $labels['flagfordeletion'] = 'Označi poruku za brisanje umjesto brisanja';
 $labels['skipdeleted'] = 'Ne prikazivaj pobrisane poruke';
+$labels['deletealways'] = 'Ukoliko premještanje poruka u mapu otpad ne uspije, izbrši poruku';
+$labels['showremoteimages'] = 'Prikaži slike s interneta';
+$labels['fromknownsenders'] = 'od poznatih pošiljatelja';
+$labels['always'] = 'uvijek';
 $labels['showinlineimages'] = 'Prikaži slike ispod poruke';
 $labels['autosavedraft'] = 'Automatski spremi draft';
 $labels['everynminutes'] = 'svakih $n minuta';
 $labels['keepalive'] = 'Provjeri nove poruke';
-$labels['never'] = 'Nikada';
+$labels['never'] = 'nikada';
+$labels['immediately'] = 'odmah';
 $labels['messagesdisplaying'] = 'Prikazujem poruke';
 $labels['messagescomposition'] = 'Komponiram poruke';
 $labels['mimeparamfolding'] = 'Nazivi privitaka';
 $labels['2231folding'] = 'Full RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Full RFC 2047 (ostali)';
+$labels['force7bit'] = 'Koristi MIME postavke za 8-bitne znakove';
 $labels['advancedoptions'] = 'Napredne postavke';
 $labels['focusonnewmessage'] = 'Fokusiraj browser pri novoj poruci';
+$labels['checkallfolders'] = 'Provjeri nove poruke u svim mapama';
+$labels['displaynext'] = 'Nakon brisanja/micanja poruke, prikaži slijedeću';
+$labels['mainoptions'] = 'Glavne postavke';
+$labels['section'] = 'Sekcija';
+$labels['maintenance'] = 'Održavanje';
+$labels['newmessage'] = 'Nova poruka';
+$labels['listoptions'] = 'Postavke liste';
+$labels['signatureoptions'] = 'Postavke potpisa';
+$labels['whenreplying'] = 'Prilikom odgovora';
+$labels['replytopposting'] = 'započni novu poruku iznad originala';
+$labels['replybottomposting'] = 'započni novu poruku ispod originala';
+$labels['replyremovesignature'] = 'Kod odgovaranja, makni originalni potpis iz poruke';
+$labels['autoaddsignature'] = 'Automatski dodaj potpis';
+$labels['newmessageonly'] = 'samo nova poruka';
+$labels['replyandforwardonly'] = 'samo odgovori i proslijeđivanja';
+$labels['replysignaturepos'] = 'Kod downloada ili proslijeđivanja postavi potpis';
+$labels['belowquote'] = 'ispod citata';
+$labels['abovequote'] = 'iznad citata';
+$labels['insertsignature'] = 'Umetni potpis';
+$labels['previewpanemarkread'] = 'Obilježi pregledane poruke kao pročitane';
+$labels['afternseconds'] = 'nakon $n sekundi';
+$labels['reqmdn'] = 'Uvijek zatraži potvrdu o primitku poruke';
+$labels['reqdsn'] = 'Uvijek zatraži potvrdu o slanju poruke';
+$labels['replysamefolder'] = 'Spremi odgovore u mapu gdje se nalazi poruka';
 $labels['folder'] = 'Mapa';
 $labels['folders'] = 'Mape';
 $labels['foldername'] = 'Ime mape';
@@ -245,9 +328,6 @@ $labels['subscribed'] = 'Pretplata';
 $labels['messagecount'] = 'Poruke';
 $labels['create'] = 'Napravi';
 $labels['createfolder'] = 'Napravi novu mapu';
-$labels['rename'] = 'Preimenuj';
-$labels['renamefolder'] = 'Preimenuj Mapu';
-$labels['deletefolder'] = 'Obriši Mapu';
 $labels['managefolders'] = 'Podesi Mapu';
 $labels['specialfolders'] = 'Specijalna Mapa';
 $labels['sortby'] = 'Sortiraj po';
@@ -257,5 +337,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Engleski';
+$labels['westerneuropean'] = 'Zapadno Europski';
+$labels['easterneuropean'] = 'Istočno Europski';
+$labels['southeasterneuropean'] = 'Južno-Istočni Europski';
+$labels['baltic'] = 'Balitčki';
+$labels['cyrillic'] = 'Čirilčni';
+$labels['arabic'] = 'Arapski';
+$labels['greek'] = 'Grčki';
+$labels['hebrew'] = 'Hibru';
+$labels['turkish'] = 'Turski';
+$labels['nordic'] = 'Nordski';
+$labels['thai'] = 'Tajlandski';
+$labels['celtic'] = 'Keltski';
+$labels['vietnamese'] = 'Vijetnamski';
+$labels['japanese'] = 'Japanski';
+$labels['korean'] = 'Korejski';
+$labels['chinese'] = 'Kineski';
 
 ?>
index 003a5bcacdbccae263e4639881977ab558ff68fc..70911926b2150083b21bc9b9acaacdb90a30e2db 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/hr/messages.inc                                              |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Edi Budimilic <edi@gemstudio.hr>                              |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2237 2009-01-17 01:55:39Z till $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -22,10 +22,13 @@ $messages['loginfailed'] = 'Prijava neuspješna';
 $messages['cookiesdisabled'] = 'Vaš Web preglednik ne podržava kolačiće (cookies)';
 $messages['sessionerror'] = 'Morate se ponovno ulogirati';
 $messages['imaperror'] = 'Neuspješna veza na IMAP server';
+$messages['servererror'] = 'Greška poslužitelja';
+$messages['invalidrequest'] = 'Nepravilan zahtijev! Podaci nisu spremljeni.';
 $messages['nomessagesfound'] = 'Nema poruka u sandučiću';
 $messages['loggedout'] = 'Uspješna odjava.';
 $messages['mailboxempty'] = 'Sandučuć je prazan';
 $messages['loading'] = 'Učitavanje...';
+$messages['uploading'] = 'Presnimavak datoteku na poslužitelj';
 $messages['loadingdata'] = 'Učitavanje podataka...';
 $messages['checkingmail'] = 'Provjera novih poruka u tijeku...';
 $messages['sendingmessage'] = 'Poruka se šalje...';
@@ -45,13 +48,12 @@ $messages['errorsavingsent'] = 'Greška pri spremanju poslane poruke';
 $messages['errorsaving'] = 'Greška pri spremanju';
 $messages['errormoving'] = 'Greška pri premještanju poruke';
 $messages['errordeleting'] = 'Greška pri brisanju poruke';
+$messages['errormarking'] = 'Nije moguće označiti poruku';
 $messages['deletecontactconfirm'] = 'Želite li obrisati izabrane kontakte?';
 $messages['deletemessagesconfirm'] = 'Sigurno želite obrisati odabrane poruke?';
 $messages['deletefolderconfirm'] = 'Želite li obrisati ovu mapu?';
 $messages['purgefolderconfirm'] = 'Želite li obrisati sve poruke u mapi?';
-$messages['foldercreating'] = 'Kreiram mapu...';
 $messages['folderdeleting'] = 'Brišem mapu...';
-$messages['folderrenaming'] = 'Mijenjam naziv mape...';
 $messages['foldermoving'] = 'Premještam mapu...';
 $messages['formincomplete'] = 'Obrazac nije u cjelosti popunjen';
 $messages['noemailwarning'] = 'Unesite valjanu e-mail adresu';
@@ -65,6 +67,7 @@ $messages['notsentwarning'] = 'Poruka nije poslana. Želite li odbaciti ovu poru
 $messages['noldapserver'] = 'Unesite LDAP poslužitelj za pretragu';
 $messages['nocontactsreturned'] = 'Nije pronađen niti jedan kontakt';
 $messages['nosearchname'] = 'Unesite ime ili e-mail adresu';
+$messages['notuploadedwarning'] = 'Svi prilozi još nisu presnimljeni na poslužitelj. Molim pričekajte ili zaustavite prsnimavanje.';
 $messages['searchsuccessful'] = 'Broj pronađenih poruka: $nr';
 $messages['searchnomatch'] = 'Traženi termin nije pronađen ni u jednoj poruci';
 $messages['searching'] = 'Pretraga u tijeku...';
@@ -84,7 +87,6 @@ $messages['movingmessage'] = 'Premještanje poruke...';
 $messages['receiptsent'] = 'Uspješno poslana potvrda (pročitano)';
 $messages['errorsendingreceipt'] = 'Ne može poslati potvrdu';
 $messages['nodeletelastidentity'] = 'Ne možete izbrisati zadnji identitet.';
-$messages['addsubfolderhint'] = 'Ova mapa će biti stvorena kao podmapa na trenutno označenoj';
 $messages['forbiddencharacter'] = 'Naziv mape sadrži zabranjene znakove';
 $messages['selectimportfile'] = 'Odaberite datoteku za prijenos';
 $messages['addresswriterror'] = 'U odabrani adresar nije moguće zapisivat...';
@@ -94,5 +96,13 @@ $messages['importconfirm'] = '<b>Uspješno je uvezeno $inserted kontakt(a), pres
 $messages['opnotpermitted'] = 'Operacija nije dozvoljena!';
 $messages['nofromaddress'] = 'Nije upisana e-mail adresa u odabrani identitet';
 $messages['editorwarning'] = 'Prebacivanje u čisti tekstualni uređivač će prouzrokovati gubljenje formatiranje teksta. Želite li nastaviti?';
+$messages['httpreceivedencrypterror'] = 'Dogodila se fatalna greška u konfiguraciji. Odmah kontaktirajte administratora. <b>Vaša poruka se nemože poslati.</b>';
+$messages['smtpconnerror'] = 'SMTP Greška ($code): Veza na server nije uspjela';
+$messages['smtpautherror'] = 'SMTP Greška ($code): Autentikacija nije uspjela';
+$messages['smtpfromerror'] = 'SMTP Greška ($code): Nije uspjelo postavljanje pošiljatelja "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP Greška ($code): Nije uspjelo dodavanje primatelja "$to" ($msg)';
+$messages['smtprecipientserror'] = 'SMTP Greška: Nije moguće pročitati listu primatelja';
+$messages['smtperror'] = 'SMTP Greška: $msg';
+$messages['emailformaterror'] = 'Nepravilna e-mail adresa: $email';
 
 ?>
index 9a465d1b3b3863ff5747b0cabb6277cf7600f17b..ee195430d2f36b0b820ff74a891ea84b16705330 100644 (file)
@@ -5,74 +5,58 @@
 +-----------------------------------------------------------------------+
 | language/hu_HU/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Zark Bonfire (ikkhares@gmail.com)                             |
-|         Levente Farkas <lfarkas at lfarkas dot org>                   |
-|         Ervin Hegedűs <airween@damson.hu>                             |
+| Author: Zark Bonfire <ikkhares at gmail dot com>                      |
+|         Peter Szabo <pete at teamlupus dot hu>                        |
+|         Barnabas Bona <bsi at hosember dot hu>                        |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2850 2009-08-07 21:17:12Z yllar $
+@version $Id: labels.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
 $labels = array();
-
-// login page 
 $labels['welcome'] = 'Üdvözli a $product';
 $labels['username'] = 'Felhasználónév';
 $labels['password'] = 'Jelszó';
 $labels['server'] = 'Szerver';
 $labels['login'] = 'Belépés';
-
-// taskbar 
 $labels['logout'] = 'Kijelentkezés';
 $labels['mail'] = 'E-mail';
 $labels['settings'] = 'Egyéni beállítások';
 $labels['addressbook'] = 'Címjegyzék';
-
-// mailbox names 
 $labels['inbox'] = 'Érkezett levelek';
 $labels['drafts'] = 'Piszkozatok';
 $labels['sent'] = 'Küldött levelek';
 $labels['trash'] = 'Törölt elemek';
 $labels['junk'] = 'Kéretlen levelek';
-
-// message listing 
 $labels['subject'] = 'Tárgy';
 $labels['from'] = 'Feladó';
 $labels['to'] = 'Címzett';
 $labels['cc'] = 'Másolat';
 $labels['bcc'] = 'Titkos másolat';
 $labels['replyto'] = 'Válaszcím';
+$labels['followupto'] = 'Hírcsoport válasz';
 $labels['date'] = 'Dátum';
 $labels['size'] = 'Méret';
 $labels['priority'] = 'Sürgősség';
 $labels['organization'] = 'Szervezet';
-
-// aliases
-$labels['reply-to'] = 'Válaszcím';
-
+$labels['readstatus'] = 'Olvasott';
 $labels['mailboxlist'] = 'Mappák';
 $labels['messagesfromto'] = 'Üzenetek: $from - $to / $count';
-$labels['messagenrof'] = '$nr / $count üzenet';
-
+$labels['threadsfromto'] = 'Témák ($from - $to, összesen $count)';
+$labels['messagenrof'] = '$nr / $coun t üzenet';
+$labels['copy'] = 'Másolás';
+$labels['move'] = 'Áthelyezés';
 $labels['moveto'] = 'áthelyezés...';
 $labels['download'] = 'letöltés';
-
 $labels['filename'] = 'Fájl neve';
 $labels['filesize'] = 'Fájl mérete';
-
-$labels['preferhtml'] = 'HTML megjelenítés';
-$labels['htmlmessage'] = 'HTML üzenet';
-$labels['prettydate'] = 'Rövid dátumok';
-
 $labels['addtoaddressbook'] = 'Hozzáadás a címjegyzékhez';
-
-// weekdays short 
 $labels['sun'] = 'Vas';
 $labels['mon'] = 'Hét';
 $labels['tue'] = 'Kedd';
@@ -80,8 +64,6 @@ $labels['wed'] = 'Szer';
 $labels['thu'] = 'Csüt';
 $labels['fri'] = 'Pén';
 $labels['sat'] = 'Szom';
-
-// weekdays long 
 $labels['sunday'] = 'Vasárnap';
 $labels['monday'] = 'Hétfő';
 $labels['tuesday'] = 'Kedd';
@@ -89,8 +71,6 @@ $labels['wednesday'] = 'Szerda';
 $labels['thursday'] = 'Csütörtök';
 $labels['friday'] = 'Péntek';
 $labels['saturday'] = 'Szombat';
-
-// months short 
 $labels['jan'] = 'Jan';
 $labels['feb'] = 'Febr';
 $labels['mar'] = 'Márc';
@@ -103,8 +83,6 @@ $labels['sep'] = 'Szept';
 $labels['oct'] = 'Okt';
 $labels['nov'] = 'Nov';
 $labels['dec'] = 'Dec';
-
-// months long 
 $labels['longjan'] = 'Január';
 $labels['longfeb'] = 'Február';
 $labels['longmar'] = 'Március';
@@ -117,14 +95,13 @@ $labels['longsep'] = 'Szeptember';
 $labels['longoct'] = 'Október';
 $labels['longnov'] = 'November';
 $labels['longdec'] = 'December';
-
 $labels['today'] = 'Ma';
-
-// toolbar buttons 
 $labels['checkmail'] = 'Új üzenetek ellenőrzése';
 $labels['writenewmessage'] = 'Új üzenet';
 $labels['replytomessage'] = 'Válasz';
-$labels['replytoallmessage'] = 'Válasz a feladónak és az összes címzettnek';
+$labels['replytoallmessage'] = 'Válasz a listának vagy a feladónak és az összes címzettnek';
+$labels['replyall'] = 'Válasz mindenkinek';
+$labels['replylist'] = 'Válasz a listának';
 $labels['forwardmessage'] = 'Továbbítás';
 $labels['deletemessage'] = 'Törlés';
 $labels['movemessagetotrash'] = 'Üzenet törlése';
@@ -145,34 +122,50 @@ $labels['markunread'] = 'Olvasatlanként';
 $labels['markflagged'] = 'Jelöltként';
 $labels['markunflagged'] = 'Jelöletlenként';
 $labels['messageactions'] = 'További lehetőségek...';
-
 $labels['select'] = 'Kijelölés';
 $labels['all'] = 'Összes';
 $labels['none'] = 'Nincs';
+$labels['currpage'] = 'Aktuális oldal';
 $labels['unread'] = 'Olvasatlan';
 $labels['flagged'] = 'Megjelölt';
 $labels['unanswered'] = 'Megválaszolatlan';
 $labels['deleted'] = 'Törölt';
 $labels['invert'] = 'Invertálás';
 $labels['filter'] = 'Szűrés';
-
+$labels['list'] = 'Lista';
+$labels['threads'] = 'Témák';
+$labels['expand-all'] = 'Összes kibontása';
+$labels['expand-unread'] = 'Olvasatlanok kibontása';
+$labels['collapse-all'] = 'Összes összecsukása';
+$labels['threaded'] = 'Téma nézet';
+$labels['autoexpand_threads'] = 'Témák kibontása';
+$labels['do_expand'] = 'minden téma';
+$labels['expand_only_unread'] = 'csak ahol van olvasatlan üzenet';
+$labels['fromto'] = 'Feladó/Címzett';
+$labels['flag'] = 'Megjelölés';
+$labels['attachment'] = 'Csatolmány';
+$labels['nonesort'] = 'Nincs';
+$labels['sentdate'] = 'Feladva';
+$labels['arrival'] = 'Kézbesítve';
+$labels['asc'] = 'emelkedő';
+$labels['desc'] = 'csökkenő';
+$labels['listcolumns'] = 'Oszlopok listája';
+$labels['listsorting'] = 'Rendezési oszlop';
+$labels['listorder'] = 'Rendezés sorrendje';
+$labels['listmode'] = 'Megjelenítési mód';
+$labels['folderactions'] = 'Mappa műveletek...';
 $labels['compact'] = 'Tömörítés';
 $labels['empty'] = 'Kiürítés';
 $labels['purge'] = 'Tisztítás';
-
 $labels['quota'] = 'Diszk használat';
 $labels['unknown'] = 'ismeretlen';
 $labels['unlimited'] = 'korlátlan';
-
 $labels['quicksearch'] = 'Gyorskeresés';
 $labels['resetsearch'] = 'Alapállapot';
 $labels['searchmod'] = 'Keresési opciók';
 $labels['msgtext'] = 'Teljes üzenet';
-
 $labels['openinextwin'] = 'Megnyitás új ablakban';
 $labels['emlsave'] = 'Letöltés (.eml)';
-
-// message compose 
 $labels['compose'] = 'Üzenet létrehozása';
 $labels['editasnew'] = 'Szerkesztés újként';
 $labels['savemessage'] = 'Vázlat mentése';
@@ -180,93 +173,84 @@ $labels['sendmessage'] = 'Üzenet küldése';
 $labels['addattachment'] = 'Fájl csatolása';
 $labels['charset'] = 'Karakterkészlet';
 $labels['editortype'] = 'Szerkesztő típusa';
-$labels['returnreceipt'] = 'Értesítés';
-
+$labels['returnreceipt'] = 'Olvasási visszaigazolás';
+$labels['dsn'] = 'Kézbesítési visszaigazolás';
+$labels['editidents'] = 'Azonosítók szerkesztése';
 $labels['checkspelling'] = 'Helyesírás-ellenőrzés';
 $labels['resumeediting'] = 'Helyesírás kész';
 $labels['revertto'] = 'Vissza erre:';
-
 $labels['attachments'] = 'Csatolmányok';
 $labels['upload'] = 'Feltöltés';
 $labels['close'] = 'Bezárás';
-
+$labels['messageoptions'] = 'Üzenetbeállítások...';
 $labels['low'] = 'Alacsony';
 $labels['lowest'] = 'Legkisebb';
 $labels['normal'] = 'Normál';
 $labels['high'] = 'Magas';
 $labels['highest'] = 'Legmagasabb';
-
 $labels['nosubject'] = '(nincs tárgy)';
 $labels['showimages'] = 'Képek megjelenítése';
 $labels['alwaysshow'] = 'Képek megjelenítése mindíg ha a feladó $sender';
-
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Egyszerű szöveg';
 $labels['savesentmessagein'] = 'Elküldött üzenet mentése ide:';
 $labels['dontsave'] = 'nincs mentés';
 $labels['maxuploadsize'] = 'A maximális feltölthető fájl mérete $size';
-
 $labels['addcc'] = 'Cc (Másolati cím) hozzáadása';
-$labels['addbcc'] = 'Bcc (Titkos másolati cím) hozzáadása';
+$labels['addbcc'] = 'Bcc (titkos másolati cím) hozzáadása';
 $labels['addreplyto'] = 'Válaszcím hozzáadása';
-
-// mdn 
-$labels['mdnrequest'] = 'Az üzenet küldője értesítést kér arról, hogy elolvasta a levelet. El legyen küldve az Olvasási Értesítés?';
-$labels['receiptread'] = 'Olvasási Értesítés (olvasott)';
-$labels['yourmessage'] = 'Ez az üzenete Olvasási Értesítése';
-$labels['receiptnote'] = 'Megjegyzés: Ez az Olvasási Értesítés csak azt igazolja, hogy az üzenet megjelenítésre került a címzett számítógépén. Nincs rá garancia, hogy a címzett elolvasta volna az üzenetet illetve megértette volna annak tartalmát.';
-
-// address boook 
+$labels['addfollowupto'] = 'Hírcsoport válasz hozzáadása';
+$labels['mdnrequest'] = 'Az üzenet küldője értesítést kér arról, hogy elolvasta a levelet. El legyen küldve az olvasási visszaigazolás?';
+$labels['receiptread'] = 'Olvasási visszaigazolás (olvasott)';
+$labels['yourmessage'] = 'Ez az üzenete olvasási visszaigazolása';
+$labels['receiptnote'] = 'Megjegyzés: Ez az olvasási visszaigazolás csak azt igazolja, hogy az üzenet megjelenítésre került a címzett számítógépén. Nincs rá garancia, hogy a címzett elolvasta volna az üzenetet illetve megértette volna annak tartalmát.';
 $labels['name'] = 'Megjelenített név';
 $labels['firstname'] = 'Keresztnév';
 $labels['surname'] = 'Vezetéknév';
 $labels['email'] = 'E-mail cím';
-
 $labels['addcontact'] = 'Új kapcsolat hozzáadása';
 $labels['editcontact'] = 'Kapcsolat szerkesztése';
-
+$labels['contacts'] = 'Kapcsolatok';
+$labels['contactproperties'] = 'Kapcsolatok tulajdonságai';
 $labels['edit'] = 'Szerkesztés';
 $labels['cancel'] = 'Mégsem';
 $labels['save'] = 'Mentés';
 $labels['delete'] = 'Törlés';
-
-$labels['newcontact'] = 'Új névjegykártya létrehozása';
+$labels['newcontact'] = 'Új kapcsolat létrehozása';
 $labels['deletecontact'] = 'Kijelölt kapcsolatok törlése';
 $labels['composeto'] = 'E-mail küldése erre a címre';
 $labels['contactsfromto'] = 'Kapcsolatok: $from - $to / $count';
 $labels['print'] = 'Nyomtatás';
 $labels['export'] = 'Exportálás';
 $labels['exportvcards'] = 'Kapcsolatok exportálása vCard formátumban';
-
+$labels['newcontactgroup'] = 'Új csoport';
+$labels['groupactions'] = 'Műveletek csoportokkal...';
 $labels['previouspage'] = 'Előző lap';
 $labels['firstpage'] = 'Első lap';
 $labels['nextpage'] = 'Következő lap';
 $labels['lastpage'] = 'Utolsó lap';
-
+$labels['group'] = 'Csoportok';
 $labels['groups'] = 'Csoportok';
 $labels['personaladrbook'] = 'Személyes címjegyzék';
-
 $labels['import'] = 'Importálás';
 $labels['importcontacts'] = 'Kapcsolatok importálása';
 $labels['importfromfile'] = 'Importálás fájlból:';
 $labels['importreplace'] = 'A teljes címjegyzék cseréje';
 $labels['importtext'] = 'Feltölthet kapcsolatokat egy már létező címjegyzékből. <br/> Jelenleg a <a href="http://en.wikipedia.org/wiki/VCard">vCard</a>  formátumú adatok importálása támogatott.';
 $labels['done'] = 'Kész';
-
-// settings
 $labels['settingsfor'] = 'Beállítás';
-
 $labels['preferences'] = 'Beállítások';
 $labels['userpreferences'] = 'Felhasználói beállítások';
 $labels['editpreferences'] = 'Felhasználói beállítások szerkesztése';
-
 $labels['identities'] = 'Azonosítók';
 $labels['manageidentities'] = 'Hozzáférés azonosítóinak kezelése';
 $labels['newidentity'] = 'Új azonosító';
-
 $labels['newitem'] = 'Új elem';
 $labels['edititem'] = 'Elem szerkesztése';
-
+$labels['preferhtml'] = 'HTML megjelenítés';
+$labels['defaultcharset'] = 'Alapértelmezett karakterkódolás';
+$labels['htmlmessage'] = 'HTML üzenet';
+$labels['prettydate'] = 'Rövid dátumok';
 $labels['setdefault'] = 'Beállítás alapértelmezettnek';
 $labels['autodetect'] = 'Automatikus';
 $labels['language'] = 'Nyelv';
@@ -275,6 +259,7 @@ $labels['pagesize'] = 'Sorok száma egy oldalon';
 $labels['signature'] = 'Aláírás';
 $labels['dstactive'] = 'Nyári időszámítás';
 $labels['htmleditor'] = 'HTML üzenet írása';
+$labels['htmlonreply'] = 'csak HTML üzenetre válaszolva';
 $labels['htmlsignature'] = 'HTML aláírás';
 $labels['previewpane'] = 'Előnézeti kép';
 $labels['skin'] = 'Kinézet';
@@ -283,13 +268,16 @@ $labels['logoutcompact'] = 'Beérkezett üzenetek mappa tömörítése kilépés
 $labels['uisettings'] = 'Felhasználói felület';
 $labels['serversettings'] = 'Szerverbeállítások';
 $labels['mailboxview'] = 'Postafiók nézet';
-$labels['mdnrequests'] = 'Olvasási értesítés küldése';
+$labels['mdnrequests'] = 'Olvasási visszaigazolás küldése';
 $labels['askuser'] = 'kérdezzen rá';
 $labels['autosend'] = 'automatikus küldés';
+$labels['autosendknown'] = 'visszaigazolás küldése csak a kapcsolataimnak, egyéb esetben kérdezzen rá';
+$labels['autosendknownignore'] = 'visszaigazolás küldése csak a kapcsolataimnak, egyéb esetben hagyja figyelmen kívül';
 $labels['ignore'] = 'hagyja figyelmen kívül';
 $labels['readwhendeleted'] = 'Üzenet olvasottként jelölése törléskor';
 $labels['flagfordeletion'] = 'Üzenet törlendőnek jelölése törlés helyett ';
 $labels['skipdeleted'] = 'Törölt üzenetek ne legyenek megjelenítve';
+$labels['deletealways'] = 'Üzenet törlése, ha nem sikerül áthelyezni a törölt elemek mappába';
 $labels['showremoteimages'] = 'Távoli beágyazott képek mutatása';
 $labels['fromknownsenders'] = 'csak ismert feladóktól';
 $labels['always'] = 'mindig';
@@ -298,12 +286,14 @@ $labels['autosavedraft'] = 'Automatikus piszkozat mentés';
 $labels['everynminutes'] = 'minden $n percben';
 $labels['keepalive'] = 'Új üzenetek keresése itt: ';
 $labels['never'] = 'soha';
+$labels['immediately'] = 'azonnal';
 $labels['messagesdisplaying'] = 'Üzenetek megjelenítése';
 $labels['messagescomposition'] = 'Üzenetek írása';
 $labels['mimeparamfolding'] = 'Csatolt állományok nevei';
 $labels['2231folding'] = 'Teljes RFC 2231 ( pl. Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Full RFC 2047 (egyéb)';
+$labels['force7bit'] = 'MIME kódolás használata 8 bites karakterekhez';
 $labels['advancedoptions'] = 'Haladó beállítások';
 $labels['focusonnewmessage'] = 'Beérkező új üzenet ablakának fókuszba hozása';
 $labels['checkallfolders'] = 'Új üzenetek ellenőrzése minden (al)mappában';
@@ -313,28 +303,63 @@ $labels['section'] = 'Szakasz';
 $labels['maintenance'] = 'Karbantartás';
 $labels['newmessage'] = 'Új üzenet';
 $labels['listoptions'] = 'Lista beállítások';
-
+$labels['signatureoptions'] = 'Aláírás beállításai';
+$labels['whenreplying'] = 'Válasznál';
+$labels['replytopposting'] = 'Válasznál üzenet írása az eredeti felett';
+$labels['replybottomposting'] = 'Válasznál üzenet írása az eredeti alatt';
+$labels['replyremovesignature'] = 'Válasznál az eredeti aláírás eltávolítása';
+$labels['autoaddsignature'] = 'Aláírás automatikus hozzáadása';
+$labels['newmessageonly'] = 'Csak új üzenetnél';
+$labels['replyandforwardonly'] = 'Válasznál és továbbításnál';
+$labels['replysignaturepos'] = 'Válasznál és továbbításnál kerüljön az aláírás';
+$labels['belowquote'] = 'az idézett szöveg alá';
+$labels['abovequote'] = 'az idézett szöveg fölé';
+$labels['insertsignature'] = 'Aláírás beillesztése';
+$labels['previewpanemarkread'] = 'Előnézetben megjelent üzenetek megjelölése olvasottként';
+$labels['afternseconds'] = '$n másodperc elteltével';
+$labels['reqmdn'] = 'Olvasási visszaigazolás megkövetelése';
+$labels['reqdsn'] = 'Kézbesítési visszaigazolás megkövetelése';
+$labels['replysamefolder'] = 'Válaszok azonos mappába helyezése';
 $labels['folder'] = 'Mappa';
 $labels['folders'] = 'Mappák';
 $labels['foldername'] = 'Mappa neve';
-$labels['subscribed'] = 'Feliratkozás';
 $labels['messagecount'] = 'Üzenet';
 $labels['create'] = 'Létrehozás';
 $labels['createfolder'] = 'Új mappa létrehozása';
 $labels['rename'] = 'Átnevezés';
-$labels['renamefolder'] = 'Mappa átnevezése';
-$labels['deletefolder'] = 'Mappa törlése';
 $labels['managefolders'] = 'Mappák kezelése';
 $labels['specialfolders'] = 'Különleges mappák';
-
+$labels['properties'] = 'Tulajdonságok';
+$labels['folderproperties'] = 'Mappa tulajdonságai';
+$labels['parentfolder'] = 'Szülőmappa';
+$labels['location'] = 'Hely';
+$labels['info'] = 'Információk';
+$labels['getfoldersize'] = 'Mappa mérete';
+$labels['changesubscription'] = 'Feliratkozás megváltoztatása';
 $labels['sortby'] = 'Rendezés';
 $labels['sortasc'] = 'növekvő';
 $labels['sortdesc'] = 'csökkenő';
-
-// units 
 $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Angol';
+$labels['westerneuropean'] = 'Nyugat-európai';
+$labels['easterneuropean'] = 'Kelet-európai';
+$labels['southeasterneuropean'] = 'Délkelet-európai';
+$labels['baltic'] = 'Balti';
+$labels['cyrillic'] = 'Cirill';
+$labels['arabic'] = 'Arab';
+$labels['greek'] = 'Görög';
+$labels['hebrew'] = 'Héber';
+$labels['turkish'] = 'Török';
+$labels['nordic'] = 'Skandináv';
+$labels['thai'] = 'Thai';
+$labels['celtic'] = 'Kelta';
+$labels['vietnamese'] = 'Vietnámi';
+$labels['japanese'] = 'Japán';
+$labels['korean'] = 'Koreai';
+$labels['chinese'] = 'Kínai';
 
 ?>
index c826ecc6b506a46ba84695045f3e78fc40448e2d..45d1d06e8a7fb35e90ac108e1659fc9fa68656a5 100644 (file)
@@ -5,17 +5,17 @@
 +-----------------------------------------------------------------------+
 | language/hu_HU/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Zark Bonfire (ikkhares@gmail.com)                             |
-|         Levente Farkas <lfarkas at lfarkas dot org>                   |
-|         Ervin Hegedűs <airween@damson.hu>                             |
+| Author: Zark Bonfire <ikkhares at gmail dot com>                      |
+|         Peter Szabo <pete at teamlupus dot hu>                        |
+|         Barnabas Bona <bsi at hosember dot hu>                        |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2850 2009-08-07 21:17:12Z yllar $
+@version $Id: messages.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -25,11 +25,15 @@ $messages['cookiesdisabled'] = 'A böngésző nem támogatja a sütik használat
 $messages['sessionerror'] = 'Érvénytelen vagy lejárt munkamenet';
 $messages['imaperror'] = 'Nem sikerült a kapcsolódás az IMAP szerverhez';
 $messages['servererror'] = 'Szerverhiba!';
+$messages['servererrormsg'] = 'Szerverhiba: $msg';
+$messages['errorreadonly'] = 'A műveletet nem sikerült végrehajtani. A mappa írásvédett';
+$messages['errornoperm'] = 'A műveletet nem sikerült végrehajtani. Hozzáférés megtagadva';
 $messages['invalidrequest'] = 'Érvénytelen kérés! Az adatok nem lettek elmentve.';
 $messages['nomessagesfound'] = 'A fiók nem tartalmaz leveleket';
 $messages['loggedout'] = 'Sikeres kijelentkezés. Viszontlátásra!';
 $messages['mailboxempty'] = 'A fiók üres';
 $messages['loading'] = 'Betöltés...';
+$messages['uploading'] = 'Fájl feltöltése...';
 $messages['loadingdata'] = 'Az adatok betöltése...';
 $messages['checkingmail'] = 'Új üzenetek keresése...';
 $messages['sendingmessage'] = 'Az üzenet küldése...';
@@ -48,16 +52,17 @@ $messages['senttooquickly'] = 'Kérem várjon még $sec másodpercet az üzenet
 $messages['errorsavingsent'] = 'Hiba történt az elküldött üzenet mentése közben';
 $messages['errorsaving'] = 'A mentés során hiba lépett fel';
 $messages['errormoving'] = 'Az üzenetet nem sikerült áthelyezni';
+$messages['errorcopying'] = 'Az üzenetet nem sikerült másolni';
 $messages['errordeleting'] = 'Az üzenetet nem sikerült törölni';
 $messages['errormarking'] = 'Az üzenetet nem sikerült megjelölni';
 $messages['deletecontactconfirm'] = 'Biztos, hogy törölni szeretné a kijelölt címe(ke)t?';
 $messages['deletemessagesconfirm'] = 'Biztos, hogy törölni szeretné a kijelölt üzenete(ke)t?';
 $messages['deletefolderconfirm'] = 'Biztos, hogy törölni szeretné ezt a mappát?';
 $messages['purgefolderconfirm'] = 'Biztos benne, hogy az összes üzenet törölhető?';
-$messages['foldercreating'] = 'Mappa létrehozása...';
 $messages['folderdeleting'] = 'Mappa törlése...';
-$messages['folderrenaming'] = 'Mappa átnevezése...';
 $messages['foldermoving'] = 'Mappa mozgatása...';
+$messages['foldersubscribing'] = 'Feliratkozás a mappára...';
+$messages['folderunsubscribing'] = 'Leiratkozás a mappáról...';
 $messages['formincomplete'] = 'Az űrlap hiányosan lett kitöltve';
 $messages['noemailwarning'] = 'Adjon meg egy valós e-mail címet';
 $messages['nonamewarning'] = 'Adjon meg egy nevet';
@@ -70,12 +75,17 @@ $messages['notsentwarning'] = 'Az üzenet még nem lett elküldve. Eldobja az ü
 $messages['noldapserver'] = 'Adjon meg egy LDAP szervert a kereséshez';
 $messages['nocontactsreturned'] = 'Nem található kapcsolat';
 $messages['nosearchname'] = 'Adja meg a kapcsolat nevét vagy e-mail címét';
+$messages['notuploadedwarning'] = 'Még nem került feltöltésre minden csatolmány. Kérem várjon vagy állítsa le a feltöltést!';
 $messages['searchsuccessful'] = '$nr üzenet található';
 $messages['searchnomatch'] = 'Nincs találat';
 $messages['searching'] = 'Keresés...';
 $messages['checking'] = 'Ellenőrzés...';
 $messages['nospellerrors'] = 'Nem található helyesírási hiba';
 $messages['folderdeleted'] = 'A mappa sikeresen törölve';
+$messages['foldersubscribed'] = 'A feliratkozás a mappára sikeres';
+$messages['folderunsubscribed'] = 'A leiratkozás a mappáról sikeres';
+$messages['folderpurged'] = 'Mappa sikeresen törölve';
+$messages['folderexpunged'] = 'Mappa sikeresen kiürítve';
 $messages['deletedsuccessfully'] = 'Törölve';
 $messages['converting'] = 'Formázás eltávolítása az üzenetből...';
 $messages['messageopenerror'] = 'A levelek a szerverről nem tölthetők le';
@@ -86,13 +96,17 @@ $messages['copyerror'] = 'Egyetlen cím sem másolható';
 $messages['sourceisreadonly'] = 'Ez a címforrás csak olvasható';
 $messages['errorsavingcontact'] = 'A kapcsolat címe nem menthető';
 $messages['movingmessage'] = 'Üzenet mozgatása...';
-$messages['receiptsent'] = 'Az Olvasási Értesítés el lett küldve';
-$messages['errorsendingreceipt'] = 'Az Olvasási Értesítést nem sikerült elküldeni';
-$messages['nodeletelastidentity'] = 'Nem törölheti ezt a profilt, ez az egyetlen';
-$messages['addsubfolderhint'] = 'Az új könyvtár az aktuálisan kiválasztott alkönyvtáraként lesz létrehozva';
+$messages['copyingmessage'] = 'Üzenet másolása...';
+$messages['deletingmessage'] = 'Üzenet(ek) törlése....';
+$messages['markingmessage'] = 'Üzenet(ek) megjelölése...';
+$messages['receiptsent'] = 'Az olvasási visszaigazolás el lett küldve';
+$messages['errorsendingreceipt'] = 'Az olvasási visszaigazolást nem sikerült elküldeni';
+$messages['nodeletelastidentity'] = 'Nem törölheti ezt az azonosítót, ez az egyetlen';
 $messages['forbiddencharacter'] = 'A mappa neve tiltott karaktert tartalmaz';
 $messages['selectimportfile'] = 'Kérjük válassza ki a feltölteni kívánt fájlt';
 $messages['addresswriterror'] = 'A kiválasztott címjegyzék nem írható';
+$messages['contactaddedtogroup'] = 'A cím hozzáadása a csoporthoz sikeresen megtörtént';
+$messages['contactremovedfromgroup'] = 'A cím törlése a csoportból sikeresen megtörtént';
 $messages['importwait'] = 'Importálás folyamatban, kérem várjon...';
 $messages['importerror'] = 'Az importálás sikertelen! A feltöltött állomány nem egy érvényes vCard fájl.';
 $messages['importconfirm'] = '<b>Sikeresen importálásra került $inserted kapcsolat, kihagyva $skipped már létező bejegyzés</b>:<p><em>$names</em></p>';
@@ -102,9 +116,28 @@ $messages['editorwarning'] = 'Az egyszerű szöveges formátumra való váltás
 $messages['httpreceivedencrypterror'] = 'Végzetes konfigurációs hiba történt, azonnal lépjen kapcsolatba az üzemeltetővel. <b>Az üzenet nem küldhető el.</b>';
 $messages['smtpconnerror'] = 'SMTP hiba ($code): Sikertelen kapcsolódás a szerverhez';
 $messages['smtpautherror'] = 'SMTP hiba ($code): Sikertelen bejelentkezés';
-$messages['smtpfromerror'] = 'SMTP hiba ($code): Nem sikerült a feladó beállítása: "$from"';
-$messages['smtptoerror'] = 'SMTP hiba ($code): Nem sikerült a következő címzett hozzáadása: "$to"';
-$messages['smtprecipientserror'] = 'SMTP hiba ($code): A címzett lista feldolgozása sikertelen';
+$messages['smtpfromerror'] = 'SMTP hiba ($code): Nem sikerült a feladó beállítása: "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP hiba ($code): Nem sikerült a következő címzett hozzáadása: "$to" ($msg)';
+$messages['smtprecipientserror'] = 'SMTP hiba ($code): A címzettlista feldolgozása sikertelen';
+$messages['smtpdsnerror'] = 'SMTP hiba: A kézbesítési visszaigazolásokat a szerver nem támogatja';
 $messages['smtperror'] = 'SMTP hiba ($code): $msg';
+$messages['emailformaterror'] = 'Helytelen formátumú e-mail cím: $email';
+$messages['toomanyrecipients'] = 'Túl sok a címzett. Csökkentse a címzettek számát $max címre.';
+$messages['maxgroupmembersreached'] = 'A csoport létszáma meghaladja a maximum $max címet.';
+$messages['internalerror'] = 'Belső hiba történt, kérjük próbálja újra!';
+$messages['contactdelerror'] = 'Hiba a kapcsolat(ok) törlésekor';
+$messages['contactdeleted'] = 'Kapcsolt(ok) sikeresen törölve';
+$messages['groupdeleted'] = 'Csoport sikeresen törölve';
+$messages['grouprenamed'] = 'Csoport sikeresen átnevezve';
+$messages['groupcreated'] = 'Csoport sikeresen létrehozva';
+$messages['messagedeleted'] = 'Üzenet(ek) sikeresen törölve';
+$messages['messagemoved'] = 'Üzenet(ek) sikeresen átmozgatva';
+$messages['messagecopied'] = 'Üzenet(ek) sikeresen másolva';
+$messages['messagemarked'] = 'Üzenet(ek) sikeresen megjelölve';
+$messages['autocompletechars'] = 'Az automatikus kiegészítéshez legalább $min karakter szükséges';
+$messages['namecannotbeempty'] = 'A név nem lehet üres';
+$messages['nametoolong'] = 'A név túl hosszú';
+$messages['folderupdated'] = 'Mappa sikeresen frissítve';
+$messages['foldercreated'] = 'Mappa sikeresen létrehozva';
 
 ?>
index aef3d777585bf3ea29f7a18446be87d36da86d00..522317e80ddbe708984ca80c32f10ef53288e453 100644 (file)
@@ -4,15 +4,15 @@
 +-----------------------------------------------------------------------+
 | language/hy_AM/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Vahan Yerkanian <vahan@arminco.com>                           |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2513 2009-05-21 12:59:19Z alec $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -249,9 +249,6 @@ $labels['subscribed'] = 'Բաժանորդագրված';
 $labels['messagecount'] = 'Նամակներ';
 $labels['create'] = 'Ստեղծել';
 $labels['createfolder'] = 'Բացել նոր դարակ';
-$labels['rename'] = 'Վերանվանել';
-$labels['renamefolder'] = 'Վերանվանել դարակը';
-$labels['deletefolder'] = 'Ջնջել դարակը';
 $labels['managefolders'] = 'Կարգավորել դարակները';
 $labels['specialfolders'] = 'Հատուկ դարակներ';
 $labels['sortby'] = 'Դասավորել';
index 7a5754b7e84911261cd4056e5d6bcfa9681870f5..0c3fd8348842c9459df788e97dda12b710d0f8e4 100644 (file)
@@ -4,15 +4,15 @@
 +-----------------------------------------------------------------------+
 | language/hy_AM/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Vahan Yerkanian <vahan@arminco.com>                           |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2359 2009-03-19 07:53:16Z thomasb $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -48,9 +48,7 @@ $messages['deletecontactconfirm'] = 'Ուզու՞մ էք ջնջել նշված 
 $messages['deletemessagesconfirm'] = 'Ուզու՞մ էք ջնջել նշված նամակները';
 $messages['deletefolderconfirm'] = 'Ուզու՞մ էք ջնջել այս դարակը';
 $messages['purgefolderconfirm'] = 'Ուզու՞մ էք ջնջել այս դարակի բոլոր նամակները';
-$messages['foldercreating'] = 'Դարակը ստեղծվում է…';
 $messages['folderdeleting'] = 'Դարակը ջնջվում է…';
-$messages['folderrenaming'] = 'Դարակը վերանվանվում է…';
 $messages['foldermoving'] = 'Դարակը տեղափոխվում է…';
 $messages['formincomplete'] = 'Ձևը թերի է լրացված';
 $messages['noemailwarning'] = 'Մուտքագրեք ճիշտ էլ. հասցե';
@@ -83,7 +81,6 @@ $messages['movingmessage'] = 'Նամակը տեղափոխվում է…';
 $messages['receiptsent'] = 'Նամակի ընթերցման ծանուցագիրն ուղարկված է';
 $messages['errorsendingreceipt'] = 'Ծանուցագրի ուղարկումը ձախողվեց';
 $messages['nodeletelastidentity'] = 'Անհնար է ջնջել վերջին տարբերակը';
-$messages['addsubfolderhint'] = 'Այս դարակը կստեղծվի որպես նշվածի ենթադարակ';
 $messages['forbiddencharacter'] = 'Դարակի անունը պարունակում է անթույլատրելի նշան';
 $messages['selectimportfile'] = 'Ընտրեք ուղարկվող ֆայլը';
 $messages['addresswriterror'] = 'Ընտրված հասցեագիրքը ենթակա չէ փոփոխման';
index 285ad5ef6b6a9a3e862118eaf7d4a2a811581773..2442ed0dd545f5d7962a2da6b611f62c8945cea2 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/id_ID/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Putu Arya Sabda Wijaya <klunxer@gmail.com>                    |
+| Author: Putu Arya Sabda Wijaya <ptaryasw@isi-dps.ac.id>                    |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -38,22 +38,26 @@ $labels['to'] = 'Penerima';
 $labels['cc'] = 'Lampiran';
 $labels['bcc'] = 'Lampiran tersembunyi';
 $labels['replyto'] = 'Balas kepada';
+$labels['followupto'] = 'Surat Tindak Lanjut Untuk';
 $labels['date'] = 'Tanggal';
 $labels['size'] = 'Ukuran';
 $labels['priority'] = 'Prioritas';
 $labels['organization'] = 'Organisasi';
+$labels['readstatus'] = 'Status Terbaca';
 $labels['reply-to'] = 'Balas kepada';
-$labels['mailboxlist'] = 'Daftar Kotak Surat';
-$labels['messagesfromto'] = 'Pesan $from kepada $to sebanyak $count';
+$labels['mail-reply-to'] = 'Surat Balasan Untuk';
+$labels['mail-followup-to'] = 'Surat Tindak Lanjut Untuk';
+$labels['mailboxlist'] = 'Map';
+$labels['messagesfromto'] = 'Pesan ke $from sampai $to dari $count';
+$labels['threadsfromto'] = 'Untaian ke $from sampai $to dari $count';
 $labels['messagenrof'] = 'Pesan $nr sebanyak $count';
+$labels['copy'] = 'Salin';
+$labels['move'] = 'Pindahkan';
 $labels['moveto'] = 'Pindahkan ke...';
-$labels['download'] = 'Dnduh';
+$labels['download'] = 'Unduh';
 $labels['filename'] = 'Nama berkas';
 $labels['filesize'] = 'Ukuran berkas';
-$labels['preferhtml'] = 'Lebih suka HTML';
-$labels['htmlmessage'] = 'Pesan HTML';
-$labels['prettydate'] = 'Tanggal Cantik';
-$labels['addtoaddressbook'] = 'Tambahkan Pada Buku Tamu';
+$labels['addtoaddressbook'] = 'Tambah ke Buku Tamu';
 $labels['sun'] = 'Min';
 $labels['mon'] = 'Sen';
 $labels['tue'] = 'Sel';
@@ -96,19 +100,21 @@ $labels['today'] = 'Hari ini';
 $labels['checkmail'] = 'Periksa pesan baru';
 $labels['writenewmessage'] = 'Buat pesan baru';
 $labels['replytomessage'] = 'Balas pesan';
-$labels['replytoallmessage'] = 'Balas kepada pengirim dan semua penerima';
+$labels['replytoallmessage'] = 'Balas ke pengirim dan yang lain';
+$labels['replyall'] = 'Balas ke semua';
+$labels['replylist'] = 'Balas ke milis';
 $labels['forwardmessage'] = 'Teruskan pesan';
-$labels['deletemessage'] = 'Pindahkan pesan ke tong sampah';
+$labels['deletemessage'] = 'Hapus pesan';
 $labels['movemessagetotrash'] = 'Pindahkan pesan ke tong sampah';
 $labels['printmessage'] = 'Cetak pesan ini';
 $labels['previousmessage'] = 'Perlihatkan pesan sebelumnya';
-$labels['previousmessages'] = 'Perlihatkan kumpulan pesan-pesan sebelumnya';
+$labels['previousmessages'] = 'Perlihatkan himpunan pesan-pesan sebelumnya';
 $labels['firstmessage'] = 'Perlihatkan pesan pertama';
-$labels['firstmessages'] = 'Perlihatkan kumpulan pesan pertama';
+$labels['firstmessages'] = 'Perlihatkan himpunan pesan pertama';
 $labels['nextmessage'] = 'Perlihatkan pesan berikutnya';
-$labels['nextmessages'] = 'Perlihatkan kumpulan pesan-pesan berikutnya';
+$labels['nextmessages'] = 'Perlihatkan himpunan pesan-pesan berikutnya';
 $labels['lastmessage'] = 'Perlihatkan pesan terakhir';
-$labels['lastmessages'] = 'Perlihatkan kumpulan pesan terkahir';
+$labels['lastmessages'] = 'Perlihatkan himpunan pesan terkahir';
 $labels['backtolist'] = 'Kembali ke daftar pesan';
 $labels['viewsource'] = 'Perlihatkan kode sumber';
 $labels['markmessages'] = 'Tandai Pesan';
@@ -120,13 +126,36 @@ $labels['messageactions'] = 'Tindakan lain...';
 $labels['select'] = 'Pilih';
 $labels['all'] = 'Semua';
 $labels['none'] = 'Tidak satupun';
+$labels['currpage'] = 'Halaman sekarang';
 $labels['unread'] = 'Belum terbaca';
 $labels['flagged'] = 'Ditandai';
 $labels['unanswered'] = 'Belum terjawab';
 $labels['deleted'] = 'Terhapus';
 $labels['invert'] = 'Sebaliknya';
 $labels['filter'] = 'Penyaringan';
-$labels['compact'] = 'Ramping';
+$labels['list'] = 'Daftar';
+$labels['threads'] = 'Untaian';
+$labels['expand-all'] = 'Bentangkan Semua';
+$labels['expand-unread'] = 'Bentangkan yang Belum Terbaca';
+$labels['collapse-all'] = 'Lipat Semua';
+$labels['threaded'] = 'Teruntai';
+$labels['autoexpand_threads'] = 'Bentangkan pesan teruntai';
+$labels['do_expand'] = 'semua untaian';
+$labels['expand_only_unread'] = 'hanya pesan yang belum terbaca';
+$labels['fromto'] = 'Pengirim/Penerima';
+$labels['flag'] = 'Bendera';
+$labels['attachment'] = 'Lampiran';
+$labels['nonesort'] = 'Tidak ada';
+$labels['sentdate'] = 'Tanggal kirim';
+$labels['arrival'] = 'Tanggal masuk';
+$labels['asc'] = 'menaik';
+$labels['desc'] = 'menurun';
+$labels['listcolumns'] = 'Perlihatkan kolom';
+$labels['listsorting'] = 'Mengurutkan kolom';
+$labels['listorder'] = 'Mengurutkan susunan';
+$labels['listmode'] = 'Perlihatkan mode tinjauan';
+$labels['folderactions'] = 'Tindakan pada map';
+$labels['compact'] = 'Rampingkan';
 $labels['empty'] = 'Kosong';
 $labels['purge'] = 'Kosongkan';
 $labels['quota'] = 'Penggunaan kandar';
@@ -144,14 +173,17 @@ $labels['savemessage'] = 'Simpan konsep surat  ini';
 $labels['sendmessage'] = 'Kirim pesan sekarang';
 $labels['addattachment'] = 'Sisipkan sebuah berkas';
 $labels['charset'] = 'Set karakter';
-$labels['editortype'] = 'Tipe editor';
-$labels['returnreceipt'] = 'Kembalikan penerima';
+$labels['editortype'] = 'Tipe penyunting';
+$labels['returnreceipt'] = 'Tanda terima kembali';
+$labels['dsn'] = 'Pemberitahuan status terkirim';
+$labels['editidents'] = 'Ubah identitas';
 $labels['checkspelling'] = 'Pemeriksaan ejaan';
-$labels['resumeediting'] = 'Lanjutkan mengedit';
-$labels['revertto'] = 'Balik ke';
-$labels['attachments'] = 'Sisispan';
+$labels['resumeediting'] = 'Lanjutkan menyunting';
+$labels['revertto'] = 'Balikkan ke';
+$labels['attachments'] = 'Sisipan';
 $labels['upload'] = 'Unggah';
 $labels['close'] = 'Tutup';
+$labels['messageoptions'] = 'Pilihan pesan...';
 $labels['low'] = 'Rendah';
 $labels['lowest'] = 'Paling Rendah';
 $labels['normal'] = 'Normal';
@@ -168,6 +200,7 @@ $labels['maxuploadsize'] = 'Ukuran file maksimal adalah $size';
 $labels['addcc'] = 'Tambah Cc';
 $labels['addbcc'] = 'Tambah Bcc';
 $labels['addreplyto'] = 'Tambah Balas Ke';
+$labels['addfollowupto'] = 'Tambahkan Tindak-Lanjut-Ke';
 $labels['mdnrequest'] = 'Pengirim pesan ini telah meminta untuk diberitahu ketika Anda membaca pesan ini. Apakah anda ingin memberitahu pengirim?';
 $labels['receiptread'] = 'Tanda Terima (baca)';
 $labels['yourmessage'] = 'Ini adalah Tanda Terima untuk pesan Anda';
@@ -178,6 +211,8 @@ $labels['surname'] = 'Nama belakang';
 $labels['email'] = 'E-Mail';
 $labels['addcontact'] = 'Tambah kontak baru';
 $labels['editcontact'] = 'Ubah kontak';
+$labels['contacts'] = 'Daftar kontak';
+$labels['contactproperties'] = 'Properti kontak';
 $labels['edit'] = 'Ubah';
 $labels['cancel'] = 'Batal';
 $labels['save'] = 'Simpan';
@@ -185,19 +220,22 @@ $labels['delete'] = 'Hapus';
 $labels['newcontact'] = 'Buat kartu kontak baru';
 $labels['deletecontact'] = 'Hapus kontak terpilih';
 $labels['composeto'] = 'Tulis surat kepada';
-$labels['contactsfromto'] = 'Kontak $from kepada $to sebanyak $count';
+$labels['contactsfromto'] = 'Kontak $from sampai $to dari $count';
 $labels['print'] = 'Cetak';
 $labels['export'] = 'Ekspor';
 $labels['exportvcards'] = 'Ekspor kontak dalam format vCard';
-$labels['previouspage'] = 'Perlihatkan kumpulan sebelumnya';
-$labels['firstpage'] = 'Perlihatkan kumpulan pertama';
-$labels['nextpage'] = 'Perlihatkan kumpulan selanjutnya';
-$labels['lastpage'] = 'Perlihatkan kumpulan terakhir';
+$labels['newcontactgroup'] = 'Buat Grup baru';
+$labels['groupactions'] = 'Aksi untuk grup kontak';
+$labels['previouspage'] = 'Perlihatkan himpunan sebelumnya';
+$labels['firstpage'] = 'Perlihatkan himpunan pertama';
+$labels['nextpage'] = 'Perlihatkan himpunan selanjutnya';
+$labels['lastpage'] = 'Perlihatkan himpunan terakhir';
+$labels['group'] = 'Kelompok';
 $labels['groups'] = 'Kelompok';
-$labels['personaladrbook'] = 'Alamat personal';
-$labels['import'] = 'Import';
-$labels['importcontacts'] = 'Import kontak';
-$labels['importfromfile'] = 'Import dari berkas:';
+$labels['personaladrbook'] = 'Alamat pribadi';
+$labels['import'] = 'Impor';
+$labels['importcontacts'] = 'Impor kontak';
+$labels['importfromfile'] = 'Impor dari berkas:';
 $labels['importreplace'] = 'Ganti seluruh buku alamat';
 $labels['importtext'] = 'Anda bisa mengunggah kontak dari buku alamat yang sudah ada.<br/>Kami kebetulan mendukung pengimportan alamat dari format data <a href="http://en.wikipedia.org/wiki/VCard">vCard</a>.';
 $labels['done'] = 'Selesai';
@@ -210,6 +248,10 @@ $labels['manageidentities'] = 'Atur identitas untuk akun ini';
 $labels['newidentity'] = 'Identitas baru';
 $labels['newitem'] = 'Item baru';
 $labels['edititem'] = 'Ubah item';
+$labels['preferhtml'] = 'Lebih suka HTML';
+$labels['defaultcharset'] = 'Default Character';
+$labels['htmlmessage'] = 'Pesan HTML';
+$labels['prettydate'] = 'Tanggal Cantik';
 $labels['setdefault'] = 'Pengaturan Awal';
 $labels['autodetect'] = 'Otomatis';
 $labels['language'] = 'Bahasa';
@@ -218,6 +260,7 @@ $labels['pagesize'] = 'Baris per halaman';
 $labels['signature'] = 'Tanda tangan';
 $labels['dstactive'] = 'Waktu Musim Panas';
 $labels['htmleditor'] = 'Tulis pesan HTML';
+$labels['htmlonreply'] = 'balasan untuk pesan HTML saja';
 $labels['htmlsignature'] = 'Tandatangan HTML';
 $labels['previewpane'] = 'Perlihatkan tempat melihat';
 $labels['skin'] = 'Tampilan antarmuka';
@@ -226,13 +269,16 @@ $labels['logoutcompact'] = 'Mampatkan Kotak Masuk saat keluar';
 $labels['uisettings'] = 'Antarmuka pengguna';
 $labels['serversettings'] = 'Pengaturan Server';
 $labels['mailboxview'] = 'Tampilan Kotak Surat';
-$labels['mdnrequests'] = 'Pemberitahuan pada pengirim';
-$labels['askuser'] = 'tanya si pengguna';
+$labels['mdnrequests'] = 'Sedang dimintakan tanda terima kembali';
+$labels['askuser'] = 'tanya pengguna';
 $labels['autosend'] = 'kirim otomatis';
+$labels['autosendknown'] = 'kirim tanda terima kepada kontak saya, selain itu tanyai saya';
+$labels['autosendknownignore'] = 'kirim tanda terima kepada kontak saya, selain acuhkan';
 $labels['ignore'] = 'acuhkan';
 $labels['readwhendeleted'] = 'Tandai pesan sebagai terbaca saat dihapus';
 $labels['flagfordeletion'] = 'Tandai pesan untuk penghapusan daripada dihapus';
 $labels['skipdeleted'] = 'Jangan tampilkan pesan terhapus';
+$labels['deletealways'] = 'Jika gagal memindakan ke tempat sampah, langsung hapus';
 $labels['showremoteimages'] = 'Tampilkan remote inline images';
 $labels['fromknownsenders'] = 'dari pengirim yang dikenal';
 $labels['always'] = 'selalu';
@@ -241,12 +287,14 @@ $labels['autosavedraft'] = 'Otomatis menyimpan pesan tertunda';
 $labels['everynminutes'] = 'setiap $n menit';
 $labels['keepalive'] = 'Periksa pesan baru saat';
 $labels['never'] = 'tidak pernah';
+$labels['immediately'] = 'secepatnya';
 $labels['messagesdisplaying'] = 'Penampilan Pesan';
 $labels['messagescomposition'] = 'Pengaturan Pesan';
 $labels['mimeparamfolding'] = 'Nama lampiran';
 $labels['2231folding'] = 'Full RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Full RFC 2047 (other)';
+$labels['force7bit'] = 'Gunakan MIME encoding untuk 8-bit karakter';
 $labels['advancedoptions'] = 'Pilihan canggih';
 $labels['focusonnewmessage'] = 'Pusatkan jendela broswer saat ada pesan baru';
 $labels['checkallfolders'] = 'Periksa semua map untuk pesan baru';
@@ -256,6 +304,23 @@ $labels['section'] = 'Bagian';
 $labels['maintenance'] = 'Perbaikan';
 $labels['newmessage'] = 'Pesan baru';
 $labels['listoptions'] = 'Daftar Pilihan';
+$labels['signatureoptions'] = 'Opsi tanda tangan';
+$labels['whenreplying'] = 'Ketika membalas';
+$labels['replytopposting'] = 'Tulis pesan baru diatas pesan asli';
+$labels['replybottomposting'] = 'Tulis pesan baru dibawah pesan asli';
+$labels['replyremovesignature'] = 'ketika membalas pesan hapus tanda tangan dari pesan';
+$labels['autoaddsignature'] = 'Otomatis tambahkan tanda tangan';
+$labels['newmessageonly'] = 'Hanya untuk pesan baru';
+$labels['replyandforwardonly'] = 'Hanya untuk dijawab dan diteruskan';
+$labels['replysignaturepos'] = 'ketika membalas atau meneruskan pesan tambahkan tanda tangan';
+$labels['belowquote'] = 'Dibawah kutipan';
+$labels['abovequote'] = 'Diatas kutipan';
+$labels['insertsignature'] = 'Isi tanda tangan';
+$labels['previewpanemarkread'] = 'Tandai pesan yang sudah dilihat ';
+$labels['afternseconds'] = 'setelah $n detik';
+$labels['reqmdn'] = 'Selalu meminta tanda terima kembali';
+$labels['reqdsn'] = 'Selalu meminta pemberitahuan status terkirim';
+$labels['replysamefolder'] = 'Taruh balasan di folder yang sama dengan pesan yang dibalas';
 $labels['folder'] = 'Map';
 $labels['folders'] = 'Map-map';
 $labels['foldername'] = 'Nama map';
@@ -263,9 +328,6 @@ $labels['subscribed'] = 'Subscribed';
 $labels['messagecount'] = 'Pesan-pesan';
 $labels['create'] = 'Buat';
 $labels['createfolder'] = 'Buat map baru';
-$labels['rename'] = 'Namai ulang';
-$labels['renamefolder'] = 'Namai ulang map';
-$labels['deletefolder'] = 'Hapus map';
 $labels['managefolders'] = 'Atur map';
 $labels['specialfolders'] = 'Map Khusus';
 $labels['sortby'] = 'Urut berdasarkan';
@@ -275,5 +337,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Inggris';
+$labels['westerneuropean'] = 'Eropa Barat';
+$labels['easterneuropean'] = 'Eropa Timur';
+$labels['southeasterneuropean'] = 'Eropa Tenggara';
+$labels['baltic'] = 'Balkan';
+$labels['cyrillic'] = 'Rusia';
+$labels['arabic'] = 'Arab';
+$labels['greek'] = 'Yunani';
+$labels['hebrew'] = 'Yahudi';
+$labels['turkish'] = 'Turki';
+$labels['nordic'] = 'Nordik';
+$labels['thai'] = 'Thailand';
+$labels['celtic'] = 'Keltik';
+$labels['vietnamese'] = 'Vietnam';
+$labels['japanese'] = 'Jepang';
+$labels['korean'] = 'Korea';
+$labels['chinese'] = 'Cina';
 
 ?>
index c159b4582d8c836485bc0c7aeeab9b2f05afb1b8..5b8e9b6e05cf5d1b49c7d7a5f4ef6c63e7c6691b 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/id_ID/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Putu Arya Sabda Wijaya <klunxer@gmail.com>                    |
+| Author: Putu Arya Sabda Wijaya <ptaryasw@isi-dps.ac.id>                    |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -23,40 +23,41 @@ $messages['cookiesdisabled'] = 'Browser Anda tidak menerima cookies';
 $messages['sessionerror'] = 'Session Anda invalid atau kadaluwarsa';
 $messages['imaperror'] = 'Koneksi ke IMAP server gagal';
 $messages['servererror'] = 'Server Error!';
+$messages['servererrormsg'] = 'Server Error: $msg';
 $messages['invalidrequest'] = 'Permintaan tidak valid! Tidak ada data yang tersimpan.';
 $messages['nomessagesfound'] = 'Surat tidak ditemukan di kotak masuk ini';
 $messages['loggedout'] = 'Anda berhasil mengakhiri session. Selamat Tinggal!';
 $messages['mailboxempty'] = 'Kotak masuk kosong';
 $messages['loading'] = 'Loading...';
+$messages['uploading'] = 'Mengupload file ...';
 $messages['loadingdata'] = 'Loading data...';
 $messages['checkingmail'] = 'Memeriksa pesan baru...';
 $messages['sendingmessage'] = 'Mengirim pesan...';
 $messages['messagesent'] = 'Pesan terkirim';
 $messages['savingmessage'] = 'Menyimpan pesan...';
-$messages['messagesaved'] = 'MMenyimpan pesan ke daftar tunggu';
+$messages['messagesaved'] = 'Menyimpan pesan ke daftar tunggu';
 $messages['successfullysaved'] = 'Berhasil disimpan';
 $messages['addedsuccessfully'] = 'Kontak berhasil ditambahkan ke buku alamat';
-$messages['contactexists'] = 'Konatk dengan alamat e-mail ini sudah ada';
+$messages['contactexists'] = 'Kontak dengan alamat e-mail ini sudah ada';
 $messages['blockedimages'] = 'Untuk melindungi privasi Anda, gambar-gambar diluar server diblok pada pesan ini.';
 $messages['encryptedmessage'] = 'Pesan ini terenkripsi dan tidak bisa ditampilkan. Maaf!';
 $messages['nocontactsfound'] = 'Kontak tidak ditemukan';
 $messages['contactnotfound'] = 'Kontak yang diminta tidak ditemukan';
 $messages['sendingfailed'] = 'Pengiriman pesan gagal';
-$messages['senttooquickly'] = 'Mohon tunggu $sec detik. sebelum mengirim pesan ini';
+$messages['senttooquickly'] = 'Mohon tunggu $sec detik sebelum mengirim pesan ini';
 $messages['errorsavingsent'] = 'Error ketika menyimpan pesan terkirim';
 $messages['errorsaving'] = 'Error ketika menyimpan';
 $messages['errormoving'] = 'Pesan tidak bisa dipindahkan';
+$messages['errorcopying'] = 'Pesan tidak dapat disalin';
 $messages['errordeleting'] = 'Pesan tidak bisa dihapus';
 $messages['errormarking'] = 'Tidak dapat menandai pesan';
 $messages['deletecontactconfirm'] = 'Apakah anda yakin untuk menghapus kontak terpilih?';
 $messages['deletemessagesconfirm'] = 'Yakin menghapus pesan terpilih?';
 $messages['deletefolderconfirm'] = 'Apakah anda benar-benar ingin menghapus map ini?';
 $messages['purgefolderconfirm'] = 'Yakin menghapus semua pesan pada map ini?';
-$messages['foldercreating'] = 'Membuat map...';
 $messages['folderdeleting'] = 'Menghapus map...';
-$messages['folderrenaming'] = 'EMngubah nama map...';
 $messages['foldermoving'] = 'Memindahkan map...';
-$messages['formincomplete'] = 'Blangko tidak terisi semua';
+$messages['formincomplete'] = 'Isian tidak terisi semua';
 $messages['noemailwarning'] = 'Tolong masukkan alamat email yang valid';
 $messages['nonamewarning'] = 'Tolong masukkan nama';
 $messages['nopagesizewarning'] = 'Tolong masukkan ukuran halaman';
@@ -68,11 +69,12 @@ $messages['notsentwarning'] = 'Pesan belum terkirim. Buang pesan Anda?';
 $messages['noldapserver'] = 'Tolong pilih server LDAP untuk pencarian';
 $messages['nocontactsreturned'] = 'Kontak kosong';
 $messages['nosearchname'] = 'Tolong masukkan nama kontak atau alamat email';
+$messages['notuploadedwarning'] = 'Proses upload belum selesai. Silahkan tunggu atau batalkan proses upload';
 $messages['searchsuccessful'] = '$nr pesan ditemukan';
-$messages['searchnomatch'] = 'Pencarian kosong';
+$messages['searchnomatch'] = 'Pencarian hasilnya nihil';
 $messages['searching'] = 'Mencari...';
 $messages['checking'] = 'Memeriksa...';
-$messages['nospellerrors'] = 'Tidak ditemkan kesalahan ejaan';
+$messages['nospellerrors'] = 'Tidak ditemukan kesalahan ejaan';
 $messages['folderdeleted'] = 'Map berhasil dihapus';
 $messages['deletedsuccessfully'] = 'Berhasil dihapus';
 $messages['converting'] = 'Mengembalikan pesan ke format awal...';
@@ -84,13 +86,17 @@ $messages['copyerror'] = 'Tidak bisa menyalin alamat manapun';
 $messages['sourceisreadonly'] = 'Sumber dari alamat ini hanya dapat dibaca';
 $messages['errorsavingcontact'] = 'Tidak bisa menyimpan alamat kontak';
 $messages['movingmessage'] = 'Memindahkan pesan...';
+$messages['copyingmessage'] = 'Menyalin pesan...';
+$messages['deletingmessage'] = 'Menghapus pesan...';
+$messages['markingmessage'] = 'Menandai Pesan...';
 $messages['receiptsent'] = 'Berhasil mengirim pemberitahuan tanda terima telah terbaca';
 $messages['errorsendingreceipt'] = 'Tidak dapat mengirim tanda terima';
 $messages['nodeletelastidentity'] = 'Anda tidak bida mengapus identitas ini, ini identitas yang terakhir';
-$messages['addsubfolderhint'] = 'Folder ini akan dibuat sebagai subfolder pada folder yang terpilih';
 $messages['forbiddencharacter'] = 'Nama folder mengandung karakter terlarang';
 $messages['selectimportfile'] = 'Mohon pilih sebuah berkas untuk diunggah';
 $messages['addresswriterror'] = 'Buku alamat terpilih tidak dapat ditulisi';
+$messages['contactaddedtogroup'] = 'Berhasil menambahkan kontak kedalam grup ini';
+$messages['contactremovedfromgroup'] = 'Berhasil menghapus kontak dari grup ini';
 $messages['importwait'] = 'Sedang mengimpor, harap menunggu...';
 $messages['importerror'] = 'Gagal mengimpor! Berkas terunggah bukan berkas vCard yang valid';
 $messages['importconfirm'] = '<b>Berhasil mengimpor $inserted kontak, $skipped entri dilewati</b>:<p><em>$names</em></p>';
@@ -100,9 +106,24 @@ $messages['editorwarning'] = 'Beralih pada editor teks murni akan mengakibatkan
 $messages['httpreceivedencrypterror'] = 'Terjadi sebuah kesalahan pengaturan. Segera hubungi administrator Anda. <b> Pesan Anda tidak bisa terkirim.</b>';
 $messages['smtpconnerror'] = 'SMTP Error ($code): Koneksi ke server gagal';
 $messages['smtpautherror'] = 'SMTP Error ($code): Otentifikasi gagal';
-$messages['smtpfromerror'] = 'SMTP Error ($code): Gagal mengatur pengirim "$from"';
-$messages['smtptoerror'] = 'SMTP Error ($code): Gagal menambah penerima "$to"';
+$messages['smtpfromerror'] = 'SMTP Error ($code): Gagal mengatur pengirim "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP Error ($code): Gagal menambah penerima "$to" ($msg)';
 $messages['smtprecipientserror'] = 'SMTP Error ($code): Tidak dapat menguraikan daftar penerima';
+$messages['smtpdsnerror'] = 'SMTP Error: Tidak ada dukungan untuk pemberitahuan status terkirim';
 $messages['smtperror'] = 'SMTP Error : $msg';
+$messages['emailformaterror'] = 'Alamat e-mail salah: $email';
+$messages['toomanyrecipients'] = 'Terlalu banyak penerima. Batas maksimal penerima adalah $max';
+$messages['maxgroupmembersreached'] = 'Jumlah grup melebihi jumlah maksimum $max';
+$messages['internalerror'] = 'Terjadi kesalahan internal. Silahkan diulang kembali';
+$messages['contactdelerror'] = 'Kontak tidak bisa dihapus';
+$messages['contactdeleted'] = 'Kontak berhasil dihapus';
+$messages['groupdeleted'] = 'Grup berhasil dihapus';
+$messages['grouprenamed'] = 'Grup berhasil dinamai kembali';
+$messages['groupcreated'] = 'Grub berhasil dibuat';
+$messages['messagedeleted'] = 'Pesan berhasil dihapus';
+$messages['messagemoved'] = 'Pesan berhasil dipindahkan';
+$messages['messagecopied'] = 'Pesan berhasil disalin';
+$messages['messagemarked'] = 'Pesan berhasil ditandai';
+$messages['autocompletechars'] = 'Masukkan setidaknya $min karakter untuk swaparipurna';
 
 ?>
index 06922425e3df41fa9fd5beb5896e559d1ab4d284..f8e30de0175136156673dfccda902b20d4504cc6 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/localization/index.inc                                        |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -16,7 +16,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: index.inc 2991 2009-09-25 12:23:46Z alec $
+ $Id: index.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
@@ -29,15 +29,15 @@ $rcube_languages = array(
   'ar_SA' => 'Arabic (العربية)',
   'hy_AM' => 'Armenian (Հայերեն)',
   'ast'          => 'Asturiana (Asturianu)',
-  'az_AZ' => 'Azerbaijani (Azəri)',
+  'az_AZ' => 'Azerbaijani (Azərbaycanca)',
   'eu_ES' => 'Basque (Euskara)',
   'bn_BD' => 'Bengali (বাংলা)',
   'bs_BA' => 'Bosnian (Bošnjački)',
   'br'   => 'Breton (Brezhoneg)',
   'bg_BG' => 'Bulgarian (Български)',
   'ca_ES' => 'Catalan (Català)',
-  'zh_CN' => 'Chinese (普通话)',
-  'zh_TW' => 'Chinese (國語)',
+  'zh_CN' => 'Chinese (简体中文)',
+  'zh_TW' => 'Chinese (正體中文)',
   'hr_HR' => 'Croatian (Hrvatski)',
   'cs_CZ' => 'Czech (Česky)',
   'da_DK' => 'Danish (Dansk)',
@@ -63,6 +63,7 @@ $rcube_languages = array(
   'ga_IE' => 'Irish (Gaedhilge)',
   'it_IT' => 'Italian (Italiano)',
   'ja_JP' => 'Japanese (日本語)',
+  'kh_KH' => 'Khmer (ភាសាខ្មែរ)',
   'ko_KR' => 'Korean (한국어)',
   'ku'    => 'Kurdish (Kurmancî)',
   'lv_LV' => 'Latvian (Latviešu)',
@@ -87,6 +88,7 @@ $rcube_languages = array(
   'es_AR' => 'Spanish (Argentina)',
   'es_ES' => 'Spanish (Español)',
   'sv_SE' => 'Swedish (Svenska)',
+  'ta_IN' => 'Tamil (தமிழ்)',
   'th_TH' => 'Thai (ไทย)',
   'tr_TR' => 'Turkish (Türkçe)',
   'uk_UA' => 'Ukrainian (Українська)',
index 48f8d9854499c064ed3bb7caf4104eb4e895d628..56416f52939d29063cdcbc0e1df71f84a1299a66 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/is_IS/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2009, RoundCube Dev. - Switzerland                      |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2009, Roundcube Dev. - Switzerland                      |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Hakon Orri Asgeirsson <hakon at opex.is>                      |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 543 2007-04-28 18:07:12Z thomasb $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -250,9 +250,6 @@ $labels['subscribed'] = 'Valin';
 $labels['messagecount'] = 'Skeyti';
 $labels['create'] = 'Búa til';
 $labels['createfolder'] = 'Búa til nýja möppu';
-$labels['rename'] = 'Endurnefna';
-$labels['renamefolder'] = 'Breyta nafni möppu';
-$labels['deletefolder'] = 'Eyða möppu';
 $labels['managefolders'] = 'Sýsla með möppum';
 $labels['specialfolders'] = 'Sérstakar möppur';
 $labels['sortby'] = 'Raða eftir';
index fdc1abb7d2730a8f047d7b47997b5aa4632cde30..ae3c7b053fd1b9b122102f5dc4a90b91ed2a56f4 100644 (file)
@@ -5,15 +5,15 @@
  +-----------------------------------------------------------------------+
  | language/en_GB/messages.inc                                           |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 466 2007-02-06 09:17:01Z tomekp $
+ @version $Id: messages.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
index bff322d3b3cc450cb47a642b2c33ccdbed8c9f44..66dab9822e30ef753410e717a5238aa6896a1efd 100644 (file)
@@ -3,10 +3,10 @@
 /*
 
 +-----------------------------------------------------------------------+
-| language/it/labels.inc                                                |
+| language/it_IT/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 |         Yusef Maali <contact@yusefmaali.net>                          |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 3025 2009-10-07 10:05:48Z alec $
+@version $Id: labels.inc 4386 2011-01-04 08:35:46Z yllar $
 
 */
 
@@ -37,23 +37,23 @@ $labels['subject'] = 'Oggetto';
 $labels['from'] = 'Mittente';
 $labels['to'] = 'Destinatario';
 $labels['cc'] = 'Cc';
-$labels['bcc'] = 'Ccn';
+$labels['bcc'] = 'Bcn';
 $labels['replyto'] = 'Rispondi a';
+$labels['followupto'] = 'Followup-To';
 $labels['date'] = 'Data';
 $labels['size'] = 'Dimensione';
 $labels['priority'] = 'Priorità';
 $labels['organization'] = 'Società';
-$labels['reply-to'] = 'Rispondi a';
 $labels['mailboxlist'] = 'Cartelle';
 $labels['messagesfromto'] = 'Messaggi da $from a $to di $count';
+$labels['threadsfromto'] = 'Thread da $from a $to di $count';
 $labels['messagenrof'] = 'Messaggio $nr di $count';
+$labels['copy'] = 'Copia';
+$labels['move'] = 'Sposta';
 $labels['moveto'] = 'Sposta in...';
 $labels['download'] = 'Download';
 $labels['filename'] = 'Nome file';
 $labels['filesize'] = 'Dimensione file';
-$labels['preferhtml'] = 'Mostra HTML';
-$labels['htmlmessage'] = 'Messaggio HTML';
-$labels['prettydate'] = 'Date più leggibili';
 $labels['addtoaddressbook'] = 'Aggiungi alla rubrica';
 $labels['sun'] = 'Dom';
 $labels['mon'] = 'Lun';
@@ -97,7 +97,9 @@ $labels['today'] = 'Oggi';
 $labels['checkmail'] = 'Controlla nuovi messaggi';
 $labels['writenewmessage'] = 'Scrivi un nuovo messaggio';
 $labels['replytomessage'] = 'Rispondi al mittente';
-$labels['replytoallmessage'] = 'Rispondi a tutti';
+$labels['replytoallmessage'] = 'Rispondi a tutti o alla mailing list';
+$labels['replyall'] = 'Rispondi a tutti';
+$labels['replylist'] = 'Rispondi alla mailing list';
 $labels['forwardmessage'] = 'Inoltra il messaggio';
 $labels['deletemessage'] = 'Elimina il messaggio';
 $labels['movemessagetotrash'] = 'Sposta il messaggio nel cestino';
@@ -115,25 +117,50 @@ $labels['viewsource'] = 'Visualizza sorgente messaggio';
 $labels['markmessages'] = 'Marca i messaggi';
 $labels['markread'] = 'Letti';
 $labels['markunread'] = 'Non letti';
-$labels['markflagged'] = 'Contrassegnati';
-$labels['markunflagged'] = 'Non contrassegnati';
+$labels['markflagged'] = 'Contrassegnato';
+$labels['markunflagged'] = 'Non contrassegnato';
 $labels['messageactions'] = 'Altre azioni...';
 $labels['select'] = 'Seleziona';
 $labels['all'] = 'Tutti';
 $labels['none'] = 'Nessuno';
+$labels['currpage'] = 'Pagina corrente';
 $labels['unread'] = 'Non letti';
-$labels['flagged'] = 'Contrassegnati';
+$labels['flagged'] = 'Contrassegnato';
 $labels['unanswered'] = 'Senza risposta';
 $labels['deleted'] = 'Cancellato';
+$labels['invert'] = 'Inverti';
 $labels['filter'] = 'Filtra';
+$labels['list'] = 'Elenco';
+$labels['threads'] = 'Argomenti';
+$labels['expand-all'] = 'Espandi tutto';
+$labels['expand-unread'] = 'Espandi non letti';
+$labels['collapse-all'] = 'Richiudi tutti';
+$labels['threaded'] = 'Per argomenti';
+$labels['autoexpand_threads'] = 'Espandi';
+$labels['do_expand'] = 'tutti i thread';
+$labels['expand_only_unread'] = 'solo con messaggi non letti';
+$labels['fromto'] = 'Mittente/Destinatario';
+$labels['flag'] = 'Contrassegnato';
+$labels['attachment'] = 'Allegato';
+$labels['nonesort'] = 'Nessuno';
+$labels['sentdate'] = 'Data d\'invio';
+$labels['arrival'] = 'Data di arrivo';
+$labels['asc'] = 'Ascendente';
+$labels['desc'] = 'Discendente';
+$labels['listcolumns'] = 'Elenco Colonne';
+$labels['listsorting'] = 'Ordina per';
+$labels['listorder'] = 'Ordinamento';
+$labels['listmode'] = 'Modalità di visualizzazione';
+$labels['folderactions'] = 'Azione cartella';
 $labels['compact'] = 'Compatta';
 $labels['empty'] = 'Svuota';
-$labels['purge'] = 'Pulisci';
 $labels['quota'] = 'Spazio utilizzato';
 $labels['unknown'] = 'sconosciuto';
 $labels['unlimited'] = 'illimitato';
 $labels['quicksearch'] = 'Ricerca veloce';
 $labels['resetsearch'] = 'Annulla ricerca';
+$labels['searchmod'] = 'Ambito di ricerca';
+$labels['msgtext'] = 'Intero messaggio';
 $labels['openinextwin'] = 'Apri in una nuova finestra';
 $labels['emlsave'] = 'Scarica (.eml)';
 $labels['compose'] = 'Scrivi un messaggio';
@@ -144,12 +171,15 @@ $labels['addattachment'] = 'Allega un file';
 $labels['charset'] = 'Set di caratteri';
 $labels['editortype'] = 'Tipo editor';
 $labels['returnreceipt'] = 'Ricevuta di ritorno';
+$labels['dsn'] = 'Notifica di consegna';
+$labels['editidents'] = 'Modifica indentità';
 $labels['checkspelling'] = 'Controlla ortografia';
 $labels['resumeediting'] = 'Torna al messaggio';
 $labels['revertto'] = 'Ripristina';
 $labels['attachments'] = 'Allegati';
 $labels['upload'] = 'Aggiungi';
 $labels['close'] = 'Chiudi';
+$labels['messageoptions'] = 'Opzioni messaggi...';
 $labels['low'] = 'Bassa';
 $labels['lowest'] = 'Molto bassa';
 $labels['normal'] = 'Normale';
@@ -166,6 +196,7 @@ $labels['maxuploadsize'] = 'La dimensione massima consentita è $size';
 $labels['addcc'] = 'Aggiungi Cc';
 $labels['addbcc'] = 'Aggiungi Bcc';
 $labels['addreplyto'] = 'Aggiungi Rispondi a';
+$labels['addfollowupto'] = 'Aggiungi Followup-To';
 $labels['mdnrequest'] = 'Il mittente ha richiesto di ricevere una notifica dell\'avvenuta lettura del messaggio. Si desidera inviare tale notifica?';
 $labels['receiptread'] = 'Ricevuta di ritorno (letto)';
 $labels['yourmessage'] = 'Questa è la ricevuta di ritorno del messaggio inviato';
@@ -176,10 +207,13 @@ $labels['surname'] = 'Cognome';
 $labels['email'] = 'E-Mail';
 $labels['addcontact'] = 'Aggiungi contatto alla rubrica';
 $labels['editcontact'] = 'Modifica contatto';
+$labels['contacts'] = 'Contatti';
+$labels['contactproperties'] = 'Proprietà contatto';
 $labels['edit'] = 'Modifica';
 $labels['cancel'] = 'Annulla';
 $labels['save'] = 'Salva';
 $labels['delete'] = 'Elimina';
+$labels['rename'] = 'Rinomina';
 $labels['newcontact'] = 'Crea un nuovo contatto';
 $labels['deletecontact'] = 'Elimina i contatti selezionati';
 $labels['composeto'] = 'Invia email a';
@@ -187,10 +221,13 @@ $labels['contactsfromto'] = 'Contatti da $from a $to di $count';
 $labels['print'] = 'Stampa';
 $labels['export'] = 'Esporta';
 $labels['exportvcards'] = 'Esporta i contatti in formato vCard';
+$labels['newcontactgroup'] = 'Crea un nuovo gruppo';
+$labels['groupactions'] = 'Azioni per i gruppi';
 $labels['previouspage'] = 'Pagina precedente';
 $labels['firstpage'] = 'Prima pagina';
 $labels['nextpage'] = 'Pagina successiva';
 $labels['lastpage'] = 'Ultima pagina';
+$labels['group'] = 'Gruppo';
 $labels['groups'] = 'Gruppi';
 $labels['personaladrbook'] = 'Rubrica Personale';
 $labels['import'] = 'Importa';
@@ -208,14 +245,19 @@ $labels['manageidentities'] = 'Gestisci le identità per questo account';
 $labels['newidentity'] = 'Nuova identità';
 $labels['newitem'] = 'Nuovo elemento';
 $labels['edititem'] = 'Modifica elemento';
+$labels['preferhtml'] = 'Mostra HTML';
+$labels['defaultcharset'] = 'Set di caratteri predefinito';
+$labels['htmlmessage'] = 'Messaggio HTML';
+$labels['prettydate'] = 'Date più leggibili';
 $labels['setdefault'] = 'Imposta predefinita';
 $labels['autodetect'] = 'Auto';
 $labels['language'] = 'Lingua';
 $labels['timezone'] = 'Fuso orario';
 $labels['pagesize'] = 'Righe per pagina';
 $labels['signature'] = 'Firma';
-$labels['dstactive'] = 'Gestione ora legale / ora solare';
+$labels['dstactive'] = 'Gestione ora legale';
 $labels['htmleditor'] = 'Scrivi i messaggi in HTML';
+$labels['htmlonreply'] = 'solo in risposta a messaggi HTML';
 $labels['htmlsignature'] = 'Firma in HTML';
 $labels['previewpane'] = 'Mostra l\'anteprima';
 $labels['skin'] = 'Tema interfaccia';
@@ -224,13 +266,16 @@ $labels['logoutcompact'] = 'Compatta la Posta In Arrivo all\'uscita';
 $labels['uisettings'] = 'Interfaccia Utente';
 $labels['serversettings'] = 'Impostazioni Server';
 $labels['mailboxview'] = 'Vista Messaggi';
-$labels['mdnrequests'] = 'Notifiche di lettura';
-$labels['askuser'] = 'chiedi all\'utente';
-$labels['autosend'] = 'invia automaticamente';
+$labels['mdnrequests'] = 'Su richiesta per la ricevuta di ritorno';
+$labels['askuser'] = 'chiedi conferma';
+$labels['autosend'] = 'invia';
+$labels['autosendknown'] = 'invia notifica ai miei contatti, altrimenti chiedi conferma';
+$labels['autosendknownignore'] = 'invia notifica ai miei contatti, altrimenti ignora';
 $labels['ignore'] = 'ignora';
 $labels['readwhendeleted'] = 'Marca il messaggio come letto prima di eliminarlo';
 $labels['flagfordeletion'] = 'Marca il messaggio come eliminato invece di eliminarlo';
 $labels['skipdeleted'] = 'Non mostrare i messaggi marcati come eliminati';
+$labels['deletealways'] = 'Quando non è possinile spostare i messaggi nel Cestino eliminali';
 $labels['showremoteimages'] = 'Mostra immagini remote contenute nel messaggio';
 $labels['fromknownsenders'] = 'da mittenti conosciuti';
 $labels['always'] = 'sempre';
@@ -239,21 +284,40 @@ $labels['autosavedraft'] = 'Salva le bozze automaticamente';
 $labels['everynminutes'] = 'ogni $n minuto(i)';
 $labels['keepalive'] = 'Controlla la presenza di nuovi messaggi';
 $labels['never'] = 'mai';
+$labels['immediately'] = 'immediatamente';
 $labels['messagesdisplaying'] = 'Visualizzazione Messaggi';
 $labels['messagescomposition'] = 'Composizione Messaggi';
 $labels['mimeparamfolding'] = 'Nomi allegati';
 $labels['2231folding'] = 'RFC 2231 completo (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'RFC 2047 completo (altri)';
+$labels['force7bit'] = 'Usa la codifica MIME per i caratteri a 8-bit';
 $labels['advancedoptions'] = 'Opzioni avanzate';
 $labels['focusonnewmessage'] = 'Attiva la finestra del browser all\'arrivo di un nuovo messaggio';
 $labels['checkallfolders'] = 'Controlla tutte le cartelle per la presenza di nuovi messaggi';
 $labels['displaynext'] = 'Dopo aver cancellato/spostato il messaggio mostra quello successivo';
 $labels['mainoptions'] = 'Opzioni principali';
-$labels['section'] = 'Selezione';
+$labels['section'] = 'Sezione';
 $labels['maintenance'] = 'Manutenzione';
 $labels['newmessage'] = 'Nuovo Messaggio';
 $labels['listoptions'] = 'Mostra Opzioni';
+$labels['signatureoptions'] = 'Opzioni firma';
+$labels['whenreplying'] = 'Quando rispondi';
+$labels['replytopposting'] = 'inizia il nuovo messaggio sopra quello originale';
+$labels['replybottomposting'] = 'inizia il nuovo messaggio sotto quello originale';
+$labels['replyremovesignature'] = 'Quando rispondi, rimuovi la firma dal messaggio originale';
+$labels['autoaddsignature'] = 'Aggiungi automaticamente la firma ';
+$labels['newmessageonly'] = 'solo ai nuovi messaggi';
+$labels['replyandforwardonly'] = 'solo alle risposte e inoltri';
+$labels['replysignaturepos'] = 'In risposta o inoltro, posiziona la firma';
+$labels['belowquote'] = 'sotto la citazione';
+$labels['abovequote'] = 'sopra la citazione';
+$labels['insertsignature'] = 'Inserisci firma';
+$labels['previewpanemarkread'] = 'Segna i messagi in anteprima come letti';
+$labels['afternseconds'] = 'dopo $n secondi';
+$labels['reqmdn'] = 'Richiedi sempre la ricevuta di ritorno';
+$labels['reqdsn'] = 'Richiedi sempre la notifica di consegna';
+$labels['replysamefolder'] = 'Salva risposta nella cartella del messaggio a cui si risponde';
 $labels['folder'] = 'Cartella';
 $labels['folders'] = 'Cartelle';
 $labels['foldername'] = 'Nome cartella';
@@ -261,11 +325,14 @@ $labels['subscribed'] = 'Sottoscritta';
 $labels['messagecount'] = 'Messaggi';
 $labels['create'] = 'Crea';
 $labels['createfolder'] = 'Crea nuova cartella';
-$labels['rename'] = 'Rinomina';
-$labels['renamefolder'] = 'Rinomina cartella';
-$labels['deletefolder'] = 'Cancella cartella';
 $labels['managefolders'] = 'Gestione cartelle';
 $labels['specialfolders'] = 'Cartelle Speciali';
+$labels['properties'] = 'Proprietà';
+$labels['folderproperties'] = 'Proprietà cartella';
+$labels['parentfolder'] = 'Cartella padre';
+$labels['info'] = 'Informazioni';
+$labels['getfoldersize'] = 'Click per la dimensione della cartella';
+$labels['changesubscription'] = 'Click per cambiare sottoscrizione';
 $labels['sortby'] = 'Ordina per';
 $labels['sortasc'] = 'Ordinamento crescente';
 $labels['sortdesc'] = 'Ordinamento decrescente';
@@ -273,5 +340,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Inglese';
+$labels['westerneuropean'] = 'Europa occidentale';
+$labels['easterneuropean'] = 'Europa orientale';
+$labels['southeasterneuropean'] = 'Europa sud-orientale';
+$labels['baltic'] = 'Baltiche';
+$labels['cyrillic'] = 'Cirillico';
+$labels['arabic'] = 'Arabo';
+$labels['greek'] = 'Greco';
+$labels['hebrew'] = 'Ebraico';
+$labels['turkish'] = 'Turco';
+$labels['nordic'] = 'Scandinavo';
+$labels['thai'] = 'Tailandese';
+$labels['celtic'] = 'Celtico';
+$labels['vietnamese'] = 'Vietnamita';
+$labels['japanese'] = 'Giapponese';
+$labels['korean'] = 'Coreano';
+$labels['chinese'] = 'Cinese';
 
 ?>
index e7fb4008415590688eb33391a8cef88a181d6836..dade2fe30a69ad5c887bcb1468e33c77f477910a 100644 (file)
@@ -3,10 +3,10 @@
 /*
 
 +-----------------------------------------------------------------------+
-| language/it/messages.inc                                              |
+| language/it_IT/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 |         Yusef Maali <contact@yusefmaali.net>                          |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2900 2009-09-01 11:47:46Z yllar $
+@version $Id: messages.inc 4386 2011-01-04 08:35:46Z yllar $
 
 */
 
@@ -23,12 +23,16 @@ $messages['loginfailed'] = 'Impossibile accedere. Utente o password non corretti
 $messages['cookiesdisabled'] = 'Il tuo browser non accetta i cookies';
 $messages['sessionerror'] = 'Sessione non valida o scaduta';
 $messages['imaperror'] = 'Impossibile connettersi al server IMAP';
-$messages['servererror'] = 'Errore del Server!';
+$messages['servererror'] = 'Errore del server!';
+$messages['servererrormsg'] = 'Errore del server: $msg';
+$messages['errorreadonly'] = 'Impossibile eseguire l\'operazione. Cartella in sola lettura';
+$messages['errornoperm'] = 'Impossibile eseguire l\'operazione. Permesso negato';
 $messages['invalidrequest'] = 'Richiesta non valida! Nessun dato salvato.';
 $messages['nomessagesfound'] = 'Nessun messaggio trovato in questa cartella';
 $messages['loggedout'] = 'Sessione chiusa correttamente. Arrivederci!';
 $messages['mailboxempty'] = 'La cartella è vuota';
 $messages['loading'] = 'Caricamento...';
+$messages['uploading'] = 'Caricamento file...';
 $messages['loadingdata'] = 'Caricamento dati...';
 $messages['checkingmail'] = 'Controllo nuovi messaggi...';
 $messages['sendingmessage'] = 'Invio messaggio in corso...';
@@ -47,16 +51,17 @@ $messages['senttooquickly'] = 'Per favore, attendi $sec secondi prima di inviare
 $messages['errorsavingsent'] = 'C\'è stato un errore nel salvare il messaggio inviato';
 $messages['errorsaving'] = 'Impossibile salvare';
 $messages['errormoving'] = 'Impossibile spostare il messaggio';
+$messages['errorcopying'] = 'Impossibile copiare il messaggio';
 $messages['errordeleting'] = 'Impossibile eliminare il messaggio';
 $messages['errormarking'] = 'Impossibile segnare il messaggio';
 $messages['deletecontactconfirm'] = 'Sei sicuro di voler eliminare i contatti selezionati?';
 $messages['deletemessagesconfirm'] = 'Sei sicuro di voler eliminare i messaggi selezionati?';
 $messages['deletefolderconfirm'] = 'Sei sicuro di voler eliminare la cartella selezionata?';
 $messages['purgefolderconfirm'] = 'Sei sicuro di voler eliminare tutti i messaggi in questa cartella?';
-$messages['foldercreating'] = 'Creazione cartella...';
 $messages['folderdeleting'] = 'Eliminazione cartella...';
-$messages['folderrenaming'] = 'Rinominazione cartella...';
 $messages['foldermoving'] = 'Spostamento cartella...';
+$messages['foldersubscribing'] = 'Sottoscrizione cartella...';
+$messages['folderunsubscribing'] = 'Cancellazione sottoscrizzione cartella...';
 $messages['formincomplete'] = 'Per favore, compila tutti i campi';
 $messages['noemailwarning'] = 'Per favore, immetti un indirizzo e-mail valido';
 $messages['nonamewarning'] = 'Per favore, immetti un nome';
@@ -69,12 +74,17 @@ $messages['notsentwarning'] = 'Il messaggio non è stato inviato. Vuoi annullare
 $messages['noldapserver'] = 'Per favore, scegli un server LDAP in cui ricercare';
 $messages['nocontactsreturned'] = 'Nessun contatto trovato';
 $messages['nosearchname'] = 'Per favore, immetti un nome o un indirizzo e-mail';
+$messages['notuploadedwarning'] = 'Non tutti gli allegati sono stati ancora caricati. Prego attendere, oppure cancellare il caricamento.';
 $messages['searchsuccessful'] = '$nr messaggi trovati';
 $messages['searchnomatch'] = 'La ricerca non ha dato nessun risultato';
 $messages['searching'] = 'Ricerca...';
 $messages['checking'] = 'Controllo...';
 $messages['nospellerrors'] = 'Nessun errore ortografico trovato';
 $messages['folderdeleted'] = 'Cartella eliminata';
+$messages['foldersubscribed'] = 'Cartella sottoscritta correttamente';
+$messages['folderunsubscribed'] = 'Sottoscrizione cartella cancellata correttamente';
+$messages['folderpurged'] = 'Cartella svuotata correttamente';
+$messages['folderexpunged'] = 'Cartella compattata correttamente';
 $messages['deletedsuccessfully'] = 'Eliminato con successo';
 $messages['converting'] = 'Rimozione della formattazione dal messaggio...';
 $messages['messageopenerror'] = 'Impossibile caricare il messaggio dal server';
@@ -85,13 +95,17 @@ $messages['copyerror'] = 'Impossibile copiare gli indirizzi';
 $messages['sourceisreadonly'] = 'La rubrica è in sola lettura';
 $messages['errorsavingcontact'] = 'Impossibile salvare il contatto';
 $messages['movingmessage'] = 'Spostamento del messaggio...';
+$messages['copyingmessage'] = 'Copia del messaggio';
+$messages['deletingmessage'] = 'Cancellazione messaggi/o';
+$messages['markingmessage'] = 'Marca messaggi/o...';
 $messages['receiptsent'] = 'Ricevuta di ritorno inviata con successo';
 $messages['errorsendingreceipt'] = 'Impossibile spedire la ricevuta di ritorno';
 $messages['nodeletelastidentity'] = 'Impossibile eliminare l\'unica identità disponibile';
-$messages['addsubfolderhint'] = 'La cartella verrà creata come sotto cartella della cartella corrente';
 $messages['forbiddencharacter'] = 'Il nome della cartella contiene un carattere vietato';
 $messages['selectimportfile'] = 'Per favore, seleziona il file da caricare';
 $messages['addresswriterror'] = 'La rubrica selezionata non è scrivibile';
+$messages['contactaddedtogroup'] = 'Contatto aggiunto con successo al gruppo';
+$messages['contactremovedfromgroup'] = 'Contatto rimosso con successo dal gruppo';
 $messages['importwait'] = 'Importazione in corso, attendere...';
 $messages['importerror'] = 'Importazione fallita! Il file caricato non è un file vCard valido.';
 $messages['importconfirm'] = '<b>Importati con successo $inserted contatti, saltate $skipped voci esistenti</b>:<p><em>$names</em></p>';
@@ -101,9 +115,28 @@ $messages['editorwarning'] = 'Passare all\'editor testuale farà perdere tutte l
 $messages['httpreceivedencrypterror'] = 'Fatale errore di configurazione. Per favore contatta l\'amministratore immediatamente. Il tuo messaggio non può essere inviato.';
 $messages['smtpconnerror'] = 'Errore SMTP ($code): Connessione al server fallita';
 $messages['smtpautherror'] = 'Errore SMTP ($code): Autenticazione fallita';
-$messages['smtpfromerror'] = 'Errore SMTP ($code): Fallita l\'impostazione del mittente "$from"';
-$messages['smtptoerror'] = 'Errore SMTP ($code): Fallito l\'inserimento del destinatario "$to"';
+$messages['smtpfromerror'] = 'Errore SMTP ($code): Fallita l\'impostazione del mittente "$from" ($msg)';
+$messages['smtptoerror'] = 'Errore SMTP ($code): Fallito l\'inserimento del destinatario "$to" ($msg)';
 $messages['smtprecipientserror'] = 'Errore SMTP: Impossibile processare la lista dei destinatari';
+$messages['smtpdsnerror'] = 'Errore SMTP: Ricevuta di consegna non supportata';
 $messages['smtperror'] = 'Errore SMTP: $msg';
+$messages['emailformaterror'] = 'Indirizzo e-mail non corretto: $email';
+$messages['toomanyrecipients'] = 'Numero eccessivo di destinatari, ridurlo a $max';
+$messages['maxgroupmembersreached'] = 'Il numero dei membri del gruppo eccede il massimo di $max';
+$messages['internalerror'] = 'Si è verificato un errore interno. Si prega di riprovare di nuovo.';
+$messages['contactdelerror'] = 'Impossibile eliminare contatto/i';
+$messages['contactdeleted'] = 'Contatto/i correttamente eliminato';
+$messages['groupdeleted'] = 'Gruppo correttamente eliminato';
+$messages['grouprenamed'] = 'Gruppo correttamente rinominato';
+$messages['groupcreated'] = 'Gruppo creato correttamente';
+$messages['messagedeleted'] = 'Messaggi/o cancellato correttamente';
+$messages['messagemoved'] = 'Messaggi/o spostato correttamente';
+$messages['messagecopied'] = 'Messaggi/o copiato correttamente';
+$messages['messagemarked'] = 'Messaggi/o marcato correttamente';
+$messages['autocompletechars'] = 'Inserisci almeno $min caratteri per l\'autocompletamento';
+$messages['namecannotbeempty'] = 'Il nome non può essere vuoto';
+$messages['nametoolong'] = 'Nome troppo lungo';
+$messages['folderupdated'] = 'Cartella aggiornata correttamente';
+$messages['foldercreated'] = 'Cartella creata correttamente';
 
 ?>
index 9c99124fd7cf1508aece9760151f684e2abe5f61..3fb72183acd095e54eb8a50904fee5e6b9243728 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/ja_JP/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,9 @@
 |         Takashi Takamatsu <taka717@gmail.com>                         |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2953 2009-09-13 16:42:56Z yllar $
+@version $Id: labels.inc 4368 2010-12-27 08:51:22Z yllar $
+
+EN-Revision: 4353
 
 */
 
@@ -22,7 +24,7 @@ $labels = array();
 $labels['welcome'] = 'ようこそ $product へ';
 $labels['username'] = 'ユーザー名';
 $labels['password'] = 'パスワード';
-$labels['server'] = 'サーバ';
+$labels['server'] = 'サーバ';
 $labels['login'] = 'ログイン';
 $labels['logout'] = 'ログアウト';
 $labels['mail'] = '電子メール';
@@ -38,22 +40,23 @@ $labels['from'] = '差出人';
 $labels['to'] = '宛先';
 $labels['cc'] = 'コピー';
 $labels['bcc'] = 'Bcc';
-$labels['replyto'] = '返信先';
+$labels['replyto'] = 'Reply-To (返信先)';
+$labels['followupto'] = 'Followup-To';
 $labels['date'] = '日付';
 $labels['size'] = '容量';
 $labels['priority'] = '優先度';
 $labels['organization'] = '所属';
-$labels['reply-to'] = '返信先';
-$labels['mailboxlist'] = 'フォルダ一覧';
+$labels['readstatus'] = '閲覧の状態';
+$labels['mailboxlist'] = 'フォルダ一覧';
 $labels['messagesfromto'] = '表示中のメール: $from ~ $to (全: $count 件)';
-$labels['messagenrof'] = '現在のメール:$nr (全: $count 件)';
-$labels['moveto'] = 'フォルダの移動';
+$labels['threadsfromto'] = '表示中のスレッド: $from ~ $to (全: $count 件)';
+$labels['messagenrof'] = '現在のメール: $nr (全: $count 件)';
+$labels['copy'] = 'コピー';
+$labels['move'] = '移動';
+$labels['moveto'] = 'フォルダーの移動';
 $labels['download'] = 'ダウンロード';
 $labels['filename'] = 'ファイル名';
-$labels['filesize'] = 'ファイルサイズ';
-$labels['preferhtml'] = 'HTMLを表示';
-$labels['htmlmessage'] = 'HTMLメール';
-$labels['prettydate'] = '短い日付表示';
+$labels['filesize'] = 'ファイル サイズ';
 $labels['addtoaddressbook'] = 'アドレス帳に追加';
 $labels['sun'] = '日';
 $labels['mon'] = '月';
@@ -69,35 +72,37 @@ $labels['wednesday'] = '水曜日';
 $labels['thursday'] = '木曜日';
 $labels['friday'] = '金曜日';
 $labels['saturday'] = '土曜日';
-$labels['jan'] = '1月';
-$labels['feb'] = '2月';
-$labels['mar'] = '3月';
-$labels['apr'] = '4月';
-$labels['may'] = '5月';
-$labels['jun'] = '6月';
-$labels['jul'] = '7月';
-$labels['aug'] = '8月';
-$labels['sep'] = '9月';
-$labels['oct'] = '10月';
-$labels['nov'] = '11月';
-$labels['dec'] = '12月';
-$labels['longjan'] = '1月';
-$labels['longfeb'] = '2月';
-$labels['longmar'] = '3月';
-$labels['longapr'] = '4月';
-$labels['longmay'] = '5月';
-$labels['longjun'] = '6月';
-$labels['longjul'] = '7月';
-$labels['longaug'] = '8月';
-$labels['longsep'] = '9月';
-$labels['longoct'] = '10月';
-$labels['longnov'] = '11月';
-$labels['longdec'] = '12月';
+$labels['jan'] = '1 月';
+$labels['feb'] = '2 月';
+$labels['mar'] = '3 月';
+$labels['apr'] = '4 月';
+$labels['may'] = '5 月';
+$labels['jun'] = '6 月';
+$labels['jul'] = '7 月';
+$labels['aug'] = '8 月';
+$labels['sep'] = '9 月';
+$labels['oct'] = '10 月';
+$labels['nov'] = '11 月';
+$labels['dec'] = '12 月';
+$labels['longjan'] = '1 月';
+$labels['longfeb'] = '2 月';
+$labels['longmar'] = '3 月';
+$labels['longapr'] = '4 月';
+$labels['longmay'] = '5 月';
+$labels['longjun'] = '6 月';
+$labels['longjul'] = '7 月';
+$labels['longaug'] = '8 月';
+$labels['longsep'] = '9 月';
+$labels['longoct'] = '10 月';
+$labels['longnov'] = '11 月';
+$labels['longdec'] = '12 月';
 $labels['today'] = '今日';
 $labels['checkmail'] = '新着の確認';
 $labels['writenewmessage'] = '新規メールの作成';
 $labels['replytomessage'] = '返信';
 $labels['replytoallmessage'] = '差出人とすべての宛先に返信';
+$labels['replyall'] = '全員に返信';
+$labels['replylist'] = 'ML に返信';
 $labels['forwardmessage'] = '転送';
 $labels['deletemessage'] = '削除';
 $labels['movemessagetotrash'] = 'ごみ箱に移動';
@@ -117,16 +122,39 @@ $labels['markread'] = '既読にする';
 $labels['markunread'] = '未読にする';
 $labels['markflagged'] = 'フラグを付ける';
 $labels['markunflagged'] = 'フラグを外す';
-$labels['messageactions'] = 'その他の処理';
+$labels['messageactions'] = 'その他の操作...';
 $labels['select'] = '選択';
 $labels['all'] = 'すべて';
 $labels['none'] = 'なし';
+$labels['currpage'] = '現在のページ';
 $labels['unread'] = '未読';
 $labels['flagged'] = 'フラグあり';
 $labels['unanswered'] = '未返信';
-$labels['deleted'] = '削除済';
+$labels['deleted'] = '削除済';
 $labels['invert'] = '反転';
 $labels['filter'] = 'フィルター';
+$labels['list'] = '一覧';
+$labels['threads'] = 'スレッド';
+$labels['expand-all'] = 'すべて展開';
+$labels['expand-unread'] = '未開封のメールを展開';
+$labels['collapse-all'] = 'すべて折りたたむ';
+$labels['threaded'] = 'スレッドにする';
+$labels['autoexpand_threads'] = 'スレッドの展開';
+$labels['do_expand'] = 'すべてのスレッド';
+$labels['expand_only_unread'] = '未開封のメールのみ';
+$labels['fromto'] = '送信者 / 宛先';
+$labels['flag'] = 'フラグ';
+$labels['attachment'] = '添付ファイル';
+$labels['nonesort'] = 'なし';
+$labels['sentdate'] = '送信日';
+$labels['arrival'] = '受信日';
+$labels['asc'] = '昇順';
+$labels['desc'] = '降順';
+$labels['listcolumns'] = '列の一覧';
+$labels['listsorting'] = '整列基準';
+$labels['listorder'] = '整列順';
+$labels['listmode'] = '一覧表示モード';
+$labels['folderactions'] = 'フォルダーの操作...';
 $labels['compact'] = 'コンパクト';
 $labels['empty'] = '空';
 $labels['purge'] = 'ごみ箱を空にする';
@@ -138,7 +166,7 @@ $labels['resetsearch'] = '検索解除';
 $labels['searchmod'] = '検索条件';
 $labels['msgtext'] = 'すべてのメール';
 $labels['openinextwin'] = '新しいウィンドウで開く';
-$labels['emlsave'] = 'eml ファイルとして保存';
+$labels['emlsave'] = 'eml 形式で保存する';
 $labels['compose'] = 'メールの作成';
 $labels['editasnew'] = '新規として編集';
 $labels['savemessage'] = '下書きに保存';
@@ -147,12 +175,15 @@ $labels['addattachment'] = 'ファイルの添付';
 $labels['charset'] = '文字エンコード';
 $labels['editortype'] = 'エディターの種類';
 $labels['returnreceipt'] = '開封確認';
-$labels['checkspelling'] = 'スペルチェック';
+$labels['dsn'] = '配送状況の通知';
+$labels['editidents'] = '個人情報の編集';
+$labels['checkspelling'] = 'スペル チェック';
 $labels['resumeediting'] = 'メール作成に戻る';
 $labels['revertto'] = '元に戻す';
 $labels['attachments'] = '添付ファイル';
 $labels['upload'] = 'アップロード';
 $labels['close'] = '閉じる';
+$labels['messageoptions'] = 'メッセージのオプション...';
 $labels['low'] = '低い';
 $labels['lowest'] = '最低';
 $labels['normal'] = '通常';
@@ -160,47 +191,54 @@ $labels['high'] = '高い';
 $labels['highest'] = '最高';
 $labels['nosubject'] = '(件名なし)';
 $labels['showimages'] = '画像の表示';
-$labels['alwaysshow'] = '$sender ã\81®ç\94»å\83\8fã\81¯å¸¸ã\81«è¡¨ç¤ºã\81\99ã\82\8b';
+$labels['alwaysshow'] = '$sender ã\81\8bã\82\89å±\8aã\81\84ã\81\9fç\94»å\83\8fã\81¯å¸¸ã\81«è¡¨ç¤º';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'テキスト';
 $labels['savesentmessagein'] = '送信済みメールの保存先';
 $labels['dontsave'] = '保存しない';
-$labels['maxuploadsize'] = 'æ·»ä»\98å\8f¯è\83½ã\83\95ã\82¡ã\82¤ã\83«ã\82µã\82¤ã\82º : $size';
+$labels['maxuploadsize'] = 'æ·»ä»\98å\8f¯è\83½ã\81ªã\83\95ã\82¡ã\82¤ã\83«ã\81®ã\82µã\82¤ã\82ºã\81¯æ\9c\80大 $size ã\81§ã\81\99ã\80\82';
 $labels['addcc'] = 'Cc 追加';
 $labels['addbcc'] = 'Bcc 追加';
 $labels['addreplyto'] = 'Reply-To 追加';
-$labels['mdnrequest'] = 'メールの差出人は開封確認の送付を求めています。開封確認のメールを送付しますか?';
-$labels['receiptread'] = '開封確認 (表示済)';
+$labels['addfollowupto'] = 'Followup-To 追加';
+$labels['mdnrequest'] = 'メールの差出人は開封確認の送付を求めています。開封確認のメールを送付しますか?';
+$labels['receiptread'] = '開封確認 (表示済み)';
 $labels['yourmessage'] = 'これはあなたが送信したメールに対する開封確認です。';
 $labels['receiptnote'] = '注意: この開封確認はメールが受信者に表示されたことの通知です。受信者がメールを読んだこと、内容を理解したことを保証するものではありません。';
 $labels['name'] = '表示名';
-$labels['firstname'] = '名';
-$labels['surname'] = 'å\90\8då­\97';
+$labels['firstname'] = '名 (ファースト ネーム)';
+$labels['surname'] = 'å§\93 (ã\83©ã\82¹ã\83\88 ã\83\8dã\83¼ã\83 )';
 $labels['email'] = 'メールアドレス';
 $labels['addcontact'] = '連絡先の新規追加';
 $labels['editcontact'] = '連絡先の編集';
+$labels['contacts'] = '連絡先';
+$labels['contactproperties'] = '連絡先のプロパティ';
 $labels['edit'] = '編集';
 $labels['cancel'] = 'キャンセル';
 $labels['save'] = '保存';
 $labels['delete'] = '削除';
+$labels['rename'] = '名前の変更';
 $labels['newcontact'] = '連絡先の新規作成';
 $labels['deletecontact'] = '連絡先の削除';
-$labels['composeto'] = 'ã\81\93ã\81®é\80£çµ¡å\85\88ã\81¸ã\83¡ã\83¼ã\83«ã\82\92送信';
+$labels['composeto'] = 'ã\81\93ã\81®é\80£çµ¡å\85\88ã\81¸ã\83¡ã\83¼ã\83«ã\81®送信';
 $labels['contactsfromto'] = '連絡先: $from ~ $to (全: $count 件)';
 $labels['print'] = '印刷';
 $labels['export'] = 'エクスポート';
-$labels['exportvcards'] = 'vCard形式でエクスポート';
+$labels['exportvcards'] = 'vCard 形式でエクスポート';
+$labels['newcontactgroup'] = '連絡先グループの新規作成';
+$labels['groupactions'] = '連絡先グループの操作...';
 $labels['previouspage'] = '前の一覧へ';
 $labels['firstpage'] = '最初の一覧へ';
 $labels['nextpage'] = '次の一覧へ';
 $labels['lastpage'] = '最後の一覧へ';
+$labels['group'] = 'グループ';
 $labels['groups'] = 'グループ';
 $labels['personaladrbook'] = '個人アドレス';
 $labels['import'] = 'インポート';
 $labels['importcontacts'] = '連絡先のインポート';
 $labels['importfromfile'] = 'インポートするファイル:';
 $labels['importreplace'] = '現在のアドレス帳と置き換える';
-$labels['importtext'] = '既存のアドレス帳の連絡先をアップロードできます。現在、vCard 形式からのインポートに対応しています。';
+$labels['importtext'] = '既存のアドレス帳の連絡先をアップロードできます。現在、<a href="http://ja.wikipedia.org/wiki/VCard">vCard</a> 形式からのインポートに対応しています。';
 $labels['done'] = '完了';
 $labels['settingsfor'] = '次の設定:';
 $labels['preferences'] = '設定';
@@ -211,70 +249,119 @@ $labels['manageidentities'] = 'アカウントの個人情報管理';
 $labels['newidentity'] = '個人情報の新規作成';
 $labels['newitem'] = '新しい項目';
 $labels['edititem'] = '項目の編集';
+$labels['preferhtml'] = 'HTML を表示する';
+$labels['defaultcharset'] = '標準の文字セット';
+$labels['htmlmessage'] = 'HTML メール';
+$labels['prettydate'] = '短い日付で表示';
 $labels['setdefault'] = '標準の設定';
 $labels['autodetect'] = '自動識別';
 $labels['language'] = '言語';
 $labels['timezone'] = 'タイムゾーン';
-$labels['pagesize'] = 'ページ単位の表示件数';
+$labels['pagesize'] = '1 ページの表示件数';
 $labels['signature'] = '署名';
-$labels['dstactive'] = '夏時間の適用';
-$labels['htmleditor'] = 'メール作成はHTMLが標準';
-$labels['htmlsignature'] = 'HTML の署名';
-$labels['previewpane'] = 'プレビューペインの表示';
+$labels['dstactive'] = 'サマータイムを適用する';
+$labels['htmleditor'] = '新規メールでは HTML を標準にする';
+$labels['htmlonreply'] = 'メールの返信時は常に HTML を使用する';
+$labels['htmlsignature'] = '署名に HTML タグを使用する';
+$labels['previewpane'] = 'プレビュー ペインを表示する';
 $labels['skin'] = 'スキン';
 $labels['logoutclear'] = 'ログアウト時にごみ箱を空にする';
-$labels['logoutcompact'] = 'ã\83­ã\82°ã\82¢ã\82¦ã\83\88æ\99\82ã\81«ã\83\95ã\82©ã\83«ã\83\80ã\81®ã\82³ã\83³ã\83\91ã\82¯ã\83\88å\8c\96ã\82\92å®\9fè¡\8c';
-$labels['uisettings'] = 'ユーザーインターフェース';
-$labels['serversettings'] = 'サーバの設定';
+$labels['logoutcompact'] = 'ã\83­ã\82°ã\82¢ã\82¦ã\83\88æ\99\82ã\81«ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\81®ã\82³ã\83³ã\83\91ã\82¯ã\83\88å\8c\96ã\82\92å®\9fè¡\8cã\81\99ã\82\8b';
+$labels['uisettings'] = 'ユーザー インターフェース';
+$labels['serversettings'] = 'ã\82µã\83¼ã\83\90ã\83¼ã\81®è¨­å®\9a';
 $labels['mailboxview'] = '受信箱';
-$labels['mdnrequests'] = '差出人への通知';
-$labels['askuser'] = 'ユーザーに確認する';
-$labels['autosend'] = '自動的に送信する';
-$labels['ignore'] = '無視する';
+$labels['mdnrequests'] = '開封確認の送信要求時';
+$labels['askuser'] = '開封確認メールの送信を確認する';
+$labels['autosend'] = '開封確認メールを送信する';
+$labels['autosendknown'] = '差出人が連絡先に登録されていれば開封確認を送信し、それ以外は問い合わせる';
+$labels['autosendknownignore'] = '差出人が連絡先に登録されていれば開封確認を送信し、それ以外は無視する';
+$labels['ignore'] = '無視';
 $labels['readwhendeleted'] = '削除したメールを既読にする';
 $labels['flagfordeletion'] = '実際に削除せずに削除済みフラグを付ける';
 $labels['skipdeleted'] = '削除済みメールを表示しない';
-$labels['showremoteimages'] = '外部URLの画像をインライン表示する';
-$labels['fromknownsenders'] = '知り合いから';
+$labels['deletealways'] = 'ごみ箱への移動に失敗したメールはすぐに削除';
+$labels['showremoteimages'] = '外部 URL の画像をインライン表示する';
+$labels['fromknownsenders'] = '送信者が知人の場合';
 $labels['always'] = '常に';
 $labels['showinlineimages'] = 'メールに添付された画像を表示する';
-$labels['autosavedraft'] = '自動的に下書きを保存';
+$labels['autosavedraft'] = '自動的に下書きを保存する';
 $labels['everynminutes'] = '$n 分毎';
 $labels['keepalive'] = '新着メールの確認間隔';
 $labels['never'] = 'しない';
+$labels['immediately'] = 'すぐに';
 $labels['messagesdisplaying'] = 'メールの表示';
 $labels['messagescomposition'] = 'メールの作成';
 $labels['mimeparamfolding'] = '添付ファイル名';
 $labels['2231folding'] = 'RFC 2231 準拠 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
-$labels['2047folding'] = 'RFC 2047 準拠 (other)';
+$labels['2047folding'] = 'RFC 2047 準拠 (他のメーラー)';
+$labels['force7bit'] = 'マルチバイト文字列を MIME エンコードする';
 $labels['advancedoptions'] = '高度な設定';
-$labels['focusonnewmessage'] = 'æ\96°ç\9d\80ã\83¡ã\83¼ã\83«ã\81\8cå±\8aã\81\84ã\81\9fã\82\89ã\83\96ã\83©ã\82¦ã\82¶ã\81«ã\83\95ã\82©ã\83¼ã\82«ã\82¹ã\82\92移ã\81\99';
-$labels['checkallfolders'] = 'ã\81\99ã\81¹ã\81¦ã\81®ã\83\95ã\82©ã\83«ã\83\80ã\81§æ\96°ç\9d\80ã\83¡ã\83¼ã\83«ã\82\92確èª\8dする';
-$labels['displaynext'] = 'ã\83¡ã\83¼ã\83«ã\82\92å\89\8aé\99¤ã\83»ç§»å\8b\95ã\81\97ã\81\9fã\82\89ã\80\81次のメールを表示する';
+$labels['focusonnewmessage'] = 'æ\96°ç\9d\80ã\83¡ã\83¼ã\83«ã\81\8cå±\8aã\81\84ã\81\9fã\82\89ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\82\92ã\82¢ã\82¯ã\83\86ã\82£ã\83\96ã\81«ã\81\99ã\82\8b';
+$labels['checkallfolders'] = 'ã\81\99ã\81¹ã\81¦ã\81®ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\81§æ\96°ç\9d\80ã\83¡ã\83¼ã\83«ã\82\92表示する';
+$labels['displaynext'] = 'ã\83¡ã\83¼ã\83«ã\81®å\89\8aé\99¤ã\82\84移å\8b\95å¾\8cã\81«次のメールを表示する';
 $labels['mainoptions'] = '基本設定';
 $labels['section'] = '設定項目';
 $labels['maintenance'] = 'メンテナンス設定';
 $labels['newmessage'] = '新着メール設定';
 $labels['listoptions'] = '一覧設定';
-$labels['folder'] = 'フォルダ';
-$labels['folders'] = 'フォルダ一覧';
-$labels['foldername'] = 'フォルダ名';
-$labels['subscribed'] = '購読済';
+$labels['signatureoptions'] = '署名の設定';
+$labels['whenreplying'] = '返信時の本文';
+$labels['replytopposting'] = '元のメッセージ引用部の前に本文を作成する';
+$labels['replybottomposting'] = '元のメッセージ引用部の後に本文を作成する';
+$labels['replyremovesignature'] = '返信時にメッセージからオリジナルの署名を除去する';
+$labels['autoaddsignature'] = '自動的に署名を付加する';
+$labels['newmessageonly'] = '新規作成時のみ';
+$labels['replyandforwardonly'] = '返信・転送時のみ';
+$labels['replysignaturepos'] = '返信・転送時に署名を挿入する位置';
+$labels['belowquote'] = '引用部の後';
+$labels['abovequote'] = '引用部の前';
+$labels['insertsignature'] = '署名の挿入';
+$labels['previewpanemarkread'] = '開封済みにする';
+$labels['afternseconds'] = '$n 秒後';
+$labels['reqmdn'] = '常に開封確認通知を要求する';
+$labels['reqdsn'] = '常に配送状況の通知を要求する';
+$labels['replysamefolder'] = '返信されたメールを返信元メールと同じフォルダに保存';
+$labels['folder'] = 'フォルダー';
+$labels['folders'] = 'フォルダー一覧';
+$labels['foldername'] = 'フォルダー名';
+$labels['subscribed'] = '購読済み';
 $labels['messagecount'] = 'メール';
 $labels['create'] = '作成';
-$labels['createfolder'] = 'フォルダの新規作成';
-$labels['rename'] = '名前の変更';
-$labels['renamefolder'] = 'フォルダ名の変更';
-$labels['deletefolder'] = 'フォルダの削除';
-$labels['managefolders'] = 'フォルダの管理';
-$labels['specialfolders'] = '特殊なフォルダ';
-$labels['sortby'] = '整列の基準にする';
-$labels['sortasc'] = '昇順で整列';
-$labels['sortdesc'] = '降順で整列';
+$labels['createfolder'] = 'フォルダーの新規作成';
+$labels['managefolders'] = 'フォルダーの管理';
+$labels['specialfolders'] = '特殊なフォルダー';
+$labels['properties'] = 'プロパティ';
+$labels['folderproperties'] = 'フォルダーのプロパティ';
+$labels['parentfolder'] = '親フォルダー';
+$labels['location'] = '場所';
+$labels['info'] = '情報';
+$labels['getfoldersize'] = 'クリックでフォルダー サイズの取得';
+$labels['changesubscription'] = 'クリックで購読の変更';
+$labels['sortby'] = '並び替えの基準';
+$labels['sortasc'] = '昇順で並び替え';
+$labels['sortdesc'] = '降順で並び替え';
 $labels['B'] = 'バイト';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = '英語';
+$labels['westerneuropean'] = '西ヨーロッパ言語';
+$labels['easterneuropean'] = '東ヨーロッパ言語';
+$labels['southeasterneuropean'] = '南東ヨーロッパ言語';
+$labels['baltic'] = 'バルト言語';
+$labels['cyrillic'] = 'キリル言語';
+$labels['arabic'] = 'アラビア語';
+$labels['greek'] = 'ギリシャ語';
+$labels['hebrew'] = 'ヘブライ語';
+$labels['turkish'] = 'トルコ語';
+$labels['nordic'] = '北欧言語';
+$labels['thai'] = 'タイ語';
+$labels['celtic'] = 'ケルト語';
+$labels['vietnamese'] = 'ベトナム語';
+$labels['japanese'] = '日本語';
+$labels['korean'] = '韓国語';
+$labels['chinese'] = '中国語';
 
 ?>
index 4697ce5c02ac63fd0089ec06572272aa5b6e0a66..e07a65e9e8181f6a9100d49c3b1b0950a8208bf4 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/ja_JP/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,9 @@
 |         Takashi Takamatsu <taka717@gmail.com>                         |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2953 2009-09-13 16:42:56Z yllar $
+@version $Id: messages.inc 4368 2010-12-27 08:51:22Z yllar $
+
+//  EN-Revision: 4321
 
 */
 
@@ -22,14 +24,18 @@ $messages = array();
 $messages['loginfailed'] = 'ログインに失敗しました。';
 $messages['cookiesdisabled'] = 'ブラウザで Cookie が無効に設定されています。';
 $messages['sessionerror'] = 'セッションが正しくないか期限切れです。';
-$messages['imaperror'] = 'IMAP サーバへの接続に失敗しました。';
-$messages['servererror'] = 'サーバエラーが発生しました。';
-$messages['invalidrequest'] = '不正なリクエストです! 保存されませんでした。';
+$messages['imaperror'] = 'IMAP サーバーへの接続に失敗しました。';
+$messages['servererror'] = 'サーバーでエラーが発生しました。';
+$messages['servererrormsg'] = 'サーバー エラー: $msg';
+$messages['errorreadonly'] = '操作の実行に失敗しました。フォルダーは読み込み専用です。';
+$messages['errornoperm'] = 'フォルダーの操作に失敗しました。権限がありません。';
+$messages['invalidrequest'] = '不正なリクエストです。データは保存されませんでした。';
 $messages['nomessagesfound'] = 'メールはありません。';
 $messages['loggedout'] = 'ログアウトしました。';
-$messages['mailboxempty'] = 'メールボックスは空です。';
-$messages['loading'] = '読込中...';
-$messages['loadingdata'] = 'データを読込中...';
+$messages['mailboxempty'] = 'メール ボックスは空です。';
+$messages['loading'] = '読み込んでいます...';
+$messages['uploading'] = 'アップロードしています...';
+$messages['loadingdata'] = 'データを読み込んでいます...';
 $messages['checkingmail'] = 'メールを確認しています...';
 $messages['sendingmessage'] = 'メールを送信しています...';
 $messages['messagesent'] = 'メールを送信しました。';
@@ -37,73 +43,102 @@ $messages['savingmessage'] = 'メールを保存しています...';
 $messages['messagesaved'] = 'メールを下書きに保存しました。';
 $messages['successfullysaved'] = '保存しました。';
 $messages['addedsuccessfully'] = 'アドレス帳への連絡先の追加しました。';
-$messages['contactexists'] = 'ã\81\93ã\81®ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81¯æ\97¢ã\81«ã\82¢ã\83\89ã\83¬ã\82¹å¸³に存在します。';
+$messages['contactexists'] = 'ã\81\93ã\81®ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92å\90«ã\82\80é\80£çµ¡å\85\88ã\81\8cæ\97¢に存在します。';
 $messages['blockedimages'] = 'プライバシー保護のため、このメールに含まれるリモート画像をブロックしました。';
 $messages['encryptedmessage'] = 'このメールは暗号化されているため表示できません。';
 $messages['nocontactsfound'] = '連絡先がありません。';
 $messages['contactnotfound'] = '要求された連絡先が見つかりません。';
-$messages['sendingfailed'] = 'メール送信に失敗しました。';
-$messages['senttooquickly'] = 'このメールを送信するまで $sec 秒お待ちください。';
+$messages['sendingfailed'] = 'メール送信に失敗しました。';
+$messages['senttooquickly'] = 'このメールを送信するまで $sec 秒 お待ちください。';
 $messages['errorsavingsent'] = '送信メールの保存中にエラーが発生しました。';
 $messages['errorsaving'] = '保存中にエラーが発生しました。';
 $messages['errormoving'] = 'メールを移動できません。';
+$messages['errorcopying'] = 'メールをコピーできません。';
 $messages['errordeleting'] = 'メールを削除できません。';
-$messages['errormarking'] = 'ã\83¡ã\83¼ã\83«ã\82\92ã\83\9eã\83¼ã\82¯できません。';
-$messages['deletecontactconfirm'] = '選択した連絡先を本当に削除しますか';
-$messages['deletemessagesconfirm'] = '選択したメールを本当に削除しますか';
-$messages['deletefolderconfirm'] = 'ã\81\93ã\81®ã\83\95ã\82©ã\83«ã\83\80ã\82\92æ\9c¬å½\93ã\81«å\89\8aé\99¤ã\81\97ã\81¾ã\81\99ã\81\8bï¼\9f';
-$messages['purgefolderconfirm'] = 'ã\81\93ã\81®ã\83\95ã\82©ã\83«ã\83\80ã\81®å\85¨ã\81¦ã\81®ã\83¡ã\83¼ã\83«ã\82\92æ\9c¬å½\93ã\81«å\89\8aé\99¤ã\81\97ã\81¾ã\81\99ã\81\8bï¼\9f';
-$messages['foldercreating'] = 'フォルダを作成しています...';
-$messages['folderdeleting'] = 'フォルダを削除しています...';
-$messages['folderrenaming'] = 'フォルダ名を変更しています...';
-$messages['foldermoving'] = 'フォルダを移動しています...';
-$messages['formincomplete'] = 'ã\83\95ã\82©ã\83¼ã\83 ã\81®é \85ç\9b®ã\81\8cå®\8cå\85¨ã\81«å\85¥å\8a\9bã\81\95ã\82\8cていません。';
-$messages['noemailwarning'] = '有効なメールアドレスを入力してさい。';
-$messages['nonamewarning'] = '名前を入力してさい。';
-$messages['nopagesizewarning'] = 'ページのサイズを入力してさい。';
+$messages['errormarking'] = 'ã\83¡ã\83¼ã\83«ã\81®ã\83\9eã\83¼ã\82¯ã\82\92設å®\9aできません。';
+$messages['deletecontactconfirm'] = '選択した連絡先を本当に削除しますか?';
+$messages['deletemessagesconfirm'] = '選択したメールを本当に削除しますか?';
+$messages['deletefolderconfirm'] = 'ã\81\93ã\81®ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\82\92æ\9c¬å½\93ã\81«å\89\8aé\99¤ã\81\97ã\81¾ã\81\99ã\81\8b?';
+$messages['purgefolderconfirm'] = 'ã\81\93ã\81®ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\81®å\85¨ã\83¡ã\83¼ã\83«ã\82\92æ\9c¬å½\93ã\81«å\89\8aé\99¤ã\81\97ã\81¾ã\81\99ã\81\8b?';
+$messages['folderdeleting'] = 'フォルダーを削除しています...';
+$messages['foldermoving'] = 'フォルダーを移動しています...';
+$messages['foldersubscribing'] = 'フォルダーを購読しています...';
+$messages['folderunsubscribing'] = 'フォルダーの購読をやめています...';
+$messages['formincomplete'] = 'ã\81\99ã\81¹ã\81¦ã\81®ã\83\95ã\82©ã\83¼ã\83 ã\81®é \85ç\9b®ã\82\92å\85¥å\8a\9bã\81\97ていません。';
+$messages['noemailwarning'] = '有効なメールアドレスを入力してください。';
+$messages['nonamewarning'] = '名前を入力してください。';
+$messages['nopagesizewarning'] = 'ページのサイズを入力してください。';
 $messages['nosenderwarning'] = '差出人のメールアドレスを入力してください。';
-$messages['norecipientwarning'] = '宛先を最低 1 人は入力してさい。';
-$messages['nosubjectwarning'] = '件名が空です。今すぐ入力しますか';
-$messages['nobodywarning'] = '本文が無いメールを送信しますか';
-$messages['notsentwarning'] = 'メールは送信されませんでした。破棄しますか';
-$messages['noldapserver'] = '検索する LDAP サーバーを選択してさい。';
+$messages['norecipientwarning'] = '宛先を最低 1 人は入力してください。';
+$messages['nosubjectwarning'] = '件名が空です。今すぐ入力しますか?';
+$messages['nobodywarning'] = '本文が無いメールを送信しますか?';
+$messages['notsentwarning'] = 'メールは送信されませんでした。破棄しますか?';
+$messages['noldapserver'] = '検索する LDAP サーバーを選択してください。';
 $messages['nocontactsreturned'] = '連絡先がありません。';
-$messages['nosearchname'] = '連絡先の名前かメールアドレスを入力して下さい。';
-$messages['searchsuccessful'] = ' $nr 件のメールが見つかりました。';
-$messages['searchnomatch'] = '一致するメールはありません。';
-$messages['searching'] = '検索中...';
-$messages['checking'] = '確認中...';
-$messages['nospellerrors'] = 'スペルミスは見つかりませんでした。';
-$messages['folderdeleted'] = 'フォルダを削除しました。';
+$messages['nosearchname'] = '連絡先の名前かメールアドレスを入力してください。';
+$messages['notuploadedwarning'] = 'アップロードが完了していません。アップロードが完了するまで待つか、キャンセルしてください。';
+$messages['searchsuccessful'] = '$nr 件のメールが見つかりました。';
+$messages['searchnomatch'] = '一致するメールがありません。';
+$messages['searching'] = '検索しています...';
+$messages['checking'] = '確認しています...';
+$messages['nospellerrors'] = 'スペル ミスは見つかりませんでした。';
+$messages['folderdeleted'] = 'フォルダーを削除しました。';
+$messages['foldersubscribed'] = 'フォルダーの購読に成功しました。';
+$messages['folderunsubscribed'] = 'フォルダーの購読をやめました。';
+$messages['folderpurged'] = 'フォルダーの整理に成功しました。';
+$messages['folderexpunged'] = 'フォルダーを空にしました。';
 $messages['deletedsuccessfully'] = '削除しました。';
 $messages['converting'] = 'メールから書式を削除しています...';
-$messages['messageopenerror'] = 'サーバからメールを取得できません。';
+$messages['messageopenerror'] = 'ã\82µã\83¼ã\83\90ã\83¼ã\81\8bã\82\89ã\83¡ã\83¼ã\83«ã\82\92å\8f\96å¾\97ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82';
 $messages['fileuploaderror'] = 'ファイルのアップロードに失敗しました。';
-$messages['filesizeerror'] = 'ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\83\95ã\82¡ã\82¤ã\83«ã\81®ã\82µã\82¤ã\82ºã\81\8cä¸\8aé\99\90 $size を超えました。';
-$messages['copysuccess'] = 'アドレス $nr 個のコピーに成功しました。';
+$messages['filesizeerror'] = 'ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\99ã\82\8bã\83\95ã\82¡ã\82¤ã\83«ã\81®ã\82µã\82¤ã\82ºã\81\8cä¸\8aé\99\90 ($size) を超えました。';
+$messages['copysuccess'] = ' $nr 個のアドレスのコピーに成功しました。';
 $messages['copyerror'] = 'アドレスをコピーできません。';
-$messages['sourceisreadonly'] = 'このアドレス情報は読専用です。';
+$messages['sourceisreadonly'] = 'このアドレス情報は読み取り専用です。';
 $messages['errorsavingcontact'] = '連絡先のアドレスを保存できません。';
 $messages['movingmessage'] = 'メールを移動しています...';
+$messages['copyingmessage'] = 'メールをコピーしています...';
+$messages['deletingmessage'] = 'メールを削除しています...';
+$messages['markingmessage'] = 'メールのマークを設定しています...';
 $messages['receiptsent'] = '開封確認を送信しました。';
 $messages['errorsendingreceipt'] = '開封確認を送信できません。';
-$messages['nodeletelastidentity'] = '削除できません。少なくとも1つの個人情報が必要です。';
-$messages['addsubfolderhint'] = '現在選択しているフォルダのサブフォルダとして作成されます。';
-$messages['forbiddencharacter'] = 'フォルダ名に利用できない文字が含まれています。';
+$messages['nodeletelastidentity'] = '削除できません。少なくとも 1 つの個人情報が必要です。';
+$messages['forbiddencharacter'] = 'フォルダー名に利用できない文字が含まれています。';
 $messages['selectimportfile'] = 'アップロードするファイルを選択してください。';
 $messages['addresswriterror'] = '選択したアドレス帳に書き込めません。';
+$messages['contactaddedtogroup'] = 'グループに連絡先を追加しました。';
+$messages['contactremovedfromgroup'] = 'グループから連絡先を削除しました。';
 $messages['importwait'] = 'インポート中です。しばらくお待ちください...';
 $messages['importerror'] = 'インポートに失敗しました。アップロードしたファイルは不正な vCard ファイルです。';
-$messages['importconfirm'] = '<b>$inserted 件の連絡先をインポートしました。<br />既登録の連絡先 $skipped 件をスキップしました</b><p><em>$names</em></p>';
-$messages['opnotpermitted'] = 'その操作は許可されていません。';
+$messages['importconfirm'] = '<b>$inserted 件の連絡先をインポートしました。<br />既登録の連絡先 $skipped 件をスキップしました</b>:<p><em>$names</em></p>';
+$messages['opnotpermitted'] = '許可されていない操作です。';
 $messages['nofromaddress'] = '選択中の個人情報にメールアドレスが含まれていません。';
-$messages['editorwarning'] = 'テキストエディタに切り替えるとすべての書式が失われます。よろしいですか?';
+$messages['editorwarning'] = 'テキスト エディターに切り替えるとすべての書式が失われます。よろしいですか?';
 $messages['httpreceivedencrypterror'] = '致命的な設定エラーが発生しました。<b>メッセージは送信されませんでした。</b>システム管理者に至急連絡してください。';
-$messages['smtpconnerror'] = 'SMTP Error ($code): サーバーへの接続に失敗しました';
-$messages['smtpautherror'] = 'SMTP Error ($code): 認証に失敗しました';
-$messages['smtpfromerror'] = 'SMTP Error ($code): 差出人 "$from" を設定できませんでした';
-$messages['smtptoerror'] = 'SMTP Error ($code): 宛先 "$to" を追加できませんでした';
-$messages['smtprecipientserror'] = 'SMTP Error: 宛先のリストを解析できませんでした';
-$messages['smtperror'] = 'SMTP Error: $msg';
+$messages['smtpconnerror'] = 'SMTP Error ($code): サーバーへの接続に失敗しました。';
+$messages['smtpautherror'] = 'SMTP Error ($code): 認証に失敗しました。';
+$messages['smtpfromerror'] = 'SMTP Error ($code): 差出人 "$from" を設定できません ($msg)';
+$messages['smtptoerror'] = 'SMTP Error ($code): 宛先 "$to" を追加できません ($msg)';
+$messages['smtprecipientserror'] = 'SMTP Error: 宛先の一覧を解析できません。';
+$messages['smtpdsnerror'] = 'SMTP エラー: 配送状況通知をサポートしていません。';
+$messages['smtperror'] = 'SMTP エラー: $msg';
+$messages['emailformaterror'] = 'メールアドレスが正しくありません: $email';
+$messages['toomanyrecipients'] = '宛先が多すぎます。$max 件以内にしてください。';
+$messages['maxgroupmembersreached'] = 'グループのメンバーが多すぎます。$max 件以内にしてください。';
+$messages['internalerror'] = '内部エラーが発生しました。もう一度やり直してください。';
+$messages['contactdelerror'] = '連絡先を削除できませんでした。';
+$messages['contactdeleted'] = '連絡先を削除しました。';
+$messages['groupdeleted'] = 'グループを削除しました。';
+$messages['grouprenamed'] = 'グループ名を変更しました.';
+$messages['groupcreated'] = 'グループを作成しました。';
+$messages['messagedeleted'] = 'メールを削除しました。';
+$messages['messagemoved'] = 'メールを移動しました。';
+$messages['messagecopied'] = 'メールをコピーしました。';
+$messages['messagemarked'] = 'メールのマークを設定しました。';
+$messages['autocompletechars'] = '自動補完には少なくとも $min 文字入力してください。';
+$messages['namecannotbeempty'] = '名前は空にできません。';
+$messages['nametoolong'] = '名前が長すぎます。';
+$messages['folderupdated'] = 'フォルダーの更新に成功しました。';
+$messages['foldercreated'] = 'フォルダーの作成に成功しました。';
 
 ?>
index 12ce531ded943cc43731e82ec90028e27c530b0e..7a56fc41ba12ab5e9b661358c66776df91565500 100755 (executable)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | localization/ka_GE/labels.inc                                         |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -250,12 +250,23 @@ $labels['advancedoptions'] = 'დამატებითი პარამე
 $labels['focusonnewmessage'] = 'ფოკუსირება ახალ შეტყობინებებზე';
 $labels['checkallfolders'] = 'შეამოწმე ყველა საქაღალდე ახალ შეტყობინებაზე';
 $labels['displaynext'] = 'შეტყობინების წაშლის ან გადატანის შემდეგ გამოჩნდეს შემდეგი შეტყობინება';
-$labels['indexsort'] = 'თარიღით დალაგებისთვის გამოიყენე შეტყობინების ინდექსი';
 $labels['mainoptions'] = 'ძირითადი პარამეტრები';
 $labels['section'] = 'განყოფილება';
 $labels['maintenance'] = 'მომსახურება';
 $labels['newmessage'] = 'ახალი შეტყობინება';
 $labels['listoptions'] = 'პარამეტრების ჩამონათვალი';
+$labels['signatureoptions'] = 'ხელმოწერის ოფციები';
+$labels['whenreplying'] = 'პასუხის შემთხვევაში';
+$labels['replytopposting'] = 'დაიწყოს ახალი შეტყობინება ორიგინალის ზემოთ';
+$labels['replybottomposting'] = 'დაიწყოს ახალი შეტყობინება ორიგინალის ქვემოთ';
+$labels['replyremovesignature'] = 'წაიშალოს ხელმოწერა პასუხის შემთხვევაში';
+$labels['autoaddsignature'] = 'ავტომატურად დაემატოს ხელმოწერა';
+$labels['newmessageonly'] = 'მხოლოდ ახალი შეტყობინება';
+$labels['replyandforwardonly'] = 'მხოლოდ გადაგზავნის და პასუხის შემთხვევაში';
+$labels['replysignaturepos'] = 'მხოლოდ პასუხის ან გადაგზავნის შემთხვევაში გაყვეს ხელმოწერა';
+$labels['belowquote'] = 'ციტატის შემდეგ';
+$labels['abovequote'] = 'ციტატამდე';
+$labels['insertsignature'] = 'ხელმოცერის ჩასმა';
 $labels['folder'] = 'საქაღალდე';
 $labels['folders'] = 'საქაღალდეები';
 $labels['foldername'] = 'საქაღალდის დასახელება';
@@ -263,9 +274,6 @@ $labels['subscribed'] = 'გამოწერილია';
 $labels['messagecount'] = 'შეტყობინებები';
 $labels['create'] = 'შექმნა';
 $labels['createfolder'] = 'საქაღალდის შექმნა';
-$labels['rename'] = 'სახელის გადარქმევა';
-$labels['renamefolder'] = 'სახელის გადარქმევა საქაღალდისთვის';
-$labels['deletefolder'] = 'საქაღალდის წაშლა';
 $labels['managefolders'] = 'საქაღალდეების მართვა';
 $labels['specialfolders'] = 'სპეციალური საქაღალდე';
 $labels['sortby'] = 'დალაგება';
index d7a5b390b36eecb304c2732e786b44bf8db242bd..6e526b768f8a15c3bd32b0b69793f870ab19e625 100755 (executable)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | localization/ka_GE/messages.inc                                       |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -52,9 +52,7 @@ $messages['deletecontactconfirm'] = 'ნამდვილად გსურთ
 $messages['deletemessagesconfirm'] = 'ნამდვილად გსურთ მონიშნული შეტყობინებების წაშლა?';
 $messages['deletefolderconfirm'] = 'ნამდვილად გსურთ ამ საქაღალდის წაშლა?';
 $messages['purgefolderconfirm'] = 'ნამდვილად გსურთ ყველა შეტყობინების წაშლა აღნიშნულ საქაღალდეში?';
-$messages['foldercreating'] = 'საქაღალდის შექმნა...';
 $messages['folderdeleting'] = 'საქაღალდის წაშლა...';
-$messages['folderrenaming'] = 'საქაღალდის სახელის შეცვლა...';
 $messages['foldermoving'] = 'საქაღალდის გადატანა...';
 $messages['formincomplete'] = 'ყველა ველი არ არის შევსებული';
 $messages['noemailwarning'] = 'მიუთითეთ სწორი ელ–ფოსტის მისამართი';
@@ -88,7 +86,6 @@ $messages['movingmessage'] = 'შეტყობინების გადა
 $messages['receiptsent'] = 'წარმატებით გაიგზავნა';
 $messages['errorsendingreceipt'] = 'არ გაიგზავნა';
 $messages['nodeletelastidentity'] = 'წაშლა შეუძლებელია, ის თქვენთვის ერთადერთია';
-$messages['addsubfolderhint'] = 'საქაღალდე შეიქმნება როგორც ქვესაქაღალდე მონიშნულ საქაღალდეში';
 $messages['forbiddencharacter'] = 'საქაღალდის სახელი შეიცავს აკრძალულ სიმბოლოებს';
 $messages['selectimportfile'] = 'გთხოვთ მონიშნოთ ფაილი ასატვირთად';
 $messages['addresswriterror'] = 'მონიშნულ მისამართებში ჩაწერა შეუძლებელია';
@@ -101,9 +98,10 @@ $messages['editorwarning'] = 'რედაქტორის გადართ
 $messages['httpreceivedencrypterror'] = 'სერვერზე მოხდა შეცდომა. დაუყონებლივ დაუკავშირდით ადმინისტრატორს. <b>თქვენი შეტყობინება შესაძლოა ვერ გაიგზავნა.</b>';
 $messages['smtpconnerror'] = 'SMTP Error ($code): სერვერთან დაკავშირება ვერ მოხერხდა';
 $messages['smtpautherror'] = 'SMTP Error ($code): ავტორიზაციის შეცდომა';
-$messages['smtpfromerror'] = 'SMTP Error ($code): ვერ მიეთითა გამგზავნი "$from"';
-$messages['smtptoerror'] = 'SMTP Error ($code): ვერ დაემატა მიმღები "$to"';
+$messages['smtpfromerror'] = 'SMTP Error ($code): ვერ მიეთითა გამგზავნი "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP Error ($code): ვერ დაემატა მიმღები "$to" ($msg)';
 $messages['smtprecipientserror'] = 'SMTP Error: მიმღებთა ჩამონათვალის დამუშავება ვერ მოხერხდა';
 $messages['smtperror'] = 'SMTP Error: $msg';
+$messages['emailformaterror'] = 'ელ-ფოსტის მისამართი არასწორია $email';
 
 ?>
diff --git a/program/localization/kh_KH/labels.inc b/program/localization/kh_KH/labels.inc
new file mode 100644 (file)
index 0000000..75799a2
--- /dev/null
@@ -0,0 +1,343 @@
+<?php
+
+/*
++-----------------------------------------------------------------------+
+| language/kh_KH/labels.inc                                             |
+|                                                                       |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2008-2009, RoundQube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
+| Language: Khmer (ភាសាខ្មែរ)                                                                                                |
+| Resources: http://www.khmeros.info                                                                   |
+|                                                                                                                                              |
++-----------------------------------------------------------------------+
+| Author:  Mr. KOSAL SOVAN VISAL - <sal@sovanvisal.com>                 |
++-----------------------------------------------------------------------+
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'សូមស្វាគមន៍មកកាន់ $product';
+$labels['username'] = 'ឈ្មោះគណនី';
+$labels['password'] = 'ពាក្យសំងាត់';
+$labels['server'] = 'ម៉ាស៊ីនមេ';
+$labels['login'] = 'ចូលប្រើ';
+$labels['logout'] = 'ឈប់ប្រើ';
+$labels['mail'] = 'អ៊ីមែល';
+$labels['settings'] = 'កំនត់ការប្រើប្រាស់';
+$labels['addressbook'] = 'សៀវភៅអាសយដ្ឋាន';
+$labels['inbox'] = 'ប្រអប់សំបុត្រ';
+$labels['drafts'] = 'ពង្រៀង';
+$labels['sent'] = 'បានបញ្ជូន';
+$labels['trash'] = 'ធុងសំរាម';
+$labels['junk'] = 'អ៊ីមែលរំខាន';
+$labels['subject'] = 'កម្មវត្ថុ';
+$labels['from'] = 'អ្នកផ្ញើ';
+$labels['to'] = 'អ្នកទទួល';
+$labels['cc'] = 'ចំលង';
+$labels['bcc'] = 'ចំលងមើលមិនឃើញ';
+$labels['replyto'] = 'ឆ្លើយតបទៅកាន់';
+$labels['date'] = 'ថ្អៃ ខែ ឆ្នាំ';
+$labels['size'] = 'ទំហំ';
+$labels['priority'] = 'អទិភាព';
+$labels['organization'] = 'អង្គភាព';
+$labels['reply-to'] = 'ឆ្លើយតបទៅកាន់';
+$labels['mailboxlist'] = 'ថតឯកសារ';
+$labels['messagesfromto'] = 'សារពី $from ដល់ $to នៃ $count';
+$labels['threadsfromto'] = 'សាររួមពី $from ដល់ $to នៃ $count';
+$labels['messagenrof'] = 'សារ $nr នៃ $count';
+$labels['copy'] = 'ចំលង';
+$labels['move'] = 'ផ្តេរ';
+$labels['moveto'] = 'ផ្តេរទៅ';
+$labels['download'] = 'ទាញយក';
+$labels['filename'] = 'ឈ្មោះឯកសារ';
+$labels['filesize'] = 'ទំហំឯកសារ';
+$labels['addtoaddressbook'] = 'រក្សាទុកក្នុងសៀវភៅអាសយដ្ឋាន';
+$labels['sun'] = 'អា';
+$labels['mon'] = 'ច';
+$labels['tue'] = 'អ';
+$labels['wed'] = 'ព';
+$labels['thu'] = 'ព្រ';
+$labels['fri'] = 'ស';
+$labels['sat'] = 'ស';
+$labels['sunday'] = 'អាទិត្យ';
+$labels['monday'] = 'ច័ន្ទ';
+$labels['tuesday'] = 'អង្គារ';
+$labels['wednesday'] = 'ពុធ';
+$labels['thursday'] = 'ព្រហស្បតិ៍';
+$labels['friday'] = 'សុក្រ';
+$labels['saturday'] = 'សៅរ៍';
+$labels['jan'] = 'មករា';
+$labels['feb'] = 'កុម្ភះ';
+$labels['mar'] = 'មិនា';
+$labels['apr'] = 'មេសា';
+$labels['may'] = 'ឧសភា';
+$labels['jun'] = 'មិថុនា';
+$labels['jul'] = 'កក្កដា';
+$labels['aug'] = 'សីហា';
+$labels['sep'] = 'កញ្ញា';
+$labels['oct'] = 'តុលា';
+$labels['nov'] = 'វិច្ឆិកា';
+$labels['dec'] = 'ធ្នូ';
+$labels['longjan'] = 'មករា';
+$labels['longfeb'] = 'កុម្ភះ';
+$labels['longmar'] = 'មិនា';
+$labels['longapr'] = 'មេសា';
+$labels['longmay'] = 'ឧសភា';
+$labels['longjun'] = 'មិថុនា';
+$labels['longjul'] = 'កក្កដា';
+$labels['longaug'] = 'សីហា';
+$labels['longsep'] = 'កញ្ញា';
+$labels['longoct'] = 'តុលា';
+$labels['longnov'] = 'វិច្ឆិកា';
+$labels['longdec'] = 'ធ្នូ';
+$labels['today'] = 'ថ្ងៃនេះ';
+$labels['checkmail'] = 'ត្រួតពិនិត្យសារថ្មី';
+$labels['writenewmessage'] = 'សរសេរសារថ្មី';
+$labels['replytomessage'] = 'ឆ្លើយតបទៅផ្ញើ';
+$labels['replytoallmessage'] = 'ឆ្លើយតបទៅទាំងអស់គ្នា';
+$labels['forwardmessage'] = 'ផ្ញើបន្តរ';
+$labels['deletemessage'] = 'លុបសារចោល';
+$labels['movemessagetotrash'] = 'ផ្ទេរសារទៅក្នុងធុងសំរាម';
+$labels['printmessage'] = 'បោះពុម្ភសារ';
+$labels['previousmessage'] = 'បង្ហាញសារមុន';
+$labels['previousmessages'] = 'បង្ហាញកញ្ចប់សារមុន';
+$labels['firstmessage'] = 'បង្ហាញសារដំបូង';
+$labels['firstmessages'] = 'បង្ហាញកញ្ចប់សារដំបូង';
+$labels['nextmessage'] = 'បង្ហាញសារបន្ទាប់';
+$labels['nextmessages'] = 'បង្ហាញកញ្ចប់សារបន្ទាប់';
+$labels['lastmessage'] = 'បង្ហាញសារចុងក្រោយគេ';
+$labels['lastmessages'] = 'បង្ហាញកញ្ចប់សារចុងក្រោយ';
+$labels['backtolist'] = 'ត្រលប់ទៅតារាងសាររួម';
+$labels['viewsource'] = 'បង្ហាញ Source Code នៃសារ';
+$labels['markmessages'] = 'ដៅសំគាល់សារ';
+$labels['markread'] = 'បានអានរួច';
+$labels['markunread'] = 'មិនទាន់បានអាន';
+$labels['markflagged'] = 'ដាក់ទង់ជាតិរួច';
+$labels['markunflagged'] = 'មិនទាន់មានទង់ជាតិ';
+$labels['messageactions'] = 'បញ្ជារផ្សេងទៀត';
+$labels['select'] = 'ជ្រើសរើស';
+$labels['all'] = 'ទាំងអស់';
+$labels['none'] = 'គ្មាន';
+$labels['currpage'] = 'ទំព័រនេះ';
+$labels['unread'] = 'មិនទាន់អាន';
+$labels['flagged'] = 'មានទង់ជាតិ';
+$labels['unanswered'] = 'មិនទាន់ឆ្លើយតប';
+$labels['deleted'] = 'បានលុបរួច';
+$labels['invert'] = 'បញ្ច្រស់';
+$labels['filter'] = 'ច្រោះសារ';
+$labels['list'] = 'តារាង';
+$labels['threads'] = 'បណ្តុំសារ';
+$labels['expand-all'] = 'បង្ហាញទាំងអស់';
+$labels['expand-unread'] = 'បង្ហាញសារមិនទាន់អាន';
+$labels['collapse-all'] = 'បង្រួមទាំងអស់';
+$labels['threaded'] = 'ផ្គុំរួច';
+$labels['autoexpand_threads'] = 'បង្ហាញបណ្តំសារ';
+$labels['do_expand'] = 'បណ្តុំទាំងអស់';
+$labels['expand_only_unread'] = 'តែសារដែលមិនទាន់អាន';
+$labels['fromto'] = 'អ្នកផ្ញើ / អ្នកទទួល';
+$labels['flag'] = 'ទង់ជាតិ';
+$labels['attachment'] = 'ភ្ជាប់ឯកសារ';
+$labels['nonesort'] = 'គ្មាន';
+$labels['sentdate'] = 'ថ្ងៃផ្ញើ';
+$labels['arrival'] = 'ថ្ងៃទទួល';
+$labels['asc'] = 'ពីតូចទៅធំ';
+$labels['desc'] = 'ពីធំមកតូច';
+$labels['listcolumns'] = 'តារាងជួរឈ';
+$labels['listsorting'] = 'តំរៀបជួរឈ';
+$labels['listorder'] = 'លំដាប់នៃការតំរៀប';
+$labels['listmode'] = 'បង្ហាញជាតារាង';
+$labels['folderactions'] = 'កំនត់សកម្មភាពលើថត';
+$labels['compact'] = 'បង្រួម';
+$labels['empty'] = 'ទទេរ';
+$labels['purge'] = 'បំផ្លាញ';
+$labels['quota'] = 'ទំហំឌីស ដែលប្រើប្រាស់';
+$labels['unknown'] = 'មិនស្គាល់';
+$labels['unlimited'] = 'គ្មានកំនត់';
+$labels['quicksearch'] = 'ស្វែងរករហាស់';
+$labels['resetsearch'] = 'Reset ការស្វែងរក';
+$labels['searchmod'] = 'កែសំរួល';
+$labels['msgtext'] = 'អត្ថន័យសារ';
+$labels['openinextwin'] = 'បើកក្នុង Windows ថ្មី';
+$labels['emlsave'] = 'ទាញយកជា (.eml)';
+$labels['compose'] = 'សរសេរសារថ្មី';
+$labels['editasnew'] = 'កែតំរូវអោយដូចថ្មី';
+$labels['savemessage'] = 'រក្សាទុកសារពង្រៀង';
+$labels['sendmessage'] = 'ផ្ញើសារនេះ';
+$labels['addattachment'] = 'ភ្ជាប់ឯកសារ';
+$labels['charset'] = 'ស្តង់ដាអក្សរ';
+$labels['editortype'] = 'ប្រភេទ Editor';
+$labels['returnreceipt'] = 'លិខិតបញ្ជាក់ការត្រឡប់';
+$labels['checkspelling'] = 'ត្រួតពិនិត្យអក្សរ';
+$labels['resumeediting'] = 'បន្តរការកែតំរូវ';
+$labels['revertto'] = 'ត្រលប់ទៅ';
+$labels['attachments'] = 'ឯកសារបានភ្ជាប់';
+$labels['upload'] = 'បញ្ជូន';
+$labels['close'] = 'បិទ';
+$labels['messageoptions'] = 'កំនត់សារ';
+$labels['low'] = 'ទាប';
+$labels['lowest'] = 'ទាបបំផុត';
+$labels['normal'] = 'ធម្មតា';
+$labels['high'] = 'ខ្ពស់';
+$labels['highest'] = 'ខ្ពស់បំផុត';
+$labels['nosubject'] = '(គ្មានកម្មវត្ថុ)';
+$labels['showimages'] = 'បង្ហាញរូបភាព';
+$labels['alwaysshow'] = 'បង្ហាញរូបភាពជានិច្ច';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Plain Text';
+$labels['savesentmessagein'] = 'រក្សាសារដែលបានផ្ញើក្នុង';
+$labels['dontsave'] = 'កុំរក្សាទុក';
+$labels['maxuploadsize'] = 'ទំហំឯកសារធំបំផុតដែលអាចភ្ជាប់បានគឺ $size';
+$labels['addcc'] = 'បន្ថែម Cc';
+$labels['addbcc'] = 'បន្ថែម Bcc';
+$labels['addreplyto'] = 'បន្ថែម Reply-To';
+$labels['mdnrequest'] = 'The sender of this message has asked to be notified when you read this message. Do you wish to notify the sender?';
+$labels['receiptread'] = 'Return Receipt (read)';
+$labels['yourmessage'] = 'This is a Return Receipt for your message';
+$labels['receiptnote'] = 'Note: This receipt only acknowledges that the message was displayed on the recipient\'s computer. There is no guarantee that the recipient has read or understood the message contents.';
+$labels['name'] = 'ឈ្មោះនឹងត្រូវបង្ហាញ';
+$labels['firstname'] = 'នាមត្រកូល';
+$labels['surname'] = 'នាមខ្លួន';
+$labels['email'] = 'អ៊ីមែល';
+$labels['addcontact'] = 'បន្ថែមអាសយដ្ឋានទាក់ទង';
+$labels['editcontact'] = 'កែប្រែអាសយដ្ឋានទាក់ទង';
+$labels['contacts'] = 'អាសយដ្ឋានទាក់ទងទាំងអស់';
+$labels['edit'] = 'កែតំរូវ';
+$labels['cancel'] = 'លះបង់';
+$labels['save'] = 'រក្សារទុក';
+$labels['delete'] = 'លុបចោល';
+$labels['newcontact'] = 'បង្កើតអាសយដ្ឋានទាក់ទងថ្មី';
+$labels['deletecontact'] = 'លុបអាសយដ្ឋានទាក់ទងដែលបានរើសរួច';
+$labels['composeto'] = 'ផ្ញើសារទៅ';
+$labels['contactsfromto'] = 'អាសយដ្ឋានទាក់ទង $from ដល់ $to នៃ $count';
+$labels['print'] = 'បោះពុម្ភ';
+$labels['export'] = 'នាំចេញ';
+$labels['exportvcards'] = 'នាំចេញអាសយដ្ឋានទាក់ទងជាប្រភេទ vCard';
+$labels['newcontactgroup'] = 'បង្កើតក្រុមអាសយដ្ឋានទាក់ទង';
+$labels['groupactions'] = 'Actions សំរាប់ក្រុមអាសយដ្ឋានទាក់ទង';
+$labels['previouspage'] = 'បង្ហាញទំព័រមុន';
+$labels['firstpage'] = 'បង្ហាញទំព័រដំបូង';
+$labels['nextpage'] = 'បង្ហាញទំព័របន្ទាប់';
+$labels['lastpage'] = 'បង្ហាញទំព័រចុងក្រោយ';
+$labels['group'] = 'ក្រុម';
+$labels['groups'] = 'ក្រុមទាំងអស់';
+$labels['personaladrbook'] = 'អាសយដ្ឋានផ្ទាល់ខ្លួន';
+$labels['import'] = 'បញ្ចូល';
+$labels['importcontacts'] = 'បញ្ចូលអាសយដ្ឋានទាក់ទង';
+$labels['importfromfile'] = 'បញ្ចូលពី file:';
+$labels['importreplace'] = 'ផ្លាស់ប្តូរសៀវភៅអាសយដ្ឋានទាំងស្រុង';
+$labels['importtext'] = 'អ្នកអាច upload អាសយដ្ឋានទាក់ទងពីសៀវភៅដែលមានស្រាប់​ ។<br/>We currently support importing addresses from the <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> data format.';
+$labels['done'] = 'រួចរាល់';
+$labels['settingsfor'] = 'Settings សំរាប់';
+$labels['preferences'] = 'Preferences';
+$labels['userpreferences'] = 'User preferences';
+$labels['editpreferences'] = 'កែប្រែ User preferences';
+$labels['identities'] = 'អត្តសាញ្ញាណ';
+$labels['manageidentities'] = 'គ្រប់គ្រងអត្តសាញ្ញាណ';
+$labels['newidentity'] = 'អត្តសាញ្ញាណថ្មី';
+$labels['newitem'] = 'Item ថ្មី';
+$labels['edititem'] = 'កែប្រែ Item';
+$labels['preferhtml'] = 'បង្ហាញ HTML';
+$labels['defaultcharset'] = 'Default Character Set';
+$labels['htmlmessage'] = 'សារប្រភេទ HTML';
+$labels['prettydate'] = 'Pretty dates';
+$labels['setdefault'] = 'Set default';
+$labels['autodetect'] = 'ស្វ័យប្រវត្តិ';
+$labels['language'] = 'ភាសា';
+$labels['timezone'] = 'ល្វែងម៉ោង';
+$labels['pagesize'] = 'ចំនួនសារក្នុងមួយទំព័រ';
+$labels['signature'] = 'ហត្ថលេខា';
+$labels['dstactive'] = 'Daylight saving time';
+$labels['htmleditor'] = 'បង្កើត HTML messages';
+$labels['htmlsignature'] = 'ហត្ថលេខាជាលក្ខណះ HTML';
+$labels['previewpane'] = 'បង្ហាញប្រអប់អានសារ';
+$labels['skin'] = 'Interface skin';
+$labels['logoutclear'] = 'សំអាតធុងសំរាមពេលឈប់ប្រើ';
+$labels['logoutcompact'] = 'បង្រួមប្រអប់សារពេលឈប់ប្រើ';
+$labels['uisettings'] = 'User Interface';
+$labels['serversettings'] = 'Server Settings';
+$labels['mailboxview'] = 'Mailbox View';
+$labels['mdnrequests'] = 'Sender notifications';
+$labels['askuser'] = 'ask the user';
+$labels['autosend'] = 'ផ្ញើស្វ័យប្រវត្តិ';
+$labels['ignore'] = 'ទុកចោល';
+$labels['readwhendeleted'] = 'Mark the message as read on delete';
+$labels['flagfordeletion'] = 'Flag the message for deletion instead of delete';
+$labels['skipdeleted'] = 'កុំបង្ហាញសារដែលបានលុបចោល';
+$labels['deletealways'] = 'បើសិនជាផ្ទេទៅធុងសំរាមមិនបានសំរេច នោះលុបសារចោលទៅ';
+$labels['showremoteimages'] = 'បង្ហាញរូបដែលគេផ្ញើមក';
+$labels['fromknownsenders'] = 'ពីអ្នកផ្ញើដែលស្គាល់';
+$labels['always'] = 'គ្រប់ពេល';
+$labels['showinlineimages'] = 'បង្ហាញរូបភាពនៅក្រោមសារ';
+$labels['autosavedraft'] = 'រក្សារសារពង្រៀងស្វួ័យប្រវត្តិ';
+$labels['everynminutes'] = 'រៀងរាល់ $n នាទី';
+$labels['keepalive'] = 'ត្រួតពិនិត្យរកមើលសារថ្មីនៅ';
+$labels['never'] = 'មិនដែល';
+$labels['immediately'] = 'ភ្លាមៗ';
+$labels['messagesdisplaying'] = 'កំពុងបង្ហាញសារ';
+$labels['messagescomposition'] = 'កំពុងបង្កើតសារ';
+$labels['mimeparamfolding'] = 'ឈ្មោះឯកសារភ្ជាប់';
+$labels['2231folding'] = 'Full RFC 2231 (Thunderbird)';
+$labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
+$labels['2047folding'] = 'Full RFC 2047 (other)';
+$labels['force7bit'] = 'ប្រើការបំលែង MIME សំរាប់ 8-bit characters';
+$labels['advancedoptions'] = 'ការកំនត់ផ្សេងៗ';
+$labels['focusonnewmessage'] = 'ផ្តោតលើ Browser window សំរាប់សារថ្មី';
+$labels['checkallfolders'] = 'ត្រួតគ្រប់ថតសំរាប់សារថ្មី';
+$labels['displaynext'] = 'បន្ទាប់ពីសារលុប​ ឬផ្ទេរ បង្ហាញសារបន្ទាប់';
+$labels['mainoptions'] = 'ការកំនត់គោល';
+$labels['section'] = 'ផ្នែក';
+$labels['maintenance'] = 'ការថែរក្សា';
+$labels['newmessage'] = 'សារថ្មី';
+$labels['listoptions'] = 'កំនត់តារាង';
+$labels['signatureoptions'] = 'កំនត់ហត្ថលេខា';
+$labels['whenreplying'] = 'នៅពេលឆ្លើយតប';
+$labels['replytopposting'] = 'ចាប់ផ្តើម​សារ​ពី​លើ​សារ​ដើម';
+$labels['replybottomposting'] = 'ចាប់ផ្តើមសារពីក្រោមសារដើម';
+$labels['replyremovesignature'] = 'នៅ​ពេល​ឆ្មើយ​តប​លុប​ហត្ថលេខា​ចេញ​ពីសារ';
+$labels['autoaddsignature'] = 'ដាក់ហត្តលេខាដោយស្វ័យប្រវត្តិ';
+$labels['newmessageonly'] = 'សំរាប់សារថ្មីតែប៉ុណ្ណោះ';
+$labels['replyandforwardonly'] = 'ឆើ្លយតប​ និង ផ្ញើបន្តតែ​ប៉ុណ្ណោះ';
+$labels['replysignaturepos'] = 'នៅពេលឆើ្លយតប​ និង ផ្ញើបន្ត​ដាក់ហត្តលេខា';
+$labels['belowquote'] = 'ពីក្រោមសម្រង់ពាក្យ';
+$labels['abovequote'] = 'ពីលើសម្រង់ពាក្យ';
+$labels['insertsignature'] = 'បញ្ចូល Signature';
+$labels['previewpanemarkread'] = 'ដាក់សារ​ដែល​បាន​បង្ហាញ​​ជា​សារ​បាន​អាន​រួច';
+$labels['afternseconds'] = 'ក្រោយពី $n វិនាទី';
+$labels['folder'] = 'ថត';
+$labels['folders'] = 'ថតទាំងអស់';
+$labels['foldername'] = 'ឈ្មោះ Folder';
+$labels['subscribed'] = 'ភ្ជាប់ជាប្រចាំ';
+$labels['messagecount'] = 'សារ';
+$labels['create'] = 'បង្កើត';
+$labels['createfolder'] = 'បង្កើត Folder ថ្មី';
+$labels['managefolders'] = 'រៀបចំថត';
+$labels['specialfolders'] = 'ថតពិសេស';
+$labels['sortby'] = 'តំរៀបតាម';
+$labels['sortasc'] = 'តំរៀបពីតូចទៅធំ';
+$labels['sortdesc'] = 'តំរៀបពីធំទៅតូច';
+$labels['B'] = 'B';
+$labels['KB'] = 'KB';
+$labels['MB'] = 'MB';
+$labels['GB'] = 'GB';
+$labels['unicode'] = 'យូនីកូដ';
+$labels['english'] = 'អង់គ្លេស';
+$labels['westerneuropean'] = 'អឺរ៉ុបខាងលិច';
+$labels['easterneuropean'] = 'អីរ៉ុបខាងកើត';
+$labels['southeasterneuropean'] = 'អឺរ៉ុបភាគអាគ្នេយ៍';
+$labels['baltic'] = 'បាល់តិក';
+$labels['cyrillic'] = 'ស៊ីរីលិក';
+$labels['arabic'] = 'អារ៉ាប់';
+$labels['greek'] = 'ក្រិក';
+$labels['hebrew'] = 'ហ៊ីបប្រ៊ូ';
+$labels['turkish'] = 'ភាសាទកគី';
+$labels['nordic'] = 'ណរឌីក';
+$labels['thai'] = 'សៀម';
+$labels['celtic'] = 'សេលតិច';
+$labels['vietnamese'] = 'វៀតណាម';
+$labels['japanese'] = 'ជប៉ុន';
+$labels['korean'] = 'កូរ៉េ';
+$labels['chinese'] = 'ចិន';
+
+?>
diff --git a/program/localization/kh_KH/messages.inc b/program/localization/kh_KH/messages.inc
new file mode 100644 (file)
index 0000000..9d67d9d
--- /dev/null
@@ -0,0 +1,115 @@
+<?php
+
+/*
++-----------------------------------------------------------------------+
+| language/kh_KH/messages.inc                                           |
+|                                                                       |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2008-2009, RoundQube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
+| Language: Khmer (ភាសាខ្មែរ)                                                    |
+| Resources: http://www.khmeros.info                                    |
+|                                                                                                                                              |
++-----------------------------------------------------------------------+
+| Author:  Mr. KOSAL SOVAN VISAL - <sal@sovanvisal.com>                 |
++-----------------------------------------------------------------------+
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'ការចូលប្រើមិនបានសំរេច';
+$messages['cookiesdisabled'] = 'Browser នេះមិនទទួលយក Cookies ទេ';
+$messages['sessionerror'] = 'ពេលវេលាប្រើប្រាស់របស់អ្នកមិនត្រឹមត្រូវ ឬ ផុតកំណត់';
+$messages['imaperror'] = 'ការភ្ជាប់ទៅកាន់ IMAP Server មិនបានសំរេច';
+$messages['servererror'] = 'Server មានបញ្ហា';
+$messages['invalidrequest'] = 'ការទាមទាមិនត្រឹមត្រូវ! គ្មានទិន្នន័យត្រូវបានថតទុកទេ';
+$messages['nomessagesfound'] = 'អត់មានសារក្នុងប្រអប់សំបុត្រនេះទេ';
+$messages['loggedout'] = 'អ្នកបានបញ្ឈប់ការប្រើប្រាស់ដោយជោគជ័យ ។ សូមអោយមានសំណាងល្អ!';
+$messages['mailboxempty'] = 'ប្រអប់សំបុត្រទទេ';
+$messages['loading'] = 'កំពុងធ្វើការ...';
+$messages['uploading'] = 'បញ្ជូនឯកសារ...';
+$messages['loadingdata'] = 'កំពុងបើកឯកសារ...';
+$messages['checkingmail'] = 'រកមើលសារថ្មី៝ៗ...';
+$messages['sendingmessage'] = 'ផ្ញើសារ...';
+$messages['messagesent'] = 'សារត្រូវបានបញ្ជូនដោយជោគជ័យ!';
+$messages['savingmessage'] = 'កំពុងរក្សាសារទុក...';
+$messages['messagesaved'] = 'សារត្រូវបានរក្សាទុកក្នុងថត Drafts';
+$messages['successfullysaved'] = 'រក្សាទុកដោយជោគជ័យ';
+$messages['addedsuccessfully'] = 'អាស័យដ្ឋានត្រូវបានរក្សាទុកដោយជោគជ័យ';
+$messages['contactexists'] = 'ពត៌មានទាក់ទងដែលមានអ៊ីមែលនេះ មានក្នុងសៀវភៅអាសយដ្ឋានរួចហើយ';
+$messages['blockedimages'] = 'ដើម្បីការពារភាពឯកជនរបស់អ្នក រូបភាពដែលមានក្នុងសារនេះត្រូវបានបិទ ។';
+$messages['encryptedmessage'] = 'នេះគឺជាសារដែលបានចាក់សោរសំងាត់ ហើយមិនអាចបង្ហាញបានទេ ។ សូមអភ័យទោស!';
+$messages['nocontactsfound'] = 'គ្មានពត៌មានទំនាក់ទំនង';
+$messages['contactnotfound'] = 'រកពត៌មានទំនាក់ទំនងដែលអ្នកស្វែងរកនោះ មិនឃើញទេ';
+$messages['sendingfailed'] = 'ការផ្ញើសារមិនបានសំរេច';
+$messages['senttooquickly'] = 'សូមរងចាំ $sec វិនាទី មុននឹងផ្ញើសារនេះ';
+$messages['errorsavingsent'] = 'មានបញ្ហាកើតឡើងក្នុងពេលរក្សាទុកសារដែលបានផ្ញើរួច';
+$messages['errorsaving'] = 'មានបញ្ហាកើតឡើងក្នងពេលរក្សាទុក';
+$messages['errormoving'] = 'មិនអាចផ្ទេរសារបានទេ';
+$messages['errorcopying'] = 'មិនអាចចំលងសារបានទេ';
+$messages['errordeleting'] = 'មិនអាចលុបសារចោលបានទេ';
+$messages['errormarking'] = 'មិនអាចគូសចំណាំលើសារបានទេ';
+$messages['deletecontactconfirm'] = 'តើអ្នកពិតជាចង់លុបពត៌មានទំនាក់ទំនងនេះមែនទេ?';
+$messages['deletemessagesconfirm'] = 'តើអ្នកពិតជាចង់លុបសារនេះមែនទេ?';
+$messages['deletefolderconfirm'] = 'តើអ្នកពិតជាចង់លុបថតនេះមែនទេ?';
+$messages['purgefolderconfirm'] = 'តើអ្នកពិតជាចង់លុបសារទាំងអស់មែនទេ?';
+$messages['folderdeleting'] = 'កំពុងលុបថតសំរាប់ទុកឯកសារ...';
+$messages['foldermoving'] = 'កំពុងផ្តេរថតសំរាប់ទុកឯកសារ...';
+$messages['formincomplete'] = 'ទំរង់នេះមិនទាន់ពេញលេញនៅឡើយទេ';
+$messages['noemailwarning'] = 'សូមវាយបញ្ចូលអ៊ីមែលរបស់អ្នក';
+$messages['nonamewarning'] = 'សូមបញ្ចូលឈ្មោះរបស់អ្នក';
+$messages['nopagesizewarning'] = 'សូមកំនត់ទំហំទំព័រ';
+$messages['nosenderwarning'] = 'សូមបញ្ចូលអ៊ីមែលអ្នកផ្ញើ';
+$messages['norecipientwarning'] = 'សូមបញ្ចូលយ៉ាងហោចណាស់នរណាម្នាក់ដែលត្រូវផ្ញើទៅ';
+$messages['nosubjectwarning'] = 'គ្មានកម្មវត្ថុ តើអ្នកចង់ដាក់កម្មវត្ថុទេ?';
+$messages['nobodywarning'] = 'ផ្ញើសារនេះដោយគ្មានអត្ថន័យអ្វីសោះ?';
+$messages['notsentwarning'] = 'សារនេះមិនទាន់បានផ្ញើ ។ តើអ្នកចង់លុបចោលទេ?';
+$messages['noldapserver'] = 'សូមជ្រើសរើស LDAP Server ដើម្បីស្វែងរក';
+$messages['nocontactsreturned'] = 'រកមិនឃើញពត៌មានទំនាក់ទំនងណាមួយទេ';
+$messages['nosearchname'] = 'សូមបញ្ចូលឈ្មោះ ឬ អាសយដ្ឋានអ៊ីមែល';
+$messages['notuploadedwarning'] = 'ឯកសារទាំងអស់មិនទាន់បញ្ជូនរួចរាល់ទេ ។ សូមមេត្តារងចាំបន្តិច ឬបោះបង់ការបញ្ជុននេះ!';
+$messages['searchsuccessful'] = 'រកឃើញសារចំនួន $nr ';
+$messages['searchnomatch'] = 'រកមិនឃើញអ្វីទាំងអស់';
+$messages['searching'] = 'កំពុកស្វែងរក...';
+$messages['checking'] = 'កំពុងត្រួតពិនិត្យ...';
+$messages['nospellerrors'] = 'គ្មានកំហុសអក្ខរាវិរុទ្ធទេ';
+$messages['folderdeleted'] = 'លុប Folder បានជោគជ័យ';
+$messages['deletedsuccessfully'] = 'លុបបានដោយជោគជ័យ';
+$messages['converting'] = 'កំពុងលុបការតុបតែងចោល...';
+$messages['messageopenerror'] = 'មិនអាចទាញយកសារពី Server បានទេ';
+$messages['fileuploaderror'] = 'ការបញ្ជូលឯកសារបរាជ័យ';
+$messages['filesizeerror'] = 'ទំហំឯកសារត្រូវបញ្ជូនលើសចំណុះ ទំហំធំបំផុតគឺ $size';
+$messages['copysuccess'] = 'បានចំលងអាសយដ្ឋានចំនួន $nr ដោយជោគជ័យ';
+$messages['copyerror'] = 'មិនអាចចំលងអាសយដ្ឋានណាមួយឡើយ';
+$messages['sourceisreadonly'] = 'ប្រភពនៃអាសយដ្ឋាននេះអាចបានត្រឹមតែអានប៉ុណ្ណោះ';
+$messages['errorsavingcontact'] = 'មិនអាចរក្សាអាសយដ្ឋានបានទេ';
+$messages['movingmessage'] = 'កំពុកផ្តេរសារ...';
+$messages['copyingmessage'] = 'កំពុងចំលងសារ...';
+$messages['receiptsent'] = 'ការបញ្ជូន read receipt បានសំរេច';
+$messages['errorsendingreceipt'] = 'មិនអាចបញ្ជុន receipt ទេ';
+$messages['nodeletelastidentity'] = 'អ្នកមិនអាចលុបអត្តសញ្ញាណនេះទេ ព្រោះវានៅសល់ចុងក្រោយគេ';
+$messages['forbiddencharacter'] = 'ឈ្មោះ Folder នេះមានអក្សរដែលត្រូវហាមឃាត់';
+$messages['selectimportfile'] = 'សូមជ្រើសរើសឯកសារដើម្បីផ្ញើ';
+$messages['addresswriterror'] = 'សៀវភៅអាសយដ្ឋាននោះមិនអាចសរសេរចូលបានទេ';
+$messages['contactaddedtogroup'] = 'បានដាក់ពត៌មានទំនាក់ទំនងចូលក្នុងក្រុមដោយជោគជ័យ';
+$messages['contactremovedfromgroup'] = 'បានលុបពត៌មានទំនាក់ទំនងចូលក្នុងក្រុមដោយជោគជ័យ';
+$messages['importwait'] = 'កំពុងទាញចូល សូមមេត្តារង់ចាំ...';
+$messages['importerror'] = 'ការទាញចូលមិនបានសំរេច! ឯកសារដែលជ្រើសរើសនោះមិនមែនជា vCard ត្រឹមត្រូវ ។';
+$messages['importconfirm'] = '<b>បានបញ្ចូលដោយជោគជ័យនូវពត៌មានទំនាក់ទំនង $inserted, ហើយពត៌មានដែលមានស្រាប់ត្រូវបានរំលងចោលដូចជា $skipped </b>:<p><em>$names</em></p>';
+$messages['opnotpermitted'] = 'ប្រតិ្តបត្តិការមិនត្រូវបានហាមឃាត់!';
+$messages['nofromaddress'] = 'ខ្វះអាសយដ្ឋានអ៊ីមែលក្នុងអត្តសញ្ណាណមួយនេះ';
+$messages['editorwarning'] = 'ប្តូរទៅទំរង់ Plain text អ្នកនឹងបាត់បង់ទំរង់ដែលអ្នកកំពុងប្រើនេះ។ អ្នកចង់ប្តូរទេ?';
+$messages['httpreceivedencrypterror'] = 'ការកំនត់លើប្រព័ន្ធដំណើរការមិនប្រកតី។ សូមទាក់ទងទៅកាន់អ្នកបច្ចេកទេសជាបន្ទាន់។ <br>សាររបស់អ្នកមិនអាចផ្ញើទេក្នុងពេលនេះ<br>';
+$messages['smtpconnerror'] = 'SMTP Error ($code): មិនអាចភ្ជាប់ទៅ Server';
+$messages['smtpautherror'] = 'SMTP Error ($code): ពត៌មានគនីយមិនត្រឹមត្រូវ';
+$messages['smtpfromerror'] = 'SMTP Error ($code): មិនអាចកំនត់អ្នកផ្ញើ "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP Error ($code): មិនអាចកំនត់អ្នកទទួល "$to" ($msg)';
+$messages['smtprecipientserror'] = 'SMTP Error: មិនអាចបំលែងបញ្ជីអ្នកទទួលបានទេ';
+$messages['smtperror'] = 'SMTP Error: $msg';
+$messages['emailformaterror'] = 'អាសយដ្ឋានអ៊ីមែលមិនត្រឹមត្រូវទេ: $email';
+$messages['toomanyrecipients'] = 'ចំនួនអ្នកទទួលច្រើនលើសកំនត់! សូមមេត្តាលុបចោលខ្លះ។';
+$messages['maxgroupmembersreached'] = 'ចំនួនក្រុមលើសកំនត់ហើយ ចំនួនច្រើនបំផុតគឺ $max';
+$messages['internalerror'] = 'មានបញ្ហាខាងក្នុងប្រព័ន្ធ ។ សូមព្យាយាមម្តងទៀត!';
+
+?>
index 370cebe1c5720aee3ae10e3b3b5c347cd9dc4890..2d999d38af8b0845a00cd2f1a501d7bb44217ed4 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | localization/kr/labels.inc                                            |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: lordmiss <lordmiss@lordmiss.com>                              |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 560 2007-05-17 15:01:26Z thomasb $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -250,9 +250,6 @@ $labels['subscribed'] = '가입됨';
 $labels['messagecount'] = '메시지';
 $labels['create'] = '만들기';
 $labels['createfolder'] = '새 폴더 만들기';
-$labels['rename'] = '이름 바꾸기';
-$labels['renamefolder'] = '폴더 이름 바꾸기';
-$labels['deletefolder'] = '폴더 지우기';
 $labels['managefolders'] = '폴더 관리';
 $labels['specialfolders'] = '특수 폴더';
 $labels['sortby'] = '정렬';
index 957eadfac7138aca40da5e197551b1a4c1869898..08ba3612e468c72cad6d712de60831c6b7f3d069 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | localization/kr/messages.inc                                            |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: lordmiss <lordmiss@lordmiss.com>                              |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 560 2007-05-17 15:01:26Z thomasb $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -49,9 +49,7 @@ $messages['deletecontactconfirm'] = '정말 선택한 연락처들을 삭제하
 $messages['deletemessagesconfirm'] = '정말 선택한 메일들을 삭제하시겠습니까?';
 $messages['deletefolderconfirm'] = '정말 이 폴더를 삭제하시겠습니까?';
 $messages['purgefolderconfirm'] = '정말 이 폴더의 모든 메일을 삭제하시겠습니까?';
-$messages['foldercreating'] = '폴더 만드는 중...';
 $messages['folderdeleting'] = '폴더 지우는 중...';
-$messages['folderrenaming'] = '폴더 이름 바꾸는 중...';
 $messages['foldermoving'] = '폴더 옮기는 중...';
 $messages['formincomplete'] = '양식을 완전히 채우지 않았습니다';
 $messages['noemailwarning'] = '유효한 이메일 주소를 넣어주십시오';
@@ -84,7 +82,6 @@ $messages['movingmessage'] = '메시지 이동 중...';
 $messages['receiptsent'] = '메일 읽음 확인을 보냈습니다';
 $messages['errorsendingreceipt'] = '읽음 확인을 보낼 수 없습니다';
 $messages['nodeletelastidentity'] = '이 정보는 마지막 남은 것이므로 지울 수 없습니다';
-$messages['addsubfolderhint'] = '이 폴더는 현재 선택된 폴더의 서브 폴더로 만들어질 것입니다';
 $messages['forbiddencharacter'] = '폴더 이름에 쓸 수 없는 문자가 포함되어 있습니다';
 $messages['selectimportfile'] = '업로드할 파일을 선택하세요';
 $messages['addresswriterror'] = '선택한 주소록은 쓸 수 없습니다';
index bc9e8216aefaa6a05f16014b16cc4830b5609f02..699e374191066da36c05c507c1bd67627545d552 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | language/ku/labels.inc                                                |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2006, RoundQube Dev. - Switzerland                      |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2006, Roundcube Dev. - Switzerland                      |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -177,9 +177,6 @@ $labels['subscribed'] = 'Ni şanenav';
 $labels['messagecount'] = 'Peyam';
 $labels['create'] = 'Biafirîne';
 $labels['createfolder'] = 'Peldankeke nû biafirîne';
-$labels['rename'] = 'Nav biguherîne';
-$labels['renamefolder'] = 'Navê peldankê biguherîne';
-$labels['deletefolder'] = 'Peldankê jê bibe';
 $labels['managefolders'] = 'Rêveberiya peldankan';
 $labels['sortby'] = 'Şêweyê rêzkirinê';
 $labels['sortasc'] = 'Wekî zêde dibe';
index fe1ca32604e0ab14d56269bc14c211f043d9b3f5..d5d2e018a1880a67fdb58542b41f1bb9c6313c8b 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | language/ku/messages.inc                                              |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2006, RoundQube Dev. - Switzerland                      |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2006, Roundcube Dev. - Switzerland                      |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -74,6 +74,5 @@ $messages['movingmessage'] = 'Ciyê peyamê tê guhertin...';
 $messages['receiptsent'] = 'Rapora şandina serkeftî';
 $messages['errorsendingreceipt'] = 'Rapor nehat şandin';
 $messages['nodeletelastidentity'] = 'Nikarî vê nasnameyê jê bibî. Ew ya dawî ye.';
-$messages['addsubfolderhint'] = 'Ev peldank wê wekî binepeldanka ya heyî bê afirandin';
 
 ?>
index 55a3acbbcbaf2447e9b1857397c2662822fa2b41..22f0761a11958d1382b8b8df49cf24599067e737 100644 (file)
@@ -5,21 +5,22 @@
 +-----------------------------------------------------------------------+
 | language/lt_LT/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Martynas Bendorius <martynas@evanet.lt>                       |
+| Authors: Martynas Bendorius <martynas@evanet.lt>                      |
+|          Rimas Kudelis <rq@akl.lt>                                    |
 +-----------------------------------------------------------------------+'
 
-@version $Id: labels.inc 2891 2009-08-29 18:56:48Z yllar $
+@version $Id: labels.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
 $labels = array();
-$labels['welcome'] = 'Sveiki atvykę į $product';
-$labels['username'] = 'Vartotojas';
+$labels['welcome'] = 'Sveiki! Čia $product';
+$labels['username'] = 'Naudotojo vardas';
 $labels['password'] = 'Slaptažodis';
 $labels['server'] = 'Serveris';
 $labels['login'] = 'Prisijungti';
@@ -27,32 +28,33 @@ $labels['logout'] = 'Atsijungti';
 $labels['mail'] = 'El. paštas';
 $labels['settings'] = 'Nustatymai';
 $labels['addressbook'] = 'Adresų knyga';
-$labels['inbox'] = 'Gauti';
+$labels['inbox'] = 'Gauti laiškai';
 $labels['drafts'] = 'Juodraščiai';
-$labels['sent'] = 'Išsiųsti';
-$labels['trash'] = 'Šiukšliadėžė';
-$labels['junk'] = 'Nereikalingi';
+$labels['sent'] = 'Išsiųsti laiškai';
+$labels['trash'] = 'Šiukšlinė';
+$labels['junk'] = 'Brukalas';
 $labels['subject'] = 'Tema';
 $labels['from'] = 'Siuntėjas';
 $labels['to'] = 'Gavėjas';
 $labels['cc'] = 'Kopija';
-$labels['bcc'] = 'Bcc';
-$labels['replyto'] = 'Atsakyti į';
+$labels['bcc'] = 'Slaptoji kopija';
+$labels['replyto'] = 'Atsakymą gaus';
+$labels['followupto'] = 'Followup-To';
 $labels['date'] = 'Data';
 $labels['size'] = 'Dydis';
-$labels['priority'] = 'Svarbumas';
+$labels['priority'] = 'Prioritetas';
 $labels['organization'] = 'Organizacija';
-$labels['reply-to'] = 'Atsakyti į';
+$labels['readstatus'] = 'Neskaitytas';
 $labels['mailboxlist'] = 'Aplankai';
 $labels['messagesfromto'] = 'Laiškai nuo $from iki $to iš $count';
+$labels['threadsfromto'] = 'Gijos nuo $from iki $to iš $count';
 $labels['messagenrof'] = 'Laiškas $nr iš $count';
-$labels['moveto'] = 'perkelti į ...';
+$labels['copy'] = 'Kopijuoti';
+$labels['move'] = 'Perkelti';
+$labels['moveto'] = 'Perkelti į…';
 $labels['download'] = 'Parsisiųsti';
-$labels['filename'] = 'Bylos vardas';
-$labels['filesize'] = 'Bylos dydis';
-$labels['preferhtml'] = 'Rodyti HTML';
-$labels['htmlmessage'] = 'HTML Laiškas';
-$labels['prettydate'] = 'Gražios datos';
+$labels['filename'] = 'Failo vardas';
+$labels['filesize'] = 'Failo dydis';
 $labels['addtoaddressbook'] = 'Įtraukti į adresų knygą';
 $labels['sun'] = 'Sek';
 $labels['mon'] = 'Pir';
@@ -75,11 +77,11 @@ $labels['apr'] = 'Bal';
 $labels['may'] = 'Geg';
 $labels['jun'] = 'Bir';
 $labels['jul'] = 'Lie';
-$labels['aug'] = 'Rugp';
-$labels['sep'] = 'Rugs';
-$labels['oct'] = 'Spa';
+$labels['aug'] = 'Rgp';
+$labels['sep'] = 'Rgs';
+$labels['oct'] = 'Spl';
 $labels['nov'] = 'Lap';
-$labels['dec'] = 'Gruo';
+$labels['dec'] = 'Grd';
 $labels['longjan'] = 'Sausis';
 $labels['longfeb'] = 'Vasaris';
 $labels['longmar'] = 'Kovas';
@@ -93,13 +95,15 @@ $labels['longoct'] = 'Spalis';
 $labels['longnov'] = 'Lapkritis';
 $labels['longdec'] = 'Gruodis';
 $labels['today'] = 'Šiandien';
-$labels['checkmail'] = 'Tikrinti ar nėra naujų laiškų';
+$labels['checkmail'] = 'Tikrinti, ar yra naujų laiškų';
 $labels['writenewmessage'] = 'Rašyti naują laišką';
-$labels['replytomessage'] = 'Atsakyti į lašką';
-$labels['replytoallmessage'] = 'Atsakyti visiems';
+$labels['replytomessage'] = 'Atsakyti siuntėjui';
+$labels['replytoallmessage'] = 'Atsakyti el. pašto grupei arba laiško siuntėjui ir visiems jo gavėjams';
+$labels['replyall'] = 'Atsakyti visiems';
+$labels['replylist'] = 'Atsakyti el. pašto grupei';
 $labels['forwardmessage'] = 'Persiųsti laišką';
-$labels['deletemessage'] = 'Ištrinti laišką';
-$labels['movemessagetotrash'] = 'Perkelti laišką į šiukšliadėžę';
+$labels['deletemessage'] = 'Pašalinti laišką';
+$labels['movemessagetotrash'] = 'Perkelti laišką į šiukšlinę';
 $labels['printmessage'] = 'Atspausdinti laišką';
 $labels['previousmessage'] = 'Rodyti ankstesnį laišką';
 $labels['previousmessages'] = 'Rodyti ankstesius laiškus';
@@ -110,152 +114,212 @@ $labels['nextmessages'] = 'Rodyti tolesnius laiškus';
 $labels['lastmessage'] = 'Rodyti paskutinį laišką';
 $labels['lastmessages'] = 'Rodyti paskutinius laiškus';
 $labels['backtolist'] = 'Grižti į laiškų sarašą';
-$labels['viewsource'] = 'Rodyti šaltinį';
+$labels['viewsource'] = 'Rodyti pirminį tekstą';
 $labels['markmessages'] = 'Pažymėti laiškus';
-$labels['markread'] = 'Kaip perskaitytus';
-$labels['markunread'] = 'Kaip neperskaitytus';
-$labels['markflagged'] = 'Kaip pažymėtą';
-$labels['markunflagged'] = 'Kaip nepažymėtą';
-$labels['messageactions'] = 'Daugiau veiksmų';
+$labels['markread'] = 'Kaip skaitytus';
+$labels['markunread'] = 'Kaip neskaitytus';
+$labels['markflagged'] = 'Pažymėti gairele';
+$labels['markunflagged'] = 'Pašalinti gairelę';
+$labels['messageactions'] = 'Daugiau veiksmų';
 $labels['select'] = 'Pažymėti';
-$labels['all'] = 'Visus';
-$labels['none'] = 'Nieko';
-$labels['unread'] = 'Neskaitytas';
-$labels['flagged'] = 'Pažymėtas';
-$labels['unanswered'] = 'Neatsakytas';
-$labels['deleted'] = 'Pašalintas';
-$labels['invert'] = 'Invertuoti';
-$labels['filter'] = 'Filtruoti';
+$labels['all'] = 'visus';
+$labels['none'] = 'nieko';
+$labels['currpage'] = 'matomus šiame puslapyje';
+$labels['unread'] = 'neskaitytus';
+$labels['flagged'] = 'su gairele';
+$labels['unanswered'] = 'neatsakytus';
+$labels['deleted'] = 'pašalintus';
+$labels['invert'] = 'invertuoti';
+$labels['filter'] = 'Rodyti';
+$labels['list'] = 'Sąrašas';
+$labels['threads'] = 'Gijos';
+$labels['expand-all'] = 'išskleisti visas';
+$labels['expand-unread'] = 'išskleisti turinčias neskaitytų laiškų';
+$labels['collapse-all'] = 'suskleisti visas';
+$labels['threaded'] = 'Rodyti gijas';
+$labels['autoexpand_threads'] = 'Išskleisti gijas';
+$labels['do_expand'] = 'visas';
+$labels['expand_only_unread'] = 'tik turinčias neskaitytų laiškų';
+$labels['fromto'] = 'Siuntėjas/Gavėjas';
+$labels['flag'] = 'Gairelė';
+$labels['attachment'] = 'Priedas';
+$labels['nonesort'] = 'Nerūšiuoti';
+$labels['sentdate'] = 'Išsiuntimo laikas';
+$labels['arrival'] = 'Gavimo laikas';
+$labels['asc'] = 'didėjančiai';
+$labels['desc'] = 'mažėjančiai';
+$labels['listcolumns'] = 'Stulpelių sąrašas';
+$labels['listsorting'] = 'Stulpelis rikiavimui';
+$labels['listorder'] = 'Rikiavimo tvarka';
+$labels['listmode'] = 'Sąrašo rodymo veiksena';
+$labels['folderactions'] = 'Veiksmai su aplankais…';
 $labels['compact'] = 'Suspausti';
 $labels['empty'] = 'Ištuštinti';
 $labels['purge'] = 'Išvalyti';
 $labels['quota'] = 'Disko naudojimas';
 $labels['unknown'] = 'nežinomas';
 $labels['unlimited'] = 'neribotas';
-$labels['quicksearch'] = 'Greita paieška';
+$labels['quicksearch'] = 'Sparčioji paieška';
 $labels['resetsearch'] = 'Atšaukti paiešką';
 $labels['searchmod'] = 'Paieškos modifikatoriai';
 $labels['msgtext'] = 'Visas laiškas';
-$labels['openinextwin'] = 'Atidaryti naujame lange';
-$labels['emlsave'] = 'Parsiųsti (.eml)';
-$labels['compose'] = 'Rašyti nauja laiška';
+$labels['openinextwin'] = 'Atverti naujame lange';
+$labels['emlsave'] = 'Parsisiųsti (.eml)';
+$labels['compose'] = 'Rašyti naują laišką';
 $labels['editasnew'] = 'Redaguoti kaip naują';
 $labels['savemessage'] = 'Išsaugoti šį juodraštį';
 $labels['sendmessage'] = 'Išsiųsti laiską';
-$labels['addattachment'] = 'Prisegti bylą';
+$labels['addattachment'] = 'Pridėti failą';
 $labels['charset'] = 'Koduotė';
-$labels['editortype'] = 'Redagavimo tipas';
-$labels['returnreceipt'] = 'Atgalinis gavėjas';
+$labels['editortype'] = 'Laiško tipas';
+$labels['returnreceipt'] = 'Prašyti pristatymo pažymos';
+$labels['dsn'] = 'Laiško pristatymo pažyma';
+$labels['editidents'] = 'Tvarkyti tapatybes';
 $labels['checkspelling'] = 'Tikrinti rašybą';
 $labels['resumeediting'] = 'Tęsti redagavimą';
 $labels['revertto'] = 'Atstatyti į';
-$labels['attachments'] = 'Prisegtos bylos';
+$labels['attachments'] = 'Pridėti failai';
 $labels['upload'] = 'Įkelti';
-$labels['close'] = 'Uždaryti';
+$labels['close'] = 'Užverti';
+$labels['messageoptions'] = 'Laiško savybės…';
 $labels['low'] = 'Žemas';
 $labels['lowest'] = 'Žemiausias';
 $labels['normal'] = 'Normalus';
 $labels['high'] = 'Aukštas';
 $labels['highest'] = 'Aukščiausias';
-$labels['nosubject'] = '(nėra temos)';
+$labels['nosubject'] = '(tema nenurodyta)';
 $labels['showimages'] = 'Rodyti paveikslėlius';
-$labels['alwaysshow'] = 'Visada rodyti paveikslėlius gautus iš $sender';
+$labels['alwaysshow'] = 'Visada rodyti paveikslėlius $sender laiškuose';
 $labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Paprastas tekstas';
-$labels['savesentmessagein'] = 'Išsaugoti išsiųstus laiškus į';
-$labels['dontsave'] = 'neišsaugoti';
-$labels['maxuploadsize'] = 'Maksimalus leistinas bylos dydis yra $size';
+$labels['plaintoggle'] = 'Grynasis tekstas';
+$labels['savesentmessagein'] = 'Išsiųstus laiškus įrašyti į';
+$labels['dontsave'] = 'neįrašyti';
+$labels['maxuploadsize'] = 'Maksimalus leistinas failo dydis yra $size';
 $labels['addcc'] = 'Pridėti Cc';
 $labels['addbcc'] = 'Pridėti Bcc';
 $labels['addreplyto'] = 'Pridėti Reply-To';
-$labels['mdnrequest'] = 'Žinutės siuntėjas paprašė patvirtinti, kad jūs ją perskaitėte. Ar norite išsiųsti patvirtinimą?';
-$labels['receiptread'] = 'Patvirtinimas (skaitymo)';
-$labels['yourmessage'] = 'Jūsų laiško perskaitymo patvirtinimas';
-$labels['receiptnote'] = 'Pastaba: šis laiško perskaitymo patvirtinimas nurodo, jog laiškas buvo atidarytas gavėjo kompiuteryje, tačiau negarantuoja, jog gavėjas perskaitė ir suprato laiško turinį.';
+$labels['addfollowupto'] = 'Pridėti Followup-To';
+$labels['mdnrequest'] = 'Šio laiško siuntėjas paprašė patvirtinti, kad jūs jį perskaitėte. Ar išsiųsti tai patvirtinančią pažymą?';
+$labels['receiptread'] = 'Patvirtinimas (laiškas perskaitytas)';
+$labels['yourmessage'] = 'Tai – pažyma, patvirtinanti, jog buvo perskaitytas Jūsų laiškas';
+$labels['receiptnote'] = 'Pastaba: šia pažyma patvirtinamas tik faktas, jog laiškas buvo parodytas gavėjui. Ja negarantuojama, jog gavėjas perskaitė ir suprato laiško turinį.';
 $labels['name'] = 'Rodomas vardas';
 $labels['firstname'] = 'Vardas';
 $labels['surname'] = 'Pavardė';
 $labels['email'] = 'El. paštas';
-$labels['addcontact'] = 'Pridėti kontaktą';
-$labels['editcontact'] = 'Redaguoti kontaktą';
+$labels['addcontact'] = 'Pridėti adresatą';
+$labels['editcontact'] = 'Taisyti adresatą';
+$labels['contacts'] = 'Adresatai';
+$labels['contactproperties'] = 'Adresato savybės';
 $labels['edit'] = 'Redaguoti';
-$labels['cancel'] = 'Atšaukti';
-$labels['save'] = 'Išsaugoti';
-$labels['delete'] = 'Ištrinti';
-$labels['newcontact'] = 'Sukurti naują kontaktą';
-$labels['deletecontact'] = 'Ištrinti pažymėtus kontaktus';
+$labels['cancel'] = 'Atsisakyti';
+$labels['save'] = 'Įrašyti';
+$labels['delete'] = 'Pašalinti';
+$labels['rename'] = 'Pervardinti';
+$labels['newcontact'] = 'Sukurti naują adresatą';
+$labels['deletecontact'] = 'Ištrinti pažymėtus adresatus';
 $labels['composeto'] = 'Rašyti laišką';
-$labels['contactsfromto'] = 'Kontaktai nuo $from iki $to iš $count';
-$labels['print'] = 'Atspausdinti';
+$labels['contactsfromto'] = 'Adresatai nuo $from iki $to iš $count';
+$labels['print'] = 'Spausdinti';
 $labels['export'] = 'Eksportuoti';
-$labels['exportvcards'] = 'Eksportuoti kontaktus vCard formatu';
+$labels['exportvcards'] = 'Eksportuoti adresatus  „vCard“ formatu';
+$labels['newcontactgroup'] = 'Kurti adresatų grupę';
+$labels['groupactions'] = 'Adresatų grupėms taikomi veiksmai…';
 $labels['previouspage'] = 'Rodyti ankstesnį puslapį';
 $labels['firstpage'] = 'Rodyti pirmąjį puslapį';
 $labels['nextpage'] = 'Rodyti tolesnį puslapį';
 $labels['lastpage'] = 'Rodyti paskutinį puslapį';
+$labels['group'] = 'Grupė';
 $labels['groups'] = 'Grupės';
 $labels['personaladrbook'] = 'Asmeniniai adresai';
 $labels['import'] = 'Importuoti';
-$labels['importcontacts'] = 'Importuoti kontaktus';
-$labels['importfromfile'] = 'Importuoti iš bylos:';
-$labels['importreplace'] = 'Pakeisti visą adresų knygą';
-$labels['importtext'] = 'Jūs galite įkelti kontaktus iš egzistuojančios adresų knygos.Mes šiuo metu palaikome adresų importavimą vCard duomenų formatu. ';
+$labels['importcontacts'] = 'Importuoti adresatus';
+$labels['importfromfile'] = 'Importuoti iš failo:';
+$labels['importreplace'] = 'Perrašyti visą adresų knygą';
+$labels['importtext'] = 'Jūs galite įkelti adresatus iš egzistuojančios adresų knygos.<br/>Šiuo metu galima importuoti adresus iš <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> tipo failų.';
 $labels['done'] = 'Baigta';
 $labels['settingsfor'] = 'Nustatymai';
 $labels['preferences'] = 'Nustatymai';
-$labels['userpreferences'] = 'Vartotojo nustatymai';
-$labels['editpreferences'] = 'Redaguoti vartotojo nustatymus';
+$labels['userpreferences'] = 'Naudotojo nustatymai';
+$labels['editpreferences'] = 'Redaguoti naudotojo nustatymus';
 $labels['identities'] = 'Tapatybės';
-$labels['manageidentities'] = 'Tvarkyti tapatybes šiai sąskaitai';
+$labels['manageidentities'] = 'Tvarkyti šios paskyros tapatybes';
 $labels['newidentity'] = 'Nauja tapatybė';
-$labels['newitem'] = 'Naujas įrašas';
-$labels['edititem'] = 'Redaguoti įrašą';
-$labels['setdefault'] = 'Nustatyti pagrindiniu';
-$labels['autodetect'] = 'Automatiškai';
+$labels['newitem'] = 'Naujas elementas';
+$labels['edititem'] = 'Redaguoti elementą';
+$labels['preferhtml'] = 'Rodyti HTML';
+$labels['defaultcharset'] = 'Numatytoji koduotė';
+$labels['htmlmessage'] = 'HTML laiškas';
+$labels['prettydate'] = 'Dailios datos';
+$labels['setdefault'] = 'Laikyti numatytąja';
+$labels['autodetect'] = 'Aptikti automatiškai';
 $labels['language'] = 'Kalba';
 $labels['timezone'] = 'Laiko juosta';
 $labels['pagesize'] = 'Eilučių skaičius puslapyje';
 $labels['signature'] = 'Parašas';
-$labels['dstactive'] = 'Vasaros/Žiemos laikas';
-$labels['htmleditor'] = 'Kurti HTML laiškus';
+$labels['dstactive'] = 'Vasaros laikas skiriasi';
+$labels['htmleditor'] = 'Laiškus kurti HTML formatu';
+$labels['htmlonreply'] = 'tik atsakymus į HTML formato laiškus';
 $labels['htmlsignature'] = 'HTML parašas';
-$labels['previewpane'] = 'Rodyti peržiūros lauką';
-$labels['skin'] = 'Aplinkos stilius';
-$labels['logoutclear'] = 'Išvalyti šiukšliadėžę atsijungiant';
-$labels['logoutcompact'] = 'Suspausti Gautus atsijungiant';
-$labels['uisettings'] = 'Vartotojo Aplinka';
-$labels['serversettings'] = 'Serverio Nuostatos';
-$labels['mailboxview'] = 'Pašto Dėžutės Peržiūra';
-$labels['mdnrequests'] = 'Siuntėjo perspėjimai';
-$labels['askuser'] = 'prašyti vartotojo';
-$labels['autosend'] = 'siųsti automatiškai';
-$labels['ignore'] = 'ignoruoti';
-$labels['readwhendeleted'] = 'Pažymėti laišką kaip perskaitytu trinant';
-$labels['flagfordeletion'] = 'Pažymėti laišką trynimui vietoje ištrynimo';
-$labels['skipdeleted'] = 'Nerodyti ištrintų laiškų';
-$labels['showremoteimages'] = 'Rodyti paveikslėlius';
-$labels['fromknownsenders'] = 'iš žinomų siuntėjų';
+$labels['previewpane'] = 'Rodyti laiško peržiūros polangį';
+$labels['skin'] = 'Grafinis apvalkalas';
+$labels['logoutclear'] = 'Išvalyti Šiukšlinę atsijungiant';
+$labels['logoutcompact'] = 'Suspausti Gautų laiškų aplanką atsijungiant';
+$labels['uisettings'] = 'Naudotojo sąsaja';
+$labels['serversettings'] = 'Serverio nustatymai';
+$labels['mailboxview'] = 'Pašto dėžutės rodymas';
+$labels['mdnrequests'] = 'Gavus prašymą patvirtinti, jog laiškas perskaitytas';
+$labels['askuser'] = 'visuomet klausti, ar siųsti patvirtinimą';
+$labels['autosend'] = 'visuomet siųsti patvirtinimą automatiškai';
+$labels['autosendknown'] = 'automatiškai siųsti patvirtinimą adresų knygoje esantiems adresatams, kitu atveju klausti';
+$labels['autosendknownignore'] = 'automatiškai siųsti patvirtinimą adresų knygoje esantiems adresatams, kitu atveju nesiųsti';
+$labels['ignore'] = 'niekada nesiųsti patvirtinimo';
+$labels['readwhendeleted'] = 'Pažymėti laišką kaip skaitytą prieš šalinant';
+$labels['flagfordeletion'] = 'Pažymėti laišką šalinimui užuot šalinus';
+$labels['skipdeleted'] = 'Nerodyti pašalintų laiškų';
+$labels['deletealways'] = 'Pašalinti laiškus, jeigu nepavyksta jų perkelti į Šiukšlinę';
+$labels['showremoteimages'] = 'Įkelti paveikslėlius iš interneto serverių';
+$labels['fromknownsenders'] = 'tik žinomų siuntėjų laiškuose';
 $labels['always'] = 'visada';
-$labels['showinlineimages'] = 'Rodyti prisegtus paveikslėlius žemiau laiško';
-$labels['autosavedraft'] = 'Automatiškai išsaugoti juodraščius';
-$labels['everynminutes'] = 'kas $n minutę(-čių)';
-$labels['keepalive'] = 'Tikrinti ar nėra naujų pranešimus';
+$labels['showinlineimages'] = 'Rodyti pritus paveikslėlius žemiau laiško';
+$labels['autosavedraft'] = 'Automatiškai įrašyti juodraščius';
+$labels['everynminutes'] = 'kas $n min.';
+$labels['keepalive'] = 'Tikrinti ar yra naujų laiškų';
 $labels['never'] = 'niekada';
+$labels['immediately'] = 'nedelsiant';
 $labels['messagesdisplaying'] = 'Laiškų rodymas';
-$labels['messagescomposition'] = 'Laiškų struktūra';
-$labels['mimeparamfolding'] = 'Prisegtų bylų vardai';
-$labels['2231folding'] = 'Pilnas RFC 2231 (Thunderbird)';
+$labels['messagescomposition'] = 'Laiškų rašymas';
+$labels['mimeparamfolding'] = 'Prisegtų failų vardų kodavimas';
+$labels['2231folding'] = 'visiškas RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
-$labels['2047folding'] = 'Pilnas RFC 2047 (kita)';
+$labels['2047folding'] = 'visiškas RFC 2047 (kitos programos)';
+$labels['force7bit'] = 'Naudoti MIME kodavimą 8 bitų simboliams';
 $labels['advancedoptions'] = 'Papildomi nustatymai';
 $labels['focusonnewmessage'] = 'Fokusuoti naršyklės langą gavus naują laišką';
-$labels['checkallfolders'] = 'Tikrinti ar nėra naujų laiškų visuose aplankuose';
-$labels['displaynext'] = 'Po laiško pašalinimo/perkėlimo rodyti pranešimą';
+$labels['checkallfolders'] = 'Naujų laiškų ieškoti visuose aplankuose';
+$labels['displaynext'] = 'Rodyti pranešimą pašalinus/perkėlus laišką';
 $labels['mainoptions'] = 'Pagrindiniai nustatymai';
 $labels['section'] = 'Sekcija';
 $labels['maintenance'] = 'Priežiūra';
 $labels['newmessage'] = 'Naujas laiškas';
 $labels['listoptions'] = 'Rodyti nustatymus';
+$labels['signatureoptions'] = 'Parašo nustatymai';
+$labels['whenreplying'] = 'Kuriant atsakymą';
+$labels['replytopposting'] = 'rašyti atsakymą virš cituojamo laiško';
+$labels['replybottomposting'] = 'rašyti atsakymą po cituojamu laišku';
+$labels['replyremovesignature'] = 'Pašalinti cituojamame laiške esantį parašą';
+$labels['autoaddsignature'] = 'Automatiškai pridėti parašą';
+$labels['newmessageonly'] = 'tik naujuose laiškuose';
+$labels['replyandforwardonly'] = 'tik atsakymuose ir persiunčiamuose laiškuose';
+$labels['replysignaturepos'] = 'Atsakant ir persiunčiant laiškus, parašą pridėti';
+$labels['belowquote'] = 'po citata';
+$labels['abovequote'] = 'virš citatos';
+$labels['insertsignature'] = 'Pridėti parašą';
+$labels['previewpanemarkread'] = 'Peržiūros polangyje parodytus laiškus žymėti skaitytais';
+$labels['afternseconds'] = 'praėjus $n sek.';
+$labels['reqmdn'] = 'Visuomet prašyti patvirtinimo, jog laiškas perskaitytas';
+$labels['reqdsn'] = 'Visuomet prašyti laiško pristatymo pažymos';
+$labels['replysamefolder'] = 'Atsakymus talpinti į tą patį aplanką, kuriame yra pirminis laiškas';
 $labels['folder'] = 'Aplankas';
 $labels['folders'] = 'Aplankai';
 $labels['foldername'] = 'Aplanko vardas';
@@ -263,17 +327,39 @@ $labels['subscribed'] = 'Užsakytas';
 $labels['messagecount'] = 'Laiškai';
 $labels['create'] = 'Sukurti';
 $labels['createfolder'] = 'Sukurti naują aplanką';
-$labels['rename'] = 'Pervadinti';
-$labels['renamefolder'] = 'Pervadinti aplanką';
-$labels['deletefolder'] = 'Ištrinti aplanką';
 $labels['managefolders'] = 'Tvarkyti aplankus';
-$labels['specialfolders'] = 'Specialūs aplankai';
+$labels['specialfolders'] = 'Specialieji aplankai';
+$labels['properties'] = 'Savybės';
+$labels['folderproperties'] = 'Aplanko savybės';
+$labels['parentfolder'] = 'Tėvinis aplankas';
+$labels['location'] = 'Vieta';
+$labels['info'] = 'Informacija';
+$labels['getfoldersize'] = 'Spustelėkite, norėdami sužinoti aplanko dydį';
+$labels['changesubscription'] = 'Spustelėkite, norėdami keisti prenumeratos nuostatas';
 $labels['sortby'] = 'Rikiuoti pagal';
-$labels['sortasc'] = 'Rikiuoti didėjančia tvarka';
-$labels['sortdesc'] = 'Rikiuoti mažėjančia tvarka';
+$labels['sortasc'] = 'Rikiuoti didėjančiai';
+$labels['sortdesc'] = 'Rikiuoti mažėjančiai';
 $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unikodas';
+$labels['english'] = 'Anglų';
+$labels['westerneuropean'] = 'Vakarų Europos';
+$labels['easterneuropean'] = 'Rytų Europos';
+$labels['southeasterneuropean'] = 'Pietryčių Europos';
+$labels['baltic'] = 'Baltijos šalių';
+$labels['cyrillic'] = 'Kirilica';
+$labels['arabic'] = 'Arabų';
+$labels['greek'] = 'Graikų';
+$labels['hebrew'] = 'Hebrajų';
+$labels['turkish'] = 'Turkų';
+$labels['nordic'] = 'Šiaurės šalių';
+$labels['thai'] = 'Tajų';
+$labels['celtic'] = 'Keltų';
+$labels['vietnamese'] = 'Vietnamiečių';
+$labels['japanese'] = 'Japonų';
+$labels['korean'] = 'Korėjiečių';
+$labels['chinese'] = 'Kinų';
 
 ?>
index 103f399cd02c5ac2d7ad9fe4de11149e4074b120..abbf745b75f469affd05f363c4226369da8908ef 100644 (file)
@@ -5,15 +5,16 @@
 +-----------------------------------------------------------------------+
 | language/lt_LT/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Martynas Bendorius <martynas@evanet.lt>                       |
+| Authors: Martynas Bendorius <martynas@evanet.lt>                      |
+|          Rimas Kudelis <rq@akl.lt>                                    |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2891 2009-08-29 18:56:48Z yllar $
+@version $Id: messages.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -23,86 +24,119 @@ $messages['cookiesdisabled'] = 'Jūsų naršyklė nepriima slapukų';
 $messages['sessionerror'] = 'Jūsų sesija negaliojanti';
 $messages['imaperror'] = 'Nepavyko prisijungti prie IMAP serverio';
 $messages['servererror'] = 'Serverio klaida!';
-$messages['invalidrequest'] = 'Neteisinga užklausa! Duomenys neišsaugoti.';
+$messages['servererrormsg'] = 'Serverio klaida: $msg';
+$messages['errorreadonly'] = 'Nepavyko atlikti veiksmo – aplankas prieinamas tik skaitymui';
+$messages['errornoperm'] = 'Nepavyko atlikti veiksmo – nepakanka teisių';
+$messages['invalidrequest'] = 'Netinkama užklausa! Duomenys neišsaugoti.';
 $messages['nomessagesfound'] = 'Šioje pašto dėžutėje laiškų nėra ';
-$messages['loggedout'] = 'Jus sėkmingai atsijungėte. Viso gero!';
+$messages['loggedout'] = 'Jūs sėkmingai atsijungėte. Iki kito karto!';
 $messages['mailboxempty'] = 'Pašto dėžutė tuščia';
-$messages['loading'] = 'Įkeliama...';
-$messages['loadingdata'] = 'Įkeliami duomenys...';
-$messages['checkingmail'] = 'Tikrinama ar nėra naujų pranešimų...';
-$messages['sendingmessage'] = 'Siunčiamas laiškas...';
+$messages['loading'] = 'Įkeliama…';
+$messages['uploading'] = 'Įkeliamas failas…';
+$messages['loadingdata'] = 'Įkeliami duomenys…';
+$messages['checkingmail'] = 'Tikrinama ar nėra naujų pranešimų…';
+$messages['sendingmessage'] = 'Siunčiamas laiškas…';
 $messages['messagesent'] = 'Laiškas sėkmingai nusiųstas';
-$messages['savingmessage'] = 'Išsaugomas laiškas...';
-$messages['messagesaved'] = 'Laiškas išsaugotas į Juodraščius';
-$messages['successfullysaved'] = 'Sėkmingai išsaugota';
-$messages['addedsuccessfully'] = 'Kontaktas sėkmingai įtrauktas į adresų knygą';
-$messages['contactexists'] = 'Kontaktas, turintis šį el. pašto adresą, jau egzistuoja';
-$messages['blockedimages'] = 'Saugant jūsų privatumą su laišku neatsiųsti paveikslėliai nerodomi';
+$messages['savingmessage'] = 'Laiškas įrašomas…';
+$messages['messagesaved'] = 'Laiškas įrašytas į Juodraščių aplanką';
+$messages['successfullysaved'] = 'Sėkmingai įrašyta';
+$messages['addedsuccessfully'] = 'Asmuo įtrauktas į adresų knygą';
+$messages['contactexists'] = 'Adresatas, turintis šį el. pašto adresą, jau egzistuoja';
+$messages['blockedimages'] = 'Siekiant apsaugoti Jūsų privatumą, paveikslėliai iš interneto neįkelti';
 $messages['encryptedmessage'] = 'Apgailestaujame, tačiau šis laiškas užšifruotas ir negali būti parodytas.';
-$messages['nocontactsfound'] = 'Kontaktų nerasta';
-$messages['contactnotfound'] = 'Reikalautas kontaktas nerastas';
+$messages['nocontactsfound'] = 'Adresatų nerasta';
+$messages['contactnotfound'] = 'Ieškotas adresatas nerastas';
 $messages['sendingfailed'] = 'Laiško išsiųsti nepavyko';
-$messages['senttooquickly'] = 'Jūs turite palaukti $sec sek., kad galėtumėte išsiųsti laišką';
-$messages['errorsavingsent'] = 'Išsaugant išsiųstą laišką įvyko klaida';
-$messages['errorsaving'] = 'Išsaugant įvyko klaida';
-$messages['errormoving'] = 'Laiško perkelti nepavyko';
-$messages['errordeleting'] = 'Laiško ištrinti nepavyko';
-$messages['errormarking'] = 'Nepavyko pažymėti laiško';
-$messages['deletecontactconfirm'] = 'Ar jūs tikrai norite ištrinti pasirinktą(-us) kontaktą(-us)?';
-$messages['deletemessagesconfirm'] = 'Ar jūs tikrai norite ištrinti pasirinktą(-us) žinutę(-es)?';
-$messages['deletefolderconfirm'] = 'Ar jūs tikrai norite ištrinti šį aplanką?';
-$messages['purgefolderconfirm'] = 'Ar jūs tikrai norite ištrinti visus laiškus, esančius šiame aplanke?';
-$messages['foldercreating'] = 'Aplankas kuriamas...';
-$messages['folderdeleting'] = 'Aplankas pašalinamas...';
-$messages['folderrenaming'] = 'Aplankas pervardinamas...';
-$messages['foldermoving'] = 'Aplankas perkeliamas...';
-$messages['formincomplete'] = 'Šios formos laukai yra nepilnai užpildyti';
-$messages['noemailwarning'] = 'Prašome įvesti teisingą el. pašto adresą';
-$messages['nonamewarning'] = 'Prašome įvesti vardą';
-$messages['nopagesizewarning'] = 'Prašome įvesti puslapio dydį';
-$messages['nosenderwarning'] = 'Prašome įvesti siuntėjo el. pašto adresą';
-$messages['norecipientwarning'] = 'Prašome įvesti bent vieną gavėją';
+$messages['senttooquickly'] = 'Turite luktelėti $sec sek., kad galėtumėte išsiųsti laišką';
+$messages['errorsavingsent'] = 'Įrašant išsiųstą laišką įvyko klaida';
+$messages['errorsaving'] = 'Įrašant įvyko klaida';
+$messages['errormoving'] = 'Laiško(-ų) perkelti nepavyko';
+$messages['errorcopying'] = 'Laiško(-ų) nukopijuoti nepavyko';
+$messages['errordeleting'] = 'Laiško(-ų) pašalinti nepavyko';
+$messages['errormarking'] = 'Laiško(-ų) pažymėti nepavyko';
+$messages['deletecontactconfirm'] = 'Ar tikrai pašalinti pažymėtą(-us) adresatą(-us)?';
+$messages['deletemessagesconfirm'] = 'Ar tikrai pašalinti pažymėtą(-us) laišką(-us)?';
+$messages['deletefolderconfirm'] = 'Ar tikrai pašalinti šį aplanką?';
+$messages['purgefolderconfirm'] = 'Ar tikrai pašalinti visus šiame aplanke esančius laiškus?';
+$messages['folderdeleting'] = 'Aplankas šalinamas…';
+$messages['foldermoving'] = 'Aplankas perkeliamas…';
+$messages['foldersubscribing'] = 'Aplankas prenumeruojamas…';
+$messages['folderunsubscribing'] = 'Atsisakoma aplanko prenumeratos…';
+$messages['formincomplete'] = 'Formos laukai nepilnai užpildyti';
+$messages['noemailwarning'] = 'Prašom įvesti teisingą el. pašto adresą';
+$messages['nonamewarning'] = 'Prašom įvesti vardą';
+$messages['nopagesizewarning'] = 'Prašom įvesti puslapio dydį';
+$messages['nosenderwarning'] = 'Prašom įvesti siuntėjo el. pašto adresą';
+$messages['norecipientwarning'] = 'Prašom įvesti bent vieną gavėją';
 $messages['nosubjectwarning'] = 'Temos laukelis tuščias. Ar norite temą įvesti dabar?';
 $messages['nobodywarning'] = 'Išsiųsti šį laišką be teksto?';
 $messages['notsentwarning'] = 'Laiškas neišsiųstas. Ar jūs tikrai norite jo atsikratyti?';
 $messages['noldapserver'] = 'Prašome pasirinkti LDAP serverį paieškai';
-$messages['nocontactsreturned'] = 'Kontaktas(-ai) nerastas(-i)';
+$messages['nocontactsreturned'] = 'Adresatas(-ai) nerastas(-i)';
 $messages['nosearchname'] = 'Prašom įvesti vardą arba el. pašto adresą';
-$messages['searchsuccessful'] = 'Surasta $nr žinučių';
-$messages['searchnomatch'] = 'Rezultatų nerasta';
-$messages['searching'] = 'Ieškoma...';
-$messages['checking'] = 'Tikrinama...';
+$messages['notuploadedwarning'] = 'Įkelti dar ne visi priedai. Prašom palaukti arba atšaukti jų įkėlimą.';
+$messages['searchsuccessful'] = 'Rasta laiškų: $nr';
+$messages['searchnomatch'] = 'Paiešką atitinkančių rezultatų nėra';
+$messages['searching'] = 'Ieškoma…';
+$messages['checking'] = 'Tikrinama…';
 $messages['nospellerrors'] = 'Rašybos klaidų nerasta';
-$messages['folderdeleted'] = 'Aplankas sėkmingai ištrintas';
-$messages['deletedsuccessfully'] = 'Sėkmingai ištrintas';
-$messages['converting'] = 'Pašalinamas laiško formatavimas...';
-$messages['messageopenerror'] = 'Nepavyko įkelti laišką iš serverio';
-$messages['fileuploaderror'] = 'Nepavyko įkelti bylos';
-$messages['filesizeerror'] = 'Įkelta byla viršija maksimalų vietos limitą — $size';
-$messages['copysuccess'] = 'Sėkmingai nukopijuoti $nr adresai';
-$messages['copyerror'] = 'Adresų kopijuoti negalima';
-$messages['sourceisreadonly'] = 'Šis adreso šaltinis yra tik skaitymui';
-$messages['errorsavingcontact'] = 'Kontakto adreso išsaugoti negalima';
-$messages['movingmessage'] = 'Perkeliamas laiškas...';
-$messages['receiptsent'] = 'Sėkmingai išsiųstas laiško perskaitymo patvirtinimas';
-$messages['errorsendingreceipt'] = 'Nepavyko išsiųsti laiško perskaitymo patvirtinimo';
-$messages['nodeletelastidentity'] = 'Jūs negalite ištrinti šios tapatybės, kadangi ji yra vienintelė likusi.';
-$messages['addsubfolderhint'] = 'Šis aplankas bus sukurtas kaip poaplankis, kurį esate pažymėjęs';
-$messages['forbiddencharacter'] = 'Aplanko pavadinimas turi neleistinų simbolių';
-$messages['selectimportfile'] = 'Prašome pasirinkti bylą įkėlimui';
-$messages['addresswriterror'] = 'Pasirinkta adresų knyga nėra įrašoma';
-$messages['importwait'] = 'Importuojama, prašome palaukti...';
-$messages['importerror'] = 'Importavimas nepavyko! Įkelta byla nėra vCard formato.';
-$messages['importconfirm'] = '<b>Sėkmingai importuoti $inserted kontaktai, $skipped egzistuojančių įrašų praleista</b>:<p><em>$names</em></p>';
-$messages['opnotpermitted'] = 'Operacija neleistina!';
-$messages['nofromaddress'] = 'Nerastas el. pašto adresas pasirinktoje tapatybėje';
-$messages['editorwarning'] = 'Pereinant tik į teksto redagavimą visas formatavimas bus prarastas. Ar tikrai norite vykdyti užklausą?';
+$messages['folderdeleted'] = 'Aplankas sėkmingai pašalintas';
+$messages['foldersubscribed'] = 'Aplankas sėkmingai užprenumeruotas';
+$messages['folderunsubscribed'] = 'Aplanko prenumeratos sėkmingai atsisakyta';
+$messages['folderpurged'] = 'Aplankas sėkmingai ištuštintas';
+$messages['folderexpunged'] = 'Aplankas sėkmingai išvalytas';
+$messages['deletedsuccessfully'] = 'Sėkmingai pašalinta';
+$messages['converting'] = 'Šalinamas laiško formatavimas…';
+$messages['messageopenerror'] = 'Nepavyko įkelti laiško iš serverio';
+$messages['fileuploaderror'] = 'Nepavyko įkelti failo';
+$messages['filesizeerror'] = 'Įkeltas failas viršija maksimalų leistiną dydį – $size';
+$messages['copysuccess'] = 'Nukopijuota adresų: $nr';
+$messages['copyerror'] = 'Adresų nukopijuoti nepavyko';
+$messages['sourceisreadonly'] = 'Šis adresų šaltinis prieinamas tik skaitymui';
+$messages['errorsavingcontact'] = 'Asmens adreso įrašyti nepavyko';
+$messages['movingmessage'] = 'Laiškas(-ai) perkeliamas(-i)…';
+$messages['copyingmessage'] = 'Laiškai(-ai) kopijuojamas(-i)…';
+$messages['deletingmessage'] = 'Laiškas(-ai) šalinamas(-i)…';
+$messages['markingmessage'] = 'Laiškas(-ai) žymimas(-i)…';
+$messages['receiptsent'] = 'Laiško perskaitymo pažyma sėkmingai išsiųsta';
+$messages['errorsendingreceipt'] = 'Laiško perskaitymo pažymos išsiųsti nepavyko';
+$messages['nodeletelastidentity'] = 'Jūs negalite ištrinti šios tapatybės, nes ji yra vienintelė likusi.';
+$messages['forbiddencharacter'] = 'Aplanko varde rasta neleistinų simbolių';
+$messages['selectimportfile'] = 'Parinkite įkelti norimą failą';
+$messages['addresswriterror'] = 'Pasirinktoji adresų knyga prieinama tik skaitymui';
+$messages['contactaddedtogroup'] = 'Adresatai sėkmingai įtraukti į šią grupę';
+$messages['contactremovedfromgroup'] = 'Adresatai sėkmingai pašalinti iš šios grupės';
+$messages['importwait'] = 'Importuojama, prašome palaukti…';
+$messages['importerror'] = 'Importavimas nepavyko! Įkeltasis failas nėra vCard formato.';
+$messages['importconfirm'] = '<b>Sėkmingai importuoti $inserted adresatai (-ų), $skipped egzistuojantys įrašai praleisti</b>:<p><em>$names</em></p>';
+$messages['opnotpermitted'] = 'Veiksmas neleistinas!';
+$messages['nofromaddress'] = 'Nenurodytas pasirinktosios tapatybės el. pašto adresas';
+$messages['editorwarning'] = 'Pereinant į grynojo teksto redagavimą, visas laiško formatavimas bus prarastas. Ar tęsti?';
 $messages['httpreceivedencrypterror'] = 'Įvyko lemtinga konfigūracijos klaida. Nedelsiant susisiekite su administratoriumi. <b>Jūsų laiškas negali būti išsiųstas.</b>';
-$messages['smtpconnerror'] = 'SMTP klaida ($code): Nepavyko prisijungti prie serverio';
-$messages['smtpautherror'] = 'SMTP klaida ($code): Autentifikacija neįvyko';
-$messages['smtpfromerror'] = 'SMTP klaida ($code): Nepavyko nustatyti siuntėjo "$from"';
-$messages['smtptoerror'] = 'SMTP klaida ($code): Nepavyko pridėti gavėjo "$to"';
-$messages['smtprecipientserror'] = 'SMTP klaida: Nepavyko apdoroti gavėjų sąrašo';
+$messages['smtpconnerror'] = 'SMTP klaida ($code): nepavyko prisijungti prie serverio';
+$messages['smtpautherror'] = 'SMTP klaida ($code): nepavyko autentikuotis';
+$messages['smtpfromerror'] = 'SMTP klaida ($code): nepavyko nurodyti siuntėjo „$from“ ($msg)';
+$messages['smtptoerror'] = 'SMTP klaida ($code): nepavyko pridėti gavėjo „$to“ ($msg)';
+$messages['smtprecipientserror'] = 'SMTP klaida: nepavyko apdoroti gavėjų sąrašo';
+$messages['smtpdsnerror'] = 'SMTP klaida: laiškų pristatymo pažymos nepalaikomos';
 $messages['smtperror'] = 'SMTP klaida: $msg';
+$messages['emailformaterror'] = 'Netinkamas el. pašto adresas: $email';
+$messages['toomanyrecipients'] = 'Per daug gavėjų. Sumažinkite jų bent iki $max.';
+$messages['maxgroupmembersreached'] = 'Grupės narių skaičius viršijo maksimalų leistiną ($max)';
+$messages['internalerror'] = 'Įvyko klaida. Prašom bandyti iš naujo.';
+$messages['contactdelerror'] = 'Nepavyko pašalinti adresato(-ų)';
+$messages['contactdeleted'] = 'Adresatas(-ai) sėkmingai pašalintas(-i)';
+$messages['groupdeleted'] = 'Grupė sėkmingai pašalinta';
+$messages['grouprenamed'] = 'Grupė sėkmingai pervardinta';
+$messages['groupcreated'] = 'Grupė sėkmingai sukurta';
+$messages['messagedeleted'] = 'Laiškas(-ai) sėkmingai pašalintas(-i)';
+$messages['messagemoved'] = 'Laiškas(-ai) sėkmingai perkeltas(-i)';
+$messages['messagecopied'] = 'Laiškas(-ai) sėkmingai nukopijuotas(-i)';
+$messages['messagemarked'] = 'Laiškas(-ai) sėkmingai pažymėtas(-i)';
+$messages['autocompletechars'] = 'Automatiniam užbaigimui būtini bent $min simboliai';
+$messages['namecannotbeempty'] = 'Vardas negali būti tuščias';
+$messages['nametoolong'] = 'Vardas yra per ilgas';
+$messages['folderupdated'] = 'Aplanko savybės sėkmingai atnaujintos';
+$messages['foldercreated'] = 'Aplankas sėkmingai sukurtas';
 
 ?>
index ac2c7aaff4c105e509d5206ad7dcba5364ca0ef7..65ad34047f68cf6b00c368bc1c7d5ef676349a19 100644 (file)
@@ -5,17 +5,17 @@
 +-----------------------------------------------------------------------+
 | language/lv/labels.inc                                                |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Rudolfs Osins <dev.random@gmail.com>                          |
-|         Mikelis Zalais <mik@prog.lv>                                  |
+| Author: Rūdolfs Ošiņš <dev.random@gmail.com>                          |
+|         Miķelis Zaļais <mik@prog.lv>                                  |
 |         Lauris Bukšis-Haberkorns <lauris@nix.lv>                      |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2513 2009-05-21 12:59:19Z alec $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -37,14 +37,14 @@ $labels['junk'] = 'Mēstules';
 $labels['subject'] = 'Temats';
 $labels['from'] = 'No';
 $labels['to'] = 'Kam';
-$labels['cc'] = 'Kopija';
+$labels['cc'] = 'Cc';
 $labels['bcc'] = 'Bcc';
 $labels['replyto'] = 'Atbildēt uz';
 $labels['date'] = 'Datums';
 $labels['size'] = 'Izmērs';
 $labels['priority'] = 'Prioritāte';
-$labels['organization'] = 'Organizācija';
-$labels['reply-to'] = 'Atbildēt uz';
+$labels['organization'] = 'Uzņēmums';
+$labels['reply-to'] = 'Reply-to';
 $labels['mailboxlist'] = 'Mapes';
 $labels['messagesfromto'] = 'Vēstules $from līdz $to no $count';
 $labels['messagenrof'] = '$nr. vēstule  no $count';
@@ -54,7 +54,7 @@ $labels['filename'] = 'Faila nosaukums';
 $labels['filesize'] = 'Faila izmērs';
 $labels['preferhtml'] = 'Dot priekšroku HTML';
 $labels['htmlmessage'] = 'HTML vēstule';
-$labels['prettydate'] = '"Skaists" datums';
+$labels['prettydate'] = 'Formatēt datumus';
 $labels['addtoaddressbook'] = 'Pievienot adrešu grāmatai';
 $labels['sun'] = 'Sv';
 $labels['mon'] = 'P';
@@ -97,12 +97,12 @@ $labels['longdec'] = 'Decembris';
 $labels['today'] = 'Šodien';
 $labels['checkmail'] = 'Pārbaudīt pastu';
 $labels['writenewmessage'] = 'Rakstīt jaunu vēstuli';
-$labels['replytomessage'] = 'Atbildēt uz vēstuli';
+$labels['replytomessage'] = 'Atbildēt';
 $labels['replytoallmessage'] = 'Atbildēt sūtītājam un visiem saņēmējiem';
 $labels['forwardmessage'] = 'Pārsūtīt vēstuli';
 $labels['deletemessage'] = 'Dzēst vēstuli';
 $labels['movemessagetotrash'] = 'Pārvietot vēstuli uz miskasti';
-$labels['printmessage'] = 'Izdrukāt šo vēstuli';
+$labels['printmessage'] = 'izdrukāt';
 $labels['previousmessage'] = 'Parādīt iepriekšējo vēstuli';
 $labels['previousmessages'] = 'Parādīt iepriekšējo vēstuļu kopu';
 $labels['firstmessage'] = 'Parādīt pirmo vēstuli';
@@ -112,29 +112,36 @@ $labels['nextmessages'] = 'Parādīt nākamo vēstuļu kopu';
 $labels['lastmessage'] = 'Parādīt pēdējo vēstuli';
 $labels['lastmessages'] = 'Parādīt pēdējo vēstuļu kopu';
 $labels['backtolist'] = 'Atpakaļ uz vēstuļu sarakstu';
-$labels['viewsource'] = 'Rādīt pirmtekstu';
-$labels['markmessages'] = 'Atzīmēt vēstules';
-$labels['markread'] = 'Kā lasītas';
-$labels['markunread'] = 'Kā nelasītas';
-$labels['markflagged'] = 'Kā iezīmētas';
-$labels['markunflagged'] = 'Kā neiezīmētas';
+$labels['viewsource'] = 'parādīt pirmtekstu';
+$labels['markmessages'] = 'Marķēt vēstules kā:';
+$labels['markread'] = 'lasītas';
+$labels['markunread'] = 'nelasītas';
+$labels['markflagged'] = 'iezīmētas';
+$labels['markunflagged'] = 'neiezīmētas';
+$labels['messageactions'] = 'Citas darbības:';
 $labels['select'] = 'Iezīmēt';
-$labels['all'] = 'Visas';
-$labels['none'] = 'Nevienu';
-$labels['unread'] = 'Nelasītās';
-$labels['flagged'] = 'Iezīmētas';
-$labels['unanswered'] = 'Neatbildētas';
+$labels['all'] = 'visas';
+$labels['none'] = 'nevienu';
+$labels['unread'] = 'nelasītās';
+$labels['flagged'] = 'iezīmētās';
+$labels['unanswered'] = 'neatbildētās';
+$labels['deleted'] = 'dzēstās';
+$labels['invert'] = 'invertēt';
 $labels['filter'] = 'Filtrēt';
-$labels['compact'] = 'Saspiest';
-$labels['empty'] = 'Iztukšot';
+$labels['compact'] = 'saspiest';
+$labels['empty'] = 'iztukšot';
 $labels['purge'] = 'Iztīrīt';
 $labels['quota'] = 'Kvota';
 $labels['unknown'] = 'nezināms';
 $labels['unlimited'] = 'neierobežots';
 $labels['quicksearch'] = 'Ārtā meklēšana';
 $labels['resetsearch'] = 'Atstatīt meklēšanu';
-$labels['openinextwin'] = 'Atvērt jaunā logā';
+$labels['searchmod'] = 'Meklēt laukos:';
+$labels['msgtext'] = 'Vēstules tekstā';
+$labels['openinextwin'] = 'atvērt jaunā logā';
+$labels['emlsave'] = 'lejupielādēt (.eml)';
 $labels['compose'] = 'Rakstīt vēstuli';
+$labels['editasnew'] = 'rediģēt kā jaunu';
 $labels['savemessage'] = 'Saglabāt uzmetumu';
 $labels['sendmessage'] = 'Sūtīt vēstuli';
 $labels['addattachment'] = 'Pievienot failu';
@@ -154,7 +161,7 @@ $labels['high'] = 'Augsta';
 $labels['highest'] = 'Augstākā';
 $labels['nosubject'] = '(no subject)';
 $labels['showimages'] = 'Rādīt attēlus';
-$labels['alwaysshow'] = 'Vienmēr rādīt attēlos no $sender';
+$labels['alwaysshow'] = 'Vienmēr rādīt attēlus no $sender';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Vienkāršs teksts';
 $labels['savesentmessagein'] = 'Saglabāt nosūtīto vēstuli mapē';
@@ -177,7 +184,7 @@ $labels['edit'] = 'Rediģēt';
 $labels['cancel'] = 'Atcelt';
 $labels['save'] = 'Saglabāt';
 $labels['delete'] = 'Dzēst';
-$labels['newcontact'] = 'Izveidot jaunu ierakstu adrešu grāmatā';
+$labels['newcontact'] = 'Izveidot jaunu ierakstu';
 $labels['deletecontact'] = 'Dzēst iezīmētos ierakstus';
 $labels['composeto'] = 'Rakstīt vēstuli';
 $labels['contactsfromto'] = 'Ieraksti $from līdz $to no $count';
@@ -197,7 +204,7 @@ $labels['importreplace'] = 'Aizvietot visu adrešu grāmatu';
 $labels['importtext'] = 'Jūst varat augšupielādēt kontaktus no citas adrešu grāmatas.<br/>Pašlaik ir atbalstīts adrešu imports no <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> datu formāta.';
 $labels['done'] = 'Pabeigts';
 $labels['settingsfor'] = 'Iestatījumi';
-$labels['preferences'] = 'Preferences';
+$labels['preferences'] = 'Iestatījumi';
 $labels['userpreferences'] = 'Lietotāja preferences';
 $labels['editpreferences'] = 'Rediģēt lietotāja preferences';
 $labels['identities'] = 'Identitātes';
@@ -216,23 +223,25 @@ $labels['htmleditor'] = 'Rakstīt HTML vēstules';
 $labels['htmlsignature'] = 'HTML paraksts';
 $labels['previewpane'] = 'Rādīt priekšskatījuma paneli';
 $labels['skin'] = 'Interfeisa izskats';
-$labels['logoutclear'] = 'Iztīrīt miskasti izejot';
-$labels['logoutcompact'] = 'Saspiest iesūtni izejot';
-$labels['uisettings'] = 'Lietotāja interfeiss';
+$labels['logoutclear'] = 'Izejot no sistēmas, iztīrīt miskasti';
+$labels['logoutcompact'] = 'Izejot no sistēmas, saspiest iesūtni';
+$labels['uisettings'] = 'Lietotāja saskarne';
 $labels['serversettings'] = 'Servera iestatījumi';
+$labels['mailboxview'] = 'Pastkastes skats';
+$labels['mdnrequests'] = 'Sūtītāja paziņojumi';
 $labels['askuser'] = 'jautāt lietotājam';
 $labels['autosend'] = 'sūtīt automātiski';
 $labels['ignore'] = 'ignorēt';
-$labels['readwhendeleted'] = 'Dzēšot atzīmēt vēstules kā izlasītas';
-$labels['flagfordeletion'] = 'Atzīmēt vēstules izdzēšanai, bet nedzēst';
-$labels['skipdeleted'] = 'Neattēlot dzēstās vēstules';
-$labels['showremoteimages'] = 'Attēlot attēlus, kas atrodas uz cita servera';
+$labels['readwhendeleted'] = 'Atzīmēt dzēstās vēstules kā izlasītas';
+$labels['flagfordeletion'] = 'Dzēšot marķēt vēstules kā dzēstas, bet nedzēst';
+$labels['skipdeleted'] = 'Nerādīt dzēstās vēstules';
+$labels['showremoteimages'] = 'Rādīt attēlus, kas atrodas uz cita servera';
 $labels['fromknownsenders'] = 'no zināmiem sūtītājiem';
 $labels['always'] = 'vienmēr';
-$labels['showinlineimages'] = 'Attēlot pielikuma attēlus zem vēstules';
+$labels['showinlineimages'] = 'Rādīt pielikuma attēlus zem vēstules';
 $labels['autosavedraft'] = 'Automātiski saglabāt uzmetumu';
-$labels['everynminutes'] = 'katru $n minūti(-es)';
-$labels['keepalive'] = 'Pārbaudīt jaunas vēstules mapēs';
+$labels['everynminutes'] = 'ik pa $n minūti(ēm)';
+$labels['keepalive'] = 'Pārbaudīt vai nav jaunas vēstules';
 $labels['never'] = 'nekad';
 $labels['messagesdisplaying'] = 'Vēstuļu attēlošana';
 $labels['messagescomposition'] = 'Vēstuļu rakstīšana';
@@ -242,19 +251,34 @@ $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Pilns RFC 2047 (citi)';
 $labels['advancedoptions'] = 'Paplašināti iestatījumi';
 $labels['focusonnewmessage'] = 'Uztādīt pārluka fokusu uz jaunu vēstuli';
-$labels['checkallfolders'] = 'Pārbaudīt jaunās vēstulēs visās mapēs';
-$labels['folder'] = 'Mape';
+$labels['checkallfolders'] = 'Pārbaudīt visas mapes pēc jaunām vēstulēm';
+$labels['displaynext'] = 'Rādīt nākamo vēstuli pēc dzēšanas/pārvietošanas ';
+$labels['mainoptions'] = 'Galvenie iestatījumi';
+$labels['section'] = 'Kategorija';
+$labels['maintenance'] = 'Uzturēšana';
+$labels['newmessage'] = 'Vēstuļu pienākšana';
+$labels['listoptions'] = 'Saraksta iestatījumi';
+$labels['signatureoptions'] = 'Paraksta iestatījumi';
+$labels['whenreplying'] = 'Atbildot';
+$labels['replytopposting'] = 'sākt jaunu vēstuli virs oriģināla';
+$labels['replybottomposting'] = 'sākt jaunu vēstuli zem oriģināla';
+$labels['replyremovesignature'] = 'Atbildot izņemt oriģinālo parakstu no vēstules';
+$labels['autoaddsignature'] = 'Automātiski pievienot parakstu';
+$labels['newmessageonly'] = 'tikai jaunas vēstules';
+$labels['replyandforwardonly'] = 'tikai atbildes un pārsūtījumi';
+$labels['replysignaturepos'] = 'Atbildot vai pārsūtot ievietot parakstu';
+$labels['belowquote'] = 'zem citāta';
+$labels['abovequote'] = 'virs citāta';
+$labels['insertsignature'] = 'Ievietot parakstu';
+$labels['folder'] = 'Mapi';
 $labels['folders'] = 'Mapes';
 $labels['foldername'] = 'Mapes nosaukums';
-$labels['subscribed'] = 'Abonētās';
+$labels['subscribed'] = 'Abonēta';
 $labels['messagecount'] = 'Vēstules';
 $labels['create'] = 'Izveidot';
 $labels['createfolder'] = 'Izveidot jaunu mapi';
-$labels['rename'] = 'Pārsaukt';
-$labels['renamefolder'] = 'Pārsaukt mapi';
-$labels['deletefolder'] = 'Dzēst mapi';
 $labels['managefolders'] = 'Rediģēt mapes';
-$labels['specialfolders'] = 'Speciālās mapes';
+$labels['specialfolders'] = 'Īpašās mapes';
 $labels['sortby'] = 'Kārtot pēc';
 $labels['sortasc'] = 'Kārtot augošā secībā';
 $labels['sortdesc'] = 'Kārtot dilstošā secībā';
index 4d2e16cf93e3c14fd8485c6bf8229cbeffb47183..4b9ea05c9562b28a3b869455db7c63acaf17ff8d 100644 (file)
@@ -5,17 +5,17 @@
 +-----------------------------------------------------------------------+
 | language/lv/messages.inc                                              |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Rudolfs Osins <dev.random@gmail.com>                          |
-|         Mikelis Zalais <mik@prog.lv>                                  |
+| Author: Rūdolfs Ošiņš <dev.random@gmail.com>                          |
+|         Miķelis Zaļais <mik@prog.lv>                                  |
 |         Lauris Bukšis-Haberkorns <lauris@nix.lv>                      |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2400 2009-04-19 11:32:56Z yllar $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -24,17 +24,20 @@ $messages['loginfailed'] = 'Neizdevās pieslēgties';
 $messages['cookiesdisabled'] = 'Jūsu pārlūkprogramma neatbalsta sīkdatnes (cookies)';
 $messages['sessionerror'] = 'Jūsu sessija ir beigusies';
 $messages['imaperror'] = 'Neizdevās pieslēgties IMAP serverim';
+$messages['servererror'] = 'Servera kļūme.';
+$messages['invalidrequest'] = 'Nederīgs pieprasījums. Dati netika saglabāti.';
 $messages['nomessagesfound'] = 'Šajā pastkastē nav vēstuļu';
-$messages['loggedout'] = 'Jūs esat veiksmīgi atslēdzies';
+$messages['loggedout'] = 'Jūs esat veiksmīgi atslēdzies no sistēmas';
 $messages['mailboxempty'] = 'Pastkaste tukša';
 $messages['loading'] = 'Notiek ielāde...';
+$messages['uploading'] = 'Notiek faila augšupielāde...';
 $messages['loadingdata'] = 'Tiek ielādēti dati...';
 $messages['checkingmail'] = 'Notiek pasta pārbaude...';
 $messages['sendingmessage'] = 'Tiek sūtīta vēstule...';
 $messages['messagesent'] = 'Vēstule nosūtīta veiksmīgi';
 $messages['savingmessage'] = 'Vēstule tiek saglabāta...';
 $messages['messagesaved'] = 'Vēstule saglabāta pie uzmetumiem';
-$messages['successfullysaved'] = 'Saglabāts veiksmīgi';
+$messages['successfullysaved'] = 'Iestatījumi veiksmīgi saglabāti';
 $messages['addedsuccessfully'] = 'Ieraksts veiksmīgi pievienots adrešu grāmatai';
 $messages['contactexists'] = 'Ieraksts ar šādu e-pasta adresi jau eksistē';
 $messages['blockedimages'] = 'Drošības nolūkos attēli, kas tiek ielādēti no cita servera, šajā vēstulē ir bloķēti';
@@ -47,13 +50,12 @@ $messages['errorsavingsent'] = 'Notika kļūda saglabājot nosūtīto vēstuli';
 $messages['errorsaving'] = 'Saglabājot vēstuli notikusi kļūme, vēstule netika saglabāta';
 $messages['errormoving'] = 'Vēstule netika pārvietota';
 $messages['errordeleting'] = 'Vēstule netika dzēsta';
+$messages['errormarking'] = 'Nebija iespējams iezīmēt vēstuli';
 $messages['deletecontactconfirm'] = 'Vai tiešām vēlaties dzēst iezīmēto(ās) kontaktpersonas?';
 $messages['deletemessagesconfirm'] = 'Vai tiešām vēlaties dzēst iezīmēto(ās) vēstules?';
 $messages['deletefolderconfirm'] = 'Vai tiešām vēlaties dzēst šo mapi?';
 $messages['purgefolderconfirm'] = 'Vai tiešām vēlaties dzēst visas vēstules, kas atrodas šajā mapē?';
-$messages['foldercreating'] = 'Izveidoju mapi...';
 $messages['folderdeleting'] = 'Dzēšu mapi...';
-$messages['folderrenaming'] = 'Pārsaucu mapi...';
 $messages['foldermoving'] = 'Pārvietoju mapi...';
 $messages['formincomplete'] = 'Formulārs nav pilnībā aizpildīts';
 $messages['noemailwarning'] = 'Lūdzu ievadiet pareizu e-pasta adresi';
@@ -63,10 +65,11 @@ $messages['nosenderwarning'] = 'Lūdzu ievadiet saņēmēja e-pasta adresi';
 $messages['norecipientwarning'] = 'Lūdzu ievadiet vismaz vienu saņēmēju';
 $messages['nosubjectwarning'] = 'Lauks "temats" ir tukšs. Vai vēlaties to aizpildīt tagad?';
 $messages['nobodywarning'] = 'Sūtīt vēstuli bez satura teksta?';
-$messages['notsentwarning'] = 'Vēstule netika nosūtīta. Vai vēlaties atmest savu vēstuli?';
+$messages['notsentwarning'] = 'Vēstule netika nosūtīta. Vai tiešām vēlaties atcelt vēstules rakstīsanu?';
 $messages['noldapserver'] = 'Lūdzu izvēlaties LDAP serveri';
 $messages['nocontactsreturned'] = 'Neviena kontaktpersona netika atrasta';
 $messages['nosearchname'] = 'Lūdzu ievadiet kontaktpersonas vārdu vai e-pasta adresi';
+$messages['notuploadedwarning'] = 'Visi pielikumi vēl nav augšupielādēti. Lūdzu uzgaidiet vai atceļiet augšupielādi!';
 $messages['searchsuccessful'] = 'Atrastas $nr vēstules';
 $messages['searchnomatch'] = 'Meklēšanā nekas netika atrasts';
 $messages['searching'] = 'Notiek meklēšana...';
@@ -86,7 +89,6 @@ $messages['movingmessage'] = 'Pārvietoju vēstules...';
 $messages['receiptsent'] = 'Saņemšanas apstiprinājums nosūtīts';
 $messages['errorsendingreceipt'] = 'Neizdevās nosūtīt apstiprinājumu';
 $messages['nodeletelastidentity'] = 'Šo identitāti nevar izdzēst, tā ir pati pēdējā.';
-$messages['addsubfolderhint'] = 'Šis folderis tiks izveidots kā apakšfolderis tam, kurš patreiz ir izvēlēts';
 $messages['forbiddencharacter'] = 'Mapes nosaukums satur aizliegtus simbolus';
 $messages['selectimportfile'] = 'Lūdzu izvēlieties failu, ko vēlaties augšupielādēt';
 $messages['addresswriterror'] = 'Izvēlētās adrešu grāmatas datus nevar labot';
@@ -96,5 +98,13 @@ $messages['importconfirm'] = '<b>Veiksmīgi ieimportēti $inserted kontakti, net
 $messages['opnotpermitted'] = 'Darbība nav atļauta!';
 $messages['nofromaddress'] = 'Izvēlētajai identitātei nav norādīta e-pasta adrese';
 $messages['editorwarning'] = 'Pārslēdzoties uz vienkāršotu teksta redaktoru, tiks pazaudēts esošais teksta formatējums. Vai vēlaties turpināt?';
+$messages['httpreceivedencrypterror'] = 'Kļūme. Lūdzu sazinieties ar administratoru. <b>Nav iespējams nosūtīt vēstuli.</b>';
+$messages['smtpconnerror'] = 'SMTP kļūme ($code): Neizdevās pieslēgties serverim';
+$messages['smtpautherror'] = 'SMTP kļūme ($code): Neizdevās autentificēties';
+$messages['smtpfromerror'] = 'SMTP kļūme ($code): Neizdevās iestatīt sūtītāju "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP kļūme ($code): Neizdevās pievienot saņēmēju "$to" ($msg)';
+$messages['smtprecipientserror'] = 'SMTP kļūme: Nav iespējams parsēt saņēmēju sarakstu';
+$messages['smtperror'] = 'SMTP kļūme: $msg';
+$messages['emailformaterror'] = 'Nepareiza e-pasta adrese: $email';
 
 ?>
index 250010e56108aee20159700670683ff6f48432c0..e622d1514dbe03752730eeb87b9b896dd2065eca 100755 (executable)
@@ -2,31 +2,31 @@
 
 /*
 +-----------------------------------------------------------------------+
-| language/mk_MK/labels.inc                                                |
+| language/mk_MK/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author:  Ivan Mishev - mishevivan@gmail.com                           |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
 $labels = array();
 $labels['welcome'] = 'Добредојдовте во $product';
-$labels['username'] = 'Ð\9aоÑ\80иÑ\81ниÑ\87ко Ð\98ме';
+$labels['username'] = 'Ð\9aоÑ\80иÑ\81ниÑ\87ко Ð¸ме';
 $labels['password'] = 'Лозинка';
 $labels['server'] = 'Сервер';
-$labels['login'] = 'Ð\9bогиÑ\80аÑ\98 Ð¡Ðµ';
-$labels['logout'] = 'Одлогирај Се';
-$labels['mail'] = 'Ð\95\9cаил';
-$labels['settings'] = 'Ð\9fодеÑ\81увања';
+$labels['login'] = 'Ð\9dаÑ\98ава';
+$labels['logout'] = 'Одјава';
+$labels['mail'] = 'Ð\95¿Ð¾Ñ\88Ñ\82а';
+$labels['settings'] = 'Ð\9dагодувања';
 $labels['addressbook'] = 'Именик';
-$labels['inbox'] = 'Пошта';
+$labels['inbox'] = 'Примени';
 $labels['drafts'] = 'Непратени';
 $labels['sent'] = 'Пратени';
 $labels['trash'] = 'Корпа';
@@ -37,22 +37,22 @@ $labels['to'] = 'Примач';
 $labels['cc'] = 'Копирај';
 $labels['bcc'] = 'Bcc';
 $labels['replyto'] = 'Препрати на';
-$labels['date'] = 'Дата';
+$labels['date'] = 'Датум';
 $labels['size'] = 'Големина';
 $labels['priority'] = 'Приоритет';
 $labels['organization'] = 'Организација';
 $labels['reply-to'] = 'Препрати на';
 $labels['mailboxlist'] = 'Папки';
-$labels['messagesfromto'] = '$count пораки од $from';
-$labels['messagenrof'] = '$nr порака од $count';
+$labels['messagesfromto'] = 'Писма од $from до $to од $count';
+$labels['messagenrof'] = 'Писмо $nr од $count';
 $labels['moveto'] = 'Премести во...';
-$labels['download'] = 'сними';
-$labels['filename'] = 'Име на датотеката';
-$labels['filesize'] = 'Големина на датотеката';
+$labels['download'] = 'Преземи';
+$labels['filename'] = 'Ð\98ме Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82екаÑ\82а';
+$labels['filesize'] = 'Ð\93олемина Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82екаÑ\82а';
 $labels['preferhtml'] = 'Прикажи во HTML';
-$labels['htmlmessage'] = 'HTML Ð\9fоÑ\80ака';
-$labels['prettydate'] = 'Убави дати';
-$labels['addtoaddressbook'] = 'Додади во именик';
+$labels['htmlmessage'] = 'HTML Ð¿Ð¸Ñ\81мо';
+$labels['prettydate'] = 'Убави датуми';
+$labels['addtoaddressbook'] = 'Додај во именик';
 $labels['sun'] = 'Нед';
 $labels['mon'] = 'Пон';
 $labels['tue'] = 'Вто';
@@ -93,173 +93,195 @@ $labels['longnov'] = 'Ноември';
 $labels['longdec'] = 'Декември';
 $labels['today'] = 'Денес';
 $labels['checkmail'] = 'Провери пошта';
-$labels['writenewmessage'] = 'Ð\9dова Ð¿Ð¾Ñ\80ака';
-$labels['replytomessage'] = 'Ð\9eдговоÑ\80и Ð½Ð° Ð¿Ð¾Ñ\80акаÑ\82а';
-$labels['replytoallmessage'] = 'Одговори на сите';
-$labels['forwardmessage'] = 'Препрати ја пораката';
-$labels['deletemessage'] = 'Ð\9fÑ\80емеÑ\81Ñ\82и Ñ\98а Ð¿Ð¾Ñ\80акаÑ\82а Ð²Ð¾ Ð\9aоÑ\80па';
-$labels['movemessagetotrash'] = 'Ð\9fÑ\80емеÑ\81Ñ\82и Ð³Ð¸ Ð¿Ð¾Ñ\80акиÑ\82е Ð²Ð¾ Ð\9aанÑ\82а';
-$labels['printmessage'] = 'Ð\97а Ð¿ÐµÑ\87аÑ\82еÑ\9aе';
-$labels['previousmessage'] = 'Прикажи ја претходната порака';
-$labels['previousmessages'] = 'Ð\9fÑ\80икажи Ð³Ð¸ Ð¿Ñ\80еÑ\82Ñ\85одниÑ\82е Ð¿Ð¾Ñ\80аки';
-$labels['firstmessage'] = 'Прикажи ја првата порака';
-$labels['firstmessages'] = 'Ð\9fÑ\80икажи Ð³Ð¸ Ð¿Ñ\80виÑ\82е Ð¿Ð¾Ñ\80аки';
-$labels['nextmessage'] = 'Прикажи ја наредната порака';
-$labels['nextmessages'] = 'Ð\9fÑ\80икажи Ð³Ð¸ Ñ\81ледниÑ\82е Ð¿Ð¾Ñ\80аки';
-$labels['lastmessage'] = 'Прикажи ја последната порака';
-$labels['lastmessages'] = 'Ð\9fÑ\80икажи Ð³Ð¸ Ð¿Ð¾Ñ\81ледниÑ\82е Ð¿Ð¾Ñ\80аки';
-$labels['backtolist'] = 'Ð\92Ñ\80аÑ\82и Ñ\81е Ð²Ð¾ Ð¿Ð¾Ñ\88Ñ\82енÑ\81коÑ\82о Ñ\81андаÑ\87е';
-$labels['viewsource'] = 'Покажи го изворот на пракање';
-$labels['markmessages'] = 'Ð\9eбележи Ð³Ð¸ Ð¿Ð¾Ñ\80акиÑ\82е';
+$labels['writenewmessage'] = 'Ð\9dово Ð¿Ð¸Ñ\81мо';
+$labels['replytomessage'] = 'Ð\9eдговоÑ\80и Ð½Ð° Ð¸Ñ\81пÑ\80аÑ\9cаÑ\87оÑ\82';
+$labels['replytoallmessage'] = 'Одговори на испраќачот и сите примачи';
+$labels['forwardmessage'] = 'Препрати писмо';
+$labels['deletemessage'] = 'Ð\98збÑ\80иÑ\88и Ð¿Ð¸Ñ\81мо';
+$labels['movemessagetotrash'] = 'Ð\9fÑ\80емеÑ\81Ñ\82и Ð³Ð¸ Ð¿Ð¸Ñ\81маÑ\82а Ð²Ð¾ Ð\9aоÑ\80па';
+$labels['printmessage'] = 'Ð\98Ñ\81пеÑ\87аÑ\82и Ð¿Ð¸Ñ\81мо';
+$labels['previousmessage'] = 'Прикажи го претходното писмо';
+$labels['previousmessages'] = 'Ð\9fÑ\80икажи Ð³Ð¸ Ð¿Ñ\80еÑ\82Ñ\85одниÑ\82е Ð¿Ð¸Ñ\81ма';
+$labels['firstmessage'] = 'Прикажи го првото писмо';
+$labels['firstmessages'] = 'Ð\9fÑ\80икажи Ð³Ð¸ Ð¿Ñ\80виÑ\82е Ð¿Ð¸Ñ\81ма';
+$labels['nextmessage'] = 'Прикажи го следното писмо';
+$labels['nextmessages'] = 'Ð\9fÑ\80икажи Ð³Ð¸ Ñ\81ледниÑ\82е Ð¿Ð¸Ñ\81ма';
+$labels['lastmessage'] = 'Прикажи го последното писмо';
+$labels['lastmessages'] = 'Ð\9fÑ\80икажи Ð³Ð¸ Ð¿Ð¾Ñ\81ледниÑ\82е Ð¿Ð¸Ñ\81ма';
+$labels['backtolist'] = 'Ð\9dазад ÐºÐ¾Ð½ Ð»Ð¸Ñ\81Ñ\82а Ð½Ð° Ð¿Ð¸Ñ\81ма';
+$labels['viewsource'] = 'Покажи го изворот на писмото';
+$labels['markmessages'] = 'Ð\9eбележи Ð³Ð¸ Ð¿Ð¸Ñ\81маÑ\82а';
 $labels['markread'] = 'Како прочитани';
 $labels['markunread'] = 'Како непрочитани';
-$labels['markflagged'] = 'Како обележана';
-$labels['markunflagged'] = 'Како необележана';
-$labels['select'] = 'Одбележи';
+$labels['markflagged'] = 'Како обележано';
+$labels['markunflagged'] = 'Како необележано';
+$labels['messageactions'] = 'Повеќе дејства...';
+$labels['select'] = 'Одбери';
 $labels['all'] = 'Сите';
-$labels['none'] = 'Ð\9dикоÑ\98а';
+$labels['none'] = 'Ð\9dиедно';
 $labels['unread'] = 'Непрочитани';
 $labels['flagged'] = 'Обележано';
 $labels['unanswered'] = 'Неодговорено';
+$labels['deleted'] = 'Избришано';
+$labels['invert'] = 'Обратно';
 $labels['filter'] = 'Филтер';
-$labels['compact'] = 'УÑ\80едно';
+$labels['compact'] = 'Ð\9aомпакÑ\82но';
 $labels['empty'] = 'Испразни';
-$labels['purge'] = 'ЧиÑ\81Ñ\82еÑ\9aе';
+$labels['purge'] = 'Ð\98Ñ\81Ñ\87иÑ\81Ñ\82и';
 $labels['quota'] = 'Искористен простор';
 $labels['unknown'] = 'непознато';
 $labels['unlimited'] = 'неограничено';
-$labels['quicksearch'] = 'Брзо претражување';
-$labels['resetsearch'] = 'Ново претражување';
+$labels['quicksearch'] = 'Брзо пребарување';
+$labels['resetsearch'] = 'Ново пребарување';
+$labels['searchmod'] = 'Модификатори на пребарувањето';
+$labels['msgtext'] = 'Цело писмо';
 $labels['openinextwin'] = 'Отвори во нов прозорец';
-$labels['compose'] = 'Нова порака';
-$labels['savemessage'] = 'Снимај ја пораката во Непратени';
-$labels['sendmessage'] = 'Прати ја пораката';
-$labels['addattachment'] = 'Прикачи фајл';
-$labels['charset'] = 'Charset';
-$labels['editortype'] = 'Тип на едитор';
+$labels['emlsave'] = 'Преземи (.eml)';
+$labels['compose'] = 'Пиши ново писмо';
+$labels['editasnew'] = 'Уреди како ново';
+$labels['savemessage'] = 'Зачувај го писмото во Непратени';
+$labels['sendmessage'] = 'Испрати сега';
+$labels['addattachment'] = 'Приложи податотека';
+$labels['charset'] = 'Збир од знаци';
+$labels['editortype'] = 'Тип на уредник';
 $labels['returnreceipt'] = 'Врати ';
-$labels['checkspelling'] = 'Провери спелување';
+$labels['checkspelling'] = 'Провери правопис';
 $labels['resumeediting'] = 'Продолжи со уредување';
-$labels['revertto'] = 'Ð\9eбÑ\80аÑ\82и Ñ\81е на';
-$labels['attachments'] = 'Ð\9fÑ\80икаÑ\87ено';
-$labels['upload'] = 'Прикачи';
+$labels['revertto'] = 'Ð\92Ñ\80аÑ\82и на';
+$labels['attachments'] = 'Ð\9fÑ\80иложено';
+$labels['upload'] = 'Подигни';
 $labels['close'] = 'Затвори';
 $labels['low'] = 'Низок';
 $labels['lowest'] = 'Најнизок';
 $labels['normal'] = 'Нормален';
 $labels['high'] = 'Висок';
 $labels['highest'] = 'Највисок';
-$labels['nosubject'] = '(нема Ñ\82ема)';
-$labels['showimages'] = 'Прикажи ги сликите';
+$labels['nosubject'] = '(без Ð½Ð°Ñ\81лов)';
+$labels['showimages'] = 'Прикажи слики';
 $labels['alwaysshow'] = 'Секогаш прикажувај ги сликите од $sender';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Обичен текст';
-$labels['savesentmessagein'] = 'Сними ја пратената порака во';
-$labels['dontsave'] = 'не ја снимај';
-$labels['maxuploadsize'] = 'Ð\9cакÑ\81ималнаÑ\82а Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ð³Ð¾Ð»ÐµÐ¼Ð¸Ð½Ð° Ð½Ð° датотеката е $size';
+$labels['savesentmessagein'] = 'Сними го пратеното писмо во';
+$labels['dontsave'] = 'не зачувувај';
+$labels['maxuploadsize'] = 'Ð\9cакÑ\81ималнаÑ\82а Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð° Ð³Ð¾Ð»ÐµÐ¼Ð¸Ð½Ð° Ð·Ð° Ð¿Ð¾датотеката е $size';
 $labels['addcc'] = 'Додај Cc';
 $labels['addbcc'] = 'Додај Bcc';
-$labels['addreplyto'] = 'Ð\94одаÑ\98 Ð\9eдговоÑ\80и-Ð\9dа';
-$labels['mdnrequest'] = 'Ð\9fÑ\80аÑ\9cаÑ\87оÑ\82 Ð½Ð° Ð¾Ð²Ð°Ð° Ð¿Ð¾Ñ\80ака Ñ\81ака Ð´Ð° Ð´Ð¾Ð±Ð¸Ðµ Ð¸Ð·Ð²ÐµÑ\81Ñ\82Ñ\83ваÑ\9aе ÐºÐ¾Ð³Ð° Ñ\9cе Ñ\98а Ð¿Ñ\80оÑ\87иÑ\82аÑ\82е Ð¿Ð¾Ñ\80акаÑ\82а. Дали сакате да го известите?';
-$labels['receiptread'] = 'Извести (читај)';
+$labels['addreplyto'] = 'Ð\94одаÑ\98 Ð\9eдговоÑ\80и-на';
+$labels['mdnrequest'] = 'Ð\9fÑ\80аÑ\9cаÑ\87оÑ\82 Ð½Ð° Ð¾Ð²Ð°Ð° Ð¿Ð¾Ñ\80ака Ñ\81ака Ð´Ð° Ð±Ð¸Ð´Ðµ Ð¸Ð·Ð²ÐµÑ\81Ñ\82ен ÐºÐ¾Ð³Ð° Ñ\9cе Ð³Ð¾ Ð¿Ñ\80оÑ\87иÑ\82аÑ\82е Ð¿Ð¸Ñ\81моÑ\82о. Дали сакате да го известите?';
+$labels['receiptread'] = 'Извести (прочитано)';
 $labels['yourmessage'] = 'Ова е известување за вашата порака';
-$labels['receiptnote'] = 'Ð\97абелеÑ\88ка: Ð\9eва Ð¸Ð·Ð²ÐµÑ\81Ñ\82Ñ\83ваÑ\9aе Ñ\81амо Ð¿Ð¾Ñ\82вÑ\80дÑ\83ва Ð´ÐµÐºÐ° Ð¿Ð¾Ñ\80акаÑ\82а ÐºÐ¾Ñ\98а Ñ\81Ñ\82е Ñ\98а Ð¿Ñ\80аÑ\82иле Ðµ Ð¾Ñ\82воÑ\80ена. Ð\9dе Ðµ Ð³Ð°Ñ\80анÑ\86иÑ\98а Ð´ÐµÐºÐ° Ð¿Ñ\80имаÑ\87оÑ\82 Ñ\98а Ð¿Ñ\80оÑ\87иÑ\82ал Ð¸Ð»Ð¸ Ñ\98а Ñ\80азбÑ\80ал Ð¸Ñ\81Ñ\82аÑ\82а.';
-$labels['name'] = 'Ð\9fÑ\80икажано Ð¸Ð¼Ðµ';
+$labels['receiptnote'] = 'Ð\9dапомена: Ð\9eва Ð¸Ð·Ð²ÐµÑ\81Ñ\82Ñ\83ваÑ\9aе Ñ\81амо Ð¿Ð¾Ñ\82вÑ\80дÑ\83ва Ð´ÐµÐºÐ° Ð¿Ð¸Ñ\81моÑ\82о ÐºÐ¾Ðµ Ñ\81Ñ\82е Ð³Ð¾ Ð¿Ñ\80аÑ\82иле Ðµ Ð¾Ñ\82воÑ\80ено. Ð\9dе Ðµ Ð³Ð°Ñ\80анÑ\86иÑ\98а Ð´ÐµÐºÐ° Ð¿Ñ\80имаÑ\87оÑ\82 Ð³Ð¾ Ð¿Ñ\80оÑ\87иÑ\82ал Ð¸Ð»Ð¸ Ñ\80азбÑ\80ал Ð¸Ñ\81Ñ\82оÑ\82о.';
+$labels['name'] = 'Ð\98ме Ð·Ð° Ð¿Ñ\80иказ';
 $labels['firstname'] = 'Име';
 $labels['surname'] = 'Презиме';
-$labels['email'] = 'Ð\95¼Ð°Ð¸Ð»';
-$labels['addcontact'] = 'Додади го контактот';
-$labels['editcontact'] = 'Ð\9fÑ\80омени Ð³Ð¾ ÐºÐ¾Ð½Ñ\82акÑ\82от';
-$labels['edit'] = 'Ð\9fÑ\80омени';
+$labels['email'] = 'Ð\95¿Ð¾Ñ\88Ñ\82а';
+$labels['addcontact'] = 'Додај нов контакт';
+$labels['editcontact'] = 'УÑ\80еди ÐºÐ¾Ð½Ñ\82акт';
+$labels['edit'] = 'УÑ\80еди';
 $labels['cancel'] = 'Откажи';
-$labels['save'] = 'Сними';
+$labels['save'] = 'Ð\97аÑ\87Ñ\83ваÑ\98';
 $labels['delete'] = 'Избриши';
-$labels['newcontact'] = 'Додади ново име';
+$labels['newcontact'] = 'Додај ново име';
 $labels['deletecontact'] = 'Избриши ги следните имиња';
-$labels['composeto'] = 'Напиши порака';
-$labels['contactsfromto'] = '$count имиња $from до $to';
+$labels['composeto'] = 'Напиши порака за';
+$labels['contactsfromto'] = 'Имиња од $from до $to од $count';
 $labels['print'] = 'Испечати';
-$labels['export'] = 'Ð\98звади како';
-$labels['exportvcards'] = 'Ð\95кÑ\81поÑ\80Ñ\82иÑ\80аÑ\98 ги контактите во vCard формат';
+$labels['export'] = 'Ð\98звези како';
+$labels['exportvcards'] = 'Ð\98звези ги контактите во vCard формат';
 $labels['previouspage'] = 'Прикажи претходна страна';
 $labels['firstpage'] = 'Прикажи ја првата страна';
 $labels['nextpage'] = 'Прикажи ја следната страна';
 $labels['lastpage'] = 'Прикажи ја последната страна';
 $labels['groups'] = 'Групи';
-$labels['personaladrbook'] = 'Ð\90дреси';
-$labels['import'] = 'Ð\98мпоÑ\80Ñ\82иÑ\80аÑ\98';
-$labels['importcontacts'] = 'Ð\98мпоÑ\80Ñ\82иÑ\80аÑ\98 контакти';
-$labels['importfromfile'] = 'Ð\98мпоÑ\80Ñ\82иÑ\80аÑ\98 Ð¾Ð´ датотека:';
+$labels['personaladrbook'] = 'Ð\9bиÑ\87ни Ð°дреси';
+$labels['import'] = 'Увези';
+$labels['importcontacts'] = 'Увези контакти';
+$labels['importfromfile'] = 'Увези Ð¾Ð´ Ð¿Ð¾датотека:';
 $labels['importreplace'] = 'Замени го целиот именик';
-$labels['importtext'] = 'Ð\9cожеÑ\88 Ð´Ð° Ð¿Ñ\80икаÑ\87еÑ\88 ÐºÐ¾Ð½Ñ\82акÑ\82и Ð¾Ð´ Ð²ÐµÑ\9cе Ð¿Ð¾Ñ\81Ñ\82оеÑ\87ки Ð¸Ð¼ÐµÐ½Ð¸Ðº.<br/>Ð\92о Ð¼Ð¾Ð¼ÐµÐ½Ñ\82оÑ\82 Ð¿Ð¾Ð´Ð´Ñ\80жÑ\83ваме Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80аÑ\9aе Ð½Ð° Ð°Ð´Ñ\80еÑ\81и Ð¾Ð´ <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> форматот.';
+$labels['importtext'] = 'Ð\9cожеÑ\82е Ð´Ð° Ð¿Ñ\80иложиÑ\82е ÐºÐ¾Ð½Ñ\82акÑ\82и Ð¾Ð´ Ð²ÐµÑ\9cе Ð¿Ð¾Ñ\81Ñ\82оеÑ\87ки Ð¸Ð¼ÐµÐ½Ð¸Ðº.<br/>Ð\92о Ð¼Ð¾Ð¼ÐµÐ½Ñ\82оÑ\82 Ð¿Ð¾Ð´Ð´Ñ\80жÑ\83ваме Ñ\83воз Ð½Ð° Ð°Ð´Ñ\80еÑ\81и Ð¾Ð´ <a href="http://mk.wikipedia.org/wiki/VCard">vCard</a> форматот.';
 $labels['done'] = 'Завршено';
-$labels['settingsfor'] = 'Ð\9fодеÑ\81увања за';
-$labels['preferences'] = 'Ð\9fодеÑ\81Ñ\83ваÑ\9aа';
-$labels['userpreferences'] = 'Ð\9aоÑ\80иÑ\81ниÑ\87ки Ð¿Ð¾Ð´ÐµÑ\81Ñ\83ваÑ\9aа';
-$labels['editpreferences'] = 'Ð\9fÑ\80омени Ð³Ð¸ ÐºÐ¾Ñ\80иÑ\81ниÑ\87киÑ\82е Ð¿Ð¾Ð´ÐµÑ\81Ñ\83ваÑ\9aа';
+$labels['settingsfor'] = 'Ð\9dагодувања за';
+$labels['preferences'] = 'Ð\9dагодÑ\83ваÑ\9aа ';
+$labels['userpreferences'] = 'Ð\9aоÑ\80иÑ\81ниÑ\87ки Ð½Ð°Ð³Ð¾Ð´Ñ\83ваÑ\9aа ';
+$labels['editpreferences'] = 'Ð\9fÑ\80омени ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð½Ð°Ð³Ð¾Ð´Ñ\83ваÑ\9aа ';
 $labels['identities'] = 'Идентитети';
 $labels['manageidentities'] = 'Организирај ги идентитетите за овој корисник';
 $labels['newidentity'] = 'Нов идентитет';
 $labels['newitem'] = 'Нов објект';
 $labels['edititem'] = 'Промени објект';
-$labels['setdefault'] = 'Ð\9eдбеÑ\80и за основно';
-$labels['autodetect'] = 'Ð\90вÑ\82омаÑ\82Ñ\81ко';
+$labels['setdefault'] = 'Ð\9fоÑ\81Ñ\82ави за основно';
+$labels['autodetect'] = 'Ð\90вÑ\82омаÑ\82Ñ\81ки';
 $labels['language'] = 'Јазик';
-$labels['timezone'] = 'Ð\92Ñ\80еменÑ\81ка зона';
-$labels['pagesize'] = 'Редови прикажани на страна';
+$labels['timezone'] = 'ЧаÑ\81овна зона';
+$labels['pagesize'] = 'Редови по страна';
 $labels['signature'] = 'Потпис';
 $labels['dstactive'] = 'Промени на времето';
-$labels['htmleditor'] = 'Создади HTML порака';
+$labels['htmleditor'] = 'Ð\9fиÑ\88и HTML порака';
 $labels['htmlsignature'] = 'HTML потпис';
-$labels['previewpane'] = 'Ð\9fÑ\80икажи Ð³Ð¾ Ð¿Ñ\80еÑ\82Ñ\85одниоÑ\82 Ð¿Ð°Ð½ÐµÐ»';
+$labels['previewpane'] = 'Ð\9fÑ\80икажи Ð¿Ñ\80озоÑ\80еÑ\86 Ð·Ð° Ð¿Ñ\80еглед';
 $labels['skin'] = 'Модел на изгледот';
-$labels['logoutclear'] = 'Ð\9eчисти ја Кантата при излез';
-$labels['logoutcompact'] = 'Подреди ја поштата при излез';
+$labels['logoutclear'] = 'Ð\98Ñ\81чисти ја Кантата при излез';
+$labels['logoutcompact'] = 'Подреди ги примените при излез';
 $labels['uisettings'] = 'Кориснички изглед';
-$labels['serversettings'] = 'Ð\9fодеÑ\81увања на серверот';
+$labels['serversettings'] = 'Ð\9dагодувања на серверот';
 $labels['mailboxview'] = 'Приказ на поштенското сандаче';
-$labels['mdnrequests'] = 'Ð\9dаÑ\98ави за праќачот';
+$labels['mdnrequests'] = 'Ð\98звеÑ\81Ñ\82Ñ\83ваÑ\9aа за праќачот';
 $labels['askuser'] = 'прашај го корисникот';
-$labels['autosend'] = 'авÑ\82омаÑ\82Ñ\81ки Ð¸Ñ\81пÑ\80аÑ\82и';
-$labels['ignore'] = 'игноÑ\80иÑ\80аÑ\9aе';
-$labels['readwhendeleted'] = 'Обележи ја пораката како прочитана при бришење';
-$labels['flagfordeletion'] = 'Обележи ја пораката за бришење наместо да ја избришеш';
-$labels['skipdeleted'] = 'Ð\9dе Ð³Ð¸ Ð¿Ñ\80икажÑ\83ваÑ\98 Ð¸Ð·Ð±Ñ\80иÑ\88аниÑ\82е Ð¿Ð¾Ñ\80аки';
-$labels['showremoteimages'] = 'Ð\9fÑ\80икажи Ð³Ð¸ Ñ\81ликиÑ\82е';
+$labels['autosend'] = 'иÑ\81пÑ\80аÑ\82и Ð°Ð²Ñ\82омаÑ\82Ñ\81ки';
+$labels['ignore'] = 'игноÑ\80иÑ\80аÑ\98';
+$labels['readwhendeleted'] = 'Обележи го писмото како прочитано при бришење';
+$labels['flagfordeletion'] = 'Обележи го писмото за бришење наместо да го избришеш';
+$labels['skipdeleted'] = 'Ð\9dе Ð³Ð¸ Ð¿Ñ\80икажÑ\83ваÑ\98 Ð¸Ð·Ð±Ñ\80иÑ\88аниÑ\82е Ð¿Ð¸Ñ\81ма';
+$labels['showremoteimages'] = 'Ð\9fÑ\80икажи Ð²Ð¼ÐµÑ\82наÑ\82и Ñ\81лики';
 $labels['fromknownsenders'] = 'од познати праќачи';
 $labels['always'] = 'секогаш';
-$labels['showinlineimages'] = 'Ð\9fÑ\80икажи Ð³Ð¸ Ð¿Ñ\80икаÑ\87ениÑ\82е Ñ\81лики Ð¿Ð¾Ð´ Ð¿Ð¾Ñ\80акаÑ\82а';
-$labels['autosavedraft'] = 'Авоматски снимај во Непратени';
+$labels['showinlineimages'] = 'Ð\9fÑ\80икажи Ð¿Ñ\80иложени Ñ\81лики Ð¿Ð¾Ð´ Ð¿Ð¸Ñ\81моÑ\82о';
+$labels['autosavedraft'] = 'Авоматски зачувувај во Непратени';
 $labels['everynminutes'] = 'секои $n минути';
-$labels['keepalive'] = 'Провери за нови пораки на';
+$labels['keepalive'] = 'Проверувај за нови писма на';
 $labels['never'] = 'никогаш';
-$labels['messagesdisplaying'] = 'Ð\9fÑ\80икажÑ\83ваÑ\9aе Ð½Ð° Ð¿Ð¾Ñ\80ака';
-$labels['messagescomposition'] = 'Ð\9fиÑ\88Ñ\83ваÑ\9aе Ð½Ð° Ð¿Ð¾Ñ\80ака';
-$labels['mimeparamfolding'] = 'Име на прикачените датотеки';
-$labels['2231folding'] = 'Full RFC 2231 (Thunderbird)';
+$labels['messagesdisplaying'] = 'Ð\9fÑ\80икажÑ\83ваÑ\9aе Ð½Ð° Ð¿Ð¸Ñ\81ма';
+$labels['messagescomposition'] = 'Ð\9fиÑ\88Ñ\83ваÑ\9aе Ð½Ð° Ð¿Ð¸Ñ\81ма';
+$labels['mimeparamfolding'] = 'Ð\98ме Ð½Ð° Ð¿Ñ\80икаÑ\87ениÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки';
+$labels['2231folding'] = 'Полн RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
-$labels['2047folding'] = 'Full RFC 2047 (друго)';
-$labels['advancedoptions'] = 'Напредни опции';
-$labels['focusonnewmessage'] = 'Фокусирај го прозорецот на прелистувачот на новата порака';
-$labels['checkallfolders'] = 'Провери ги сите папки за нови пораки';
+$labels['2047folding'] = 'Полн RFC 2047 (друго)';
+$labels['advancedoptions'] = 'Напредни можности';
+$labels['focusonnewmessage'] = 'Фокусирај го прозорецот на прелистувачот на новото писмо';
+$labels['checkallfolders'] = 'Провери ги сите папки за нови писма';
+$labels['displaynext'] = 'По бришење/преместување на писмото прикажи го следното писмо';
+$labels['mainoptions'] = 'Главни можности';
+$labels['section'] = 'Заглавие';
+$labels['maintenance'] = 'Одржување';
+$labels['newmessage'] = 'Ново писмо';
+$labels['listoptions'] = 'Можности за листата';
+$labels['signatureoptions'] = 'Можности за потписот';
+$labels['whenreplying'] = 'При одговарање';
+$labels['replytopposting'] = 'новото писмо започни го над оригиналот';
+$labels['replybottomposting'] = 'новото писмо започни го под оригиналот';
+$labels['replyremovesignature'] = 'При одговарање отстрани го изворниот потпис од писмото';
+$labels['autoaddsignature'] = 'Автоматски додавај потпис';
+$labels['newmessageonly'] = 'само нови писма';
+$labels['replyandforwardonly'] = 'само одгорови и препраќања';
+$labels['replysignaturepos'] = 'При одговарање или препраќање стави потпис';
+$labels['belowquote'] = 'под цитираното';
+$labels['abovequote'] = 'над цитираното';
+$labels['insertsignature'] = 'Вметни потпис';
 $labels['folder'] = 'Папка';
 $labels['folders'] = 'Папки';
 $labels['foldername'] = 'Име на папката';
 $labels['subscribed'] = 'Претплатен';
 $labels['messagecount'] = 'Пораки';
-$labels['create'] = 'Креирај';
-$labels['createfolder'] = 'Креирај нова папка';
-$labels['rename'] = 'Преименувај';
-$labels['renamefolder'] = 'Преименувај ја папката';
-$labels['deletefolder'] = 'Избриши ја папката';
+$labels['create'] = 'Создај';
+$labels['createfolder'] = 'Создај нова папка';
 $labels['managefolders'] = 'Организирање на папки';
 $labels['specialfolders'] = 'Специјални папки';
-$labels['sortby'] = 'УÑ\80еди по';
-$labels['sortasc'] = 'УÑ\80еди Ð¿Ð¾ Ð°Ð·Ð±Ñ\83Ñ\87ен Ñ\80ед';
-$labels['sortdesc'] = 'УÑ\80еди Ð¾Ð¿Ð°Ñ\93аÑ\87ки';
-$labels['B'] = 'B';
-$labels['KB'] = 'KB';
-$labels['MB'] = 'MB';
-$labels['GB'] = 'GB';
+$labels['sortby'] = 'СоÑ\80Ñ\82иÑ\80аÑ\98 по';
+$labels['sortasc'] = 'СоÑ\80Ñ\82иÑ\80аÑ\98 Ð½Ð°Ð³Ð¾Ñ\80но';
+$labels['sortdesc'] = 'СоÑ\80Ñ\82иÑ\80аÑ\98 Ð½Ð°Ð´Ð¾Ð»Ð½Ð¾';
+$labels['B'] = 'Б';
+$labels['KB'] = 'КБ';
+$labels['MB'] = 'МБ';
+$labels['GB'] = 'ГБ';
 
 ?>
index bd56962579ae6e13509246bd8dd936a757e9309a..0cf93f78c1cb8648f1d6b797ebb263104d1ebfba 100755 (executable)
 
 /*
 +-----------------------------------------------------------------------+
-| language/mk_MK/messages.inc                                              |
+| language/mk_MK/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author:  Ivan Mishev - mishevivan@gmail.com                           |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
 $messages = array();
-$messages['loginfailed'] = 'Неуспешна најава';
-$messages['cookiesdisabled'] = 'Вашиот прелистувач не прифаќа cookies';
-$messages['sessionerror'] = 'Сесијата е невалидна или е истечена';
-$messages['imaperror'] = 'Конектирањето со IMAP е неуспешно';
-$messages['nomessagesfound'] = 'Немате пораки во вашата пошта';
-$messages['loggedout'] = 'Успешно се одлогиравте. Благодариме!';
+$messages['loginfailed'] = 'Најавата не успеа';
+$messages['cookiesdisabled'] = 'Вашиот прелистувач не прифаќа колачиња';
+$messages['sessionerror'] = 'Сесијата е неважечка или е истечена';
+$messages['imaperror'] = 'Поврзувањето со IMAP не успеа';
+$messages['servererror'] = 'Грешка во серверот!';
+$messages['invalidrequest'] = 'Неважечко барање! Податоците не се зачувани.';
+$messages['nomessagesfound'] = 'Немате писма во ова сандаче';
+$messages['loggedout'] = 'Успешно се одјавивте. Ви благодариме и довидување!';
 $messages['mailboxempty'] = 'Поштенското сандаче е празно.';
 $messages['loading'] = 'Вчитувам...';
+$messages['uploading'] = 'Ја подигам податотеката...';
 $messages['loadingdata'] = 'Ги вчитувам податоците...';
-$messages['checkingmail'] = 'Проверување за нови пораки...';
-$messages['sendingmessage'] = 'Ð\9fÑ\80аÑ\9cаÑ\9aе Ð½Ð° пораката...';
-$messages['messagesent'] = 'Пораката е успешно пратена';
-$messages['savingmessage'] = 'Ð\9fоÑ\80акаÑ\82а Ñ\81е Ñ\81нима...';
-$messages['messagesaved'] = 'Пораката е снимена во Непратени';
-$messages['successfullysaved'] = 'Успешно снимено';
-$messages['addedsuccessfully'] = 'Ð\98меÑ\82о Ðµ Ñ\83Ñ\81пеÑ\88но Ð´Ð¾Ð´Ð°Ð´ÐµÐ½Ð¾ Ð²Ð¸ Ð\98меник';
-$messages['contactexists'] = 'Ð\92еÑ\9cе Ð¿Ð¾Ñ\81Ñ\82ои Ð¸Ð¼Ðµ Ñ\81о Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð°Ñ\82а Ð\95¼Ð°Ð¸Ð» адреса';
+$messages['checkingmail'] = 'Проверувам нова пошта...';
+$messages['sendingmessage'] = 'Ð\88а Ð¸Ñ\81пÑ\80аÑ\9cам пораката...';
+$messages['messagesent'] = 'Ð\9fоÑ\80акаÑ\82а Ðµ Ñ\83Ñ\81пеÑ\88но Ð¸Ñ\81пÑ\80аÑ\82ена';
+$messages['savingmessage'] = 'Ð\88а Ð·Ð°Ñ\87Ñ\83вÑ\83вам Ð¿Ð¾Ñ\80акаÑ\82а...';
+$messages['messagesaved'] = 'Пораката е зачувана во Непратени';
+$messages['successfullysaved'] = 'Успешно зачувано';
+$messages['addedsuccessfully'] = 'Ð\98меÑ\82о Ðµ Ñ\83Ñ\81пеÑ\88но Ð´Ð¾Ð´Ð°Ð´ÐµÐ½Ð¾ Ð²Ð¾ Ð\98меникоÑ\82';
+$messages['contactexists'] = 'Ð\92еÑ\9cе Ð¿Ð¾Ñ\81Ñ\82ои Ð¸Ð¼Ðµ Ñ\81о Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð°Ñ\82а Ð\95¿Ð¾Ñ\88Ñ\82енÑ\81ка адреса';
 $messages['blockedimages'] = 'За да се заштити вашата приватност, сликите во оваа порака не се прикажани.';
-$messages['encryptedmessage'] = 'Оваа порака е кодирана и неможе да се прикаже. Извинете!';
-$messages['nocontactsfound'] = 'Нема Имиња во Именикот.';
-$messages['contactnotfound'] = 'Бараното име не постои';
-$messages['sendingfailed'] = 'Пораката не е пратена';
-$messages['senttooquickly'] = 'Ве молиме почекајте $sec секунда/и пред да ја испратите пораката';
-$messages['errorsavingsent'] = 'Грешка при снимањето на пратената порака';
-$messages['errorsaving'] = 'Грешка при снимањето';
-$messages['errormoving'] = 'Пораката неможе да се премести';
-$messages['errordeleting'] = 'Пораката неможе да се избрише';
-$messages['deletecontactconfirm'] = 'Дали сте сигурни дека сакате да го избришете обележаниот(те) контакт(и)?';
-$messages['deletemessagesconfirm'] = 'Дали сте сигурни дека сакате да го избришете обележаниот(те) порака(и)?';
+$messages['encryptedmessage'] = 'Оваа порака е кодирана и не може да се прикаже. Жалиме!';
+$messages['nocontactsfound'] = 'Нема пронајдено имиња.';
+$messages['contactnotfound'] = 'Бараното име не е пронајдено';
+$messages['sendingfailed'] = 'Не упеав да го испратам писмото';
+$messages['senttooquickly'] = 'Почекајте $sec секунда/и пред да го испратите писмото';
+$messages['errorsavingsent'] = 'Грешка при зачувувањето на пратеното писмо';
+$messages['errorsaving'] = 'Грешка при зачувувањето ';
+$messages['errormoving'] = 'Не можев да го преместам писмото';
+$messages['errordeleting'] = 'Не можев да го избришам писмото';
+$messages['errormarking'] = 'Не можев да го обележам писмото';
+$messages['deletecontactconfirm'] = 'Дали сте сигурни дека сакате да го избришете одбраното(те) име(ња)?';
+$messages['deletemessagesconfirm'] = 'Дали сте сигурни дека сакате да го(и) избришете обележаниот(те) писмо(а)?';
 $messages['deletefolderconfirm'] = 'Дали сте сигурни дека сакате да ја избришете оваа папка?';
-$messages['purgefolderconfirm'] = 'Дали сте сигурни дека сакате да ги избршете сите пораки во оваа папка?';
-$messages['foldercreating'] = 'Папката се креира...';
-$messages['folderdeleting'] = 'Папката се брише...';
-$messages['folderrenaming'] = 'Папката се преименува...';
-$messages['foldermoving'] = 'Папката се преместува...';
+$messages['purgefolderconfirm'] = 'Дали сте сигурни дека сакате да ги избршете сите писма во оваа папка?';
+$messages['folderdeleting'] = 'Ја бришам папката...';
+$messages['foldermoving'] = 'Ја преместувам папката...';
 $messages['formincomplete'] = 'Имате изоставено непополнети информации';
-$messages['noemailwarning'] = 'Внесете валидна емаил адреса';
+$messages['noemailwarning'] = 'Внесете валидна е-поштенска адреса';
 $messages['nonamewarning'] = 'Внесете име';
-$messages['nopagesizewarning'] = 'Внесете ја големината на страната';
-$messages['nosenderwarning'] = 'Внесете ја адресата на праќачот';
+$messages['nopagesizewarning'] = 'Внесете големина на страницата';
+$messages['nosenderwarning'] = 'Внесете адреса на праќачот';
 $messages['norecipientwarning'] = 'Внесете барем еден примач';
 $messages['nosubjectwarning'] = 'Немате внесено „Наслов“. Дали сакате да внесете?';
-$messages['nobodywarning'] = 'Ð\9fоÑ\80акаÑ\82а Ð½ÐµÐ¼Ð° Ñ\82екÑ\81Ñ\82 Ð²Ð¾ Ð½ÐµÐ°. Ð\94али Ñ\81акаÑ\82е Ð´Ð° Ñ\98а пратите?';
-$messages['notsentwarning'] = 'Ð\9fоÑ\80акаÑ\82а Ð½Ðµ Ðµ Ð¿Ñ\80аÑ\82ена. Ð\94али Ñ\81акаÑ\82е Ð´Ð° Ñ\98а Ð¾Ñ\82кажете?';
+$messages['nobodywarning'] = 'Ð\9fиÑ\81моÑ\82о Ð½ÐµÐ¼Ð° Ñ\82екÑ\81Ñ\82 Ð²Ð¾ Ð½ÐµÐ³Ð¾. Ð\94али Ñ\81акаÑ\82е Ð´Ð° Ð³Ð¾ Ð¸Ñ\81пратите?';
+$messages['notsentwarning'] = 'Ð\9fиÑ\81моÑ\82о Ð½Ðµ Ðµ Ð¿Ñ\80аÑ\82ено. Ð\94али Ñ\81акаÑ\82е Ð´Ð° Ð³Ð¾ Ð¾Ñ\82Ñ\84Ñ\80лите?';
 $messages['noldapserver'] = 'Изберете LDAP сервер за пребарување';
 $messages['nocontactsreturned'] = 'Не се најдени имиња';
-$messages['nosearchname'] = 'Внесете име или емаил адреса';
-$messages['searchsuccessful'] = '$nr пораки се најдени';
-$messages['searchnomatch'] = 'Претражувањето нема резлутати';
+$messages['nosearchname'] = 'Внесете име или е-поштенска адреса';
+$messages['notuploadedwarning'] = 'Сè уште нема подигнати прилози. Почекајте или откажете го подигањето';
+$messages['searchsuccessful'] = 'Пронајадени се $nr пораки';
+$messages['searchnomatch'] = 'Пребарувањето не даде резлутати';
 $messages['searching'] = 'Пребарувам....';
 $messages['checking'] = 'Проверувам...';
 $messages['nospellerrors'] = 'Нема грешки во спелувањето';
 $messages['folderdeleted'] = 'Папката е успешно избришана';
 $messages['deletedsuccessfully'] = 'Успешно избришано';
-$messages['converting'] = 'ФоÑ\80маÑ\82иÑ\80аÑ\9aеÑ\82о Ð½Ð° Ð¿Ð¾Ñ\80акаÑ\82а е отстрането...';
-$messages['messageopenerror'] = 'Ð\9fоÑ\80акаÑ\82а Ð½ÐµÐ¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð²Ñ\87иÑ\82а од серверот';
+$messages['converting'] = 'ФоÑ\80маÑ\82иÑ\80аÑ\9aеÑ\82о Ð½Ð° Ð¿Ð¸Ñ\81моÑ\82о е отстрането...';
+$messages['messageopenerror'] = 'Ð\9dе Ð¼Ð¾Ð¶ÐµÐ² Ð´Ð° Ð³Ð¾ Ð²Ñ\87иÑ\82ам Ð¿Ð¸Ñ\81ноÑ\82о од серверот';
 $messages['fileuploaderror'] = 'Прикачувањето е неуспешно';
-$messages['filesizeerror'] = 'Ð\94аÑ\82оÑ\82екаÑ\82а Ñ\88Ñ\82о Ñ\81е Ð¿Ñ\80икаÑ\87Ñ\83ва Ð³Ð¾ Ð¸Ð·Ð¼Ð¸Ð½Ñ\83ва Ð»Ð¸Ð¼Ð¸Ñ\82оÑ\82 од $size';
+$messages['filesizeerror'] = 'Ð\9fодигнаÑ\82аÑ\82а Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека Ð³Ð¾ Ð½Ð°Ð´Ð¼Ð¸Ð½Ñ\83ва Ð¾Ð³Ñ\80аниÑ\87Ñ\83ваÑ\9aеÑ\82о од $size';
 $messages['copysuccess'] = 'Успешно се копирани $nr имиња';
-$messages['copyerror'] = 'Неможе да се копираат адресите';
+$messages['copyerror'] = 'Не можам да ги копирам адресите';
 $messages['sourceisreadonly'] = 'Изворот на оваа адреса неможе да се промени';
 $messages['errorsavingcontact'] = 'Името неможе да се сними';
 $messages['movingmessage'] = 'Пораката се преместува...';
 $messages['receiptsent'] = 'Известувањето е успешно пратено';
 $messages['errorsendingreceipt'] = 'Известувањето не е пратено';
 $messages['nodeletelastidentity'] = 'Овој идентитет неможе да се избрише, тој е последниот.';
-$messages['addsubfolderhint'] = 'Оваа папка ќе биде креирана како под-папка на селектираната.';
 $messages['forbiddencharacter'] = 'Името на папката содржи несоодветен формат';
-$messages['selectimportfile'] = 'Изберете ја датотеката која сакате да ја прикачите';
-$messages['addresswriterror'] = 'Одберениот именик не може да се променува';
-$messages['importwait'] = 'Ð\98мпоÑ\80Ñ\82иÑ\80ам, Ð²Ðµ Ð¼Ð¾Ð»Ð¸Ð¼Ðµ почекајте...';
-$messages['importerror'] = 'Ð\98мпоÑ\80Ñ\82иÑ\80аÑ\9aеÑ\82о Ðµ Ð½ÐµÑ\83Ñ\81пеÑ\88но! Ð\9fÑ\80икаÑ\87енаÑ\82а Ð´Ð°Ñ\82оÑ\82ека Ð½Ðµ Ðµ Ð²Ð°Ð»Ð¸Ð´ÐµÐ½ vCard документ.';
-$messages['importconfirm'] = '<b>Успешно се импортирани $inserted контакти, $skipped веќе постојат и се прескокнати</b>:<p><em>$names</em></p>';
+$messages['selectimportfile'] = 'Ð\98збеÑ\80еÑ\82е Ñ\98а Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82екаÑ\82а ÐºÐ¾Ñ\98а Ñ\81акаÑ\82е Ð´Ð° Ñ\98а Ð¿Ñ\80икаÑ\87иÑ\82е';
+$messages['addresswriterror'] = 'Одбраниот именик не може да се менува';
+$messages['importwait'] = 'УбезÑ\83вам,, почекајте...';
+$messages['importerror'] = 'УвезÑ\83ваÑ\9aеÑ\82о Ð½Ðµ Ð½ÐµÑ\83Ñ\81пеÑ\88но! Ð\9fÑ\80икаÑ\87енаÑ\82а Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека Ð½Ðµ Ðµ Ð²Ð°Ð¶ÐµÑ\87ки vCard документ.';
+$messages['importconfirm'] = '<b>Успешно се увезени $inserted имиња, $skipped веќе постојат и се прескокнати</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Операцијата не е дозволена';
 $messages['nofromaddress'] = 'Не е внесена е-пошта во одберениот идентитет';
-$messages['editorwarning'] = 'Променување во обичен текст променувач ќе резултира со губење на целото форматирање на текстот. Сакате да продолжите?';
+$messages['editorwarning'] = 'Префрлањето на уредникот на обичен текст ќе резултира со губење на целото форматирање на текстот. Дали сакате да продолжите?';
+$messages['httpreceivedencrypterror'] = 'Се појави фатална конфигурациска грешка. Веднаш контактирајте го администраторот. <b>Вашето писмо не мож.</b>';
+$messages['smtpconnerror'] = 'SMTP грешка ($code): Не успеав да се поврзам со серверот';
+$messages['smtpautherror'] = 'SMTP грешка: Не успееа потврдувањето';
+$messages['smtpfromerror'] = 'SMTP грешка ($code): Не успеав да го поставам испраќачот „$from“ ($msg)';
+$messages['smtptoerror'] = 'SMTP грешка ($code): Не успеав да го поставам примачот „$yo“ ($msg)';
+$messages['smtprecipientserror'] = 'SMTP грешка: Не успеав да ја испарсирам листата на примачи';
+$messages['smtperror'] = 'SMTP Error: $msg';
+$messages['emailformaterror'] = 'Неправилна поштенска адреса: $email';
 
 ?>
index 2f862bd3e11eb16ac6137f2577050534d2052b97..218781381525fce95934e222f5a6198079c01b5e 100755 (executable)
 <?php
 
+
 /*
 +-----------------------------------------------------------------------+
-| language/mr_IN/labels.inc                                             |
-|                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2009, RoundQube Dev. - Switzerland                      |
-| Licensed under the GNU GPL                                            |
-|                                                                       |
+|
+ language/mr_IN/labels.inc                                             |
+|
+                                                                       |
+|
+ Language file of the Roundcube Webmail client                         |
+|
+ Copyright (C) 2009, Roundcube Dev. - Switzerland                      |
+|
+ Licensed under the GNU GPL                                            |
+|
+                                                                       |
 +-----------------------------------------------------------------------+
-| Author:Nitin Nimkar <nvncom at yahoo.com>                             |
+| 
+Author:Nitin Nimkar <nvncom at yahoo.com>                             |
 +-----------------------------------------------------------------------+
 
 */
 
+
 $labels = array();
 $labels['welcome'] = '$product वरती स्वागत आहे';
 $labels['username'] = 'वापरकर्त्याचे नाव(तुमचे इमेल) ';
+
 $labels['password'] = 'परवलीचा शब्द';
 $labels['server'] = 'सर्व्हर';
 $labels['login'] = 'प्रवेश';
 $labels['logout'] = 'बाहेर जा';
 $labels['mail'] = 'इ-मेल';
+
 $labels['settings'] = 'तुमची पसंती';
 $labels['addressbook'] = 'पत्ता नोंदवही';
 $labels['inbox'] = 'आलेले संदेश';
 $labels['drafts'] = 'मसुदा';
+
 $labels['sent'] = 'पाठवलेले';
 $labels['trash'] = 'कचरा पेटी';
-$labels['junk'] = 'नको असलेले कचरा संदेश';
+$labels['junk'] = 'नको असलेले कचरा संदेश';
 $labels['subject'] = 'विषय';
+
 $labels['from'] = 'पाठवणार';
 $labels['to'] = 'प्रती';
 $labels['cc'] = 'प्रत';
 $labels['bcc'] = 'गुप्त प्रत';
 $labels['replyto'] = 'उत्तर द्या ';
+
 $labels['date'] = 'दिनांक';
 $labels['size'] = 'आकार';
 $labels['priority'] = 'प्राधान्य';
 $labels['organization'] = 'संस्था';
 $labels['reply-to'] = 'उत्तर द्या ';
+
 $labels['mailboxlist'] = 'फोल्डर्स';
-$labels['messagesfromto'] = '$from कडून $to साठी $count वा';
+$labels['messagesfromto'] = 'संदेश $from कडून $to साठी $count वा';
+
+$labels['threadsfromto'] = 'धागे $from कडून $to साठी $count वा';
 $labels['messagenrof'] = 'Message $nr of $count';
+
+$labels['copy'] = 'नक्‍कल ';
+$labels['move'] = 'हलवा';
 $labels['moveto'] = 'या फोल्डरमधे ठेवा';
 $labels['download'] = 'उतरवून घ्या';
+
 $labels['filename'] = 'फाईलचे नाव';
 $labels['filesize'] = 'फाईलचा आकार';
-$labels['preferhtml'] = 'एच टी एम एल दाखवा';
-$labels['htmlmessage'] = 'एच टी एम एल संदेश';
-$labels['prettydate'] = 'विशेष दिवस';
 $labels['addtoaddressbook'] = 'पत्ता नोंदवहीत नोंदवा ';
 $labels['sun'] = 'रवी';
+
 $labels['mon'] = 'सोम';
 $labels['tue'] = 'मंगळ';
 $labels['wed'] = 'बुध';
 $labels['thu'] = 'गुरु';
 $labels['fri'] = 'शुक्र';
 $labels['sat'] = 'शनी';
+
 $labels['sunday'] = 'रविवार';
 $labels['monday'] = 'सोमवार';
 $labels['tuesday'] = 'मंगळवार';
 $labels['wednesday'] = 'बुधवार';
+
 $labels['thursday'] = 'गुरुवार';
 $labels['friday'] = 'शुक्रवार';
 $labels['saturday'] = 'शनीवार';
-$labels['jan'] = 'जान';
+$labels['jan'] = 'जान';
 $labels['feb'] = 'फेब्';
+
 $labels['mar'] = 'मार्च';
 $labels['apr'] = 'एप्रिल';
 $labels['may'] = 'मे';
 $labels['jun'] = 'जून';
 $labels['jul'] = 'जुलै';
 $labels['aug'] = 'ऑगस्ट';
+
 $labels['sep'] = 'सप्टें';
 $labels['oct'] = 'ऑक्टो';
 $labels['nov'] = 'नोव्हें';
 $labels['dec'] = 'डिसें';
 $labels['longjan'] = 'जानेवारी';
+
 $labels['longfeb'] = 'फेब्रूवारी';
 $labels['longmar'] = 'मार्च';
 $labels['longapr'] = 'एप्रिल';
 $labels['longmay'] = 'मे';
 $labels['longjun'] = 'जून';
+
 $labels['longjul'] = 'जुलै';
 $labels['longaug'] = 'ऑगस्ट';
 $labels['longsep'] = 'सप्टेंबर';
 $labels['longoct'] = 'ऑक्टोबर';
 $labels['longnov'] = 'नोव्हेंबर';
+
 $labels['longdec'] = 'डिसेंबर';
 $labels['today'] = 'आज';
 $labels['checkmail'] = 'नवीन संदेश आले आहेत का पहा';
+
 $labels['writenewmessage'] = 'नवीन संदेश तयार करा';
-$labels['replytomessage'] = 'उत्तर द्या';
+$labels['replytomessage'] = 'पाठवणार्‍याला उत्तर द्या';
+
 $labels['replytoallmessage'] = 'पाठवणार्‍याला आणि प्रत केलेल्या सर्वांना संदेश पाठवा';
-$labels['forwardmessage'] = 'हा संदेश पाठवा';
+$labels['forwardmessage'] = 'हा संदेश पुढे पाठवा';
+
 $labels['deletemessage'] = 'संदेश काढून टाका';
 $labels['movemessagetotrash'] = 'संदेश कचरापेटीत टाका';
 $labels['printmessage'] = 'हा संदेश छापा';
+
 $labels['previousmessage'] = 'आधिचा संदेश दाखवा';
 $labels['previousmessages'] = 'आधिच्या संदेशांचा गट दाखवा';
+
 $labels['firstmessage'] = 'पहिला संदेश दाखवा';
-$labels['firstmessages'] = 'पहिला à¤¸à¤\82दà¥\87शाà¤\82à¤\9aा à¤\97à¤\9f दाखवा';
+$labels['firstmessages'] = 'पहिला à¤¸à¤\82दà¥\87शाà¤\82à¤\9aा à¤¸à¤\82à¤\9a दाखवा';
 $labels['nextmessage'] = 'नंतरचा संदेश दाखवा';
-$labels['nextmessages'] = 'नंतरचा संदेशांचा गट दाखवा';
+
+$labels['nextmessages'] = 'नंतरचा संदेशांचा संच दाखवा';
 $labels['lastmessage'] = 'शेवटचा संदेश दाखवा';
-$labels['lastmessages'] = 'शेवटचा संदेशांचा गट दाखवा';
+
+$labels['lastmessages'] = 'शेवटचा संदेशांचा संच दाखवा';
 $labels['backtolist'] = 'संदेशांच्या यादीकडे परत चला';
+
 $labels['viewsource'] = 'मूळ संदेशाचा प्रोग्राम कोड दाखवा';
-$labels['markmessages'] = 'सà¤\82दà¥\87शाला खूण करा';
+$labels['markmessages'] = 'सà¤\82दà¥\87शाà¤\82ना खूण करा';
 $labels['markread'] = 'वाचलेला म्हणून खूण करा';
+
 $labels['markunread'] = 'न वाचलेला म्हणून खूण करा';
 $labels['markflagged'] = 'खूण लावलेला म्हणून खूण करा';
+
 $labels['markunflagged'] = 'खूण काढलेला म्हणून खूण करा';
+$labels['messageactions'] = 'जास्‍त क्रिया...';
 $labels['select'] = 'निवडा';
+
 $labels['all'] = 'सर्व';
 $labels['none'] = 'कोणताही नाही';
+$labels['currpage'] = 'सध्‍याचे पान';
 $labels['unread'] = 'न वाचलेले';
 $labels['flagged'] = 'खूण लावलेले';
 $labels['unanswered'] = 'उत्तर न दिलेले';
+$labels['deleted'] = 'काढून टाकलेला(ले)';
+$labels['invert'] = 'उलट करा';
+
 $labels['filter'] = 'गाळणी';
-$labels['compact'] = 'कमितकमी करा';
+$labels['list'] = 'यादी';
+$labels['threads'] = 'धागे';
+$labels['expand-all'] = 'सर्व विस्‍तारीत करा';
+
+$labels['expand-unread'] = 'न वाचलेला विस्‍तारा';
+$labels['collapse-all'] = 'सर्व मिटवा';
+$labels['threaded'] = 'धागा लावलेला';
+
+$labels['autoexpand_threads'] = 'संदेश धागे विस्‍तारा';
+$labels['do_expand'] = 'सर्व धागे';
+$labels['expand_only_unread'] = 'फक्‍त न वाचलेल्‍या संदेशांबददल ';
+
+$labels['fromto'] = 'पाठवणारा/प्रती';
+$labels['flag'] = 'खूण';
+$labels['attachment'] = 'जोड';
+$labels['nonesort'] = 'कोणताही नाही';
+
+$labels['sentdate'] = 'पाठवणी दिनांक';
+$labels['arrival'] = 'आगमन दिनांक';
+$labels['asc'] = 'चढत्‍या क्रमाने';
+$labels['desc'] = 'उतरत्‍या क्रमाने';
+
+$labels['listcolumns'] = 'सुची स्‍तंभ';
+$labels['listsorting'] = 'स्‍तंभ वर्गीकरण';
+$labels['listorder'] = 'वर्गीकरण क्रम';
+$labels['listmode'] = 'यादी दर्शक पध्‍दत';
+
+$labels['compact'] = 'छोटा';
 $labels['empty'] = 'रिकामा';
 $labels['purge'] = 'काढून टाका';
 $labels['quota'] = 'डिस्कचा वापर';
 $labels['unknown'] = 'माहित नसलेला';
+
 $labels['unlimited'] = 'अमर्याद';
 $labels['quicksearch'] = 'चटकन शोध';
 $labels['resetsearch'] = 'परत शोध ';
+$labels['searchmod'] = 'बदलकर्त्‍यांना शोधा';
+
+$labels['msgtext'] = 'संपूर्ण संदेश';
 $labels['openinextwin'] = 'नवीन खिडकी उघडा';
+$labels['emlsave'] = 'इएमएल स्‍वरूपात उतरवून घ्या';
 $labels['compose'] = 'नवीन संदेश तयार करा';
-$labels['savemessage'] = 'हा मसूदा ठेऊन द्या';
+
+$labels['editasnew'] = 'नवीन आहे असा संपादित करा';
+$labels['savemessage'] = 'हा मसूदा साठवून ठेवा';
 $labels['sendmessage'] = 'आत्ता पाठवा';
-$labels['addattachment'] = 'फाईल सोबत जोडा';
-$labels['charset'] = 'कॅरेक्टर सेट';
+
+$labels['addattachment'] = 'फाईल सोबत जोडा';$labels['charset'] = 'कॅरेक्टर सेट';
 $labels['editortype'] = 'संपादकाचा प्रकार';
+
 $labels['returnreceipt'] = 'पोच पावती';
 $labels['checkspelling'] = 'शुध्द लेखन';
-$labels['resumeediting'] = 'परत संदेश तयार करणे चालू करा';
+$labels['resumeediting'] = 'परत संदेश संपादित करा';
+
 $labels['revertto'] = 'परत जा';
 $labels['attachments'] = 'जोडलेल्या';
 $labels['upload'] = 'चढवा';
 $labels['close'] = 'बंद';
 $labels['low'] = 'कमी';
+
 $labels['lowest'] = 'कमित कमी';
+
 $labels['normal'] = 'नेहमी प्रमाणे';
 $labels['high'] = 'तातडीचे';
 $labels['highest'] = 'अतिशय तातडीचे';
 $labels['nosubject'] = '(विषय नाही)';
+
 $labels['showimages'] = 'चित्र दाखवा';
-$labels['alwaysshow'] = '$sender कडून आलेल्या संदेशातील चित्र दाखवा';
+$labels['alwaysshow'] = '$sender कडून आलेल्या संदेशातील चित्रे नेहमी दाखवा';
+
 $labels['htmltoggle'] = 'एच टी एम एल';
-$labels['plaintoggle'] = 'साधà¥\87 à¤\9fà¥\87à¤\95à¥\8dसà¥\8dà¤\9f';
+$labels['plaintoggle'] = 'साधà¥\87 à¤²à¤¿à¤\96ाण';
 $labels['savesentmessagein'] = 'पाठवलेला संदेश या फोल्डरमधे ठेवा';
-$labels['dontsave'] = 'संदेश ठेवू नका';
-$labels['maxuploadsize'] = '$size हा जास्तित जास्त फाईलचा आकार';
+
+$labels['dontsave'] = 'संदेश साठवू नका';
+$labels['maxuploadsize'] = 'जास्‍तीत जास्‍त फाइलचा आकार $size असू शकतो';
 $labels['addcc'] = 'प्रत करा';
+
 $labels['addbcc'] = 'गुप्त प्रत करा';
 $labels['addreplyto'] = 'आणखी लोकांना संदेश पाठवा';
 $labels['mdnrequest'] = 'हा संदेश पाठवणार्‍याने हा संदेश तुम्ही वाचल्यावर कळवावयाला सांगितले आहे. तुम्हाला असे कळवणे चालेल ना?';
+
 $labels['receiptread'] = 'पोच पावती (संदेश वाचला)';
 $labels['yourmessage'] = 'ही तुमच्या संदेशाची पोच पावती आहे. ';
+
 $labels['receiptnote'] = 'सूचना: ही पोच पावती तुम्ही ज्यांना  संदेश पाठवला त्यांच्या संगणकावर दिसला एवढेच सांगते. तुम्ही ज्यांना हा संदेश पाठवला, त्यांनी तो वाचला, आणि त्यांना तो नक्की समजला हे मात्र सांगत नाही. ';
+
 $labels['name'] = 'टोपणनाव';
 $labels['firstname'] = 'नाव';
 $labels['surname'] = 'आडनाव';
 $labels['email'] = 'इ-मेल्';
+
 $labels['addcontact'] = 'नवीन पत्ता नोंदवहीत ठेवा';
 $labels['editcontact'] = 'नोंदवहीतील पत्ता सुधारा';
 $labels['edit'] = 'संदेश तयार करा';
+
 $labels['cancel'] = 'रद्द करा';
 $labels['save'] = 'ठेवून द्या';
 $labels['delete'] = 'काढून टाका';
 $labels['newcontact'] = 'नोंदवहीत नवीन संपर्क लिहिण्यासाठी';
+
 $labels['deletecontact'] = 'खूण केलेले सर्व संपर्काचे पत्ते काढून टाका';
 $labels['composeto'] = 'साठी नवीन संदेश तयार करा';
 $labels['contactsfromto'] = '$from पासून ते $to पर्यंत $count पैकी';
+
 $labels['print'] = 'छापा';
 $labels['export'] = 'निर्यात करा';
 $labels['exportvcards'] = 'व्ही कार्ड स्वरुपात पत्ते निर्यात करा';
-$labels['previouspage'] = 'आधिचा गट दाखवा';
-$labels['firstpage'] = 'पहिला गट दाखवा';
-$labels['nextpage'] = 'नंतरचा गट दाखवा';
-$labels['lastpage'] = 'शेवटचा गट दाखवा';
-$labels['groups'] = 'गट';
+$labels['newcontactgroup'] = 'नवीन पत्‍त्‍यांचा गट बनवा';
+
+$labels['groupactions'] = 'पत्‍त्‍यांच्‍या गटाबददल क्रिया...';
+$labels['previouspage'] = 'आधिचा संच दाखवा';
+$labels['firstpage'] = 'पहिला संच दाखवा';
+
+$labels['nextpage'] = 'नंतरचा संच दाखवा';
+$labels['lastpage'] = 'शेवटचा संच दाखवा';
+$labels['group'] = 'गट';
+$labels['groups'] = 'अनेक गट';
+
 $labels['personaladrbook'] = 'वैयक्तिक पत्ते';
 $labels['import'] = 'आयात करा';
 $labels['importcontacts'] = 'पत्ते आयात करा';
 $labels['importfromfile'] = 'या फाईल मधून आयात करा';
+
 $labels['importreplace'] = 'संपूर्ण पत्ता नोंदवही बदला';
 $labels['importtext'] = 'तुम्ही तुमच्याकडील पत्ता नोंदवहीतील पत्ते तुम्ही येथे घेऊ शकता.<br/>सध्या आम्ही या <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> प्रकारच्या वेगवेगळ्या नोंदवहीतील पत्ते घेऊ शकतो. ';
+
 $labels['done'] = 'झाले';
 $labels['settingsfor'] = 'साठी सेटिंग्ज';
 $labels['preferences'] = 'तुमची पसंती';
 $labels['userpreferences'] = 'वापरकर्त्याची पसंती';
+
 $labels['editpreferences'] = 'वापरकर्त्याची पसंती सुधारा';
 $labels['identities'] = 'ओळख';
 $labels['manageidentities'] = 'या खात्यासाठी ओळखींचे नियोजन करा';
+
 $labels['newidentity'] = 'नवीन ओळख';
 $labels['newitem'] = 'नवीन प्रकार';
 $labels['edititem'] = 'प्रकार सुधारा';
+$labels['preferhtml'] = 'एच टी एम एल दाखवा';
+
+$labels['defaultcharset'] = 'नेहमीचा अक्षर संच';
+$labels['htmlmessage'] = 'एच टी एम एल संदेश';
+$labels['prettydate'] = 'विशेष दिवस';
+
 $labels['setdefault'] = 'हा नेहमीसाठी वापरा';
 $labels['autodetect'] = 'स्वयंचलित';
 $labels['language'] = 'भाषा';
-$labels['timezone'] = 'आंतराष्ट्रीय वेळ';
+$labels['timezone'] = 'वेळ 
+क्षेत्र'; 
 $labels['pagesize'] = 'प्रत्येक पानावरील ओळी';
 $labels['signature'] = 'सही';
 $labels['dstactive'] = 'दिवसाची वेळ';
@@ -215,14 +323,15 @@ $labels['logoutclear'] = 'खात्यातून बाहेर पडत
 $labels['logoutcompact'] = 'खात्यातून बाहेर पडतांना आलेल्या संदेशांना छोटे आणि व्यवस्थित करा';
 $labels['uisettings'] = 'वापरकर्त्यासाठीचा इंटरफेस';
 $labels['serversettings'] = 'सर्व्हरची सेटिंग्ज';
-$labels['mailboxview'] = 'टपाल पेटी पहाणे';
+$labels['mailboxview'] = 'टपालपेटी पहाणे';
 $labels['mdnrequests'] = 'पाठवणार्‍याच्या सूचना';
 $labels['askuser'] = 'वापरकर्त्याला विचारा';
-$labels['autosend'] = 'सà¥\8dवयà¤\82à¤\9aलित (à¤\86पà¥\8bà¤\86प à¤ªà¤¾à¤ à¥\87वणà¥\87)';
+$labels['autosend'] = 'स्वयंचलित (आपोआप पाठवणे)';
 $labels['ignore'] = 'दुर्लक्ष करा';
 $labels['readwhendeleted'] = 'काढून टाकल्यावर संदेश वाचला असे दाखवा';
 $labels['flagfordeletion'] = 'संदेश काढून टाकण्या ऎवजी संदेश काढून टाकण्यासाठी आहे अशी खूण करा';
 $labels['skipdeleted'] = 'काढून टाकलेले संदेश दाखवू नका';
+$labels['deletealways'] = 'जर संदेश कचरापेटीत गेले नाहीत तर काढून टाका';
 $labels['showremoteimages'] = 'संदेशातील चित्रे दाखवा';
 $labels['fromknownsenders'] = 'माहितीतील पाठवणार्‍याकडून संदेश';
 $labels['always'] = 'नेहमी';
@@ -230,16 +339,38 @@ $labels['showinlineimages'] = 'सोबत जोडलेली चित्
 $labels['autosavedraft'] = 'मसूदा आपोआप जतन करा';
 $labels['everynminutes'] = 'प्रत्येक $n मिनिटांनी';
 $labels['keepalive'] = 'वर नवे संदेश आले आहेत का ते पहा';
-$labels['never'] = 'केंव्हाच नाही';
+$labels['never'] = 'कधीच नाही';
+$labels['immediately'] = 'ताबडतोब';
 $labels['messagesdisplaying'] = 'संदेश दाखवा';
 $labels['messagescomposition'] = 'संदेश तयार करा';
 $labels['mimeparamfolding'] = 'सोबत दिलेल्या फाईल्सची नावे ';
-$labels['2231folding'] = 'संपूर्ण        आर एफ सी 2231(थंडरबर्ड)';
+$labels['2231folding'] = 'संपूर्ण आर एफ सी 2231(थंडरबर्ड)';
 $labels['miscfolding'] = 'आर एफ सी  2047/2231 (मायक्रोसॉफ़्ट आऊटलूक)';
-$labels['2047folding'] = 'संपूर्ण        आर एफ सी 2047(ईतर)';
+$labels['2047folding'] = 'संपूर्ण आर एफ सी 2047(ईतर)';
+$labels['force7bit'] = '8 अक्षरी एमआयएमई संक्षिप्‍तरूप वापरा';
 $labels['advancedoptions'] = 'अधिक पर्याय';
 $labels['focusonnewmessage'] = 'ब्राऊझर खिडकी नवीन संदेशावर केंद्रित करा';
 $labels['checkallfolders'] = 'सर्व फोल्डरमधे नवीन संदेश शोधा';
+$labels['displaynext'] = 'संदेश काढल्‍यानंतर किंवा हलवल्‍यानंतर पुढचा संदेश दाखवा';
+$labels['mainoptions'] = 'मुख्‍य पर्याय';
+$labels['section'] = 'भाग';
+$labels['maintenance'] = 'देखभाल';
+$labels['newmessage'] = 'नवीन संदेश';
+$labels['listoptions'] = 'पर्याय सूची';
+$labels['signatureoptions'] = 'सही पर्याय';
+$labels['whenreplying'] = 'उत्‍तर देताना';
+$labels['replytopposting'] = 'नवीन संदेश मुळ संदेशाच्‍या वर चालू करा';
+$labels['replybottomposting'] = 'नवीन संदेश मुळ संदेशाच्‍या खाली चालू करा';
+$labels['replyremovesignature'] = 'उत्‍तर देताना मुळ सही संदेशातून काढून टाका';
+$labels['autoaddsignature'] = 'आपोआप सही करा';
+$labels['newmessageonly'] = 'फक्‍त नवीन संदेश';
+$labels['replyandforwardonly'] = 'फक्‍त उत्‍तरे आ‍णी पुढे पाठवलेले संदेश';
+$labels['replysignaturepos'] = 'उत्‍तर देताना किंवा पुढे पाठवताना सही करा';
+$labels['belowquote'] = 'उतारया खाली';
+$labels['abovequote'] = 'उतारयाच्‍या वर';
+$labels['insertsignature'] = 'सही मध्‍ये टाका';
+$labels['previewpanemarkread'] = 'प्रदर्शित संदेश पाहीले अशी खुण करा ';
+$labels['afternseconds'] = '$n क्षणानंतर';
 $labels['folder'] = 'फोल्डर';
 $labels['folders'] = 'फोल्डर्स';
 $labels['foldername'] = 'फोल्डरचे नाव';
@@ -247,17 +378,32 @@ $labels['subscribed'] = 'वर्गणिदार होणे';
 $labels['messagecount'] = 'संदेश';
 $labels['create'] = 'तयार करा';
 $labels['createfolder'] = 'नवीन फोल्डर तयार करा';
-$labels['rename'] = 'नवीन नाव द्या';
-$labels['renamefolder'] = 'फोल्डरला नवीन नाव द्या';
-$labels['deletefolder'] = 'फोल्डर काढून टाका';
 $labels['managefolders'] = 'फोल्डर्सचे नियोजन करा';
 $labels['specialfolders'] = 'विषेश फोल्डर';
 $labels['sortby'] = 'ने वर्गवारी करा';
 $labels['sortasc'] = 'चढत्या क्रमाने';
 $labels['sortdesc'] = 'उतरत्या क्रमाने';
-$labels['B'] = 'बà¥\80';
+$labels['B'] = 'बाà¤\87à¤\9f';
 $labels['KB'] = 'केबी';
 $labels['MB'] = 'एमबी';
 $labels['GB'] = 'जीबी';
+$labels['unicode'] = 'युनिकोड';
+$labels['english'] = 'इंग्रजी';
+$labels['westerneuropean'] = 'पश्चिम युरोपियन';
+$labels['easterneuropean'] = 'पूर्व युरोपियन';
+$labels['southeasterneuropean'] = 'दक्षिणपूर्व युरोपियन';
+$labels['baltic'] = 'बाल्‍टीक';
+$labels['cyrillic'] = 'सिरीलिक';
+$labels['arabic'] = 'अरेबिक';
+$labels['greek'] = 'ग्रीक';
+$labels['hebrew'] = 'हिब्रु';
+$labels['turkish'] = 'तुर्कि';
+$labels['nordic'] = 'नॉर्डिक';
+$labels['thai'] = 'थाइ';
+$labels['celtic'] = 'सेल्टिक';
+$labels['vietnamese'] = 'व्हिएतनामी';
+$labels['japanese'] = 'जपानी';
+$labels['korean'] = 'कोरियन';
+$labels['chinese'] = 'चिनी';
 
-?>
\ No newline at end of file
+?>
index ef25025765626bc903def43f69befce95ef05ab1..6ee3a5e8b8e8104e5199846d5789952253409c83 100755 (executable)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/mr_IN/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2009, RoundQube Dev. - Switzerland                      |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2009, Roundcube Dev. - Switzerland                      |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -19,10 +19,13 @@ $messages['loginfailed'] = 'प्रवेश करता आला नाह
 $messages['cookiesdisabled'] = 'तुमचा ब्राऊझर कुकीज घेऊ शकत नाही';
 $messages['sessionerror'] = 'तुम्ही प्रवेश केल्यानंतर बराच वेळ काही न करता गेला म्हणून तुमचा कालावधी संपला किंवा तुमच्या कालावधीच्या नोंदेत काही चूक झाली आहे.';
 $messages['imaperror'] = 'आयमॅप सर्व्हरशी संपर्क होवू शकला नाही.';
+$messages['servererror'] = 'सर्व्‍हरची चूक!';
+$messages['invalidrequest'] = 'अवैध विनंती! माहिती साठवलेली नाही.';
 $messages['nomessagesfound'] = 'या खात्यामधे कोणताही संदेश आलेला नाही';
 $messages['loggedout'] = 'तुम्ही यशस्वीरित्या खाते बंद केले आहे . राम राम !';
 $messages['mailboxempty'] = 'खात्यात कोणताही संदेश नाही';
 $messages['loading'] = 'संदेश आणत आहे';
+$messages['uploading'] = 'फाईल चढवली जात आहे...';
 $messages['loadingdata'] = 'माहिती आणत आहे ';
 $messages['checkingmail'] = 'नवीन संदेश आले आहेत का हे पहात आहे';
 $messages['sendingmessage'] = 'संदेश पाठवत आहे';
@@ -41,14 +44,14 @@ $messages['senttooquickly'] = 'कृपया हा संदेश पाठ
 $messages['errorsavingsent'] = 'पाठवलेला संदेश ठेवून देतांना काहीतरी चूक झाली. ';
 $messages['errorsaving'] = 'संदेश ठेवून देतांना काहीतरी चूक झाली. ';
 $messages['errormoving'] = 'संदेश तेथे ठेवता आला नाही.';
+$messages['errorcopying'] = 'संदेशांची नक्‍कल करता आली नाही';
 $messages['errordeleting'] = 'संदेश काढून टाकता आला नाही. ';
+$messages['errormarking'] = 'संदेशांवर खूण करता आली नाही.';
 $messages['deletecontactconfirm'] = 'खूण केलेले सर्व पत्ते खरोखरच तुम्हाला काढून टाकायचे आहेत का?';
 $messages['deletemessagesconfirm'] = 'खूण केलेले सर्व संदेश खरोखरच तुम्हाला काढून टाकायचे आहेत का?';
 $messages['deletefolderconfirm'] = 'हा फोल्डर खरोखरच तुम्हाला काढून टाकायचा आहेत का?';
 $messages['purgefolderconfirm'] = 'या फोल्डरमधिल सर्व संदेश खरोखरच तुम्हाला काढून टाकायचे आहेत का?';
-$messages['foldercreating'] = 'फोल्डर तयार करत आहे';
 $messages['folderdeleting'] = 'फोल्डर काढून टाकत आहे';
-$messages['folderrenaming'] = 'फोल्डरला नवीन नाव देत आहे.';
 $messages['foldermoving'] = 'फोल्डर हलवत आहे.';
 $messages['formincomplete'] = 'फॉर्म पूर्णपणे भरलेला  नाही. ';
 $messages['noemailwarning'] = 'योग्य, बरोबर, आणि वैध इमेल पत्ता द्या. ';
@@ -62,6 +65,7 @@ $messages['notsentwarning'] = 'संदेश पाठवला गेला 
 $messages['noldapserver'] = 'शोधण्यासाठी ldap सर्व्हर निवडा';
 $messages['nocontactsreturned'] = 'कोणताही पत्ता नोंदवहीत नाही. ';
 $messages['nosearchname'] = 'कृपया ज्यांना तुम्हाला संदेश पाठवावयाचा आहे त्यांचे नाव किंवा इमेल पत्ता द्या. ';
+$messages['notuploadedwarning'] = 'सर्व फाईल अजून चढवल्‍या गेलेल्‍या नाहीत. कृपया वाट पहा किंवा मागे फिरा';
 $messages['searchsuccessful'] = '$nr संदेष मिळाले.';
 $messages['searchnomatch'] = 'शोध घेतल्यानंतर एकही संदेश मिळाला नाही ';
 $messages['searching'] = 'शोधत आहे......';
@@ -78,18 +82,31 @@ $messages['copyerror'] = 'कोणत्याही पत्त्याच
 $messages['sourceisreadonly'] = 'पत्ता फक्त वाचण्यासाठी आहे.';
 $messages['errorsavingcontact'] = 'पत्ता नोंदवहीत ठेवता आला नाही. ';
 $messages['movingmessage'] = 'संदेश हलवत आहे..';
+$messages['copyingmessage'] = 'संदेशाची नक्‍कल करत आहे...';
 $messages['receiptsent'] = 'पोचपावती यशस्वीरित्या पाठवण्यात आली आहे. ';
 $messages['errorsendingreceipt'] = 'पोचपावती पाठवता आली नाही.';
 $messages['nodeletelastidentity'] = 'तुम्ही हे खाते काढून टाकू शकत नाही कारण हे तुमचे शेवटचे खाते आहे.';
-$messages['addsubfolderhint'] = 'हा फोल्डर निवडलेल्या फोल्डरचा उप-फोल्डर असेल';
 $messages['forbiddencharacter'] = 'फोल्डरच्या नावात न चालणारी अक्षरे किंवा खूणा आहेत.';
 $messages['selectimportfile'] = 'चढवण्यासाठी फाईल निवडा';
 $messages['addresswriterror'] = 'निवडलेल्या पत्ता नोंदवहीत नोंद करता येत नाही.';
+$messages['contactaddedtogroup'] = 'पत्‍ते यशस्‍वीरित्‍या हया गटात वाढवण्‍यात आले.';
+$messages['contactremovedfromgroup'] = 'पत्‍ते यशस्‍वीरित्‍या हया गटातून काढून टाकले.';
 $messages['importwait'] = 'आयात करत आहे, कृपया वाट पहा.....';
 $messages['importerror'] = 'आयात झाली नाही. आयात करत असलेली फाईल व्हीकार्ड प्रकाराची नाही';
 $messages['importconfirm'] = '<b>$inserted पत्ते यशस्वीरित्या आयात केल, $skipped आधिच असलेल्या नोंदी केल्या नाहीत</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'ही क्रिया करण्यास परवानगी नाही. ';
 $messages['nofromaddress'] = 'निवडलेल्या खात्यात इमेल पत्ता दिलेला नाही.';
 $messages['editorwarning'] = 'टेक्स्ट संपादन निवडल्यास संदेशाचे दृष्य स्वरुप बदलून जाईल. तुम्हाला असेच करायचे आहे ना?';
+$messages['httpreceivedencrypterror'] = 'हानीकारक चूक झाली. व्‍यवस्‍थापकाशी तात्‍काळ संपर्क साधा. <b> तुमचा संदेश पाठवला नाही </b>    ';
+$messages['smtpconnerror'] = 'SMTP चूक ($code): सर्व्‍हरशी संपर्क साधता येत नाही';
+$messages['smtpautherror'] = 'SMTP चूक ($code): ओळख पटवता येत नाही';
+$messages['smtpfromerror'] = 'SMTP चूक ($code): "$from" पाठवणार्‍याचे नाव टाकता आले नाही';
+$messages['smtptoerror'] = 'SMTP चूक ($code): प्राप्‍तकर्ता "$to" टाकता आला नाही';
+$messages['smtprecipientserror'] = 'SMTP चूक : प्राप्‍तकर्त्‍यांची यादी चालू करता आली नाही';
+$messages['smtperror'] = 'SMTP चूक : $msg';
+$messages['emailformaterror'] = 'अवैध ईमेल पत्‍ता : $email';
+$messages['toomanyrecipients'] = 'खूप जास्‍त प्राप्‍तकर्ते. प्राप्‍तकर्त्‍यांची संख्‍या $max पर्यंत कमी करा';
+$messages['maxgroupmembersreached'] = 'गट सभासद संख्‍या $max पेक्षा जास्‍त झाली आहे';
+$messages['internalerror'] = 'अंतर्गत चूक झाली. कृपया परत प्रयत्‍न करा.';
 
-?>
\ No newline at end of file
+?>
index 4e5d948b00e5e48464285903419130f3a001b52f..b35f1a8b3e0faa65c4ef0d61ea3a9cf063995361 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/ms_MY/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Muhammad Zamri MS <myzamri@gmail.com>                        |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 543 2007-04-28 18:07:12Z thomasb $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -215,9 +215,6 @@ $labels['subscribed'] = 'Dilanggan';
 $labels['messagecount'] = 'Mesej-mesej';
 $labels['create'] = 'Cipta';
 $labels['createfolder'] = 'Cipta kabinet fail baru';
-$labels['rename'] = 'Namakan semula';
-$labels['renamefolder'] = 'Namakan semula kabinet fail';
-$labels['deletefolder'] = 'Hapus kabinet fail';
 $labels['managefolders'] = 'Urus kabinet fail';
 $labels['sortby'] = 'Susun dengan';
 $labels['sortasc'] = 'Susun menaik';
index 91bbf338fcbaeaee89182a5a674e2d387d22f37f..994edd40cc3689b14e23e49ed0566fcd9b582b44 100644 (file)
@@ -5,15 +5,15 @@
 +-----------------------------------------------------------------------+
 | language/ms_MY/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Muhammad Zamri MS <myzamri@gmail.com>                        |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 543 2007-04-28 18:07:12Z thomasb $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -77,6 +77,5 @@ $messages['movingmessage'] = 'Memindah mesej...';
 $messages['receiptsent'] = 'Berjaya menghantar resip bacaan';
 $messages['errorsendingreceipt'] = 'Tidak dapat menghantar resip';
 $messages['nodeletelastidentity'] = 'Anda tidak boleh membuang identiti ini, ia milik anda yang terakhir.';
-$messages['addsubfolderhint'] = 'Folder ini akan dibina sebagai subfolder kepada folder yang dipilih sekarang';
 
 ?>
index d19a7527bd42d7cbdf83eeb3fd7870fa52dd8214..53ef9773f24c7f19ad25adc399829bf5e4bb5a2e 100644 (file)
@@ -5,17 +5,18 @@
 +-----------------------------------------------------------------------+
 | language/nb_NO/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Kjetil Waage - Nextline AS <kjetil@nextline.no>               |
 | Author: Tor Erik Linnerud - JKLM <tel@jklm.no>                        |
+| Author: Axel Sjøstedt <roundcube@sjostedt.no>                         |
 | Author: Odd Henriksen <odd@digicon.no>                                |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2784 2009-07-22 12:23:12Z yllar $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -27,18 +28,18 @@ $labels['server'] = 'Server';
 $labels['login'] = 'Logg på';
 $labels['logout'] = 'Logg ut';
 $labels['mail'] = 'E-post';
-$labels['settings'] = 'Personlige innstillinger';
+$labels['settings'] = 'Innstillinger';
 $labels['addressbook'] = 'Adressebok';
 $labels['inbox'] = 'Innboks';
-$labels['drafts'] = 'Kladder';
+$labels['drafts'] = 'Kladd';
 $labels['sent'] = 'Sendt';
-$labels['trash'] = 'Søppel';
+$labels['trash'] = 'Slettet';
 $labels['junk'] = 'Spam';
 $labels['subject'] = 'Emne';
 $labels['from'] = 'Avsender';
 $labels['to'] = 'Mottaker';
 $labels['cc'] = 'Kopi til';
-$labels['bcc'] = 'BCC';
+$labels['bcc'] = 'Blindkopi til';
 $labels['replyto'] = 'Svar til';
 $labels['date'] = 'Dato';
 $labels['size'] = 'Størrelse';
@@ -47,15 +48,15 @@ $labels['organization'] = 'Organisasjon';
 $labels['reply-to'] = 'Svar til';
 $labels['mailboxlist'] = 'Mapper';
 $labels['messagesfromto'] = 'Meldinger $from til $to av $count';
-$labels['messagenrof'] = 'Meldinger $nr av $count';
+$labels['threadsfromto'] = 'Tråder $from til $to av $count';
+$labels['messagenrof'] = 'Melding $nr av $count';
+$labels['copy'] = 'Kopier';
+$labels['move'] = 'Flytt';
 $labels['moveto'] = 'flytt til...';
 $labels['download'] = 'last ned';
 $labels['filename'] = 'Filnavn';
 $labels['filesize'] = 'Filstørrelse';
-$labels['preferhtml'] = 'Foretrekk HTML';
-$labels['htmlmessage'] = 'HTML-melding';
-$labels['prettydate'] = 'Pen datovisning';
-$labels['addtoaddressbook'] = 'Tilføy til adresseboken';
+$labels['addtoaddressbook'] = 'Legg til i adressebok';
 $labels['sun'] = 'Søn';
 $labels['mon'] = 'Man';
 $labels['tue'] = 'Tir';
@@ -95,8 +96,8 @@ $labels['longoct'] = 'Oktober';
 $labels['longnov'] = 'November';
 $labels['longdec'] = 'Desember';
 $labels['today'] = 'I dag';
-$labels['checkmail'] = 'Sjekk for nye meldinger';
-$labels['writenewmessage'] = 'Opprett en ny e-post';
+$labels['checkmail'] = 'Se etter nye meldinger';
+$labels['writenewmessage'] = 'Opprett ny e-post';
 $labels['replytomessage'] = 'Svar på denne e-posten';
 $labels['replytoallmessage'] = 'Svar til alle mottakere';
 $labels['forwardmessage'] = 'Videresend denne e-posten';
@@ -122,12 +123,34 @@ $labels['messageactions'] = 'Flere valg...';
 $labels['select'] = 'Velg';
 $labels['all'] = 'Alle';
 $labels['none'] = 'Ingen';
+$labels['currpage'] = 'Gjeldende side';
 $labels['unread'] = 'Uleste';
 $labels['flagged'] = 'Flagget';
 $labels['unanswered'] = 'Ubesvarte';
 $labels['deleted'] = 'Slettet';
 $labels['invert'] = 'Inverter';
 $labels['filter'] = 'Filter';
+$labels['list'] = 'Liste';
+$labels['threads'] = 'Tråder';
+$labels['expand-all'] = 'Utvid alle';
+$labels['expand-unread'] = 'Utvid uleste';
+$labels['collapse-all'] = 'Skjul alle';
+$labels['threaded'] = 'Trådet';
+$labels['autoexpand_threads'] = 'Utvid tråder';
+$labels['do_expand'] = 'alle tråder';
+$labels['expand_only_unread'] = 'kun med uleste meldinger';
+$labels['fromto'] = 'Avsender/Mottaker';
+$labels['flag'] = 'Flagg';
+$labels['attachment'] = 'Vedlegg';
+$labels['nonesort'] = 'Ingen';
+$labels['sentdate'] = 'Dato sendt';
+$labels['arrival'] = 'Dato mottatt';
+$labels['asc'] = 'stigende';
+$labels['desc'] = 'synkende';
+$labels['listcolumns'] = 'Listekolonner';
+$labels['listsorting'] = 'Sorteringskolonne';
+$labels['listorder'] = 'Sorteringsrekkefølge';
+$labels['listmode'] = 'Listevisningsmodus';
 $labels['compact'] = 'Rydd opp';
 $labels['empty'] = 'Tøm';
 $labels['purge'] = 'Tøm';
@@ -167,9 +190,9 @@ $labels['plaintoggle'] = 'Ren tekst';
 $labels['savesentmessagein'] = 'Lagre sendt melding i';
 $labels['dontsave'] = 'ikke lagre';
 $labels['maxuploadsize'] = 'Maksimalt tillatt filstørrelse er $size';
-$labels['addcc'] = 'Legg til Cc';
-$labels['addbcc'] = 'Legg til Bcc';
-$labels['addreplyto'] = 'Legg til Reply-To';
+$labels['addcc'] = 'Legg til kopiadressat (Cc)';
+$labels['addbcc'] = 'Legg til blindkopiadressat (Bcc)';
+$labels['addreplyto'] = 'Legg til svar til (Reply-To)';
 $labels['mdnrequest'] = 'Senderen av denne meldingen har bedt om å bli gjort oppmerksom på at denne meldingen er lest. Ønsker du å sende denne bekreftelsen?';
 $labels['receiptread'] = 'Kvittering (lest)';
 $labels['yourmessage'] = 'Dette er en kvittering for at din e-post er mottatt';
@@ -178,7 +201,7 @@ $labels['name'] = 'Visningsnavn';
 $labels['firstname'] = 'Fornavn';
 $labels['surname'] = 'Etternavn';
 $labels['email'] = 'E-post';
-$labels['addcontact'] = 'Legg til en ny kontakt';
+$labels['addcontact'] = 'Legg til ny kontakt';
 $labels['editcontact'] = 'Rediger kontakt';
 $labels['edit'] = 'Rediger';
 $labels['cancel'] = 'Avbryt';
@@ -191,10 +214,13 @@ $labels['contactsfromto'] = 'Kontakter $from til $to av $count';
 $labels['print'] = 'Skriv ut';
 $labels['export'] = 'Eksporter';
 $labels['exportvcards'] = 'Eksporter kontakter i vCard-format';
+$labels['newcontactgroup'] = 'Opprett ny kontaktgruppe';
+$labels['groupactions'] = 'Handlinger for kontaktgrupper...';
 $labels['previouspage'] = 'Vis forrige sett';
 $labels['firstpage'] = 'Vis første sett';
 $labels['nextpage'] = 'Vis neste sett';
 $labels['lastpage'] = 'Vis siste sett';
+$labels['group'] = 'Gruppe';
 $labels['groups'] = 'Grupper';
 $labels['personaladrbook'] = 'Egne adresser';
 $labels['import'] = 'Importer';
@@ -212,6 +238,10 @@ $labels['manageidentities'] = 'Administrer identitetene for denne kontoen';
 $labels['newidentity'] = 'Ny identitet';
 $labels['newitem'] = 'Nytt punkt';
 $labels['edititem'] = 'Rediger punkt';
+$labels['preferhtml'] = 'Foretrekk HTML';
+$labels['defaultcharset'] = 'Standard tegnsett';
+$labels['htmlmessage'] = 'HTML-melding';
+$labels['prettydate'] = 'Pen datovisning';
 $labels['setdefault'] = 'Sett som standard';
 $labels['autodetect'] = 'Auto';
 $labels['language'] = 'Språk';
@@ -235,23 +265,46 @@ $labels['ignore'] = 'ignorer';
 $labels['readwhendeleted'] = 'Merk melding som lest ved sletting';
 $labels['flagfordeletion'] = 'Flagg meldingen for sletting i stedet for å slette';
 $labels['skipdeleted'] = 'Ikke vis slettede meldinger';
-$labels['showremoteimages'] = 'Vis eksterne bilder i meldinger';
+$labels['deletealways'] = 'Hvis en melding ikke kan flyttes til Slettet, slett den';
+$labels['showremoteimages'] = 'Vis bilder fra eksterne servere i meldinger';
 $labels['fromknownsenders'] = 'fra kjente avsendere';
 $labels['always'] = 'alltid';
-$labels['showinlineimages'] = 'Vis vedlagte bilder under meldingen';
+$labels['showinlineimages'] = 'Vis vedlagte bilder nedenfor meldingen';
 $labels['autosavedraft'] = 'Autolagring av utkast';
 $labels['everynminutes'] = 'hvert $n minutt';
 $labels['keepalive'] = 'Se etter ny e-post';
 $labels['never'] = 'Aldri';
+$labels['immediately'] = 'umiddelbart';
 $labels['messagesdisplaying'] = 'Visning av meldinger';
 $labels['messagescomposition'] = 'Skriving av meldinger';
 $labels['mimeparamfolding'] = 'Vedleggsnavn';
 $labels['2231folding'] = 'Fullstendig RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Fullstendig RFC 2047 (andre)';
+$labels['force7bit'] = 'Bruk MIME-koding for 8-bit-tegn';
 $labels['advancedoptions'] = 'Avanserte alternativer';
 $labels['focusonnewmessage'] = 'Gi nettleservindu fokus ved nye meldinger';
 $labels['checkallfolders'] = 'Kontroller alle mapper for nye meldinger';
+$labels['displaynext'] = 'Vis neste melding etter sletting/flytting av en melding';
+$labels['mainoptions'] = 'Hovedinnstillinger';
+$labels['section'] = 'Kategori';
+$labels['maintenance'] = 'Vedlikehold';
+$labels['newmessage'] = 'Ny melding';
+$labels['listoptions'] = 'Meldingsoversikt';
+$labels['signatureoptions'] = 'Innstillinger for signatur';
+$labels['whenreplying'] = 'Ved svar på e-post';
+$labels['replytopposting'] = 'start den nye meldingen over orginalmeldingen';
+$labels['replybottomposting'] = 'start den nye meldingen under orginalmeldingen';
+$labels['replyremovesignature'] = 'Fjern orginalsignaturen i svar på melding';
+$labels['autoaddsignature'] = 'Legg til signatur';
+$labels['newmessageonly'] = 'kun på nye meldinger';
+$labels['replyandforwardonly'] = 'kun i svar og videresendinger';
+$labels['replysignaturepos'] = 'Plassering av signatur ved svar eller videresending';
+$labels['belowquote'] = 'over sitert melding';
+$labels['abovequote'] = 'under sitert melding';
+$labels['insertsignature'] = 'Sett inn signatur';
+$labels['previewpanemarkread'] = 'Merk forhåndsviste meldinger som lest';
+$labels['afternseconds'] = 'etter $n sekunder';
 $labels['folder'] = 'Mappe';
 $labels['folders'] = 'Mapper';
 $labels['foldername'] = 'Mappenavn';
@@ -259,9 +312,6 @@ $labels['subscribed'] = 'Abonnere';
 $labels['messagecount'] = 'Meldinger';
 $labels['create'] = 'Opprett';
 $labels['createfolder'] = 'Lag ny mappe';
-$labels['rename'] = 'Endre navn';
-$labels['renamefolder'] = 'Endre navn på mappe';
-$labels['deletefolder'] = 'Slett mappe';
 $labels['managefolders'] = 'Rediger mapper';
 $labels['specialfolders'] = 'Spesielle mapper';
 $labels['sortby'] = 'Sorter etter';
@@ -271,5 +321,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Engelsk';
+$labels['westerneuropean'] = 'Vesteuropeisk';
+$labels['easterneuropean'] = 'Østeuropeisk';
+$labels['southeasterneuropean'] = 'Sørøsteuropeisk';
+$labels['baltic'] = 'Baltisk';
+$labels['cyrillic'] = 'Cyrillisk';
+$labels['arabic'] = 'Arabisk';
+$labels['greek'] = 'Gresk';
+$labels['hebrew'] = 'Hebraisk';
+$labels['turkish'] = 'Tyrkisk';
+$labels['nordic'] = 'Nordisk';
+$labels['thai'] = 'Thailandsk';
+$labels['celtic'] = 'Keltisk';
+$labels['vietnamese'] = 'Vietnamesisk';
+$labels['japanese'] = 'Japansk';
+$labels['korean'] = 'Koreansk';
+$labels['chinese'] = 'Kinesisk';
 
 ?>
index c96d781a6e67e152e493223591d1955df4169436..07be302938edda3c05d8b4a45505e1315e1cd0a5 100644 (file)
 +-----------------------------------------------------------------------+
 | language/nb_NO/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Kjetil Waage - Nextline AS <kjetil@nextline.no>               |
 | Author: Tor Erik Linnerud - JKLM <tel@jklm.no>                        |
+| Author: Axel Sjøstedt <roundcube@sjostedt.no>                         |
 | Author: Odd Henriksen <odd@digicon.no>                                |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2784 2009-07-22 12:23:12Z yllar $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
 $messages = array();
 $messages['loginfailed'] = 'Pålogging mislyktes';
 $messages['cookiesdisabled'] = 'Din nettleser aksepterer ikke cookies';
-$messages['sessionerror'] = 'Din session er ugyldig eller utløpt';
-$messages['imaperror'] = 'Forbindelsen til IMAP serveren sviktet';
-$messages['servererror'] = 'Server feil!';
+$messages['sessionerror'] = 'Din nettlesertilkobling er ugyldig eller utløpt';
+$messages['imaperror'] = 'Feil ved tilkobling til IMAP-server';
+$messages['servererror'] = 'Serverfeil!';
 $messages['invalidrequest'] = 'Ugyldig forespørsel! Ingen data ble lagret.';
-$messages['nomessagesfound'] = 'Det ble ikke funnet noen meldinger i denne innboksen';
+$messages['nomessagesfound'] = 'Det ble ikke funnet noen meldinger i denne mappen';
 $messages['loggedout'] = 'Du er logget av webmail. Ha det bra!';
-$messages['mailboxempty'] = 'Postkassen er tom!';
+$messages['mailboxempty'] = 'Mappen er tom!';
 $messages['loading'] = 'Laster...';
+$messages['uploading'] = 'Laster opp fil...';
 $messages['loadingdata'] = 'Laster data...';
 $messages['checkingmail'] = 'Sjekker for nye meldinger...';
 $messages['sendingmessage'] = 'Sender melding...';
 $messages['messagesent'] = 'Meldingen ble sendt uten feil';
 $messages['savingmessage'] = 'Lagrer melding...';
-$messages['messagesaved'] = 'Melding er lagret som utkast';
+$messages['messagesaved'] = 'Melding er lagret som kladd';
 $messages['successfullysaved'] = 'Lagret';
-$messages['addedsuccessfully'] = 'Kontakten ble tilføyd i adresseboken';
-$messages['contactexists'] = 'Der er allerede en kontakt med denne e-postadressen';
-$messages['blockedimages'] = 'Eksterne bilder er blitt blokkert i denne e-postmeldingen.';
-$messages['encryptedmessage'] = 'Dette er en kryptert melding og kan ikke vises. Beklager!';
+$messages['addedsuccessfully'] = 'Kontakten ble lagt til i adresseboken';
+$messages['contactexists'] = 'Der finnes allerede en kontakt med denne e-postadressen';
+$messages['blockedimages'] = 'Av sikkerhetsgrunner er bilder lagret på eksterne servere blokkert fra denne e-postmeldingen';
+$messages['encryptedmessage'] = 'Dette er en kryptert melding som ikke kan vises. Beklager!';
 $messages['nocontactsfound'] = 'Ingen kontakter ble funnet';
-$messages['contactnotfound'] = 'Den forespurte kontakten ble ikke funnet';
+$messages['contactnotfound'] = 'Den ønskede kontakten ble ikke funnet';
 $messages['sendingfailed'] = 'Kunne ikke sende e-posten';
 $messages['senttooquickly'] = 'Vennligst vent $sec sekund(er) før du sender denne meldingen';
 $messages['errorsavingsent'] = 'En feil oppsto under lagring av sendt melding';
 $messages['errorsaving'] = 'Det oppstod en feil ved lagring av data';
-$messages['errormoving'] = 'Kunne ikke flytte meldingen';
-$messages['errordeleting'] = 'Kunne ikke slette meldingen';
-$messages['errormarking'] = 'Kunne ikke markere meldingen';
+$messages['errormoving'] = 'Kunne ikke flytte meldingen(e)';
+$messages['errorcopying'] = 'Kunne ikke kopiere meldingen(e)';
+$messages['errordeleting'] = 'Kunne ikke slette meldingen(e)';
+$messages['errormarking'] = 'Kunne ikke markere meldingen(e)';
 $messages['deletecontactconfirm'] = 'Vil du virkelig slette valgte kontakt(er)?';
 $messages['deletemessagesconfirm'] = 'Vil du virkelig slette de(n) valgte meldingen(e)?';
 $messages['deletefolderconfirm'] = 'Vil du virkelig slette denne mappen?';
 $messages['purgefolderconfirm'] = 'Vil du virkelig slette alle meldingene i denne mappen?';
-$messages['foldercreating'] = 'Oppretter mappe...';
 $messages['folderdeleting'] = 'Sletter mappe...';
-$messages['folderrenaming'] = 'Gir nytt navn til mappe...';
 $messages['foldermoving'] = 'Flytter mappe...';
 $messages['formincomplete'] = 'Skjemaet var ikke fullstendig fylt ut';
-$messages['noemailwarning'] = 'Skriv inn en gyldig e-post adresse';
+$messages['noemailwarning'] = 'Skriv inn en gyldig e-postadresse';
 $messages['nonamewarning'] = 'Angi et navn';
 $messages['nopagesizewarning'] = 'Angi sidestørrelsen';
 $messages['nosenderwarning'] = 'Vennligst angi avsenderadresse';
-$messages['norecipientwarning'] = 'Skriv inn minst en mottaker';
-$messages['nosubjectwarning'] = '"Emne" feltet er tomt. Vil du skrive det inn nå?';
-$messages['nobodywarning'] = 'Send denne e-post uten tekst?';
-$messages['notsentwarning'] = 'E-posten ble ikke sendt. Vil du slette meldingen?';
-$messages['noldapserver'] = 'Venligst velg hvilken LDAP server det skal søkes i';
-$messages['nocontactsreturned'] = 'Ingen kontakter ble funnet';
+$messages['norecipientwarning'] = 'Skriv inn minst én mottaker';
+$messages['nosubjectwarning'] = 'Emnefeltet er tomt. Vil du skrive det inn nå?';
+$messages['nobodywarning'] = 'Send denne meldingen uten tekst?';
+$messages['notsentwarning'] = 'E-posten er ikke sendt. Er du sikker på at du vil avbryte skrivingen?';
+$messages['noldapserver'] = 'Venligst velg hvilken LDAP-server det skal søkes i';
+$messages['nocontactsreturned'] = 'Ingen kontakter funnet';
 $messages['nosearchname'] = 'Venligst skriv inn kontaktens navn eller e-postadresse';
+$messages['notuploadedwarning'] = 'Ikke alle vedlegg er ferdig opplastet. Vennligst vent eller avbryt opplastingen.';
 $messages['searchsuccessful'] = '$nr meldinger funnet';
 $messages['searchnomatch'] = 'Søket ga ingen resultater';
 $messages['searching'] = 'Søker...';
 $messages['checking'] = 'Sjekker...';
-$messages['nospellerrors'] = 'Ingen stavefeil funnet';
+$messages['nospellerrors'] = 'Ingen skrivefeil funnet';
 $messages['folderdeleted'] = 'Mappe slettet';
 $messages['deletedsuccessfully'] = 'Slettet';
 $messages['converting'] = 'Fjerner formatering fra meldingen...';
-$messages['messageopenerror'] = 'Kunne ikke laste meldingen fra server';
-$messages['fileuploaderror'] = 'Opplasting feilet';
+$messages['messageopenerror'] = 'Kunne ikke hente meldingen fra server';
+$messages['fileuploaderror'] = 'Feil under opplasting';
 $messages['filesizeerror'] = 'Filen overstiger maksimum tillatt filstørrelse ($size)';
 $messages['copysuccess'] = '$nr adresser ble kopiert';
 $messages['copyerror'] = 'Kunne ikke kopiere';
 $messages['sourceisreadonly'] = 'Denne adressekilden er skrivebeskyttet';
 $messages['errorsavingcontact'] = 'Kunne ikke lagre adressen';
 $messages['movingmessage'] = 'Flytter e-post...';
-$messages['receiptsent'] = 'Kvittering har blitt sent';
+$messages['copyingmessage'] = 'Kopierer e-post...';
+$messages['receiptsent'] = 'Kvittering er sent';
 $messages['errorsendingreceipt'] = 'Kunne ikke sende kvittering';
-$messages['nodeletelastidentity'] = 'Du kan ikke slette denne identiteten, det er din siste.';
-$messages['addsubfolderhint'] = 'Mappen vil bli opprettet som en undermappe av den nåværende valgte mappe';
-$messages['forbiddencharacter'] = 'Mappenavnet inneholder et tegn som ikke er tillatt';
+$messages['nodeletelastidentity'] = 'Du kan ikke slette denne identiteten, det er din eneste.';
+$messages['forbiddencharacter'] = 'Mappenavnet inneholder tegn som ikke er tillatt';
 $messages['selectimportfile'] = 'Vennligst velg en fil for opplasting';
 $messages['addresswriterror'] = 'Den valgte adresseboken er ikke skrivbar';
+$messages['contactaddedtogroup'] = 'Kontaktene ble vellykket lagt til i denne gruppen';
+$messages['contactremovedfromgroup'] = 'Kontaktene ble vellykket fjernet fra denne gruppen';
 $messages['importwait'] = 'Importerer, vennligst vent...';
-$messages['importerror'] = 'Importering feilet! Den opplastede filen er ikke en gyldig vCard-fil.';
-$messages['importconfirm'] = '<b>Importerte $inserted kontakter vellykket, hoppet over $skipped eksisterende oppføringer</b>: <p><em>$names</em></p>';
+$messages['importerror'] = 'Feil ved importering! Den opplastede filen er ikke en gyldig vCard-fil.';
+$messages['importconfirm'] = '<b>Importerte $inserted kontakter, hoppet over $skipped oppføringer som allerede eksisterte</b>: <p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Handling ikke tillatt!';
 $messages['nofromaddress'] = 'E-postadresse mangler i valgt identitet';
-$messages['editorwarning'] = 'Å bytte format til ren tekst vil føre til at all tekstformatering går tapt. Ønsker du å fortsette?';
-$messages['httpreceivedencrypterror'] = 'En uopprettelig feil oppsto. Vennligst kontakt din administrator umiddelbart. <b>Din melding kunne ikke sendes.</b>';
-$messages['smtpconnerror'] = 'SMTP Feil ($code): Tilkobling til server feilet';
-$messages['smtpautherror'] = 'SMTP Feil ($code): Pålogging feilet';
-$messages['smtpfromerror'] = 'SMTP Feil ($code): Kunne ikke sette avsender "$from"';
-$messages['smtptoerror'] = 'SMTP Feil ($code): Kunne ikke legge til mottaker "$to"';
-$messages['smtprecipientserror'] = 'SMTP Feil ($code): Kunne ikke lese mottaker listen';
-$messages['smtperror'] = 'SMTP Feil ($code): $msg';
+$messages['editorwarning'] = 'Ved å bytte for mat til ren tekst vil all tekstformatering gå tapt. Ønsker du å fortsette?';
+$messages['httpreceivedencrypterror'] = 'En uopprettelig feil oppsto. Vennligst kontakt systemansvarlig umiddelbart. <b>Din melding kunne ikke sendes.</b>';
+$messages['smtpconnerror'] = 'SMTP-feil ($code): Klarte ikke koble til server';
+$messages['smtpautherror'] = 'SMTP-feil ($code): Pålogging feilet';
+$messages['smtpfromerror'] = 'SMTP-feil ($code): Kunne ikke sette avsender "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP-feil ($code): Kunne ikke legge til mottaker "$to" ($msg)';
+$messages['smtprecipientserror'] = 'SMTP-feil ($code): Kunne ikke lese mottakerliste';
+$messages['smtperror'] = 'SMTP-feil ($code): $msg';
+$messages['emailformaterror'] = 'Feil e-postadresse: $email';
+$messages['toomanyrecipients'] = 'For mange mottakere. Reduser antall mottakere til $max.';
+$messages['maxgroupmembersreached'] = 'Antall gruppemedlemmer overskrider maksgrensen på $max';
 
 ?>
index 2a9bbcd989f4cf1d8e40c20a6096920b207d5263..ec4ed1acae466f70d3c16946e5d36179f21cfa12 100644 (file)
@@ -4,14 +4,14 @@
  +-----------------------------------------------------------------------+
  | localization/ne/labels.inc                                            |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2007, Roundcube Dev. - Switzerland                      |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Nepali Translation by:                                                |
  | Prasanna Singh <prasanna@bhunet.com>, <prasanna@bhunet.com>           |
- | RoundCubeAuthor: Thomas Bruederli <roundcube@gmail.com>               |
+ | RoundcubeAuthor: Thomas Bruederli <roundcube@gmail.com>               |
  +-----------------------------------------------------------------------+
 */
 
@@ -166,9 +166,6 @@ $labels['foldername'] = 'फोल्डरको नाम';
 $labels['subscribed'] = 'सबस्क्राईब गरियो';
 $labels['create'] = 'बनाउनुहोस';
 $labels['createfolder'] = 'नया फोलडर बनाउनुहोस';
-$labels['rename'] = 'नाम बदल्नुहोस';
-$labels['renamefolder'] = 'फोलडरको नाम बदल्नुहोस';
-$labels['deletefolder'] = 'फोलडर मेट्नुहोस';
 $labels['managefolders'] = 'फोलडर व्यवस्थित गर्नुहोस';
 $labels['sortby'] = 'यसरी तय गर्नुहोस';
 $labels['sortasc'] = 'पहिलो देखि अन्तिम सम्म तय गर्नुहोस';
index 3481d6b85b734524424583b4d27ab0b88bf6deb9..c0f6753169f5de2fec3ef7e4a7c5f5bd251cf93c 100644 (file)
@@ -4,14 +4,14 @@
  +-----------------------------------------------------------------------+
  | localization/ne/messages.inc                                          |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2007, RoundCube Dev. - Switzerland                      |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2007, Roundcube Dev. - Switzerland                      |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Nepali Translation by:                                                |
  | Prasanna Singh <prasanna@bhunet.com>, <prasanna@bhunet.com>           |
- | RoundCubeAuthor: Thomas Bruederli <roundcube@gmail.com>               |
+ | RoundcubeAuthor: Thomas Bruederli <roundcube@gmail.com>               |
  +-----------------------------------------------------------------------+
 */
 
index 3a21f8732b095365704455376d60169200c99c7d..7da22e4ec30abac856c0dc7e485ad3666512d9b9 100644 (file)
@@ -5,16 +5,17 @@
 +-----------------------------------------------------------------------+
 | language/nl_BE/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Dennis Heeren <dennis.heeren@gmail.com>                       |
 |         Laurens Vets <laurens@daemon.be>                              |
+|         Simon De Schoenmaeker <sds@simonds.be>                        |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2513 2009-05-21 12:59:19Z alec $
+@version $Id: labels.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -39,21 +40,22 @@ $labels['to'] = 'Aan';
 $labels['cc'] = 'Cc';
 $labels['bcc'] = 'Bcc';
 $labels['replyto'] = 'Antwoorden aan';
+$labels['followupto'] = 'Followup aan';
 $labels['date'] = 'Datum';
 $labels['size'] = 'Grootte';
 $labels['priority'] = 'Prioriteit';
 $labels['organization'] = 'Organisatie';
-$labels['reply-to'] = 'Antwoorden aan';
+$labels['readstatus'] = 'Gelezen?';
 $labels['mailboxlist'] = 'Mappen';
 $labels['messagesfromto'] = 'Berichten $from - $to van $count';
+$labels['threadsfromto'] = 'Conversatie $from - $to van $count';
 $labels['messagenrof'] = 'Bericht $nr van $count';
-$labels['moveto'] = 'verplaats naar...';
-$labels['download'] = 'downloaden';
+$labels['copy'] = 'Kopieer';
+$labels['move'] = 'Verplaats';
+$labels['moveto'] = 'Verplaats naar...';
+$labels['download'] = 'Downloaden';
 $labels['filename'] = 'Bestandsnaam';
 $labels['filesize'] = 'Bestandsgrootte';
-$labels['preferhtml'] = 'Gebruik HTML-opmaak';
-$labels['htmlmessage'] = 'HTML-bericht';
-$labels['prettydate'] = 'Uitgebreide datumweergave';
 $labels['addtoaddressbook'] = 'Voeg toe aan lijst met contactpersonen';
 $labels['sun'] = 'Zo';
 $labels['mon'] = 'Ma';
@@ -98,6 +100,8 @@ $labels['checkmail'] = 'Controleer op nieuwe berichten';
 $labels['writenewmessage'] = 'Nieuw bericht';
 $labels['replytomessage'] = 'Beantwoorden';
 $labels['replytoallmessage'] = 'Allen beantwoorden';
+$labels['replyall'] = 'Allen beantwoorden';
+$labels['replylist'] = 'Lijst beantwoorden';
 $labels['forwardmessage'] = 'Doorsturen';
 $labels['deletemessage'] = 'Dit bericht verwijderen';
 $labels['movemessagetotrash'] = 'Verplaats bericht naar verwijderde items';
@@ -117,13 +121,39 @@ $labels['markread'] = 'Als gelezen';
 $labels['markunread'] = 'Als ongelezen';
 $labels['markflagged'] = 'Selecteren';
 $labels['markunflagged'] = 'Niet Selecteren';
+$labels['messageactions'] = 'Meer acties...';
 $labels['select'] = 'Selecteren';
 $labels['all'] = 'Alles';
 $labels['none'] = 'Geen';
+$labels['currpage'] = 'Huidige pagina';
 $labels['unread'] = 'Ongelezen';
 $labels['flagged'] = 'Geselecteerd';
 $labels['unanswered'] = 'Onbeantwoord';
+$labels['deleted'] = 'Verwijderd';
+$labels['invert'] = 'Selectie omkeren';
 $labels['filter'] = 'Filter';
+$labels['list'] = 'Lijst';
+$labels['threads'] = 'Conversaties';
+$labels['expand-all'] = 'Alles uitklappen';
+$labels['expand-unread'] = 'Ongelezen uitklappen';
+$labels['collapse-all'] = 'Alles inklappen';
+$labels['threaded'] = 'Conversaties';
+$labels['autoexpand_threads'] = 'Klap alle conversaties uit';
+$labels['do_expand'] = 'alle conversaties';
+$labels['expand_only_unread'] = 'alleen met ongelezen berichten';
+$labels['fromto'] = 'Afzender/Ontvanger';
+$labels['flag'] = 'Markeer';
+$labels['attachment'] = 'Bijlage';
+$labels['nonesort'] = 'Geen';
+$labels['sentdate'] = 'Verzenddatum';
+$labels['arrival'] = 'Ontvangstdatum';
+$labels['asc'] = 'oplopend';
+$labels['desc'] = 'aflopend';
+$labels['listcolumns'] = 'Kolommen';
+$labels['listsorting'] = 'Sorteerkolom';
+$labels['listorder'] = 'Sorteervolgorde';
+$labels['listmode'] = 'Lijstweergave mode';
+$labels['folderactions'] = 'Acties voor map...';
 $labels['compact'] = 'Comprimeren';
 $labels['empty'] = 'Legen';
 $labels['purge'] = 'Opruimen';
@@ -132,20 +162,27 @@ $labels['unknown'] = 'onbekend';
 $labels['unlimited'] = 'ongelimiteerd';
 $labels['quicksearch'] = 'Snelzoeken';
 $labels['resetsearch'] = 'Zoek opnieuw';
+$labels['searchmod'] = 'Zoekopties';
+$labels['msgtext'] = 'Volledig bericht';
 $labels['openinextwin'] = 'Openen in een nieuw venster';
+$labels['emlsave'] = 'Opslaan (.eml)';
 $labels['compose'] = 'Nieuw bericht opstellen';
+$labels['editasnew'] = 'Als nieuw bewerken';
 $labels['savemessage'] = 'Bewaar als concept';
 $labels['sendmessage'] = 'Verzenden';
 $labels['addattachment'] = 'Bestand toevoegen als bijlage';
 $labels['charset'] = 'Karakterset';
 $labels['editortype'] = 'Opmaak';
 $labels['returnreceipt'] = 'Ontvangstbevestiging';
+$labels['dsn'] = 'Delivery Status Notification';
+$labels['editidents'] = 'Bewerk identiteiten';
 $labels['checkspelling'] = 'Controleer spelling';
 $labels['resumeediting'] = 'Hervat bewerken';
 $labels['revertto'] = 'Ongedaan maken';
 $labels['attachments'] = 'Bijlagen';
 $labels['upload'] = 'Toevoegen';
 $labels['close'] = 'Sluiten';
+$labels['messageoptions'] = 'Opties voor bericht...';
 $labels['low'] = 'Laag';
 $labels['lowest'] = 'Laagste';
 $labels['normal'] = 'Normaal';
@@ -162,6 +199,7 @@ $labels['maxuploadsize'] = 'Maximum toegestane bestandsgrootte is $size';
 $labels['addcc'] = 'Cc toevoegen';
 $labels['addbcc'] = 'Bcc toevoegen';
 $labels['addreplyto'] = 'Antwoorden aan toevoegen';
+$labels['addfollowupto'] = 'Followup aan toevoegen';
 $labels['mdnrequest'] = 'De afzender heeft een ontvangstbevestiging gevraagd. Wilt u deze versturen?';
 $labels['receiptread'] = 'Ontvangstbevestiging (gelezen)';
 $labels['yourmessage'] = 'Dir is een onvangstbevestiging voor uw bericht';
@@ -172,10 +210,13 @@ $labels['surname'] = 'Achternaam';
 $labels['email'] = 'E-mailadres';
 $labels['addcontact'] = 'Geselecteerde contactpersoon toevoegen';
 $labels['editcontact'] = 'Contactpersoon bewerken';
+$labels['contacts'] = 'Contactpersonen';
+$labels['contactproperties'] = 'Eigenschappen van contactpersoon';
 $labels['edit'] = 'Bewerken';
 $labels['cancel'] = 'Annuleren';
 $labels['save'] = 'Opslaan';
 $labels['delete'] = 'Verwijderen';
+$labels['rename'] = 'Hernoemen';
 $labels['newcontact'] = 'Contactpersoon toevoegen';
 $labels['deletecontact'] = 'Verwijder geselecteerde contactpersonen';
 $labels['composeto'] = 'Mail sturen aan';
@@ -183,10 +224,13 @@ $labels['contactsfromto'] = 'Contactpersonen $from - $to van $count';
 $labels['print'] = 'Afdrukken';
 $labels['export'] = 'Exporteren';
 $labels['exportvcards'] = 'Exporteer contactpersonen in vCard formaat';
+$labels['newcontactgroup'] = 'Maak een nieuwe contactgroep';
+$labels['groupactions'] = 'Acties voor contactgroepen...';
 $labels['previouspage'] = 'Toon vorige';
 $labels['firstpage'] = 'Toon eerste';
 $labels['nextpage'] = 'Toon volgende';
 $labels['lastpage'] = 'Toon laatste';
+$labels['group'] = 'Groep';
 $labels['groups'] = 'Groepen';
 $labels['personaladrbook'] = 'Personlijke adressen';
 $labels['import'] = 'Importeer';
@@ -204,6 +248,10 @@ $labels['manageidentities'] = 'Beheer de identiteiten voor deze gebruiker';
 $labels['newidentity'] = 'Nieuwe identiteit';
 $labels['newitem'] = 'Nieuw';
 $labels['edititem'] = 'Bewerken';
+$labels['preferhtml'] = 'Gebruik HTML-opmaak';
+$labels['defaultcharset'] = 'Standaard karakterset';
+$labels['htmlmessage'] = 'HTML-bericht';
+$labels['prettydate'] = 'Uitgebreide datumweergave';
 $labels['setdefault'] = 'Als standaard instellen';
 $labels['autodetect'] = 'Automatisch';
 $labels['language'] = 'Taal';
@@ -212,6 +260,7 @@ $labels['pagesize'] = 'Berichten per pagina';
 $labels['signature'] = 'Handtekening';
 $labels['dstactive'] = 'Zomer/wintertijd';
 $labels['htmleditor'] = 'HTML berichten opmaken';
+$labels['htmlonreply'] = 'enkel bij beantwoorden van een HTML bericht';
 $labels['htmlsignature'] = 'HTML handtekening';
 $labels['previewpane'] = 'Toon voorbeeldvenster';
 $labels['skin'] = 'Opmaakprofiel';
@@ -223,10 +272,13 @@ $labels['mailboxview'] = 'Opmaak Mailbox';
 $labels['mdnrequests'] = 'Ontvangstmeldingen';
 $labels['askuser'] = 'vraag de gebruiker';
 $labels['autosend'] = 'stuur automatisch';
+$labels['autosendknown'] = 'stuur ontvangstbevestiging naar mijn contactpersonen, anders vraag mij';
+$labels['autosendknownignore'] = 'stuur ontvangstbevestiging naar mijn contactpersonen, anders negeer';
 $labels['ignore'] = 'negeer';
 $labels['readwhendeleted'] = 'Bericht na verwijderen als gelezen markeren';
 $labels['flagfordeletion'] = 'Bericht niet verwijderen maar als verwijderd markeren ';
 $labels['skipdeleted'] = 'Verwijderde berichten niet tonen';
+$labels['deletealways'] = 'Verwijder bericht wanneer verplaatsen naar Prullenbak mislukt';
 $labels['showremoteimages'] = 'Geef externe toegevoegde berichten weer';
 $labels['fromknownsenders'] = 'Van bekende afzenders';
 $labels['always'] = 'altijd';
@@ -235,27 +287,56 @@ $labels['autosavedraft'] = 'Automatisch als concept opslaan';
 $labels['everynminutes'] = 'elke $n minuten';
 $labels['keepalive'] = 'Controleer op nieuwe berichten';
 $labels['never'] = 'nooit';
+$labels['immediately'] = 'onmiddellijk';
 $labels['messagesdisplaying'] = 'Berichten weergave';
 $labels['messagescomposition'] = 'Berichten aanmaken';
 $labels['mimeparamfolding'] = 'Namen van bijlagen';
 $labels['2231folding'] = 'Volledig RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Volledig RFC 2047 (andere)';
+$labels['force7bit'] = 'Gebruik MIME codering voor 8-bit karakters';
 $labels['advancedoptions'] = 'Geavanceerde opties';
 $labels['focusonnewmessage'] = 'Focus browserscherm bij nieuw bericht';
 $labels['checkallfolders'] = 'Controleer alle mappen op nieuwe berichten';
+$labels['displaynext'] = 'Na verplaatsen/verwijderen het volgende bericht tonen';
+$labels['mainoptions'] = 'Hoofdopties';
+$labels['section'] = 'Sectie';
+$labels['maintenance'] = 'Onderhoud';
+$labels['newmessage'] = 'Nieuw bericht';
+$labels['listoptions'] = 'Lijstopties';
+$labels['signatureoptions'] = 'Opties voor handtekening';
+$labels['whenreplying'] = 'Bij beantwoorden';
+$labels['replytopposting'] = 'begin bericht boven het origineel';
+$labels['replybottomposting'] = 'begin bericht onder het origineel';
+$labels['replyremovesignature'] = 'Verwijder handtekening uit het origneel bij beantwoorden';
+$labels['autoaddsignature'] = 'Handtekening automatisch toevoegen';
+$labels['newmessageonly'] = 'alleen bij nieuwe berichten';
+$labels['replyandforwardonly'] = 'alleen bij beantwoorden en doorsturen';
+$labels['replysignaturepos'] = 'Ondertekening plaatsen bij beantwoorden of doorsturen';
+$labels['belowquote'] = 'onder het citaat';
+$labels['abovequote'] = 'boven het citaat';
+$labels['insertsignature'] = 'Handtekening invoegen';
+$labels['previewpanemarkread'] = 'Markeer voorbeeldbericht als gelezen';
+$labels['afternseconds'] = 'Na $n seconden';
+$labels['reqmdn'] = 'Vraag altijd een ontvangstbevestiging';
+$labels['reqdsn'] = 'Vraag altijd een Delivery Status Notification';
+$labels['replysamefolder'] = 'Plaats antwoorden in de map van het beantwoorde bericht';
 $labels['folder'] = 'Map';
 $labels['folders'] = 'Mappen';
 $labels['foldername'] = 'Naam';
-$labels['subscribed'] = 'Gebruiken';
+$labels['subscribed'] = 'Geabonneerd';
 $labels['messagecount'] = 'Berichten';
 $labels['create'] = 'Aanmaken';
 $labels['createfolder'] = 'Nieuwe map aanmaken';
-$labels['rename'] = 'Hernoemen';
-$labels['renamefolder'] = 'Hernoem map';
-$labels['deletefolder'] = 'Map verwijderen';
 $labels['managefolders'] = 'Mappen beheren';
 $labels['specialfolders'] = 'Speciale mappen';
+$labels['properties'] = 'Eigenschappen';
+$labels['folderproperties'] = 'Eigenschappen van map';
+$labels['parentfolder'] = 'Bovenliggende map';
+$labels['location'] = 'Locatie';
+$labels['info'] = 'Informatie';
+$labels['getfoldersize'] = 'Klik voor de grootte van de map';
+$labels['changesubscription'] = 'Klik voor abonnement te wijzigen';
 $labels['sortby'] = 'Sorteren op';
 $labels['sortasc'] = 'Oplopend sorteren';
 $labels['sortdesc'] = 'Aflopend sorteren';
@@ -263,5 +344,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Engels';
+$labels['westerneuropean'] = 'West-Europees';
+$labels['easterneuropean'] = 'Oost-Europees';
+$labels['southeasterneuropean'] = 'Zuidoost Europees';
+$labels['baltic'] = 'Baltisch';
+$labels['cyrillic'] = 'Cyrillisch';
+$labels['arabic'] = 'Arabisch';
+$labels['greek'] = 'Grieks';
+$labels['hebrew'] = 'Hebreeuws';
+$labels['turkish'] = 'Turks';
+$labels['nordic'] = 'Noord-Germaans';
+$labels['thai'] = 'Thais';
+$labels['celtic'] = 'Keltisch';
+$labels['vietnamese'] = 'Vietnamees';
+$labels['japanese'] = 'Japans';
+$labels['korean'] = 'Koreaans';
+$labels['chinese'] = 'Chinees';
 
 ?>
index 1976b953f65b159e400c52adcba2e28c92b666ea..8027480002cede56768010b653e5f689ee8e5aa0 100644 (file)
@@ -2,30 +2,37 @@
 
 /*
 
- +-----------------------------------------------------------------------+
- | language/nl_BE/messages.inc                                           |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Dennis Heeren <dennis.heeren@gmail.com>                       |
- +-----------------------------------------------------------------------+
++-----------------------------------------------------------------------+
+| language/nl_BE/messages.inc                                           |
+|                                                                       |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Dennis Heeren <dennis.heeren@gmail.com>                       |
+|         Simon De Schoenmaeker <sds@simonds.be>                        |
++-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 2237 2009-01-17 01:55:39Z till $
+@version $Id: messages.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
 $messages = array();
 $messages['loginfailed'] = 'Aanmelden mislukt...';
 $messages['cookiesdisabled'] = 'Uw browser accepteert geen cookies...';
-$messages['sessionerror'] = 'Sessie is reeds beindigd of is ongeldig...';
+$messages['sessionerror'] = 'Sessie is reeds beëindigd of is ongeldig...';
 $messages['imaperror'] = 'Kon geen verbinding maken met de IMAP server...';
+$messages['servererror'] = 'Server fout!';
+$messages['servererrormsg'] = 'Server fout: $msg';
+$messages['errorreadonly'] = 'Kon opdracht niet uitvoeren. Map is alleen-lezen';
+$messages['errornoperm'] = 'Kon opdracht niet uitvoeren. Toegang geweigerd';
+$messages['invalidrequest'] = 'Ongeldige aanvraag! Er zijn geen gegevens opgeslagen.';
 $messages['nomessagesfound'] = 'Er zijn geen berichten in deze map...';
 $messages['loggedout'] = 'U bent nu afgemeld. Tot ziens!';
 $messages['mailboxempty'] = 'Mailbox is leeg...';
 $messages['loading'] = 'Bezig met ophalen gegevens...';
+$messages['uploading'] = 'Bezig met uploaden...';
 $messages['loadingdata'] = 'Bezig met gegevens ophalen...';
 $messages['checkingmail'] = 'Controleer op nieuwe berichten...';
 $messages['sendingmessage'] = 'Bericht wordt verstuurd...';
@@ -36,47 +43,95 @@ $messages['successfullysaved'] = 'Succesvol opgeslagen...';
 $messages['addedsuccessfully'] = 'Contactpersoon is toegevoegd...';
 $messages['contactexists'] = 'Er bestaat reeds een contactpersoon met dit e-mailadres...';
 $messages['blockedimages'] = 'Om uw privacy te beschermen worden de afbeeldingen in dit bericht niet getoond...';
-$messages['encryptedmessage'] = 'Dit bericht is gencrypteerd en kan niet worden weergegeven, sorry...';
+$messages['encryptedmessage'] = 'Dit bericht is geëncrypteerd en kan niet worden weergegeven, sorry...';
 $messages['nocontactsfound'] = 'Geen contactpersonen gevonden...';
 $messages['contactnotfound'] = 'De gevraagde contactpersoon was niet gevonden';
 $messages['sendingfailed'] = 'Kon het bericht niet versturen...';
+$messages['senttooquickly'] = 'U moet $sec seconden wachten om het bericht te versturen.';
+$messages['errorsavingsent'] = 'Er is een fout opgetreden tijdens het opslaan van het verzonden bericht';
 $messages['errorsaving'] = 'Er is een fout opgetreden bij het opslaan van het bericht...';
-$messages['errormoving'] = 'Kon het bericht niet verplaatsen...';
-$messages['errordeleting'] = 'Kon het bericht niet verwijderen...';
+$messages['errormoving'] = 'Kon de bericht(en) niet verplaatsen...';
+$messages['errorcopying'] = 'Kon de bericht(en) niet kopiëren';
+$messages['errordeleting'] = 'Kon de bericht(en) niet verwijderen...';
+$messages['errormarking'] = 'Kon de bericht(en) niet markeren...';
 $messages['deletecontactconfirm'] = 'Bent u zeker dat u de geselecteerde contactpers(o)on(en) wilt verwijderen?';
 $messages['deletemessagesconfirm'] = 'Bent u zeker dat u de geselecteerde bericht(en) wilt verwijderen?';
 $messages['deletefolderconfirm'] = 'Weet u zeker dat u deze map wilt verwijderen?';
 $messages['purgefolderconfirm'] = 'Bent u zeker dat u alle berichten in deze map wilt verwijderen?';
+$messages['folderdeleting'] = 'Map verwijderen...';
+$messages['foldermoving'] = 'Map verplaatsen...';
 $messages['formincomplete'] = 'Het formulier is niet volledig ingevuld...';
 $messages['noemailwarning'] = 'Geef een geldig e-mailadres op...';
 $messages['nonamewarning'] = 'Geef een naam op...';
 $messages['nopagesizewarning'] = 'Geef een geldig aantal berichten per pagina op...';
-$messages['norecipientwarning'] = 'Geef minstens ��n bestemmeling op...';
+$messages['nosenderwarning'] = 'Geef een e-mailadres van de afzender op';
+$messages['norecipientwarning'] = 'Geef minstens één bestemmeling op...';
 $messages['nosubjectwarning'] = 'Geen onderwerp opgegeven. Wenst u alsnog een onderwerp te geven?';
 $messages['nobodywarning'] = 'Wilt u dit lege bericht versturen?';
 $messages['notsentwarning'] = 'Het bericht is niet verzonden. Wilt u het bericht verwijderen?';
 $messages['noldapserver'] = 'Kies een LDAP server waarop gezocht moet worden...';
 $messages['nocontactsreturned'] = 'Geen contactpersonen gevonden';
 $messages['nosearchname'] = 'Geen een contacpersoon of e-mailadres op...';
+$messages['notuploadedwarning'] = 'Nog niet alle bijlagen zijn geüpload. Wacht even of annuleer de upload.';
 $messages['searchsuccessful'] = '$nr berichten gevonden';
 $messages['searchnomatch'] = 'Zoekopdracht leverde geen resultaten';
 $messages['searching'] = 'Bezig met zoeken...';
 $messages['checking'] = 'Bezig met controleren...';
 $messages['nospellerrors'] = 'Geen spelfouten gevonden';
-$messages['folderdeleted'] = 'Mappen met succes verwijderd';
+$messages['folderdeleted'] = 'Map met succes verwijderd';
+$messages['folderexpunged'] = 'Map met succes geleegd';
 $messages['deletedsuccessfully'] = 'Succesvol verwijderd';
 $messages['converting'] = 'Opmaak van het bericht wordt gewist...';
 $messages['messageopenerror'] = 'Kon het bericht niet ophalen van de server';
 $messages['fileuploaderror'] = 'Bestandupload mislukt';
 $messages['filesizeerror'] = 'Het bestand overschrijdt de maximum grootte van $size';
-$messages['copysuccess'] = '$nr adressen met succes gekopierd';
-$messages['copyerror'] = 'Kon de adressen niet kopiren';
+$messages['copysuccess'] = '$nr adressen met succes gekopieerd';
+$messages['copyerror'] = 'Kon de adressen niet kopiëren';
 $messages['sourceisreadonly'] = 'Het adres kan niet worden opgeslagen';
 $messages['errorsavingcontact'] = 'Kon de contactpersoon niet bewaren';
 $messages['movingmessage'] = 'Bericht wordt verplaatst...';
+$messages['copyingmessage'] = 'Bericht wordt gekopieerd...';
+$messages['deletingmessage'] = 'Bericht wordt verwijderd...';
+$messages['markingmessage'] = 'Bericht wordt gemarkeerd...';
 $messages['receiptsent'] = 'Ontvangstbevestiging verstuurd';
 $messages['errorsendingreceipt'] = 'Kon de ontvangstbevestigign niet versturen';
 $messages['nodeletelastidentity'] = 'U kunt dit laatste afzendadres niet verwijderen.';
-$messages['addsubfolderhint'] = 'De map wordt aangemaakt als submap van de geselecteerde map.';
+$messages['forbiddencharacter'] = 'De naam van de map bevat een karakter dat niet is toegestaan';
+$messages['selectimportfile'] = 'Selecteer een bestand om te uploaden';
+$messages['addresswriterror'] = 'Het geselecteerde adresboek is alleen-lezen';
+$messages['contactaddedtogroup'] = 'Contact(en) met succes toegevoegd aan de groep';
+$messages['contactremovedfromgroup'] = 'Contact(en) met succes verwijderd aan de groep';
+$messages['importwait'] = 'Importeren, even geduld...';
+$messages['importerror'] = 'Importeren mislukt! Het verstuurde bestand is geen geldig vCard bestand.';
+$messages['importconfirm'] = '<b>Er zijn $inserted contactpersonen succesvol geïmporteerd, en $skipped bestaande overgeslagen</b>:<p><em>$names</em></p>';
+$messages['opnotpermitted'] = 'Deze actie is niet toegestaan!';
+$messages['nofromaddress'] = 'Er is geen e-mailadres in de geselecteerde identiteit';
+$messages['editorwarning'] = 'Door het overschakelen naar de platte tekst editor gaat alle opmaak verloren. Weet je zeker dat je verder wil gaan?';
+$messages['httpreceivedencrypterror'] = 'Er is een fatale fout opgetreden. Neem direct contact op met uw systeembeheerder. <b>Uw bericht kon niet worden verzonden.</b>';
+$messages['smtpconnerror'] = 'SMTP Fout ($code): Verbinding met server mislukt';
+$messages['smtpautherror'] = 'SMTP Fout ($code): Authenticatie mislukt';
+$messages['smtpfromerror'] = 'SMTP Fout ($code): Kon afzender "$from" niet instellen ($msg)';
+$messages['smtptoerror'] = 'SMTP Fout ($code): Kon ontvanger "$to" niet toevoegen ($msg)';
+$messages['smtprecipientserror'] = 'SMTP Fout: Kon lijst van ontvangers niet verwerken';
+$messages['smtpdsnerror'] = 'SMTP Fout: Delivery Status Notifications worden niet ondersteund';
+$messages['smtperror'] = 'SMTP Fout: $msg';
+$messages['emailformaterror'] = 'Ongeldig e-mailadres: $email';
+$messages['toomanyrecipients'] = 'Te veel geadresseerden. Verminder de hoeveelheid geadresseerden tot $max';
+$messages['maxgroupmembersreached'] = 'Het aantal leden van de groep groter is dan de maximale van $max';
+$messages['internalerror'] = 'Er is een interne fout opgetreden. Probeer het nogmaals';
+$messages['contactdelerror'] = 'Kon contactpersoon niet verwijderen';
+$messages['contactdeleted'] = 'Contactpersoon succesvol verwijderd';
+$messages['groupdeleted'] = 'Groep succesvol verwijderd';
+$messages['grouprenamed'] = 'Groep succesvol hernoemd';
+$messages['groupcreated'] = 'Groep succesvol aangemaakt';
+$messages['messagedeleted'] = 'Bericht(en) succesvol verwijderd';
+$messages['messagemoved'] = 'Bericht(en) succesvol verplaatst';
+$messages['messagecopied'] = 'Bericht(en) succesvol gekopieerd';
+$messages['messagemarked'] = 'Bericht(en) succesvol gemarkeerd';
+$messages['autocompletechars'] = 'Geef ten minste $min karakters voor auto aanvullen';
+$messages['namecannotbeempty'] = 'Naam kan niet leeg zijn';
+$messages['nametoolong'] = 'Naam is te lang';
+$messages['folderupdated'] = 'Map succesvol geüpdatet';
+$messages['foldercreated'] = 'Map succesvol aangemaakt';
 
 ?>
index 66b9659cdcc15626140eaf9bb0e9c5b3d3f4661c..1982805670b654b4541142060e7bc522a33a2c3e 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/nl_NL/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 |         Lazlo Westerhof <roundcube@lazlo.me>                          |
 |         Laurens Vets <laurens@daemon.be>                              |
 |         Frits Letteboer <f.letteboer@radiotwenterand.nl>              |
+|         Justin van Beusekom <j.v.beusekom@beus-it.nl>                 |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 3029 2009-10-09 11:46:23Z alec $
+@version $Id: labels.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -41,21 +42,22 @@ $labels['to'] = 'Ontvanger';
 $labels['cc'] = 'Kopie';
 $labels['bcc'] = 'Bcc';
 $labels['replyto'] = 'Antwoord-aan';
+$labels['followupto'] = 'Followup-Aan';
 $labels['date'] = 'Datum';
 $labels['size'] = 'Grootte';
 $labels['priority'] = 'Prioriteit';
 $labels['organization'] = 'Organisatie';
-$labels['reply-to'] = 'Antwoord-aan';
+$labels['readstatus'] = 'Gelezen?';
 $labels['mailboxlist'] = 'Mappen';
 $labels['messagesfromto'] = 'Bericht $from t/m $to van $count';
+$labels['threadsfromto'] = 'Conversatie $from t/m $to van $count';
 $labels['messagenrof'] = 'Bericht $nr van $count';
+$labels['copy'] = 'Kopiëren';
+$labels['move'] = 'Verplaats';
 $labels['moveto'] = 'Verplaats naar...';
 $labels['download'] = 'Download';
 $labels['filename'] = 'Bestandsnaam';
 $labels['filesize'] = 'Bestandsgrootte';
-$labels['preferhtml'] = 'Toon HTML';
-$labels['htmlmessage'] = 'HTML-Bericht';
-$labels['prettydate'] = 'Gebruiksvriendelijke data';
 $labels['addtoaddressbook'] = 'Toevoegen aan adresboek';
 $labels['sun'] = 'Zo';
 $labels['mon'] = 'Ma';
@@ -99,7 +101,9 @@ $labels['today'] = 'Vandaag';
 $labels['checkmail'] = 'Controleer op nieuwe berichten';
 $labels['writenewmessage'] = 'Maak een nieuw bericht';
 $labels['replytomessage'] = 'Beantwoord het bericht';
-$labels['replytoallmessage'] = 'Beantwoord alle ontvangers';
+$labels['replytoallmessage'] = 'Beantwoord lijst of afzender en alle ontvangers';
+$labels['replyall'] = 'Beantwoord alle ontvangers';
+$labels['replylist'] = 'Beantwoord lijst';
 $labels['forwardmessage'] = 'Bericht doorsturen';
 $labels['deletemessage'] = 'Verwijder het bericht';
 $labels['movemessagetotrash'] = 'Verplaats het bericht naar de prullenbak';
@@ -123,12 +127,35 @@ $labels['messageactions'] = 'Meer acties...';
 $labels['select'] = 'Selecteer';
 $labels['all'] = 'Allemaal';
 $labels['none'] = 'Geen';
+$labels['currpage'] = 'Huidige pagina';
 $labels['unread'] = 'Ongelezen';
 $labels['flagged'] = 'Geselecteerd';
 $labels['unanswered'] = 'Onbeantwoord';
 $labels['deleted'] = 'Verwijderd';
 $labels['invert'] = 'Selectie omdraaien';
 $labels['filter'] = 'Filter';
+$labels['list'] = 'Lijst';
+$labels['threads'] = 'Conversaties';
+$labels['expand-all'] = 'Alles uitklappen';
+$labels['expand-unread'] = 'Ongelezen uitklappen';
+$labels['collapse-all'] = 'Alles inklappen';
+$labels['threaded'] = 'Conversaties';
+$labels['autoexpand_threads'] = 'Klap alle conversaties uit';
+$labels['do_expand'] = 'alle conversaties';
+$labels['expand_only_unread'] = 'alleen met ongelezen berichten';
+$labels['fromto'] = 'Afzender/Ontvanger';
+$labels['flag'] = 'Markeer';
+$labels['attachment'] = 'Bijlage';
+$labels['nonesort'] = 'Geen';
+$labels['sentdate'] = 'Verzend datum';
+$labels['arrival'] = 'Aankomst datum';
+$labels['asc'] = 'oplopend';
+$labels['desc'] = 'aflopend';
+$labels['listcolumns'] = 'Kolommen';
+$labels['listsorting'] = 'Sorteerkolom';
+$labels['listorder'] = 'Sorteervolgorde';
+$labels['listmode'] = 'Lijstweergave mode';
+$labels['folderactions'] = 'Acties voor map...';
 $labels['compact'] = 'Opschonen';
 $labels['empty'] = 'Legen';
 $labels['purge'] = 'Verwijderen';
@@ -149,12 +176,15 @@ $labels['addattachment'] = 'Voeg een bijlage toe';
 $labels['charset'] = 'Karakterset';
 $labels['editortype'] = 'Opmaak';
 $labels['returnreceipt'] = 'Ontvangstbevestiging';
+$labels['dsn'] = 'Afleverings status notificatie (DSN)';
+$labels['editidents'] = 'Bewerk identiteiten';
 $labels['checkspelling'] = 'Controleer spelling';
 $labels['resumeediting'] = 'Doorgaan met opstellen';
 $labels['revertto'] = 'Wijzig terug in';
 $labels['attachments'] = 'Bijlages';
 $labels['upload'] = 'Toevoegen';
 $labels['close'] = 'Sluit';
+$labels['messageoptions'] = 'Acties voor bericht...';
 $labels['low'] = 'Laag';
 $labels['lowest'] = 'Laagste';
 $labels['normal'] = 'Normaal';
@@ -171,6 +201,7 @@ $labels['maxuploadsize'] = 'Maximum toegestane bestandsgrootte is $size';
 $labels['addcc'] = 'Cc toevoegen';
 $labels['addbcc'] = 'Bcc toevoegen';
 $labels['addreplyto'] = 'Antwoord-aan toevoegen';
+$labels['addfollowupto'] = 'Mail-Followup-Aan toevoegen';
 $labels['mdnrequest'] = 'De afzender van dit bericht heeft gevraagd een melding te ontvangen wanneer u dit bericht heeft gelezen. Wilt u deze melding verzenden?';
 $labels['receiptread'] = 'Ontvangstbevestiging (gelezen)';
 $labels['yourmessage'] = 'Dit is een ontvangstbevestiging voor uw bericht';
@@ -181,10 +212,13 @@ $labels['surname'] = 'Achternaam';
 $labels['email'] = 'E-Mail';
 $labels['addcontact'] = 'Nieuwe contactpersoon toevoegen';
 $labels['editcontact'] = 'Contactpersoon wijzigen';
+$labels['contacts'] = 'Contacten';
+$labels['contactproperties'] = 'Contact eigenschappen';
 $labels['edit'] = 'Wijzig';
 $labels['cancel'] = 'Annuleer';
 $labels['save'] = 'Opslaan';
 $labels['delete'] = 'Verwijder';
+$labels['rename'] = 'Hernoem';
 $labels['newcontact'] = 'Voeg een nieuwe contactpersoon toe';
 $labels['deletecontact'] = 'Verwijder geselecteerde contacten';
 $labels['composeto'] = 'Stuur een bericht naar';
@@ -192,27 +226,34 @@ $labels['contactsfromto'] = 'Contacten $from t/m $to van $count';
 $labels['print'] = 'Afdrukken';
 $labels['export'] = 'Exporteren';
 $labels['exportvcards'] = 'Exporteer contactpersonen in vCard formaat';
+$labels['newcontactgroup'] = 'Maak een nieuwe contactgroep';
+$labels['groupactions'] = 'Acties voor contactgroepen...';
 $labels['previouspage'] = 'Vorige pagina';
 $labels['firstpage'] = 'Eerste pagina';
 $labels['nextpage'] = 'Volgende pagina';
 $labels['lastpage'] = 'Laatste pagina';
+$labels['group'] = 'Groep';
 $labels['groups'] = 'Groepen';
 $labels['personaladrbook'] = 'Persoonlijk Adresboek';
 $labels['import'] = 'Importeer';
 $labels['importcontacts'] = 'Contactpersonen importeren';
 $labels['importfromfile'] = 'Importeer van bestand:';
 $labels['importreplace'] = 'Vervang het complete adresboek';
-$labels['importtext'] = 'U kunt hier contactpersonen importeren vanuit een bestaand adresboek.<br />Op dit moment ondersteunen wij het <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> bestandsformaat.';
+$labels['importtext'] = 'U kunt hier contactpersonen importeren vanuit een bestaand adresboek.<br />Op dit moment ondersteunen wij het <a href="http://nl.wikipedia.org/wiki/VCard">vCard</a> bestandsformaat.';
 $labels['done'] = 'Klaar';
 $labels['settingsfor'] = 'Instellingen voor';
 $labels['preferences'] = 'Instellingen';
 $labels['userpreferences'] = 'Gebruikersinstellingen';
 $labels['editpreferences'] = 'Wijzig gebruikersinstellingen';
-$labels['identities'] = 'Identititeiten';
+$labels['identities'] = 'Identiteiten';
 $labels['manageidentities'] = 'Beheer identiteiten voor dit account';
 $labels['newidentity'] = 'Identiteit toevoegen';
 $labels['newitem'] = 'Nieuw item';
 $labels['edititem'] = 'Wijzig item';
+$labels['preferhtml'] = 'Toon HTML';
+$labels['defaultcharset'] = 'Standaard karakterset';
+$labels['htmlmessage'] = 'HTML-Bericht';
+$labels['prettydate'] = 'Gebruiksvriendelijke data';
 $labels['setdefault'] = 'Stel in als standaard';
 $labels['autodetect'] = 'Automatisch';
 $labels['language'] = 'Taal';
@@ -221,6 +262,7 @@ $labels['pagesize'] = 'Aantal berichten per pagina';
 $labels['signature'] = 'Ondertekening';
 $labels['dstactive'] = 'Zomertijd';
 $labels['htmleditor'] = 'Maak HTML berichten aan';
+$labels['htmlonreply'] = 'alleen bij het beantwoorden van HTML berichten';
 $labels['htmlsignature'] = 'HTML onderschrift';
 $labels['previewpane'] = 'Toon voorbeeldvenster';
 $labels['skin'] = 'Opmaakprofiel';
@@ -232,10 +274,13 @@ $labels['mailboxview'] = 'Opmaak Mailbox';
 $labels['mdnrequests'] = 'Ontvangstmeldingen';
 $labels['askuser'] = 'vraag de gebruiker';
 $labels['autosend'] = 'stuur automatisch';
+$labels['autosendknown'] = 'stuur ontvangstbevestiging alleen naar mijn contactpersonen, voor anderen aan mij vragen';
+$labels['autosendknownignore'] = 'stuur ontvangstbevestiging alleen naar mijn contactpersonen,  voor anderen negeren';
 $labels['ignore'] = 'negeer';
 $labels['readwhendeleted'] = 'Bericht na verwijderen als gelezen markeren';
 $labels['flagfordeletion'] = 'Bericht niet verwijderen maar als verwijderd markeren ';
 $labels['skipdeleted'] = 'Verwijderde berichten niet tonen';
+$labels['deletealways'] = 'Verwijder bericht wanneer verplaatsen naar Prullenbak mislukt';
 $labels['showremoteimages'] = 'Geef externe toegevoegde berichten weer';
 $labels['fromknownsenders'] = 'Van bekende afzenders';
 $labels['always'] = 'altijd';
@@ -244,12 +289,14 @@ $labels['autosavedraft'] = 'Concept automatisch opslaan';
 $labels['everynminutes'] = 'iedere $n minuten';
 $labels['keepalive'] = 'Controleer op nieuwe berichten';
 $labels['never'] = 'nooit';
+$labels['immediately'] = 'onmiddellijk';
 $labels['messagesdisplaying'] = 'Berichten weergave';
 $labels['messagescomposition'] = 'Berichten aanmaken';
 $labels['mimeparamfolding'] = 'Namen van bijlagen';
 $labels['2231folding'] = 'Volledig RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Volledig RFC 2047 (andere)';
+$labels['force7bit'] = 'Gebruik MIME codering voor 8-bit karakters';
 $labels['advancedoptions'] = 'Geavanceerde opties';
 $labels['focusonnewmessage'] = 'Focus browserscherm bij nieuw bericht';
 $labels['checkallfolders'] = 'Controleer alle mappen op nieuwe berichten';
@@ -259,6 +306,23 @@ $labels['section'] = 'Sectie';
 $labels['maintenance'] = 'Onderhoud';
 $labels['newmessage'] = 'Nieuw bericht';
 $labels['listoptions'] = 'Lijstopties';
+$labels['signatureoptions'] = 'Instellingen voor ondertekening';
+$labels['whenreplying'] = 'bij antwoorden';
+$labels['replytopposting'] = 'begin bericht boven het origineel';
+$labels['replybottomposting'] = 'begin bericht onder het origineel';
+$labels['replyremovesignature'] = 'Verwijder ondertekening uit het origneel bij het antwoorden';
+$labels['autoaddsignature'] = 'Ondertekening automatisch toevoegen';
+$labels['newmessageonly'] = 'alleen bij nieuwe berichten';
+$labels['replyandforwardonly'] = 'alleen bij antwoorden en doorsturen';
+$labels['replysignaturepos'] = 'Ondertekening plaatsen bij antwoorden of doorsturen';
+$labels['belowquote'] = 'onder het citaat';
+$labels['abovequote'] = 'boven het citaat';
+$labels['insertsignature'] = 'Ondertekening invoegen';
+$labels['previewpanemarkread'] = 'Markeer voorbeeld bericht als gelezen';
+$labels['afternseconds'] = 'Na $n seconden';
+$labels['reqmdn'] = 'Vraag altijd een ontvangstbevestiging';
+$labels['reqdsn'] = 'Vraag altijd een afleverings status notificatie (DSN)';
+$labels['replysamefolder'] = 'Plaats antwoorden in de folder van het beantwoorde bericht';
 $labels['folder'] = 'Map';
 $labels['folders'] = 'Mappen';
 $labels['foldername'] = 'Mapnaam';
@@ -266,11 +330,15 @@ $labels['subscribed'] = 'Geabonneerd';
 $labels['messagecount'] = 'Berichten';
 $labels['create'] = 'Nieuw';
 $labels['createfolder'] = 'Maak nieuwe map';
-$labels['rename'] = 'Wijzig naam';
-$labels['renamefolder'] = 'Wijzig mapnaam';
-$labels['deletefolder'] = 'Verwijder map';
 $labels['managefolders'] = 'Beheer mappen';
 $labels['specialfolders'] = 'Speciale mappen';
+$labels['properties'] = 'Eigenschappen';
+$labels['folderproperties'] = 'Map eigenschappen';
+$labels['parentfolder'] = 'Hoofd folder';
+$labels['location'] = 'Locatie';
+$labels['info'] = 'Informatie';
+$labels['getfoldersize'] = 'Klik hier voor de map grootte';
+$labels['changesubscription'] = 'Klik voor het wijzigen van de inschrijving';
 $labels['sortby'] = 'Sorteer op';
 $labels['sortasc'] = 'Sorteer oplopend';
 $labels['sortdesc'] = 'Sorteer aflopend';
@@ -278,5 +346,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Engels';
+$labels['westerneuropean'] = 'West-Europeaans';
+$labels['easterneuropean'] = 'Oost-Europeaans';
+$labels['southeasterneuropean'] = 'Zuidoost Europees';
+$labels['baltic'] = 'Baltisch';
+$labels['cyrillic'] = 'Cyrillisch';
+$labels['arabic'] = 'Arabisch';
+$labels['greek'] = 'Grieks';
+$labels['hebrew'] = 'Hebreeuws';
+$labels['turkish'] = 'Turks';
+$labels['nordic'] = 'Noord-Germaans';
+$labels['thai'] = 'Thais';
+$labels['celtic'] = 'Keltisch';
+$labels['vietnamese'] = 'Vietnamees';
+$labels['japanese'] = 'Japans';
+$labels['korean'] = 'Koreaans';
+$labels['chinese'] = 'Chinees';
 
 ?>
index 2ad18952e31749f802f91058848e121104c92ea2..7e44b5e875a44503e0627c20d7729e61d389e282 100644 (file)
@@ -5,17 +5,18 @@
 +-----------------------------------------------------------------------+
 | language/nl_NL/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Mark Moses <mark@katmoda.com>                                 |
-|         Lazlo Westerhof <roundcube@lazlo.me>                         |
+|         Lazlo Westerhof <roundcube@lazlo.me>                          |
 |         Frits Letteboer <f.letteboer@radiotwenterand.nl>              |
+|         Justin van Beusekom <j.v.beusekom@beus-it.nl>                 |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2798 2009-07-24 13:30:39Z robin $
+@version $Id: messages.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -25,11 +26,15 @@ $messages['cookiesdisabled'] = 'Uw browser accepteert geen cookies';
 $messages['sessionerror'] = 'Uw sessie is verlopen of ongeldig';
 $messages['imaperror'] = 'Connectie met IMAP server mislukt';
 $messages['servererror'] = 'Server Fout!';
+$messages['servererrormsg'] = 'Server Fout: $msg';
+$messages['errorreadonly'] = 'Niet in staat om de bewerking uit te voeren. Map is alleen-lezen';
+$messages['errornoperm'] = 'Niet in staat om de bewerking uit te voeren. Toestemming geweigerd';
 $messages['invalidrequest'] = 'Ongeldige aanvraag! Er zijn geen gegevens opgeslagen.';
 $messages['nomessagesfound'] = 'Geen berichten gevonden in deze mailbox';
 $messages['loggedout'] = 'Succesvol uitgelogd. Tot ziens!';
 $messages['mailboxempty'] = 'Mailbox is leeg';
 $messages['loading'] = 'Laden...';
+$messages['uploading'] = 'Bezig met uploaden...';
 $messages['loadingdata'] = 'Laden van data...';
 $messages['checkingmail'] = 'Controleren op nieuwe berichten...';
 $messages['sendingmessage'] = 'Bezig met bericht versturen...';
@@ -48,16 +53,17 @@ $messages['senttooquickly'] = 'Je moet $sec seconden wachten om het bericht te v
 $messages['errorsavingsent'] = 'Er is een fout opgetreden tijdens het opslaan van het verzonden bericht';
 $messages['errorsaving'] = 'Er is een fout opgetreden tijdens het opslaan';
 $messages['errormoving'] = 'Kan het bericht niet verplaatsen';
+$messages['errorcopying'] = 'Kan de bericht(en) niet kopiëren';
 $messages['errordeleting'] = 'Kan het bericht niet verwijderen';
 $messages['errormarking'] = 'Kon bericht niet markeren';
 $messages['deletecontactconfirm'] = 'Weet u zeker dat u de geselecteerde contactperso(o)n/en wilt verwijderen?';
 $messages['deletemessagesconfirm'] = 'Weet u zeker dat u de geselecteerde bericht(en) wilt verwijderen?';
 $messages['deletefolderconfirm'] = 'Weet u zeker dat u deze map wilt verwijderen?';
 $messages['purgefolderconfirm'] = 'Weet u zeker dat u alle berichten in deze map wilt verwijderen?';
-$messages['foldercreating'] = 'Map aanmaken...';
 $messages['folderdeleting'] = 'Map verwijderen...';
-$messages['folderrenaming'] = 'Mapnaam wijzigen...';
 $messages['foldermoving'] = 'Map verplaatsen...';
+$messages['foldersubscribing'] = 'Abonneren map...';
+$messages['folderunsubscribing'] = 'Afmelding map ...';
 $messages['formincomplete'] = 'Het formulier was niet volledig ingevuld';
 $messages['noemailwarning'] = 'Geef een geldig e-mailadres op';
 $messages['nonamewarning'] = 'Vul een naam in';
@@ -70,12 +76,17 @@ $messages['notsentwarning'] = 'Bericht is niet verstuurd. Weet u zeker dat u het
 $messages['noldapserver'] = 'Geef een LDAP adresboek server op om te doorzoeken';
 $messages['nocontactsreturned'] = 'Er zijn geen contactpersonen gevonden';
 $messages['nosearchname'] = 'Geef de naam of e-mail op van de contactpersoon';
+$messages['notuploadedwarning'] = 'Nog niet alle bijlagen zijn geüpload. Wacht even of annuleer de upload.';
 $messages['searchsuccessful'] = '$nr berichten gevonden';
 $messages['searchnomatch'] = 'Zoekopdracht heeft geen resultaten opgeleverd';
 $messages['searching'] = 'Zoeken...';
 $messages['checking'] = 'Controleren...';
 $messages['nospellerrors'] = 'Geen spelfouten gevonden';
 $messages['folderdeleted'] = 'Map successvol verwijderd';
+$messages['foldersubscribed'] = 'Folder succesvol geabonneerd';
+$messages['folderunsubscribed'] = 'Folder succesvol uitgeschreven';
+$messages['folderpurged'] = 'Folder met succes verwijderd';
+$messages['folderexpunged'] = 'Folder succesvol geleegd';
 $messages['deletedsuccessfully'] = 'Successvol verwijderd';
 $messages['converting'] = 'Opmaak van bericht verwijderen...';
 $messages['messageopenerror'] = 'Kan het bericht niet van de server laden';
@@ -86,13 +97,17 @@ $messages['copyerror'] = 'Kan geen adressen kopiëren';
 $messages['sourceisreadonly'] = 'Het adres is alleen-lezen';
 $messages['errorsavingcontact'] = 'Kan het ontvanger-adres niet opslaan';
 $messages['movingmessage'] = 'Bericht verplaatsen...';
+$messages['copyingmessage'] = 'Kopiëren bericht...';
+$messages['deletingmessage'] = 'Verwijderen bericht(en)...';
+$messages['markingmessage'] = 'Markeren bericht(en)...';
 $messages['receiptsent'] = 'Ontvangstbevestiging is verstuurd';
 $messages['errorsendingreceipt'] = 'Kan de ontvangstbevestiging niet versturen';
 $messages['nodeletelastidentity'] = 'U kunt uw enige identiteit niet verwijderen';
-$messages['addsubfolderhint'] = 'Deze map zal worden aangemaakt onder de geselecteerde map';
 $messages['forbiddencharacter'] = 'De naam van de map bevat een karakter dat niet is toegestaan';
 $messages['selectimportfile'] = 'Selecteer een bestand om de uploaden';
 $messages['addresswriterror'] = 'Het geselecteerde adresboek is alleen lezen';
+$messages['contactaddedtogroup'] = 'Contact(en) met succes toegevoegd aan de groep';
+$messages['contactremovedfromgroup'] = 'Contact(en) met succes verwijderd aan de groep';
 $messages['importwait'] = 'Importeren, even geduld...';
 $messages['importerror'] = 'Importeren mislukt! Het verstuurde bestand is geen geldig vCard bestand.';
 $messages['importconfirm'] = '<b>Er zijn $inserted contactpersonen succesvol geïmporteerd, en $skipped bestaande overgeslagen</b>:<p><em>$names</em></p>';
@@ -102,9 +117,28 @@ $messages['editorwarning'] = 'Door het overschakelen naar de platte tekst editor
 $messages['httpreceivedencrypterror'] = 'Er is een fatale fout opgetreden. Neem direct contact op met uw systeembeheerder. <b>Uw bericht kon niet worden verzonden.</b>';
 $messages['smtpconnerror'] = 'SMTP Fout ($code): Verbinding met server mislukt';
 $messages['smtpautherror'] = 'SMTP Fout ($code): Autenticatie mislukt';
-$messages['smtpfromerror'] = 'SMTP Fout ($code): Kon afzender "$from" niet instellen';
-$messages['smtptoerror'] = 'SMTP Fout ($code): Kon ontvanger "$to" niet toevoegen';
+$messages['smtpfromerror'] = 'SMTP Fout ($code): Kon afzender "$from" niet instellen ($msg)';
+$messages['smtptoerror'] = 'SMTP Fout ($code): Kon ontvanger "$to" niet toevoegen ($msg)';
 $messages['smtprecipientserror'] = 'SMTP Fout: Kon lijst van ontvangers niet verwerken';
+$messages['smtpdsnerror'] = 'SMTP Fout: Delivery Status Notifications worden niet ondersteund';
 $messages['smtperror'] = 'SMTP Fout: $msg';
+$messages['emailformaterror'] = 'Ongeldig e-mailadres: $email';
+$messages['toomanyrecipients'] = 'Te veel geadresseerden. Verminder de hoeveelheid geadresseerden tot $max';
+$messages['maxgroupmembersreached'] = 'Het aantal leden van de groep groter is dan de maximale van $max';
+$messages['internalerror'] = 'Er is een interne fout opgetreden. Probeer het nogmaals';
+$messages['contactdelerror'] = 'Kon contact(en) niet verwijderen';
+$messages['contactdeleted'] = 'Contact(en) succesvol verwijderd';
+$messages['groupdeleted'] = 'Groep succesvol verwijderd';
+$messages['grouprenamed'] = 'Groep succesvol hernoemd';
+$messages['groupcreated'] = 'Groep succesvol aangemaakt';
+$messages['messagedeleted'] = 'Bericht(en) succesvol verwijderd';
+$messages['messagemoved'] = 'Bericht(en) succesvol verplaatst';
+$messages['messagecopied'] = 'Bericht(en) succesvol gekopieerd';
+$messages['messagemarked'] = 'Bericht(en) succesvol gemarkeerd';
+$messages['autocompletechars'] = 'Voer ten minste $min karakters in voor automatisch aanvullen';
+$messages['namecannotbeempty'] = 'Naam kan niet leeg zijn';
+$messages['nametoolong'] = 'Naam is te lang';
+$messages['folderupdated'] = 'Map succesvol bijgewerkt';
+$messages['foldercreated'] = 'Map succesvol aangemaakt';
 
 ?>
index 482ce2dec164b88ce8f1eedf435f6d4f16eea125..22039134efcedc31a6b72c96f9791c3b79cbb16a 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/nn_NO/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 | Update: Odin Omdal Hørthe <odin.omdal@gmail.com>                      |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2513 2009-05-21 12:59:19Z alec $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -46,14 +46,14 @@ $labels['organization'] = 'Organisasjon';
 $labels['reply-to'] = 'Svar-til';
 $labels['mailboxlist'] = 'Katalogar';
 $labels['messagesfromto'] = 'Meldingar $from til $to av $count';
+$labels['threadsfromto'] = 'Trådar $from til $to ($count stk)';
 $labels['messagenrof'] = 'Melding $nr av $count';
+$labels['copy'] = 'Kopier';
+$labels['move'] = 'Flytt';
 $labels['moveto'] = 'flytt til...';
 $labels['download'] = 'last ned';
 $labels['filename'] = 'Filnamn';
 $labels['filesize'] = 'Filstorleik';
-$labels['preferhtml'] = 'Føretrekk HTML';
-$labels['htmlmessage'] = 'HTML-melding';
-$labels['prettydate'] = 'Pene datoar';
 $labels['addtoaddressbook'] = 'Legg til i adressebok';
 $labels['sun'] = 'Sun';
 $labels['mon'] = 'Mån';
@@ -117,10 +117,38 @@ $labels['markread'] = 'Som lese';
 $labels['markunread'] = 'Som ulese';
 $labels['markflagged'] = 'Som flagga';
 $labels['markunflagged'] = 'Som uflagga';
+$labels['messageactions'] = 'Fleire handlingar...';
 $labels['select'] = 'Vel';
 $labels['all'] = 'Alle';
 $labels['none'] = 'Ingen';
+$labels['currpage'] = 'Gjeldande side';
 $labels['unread'] = 'Uleste';
+$labels['flagged'] = 'Flagga';
+$labels['unanswered'] = 'Ikkje svara';
+$labels['deleted'] = 'Sletta';
+$labels['invert'] = 'Inverter';
+$labels['filter'] = 'Filtrer';
+$labels['list'] = 'List opp';
+$labels['threads'] = 'Trådar';
+$labels['expand-all'] = 'Utvid alle';
+$labels['expand-unread'] = 'Utvid ulesne';
+$labels['collapse-all'] = 'Slå saman alle';
+$labels['threaded'] = 'Tråda';
+$labels['autoexpand_threads'] = 'Utvid eposttråder';
+$labels['do_expand'] = 'alle tråder';
+$labels['expand_only_unread'] = 'berre med ulesne epostar';
+$labels['fromto'] = 'Sendar/Mottakar';
+$labels['flag'] = 'Flagg';
+$labels['attachment'] = 'Vedlegg';
+$labels['nonesort'] = 'Ingen';
+$labels['sentdate'] = 'Sendtdato';
+$labels['arrival'] = 'Mottaksdato';
+$labels['asc'] = 'Alfabetisk';
+$labels['desc'] = 'Motsatt alfabetisk';
+$labels['listcolumns'] = 'Vis kolonner';
+$labels['listsorting'] = 'Sorteringskolonne';
+$labels['listorder'] = 'Sorteringsveg';
+$labels['listmode'] = 'Listevisningmodus';
 $labels['compact'] = 'Kompakt';
 $labels['empty'] = 'Tom';
 $labels['purge'] = 'Reinska opp';
@@ -129,8 +157,12 @@ $labels['unknown'] = 'ukjend';
 $labels['unlimited'] = 'ubegrensa';
 $labels['quicksearch'] = 'Snøggsøk';
 $labels['resetsearch'] = 'Tilbakestill søk';
+$labels['searchmod'] = 'Søkeutsagn';
+$labels['msgtext'] = 'Heile eposten';
 $labels['openinextwin'] = 'Opna i nytt vindauga';
+$labels['emlsave'] = 'Last ned (.eml)';
 $labels['compose'] = 'Skriv ei melding';
+$labels['editasnew'] = 'Rediger som ny';
 $labels['savemessage'] = 'Lagra kladd';
 $labels['sendmessage'] = 'Send meldinga no';
 $labels['addattachment'] = 'Legg ved ei fil';
@@ -180,10 +212,13 @@ $labels['contactsfromto'] = 'Kontaktar $from til $to av $count';
 $labels['print'] = 'Skriv ut';
 $labels['export'] = 'Eksport';
 $labels['exportvcards'] = 'Eksporter kontaktar i vCard-format';
+$labels['newcontactgroup'] = 'Lag ny kontaktgruppe';
+$labels['groupactions'] = 'Handlingar for kontaktgruppar...';
 $labels['previouspage'] = 'Førre side';
 $labels['firstpage'] = 'Fyrste side';
 $labels['nextpage'] = 'Neste side';
 $labels['lastpage'] = 'Siste side';
+$labels['group'] = 'Gruppe';
 $labels['groups'] = 'Gruppar';
 $labels['personaladrbook'] = 'Personlege adresser';
 $labels['import'] = 'Importer';
@@ -201,6 +236,10 @@ $labels['manageidentities'] = 'Administrere identitetar for denne kontoen';
 $labels['newidentity'] = 'Ny identitet';
 $labels['newitem'] = 'Nytt element';
 $labels['edititem'] = 'Redigere element';
+$labels['preferhtml'] = 'Føretrekk HTML';
+$labels['defaultcharset'] = 'Standard karaktersett (charset)';
+$labels['htmlmessage'] = 'HTML-melding';
+$labels['prettydate'] = 'Pene datoar';
 $labels['setdefault'] = 'Set som standard';
 $labels['autodetect'] = 'Automatisk';
 $labels['language'] = 'Språk';
@@ -223,11 +262,47 @@ $labels['autosend'] = 'send automatisk';
 $labels['ignore'] = 'ignorer';
 $labels['readwhendeleted'] = 'Marker melding som lese ved sletting';
 $labels['flagfordeletion'] = 'Flagg meldinga for sletting i staden for å sletta';
+$labels['skipdeleted'] = 'Ikkje vis sletta epostar';
+$labels['deletealways'] = 'Slett epostar som ikkje kan flyttast til søppelkorga';
+$labels['showremoteimages'] = 'Vis eksterne bilete';
+$labels['fromknownsenders'] = 'frå kjende sendarar';
+$labels['always'] = 'alltid';
 $labels['showinlineimages'] = 'Vis vedlagte bilete under meldinga';
 $labels['autosavedraft'] = 'Lagra kladd automatisk';
+$labels['everynminutes'] = 'kvart $n minutt';
+$labels['keepalive'] = 'Sjekk etter ny epost';
 $labels['never'] = 'aldri';
+$labels['immediately'] = 'med ein gong';
 $labels['messagesdisplaying'] = 'Meldingar som viser';
 $labels['messagescomposition'] = 'Meldingar sin komposisjon';
+$labels['mimeparamfolding'] = 'Vedleggsnamn';
+$labels['2231folding'] = 'Full RFC 2231 (Thunderbird)';
+$labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
+$labels['2047folding'] = 'Full RFC 2047 (other)';
+$labels['force7bit'] = 'Bruk MIME-enkoding for 8-bit characterer (æøå og slik)';
+$labels['advancedoptions'] = 'Avanserte val';
+$labels['focusonnewmessage'] = 'Fokuser nettlesarvindauge på ny epost';
+$labels['checkallfolders'] = 'Sjekk alle mappar for nye epostar';
+$labels['displaynext'] = 'Etter sletting/flytting, vis neste epost';
+$labels['mainoptions'] = 'Hovudinnstillingar';
+$labels['section'] = 'Seksjon';
+$labels['maintenance'] = 'Vedlikehald';
+$labels['newmessage'] = 'Ny epost';
+$labels['listoptions'] = 'Liste-innstillingar';
+$labels['signatureoptions'] = 'Signatur-innstillingar';
+$labels['whenreplying'] = 'Når du svarar';
+$labels['replytopposting'] = 'start ny epost oppante originalen';
+$labels['replybottomposting'] = 'start ny epost nedanfor originalen';
+$labels['replyremovesignature'] = 'Fjern den original signatur frå eposten når du svarar';
+$labels['autoaddsignature'] = 'Legg signatur til automatisk';
+$labels['newmessageonly'] = 'berre på nye epostar';
+$labels['replyandforwardonly'] = 'berre på svar og vidaresending';
+$labels['replysignaturepos'] = 'Når du svarar eller sender vidare, plasser signaturen';
+$labels['belowquote'] = 'nedanfor siteringa';
+$labels['abovequote'] = 'oppanfor siteringa';
+$labels['insertsignature'] = 'Sett inn signatur';
+$labels['previewpanemarkread'] = 'Merk forehandsviste epostar som leste';
+$labels['afternseconds'] = 'etter $n sekund';
 $labels['folder'] = 'Mappe';
 $labels['folders'] = 'Mapper';
 $labels['foldername'] = 'Mappenamn';
@@ -235,13 +310,32 @@ $labels['subscribed'] = 'Abonnert';
 $labels['messagecount'] = 'Meldingar';
 $labels['create'] = 'Opprette';
 $labels['createfolder'] = 'Opprett ny mappe';
-$labels['rename'] = 'Gje nytt namn';
-$labels['renamefolder'] = 'Gje nytt namn til mappe';
-$labels['deletefolder'] = 'Slett mappe';
 $labels['managefolders'] = 'Mappehandsaming';
 $labels['specialfolders'] = 'Spesialmapper';
 $labels['sortby'] = 'Sorter etter';
 $labels['sortasc'] = 'Sorter stigande';
 $labels['sortdesc'] = 'Sorter søkkjande';
+$labels['B'] = 'B';
+$labels['KB'] = 'KB';
+$labels['MB'] = 'MB';
+$labels['GB'] = 'GB';
+$labels['unicode'] = 'UNicode';
+$labels['english'] = 'Engelsk';
+$labels['westerneuropean'] = 'Vest-europesik';
+$labels['easterneuropean'] = 'Aust-europesik';
+$labels['southeasterneuropean'] = 'Sør-aust-europeisk';
+$labels['baltic'] = 'Baltisk';
+$labels['cyrillic'] = 'Kyrilisk';
+$labels['arabic'] = 'Arabisk';
+$labels['greek'] = 'Gresk';
+$labels['hebrew'] = 'Hebraisk';
+$labels['turkish'] = 'Tyrkisk';
+$labels['nordic'] = 'Nordisk';
+$labels['thai'] = 'Thai';
+$labels['celtic'] = 'Keltisk';
+$labels['vietnamese'] = 'Vietnamesisk';
+$labels['japanese'] = 'Japansk';
+$labels['korean'] = 'Koreansk';
+$labels['chinese'] = 'Kinesisk';
 
 ?>
index e50844c93ad0d22d1ca422409cbfc963cb31be15..5c92038bb29bc3f432f85bfb5c2faaa3aa9b4038 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/nn_NO/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 | Update: Odin Omdal Hørthe <odin.omdal@gmail.com>                      |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2237 2009-01-17 01:55:39Z till $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -23,10 +23,13 @@ $messages['loginfailed'] = 'Feil ved innlogging';
 $messages['cookiesdisabled'] = 'Nettlesaren din tillet ikkje informasjonskapslar (cookies)';
 $messages['sessionerror'] = 'Sesjonen din er ulovleg eller har gått ut på tid';
 $messages['imaperror'] = 'Feil ved tilkopling til IMAP-tenar';
+$messages['servererror'] = 'Tenarfeil!';
+$messages['invalidrequest'] = 'Eg forstår ingen ting! Ingen data lagra.';
 $messages['nomessagesfound'] = 'Ingen meldingar i denne postkassa';
 $messages['loggedout'] = 'Du har avslutta sesjonen. Ha det bra!';
 $messages['mailboxempty'] = 'Postkassa er tom';
 $messages['loading'] = 'Lastar...';
+$messages['uploading'] = 'Lastar opp fil...';
 $messages['loadingdata'] = 'Lastar inn data...';
 $messages['checkingmail'] = 'Ser etter nye meldingar...';
 $messages['sendingmessage'] = 'Sender melding...';
@@ -45,15 +48,20 @@ $messages['senttooquickly'] = 'Du må venta $sec sekund for å senda meldinga';
 $messages['errorsavingsent'] = 'Klarte ikkje lagra den sende meldinga';
 $messages['errorsaving'] = 'Det skjedde ein feil ved lagring';
 $messages['errormoving'] = 'Kunne ikkje flytte meldinga';
+$messages['errorcopying'] = 'Kan ikkje kopiera epost';
 $messages['errordeleting'] = 'Kunne ikkje slette meldinga';
+$messages['errormarking'] = 'Kan ikkje markera epost';
 $messages['deletecontactconfirm'] = 'Sletta kontakt(ar)?';
 $messages['deletemessagesconfirm'] = 'Sletta melding(ar)?';
 $messages['deletefolderconfirm'] = 'Sletta mappa?';
 $messages['purgefolderconfirm'] = 'Sletta alle meldingane i denne mappa?';
+$messages['folderdeleting'] = 'Slettar mappe...';
+$messages['foldermoving'] = 'Flyttar mappe...';
 $messages['formincomplete'] = 'Fyll ut skjema';
 $messages['noemailwarning'] = 'Skriv inn korrekt epostadresse';
 $messages['nonamewarning'] = 'Skriv inn namn';
 $messages['nopagesizewarning'] = 'Skriv inn sidestorleik';
+$messages['nosenderwarning'] = 'Skriv inn avsendar si e-postadresse';
 $messages['norecipientwarning'] = 'Skriv inn minst ein mottakar';
 $messages['nosubjectwarning'] = 'Emnefeltet er tomt. Vil du skriva inn eitt emne no?';
 $messages['nobodywarning'] = 'Senda melding utan tekst?';
@@ -61,6 +69,7 @@ $messages['notsentwarning'] = 'Meldinga er ikkje sendt. Vil du kasta ho?';
 $messages['noldapserver'] = 'Vel LDAP-tenar å søkja i';
 $messages['nocontactsreturned'] = 'Fann ingen kontaktar';
 $messages['nosearchname'] = 'Skriv inn kontaktnamn eller epostadressa';
+$messages['notuploadedwarning'] = 'Ikkje alle vedlegga er lasta opp. Vent eller avslutt opplastinga.';
 $messages['searchsuccessful'] = 'Fann $nr meldingar';
 $messages['searchnomatch'] = 'Søket fann ingenting';
 $messages['searching'] = 'Søkjer...';
@@ -77,16 +86,30 @@ $messages['copyerror'] = 'Kunne ikkje kopiera adresser';
 $messages['sourceisreadonly'] = 'Denne adressekjelda er berre lesbar';
 $messages['errorsavingcontact'] = 'Kunne ikkje lagra kontaktadressa';
 $messages['movingmessage'] = 'Flyttar melding...';
+$messages['copyingmessage'] = 'Kopierer epost...';
 $messages['receiptsent'] = 'Sende melding-er-lest-kvittering';
 $messages['errorsendingreceipt'] = 'Kunne ikkje senda melding-er-lest-kvittering';
 $messages['nodeletelastidentity'] = 'Du kan ikkje sletta denne identiteten, det er den siste.';
-$messages['addsubfolderhint'] = 'Denne mappa vert laga som ei undermappe til den du hev markert';
 $messages['forbiddencharacter'] = 'Mappenamn inneheld eit teikn som ikkje er støtta';
 $messages['selectimportfile'] = 'Vel ei fil til å lasta opp';
 $messages['addresswriterror'] = 'Denne adresseboka er ikkje skrivbar';
+$messages['contactaddedtogroup'] = 'La til kontaktane til denne gruppa';
+$messages['contactremovedfromgroup'] = 'Tok vekk kontaktane frå denne gruppa';
 $messages['importwait'] = 'Importerer, vent...';
 $messages['importerror'] = 'Importering feila! Fila er ikkje ei korrekt vCard-file.';
 $messages['importconfirm'] = '<b>Importerte $inserted kontakar, hoppa over $skipped oppføringar</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Ulovleg operasjon.';
+$messages['nofromaddress'] = 'Manglar epostadresse i denne identiteten';
+$messages['editorwarning'] = 'Du mistar all formatering når du bytar til rein tekst. Er det greit?';
+$messages['httpreceivedencrypterror'] = 'Noko er totalt feilkonfigurert, send ein sint epost til administrator. No. <b>Meldinga di kunne ikkje bli sendt.</b>';
+$messages['smtpconnerror'] = 'SMTP-feil ($code): Tilkopling til tenar feila';
+$messages['smtpautherror'] = 'SMTP-feil ($code): Autentisering feila';
+$messages['smtpfromerror'] = 'SMTP-feil ($code): Feila å setja sendar «$from» ($msg)';
+$messages['smtptoerror'] = 'SMTP-feil ($code): Feila å leggja til mottakar «$to» ($msg)';
+$messages['smtprecipientserror'] = 'SMTP-feil: Eg forstår ikkje mottakarlista (sjå over han...)';
+$messages['smtperror'] = 'SMTP-feil: $msg';
+$messages['emailformaterror'] = 'Ukorrekt e-postadresse: $email';
+$messages['toomanyrecipients'] = 'For mange mottakarar. Senk talet til maksimalt $max.';
+$messages['maxgroupmembersreached'] = 'Du kan berre ha $max grupper, du er over grensa søta.';
 
 ?>
index 886cc730c9f75c36db4ec26677568a7109168a18..d6ab97b7ca5519a46a3b1aabc5a732acf055556f 100644 (file)
@@ -2,23 +2,23 @@
 
 /*
 
- +-----------------------------------------------------------------------+
- | language/pl_PL/labels.inc                                             |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Tomasz Pajor        <t.pajor@kei.pl>                          |
- |         Sławomir Cichoń     <slawek.cichon@gmail.com>                 |
- |         Janusz Zamecki      <janusz@zamecki.eu>                       |
- |         Mariusz Szulerecki  <nob@force.eu.org>                        |
- |         Wojciech Szczepucha <donkoyote@gmail.com>                     |
- |         Aleksander Machniak <alec@alec.pl>                            |
- +-----------------------------------------------------------------------+
++-----------------------------------------------------------------------+
+| language/pl_PL/labels.inc                                             |
+|                                                                       |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Tomasz Pajor        <t.pajor@kei.pl>                          |
+|         Sławomir Cichoń     <slawek.cichon@gmail.com>                 |
+|         Janusz Zamecki      <janusz@zamecki.eu>                       |
+|         Mariusz Szulerecki  <nob@force.eu.org>                        |
+|         Wojciech Szczepucha <donkoyote@gmail.com>                     |
+|         Aleksander Machniak <alec@alec.pl>                            |
++-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 1404 2008-05-19 08:12:54Z alec $
+@version $Id: labels.inc 4362 2010-12-22 18:45:15Z alec $
 
 */
 
@@ -42,29 +42,23 @@ $labels['from'] = 'Nadawca';
 $labels['to'] = 'Odbiorca';
 $labels['cc'] = 'Kopia';
 $labels['bcc'] = 'Ukryta kopia';
-$labels['replyto'] = 'Odp. do';
+$labels['replyto'] = 'Odpowiedź do';
 $labels['date'] = 'Data';
 $labels['size'] = 'Rozmiar';
+$labels['readstatus'] = 'Przeczytano';
 $labels['priority'] = 'Priorytet';
 $labels['organization'] = 'Organizacja';
-$labels['reply-to'] = 'Odpowiedz do';
 $labels['mailboxlist'] = 'Foldery';
 $labels['messagesfromto'] = 'Wiadomości od $from do $to z $count';
+$labels['threadsfromto'] = 'Wątki od $from do $to z $count';
 $labels['messagenrof'] = 'Wiadomość $nr z $count';
+$labels['copy'] = 'Kopiuj';
+$labels['move'] = 'Przenieś';
 $labels['moveto'] = 'Przenieś do...';
 $labels['download'] = 'Pobierz';
 $labels['filename'] = 'Nazwa pliku';
 $labels['filesize'] = 'Rozmiar pliku';
-$labels['preferhtml'] = 'Domyślny HTML';
-$labels['htmlmessage'] = 'Wiadomość HTML';
-$labels['showremoteimages'] = 'Wyświetlaj obrazki w wiadomościach';
-$labels['fromknownsenders'] = 'od znanych nadawców';
-$labels['always'] = 'zawsze';
-$labels['prettydate'] = 'Ładne daty';
-$labels['showinlineimages'] = 'Wyświetlaj załączone obrazki pod treścią wiadomości';
-$labels['messagesdisplaying'] = 'Wyświetlanie wiadomości';
-$labels['messagescomposition'] = 'Tworzenie wiadomości';
-$labels['addtoaddressbook'] = 'Dodaj do książki adresowej ';
+$labels['addtoaddressbook'] = 'Dodaj do książki adresowej';
 $labels['sun'] = 'Nd';
 $labels['mon'] = 'Pn';
 $labels['tue'] = 'Wt';
@@ -130,23 +124,44 @@ $labels['markunflagged'] = 'Jako nieoflagowane';
 $labels['messageactions'] = 'Więcej akcji...';
 $labels['select'] = 'Zaznacz';
 $labels['all'] = 'Wszystkie';
-$labels['none'] = 'Anuluj';
+$labels['none'] = 'Brak';
+$labels['currpage'] = 'Bieżąca strona';
 $labels['unread'] = 'Nieprzeczytane';
 $labels['flagged'] = 'Oznaczone';
 $labels['unanswered'] = 'Bez odpowiedzi';
 $labels['deleted'] = 'Usunięte';
 $labels['invert'] = 'Odwróć';
 $labels['filter'] = 'Filtr';
+$labels['list'] = 'Lista';
+$labels['threads'] = 'Wątki';
+$labels['expand-all'] = 'Rozwiń wszystkie';
+$labels['expand-unread'] = 'Rozwiń nieprzeczytane';
+$labels['collapse-all'] = 'Zwiń wszystkie';
+$labels['threaded'] = 'Powątkowane';
+$labels['autoexpand_threads'] = 'Rozwijaj wątki';
+$labels['do_expand'] = 'wszystkie';
+$labels['expand_only_unread'] = 'tylko nieprzeczytane';
+$labels['fromto'] = 'Nadawca/Odbiorca';
+$labels['flag'] = 'Flaga';
+$labels['attachment'] = 'Załącznik';
+$labels['nonesort'] = 'Brak';
+$labels['sentdate'] = 'Data wysyłki';
+$labels['arrival'] = 'Data odbioru';
+$labels['asc'] = 'rosnąco';
+$labels['desc'] = 'malejąco';
+$labels['listcolumns'] = 'Kolumny';
+$labels['listsorting'] = 'Porządek sortowania';
+$labels['listorder'] = 'Kierunek sortowania';
+$labels['listmode'] = 'Typ listy';
 $labels['compact'] = 'Porządkuj';
 $labels['empty'] = 'Opróżnij';
-$labels['purge'] = 'Oczyść';
 $labels['quota'] = 'Użyte miejsce';
 $labels['unknown'] = 'nieznane';
 $labels['unlimited'] = 'bez limitu';
 $labels['quicksearch'] = 'Szybkie wyszukiwanie';
 $labels['resetsearch'] = 'Wyczyść filtr';
-$labels['searchmod']  = 'Parametry wyszukiwania';
-$labels['msgtext']  = 'Cała wiadomość';
+$labels['searchmod'] = 'Parametry wyszukiwania';
+$labels['msgtext'] = 'Cała wiadomość';
 $labels['openinextwin'] = 'Otwórz w nowym oknie';
 $labels['emlsave'] = 'Pobierz (.eml)';
 $labels['compose'] = 'Utwórz wiadomość';
@@ -170,11 +185,12 @@ $labels['high'] = 'Wysoki';
 $labels['highest'] = 'Bardzo wysoki';
 $labels['nosubject'] = '(brak tematu)';
 $labels['showimages'] = 'Wyświetl obrazki';
-$labels['alwaysshow'] = 'Zawsze wyświetlaj obrazki od $sender'; 
+$labels['alwaysshow'] = 'Zawsze wyświetlaj obrazki od $sender';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Zwykły tekst';
-$labels['savesentmessagein'] = 'Zapisz wiadomość w'; 
+$labels['savesentmessagein'] = 'Zapisz wiadomość w';
 $labels['dontsave'] = 'nie zapisuj';
+$labels['maxuploadsize'] = 'Maksymalny rozmiar pliku to $size';
 $labels['addcc'] = 'Dodaj Cc';
 $labels['addbcc'] = 'Dodaj Bcc';
 $labels['addreplyto'] = 'Dodaj Reply-To';
@@ -198,12 +214,22 @@ $labels['composeto'] = 'Utwórz wiadomość dla wybranych kontaktów';
 $labels['contactsfromto'] = 'Kontakty od $from do $to z $count';
 $labels['print'] = 'Drukuj';
 $labels['export'] = 'Eksportuj';
+$labels['exportvcards'] = 'Eksport kontaktów w formacie vCard';
+$labels['newcontactgroup'] = 'Utwórz nową grupę';
+$labels['groupactions'] = 'Działania na grupach...';
 $labels['previouspage'] = 'poprzednia strona';
 $labels['firstpage'] = 'pierwsza strona';
 $labels['nextpage'] = 'następna strona';
 $labels['lastpage'] = 'ostatnia strona';
+$labels['group'] = 'Grupa';
 $labels['groups'] = 'Grupy';
-$labels['personaladrbook'] = 'Książka adresowa';
+$labels['personaladrbook'] = 'Kontakty osobiste';
+$labels['import'] = 'Importuj';
+$labels['importcontacts'] = 'Import kontaktów';
+$labels['importfromfile'] = 'Import z pliku:';
+$labels['importreplace'] = 'Zastąp całą książkę adresową';
+$labels['importtext'] = 'Możesz dodać kontakty z istniejącej książki adresowej.<br/>Aktualnie możliwy jest import kontaktów w formacie <a href="http://en.wikipedia.org/wiki/VCard">vCard</a>.';
+$labels['done'] = 'Wykonane';
 $labels['settingsfor'] = 'Ustawienia dla';
 $labels['preferences'] = 'Preferencje';
 $labels['userpreferences'] = 'Preferencje użytkownika';
@@ -213,13 +239,19 @@ $labels['manageidentities'] = 'Zarządzaj tożsamościami';
 $labels['newidentity'] = 'Nowa tożsamość';
 $labels['newitem'] = 'Nowy';
 $labels['edititem'] = 'Edytuj';
+$labels['preferhtml'] = 'Domyślny HTML';
+$labels['defaultcharset'] = 'Domyślny zestaw znaków';
+$labels['htmlmessage'] = 'Wiadomość HTML';
+$labels['prettydate'] = 'Ładne daty';
 $labels['setdefault'] = 'Domyślna';
+$labels['autodetect'] = '- wybór automatyczny -';
 $labels['language'] = 'Język';
 $labels['timezone'] = 'Strefa czasowa';
 $labels['pagesize'] = 'Liczba wierszy na stronie';
 $labels['signature'] = 'Podpis';
 $labels['dstactive'] = 'Czas letni';
 $labels['htmleditor'] = 'Twórz wiadomości HTML';
+$labels['htmlonreply'] = 'tylko w odpowiedzi na wiadomość HTML';
 $labels['htmlsignature'] = 'Podpis w HTML';
 $labels['previewpane'] = 'Pokaż podgląd wiadomości';
 $labels['skin'] = 'Wygląd interfejsu';
@@ -228,25 +260,56 @@ $labels['logoutcompact'] = 'Przy wylogowaniu porządkuj folder Odebrane';
 $labels['uisettings'] = 'Interfejs użytkownika';
 $labels['serversettings'] = 'Ustawienia serwera';
 $labels['mailboxview'] = 'Widok skrzynki pocztowej';
-$labels['mdnrequests'] = 'Potwierdzenia odbioru';
-$labels['askuser'] = 'pytaj';
-$labels['autosend'] = 'wyślij automatycznie';
+$labels['mdnrequests'] = 'Na żadanie potwierdzenia odbioru';
+$labels['askuser'] = 'pytaj mnie';
+$labels['autosend'] = 'wyślij potwierdzenie';
+$labels['autosendknown'] = 'wyślij potwierdzenie tylko do moich kontaktów, pytaj o pozostałe';
+$labels['autosendknownignore'] = 'wyślij potwierdzenie tylko do moich kontaktów, pozostałe ignoruj';
 $labels['ignore'] = 'ignoruj';
-$labels['mimeparamfolding'] = 'Nazwy załączników';
-$labels['2231folding'] = 'zgodne z RFC 2231 (Thunderbird)';
-$labels['miscfolding'] = 'zgodne z RFC 2047/2231 (MS Outlook)';
-$labels['2047folding'] = 'zgodne z RFC 2047 (inne)';
-$labels['advancedoptions'] = 'opcje zaawansowane';
 $labels['readwhendeleted'] = 'Podczas usuwania oznacz wiadomość jako przeczytaną';
 $labels['flagfordeletion'] = 'Oznacz wiadomość do usunięcia zamiast ją usuwać';
 $labels['skipdeleted'] = 'Ukryj wiadomości oznaczone do usunięcia';
-$labels['autosavedraft'] = 'Automatyczny zapis tworzonej wiadomości';
-$labels['indexsort'] = 'Stosuj indeks wiadomości do sortowania wg daty';
-$labels['keepalive']  = 'Sprawdzaj czy nadeszły nowe wiadomości';
-$labels['everynminutes']  = 'co $n minut(y)';
+$labels['deletealways'] = 'Usuń wiadomości, gdy przenoszenie do Kosza zawiedzie';
+$labels['showremoteimages'] = 'Wyświetlaj obrazki w wiadomościach';
+$labels['fromknownsenders'] = 'od znanych nadawców';
+$labels['always'] = 'zawsze';
+$labels['showinlineimages'] = 'Wyświetlaj załączone obrazki pod treścią wiadomości';
+$labels['autosavedraft'] = 'Automatycznie zapisuj tworzoną wiadomość';
+$labels['everynminutes'] = 'co $n minut(y)';
+$labels['keepalive'] = 'Sprawdzaj czy nadeszły nowe wiadomości';
 $labels['never'] = 'nigdy';
+$labels['immediately'] = 'natychmiast';
+$labels['messagesdisplaying'] = 'Wyświetlanie wiadomości';
+$labels['messagescomposition'] = 'Tworzenie wiadomości';
+$labels['mimeparamfolding'] = 'Stosuj nazwy załączników zgodne z';
+$labels['2231folding'] = 'RFC 2231 (Thunderbird)';
+$labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
+$labels['2047folding'] = 'RFC 2047 (przestarzałe)';
+$labels['force7bit'] = 'Używaj kodowania MIME dla znaków 8-bitowych';
+$labels['reqmdn'] = 'Zawsze żądaj potwierdzenia odbioru';
+$labels['advancedoptions'] = 'opcje zaawansowane';
 $labels['focusonnewmessage'] = 'Informuj przeglądarkę o nowej wiadomości';
+$labels['checkallfolders'] = 'Sprawdzaj czy nadeszły nowe wiadomości we wszystkich folderach';
 $labels['displaynext'] = 'Po usunięciu/przeniesieniu wiadomości wyświetl następną';
+$labels['mainoptions'] = 'Opcje główne';
+$labels['section'] = 'Sekcja';
+$labels['maintenance'] = 'Konserwacja';
+$labels['newmessage'] = 'Nowa wiadomość';
+$labels['listoptions'] = 'Opcje list';
+$labels['signatureoptions'] = 'Opcje podpisów';
+$labels['whenreplying'] = 'Podczas odpowiadania rozpocznij wiadomość';
+$labels['replytopposting'] = 'powyżej cytowanej treści';
+$labels['replybottomposting'] = 'poniżej cytowanej treści';
+$labels['replyremovesignature'] = 'Podczas odpowiedzi usuń podpis z cytowanej treści';
+$labels['autoaddsignature'] = 'Automatycznie wstaw podpis';
+$labels['newmessageonly'] = 'tylko dla nowych wiadomości';
+$labels['replyandforwardonly'] = 'tylko dla przekazywania i odpowiedzi';
+$labels['replysignaturepos'] = 'Podczas odpowiedzi wstaw podpis';
+$labels['belowquote'] = 'poniżej cytowanej treści';
+$labels['abovequote'] = 'ponad cytowaną treścią';
+$labels['insertsignature'] = 'Wstaw podpis';
+$labels['previewpanemarkread'] = 'Oznacz podglądane wiadomości jako przeczytane';
+$labels['afternseconds'] = 'po $n sekundach';
 $labels['folder'] = 'Folder';
 $labels['folders'] = 'Foldery';
 $labels['foldername'] = 'Nazwa folderu';
@@ -254,32 +317,52 @@ $labels['subscribed'] = 'Zasubskrybowany';
 $labels['messagecount'] = 'Wiadomości';
 $labels['create'] = 'Utwórz';
 $labels['createfolder'] = 'Utwórz nowy folder';
-$labels['rename'] = 'Zmień nazwę';
-$labels['renamefolder'] = 'Zmień nazwę folderu';
-$labels['deletefolder'] = 'Usuń folder';
 $labels['managefolders'] = 'Zarządzaj folderami';
 $labels['specialfolders'] = 'Foldery specjalne';
 $labels['sortby'] = 'Sortuj wg';
 $labels['sortasc'] = 'Rosnąco';
 $labels['sortdesc'] = 'Malejąco';
-$labels['import'] = 'Importuj'; 
-$labels['importcontacts'] = 'Import kontaktów'; 
-$labels['importfromfile'] = 'Import z pliku:'; 
-$labels['importreplace'] = 'Zastąp całą książkę adresową'; 
-$labels['importtext'] = 'Możesz dodać kontakty z istniejącej książki adresowej.<br/>Aktualnie możliwy jest import kontaktów w formacie <a href="http://en.wikipedia.org/wiki/VCard">vCard</a>.'; 
-$labels['done'] = 'Wykonane';
-$labels['autodetect'] = '- wybór automatyczny -';
-$labels['maxuploadsize'] = 'Maksymalny rozmiar pliku to $size';
-$labels['exportvcards'] = 'Eksport kontaktów w formacie vCard';
 $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
-$labels['checkallfolders'] = 'Sprawdzaj czy nadeszły nowe wiadomości we wszystkich folderach';
-$labels['mainoptions'] = 'Opcje główne';
-$labels['section'] = 'Sekcja';
-$labels['maintenance'] = 'Konserwacja';
-$labels['newmessage'] = 'Nowa wiadomość';
-$labels['listoptions'] = 'Opcje list';
+$labels['unicode'] = 'uniwersalny';
+$labels['english'] = 'angielski';
+$labels['westerneuropean'] = 'zachodnioeuropejski';
+$labels['easterneuropean'] = 'wschodnioeuropejski';
+$labels['southeasterneuropean'] = 'południowo-wschodnioeuropejski';
+$labels['baltic'] = 'bałtycki';
+$labels['cyrillic'] = 'cyrylica';
+$labels['arabic'] = 'arabski';
+$labels['greek'] = 'grecki';
+$labels['hebrew'] = 'hebrajski';
+$labels['turkish'] = 'turecki';
+$labels['nordic'] = 'nordycki';
+$labels['thai'] = 'tajski';
+$labels['celtic'] = 'celtycki';
+$labels['vietnamese'] = 'wietnamski';
+$labels['japanese'] = 'japoński';
+$labels['korean'] = 'koreański';
+$labels['chinese'] = 'chiński';
+$labels['folderactions'] = 'Działania na folderach...';
+$labels['contacts'] = 'Kontakty';
+$labels['messageoptions'] = 'Opcje wiadomości...';
+$labels['followupto'] = 'Kontynuacja do';
+$labels['replyall'] = 'Odpowiedz wszystkim';
+$labels['replylist'] = 'Odpowiedz na listę';
+$labels['editidents'] = 'Edytuj tożsamości';
+$labels['addfollowupto'] = 'Dodaj Followup-To';
+$labels['dsn'] = 'Status dostarczenia (DSN)';
+$labels['reqdsn'] = 'Zawsze żądaj statusu dostarczenia (DSN)';
+$labels['replysamefolder'] = 'Umieszczaj odpowiedzi w folderze wiadomości, na którą odpowiadam';
+$labels['contactproperties'] = 'Właściwości';
+$labels['properties'] = 'Właściwości';
+$labels['folderproperties'] = 'Włąściwości folderu';
+$labels['parentfolder'] = 'Folder nadrzędny';
+$labels['location'] = 'Położenie';
+$labels['info'] = 'Informacje';
+$labels['getfoldersize'] = 'Kliknij aby pobrać rozmiar folderu';
+$labels['changesubscription'] = 'Kliknij aby zmienić subskrypcję';
+$labels['rename'] = 'Zmień nazwę';
 
 ?>
index 1fc76598292b0187344158e98509ddeedfedbbe1..a2bcbb237cc9a33ec256e81d8ad9174deba3686a 100644 (file)
@@ -2,23 +2,23 @@
 
 /*
 
- +-----------------------------------------------------------------------+
- | language/pl_PL/messages.inc                                           |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Tomasz Pajor        <t.pajor@kei.pl>                          |
- | Author: Sławomir Cichoń     <slawek.cichon@gmail.com>                 |
- |         Janusz Zamecki      <janusz@zamecki.eu>                       |
- |         Mariusz Szulerecki  <nob@force.eu.org>                        |
- |         Wojciech Szczepucha <donkoyote@gmail.com>                     |
- |         Aleksander Machniak <alec@alec.pl>                            |
- +-----------------------------------------------------------------------+
++-----------------------------------------------------------------------+
+| language/pl_PL/messages.inc                                           |
+|                                                                       |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Tomasz Pajor        <t.pajor@kei.pl>                          |
+| Author: Sławomir Cichoń     <slawek.cichon@gmail.com>                 |
+|         Janusz Zamecki      <janusz@zamecki.eu>                       |
+|         Mariusz Szulerecki  <nob@force.eu.org>                        |
+|         Wojciech Szczepucha <donkoyote@gmail.com>                     |
+|         Aleksander Machniak <alec@alec.pl>                            |
++-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 1245 2008-04-03 13:17:34Z alec $
+@version $Id: messages.inc 4362 2010-12-22 18:45:15Z alec $
 
 */
 
@@ -28,6 +28,8 @@ $messages['cookiesdisabled'] = 'Twoja przeglądarka nie obsługuje ciasteczek!';
 $messages['sessionerror'] = 'Błąd sesji bądź sesja wygasła!';
 $messages['imaperror'] = 'Błąd połączenia z serwerem!';
 $messages['servererror'] = 'Błąd serwera!';
+$messages['servererrormsg'] = 'Błąd serwera: $msg';
+$messages['invalidrequest'] = 'Błędne żądanie! Nie zapisano danych.';
 $messages['nomessagesfound'] = 'Brak wiadomości w skrzynce.';
 $messages['loggedout'] = 'Użytkownik wylogował się poprawnie.';
 $messages['mailboxempty'] = 'Skrzynka jest pusta!';
@@ -50,22 +52,21 @@ $messages['sendingfailed'] = 'Nie udało się wysłać wiadomości!';
 $messages['senttooquickly'] = 'Musisz poczekać $sec sek. aby móc wysłać tą wiadomość!';
 $messages['errorsavingsent'] = 'Wystąpił błąd podczas zapisu wysłanej wiadomości!';
 $messages['errorsaving'] = 'Wystąpił błąd podczas zapisu!';
-$messages['errormoving'] = 'Nie można przenieść wybranej wiadomości!';
+$messages['errormoving'] = 'Nie można przenieść wiadomości!';
+$messages['errorcopying'] = 'Nie można skopiować wiadomości!';
 $messages['errordeleting'] = 'Nie można usunąć wiadomości!';
 $messages['errormarking'] = 'Nie można oznaczyć wiadomości!';
 $messages['deletecontactconfirm'] = 'Czy na pewno chcesz usunąć wybrane kontakty?';
 $messages['deletemessagesconfirm'] = 'Czy na pewno chcesz usunąć wybrane wiadomości?';
 $messages['deletefolderconfirm'] = 'Czy na pewno chcesz usunąć wybrany folder?';
 $messages['purgefolderconfirm'] = 'Czy na pewno chcesz usunąć wszystkie wiadomości w tym folderze?';
-$messages['foldercreating'] = 'Dodawanie folderu...';
 $messages['folderdeleting'] = 'Usuwanie folderu...';
-$messages['folderrenaming'] = 'Zmiana nazwy folderu...';
 $messages['foldermoving'] = 'Przenoszenie folderu...';
 $messages['formincomplete'] = 'Uzupełnij formularz!';
 $messages['noemailwarning'] = 'Podaj poprawny adres e-mail!';
 $messages['nonamewarning'] = 'Podaj nazwę!';
 $messages['nopagesizewarning'] = 'Podaj poprawną wartość!';
-$messages['nosenderwarning'] = 'Podaj adres nadawcy!'; 
+$messages['nosenderwarning'] = 'Podaj adres nadawcy!';
 $messages['norecipientwarning'] = 'Podaj co najmniej jednego odbiorcę!';
 $messages['nosubjectwarning'] = 'Nie podano tematu wiadomości. Czy chcesz go teraz uzupełnić?';
 $messages['nobodywarning'] = 'Ta wiadomość jest pusta, czy mimo to chcesz ją wysłać?';
@@ -73,6 +74,7 @@ $messages['notsentwarning'] = 'Wiadomość nie została wysłana. Czy chcesz usu
 $messages['noldapserver'] = 'Wybierz serwer LDAP!';
 $messages['nocontactsreturned'] = 'Nie znaleziono kontaktów!';
 $messages['nosearchname'] = 'Podaj nazwę kontaktu lub jego adres e-mail.';
+$messages['notuploadedwarning'] = 'Nie wszystkie załączniki zostały pobrane. Poczekaj lub anuluj pobieranie.';
 $messages['searchsuccessful'] = 'Liczba znalezionych wiadomości: $nr';
 $messages['searchnomatch'] = 'Nic nie znaleziono.';
 $messages['searching'] = 'Wyszukiwanie...';
@@ -89,27 +91,56 @@ $messages['copyerror'] = 'Nie można skopiować żadnego adresu';
 $messages['sourceisreadonly'] = 'Źródło adresu jest tylko do odczytu';
 $messages['errorsavingcontact'] = 'Nie można było zapisać adresu kontaktu';
 $messages['movingmessage'] = 'Przenoszenie wiadomości...';
+$messages['copyingmessage'] = 'Kopiowanie wiadomości...';
+$messages['deletingmessage'] = 'Usuwanie wiadomości...';
+$messages['markingmessage'] = 'Oznaczanie wiadomości...';
 $messages['receiptsent'] = 'Pomyślnie wysłano potwierdzenie dostarczenia';
 $messages['errorsendingreceipt'] = 'Nie można wysłać potwierdzenia';
 $messages['nodeletelastidentity'] = 'Nie można skasować tej tożsamości, ponieważ jest ostatnią.';
-$messages['addsubfolderhint'] = 'Ten folder zostanie utworzony jako podfolder aktualnie wybranego.';
 $messages['forbiddencharacter'] = 'Nazwa folderu zawiera niedozwolony znak';
-$messages['selectimportfile'] = 'Proszę wybrać plik do wysłania'; 
-$messages['addresswriterror'] = 'Wybrana książka adresowa jest tylko-do-odczytu'; 
-$messages['importwait'] = 'Importowanie, proszę czekać...'; 
-$messages['importerror'] = 'Błąd! Pobrany plik nie jest poprawnym plikiem vCard.'; 
-$messages['importconfirm'] = '<b>Pomyślnie dodano $inserted kontaktów, pominięto $skipped istniejących wpisów</b>:<p><em>$names</em></p>'; 
+$messages['selectimportfile'] = 'Proszę wybrać plik do wysłania';
+$messages['addresswriterror'] = 'Wybrana książka adresowa jest tylko-do-odczytu';
+$messages['contactaddedtogroup'] = 'Kontakty zostały pomyślnie dodane do grupy';
+$messages['contactremovedfromgroup'] = 'Kontakty zostały pomyślnie usunięte z grupy';
+$messages['importwait'] = 'Importowanie, proszę czekać...';
+$messages['importerror'] = 'Błąd! Pobrany plik nie jest poprawnym plikiem vCard.';
+$messages['importconfirm'] = '<b>Pomyślnie dodano $inserted kontaktów, pominięto $skipped istniejących wpisów</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Niedozwolona operacja!';
 $messages['nofromaddress'] = 'Brak adresu e-mail w wybranej tożsamości';
 $messages['editorwarning'] = 'Zmiana edytora spowoduje utratę formatowania tekstu. Czy jesteś pewien, że chcesz to zrobić?';
 $messages['httpreceivedencrypterror'] = 'Wystąpił błąd krytyczny. Skontaktuj się z administratorem. <b>Nie można wysłać wiadomości.</b>';
 $messages['smtpconnerror'] = 'Błąd SMTP ($code): Nie można nawiązać połączenia z serwerem';
 $messages['smtpautherror'] = 'Błąd SMTP ($code): Uwierzytelnianie nie powiodło się';
-$messages['smtpfromerror'] = 'Błąd SMTP ($code): Nie można ustawić nadawcy "$from"';
-$messages['smtptoerror'] = 'Błąd SMTP ($code): Nie można dodać odbiorcy "$to"';
+$messages['smtpfromerror'] = 'Błąd SMTP ($code): Nie można ustawić nadawcy "$from" ($msg)';
+$messages['smtptoerror'] = 'Błąd SMTP ($code): Nie można dodać odbiorcy "$to" ($msg)';
 $messages['smtprecipientserror'] = 'Błąd SMTP: Parsowanie listy odbiorców nie powiodło się';
+$messages['smtpdsnerror'] = 'Błąd SMTP: Statusy dostarczenia (DSN) nie są obsługiwane przez serwer';
 $messages['smtperror'] = 'Błąd SMTP: $msg';
-$messages['invalidrequest'] = 'Błędne żądanie! Nie zapisano danych.';
 $messages['emailformaterror'] = 'Błędny adres e-mail: $email';
+$messages['toomanyrecipients'] = 'Zbyt wielu odbiorców. Zmniejsz ich liczbę do $max.';
+$messages['maxgroupmembersreached'] = 'Liczba członków grupy nie może być większa niż $max';
+$messages['internalerror'] = 'Wystąpił wewnętrzny błąd systemu. Spróbuj jeszcze raz';
+$messages['contactdelerror'] = 'Usuwanie kontaktów nie powiodło się';
+$messages['contactdeleted'] = 'Kontakt(y) został(y) usunięte';
+$messages['groupdeleted'] = 'Grupa została usunięta';
+$messages['grouprenamed'] = 'Nazwa grupy została zmieniona';
+$messages['groupcreated'] = 'Grupa została utworzona';
+$messages['messagedeleted'] = 'Wiadomości zostały usunięte';
+$messages['messagemoved'] = 'Wiadomości zostały przeniesione';
+$messages['messagecopied'] = 'Wiadomości zostały skopiowane';
+$messages['messagemarked'] = 'Wiadomości zostały oznaczone';
+$messages['autocompletechars'] = 'Wprowadź co najmniej $min znak(ów) aby skorzystać z autouzupełniania';
+$messages['foldersubscribing'] = 'Subskrybowanie folderu...';
+$messages['folderunsubscribing'] = 'Odsubskrybowanie folderu...';
+$messages['foldersubscribed'] = 'Folder został pomyślnie zasubskrybowany';
+$messages['folderunsubscribed'] = 'Folder został pomyślnie odsubskrybowany';
+$messages['folderpurged'] = 'Folder został pomyślnie opróżniony';
+$messages['folderexpunged'] = 'Folder został pomyślnie uporządkowany';
+$messages['namecannotbeempty'] = 'Nazwa nie może być pusta';
+$messages['nametoolong'] = 'Name jest zbyt długa';
+$messages['folderupdated'] = 'Folder został pomyślnie zaktualizowany';
+$messages['foldercreated'] = 'Folder został pomyślnie utworzony';
+$messages['errorreadonly'] = 'Nie można wykonać operacji. Folder tylko do odczytu';
+$messages['errornoperm'] = 'Nie można wykonać operacji. Brak uprawnień';
 
 ?>
index 7dd6430459d7927fee41f2e860e6f61b58f74bd8..e7692e7bc30086b7374af20bbf281c42df3de8fc 100755 (executable)
@@ -287,9 +287,6 @@ $labels['subscribed']  = 'ګډ شو ';
 $labels['messagecount'] = 'استوزي ';
 $labels['create']  = 'جوړول، رامنځ ته کول ';
 $labels['createfolder']  = 'نوې پوښۍ جوړ کړه ';
-$labels['rename'] = 'بيانومول ';
-$labels['renamefolder'] = 'پوښۍ بيانومول ';
-$labels['deletefolder']  = 'پوښۍ ړنګول ';
 $labels['managefolders']  = 'پوښيو څارل ';
 $labels['specialfolders'] = 'ځانګړي پوښۍۍ';
 
index c5aae6aa92308e2bfb4520c7a65bc8d39ba71f30..f29475c6d35c7a9f2adc67e15ae37f4582b78a14 100755 (executable)
@@ -31,9 +31,7 @@ $messages['deletecontactconfirm']  = ' په رښتيا سره غواړئ چې ټ
 $messages['deletemessagesconfirm'] = 'په رښتيا سره غواړئ چې ټاکل شوي استوزي‌ړنګ کړئ؟';
 $messages['deletefolderconfirm']  = 'په رښتيآ سره غواړئ چې دا پوښۍ ړنګه کړئ؟';
 $messages['purgefolderconfirm']  = 'په رښتيا سره غواړئ چې ددې پوښۍ ټول استوزي‌ړنګ کړئ؟';
-$messages['foldercreating'] = 'پوښۍ جوړوي';
 $messages['folderdeleting'] = 'پوښۍ ړنګوي';
-$messages['folderrenaming'] = 'پوښۍ بيانوموي';
 $messages['foldermoving'] = 'پوښۍ خوځوي';
 $messages['formincomplete'] = 'دا پورمه بشپړه ډکه شوې نه ده';
 $messages['noemailwarning'] = 'مهرباني وکړئ د يوه شته برېښناليک پته ورځای کړئ';
@@ -66,7 +64,6 @@ $messages['movingmessage'] = 'استوزه خوځوي';
 $messages['receiptsent'] = 'يو لوستل شوی رسليک په بشپړه توګه واستول شو';
 $messages['errorsendingreceipt'] = 'رسليک يې ونه شوای ليږلی';
 $messages['nodeletelastidentity'] = 'تاسې نه شئ کولی چې دا پېژندنه ړنګه کړئ، داستاسو اخرنی پيژندنه ده';
-$messages['addsubfolderhint'] = 'دا پوښۍ د دويمۍ پوښۍ په توګه د ټاکل شوي اوسني ځای کې جوړشي';
 $messages['forbiddencharacter'] = 'د پوښۍ نوم له فوربايډن تورو څخه جوړ دی';
 $messages['selectimportfile'] = 'مهرباني وکړئ‌يو فايل د پورته کولو لپاره وټاکئ';
 $messages['addresswriterror'] = 'ټاکل شوی پتې کتاب د بياليکلو نه دی';
index 81501027f5f3bec8fc92e42b9a175e520e3b2134..37cbb324bae12f399015360e76d72f96087e4884 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/pt_BR/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 |         Alessandro Lenzi <alessandro@mistymountain.com.br>            |
 |         Gervasio Antonio <gdsa32-translations@yahoo.com.br>           |
 |         Victor Benincasa <vbenincasa@gmail.com>                       |
+|         Jarbas Peixoto Junior <jarbas.peixoto@gmail.com>              |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 3061 2009-10-26 21:42:58Z yllar $
+@version $Id: labels.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -42,21 +43,22 @@ $labels['to'] = 'Para';
 $labels['cc'] = 'Cópia';
 $labels['bcc'] = 'Cópia Oculta (Bcc)';
 $labels['replyto'] = 'Resp. para';
+$labels['followupto'] = 'Encaminhar para';
 $labels['date'] = 'Data';
 $labels['size'] = 'Tamanho';
 $labels['priority'] = 'Prioridade';
 $labels['organization'] = 'Organização';
-$labels['reply-to'] = 'Responder para';
+$labels['readstatus'] = 'Status de leitura';
 $labels['mailboxlist'] = 'Pastas';
 $labels['messagesfromto'] = 'Mensagens $from - $to de $count';
+$labels['threadsfromto'] = 'Tópicos $from - $to de $count';
 $labels['messagenrof'] = 'Mensagem $nr de $count';
+$labels['copy'] = 'Copiar';
+$labels['move'] = 'Mover';
 $labels['moveto'] = 'Mover para...';
 $labels['download'] = 'Download';
 $labels['filename'] = 'Arquivo';
 $labels['filesize'] = 'Tamanho';
-$labels['preferhtml'] = 'Exibir formatação HTML em mensagens';
-$labels['htmlmessage'] = 'Mensagem HTML';
-$labels['prettydate'] = 'Exibir datas amigáveis';
 $labels['addtoaddressbook'] = 'Incluir no catálogo de endereços';
 $labels['sun'] = 'Dom';
 $labels['mon'] = 'Seg';
@@ -101,6 +103,8 @@ $labels['checkmail'] = 'Verificar se há novas mensagens';
 $labels['writenewmessage'] = 'Criar nova mensagem';
 $labels['replytomessage'] = 'Responder para o remetente';
 $labels['replytoallmessage'] = 'Responder para o remetente e todos destinatários';
+$labels['replyall'] = 'Responder a todos';
+$labels['replylist'] = 'Responder para a lista';
 $labels['forwardmessage'] = 'Encaminhar a mensagem';
 $labels['deletemessage'] = 'Excluir a mensagem';
 $labels['movemessagetotrash'] = 'Mover a mensagem para a Lixeira';
@@ -124,12 +128,35 @@ $labels['messageactions'] = 'Mais ações...';
 $labels['select'] = 'Selecionar';
 $labels['all'] = 'Todas';
 $labels['none'] = 'Nenhuma';
+$labels['currpage'] = 'Página atual';
 $labels['unread'] = 'Não lidas';
 $labels['flagged'] = 'Sinalizada';
 $labels['unanswered'] = 'Não respondida';
 $labels['deleted'] = 'Excluída';
 $labels['invert'] = 'Inverter';
 $labels['filter'] = 'Exibir';
+$labels['list'] = 'Lista';
+$labels['threads'] = 'Tópicos';
+$labels['expand-all'] = 'Expandir Tudo';
+$labels['expand-unread'] = 'Expandir Não Lidas';
+$labels['collapse-all'] = 'Recolher Tudo';
+$labels['threaded'] = 'Agrupado';
+$labels['autoexpand_threads'] = 'Expandir mensagens agrupadas';
+$labels['do_expand'] = 'todos os tópicos';
+$labels['expand_only_unread'] = 'somente com mensagem(s) não lidas';
+$labels['fromto'] = 'Remetente/Destinatário';
+$labels['flag'] = 'Marca';
+$labels['attachment'] = 'Anexo';
+$labels['nonesort'] = 'Nenhuma';
+$labels['sentdate'] = 'Data de Envio';
+$labels['arrival'] = 'Data da Chegada';
+$labels['asc'] = 'crescente';
+$labels['desc'] = 'decrescente';
+$labels['listcolumns'] = 'Lista de colunas';
+$labels['listsorting'] = 'Seleção de coluna';
+$labels['listorder'] = 'Ordem de classificação';
+$labels['listmode'] = 'Modo de visão de Lista';
+$labels['folderactions'] = 'Pastas...';
 $labels['compact'] = 'Compactar';
 $labels['empty'] = 'Esvaziar';
 $labels['purge'] = 'Apagar';
@@ -150,12 +177,15 @@ $labels['addattachment'] = 'Anexar um arquivo';
 $labels['charset'] = 'Codificação';
 $labels['editortype'] = 'Tipo de editor';
 $labels['returnreceipt'] = 'Solicitar confirmação de recebimento';
+$labels['dsn'] = 'Recibo de entrega';
+$labels['editidents'] = 'Editar identidades';
 $labels['checkspelling'] = 'Verificar ortografia';
 $labels['resumeediting'] = 'Continuar a edição';
 $labels['revertto'] = 'Reverter para';
 $labels['attachments'] = 'Anexos';
 $labels['upload'] = 'Enviar';
 $labels['close'] = 'Fechar';
+$labels['messageoptions'] = 'Opções de mensagens...';
 $labels['low'] = 'Baixa';
 $labels['lowest'] = 'Mais baixa';
 $labels['normal'] = 'Normal';
@@ -172,6 +202,7 @@ $labels['maxuploadsize'] = 'Tamanho máximo permitido do arquivo é $size';
 $labels['addcc'] = 'Cópia';
 $labels['addbcc'] = 'Cópia Oculta';
 $labels['addreplyto'] = 'Resp. para';
+$labels['addfollowupto'] = 'Adicionar encaminhar Para';
 $labels['mdnrequest'] = 'O remetente desta mensagem deseja ser notificado quando você ler esta mensagem. Você permite o envio desta notificação?';
 $labels['receiptread'] = 'Confirmação de Leitura (Exibida)';
 $labels['yourmessage'] = 'Esta é uma confirmação de leitura da sua mensagem';
@@ -182,6 +213,8 @@ $labels['surname'] = 'Sobrenome';
 $labels['email'] = 'E-Mail';
 $labels['addcontact'] = 'Incluir novo contato';
 $labels['editcontact'] = 'Editar contato';
+$labels['contacts'] = 'Contatos';
+$labels['contactproperties'] = 'Propriedades do contato';
 $labels['edit'] = 'Editar';
 $labels['cancel'] = 'Cancelar';
 $labels['save'] = 'Salvar';
@@ -193,10 +226,13 @@ $labels['contactsfromto'] = 'Contatos $from - $to de $count';
 $labels['print'] = 'Imprimir';
 $labels['export'] = 'Exportar';
 $labels['exportvcards'] = 'Exportar os contatos em formato vCard';
+$labels['newcontactgroup'] = 'Criar novo grupo de contatos';
+$labels['groupactions'] = 'Ações para grupos de contatos...';
 $labels['previouspage'] = 'Página Anterior';
 $labels['firstpage'] = 'Primeira Página ';
 $labels['nextpage'] = 'Próxima Página';
 $labels['lastpage'] = 'Última Página';
+$labels['group'] = 'Grupo';
 $labels['groups'] = 'Grupos';
 $labels['personaladrbook'] = 'Endereços pessoais';
 $labels['import'] = 'Importar';
@@ -214,6 +250,10 @@ $labels['manageidentities'] = 'Gerenciar identidades desta conta';
 $labels['newidentity'] = 'Nova identidade';
 $labels['newitem'] = 'Novo item';
 $labels['edititem'] = 'Editar item';
+$labels['preferhtml'] = 'Exibir formatação HTML em mensagens';
+$labels['defaultcharset'] = 'Conjunto padrão de caracteres';
+$labels['htmlmessage'] = 'Mensagem HTML';
+$labels['prettydate'] = 'Exibir datas amigáveis';
 $labels['setdefault'] = 'Padrão';
 $labels['autodetect'] = 'Auto';
 $labels['language'] = 'Idioma';
@@ -222,6 +262,7 @@ $labels['pagesize'] = 'Mensagens por página';
 $labels['signature'] = 'Assinatura';
 $labels['dstactive'] = 'Horário de verão';
 $labels['htmleditor'] = 'Criar mensagens formatadas em HTML';
+$labels['htmlonreply'] = 'em resposta de mensagens HTML';
 $labels['htmlsignature'] = 'Assinatura em HTML';
 $labels['previewpane'] = 'Exibir pré-visualização';
 $labels['skin'] = 'Aparência da interface (tema)';
@@ -233,10 +274,13 @@ $labels['mailboxview'] = 'Exibição da Caixa de Correio';
 $labels['mdnrequests'] = 'Notificações ao remetente';
 $labels['askuser'] = 'perguntar ao usuário';
 $labels['autosend'] = 'enviar automaticamente';
+$labels['autosendknown'] = 'enviar recibo de leitura para meus contatos, caso contrário me pergunte';
+$labels['autosendknownignore'] = 'enviar recibo de leitura para meus contatos, caso contrário ignore';
 $labels['ignore'] = 'ignorar';
 $labels['readwhendeleted'] = 'Marcar a mensagem como lida ao excluir';
-$labels['flagfordeletion'] = 'Sinalizar a mensagem para exclusão ao invés de excluir';
+$labels['flagfordeletion'] = 'Marcar a mensagem para exclusão ao invés de excluir';
 $labels['skipdeleted'] = 'Não exibir mensagens excluídas';
+$labels['deletealways'] = 'Apagar as mensagens se movê-las para a lixeira falhar';
 $labels['showremoteimages'] = 'Exibir imagens externas';
 $labels['fromknownsenders'] = 'de remetentes conhecidos';
 $labels['always'] = 'sempre';
@@ -245,22 +289,40 @@ $labels['autosavedraft'] = 'Salvar rascunho automaticamente';
 $labels['everynminutes'] = 'a cada $n minuto(s)';
 $labels['keepalive'] = 'Verificar se há novas mensagens';
 $labels['never'] = 'nunca';
+$labels['immediately'] = 'imediatamente';
 $labels['messagesdisplaying'] = 'Exibição de mensagens';
 $labels['messagescomposition'] = 'Composição de mensagens';
 $labels['mimeparamfolding'] = 'Nomes de anexos';
 $labels['2231folding'] = 'RFC 2231 Integral (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'RFC 2047 Integral (outro)';
+$labels['force7bit'] = 'Usar codificação MIME para caracteres 8-bit';
 $labels['advancedoptions'] = 'Opções avançadas';
 $labels['focusonnewmessage'] = 'Focar janela do navegador na nova mensagem';
 $labels['checkallfolders'] = 'Verificar se há novas mensagens em todas as pastas';
 $labels['displaynext'] = 'Exibir a mensagem seguinte após apagar/mover uma mensagem';
-$labels['indexsort'] = 'Utilize o índice de mensagens para ordenar por data';
 $labels['mainoptions'] = 'Opções Principais';
 $labels['section'] = 'Seção';
 $labels['maintenance'] = 'Manutenção';
 $labels['newmessage'] = 'Novas Mensagens';
 $labels['listoptions'] = 'Opções de Exibição';
+$labels['signatureoptions'] = 'Opções de Assinatura';
+$labels['whenreplying'] = 'Quando responder';
+$labels['replytopposting'] = 'iniciar nova mensagem acima da original';
+$labels['replybottomposting'] = 'iniciar nova mensagem abaixo da original';
+$labels['replyremovesignature'] = 'Remover assinatura original da mensagem ao respondê-la';
+$labels['autoaddsignature'] = 'Automaticamente adicionar assinatura';
+$labels['newmessageonly'] = 'somente para novas mensagens';
+$labels['replyandforwardonly'] = 'somente respostas e encaminhamentos';
+$labels['replysignaturepos'] = 'Inserir assinatura ao responder ou encaminhar';
+$labels['belowquote'] = 'abaixo da citação';
+$labels['abovequote'] = 'acima da citação';
+$labels['insertsignature'] = 'Inserir assinatura';
+$labels['previewpanemarkread'] = 'Marcar mensagem pré-visualizada como lida';
+$labels['afternseconds'] = 'depois de $n segundos';
+$labels['reqmdn'] = 'Sempre pedir confirmação de leitura';
+$labels['reqdsn'] = 'Sempre pedir confirmação de entrega';
+$labels['replysamefolder'] = 'Guardar as respostas na mesma pasta da mensagem original';
 $labels['folder'] = 'Pasta';
 $labels['folders'] = 'Pastas';
 $labels['foldername'] = 'Nome da pasta';
@@ -268,11 +330,15 @@ $labels['subscribed'] = 'Ativo';
 $labels['messagecount'] = 'Mensagens';
 $labels['create'] = 'Criar';
 $labels['createfolder'] = 'Criar nova pasta';
-$labels['rename'] = 'Renomear';
-$labels['renamefolder'] = 'Renomear pasta';
-$labels['deletefolder'] = 'Apagar pasta';
 $labels['managefolders'] = 'Gerenciar pastas';
 $labels['specialfolders'] = 'Pastas especiais';
+$labels['properties'] = 'Propriedades';
+$labels['folderproperties'] = 'Opções de pasta';
+$labels['parentfolder'] = 'Pasta origem';
+$labels['location'] = 'Localização';
+$labels['info'] = 'Informação';
+$labels['getfoldersize'] = 'Obter tamanho da pasta';
+$labels['changesubscription'] = 'Clique para ativar/desativar';
 $labels['sortby'] = 'Ordenado por';
 $labels['sortasc'] = 'Ascendente';
 $labels['sortdesc'] = 'Descendente';
@@ -280,5 +346,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Inglês';
+$labels['westerneuropean'] = 'Europa Ocidental';
+$labels['easterneuropean'] = 'Leste Europeu';
+$labels['southeasterneuropean'] = 'Sudeste Europeu';
+$labels['baltic'] = 'Báltico';
+$labels['cyrillic'] = 'Cirílico';
+$labels['arabic'] = 'Árabe';
+$labels['greek'] = 'Grego';
+$labels['hebrew'] = 'Hebraico';
+$labels['turkish'] = 'Turco';
+$labels['nordic'] = 'Nórdico';
+$labels['thai'] = 'Tailandês';
+$labels['celtic'] = 'Celta';
+$labels['vietnamese'] = 'Vietnamita';
+$labels['japanese'] = 'Japonês';
+$labels['korean'] = 'Coreano';
+$labels['chinese'] = 'Chinês';
 
 ?>
index be835effe098faa3a613036d376332ac10608cff..1c91ec2880ae0fb7825fd51360d876de5488d4fc 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/pt_BR/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 |         Alessandro Lenzi <alessandro@mistymountain.com.br>            |
 |         Gervasio Antonio <gdsa32-translations@yahoo.com.br>           |
 |         Victor Benincasa <vbenincasa@gmail.com>                       |
+|         Jarbas Peixoto Junior <jarbas.peixoto@gmail.com>              |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 3061 2009-10-26 21:42:58Z yllar $
+@version $Id: messages.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -27,6 +28,9 @@ $messages['cookiesdisabled'] = 'Seu navegador não suporta cookies';
 $messages['sessionerror'] = 'A sessão do seu navegador é inválida ou expirou';
 $messages['imaperror'] = 'Falha na conexão com o servidor IMAP';
 $messages['servererror'] = 'Erro no Servidor!';
+$messages['servererrormsg'] = 'Erro no Servidor: $msg';
+$messages['errorreadonly'] = 'Não foi possível realizar a operação. Pasta somente leitura';
+$messages['errornoperm'] = 'Não foi possível realizar a operação. Acesso negado';
 $messages['invalidrequest'] = 'Requisição inválida! Nenhum dado foi salvo.';
 $messages['nomessagesfound'] = 'Nenhuma mensagem foi encontrada';
 $messages['loggedout'] = 'Sua sessão foi finalizada com sucesso. Até breve!';
@@ -51,16 +55,17 @@ $messages['senttooquickly'] = 'Aguarde $sec s para enviar a mensagem';
 $messages['errorsavingsent'] = 'Ocorreu um erro ao salvar a mensagem enviada';
 $messages['errorsaving'] = 'Ocorreu um erro ao salvar';
 $messages['errormoving'] = 'Não foi possível mover a mensagem';
+$messages['errorcopying'] = 'Não foi possível copiar a(s) mensagem(ns)';
 $messages['errordeleting'] = 'Não foi possível apagar a mensagem';
 $messages['errormarking'] = 'Não foi possível marcar a mensagem';
 $messages['deletecontactconfirm'] = 'Deseja realmente excluir o(s) contato(s) selecionado(s)?';
 $messages['deletemessagesconfirm'] = 'Deseja realmente excluir a(s) mensagem(s) selecionada(s)?';
 $messages['deletefolderconfirm'] = 'Deseja realmente excluir esta pasta?';
 $messages['purgefolderconfirm'] = 'Deseja realmente excluir todas mensagens desta pasta?';
-$messages['foldercreating'] = 'Criando pasta...';
 $messages['folderdeleting'] = 'Apagando pasta...';
-$messages['folderrenaming'] = 'Renomeando pasta...';
 $messages['foldermoving'] = 'Movendo pasta...';
+$messages['foldersubscribing'] = 'Ativando pasta...';
+$messages['folderunsubscribing'] = 'Desativando pasta...';
 $messages['formincomplete'] = 'Os campos não foram completamente preenchidos';
 $messages['noemailwarning'] = 'Por favor, informe um endereço de e-mail válido';
 $messages['nonamewarning'] = 'Por favor, informe o nome';
@@ -80,6 +85,10 @@ $messages['searching'] = 'Pesquisando...';
 $messages['checking'] = 'Verificando...';
 $messages['nospellerrors'] = 'Nenhum erro ortográfico foi encontrado';
 $messages['folderdeleted'] = 'Pasta excluída com sucesso';
+$messages['foldersubscribed'] = 'Pasta ativada com sucesso';
+$messages['folderunsubscribed'] = 'Pasta desativada com sucesso';
+$messages['folderpurged'] = 'Pasta excluída com sucesso';
+$messages['folderexpunged'] = 'Pasta esvaziada com sucesso';
 $messages['deletedsuccessfully'] = 'Excluído com sucesso';
 $messages['converting'] = 'Removendo formatação...';
 $messages['messageopenerror'] = 'Não foi possível carregar a mensagem do servidor';
@@ -90,13 +99,17 @@ $messages['copyerror'] = 'Não foi possível copiar os endereços';
 $messages['sourceisreadonly'] = 'Esta fonte de endereço é somente leitura';
 $messages['errorsavingcontact'] = 'Não foi possível salvar o endereço de contato';
 $messages['movingmessage'] = 'Movendo mensagem...';
+$messages['copyingmessage'] = 'Copiando mensagem...';
+$messages['deletingmessage'] = 'Excluindo mensagem(s)...';
+$messages['markingmessage'] = 'Marcando mensagem(s)...';
 $messages['receiptsent'] = 'Confirmação de recebimento enviada com sucesso';
 $messages['errorsendingreceipt'] = 'Não foi possível enviar a confirmação de recebimento';
 $messages['nodeletelastidentity'] = 'Você não pode excluir a única identidade';
-$messages['addsubfolderhint'] = 'Esta pasta será criada como uma sub-pasta da que está selecionada';
 $messages['forbiddencharacter'] = 'O nome da pasta contém um caractere não permitido';
 $messages['selectimportfile'] = 'Selecione o arquivo para envio';
 $messages['addresswriterror'] = 'O catálogo de endereços selecionado não tem permissão de modificação';
+$messages['contactaddedtogroup'] = 'Adicionado os contatos a este grupo com sucesso';
+$messages['contactremovedfromgroup'] = 'Removido contatos deste grupo com sucesso';
 $messages['importwait'] = 'Importando, aguarde por favor...';
 $messages['importerror'] = 'Falha na importação! O arquivo enviado não é um arquivo vCard válido.';
 $messages['importconfirm'] = '<b>Foram importados com sucesso $inserted contatos, e $skipped contatos foram ignorados</b>:<p><em>$names</em></p>';
@@ -106,10 +119,28 @@ $messages['editorwarning'] = 'Mudar para o editor de texto simples elimina toda
 $messages['httpreceivedencrypterror'] = 'Ocorreu um erro de configuração. Informe ao administrador do sistema imediatamente. <b>Sua mensagem não pode ser enviada.</b>';
 $messages['smtpconnerror'] = 'Erro SMTP ($code): Conexão ao servidor falhou';
 $messages['smtpautherror'] = 'Erro SMTP ($code): Falha na autenticação';
-$messages['smtpfromerror'] = 'Erro SMTP ($code): Falha ao definir o remetente "$from"';
-$messages['smtptoerror'] = 'Erro SMTP ($code): Falha ao adicionar o destinatário "$to"';
+$messages['smtpfromerror'] = 'Erro SMTP ($code): Falha ao definir o remetente "$from" ($msg)';
+$messages['smtptoerror'] = 'Erro SMTP ($code): Falha ao adicionar o destinatário "$to" ($msg)';
 $messages['smtprecipientserror'] = 'Erro SMTP: Não é possível analisar a lista destinatários';
+$messages['smtpdsnerror'] = 'Erro SMTP: Sem suporte para Confirmação de Entrega (DSN)';
 $messages['smtperror'] = 'Erro SMTP: $msg';
 $messages['emailformaterror'] = 'Endereço de Email incorreto: $email';
+$messages['toomanyrecipients'] = 'Muitos destinatários. Reduza o número de destinatários para $max.';
+$messages['maxgroupmembersreached'] = 'O número de membros do grupo excede o máximo de $max';
+$messages['internalerror'] = 'Ocorreu um erro interno. Por favor tente novamente.';
+$messages['contactdelerror'] = 'Não foi possível excluir o(s) contato(s)';
+$messages['contactdeleted'] = 'Contato(s) excluído(s) com suscesso';
+$messages['groupdeleted'] = 'Grupo excluído com suscesso';
+$messages['grouprenamed'] = 'Grupo renomeado com suscesso';
+$messages['groupcreated'] = 'Grupo criado com sucesso';
+$messages['messagedeleted'] = 'Mensagem(s) excluída(s) com suscesso';
+$messages['messagemoved'] = 'Mensagem(s) movida(s) com sucesso';
+$messages['messagecopied'] = 'Mensagem(s) copiada(s) com sucesso';
+$messages['messagemarked'] = 'Mensagem(s) marcada(s) com sucesso';
+$messages['autocompletechars'] = 'Digite pelo menos $min caracter para auto-completar';
+$messages['namecannotbeempty'] = 'Nome não pode ser vazio';
+$messages['nametoolong'] = 'Nome é muito longo';
+$messages['folderupdated'] = 'Pasta atualizada com sucesso';
+$messages['foldercreated'] = 'Pasta criada com sucesso';
 
 ?>
index ddf5df35c1543431175a938304de95a8bf1fabf8..227fabd7a3bc05869373a6cc113bd37ff071a9b8 100644 (file)
@@ -5,58 +5,59 @@
 +-----------------------------------------------------------------------+
 | language/pt_PT/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Authors: Sergio Rocha <sergio.rocha@makeitsimple.pt>                  |
-|          João Vale <jpvale@gmail.com>                                 |
+|          João Vale <jpvale@gmail.com>                                |
 |          Fernando Silva <fernando.silva@openquest.pt>                 |
 |          Nuno Costa <nuno@criacaoweb.net>                             |
-|          Teotónio Ricardo <teotonio.ricardo@webtuga.pt>               |
+|          Teotónio Ricardo <teotonio.ricardo@webtuga.pt>              |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 3019 2009-10-05 19:10:11Z yllar $
+@version $Id: labels.inc 4386 2011-01-04 08:35:46Z yllar $
 
 */
 
 $labels = array();
 $labels['welcome'] = 'Bem-vindo ao $product';
 $labels['username'] = 'Utilizador';
-$labels['password'] = 'Senha';
+$labels['password'] = 'Palavra-passe';
 $labels['server'] = 'Servidor';
 $labels['login'] = 'Entrar';
 $labels['logout'] = 'Sair';
-$labels['mail'] = 'E-mail';
+$labels['mail'] = 'Lista de mensagens';
 $labels['settings'] = 'Configurações pessoais';
-$labels['addressbook'] = 'Lista de Contactos';
-$labels['inbox'] = 'Caixa de entrada';
+$labels['addressbook'] = 'Lista de contactos';
+$labels['inbox'] = 'A Receber';
 $labels['drafts'] = 'Rascunhos';
-$labels['sent'] = 'Enviados';
-$labels['trash'] = 'Lixeira';
-$labels['junk'] = 'Junk';
+$labels['sent'] = 'Itens Enviados';
+$labels['trash'] = 'Reciclagem';
+$labels['junk'] = 'Spam';
 $labels['subject'] = 'Assunto';
 $labels['from'] = 'Remetente';
 $labels['to'] = 'Para';
-$labels['cc'] = 'Cópia';
+$labels['cc'] = 'Cc';
 $labels['bcc'] = 'Bcc';
-$labels['replyto'] = 'Resp. para';
+$labels['replyto'] = 'Responder para';
+$labels['followupto'] = 'Reencaminhar-Para';
 $labels['date'] = 'Data';
 $labels['size'] = 'Tamanho';
 $labels['priority'] = 'Prioridade';
 $labels['organization'] = 'Organização';
-$labels['reply-to'] = 'Responder para';
+$labels['readstatus'] = 'Estado de leitura';
 $labels['mailboxlist'] = 'Pastas';
-$labels['messagesfromto'] = 'Mensagens $from - $to de $count';
+$labels['messagesfromto'] = 'Mensagens de $from a $to de $count';
+$labels['threadsfromto'] = 'Tópicos de $from a $to de $count';
 $labels['messagenrof'] = 'Mensagem $nr de $count';
+$labels['copy'] = 'Copiar';
+$labels['move'] = 'Mover';
 $labels['moveto'] = 'mover para...';
 $labels['download'] = 'descarregar';
 $labels['filename'] = 'Ficheiro';
 $labels['filesize'] = 'Tamanho';
-$labels['preferhtml'] = 'Prefere HTML';
-$labels['htmlmessage'] = 'Mensagem HTML';
-$labels['prettydate'] = 'Formatar datas';
 $labels['addtoaddressbook'] = 'Adicionar à lista de contactos';
 $labels['sun'] = 'Dom';
 $labels['mon'] = 'Seg';
@@ -101,9 +102,11 @@ $labels['checkmail'] = 'Verificar novas mensagens';
 $labels['writenewmessage'] = 'Criar nova mensagem';
 $labels['replytomessage'] = 'Responder';
 $labels['replytoallmessage'] = 'Responder a todos';
+$labels['replyall'] = 'Responder a todos';
+$labels['replylist'] = 'Lista de resposta';
 $labels['forwardmessage'] = 'Reencaminhar';
-$labels['deletemessage'] = 'Apagar';
-$labels['movemessagetotrash'] = 'Mover para lixeira';
+$labels['deletemessage'] = 'Eliminar';
+$labels['movemessagetotrash'] = 'Mover para reciclagem';
 $labels['printmessage'] = 'Imprimir';
 $labels['previousmessage'] = 'Mensagem anterior';
 $labels['previousmessages'] = 'Página anterior';
@@ -124,38 +127,63 @@ $labels['messageactions'] = 'Mais acções...';
 $labels['select'] = 'Seleccionar';
 $labels['all'] = 'Todas';
 $labels['none'] = 'Nenhuma';
+$labels['currpage'] = 'Página actual';
 $labels['unread'] = 'Não lidas';
 $labels['flagged'] = 'Sinalizadas';
 $labels['unanswered'] = 'Não respondidas';
-$labels['deleted'] = 'Eliminado';
-$labels['invert'] = 'Inverter';
+$labels['deleted'] = 'Eliminadas';
+$labels['invert'] = 'Inverter selecção';
 $labels['filter'] = 'Filtro';
+$labels['list'] = 'Em lista';
+$labels['threads'] = 'Tópicos';
+$labels['expand-all'] = 'Expandir tudo';
+$labels['expand-unread'] = 'Expandir não lidas';
+$labels['collapse-all'] = 'Recolher tudo';
+$labels['threaded'] = 'Agrupar tópicos';
+$labels['autoexpand_threads'] = 'Expandir tópicos das mensagens';
+$labels['do_expand'] = 'todos os tópicos';
+$labels['expand_only_unread'] = 'só com mensagens não lidas';
+$labels['fromto'] = 'Remetente/Destinatário';
+$labels['flag'] = 'Sinalizador';
+$labels['attachment'] = 'Anexo';
+$labels['nonesort'] = 'Nenhum';
+$labels['sentdate'] = 'Data de envio';
+$labels['arrival'] = 'Data de recepção';
+$labels['asc'] = 'Ascendente';
+$labels['desc'] = 'Descendente';
+$labels['listcolumns'] = 'Lista de colunas';
+$labels['listsorting'] = 'Ordenar por';
+$labels['listorder'] = 'Ordenação';
+$labels['listmode'] = 'Modo de visualização';
+$labels['folderactions'] = 'Acções das pastas...';
 $labels['compact'] = 'Compactar';
 $labels['empty'] = 'Vazio';
-$labels['purge'] = 'Apagar';
-$labels['quota'] = 'Utilização';
+$labels['quota'] = 'Espaço utilizado';
 $labels['unknown'] = 'desconhecido';
 $labels['unlimited'] = 'ilimitado';
 $labels['quicksearch'] = 'Pesquisa rápida';
 $labels['resetsearch'] = 'Limpar pesquisa';
-$labels['searchmod'] = 'Modificadores de Pesquisa';
+$labels['searchmod'] = 'Pesquisar em';
 $labels['msgtext'] = 'Mensagem completa';
 $labels['openinextwin'] = 'Abrir numa nova janela';
-$labels['emlsave'] = 'Descarregar (.eml)';
+$labels['emlsave'] = 'Guardar como (.eml)';
 $labels['compose'] = 'Escrever mensagem';
 $labels['editasnew'] = 'Editar como novo';
-$labels['savemessage'] = 'Salvar rascunho';
+$labels['savemessage'] = 'Guardar rascunho';
 $labels['sendmessage'] = 'Enviar';
-$labels['addattachment'] = 'Anexar';
+$labels['addattachment'] = 'Adicionar anexo';
 $labels['charset'] = 'Charset';
 $labels['editortype'] = 'Tipo de editor';
 $labels['returnreceipt'] = 'Confirmação de leitura';
+$labels['dsn'] = 'Recibo de entrega';
+$labels['editidents'] = 'Editar entidades';
 $labels['checkspelling'] = 'Verificar ortografia';
 $labels['resumeediting'] = 'Continuar a edição';
 $labels['revertto'] = 'Reverter para';
 $labels['attachments'] = 'Anexos';
-$labels['upload'] = 'Puxar';
+$labels['upload'] = 'Carregar';
 $labels['close'] = 'Fechar';
+$labels['messageoptions'] = 'Opções de mensagens...';
 $labels['low'] = 'Baixa';
 $labels['lowest'] = 'Mais baixa';
 $labels['normal'] = 'Normal';
@@ -163,47 +191,54 @@ $labels['high'] = 'Alta';
 $labels['highest'] = 'Mais alta';
 $labels['nosubject'] = '(sem assunto)';
 $labels['showimages'] = 'Exibir imagens';
-$labels['alwaysshow'] = 'Mostrar sempre imagens a partir de  $sender';
+$labels['alwaysshow'] = 'Mostrar sempre imagens a partir de $sender';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Texto simples';
-$labels['savesentmessagein'] = 'Salvar mensagem enviada em';
-$labels['dontsave'] = 'não salvar';
+$labels['savesentmessagein'] = 'Guardar mensagem enviada em';
+$labels['dontsave'] = 'não guardar';
 $labels['maxuploadsize'] = 'Tamanho máximo permitido do ficheiro é $size';
 $labels['addcc'] = 'Adicionar Cc';
 $labels['addbcc'] = 'Adicionar Bcc';
-$labels['addreplyto'] = 'Adicionar Resp. para';
-$labels['mdnrequest'] = 'O remetente desta mensagem pediu para ser notificado quando esta fosse lida. Deseja enviar uma notificação?';
+$labels['addreplyto'] = 'Adicionar Responder para';
+$labels['addfollowupto'] = 'Adicionar Reencaminhar-Para';
+$labels['mdnrequest'] = 'O remetente desta mensagem pediu para ser notificado quando esta mensagem fosse lida. Deseja enviar uma notificação?';
 $labels['receiptread'] = 'Recibo de leitura';
 $labels['yourmessage'] = 'Isto é um recibo de leitura da sua mensagem';
 $labels['receiptnote'] = 'Nota: este recibo apenas indica que a mensagem foi aberta pelo destinatário. Não garante que a mensagem foi lida ou compreendida.';
 $labels['name'] = 'Nome completo';
 $labels['firstname'] = 'Primeiro nome';
 $labels['surname'] = 'Apelido';
-$labels['email'] = 'E-Mail';
+$labels['email'] = 'E-mail';
 $labels['addcontact'] = 'Criar novo contacto';
 $labels['editcontact'] = 'Editar contacto';
+$labels['contacts'] = 'Contactos';
+$labels['contactproperties'] = 'Propriedades dos contactos';
 $labels['edit'] = 'Editar';
 $labels['cancel'] = 'Cancelar';
-$labels['save'] = 'Gravar';
-$labels['delete'] = 'Apagar';
+$labels['save'] = 'Guardar';
+$labels['delete'] = 'Eliminar';
+$labels['rename'] = 'Renomear';
 $labels['newcontact'] = 'Criar novo contacto';
-$labels['deletecontact'] = 'Apagar contactos selecionados';
+$labels['deletecontact'] = 'Eliminar contactos seleccionados';
 $labels['composeto'] = 'Escrever mensagem para';
 $labels['contactsfromto'] = 'Contactos $from - $to of $count';
 $labels['print'] = 'Imprimir';
 $labels['export'] = 'Exportar';
 $labels['exportvcards'] = 'Exportar contactos no formato vCard';
+$labels['newcontactgroup'] = 'Criar novo grupo de contactos';
+$labels['groupactions'] = 'Acções para grupo de contactos...';
 $labels['previouspage'] = 'Exibir página anterior';
 $labels['firstpage'] = 'Exibir primeira página';
 $labels['nextpage'] = 'Exibir próxima página';
 $labels['lastpage'] = 'Exibir última página';
+$labels['group'] = 'Grupo';
 $labels['groups'] = 'Grupos';
 $labels['personaladrbook'] = 'Endereços pessoais';
 $labels['import'] = 'Importar';
 $labels['importcontacts'] = 'Importar contactos';
 $labels['importfromfile'] = 'Importar do ficheiro:';
 $labels['importreplace'] = 'Substituir todo o livro de endereços';
-$labels['importtext'] = 'Pode submeter contactos a partir de um livro de endereços.Actualmente suportamos importação de endereços no formato vCard.';
+$labels['importtext'] = 'Pode submeter contactos a partir de um livro de endereços. Actualmente suportamos importação de endereços no formato vCard.';
 $labels['done'] = 'Terminado';
 $labels['settingsfor'] = 'Configurações para';
 $labels['preferences'] = 'Preferências';
@@ -214,7 +249,11 @@ $labels['manageidentities'] = 'Gerir identidades para esta conta';
 $labels['newidentity'] = 'Nova identidade';
 $labels['newitem'] = 'Novo item';
 $labels['edititem'] = 'Editar item';
-$labels['setdefault'] = 'Marcar por omissão';
+$labels['preferhtml'] = 'Exibir mensagens em HTML';
+$labels['defaultcharset'] = 'Conjunto de caracteres predefinido';
+$labels['htmlmessage'] = 'Mensagem em HTML';
+$labels['prettydate'] = 'Formatar datas';
+$labels['setdefault'] = 'Marcar como predefinido';
 $labels['autodetect'] = 'Auto';
 $labels['language'] = 'Idioma';
 $labels['timezone'] = 'Fuso horário';
@@ -222,63 +261,107 @@ $labels['pagesize'] = 'Linhas por página';
 $labels['signature'] = 'Assinatura';
 $labels['dstactive'] = 'Horário de verão';
 $labels['htmleditor'] = 'Escrever mensagens em HTML';
+$labels['htmlonreply'] = 'apenas em resposta a mensagens HTML';
 $labels['htmlsignature'] = 'Assinatura em HTML';
 $labels['previewpane'] = 'Mostrar pré-visualização';
 $labels['skin'] = 'Interface skin [tema]';
-$labels['logoutclear'] = 'Limpar a Lixeira após sair';
-$labels['logoutcompact'] = 'Compactar Caixa de Entrada após sair';
-$labels['uisettings'] = 'Interface de Utilizador';
-$labels['serversettings'] = 'Definições do Servidor';
-$labels['mailboxview'] = 'Visualizar caixa de Entrada';
-$labels['mdnrequests'] = 'Enviar Notificações';
-$labels['askuser'] = 'Perguntar ao ultilizador';
+$labels['logoutclear'] = 'Esvaziar a Reciclagem ao sair';
+$labels['logoutcompact'] = 'Compactar Caixa de Entrada ao sair';
+$labels['uisettings'] = 'Interface do utilizador';
+$labels['serversettings'] = 'Definições do servidor';
+$labels['mailboxview'] = 'Visualização da Caixa de Entrada';
+$labels['mdnrequests'] = 'Enviar notificações';
+$labels['askuser'] = 'perguntar ao ultilizador';
 $labels['autosend'] = 'enviar automáticamente';
+$labels['autosendknown'] = 'enviar recibo de leitura apenas para os meus contactos';
+$labels['autosendknownignore'] = 'enviar recibo para os meus contactos, caso contrário, ignorar';
 $labels['ignore'] = 'ignorar';
-$labels['readwhendeleted'] = 'Marcar a mensagem como lida ao excluir';
-$labels['flagfordeletion'] = 'Marcar a mensagem de eliminação, em vez de a excluir';
-$labels['skipdeleted'] = 'Não mostrar mensagens apagadas';
+$labels['readwhendeleted'] = 'Marcar a mensagem como lida ao eliminar';
+$labels['flagfordeletion'] = 'Marcar a mensagem para eliminação, em vez de a eliminar';
+$labels['skipdeleted'] = 'Não mostrar mensagens eliminadas';
+$labels['deletealways'] = 'Se ao mover mensagens para a reciclagem falhar, eliminá-las';
 $labels['showremoteimages'] = 'Mostrar imagens externas';
 $labels['fromknownsenders'] = 'de remetentes conhecidos';
 $labels['always'] = 'sempre';
 $labels['showinlineimages'] = 'Mostrar imagens anexadas abaixo da mensagem';
-$labels['autosavedraft'] = 'Salvar rascunho automaticamente';
-$labels['everynminutes'] = 'cada $n minuto(s)';
+$labels['autosavedraft'] = 'Guardar rascunho automaticamente';
+$labels['everynminutes'] = 'cada $n minuto(s)';
 $labels['keepalive'] = 'Verificar novas mensagens em';
 $labels['never'] = 'nunca';
-$labels['messagesdisplaying'] = 'A exibir mensagens';
+$labels['immediately'] = 'imediatamente';
+$labels['messagesdisplaying'] = 'Visualização de mensagens';
 $labels['messagescomposition'] = 'Composição de mensagens ';
-$labels['mimeparamfolding'] = 'Nomes de anexos';
+$labels['mimeparamfolding'] = 'Nome dos anexos';
 $labels['2231folding'] = 'Total RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Total RFC 2047 (outro)';
+$labels['force7bit'] = 'Usar codificação MIME para caracteres de 8 bits';
 $labels['advancedoptions'] = 'Opções avançadas';
-$labels['focusonnewmessage'] = 'Focar janela de navegador na nova mensagem';
+$labels['focusonnewmessage'] = 'Activar a janela do navegador na nova mensagem';
 $labels['checkallfolders'] = 'Verificar todas as pastas para novas mensagens';
 $labels['displaynext'] = 'Depois de mover/eliminar uma mensagem, mostrar a próxima mensagem';
-$labels['indexsort'] = 'Utilize o índice de mensagens para ordenar por data';
 $labels['mainoptions'] = 'Opções';
 $labels['section'] = 'Secção';
 $labels['maintenance'] = 'Manutenção';
 $labels['newmessage'] = 'Nova Mensagem';
 $labels['listoptions'] = 'Listar opções';
+$labels['signatureoptions'] = 'Opções de Assinatura';
+$labels['whenreplying'] = 'Ao responder';
+$labels['replytopposting'] = 'criar nova mensagem acima da original';
+$labels['replybottomposting'] = 'criar nova mensagem abaixo da original';
+$labels['replyremovesignature'] = 'Ao responder, remover a assinatura original da mensagem';
+$labels['autoaddsignature'] = 'Adicionar assinatura automaticamente';
+$labels['newmessageonly'] = 'nova mensagem apenas';
+$labels['replyandforwardonly'] = 'respostas e reenvios apenas';
+$labels['replysignaturepos'] = 'Ao responder ou reencaminhar colocar assinatura';
+$labels['belowquote'] = 'depois da citação';
+$labels['abovequote'] = 'antes da citação';
+$labels['insertsignature'] = 'Inserir assinatura';
+$labels['previewpanemarkread'] = 'Marcar mensagem pré-visualizada como lida';
+$labels['afternseconds'] = 'após $n segundos';
+$labels['reqmdn'] = 'Pedir sempre um recibo de leitura';
+$labels['reqdsn'] = 'Pedir sempre um recibo de entrega';
+$labels['replysamefolder'] = 'Guardar as respostas na mesma pasta da mensagem original';
 $labels['folder'] = 'Pasta';
 $labels['folders'] = 'Pastas';
 $labels['foldername'] = 'Nome da pasta';
-$labels['subscribed'] = 'Subscrito';
+$labels['subscribed'] = 'Subscrita';
 $labels['messagecount'] = 'Mensagens';
 $labels['create'] = 'Criar';
 $labels['createfolder'] = 'Criar nova pasta';
-$labels['rename'] = 'Renomear';
-$labels['renamefolder'] = 'Renomear pasta';
-$labels['deletefolder'] = 'Apagar pasta';
 $labels['managefolders'] = 'Gerir pastas';
-$labels['specialfolders'] = 'Pastas especiais';
-$labels['sortby'] = 'Ordenado por';
-$labels['sortasc'] = 'Ascendente';
-$labels['sortdesc'] = 'Descendente';
+$labels['specialfolders'] = 'Pastas especiais (predefinidas)';
+$labels['properties'] = 'Propriedades';
+$labels['folderproperties'] = 'Propriedades da pasta';
+$labels['parentfolder'] = 'Pasta de origem';
+$labels['location'] = 'Localização';
+$labels['info'] = 'Informação';
+$labels['getfoldersize'] = 'Clique para obter o tamanho da pasta';
+$labels['changesubscription'] = 'Clique para alterar a subscrição';
+$labels['sortby'] = 'Ordenar por';
+$labels['sortasc'] = 'Ordenação Ascendente';
+$labels['sortdesc'] = 'Ordenação Descendente';
 $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Inglês';
+$labels['westerneuropean'] = 'Europa Ocidental';
+$labels['easterneuropean'] = 'Europa Leste';
+$labels['southeasterneuropean'] = 'Sudeste Europeu';
+$labels['baltic'] = 'Báltico';
+$labels['cyrillic'] = 'Cirílico';
+$labels['arabic'] = 'Árabe';
+$labels['greek'] = 'Grego';
+$labels['hebrew'] = 'Hebraico';
+$labels['turkish'] = 'Turno';
+$labels['nordic'] = 'Nórdico';
+$labels['thai'] = 'Tailandês';
+$labels['celtic'] = 'Céltico';
+$labels['vietnamese'] = 'Vietnamita';
+$labels['japanese'] = 'Japonês';
+$labels['korean'] = 'Coreano';
+$labels['chinese'] = 'Chinês';
 
 ?>
index 8b335a294fbfe0031be84e43050a94477db288e1..855826d3d44c77d69ee4fad1849f6eb1e03bd4a1 100644 (file)
 +-----------------------------------------------------------------------+
 | language/pt_PT/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Authors: Sergio Rocha <sergio.rocha@makeitsimple.pt>                  |
-|          João Vale <jpvale@gmail.com>                                 |
+|          João Vale <jpvale@gmail.com>                                |
 |         Nuno Costa <nuno@criacaoweb.net>                              |
+|         Teotónio Ricardo <teotonio.ricardo@webtuga.pt>               |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2953 2009-09-13 16:42:56Z yllar $
+@version $Id: messages.inc 4386 2011-01-04 08:35:46Z yllar $
 
 */
 
 $messages = array();
-$messages['loginfailed'] = 'Erro ao entrar';
+$messages['loginfailed'] = 'O utilizador ou palavra-passe que introduziu está incorrecto.';
 $messages['cookiesdisabled'] = 'O seu navegador não suporta cookies';
-$messages['sessionerror'] = 'A sessão do seu navegador é inválida ou expirou';
+$messages['sessionerror'] = 'A sua sessão é inválida ou expirou';
 $messages['imaperror'] = 'A ligação ao servidor IMAP falhou';
 $messages['servererror'] = 'Erro do Servidor!';
-$messages['invalidrequest'] = 'Pedido inválido! Nenhuma informação foi salva.';
+$messages['servererrormsg'] = 'Erro do Servidor: $msg';
+$messages['errorreadonly'] = 'Não foi possível efectuar a operação. A pasta é só de leitura.';
+$messages['errornoperm'] = 'Não tem permissões para efectuar esta operação.';
+$messages['invalidrequest'] = 'Pedido inválido! Não foi guardada nenhuma informação.';
 $messages['nomessagesfound'] = 'Nenhuma mensagem encontrada na caixa de entrada';
-$messages['loggedout'] = 'A sua sessão foi finalizada com sucesso. Até breve!';
+$messages['loggedout'] = 'A sua sessão foi terminada com sucesso. Até breve!';
 $messages['mailboxempty'] = 'A caixa de entrada está vazia';
 $messages['loading'] = 'A carregar...';
+$messages['uploading'] = 'A enviar ficheiro...';
 $messages['loadingdata'] = 'A carregar informações...';
-$messages['checkingmail'] = 'Verificando novas mensagens...';
-$messages['sendingmessage'] = 'Enviando mensagem...';
+$messages['checkingmail'] = 'A verificar novas mensagens...';
+$messages['sendingmessage'] = 'A enviar mensagem...';
 $messages['messagesent'] = 'Mensagem enviada com sucesso';
-$messages['savingmessage'] = 'A gravar a mensagem...';
-$messages['messagesaved'] = 'Mensagem gravada como rascunho';
-$messages['successfullysaved'] = 'Gravado com sucesso';
+$messages['savingmessage'] = 'A guardar mensagem...';
+$messages['messagesaved'] = 'Mensagem guardada como rascunho';
+$messages['successfullysaved'] = 'Guardado com sucesso';
 $messages['addedsuccessfully'] = 'Contacto adicionado com sucesso';
 $messages['contactexists'] = 'Já existe um contacto com esse e-mail';
-$messages['blockedimages'] = 'Para proteger sua privacidade, as imagens desta mensagem foram bloqueadas';
+$messages['blockedimages'] = 'Para proteger sua privacidade, as imagens desta mensagem foram bloqueadas';
 $messages['encryptedmessage'] = 'Esta mensagem está encriptada e não pode ser exibida. Desculpe.';
 $messages['nocontactsfound'] = 'Nenhum contacto encontrado';
 $messages['contactnotfound'] = 'O contacto especificado não foi encontrado';
 $messages['sendingfailed'] = 'Falha no envio da mensagem';
 $messages['senttooquickly'] = 'Por favor espere $sec seg(s). antes de enviar esta mensagem';
-$messages['errorsavingsent'] = 'Ocorreu um erro ao salvar mensagem enviada';
-$messages['errorsaving'] = 'Ocorreu um erro a gravar';
+$messages['errorsavingsent'] = 'Ocorreu um erro ao guardar a mensagem enviada';
+$messages['errorsaving'] = 'Ocorreu um erro ao guardar';
 $messages['errormoving'] = 'Não foi possível mover a mensagem';
+$messages['errorcopying'] = 'Não foi possível copiar a mensagem';
 $messages['errordeleting'] = 'Não foi possível apagar a mensagem';
 $messages['errormarking'] = 'Não foi possível marcar a mensagem.';
-$messages['deletecontactconfirm'] = 'Deseja realmente apagar o(s) contacto(s) selecionado(s)?';
-$messages['deletemessagesconfirm'] = 'Deseja realmente apagar a(s) mensagem(ns) selecionada(s)?';
-$messages['deletefolderconfirm'] = 'Deseja realmente apagar esta pasta?';
-$messages['purgefolderconfirm'] = 'Deseja realmente apagar todas mensagens desta pasta?';
-$messages['foldercreating'] = 'A criar pasta...';
-$messages['folderdeleting'] = 'A apagar pasta...';
-$messages['folderrenaming'] = 'A renomear pasta...';
+$messages['deletecontactconfirm'] = 'Deseja realmente eliminar o(s) contacto(s) selecionado(s)?';
+$messages['deletemessagesconfirm'] = 'Deseja realmente eliminar a(s) mensagem(ns) selecionada(s)?';
+$messages['deletefolderconfirm'] = 'Deseja realmente eliminar esta pasta?';
+$messages['purgefolderconfirm'] = 'Deseja realmente eliminar todas mensagens desta pasta?';
+$messages['folderdeleting'] = 'A eliminar pasta...';
 $messages['foldermoving'] = 'A mover pasta...';
+$messages['foldersubscribing'] = 'A subscrever pasta...';
+$messages['folderunsubscribing'] = 'A cancelar subscrição da pasta...';
 $messages['formincomplete'] = 'Os campos não foram completamente preenchidos';
 $messages['noemailwarning'] = 'Por favor escreva um endereço de e-mail válido';
 $messages['nonamewarning'] = 'Por favor escreva o nome';
 $messages['nopagesizewarning'] = 'Por favor escreva o tamanho da página';
-$messages['nosenderwarning'] = 'Por favor insira endereço de email do remetente';
+$messages['nosenderwarning'] = 'Por favor insira o endereço de e-mail do remetente';
 $messages['norecipientwarning'] = 'Por favor escreva pelo menos um destinatário';
 $messages['nosubjectwarning'] = 'O campo "Assunto" não foi preenchido. Deseja incluí-lo agora?';
 $messages['nobodywarning'] = 'Enviar a mensagem sem texto?';
 $messages['notsentwarning'] = 'A mensagem não foi enviada, deseja apagá-la?';
-$messages['noldapserver'] = 'Selecione um servidor LDAP para a pesquisa';
-$messages['nocontactsreturned'] = 'Nenhum contacto foi encontrado';
-$messages['nosearchname'] = 'Por favor, escreva o nome do contacto ou seu endereço de e-mail';
+$messages['noldapserver'] = 'Seleccione um servidor LDAP para a pesquisa';
+$messages['nocontactsreturned'] = 'Não foi encontrado nenhum contacto';
+$messages['nosearchname'] = 'Por favor, escreva o nome do contacto ou endereço de e-mail';
+$messages['notuploadedwarning'] = 'Nem todos os anexos foram ainda enviados. Por favor aguarde ou cancele o envio.';
 $messages['searchsuccessful'] = '$nr mensagens encontradas';
-$messages['searchnomatch'] = 'Pesquisa não devolveu resultados';
-$messages['searching'] = 'Pesquisando...';
+$messages['searchnomatch'] = 'A pesquisa não devolveu resultados';
+$messages['searching'] = 'A pesquisar...';
 $messages['checking'] = 'A verificar...';
-$messages['nospellerrors'] = 'Nenhum erro ortográfico foi encontrado';
-$messages['folderdeleted'] = 'Pasta apagada com sucesso';
-$messages['deletedsuccessfully'] = 'Apagado com sucesso';
-$messages['converting'] = 'Removendo formatação da mensagem...';
-$messages['messageopenerror'] = 'Não foi possível carregar mensagem';
-$messages['fileuploaderror'] = 'Falha ao puxar o ficheiro';
-$messages['filesizeerror'] = 'O ficheiro excede o tamanho máximo de $size';
+$messages['nospellerrors'] = 'Não foi encontrado nenhum erro ortográfico';
+$messages['folderdeleted'] = 'Pasta eliminada com sucesso';
+$messages['foldersubscribed'] = 'Subscrição da pasta concluída com sucesso';
+$messages['folderunsubscribed'] = 'Subscrição da pasta cancelada com sucesso';
+$messages['folderpurged'] = 'Pasta eliminada com sucesso';
+$messages['folderexpunged'] = 'Pasta compactada com sucesso.';
+$messages['deletedsuccessfully'] = 'Eliminado com sucesso';
+$messages['converting'] = 'A remover a formatação...';
+$messages['messageopenerror'] = 'Não foi possível carregar a mensagem';
+$messages['fileuploaderror'] = 'Falha ao carregar o ficheiro';
+$messages['filesizeerror'] = 'O ficheiro excede o tamanho máximo permitido - $size';
 $messages['copysuccess'] = 'Foram copiados $nr endereços com sucesso';
 $messages['copyerror'] = 'Não foi possível copiar os endereços';
-$messages['sourceisreadonly'] = 'Esta fonte de endereços é só de leitura';
-$messages['errorsavingcontact'] = 'Não foi possível guardar o endereço de contacto';
-$messages['movingmessage'] = 'Movendo mensagem...';
-$messages['receiptsent'] = 'Recibo de leitura enviado';
+$messages['sourceisreadonly'] = 'Esta origem de endereços é só de leitura';
+$messages['errorsavingcontact'] = 'Não foi possível guardar o endereço deste contacto';
+$messages['movingmessage'] = 'A mover mensagem...';
+$messages['copyingmessage'] = 'A copiar mensagem...';
+$messages['deletingmessage'] = 'A eliminar mensagens...';
+$messages['markingmessage'] = 'A marcar mensagens...';
+$messages['receiptsent'] = 'Recibo de leitura enviadocom sucesso';
 $messages['errorsendingreceipt'] = 'Não foi possível enviar o recibo';
-$messages['nodeletelastidentity'] = 'Esta é a última identidade, não é possível apagá-la.';
-$messages['addsubfolderhint'] = 'Esta pasta será criada como uma sub-pasta da que está seleccionada';
-$messages['forbiddencharacter'] = 'O nome da pasta contém um caractere proibido';
-$messages['selectimportfile'] = 'Por favor selecione um ficheiro para submeter';
-$messages['addresswriterror'] = 'Não é possível escrever no livro de endereços selecionado';
-$messages['importwait'] = 'A importar, por favor agurade...';
-$messages['importerror'] = 'Falhou importação! O ficheiro submetido não é um válido ficheiro vCard.';
+$messages['nodeletelastidentity'] = 'Esta é a última identidade, não é possível eliminá-la.';
+$messages['forbiddencharacter'] = 'O nome da pasta contém um caractere inválido';
+$messages['selectimportfile'] = 'Por favor seleccione um ficheiro para carregar';
+$messages['addresswriterror'] = 'Não é possível escrever no livro de endereços seleccionado';
+$messages['contactaddedtogroup'] = 'Contacto adicionado com sucesso a este grupo';
+$messages['contactremovedfromgroup'] = 'Contacto removido com sucesso deste grupo';
+$messages['importwait'] = 'A importar, por favor aguarde...';
+$messages['importerror'] = 'A importação falhou! O ficheiro submetido não é um ficheiro vCard válido.';
 $messages['importconfirm'] = '<b>$inserted contactos importados com sucesso, $skipped contactos já existentes ignorados</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Operação não permitida';
-$messages['nofromaddress'] = 'Falta endereço de email na identidade selecionada';
-$messages['editorwarning'] = 'Ao mudar para o editor plain text vai perder toda a formação de texto. Deseja continuar?';
-$messages['httpreceivedencrypterror'] = 'Ocorreu um erro fatal de configuração. Contacte o seu administrador imediatamente. <b>A sua mensagem não pôde ser enviada.</b>';
-$messages['smtpconnerror'] = 'Erro SMTP ($code): Ligação ao servidor falhou';
-$messages['smtpautherror'] = 'Erro SMTP ($code): Autenticação falhou';
-$messages['smtpfromerror'] = 'Erro SMTP ($code): Falhou a definir remetente "$from"';
-$messages['smtptoerror'] = 'Erro SMTP ($code): Falhou ao adicionar destinatário: "$to"';
-$messages['smtprecipientserror'] = 'Erro SMTP: Impossível analisar lista de destinatários';
+$messages['nofromaddress'] = 'Falta o endereço de e-mail na identidade seleccionada';
+$messages['editorwarning'] = 'Ao mudar para o editor Plain Text vai perder toda a formação de texto. Deseja continuar?';
+$messages['httpreceivedencrypterror'] = 'Ocorreu um erro fatal de configuração. Contacte o seu Administrador imediatamente. <b>A sua mensagem não pôde ser enviada.</b>';
+$messages['smtpconnerror'] = 'Erro SMTP ($code): A ligação ao servidor falhou';
+$messages['smtpautherror'] = 'Erro SMTP ($code): A autenticação falhou';
+$messages['smtpfromerror'] = 'Erro SMTP ($code): Falha ao definir o remetente "$from" ($msg)';
+$messages['smtptoerror'] = 'Erro SMTP ($code): Falha ao adicionar o destinatário: "$to" ($msg)';
+$messages['smtprecipientserror'] = 'Erro SMTP: Impossível analisar a lista de destinatários';
+$messages['smtpdsnerror'] = 'Erro SMTP: Não há suporte para recibo de entrega';
 $messages['smtperror'] = 'Erro SMTP: $msg';
+$messages['emailformaterror'] = 'Endereço de e-mail incorrecto: $email';
+$messages['toomanyrecipients'] = 'Demasiados destinatários. Reduza o numero de destinatários para o máximo de $max.';
+$messages['maxgroupmembersreached'] = 'O número de membros do grupo ultrapassa o máximo permitido de $max.';
+$messages['internalerror'] = 'Ocorreu um erro interno. Por favor, tente de novamente.';
+$messages['contactdelerror'] = 'Não foi possível eliminar os contactos';
+$messages['contactdeleted'] = 'Contactos eliminados com sucesso';
+$messages['groupdeleted'] = 'Grupo eliminado com sucesso';
+$messages['grouprenamed'] = 'Grupo renomeado com sucesso';
+$messages['groupcreated'] = 'Grupo criado com sucesso';
+$messages['messagedeleted'] = 'Mensagens eliminadas com sucesso';
+$messages['messagemoved'] = 'Mensagens movidas com sucesso';
+$messages['messagecopied'] = 'Mensagens copiadas com sucesso';
+$messages['messagemarked'] = 'Mensagens marcadas com sucesso';
+$messages['autocompletechars'] = 'Indique pelo menos $min caracteres para auto completar';
+$messages['namecannotbeempty'] = 'O nome não pode estar em branco';
+$messages['nametoolong'] = 'O nome é demasiado longo';
+$messages['folderupdated'] = 'Actualização da pasta concluída com sucesso';
+$messages['foldercreated'] = 'Pasta criada com sucesso';
 
 ?>
index eeb4d429e4f03a7375085f633b47e656849e5cda..e4126afd188efd88a9d2ef70d8a75d8470a926ee 100644 (file)
@@ -4,8 +4,8 @@
 +-----------------------------------------------------------------------+
 | language/ro_RO/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 |         Cristian Nastase <cristian.nastase@itcaffe.net>               |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2994 2009-09-27 14:16:33Z yllar $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -26,7 +26,7 @@ $labels['server'] = 'Server';
 $labels['login'] = 'Autentificare';
 $labels['logout'] = 'Deconectare';
 $labels['mail'] = 'E-Mail';
-$labels['settings'] = 'Setări Personale';
+$labels['settings'] = 'Setări personale';
 $labels['addressbook'] = 'Agendă';
 $labels['inbox'] = 'Primite';
 $labels['drafts'] = 'Ciorne';
@@ -38,22 +38,22 @@ $labels['from'] = 'Expeditor';
 $labels['to'] = 'Destinatar';
 $labels['cc'] = 'Copie (CC)';
 $labels['bcc'] = 'Copie oarbă (BCC)';
-$labels['replyto'] = 'Răspunde-La';
+$labels['replyto'] = 'Răspunde la';
 $labels['date'] = 'Data';
 $labels['size'] = 'Mărime';
 $labels['priority'] = 'Prioritate';
 $labels['organization'] = 'Organizaţie';
-$labels['reply-to'] = 'Răspunde-La';
+$labels['reply-to'] = 'Răspunde la';
 $labels['mailboxlist'] = 'Dosare';
 $labels['messagesfromto'] = 'Mesaje de la $from până la $to din $count';
+$labels['threadsfromto'] = 'Grupuri de la $from până la $to din $count';
 $labels['messagenrof'] = '$nr mesaje din $count';
+$labels['copy'] = 'Copiază';
+$labels['move'] = 'Mută';
 $labels['moveto'] = 'Mută in...';
 $labels['download'] = 'Descarcă';
 $labels['filename'] = 'Nume fişier';
 $labels['filesize'] = 'Mărime fişier';
-$labels['preferhtml'] = 'Format HTML';
-$labels['htmlmessage'] = 'Mesaj HTML';
-$labels['prettydate'] = 'Dată formatată';
 $labels['addtoaddressbook'] = 'Adaugă în agendă';
 $labels['sun'] = 'Dum';
 $labels['mon'] = 'Lun';
@@ -121,12 +121,34 @@ $labels['messageactions'] = 'Mai multe acţiuni...';
 $labels['select'] = 'Selectează';
 $labels['all'] = 'Toate';
 $labels['none'] = 'Nici unul';
+$labels['currpage'] = 'Pagina curentă';
 $labels['unread'] = 'Necitite';
 $labels['flagged'] = 'Marcat';
 $labels['unanswered'] = 'Fără răspuns';
 $labels['deleted'] = 'Şterse';
 $labels['invert'] = 'Inversează';
 $labels['filter'] = 'Filtru';
+$labels['list'] = 'Listă';
+$labels['threads'] = 'Grupare după subiect';
+$labels['expand-all'] = 'Extinde toate';
+$labels['expand-unread'] = 'Extinde necitite';
+$labels['collapse-all'] = 'Compactează toate';
+$labels['threaded'] = 'Grupate';
+$labels['autoexpand_threads'] = 'Extinde mesajele grupate';
+$labels['do_expand'] = 'toate grupările';
+$labels['expand_only_unread'] = 'doar pe cele cu mesaje necitite';
+$labels['fromto'] = 'Expeditor/Destinatar';
+$labels['flag'] = 'Marcaj';
+$labels['attachment'] = 'Ataşament';
+$labels['nonesort'] = 'Fără sortare';
+$labels['sentdate'] = 'Data trimiterii';
+$labels['arrival'] = 'Data primirii';
+$labels['asc'] = 'ascendent';
+$labels['desc'] = 'descendent';
+$labels['listcolumns'] = 'Arată coloane';
+$labels['listsorting'] = 'Sortează după';
+$labels['listorder'] = 'Ordinea de sortare';
+$labels['listmode'] = 'Mod de vizualizare';
 $labels['compact'] = 'Compactează';
 $labels['empty'] = 'Goleşte';
 $labels['purge'] = 'Curăţă';
@@ -134,13 +156,13 @@ $labels['quota'] = 'Spaţiu folosit';
 $labels['unknown'] = 'necunoscut';
 $labels['unlimited'] = 'nelimitat';
 $labels['quicksearch'] = 'Căutare rapidă';
-$labels['resetsearch'] = 'Resetare căutare';
+$labels['resetsearch'] = 'Anulează căutarea';
 $labels['searchmod'] = 'Parametrii de căutare';
 $labels['msgtext'] = 'Tot mesajul';
 $labels['openinextwin'] = 'Deschide într-o fereastră nouă';
 $labels['emlsave'] = 'Salvează în format .eml';
 $labels['compose'] = 'Scrie un mesaj';
-$labels['editasnew'] = 'Editeză ca nou';
+$labels['editasnew'] = 'Editează ca nou';
 $labels['savemessage'] = 'Salvează această ciornă';
 $labels['sendmessage'] = 'Trimite mesaj';
 $labels['addattachment'] = 'Ataşează fişier';
@@ -149,7 +171,7 @@ $labels['editortype'] = 'Tip de editor';
 $labels['returnreceipt'] = 'Returnează confirmare de primire';
 $labels['checkspelling'] = 'Verifică ortografie';
 $labels['resumeediting'] = 'Reia editarea';
-$labels['revertto'] = 'Revină la';
+$labels['revertto'] = 'Revino la';
 $labels['attachments'] = 'Ataşamente';
 $labels['upload'] = 'Încarcă';
 $labels['close'] = 'Închide';
@@ -190,17 +212,20 @@ $labels['contactsfromto'] = 'Contacte de la $from până la $to din $count';
 $labels['print'] = 'Listează';
 $labels['export'] = 'Exportă';
 $labels['exportvcards'] = 'Exportă contactele în format vCard';
+$labels['newcontactgroup'] = 'Creează un nou grup de contacte';
+$labels['groupactions'] = 'Acţiuni pentru grupurile de contacte ...';
 $labels['previouspage'] = 'Pagina anterioară';
 $labels['firstpage'] = 'Arată primul set';
 $labels['nextpage'] = 'Pagina următoare';
 $labels['lastpage'] = 'Arată ultimul set';
+$labels['group'] = 'Grup';
 $labels['groups'] = 'Grupuri';
 $labels['personaladrbook'] = 'Adrese personale';
 $labels['import'] = 'Importă';
 $labels['importcontacts'] = 'Importă contacte';
 $labels['importfromfile'] = 'Importă din fişier:';
 $labels['importreplace'] = 'Înlocuieşte întreaga agendă';
-$labels['importtext'] = 'Puteţi încărca contacte dintr-o agendă existentă.Se pot importa adresele în format vCard.';
+$labels['importtext'] = 'Puteţi încărca contacte dintr-o agendă existentă. Se pot importa adresele în format vCard.';
 $labels['done'] = 'Finalizat';
 $labels['settingsfor'] = 'Setări pentru';
 $labels['preferences'] = 'Preferinţe';
@@ -211,6 +236,10 @@ $labels['manageidentities'] = 'Administrează identităţi pentru acest cont';
 $labels['newidentity'] = 'Identitate nouă';
 $labels['newitem'] = 'Obiect nou';
 $labels['edititem'] = 'Editează obiect';
+$labels['preferhtml'] = 'Format HTML';
+$labels['defaultcharset'] = 'Set implicit de caractere';
+$labels['htmlmessage'] = 'Mesaj HTML';
+$labels['prettydate'] = 'Dată formatată';
 $labels['setdefault'] = 'Setează implicit';
 $labels['autodetect'] = 'Automat';
 $labels['language'] = 'Limba';
@@ -226,7 +255,7 @@ $labels['logoutclear'] = 'Goleşte Coşul de Gunoi la deconectare';
 $labels['logoutcompact'] = 'Compactează dosarul Primite la deconectare';
 $labels['uisettings'] = 'Interfaţă utilizator';
 $labels['serversettings'] = 'Configuraţii server';
-$labels['mailboxview'] = 'Afişare Mailbox';
+$labels['mailboxview'] = 'Afişare căsuţă poştală';
 $labels['mdnrequests'] = 'Notificări expeditor';
 $labels['askuser'] = 'întreabă utilizatorul';
 $labels['autosend'] = 'trimite automat';
@@ -234,30 +263,46 @@ $labels['ignore'] = 'ignoră';
 $labels['readwhendeleted'] = 'Marchează mesajul ca şi citit la ştergere';
 $labels['flagfordeletion'] = 'Marchează mesajul pentru ştergere în loc de a-l şterge direct';
 $labels['skipdeleted'] = 'Nu arăta mesajele şterse';
+$labels['deletealways'] = 'Dacă mutarea mesajelor în coş eşuează, se vor şterge';
 $labels['showremoteimages'] = 'Arată imaginile care nu fac parte din e-mail';
 $labels['fromknownsenders'] = 'de la expeditori cunoscuţi';
 $labels['always'] = 'întotdeauna';
 $labels['showinlineimages'] = 'Arată imaginile ataşate sub mesaj';
 $labels['autosavedraft'] = 'Salvează ciorna automat';
-$labels['everynminutes'] = 'fiecare $n minut(e)';
+$labels['everynminutes'] = 'la fiecare $n minut(e)';
 $labels['keepalive'] = 'Verifică mesaje noi la';
 $labels['never'] = 'niciodată';
-$labels['messagesdisplaying'] = 'Afişarea Mesajelor';
-$labels['messagescomposition'] = 'Compunerea Mesajelor';
+$labels['immediately'] = 'imediat';
+$labels['messagesdisplaying'] = 'Afişarea mesajelor';
+$labels['messagescomposition'] = 'Compunerea mesajelor';
 $labels['mimeparamfolding'] = 'Nume ataşamente';
 $labels['2231folding'] = 'RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'RFC 2047 (Altele)';
-$labels['advancedoptions'] = 'Opţiuni Avansate';
-$labels['focusonnewmessage'] = 'Focus pe fereastra browser-ului la mesaje noi';
+$labels['force7bit'] = 'Foloseşte encodarea MIME pentru caracterele cu 8 biţi';
+$labels['advancedoptions'] = 'Opţiuni avansate';
+$labels['focusonnewmessage'] = 'Focalizare pe fereastra browser-ului la mesaje noi';
 $labels['checkallfolders'] = 'Verifică toate dosarele pentru mesaje noi';
 $labels['displaynext'] = 'După ştergerea sau mutarea unui mesaj afişează-l pe următorul din listă';
-$labels['indexsort'] = 'Folosiţi indexul de sortare după dată';
 $labels['mainoptions'] = 'Opţiuni principale';
 $labels['section'] = 'Secţiune';
 $labels['maintenance'] = 'Mentenanţă';
-$labels['newmessage'] = 'Mesaj Nou';
+$labels['newmessage'] = 'Mesaj nou';
 $labels['listoptions'] = 'Opţiuni listă';
+$labels['signatureoptions'] = 'Opţiuni semnătură';
+$labels['whenreplying'] = 'Când răspundeţi';
+$labels['replytopposting'] = 'începeţi mesajul nou deasupra originalului';
+$labels['replybottomposting'] = 'începeţi mesajul nou dedesubtul originalului';
+$labels['replyremovesignature'] = 'Când răspundeţi, se şterge semnătura originală din mesaj';
+$labels['autoaddsignature'] = 'Adăugarea automată a semnăturii';
+$labels['newmessageonly'] = 'numai la mesajele noi';
+$labels['replyandforwardonly'] = 'numai la răspunsuri si cele trimise mai departe';
+$labels['replysignaturepos'] = 'Când răspundeţi sau trimiteţi mai departe, semnătura se va plasa';
+$labels['belowquote'] = 'dedesubtul citatului';
+$labels['abovequote'] = 'deasupra citatului';
+$labels['insertsignature'] = 'Introduce o semnătură';
+$labels['previewpanemarkread'] = 'Marchează mesajele previzualizate ca citite';
+$labels['afternseconds'] = 'după $n secunde';
 $labels['folder'] = 'Dosar';
 $labels['folders'] = 'Dosare';
 $labels['foldername'] = 'Nume dosar';
@@ -265,9 +310,6 @@ $labels['subscribed'] = 'Înscris';
 $labels['messagecount'] = 'Mesaje';
 $labels['create'] = 'Creează';
 $labels['createfolder'] = 'Creează dosar nou';
-$labels['rename'] = 'Redenumeşte';
-$labels['renamefolder'] = 'Redenumeşte dosar';
-$labels['deletefolder'] = 'Şterge dosar';
 $labels['managefolders'] = 'Administrează dosare';
 $labels['specialfolders'] = 'Dosare speciale';
 $labels['sortby'] = 'Sortează după';
@@ -277,4 +319,23 @@ $labels['B'] = 'O';
 $labels['KB'] = 'KO';
 $labels['MB'] = 'MO';
 $labels['GB'] = 'GO';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Englezesc';
+$labels['westerneuropean'] = 'Europa de Vest';
+$labels['easterneuropean'] = 'Europa de Est';
+$labels['southeasterneuropean'] = 'Europa de Sud-Est';
+$labels['baltic'] = 'Baltic';
+$labels['cyrillic'] = 'Chirilic';
+$labels['arabic'] = 'Arab';
+$labels['greek'] = 'Grecesc';
+$labels['hebrew'] = 'Evreiesc';
+$labels['turkish'] = 'Turcesc';
+$labels['nordic'] = 'Ţările Nordice';
+$labels['thai'] = 'Tailandez';
+$labels['celtic'] = 'Celtic';
+$labels['vietnamese'] = 'Vietnamez';
+$labels['japanese'] = 'Japonez';
+$labels['korean'] = 'Coreean';
+$labels['chinese'] = 'Chinezesc';
+
 ?>
\ No newline at end of file
index 890a0d8c1e2eefb9eab875955bbd73522b63e806..1f8cf73373c2c806c8c1459f2c3305bce1dbd5ce 100644 (file)
@@ -4,17 +4,17 @@
 +-----------------------------------------------------------------------+
 | language/ro_RO/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Daniel Anechitoaie - danieLs <daniels@safereaction.ro>        |
 |         Zeno Popovici <zeno.popovici at ulbsibiu.ro>                  |
-|                Cristian Nastase <cristian.nastase@itcaffe.net>                               |
+|         Cristian Nastase <cristian.nastase@itcaffe.net>               |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2994 2009-09-27 14:16:33Z yllar $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -29,6 +29,7 @@ $messages['nomessagesfound'] = 'Nu a fost găsit nici un mesaj în această căs
 $messages['loggedout'] = 'Sesiune încheiată cu succes. La revedere!';
 $messages['mailboxempty'] = 'Căsuţa poştală este goală';
 $messages['loading'] = 'Se încarcă...';
+$messages['uploading'] = 'Fişierul se încarcă...';
 $messages['loadingdata'] = 'Se încarcă informaţiile...';
 $messages['checkingmail'] = 'Se caută mesaje noi...';
 $messages['sendingmessage'] = 'Trimitere mesaj...';
@@ -46,16 +47,15 @@ $messages['sendingfailed'] = 'Nu s-a reuşit trimiterea mesajului';
 $messages['senttooquickly'] = 'Vă rugăm aşteptaţi $sec sec. înainte de a trimite acest mesaj';
 $messages['errorsavingsent'] = 'A intervenit o eroare în timp ce se efectua salvarea mesajului trimis';
 $messages['errorsaving'] = 'A intervenit o eroare în timp ce se efectua salvarea';
-$messages['errormoving'] = 'Nu s-a putut muta mesajul';
-$messages['errordeleting'] = 'Nu s-a putut şterge mesajul';
-$messages['errormarking'] = 'Nu s-a putut marca mesajul';
+$messages['errormoving'] = 'Mesajul(e) nu a(u) putut fi mutat(e)';
+$messages['errorcopying'] = 'Mesajul(e) nu a(u) putut fi copiat(e)';
+$messages['errordeleting'] = 'Mesajul(e) nu a(u) putut fi şters(e)';
+$messages['errormarking'] = 'Mesajul(e) nu a(u) putut fi marcat(e)';
 $messages['deletecontactconfirm'] = 'Sunteţi sigur că doriţi să ştergeţi contactul(ele) selectate?';
 $messages['deletemessagesconfirm'] = 'Chiar doriţi să ştergeţi mesajele selectate ?';
 $messages['deletefolderconfirm'] = 'Sunteţi sigur că doriţi să ştergeţi acest dosar?';
 $messages['purgefolderconfirm'] = 'Sunteţi sigur că doriţi să ştergeţi toate mesajele din acest dosar?';
-$messages['foldercreating'] = 'Se creează dosarul...';
 $messages['folderdeleting'] = 'Se şterge dosarul...';
-$messages['folderrenaming'] = 'Se redenumeşte dosarul...';
 $messages['foldermoving'] = 'Se mută dosarul...';
 $messages['formincomplete'] = 'Formularul nu a fost completat corect';
 $messages['noemailwarning'] = 'Vă rugăm să introduceţi o adresă de e-mail validă';
@@ -69,11 +69,12 @@ $messages['notsentwarning'] = 'Mesajul nu a fost trimis. Vreţi să renunţaţi
 $messages['noldapserver'] = 'Vă rugăm să alegeţi un server ldap pentru căutare';
 $messages['nocontactsreturned'] = 'Nu s-a găsit nici un contact';
 $messages['nosearchname'] = 'Vă rugăm să introduceţi un nume de contact sau adresă de e-mail';
+$messages['notuploadedwarning'] = 'Nu toate fişierele au fost ataşate. Vă rugăm să aşteptaţi sau să anulaţi încărcarea acestora.';
 $messages['searchsuccessful'] = '$nr mesaje găsite';
-$messages['searchnomatch'] = 'Căutarea nu a returnat nici un rezultat';
+$messages['searchnomatch'] = 'Căutarea nu a returnat niciun rezultat';
 $messages['searching'] = 'Se caută...';
 $messages['checking'] = 'Se verifică...';
-$messages['nospellerrors'] = 'Nu s-a găsit nici-o greşeală de ortografie';
+$messages['nospellerrors'] = 'Nu s-a găsit nicio greşeală de ortografie';
 $messages['folderdeleted'] = 'Dosarul a fost şters cu succes';
 $messages['deletedsuccessfully'] = 'Mesaj şters cu succes !';
 $messages['converting'] = 'Resetez mesajul la parametrii iniţiali...';
@@ -81,17 +82,19 @@ $messages['messageopenerror'] = 'Nu s-a putut încărca mesajul din server';
 $messages['fileuploaderror'] = 'Încărcarea pe server a eşuat';
 $messages['filesizeerror'] = 'Fişierul încărcat depăşeşte mărimea de $size';
 $messages['copysuccess'] = '$nr adrese s-au copiat cu succes';
-$messages['copyerror'] = 'Nu s-a putut copia nici-o adresă';
+$messages['copyerror'] = 'Nu s-a putut copia nicio adresă';
 $messages['sourceisreadonly'] = 'Sursa acestei adrese este "read-only"(se poate doar citi)';
 $messages['errorsavingcontact'] = 'Nu s-a putut salva adresa de contact';
 $messages['movingmessage'] = 'Mutare mesaj....';
+$messages['copyingmessage'] = 'Copiere mesaj...';
 $messages['receiptsent'] = 'Confirmarea de citire a fost trimisă cu succes';
 $messages['errorsendingreceipt'] = 'Confirmarea nu a putut fi trimisă';
 $messages['nodeletelastidentity'] = 'Nu puteţi şterge această identitate, este ultima.';
-$messages['addsubfolderhint'] = 'Acest dosar va fi creat ca subdosar al celui selectat.';
 $messages['forbiddencharacter'] = 'Numele dosarului conţine un caracter nepermis.';
 $messages['selectimportfile'] = 'Va rugăm să selectaţi fişierul pentru încărcare';
 $messages['addresswriterror'] = 'Agenda selectată nu poate fi actualizată';
+$messages['contactaddedtogroup'] = 'Contactele au fost adăugate cu succes la acest grup';
+$messages['contactremovedfromgroup'] = 'Contactele au fost şterse cu succes din acest grup';
 $messages['importwait'] = 'Datele sunt importate, vă rugăm să aşteptaţi...';
 $messages['importerror'] = 'Importul a eşuat! Fişierul încărcat nu este un fişier vCard valid.';
 $messages['importconfirm'] = 'Contactele $inserted au fost importate cu succes, $skipped intrări au fost ignorate deoarece ele există deja:$names';
@@ -99,10 +102,14 @@ $messages['opnotpermitted'] = 'Operaţia nu este permisă!';
 $messages['nofromaddress'] = 'Nu există o adresă de e-mail în identitatea selectată';
 $messages['editorwarning'] = 'Trecerea în mod text a editorului va cauza pierderea formatării textului. Doriţi să continuaţi?';
 $messages['httpreceivedencrypterror'] = 'Vă rugăm să luaţi legătura cu administratorul serverului de mail, deoarece există o eroare în configuraţia acestuia. Mesajul d-voastră nu a fost trimis.';
-$messages['smtpconnerror'] = 'Eroare SMTP  ($code): Conexiunea cu serverul a eşuat';
-$messages['smtpautherror'] = 'Eroare SMTP  ($code): Autentificare eşuată';
-$messages['smtpfromerror'] = 'Eroare SMTP  ($code): Nu s-a putut seta expeditorul "$from"';
-$messages['smtptoerror'] = 'Eroare SMTP  ($code): Nu s-a putut adăuga destinatarul "$to"';
+$messages['smtpconnerror'] = 'Eroare SMTP ($code): Conexiunea cu serverul a eşuat';
+$messages['smtpautherror'] = 'Eroare SMTP ($code): Autentificare eşuată';
+$messages['smtpfromerror'] = 'Eroare SMTP ($code): Nu s-a putut seta expeditorul "$from" ($msg)';
+$messages['smtptoerror'] = 'Eroare SMTP ($code): Nu s-a putut adăuga destinatarul "$to" ($msg)';
 $messages['smtprecipientserror'] = 'Eroare SMTP: Nu s-a putut procesa lista cu destinatari';
 $messages['smtperror'] = 'Eroare SMTP: $msg';
-?>
\ No newline at end of file
+$messages['emailformaterror'] = 'Adresă de e-mail incorectă: $email';
+$messages['toomanyrecipients'] = 'Prea mulţi destinatari. Reduceţi numărul de destinatari la $max.';
+$messages['maxgroupmembersreached'] = 'Numărul de membri ai grupului depăşeşte maximul de $max.';
+
+?>
index 2bdfaa5c0276271d1d1434dfc64781572f6f353e..a1968cc1fa018f6a0943ec420fc77575235353f4 100644 (file)
@@ -5,15 +5,17 @@
 +-----------------------------------------------------------------------+
 | language/ru_RU/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Artur Smolkin <artsmolkin@ya.ru>                              |
+| Author: Artur Smolkin <artsmolkin@gmail.com>                          |
+| Updates: Sergey Dukachev <iam@dukess.ru>                              |
+| Support: www.roundcube.ru                                             |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 3061 2009-10-26 21:42:58Z yllar $
+@version $Id: labels.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -38,21 +40,22 @@ $labels['to'] = 'Кому';
 $labels['cc'] = 'Копия';
 $labels['bcc'] = 'Скрытая';
 $labels['replyto'] = 'Ответить';
+$labels['followupto'] = 'Followup-To';
 $labels['date'] = 'Дата';
 $labels['size'] = 'Размер';
 $labels['priority'] = 'Приоритет';
 $labels['organization'] = 'Организация';
-$labels['reply-to'] = 'Ответить';
+$labels['readstatus'] = 'Статус прочтения';
 $labels['mailboxlist'] = 'Папки';
 $labels['messagesfromto'] = 'Сообщения с $from по $to из $count';
+$labels['threadsfromto'] = 'Обсуждения с $from по $to из $count';
 $labels['messagenrof'] = 'Сообщение $nr из $count';
+$labels['copy'] = 'Копировать';
+$labels['move'] = 'Переместить';
 $labels['moveto'] = 'Переместить в...';
 $labels['download'] = 'Загрузить';
 $labels['filename'] = 'Имя файла';
 $labels['filesize'] = 'Размер файла';
-$labels['preferhtml'] = 'Предпочитать HTML';
-$labels['htmlmessage'] = 'Сообщение HTML';
-$labels['prettydate'] = 'Красивые даты';
 $labels['addtoaddressbook'] = 'Добавить в контакты';
 $labels['sun'] = 'Вс';
 $labels['mon'] = 'Пн';
@@ -96,7 +99,9 @@ $labels['today'] = 'Сегодня';
 $labels['checkmail'] = 'Доставить почту';
 $labels['writenewmessage'] = 'Новое сообщение';
 $labels['replytomessage'] = 'Ответить';
-$labels['replytoallmessage'] = 'Ответить всем';
+$labels['replytoallmessage'] = 'Ответить по списку или отправителю и всем получателям';
+$labels['replyall'] = 'Ответить всем';
+$labels['replylist'] = 'Ответить в список рассылки';
 $labels['forwardmessage'] = 'Переслать';
 $labels['deletemessage'] = 'В корзину';
 $labels['movemessagetotrash'] = 'Переместить сообщение в корзину';
@@ -120,12 +125,35 @@ $labels['messageactions'] = 'Еще действия...';
 $labels['select'] = 'Выбрать';
 $labels['all'] = 'Все';
 $labels['none'] = 'Ничего';
+$labels['currpage'] = 'Текущая страница';
 $labels['unread'] = 'Непрочитанные';
 $labels['flagged'] = 'Помеченные';
 $labels['unanswered'] = 'Неотвеченные';
 $labels['deleted'] = 'Удаленное';
 $labels['invert'] = 'Инвертное';
 $labels['filter'] = 'Фильтр';
+$labels['list'] = 'Список';
+$labels['threads'] = 'Обсуждения';
+$labels['expand-all'] = 'Развернуть все';
+$labels['expand-unread'] = 'Развернуть непрочитанные';
+$labels['collapse-all'] = 'Свернуть все';
+$labels['threaded'] = 'Обсуждения';
+$labels['autoexpand_threads'] = 'Развернуть обсуждения';
+$labels['do_expand'] = 'все обсуждения';
+$labels['expand_only_unread'] = 'только с непрочитанными сообщениями';
+$labels['fromto'] = 'Отправитель/Получатель';
+$labels['flag'] = 'Флаг';
+$labels['attachment'] = 'Вложение';
+$labels['nonesort'] = 'Отсутствует';
+$labels['sentdate'] = 'Дата отправки';
+$labels['arrival'] = 'Дата получения';
+$labels['asc'] = 'по возрастанию';
+$labels['desc'] = 'по убыванию';
+$labels['listcolumns'] = 'Колонки';
+$labels['listsorting'] = 'Сортировать по';
+$labels['listorder'] = 'Порядок сортировки';
+$labels['listmode'] = 'Режим просмотра';
+$labels['folderactions'] = 'Операции над папкой...';
 $labels['compact'] = 'Сжать';
 $labels['empty'] = 'Опустошить';
 $labels['purge'] = 'Очистить';
@@ -146,12 +174,15 @@ $labels['addattachment'] = 'Добавить вложение';
 $labels['charset'] = 'Кодировка';
 $labels['editortype'] = 'Редактор';
 $labels['returnreceipt'] = 'Запрос ответа';
+$labels['dsn'] = 'Уведомление о состоянии доставки';
+$labels['editidents'] = 'Изменить данные';
 $labels['checkspelling'] = 'Проверить орфографию';
 $labels['resumeediting'] = 'Продолжить редактирование';
 $labels['revertto'] = 'Отменить правки';
 $labels['attachments'] = 'Вложения';
 $labels['upload'] = 'Загрузить';
 $labels['close'] = 'Закрыть';
+$labels['messageoptions'] = 'Настройки сообщений...';
 $labels['low'] = 'Низкий';
 $labels['lowest'] = 'Нижайш.';
 $labels['normal'] = 'Норм.';
@@ -168,6 +199,7 @@ $labels['maxuploadsize'] = 'Максимальный размер файла $si
 $labels['addcc'] = 'Копия';
 $labels['addbcc'] = 'Скрытая копия';
 $labels['addreplyto'] = 'Кому ответить';
+$labels['addfollowupto'] = 'Добавить Followup-To';
 $labels['mdnrequest'] = 'Отправитель этого сообщения запросил уведомление о прочтении. Отправить уведомление?';
 $labels['receiptread'] = 'Уведомление о прочтении';
 $labels['yourmessage'] = 'Это уведомление о прочтении вашего сообщения';
@@ -178,6 +210,8 @@ $labels['surname'] = 'Фамилия';
 $labels['email'] = 'E-Mail';
 $labels['addcontact'] = 'Добавить выбранные контакты в список контактов';
 $labels['editcontact'] = 'Редактировать контакт';
+$labels['contacts'] = 'Контакты';
+$labels['contactproperties'] = 'Свойства контакта';
 $labels['edit'] = 'Правка';
 $labels['cancel'] = 'Отмена';
 $labels['save'] = 'Сохранить';
@@ -189,10 +223,13 @@ $labels['contactsfromto'] = 'Контакты с $from по $to из $count';
 $labels['print'] = 'Печать';
 $labels['export'] = 'Экспорт';
 $labels['exportvcards'] = 'Экспортировать контакты в формате vCard';
+$labels['newcontactgroup'] = 'Создать группу контактов';
+$labels['groupactions'] = 'Действия для групп контактов';
 $labels['previouspage'] = 'Показать предыдущий';
 $labels['firstpage'] = 'Показать первый';
 $labels['nextpage'] = 'Показать следующий';
 $labels['lastpage'] = 'Показать последний';
+$labels['group'] = 'Группа';
 $labels['groups'] = 'Группы';
 $labels['personaladrbook'] = 'Персональные адреса';
 $labels['import'] = 'Импортировать';
@@ -210,6 +247,10 @@ $labels['manageidentities'] = 'Управление профилями';
 $labels['newidentity'] = 'Новый профиль';
 $labels['newitem'] = 'Новый';
 $labels['edititem'] = 'Правка';
+$labels['preferhtml'] = 'Предпочитать HTML';
+$labels['defaultcharset'] = 'Набор символов по-умолчанию';
+$labels['htmlmessage'] = 'Сообщение HTML';
+$labels['prettydate'] = 'Красивые даты';
 $labels['setdefault'] = 'Использовать по умолчанию';
 $labels['autodetect'] = 'Определять автоматически';
 $labels['language'] = 'Язык';
@@ -218,6 +259,7 @@ $labels['pagesize'] = 'Строк на странице';
 $labels['signature'] = 'Подпись';
 $labels['dstactive'] = 'Летнее время';
 $labels['htmleditor'] = 'Создавать сообщения в HTML';
+$labels['htmlonreply'] = 'только в ответ на сообщение в HTML';
 $labels['htmlsignature'] = 'Подпись в HTML';
 $labels['previewpane'] = 'Показать панель превью';
 $labels['skin'] = 'Стиль оформления';
@@ -229,10 +271,13 @@ $labels['mailboxview'] = 'Вид почтового ящика';
 $labels['mdnrequests'] = 'Уведомления о прочтении';
 $labels['askuser'] = 'спросить перед отправкой';
 $labels['autosend'] = 'отправлять автоматически';
+$labels['autosendknown'] = 'отправлять уведомления контактам из адресной книги, в противном случае спросить';
+$labels['autosendknownignore'] = 'отправлять уведомления только контактам из адресной книги, остальных игнорировать';
 $labels['ignore'] = 'игнорировать';
 $labels['readwhendeleted'] = 'Помечать как прочитанное при удалении';
 $labels['flagfordeletion'] = 'Помечать для удаления вместо удаления';
 $labels['skipdeleted'] = 'Не показывать удаленные сообщения';
+$labels['deletealways'] = 'Удалять сообщения, если не получается поместить их в корзину';
 $labels['showremoteimages'] = 'Показывать удаленные изображения';
 $labels['fromknownsenders'] = 'от известных отправителей';
 $labels['always'] = 'всегда';
@@ -241,22 +286,40 @@ $labels['autosavedraft'] = 'Автосохранение черновика';
 $labels['everynminutes'] = 'каждые $n минут';
 $labels['keepalive'] = 'Проверять новые сообщения';
 $labels['never'] = 'никогда';
+$labels['immediately'] = 'немедленно';
 $labels['messagesdisplaying'] = 'Отображение сообщений';
 $labels['messagescomposition'] = 'Создание сообщений';
 $labels['mimeparamfolding'] = 'Имена вложений';
 $labels['2231folding'] = 'RFC 2231 (только для новейших программ)';
 $labels['miscfolding'] = 'RFC 2047/2231  (наибольшая совместимость)';
 $labels['2047folding'] = 'RFC 2047  (для старых программ)';
+$labels['force7bit'] = 'Использовать MIME для 8-битных символов';
 $labels['advancedoptions'] = 'Дополнительные настройки';
 $labels['focusonnewmessage'] = 'Фокусировать окно браузера при новом сообщении';
 $labels['checkallfolders'] = 'Проверять новые сообщения во всех папках';
 $labels['displaynext'] = 'Показать следующее сообщение, после удаления или перемещения данного';
-$labels['indexsort'] = 'Использовать индекс сообщений для сортировки по дате';
 $labels['mainoptions'] = 'Основные настройки';
 $labels['section'] = 'Раздел';
 $labels['maintenance'] = 'Обслуживание';
 $labels['newmessage'] = 'Новое сообщение';
 $labels['listoptions'] = 'Список настроек';
+$labels['signatureoptions'] = 'Опции подписи';
+$labels['whenreplying'] = 'При ответе';
+$labels['replytopposting'] = 'начать новое сообщение перед цитируемым';
+$labels['replybottomposting'] = 'начать новое сообщение после цитируемого';
+$labels['replyremovesignature'] = 'Удалить подпись при ответе';
+$labels['autoaddsignature'] = 'Автоматически добавлять подпись';
+$labels['newmessageonly'] = 'только в новых сообщениях';
+$labels['replyandforwardonly'] = 'только в ответах и пересылках';
+$labels['replysignaturepos'] = 'Прикрепить подпись при ответе и пересылке';
+$labels['belowquote'] = 'после цитаты';
+$labels['abovequote'] = 'до цитаты';
+$labels['insertsignature'] = 'Вставить подпись';
+$labels['previewpanemarkread'] = 'Отмечать просмотренные сообщения как прочитанные';
+$labels['afternseconds'] = 'через $n секунд';
+$labels['reqmdn'] = 'Всегда запрашивать уведомление о доставке';
+$labels['reqdsn'] = 'Всегда запрашивать уведомление о состоянии доставки';
+$labels['replysamefolder'] = 'Помещать ответы в ту же папку, где находится оригинал';
 $labels['folder'] = 'Папка';
 $labels['folders'] = 'Папки';
 $labels['foldername'] = 'Имя папки';
@@ -264,11 +327,15 @@ $labels['subscribed'] = 'Подписан';
 $labels['messagecount'] = 'Сообщения';
 $labels['create'] = 'Создать';
 $labels['createfolder'] = 'Создать новую папку';
-$labels['rename'] = 'Переименовать';
-$labels['renamefolder'] = 'Переименовать папку';
-$labels['deletefolder'] = 'Удалить папку';
 $labels['managefolders'] = 'Управление папками';
 $labels['specialfolders'] = 'Особые папки';
+$labels['properties'] = 'Свойства';
+$labels['folderproperties'] = 'Свойства папки';
+$labels['parentfolder'] = 'Родительская папка';
+$labels['location'] = 'Расположение';
+$labels['info'] = 'Информация';
+$labels['getfoldersize'] = 'Показать размер папки';
+$labels['changesubscription'] = 'Изменить подписку';
 $labels['sortby'] = 'Сортировать по';
 $labels['sortasc'] = 'Возрастанию';
 $labels['sortdesc'] = 'Убыванию';
@@ -276,5 +343,23 @@ $labels['B'] = 'Б';
 $labels['KB'] = 'КБ';
 $labels['MB'] = 'МБ';
 $labels['GB'] = 'ГБ';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Английский';
+$labels['westerneuropean'] = 'Западноевропейский';
+$labels['easterneuropean'] = 'Восточноевропейский';
+$labels['southeasterneuropean'] = 'Юго-Восточноевропейский';
+$labels['baltic'] = 'Прибалтийский';
+$labels['cyrillic'] = 'Кириллица';
+$labels['arabic'] = 'Арабский';
+$labels['greek'] = 'Греческий';
+$labels['hebrew'] = 'Иврит';
+$labels['turkish'] = 'Турецкий';
+$labels['nordic'] = 'Скандинавский';
+$labels['thai'] = 'Тайский';
+$labels['celtic'] = 'Кельтский';
+$labels['vietnamese'] = 'Вьетнамский';
+$labels['japanese'] = 'Японский';
+$labels['korean'] = 'Корейский';
+$labels['chinese'] = 'Китайский';
 
 ?>
index 652191ad1a84eb42fdfe33592c8cf22da6a7b2d8..7981029309ec523392cb4509e983d250af41686d 100644 (file)
@@ -5,15 +5,16 @@
 +-----------------------------------------------------------------------+
 | language/ru_RU/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Artur Smolkin <artsmolkin@ya.ru>                              |
+| Updates: Sergey Dukachev <iam@dukess.ru>                              |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 3061 2009-10-26 21:42:58Z yllar $
+@version $Id: messages.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -23,6 +24,9 @@ $messages['cookiesdisabled'] = 'Ваш броузер не принимает co
 $messages['sessionerror'] = 'Ваша сессия устарела';
 $messages['imaperror'] = 'Неудачное соединение с IMAP сервером';
 $messages['servererror'] = 'Ошибка сервера!';
+$messages['servererrormsg'] = 'Ошибка сервера: $msg';
+$messages['errorreadonly'] = 'Невозможно выполнить операцию. Папка доступна только для чтения';
+$messages['errornoperm'] = 'Невозможно выполнить операцию. Доступ запрещён';
 $messages['invalidrequest'] = 'Неверный запрос! Информация не сохранена.';
 $messages['nomessagesfound'] = 'Сообщений не найдено';
 $messages['loggedout'] = 'Ваша сессия завершена. Всего доброго!';
@@ -47,16 +51,17 @@ $messages['senttooquickly'] = 'Вы должны подождать $sec сек.
 $messages['errorsavingsent'] = 'Произошла ошибка при сохранении отправленного сообщения';
 $messages['errorsaving'] = 'В процессе сохранения произошла ошибка';
 $messages['errormoving'] = 'Не удалось переместить сообщение';
+$messages['errorcopying'] = 'Не удалось скопировать сообщение';
 $messages['errordeleting'] = 'Не удалось удалить сообщение';
 $messages['errormarking'] = 'Невозможно пометить сообщение';
 $messages['deletecontactconfirm'] = 'Вы действительно хотите удалить выделенные контакты?';
 $messages['deletemessagesconfirm'] = 'Вы действительно хотите удалить выбранные сообщения?';
 $messages['deletefolderconfirm'] = 'Вы действительно хотите удалить эту папку?';
 $messages['purgefolderconfirm'] = 'Вы действительно хотите удалить все сообщения в этой папке?';
-$messages['foldercreating'] = 'Создание папки...';
 $messages['folderdeleting'] = 'Удаление папки...';
-$messages['folderrenaming'] = 'Переименование папки...';
 $messages['foldermoving'] = 'Перемещение папки...';
+$messages['foldersubscribing'] = 'Подписать папку...';
+$messages['folderunsubscribing'] = 'Отписать папку...';
 $messages['formincomplete'] = 'Заполнены не все поля';
 $messages['noemailwarning'] = 'Пожалуйста, введите корректный адрес электронной почты';
 $messages['nonamewarning'] = 'Пожалуйста, введите имя';
@@ -76,6 +81,10 @@ $messages['searching'] = 'Поиск...';
 $messages['checking'] = 'Проверка...';
 $messages['nospellerrors'] = 'Орфографических ошибок не найдено';
 $messages['folderdeleted'] = 'Папка удалена';
+$messages['foldersubscribed'] = 'Папка подписана';
+$messages['folderunsubscribed'] = 'Папка отписана';
+$messages['folderpurged'] = 'Папка удалена';
+$messages['folderexpunged'] = 'Папка очищена';
 $messages['deletedsuccessfully'] = 'Удалено';
 $messages['converting'] = 'Удаление форматирования сообщения...';
 $messages['messageopenerror'] = 'Невозможно загрузить сообщение с сервера';
@@ -85,14 +94,18 @@ $messages['copysuccess'] = 'Скопировано $nr адресов';
 $messages['copyerror'] = 'Невозможно скопировать адреса';
 $messages['sourceisreadonly'] = 'Данный источник адресов только для чтения';
 $messages['errorsavingcontact'] = 'Невозможно сохранить адрес контакта';
-$messages['movingmessage'] = 'Перемещение сообщения…';
+$messages['movingmessage'] = 'Перемещение сообщений…';
+$messages['copyingmessage'] = 'Копирование сообщений...';
+$messages['deletingmessage'] = 'Удаление сообщений...';
+$messages['markingmessage'] = 'Выделение сообщений...';
 $messages['receiptsent'] = 'Уведомление о прочтении отправлено';
 $messages['errorsendingreceipt'] = 'Уведомление о прочтении не отправлено';
 $messages['nodeletelastidentity'] = 'Вы не можете удалить этот профиль, он у вас последний';
-$messages['addsubfolderhint'] = 'Эта папка будет создана как подпапка в текущей папке';
 $messages['forbiddencharacter'] = 'Имя папки содержит недопустимые символы';
 $messages['selectimportfile'] = 'Выберите файл для загрузки';
 $messages['addresswriterror'] = 'Выбранная адресная книга недоступна для записи';
+$messages['contactaddedtogroup'] = 'Контакты добавлены в группу';
+$messages['contactremovedfromgroup'] = 'Контакты удалены из группы';
 $messages['importwait'] = 'Импортирование, пожалуйста, подождите...';
 $messages['importerror'] = 'Импорт завершился неудачно! Загруженный файл не является правильным файлом vCard.';
 $messages['importconfirm'] = '<b>Успешно импортировано $inserted контакт(ов), пропущено $skipped существующих</b>:<p><em>$names</em></p>';
@@ -102,10 +115,28 @@ $messages['editorwarning'] = 'При переключении в редакто
 $messages['httpreceivedencrypterror'] = 'На сервере возникла неизбежная ошибка. Срочно свяжитесь с Вашим администратором. <b>Ваше сообщение может быть не отправлено.</b>';
 $messages['smtpconnerror'] = 'SMTP Error ($code): Соединение с сервером сброшено';
 $messages['smtpautherror'] = 'SMTP Error ($code): Ошибка авторизации';
-$messages['smtpfromerror'] = 'SMTP Error ($code): Невозможно установить отправителя "$from"';
-$messages['smtptoerror'] = 'SMTP Error ($code): Невозможно добавить получателя "$to"';
-$messages['smtprecipientserror'] = 'SMTP Error ($code): Невозможно обработать список получателей';
+$messages['smtpfromerror'] = 'SMTP Error ($code): Невозможно установить отправителя "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP Error ($code): Невозможно добавить получателя "$to" ($msg)';
+$messages['smtprecipientserror'] = 'SMTP Error: Невозможно обработать список получателей';
+$messages['smtpdsnerror'] = 'SMTP Error: Уведомления о состоянии доставки не поддерживаются';
 $messages['smtperror'] = 'SMTP Error ($code): $msg';
 $messages['emailformaterror'] = 'Неверный адрес: $email';
+$messages['toomanyrecipients'] = 'Слишком много получателей, уменьшите их количество до $max.';
+$messages['maxgroupmembersreached'] = 'Размер группы больше максимально разрешенного - $max';
+$messages['internalerror'] = 'Произошла внутренняя ошибка. Попробуйте ещё раз';
+$messages['contactdelerror'] = 'Не могу удалить контакт(ы)';
+$messages['contactdeleted'] = 'Контакт(ы) успешно удален(ы)';
+$messages['groupdeleted'] = 'Группа успешно удалена ';
+$messages['grouprenamed'] = 'Группа успешно переименована';
+$messages['groupcreated'] = 'Группа успешно создана';
+$messages['messagedeleted'] = 'Сообщения успешно удалены';
+$messages['messagemoved'] = 'Сообщения успешно перемещены';
+$messages['messagecopied'] = 'Сообщения успешно скопированы';
+$messages['messagemarked'] = 'Сообщения успешно выделены';
+$messages['autocompletechars'] = 'Введите, как минимум, $min символов для автодополнения';
+$messages['namecannotbeempty'] = 'Имя не может быть пустым';
+$messages['nametoolong'] = 'Слишком длинное имя';
+$messages['folderupdated'] = 'Папка обновлена';
+$messages['foldercreated'] = 'Папка создана';
 
 ?>
index 4234a72056ac1e7d7a72f28170c290ab4d99e39f..f5d5cad127099e62818630ac25829a134a93d56b 100644 (file)
@@ -4,15 +4,15 @@
  +-----------------------------------------------------------------------+
  | language/si/labels.inc                                                |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Melanga Dissanayake <Melanga.Dissanayake@pabcbank.com>        |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -179,9 +179,6 @@ $labels['subscribed'] = 'සාමාජික';
 $labels['messagecount'] = 'පනිවුඩ';
 $labels['create'] = 'සෑදීම';
 $labels['createfolder'] = 'අඵත් ෆෝල්ඩරයක් සෑදීම';
-$labels['rename'] = 'නැවත නම් කිරීම';
-$labels['renamefolder'] = 'ෆෝල්ඩරය නැවත නම් කිරීම';
-$labels['deletefolder'] = 'ෆෝල්ඩරය මකා දැමීම';
 $labels['managefolders'] = 'හැසිරවීම හැසිරවීම';
 $labels['sortby'] = 'චිසින් වර්ග කිරීම';
 $labels['sortasc'] = 'ආරෝහණ වර්ග කිරීම';
index cfb8955a73b18eb0ab1a0f3fe2b3001c2d78b58c..911d48b1ffa0eb5c7691768a031779b078c282ec 100644 (file)
@@ -4,15 +4,15 @@
  +-----------------------------------------------------------------------+
  | language/si/messages.inc                                              |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Melanga Dissanayake <Melanga.Dissanayake@pabcbank.com>        |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -76,6 +76,5 @@ $messages['movingmessage'] = 'පනිවුඩය ගෙනයමින් ප
 $messages['receiptsent'] = 'කියවීම් භාර ගැනීම සාර්ථකව යවන ලදී';
 $messages['errorsendingreceipt'] = 'කියවීම් භාර ගැනීම යැවීමට නොහැක';
 $messages['nodeletelastidentity'] = 'අවසාන අනන්‍යතාවය මකා දැමිය නොහැක';
-$messages['addsubfolderhint'] = 'ෆෝල්ඩරය දැනට තෝරාගෙන ඇති ෆෝල්ඩරයෙහි අනු ෆෝල්ඩරයක් ලෙස සෑදේ';
 
 ?>
index 03f8b762123265b22da096786a7edc0099d4d69f..266f970b8a345d0d791bef92104d8c2598d53b51 100644 (file)
@@ -3,19 +3,20 @@
 /*
 
 +-----------------------------------------------------------------------+
-| language/sk/labels.inc                                                |
+| language/sk_SK/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Marek Kutnar <marek19@zmail.sk>                               |
 |         Lukas Kraic  <lukas.kraic@truni.sk>                           |
 |         Peter Mann   <peter.mann@tuke.sk>                             |
+|         Ales Pospichal   <ales@pospichalales.info>                    |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2513 2009-05-21 12:59:19Z alec $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -47,14 +48,14 @@ $labels['organization'] = 'Organizácia';
 $labels['reply-to'] = 'Odpovedať na';
 $labels['mailboxlist'] = 'Adresár';
 $labels['messagesfromto'] = 'Správy od $from do $to z $count';
+$labels['threadsfromto'] = 'Konverzácie od $from do $to z $count ';
 $labels['messagenrof'] = 'Správa $nr z $count';
+$labels['copy'] = 'Kopírovať';
+$labels['move'] = 'Presunúť';
 $labels['moveto'] = 'presunúť do...';
 $labels['download'] = 'stiahnuť';
 $labels['filename'] = 'Meno súboru';
 $labels['filesize'] = 'Veľkosť súboru';
-$labels['preferhtml'] = 'Uprednostniť HTML zobrazenie';
-$labels['htmlmessage'] = 'HTML správa';
-$labels['prettydate'] = 'Krajší dátum';
 $labels['addtoaddressbook'] = 'Pridať do adresára';
 $labels['sun'] = 'Ne';
 $labels['mon'] = 'Po';
@@ -118,10 +119,39 @@ $labels['markread'] = 'Ako prečítané';
 $labels['markunread'] = 'Ako neprečítané';
 $labels['markflagged'] = 'Ako označené';
 $labels['markunflagged'] = 'Ako neoznačené';
+$labels['messageactions'] = 'Ďalšie akcie...';
 $labels['select'] = 'Výber';
 $labels['all'] = 'Všetky';
 $labels['none'] = 'Žiadne';
+$labels['currpage'] = 'Aktuálna stránka';
 $labels['unread'] = 'Neprečítané';
+$labels['flagged'] = 'Označené';
+$labels['unanswered'] = 'Neoznačené';
+$labels['deleted'] = 'Zmazané';
+$labels['invert'] = 'Prevrátiť';
+$labels['filter'] = 'Filter';
+$labels['list'] = 'Zoznam';
+$labels['threads'] = 'Konverzácie';
+$labels['expand-all'] = 'Rozbaliť všetko';
+$labels['expand-unread'] = 'Rozbaliť neprečítané';
+$labels['collapse-all'] = 'Zbaliť všetko';
+$labels['threaded'] = 'Spájať do konverzácií';
+$labels['autoexpand_threads'] = 'Rozbaliť konverzácie';
+$labels['do_expand'] = 'všetky konverzácie';
+$labels['expand_only_unread'] = 'len s neprečítanými správami';
+$labels['fromto'] = 'Odosielateľ/Príjemca';
+$labels['flag'] = 'Vlajka';
+$labels['attachment'] = 'Príloha';
+$labels['nonesort'] = 'Nič';
+$labels['sentdate'] = 'Dátum odoslania';
+$labels['arrival'] = 'Dátum prijatia';
+$labels['asc'] = 'vzostupne';
+$labels['desc'] = 'zostupne';
+$labels['listcolumns'] = 'Zoznam stĺpcov';
+$labels['listsorting'] = 'Triedenie stĺpcov';
+$labels['listorder'] = 'Usporiadanie';
+$labels['listmode'] = 'Režim zobrazenia zoznamu';
+$labels['folderactions'] = 'Akcie so zložkou...';
 $labels['compact'] = 'Zhustiť priečinok';
 $labels['empty'] = 'Prázdne';
 $labels['purge'] = 'Vyprázdniť';
@@ -130,20 +160,26 @@ $labels['unknown'] = 'neznáme';
 $labels['unlimited'] = 'neobmedzené';
 $labels['quicksearch'] = 'Rýchle vyhľadávanie';
 $labels['resetsearch'] = 'Vyčistiť vyhľadávanie';
+$labels['searchmod'] = 'Parametre hľadanie';
+$labels['msgtext'] = 'Celá správa';
 $labels['openinextwin'] = 'Otvoriť v novom okne';
+$labels['emlsave'] = 'Stiahnuť';
 $labels['compose'] = 'Vytvoriť správu';
+$labels['editasnew'] = 'Upraviť ako novú';
 $labels['savemessage'] = 'Uložiť do rozpísaných';
 $labels['sendmessage'] = 'Odoslať správu';
 $labels['addattachment'] = 'Pridať prílohu';
 $labels['charset'] = 'Znaková sada';
 $labels['editortype'] = 'Typ editora';
 $labels['returnreceipt'] = 'Potvrdenie o doručení';
+$labels['editidents'] = 'Editovať identity';
 $labels['checkspelling'] = 'Skontrolovať pravopis';
 $labels['resumeediting'] = 'Pokračovať v úpravách';
 $labels['revertto'] = 'Vrátiť sa na';
 $labels['attachments'] = 'Prílohy';
 $labels['upload'] = 'Nahrať';
 $labels['close'] = 'Zatvoriť';
+$labels['messageoptions'] = 'Nastavenia správy...';
 $labels['low'] = 'Nízka';
 $labels['lowest'] = 'Najnižšia';
 $labels['normal'] = 'Normálna';
@@ -170,6 +206,7 @@ $labels['surname'] = 'Priezvisko';
 $labels['email'] = 'E-Mail';
 $labels['addcontact'] = 'Pridať nový kontakt';
 $labels['editcontact'] = 'Upraviť kontakt';
+$labels['contacts'] = 'Kontakty';
 $labels['edit'] = 'Upraviť';
 $labels['cancel'] = 'Zrušiť';
 $labels['save'] = 'Uložiť';
@@ -181,10 +218,13 @@ $labels['contactsfromto'] = 'Kontakty od $from do $to z $count';
 $labels['print'] = 'Tlač';
 $labels['export'] = 'Export';
 $labels['exportvcards'] = 'Exportovať kontakty vo formáte vCard';
+$labels['newcontactgroup'] = 'Vytvoriť novú skupinu kontaktov';
+$labels['groupactions'] = 'Akcie pre skupiny kontaktov';
 $labels['previouspage'] = 'Predchádzajúca stránka';
 $labels['firstpage'] = 'Prvá stránka';
 $labels['nextpage'] = 'Nasledujúca stránka';
 $labels['lastpage'] = 'Posledná stránka';
+$labels['group'] = 'Skupina';
 $labels['groups'] = 'Skupiny';
 $labels['personaladrbook'] = 'Osobné adresy';
 $labels['import'] = 'Import';
@@ -202,6 +242,10 @@ $labels['manageidentities'] = 'Spravovať profily pre tento účet';
 $labels['newidentity'] = 'Nový profil';
 $labels['newitem'] = 'Nová položka';
 $labels['edititem'] = 'Upraviť položku';
+$labels['preferhtml'] = 'Uprednostniť HTML zobrazenie';
+$labels['defaultcharset'] = 'Predvolené kódovanie';
+$labels['htmlmessage'] = 'HTML správa';
+$labels['prettydate'] = 'Krajší dátum';
 $labels['setdefault'] = 'Obnoviť pôvodné';
 $labels['autodetect'] = 'Automaticky';
 $labels['language'] = 'Jazyk';
@@ -220,22 +264,53 @@ $labels['serversettings'] = 'Nastavenia servera';
 $labels['mailboxview'] = 'Pohľad na schránku';
 $labels['mdnrequests'] = 'Upozornenia odosielateľovi';
 $labels['askuser'] = 'spýtať sa používateľa';
-$labels['autosend'] = 'poslať automaticky';
+$labels['autosend'] = 'poslať potvrdenie automaticky';
+$labels['autosendknown'] = 'poslať potvrdenie iba mojím kontaktom';
 $labels['ignore'] = 'ignorovať';
 $labels['readwhendeleted'] = 'Označiť správu ';
 $labels['flagfordeletion'] = 'Pri odstránení správy iba označiť správu ako odstránenú';
 $labels['skipdeleted'] = 'Nezobrazovať zmazané správy';
+$labels['deletealways'] = 'Odstrániť správy, ak zlyhá ich presun do koša';
+$labels['showremoteimages'] = 'Zobrazovať obrázky uložené mimo mail';
+$labels['fromknownsenders'] = 'od známych užívateľov';
+$labels['always'] = 'vždy';
 $labels['showinlineimages'] = 'Zobraziť pripojené obrázky pod správou';
 $labels['autosavedraft'] = 'Automaticky uložiť koncept';
+$labels['everynminutes'] = 'každých $n minút';
 $labels['keepalive'] = 'Kontrolovať nové správy';
 $labels['never'] = 'nikdy';
+$labels['immediately'] = 'ihneď';
 $labels['messagesdisplaying'] = 'Zobrazovanie správ';
 $labels['messagescomposition'] = 'Vytváranie správ';
 $labels['mimeparamfolding'] = 'Názvy príloh';
 $labels['2231folding'] = 'Full RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Full RFC 2047 (other)';
+$labels['force7bit'] = 'Použiť kódovanie MIME pre 8-bitové znaky';
 $labels['advancedoptions'] = 'Rozšírené nastavenia';
+$labels['focusonnewmessage'] = 'Aktivovať okno prehliadača pri príchozí správe';
+$labels['checkallfolders'] = 'Kontrolovať nové správy vo všetkých zložkách';
+$labels['displaynext'] = 'Zobraziť ďalšiu správu po zmazanie / prenosu správy';
+$labels['mainoptions'] = 'Hlavné nastavenia';
+$labels['section'] = 'Sekcia';
+$labels['maintenance'] = 'Údržba';
+$labels['newmessage'] = 'Nová správa';
+$labels['listoptions'] = 'Nastavenia stránkovanie';
+$labels['signatureoptions'] = 'Nastavenia podpísania';
+$labels['whenreplying'] = 'Pri odpovedaní';
+$labels['replytopposting'] = 'začať novú správu nad pôvodňou';
+$labels['replybottomposting'] = 'začať novú správu pod pôvodňou';
+$labels['replyremovesignature'] = 'Pri odpovedaní odstrániť zo správy pôvodný podpis';
+$labels['autoaddsignature'] = 'Automaticky pridať podpis';
+$labels['newmessageonly'] = 'iba k novým správam';
+$labels['replyandforwardonly'] = 'len k odpovede a preposílanej správe';
+$labels['replysignaturepos'] = 'Pri odpovedaní alebo preposielanie správy vložiť podpis';
+$labels['belowquote'] = 'nad citáciu';
+$labels['abovequote'] = 'pod citáciu';
+$labels['insertsignature'] = 'Vložit podpis';
+$labels['previewpanemarkread'] = 'Označiť zobrazenej správy ako prečítané';
+$labels['afternseconds'] = 'po $ sekundách';
+$labels['reqmdn'] = 'Vždy požadovať doručenku';
 $labels['folder'] = 'Priečinok';
 $labels['folders'] = 'Priečinky';
 $labels['foldername'] = 'Názov priečinku';
@@ -243,9 +318,6 @@ $labels['subscribed'] = 'Prihlásený k odberu';
 $labels['messagecount'] = 'Počet správ';
 $labels['create'] = 'Vytvoriť';
 $labels['createfolder'] = 'Vytvor nový priečinok';
-$labels['rename'] = 'Premenovať';
-$labels['renamefolder'] = 'Premenovať priečinok';
-$labels['deletefolder'] = 'Zmazať priečinok';
 $labels['managefolders'] = 'Spravovať priečinky';
 $labels['specialfolders'] = 'Špeciálne priečinky';
 $labels['sortby'] = 'Triediť podľa';
@@ -255,5 +327,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Angličtina';
+$labels['westerneuropean'] = 'Západná Európa';
+$labels['easterneuropean'] = 'Východná Európa';
+$labels['southeasterneuropean'] = 'Juho-východná Európa';
+$labels['baltic'] = 'Baltština';
+$labels['cyrillic'] = 'Cyriliky';
+$labels['arabic'] = 'Arabčina';
+$labels['greek'] = 'Gréčtina';
+$labels['hebrew'] = 'Hebrejčina';
+$labels['turkish'] = 'Nordština';
+$labels['nordic'] = 'Turečtina';
+$labels['thai'] = 'Tajština';
+$labels['celtic'] = 'Keltština';
+$labels['vietnamese'] = 'Vietnamčina';
+$labels['japanese'] = 'Japončina';
+$labels['korean'] = 'Korejčina';
+$labels['chinese'] = 'Čínština';
 
-?>
+?>
\ No newline at end of file
index 63a6ab3474bcc94b22d88f5e6c7e6850d0affa7e..797bbf61cc4bb841f40709825e810ce664896bfc 100644 (file)
@@ -5,17 +5,18 @@
 +-----------------------------------------------------------------------+
 | language/sk/messages.inc                                              |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Marek Kutnar <marek19@zmail.sk>                               |
 |         Lukas Kraic  <lukas.kraic@truni.sk>                           |
 |         Peter Mann   <peter.mann@tuke.sk>                             |
+|         Ales Pospichal   <ales@pospichalales.info>                    |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2237 2009-01-17 01:55:39Z till $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -24,10 +25,13 @@ $messages['loginfailed'] = 'Chybné prihlásenie';
 $messages['cookiesdisabled'] = 'Váš internetový prehliadač nepodporuje cookies, ktoré sú potrebné pre prihlásenie';
 $messages['sessionerror'] = 'Vaše prihlásenie je neplatné alebo vypršala jeho platnosť';
 $messages['imaperror'] = 'Nepodarilo sa spojiť s IMAP serverom';
+$messages['servererror'] = 'Chyba servera!';
+$messages['invalidrequest'] = 'Chybný požiadavek. Žiadne údaje neboli uložené.';
 $messages['nomessagesfound'] = 'Vo Vašej schránke nie je žiadna správa';
 $messages['loggedout'] = 'Odhlásenie prebehlo úspešne. Dovidenia.';
 $messages['mailboxempty'] = 'Schránka je prázdna';
 $messages['loading'] = 'Načítava sa...';
+$messages['uploading'] = 'Nahrávám súbor...';
 $messages['loadingdata'] = 'Načítavajú sa údaje...';
 $messages['checkingmail'] = 'Kontrolujú sa nové správy...';
 $messages['sendingmessage'] = 'Správa sa odosiela...';
@@ -46,14 +50,14 @@ $messages['senttooquickly'] = 'Počkajte $sec sekúnd pred odoslaním tejto spr
 $messages['errorsavingsent'] = 'Pri ukladaní odoslanej správy nastala chyba';
 $messages['errorsaving'] = 'Vyskytla sa chyba pri ukladaní';
 $messages['errormoving'] = 'Správa sa nedá presunúť';
+$messages['errorcopying'] = 'Správa sa nedá skopírovať';
 $messages['errordeleting'] = 'Správa sa nedá zmazať';
+$messages['errormarking'] = 'Správa sa nedá označiť';
 $messages['deletecontactconfirm'] = 'Ste si istý, že chcete zmazať zvolený(é) kontakt(y)?';
 $messages['deletemessagesconfirm'] = 'Ste si istý, že chcete zmazať zvolenú(é) správu(y)?';
 $messages['deletefolderconfirm'] = 'Ste si istý, že chcete zmazať tento priečinok?';
 $messages['purgefolderconfirm'] = 'Ste si istý, že chcete zmazať všetky správy v tomto priečinku?';
-$messages['foldercreating'] = 'Vytvára sa priečinok ...';
 $messages['folderdeleting'] = 'Odstraňuje sa priečinok ...';
-$messages['folderrenaming'] = 'Mení sa názov priečinka ...';
 $messages['foldermoving'] = 'Prečinok sa presúva ...';
 $messages['formincomplete'] = 'Formulár nie je kompletne vyplnený';
 $messages['noemailwarning'] = 'Prosím, vložte platnú emailovú adresu';
@@ -67,6 +71,7 @@ $messages['notsentwarning'] = 'Správa nebola odoslaná, chcete ju zrušiť?';
 $messages['noldapserver'] = 'Prosím, zvoľte LDAP server na vyhľadávanie';
 $messages['nocontactsreturned'] = 'Neboli nájdené žiadne kontakty';
 $messages['nosearchname'] = 'Prosím vložte meno alebo emailovú adresu';
+$messages['notuploadedwarning'] = 'Ešte neboli nahrané všetky prílohy. Počkajte prosím alebo nahrávanie zrušte.';
 $messages['searchsuccessful'] = 'nájdených $nr správ';
 $messages['searchnomatch'] = 'Hľadaný výraz nebol nájdený';
 $messages['searching'] = 'Vyhľadáva sa...';
@@ -83,18 +88,31 @@ $messages['copyerror'] = 'Nedá sa kopírovať žiadna adresa';
 $messages['sourceisreadonly'] = 'Tento zdroj adries je len na čítanie';
 $messages['errorsavingcontact'] = 'Nedá sa uložiť adresa kontaktu';
 $messages['movingmessage'] = 'Správa sa presúva...';
+$messages['copyingmessage'] = 'Správa sa kopíruje...';
 $messages['receiptsent'] = 'Potvrdenie o prijatí správy bolo odoslané';
 $messages['errorsendingreceipt'] = 'Potvrdenie o prijatí správy sa nedalo odoslať';
 $messages['nodeletelastidentity'] = 'Identita sa nedá odstrániť, je posledná a musí zostať.';
-$messages['addsubfolderhint'] = 'Tento priečinok bude vytvorený ako podpriečinok aktuálne zvoleného priečinka';
 $messages['forbiddencharacter'] = 'Názov priečinka obsahuje nepovolený znak';
 $messages['selectimportfile'] = 'Zvoľte súbor, ktorý chcete načítať';
 $messages['addresswriterror'] = 'Zvolený adresár kontaktov je iba na čítanie';
+$messages['contactaddedtogroup'] = 'Kontakty boli úspešne presunuty do tejto skupiny';
+$messages['contactremovedfromgroup'] = 'Kontakty boli úspešne odstráneny z tejto skupiny';
 $messages['importwait'] = 'Prebieha import, počkajte ...';
 $messages['importerror'] = 'Import zlyhal. Načítavaný súbor nie je platným vCard súborom.';
 $messages['importconfirm'] = '<b>Úspešne sa načítalo $inserted kontaktov, preskočilo sa $skipped existujúcich záznamov</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Operácia nie je povolená!';
 $messages['nofromaddress'] = 'Zvolená identita neobsahuje e-mailovú adresu';
 $messages['editorwarning'] = 'Prepnutie na editor obyčajného textu spôsobí stratu formátovania. Chcete napriek tomu pokračovať?';
+$messages['httpreceivedencrypterror'] = 'Vyskytla sa vážna chyba v konfigurácii. Kontaktujte bezodkladne administrátora. <b>Vaša správa nemohla byť odoslaná.</b>';
+$messages['smtpconnerror'] = 'Chyba SMTP: Pripojenie na server zlyhalo';
+$messages['smtpautherror'] = 'Chyba SMTP: Autorizácie zlyhala';
+$messages['smtpfromerror'] = 'Chyba SMTP: Nemožno nastaviť odosielateľa ($msg)';
+$messages['smtptoerror'] = 'Chyba SMTP: Nemožno pridať príjemca ($msg)';
+$messages['smtprecipientserror'] = 'Chyba SMTP: Nemožno spracovať zoznam príjemcov';
+$messages['smtperror'] = 'Chyba SMTP: $msg';
+$messages['emailformaterror'] = 'Neplatná e-mailová adresa: $email';
+$messages['toomanyrecipients'] = 'Príliš veľa príjemcov. Zmenšite počet príjemcov na $max.';
+$messages['maxgroupmembersreached'] = 'Počet členov skupiny dosiahol maxima z $max';
+$messages['internalerror'] = 'Došlo k internej chybe. Skúste to znova';
 
 ?>
index 750e284705ca460e853a09a176dad18cfa3200ac..560f8b3861046c71399ef8b6e845205b072aaf53 100644 (file)
@@ -1,12 +1,11 @@
 <?php
 
 /*
-
 +-----------------------------------------------------------------------+
-| language/sl/labels.inc                                                |
+| language/sl_SI/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
 |         Barbara Krasovec <barbarak@arnes.si>                          |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2850 2009-08-07 21:17:12Z yllar $
+@version $Id: labels.inc 4386 2011-01-04 08:35:46Z yllar $
 
 */
 
 $labels = array();
-$labels['welcome'] = 'Dobrodošel v $product';
+$labels['welcome'] = 'Dobrodošli v $product';
 $labels['username'] = 'Uporabniško ime';
 $labels['password'] = 'Geslo';
 $labels['server'] = 'Strežnik';
@@ -40,22 +39,23 @@ $labels['to'] = 'Prejemnik';
 $labels['cc'] = 'Kp';
 $labels['bcc'] = 'Skp';
 $labels['replyto'] = 'Odgovor na';
+$labels['followupto'] = 'Odgovor na';
 $labels['date'] = 'Datum';
 $labels['size'] = 'Velikost';
 $labels['priority'] = 'Prioriteta';
 $labels['organization'] = 'Organizacija';
-$labels['reply-to'] = 'Odgovor na';
+$labels['readstatus'] = 'Status';
 $labels['mailboxlist'] = 'Mape';
 $labels['messagesfromto'] = 'Sporočila $from do $to od $count';
+$labels['threadsfromto'] = 'Nit $from do $to od $count';
 $labels['messagenrof'] = 'Sporočilo $nr od $count';
-$labels['moveto'] = 'premakni v...';
-$labels['download'] = 'prenesi';
+$labels['copy'] = 'Kopiraj';
+$labels['move'] = 'Premakni';
+$labels['moveto'] = 'Premakni v...';
+$labels['download'] = 'Prenesi';
 $labels['filename'] = 'Ime datoteke';
 $labels['filesize'] = 'Velikost datoteke';
-$labels['preferhtml'] = 'Prednostno HTML';
-$labels['htmlmessage'] = 'HTML sporočilo';
-$labels['prettydate'] = 'Bolj čitljivi datumi';
-$labels['addtoaddressbook'] = 'Dodaj v stike';
+$labels['addtoaddressbook'] = 'Dodaj med stike';
 $labels['sun'] = 'Ned';
 $labels['mon'] = 'Pon';
 $labels['tue'] = 'Tor';
@@ -98,7 +98,9 @@ $labels['today'] = 'Danes';
 $labels['checkmail'] = 'Preglej nova sporočila';
 $labels['writenewmessage'] = 'Novo sporočilo';
 $labels['replytomessage'] = 'Odgovori';
-$labels['replytoallmessage'] = 'Odgovori vsem';
+$labels['replytoallmessage'] = 'Odgovori listi ali vsem prejemnikom';
+$labels['replyall'] = 'Odgovori vsem';
+$labels['replylist'] = 'Odgovori listi';
 $labels['forwardmessage'] = 'Posreduj';
 $labels['deletemessage'] = 'Izbriši';
 $labels['movemessagetotrash'] = 'Premakni v smeti';
@@ -122,15 +124,37 @@ $labels['messageactions'] = 'Več možnosti';
 $labels['select'] = 'Izberi';
 $labels['all'] = 'Vse';
 $labels['none'] = 'Ničesar';
+$labels['currpage'] = 'Trenutna stran';
 $labels['unread'] = 'Neprebrano';
 $labels['flagged'] = 'Označeno';
 $labels['unanswered'] = 'Neoznačeno';
 $labels['deleted'] = 'Izbrisano';
 $labels['invert'] = 'Zamenjaj';
 $labels['filter'] = 'Prikaži';
+$labels['list'] = 'Seznam';
+$labels['threads'] = 'Niti';
+$labels['expand-all'] = 'Razširi vse';
+$labels['expand-unread'] = 'Razširi neprebrano';
+$labels['collapse-all'] = 'Zloži vse';
+$labels['threaded'] = 'Nitno';
+$labels['autoexpand_threads'] = 'Razširi niti';
+$labels['do_expand'] = 'vse niti';
+$labels['expand_only_unread'] = 'samo niti z neprebranimi sporočili';
+$labels['fromto'] = 'Pošiljatelj/Prejemnik';
+$labels['flag'] = 'Oznaka';
+$labels['attachment'] = 'Priponka';
+$labels['nonesort'] = 'Brez';
+$labels['sentdate'] = 'Datum pošiljanja';
+$labels['arrival'] = 'Datum prejema';
+$labels['asc'] = 'naraščajoče';
+$labels['desc'] = 'padajoče';
+$labels['listcolumns'] = 'Seznam stolpcev';
+$labels['listsorting'] = 'Urejanje stolpcev';
+$labels['listorder'] = 'Vrstni red';
+$labels['listmode'] = 'Način prikaza seznama';
+$labels['folderactions'] = 'Upravljanje map...';
 $labels['compact'] = 'Stisni';
 $labels['empty'] = 'Izprazni';
-$labels['purge'] = 'Počisti';
 $labels['quota'] = 'Poraba prostora';
 $labels['unknown'] = 'neznana';
 $labels['unlimited'] = 'neomejena';
@@ -139,24 +163,27 @@ $labels['resetsearch'] = 'Prekliči iskanje';
 $labels['searchmod'] = 'Spremembe iskanja';
 $labels['msgtext'] = 'Celotno sporočilo';
 $labels['openinextwin'] = 'Odpri v novem oknu';
-$labels['emlsave'] = 'Prenos datoteke(.eml)';
+$labels['emlsave'] = 'Prenos datoteke (.eml)';
 $labels['compose'] = 'Sestavi sporočilo';
 $labels['editasnew'] = 'Uredi kot novo';
 $labels['savemessage'] = 'Shrani kot osnutek';
-$labels['sendmessage'] = 'Pošlji sporočilo zdaj';
+$labels['sendmessage'] = 'Pošlji sporočilo';
 $labels['addattachment'] = 'Pripni datoteko';
 $labels['charset'] = 'Nabor znakov';
 $labels['editortype'] = 'Vrsta urejevalnika';
 $labels['returnreceipt'] = 'Potrdilo prejemnika';
+$labels['dsn'] = 'Status dostave sporočila';
+$labels['editidents'] = 'Uredi identitete';
 $labels['checkspelling'] = 'Preglej pravopis';
 $labels['resumeediting'] = 'Nadaljuj z urejanjem';
 $labels['revertto'] = 'Razveljavi';
 $labels['attachments'] = 'Priponke';
 $labels['upload'] = 'Naloži';
 $labels['close'] = 'Zapri';
+$labels['messageoptions'] = 'Možnosti';
 $labels['low'] = 'Nizka';
 $labels['lowest'] = 'Najnižja';
-$labels['normal'] = 'Normalna';
+$labels['normal'] = 'Običajna';
 $labels['high'] = 'Visoka';
 $labels['highest'] = 'Najvišja';
 $labels['nosubject'] = '(brez naslova)';
@@ -170,6 +197,7 @@ $labels['maxuploadsize'] = 'Največja dovoljena velikost datoteke je $size';
 $labels['addcc'] = 'Dodaj Kp';
 $labels['addbcc'] = 'Dodaj Skp';
 $labels['addreplyto'] = 'Dodaj naslov za odgovor';
+$labels['addfollowupto'] = 'Dodaj naslov za odgovor';
 $labels['mdnrequest'] = 'Pošiljatelj tega sporočila je zaprosil za potrdilo o branju. Želite o tem obvestiti pošiljatelja?';
 $labels['receiptread'] = 'Potrdilo o branju';
 $labels['yourmessage'] = 'To je potrdilo o branju.';
@@ -180,23 +208,29 @@ $labels['surname'] = 'Priimek';
 $labels['email'] = 'E-Pošta';
 $labels['addcontact'] = 'Dodaj izbrane stike v imenik';
 $labels['editcontact'] = 'Uredi vizitko';
+$labels['contacts'] = 'Stiki';
+$labels['contactproperties'] = 'Lastnosti stika';
 $labels['edit'] = 'Uredi';
 $labels['cancel'] = 'Prekliči';
 $labels['save'] = 'Shrani';
-$labels['delete'] = 'Briši';
+$labels['delete'] = 'Izbriši';
+$labels['rename'] = 'Preimenuj';
 $labels['newcontact'] = 'Dodaj vizitko';
 $labels['deletecontact'] = 'Izbriši izbrane vizitke';
 $labels['composeto'] = 'Sestavi sporočilo za';
 $labels['contactsfromto'] = 'Vizitke $from od $to do $count';
 $labels['print'] = 'Natisni';
 $labels['export'] = 'Izvozi';
-$labels['exportvcards'] = 'Izvozi stike v  formatu vCard';
+$labels['exportvcards'] = 'Izvozi stike v formatu vCard';
+$labels['newcontactgroup'] = 'Ustvari novo skupino stikov';
+$labels['groupactions'] = 'Dejanja za skupine stikov...';
 $labels['previouspage'] = 'Prejšnja stran';
 $labels['firstpage'] = 'Prva stran';
 $labels['nextpage'] = 'Naslednja stran';
 $labels['lastpage'] = 'Zadnja stran';
+$labels['group'] = 'Skupina';
 $labels['groups'] = 'Skupine';
-$labels['personaladrbook'] = 'Osebni Stiki';
+$labels['personaladrbook'] = 'Stiki';
 $labels['import'] = 'Uvozi';
 $labels['importcontacts'] = 'Uvozi stike';
 $labels['importfromfile'] = 'Uvozi iz datoteke:';
@@ -212,14 +246,19 @@ $labels['manageidentities'] = 'Upravljaj identitete za ta račun';
 $labels['newidentity'] = 'Nova identiteta';
 $labels['newitem'] = 'Nov predmet';
 $labels['edititem'] = 'Uredi predmet';
+$labels['preferhtml'] = 'Prednostno HTML';
+$labels['defaultcharset'] = 'Privzeto kodiranje znakov';
+$labels['htmlmessage'] = 'HTML sporočilo';
+$labels['prettydate'] = 'Bolj čitljivi datumi';
 $labels['setdefault'] = 'Nastavi privzeto';
 $labels['autodetect'] = 'Samodejno';
 $labels['language'] = 'Jezik';
 $labels['timezone'] = 'Časovni pas';
 $labels['pagesize'] = 'Vrstic na stran';
 $labels['signature'] = 'Podpis';
-$labels['dstactive'] = 'Samodejna nastavitev sončne/legalne ure';
+$labels['dstactive'] = 'Samodejna nastavitev zimskega/letnega časa';
 $labels['htmleditor'] = 'Sestavi sporočila z obogatenim besedilom';
+$labels['htmlonreply'] = 'le pri odgovoru na sporočila z obogatenim besedilom';
 $labels['htmlsignature'] = 'Podpis z obogatenim besedilom';
 $labels['previewpane'] = 'Prikaži predogled';
 $labels['skin'] = 'Tema uporabniškega vmesnika';
@@ -230,11 +269,14 @@ $labels['serversettings'] = 'Nastavitve strežnika';
 $labels['mailboxview'] = 'Pogled poštnega predala';
 $labels['mdnrequests'] = 'Obvestila pošiljatelja';
 $labels['askuser'] = 'vprašaj uporabnika';
-$labels['autosend'] = 'pošlji samodejno';
+$labels['autosend'] = 'pošlji povratnico samodejno';
+$labels['autosendknown'] = 'pošlji povratnico samodejno samo mojim stikom';
+$labels['autosendknownignore'] = 'pošlji potrdilo le mojim kontaktom';
 $labels['ignore'] = 'ne upoštevaj';
 $labels['readwhendeleted'] = 'Označi izbrisano sporočilo kot prebrano';
 $labels['flagfordeletion'] = 'Ne izbriši sporočila, le označi kot izbrisano';
 $labels['skipdeleted'] = 'Ne prikaži izbrisanih sporočil';
+$labels['deletealways'] = 'Če premikanje sporočil v Smeti spodleti, naj bodo izbrisana.';
 $labels['showremoteimages'] = 'Prikaži medvrstične slike';
 $labels['fromknownsenders'] = 'od znanih pošiljateljev';
 $labels['always'] = 'vedno';
@@ -243,21 +285,40 @@ $labels['autosavedraft'] = 'Samodejno shrani osnutke';
 $labels['everynminutes'] = '$n minut';
 $labels['keepalive'] = 'Preglej nova sporočila na';
 $labels['never'] = 'nikoli';
+$labels['immediately'] = 'takoj';
 $labels['messagesdisplaying'] = 'Prikazovanje sporočil';
 $labels['messagescomposition'] = 'Sestavljanje sporočil';
 $labels['mimeparamfolding'] = 'Imena priponk';
 $labels['2231folding'] = 'Full RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Full RFC 2047 (ostali)';
+$labels['force7bit'] = 'Uporabi MIME kodiranje za 8-bitne znake';
 $labels['advancedoptions'] = 'Dodatne možnosti';
 $labels['focusonnewmessage'] = 'Usmeri okno brskalnika na novo sporočilo';
 $labels['checkallfolders'] = 'Preglej nova sporočila za vse mape';
 $labels['displaynext'] = 'Po izbrisu/premikanju sporočila prikaži naslednje sporočilo';
 $labels['mainoptions'] = 'Osnovne nastavitve';
-$labels['section'] = 'Razdelek';
+$labels['section'] = 'Nastavitve';
 $labels['maintenance'] = 'Vzdrževanje';
 $labels['newmessage'] = 'Novo sporočilo';
 $labels['listoptions'] = 'Prikaži seznam možnosti';
+$labels['signatureoptions'] = 'Nastavitve podpisa';
+$labels['whenreplying'] = 'Pri odgovoru';
+$labels['replytopposting'] = 'začni z novim sporočilom nad izvornim sporočilom';
+$labels['replybottomposting'] = 'začni z novim sporočilom pod izvornim sporočilom';
+$labels['replyremovesignature'] = 'Pri odgovoru na sporočilo odstrani izvorni podpis iz sporočila';
+$labels['autoaddsignature'] = 'Samodejno dodaj podpis';
+$labels['newmessageonly'] = 'samo novim sporočilom';
+$labels['replyandforwardonly'] = 'samo k odgovorom in posredovanim sporočilom';
+$labels['replysignaturepos'] = 'Pri odgovoru ali posredovanju sporočila vstavi podpis';
+$labels['belowquote'] = 'pod citiran tekst';
+$labels['abovequote'] = 'nad citiran tekst';
+$labels['insertsignature'] = 'Vstavi podpis';
+$labels['previewpanemarkread'] = 'Označi predogledana sporočila kot prebrana';
+$labels['afternseconds'] = 'po $n sekundah';
+$labels['reqmdn'] = 'Vedno zahtevaj povratnico';
+$labels['reqdsn'] = 'Vedno zahtevaj obvestilo o statusu dostave';
+$labels['replysamefolder'] = 'Shrani odgovore na sporočilo v mapo izvornega sporočila';
 $labels['folder'] = 'Mapa';
 $labels['folders'] = 'Mape';
 $labels['foldername'] = 'Ime mape';
@@ -265,11 +326,15 @@ $labels['subscribed'] = 'Vpisan';
 $labels['messagecount'] = 'Sporočila';
 $labels['create'] = 'Ustvari';
 $labels['createfolder'] = 'Ustvari novo mapo';
-$labels['rename'] = 'Preimenuj';
-$labels['renamefolder'] = 'Preimenuj mapo';
-$labels['deletefolder'] = 'Izbriši mapo';
 $labels['managefolders'] = 'Uredi mape';
 $labels['specialfolders'] = 'Posebne mape';
+$labels['properties'] = 'Lastnosti';
+$labels['folderproperties'] = 'Lastnosti mape';
+$labels['parentfolder'] = 'Glavna mapa';
+$labels['location'] = 'Lokacija';
+$labels['info'] = 'Podatki';
+$labels['getfoldersize'] = 'Klikni za prikaz velikosti mape';
+$labels['changesubscription'] = 'Klikni za spremembo prijave mape';
 $labels['sortby'] = 'Uredi po';
 $labels['sortasc'] = 'Uredi naraščajoče';
 $labels['sortdesc'] = 'Uredi padajoče';
@@ -277,5 +342,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Angleško';
+$labels['westerneuropean'] = 'Zahodnoevropsko';
+$labels['easterneuropean'] = 'Vzhodnoevropsko';
+$labels['southeasterneuropean'] = 'JV Evropsko';
+$labels['baltic'] = 'Baltsko';
+$labels['cyrillic'] = 'Cirilica';
+$labels['arabic'] = 'Arabsko';
+$labels['greek'] = 'Grško';
+$labels['hebrew'] = 'Hebrejsko';
+$labels['turkish'] = 'Turško';
+$labels['nordic'] = 'Nordijsko';
+$labels['thai'] = 'Tajsko';
+$labels['celtic'] = 'Keltsko';
+$labels['vietnamese'] = 'Vietnamsko';
+$labels['japanese'] = 'Japonsko';
+$labels['korean'] = 'Korejsko';
+$labels['chinese'] = 'Kitajsko';
 
 ?>
index ff1991d9535be6994e914bad23c7d1aeadc3eecb..cad0139f749bf70c162650ac59bcf31a07c326f5 100644 (file)
@@ -2,14 +2,14 @@
 
 /*
 +-----------------------------------------------------------------------+
-| language/_NEW_/messages.inc                                           |
+| language/sl_SI/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2008, RoundQube Dev. - Switzerland                      |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2008-2010, RoundQube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author:   Barbara Krasovec -  barbarak@arnes.si                                                            |
+| Author:   Barbara Krasovec -  barbarak@arnes.si                       |
 +-----------------------------------------------------------------------+
 
 */
@@ -18,13 +18,17 @@ $messages = array();
 $messages['loginfailed'] = 'Prijava ni uspela';
 $messages['cookiesdisabled'] = 'Vaš spletni brskalnik ne sprejema piškotkov.';
 $messages['sessionerror'] = 'Seja je neveljavna ali je potekla.';
-$messages['imaperror'] = 'Povzava z IMAP strežnikom je spodletela.';
+$messages['imaperror'] = 'Povezava z IMAP strežnikom je spodletela.';
 $messages['servererror'] = 'Napaka strežnika!';
+$messages['servererrormsg'] = 'Napaka strežnikaČ $msg';
+$messages['errorreadonly'] = 'Operacije ni bilo mogoče izvršiti. Mapa je na voljo samo za branje.';
+$messages['errornoperm'] = 'Operacije ni bilo mogoče izvršiti. Dostop zavrnjen.';
 $messages['invalidrequest'] = 'Neveljavna zahteva. Podatki niso bili shranjeni.';
 $messages['nomessagesfound'] = 'V poštnem predalu ni sporočil.';
 $messages['loggedout'] = 'Odjava je bila uspešna.';
 $messages['mailboxempty'] = 'Poštni predal je prazen.';
 $messages['loading'] = 'Nalaganje...';
+$messages['uploading'] = 'Prenos dokumenta na strežnik...';
 $messages['loadingdata'] = 'Nalaganje podatkov...';
 $messages['checkingmail'] = 'Preverjanje novih sporočil...';
 $messages['sendingmessage'] = 'Pošiljanje sporočil...';
@@ -36,23 +40,24 @@ $messages['addedsuccessfully'] = 'Stik je bil uspešno dodan v imenik.';
 $messages['contactexists'] = 'Stik s tem elektronskim naslovom že obstaja.';
 $messages['blockedimages'] = 'Zaradi zaščite zasebnosti je prikaz slik v sporočilu onemogočen.';
 $messages['encryptedmessage'] = 'Sporočilo je šifrirano in ne more biti prikazano.';
-$messages['nocontactsfound'] = 'Nobenega stika ni bilo mogoče najti.';
+$messages['nocontactsfound'] = 'Ni stikov.';
 $messages['contactnotfound'] = 'Iskanega stika ni bilo mogoče najti.';
 $messages['sendingfailed'] = 'Sporočila ni bilo mogoče poslati.';
-$messages['senttooquickly'] = 'Počakajte $sek sekund in nato znova poskusite s pošiljanjem sporočila.';
+$messages['senttooquickly'] = 'Počakajte $sec sekund in nato znova poskusite s pošiljanjem sporočila.';
 $messages['errorsavingsent'] = 'Pri shranjevanju poslanega sporočila je prišlo do napake.';
 $messages['errorsaving'] = 'Pri shranjevanju je prišlo do napake.';
 $messages['errormoving'] = 'Sporočila ni bilo mogoče premakniti.';
+$messages['errorcopying'] = 'Sporočila ni bilo mogoče kopirati.';
 $messages['errordeleting'] = 'Sporočila ni bilo mogoče izbrisati.';
 $messages['errormarking'] = 'Sporočila ni bilo mogoče označiti.';
 $messages['deletecontactconfirm'] = 'Ste prepričani, da želite izbrisati označen(e) stik(e)?';
 $messages['deletemessagesconfirm'] = 'Ste prepričani, da želite izbrisati označeno(a) sporočilo(a)?';
 $messages['deletefolderconfirm'] = 'Ste prepričani, da želite to mapo izbrisati?';
 $messages['purgefolderconfirm'] = 'Ste prepričani, da želite izbrisati vsa sporočila v mapi?';
-$messages['foldercreating'] = 'Ustvarjanje mape...';
 $messages['folderdeleting'] = 'Brisanje mape...';
-$messages['folderrenaming'] = 'Preimenovanje mape...';
-$messages['foldermoving'] = 'Premiranje mape...';
+$messages['foldermoving'] = 'Premikanje mape...';
+$messages['foldersubscribing'] = 'Prijavljanje mape...';
+$messages['folderunsubscribing'] = 'Odjavljanje mape...';
 $messages['formincomplete'] = 'Obrazec ni v celoti izpolnjen';
 $messages['noemailwarning'] = 'Vnesite veljaven elektronski naslov';
 $messages['nonamewarning'] = 'Vnesite ime';
@@ -65,12 +70,17 @@ $messages['notsentwarning'] = 'Sporočilo ni bilo poslano. Želite zavreči to s
 $messages['noldapserver'] = 'Izberite LDAP strežnik, v katerem želite iskati?';
 $messages['nocontactsreturned'] = 'Nobenega stika ni bilo mogoče najti';
 $messages['nosearchname'] = 'Vnesite ime ali elektronski naslov stika';
+$messages['notuploadedwarning'] = 'Priponke se še nalagajo na strežnik. Počakajte ali prekinite prenos.';
 $messages['searchsuccessful'] = '$nr najdenih sporočil';
 $messages['searchnomatch'] = 'Ni zadetkov';
 $messages['searching'] = 'Iskanje...';
 $messages['checking'] = 'Preverjanje...';
 $messages['nospellerrors'] = 'V tekstu ni bilo nobenih pravopisnih napak';
 $messages['folderdeleted'] = 'Mapa je bila uspešno izbrisana.';
+$messages['foldersubscribed'] = 'Mapa je bila uspešno prijavljena.';
+$messages['folderunsubscribed'] = 'Mapa je bila uspešno odjavljena.';
+$messages['folderpurged'] = 'Mapa je bila uspešno izpraznjena';
+$messages['folderexpunged'] = 'Mapa je bila uspešno skrčena';
 $messages['deletedsuccessfully'] = 'Uspešno izbrisano';
 $messages['converting'] = 'Odstranjevanje nastavitev oblikovanja...';
 $messages['messageopenerror'] = 'Sporočila ni bilo mogoče prenesti iz strežnika';
@@ -81,15 +91,19 @@ $messages['copyerror'] = 'Nobenih naslovov ni bilo mogoče kopirati';
 $messages['sourceisreadonly'] = 'Ta naslov je na voljo samo za branje';
 $messages['errorsavingcontact'] = 'Stika ni bilo mogoče shraniti';
 $messages['movingmessage'] = 'Premikanje sporočila...';
+$messages['copyingmessage'] = 'Kopiranje sporočila...';
+$messages['deletingmessage'] = 'Brisanje sporočil/a';
+$messages['markingmessage'] = 'Označevanje sporočil/a';
 $messages['receiptsent'] = 'Sporočilo o branju je bilo uspešno poslano';
 $messages['errorsendingreceipt'] = 'Sporočila o branju ni bilo mogoče poslati';
 $messages['nodeletelastidentity'] = 'Te identitete ni mogoče izbrisati, saj je edina.';
-$messages['addsubfolderhint'] = 'Ta mapa bo ustvarjena kot podmapa od izbrane mape.';
 $messages['forbiddencharacter'] = 'Ime mape vsebuje nedovoljen znak';
 $messages['selectimportfile'] = 'Izberite datoteko, ki jo želite prenesti';
 $messages['addresswriterror'] = 'Izbran imenik ni zapisljiv';
+$messages['contactaddedtogroup'] = 'Stik je bil uspešno dodan v skupino';
+$messages['contactremovedfromgroup'] = 'Stik je bil uspešno izbrisan iz skupine';
 $messages['importwait'] = 'Uvažanje poteka...';
-$messages['importerror'] = 'Uvažanje je spodletelo. Naložena datoteka ni veljavena vCard datoteka.';
+$messages['importerror'] = 'Uvažanje je spodletelo. Naložena datoteka ni veljavna vCard datoteka.';
 $messages['importconfirm'] = '<b>Uspešno uvoženi $inserted stiki, $skipped stikov že obstaja v imeniku</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Operacija ni dovoljena.';
 $messages['nofromaddress'] = 'V izbrani identiteti manjka elektronski naslov.';
@@ -97,9 +111,28 @@ $messages['editorwarning'] = 'Preklop v splošen urejevalnik onemogoča uporabo
 $messages['httpreceivedencrypterror'] = 'Prišlo je do večje napake v konfiguraciji.Obrnite se na skrbnika sistema.  <b>Sporočila ni bilo mogoče poslati.</b>';
 $messages['smtpconnerror'] = 'Napaka pri pošiljanju ($code): Povezava s strežnikom je spodletela';
 $messages['smtpautherror'] = 'Napaka pri pošiljanju($code): Avtentikacija je spodletela';
-$messages['smtpfromerror'] = 'Napaka pri pošiljanju ($code): Neveljaven elektronski naslov pošiljatelja "$from"';
-$messages['smtptoerror'] = 'Napaka pri pošiljanju ($code): Neveljaven elektronski naslov prejemnika "$to"';
+$messages['smtpfromerror'] = 'Napaka pri pošiljanju ($code): Neveljaven elektronski naslov pošiljatelja "$from" ($msg)';
+$messages['smtptoerror'] = 'Napaka pri pošiljanju ($code): Neveljaven elektronski naslov prejemnika "$to" ($msg)';
 $messages['smtprecipientserror'] = 'Napaka pri pošiljanju: Seznama prejemnikov ni bilo mogoče razčleniti';
+$messages['smtpdsnerror'] = 'Napaka pri pošiljanju: Ni podpore za pošiljanje obvestil o statusu dostave';
 $messages['smtperror'] = 'Napaka pri pošiljanju:$msg';
+$messages['emailformaterror'] = 'Nepravilen elektronski naslov: $email';
+$messages['toomanyrecipients'] = 'Navedli ste preveč prejemnikov. Zmanjšajte število prejemnikov na $max';
+$messages['maxgroupmembersreached'] = 'Število članov skupine presega največje dovoljeno število $max.';
+$messages['internalerror'] = 'Prišlo je do napake. Poskusite znova.';
+$messages['contactdelerror'] = 'Stika/ov ni bilo mogoče izbrisati';
+$messages['contactdeleted'] = 'Stik/i so bili uspešno izbrisani';
+$messages['groupdeleted'] = 'Skupina je bila uspešno izbrisana';
+$messages['grouprenamed'] = 'Skupina je bila uspešno preimenovana';
+$messages['groupcreated'] = 'Skupina je bila uspešno ustvarjena';
+$messages['messagedeleted'] = 'Sporočila so bila uspešno izbrisana';
+$messages['messagemoved'] = 'Sporočila so bila uspešno premaknjena';
+$messages['messagecopied'] = 'Sporočila so bila uspešno kopirana';
+$messages['messagemarked'] = 'Sporočila so bila uspešno označena';
+$messages['autocompletechars'] = 'Vnesite vsaj $min znakov za samodejno dokončanje';
+$messages['namecannotbeempty'] = 'Imena ni mogoče izbrisati';
+$messages['nametoolong'] = 'Ime je predolgo';
+$messages['folderupdated'] = 'Mapa je bila uspešno posodobljena';
+$messages['foldercreated'] = 'Mapa je bila uspešno ustvarjena';
 
 ?>
index 699ecf733a8c0d518da459546502c8bb060c0be1..45b1e011d35da7ea441daa43102f5dd85c000fc1 100644 (file)
@@ -5,15 +5,15 @@
  +-----------------------------------------------------------------------+
  | language/sq_AL/labels.inc                                             |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Dashamir Hoxha <dhoxha@albaniaonline.net>                     |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -180,9 +180,6 @@ $labels['subscribed'] = 'Regjistruar';
 $labels['messagecount'] = 'Mesazhe';
 $labels['create'] = 'Krijo';
 $labels['createfolder'] = 'Krijo kuti të re';
-$labels['rename'] = 'Riemëro';
-$labels['renamefolder'] = 'Riemëro kutinë';
-$labels['deletefolder'] = 'Fshi kutinë';
 $labels['managefolders'] = 'Sistemo kutitë';
 $labels['sortby'] = 'Rradhit sipas';
 $labels['sortasc'] = 'Rradhitje rritëse';
index 34ce7b5ab7c1bc6415c00fd1a169ea07392df6f0..0e1f805cf87ed3e1382e7d636280bf8f08879744 100644 (file)
@@ -5,15 +5,15 @@
  +-----------------------------------------------------------------------+
  | language/sq_AL/messages.inc                                           |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Dashamir Hoxha <dhoxha@albaniaonline.net>                     |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -77,6 +77,5 @@ $messages['movingmessage'] = 'Po lëviz mesazhin...';
 $messages['receiptsent'] = 'U dërgua me sukses një njoftim leximi';
 $messages['errorsendingreceipt'] = 'Nuk mund të dërgohet njoftimi';
 $messages['nodeletelastidentity'] = 'Ju nuk mund ta fshini këtë identitet sepse nuk ju ka mbetur tjetër.';
-$messages['addsubfolderhint'] = 'Kjo kuti do të krijohet si një nënkuti e asaj që është e zgjedhur';
 
 ?>
index bdd77b0ed1eb1b17b3e8d870199d1a8768d16399..70ffd2f2b0bc5460d2c6c347e1666c3fa3cc7a5f 100644 (file)
@@ -5,15 +5,15 @@
  +-----------------------------------------------------------------------+
  | language/sr_cyrillic/labels.inc                                       |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Branko Kokanovic <branko.kokanovic@gmail.com                  |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -180,9 +180,6 @@ $labels['subscribed'] = 'Потписана';
 $labels['messagecount'] = 'Поруке';
 $labels['create'] = 'Креирај';
 $labels['createfolder'] = 'Креирај нову фасциклу';
-$labels['rename'] = 'Преименуј';
-$labels['renamefolder'] = 'Преименуј фасциклу';
-$labels['deletefolder'] = 'Обриши фасциклу';
 $labels['managefolders'] = 'Подеси фасциклу';
 $labels['sortby'] = 'Сортирај по';
 $labels['sortasc'] = 'Сортирај растуће';
index de8b0a2a91aa1b463e17c402cc08a2e9a98b48f6..b5b6c81288cbf2a05caa9d355d3fa336d0930764 100644 (file)
@@ -5,15 +5,15 @@
  +-----------------------------------------------------------------------+
  | language/sr_cyrillic/messages.inc                                     |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Branko Kokanovic <branko.kokanovic@gmail.com>                 |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -77,6 +77,5 @@ $messages['movingmessage'] = 'Премештам поруку...';
 $messages['receiptsent'] = 'Успешно послато обавештење о приспећу';
 $messages['errorsendingreceipt'] = 'Неуспело слање обавештења о приспећу';
 $messages['nodeletelastidentity'] = 'Не можете обрисати овај идентитет, он Вам је последњи.';
-$messages['addsubfolderhint'] = 'Ова фасцикла ће бити креирана као подфасцикла тренутне';
 
 ?>
index a95ee2a005457e0ffb46d63459b1a3ee8800d01c..5ec87a609f7bcee72d1afba72ca2676e42fc12c5 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/sv_SE/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -15,7 +15,7 @@
 |         Andreas Henriksson <andreas@fatal.se>                         |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 3043 2009-10-14 11:45:28Z yllar $
+@version $Id: labels.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -27,7 +27,7 @@ $labels['server'] = 'Server';
 $labels['login'] = 'Logga in';
 $labels['logout'] = 'Logga ut';
 $labels['mail'] = 'Meddelanden';
-$labels['settings'] = 'Personliga inställningar';
+$labels['settings'] = 'Inställningar';
 $labels['addressbook'] = 'Adressbok';
 $labels['inbox'] = 'Inkorg';
 $labels['drafts'] = 'Utkast';
@@ -38,23 +38,24 @@ $labels['subject'] = 'Ämne';
 $labels['from'] = 'Avsändare';
 $labels['to'] = 'Mottagare';
 $labels['cc'] = 'Kopia';
-$labels['bcc'] = 'Hemlig kopia';
-$labels['replyto'] = 'Svara till';
+$labels['bcc'] = 'Dold kopia';
+$labels['replyto'] = 'Svar till';
+$labels['followupto'] = 'Uppföljning till';
 $labels['date'] = 'Datum';
 $labels['size'] = 'Storlek';
 $labels['priority'] = 'Prioritet';
 $labels['organization'] = 'Organisation';
-$labels['reply-to'] = 'Svara till';
+$labels['readstatus'] = 'Lässtatus';
 $labels['mailboxlist'] = 'Kataloger';
 $labels['messagesfromto'] = 'Meddelande $from till $to av $count';
+$labels['threadsfromto'] = 'Tråd $from till $to av $count';
 $labels['messagenrof'] = 'Meddelande $nr av $count';
+$labels['copy'] = 'Kopiera';
+$labels['move'] = 'Flytta';
 $labels['moveto'] = 'Flytta till:';
 $labels['download'] = 'Ladda ner';
 $labels['filename'] = 'Filnamn';
 $labels['filesize'] = 'Filstorlek';
-$labels['preferhtml'] = 'Visa meddelanden i HTML-format';
-$labels['htmlmessage'] = 'HTML-meddelande';
-$labels['prettydate'] = 'Fina datum';
 $labels['addtoaddressbook'] = 'Lägg till i adressbok';
 $labels['sun'] = 'Sön';
 $labels['mon'] = 'Mån';
@@ -96,21 +97,23 @@ $labels['longnov'] = 'November';
 $labels['longdec'] = 'December';
 $labels['today'] = 'Idag';
 $labels['checkmail'] = 'Hämta nya meddelanden';
-$labels['writenewmessage'] = 'Skapa nytt meddelande';
+$labels['writenewmessage'] = 'Nytt meddelande';
 $labels['replytomessage'] = 'Svara avsändaren';
 $labels['replytoallmessage'] = 'Svara avsändaren och alla mottagare';
+$labels['replyall'] = 'Svara alla';
+$labels['replylist'] = 'Svara lista';
 $labels['forwardmessage'] = 'Vidarebefordra meddelande';
-$labels['deletemessage'] = 'Radera meddelande';
+$labels['deletemessage'] = 'Ta bort meddelande';
 $labels['movemessagetotrash'] = 'Flytta meddelande till papperskorgen';
 $labels['printmessage'] = 'Skriv ut';
 $labels['previousmessage'] = 'Visa föregående meddelande';
-$labels['previousmessages'] = 'Visa tidigare grupp av meddelanden';
+$labels['previousmessages'] = 'Visa föregående sida';
 $labels['firstmessage'] = 'Visa första meddelandet';
-$labels['firstmessages'] = 'Visa första gruppen av meddelanden';
+$labels['firstmessages'] = 'Visa första sidan';
 $labels['nextmessage'] = 'Visa nästa meddelande';
-$labels['nextmessages'] = 'Visa nästa grupp av meddelanden';
+$labels['nextmessages'] = 'Visa nästa sida';
 $labels['lastmessage'] = 'Visa sista meddelandet';
-$labels['lastmessages'] = 'Visa sista gruppen av meddelanden';
+$labels['lastmessages'] = 'Visa sista sidan';
 $labels['backtolist'] = 'Tillbaka till meddelandelistan';
 $labels['viewsource'] = 'Visa källkod';
 $labels['markmessages'] = 'Märk meddelande';
@@ -118,16 +121,39 @@ $labels['markread'] = 'Läst';
 $labels['markunread'] = 'Oläst';
 $labels['markflagged'] = 'Flaggat';
 $labels['markunflagged'] = 'Oflaggat';
-$labels['messageactions'] = 'Hanteringsalternativ';
+$labels['messageactions'] = 'Hantera meddelanden';
 $labels['select'] = 'Välj';
 $labels['all'] = 'Alla';
 $labels['none'] = 'Ingen';
+$labels['currpage'] = 'Sida';
 $labels['unread'] = 'Olästa';
 $labels['flagged'] = 'Flaggade';
 $labels['unanswered'] = 'Obesvarade';
-$labels['deleted'] = 'Raderade';
+$labels['deleted'] = 'Borttagna';
 $labels['invert'] = 'Invertera';
 $labels['filter'] = 'Filter';
+$labels['list'] = 'Lista';
+$labels['threads'] = 'Trådar';
+$labels['expand-all'] = 'Visa alla';
+$labels['expand-unread'] = 'Visa olästa';
+$labels['collapse-all'] = 'Dölj alla';
+$labels['threaded'] = 'Trådat';
+$labels['autoexpand_threads'] = 'Visa trådade meddelanden';
+$labels['do_expand'] = 'Alla trådar';
+$labels['expand_only_unread'] = 'Trådar med olästa meddelanden';
+$labels['fromto'] = 'Avsändare/Mottagare';
+$labels['flag'] = 'Flagga';
+$labels['attachment'] = 'Bilaga';
+$labels['nonesort'] = 'Ingen';
+$labels['sentdate'] = 'Datum skickat';
+$labels['arrival'] = 'Datum mottaget';
+$labels['asc'] = 'Stigande';
+$labels['desc'] = 'Fallande';
+$labels['listcolumns'] = 'Kolumner';
+$labels['listsorting'] = 'Sortering';
+$labels['listorder'] = 'Ordning';
+$labels['listmode'] = 'Visningsläge';
+$labels['folderactions'] = 'Hantera kataloger';
 $labels['compact'] = 'Packa';
 $labels['empty'] = 'Töm';
 $labels['purge'] = 'Rensa';
@@ -140,7 +166,7 @@ $labels['searchmod'] = 'Sökalternativ';
 $labels['msgtext'] = 'Hela meddelandet';
 $labels['openinextwin'] = 'Öppna i nytt fönster';
 $labels['emlsave'] = 'Spara (.eml)';
-$labels['compose'] = 'Skapa nytt meddelande';
+$labels['compose'] = 'Nytt meddelande';
 $labels['editasnew'] = 'Redigera som nytt';
 $labels['savemessage'] = 'Spara utkast';
 $labels['sendmessage'] = 'Skicka meddelande';
@@ -148,12 +174,15 @@ $labels['addattachment'] = 'Bifoga fil';
 $labels['charset'] = 'Teckenkodning';
 $labels['editortype'] = 'Textredigerare';
 $labels['returnreceipt'] = 'Mottagarkvitto';
+$labels['dsn'] = 'Leveransstatusmeddelande';
+$labels['editidents'] = 'Ändra identiteter';
 $labels['checkspelling'] = 'Kontrollera stavning';
 $labels['resumeediting'] = 'Återuppta redigering';
 $labels['revertto'] = 'Återgå till';
 $labels['attachments'] = 'Bilagor';
 $labels['upload'] = 'Bifoga';
 $labels['close'] = 'Stäng';
+$labels['messageoptions'] = 'Meddelandealternativ';
 $labels['low'] = 'Låg';
 $labels['lowest'] = 'Lägst';
 $labels['normal'] = 'Normal';
@@ -168,8 +197,9 @@ $labels['savesentmessagein'] = 'Spara kopia i';
 $labels['dontsave'] = 'Spara inte';
 $labels['maxuploadsize'] = 'Tillåten filstorlek är $size';
 $labels['addcc'] = 'Kopia';
-$labels['addbcc'] = 'Hemlig kopia';
-$labels['addreplyto'] = 'Svara till';
+$labels['addbcc'] = 'Dold kopia';
+$labels['addreplyto'] = 'Svar till';
+$labels['addfollowupto'] = 'Uppföljning till';
 $labels['mdnrequest'] = 'Avsändaren har begärt mottagarkvitto för det här meddelandet. Vill du skicka ett mottagarkvitto?';
 $labels['receiptread'] = 'Mottagarkvitto (läst)';
 $labels['yourmessage'] = 'Det här är ett mottagarkvitto för ditt meddelande';
@@ -179,23 +209,28 @@ $labels['firstname'] = 'Förnamn';
 $labels['surname'] = 'Efternamn';
 $labels['email'] = 'E-post';
 $labels['addcontact'] = 'Lägg till ny kontakt';
-$labels['editcontact'] = 'Redigera kontakt';
+$labels['editcontact'] = 'Ändra kontakt';
+$labels['contacts'] = 'Kontakter';
+$labels['contactproperties'] = 'Kontaktegenskaper';
 $labels['edit'] = 'Redigera';
 $labels['cancel'] = 'Avbryt';
 $labels['save'] = 'Spara';
-$labels['delete'] = 'Radera';
+$labels['delete'] = 'Ta bort';
 $labels['newcontact'] = 'Ny kontakt';
-$labels['deletecontact'] = 'Radera vald kontakt';
-$labels['composeto'] = 'Skriv meddelande till vald kontakt';
+$labels['deletecontact'] = 'Ta bort vald kontakt';
+$labels['composeto'] = 'Nytt meddelande till vald kontakt';
 $labels['contactsfromto'] = 'Kontakt $from till $to av $count';
 $labels['print'] = 'Skriv ut';
 $labels['export'] = 'Exportera';
 $labels['exportvcards'] = 'Exportera kontakter';
-$labels['previouspage'] = 'Visa föregående grupp';
-$labels['firstpage'] = 'Visa första gruppen';
-$labels['nextpage'] = 'Visa nästa grupp';
-$labels['lastpage'] = 'Visa sista gruppen';
-$labels['groups'] = 'Grupper';
+$labels['newcontactgroup'] = 'Ny kontaktgrupp';
+$labels['groupactions'] = 'Hantera kontaktgrupper';
+$labels['previouspage'] = 'Visa föregående sida';
+$labels['firstpage'] = 'Visa första sidan';
+$labels['nextpage'] = 'Visa nästa sida';
+$labels['lastpage'] = 'Visa sista sidan';
+$labels['group'] = 'Grupp';
+$labels['groups'] = 'Kontaktgrupper';
 $labels['personaladrbook'] = 'Personliga adresser';
 $labels['import'] = 'Importera';
 $labels['importcontacts'] = 'Importera kontakter';
@@ -207,11 +242,15 @@ $labels['settingsfor'] = 'Inställningar för';
 $labels['preferences'] = 'Inställningar';
 $labels['userpreferences'] = 'Användarinställningar';
 $labels['editpreferences'] = 'Ändra användarinställningar';
-$labels['identities'] = 'Profiler';
-$labels['manageidentities'] = 'Hantera profiler för detta konto';
-$labels['newidentity'] = 'Ny profil';
-$labels['newitem'] = 'Ny post';
-$labels['edititem'] = 'Ändra post';
+$labels['identities'] = 'Identiteter';
+$labels['manageidentities'] = 'Hantera identiteter';
+$labels['newidentity'] = 'Ny identitet';
+$labels['newitem'] = 'Ny information';
+$labels['edititem'] = 'Ändra information';
+$labels['preferhtml'] = 'Visa meddelanden i HTML-format';
+$labels['defaultcharset'] = 'Förvald teckenkodning';
+$labels['htmlmessage'] = 'HTML-meddelande';
+$labels['prettydate'] = 'Fina datum';
 $labels['setdefault'] = 'Sätt som standard';
 $labels['autodetect'] = 'Automatiskt';
 $labels['language'] = 'Språk';
@@ -220,6 +259,7 @@ $labels['pagesize'] = 'Rader per sida';
 $labels['signature'] = 'Signatur';
 $labels['dstactive'] = 'Sommartid';
 $labels['htmleditor'] = 'Skriv meddelanden i HTML-format';
+$labels['htmlonreply'] = 'Endast vid svar på meddelande i HTML-format';
 $labels['htmlsignature'] = 'HTML-signatur';
 $labels['previewpane'] = 'Visa meddelandefältet';
 $labels['skin'] = 'Stilmall för användargränssnitt';
@@ -231,10 +271,13 @@ $labels['mailboxview'] = 'Hantering av meddelanden';
 $labels['mdnrequests'] = 'Skicka mottagarkvitton';
 $labels['askuser'] = 'Fråga';
 $labels['autosend'] = 'Automatiskt';
+$labels['autosendknown'] = 'Skicka kvitto till mina kontakter, fråga för övriga';
+$labels['autosendknownignore'] = 'Skicka kvitto till mina kontakter, ignorera övriga';
 $labels['ignore'] = 'Ignorera';
 $labels['readwhendeleted'] = 'Märk meddelande som läst vid borttagning';
-$labels['flagfordeletion'] = 'Flagga meddelande för borttagning istället för att radera direkt';
-$labels['skipdeleted'] = 'Visa inte raderade meddelanden';
+$labels['flagfordeletion'] = 'Flagga meddelande för borttagning istället för att ta bort direkt';
+$labels['skipdeleted'] = 'Visa inte borttagna meddelanden';
+$labels['deletealways'] = 'Ta bort meddelande om flyttning till Papperskorg misslyckas';
 $labels['showremoteimages'] = 'Visa externt länkade bilder i meddelande';
 $labels['fromknownsenders'] = 'Från kända avsändare';
 $labels['always'] = 'Alltid';
@@ -243,34 +286,56 @@ $labels['autosavedraft'] = 'Spara utkast med automatiskt intervall';
 $labels['everynminutes'] = '$n min';
 $labels['keepalive'] = 'Hämta nya meddelanden med automatiskt intervall';
 $labels['never'] = 'Aldrig';
+$labels['immediately'] = 'Direkt';
 $labels['messagesdisplaying'] = 'Visning av meddelanden';
 $labels['messagescomposition'] = 'Redigering av meddelanden';
 $labels['mimeparamfolding'] = 'Kodning av namn på bifogade filer';
 $labels['2231folding'] = 'Full RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (Outlook)';
 $labels['2047folding'] = 'Full RFC 2047 (övriga)';
+$labels['force7bit'] = 'Använd MIME-kodning för tecken med 8-bitar';
 $labels['advancedoptions'] = 'Avancerade inställningar';
 $labels['focusonnewmessage'] = 'Fokusera webbläsarens fönster vid nytt meddelande';
 $labels['checkallfolders'] = 'Genomsök samtliga kataloger efter nya meddelanden';
-$labels['displaynext'] = 'Visa nästa meddelande efter radering/flyttning av meddelande';
-$labels['indexsort'] = 'Använd meddelandets index vid sortering i datumordning';
+$labels['displaynext'] = 'Visa nästa meddelande efter borttagning/flyttning av meddelande';
 $labels['mainoptions'] = 'Huvudalternativ';
 $labels['section'] = 'Avdelning';
 $labels['maintenance'] = 'Underhåll';
 $labels['newmessage'] = 'Nytt meddelande';
 $labels['listoptions'] = 'Listalternativ';
+$labels['signatureoptions'] = 'Signaturalternativ';
+$labels['whenreplying'] = 'Vid svar';
+$labels['replytopposting'] = 'Ovanför befintligt meddelande';
+$labels['replybottomposting'] = 'Nedanför befintligt meddelande';
+$labels['replyremovesignature'] = 'Ta bort befintlig signatur från meddelandet vid svar';
+$labels['autoaddsignature'] = 'Infoga signatur automatiskt';
+$labels['newmessageonly'] = 'Vid nytt meddelande';
+$labels['replyandforwardonly'] = 'Vid svar och vidarebefordran';
+$labels['replysignaturepos'] = 'Vid svar eller vidarebefordran infoga signatur';
+$labels['belowquote'] = 'Nedanför befintligt meddelande';
+$labels['abovequote'] = 'Ovanför befintligt meddelande';
+$labels['insertsignature'] = 'Infoga signatur';
+$labels['previewpanemarkread'] = 'Märk meddelande som läst vid visning';
+$labels['afternseconds'] = 'Efter $n sekunder';
+$labels['reqmdn'] = 'Begär alltid mottagarkvitto';
+$labels['reqdsn'] = 'Begär alltid leveransstatusmeddelande';
+$labels['replysamefolder'] = 'Placera svar i samma katalog som besvarat meddelande';
 $labels['folder'] = 'Katalog';
 $labels['folders'] = 'Kataloger';
 $labels['foldername'] = 'Katalognamn';
-$labels['subscribed'] = 'Ansluten';
+$labels['subscribed']  = 'Prenumererad';
 $labels['messagecount'] = 'Meddelanden';
 $labels['create'] = 'Skapa';
-$labels['createfolder'] = 'Skapa ny katalog';
-$labels['rename'] = 'Byt namn';
-$labels['renamefolder'] = 'Byt katalognamn';
-$labels['deletefolder'] = 'Radera katalog';
+$labels['createfolder'] = 'Ny katalog';
 $labels['managefolders'] = 'Hantera kataloger';
 $labels['specialfolders'] = 'Speciella kataloger';
+$labels['properties'] = 'Egenskaper';
+$labels['folderproperties'] = 'Katalogegenskaper';
+$labels['parentfolder'] = 'Överliggande katalog';
+$labels['location'] = 'Plats';
+$labels['info'] = 'Information';
+$labels['getfoldersize'] = 'Klicka för katalogstorlek';
+$labels['changesubscription'] = 'Klicka för att ändra prenumeration';
 $labels['sortby'] = 'Sortera på';
 $labels['sortasc'] = 'Sortera stigande';
 $labels['sortdesc'] = 'Sortera fallande';
@@ -278,5 +343,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'Engelsk';
+$labels['westerneuropean'] = 'Västeuropeisk';
+$labels['easterneuropean'] = 'Östeuropeisk';
+$labels['southeasterneuropean'] = 'Sydösteuropeisk';
+$labels['baltic'] = 'Baltisk';
+$labels['cyrillic'] = 'Kyrillisk';
+$labels['arabic'] = 'Arabisk';
+$labels['greek'] = 'Grekisk';
+$labels['hebrew'] = 'Hebreisk';
+$labels['turkish'] = 'Turkisk';
+$labels['nordic'] = 'Skandinavisk';
+$labels['thai'] = 'Thailändsk';
+$labels['celtic'] = 'Keltisk';
+$labels['vietnamese'] = 'Vietnamesisk';
+$labels['japanese'] = 'Japansk';
+$labels['korean'] = 'Koreansk';
+$labels['chinese'] = 'Kinesisk';
 
 ?>
index 5e6faaa6cec6d770f140f56575a8a2451ed15c48..4bdd46b70bd1a76a16af6e8f0aceba62f53d7505 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/sv_SE/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -15,7 +15,7 @@
 |         Andreas Henriksson <andreas@fatal.se>                         |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 3043 2009-10-14 11:45:28Z yllar $
+@version $Id: messages.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -23,8 +23,11 @@ $messages = array();
 $messages['loginfailed'] = 'Inloggningen misslyckades';
 $messages['cookiesdisabled'] = 'Din webbläsare accepterar inte cookies';
 $messages['sessionerror'] = 'Din inloggning är felaktig eller har gått ut';
-$messages['imaperror'] = 'Kontakt med IMAP-servern misslyckades';
-$messages['servererror'] = 'Fel i servern!';
+$messages['imaperror'] = 'Anslutning till IMAP-servern misslyckades';
+$messages['servererror'] = 'Serverfel!';
+$messages['servererrormsg'] = 'Serverfel: $msg';
+$messages['errorreadonly'] = 'Åtgärden kunde inte utföras. Katalogen är skrivskyddad';
+$messages['errornoperm'] = 'Åtgärden kunde inte utföras. Otillräcklig befogenhet';
 $messages['invalidrequest'] = 'Ogiltig begäran! Informationen sparades inte.';
 $messages['nomessagesfound'] = 'Inga meddelanden';
 $messages['loggedout'] = 'Du är utloggad. Välkommen åter!';
@@ -32,74 +35,83 @@ $messages['mailboxempty'] = 'Katalogen är tom';
 $messages['loading'] = 'Laddar...';
 $messages['uploading'] = 'Överför fil...';
 $messages['loadingdata'] = 'Laddar data...';
-$messages['checkingmail'] = 'Letar efter nya meddelanden...';
+$messages['checkingmail'] = 'Hämtar nya meddelanden...';
 $messages['sendingmessage'] = 'Skickar meddelande...';
 $messages['messagesent'] = 'Meddelandet har skickats';
 $messages['savingmessage'] = 'Sparar meddelande...';
-$messages['messagesaved'] = 'Meddelande sparades till utkast';
+$messages['messagesaved'] = 'Meddelandet har sparats i Utkast';
 $messages['successfullysaved'] = 'Informationen har sparats';
 $messages['addedsuccessfully'] = 'Kontakten har lagts till i adressboken';
 $messages['contactexists'] = 'En kontakt med den här adressen finns redan';
 $messages['blockedimages'] = 'Externt länkade bilder i meddelandet har blockerats.';
 $messages['encryptedmessage'] = 'Meddelandet är krypterat och kan tyvärr inte visas.';
 $messages['nocontactsfound'] = 'Inga kontakter hittades';
-$messages['contactnotfound'] = 'Den efterfrågade kontanten hittades inte';
+$messages['contactnotfound'] = 'Efterfrågad kontakt hittades inte';
 $messages['sendingfailed'] = 'Meddelandet kunde inte skickas';
 $messages['senttooquickly'] = 'Vänta ytterligare $sec sekunder med att skicka meddelandet';
-$messages['errorsavingsent'] = 'Ett fel inträffade när det skickade meddelandet sparades';
-$messages['errorsaving'] = 'Meddelandet kunde inte sparads';
+$messages['errorsavingsent'] = 'Ett fel inträffade när det skickade meddelandet skulle sparas';
+$messages['errorsaving'] = 'Meddelandet kunde inte sparas';
 $messages['errormoving'] = 'Meddelandet kunde inte flyttas';
-$messages['errordeleting'] = 'Meddelandet kunde inte raderas';
+$messages['errorcopying'] = 'Meddelandet kunde inte kopieras';
+$messages['errordeleting'] = 'Meddelandet kunde inte tas bort';
 $messages['errormarking'] = 'Meddelandet kunde inte markeras';
-$messages['deletecontactconfirm'] = 'Vill du verkligen radera valda kontakter?';
+$messages['deletecontactconfirm'] = 'Vill du verkligen ta bort valda kontakter?';
 $messages['deletemessagesconfirm'] = 'Vill du verkligen ta bort valda meddelanden?';
-$messages['deletefolderconfirm'] = 'Vill du verkligen radera den här katalogen?';
-$messages['purgefolderconfirm'] = 'Vill du verkligen radera alla meddelanden i den här katalogen?';
-$messages['foldercreating'] = 'Skapar katalog...';
-$messages['folderdeleting'] = 'Raderar katalog...';
-$messages['folderrenaming'] = 'Namnändrar katalog...';
+$messages['deletefolderconfirm'] = 'Vill du verkligen ta bort den här katalogen?';
+$messages['purgefolderconfirm'] = 'Vill du verkligen ta bort alla meddelanden i den här katalogen?';
+$messages['folderdeleting'] = 'Tar bort katalog...';
 $messages['foldermoving'] = 'Flyttar katalog...';
-$messages['formincomplete'] = 'Formuläret var inte ifyllt i sin helhet';
-$messages['noemailwarning'] = 'Vänligen ange en giltig adress';
-$messages['nonamewarning'] = 'Vänligen ange ett namn';
-$messages['nopagesizewarning'] = 'Vänligen ange en sidstorlek';
-$messages['nosenderwarning'] = 'Vänligen ange en avsändaradress';
-$messages['norecipientwarning'] = 'Vänligen ange minst en mottagare';
-$messages['nosubjectwarning'] = 'Ämnesfältet är tomt. Vill du lägga till något nu?';
+$messages['foldersubscribing'] = 'Startar prenumeration på katalog...';
+$messages['folderunsubscribing'] = 'Avslutar prenumeration på katalog...';
+$messages['formincomplete'] = 'Formuläret var inte komplett ifyllt';
+$messages['noemailwarning'] = 'Ange en giltig adress';
+$messages['nonamewarning'] = 'Ange ett namn';
+$messages['nopagesizewarning'] = 'Ange en sidstorlek';
+$messages['nosenderwarning'] = 'Ange en avsändaradress';
+$messages['norecipientwarning'] = 'Ange minst en mottagare';
+$messages['nosubjectwarning'] = 'Ämnesraden är tom. Vill du ange ämne nu?';
 $messages['nobodywarning'] = 'Skicka det här meddelandet utan text?';
 $messages['notsentwarning'] = 'Meddelandet har inte skickats. Vill du avbryta meddelandet?';
-$messages['noldapserver'] = 'Vänligen ange en LDAP-server att söka';
+$messages['noldapserver'] = 'Ange en LDAP-server för att söka';
 $messages['nocontactsreturned'] = 'Inga kontakter hittades';
-$messages['nosearchname'] = 'Vänligen ange ett kontaktnamn eller en adress';
+$messages['nosearchname'] = 'Ange ett kontaktnamn eller en adress';
 $messages['notuploadedwarning'] = 'Alla bilagor har inte överförts ännu. Vänligen vänta eller avbryt överföringen.';
 $messages['searchsuccessful'] = '$nr meddelanden hittades';
 $messages['searchnomatch'] = 'Sökningen gav inget resultat';
 $messages['searching'] = 'Söker...';
 $messages['checking'] = 'Kontrollerar...';
 $messages['nospellerrors'] = 'Inget stavfel hittades';
-$messages['folderdeleted'] = 'Katalogen raderades';
+$messages['folderdeleted'] = 'Katalogen togs bort';
+$messages['foldersubscribed'] = 'Prenumeration på katalog startad';
+$messages['folderunsubscribed'] = 'Prenumeration på katalog avslutad';
+$messages['folderpurged'] = 'Katalog rensad';
+$messages['folderexpunged'] = 'Katalog tömd';
 $messages['deletedsuccessfully'] = 'Lyckad borttagning';
 $messages['converting'] = 'Tar bort formatering från meddelande...';
-$messages['messageopenerror'] = 'Kunde inte ladda meddelande från servern';
+$messages['messageopenerror'] = 'Meddelandet kunde inte hämtas från servern';
 $messages['fileuploaderror'] = 'Filuppladdning misslyckades';
-$messages['filesizeerror'] = 'Den uppladdade filen överstiger maxstorleken $size';
-$messages['copysuccess'] = 'Lyckad kopiering av $nr adresser';
-$messages['copyerror'] = 'Kunde inte kopiera några adresser';
+$messages['filesizeerror'] = 'Den uppladdade filens storlek överstiger högsta tillåtna $size';
+$messages['copysuccess'] = '$nr adresser har kopierats';
+$messages['copyerror'] = 'Några adresser kunde inte kopieras';
 $messages['sourceisreadonly'] = 'Denna adresskälla är skrivskyddad';
-$messages['errorsavingcontact'] = 'Kunde inte spara kontaktadressen';
+$messages['errorsavingcontact'] = 'Kontaktadressen kunde inte sparas';
 $messages['movingmessage'] = 'Flyttar meddelande...';
+$messages['copyingmessage'] = 'Kopierar meddelande...';
+$messages['deletingmessage'] = 'Tar bort meddelande...';
+$messages['markingmessage'] = 'Markerar meddelande...';
 $messages['receiptsent'] = 'Mottagarkvitto har skickats';
-$messages['errorsendingreceipt'] = 'Kunde inte skicka mottagarkvitto';
-$messages['nodeletelastidentity'] = 'Du kan inte radera den här identiteten, det är din sista.';
-$messages['addsubfolderhint'] = 'Den här katalogen kommer att skapas som en underkatalog till den valda';
+$messages['errorsendingreceipt'] = 'Mottagarkvitto kunde inte skickas';
+$messages['nodeletelastidentity'] = 'Du kan inte ta bort identiteten, den är din sista.';
 $messages['forbiddencharacter'] = 'Katalognamnet innehåller otillåtna tecken';
 $messages['selectimportfile'] = 'Välj en fil att ladda upp';
 $messages['addresswriterror'] = 'Angiven adressbok är skrivskyddad';
+$messages['contactaddedtogroup'] = 'Kontakterna har lagts till i gruppen';
+$messages['contactremovedfromgroup'] = 'Kontakterna har tagits bort från gruppen';
 $messages['importwait'] = 'Importerar, var god vänta...';
 $messages['importerror'] = 'Importen misslyckades! Filen är inte i vCard-format.';
 $messages['importconfirm'] = '<b>Lyckad import av $inserted kontakter, $skipped dubbletter har ignorerats:</b><p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Otillåten operation!';
-$messages['nofromaddress'] = 'Adressen saknas i den valda identiteten';
+$messages['nofromaddress'] = 'Adress saknas i den valda identiteten';
 $messages['editorwarning'] = 'Genom att växla till text-läge går formateringen förlorad. Vill du fortsätta?';
 $messages['httpreceivedencrypterror'] = 'Ett irreparabelt fel har uppstått. Kontakta administratören omgående. <b>Meddelandet kan inte skickas.</b>';
 $messages['smtpconnerror'] = 'SMTP-fel ($code): Anslutning till servern misslyckades';
@@ -107,6 +119,25 @@ $messages['smtpautherror'] = 'SMTP-fel ($code): Inloggningen misslyckades';
 $messages['smtpfromerror'] = 'SMTP-fel ($code): Kan inte sätta avsändaradress till "$from"';
 $messages['smtptoerror'] = 'SMTP-fel ($code): Kan inte lägga till mottagaradress "$to"';
 $messages['smtprecipientserror'] = 'SMTP-fel: Felaktigt formaterad lista med mottagaradresser';
+$messages['smtpdsnerror'] = 'SMTP-fel: Inget stöd för leveransstatusmeddelande';
 $messages['smtperror'] = 'SMTP-fel: $msg';
+$messages['emailformaterror'] = 'Felaktig adress: $email';
+$messages['toomanyrecipients'] = 'Förmånga mottagare. Minska antalet till högst $max.';
+$messages['maxgroupmembersreached'] = 'Antalet gruppmedlemmar får inte överstiga $max';
+$messages['internalerror'] = 'Ett internt fel uppstod. Försök igen.';
+$messages['contactdelerror'] = 'Kontakt kunde inte tas bort';
+$messages['contactdeleted'] = 'Kontakt borttagen';
+$messages['groupdeleted'] = 'Grupp borttagen';
+$messages['grouprenamed'] = 'Gruppnamn ändrat';
+$messages['groupcreated'] = 'Grupp skapad';
+$messages['messagedeleted'] = 'Meddelande borttaget';
+$messages['messagemoved'] = 'Meddelande flyttat';
+$messages['messagecopied'] = 'Meddelande kopierat';
+$messages['messagemarked'] = 'Meddelande markerat';
+$messages['autocompletechars'] = 'Ange minst $min tecken för automatisk komplettering';
+$messages['namecannotbeempty'] = 'Namnet får inte vara tomt';
+$messages['nametoolong'] = 'Namnet är för långt';
+$messages['folderupdated'] = 'Katalog uppdaterad';
+$messages['foldercreated'] = 'Katalog skapad';
 
 ?>
diff --git a/program/localization/ta_IN/labels.inc b/program/localization/ta_IN/labels.inc
new file mode 100644 (file)
index 0000000..2045c7b
--- /dev/null
@@ -0,0 +1,285 @@
+<?php
+
+/*
++-----------------------------------------------------------------------+
+| language/_NEW_/labels.inc                                             |
+|                                                                       |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2008-2010, Roundcube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author:                                                               |
++-----------------------------------------------------------------------+
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'நல்வரவு';
+$labels['username'] = 'பயனர்';
+$labels['password'] = 'கடவுச்சொல்';
+$labels['server'] = 'சேவையகம்';
+$labels['login'] = 'நுழை';
+$labels['logout'] = 'வெளியேறு';
+$labels['mail'] = 'மின்னஞ்சல்';
+$labels['settings'] = 'அமைப்புகள்';
+$labels['addressbook'] = 'தொடர்புகள்';
+$labels['inbox'] = 'அகப்பெட்டி';
+$labels['drafts'] = 'வரைவுகள்';
+$labels['sent'] = 'அனுப்பிய அஞ்சல்';
+$labels['trash'] = 'குப்பை';
+$labels['junk'] = 'எரிதம்';
+$labels['subject'] = 'தலைப்பு';
+$labels['from'] = 'அனுப்புனர்';
+$labels['to'] = 'பெறுனர்';
+$labels['cc'] = 'நகல்';
+$labels['bcc'] = 'மறை நகல்';
+$labels['replyto'] = 'பதிலளி';
+$labels['date'] = 'தேதி';
+$labels['size'] = 'அளவு';
+$labels['priority'] = 'முக்கியத்துவம்';
+$labels['organization'] = 'நிறுவனம்';
+$labels['reply-to'] = 'பதிலளி';
+$labels['mailboxlist'] = 'அடைவு';
+$labels['messagesfromto'] = 'செய்திகள் $countல் $from லிருந்து $to வரை';
+$labels['messagenrof'] = '$countல் $nr வது செய்தி';
+$labels['moveto'] = 'இதற்கு அனுப்பு...';
+$labels['download'] = 'பதிவிறக்கு';
+$labels['filename'] = 'கோப்பு பெயர்';
+$labels['filesize'] = 'கோப்பு அளவு';
+$labels['preferhtml'] = 'HTML காட்டு';
+$labels['htmlmessage'] = 'HTML செய்தி';
+$labels['prettydate'] = 'நல்ல தேதி';
+$labels['addtoaddressbook'] = 'தொடர்புகளுக்கு சேர்க்கவும்';
+$labels['sun'] = 'ஞாயிறு';
+$labels['mon'] = 'திங்கள்';
+$labels['tue'] = 'செவ்வாய்';
+$labels['wed'] = 'புதன்';
+$labels['thu'] = 'வியாழன்';
+$labels['fri'] = 'வெள்ளி';
+$labels['sat'] = 'சனி';
+$labels['sunday'] = 'ஞாயிறு';
+$labels['monday'] = 'திங்கள்';
+$labels['tuesday'] = 'செவ்வாய்';
+$labels['wednesday'] = 'புதன்';
+$labels['thursday'] = 'வியாழன்';
+$labels['friday'] = 'வெள்ளி';
+$labels['saturday'] = 'சனி';
+$labels['jan'] = 'சனவரி';
+$labels['feb'] = 'பிப்ரவரி';
+$labels['mar'] = 'மார்ச்';
+$labels['apr'] = 'ஏப்ரல்';
+$labels['may'] = 'மே';
+$labels['jun'] = 'சூன்';
+$labels['jul'] = 'சூலை';
+$labels['aug'] = 'ஆகஸ்ட்';
+$labels['sep'] = 'செப்டம்பர்';
+$labels['oct'] = 'அக்டோபர்';
+$labels['nov'] = 'நவம்பர்';
+$labels['dec'] = 'டிசம்பர்';
+$labels['longjan'] = 'சனவரி';
+$labels['longfeb'] = 'பிப்ரவரி';
+$labels['longmar'] = 'மார்ச்';
+$labels['longapr'] = 'ஏப்ரல்';
+$labels['longmay'] = 'மே';
+$labels['longjun'] = 'சூன்';
+$labels['longjul'] = 'சூலை';
+$labels['longaug'] = 'ஆகஸ்ட்';
+$labels['longsep'] = 'செப்டம்பர்';
+$labels['longoct'] = 'அக்டோபர்';
+$labels['longnov'] = 'நவம்பர்';
+$labels['longdec'] = 'டிசம்பர்';
+$labels['today'] = 'இன்று';
+$labels['checkmail'] = 'புது அஞ்சல்களை பார்க்கவும்';
+$labels['writenewmessage'] = 'புது அஞ்சல் எழுதவும்';
+$labels['replytomessage'] = 'அனுப்புனருக்கு பதிலளி';
+$labels['replytoallmessage'] = 'அனுப்புனர் மற்றும் எல்லா பெறுனர்களுக்கும் பதிலளி';
+$labels['forwardmessage'] = 'செய்தியை முன்அனுப்பு';
+$labels['deletemessage'] = 'செய்தியை நீக்கு';
+$labels['movemessagetotrash'] = 'செய்தியை குப்பைக்கு நகர்த்து';
+$labels['printmessage'] = 'செய்தியை அச்சிடவும்';
+$labels['previousmessage'] = 'முந்திய செய்தியை காட்டவும்';
+$labels['previousmessages'] = 'முந்திய செய்திகள் குழுவை காட்டவும்';
+$labels['firstmessage'] = 'முதல் செய்தியை காட்டவும்';
+$labels['firstmessages'] = 'முதல் செய்திகள் குழுவை காட்டவும்';
+$labels['nextmessage'] = 'அடுத்த செய்தியை காட்டு';
+$labels['nextmessages'] = 'அடுத்த செய்திகள் குழுவை காட்டு';
+$labels['lastmessage'] = 'கடைசி செய்தியை காட்டு';
+$labels['lastmessages'] = 'கடைசி செய்திகள் குழுவை காட்டு';
+$labels['backtolist'] = 'செய்தி பட்டியலுக்கு செல்லவும்';
+$labels['viewsource'] = 'மூலத்தை காட்டு';
+$labels['markmessages'] = 'செய்திகளை குறியிடு';
+$labels['markread'] = 'படித்ததாக குறியிடு';
+$labels['markunread'] = 'படிக்காததாக குறியிடு';
+$labels['markflagged'] = 'நட்சத்திரமிட்டதாக குறியிடு';
+$labels['markunflagged'] = 'நட்சத்திரமிடாததாக குறியிடு';
+$labels['messageactions'] = 'மேலும் செயல்கள்';
+$labels['select'] = 'தேர்ந்தெடு';
+$labels['all'] = 'எல்லாம்';
+$labels['none'] = 'எதுவுமில்லை';
+$labels['unread'] = 'படிக்காதது';
+$labels['flagged'] = 'நட்சத்திரமிட்டது';
+$labels['unanswered'] = 'பதிலளிக்காதது';
+$labels['deleted'] = 'நீக்கியது';
+$labels['invert'] = 'தலைகீழ்';
+$labels['filter'] = 'வடிப்பான்';
+$labels['compact'] = 'குறுகிய';
+$labels['empty'] = 'காலி';
+$labels['purge'] = 'நீக்கு';
+$labels['quota'] = 'பயன்பாட்டு அளவு';
+$labels['unknown'] = 'தெரியாத';
+$labels['unlimited'] = 'அளவில்லா';
+$labels['quicksearch'] = 'விரைவு தேடல்';
+$labels['resetsearch'] = 'தேடலை மறுஅமை';
+$labels['searchmod'] = 'மாற்றிகளை தேடு';
+$labels['msgtext'] = 'முழு செய்தி';
+$labels['openinextwin'] = 'புது சாளரத்தில் திற';
+$labels['emlsave'] = 'பதிவிறக்கு (.eml)';
+$labels['compose'] = 'அஞ்சல் எழுது';
+$labels['editasnew'] = 'புதியதாக திருத்து';
+$labels['savemessage'] = 'இந்த வரைவை சேமி';
+$labels['sendmessage'] = 'இப்போது அனுப்பு';
+$labels['addattachment'] = 'ஒரு கோப்பை இணைக்கவும்';
+$labels['charset'] = 'எழுத்து குறிமுறை';
+$labels['editortype'] = 'திருத்தும் வகை';
+$labels['returnreceipt'] = 'திரும்பு சீட்டு';
+$labels['checkspelling'] = 'எழுத்துப்பிழை சரிபார்';
+$labels['resumeediting'] = 'திருத்துவதை தொடரவும்';
+$labels['revertto'] = 'முந்திய நிலைக்கு திரும்பவும்';
+$labels['attachments'] = 'கோப்பு இணைப்புகள்';
+$labels['upload'] = 'பதிவேற்று';
+$labels['close'] = 'மூடு';
+$labels['low'] = 'குறைந்த';
+$labels['lowest'] = 'மிக குறைந்த';
+$labels['normal'] = 'சாதாரண';
+$labels['high'] = 'அதிக';
+$labels['highest'] = 'மிக அதிக';
+$labels['nosubject'] = '(தலைப்பில்லா)';
+$labels['showimages'] = 'படங்களை காட்டு';
+$labels['alwaysshow'] = '$-னிடமிருந்து வரும் படங்களை காட்டு';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'எளிய உரை';
+$labels['savesentmessagein'] = 'அனுப்பிய அஞ்சலை இங்கு சேமிக்கவும்';
+$labels['dontsave'] = 'சேமிக்காதே';
+$labels['maxuploadsize'] = 'அனுமதிக்கப்படும் அதிகபட்ச கோப்பு அளவு $';
+$labels['addcc'] = 'நகல் சேர்';
+$labels['addbcc'] = 'மறை நகல் சேர்';
+$labels['addreplyto'] = 'பதிலளிக்க வேண்டியவர்களை சேர்';
+$labels['mdnrequest'] = 'இந்த செய்தியின் அனுப்புனர் இதை படித்தவுடன் அறிவிக்கும்படி கேட்டார். அறிவிக்க விரும்புகிறீர்களா ?';
+$labels['receiptread'] = 'திரும்பு சீட்டு (படி)';
+$labels['yourmessage'] = 'இது உங்கள் செய்தியின் திரும்பு சீட்டு';
+$labels['receiptnote'] = 'குறிப்பு: இந்த ஒப்புகை பெறுனரிடம் செய்தியை காட்டியதற்காக வருகிறது. அவர் அதை படித்ததற்கு எந்த உத்திரவாதமும் இல்லை';
+$labels['name'] = 'காட்சி பெயர்';
+$labels['firstname'] = 'முதற் பெயர்';
+$labels['surname'] = 'கடைசி பெயர்';
+$labels['email'] = 'மின்னஞ்சல்';
+$labels['addcontact'] = 'புது தொடர்பை சேர்';
+$labels['editcontact'] = 'தொடர்பை திருத்து';
+$labels['edit'] = 'திருத்து';
+$labels['cancel'] = 'ரத்து';
+$labels['save'] = 'சேமி';
+$labels['delete'] = 'நீக்கு';
+$labels['newcontact'] = 'புது தொடர்பு அட்டையை உருவாக்கு';
+$labels['deletecontact'] = 'தேர்ந்தெடுத்த தொடர்புகளை நீக்கு';
+$labels['composeto'] = 'இவர்-கு அஞ்சல் எழுது';
+$labels['contactsfromto'] = 'தொடர்புகள் $countல் $from லிருந்து $to வரை';
+$labels['print'] = 'அச்சிடு';
+$labels['export'] = 'ஏற்றுமதி';
+$labels['exportvcards'] = 'தொடர்புகளை vCard வடிவத்தில் ஏற்றுமதி செய்யவும்';
+$labels['previouspage'] = 'முந்திய குழுவை காட்டு';
+$labels['firstpage'] = 'முதல் குழுவை காட்டு';
+$labels['nextpage'] = 'அடுத்த குழுவை காட்டு';
+$labels['lastpage'] = 'கடைசி குழுவை காட்டு';
+$labels['groups'] = 'குழுக்கள்';
+$labels['personaladrbook'] = 'சுய முகவரி';
+$labels['import'] = 'இறக்குமதி';
+$labels['importcontacts'] = 'தொடர்புகளை இறக்குமதி செய்யவும்';
+$labels['importfromfile'] = 'இந்த கோப்பிலிருந்து இறக்குமதி செய்யவும்:';
+$labels['importreplace'] = 'எல்லா தொடர்புகளையும் மாற்றி அமை';
+$labels['importtext'] = 'நீங்கள் ஏற்கனவே உள்ள தொடர்புகளை ஏற்றலாம்.<br/>நாங்கள் முகவரியை <a href="http://en.wikipedia.org/wiki/VCard">vCard</a> தரவு வடிவத்தில் ஏற்றுவதை ஆதரிக்கிறோம்';
+$labels['done'] = 'முடிந்தது';
+$labels['settingsfor'] = 'இதற்கான அமைப்புகள்';
+$labels['preferences'] = 'விருப்பங்கள்';
+$labels['userpreferences'] = 'பயனர் விருப்பங்கள்';
+$labels['editpreferences'] = 'பயனர் விருப்பங்களை திருத்து';
+$labels['identities'] = 'அடையாளங்கள்';
+$labels['manageidentities'] = 'இந்த கணக்கிற்கான அடையாளங்களை நிற்வாகிக்கவும்';
+$labels['newidentity'] = 'புது அடையாளம்';
+$labels['newitem'] = 'புது உருப்படி';
+$labels['edititem'] = 'உருப்படியை திருத்து';
+$labels['setdefault'] = 'இயல்பை அமை';
+$labels['autodetect'] = 'தானியங்கி';
+$labels['language'] = 'மொழி';
+$labels['timezone'] = 'நேர மண்டலம்';
+$labels['pagesize'] = 'ஒரு பக்கத்திற்கான வரிகள்';
+$labels['signature'] = 'கையொப்பம்';
+$labels['dstactive'] = 'பகல் ஒளி சேமிப்பு நேரம்';
+$labels['htmleditor'] = 'HTML செய்திகளை எழுது';
+$labels['htmlsignature'] = 'HTML கையொப்பம்';
+$labels['previewpane'] = 'முந்திய பாத்தியை காட்டு';
+$labels['skin'] = 'முகப்பு தோற்றம்';
+$labels['logoutclear'] = 'வெளியேறும் போது குப்பையை காலி செய்';
+$labels['logoutcompact'] = 'வெளியேறும் போது இன்பாக்ஸை குறுக்கவும்';
+$labels['uisettings'] = 'பயனர் முகப்பு';
+$labels['serversettings'] = 'சேவையகம் அமைப்புகள்';
+$labels['mailboxview'] = 'அஞ்சல் பெட்டி காட்சி';
+$labels['mdnrequests'] = 'அனுப்புனர் அறிவிப்புகள்';
+$labels['askuser'] = 'பயனரை கேள்';
+$labels['autosend'] = 'தானாக அனுப்பு';
+$labels['ignore'] = 'தவிர்';
+$labels['readwhendeleted'] = 'செய்தியை நீக்கும் போது படித்ததாக குறி';
+$labels['flagfordeletion'] = 'நீக்குவதற்கு பதிலாக நீக்குவதாக நட்சத்திரமிடு';
+$labels['skipdeleted'] = 'நீக்கிய செய்திகளை காட்டாதே';
+$labels['showremoteimages'] = 'தொலை தூர துணை படங்களை காட்டு';
+$labels['fromknownsenders'] = 'தெரிந்த அனுப்புனரிடமிருந்து';
+$labels['always'] = 'எப்போதும்';
+$labels['showinlineimages'] = 'இணைத்த படங்களை செய்திகளுக்கு கீழே காட்டவும்';
+$labels['autosavedraft'] = 'தானாக வரைவுகளை சேமி';
+$labels['everynminutes'] = 'ஒவ்வொரு $n நிமிடங்களுக்கும்';
+$labels['keepalive'] = 'புது செய்திக்கு இங்கு சரி பார்';
+$labels['never'] = 'எப்போதுமில்லை';
+$labels['messagesdisplaying'] = 'செய்திகளை காட்டுகிறது';
+$labels['messagescomposition'] = 'செய்திகளை எழுதுகிறது';
+$labels['mimeparamfolding'] = 'இணைப்பு பெயர்கள்';
+$labels['2231folding'] = 'முழு RFC 2231 (Thunderbird)';
+$labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
+$labels['2047folding'] = 'முழு RFC 2047 (மற்ற)';
+$labels['advancedoptions'] = 'மேம்பட்ட விருப்பங்கள்';
+$labels['focusonnewmessage'] = 'உலாவி சாளரத்தை புது செய்திக்காக கவனி';
+$labels['checkallfolders'] = 'புது செய்திகளுக்காக எல்லா அடைவுகளையும் சரிபார்';
+$labels['displaynext'] = 'செய்தியை நீக்கு/நகர் பிறகு அடுத்த செய்தியை காட்டு';
+$labels['mainoptions'] = 'முக்கிய விருப்பங்கள்';
+$labels['section'] = 'பிரிவு';
+$labels['maintenance'] = 'பராமரிப்பு';
+$labels['newmessage'] = 'புது செய்தி';
+$labels['listoptions'] = 'விருப்பங்களை பட்டியலிடு';
+$labels['signatureoptions'] = 'கையொப்ப விருப்பங்கள்';
+$labels['whenreplying'] = 'பதிலளிக்கும் போது';
+$labels['replytopposting'] = 'புது செய்தியை அசலின் மேல் துவக்கு';
+$labels['replybottomposting'] = 'புது செய்தியை அசலின் கீழ் துவக்கு';
+$labels['replyremovesignature'] = 'பதிலளிக்கும் போது அசல் கையெழுத்தை செய்தியிலிருந்து நீக்கவும்';
+$labels['autoaddsignature'] = 'தானாக கையொப்பத்தை சேர்';
+$labels['newmessageonly'] = 'புது செய்தி மட்டும்';
+$labels['replyandforwardonly'] = 'பதிலளிப்பு முன்அனுப்பு மட்டும்';
+$labels['replysignaturepos'] = 'பதிலளிக்கும் போதும் முன்அனுப்பும் போதும் கையோப்பமிடு';
+$labels['belowquote'] = 'மேற்கோளுக்கு கீழே';
+$labels['abovequote'] = 'மேற்கோளுக்கு மேலே';
+$labels['insertsignature'] = 'கையோப்பமிடு';
+$labels['folder'] = 'அடைவு';
+$labels['folders'] = 'அடைவுகள்';
+$labels['foldername'] = 'அடைவு பெயர்';
+$labels['subscribed'] = 'சந்தா';
+$labels['messagecount'] = 'செய்திகள்';
+$labels['create'] = 'உருவாக்கு';
+$labels['createfolder'] = 'புது அடைவு உருவாக்கு';
+$labels['managefolders'] = 'அடைவுகளை நிற்வகி';
+$labels['specialfolders'] = 'சிறப்பு அடைவுகள்';
+$labels['sortby'] = 'வாரியாக அடுக்கு';
+$labels['sortasc'] = 'ஏறு வரிசையாக அடுக்கு';
+$labels['sortdesc'] = 'இறங்கு வரிசையாக அடுக்கு';
+$labels['B'] = 'B';
+$labels['KB'] = 'KB';
+$labels['MB'] = 'MB';
+$labels['GB'] = 'GB';
+
+?>
diff --git a/program/localization/ta_IN/messages.inc b/program/localization/ta_IN/messages.inc
new file mode 100644 (file)
index 0000000..7f722f6
--- /dev/null
@@ -0,0 +1,105 @@
+<?php
+
+/*
++-----------------------------------------------------------------------+
+| language/_NEW_/messages.inc                                           |
+|                                                                       |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2008-2010, Roundcube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author:                                                               |
++-----------------------------------------------------------------------+
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'நுழைவு தோல்வியடைந்தது';
+$messages['cookiesdisabled'] = 'உங்கள் உலாவி நினைவிகளை அனுமதிப்பதில்லை';
+$messages['sessionerror'] = 'உங்கள் அமர்வு செல்லாது அல்லது முடிவுற்றது';
+$messages['imaperror'] = 'IMAP சேவையகத்திற்கான இணைப்பு தோல்வியடைந்தது';
+$messages['servererror'] = 'சேவையக பிழை!';
+$messages['invalidrequest'] = 'செல்லாத வேண்டுகோள்! எந்த தரவும் சேமிக்கப்படவில்லை.';
+$messages['nomessagesfound'] = 'இந்த தபால் பெட்டியில் எந்த தரவும் சேமிக்கப்படவில்லை';
+$messages['loggedout'] = 'நீங்கள் அமர்வை வெற்றிகரமாக முடித்தீர்கள். வணக்கம்';
+$messages['mailboxempty'] = 'தபால் பெட்டி காலியாக உள்ளது';
+$messages['loading'] = 'ஏற்றுகிறது...';
+$messages['uploading'] = 'கோப்பை ஏற்றுகிறது...';
+$messages['loadingdata'] = 'தரவை ஏற்றுகிறது...';
+$messages['checkingmail'] = 'புது செய்திகளை சரிபார்க்கிறது...';
+$messages['sendingmessage'] = 'செய்தியை அனுப்புகிறது...';
+$messages['messagesent'] = 'செய்தி வெற்றிகரமாக அனுப்பப்பட்டது';
+$messages['savingmessage'] = 'செய்தியை சேமிக்கிறது...';
+$messages['messagesaved'] = 'செய்தி வரைவில் சேமிக்கப்பட்டது';
+$messages['successfullysaved'] = 'வெற்றிகரமாக சேமிக்கப்பட்டது';
+$messages['addedsuccessfully'] = 'தொடர்பு சேமிக்கப்பட்டது';
+$messages['contactexists'] = 'இந்த மின்னஞ்சல் முகவரியுடன் ஒரு தொடர்பு ஏற்கனவே உள்ளது';
+$messages['blockedimages'] = 'உங்கள் தனிப்பட்ட தகவலை பாதுகாக்க, தொலை தூரப் படங்கள் இந்த செய்தியில் தடுக்கப்பட்டது';
+$messages['encryptedmessage'] = 'மன்னிக்கவும்! இந்த செய்தி குறிமுறையாக்கப்பட்டது அதனால் காட்ட முடியாது.';
+$messages['nocontactsfound'] = 'எந்த தொடர்புகளும் காணப்படவில்லை';
+$messages['contactnotfound'] = 'நீங்கள் வேண்டிய தொடர்பு காணப்படவில்லை';
+$messages['sendingfailed'] = 'செய்தி அனுப்புவது தோல்வியுற்றது';
+$messages['senttooquickly'] = 'இந்த செய்தி அனுப்புவதற்கு முன்பு தயவு செய்து $sec வினாடி(கள்) காத்திருக்கவும்.';
+$messages['errorsavingsent'] = 'அனுப்பிய அஞ்சலை சேமிக்கும் போது பிழை ஏற்பட்டது';
+$messages['errorsaving'] = 'சேமிக்கும் போது பிழை ஏற்பட்டது';
+$messages['errormoving'] = 'செய்தியை நகர்த்த முடியவில்லை';
+$messages['errordeleting'] = 'செய்தியை நீக்க முடியவில்லை';
+$messages['errormarking'] = 'செய்தியை நட்சத்திரமிட முடியவில்லை';
+$messages['deletecontactconfirm'] = 'நீங்கள் தேர்ந்தெடுத்த தொடர்புகளை நீக்க விரும்புகிறீர்களா ?';
+$messages['deletemessagesconfirm'] = 'நீங்கள் தேர்ந்தெடுத்த செய்திகளை நீக்க விரும்புகிறீர்களா ?';
+$messages['deletefolderconfirm'] = 'நீங்கள் இந்த அடைவை நீக்க விரும்புகிறீர்களா ?';
+$messages['purgefolderconfirm'] = 'நீங்கள் இந்த அடைவிலிருக்கும் எல்லா செய்திகளையும் நீக்க விரும்புகிறீர்களா ?';
+$messages['folderdeleting'] = 'அடைவை நீக்குகிறது...';
+$messages['foldermoving'] = 'அடைவை நகர்த்துகிறது...';
+$messages['formincomplete'] = 'விண்ணப்பத்தை முழுமையாக நிறைவு செய்யவில்லை';
+$messages['noemailwarning'] = 'தயவு செய்து உண்மையான மின்னஞ்சலை எழுதுங்கள்';
+$messages['nonamewarning'] = 'தயவு செய்து பெயரை எழுதுங்கள்';
+$messages['nopagesizewarning'] = 'தயவு செய்து தாழின் அளவை எழுதுங்கள்';
+$messages['nosenderwarning'] = 'தயவு செய்து ஒரு அனுப்புனரின் மின்னஞ்சல் முகவரியாவது எழுதுங்கள்';
+$messages['norecipientwarning'] = 'தயவு செய்து ஒரு பெறுனரையாவது எழுதுங்கள்';
+$messages['nosubjectwarning'] = 'தலைப்பு காலியாக உள்ளது. இப்போது எழுத விரும்புகிறீர்களா?';
+$messages['nobodywarning'] = 'உரையில்லாமல் இந்த செய்தியை அனுப்ப வேண்டுமா?';
+$messages['notsentwarning'] = 'செய்தி அனுப்பப்படவில்லை. உங்கள் செய்தியை நிராகரிக்க விரும்புகிறீர்களா?';
+$messages['noldapserver'] = 'தயவு செய்து தேடுவதற்கு Idap சேவையகத்தை தேர்ந்தெடுங்கள்';
+$messages['nocontactsreturned'] = 'எந்த தொடர்புகளும் காணப்படவில்லை';
+$messages['nosearchname'] = 'தயவு செய்து தொடர்பின் பெயரோ மின்னஞ்சல் முகவரியோ எழுதுங்கள்';
+$messages['notuploadedwarning'] = 'எல்லா இணைப்புகளும் ஏற்றப்படவில்லை. தயவு செய்து காத்திருங்கள் அல்லது ஏற்றத்தை ரத்து செய்யுங்கள்.';
+$messages['searchsuccessful'] = '$nr செய்திகள் கண்டுபிடிக்கப்பட்டது';
+$messages['searchnomatch'] = 'தேடுதல் எந்த பொருத்தத்தையும் அனுப்பவில்லை';
+$messages['searching'] = 'தேடுகிறது...';
+$messages['checking'] = 'சரி பார்க்கிறது...';
+$messages['nospellerrors'] = 'எழுத்து பிழைகள் இல்லை';
+$messages['folderdeleted'] = 'அடைவு வெற்றிகரமாக நீக்கப்பட்டது';
+$messages['deletedsuccessfully'] = 'வெற்றிகரமாக நீக்கப்பட்டது';
+$messages['converting'] = 'வடிவத்தை நீக்குகிறது...';
+$messages['messageopenerror'] = 'சேவையகத்திலிருந்து செய்தியை ஏற்ற முடியவில்லை';
+$messages['fileuploaderror'] = 'கோப்பு ஏற்றம் தோல்வியடாந்தது';
+$messages['filesizeerror'] = 'ஏற்றிய கோப்பு அதிகபட்ச அளவான $size-ஐ மீறியது';
+$messages['copysuccess'] = 'வெற்றிகரமாக $nr முகவரிக்களை நகலெடுத்தது';
+$messages['copyerror'] = 'எந்த முகவரியையும் நகலெடுக்க முடியவில்லை';
+$messages['sourceisreadonly'] = 'இந்த முகவரியின் மூலத்தை படிக்க மட்டும்தான் முடியும்';
+$messages['errorsavingcontact'] = 'தொடர்பு முகவரியை சேமிக்க முடியவில்லை';
+$messages['movingmessage'] = 'செய்தியை நகர்த்துகிறது...';
+$messages['receiptsent'] = 'படித்த சீட்டு வெற்றிகரமாக அனுப்பப்பட்டது';
+$messages['errorsendingreceipt'] = 'சீட்டை அனுப்ப முடியவில்லை';
+$messages['nodeletelastidentity'] = 'நீங்கள் இந்த அடையாளத்தை நீக்க முடியாது இது தான் கடைசி';
+$messages['forbiddencharacter'] = 'அடைவு பெயரில் தடை செய்யப்பட்ட எழுத்துக்கள் உள்ளது';
+$messages['selectimportfile'] = 'தயவு செய்து ஏற்றுவதற்கு ஒரு கோப்பை தேர்ந்தெடுங்கள்';
+$messages['addresswriterror'] = 'நீங்கள் தேர்ந்தெடுத்த தொடர்புகளில் எழுத முடியாது';
+$messages['importwait'] = 'ஏற்றுகிறது, தயவு செய்து காத்திருங்கள்...';
+$messages['importerror'] = 'ஏற்றுவது தோல்வியடைந்தது! ஏற்றிய கோப்பு ஒரு செல்லுபடியாகும் vCard கோப்பு இல்லை';
+$messages['importconfirm'] = '<b>வெற்றிகரமாக $inserted தொடர்புகள் ஏற்றப்பட்டது, ஏற்கனவே உள்ள $skipped தொடர்புகள் தவிர்க்கப்பட்டது</b>: <p><em>$names</em></p>';
+$messages['opnotpermitted'] = 'பணி அனுமதிக்கப்படவில்லை!';
+$messages['nofromaddress'] = 'நீங்கள் தேர்ந்தெடுத்த அடையாளத்தில் மின்னஞ்சல் இல்லை';
+$messages['editorwarning'] = 'எளிய உரை திருத்திக்கு மாறுவதன் மூலம் எல்லா உரை வடிவங்களும் தொலைந்து போகக் கூடும். தொடர விரும்புகிறீர்களா ?';
+$messages['httpreceivedencrypterror'] = 'அமைப்பில் பெரிய பிழை ஏற்பட்டது. உங்கள் நிர்வாகியை உடனே தொடர்பு கொள்ளவும். <b>உங்கள் செய்தியை அனுப்ப முடியாது.</b>';
+$messages['smtpconnerror'] = 'SMTP பிழை ($code): சேவையகத்தின் இணைப்பு தோல்வியடைந்தது';
+$messages['smtpautherror'] = 'SMTP பிழை ($code): நம்பகத்தன்மை தோல்வியடைந்தது';
+$messages['smtpfromerror'] = 'SMTP பிழை ($code): அனுப்புனரை "$from" ஆக வைப்பதில் தோல்வி';
+$messages['smtptoerror'] = 'SMTP பிழை ($code): "$to" பெறுனரை சேர்பதில் தோல்வி';
+$messages['smtprecipientserror'] = 'SMTP பிழை : பெறுனர் பட்டியலை பிரிக்க முடியவில்லை';
+$messages['smtperror'] = 'SMTP பிழை: $msg';
+$messages['emailformaterror'] = 'தவறான மின்னஞ்சல் முகவரி: $email     ';
+
+?>
index cb6419ed9671ac5d57f908827f98253396c189f0..786ec38c28e2b8f997a1c1fa20f23c0d6ada4aea 100644 (file)
@@ -5,15 +5,15 @@
  +-----------------------------------------------------------------------+
  | language/th_TH/labels.inc                                             |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Wiraphan Treeratphan <webmaster@modoeye.com>                  |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -162,9 +162,6 @@ $labels['foldername'] = 'ชื่อกล่องจดหมาย';
 $labels['subscribed'] = 'ลงชื่อ';
 $labels['create'] = 'สร้าง';
 $labels['createfolder'] = 'สร้างกล่องจดหมาย';
-$labels['rename'] = 'เปลื่ยนชื่อ';
-$labels['renamefolder'] = 'เปลี่ยนชื่อกล่องจดหมาย';
-$labels['deletefolder'] = 'ลบกล่องจดหมาย';
 $labels['managefolders'] = 'จัดการกล่องจดหมาย';
 $labels['sortby'] = 'เรียงตาม';
 $labels['sortasc'] = 'เรียงจากหน้าไปหลัง';
index ceecc675e5101d07220199dd2c06102fa5f473f7..b49925e6f5c0d6674945a26e5da51c5a30913cac 100644 (file)
@@ -5,15 +5,15 @@
  +-----------------------------------------------------------------------+
  | language/th_TH/messages.inc                                           |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Wiraphan Treeratphan <webmaster@modoeye.com>                  |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 543 2007-04-28 18:07:12Z thomasb $
+ @version $Id: messages.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
index d66a29a3d09dc66c2afac6e9aa756eb10c59f309..d8584bf675721e6f0861f25d9b911dd08fa82604 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/tr/labels.inc                                                |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 | Author: Gökdeniz Karadağ <gokdenizk@gmail.com>                        |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2827 2009-08-02 13:32:47Z yllar $
+@version $Id: labels.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -39,21 +39,22 @@ $labels['to'] = 'Alıcı';
 $labels['cc'] = 'İlgili Kopyası';
 $labels['bcc'] = 'Gizli Kopya';
 $labels['replyto'] = 'Yanıtla';
+$labels['followupto'] = 'Takip adresi';
 $labels['date'] = 'Tarih';
 $labels['size'] = 'Boyut';
 $labels['priority'] = 'Öncelik';
 $labels['organization'] = 'Kuruluş';
-$labels['reply-to'] = 'Yanıtlama Adresi';
+$labels['readstatus'] = 'Okundu durumu';
 $labels['mailboxlist'] = 'Klasörler';
 $labels['messagesfromto'] = 'Postalar: $from - $to , Toplam: $count';
+$labels['threadsfromto'] = 'Dizilmler: $from - $to, Toplam $count';
 $labels['messagenrof'] = 'Posta: $nr / $count';
+$labels['copy'] = 'Kopyala';
+$labels['move'] = 'Taşı';
 $labels['moveto'] = 'Buraya taşı...';
 $labels['download'] = 'İndir';
 $labels['filename'] = 'Dosya Adı';
 $labels['filesize'] = 'Dosya Boyutu';
-$labels['preferhtml'] = 'HTML görüntüle';
-$labels['htmlmessage'] = 'HTML Posta';
-$labels['prettydate'] = 'Tarihi kısaltarak göster';
 $labels['addtoaddressbook'] = 'Adres Defterine Ekle';
 $labels['sun'] = 'Paz';
 $labels['mon'] = 'Pzt';
@@ -98,6 +99,8 @@ $labels['checkmail'] = 'Yeni postaları kontrol et';
 $labels['writenewmessage'] = 'Yeni posta oluştur';
 $labels['replytomessage'] = 'Gönderene yanıtla';
 $labels['replytoallmessage'] = 'Gönderene ve tüm alıcılara yanıtla';
+$labels['replyall'] = 'Tümüne yanıtla';
+$labels['replylist'] = 'Listeye yanıtla';
 $labels['forwardmessage'] = 'Postayı ilet';
 $labels['deletemessage'] = 'Postayı sil';
 $labels['movemessagetotrash'] = 'Postayı çöpe taşı';
@@ -121,12 +124,35 @@ $labels['messageactions'] = 'Diğer eylemler...';
 $labels['select'] = 'Seç';
 $labels['all'] = 'Hepsini';
 $labels['none'] = 'Hiçbirini';
+$labels['currpage'] = 'Şimdiki sayfa';
 $labels['unread'] = 'Okunmamışları';
 $labels['flagged'] = 'İşaretlenmişleri';
 $labels['unanswered'] = 'Yanıtlanmamışları';
 $labels['deleted'] = 'Silinmişleri';
 $labels['invert'] = 'Seçimi Tersine Çevir';
 $labels['filter'] = 'Göster';
+$labels['list'] = 'Liste';
+$labels['threads'] = 'Dizilimler';
+$labels['expand-all'] = 'Tümünü genişlet';
+$labels['expand-unread'] = 'Okunmamışları genişlet';
+$labels['collapse-all'] = 'Tümünü daralt';
+$labels['threaded'] = 'Dizilimli';
+$labels['autoexpand_threads'] = 'Dizilimleri aç';
+$labels['do_expand'] = 'tüm dizilimler';
+$labels['expand_only_unread'] = 'sadece okunmamış posta içeren dizilimler';
+$labels['fromto'] = 'Gönderici/Alıcı';
+$labels['flag'] = 'İşaret';
+$labels['attachment'] = 'Eklenti';
+$labels['nonesort'] = 'Yok';
+$labels['sentdate'] = 'Gönderim tarihi';
+$labels['arrival'] = 'Alım tarihi';
+$labels['asc'] = 'artan';
+$labels['desc'] = 'azalan';
+$labels['listcolumns'] = 'Sütunları listele';
+$labels['listsorting'] = 'Sıralama sütunu';
+$labels['listorder'] = 'Sıralama düzeni';
+$labels['listmode'] = 'Liste görünümü';
+$labels['folderactions'] = 'Klasör eylemleri...';
 $labels['compact'] = 'Sıklaştır';
 $labels['empty'] = 'Boşalt';
 $labels['purge'] = 'Sil';
@@ -147,12 +173,15 @@ $labels['addattachment'] = 'Dosya ekle';
 $labels['charset'] = 'Karakter kodlaması';
 $labels['editortype'] = 'Düzenleyici';
 $labels['returnreceipt'] = 'Alındı onayı';
+$labels['dsn'] = 'Teslimat durumu bildirisi';
+$labels['editidents'] = 'Kimlikleri düzenle';
 $labels['checkspelling'] = 'Yazım denetimi yap';
 $labels['resumeediting'] = 'Düzenlemeye devam et';
 $labels['revertto'] = 'Geri çevir:';
 $labels['attachments'] = 'Ekler';
 $labels['upload'] = 'Yükle';
 $labels['close'] = 'Kapat';
+$labels['messageoptions'] = 'İleti seçenekleri...';
 $labels['low'] = 'Düşük';
 $labels['lowest'] = 'En Düşük';
 $labels['normal'] = 'Normal';
@@ -169,6 +198,7 @@ $labels['maxuploadsize'] = 'İzin verilen en büyük dosya boyutu $size';
 $labels['addcc'] = 'İlgili kopyası ekle';
 $labels['addbcc'] = 'Gizli kopya ekle';
 $labels['addreplyto'] = 'Yanıtlama adresi ekle';
+$labels['addfollowupto'] = 'Takip adresi ekle';
 $labels['mdnrequest'] = 'Bu postayı gönderen kişi, postayı okuduğunuza dair alındı onayı istedi. Alındı onayını göndermek ister misiniz ?';
 $labels['receiptread'] = 'Alındı Onayı (okundu)';
 $labels['yourmessage'] = 'Bu, postanız için alındı onayıdır';
@@ -179,6 +209,8 @@ $labels['surname'] = 'Soyad';
 $labels['email'] = 'E-Posta';
 $labels['addcontact'] = 'Adres defterine ekle';
 $labels['editcontact'] = 'Kişiyi düzenle';
+$labels['contacts'] = 'Kişiler';
+$labels['contactproperties'] = 'Kişi özellikleri';
 $labels['edit'] = 'Düzenle';
 $labels['cancel'] = 'İptal';
 $labels['save'] = 'Kaydet';
@@ -190,10 +222,13 @@ $labels['contactsfromto'] = 'Kişiler: $from - $to , Toplam: $count';
 $labels['print'] = 'Yazdır';
 $labels['export'] = 'Dışa aktar';
 $labels['exportvcards'] = 'vCard olarak dışa aktar';
+$labels['newcontactgroup'] = 'Yeni kişi grubu oluştur';
+$labels['groupactions'] = 'Kişi grupları için eylemler...';
 $labels['previouspage'] = 'Öncekileri göster';
 $labels['firstpage'] = 'İlkini göster';
 $labels['nextpage'] = 'Sonrakileri göster';
 $labels['lastpage'] = 'Sonuncuyu göster';
+$labels['group'] = 'Grup';
 $labels['groups'] = 'Gruplar';
 $labels['personaladrbook'] = 'Adresler';
 $labels['import'] = 'İçe aktar';
@@ -211,6 +246,10 @@ $labels['manageidentities'] = 'Bu hesap için kimlikleri düzenle';
 $labels['newidentity'] = 'Yeni kimlik';
 $labels['newitem'] = 'Yeni öğe';
 $labels['edititem'] = 'Öğe düzenle';
+$labels['preferhtml'] = 'HTML görüntüle';
+$labels['defaultcharset'] = 'Varsayılan Karakter Kümesi';
+$labels['htmlmessage'] = 'HTML Posta';
+$labels['prettydate'] = 'Tarihi kısaltarak göster';
 $labels['setdefault'] = 'Varsayılan olarak ata';
 $labels['autodetect'] = 'Otomatik';
 $labels['language'] = 'Dil';
@@ -219,6 +258,7 @@ $labels['pagesize'] = 'Bir sayfadaki satır sayısı';
 $labels['signature'] = 'İmza';
 $labels['dstactive'] = 'Yaz saati uygulaması';
 $labels['htmleditor'] = 'HTML postaları oluştur';
+$labels['htmlonreply'] = 'sadece HTML postaları yanıtlarken';
 $labels['htmlsignature'] = 'HTML imza';
 $labels['previewpane'] = 'Önizleme panelini göster';
 $labels['skin'] = 'Arayüz görünümü';
@@ -230,10 +270,13 @@ $labels['mailboxview'] = 'Posta Kutusu Görünümü';
 $labels['mdnrequests'] = 'Alındı onayları';
 $labels['askuser'] = 'kullanıcıya sor';
 $labels['autosend'] = 'otomatik olarak gönder';
+$labels['autosendknown'] = 'adres defterimdekilere alındı onayı gönder, diğerlerini bana sor';
+$labels['autosendknownignore'] = 'adres defterimdekilere alındı onayı gönder, diğerlerini gözardı et';
 $labels['ignore'] = 'gözardı et';
 $labels['readwhendeleted'] = 'Silinen postaları okunmuş olarak işaretle';
 $labels['flagfordeletion'] = 'Postaları silmek yerine silinecek olarak işaretle';
 $labels['skipdeleted'] = 'Silinmiş postaları gösterme';
+$labels['deletealways'] = 'Postaların çöpe taşınmasında sorun çıkarsa, postaları sil';
 $labels['showremoteimages'] = 'Uzaktan yüklenen resimleri göster';
 $labels['fromknownsenders'] = 'bilinen göndericilerden';
 $labels['always'] = 'her zaman';
@@ -242,16 +285,40 @@ $labels['autosavedraft'] = 'Taslağı otomatik kaydet:';
 $labels['everynminutes'] = 'her $n dakikada bir';
 $labels['keepalive'] = 'Yeni postaları denetle:';
 $labels['never'] = 'asla';
+$labels['immediately'] = 'hemen';
 $labels['messagesdisplaying'] = 'Posta Görüntüleme';
 $labels['messagescomposition'] = 'Yeni Posta Oluşturma';
 $labels['mimeparamfolding'] = 'Eklenti isimleri';
 $labels['2231folding'] = 'Tam RFC 2231 (Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
 $labels['2047folding'] = 'Tam RFC 2047 (diğer)';
+$labels['force7bit'] = '8 bitlik karakterler için MIME kodlaması kullan';
 $labels['advancedoptions'] = 'Gelişmiş seçenekler';
 $labels['focusonnewmessage'] = 'Yeni posta geldiğinde web tarayıcı penceresine odaklan.';
 $labels['checkallfolders'] = 'Tüm klasörlerdeki yeni postaları denetle';
 $labels['displaynext'] = 'Posta silindikten/taşındıktan sonra sıradaki postayı göster';
+$labels['mainoptions'] = 'Ana Seçenekler';
+$labels['section'] = 'Bölüm';
+$labels['maintenance'] = 'Bakım';
+$labels['newmessage'] = 'Yeni Posta';
+$labels['listoptions'] = 'Liste Seçenekleri';
+$labels['signatureoptions'] = 'İmza Seçenekleri';
+$labels['whenreplying'] = 'Yanıtlarken';
+$labels['replytopposting'] = 'yeni postayı alıntı metninin üstünden başlat';
+$labels['replybottomposting'] = 'yeni postayı alıntı metninden sonra başlat';
+$labels['replyremovesignature'] = 'Yanıtlarken önceki imzaları sil';
+$labels['autoaddsignature'] = 'Otomatik olarak imza ekle';
+$labels['newmessageonly'] = 'sadece yeni postalarda';
+$labels['replyandforwardonly'] = 'sadece yanıtlar ve yönlendirmelerde';
+$labels['replysignaturepos'] = 'Yanıtlarken veya yönlendirirken imzayı yerleştir';
+$labels['belowquote'] = 'alıntının altına';
+$labels['abovequote'] = 'alıntının üstüne';
+$labels['insertsignature'] = 'İmza ekle';
+$labels['previewpanemarkread'] = 'Önzilemede görünen postaları okunmuş işaretle';
+$labels['afternseconds'] = '$n saniye sonra';
+$labels['reqmdn'] = 'Her zaman alındı onayı iste';
+$labels['reqdsn'] = 'Her zaman teslimat durumu bildirisi iste';
+$labels['replysamefolder'] = 'Yanıtları, yanıtlanan postanın bulunduğu klasöre kaydet';
 $labels['folder'] = 'Klasör';
 $labels['folders'] = 'Klasörler';
 $labels['foldername'] = 'Klasör ismi';
@@ -259,11 +326,15 @@ $labels['subscribed'] = 'Abonelik';
 $labels['messagecount'] = 'Postalar';
 $labels['create'] = 'Oluştur';
 $labels['createfolder'] = 'Yeni klasör oluştur';
-$labels['rename'] = 'Yeniden adlandır';
-$labels['renamefolder'] = 'Klasörü yeniden adlandır';
-$labels['deletefolder'] = 'Klasörü sil';
 $labels['managefolders'] = 'Klasörleri düzenle';
 $labels['specialfolders'] = 'Özel klasörler';
+$labels['properties'] = 'Özellikler';
+$labels['folderproperties'] = 'Klasör özellikleri';
+$labels['parentfolder'] = 'Üst klasör';
+$labels['location'] = 'Konum';
+$labels['info'] = 'Bilgi';
+$labels['getfoldersize'] = 'Klasör büyüklüğünü öğrenmek için tıklayın';
+$labels['changesubscription'] = 'Abonelik durumunu değiştirmek için tıklayın';
 $labels['sortby'] = 'Sırala';
 $labels['sortasc'] = 'Artarak';
 $labels['sortdesc'] = 'Azalarak';
@@ -271,5 +342,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = 'İngilizce ';
+$labels['westerneuropean'] = 'Batı Avrupa';
+$labels['easterneuropean'] = 'Doğu Avrupa';
+$labels['southeasterneuropean'] = 'Güneydoğu Avrupa';
+$labels['baltic'] = 'Baltık';
+$labels['cyrillic'] = 'Kiril';
+$labels['arabic'] = 'Arapça';
+$labels['greek'] = 'Yunanca';
+$labels['hebrew'] = 'İbranice';
+$labels['turkish'] = 'Türkçe';
+$labels['nordic'] = 'İskandinav';
+$labels['thai'] = 'Tay Dili';
+$labels['celtic'] = 'Keltik';
+$labels['vietnamese'] = 'Vietnamca';
+$labels['japanese'] = 'Japonca';
+$labels['korean'] = 'Korece';
+$labels['chinese'] = 'Çince';
 
 ?>
index a497d787f53153486e70be903db8c40ff3896eb6..c2baf35de9c25a55144dc0b40e45425bf48e81ec 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | language/tr/messages.inc                                              |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 | Author: Gökdeniz Karadağ <gokdenizk@gmail.com>                        |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2827 2009-08-02 13:32:47Z yllar $
+@version $Id: messages.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -24,11 +24,15 @@ $messages['cookiesdisabled'] = 'Tarayıcınız çerezleri kabul etmiyor';
 $messages['sessionerror'] = 'Oturumunuz sona ermiş veya hatalı';
 $messages['imaperror'] = 'IMAP sunucusuna bağlanılamadı';
 $messages['servererror'] = 'Sunucu Hatası!';
+$messages['servererrormsg'] = 'Sunucu hatası: $msg';
+$messages['errorreadonly'] = 'İşlem gerçekleştirilemedi. Klasör sadece okunabilir';
+$messages['errornoperm'] = 'İşlem gerçekleştirilemedi. İzin verilmedi.';
 $messages['invalidrequest'] = 'Geçersiz İstek! Veri kaydedilmedi';
 $messages['nomessagesfound'] = 'Posta kutusunda ileti bulunamadı';
 $messages['loggedout'] = 'Oturumu başarılı bir şekilde kapattınız. Güle güle!';
 $messages['mailboxempty'] = 'Posta kutusu boş';
 $messages['loading'] = 'Yükleniyor...';
+$messages['uploading'] = 'Dosya yükleniyor...';
 $messages['loadingdata'] = 'Veriler yükleniyor...';
 $messages['checkingmail'] = 'Yeni postalara bakılıyor...';
 $messages['sendingmessage'] = 'Posta gönderiliyor...';
@@ -47,16 +51,17 @@ $messages['senttooquickly'] = 'Lütfen bu postayı göndermeden önce $sec saniy
 $messages['errorsavingsent'] = 'Gönderilen postayı kaydederken hata oluştu';
 $messages['errorsaving'] = 'Kaydederken bir hata oluştu';
 $messages['errormoving'] = 'Posta taşınamadı';
+$messages['errorcopying'] = 'Posta kopyalanamadı';
 $messages['errordeleting'] = 'Posta silinemedi';
 $messages['errormarking'] = 'Posta işaretlenemedi';
 $messages['deletecontactconfirm'] = 'Seçili kişileri silmek istediğinizden emin misiniz?';
 $messages['deletemessagesconfirm'] = 'Seçili postaları silmek istediğinizden emin misiniz?';
 $messages['deletefolderconfirm'] = 'Bu klasörü silmek istediğinizden emin misiniz?';
 $messages['purgefolderconfirm'] = 'Bu klasördeki tüm postaları silmek istediğinizden emin misiniz?';
-$messages['foldercreating'] = 'Klasör oluştuluyor...';
 $messages['folderdeleting'] = 'Klasör siliniyor...';
-$messages['folderrenaming'] = 'Klasör yeniden adlandırılıyor...';
 $messages['foldermoving'] = 'Klasör taşınıyor...';
+$messages['foldersubscribing'] = 'Klasöre abone olunuyor...';
+$messages['folderunsubscribing'] = 'Klasör aboneliği kaldırılıyor...';
 $messages['formincomplete'] = 'Form tam olarak doldurulmadı';
 $messages['noemailwarning'] = 'Lütfen geçerli bir e-posta adresi girin';
 $messages['nonamewarning'] = 'Lütfen bir isim girin';
@@ -69,12 +74,17 @@ $messages['notsentwarning'] = 'Posta gönderilmedi. Postanızı iptal etmek isti
 $messages['noldapserver'] = 'Lütfen arama için bir LDAP sunucu seçin';
 $messages['nocontactsreturned'] = 'Kişi bulunamadı';
 $messages['nosearchname'] = 'Lütfen bir kişi ismi veya e-posta adresi girin';
+$messages['notuploadedwarning'] = 'Henüz tüm ekli dosyalar yüklenmedi. Lütfen bekleyin ya da yüklemeyi iptal edin.';
 $messages['searchsuccessful'] = '$nr posta bulundu';
 $messages['searchnomatch'] = 'Aramanıza uygun hiçbir sonuç bulunamadı';
 $messages['searching'] = 'Aranıyor...';
 $messages['checking'] = 'Denetleniyor...';
 $messages['nospellerrors'] = 'Yazım hatası bulunamadı';
 $messages['folderdeleted'] = 'Klasör silindi';
+$messages['foldersubscribed'] = 'Klasöre abone olundu';
+$messages['folderunsubscribed'] = 'Klasör aboneliği kaldırıldı';
+$messages['folderpurged'] = 'Klasör sıklaştırıldı';
+$messages['folderexpunged'] = 'Klasör boşaltıldı';
 $messages['deletedsuccessfully'] = 'Silindi';
 $messages['converting'] = 'Postanın biçimlendirmesi kaldırılıyor...';
 $messages['messageopenerror'] = 'Sunucudan posta yüklenemedi';
@@ -85,13 +95,17 @@ $messages['copyerror'] = 'Hiçbir adres kopyalanamadı';
 $messages['sourceisreadonly'] = 'Adres kaynağı salt okunur durumda';
 $messages['errorsavingcontact'] = 'Kişinin adresi kaydedilemedi';
 $messages['movingmessage'] = 'Posta taşınıyor...';
+$messages['copyingmessage'] = 'Posta kopyalanıyor...';
+$messages['deletingmessage'] = 'Posta(lar) siliniyor...';
+$messages['markingmessage'] = 'Posta(lar) işaretleniyor...';
 $messages['receiptsent'] = 'Okundu onayı gönderildi';
 $messages['errorsendingreceipt'] = 'Okundu onayı gönderilemedi';
 $messages['nodeletelastidentity'] = 'Son kimliğiniz olduğu için bu kimliği silemezsiniz';
-$messages['addsubfolderhint'] = 'Bu klasör, şu an seçili olanın alt klasörü olarak oluşturulacak';
 $messages['forbiddencharacter'] = 'Klasör ismi yasaklanmış bir karakter içeriyor';
 $messages['selectimportfile'] = 'Lütfen yüklenecek dosyayı seçin';
 $messages['addresswriterror'] = 'Seçili adres defterine yazılamaz';
+$messages['contactaddedtogroup'] = 'Kişiler bu gruba eklendi';
+$messages['contactremovedfromgroup'] = 'Kişiler bu gruptan çıkarıldı';
 $messages['importwait'] = 'Aktarılıyor, lütfen bekleyin...';
 $messages['importerror'] = 'İçe aktarma başarısız! Yüklenen dosya geçerli bir vCard dosyası değil';
 $messages['importconfirm'] = '<b>$inserted kişi başarıyla aktarıldı, halihazırda var olan $skipped kişi atlandı</b>:<p><em>$names</em></p>';
@@ -101,9 +115,28 @@ $messages['editorwarning'] = 'Düz metin düzenleyiciye geçmek, metin üzerinde
 $messages['httpreceivedencrypterror'] = 'Ayarlarda bir hata oluştu. Sistem yöneticinize haber verin. <b>Postanız gönderilemedi</b>';
 $messages['smtpconnerror'] = 'SMTP Hatası ($code): Sunucuya bağlanılamadı';
 $messages['smtpautherror'] = 'SMTP Hatası ($code): Kimlik doğrulama başarısız oldu';
-$messages['smtpfromerror'] = 'SMTP Hatası ($code): Gönderen adresi "$from" olarak ayarlanamadı';
-$messages['smtptoerror'] = 'SMTP Hatası ($code): "$to" alıcısı eklenemedi';
+$messages['smtpfromerror'] = 'SMTP Hatası ($code): Gönderen adresi "$from" olarak ayarlanamadı ($msg)';
+$messages['smtptoerror'] = 'SMTP Hatası ($code): "$to" alıcısı eklenemedi ($msg)';
 $messages['smtprecipientserror'] = 'SMTP Hatası: Posta alıcılarının listesi ayrıştırılamadı';
+$messages['smtpdsnerror'] = 'SMTP hatası: Teslimat durumu bildirileri desteklenmiyor';
 $messages['smtperror'] = 'SMTP Hatası: $msg';
+$messages['emailformaterror'] = 'Hatalı e-posta adresi: $email';
+$messages['toomanyrecipients'] = 'Çok fazla alıcı. En fazla $max alıcı girebilirsiniz.';
+$messages['maxgroupmembersreached'] = 'Grup üyelerinin sayısı $max sınırını aşıyor.';
+$messages['internalerror'] = 'Bir hata oluştu. Lütfen tekrar deneyin.';
+$messages['contactdelerror'] = 'Kişi(ler) silinemedi';
+$messages['contactdeleted'] = 'Kişi(ler) silindi';
+$messages['groupdeleted'] = 'Grup silindi';
+$messages['grouprenamed'] = 'Grup ismi değiştirildi';
+$messages['groupcreated'] = 'Grup oluşturuldu';
+$messages['messagedeleted'] = 'Posta(lar) silindi';
+$messages['messagemoved'] = 'Posta(lar) taşındı';
+$messages['messagecopied'] = 'Posta(lar) kopyalandı';
+$messages['messagemarked'] = 'Posta(lar) işaretlendi';
+$messages['autocompletechars'] = 'otomatik tamamlama için en az $min karakter girin';
+$messages['namecannotbeempty'] = 'İsim alanı boş olamaz';
+$messages['nametoolong'] = 'İsim çok uzun';
+$messages['folderupdated'] = 'Klasör güncellendi';
+$messages['foldercreated'] = 'Klasör oluşturuldu';
 
 ?>
index 06f65e4538782c727d77950071e8622adb5b1588..fdd05dc057e46fa30156b524b0061e63b7bf864f 100644 (file)
@@ -3,23 +3,23 @@
 /*
 
 +-----------------------------------------------------------------------+
-| language/uk/labels.inc                                                |
+| language/uk_UA/labels.inc                                             |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Natali Stasyuk <natali@onlineua.net>                          |
+| Author: Volodymyr M. Kononenko aka kvm <vmkononenko@gmail.com>        |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: labels.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
 $labels = array();
-$labels['welcome'] = 'Ð\9bаÑ\81каво Ð¿Ñ\80оÑ\81имо Ð² $product!';
-$labels['username'] = 'Ім`я користувача';
+$labels['welcome'] = 'Ð\9bаÑ\81каво Ð¿Ñ\80оÑ\81имо Ð´Ð¾ $product';
+$labels['username'] = 'Ім\'я користувача';
 $labels['password'] = 'Пароль';
 $labels['server'] = 'Сервер';
 $labels['login'] = 'Увійти';
@@ -29,30 +29,31 @@ $labels['settings'] = 'Налаштування';
 $labels['addressbook'] = 'Контакти';
 $labels['inbox'] = 'Вхідні';
 $labels['drafts'] = 'Чернетки';
-$labels['sent'] = 'Ð\92Ñ\96дпÑ\80авлені';
-$labels['trash'] = 'СмÑ\96Ñ\82ник';
+$labels['sent'] = 'Ð\9dадÑ\96Ñ\81лані';
+$labels['trash'] = 'Ð\9aоÑ\88ик';
 $labels['junk'] = 'Спам';
 $labels['subject'] = 'Тема';
-$labels['from'] = 'Від';
+$labels['from'] = 'Відправник';
 $labels['to'] = 'Кому';
 $labels['cc'] = 'Копія';
 $labels['bcc'] = 'Прихована';
 $labels['replyto'] = 'Зворотня адреса';
+$labels['followupto'] = 'Followup-To';
 $labels['date'] = 'Дата';
 $labels['size'] = 'Розмір';
 $labels['priority'] = 'Пріоритет';
 $labels['organization'] = 'Організація';
-$labels['reply-to'] = 'Зворотня адреса';
-$labels['mailboxlist'] = 'Теки';
+$labels['readstatus'] = 'Статус прочитання';
+$labels['mailboxlist'] = 'Ð\9fапки';
 $labels['messagesfromto'] = 'Повідомлення з $from по $to із $count';
-$labels['messagenrof'] = 'Повідомлення $nr із $count';
-$labels['moveto'] = 'Перемістити у...';
+$labels['threadsfromto'] = 'Обговорення з $from по $to із $count';
+$labels['messagenrof'] = 'Лист $nr із $count';
+$labels['copy'] = 'Копіювати';
+$labels['move'] = 'Перемістити';
+$labels['moveto'] = 'Перемістити до...';
 $labels['download'] = 'Завантажити';
-$labels['filename'] = 'Ім`я файлу';
+$labels['filename'] = 'Ім\'я файлу';
 $labels['filesize'] = 'Розмір файлу';
-$labels['preferhtml'] = 'Переважно HTML';
-$labels['htmlmessage'] = 'Повідомлення HTML';
-$labels['prettydate'] = 'Красиві дати';
 $labels['addtoaddressbook'] = 'Додати до контактів';
 $labels['sun'] = 'Нд';
 $labels['mon'] = 'Пн';
@@ -66,7 +67,7 @@ $labels['monday'] = 'Понеділок';
 $labels['tuesday'] = 'Вівторок';
 $labels['wednesday'] = 'Середа';
 $labels['thursday'] = 'Четвер';
-$labels['friday'] = 'П`ятниця';
+$labels['friday'] = 'П\'ятниця';
 $labels['saturday'] = 'Субота';
 $labels['jan'] = 'січ';
 $labels['feb'] = 'лют';
@@ -80,187 +81,283 @@ $labels['sep'] = 'вер';
 $labels['oct'] = 'жов';
 $labels['nov'] = 'лис';
 $labels['dec'] = 'гр';
-$labels['longjan'] = 'січень';
-$labels['longfeb'] = 'лютий';
-$labels['longmar'] = 'березень';
-$labels['longapr'] = 'квітень';
-$labels['longmay'] = 'травень';
-$labels['longjun'] = 'червень';
-$labels['longjul'] = 'липень';
-$labels['longaug'] = 'серпень';
-$labels['longsep'] = 'вересень';
-$labels['longoct'] = 'Ðовтень';
-$labels['longnov'] = 'листопад';
-$labels['longdec'] = 'грудень';
+$labels['longjan'] = 'Січень';
+$labels['longfeb'] = 'Ð\9bютий';
+$labels['longmar'] = 'Ð\91ерезень';
+$labels['longapr'] = 'Ð\9aвітень';
+$labels['longmay'] = 'Травень';
+$labels['longjun'] = 'Червень';
+$labels['longjul'] = 'Ð\9bипень';
+$labels['longaug'] = 'Серпень';
+$labels['longsep'] = 'Ð\92ересень';
+$labels['longoct'] = 'Ð\96овтень';
+$labels['longnov'] = 'Ð\9bистопад';
+$labels['longdec'] = 'Ð\93рудень';
 $labels['today'] = 'Сьогодні';
 $labels['checkmail'] = 'Перевірити пошту';
-$labels['writenewmessage'] = 'Нове повідомлення';
-$labels['replytomessage'] = 'Відповісти';
-$labels['replytoallmessage'] = 'Відповісти усім';
-$labels['forwardmessage'] = 'Переслати';
-$labels['deletemessage'] = 'У смітник';
-$labels['movemessagetotrash'] = 'Перемістити повідомлення у смітник';
+$labels['writenewmessage'] = 'Написати листа';
+$labels['replytomessage'] = 'Відповісти відправнику';
+$labels['replytoallmessage'] = 'Відповісти до листа або відправнику та усім отримувачам';
+$labels['replyall'] = 'Відповісти усім';
+$labels['replylist'] = 'Відповісти до листа';
+$labels['forwardmessage'] = 'Переслати повідомлення';
+$labels['deletemessage'] = 'У кошик';
+$labels['movemessagetotrash'] = 'Перемістити лист у кошик';
 $labels['printmessage'] = 'Друкувати';
-$labels['previousmessage'] = 'Ð\9fоказаÑ\82и Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\94 Ð¿Ð¾Ð²Ñ\96домленнÑ\8f';
-$labels['previousmessages'] = 'Ð\9fопеÑ\80еднÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нка Ð¿Ð¾Ð²Ñ\96домленÑ\8c';
-$labels['firstmessage'] = 'Ð\9fоказаÑ\82и Ð¿ÐµÑ\80Ñ\88е Ð¿Ð¾Ð²Ñ\96домленнÑ\8f';
-$labels['firstmessages'] = 'Ð\9fеÑ\80Ñ\88а Ñ\81Ñ\82оÑ\80Ñ\96нка Ð¿Ð¾Ð²Ñ\96домленÑ\8c';
-$labels['nextmessage'] = 'Ð\9fоказаÑ\82и Ð½Ð°Ñ\81Ñ\82Ñ\83пне Ð¿Ð¾Ð²Ñ\96домленнÑ\8f';
-$labels['nextmessages'] = 'Ð\9dаÑ\81Ñ\82Ñ\83пна Ñ\81Ñ\82оÑ\80Ñ\96нка Ð¿Ð¾Ð²Ñ\96домленÑ\8c';
-$labels['lastmessage'] = 'Ð\9fоказаÑ\82и Ð¾Ñ\81Ñ\82аннÑ\94 Ð¿Ð¾Ð²Ñ\96домленнÑ\8f';
-$labels['lastmessages'] = 'Ð\9eÑ\81Ñ\82аннÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нка Ð¿Ð¾Ð²Ñ\96домленÑ\8c';
-$labels['backtolist'] = 'Ð\94о Ð¿ÐµÑ\80елÑ\96кÑ\83 Ð¿Ð¾Ð²Ñ\96домленÑ\8c';
+$labels['previousmessage'] = 'Ð\9fоказаÑ\82и Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\96й Ð»Ð¸Ñ\81Ñ\82';
+$labels['previousmessages'] = 'Ð\9fопеÑ\80еднÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нка Ð»Ð¸Ñ\81Ñ\82Ñ\96в';
+$labels['firstmessage'] = 'Ð\9fоказаÑ\82и Ð¿ÐµÑ\80Ñ\88ий Ð»Ð¸Ñ\81Ñ\82';
+$labels['firstmessages'] = 'Ð\9fеÑ\80Ñ\88а Ñ\81Ñ\82оÑ\80Ñ\96нка Ð»Ð¸Ñ\81Ñ\82Ñ\96в';
+$labels['nextmessage'] = 'Ð\9fоказаÑ\82и Ð½Ð°Ñ\81Ñ\82Ñ\83пний Ð»Ð¸Ñ\81Ñ\82';
+$labels['nextmessages'] = 'Ð\9dаÑ\81Ñ\82Ñ\83пна Ñ\81Ñ\82оÑ\80Ñ\96нка Ð»Ð¸Ñ\81Ñ\82Ñ\96в';
+$labels['lastmessage'] = 'Ð\9fоказаÑ\82и Ð¾Ñ\81Ñ\82аннÑ\96й Ð»Ð¸Ñ\81Ñ\82';
+$labels['lastmessages'] = 'Ð\9eÑ\81Ñ\82аннÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нка Ð»Ð¸Ñ\81Ñ\82Ñ\96в';
+$labels['backtolist'] = 'Ð\94о Ð¿ÐµÑ\80елÑ\96кÑ\83 Ð»Ð¸Ñ\81Ñ\82Ñ\96в';
 $labels['viewsource'] = 'Вихідний текст';
-$labels['markmessages'] = 'скасувати повідомлення';
-$labels['markread'] = 'як прочитані';
-$labels['markunread'] = 'як непрочитане';
-$labels['markflagged'] = 'як позначені';
-$labels['markunflagged'] = 'як не позначені';
+$labels['markmessages'] = 'Позначити листи';
+$labels['markread'] = 'Позначити як прочитане';
+$labels['markunread'] = 'Позначити як непрочитане';
+$labels['markflagged'] = 'Додати зірочку';
+$labels['markunflagged'] = 'Зняти зірочку';
+$labels['messageactions'] = 'Додаткові дії...';
 $labels['select'] = 'Вибрати';
-$labels['all'] = 'Все';
-$labels['none'] = 'Нічого';
+$labels['all'] = 'Всі';
+$labels['none'] = 'Жодного';
+$labels['currpage'] = 'Поточна сторінка';
 $labels['unread'] = 'Непрочитані';
-$labels['flagged'] = 'пÑ\80апоÑ\80еÑ\86Ñ\8c';
+$labels['flagged'] = 'Ð\86з Ð·Ñ\96Ñ\80оÑ\87коÑ\8e';
 $labels['unanswered'] = 'Без відповіді';
-$labels['filter'] = 'фильтер';
+$labels['deleted'] = 'Видалені';
+$labels['invert'] = 'Інвертувати виділення';
+$labels['filter'] = 'Фільтр';
+$labels['list'] = 'Списком';
+$labels['threads'] = 'Гілки';
+$labels['expand-all'] = 'Розкрити всі';
+$labels['expand-unread'] = 'Розкрити непрочитані';
+$labels['collapse-all'] = 'Згорнути всі';
+$labels['threaded'] = 'Гілками';
+$labels['autoexpand_threads'] = 'Розкривати гілки ';
+$labels['do_expand'] = 'усі гілки';
+$labels['expand_only_unread'] = 'тільки з непрочитаними листами';
+$labels['fromto'] = 'Відправник/Одержувач';
+$labels['flag'] = 'Позначка';
+$labels['attachment'] = 'Вкладення';
+$labels['nonesort'] = 'Не сортувати';
+$labels['sentdate'] = 'Дата відправлення';
+$labels['arrival'] = 'Дата оримання';
+$labels['asc'] = 'за зростанням';
+$labels['desc'] = 'за спаданням';
+$labels['listcolumns'] = 'Атрибути для відображення';
+$labels['listsorting'] = 'Сортувати за атрибутом';
+$labels['listorder'] = 'Порядок сортування';
+$labels['listmode'] = 'Режим перегляду';
+$labels['folderactions'] = 'Операції з папкою...';
 $labels['compact'] = 'Стиснути';
-$labels['empty'] = 'Спустошити';
+$labels['empty'] = 'Спорожнити';
 $labels['purge'] = 'Очистити';
-$labels['quota'] = 'Ð\9aвоÑ\82а';
+$labels['quota'] = 'Ð\92икоÑ\80иÑ\81Ñ\82ано';
 $labels['unknown'] = 'невідомо';
 $labels['unlimited'] = 'без обмеження';
 $labels['quicksearch'] = 'Швидкий пошук';
 $labels['resetsearch'] = 'Очистити пошук';
+$labels['searchmod'] = 'Де шукати';
+$labels['msgtext'] = 'В усьому листі';
 $labels['openinextwin'] = 'Відкрити в новому вікні';
-$labels['compose'] = 'Написати повідомлення';
+$labels['emlsave'] = 'Зберегти (.eml)';
+$labels['compose'] = 'Написати листа';
+$labels['editasnew'] = 'Редагувати як новий';
 $labels['savemessage'] = 'Зберегти чернетку';
-$labels['sendmessage'] = 'Ð\92Ñ\96діслати зараз';
-$labels['addattachment'] = 'Ð\94одаÑ\82и Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ\8f';
-$labels['charset'] = 'Ð\9dабÑ\96Ñ\80 Ñ\81имволÑ\96в';
+$labels['sendmessage'] = 'Ð\9dадіслати зараз';
+$labels['addattachment'] = 'Ð\92клаÑ\81Ñ\82и Ñ\84айл';
+$labels['charset'] = 'Ð\9aодÑ\83ваннÑ\8f';
 $labels['editortype'] = 'Редактор';
 $labels['returnreceipt'] = 'Запит відповіді';
+$labels['dsn'] = 'Повідомлення про доставку';
+$labels['editidents'] = 'Змінити данні';
 $labels['checkspelling'] = 'Перевірити орфографію';
 $labels['resumeediting'] = 'Продовжити редагування';
-$labels['revertto'] = 'Відмінити правки';
-$labels['attachments'] = 'Вкладення';
-$labels['upload'] = 'Ð\97аванÑ\82ажити';
+$labels['revertto'] = 'Відмінити редагування';
+$labels['attachments'] = 'Вкладені файли';
+$labels['upload'] = 'Ð\92клаÑ\81ти';
 $labels['close'] = 'Закрити';
+$labels['messageoptions'] = 'Налаштування листів';
 $labels['low'] = 'Низький';
 $labels['lowest'] = 'Найнижчий';
 $labels['normal'] = 'Нормальний';
 $labels['high'] = 'Високий';
 $labels['highest'] = 'Найвищий';
 $labels['nosubject'] = '(без теми)';
-$labels['showimages'] = 'Показати зображення';
-$labels['alwaysshow'] = 'Завжди показувати зображення ';
+$labels['showimages'] = 'Показувати зображення';
+$labels['alwaysshow'] = 'Завжди показувати зображення від $sender';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Звичайний текст';
-$labels['savesentmessagein'] = 'зберегти в';
+$labels['savesentmessagein'] = 'збеÑ\80егÑ\82и Ð½Ð°Ð´Ñ\96Ñ\81ланого Ð»Ð¸Ñ\81Ñ\82а Ð²';
 $labels['dontsave'] = 'не зберігати';
-$labels['maxuploadsize'] = 'максимальний розмір файла';
-$labels['addcc'] = 'Додати Cc';
-$labels['addbcc'] = 'Додати Bcc';
-$labels['addreplyto'] = 'Додати Reply-To';
-$labels['mdnrequest'] = 'Відправник цього повідомлення запросив повідомлення про прочитання. Відправити повідомлення?';
+$labels['maxuploadsize'] = 'Максимальний розмір файлу $size';
+$labels['addcc'] = 'Додати копію';
+$labels['addbcc'] = 'Додати приховану копію';
+$labels['addreplyto'] = 'Додати зворотню адресу';
+$labels['addfollowupto'] = 'Додати Followup-To';
+$labels['mdnrequest'] = 'Відправник цього листа запитав про прочитання. Повідомити відправника?';
 $labels['receiptread'] = 'Повідомлення про прочитання';
-$labels['yourmessage'] = 'повÑ\96домленнÑ\8f Ð¿Ñ\80о Ð¿Ñ\80оÑ\87иÑ\82аннÑ\8f Ð²Ð°Ñ\88ого Ð¿Ð¾Ð²Ñ\96домленнÑ\8f';
-$labels['receiptnote'] = 'Це Ð¿Ð¾Ð²Ñ\96домленнÑ\8f Ð¾Ð·Ð½Ð°Ñ\87аÑ\94 Ñ\82Ñ\96лÑ\8cки, Ñ\89о Ð¿Ð¾Ð²Ñ\96домленнÑ\8f Ð±Ñ\83ло Ð²Ñ\96дкÑ\80иÑ\82о Ð¾Ð´ÐµÑ\80жÑ\83ваÑ\87ем, Ñ\96 Ð½Ðµ Ð³Ð°Ñ\80анÑ\82Ñ\83Ñ\94 Ñ\82ого, Ñ\89о Ð²Ð¾Ð½Ð¾ Ð±Ñ\83ло Ð¿Ñ\80оÑ\87иÑ\82ано';
-$labels['name'] = 'Ð\92Ñ\96добÑ\80ажÑ\83ване Ñ\96м`я';
+$labels['yourmessage'] = 'Ð\9fовÑ\96домленнÑ\8f Ð¿Ñ\80о Ð¿Ñ\80оÑ\87иÑ\82аннÑ\8f Ð\92аÑ\88ого Ð»Ð¸Ñ\81Ñ\82а';
+$labels['receiptnote'] = 'Ð\97аÑ\83важеннÑ\8f: Ð¦Ðµ Ð¿Ð¾Ð²Ñ\96домленнÑ\8f Ð¾Ð·Ð½Ð°Ñ\87аÑ\94 Ð»Ð¸Ñ\88е, Ñ\89о Ð»Ð¸Ñ\81Ñ\82а Ð±Ñ\83ло Ð²Ñ\96дкÑ\80иÑ\82о Ð¾Ð´ÐµÑ\80жÑ\83ваÑ\87ем, Ñ\96 Ð½Ðµ Ð³Ð°Ñ\80анÑ\82Ñ\83Ñ\94 Ñ\82ого, Ñ\89о Ð¹Ð¾Ð³Ð¾ Ð±Ñ\83ло Ð¿Ñ\80оÑ\87иÑ\82ано.';
+$labels['name'] = 'Ð\86м`Ñ\8f Ð´Ð»Ñ\8f Ð²Ñ\96добÑ\80аження';
 $labels['firstname'] = 'Ім`я';
 $labels['surname'] = 'Прізвище';
-$labels['email'] = 'E-Mail';
+$labels['email'] = 'Електронна адреса';
 $labels['addcontact'] = 'Додати вибрані контакти до списку контактів';
 $labels['editcontact'] = 'Редагувати контакт';
+$labels['contacts'] = 'Контакти';
+$labels['contactproperties'] = 'Властивості контакта';
 $labels['edit'] = 'Правка';
-$labels['cancel'] = 'Ð\92Ñ\96дмÑ\96на';
+$labels['cancel'] = 'СкаÑ\81Ñ\83ваÑ\82и';
 $labels['save'] = 'Зберегти';
 $labels['delete'] = 'Видалити';
 $labels['newcontact'] = 'Створити новий контакт';
 $labels['deletecontact'] = 'Видалити вибрані контакти';
-$labels['composeto'] = 'СÑ\82воÑ\80иÑ\82и Ð¿Ð¾Ð²Ñ\96домленнÑ\8f для вибранних контактів';
-$labels['contactsfromto'] = 'Контакти з $from по $to з $count';
+$labels['composeto'] = 'СÑ\82воÑ\80иÑ\82и Ð»Ð¸Ñ\81Ñ\82а для вибранних контактів';
+$labels['contactsfromto'] = 'Контакти  $from - $to / $count';
 $labels['print'] = 'Друкувати';
 $labels['export'] = 'Експортувати';
-$labels['exportvcards'] = 'Експортувати контакти у формат vcard';
-$labels['previouspage'] = 'Показати попередній';
-$labels['firstpage'] = 'Показати перший';
-$labels['nextpage'] = 'Показати наступний';
-$labels['lastpage'] = 'Показати останній';
+$labels['exportvcards'] = 'Експортувати контакти у формат vCard';
+$labels['newcontactgroup'] = 'Створити нову групу контактів';
+$labels['groupactions'] = 'Дії з групами контактів';
+$labels['previouspage'] = 'Попередня сторінка';
+$labels['firstpage'] = 'Перша сторінка';
+$labels['nextpage'] = 'Наступна сторінка';
+$labels['lastpage'] = 'Остання сторінка';
+$labels['group'] = 'Група';
 $labels['groups'] = 'Групи';
 $labels['personaladrbook'] = 'Персональні адреси';
-$labels['import'] = 'імпорт';
+$labels['import'] = 'Імпорт';
 $labels['importcontacts'] = 'Імпортувати контакти';
-$labels['importfromfile'] = 'Імпортувати з файлу';
-$labels['importreplace'] = 'Ð\97амÑ\96ниÑ\82и Ð²Ñ\81Ñ\8e Ð·Ð°Ð¿Ð¸Ñ\81нÑ\83 ÐºÐ½Ð¸Ð¶Ðºу';
-$labels['importtext'] = 'Ви можете завантажити контакти з існуючої адресної книги. На даний момент підтримується завантаження у форматі vcard';
-$labels['done'] = 'Ð\97авеÑ\80Ñ\88ене';
+$labels['importfromfile'] = 'Імпортувати з файлу:';
+$labels['importreplace'] = 'Ð\97амÑ\96ниÑ\82и Ð²Ñ\81Ñ\8e Ð°Ð´Ñ\80еÑ\81нÑ\83 ÐºÐ½Ð¸Ð³у';
+$labels['importtext'] = 'Ви можете завантажити контакти з існуючої адресної книги. На даний момент підтримується імпортування контактів з формату vCard';
+$labels['done'] = 'Ð\93оÑ\82ово';
 $labels['settingsfor'] = 'Налаштування для';
-$labels['preferences'] = 'влаÑ\81Ñ\82ивоÑ\81Ñ\82Ñ\96';
-$labels['userpreferences'] = 'влаÑ\81Ñ\82ивоÑ\81Ñ\82Ñ\96 користувача';
-$labels['editpreferences'] = 'РедагÑ\83ваÑ\82и Ð²Ð»Ð°Ñ\81Ñ\82ивоÑ\81Ñ\82Ñ\96користувача';
+$labels['preferences'] = 'Ð\9fаÑ\80амеÑ\82Ñ\80и';
+$labels['userpreferences'] = 'Ð\9dалаÑ\88Ñ\82Ñ\83ваннÑ\8f користувача';
+$labels['editpreferences'] = 'РедагÑ\83ваÑ\82и Ð½Ð°Ð»Ð°Ñ\88Ñ\82Ñ\83ваннÑ\8f користувача';
 $labels['identities'] = 'Профілі';
 $labels['manageidentities'] = 'Керування профілями';
 $labels['newidentity'] = 'Новий профіль';
 $labels['newitem'] = 'Новий';
-$labels['edititem'] = 'Правка';
-$labels['setdefault'] = 'Використовувати типово';
+$labels['edititem'] = 'Редагувати';
+$labels['preferhtml'] = 'Показувати в HTML';
+$labels['defaultcharset'] = 'Кодування за замовчуваннням';
+$labels['htmlmessage'] = 'Лист у HTML';
+$labels['prettydate'] = 'Дати у зручному форматі';
+$labels['setdefault'] = 'Встановити за замовчуванням';
 $labels['autodetect'] = 'Визначати автоматично';
 $labels['language'] = 'Мова';
 $labels['timezone'] = 'Часовий пояс';
 $labels['pagesize'] = 'Рядків на сторінці';
 $labels['signature'] = 'Підпис';
 $labels['dstactive'] = 'Літній/зимовий час';
-$labels['htmleditor'] = 'Створювати повідомлення в HTML';
+$labels['htmleditor'] = 'Створювати листи в HTML';
+$labels['htmlonreply'] = 'тільки у відповідь на HTML повідомлення';
 $labels['htmlsignature'] = 'Підпис в HTML';
 $labels['previewpane'] = 'Показати панель перегляду';
-$labels['skin'] = 'стиль інтерфейсу';
-$labels['logoutclear'] = 'видалиÑ\82и ÐºÐ°Ñ\80зинÑ\83 ';
-$labels['logoutcompact'] = 'стиснути вхідні дані';
-$labels['uisettings'] = 'інтерфейс користувача';
-$labels['serversettings'] = 'наÑ\81Ñ\82Ñ\80оÑ\8eвання сервера';
+$labels['skin'] = 'Тема';
+$labels['logoutclear'] = 'Ð\9eÑ\87иÑ\89аÑ\82и ÐºÐ¾Ñ\88ик Ð¿Ñ\80и Ð²Ð¸Ñ\85одÑ\96';
+$labels['logoutcompact'] = 'Стискати папку Вхідні при завершенні';
+$labels['uisettings'] = 'Інтерфейс користувача';
+$labels['serversettings'] = 'Ð\9dалаÑ\88Ñ\82Ñ\83вання сервера';
 $labels['mailboxview'] = 'Вид інтерфейсу';
 $labels['mdnrequests'] = 'Повідомлення про прочитання';
-$labels['askuser'] = 'запитати перед відправленням';
-$labels['autosend'] = 'автоматично відправляти';
+$labels['askuser'] = 'запитати користувача';
+$labels['autosend'] = 'відправляти автоматично';
+$labels['autosendknown'] = 'відправити повідомлення моим контактам, в іншому випадку запитати мене';
+$labels['autosendknownignore'] = 'відправити повідомлення моим контактам, в іншому випадку ігнорувати';
 $labels['ignore'] = 'ігнорувати';
 $labels['readwhendeleted'] = 'Позначати як прочитане при видаленні';
 $labels['flagfordeletion'] = 'Позначати для видалення замість видалення';
-$labels['skipdeleted'] = 'Не показувати видаленні повідомлення';
-$labels['showremoteimages'] = 'Показувати видаленні зображення';
+$labels['skipdeleted'] = 'Не показувати видалені листи';
+$labels['deletealways'] = 'Видаляти листи при невдалому переміщенні до кошика';
+$labels['showremoteimages'] = 'Показувати віддалені зображення';
 $labels['fromknownsenders'] = 'від відомих відправників';
 $labels['always'] = 'завжди';
-$labels['showinlineimages'] = 'Ð\9fоказÑ\83ваÑ\82и Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñ\96 Ð·Ð¾Ð±Ñ\80аженнÑ\8f Ð²Ð½Ð¸Ð·Ñ\83 Ð¿Ð¾Ð²Ñ\96домленнÑ\8f';
+$labels['showinlineimages'] = 'Ð\9fоказÑ\83ваÑ\82и Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñ\96 Ð·Ð¾Ð±Ñ\80аженнÑ\8f Ð²Ð½Ð¸Ð·Ñ\83 Ð»Ð¸Ñ\81Ñ\82а';
 $labels['autosavedraft'] = 'Автозбереження чернетки';
 $labels['everynminutes'] = 'кожні $n хвилин';
-$labels['keepalive'] = 'Ð\9fеÑ\80евÑ\96Ñ\80ка Ð½Ð¾Ð²Ð¸Ñ\85 Ð¿Ð¾Ð²Ñ\96домленÑ\8c';
+$labels['keepalive'] = 'Ð\9fеÑ\80евÑ\96Ñ\80ка Ð½Ð¾Ð²Ð¸Ñ\85 Ð»Ð¸Ñ\81Ñ\82Ñ\96в';
 $labels['never'] = 'ніколи';
-$labels['messagesdisplaying'] = 'Відображення повідомлень';
-$labels['messagescomposition'] = 'Створення повідомлень';
+$labels['immediately'] = 'одразу';
+$labels['messagesdisplaying'] = 'Відображення листів';
+$labels['messagescomposition'] = 'Створення листів';
 $labels['mimeparamfolding'] = 'Імена вкладень';
-$labels['2231folding'] = 'Повний RFC 2231 (тільки для новітніх програм)';
-$labels['miscfolding'] = 'RFC 2047/2231 (найбільша сумісність)';
-$labels['2047folding'] = 'RFC 2047 (для старих програм)';
-$labels['advancedoptions'] = 'Додаткові настроювання';
-$labels['focusonnewmessage'] = 'Фокусувати вікно браузера при новому повідомленні';
-$labels['checkallfolders'] = 'Перевіряти нові повідомлення у всіх папках';
-$labels['folder'] = 'папка';
-$labels['folders'] = 'папки';
-$labels['foldername'] = 'назва папки';
+$labels['2231folding'] = 'Повний RFC 2231 (Thunderbird)';
+$labels['miscfolding'] = 'RFC 2047/2231 (MS Outlook)';
+$labels['2047folding'] = 'RFC 2047 (інші поштові клієнти)';
+$labels['force7bit'] = 'Використовувати MIME кодування для 8-бітних символів';
+$labels['advancedoptions'] = 'Додаткові параметри';
+$labels['focusonnewmessage'] = 'Фокусувати вікно браузера при новому листі';
+$labels['checkallfolders'] = 'Перевіряти нові листи у всіх папках';
+$labels['displaynext'] = 'Після видалення/переміщення листа відображати наступний';
+$labels['mainoptions'] = 'Основні налаштування';
+$labels['section'] = 'Розділ';
+$labels['maintenance'] = 'Додатково';
+$labels['newmessage'] = 'Новий лист';
+$labels['listoptions'] = 'Список налаштувань';
+$labels['signatureoptions'] = 'Налаштування підпису';
+$labels['whenreplying'] = 'При відповіді';
+$labels['replytopposting'] = 'починати новий лист перед цитованим';
+$labels['replybottomposting'] = 'починати новий лист після цитованого';
+$labels['replyremovesignature'] = 'При відповіді видаляти первинний підпис з листа';
+$labels['autoaddsignature'] = 'Автоматично додавати підпис';
+$labels['newmessageonly'] = 'тільки до нових листів';
+$labels['replyandforwardonly'] = 'тільки при відповідях та пересилках';
+$labels['replysignaturepos'] = 'При відповідях чи пересилках додавати підпис';
+$labels['belowquote'] = 'після цитати';
+$labels['abovequote'] = 'перед цитатою';
+$labels['insertsignature'] = 'Додати підпис';
+$labels['previewpanemarkread'] = 'Позначити переглянуті листи як прочитані';
+$labels['afternseconds'] = 'через $n секунд';
+$labels['reqmdn'] = 'Завжди вимагати повідомлення про доставку';
+$labels['reqdsn'] = 'Завжди вимагати повідомлення про статус доставки';
+$labels['replysamefolder'] = 'Розмістити відповіді у тій же папці, де знаходиться оригінал';
+$labels['folder'] = 'Папка';
+$labels['folders'] = 'Папки';
+$labels['foldername'] = 'Назва папки';
 $labels['subscribed'] = 'Підписані';
-$labels['messagecount'] = 'повÑ\96домленнÑ\8f';
+$labels['messagecount'] = 'Ð\9bиÑ\81Ñ\82и';
 $labels['create'] = 'Створити';
-$labels['createfolder'] = 'Створити нову теку';
-$labels['rename'] = 'Перейменувати';
-$labels['renamefolder'] = 'Перейменувати теку';
-$labels['deletefolder'] = 'Видалити теку';
-$labels['managefolders'] = 'Керування теками';
+$labels['createfolder'] = 'Створити нову папку';
+$labels['managefolders'] = 'Керування папками';
 $labels['specialfolders'] = 'Особливі папки';
+$labels['properties'] = 'Властивості';
+$labels['folderproperties'] = 'Властивості папки';
+$labels['parentfolder'] = 'Батьківська папка';
+$labels['location'] = 'Розташування';
+$labels['info'] = 'Інформація';
+$labels['getfoldersize'] = 'Показати розмір папки';
+$labels['changesubscription'] = 'Змінити підписку';
 $labels['sortby'] = 'Відсортувати за';
 $labels['sortasc'] = 'Сортувати за зростанням';
 $labels['sortdesc'] = 'Сортувати за спаданням';
-$labels['B'] = 'Б';
-$labels['KB'] = 'КБ';
-$labels['MB'] = 'МБ';
-$labels['GB'] = 'ГБ';
+$labels['B'] = 'б';
+$labels['KB'] = 'Кб';
+$labels['MB'] = 'Мб';
+$labels['GB'] = 'Гб';
+$labels['unicode'] = 'Юнікод';
+$labels['english'] = 'Англійське';
+$labels['westerneuropean'] = 'Західноєвропейське';
+$labels['easterneuropean'] = 'Східноєвропейське';
+$labels['southeasterneuropean'] = 'Південно-Західна Європа';
+$labels['baltic'] = 'Балтійське';
+$labels['cyrillic'] = 'Кирилиця';
+$labels['arabic'] = 'Арабське';
+$labels['greek'] = 'Грецьке';
+$labels['hebrew'] = 'Іврит';
+$labels['turkish'] = 'Турецьке';
+$labels['nordic'] = 'Скандинавське';
+$labels['thai'] = 'Тайське';
+$labels['celtic'] = 'Кельтське';
+$labels['vietnamese'] = 'В\'єтнамське';
+$labels['japanese'] = 'Японське';
+$labels['korean'] = 'Корейське';
+$labels['chinese'] = 'Китайське';
 
 ?>
index fa39a3d493633a852b9b101dcbfe989d61178b9c..50a859260a9fc631778261eacb5ce359b1e7d523 100644 (file)
@@ -3,17 +3,17 @@
 /*
 
 +-----------------------------------------------------------------------+
-| language/uk/messages.inc                                              |
+| language/uk_UA/messages.inc                                           |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
-| Author: Natali Stasyuk <natali@onlineua.net>                          |
+| Author: Volodymyr M. Kononenko aka kvm <vmkononenko@gmail.com>        |
 +-----------------------------------------------------------------------+
 
-@version $Id$
+@version $Id: messages.inc 4368 2010-12-27 08:51:22Z yllar $
 
 */
 
@@ -22,77 +22,120 @@ $messages['loginfailed'] = 'Невдала спроба входу';
 $messages['cookiesdisabled'] = 'Ваш переглядач не приймає cookie';
 $messages['sessionerror'] = 'Ваша сесія застаріла';
 $messages['imaperror'] = 'Невдале з`єднання з IMAP сервером';
-$messages['nomessagesfound'] = 'Повідомлень не знайдено';
-$messages['loggedout'] = 'Ваша сесія завершена. Всього найкращого!';
+$messages['servererror'] = 'Помилка сервера!';
+$messages['servererrormsg'] = 'Помилка сервера: $msg';
+$messages['errorreadonly'] = 'Неможливо виконати операцію. Папка доступна тільки для читання.';
+$messages['errornoperm'] = 'Неможливо виконати операцію. Доступ заборонено';
+$messages['invalidrequest'] = 'Невірний запит! Дані не збережено.';
+$messages['nomessagesfound'] = 'Листів не знайдено';
+$messages['loggedout'] = 'Вашу сесію завершено. Всього найкращого!';
 $messages['mailboxempty'] = 'Поштова скринька порожня';
 $messages['loading'] = 'Завантаження...';
+$messages['uploading'] = 'Файл відправляється...';
 $messages['loadingdata'] = 'Завантаження даних...';
-$messages['checkingmail'] = 'Ð\9fеÑ\80евÑ\96Ñ\80ка Ð½Ð¾Ð²Ð¸Ñ\85 Ð¿Ð¾Ð²Ñ\96домленÑ\8c...';
-$messages['sendingmessage'] = 'Ð\92Ñ\96дпÑ\80авка Ð¿Ð¾Ð²Ñ\96домленÑ\8c...';
-$messages['messagesent'] = 'Ð\9fовÑ\96домленнÑ\8f відправлено';
-$messages['savingmessage'] = 'Ð\97беÑ\80еженнÑ\8f Ð¿Ð¾Ð²Ñ\96домленнÑ\8f...';
+$messages['checkingmail'] = 'Ð\9fеÑ\80евÑ\96Ñ\80ка Ð½Ð¾Ð²Ð¸Ñ\85 Ð»Ð¸Ñ\81Ñ\82Ñ\96в...';
+$messages['sendingmessage'] = 'Ð\92Ñ\96дпÑ\80авка Ð»Ð¸Ñ\81Ñ\82а...';
+$messages['messagesent'] = 'Ð\9bиÑ\81Ñ\82 Ñ\83Ñ\81пÑ\96Ñ\88но відправлено';
+$messages['savingmessage'] = 'Ð\97беÑ\80еженнÑ\8f Ð»Ð¸Ñ\81Ñ\82а...';
 $messages['messagesaved'] = 'Збережено в Чернетках';
 $messages['successfullysaved'] = 'Збережено';
 $messages['addedsuccessfully'] = 'Контакт успішно доданий до списку контактів';
-$messages['contactexists'] = 'Ð\9aонÑ\82акÑ\82 Ð· Ñ\86Ñ\96Ñ\94Ñ\8e Ð°Ð´Ñ\80еÑ\81оÑ\8e e-mail вже існує';
-$messages['blockedimages'] = 'Ð\97 Ð¼ÐµÑ\82оÑ\8e Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ Ð·Ð°Ð²Ð°Ð½Ñ\82аженнÑ\8f Ð·Ð¾Ð±Ñ\80аженÑ\8c Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾';
-$messages['encryptedmessage'] = 'Ð\9fовÑ\96домленнÑ\8f Ð·Ð°Ñ\88иÑ\84Ñ\80овано Ñ\96 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾. Ð\97веÑ\80нÑ\96Ñ\82Ñ\8cÑ\81Ñ\8f Ð´Ð¾ Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80а Ñ\81еÑ\80веÑ\80Ñ\83.';
+$messages['contactexists'] = 'Ð\9aонÑ\82акÑ\82 Ð· Ñ\82акоÑ\8e ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\8e Ð°Ð´Ñ\80еÑ\81оÑ\8e вже існує';
+$messages['blockedimages'] = 'Ð\97 Ð¼ÐµÑ\82оÑ\8e Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ Ð·Ð¾Ð±Ñ\80аженнÑ\8f Ð· Ð·Ð¾Ð²Ð½Ñ\96Ñ\88нÑ\96Ñ\85 Ð´Ð¶ÐµÑ\80ел Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð¾ Ñ\83 Ñ\86Ñ\8cомÑ\83 Ð»Ð¸Ñ\81Ñ\82Ñ\96.';
+$messages['encryptedmessage'] = 'Ð\9bиÑ\81Ñ\82 Ð·Ð°Ñ\88иÑ\84Ñ\80овано Ñ\96 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð±Ñ\83Ñ\82и Ð²Ñ\96добÑ\80ажено.';
 $messages['nocontactsfound'] = 'Контакти не знайдені';
 $messages['contactnotfound'] = 'Запитаний контакт не знайдений';
-$messages['sendingfailed'] = 'Не вдалося відправити повідомлення';
-$messages['senttooquickly'] = 'Ви повинні почекати $sec сек. для відправлення повідомлення';
-$messages['errorsavingsent'] = 'Відбулася помилка при збереженні відправленого повідомлення';
-$messages['errorsaving'] = 'У процесі збереження трапилася помилка';
-$messages['errormoving'] = 'Не вдалося перемістити повідомлення';
-$messages['errordeleting'] = 'Не вдалося видалити повідомлення';
-$messages['deletecontactconfirm'] = 'Ви дійстно бажаєте видалити вибрані контакти?';
-$messages['deletemessagesconfirm'] = 'Ви дійстно бажаєте видалити вибрані повідомлення?';
-$messages['deletefolderconfirm'] = 'Ви дійстно бажаєте видалити цю теку?';
-$messages['purgefolderconfirm'] = 'Ви дійстно бажаєте видалити всі повідомлення у цій теці?';
-$messages['foldercreating'] = 'Створення папки';
-$messages['folderdeleting'] = 'Видалити папку';
-$messages['folderrenaming'] = 'Перейменування папки';
-$messages['foldermoving'] = 'Переміщення папки';
-$messages['formincomplete'] = 'Заповнені не усі поля';
+$messages['sendingfailed'] = 'Не вдалося відправити листа';
+$messages['senttooquickly'] = 'Будь ласка, зачекайте $sec секунд для відправки листа';
+$messages['errorsavingsent'] = 'Помилка при збереженні відправленого листа';
+$messages['errorsaving'] = 'Помилка при збереженні';
+$messages['errormoving'] = 'Не вдалося перемістити листи';
+$messages['errorcopying'] = 'Не вдалося зкопіювати листи';
+$messages['errordeleting'] = 'Не вдалося видалити листи';
+$messages['errormarking'] = 'Не вдалося позначити листи';
+$messages['deletecontactconfirm'] = 'Ви дійсно бажаєте видалити вибрані контакти?';
+$messages['deletemessagesconfirm'] = 'Ви дійсно бажаєте видалити вибрані листи?';
+$messages['deletefolderconfirm'] = 'Ви дійсно бажаєте видалити цю папку?';
+$messages['purgefolderconfirm'] = 'Ви дійсно бажаєте видалити всі листи у цій папці?';
+$messages['folderdeleting'] = 'Видалення папки...';
+$messages['foldermoving'] = 'Переміщення папки...';
+$messages['foldersubscribing'] = 'Підписати папку...';
+$messages['folderunsubscribing'] = 'Відписати папку...';
+$messages['formincomplete'] = 'Заповнено не всі поля';
 $messages['noemailwarning'] = 'Будь ласка, введіть коректну адресу електронної пошти';
 $messages['nonamewarning'] = 'Будь ласка, введіть ім`я';
 $messages['nopagesizewarning'] = 'Будь ласка, введіть розмір сторінки';
-$messages['nosenderwarning'] = 'Будь ласка, уведіть адресу електронної пошти відправника';
-$messages['norecipientwarning'] = 'Ð\91Ñ\83дÑ\8c Ð»Ð°Ñ\81ка, Ð²Ð²ÐµÐ´Ñ\96Ñ\82Ñ\8c Ñ\96м`Ñ\8f отримувача';
-$messages['nosubjectwarning'] = 'Ð\9fоле "Тема" Ð½Ðµ Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð¾. Ð\91ажаÑ\94Ñ\82е Ð·Ð°Ð¿Ð¾Ð²Ð½Ð¸Ñ\82и Ð¹Ð¾Ð³Ð¾ зараз?';
-$messages['nobodywarning'] = 'Ð\92Ñ\96дпÑ\80авиÑ\82и Ð¿Ð¾Ð²Ñ\96домленнÑ\8f без тексту?';
-$messages['notsentwarning'] = 'Ð\9fовÑ\96домленнÑ\8f Ð½Ðµ Ð±Ñ\83ло Ð²Ñ\96дпÑ\80авлено. Ð\92и Ð±Ð°Ð¶Ð°Ñ\94Ñ\82е Ð²Ñ\96дмовиÑ\82иÑ\81Ñ\8c Ð²Ñ\96д Ð²Ñ\96дпÑ\80авки?';
-$messages['noldapserver'] = 'Будь ласка, виберіть LDAP сервер для пошука';
+$messages['nosenderwarning'] = 'Будь ласка, введіть адресу електронної пошти відправника';
+$messages['norecipientwarning'] = 'Ð\91Ñ\83дÑ\8c Ð»Ð°Ñ\81ка, Ð²ÐºÐ°Ð¶Ñ\96Ñ\82Ñ\8c Ð¿Ñ\80инаймнÑ\96 Ð¾Ð´Ð½Ð¾Ð³Ð¾ отримувача';
+$messages['nosubjectwarning'] = 'Ð\9dе Ð²ÐºÐ°Ð·Ð°Ð½Ð¾ Ñ\82емÑ\83 Ð»Ð¸Ñ\81Ñ\82а. Ð\91ажаÑ\94Ñ\82е Ð²ÐºÐ°Ð·Ð°Ñ\82и Ñ\97Ñ\97 зараз?';
+$messages['nobodywarning'] = 'Ð\92Ñ\96дпÑ\80авиÑ\82и Ð»Ð¸Ñ\81Ñ\82а без тексту?';
+$messages['notsentwarning'] = 'Ð\9bиÑ\81Ñ\82 Ð½Ðµ Ð±Ñ\83ло Ð²Ñ\96дпÑ\80авлено. Ð\92и Ð±Ð°Ð¶Ð°Ñ\94Ñ\82е Ð²Ñ\96дÑ\85илиÑ\82и Ð²Ñ\96дпÑ\80авкÑ\83?';
+$messages['noldapserver'] = 'Будь ласка, виберіть LDAP сервер для пошуку';
 $messages['nocontactsreturned'] = 'Контакти не знайдені';
-$messages['nosearchname'] = 'Будь ласка, введіть ім`я чи адресу E-Mail';
-$messages['searchsuccessful'] = 'Зайдено $nr повідомлень';
-$messages['searchnomatch'] = 'Повідомлень не знайдено';
+$messages['nosearchname'] = 'Будь ласка, введіть ім`я чи електронну адресу';
+$messages['notuploadedwarning'] = 'Деякі вкладення не було завантажено. Будь ласка, почекайте або відмініть завантаження.';
+$messages['searchsuccessful'] = 'Зайдено $nr листів';
+$messages['searchnomatch'] = 'Листів не знайдено';
 $messages['searching'] = 'Пошук...';
 $messages['checking'] = 'Перевірка...';
 $messages['nospellerrors'] = 'Орфографічних помилок не знайдено';
-$messages['folderdeleted'] = 'Тека видалена';
+$messages['folderdeleted'] = 'Папка видалена';
+$messages['foldersubscribed'] = 'Папка підписана';
+$messages['folderunsubscribed'] = 'Папка відписана';
+$messages['folderpurged'] = 'Папка видалена';
+$messages['folderexpunged'] = 'Папка очищена';
 $messages['deletedsuccessfully'] = 'Видалено успішно';
-$messages['converting'] = 'Видалення форматованого повідомлення...';
-$messages['messageopenerror'] = 'Неможливо завантажити повідомлення з серверу';
-$messages['fileuploaderror'] = 'Неможливо завантажити файл';
-$messages['filesizeerror'] = 'Ð\97аванÑ\82ажений Ñ\84айл Ð±Ñ\96лÑ\8cÑ\88ий Ð·Ð° Ð¼Ð°ÐºÑ\81ималÑ\8cний Ñ\80озмÑ\96Ñ\80 Ñ\83 $size';
+$messages['converting'] = 'Видалення форматування...';
+$messages['messageopenerror'] = 'Не вдалося завантажити повідомлення з сервера';
+$messages['fileuploaderror'] = 'Не вдалося вкласти файл';
+$messages['filesizeerror'] = 'РозмÑ\96Ñ\80 Ð²Ð¸Ð±Ñ\80аного Ñ\84айлÑ\83 Ð¿ÐµÑ\80евиÑ\89Ñ\83Ñ\94 Ð¼Ð°ÐºÑ\81ималÑ\8cно Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¸Ð¹ ($size)';
 $messages['copysuccess'] = 'Скопійовано $nr адрес';
-$messages['copyerror'] = 'Неможливо скопіювати адресу';
-$messages['sourceisreadonly'] = 'Дане джерело адрес лише для читання';
-$messages['errorsavingcontact'] = 'Неможливо зберегти адресу контакта';
-$messages['movingmessage'] = 'Переміщую повідомлення...';
-$messages['receiptsent'] = 'Повідомлення про прочитання відправлене';
-$messages['errorsendingreceipt'] = 'Повідомлення про прочитання не відправлене';
-$messages['nodeletelastidentity'] = 'ви не можете вилучити цей профіль, він у вас останній';
-$messages['addsubfolderhint'] = 'Ця папка буде створена як підпапка в поточній папці';
-$messages['forbiddencharacter'] = 'Ім\'я папки містить неприпустимі символи';
+$messages['copyerror'] = 'Не вдалося скопіювати жодну адресу';
+$messages['sourceisreadonly'] = 'Дане джерело адрес доступне лише для читання';
+$messages['errorsavingcontact'] = 'Неможливо зберегти адресу контакту';
+$messages['movingmessage'] = 'Переміщення листа...';
+$messages['copyingmessage'] = 'Копіювання листа...';
+$messages['deletingmessage'] = 'Видалення листа (ів)';
+$messages['markingmessage'] = 'Позначення листа (ів)';
+$messages['receiptsent'] = 'Повідомлення про прочитання відправлено';
+$messages['errorsendingreceipt'] = 'Не вдалося відправити повідомлення про прочитання';
+$messages['nodeletelastidentity'] = 'Ви не можете видалити цей профіль, він у Вас останній.';
+$messages['forbiddencharacter'] = 'Ім\'я папки містить заборонені символи';
 $messages['selectimportfile'] = 'Виберіть файл для завантаження';
 $messages['addresswriterror'] = 'Обрана адресна книга недоступна для запису';
-$messages['importwait'] = 'Імпортування, будь ласка, почекайте';
-$messages['importerror'] = 'Імпорт завершився невдало! Завантажений файл не є правильним файлом vcard';
-$messages['importconfirm'] = 'Успішно імпортованих $inserted контактів, пропущене $skipped існуючих';
+$messages['contactaddedtogroup'] = 'Контакти успішно додано до цієї групи';
+$messages['contactremovedfromgroup'] = 'УКонтакти успішно видалено з цієї групи';
+$messages['importwait'] = 'Імпортування, будь ласка, зачекайте...';
+$messages['importerror'] = 'Імпорт завершився невдало! Завантажений файл не є правильним файлом vCard';
+$messages['importconfirm'] = '<b>Успішно імпортовано $inserted контактів, пропущено $skipped існуючих</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = 'Дія заборонена!';
 $messages['nofromaddress'] = 'В обраному профілі не вистачає адреси електронної пошти';
-$messages['editorwarning'] = 'При перемиканні в редактор простого тексту все форматування буде загублено. Продовжити?';
+$messages['editorwarning'] = 'Перемикання в режим звичайного тексту спричинить втрату всього форматування. Продовжити?';
+$messages['httpreceivedencrypterror'] = 'Помилка конфігурації. Негайно зверніться до адміністратора. <b>Ваше повідомлення не буде відправлено.</b>';
+$messages['smtpconnerror'] = 'Помилка SMTP-сервера ($code): Не вдалося з\'єднатися з сервером';
+$messages['smtpautherror'] = 'Помилка SMTP-сервера ($code): Невдала спроба автентифікації';
+$messages['smtpfromerror'] = 'Помилка SMTP-сервера ($code): Не вдалося вказати відправника "$from" ($msg)';
+$messages['smtptoerror'] = 'Помилка SMTP-сервера ($code): Не вдалося додати отримувача "$to" ($msg)';
+$messages['smtprecipientserror'] = 'Помилка SMTP: Не вдалося обробити список отримувачів';
+$messages['smtpdsnerror'] = 'Помилка SMTP: Не підтримуються повідомлення про статус доставки';
+$messages['smtperror'] = 'Помилка SMTP: $msg';
+$messages['emailformaterror'] = 'Невірна електронна адреса: $email';
+$messages['toomanyrecipients'] = 'Занадто багато отримувачів. Зменшіть їх число до $max.';
+$messages['maxgroupmembersreached'] = 'Число адрес у групі перевищило максимум у $max.';
+$messages['internalerror'] = 'Виникла внутрішня помилка. Будь ласка, спробуйте ще раз';
+$messages['contactdelerror'] = 'Неможливо видалити контакт(и)';
+$messages['contactdeleted'] = 'Контакт(и) видалено успішно';
+$messages['groupdeleted'] = 'Група видалена успішно';
+$messages['grouprenamed'] = 'Група перейменована успішно';
+$messages['groupcreated'] = 'Група створена успішно';
+$messages['messagedeleted'] = 'Лист(и) видалено успішно';
+$messages['messagemoved'] = 'Лист(и) переміщено успішно';
+$messages['messagecopied'] = 'Лист(и) скопійовано успішно';
+$messages['messagemarked'] = 'Лист(и) помічено успішно';
+$messages['autocompletechars'] = 'Введіть щонайменьше $min символів для автозаповнення';
+$messages['namecannotbeempty'] = 'Ім’я не може бути пустим';
+$messages['nametoolong'] = 'Занадто довге ім’я';
+$messages['folderupdated'] = 'Папка відновлена';
+$messages['foldercreated'] = 'Папка створена';
 
 ?>
index b4eca9f5ac15ddffe6a52f32127dc534279850fc..f009e4dfc1154c2897bc24e9a74ddd5d89129e1a 100644 (file)
@@ -5,15 +5,15 @@
  +-----------------------------------------------------------------------+
  | language/vn/labels.inc                                                |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Vinh Bui <bqvinh@buivinh.info>                                |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -205,9 +205,6 @@ $labels['foldername']  = 'Tên thư mục';
 $labels['subscribed']  = 'Cho sử dụng';
 $labels['create']  = 'Tạo';
 $labels['createfolder']  = 'Tạo thư mục mới';
-$labels['rename'] = 'Đổi tên';
-$labels['renamefolder'] = 'Đổi tên thư mục';
-$labels['deletefolder']  = 'Xóa thư mục';
 $labels['managefolders']  = 'Quản trị thư mục';
 
 $labels['sortby'] = 'Sắp xếp';
index 465b04ea83f43a0987d5f0c291a111643454a816..d8ba28729a75c66a3d86be1750d22141d6434591 100644 (file)
@@ -5,15 +5,15 @@
  +-----------------------------------------------------------------------+
  | language/vn/messages.inc                                              |
  |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | Language file of the Roundcube Webmail client                         |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Vinh Bui <bqvinh@buivinh.info>                                |
  +-----------------------------------------------------------------------+
 
- @version $Id$
+ @version $Id: messages.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
index e108adf66a421ce6a194ada098faed2bb025ff17..2b8e36ba01fb65c7819922cb9a126c01b7c47bda 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | localization/zh_CN/labels.inc                                         |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 |         Zhang Huang bin <michaelbibby@gmail.com>                      |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2513 2009-05-21 12:59:19Z alec $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -46,14 +46,14 @@ $labels['organization'] = '组织';
 $labels['reply-to'] = '回复至';
 $labels['mailboxlist'] = '邮件夹';
 $labels['messagesfromto'] = '第 $from 到 $to,共 $count 封邮件';
+$labels['threadsfromto'] = '第 $from 到 $to,共 $count 个主题';
 $labels['messagenrof'] = '第 $nr 封邮件,共 $count 封';
+$labels['copy'] = '复制';
+$labels['move'] = '移动';
 $labels['moveto'] = '移动到';
 $labels['download'] = '下载';
 $labels['filename'] = '文件名';
 $labels['filesize'] = '文件大小';
-$labels['preferhtml'] = '以 HTML 格式显示';
-$labels['htmlmessage'] = 'HTML 邮件';
-$labels['prettydate'] = '短日期格式';
 $labels['addtoaddressbook'] = '添加到通讯录';
 $labels['sun'] = '日';
 $labels['mon'] = '一';
@@ -117,13 +117,39 @@ $labels['markread'] = '已读';
 $labels['markunread'] = '未读';
 $labels['markflagged'] = '已标记';
 $labels['markunflagged'] = '未标记';
+$labels['messageactions'] = '更多操作...';
 $labels['select'] = '选择';
 $labels['all'] = '全部';
 $labels['none'] = '无';
+$labels['currpage'] = '当前页';
 $labels['unread'] = '未读';
 $labels['flagged'] = '已标记';
 $labels['unanswered'] = '未回复';
+$labels['deleted'] = '删除';
+$labels['invert'] = '反选';
 $labels['filter'] = '过滤';
+$labels['list'] = '列表';
+$labels['threads'] = '主题';
+$labels['expand-all'] = '展开全部';
+$labels['expand-unread'] = '展开未读';
+$labels['collapse-all'] = '收合全部';
+$labels['threaded'] = '线索';
+$labels['autoexpand_threads'] = '展开消息主题';
+$labels['do_expand'] = '所有主题';
+$labels['expand_only_unread'] = '仅未读消息';
+$labels['fromto'] = '发件人/收件人';
+$labels['flag'] = '标志';
+$labels['attachment'] = '附件';
+$labels['nonesort'] = '无';
+$labels['sentdate'] = '发送日期';
+$labels['arrival'] = '到达日期';
+$labels['asc'] = '升序';
+$labels['desc'] = '降序';
+$labels['listcolumns'] = '列表列';
+$labels['listsorting'] = '排序列';
+$labels['listorder'] = '排序';
+$labels['listmode'] = '列表视图样式';
+$labels['folderactions'] = '目录操作...';
 $labels['compact'] = '压缩';
 $labels['empty'] = '清空';
 $labels['purge'] = '清除';
@@ -132,8 +158,12 @@ $labels['unknown'] = '未知';
 $labels['unlimited'] = '无限制';
 $labels['quicksearch'] = '快速查找';
 $labels['resetsearch'] = '清空查找内容';
+$labels['searchmod'] = '搜寻模式';
+$labels['msgtext'] = '整个邮件';
 $labels['openinextwin'] = '在新窗口中打开';
+$labels['emlsave'] = '下载(.eml)';
 $labels['compose'] = '写新邮件';
+$labels['editasnew'] = '编辑为新邮件';
 $labels['savemessage'] = '保存为草稿';
 $labels['sendmessage'] = '立即发送';
 $labels['addattachment'] = '添加附件';
@@ -183,10 +213,13 @@ $labels['contactsfromto'] = '第 $from 到 $to 个联系人,共 $count 个';
 $labels['print'] = '打印';
 $labels['export'] = '导出';
 $labels['exportvcards'] = '以 vCard 格式导出联系人';
+$labels['newcontactgroup'] = '创建新的联系人组';
+$labels['groupactions'] = '联系人组操作...';
 $labels['previouspage'] = '上一页';
 $labels['firstpage'] = '第一页';
 $labels['nextpage'] = '下一页';
 $labels['lastpage'] = '最后一页';
+$labels['group'] = '分组';
 $labels['groups'] = '分组';
 $labels['personaladrbook'] = '个人住址';
 $labels['import'] = '导入';
@@ -204,6 +237,10 @@ $labels['manageidentities'] = '管理此账号的身份';
 $labels['newidentity'] = '添加身份';
 $labels['newitem'] = '添加条目';
 $labels['edititem'] = '修改条目';
+$labels['preferhtml'] = '以 HTML 格式显示';
+$labels['defaultcharset'] = '默认字符集';
+$labels['htmlmessage'] = 'HTML 邮件';
+$labels['prettydate'] = '短日期格式';
 $labels['setdefault'] = '设为默认';
 $labels['autodetect'] = '自动';
 $labels['language'] = '语言';
@@ -227,6 +264,7 @@ $labels['ignore'] = '忽略';
 $labels['readwhendeleted'] = '删除后标记为已读';
 $labels['flagfordeletion'] = '标记邮件为已删除而不是实际删除';
 $labels['skipdeleted'] = '不显示标记为已删除的邮件';
+$labels['deletealways'] = '如果移动邮件到回收站失败,则删除';
 $labels['showremoteimages'] = '显示内嵌的图片';
 $labels['fromknownsenders'] = '来自未知的发件人';
 $labels['always'] = '总是';
@@ -235,15 +273,37 @@ $labels['autosavedraft'] = '自动保存到草稿箱';
 $labels['everynminutes'] = '每隔 $n 分钟';
 $labels['keepalive'] = '检查新邮件';
 $labels['never'] = '从不';
+$labels['immediately'] = '立即';
 $labels['messagesdisplaying'] = '邮件显示设置';
 $labels['messagescomposition'] = '写邮件';
 $labels['mimeparamfolding'] = '附件名';
 $labels['2231folding'] = '完整的 RFC 2231(Thunderbird)';
 $labels['miscfolding'] = 'RFC 2047/2232(MS Outlook)';
 $labels['2047folding'] = '完整的 RFC 2047(其它)';
+$labels['force7bit'] = '对8位字符使用MIME编码';
 $labels['advancedoptions'] = '高级选项';
 $labels['focusonnewmessage'] = '新邮件到达时将窗口提升为焦点窗口';
 $labels['checkallfolders'] = '检查所有邮件夹里的新邮件';
+$labels['displaynext'] = '当邮件删掉/移动后显示下一封邮件';
+$labels['mainoptions'] = '主要选项';
+$labels['section'] = '项目';
+$labels['maintenance'] = '维护';
+$labels['newmessage'] = '新邮件';
+$labels['listoptions'] = '列表选项';
+$labels['signatureoptions'] = '签名选项';
+$labels['whenreplying'] = '当回复时';
+$labels['replytopposting'] = '在原文上面开始新邮件';
+$labels['replybottomposting'] = '在原文下面开始新邮件';
+$labels['replyremovesignature'] = '当回复时从邮件移除原始签名';
+$labels['autoaddsignature'] = '自动插入签名';
+$labels['newmessageonly'] = '仅新邮件';
+$labels['replyandforwardonly'] = '仅回复和转发邮件';
+$labels['replysignaturepos'] = '当回复或转发时插入签名';
+$labels['belowquote'] = '位于原文下方';
+$labels['abovequote'] = '位于原文上方';
+$labels['insertsignature'] = '插入签名';
+$labels['previewpanemarkread'] = '标记预览邮件为已读';
+$labels['afternseconds'] = '$n 秒之后';
 $labels['folder'] = '邮件夹';
 $labels['folders'] = '邮件夹';
 $labels['foldername'] = '邮件夹名称';
@@ -251,9 +311,6 @@ $labels['subscribed'] = '已订阅';
 $labels['messagecount'] = '邮件数量';
 $labels['create'] = '建立';
 $labels['createfolder'] = '建立新邮件夹';
-$labels['rename'] = '重命名';
-$labels['renamefolder'] = '重命名邮件夹';
-$labels['deletefolder'] = '删除邮件夹';
 $labels['managefolders'] = '管理邮件夹';
 $labels['specialfolders'] = '指定邮件夹';
 $labels['sortby'] = '排序';
@@ -263,5 +320,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = 'Unicode';
+$labels['english'] = '英语';
+$labels['westerneuropean'] = '西欧';
+$labels['easterneuropean'] = '东欧';
+$labels['southeasterneuropean'] = '东南欧';
+$labels['baltic'] = '波罗的海';
+$labels['cyrillic'] = '西里尔语';
+$labels['arabic'] = '阿拉伯语';
+$labels['greek'] = '希腊语';
+$labels['hebrew'] = '希伯来语';
+$labels['turkish'] = '土耳其语';
+$labels['nordic'] = '北欧';
+$labels['thai'] = '泰语';
+$labels['celtic'] = '塞尔特';
+$labels['vietnamese'] = '越南语';
+$labels['japanese'] = '日文';
+$labels['korean'] = '韩语';
+$labels['chinese'] = '中文';
 
 ?>
index c3c65c0235efa09341ee3f59e21a2a46b0378093..37dcac445abe0d3d691bfe54c5cc5a8ec830c268 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | localization/zh_CN/messages.inc                                       |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
 |         Zhang Huang bin <michaelbibby@gmail.com>                      |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2237 2009-01-17 01:55:39Z till $
+@version $Id: messages.inc 4405 2011-01-12 11:56:25Z thomasb $
 
 */
 
@@ -23,10 +23,16 @@ $messages['loginfailed'] = '登录失败';
 $messages['cookiesdisabled'] = '您的浏览器不接受 cookies';
 $messages['sessionerror'] = '会话已过期';
 $messages['imaperror'] = '连接到邮件服务器失败';
+$messages['servererror'] = '服务器错误!';
+$messages['servererrormsg'] = '服务器错误: $msg';
+$messages['errorreadonly'] = '不可对只读文件夹进行操作';
+$messages['errornoperm'] = '无权限操作';
+$messages['invalidrequest'] = '无效的请求!数据保存失败。';
 $messages['nomessagesfound'] = '此邮件夹内无邮件';
 $messages['loggedout'] = '您已成功注销';
 $messages['mailboxempty'] = '邮件夹为空';
 $messages['loading'] = '正在加载...';
+$messages['uploading'] = '正在上传文件...';
 $messages['loadingdata'] = '正在加载数据...';
 $messages['checkingmail'] = '检查新邮件...';
 $messages['sendingmessage'] = '正在发送邮件...';
@@ -45,15 +51,17 @@ $messages['senttooquickly'] = '您需要等待 $sec 秒才能发送邮件';
 $messages['errorsavingsent'] = '保存已发送邮件时出现错误';
 $messages['errorsaving'] = '保存过程中发生错误';
 $messages['errormoving'] = '无法移动邮件';
+$messages['errorcopying'] = '无法复制邮件';
 $messages['errordeleting'] = '无法删除邮件';
+$messages['errormarking'] = '无法标记邮件';
 $messages['deletecontactconfirm'] = '确定要删除已选中的联系人?';
 $messages['deletemessagesconfirm'] = '确定要删除已选中的邮件?';
 $messages['deletefolderconfirm'] = '确定要删除已选中的邮件夹?';
 $messages['purgefolderconfirm'] = '是否确认要删除当前邮件夹中的所有邮件?';
-$messages['foldercreating'] = '正在创建邮件夹';
 $messages['folderdeleting'] = '正在删除邮件夹';
-$messages['folderrenaming'] = '正在重命名邮件夹';
 $messages['foldermoving'] = '正在移动目录...';
+$messages['foldersubscribing'] = '注册文件夹中...';
+$messages['folderunsubscribing'] = '解除注册中...';
 $messages['formincomplete'] = '当前表单未填写完整,请完整填写';
 $messages['noemailwarning'] = '请输入一个有效的邮件地址';
 $messages['nonamewarning'] = '请输入名字';
@@ -66,12 +74,17 @@ $messages['notsentwarning'] = '邮件未发送。您确定要离开并废弃当
 $messages['noldapserver'] = '请选择一个LDAP服务器进行查找';
 $messages['nocontactsreturned'] = '未找到联系人';
 $messages['nosearchname'] = '请输入一个联系人姓名或电子邮件地址';
+$messages['notuploadedwarning'] = '附件还没有全部上传,请等待或者取消上传。';
 $messages['searchsuccessful'] = '共找到 $nr 封邮件';
 $messages['searchnomatch'] = '未找到任何符合条件的邮件';
 $messages['searching'] = '正在查找...';
 $messages['checking'] = '正在检查...';
 $messages['nospellerrors'] = '未发现拼写错误';
 $messages['folderdeleted'] = '邮件夹已被成功删除';
+$messages['foldersubscribed'] = '成功注册文件夹';
+$messages['folderunsubscribed'] = '成功解除注册的文件夹';
+$messages['folderpurged'] = '清空文件夹成功';
+$messages['folderexpunged'] = '文件夹已清空';
 $messages['deletedsuccessfully'] = '删除成功';
 $messages['converting'] = '格式转换中...';
 $messages['messageopenerror'] = '无法从服务器上加载邮件内容';
@@ -82,18 +95,47 @@ $messages['copyerror'] = '无法复制地址';
 $messages['sourceisreadonly'] = '源地址为只读';
 $messages['errorsavingcontact'] = '无法保存联系人的地址';
 $messages['movingmessage'] = '移动邮件到...';
+$messages['copyingmessage'] = '复制邮件到...';
+$messages['deletingmessage'] = '正在删除邮件...';
+$messages['markingmessage'] = '正在标记邮件...';
 $messages['receiptsent'] = '成功发送了一个已读回执';
 $messages['errorsendingreceipt'] = '无法发送回执';
 $messages['nodeletelastidentity'] = '无法删除这个身份,这是最后一个。';
-$messages['addsubfolderhint'] = '新建的文件夹将成为所选文件夹的子文件夹';
 $messages['forbiddencharacter'] = '目录名包含隐藏字符';
 $messages['selectimportfile'] = '请选择要上传的文件';
 $messages['addresswriterror'] = '已选择的地址簿不可写';
+$messages['contactaddedtogroup'] = '成功添加联系人到这个分组';
+$messages['contactremovedfromgroup'] = '成功从这个分组移除联系人';
 $messages['importwait'] = '正在导入,请稍后...';
 $messages['importerror'] = '导入失败!所上传的文件不是有效的 vCard 文件。';
 $messages['importconfirm'] = '<b>成功导入 $inserted 联系人,$skipped 乎略已存在的联系人</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = '不允许的操作';
 $messages['nofromaddress'] = '选种的身份中没有邮件地址';
 $messages['editorwarning'] = '切换到纯文本编辑器将导致邮件正文中的所有文本格式失效,您确定要这样做吗?';
-
+$messages['httpreceivedencrypterror'] = '发送一个致命的配置错误,请立即联系管理员。<b>您的邮件无法发送.</b>';
+$messages['smtpconnerror'] = 'SMTP 错误 ($code):连接服务器失败';
+$messages['smtpautherror'] = 'SMTP 错误 ($code): 认证失败';
+$messages['smtpfromerror'] = 'SMTP 错误 ($code):添加发件人失败 "$from" ($msg)';
+$messages['smtptoerror'] = 'SMTP 错误 ($code): 添加收件人失败 "$to" ($msg)';
+$messages['smtprecipientserror'] = 'SMTP 错误: 无法解析收件人列表';
+$messages['smtpdsnerror'] = 'SMTP 错误: 不支持邮件送达通知';
+$messages['smtperror'] = 'SMTP 错误: $msg';
+$messages['emailformaterror'] = '无效的邮件地址:$email';
+$messages['toomanyrecipients'] = '邮件人太多,请减少收件人数量至 $max.';
+$messages['maxgroupmembersreached'] = '组员数量超过最大值 $max';
+$messages['internalerror'] = '遇到一个内部错误,请重试';
+$messages['contactdelerror'] = '无法删除联系人';
+$messages['contactdeleted'] = '删除联系人成功';
+$messages['groupdeleted'] = '成功删除联系人组';
+$messages['grouprenamed'] = '联系人组改名成功';
+$messages['groupcreated'] = '成功创建联系人组';
+$messages['messagedeleted'] = '删除邮件成功';
+$messages['messagemoved'] = '转移邮件成功';
+$messages['messagecopied'] = '复制邮件成功';
+$messages['messagemarked'] = '标记邮件成功';
+$messages['autocompletechars'] = '至少需要输入 $min 个字符';
+$messages['namecannotbeempty'] = '必须输入名字';
+$messages['nametoolong'] = '名字太长';
+$messages['folderupdated'] = '成功更新文件夹';
+$messages['foldercreated'] = '成功创建文件夹';
 ?>
index 48b458b1be3cd58ed7e530e826119ed1ed5b1b4f..9a381113a1e0cf9eb62647921d5b55cc53267977 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | localization/zh_TW/labels.inc                                         |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -15,7 +15,7 @@
 |         Ting-Hung Chiu <earrl@mmlab.cse.yzu.edu.tw>                   |
 +-----------------------------------------------------------------------+
 
-@version $Id: labels.inc 2513 2009-05-21 12:59:19Z alec $
+@version $Id: labels.inc 4345 2010-12-17 14:28:38Z thomasb $
 
 */
 
@@ -40,21 +40,25 @@ $labels['to'] = '收件者';
 $labels['cc'] = '副本';
 $labels['bcc'] = '密件副本';
 $labels['replyto'] = '回覆至';
+$labels['followupto'] = '信件跟隨至';
 $labels['date'] = '日期';
 $labels['size'] = '大小';
 $labels['priority'] = '優先順序';
 $labels['organization'] = '組織';
+$labels['readstatus'] = '讀信狀態';
 $labels['reply-to'] = '回覆至';
+$labels['mail-reply-to'] = '信件回覆至';
+$labels['mail-followup-to'] = '信件跟隨至';
 $labels['mailboxlist'] = '資料夾';
 $labels['messagesfromto'] = '郵件 $from 至 $to,共有 $count 封郵件';
+$labels['threadsfromto'] = '郵件串 $from 至 $to,共有 $count 個';
 $labels['messagenrof'] = '第 $nr 封郵件,共有 $count 封';
+$labels['copy'] = '複製';
+$labels['move'] = '移動';
 $labels['moveto'] = '移至...';
 $labels['download'] = '下載';
 $labels['filename'] = '檔案名稱';
 $labels['filesize'] = '檔案大小';
-$labels['preferhtml'] = '使用 HTML 顯示';
-$labels['htmlmessage'] = 'HTML 郵件';
-$labels['prettydate'] = '簡短日期顯示';
 $labels['addtoaddressbook'] = '新增至通訊錄';
 $labels['sun'] = '週日';
 $labels['mon'] = '週一';
@@ -99,6 +103,8 @@ $labels['checkmail'] = '檢查新郵件';
 $labels['writenewmessage'] = '撰寫新郵件';
 $labels['replytomessage'] = '回覆';
 $labels['replytoallmessage'] = '全部回覆';
+$labels['replyall'] = '全部回覆';
+$labels['replylist'] = '清單回覆';
 $labels['forwardmessage'] = '轉寄';
 $labels['deletemessage'] = '刪除郵件';
 $labels['movemessagetotrash'] = '移動郵件至垃圾桶';
@@ -118,13 +124,39 @@ $labels['markread'] = '標示為已讀取';
 $labels['markunread'] = '標示為未讀取';
 $labels['markflagged'] = '標上旗標';
 $labels['markunflagged'] = '移除旗標';
+$labels['messageactions'] = '更多動作…';
 $labels['select'] = '選取';
 $labels['all'] = '全部郵件';
 $labels['none'] = '無';
+$labels['currpage'] = '目前頁面';
 $labels['unread'] = '未讀取的郵件';
 $labels['flagged'] = '已加標記的郵件';
 $labels['unanswered'] = '未回覆的郵件';
+$labels['deleted'] = '已刪除的郵件';
+$labels['invert'] = '反選';
 $labels['filter'] = '篩選範圍';
+$labels['list'] = '清單';
+$labels['threads'] = '郵件串';
+$labels['expand-all'] = '全部展開';
+$labels['expand-unread'] = '展開未讀取';
+$labels['collapse-all'] = '全部收起';
+$labels['threaded'] = '郵件串';
+$labels['autoexpand_threads'] = '只展開郵件串';
+$labels['do_expand'] = '所有郵件串';
+$labels['expand_only_unread'] = '只展開未讀訊息';
+$labels['fromto'] = '寄件者/收件者';
+$labels['flag'] = '旗標';
+$labels['attachment'] = '附件';
+$labels['nonesort'] = '無';
+$labels['sentdate'] = '寄送時間';
+$labels['arrival'] = '到達時間';
+$labels['asc'] = '遞增';
+$labels['desc'] = '遞減';
+$labels['listcolumns'] = '列出欄位';
+$labels['listsorting'] = '排序欄位';
+$labels['listorder'] = '排序順序';
+$labels['listmode'] = '清單檢視模式';
+$labels['folderactions'] = '資料夾動作...';
 $labels['compact'] = '壓縮';
 $labels['empty'] = '清空';
 $labels['purge'] = '清除';
@@ -136,19 +168,24 @@ $labels['resetsearch'] = '重設搜尋';
 $labels['searchmod'] = '修改搜尋';
 $labels['msgtext'] = '整封郵件';
 $labels['openinextwin'] = '在新視窗開啟';
+$labels['emlsave'] = '下載(.eml)';
 $labels['compose'] = '撰寫新郵件';
+$labels['editasnew'] = '已新郵件編輯';
 $labels['savemessage'] = '儲存成草稿';
 $labels['sendmessage'] = '立即寄出';
 $labels['addattachment'] = '增加附件檔案';
 $labels['charset'] = '郵件編碼';
 $labels['editortype'] = '編輯器類型';
 $labels['returnreceipt'] = '要求讀取回條';
+$labels['dsn'] = '傳送狀態通知';
+$labels['editidents'] = '編輯身份資訊';
 $labels['checkspelling'] = '拼字檢查';
 $labels['resumeediting'] = '繼續編輯';
 $labels['revertto'] = '恢復至';
 $labels['attachments'] = '附加檔案';
 $labels['upload'] = '上傳';
 $labels['close'] = '關閉';
+$labels['messageoptions'] = '郵件選項...';
 $labels['low'] = '低';
 $labels['lowest'] = '最低';
 $labels['normal'] = '普通';
@@ -165,6 +202,7 @@ $labels['maxuploadsize'] = '上傳檔案大小限制為 $size';
 $labels['addcc'] = '新增副本';
 $labels['addbcc'] = '新增密件副本';
 $labels['addreplyto'] = '新增回覆地址';
+$labels['addfollowupto'] = '新增 信件跟隨至';
 $labels['mdnrequest'] = '此郵件的寄件者希望在你閱讀此郵件時受到通知。你想要通知寄件者嗎?';
 $labels['receiptread'] = '郵件回條(已閱讀)';
 $labels['yourmessage'] = '這是你郵件的郵件回條';
@@ -175,6 +213,8 @@ $labels['surname'] = '姓氏';
 $labels['email'] = '電子郵件';
 $labels['addcontact'] = '新增聯絡人';
 $labels['editcontact'] = '編輯聯絡人';
+$labels['contacts'] = '聯絡人';
+$labels['contactproperties'] = '聯絡人資訊';
 $labels['edit'] = '編輯';
 $labels['cancel'] = '取消';
 $labels['save'] = '儲存';
@@ -186,10 +226,13 @@ $labels['contactsfromto'] = '聯絡人 $from 至 $to,共有 $count 人';
 $labels['print'] = '列印';
 $labels['export'] = '匯出通訊錄';
 $labels['exportvcards'] = '匯出通訊錄為 vCard 格式';
+$labels['newcontactgroup'] = '新增聯絡人群組';
+$labels['groupactions'] = '聯絡人群組的動作';
 $labels['previouspage'] = '顯示上一頁';
 $labels['firstpage'] = '顯示第一頁';
 $labels['nextpage'] = '顯示下一頁';
 $labels['lastpage'] = '顯示最後一頁';
+$labels['group'] = '群組';
 $labels['groups'] = '群組';
 $labels['personaladrbook'] = '個人住址';
 $labels['import'] = '匯入通訊錄';
@@ -207,6 +250,10 @@ $labels['manageidentities'] = '管理此帳號的身份資訊';
 $labels['newidentity'] = '新增身份資訊';
 $labels['newitem'] = '新增項目';
 $labels['edititem'] = '編輯項目';
+$labels['preferhtml'] = '使用 HTML 顯示';
+$labels['defaultcharset'] = '預設編碼';
+$labels['htmlmessage'] = 'HTML 郵件';
+$labels['prettydate'] = '簡短日期顯示';
 $labels['setdefault'] = '設成預設i值';
 $labels['autodetect'] = '自動選擇';
 $labels['language'] = '語言';
@@ -215,6 +262,7 @@ $labels['pagesize'] = '每頁郵件數';
 $labels['signature'] = '簽名檔';
 $labels['dstactive'] = '日光節約時間';
 $labels['htmleditor'] = '使用 HTML 撰寫郵件';
+$labels['htmlonreply'] = '只有在回覆HTML信件時';
 $labels['htmlsignature'] = 'HTML 簽名檔';
 $labels['previewpane'] = '顯示預覽窗格';
 $labels['skin'] = '版面風格';
@@ -226,10 +274,13 @@ $labels['mailboxview'] = '信箱顯示設定';
 $labels['mdnrequests'] = '讀取回條回應';
 $labels['askuser'] = '詢問使用者';
 $labels['autosend'] = '自動送出';
+$labels['autosendknown'] = '只對我的聯絡人傳送回條,其他詢問使用者';
+$labels['autosendknownignore'] = '只對我的聯絡人傳送回條,其他忽略';
 $labels['ignore'] = '完全忽略';
 $labels['readwhendeleted'] = '將刪除的郵件標示為已讀取';
 $labels['flagfordeletion'] = '刪除郵件時將原始郵件標示為已刪除';
 $labels['skipdeleted'] = '不要顯示已刪除的郵件';
+$labels['deletealways'] = '如果移到垃圾桶失敗,就直接刪除';
 $labels['showremoteimages'] = '顯示遠端郵件內文中的圖片';
 $labels['fromknownsenders'] = '從已知的寄件者';
 $labels['always'] = '總是接受';
@@ -238,15 +289,40 @@ $labels['autosavedraft'] = '自動儲存草稿';
 $labels['everynminutes'] = '每 $n 分鐘';
 $labels['keepalive'] = '檢查新郵件的間隔時間';
 $labels['never'] = '絕對不要';
+$labels['immediately'] = '馬上';
 $labels['messagesdisplaying'] = '郵件顯示設定';
 $labels['messagescomposition'] = '撰寫郵件設定';
 $labels['mimeparamfolding'] = '附加檔案名稱的編碼方式';
-$labels['2231folding'] = '完全 RFC 2231 模式 (Thunderbird)';
-$labels['miscfolding'] = 'RFC 2047/2231 混合模式 (MS Outlook)';
-$labels['2047folding'] = '完全 RFC 2047 模式 (其他)';
+$labels['2231folding'] = '完全 RFC 2231 模式(Thunderbird)';
+$labels['miscfolding'] = 'RFC 2047/2231 混合模式(MS Outlook)';
+$labels['2047folding'] = '完全 RFC 2047 模式(其他)';
+$labels['force7bit'] = '使用MIME編碼對於8位元字元';
 $labels['advancedoptions'] = '顯示進階設定選項';
 $labels['focusonnewmessage'] = '收到新郵件時使瀏覽器獲得焦點';
 $labels['checkallfolders'] = '檢查所有資料夾中的新郵件';
+$labels['displaynext'] = '郵件刪除/移動時顯示下一個郵件';
+$labels['mainoptions'] = '主要選項';
+$labels['section'] = '分類';
+$labels['maintenance'] = '管理';
+$labels['newmessage'] = '新郵件';
+$labels['listoptions'] = '排列選項';
+$labels['signatureoptions'] = '簽名檔選項';
+$labels['whenreplying'] = '回覆時';
+$labels['replytopposting'] = '在原來的上方開始新訊息';
+$labels['replybottomposting'] = '在原來的下方開始新訊息';
+$labels['replyremovesignature'] = '回覆時移除原有簽名檔';
+$labels['autoaddsignature'] = '自動附加簽名';
+$labels['newmessageonly'] = '只有新訊息';
+$labels['replyandforwardonly'] = '只有回覆或轉寄';
+$labels['replysignaturepos'] = '當回覆或轉寄時附上簽名檔';
+$labels['belowquote'] = '引用的下方';
+$labels['abovequote'] = '引用的上方';
+$labels['insertsignature'] = '插入簽名檔';
+$labels['previewpanemarkread'] = '標示已預覽訊息為已讀取';
+$labels['afternseconds'] = '$n 秒之後';
+$labels['reqmdn'] = '永遠索取讀取回條';
+$labels['reqdsn'] = '總是要求傳送狀態通知';
+$labels['replysamefolder'] = '將回覆與回覆信件放置於相同資料夾';
 $labels['folder'] = '資料夾';
 $labels['folders'] = '資料夾';
 $labels['foldername'] = '資料夾名稱';
@@ -254,9 +330,6 @@ $labels['subscribed'] = '顯示';
 $labels['messagecount'] = '郵件數目';
 $labels['create'] = '建立';
 $labels['createfolder'] = '建立新資料夾';
-$labels['rename'] = '重新命名';
-$labels['renamefolder'] = '重新命名資料夾';
-$labels['deletefolder'] = '刪除資料夾';
 $labels['managefolders'] = '管理資料夾';
 $labels['specialfolders'] = '預設資料夾設定';
 $labels['sortby'] = '排序';
@@ -266,5 +339,23 @@ $labels['B'] = 'B';
 $labels['KB'] = 'KB';
 $labels['MB'] = 'MB';
 $labels['GB'] = 'GB';
+$labels['unicode'] = '萬國碼';
+$labels['english'] = '英語';
+$labels['westerneuropean'] = '西歐語系';
+$labels['easterneuropean'] = '東歐語系';
+$labels['southeasterneuropean'] = '東南歐語系';
+$labels['baltic'] = '波羅的海';
+$labels['cyrillic'] = '西里爾';
+$labels['arabic'] = '阿拉伯語';
+$labels['greek'] = '希臘';
+$labels['hebrew'] = '希伯來語';
+$labels['turkish'] = '土耳其';
+$labels['nordic'] = '北歐';
+$labels['thai'] = '泰國';
+$labels['celtic'] = '塞爾特';
+$labels['vietnamese'] = '越南';
+$labels['japanese'] = '日本';
+$labels['korean'] = '韓國';
+$labels['chinese'] = '國語';
 
 ?>
index 257bbc31bc84cd87f819a12359b9f191b99f5f98..e56e9a773dce39f73a8948f3425eb2b2ec9f7912 100644 (file)
@@ -5,8 +5,8 @@
 +-----------------------------------------------------------------------+
 | localization/zh_TW/messages.inc                                       |
 |                                                                       |
-| Language file of the RoundCube Webmail client                         |
-| Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+| Language file of the Roundcube Webmail client                         |
+| Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 +-----------------------------------------------------------------------+
@@ -15,7 +15,7 @@
 |         Ting-Hung Chiu <earrl@mmlab.cse.yzu.edu.tw>                   |
 +-----------------------------------------------------------------------+
 
-@version $Id: messages.inc 2470 2009-05-12 20:04:11Z yllar $
+@version $Id: messages.inc 4304 2010-12-03 10:58:40Z alec $
 
 */
 
@@ -24,10 +24,14 @@ $messages['loginfailed'] = '登入失敗';
 $messages['cookiesdisabled'] = '你的瀏覽器不接受 cookies';
 $messages['sessionerror'] = '你的工作階段已失效或過期';
 $messages['imaperror'] = '連線到 IMAP 伺服器失敗';
+$messages['servererror'] = '伺服器錯誤!';
+$messages['servererrormsg'] = '伺服器錯誤:$msg';
+$messages['invalidrequest'] = '要求無效!未儲存任何資料。';
 $messages['nomessagesfound'] = '此郵件匣沒有任何郵件';
 $messages['loggedout'] = '你已成功地登出並結束工作階段了。再見!';
 $messages['mailboxempty'] = '郵件匣是空的';
 $messages['loading'] = '載入中...';
+$messages['uploading'] = '上傳檔案中…';
 $messages['loadingdata'] = '載入資料中...';
 $messages['checkingmail'] = '檢查新郵件...';
 $messages['sendingmessage'] = '寄出郵件中...';
@@ -46,14 +50,14 @@ $messages['senttooquickly'] = '你寄出的郵件太過於頻繁,請稍候 $se
 $messages['errorsavingsent'] = '儲存寄件備份時發生錯誤';
 $messages['errorsaving'] = '儲存時發生錯誤';
 $messages['errormoving'] = '無法移動此郵件';
+$messages['errorcopying'] = '無法訊息';
 $messages['errordeleting'] = '無法刪除此郵件';
+$messages['errormarking'] = '無法標上旗標';
 $messages['deletecontactconfirm'] = '你確定要刪除已選擇的聯絡人?';
 $messages['deletemessagesconfirm'] = '你確定要刪除已選擇的郵件?';
 $messages['deletefolderconfirm'] = '你確定要刪除這個資料夾嗎?';
 $messages['purgefolderconfirm'] = '你確定要刪除這個資料夾裡面所有的郵件嗎?';
-$messages['foldercreating'] = '建立資料夾中...';
 $messages['folderdeleting'] = '刪除資料夾中...';
-$messages['folderrenaming'] = '重新命名資料夾中...';
 $messages['foldermoving'] = '移動資料夾中...';
 $messages['formincomplete'] = '這個表單有部分未填,請完整填寫';
 $messages['noemailwarning'] = '請輸入一個有效的電子郵件位址';
@@ -67,6 +71,7 @@ $messages['notsentwarning'] = '郵件尚未寄出。你確定要離開並且捨
 $messages['noldapserver'] = '請選擇一個 LDAP 伺服器進行搜尋';
 $messages['nocontactsreturned'] = '沒有找到任何聯絡人';
 $messages['nosearchname'] = '請輸入一個聯絡人姓名或電子郵件位址';
+$messages['notuploadedwarning'] = '尚有附加檔案未上傳完畢,請等待或取消上傳';
 $messages['searchsuccessful'] = '共找到 $nr 封郵件';
 $messages['searchnomatch'] = '找不到任何符合的郵件';
 $messages['searching'] = '搜尋中...';
@@ -83,18 +88,44 @@ $messages['copyerror'] = '無法複製任何位址';
 $messages['sourceisreadonly'] = '此來源位址是唯讀的';
 $messages['errorsavingcontact'] = '無法儲存連絡人的位址';
 $messages['movingmessage'] = '移動郵件中...';
+$messages['copyingmessage'] = '複製訊息...';
+$messages['deletingmessage'] = '刪除訊息...';
+$messages['markingmessage'] = '標示訊息...';
 $messages['receiptsent'] = '閱讀回條傳送成功';
 $messages['errorsendingreceipt'] = '無法傳送回條';
 $messages['nodeletelastidentity'] = '你不能刪除此身份,因為只剩一個身份。';
-$messages['addsubfolderhint'] = '此資料夾會成為目前所選資料夾的子資料夾';
 $messages['forbiddencharacter'] = '資料夾名稱中包含非法的字元';
 $messages['selectimportfile'] = '請選擇一個上傳的檔案';
 $messages['addresswriterror'] = '無法寫入選擇的通訊錄';
+$messages['contactaddedtogroup'] = '成功把聯絡人加入此群組';
+$messages['contactremovedfromgroup'] = '成功把移除此群組中的聯絡人';
 $messages['importwait'] = '匯入中,請稍候...';
 $messages['importerror'] = '匯入失敗!上傳的檔案並非支援的 vCard 格式。';
 $messages['importconfirm'] = '<b>成功匯入 $inserted 筆資料,略過 $skipped 筆已存在的資料</b>:<p><em>$names</em></p>';
 $messages['opnotpermitted'] = '不允許的操作';
 $messages['nofromaddress'] = '在選擇的身分中遺失了電子郵件位址';
 $messages['editorwarning'] = '切換到純文字編輯模式將會遺失所有設定的樣式。您確定要繼續嗎?';
+$messages['httpreceivedencrypterror'] = '發生嚴重錯誤。請立即聯絡管理者。<b>您的郵件無法送出。</b>';
+$messages['smtpconnerror'] = 'SMTP 錯誤($code):與伺服器連線失敗';
+$messages['smtpautherror'] = 'SMTP 錯誤($code):認證失敗';
+$messages['smtpfromerror'] = 'SMTP 錯誤($code):無法設寄建者「$from」($msg)';
+$messages['smtptoerror'] = 'SMTP 錯誤($code):無法加收件者「$to」($msg)';
+$messages['smtprecipientserror'] = 'SMTP 錯誤:無法分析收件者';
+$messages['smtpdsnerror'] = 'SMTP 錯誤:不支援傳送狀態通知';
+$messages['smtperror'] = 'SMTP 錯誤:$msg';
+$messages['emailformaterror'] = '錯誤電子郵件:$email';
+$messages['toomanyrecipients'] = '太多收件人。請減少至 $max 人';
+$messages['maxgroupmembersreached'] = '太多群組成員,超過最大人數 $max 人';
+$messages['internalerror'] = '內部發生錯誤。請再次嘗試';
+$messages['contactdelerror'] = '無法刪除聯絡人';
+$messages['contactdeleted'] = '聯絡人成功刪除';
+$messages['groupdeleted'] = '群組成功刪除';
+$messages['grouprenamed'] = '群組重新命名成功';
+$messages['groupcreated'] = '群組建立成功';
+$messages['messagedeleted'] = '訊息成功刪除';
+$messages['messagemoved'] = '訊息成功移動';
+$messages['messagecopied'] = '訊息成功複製';
+$messages['messagemarked'] = '訊息成功標示';
+$messages['autocompletechars'] = '輸入至少 $min 字元才能自動完成自動完成';
 
 ?>
index bc082b67586b18cc6cf02287c6ff0998b4e98214..8a8379078a761346d26dfe1c8e023f2faf39318c 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/addressbook/copy.inc                                    |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2007, RoundCube Dev. - Switzerland                      |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2007, Roundcube Dev. - Switzerland                      |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -25,21 +25,64 @@ if (!$OUTPUT->ajax_call)
 
 $cid = get_input_value('_cid', RCUBE_INPUT_POST);
 $target = get_input_value('_to', RCUBE_INPUT_POST);
+$target_group = get_input_value('_togid', RCUBE_INPUT_POST);
 
-if ($cid && preg_match('/^[a-z0-9\-_=]+(,[a-z0-9\-_=]+)*$/i', $cid) && strlen($target) && $target !== $source)
+if ($cid && preg_match('/^[a-zA-Z0-9\+\/=_-]+(,[a-zA-Z0-9\+\/=_-]+)*$/', $cid) && strlen($target) && $target !== $source)
 {
   $success = 0;
   $TARGET = $RCMAIL->get_address_book($target);
 
   if ($TARGET && $TARGET->ready && !$TARGET->readonly) {
-    $arr_cids = split(',', $cid);
+    $arr_cids = explode(',', $cid);
+    $ids = array();
+
     foreach ($arr_cids as $cid) {
-      $plugin = $RCMAIL->plugins->exec_hook('create_contact', array('record' => $CONTACTS->get_record($cid, true), 'source' => $target));
-    $a_record = $plugin['record'];
+      $a_record = $CONTACTS->get_record($cid, true);
+
+      // check if contact exists, if so, we'll need it's ID
+      $result = $TARGET->search('email', $a_record['email'], true, true);
 
-    if (!$plugin['abort'])
-        if ($TARGET->insert($a_record, true))
+      // insert contact record
+      if (!$result->count) {
+        $plugin = $RCMAIL->plugins->exec_hook('contact_create', array(
+          'record' => $a_record, 'source' => $target, 'group' => $target_group));
+
+        if (!$plugin['abort']) {
+          if ($insert_id = $TARGET->insert($a_record, false)) {
+            $ids[] = $insert_id;
+            $success++;
+          }
+        }
+        else if ($plugin['result']) {
+          $ids = array_merge($ids, $plugin['result']);
           $success++;
+        }
+      }
+      else {
+        $record = $result->first();
+        $ids[] = $record['ID'];
+      }
+    }
+
+    // assign to group
+    if ($target_group && $TARGET->groups && !empty($ids)) {
+      $plugin = $RCMAIL->plugins->exec_hook('group_addmembers', array(
+        'group_id' => $target_group, 'ids' => $ids, 'source' => $target));
+
+      if (!$plugin['abort']) {
+        $TARGET->reset();
+        $TARGET->set_group($target_group);
+
+        if (($maxnum = $RCMAIL->config->get('max_group_members', 0)) && ($TARGET->count()->count + count($plugin['ids']) > $maxnum)) {
+          $OUTPUT->show_message('maxgroupmembersreached', 'warning', array('max' => $maxnum));
+          $OUTPUT->send();
+        }
+
+        if (($cnt = $TARGET->add_to_group($target_group, $plugin['ids'])) && $cnt > $success)
+          $success = $cnt;
+      }
+      else if ($plugin['result'])
+        $success = $plugin['result'];
     }
   }
 
@@ -47,12 +90,8 @@ if ($cid && preg_match('/^[a-z0-9\-_=]+(,[a-z0-9\-_=]+)*$/i', $cid) && strlen($t
     $OUTPUT->show_message('copyerror', 'error');
   else
     $OUTPUT->show_message('copysuccess', 'notice', array('nr' => $success));
-    
-  // close connection to second address directory
-  $TARGET->close();
 }
 
 // send response
 $OUTPUT->send();
 
-?>
index 9919a2d12c75c6c21464b824578f16aa36fbdf37..4c686da5ba470ec5296eada03fabe15da25f2fad 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/addressbook/delete.inc                                  |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: delete.inc 2758 2009-07-16 15:01:05Z thomasb $
+ $Id: delete.inc 4172 2010-11-03 14:19:48Z alec $
 
 */
 
 if ($OUTPUT->ajax_call &&
     ($cid = get_input_value('_cid', RCUBE_INPUT_POST)) &&
-    (preg_match('/^[0-9]+(,[0-9]+)*$/', $cid) ||
-     preg_match('/^[a-zA-Z0-9=]+(,[a-zA-Z0-9=]+)*$/', $cid))
-   )
-  {
-  $plugin = $RCMAIL->plugins->exec_hook('delete_contact', array('id' => $cid, 'source' => get_input_value('_source', RCUBE_INPUT_GPC)));
-  
-  $deleted = !$plugin['abort'] ? $CONTACTS->delete($cid) : false;
-  if (!$deleted)
-    {
-    // send error message
-    exit;
+    preg_match('/^[a-zA-Z0-9\+\/=_-]+(,[a-zA-Z0-9\+\/=_-]+)*$/', $cid)
+) {
+    $plugin = $RCMAIL->plugins->exec_hook('contact_delete', array(
+        'id' => $cid, 'source' => get_input_value('_source', RCUBE_INPUT_GPC)));
+
+    $deleted = !$plugin['abort'] ? $CONTACTS->delete($cid) : $plugin['result'];
+
+    if (!$deleted) {
+        $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'contactdelerror', 'error');
+        $OUTPUT->command('list_contacts');
     }
+    else {
+        $OUTPUT->show_message('contactdeleted', 'confirmation');
 
-  // count contacts for this user
-  $result = $CONTACTS->count();
+        // count contacts for this user
+        $result = $CONTACTS->count();
 
-  // update message count display
-  $OUTPUT->set_env('pagecount', ceil($result->count / $CONTACTS->page_size));
-  $OUTPUT->command('set_rowcount', rcmail_get_rowcount_text($result->count));
+        // update message count display
+        $OUTPUT->set_env('pagecount', ceil($result->count / $CONTACTS->page_size));
+        $OUTPUT->command('set_rowcount', rcmail_get_rowcount_text($result->count));
 
-  // add new rows from next page (if any)
-  $pages = ceil(($result->count + $deleted) / $CONTACTS->page_size);
-  if ($_GET['_from'] != 'show' && $pages > 1 && $CONTACTS->list_page < $pages)
-    rcmail_js_contacts_list($CONTACTS->list_records(null, -$deleted));
+        // add new rows from next page (if any)
+        $pages = ceil(($result->count + $deleted) / $CONTACTS->page_size);
+        if ($_GET['_from'] != 'show' && $pages > 1 && $CONTACTS->list_page < $pages)
+            rcmail_js_contacts_list($CONTACTS->list_records(null, -$deleted));
+    }
 
-  // send response
-  $OUTPUT->send();
-  }
+    // send response
+    $OUTPUT->send();
+}
 
 exit;
-?>
+
index 0657969db26d66bc5a11e6fffe45ebd7a192f4f1..6291d0a480bac643da2051b1450c2ca8485996e3 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/addressbook/edit.inc                                    |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: edit.inc 2755 2009-07-15 09:49:35Z thomasb $
+ $Id: edit.inc 4176 2010-11-04 09:59:55Z alec $
 
 */
 
 
 if (($cid = get_input_value('_cid', RCUBE_INPUT_GPC)) && ($record = $CONTACTS->get_record($cid, true)))
-  $OUTPUT->set_env('cid', $record['ID']);
+    $OUTPUT->set_env('cid', $record['ID']);
 
 // adding not allowed here
-if ($CONTACTS->readonly)
-{
-  $OUTPUT->show_message('sourceisreadonly');
-  rcmail_overwrite_action('show');
-  return;
+if ($CONTACTS->readonly) {
+    $OUTPUT->show_message('sourceisreadonly');
+    rcmail_overwrite_action('show');
+    return;
 }
 
+
 function rcmail_contact_editform($attrib)
 {
-  global $RCMAIL, $CONTACTS, $OUTPUT;
-
-  // check if we have a valid result
-  if ($RCMAIL->action != 'add' && !(($result = $CONTACTS->get_result()) && ($record = $result->first())))
-  {
-    $OUTPUT->show_message('contactnotfound');
-    return false;
-  }
-
-  // add some labels to client
-  $OUTPUT->add_label('noemailwarning', 'nonamewarning');
-
-  list($form_start, $form_end) = get_form_tags($attrib);
-  unset($attrib['form']);
-
-  // a specific part is requested
-  if ($attrib['part'])
-  {
-    $out = $form_start;
-    $out .= rcmail_get_edit_field($attrib['part'], $record[$attrib['part']], $attrib); 
-    return $out;
-  }
-
-
-  // return the complete address edit form as table
-  $out = "$form_start<table>\n\n";
-
-  $a_show_cols = array('name', 'firstname', 'surname', 'email');
-  foreach ($a_show_cols as $col)
-  {
-    $attrib['id'] = 'rcmfd_'.$col;
-    $value = rcmail_get_edit_field($col, $record[$col], $attrib);
-    $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
-                    $attrib['id'],
-                    Q(rcube_label($col)),
-                    $value);
-  }
-
-  $out .= "\n</table>$form_end";
-
-  return $out;  
+   global $RCMAIL, $CONTACTS, $OUTPUT;
+
+    // check if we have a valid result
+    if ($RCMAIL->action != 'add'
+        && !(($result = $CONTACTS->get_result()) && ($record = $result->first()))
+    ) {
+        $OUTPUT->show_message('contactnotfound');
+        return false;
+    }
+
+    // add some labels to client
+    $OUTPUT->add_label('noemailwarning', 'nonamewarning');
+
+    $i_size = !empty($attrib['size']) ? $attrib['size'] : 40;
+    $t_rows = !empty($attrib['textarearows']) ? $attrib['textarearows'] : 6;
+    $t_cols = !empty($attrib['textareacols']) ? $attrib['textareacols'] : 40;
+
+    $form = array(
+        'info' => array(
+            'name'    => rcube_label('contactproperties'),
+            'content' => array(
+                'name' => array('type' => 'text', 'size' => $i_size),
+                'firstname' => array('type' => 'text', 'size' => $i_size),
+                'surname' => array('type' => 'text', 'size' => $i_size),
+                'email' => array('type' => 'text', 'size' => $i_size),
+            ),
+        ),
+    );
+
+
+    list($form_start, $form_end) = get_form_tags($attrib);
+    unset($attrib['form']);
+
+    // return the complete address edit form as table
+    $out = rcmail_contact_form($form, $record);
+
+    return $form_start . $out . $form_end;
 }
 
-$OUTPUT->add_handler('contacteditform', 'rcmail_contact_editform');
-
 
 // similar function as in /steps/settings/edit_identity.inc
 function get_form_tags($attrib)
 {
-  global $CONTACTS, $EDIT_FORM, $RCMAIL;
-
-  $form_start = $form_end = '';
-  
-  if (empty($EDIT_FORM)) {
-    $hiddenfields = new html_hiddenfield(array('name' => '_source', 'value' => get_input_value('_source', RCUBE_INPUT_GPC)));
-    
-    if (($result = $CONTACTS->get_result()) && ($record = $result->first()))
-      $hiddenfields->add(array('name' => '_cid', 'value' => $record['ID']));
-    
-    $form_start = $RCMAIL->output->request_form(array('name' => "form", 'method' => "post", 'task' => $RCMAIL->task, 'action' => 'save', 'request' => 'save.'.intval($record['ID']), 'noclose' => true) + $attrib, $hiddenfields->show());
-    $form_end = !strlen($attrib['form']) ? '</form>' : '';
-
-    $EDIT_FORM = !empty($attrib['form']) ? $attrib['form'] : 'form';
-    $RCMAIL->output->add_gui_object('editform', $EDIT_FORM);
-  }
-
-  return array($form_start, $form_end); 
+    global $CONTACTS, $EDIT_FORM, $RCMAIL;
+
+    $form_start = $form_end = '';
+
+    if (empty($EDIT_FORM)) {
+        $hiddenfields = new html_hiddenfield(array(
+            'name' => '_source', 'value' => get_input_value('_source', RCUBE_INPUT_GPC)));
+        $hiddenfields->add(array('name' => '_gid', 'value' => $CONTACTS->group_id));
+
+        if (($result = $CONTACTS->get_result()) && ($record = $result->first()))
+            $hiddenfields->add(array('name' => '_cid', 'value' => $record['ID']));
+
+        $form_start = $RCMAIL->output->request_form(array(
+            'name' => "form", 'method' => "post",
+            'task' => $RCMAIL->task, 'action' => 'save',
+            'request' => 'save.'.intval($record['ID']),
+            'noclose' => true) + $attrib, $hiddenfields->show());
+        $form_end = !strlen($attrib['form']) ? '</form>' : '';
+
+        $EDIT_FORM = !empty($attrib['form']) ? $attrib['form'] : 'form';
+        $RCMAIL->output->add_gui_object('editform', $EDIT_FORM);
+    }
+
+    return array($form_start, $form_end); 
 }
 
 
+$OUTPUT->add_handler('contacteditform', 'rcmail_contact_editform');
 
-if (!$CONTACTS->get_result() && $OUTPUT->template_exists('addcontact'))
-  $OUTPUT->send('addcontact');
+if (!$CONTACTS->get_result() && $OUTPUT->template_exists('contactadd'))
+    $OUTPUT->send('contactadd');
 
 // this will be executed if no template for addcontact exists
-$OUTPUT->send('editcontact');
-?>
+$OUTPUT->send('contactedit');
index 101006f87f32cb97a45f391e3a25bcbfb0f4a9a8..98f8b927352c067ef38ef0b13a99cda59ee8616a 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/addressbook/export.inc                                  |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2008-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2008-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -21,8 +21,8 @@
 
 // get contacts for this user
 $CONTACTS->set_page(1);
-$CONTACTS->set_pagesize(999);
-$result = $CONTACTS->list_records();
+$CONTACTS->set_pagesize(99999);
+$result = $CONTACTS->list_records(null, 0, true);
 
 // send downlaod headers
 send_nocacheing_headers();
@@ -41,4 +41,3 @@ while ($result && ($row = $result->next())) {
 
 exit;
 
-?>
index e14d8a8f7776e2a89218e3f633af9913bf633590..315a4f11c904f3e302d0b3d9840058cdc62a05ac 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/addressbook/func.inc                                    |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: func.inc 2894 2009-08-29 20:56:00Z alec $
+ $Id: func.inc 4151 2010-10-28 07:10:11Z alec $
 
 */
 
 // add list of address sources to client env
-$js_list = array();
-if (strtolower($CONFIG['address_book_type']) != 'ldap') {
-  // We are using the DB address book, add it.
-  $js_list['0'] = array('id' => 0, 'name' => rcube_label('personaladrbook'), 'readonly' => false);
-}
-if (is_array($CONFIG['ldap_public'])) {
-  foreach ($CONFIG['ldap_public'] as $id => $prop)
-    $js_list[$id] = array('id' => $id, 'name' => $prop['name'], 'readonly' => !$prop['writable']);
-}
-
-$plugin = $RCMAIL->plugins->exec_hook('address_sources', array('sources' => $js_list));
-$js_list = $plugin['sources'];
+$js_list = $RCMAIL->get_address_sources();
 
 // select source
 $source = get_input_value('_source', RCUBE_INPUT_GPC);
 
 // if source is not set use first directory
 if (empty($source))
-  $source = $js_list[key($js_list)]['id'];
-
+    $source = $js_list[key($js_list)]['id'];
 
 // instantiate a contacts object according to the given source
 $CONTACTS = $RCMAIL->get_address_book($source);
@@ -48,174 +36,260 @@ $CONTACTS->set_pagesize($CONFIG['pagesize']);
 
 // set list properties and session vars
 if (!empty($_GET['_page']))
-  $CONTACTS->set_page(($_SESSION['page'] = intval($_GET['_page'])));
+    $CONTACTS->set_page(($_SESSION['page'] = intval($_GET['_page'])));
 else
-  $CONTACTS->set_page(isset($_SESSION['page']) ?$_SESSION['page'] : 1);
+    $CONTACTS->set_page(isset($_SESSION['page']) ?$_SESSION['page'] : 1);
+  
+if (!empty($_REQUEST['_gid']))
+    $CONTACTS->set_group(get_input_value('_gid', RCUBE_INPUT_GPC));
 
 // set message set for search result
 if (!empty($_REQUEST['_search']) && isset($_SESSION['search'][$_REQUEST['_search']]))
-  $CONTACTS->set_search_set($_SESSION['search'][$_REQUEST['_search']]);
+    $CONTACTS->set_search_set($_SESSION['search'][$_REQUEST['_search']]);
 
 // set data source env
 $OUTPUT->set_env('source', $source ? $source : '0');
 $OUTPUT->set_env('readonly', $CONTACTS->readonly, false);
-$OUTPUT->set_env('address_sources', $js_list);
+if (!$OUTPUT->ajax_call) {
+    $OUTPUT->set_env('address_sources', $js_list);
+    $OUTPUT->set_pagetitle(rcube_label('addressbook'));
+}
 
 
 function rcmail_directory_list($attrib)
 {
-  global $RCMAIL, $OUTPUT;
-  
-  if (!$attrib['id'])
-    $attrib['id'] = 'rcmdirectorylist';
-
-  $out = '';
-  $local_id = '0';
-  $current = get_input_value('_source', RCUBE_INPUT_GPC);
-  $line_templ = html::tag('li', array('id' => 'rcmli%s', 'class' => '%s'),
-    html::a(array('href' => '%s', 'onclick' => "return ".JS_OBJECT_NAME.".command('list','%s',this)"), '%s'));
-
-  if (!$current && strtolower($RCMAIL->config->get('address_book_type', 'sql')) != 'ldap') {
-    $current = '0';
-  }
-  else if (!$current) {
-    // DB address book not used, see if a source is set, if not use the
-    // first LDAP directory.
-    $current = key((array)$RCMAIL->config->get('ldap_public', array()));
-  }
-
-  foreach ((array)$OUTPUT->env['address_sources'] as $j => $source) {
-    $id = $source['id'] ? $source['id'] : $j;
-    $js_id = JQ($id);
-    $dom_id = preg_replace('/[^a-z0-9\-_]/i', '', $id);
-    $out .= sprintf($line_templ, $dom_id, ($current == $id ? 'selected' : ''),
-      Q(rcmail_url(null, array('_source' => $id))), $js_id, (!empty($source['name']) ? Q($source['name']) : Q($id)));
-  }
-
-  $OUTPUT->add_gui_object('folderlist', $attrib['id']);
-  
-  return html::tag('ul', $attrib, $out, html::$common_attrib);
+    global $RCMAIL, $OUTPUT;
+
+    if (!$attrib['id'])
+        $attrib['id'] = 'rcmdirectorylist';
+
+    $out = '';
+    $local_id = '0';
+    $jsdata = array();
+    $current = get_input_value('_source', RCUBE_INPUT_GPC);
+    $line_templ = html::tag('li', array(
+        'id' => 'rcmli%s', 'class' => 'addressbook %s'),
+        html::a(array('href' => '%s',
+            'onclick' => "return ".JS_OBJECT_NAME.".command('list','%s',this)"), '%s'));
+
+    if (!$current && strtolower($RCMAIL->config->get('address_book_type', 'sql')) != 'ldap') {
+        $current = '0';
+    }
+    else if (!$current) {
+        // DB address book not used, see if a source is set, if not use the
+        // first LDAP directory.
+        $current = key((array)$RCMAIL->config->get('ldap_public', array()));
+    }
+
+    foreach ((array)$OUTPUT->env['address_sources'] as $j => $source) {
+        $id = $source['id'] ? $source['id'] : $j;
+        $js_id = JQ($id);
+        $dom_id = preg_replace('/[^a-z0-9\-_]/i', '', $id);
+        $out .= sprintf($line_templ, $dom_id, ($current == $id ? 'selected' : ''),
+            Q(rcmail_url(null, array('_source' => $id))),
+            $js_id, (!empty($source['name']) ? Q($source['name']) : Q($id)));
+        $groupdata = rcmail_contact_groups(array('out' => $out, 'jsdata' => $jsdata, 'source' => $id));
+        $jsdata = $groupdata['jsdata'];
+        $out = $groupdata['out'];
+    }
+
+    $OUTPUT->set_env('contactgroups', $jsdata); 
+    $OUTPUT->add_gui_object('folderlist', $attrib['id']);
+
+    return html::tag('ul', $attrib, $out, html::$common_attrib);
+}
+
+
+function rcmail_contact_groups($args)
+{
+    global $RCMAIL;
+
+    $groups = $RCMAIL->get_address_book($args['source'])->list_groups();
+
+    if (!empty($groups)) {
+        $line_templ = html::tag('li', array(
+            'id' => 'rcmliG%s%s', 'class' => 'contactgroup'),
+            html::a(array('href' => '#',
+                'onclick' => "return ".JS_OBJECT_NAME.".command('listgroup',{'source':'%s','id':'%s'},this)"), '%s'));
+
+        $jsdata = array();
+        foreach ($groups as $group) {
+            $args['out'] .= sprintf($line_templ, $args['source'], $group['ID'], $args['source'], $group['ID'], Q($group['name']));
+            $args['jsdata']['G'.$args['source'].$group['ID']] = array(
+                'source' => $args['source'], 'id' => $group['ID'],
+                'name' => $group['name'], 'type' => 'group');
+        }
+    }
+
+    return $args;
 }
 
 
 // return the message list as HTML table
 function rcmail_contacts_list($attrib)
-  {
-  global $CONTACTS, $OUTPUT;
-  
-  // count contacts for this user
-  $result = $CONTACTS->list_records();
-  
-  // add id to message list table if not specified
-  if (!strlen($attrib['id']))
-    $attrib['id'] = 'rcmAddressList';
-  
-  // define list of cols to be displayed
-  $a_show_cols = array('name');
+{
+    global $CONTACTS, $OUTPUT;
 
-  // create XHTML table
-  $out = rcube_table_output($attrib, $result->records, $a_show_cols, $CONTACTS->primary_key);
-  
-  // set client env
-  $OUTPUT->add_gui_object('contactslist', $attrib['id']);
-  $OUTPUT->set_env('current_page', (int)$CONTACTS->list_page);
-  $OUTPUT->set_env('pagecount', ceil($result->count/$CONTACTS->page_size));
-  $OUTPUT->include_script('list.js');
-  
-  // add some labels to client
-  $OUTPUT->add_label('deletecontactconfirm');
-  
-  return $out;
-  }
+    // count contacts for this user
+    $result = $CONTACTS->list_records();
+
+    // add id to message list table if not specified
+    if (!strlen($attrib['id']))
+        $attrib['id'] = 'rcmAddressList';
+
+    // define list of cols to be displayed
+    $a_show_cols = array('name');
+
+    // create XHTML table
+    $out = rcube_table_output($attrib, $result->records, $a_show_cols, $CONTACTS->primary_key);
+
+    // set client env
+    $OUTPUT->add_gui_object('contactslist', $attrib['id']);
+    $OUTPUT->set_env('current_page', (int)$CONTACTS->list_page);
+    $OUTPUT->set_env('pagecount', ceil($result->count/$CONTACTS->page_size));
+    $OUTPUT->include_script('list.js');
+
+    // add some labels to client
+    $OUTPUT->add_label('deletecontactconfirm');
+
+    return $out;
+}
 
 
 function rcmail_js_contacts_list($result, $prefix='')
-  {
-  global $OUTPUT;
+{
+    global $OUTPUT;
 
-  if (empty($result) || $result->count == 0)
-    return;
+    if (empty($result) || $result->count == 0)
+        return;
 
-  // define list of cols to be displayed
-  $a_show_cols = array('name');
+    // define list of cols to be displayed
+    $a_show_cols = array('name');
   
-  while ($row = $result->next())
-    {
-    $a_row_cols = array();
+    while ($row = $result->next()) {
+        $a_row_cols = array();
     
-    // format each col
-    foreach ($a_show_cols as $col)
-      $a_row_cols[$col] = Q($row[$col]);
-    
-    $OUTPUT->command($prefix.'add_contact_row', $row['ID'], $a_row_cols);
+        // format each col
+        foreach ($a_show_cols as $col)
+            $a_row_cols[$col] = Q($row[$col]);
+
+        $OUTPUT->command($prefix.'add_contact_row', $row['ID'], $a_row_cols);
     }
-  }
+}
 
 
 // similar function as /steps/settings/identities.inc::rcmail_identity_frame()
 function rcmail_contact_frame($attrib)
-  {
-  global $OUTPUT;
+{
+    global $OUTPUT;
 
-  if (!$attrib['id'])
-    $attrib['id'] = 'rcmcontactframe';
+    if (!$attrib['id'])
+        $attrib['id'] = 'rcmcontactframe';
     
-  $attrib['name'] = $attrib['id'];
+    $attrib['name'] = $attrib['id'];
 
-  $OUTPUT->set_env('contentframe', $attrib['name']);
-  $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/blank.gif');
+    $OUTPUT->set_env('contentframe', $attrib['name']);
+    $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/blank.gif');
 
-  return html::iframe($attrib);
-  }
+    return html::iframe($attrib);
+}
 
 
 function rcmail_rowcount_display($attrib)
-  {
-  global $OUTPUT;
-  
-  if (!$attrib['id'])
-    $attrib['id'] = 'rcmcountdisplay';
+{
+    global $OUTPUT;
 
-  $OUTPUT->add_gui_object('countdisplay', $attrib['id']);
+    if (!$attrib['id'])
+        $attrib['id'] = 'rcmcountdisplay';
 
-  return html::span($attrib, rcmail_get_rowcount_text());
-  }
+    $OUTPUT->add_gui_object('countdisplay', $attrib['id']);
 
+    return html::span($attrib, rcmail_get_rowcount_text());
+}
 
 
 function rcmail_get_rowcount_text()
-  {
-  global $CONTACTS;
-  
-  // read nr of contacts
-  $result = $CONTACTS->get_result();
-  if (!$result)
-    $result = $CONTACTS->count();
+{
+    global $CONTACTS;
   
-  if ($result->count == 0)
-    $out = rcube_label('nocontactsfound');
-  else
-    $out = rcube_label(array(
-      'name' => 'contactsfromto',
-      'vars' => array(
-        'from'  => $result->first + 1,
-        'to'    => min($result->count, $result->first + $CONTACTS->page_size),
-        'count' => $result->count)
-      ));
-
-  return $out;
-  }
-
-
-$OUTPUT->set_pagetitle(rcube_label('addressbook'));
+    // read nr of contacts
+    $result = $CONTACTS->get_result();
+    if (!$result) {
+        $result = $CONTACTS->count();
+    }
+
+    if ($result->count == 0)
+        $out = rcube_label('nocontactsfound');
+    else
+        $out = rcube_label(array(
+            'name'  => 'contactsfromto',
+            'vars'  => array(
+            'from'  => $result->first + 1,
+            'to'    => min($result->count, $result->first + $CONTACTS->page_size),
+            'count' => $result->count)
+        ));
+
+    return $out;
+}
+
+
+function rcmail_contact_form($form, $record)
+{
+    global $RCMAIL;
+
+    // Allow plugins to modify contact form content
+    $plugin = $RCMAIL->plugins->exec_hook('contact_form', array(
+        'form' => $form, 'record' => $record));
+
+    $form = $plugin['form'];
+    $record = $plugin['record'];
+    $out = '';
+
+    foreach ($form as $fieldset) {
+        if (empty($fieldset['content']))
+            continue;
+
+        $content = '';
+        if (is_array($fieldset['content'])) {
+            $table = new html_table(array('cols' => 2));
+
+            foreach ($fieldset['content'] as $col => $colprop) {
+                $colprop['id'] = 'rcmfd_'.$col;
+
+                $label = !empty($colprop['label']) ? $colprop['label'] : rcube_label($col);
+
+                if (!empty($colprop['value'])) {
+                    $value = $colprop['value'];
+                }
+                else if ($RCMAIL->action == 'show') {
+                    $value = $record[$col];
+                }
+                else {
+                    $value = rcmail_get_edit_field($col, $record[$col], $colprop, $colprop['type']);
+                }
+
+                $table->add('title', sprintf('<label for="%s">%s</label>', $colprop['id'], Q($label)));
+                $table->add(null, $value);
+            }
+            $content = $table->show();
+        }
+        else {
+            $content = $fieldset['content'];
+        }
+
+        $out .= html::tag('fieldset', null, html::tag('legend', null, Q($fieldset['name'])) . $content) ."\n";
+    }
   
+    return $out;
+}
+
+
 // register UI objects
 $OUTPUT->add_handlers(array(
-  'directorylist' => 'rcmail_directory_list',
-  'addresslist' => 'rcmail_contacts_list',
-  'addressframe' => 'rcmail_contact_frame',
-  'recordscountdisplay' => 'rcmail_rowcount_display',
-  'searchform' => array($OUTPUT, 'search_form')
+    'directorylist' => 'rcmail_directory_list',
+//  'groupslist' => 'rcmail_contact_groups',
+    'addresslist' => 'rcmail_contacts_list',
+    'addressframe' => 'rcmail_contact_frame',
+    'recordscountdisplay' => 'rcmail_rowcount_display',
+    'searchform' => array($OUTPUT, 'search_form')
 ));
-
-?>
diff --git a/program/steps/addressbook/groups.inc b/program/steps/addressbook/groups.inc
new file mode 100644 (file)
index 0000000..f54c59c
--- /dev/null
@@ -0,0 +1,129 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/addressbook/groups.inc                                  |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2010, Roundcube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Create/delete/rename contact groups and assign/remove contacts      |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: groups.inc 4252 2010-11-23 08:18:39Z alec $
+
+*/
+
+if ($CONTACTS->readonly || !$CONTACTS->groups) {
+  $OUTPUT->show_message('sourceisreadonly', 'warning');
+  $OUTPUT->send();
+}
+
+$source = get_input_value('_source', RCUBE_INPUT_GPC);
+
+if ($RCMAIL->action == 'group-addmembers') {
+  if (($gid = get_input_value('_gid', RCUBE_INPUT_POST)) && ($ids = get_input_value('_cid', RCUBE_INPUT_POST))) {
+    $plugin = $RCMAIL->plugins->exec_hook('group_addmembers', array('group_id' => $gid, 'ids' => $ids, 'source' => $source));
+
+    $CONTACTS->set_group($gid);
+    $num2add = count(explode(',', $plugin['ids']));
+
+    if (!$plugin['abort']) {
+      if (($maxnum = $RCMAIL->config->get('max_group_members', 0)) && ($CONTACTS->count()->count + $num2add > $maxnum)) {
+        $OUTPUT->show_message('maxgroupmembersreached', 'warning', array('max' => $maxnum));
+        $OUTPUT->send();
+      }
+      $result = $CONTACTS->add_to_group($gid, $plugin['ids']);
+    }
+    else {
+      $result = $plugin['result'];
+    }
+
+    if ($result)
+      $OUTPUT->show_message('contactaddedtogroup');
+    else
+      $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error');
+  }
+}
+
+else if ($RCMAIL->action == 'group-delmembers') {
+  if (($gid = get_input_value('_gid', RCUBE_INPUT_POST)) && ($ids = get_input_value('_cid', RCUBE_INPUT_POST))) {
+    $plugin = $RCMAIL->plugins->exec_hook('group_delmembers', array('group_id' => $gid, 'ids' => $ids, 'source' => $source));
+
+    if (!$plugin['abort'])
+      $result = $CONTACTS->remove_from_group($gid, $plugin['ids']);
+    else
+      $result = $plugin['result'];
+
+    if ($result)
+      $OUTPUT->show_message('contactremovedfromgroup');
+    else
+      $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error');
+  }
+}
+
+else if ($RCMAIL->action == 'group-create') {
+  if ($name = trim(get_input_value('_name', RCUBE_INPUT_POST))) {
+    $plugin = $RCMAIL->plugins->exec_hook('group_create', array('name' => $name, 'source' => $source));
+
+    if (!$plugin['abort'])
+      $created = $CONTACTS->create_group($plugin['name']);
+    else
+      $created = $plugin['result'];
+  }
+
+  if ($created && $OUTPUT->ajax_call) {
+    $OUTPUT->show_message('groupcreated', 'confirmation');
+    $OUTPUT->command('insert_contact_group', array(
+      'source' => $source, 'id' => $created['id'], 'name' => $created['name']));
+  }
+  else if (!$created) {
+    $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error');
+  }
+}
+
+else if ($RCMAIL->action == 'group-rename') {
+  if (($gid = get_input_value('_gid', RCUBE_INPUT_POST)) && ($name = trim(get_input_value('_name', RCUBE_INPUT_POST)))) {
+    $plugin = $RCMAIL->plugins->exec_hook('group_rename', array('group_id' => $gid, 'name' => $name, 'source' => $source));
+
+    if (!$plugin['abort'])
+      $newname = $CONTACTS->rename_group($gid, $plugin['name']);
+    else
+      $newname = $plugin['result'];
+  }
+
+  if ($newname && $OUTPUT->ajax_call) {
+    $OUTPUT->show_message('grouprenamed', 'confirmation');
+    $OUTPUT->command('update_contact_group', array(
+      'source' => $source, 'id' => $gid, 'name' => $newname));
+  }
+  else if (!$newname)
+    $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error');
+}
+
+else if ($RCMAIL->action == 'group-delete') {
+  if ($gid = get_input_value('_gid', RCUBE_INPUT_POST)) {
+    $plugin = $RCMAIL->plugins->exec_hook('group_delete', array('group_id' => $gid, 'source' => $source));
+
+    if (!$plugin['abort'])
+      $deleted = $CONTACTS->delete_group($gid);
+    else
+      $deleted = $plugin['result'];
+  }
+
+  if ($deleted) {
+    $OUTPUT->show_message('groupdeleted', 'confirmation');
+    $OUTPUT->command('remove_group_item', array('source' => $source, 'id' => $gid));
+  }
+  else
+    $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error');
+}
+
+// send response
+$OUTPUT->send();
+
index 1d5b00e1a0e68a1ff9866448f5b7ea5267523dea..ceb683227b4e676de28ad1c10e8203234000ee31 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/addressbook/import.inc                                  |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2008-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2008-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
 function rcmail_import_form($attrib)
 {
   global $RCMAIL, $OUTPUT;
+  $target = get_input_value('_target', RCUBE_INPUT_GPC);
   
   $attrib += array('id' => "rcmImportForm");
   
+  $abook = new html_hiddenfield(array('name' => '_target', 'value' => $target));
+  $form = $abook->show();
+
   $upload = new html_inputfield(array('type' => 'file', 'name' => '_file', 'id' => 'rcmimportfile', 'size' => 40));
-  $form = html::p(null, html::label('rcmimportfile', rcube_label('importfromfile')) . html::br() . $upload->show());
+  $form .= html::p(null, html::label('rcmimportfile', rcube_label('importfromfile')) . html::br() . $upload->show());
   
   $check_replace = new html_checkbox(array('name' => '_replace', 'value' => 1, 'id' => 'rcmimportreplace'));
   $form .= html::p(null, $check_replace->show(get_input_value('_replace', RCUBE_INPUT_GPC)) .
@@ -74,13 +78,14 @@ function rcmail_import_confirm($attrib)
 function rcmail_import_buttons($attrib)
 {
   global $IMPORT_STATS, $OUTPUT;
+  $target = get_input_value('_target', RCUBE_INPUT_GPC);
   
   $attrib += array('type' => 'input');
   unset($attrib['name']);
   
   if (is_object($IMPORT_STATS)) {
     $attrib['class'] = trim($attrib['class'] . ' mainaction');
-    $out = $OUTPUT->button(array('command' => 'list', 'label' => 'done') + $attrib);
+    $out = $OUTPUT->button(array('command' => 'list', 'prop' => $target, 'label' => 'done') + $attrib);
   }
   else {
     $out = $OUTPUT->button(array('command' => 'list', 'label' => 'cancel') + $attrib);
@@ -98,9 +103,9 @@ function rcmail_import_buttons($attrib)
 $importstep = 'rcmail_import_form';
 
 if ($_FILES['_file']['tmp_name'] && is_uploaded_file($_FILES['_file']['tmp_name'])) {
-
   $replace = (bool)get_input_value('_replace', RCUBE_INPUT_GPC);
-  $CONTACTS = $RCMAIL->get_address_book(null, true);
+  $target = get_input_value('_target', RCUBE_INPUT_GPC);
+  $CONTACTS = $RCMAIL->get_address_book($target, true);
 
   // let rcube_vcard do the hard work :-)
   $vcards = rcube_vcard::import(file_get_contents($_FILES['_file']['tmp_name']));
@@ -129,6 +134,9 @@ if ($_FILES['_file']['tmp_name'] && is_uploaded_file($_FILES['_file']['tmp_name'
         $IMPORT_STATS->nomail++;
         continue;
       }
+
+      // We're using UTF8 internally
+      $email = idn_to_utf8($email);
       
       if (!$replace) {
         // compare e-mail address
@@ -150,11 +158,16 @@ if ($_FILES['_file']['tmp_name'] && is_uploaded_file($_FILES['_file']['tmp_name'
         'vcard' => $vcard->export(),
       );
       
-      $plugin = $RCMAIL->plugins->exec_hook('create_contact', array('record' => $a_record, 'source' => null));
+      $plugin = $RCMAIL->plugins->exec_hook('contact_create', array('record' => $a_record, 'source' => null));
       $a_record = $plugin['record'];
 
       // insert record and send response
-      if (!$plugin['abort'] && ($success = $CONTACTS->insert($a_record))) {
+      if (!$plugin['abort'])
+        $success = $CONTACTS->insert($a_record);
+      else
+        $success = $plugin['result'];
+
+      if ($success) {
         $IMPORT_STATS->inserted++;
         $IMPORT_STATS->names[] = $vcard->displayname;
       } else {
@@ -183,5 +196,3 @@ $OUTPUT->add_handlers(array(
 
 // render page
 $OUTPUT->send('importcontacts');
-
-?>
\ No newline at end of file
index 41cc6eddce4754e69b989e10dfe8d3023a697e37..c5833428b21d53713aba27e75c3aaa221affcee9 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/addressbook/list.inc                                    |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: list.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: list.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
@@ -32,4 +32,3 @@ rcmail_js_contacts_list($result);
 // send response
 $OUTPUT->send();
 
-?>
\ No newline at end of file
index 6813958f25c8ea1bd30f378f0f4dbd1e1e92105f..a1b1f3165e95f55e4cf288d9a8e475927084028c 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/addressbook/mailto.inc                                  |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2007, RoundCube Dev. - Switzerland                      |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2007, Roundcube Dev. - Switzerland                      |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -23,7 +23,7 @@ $cid = get_input_value('_cid', RCUBE_INPUT_GET);
 $recipients = null;
 $mailto = array();
 
-if ($cid && preg_match('/^[a-z0-9\-\+\/_=]+(,[a-z0-9\-\+\/_=]+)*$/i', $cid) && $CONTACTS->ready)
+if ($cid && preg_match('/^[a-z0-9\+\/=_-]+(,[a-z0-9\+\/=_-]+)*$/i', $cid) && $CONTACTS->ready)
 {
   $CONTACTS->set_page(1);
   $CONTACTS->set_pagesize(100);
@@ -47,4 +47,3 @@ else
 // send response
 $OUTPUT->send();
 
-?>
\ No newline at end of file
index 4b9a018d234570eeb08504f4f871790d6b75958c..e0f9a3f613553b1e67f1098f0f6ea0e3ac7856ac 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/addressbook/save.inc                                    |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: save.inc 2889 2009-08-29 18:41:17Z alec $
+ $Id: save.inc 4166 2010-11-02 09:27:03Z alec $
 
 */
 
 $cid = get_input_value('_cid', RCUBE_INPUT_POST);
-$return_action = empty($cid) ? 'add' : 'show';
+$return_action = empty($cid) ? 'add' : 'edit';
 
 // cannot edit record
-if ($CONTACTS->readonly)
-{
+if ($CONTACTS->readonly) {
   $OUTPUT->show_message('contactreadonly', 'error');
   rcmail_overwrite_action($return_action);
   return;
 }
 
-// check input
-if ((!get_input_value('_name', RCUBE_INPUT_POST) || !get_input_value('_email', RCUBE_INPUT_POST)))
-{
+// Basic input checks
+if ((!get_input_value('_name', RCUBE_INPUT_POST) || !get_input_value('_email', RCUBE_INPUT_POST))) {
   $OUTPUT->show_message('formincomplete', 'warning');
   rcmail_overwrite_action($return_action);
   return;
@@ -44,28 +42,40 @@ $a_save_cols = array('name', 'firstname', 'surname', 'email');
 $a_record = array();
 
 // read POST values into hash array
-foreach ($a_save_cols as $col)
-{
+foreach ($a_save_cols as $col) {
   $fname = '_'.$col;
   if (isset($_POST[$fname]))
     $a_record[$col] = get_input_value($fname, RCUBE_INPUT_POST);
 }
 
+// Validity checks
+$_email = idn_to_ascii($a_record['email']);
+if (!check_email($_email, false)) {
+  $OUTPUT->show_message('emailformaterror', 'warning', array('email' => $_email));
+  rcmail_overwrite_action($return_action);
+  return;
+}
+
 // update an existing contact
 if (!empty($cid))
 {
-  $plugin = $RCMAIL->plugins->exec_hook('save_contact', array('id' => $cid, 'record' => $a_record, 'source' => get_input_value('_source', RCUBE_INPUT_GPC)));
+  $plugin = $RCMAIL->plugins->exec_hook('contact_update',
+    array('id' => $cid, 'record' => $a_record, 'source' => get_input_value('_source', RCUBE_INPUT_GPC)));
   $a_record = $plugin['record'];
-  
-  if (!$plugin['abort'] && ($result = $CONTACTS->update($cid, $a_record)))
-  {
+
+  if (!$plugin['abort'])
+    $result = $CONTACTS->update($cid, $a_record);
+  else
+    $result = $plugin['result'];
+
+  if ($result) {
     // LDAP DN change
     if (is_string($result) && strlen($result)>1) {
       $newcid = $result;
       // change cid in POST for 'show' action
       $_POST['_cid'] = $newcid;
     }
-    
+
     // define list of cols to be displayed
     $a_js_cols = array();
     $record = $CONTACTS->get_record($newcid ? $newcid : $cid, true);
@@ -75,39 +85,42 @@ if (!empty($cid))
 
     // update the changed col in list
     $OUTPUT->command('parent.update_contact_row', $cid, $a_js_cols, $newcid);
-      
+
     // show confirmation
     $OUTPUT->show_message('successfullysaved', 'confirmation', null, false);
     rcmail_overwrite_action('show');
   }
-  else
-  {
+  else {
     // show error message
-    $OUTPUT->show_message('errorsaving', 'error', null, false);
+    $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error', null, false);
     rcmail_overwrite_action('show');
   }
 }
 
 // insert a new contact
-else
-{
+else {
   // check for existing contacts
   $existing = $CONTACTS->search('email', $a_record['email'], true, false);
-  
+
   // show warning message
-  if ($existing->count)
-  {
+  if ($existing->count) {
     $OUTPUT->show_message('contactexists', 'warning', null, false);
     rcmail_overwrite_action('add');
     return;
   }
 
-  $plugin = $RCMAIL->plugins->exec_hook('create_contact', array('record' => $a_record, 'source' => get_input_value('_source', RCUBE_INPUT_GPC)));
+  $plugin = $RCMAIL->plugins->exec_hook('contact_create', array(
+    'record' => $a_record, 'source' => get_input_value('_source', RCUBE_INPUT_GPC)));
   $a_record = $plugin['record'];
 
   // insert record and send response
-  if (!$plugin['abort'] && ($insert_id = $CONTACTS->insert($a_record)))
-  {
+  if (!$plugin['abort'])
+    $insert_id = $CONTACTS->insert($a_record);
+  else
+    $insert_id = $plugin['result'];
+
+
+  if ($insert_id) {
     // add contact row or jump to the page where it should appear
     $CONTACTS->reset();
     $result = $CONTACTS->search($CONTACTS->primary_key, $insert_id);
@@ -121,15 +134,11 @@ else
 
     // show confirmation
     $OUTPUT->show_message('successfullysaved', 'confirmation', null, false);
-    rcmail_overwrite_action('show');
-    $_GET['_cid'] = $insert_id;
+    $OUTPUT->send('iframe');
   }
-  else
-  {
+  else {
     // show error message
-    $OUTPUT->show_message('errorsaving', 'error', null, false);
+    $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error', null, false);
     rcmail_overwrite_action('add');
   }
 }
-
-?>
index 790db060dfb15b508336a7bde6a3de11bfbe42a9..7c52ef608ee0b3fc1aaddf16d2b42e0055404efa 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/addressbook/search.inc                                  |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -38,8 +38,8 @@ if ($result->count > 0)
 }
 else
 {
-  $OUTPUT->show_message('nocontactsfound', 'warning');
-  $search_request = -1;
+  $OUTPUT->show_message('nocontactsfound', 'notice');
+  $search_request = null;
 }
 
 // update message count display
@@ -49,5 +49,3 @@ $OUTPUT->command('set_rowcount', rcmail_get_rowcount_text());
   
 // send response
 $OUTPUT->send();
-
-?>
\ No newline at end of file
index 2f968fe9a1fdc7b64a0e3d000c574a086b5e83ab..268489289bd8632800a7f0ffd1ab8adefb0b3554 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/addressbook/show.inc                                    |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: show.inc 2237 2009-01-17 01:55:39Z till $
+ $Id: show.inc 4176 2010-11-04 09:59:55Z alec $
 
 */
 
 
 // read contact record
 if (($cid = get_input_value('_cid', RCUBE_INPUT_GPC)) && ($record = $CONTACTS->get_record($cid, true))) {
-  $OUTPUT->set_env('cid', $record['ID']);
+    $OUTPUT->set_env('cid', $record['ID']);
 }
 
+
 function rcmail_contact_details($attrib)
 {
-  global $CONTACTS, $OUTPUT;
+    global $CONTACTS, $RCMAIL;
 
-  // check if we have a valid result
-  if (!(($result = $CONTACTS->get_result()) && ($record = $result->first()))) {
-    $OUTPUT->show_message('contactnotfound');
-    return false;
-  }
-  
-  // a specific part is requested
-  if ($attrib['part']) {
-    return Q($record[$attrib['part']]);
-  }
-
-  // return the complete address record as table
-  $table = new html_table(array('cols' => 2));
-
-  $a_show_cols = array('name', 'firstname', 'surname', 'email');
-  $microformats = array('name' => 'fn', 'email' => 'email');
-
-  foreach ($a_show_cols as $col) {
-    if ($col == 'email' && !empty($record[$col])) {
-      $value = html::a(array(
-        'href' => 'mailto:' . $record[$col],
-        'onclick' => sprintf("return %s.command('compose','%s',this)", JS_OBJECT_NAME, JQ($record[$col])),
-        'title' => rcube_label('composeto'),
-        'class' => $microformats[$col],
-      ), Q($record[$col]));
+    // check if we have a valid result
+    if (!(($result = $CONTACTS->get_result()) && ($record = $result->first()))) {
+        $RCMAIL->output->show_message('contactnotfound');
+        return false;
+    }
+
+    $i_size = !empty($attrib['size']) ? $attrib['size'] : 40;
+    $t_rows = !empty($attrib['textarearows']) ? $attrib['textarearows'] : 6;
+    $t_cols = !empty($attrib['textareacols']) ? $attrib['textareacols'] : 40;
+
+    $microformats = array('name' => 'fn', 'email' => 'email');
+
+    $form = array(
+        'info' => array(
+            'name'    => rcube_label('contactproperties'),
+            'content' => array(
+                'name' => array('type' => 'text', 'size' => $i_size),
+                'firstname' => array('type' => 'text', 'size' => $i_size),
+                'surname' => array('type' => 'text', 'size' => $i_size),
+                'email' => array('type' => 'text', 'size' => $i_size),
+            ),
+        ),
+        'groups' => array(
+            'name'    => rcube_label('groups'),
+            'content' => '',
+        ),
+    );
+
+    // Get content of groups fieldset
+    if ($groups = rcmail_contact_record_groups($record['ID'])) {
+        $form['groups']['content'] = $groups;    
+    }
+    else {
+        unset($form['groups']);
+    }
+
+    if (!empty($record['email'])) {
+        $form['info']['content']['email']['value'] = html::a(array(
+            'href' => 'mailto:' . $record['email'],
+            'onclick' => sprintf("return %s.command('compose','%s',this)", JS_OBJECT_NAME, JQ($record['email'])),
+            'title' => rcube_label('composeto'),
+            'class' => $microformats['email'],
+        ), Q($record['email']));
+    }
+    foreach (array('name', 'firstname', 'surname') as $col) {
+        if ($record[$col]) {
+            $form['info']['content'][$col]['value'] = html::span($microformats[$col], Q($record[$col]));
+        }
+    }
+
+    return rcmail_contact_form($form, $record);
+}
+
+
+function rcmail_contact_record_groups($contact_id)
+{
+    global $RCMAIL, $CONTACTS, $GROUPS;
+
+    $GROUPS = $CONTACTS->list_groups();
+
+    if (empty($GROUPS)) {
+        return '';
     }
-    else if (!empty($record[$col])) {
-      $value = html::span($microformats[$col], Q($record[$col]));
+
+    $table = new html_table(array('cols' => 2, 'cellspacing' => 0, 'border' => 0));
+
+    $members = $CONTACTS->get_record_groups($contact_id);
+    $checkbox = new html_checkbox(array('name' => '_gid[]',
+        'class' => 'groupmember', 'disabled' => $CONTACTS->readonly));
+
+    foreach ($GROUPS as $group) {
+        $gid = $group['ID'];
+        $table->add(null, $checkbox->show($members[$gid] ? $gid : null,
+            array('value' => $gid, 'id' => 'ff_gid' . $gid)));
+        $table->add(null, html::label('ff_gid' . $gid, Q($group['name'])));
     }
-    else
-      $value = '';
-    
-    $table->add('title', Q(rcube_label($col)));
-    $table->add(null, $value);
-  }
+
+    $hiddenfields = new html_hiddenfield(array('name' => '_source', 'value' => get_input_value('_source', RCUBE_INPUT_GPC)));
+    $hiddenfields->add(array('name' => '_cid', 'value' => $record['ID']));
+
+    $form_start = $RCMAIL->output->request_form(array(
+        'name' => "form", 'method' => "post",
+        'task' => $RCMAIL->task, 'action' => 'save',
+        'request' => 'save.'.intval($contact_id),
+        'noclose' => true), $hiddenfields->show());
+    $form_end = '</form>';
+
+    $RCMAIL->output->add_gui_object('editform', 'form');
   
-  return $table->show($attrib + array('class' => 'vcard'));
+    return $form_start . $table->show() . $form_end;
 }
 
 
 //$OUTPUT->framed = $_framed;
 $OUTPUT->add_handler('contactdetails', 'rcmail_contact_details');
-$OUTPUT->send('showcontact');
-?>
\ No newline at end of file
+
+$OUTPUT->send('contact');
diff --git a/program/steps/error.inc b/program/steps/error.inc
deleted file mode 100644 (file)
index 5cc04bf..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/steps/error.inc                                               |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Display error message page                                          |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: error.inc 2547 2009-05-26 16:54:55Z alec $
-
-*/
-
-
-// browser is not compatible with this application
-if ($ERROR_CODE==409) {
-  $user_agent = $GLOBALS['HTTP_SERVER_VARS']['HTTP_USER_AGENT'];
-  $__error_title = 'Your browser does not suit the requirements for this application';
-  $__error_text = <<<EOF
-<i>Supported browsers:</i><br />
-&raquo; &nbsp;Netscape 7+<br />
-&raquo; &nbsp;Microsoft Internet Explorer 6+<br />
-&raquo; &nbsp;Mozilla Firefox 1.0+<br />
-&raquo; &nbsp;Opera 8.0+<br />
-&raquo; &nbsp;Safari 1.2+<br />
-<br />
-&raquo; &nbsp;JavaScript enabled<br />
-&raquo; &nbsp;Support for XMLHTTPRequest<br />
-
-<p><i>Your configuration:</i><br />
-$user_agent</p>
-EOF;
-}
-
-// authorization error
-else if ($ERROR_CODE==401) {
-  $__error_title = "AUTHORIZATION FAILED";
-  $__error_text  = "Could not verify that you are authorized to access this service!<br />\n".
-                   "Please contact your server-administrator.";
-}
-  
-// failed request (wrong step in URL)
-else if ($ERROR_CODE==404) {
-  $__error_title = "REQUEST FAILED/FILE NOT FOUND";
-  $request_url = htmlentities($_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
-  $__error_text  = <<<EOF
-The requested page was not found!<br />
-Please contact your server-administrator.
-
-<p><i>Failed request:</i><br />
-http://$request_url</p>
-EOF;
-}
-
-// database connection error
-else if ($ERROR_CODE==601)
-{
-  $__error_title = "CONFIGURATION ERROR";
-  $__error_text  =  nl2br($ERROR_MESSAGE) . "<br />Please read the INSTALL instructions!";
-}
-
-// database connection error
-else if ($ERROR_CODE==603) {
-  $__error_title = "DATABASE ERROR: CONNECTION FAILED!";
-  $__error_text  =  "Unable to connect to the database!<br />Please contact your server-administrator.";
-}
-
-// system error
-else {
-  $__error_title = "SERVICE CURRENTLY NOT AVAILABLE!";
-  $__error_text  = "Please contact your server-administrator.";
-
-  if (($CONFIG['debug_level'] & 4) && $ERROR_MESSAGE)
-    $__error_text = $ERROR_MESSAGE;
-  else
-    $__error_text = sprintf('Error No. [%s]', $ERROR_CODE);
-}
-
-
-// Ajax request
-if ($OUTPUT && ($OUTPUT instanceof rcube_json_output)) {
-  header("HTTP/1.0 $ERROR_CODE $__error_title");
-  die;
-}
-
-// compose page content
-$__page_content = <<<EOF
-<div>
-<h3 class="error-title">$__error_title</h3>
-<p class="error-text">$__error_text</p>
-</div>
-EOF;
-
-if ($OUTPUT && $OUTPUT->template_exists('error')) {
-  $OUTPUT->reset();
-  $OUTPUT->send('error');
-}
-
-$__skin = $CONFIG->skin ? $CONFIG->skin : 'default';
-
-// print system error page
-print <<<EOF
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"><head>
-<title>RoundCube|Mail : ERROR $ERROR_CODE</title>
-<link rel="stylesheet" type="text/css" href="skins/$__skin/common.css" />
-</head>
-<body>
-
-<table border="0" cellsapcing="0" cellpadding="0" width="100%" height="80%"><tr><td align="center">
-
-$__page_content
-
-</td></tr></table>
-
-</body>
-</html>
-EOF;
-
-exit;
-?>
index d2bb293876f31272256157298b009991f3cabca1..e26b8fdb6c92fbffec86fd251fac9cf5c1a20fae 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/addcontact.inc                                     |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: addcontact.inc 2758 2009-07-16 15:01:05Z thomasb $
+ $Id: addcontact.inc 4166 2010-11-02 09:27:03Z alec $
 
 */
 
@@ -29,35 +29,48 @@ $CONTACTS = $RCMAIL->get_address_book(null, true);
 if (!empty($_POST['_address']) && is_object($CONTACTS))
 {
   $contact_arr = $IMAP->decode_address_list(get_input_value('_address', RCUBE_INPUT_POST, true), 1, false);
-  
-  if (!empty($contact_arr[1]['mailto']))
-  {
+
+  if (!empty($contact_arr[1]['mailto'])) {
     $contact = array(
       'email' => $contact_arr[1]['mailto'],
       'name' => $contact_arr[1]['name']
     );
-    
+
+    // Validity checks
+    if (empty($contact['email'])) {
+      $OUTPUT->show_message('errorsavingcontact', 'error');
+      $OUTPUT->send();
+    }
+    else if (!check_email($contact['email'], false)) {
+      $OUTPUT->show_message('emailformaterror', 'error', array('email' => $contact['email']));
+      $OUTPUT->send();
+    }
+
+    $contact['email'] = idn_to_utf8($contact['email']);
+
     // use email address part for name
     if (empty($contact['name']) || $contact['name'] == $contact['email'])
       $contact['name'] = ucfirst(preg_replace('/[\.\-]/', ' ', substr($contact['email'], 0, strpos($contact['email'], '@'))));
 
     // check for existing contacts
     $existing = $CONTACTS->search('email', $contact['email'], true, false);
+
     if ($done = $existing->count)
       $OUTPUT->show_message('contactexists', 'warning');
-    else
-    {
-      $plugin = $RCMAIL->plugins->exec_hook('create_contact', array('record' => $contact, 'source' => null));
+    else {
+      $plugin = $RCMAIL->plugins->exec_hook('contact_create', array('record' => $contact, 'source' => null));
       $contact = $plugin['record'];
 
-      if (!$plugin['abort'] && ($done = $CONTACTS->insert($contact)))
+      $done = !$plugin['abort'] ? $CONTACTS->insert($contact) : $plugin['result'];
+
+      if ($done)
         $OUTPUT->show_message('addedsuccessfully', 'confirmation');
     }
   }
 }
 
 if (!$done)
-  $OUTPUT->show_message('errorsavingcontact', 'warning');
+  $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsavingcontact', 'error');
 
 $OUTPUT->send();
-?>
+
index d97b9c413a75b0d247ae9aeb10bb3fe407c3554f..1fedf61a872f4f2d70e389040010223d36d116d1 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/attachments.inc                                    |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: compose.inc 2081 2008-11-23 12:38:44Z thomasb $
+ $Id: attachments.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
@@ -32,7 +32,7 @@ if ($RCMAIL->action=='remove-attachment')
   if (preg_match('/^rcmfile(\w+)$/', $_POST['_file'], $regs))
     $id = $regs[1];
   if ($attachment = $_SESSION['compose']['attachments'][$id])
-    $attachment = $RCMAIL->plugins->exec_hook('remove_attachment', $attachment);
+    $attachment = $RCMAIL->plugins->exec_hook('attachment_delete', $attachment);
   if ($attachment['status']) {
     if (is_array($_SESSION['compose']['attachments'][$id])) {
       unset($_SESSION['compose']['attachments'][$id]);
@@ -50,12 +50,14 @@ if ($RCMAIL->action=='display-attachment')
   if (preg_match('/^rcmfile(\w+)$/', $_GET['_file'], $regs))
     $id = $regs[1];
   if ($attachment = $_SESSION['compose']['attachments'][$id])
-    $attachment = $RCMAIL->plugins->exec_hook('display_attachment', $attachment);
+    $attachment = $RCMAIL->plugins->exec_hook('attachment_display', $attachment);
     
   if ($attachment['status']) {
-    $size = $attachment['data'] ? strlen($attachment['data']) : @filesize($attachment['path']);
+    if (empty($attachment['size']))
+      $attachment['size'] = $attachment['data'] ? strlen($attachment['data']) : @filesize($attachment['path']);
+
     header('Content-Type: ' . $attachment['mimetype']);
-    header('Content-Length: ' . $size);
+    header('Content-Length: ' . $attachment['size']);
     
     if ($attachment['data'])
       echo $attachment['data'];
@@ -80,11 +82,12 @@ if (is_array($_FILES['_attachments']['tmp_name'])) {
   foreach ($_FILES['_attachments']['tmp_name'] as $i => $filepath) {
     $attachment = array(
       'path' => $filepath,
+      'size' => $_FILES['_attachments']['size'][$i],
       'name' => $_FILES['_attachments']['name'][$i],
       'mimetype' => rc_mime_content_type($filepath, $_FILES['_attachments']['name'][$i], $_FILES['_attachments']['type'][$i])
     );
 
-    $attachment = $RCMAIL->plugins->exec_hook('upload_attachment', $attachment);
+    $attachment = $RCMAIL->plugins->exec_hook('attachment_upload', $attachment);
 
     if ($attachment['status'] && !$attachment['abort']) {
       $id = $attachment['id'];
@@ -149,4 +152,3 @@ else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
 $OUTPUT->command('auto_save_start', false);
 $OUTPUT->send('iframe');
 
-?>
index 46915672d47019678eb400f948f13e8ed1d7802f..70072910c7e917b563843561a56bff423a529e46 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/autocomplete.inc                                   |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2008-2009, RoundCube Dev Team                           |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2008-2010, Roundcube Dev Team                           |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: $
+ $Id: autocomplete.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
 $MAXNUM = 15;
-$contacts = array();
 $book_types = (array) $RCMAIL->config->get('autocomplete_addressbooks', 'sql');
 
-if ($book_types && $search = get_input_value('_search', RCUBE_INPUT_POST, true)) {
+if ($RCMAIL->action == 'group-expand') {
+  $abook = $RCMAIL->get_address_book(get_input_value('_source', RCUBE_INPUT_GPC));
+  if ($gid = get_input_value('_gid', RCUBE_INPUT_GPC)) {
+    $members = array();
+    $abook->set_group($gid);
+    $abook->set_pagesize(1000);  // TODO: limit number of group members by config
+    $result = $abook->list_records(array('email','name'));
+    while ($result && ($sql_arr = $result->iterate()))
+      $members[] = format_email_recipient($sql_arr['email'], $sql_arr['name']);
+
+    $OUTPUT->command('replace_group_recipients', $gid, join(', ', $members));
+  }
+}
+else if ($book_types && $search = get_input_value('_search', RCUBE_INPUT_GPC, true)) {
+  $contacts = array();
+  $books_num = count($book_types);
 
   foreach ($book_types as $id) {
     $abook = $RCMAIL->get_address_book($id);
     $abook->set_pagesize($MAXNUM);
 
-    if ($result = $abook->search(array('email','name'), $search)) {
+    if ($result = $abook->search(array('email','name'), $search, false, true, true, 'email')) {
       while ($sql_arr = $result->iterate()) {
-          $contacts[] = format_email_recipient($sql_arr['email'], $sql_arr['name']);
-         if (count($contacts) >= $MAXNUM)
+        $contact = format_email_recipient($sql_arr['email'], $sql_arr['name']);
+        // when we've got more than one book, we need to skip duplicates
+        if ($books_num == 1 || !in_array($contact, $contacts)) {
+          $contacts[] = $contact;
+          if (count($contacts) >= $MAXNUM)
             break 2;
+        }
+      }
+    }
+
+    // also list matching contact groups
+    if ($abook->groups) {
+      foreach ($abook->list_groups($search) as $group) {
+        $abook->reset();
+        $abook->set_group($group['ID']);
+        $result = $abook->count();
+
+        if ($result->count) {
+          $contacts[] = array('name' => $group['name'] . ' (' . intval($result->count) . ')', 'id' => $group['ID'], 'source' => $id);
+          if (count($contacts) >= $MAXNUM)
+            break;
+        }
       }
     }
   }
-  
-  sort($contacts);
+
+  usort($contacts, 'contact_results_sort');
 }
 
 $OUTPUT->command('ksearch_query_results', $contacts, $search);
 $OUTPUT->send();
 
-?>
+
+function contact_results_sort($a, $b)
+{
+  $name_a = is_array($a) ? $a['name'] : $a;
+  $name_b = is_array($b) ? $b['name'] : $b;
+  return strcoll(trim($name_a, '" '), trim($name_b, '" '));
+}
+
index 094c429d4683a31848c53a6a038bd82e6828b0ea..57f4b5b0cc0c118a151cf6ee4adf2e3d69d6facc 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/check_recent.inc                                   |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: check_recent.inc 233 2006-06-26 17:31:20Z richs $
+ $Id: check_recent.inc 4084 2010-10-13 19:15:51Z alec $
 
 */
 
-$a_mailboxes = $IMAP->list_mailboxes();
-$check_all = (bool)$RCMAIL->config->get('check_all_folders');
+$current = $IMAP->get_mailbox_name();
+$check_all = !empty($_GET['_refresh']) || (bool)$RCMAIL->config->get('check_all_folders');
 
+// list of folders to check
+if ($check_all) {
+    $a_mailboxes = $IMAP->list_mailboxes();
+}
+else {
+    $a_mailboxes = (array) $current;
+    if ($a_mailboxes[0] != 'INBOX')
+        $a_mailboxes[] = 'INBOX';
+}
+
+// check recent/unseen counts
 foreach ($a_mailboxes as $mbox_name) {
-  if ($mbox_name == $IMAP->get_mailbox_name()) {
-    if ($recent_count = $IMAP->messagecount(NULL, 'RECENT', TRUE)) {
-      // refresh saved search set
-      if (($search_request = get_input_value('_search', RCUBE_INPUT_GPC)) && isset($_SESSION['search'][$search_request])) {
-        $_SESSION['search'][$search_request] = $IMAP->refresh_search();
-        $all_count = $IMAP->messagecount();
-      } else {
-        $all_count = $IMAP->messagecount(NULL, 'ALL', TRUE);
-      }
-      
-      $unread_count = $IMAP->messagecount(NULL, 'UNSEEN', TRUE);
-      $_SESSION['unseen_count'][$mbox_name] = $unread_count;
-
-      $OUTPUT->set_env('messagecount', $all_count);
-      $OUTPUT->set_env('pagesize', $IMAP->page_size);
-      $OUTPUT->set_env('pagecount', ceil($all_count/$IMAP->page_size));
-      $OUTPUT->command('set_unread_count', $mbox_name, $unread_count, ($mbox_name == 'INBOX'));
-      $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($all_count));
-
-      if (rcmail::get_instance()->config->get('focus_on_new_message',true))
-        $OUTPUT->command('new_message_focus');
-
-      if (!empty($_GET['_quota']))
-        $OUTPUT->command('set_quota', rcmail_quota_content($IMAP->get_quota()));
-
-      // trigger plugin hook
-      $RCMAIL->plugins->exec_hook('new_messages', array('mailbox' => $mbox_name, 'count' => $unread_count));
-
-      // "No-list" mode, don't get messages
-      if (empty($_GET['_list']))
-        continue;
-
-      // use SEARCH/SORT to find recent messages
-      $search_str = 'RECENT';
-      if ($search_request)
-        $search_str .= ' '.$IMAP->search_string;
-
-      $result = $IMAP->search($mbox_name, $search_str, NULL, 'date');
-
-      if ($result) {
-        // get the headers
-        $result_h = $IMAP->list_headers($mbox_name, 1, 'date', 'DESC');
-        // add to the list
-        rcmail_js_message_list($result_h, true, false);
-      }
+    if ($mbox_name == $current && ($status = $IMAP->mailbox_status($mbox_name))) {
+
+        rcmail_send_unread_count($mbox_name, true);
+
+        // refresh saved search set
+        $search_request = get_input_value('_search', RCUBE_INPUT_GPC);
+        if ($search_request && isset($_SESSION['search'])
+            && $_SESSION['search_request'] == $search_request
+        ) {
+            $_SESSION['search'] = $IMAP->refresh_search();
+        }
+
+        if (!empty($_GET['_quota']))
+            $OUTPUT->command('set_quota', rcmail_quota_content());
+
+        // "No-list" mode, don't get messages
+        if (empty($_GET['_list']))
+            continue;
+
+        // get overall message count; allow caching because rcube_imap::mailbox_status() did a refresh
+        $all_count = $IMAP->messagecount(null, $IMAP->threading ? 'THREADS' : 'ALL');
+
+        // check current page if we're not on the first page
+        if ($all_count && $IMAP->list_page > 1) {
+            $remaining = $all_count - $IMAP->page_size * ($IMAP->list_page - 1);
+            if ($remaining <= 0) {
+                $IMAP->set_page($IMAP->list_page-1);
+                $_SESSION['page'] = $IMAP->list_page;
+            }
+        }
+
+        $OUTPUT->set_env('messagecount', $all_count);
+        $OUTPUT->set_env('pagecount', ceil($all_count/$IMAP->page_size));
+        $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($all_count));
+        $OUTPUT->set_env('current_page', $all_count ? $IMAP->list_page : 1);
+
+        if ($status & 1) {
+            if ($RCMAIL->config->get('focus_on_new_message', true))
+                $OUTPUT->command('new_message_focus');
+            // trigger plugin hook
+            $RCMAIL->plugins->exec_hook('new_messages', array('mailbox' => $mbox_name));
+        }
+
+        // remove old rows (and clear selection if new list is empty)
+        $OUTPUT->command('message_list.clear', $all_count ? false : true);
+
+        if ($all_count) {
+            $a_headers = $IMAP->list_headers($mbox_name, null, $_SESSION['sort_col'], $_SESSION['sort_order']);
+            // add message rows
+            rcmail_js_message_list($a_headers, false);
+            // remove messages that don't exists from list selection array
+            $OUTPUT->command('update_selection');
+        }
     }
     else {
-      rcmail_send_unread_count($mbox_name, true);
+        rcmail_send_unread_count($mbox_name, true);
     }
-  }
-  else if ($check_all) {
-    rcmail_send_unread_count($mbox_name, true);
-  }
 }
 
 $OUTPUT->send();
-
-?>
index ed281169a094134a6a055dcf5e536bfc2a48de26..a5eb5fefc01fb87da897d8b91fe6500ff94b5b09 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/compose.inc                                        |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: compose.inc 3021 2009-10-06 06:55:08Z thomasb $
+ $Id: compose.inc 4328 2010-12-09 19:10:44Z alec $
 
 */
 
@@ -33,9 +33,17 @@ $MESSAGE = NULL;
 // Since there are many ways to leave the compose page improperly, it seems necessary to clean-up an old
 // compose when a "new/forward/reply/draft" is called - otherwise the old session attachments will appear
 
-if (!is_array($_SESSION['compose']) || $_SESSION['compose']['id'] != get_input_value('_id', RCUBE_INPUT_GET))
+$MESSAGE_ID = get_input_value('_id', RCUBE_INPUT_GET);
+if (!is_array($_SESSION['compose']) || $_SESSION['compose']['id'] != $MESSAGE_ID)
 {
   rcmail_compose_cleanup();
+
+  // Infinite redirect prevention in case of broken session (#1487028)
+  if ($MESSAGE_ID)
+    raise_error(array('code' => 500, 'type' => 'php',
+      'file' => __FILE__, 'line' => __LINE__,
+      'message' => "Invalid session"), true, true);
+
   $_SESSION['compose'] = array(
     'id' => uniqid(mt_rand()),
     'param' => request2param(RCUBE_INPUT_GET),
@@ -44,6 +52,8 @@ if (!is_array($_SESSION['compose']) || $_SESSION['compose']['id'] != get_input_v
   
   // process values like "mailto:foo@bar.com?subject=new+message&cc=another"
   if ($_SESSION['compose']['param']['to']) {
+    // #1486037: remove "mailto:" prefix
+    $_SESSION['compose']['param']['to'] = preg_replace('/^mailto:/i', '', $_SESSION['compose']['param']['to']);
     $mailto = explode('?', $_SESSION['compose']['param']['to']);
     if (count($mailto) > 1) {
       $_SESSION['compose']['param']['to'] = $mailto[0];
@@ -53,10 +63,13 @@ if (!is_array($_SESSION['compose']) || $_SESSION['compose']['id'] != get_input_v
     }
   }
   
+  // select folder where to save the sent message
+  $_SESSION['compose']['param']['sent_mbox'] = $RCMAIL->config->get('sent_mbox');
+  
   // pipe compose parameters thru plugins
   $plugin = $RCMAIL->plugins->exec_hook('message_compose', $_SESSION['compose']);
-  $_SESSION['compose']['param'] = $plugin['param'];
-  
+  $_SESSION['compose']['param'] = array_merge($_SESSION['compose']['param'], $plugin['param']);
+
   // add attachments listed by message_compose hook
   if (is_array($plugin['attachments'])) {
     foreach ($plugin['attachments'] as $attach) {
@@ -76,7 +89,7 @@ if (!is_array($_SESSION['compose']) || $_SESSION['compose']['id'] != get_input_v
       
       // save attachment if valid
       if (($attachment['data'] && $attachment['name']) || ($attachment['path'] && file_exists($attachment['path']))) {
-        $attachment = rcmail::get_instance()->plugins->exec_hook('save_attachment', $attachment);
+        $attachment = rcmail::get_instance()->plugins->exec_hook('attachment_save', $attachment);
       }
       
       if ($attachment['status'] && !$attachment['abort']) {
@@ -86,6 +99,11 @@ if (!is_array($_SESSION['compose']) || $_SESSION['compose']['id'] != get_input_v
     }
   }
 
+  // check if folder for saving sent messages exists and is subscribed (#1486802)
+  if ($sent_folder = $_SESSION['compose']['param']['sent_mbox']) {
+    rcmail_check_sent_folder($sent_folder, true);
+  }
+
   // redirect to a unique URL with all parameters stored in session
   $OUTPUT->redirect(array('_action' => 'compose', '_id' => $_SESSION['compose']['id']));
 }
@@ -94,7 +112,8 @@ if (!is_array($_SESSION['compose']) || $_SESSION['compose']['id'] != get_input_v
 // add some labels to client
 $OUTPUT->add_label('nosubject', 'nosenderwarning', 'norecipientwarning', 'nosubjectwarning', 'cancel',
     'nobodywarning', 'notsentwarning', 'notuploadedwarning', 'savingmessage', 'sendingmessage', 
-    'messagesaved', 'converting', 'editorwarning', 'searching', 'uploading', 'fileuploaderror');
+    'messagesaved', 'converting', 'editorwarning', 'searching', 'uploading', 'fileuploaderror',
+    'autocompletechars');
 
 // add config parameters to client script
 if (!empty($CONFIG['drafts_mbox'])) {
@@ -103,6 +122,9 @@ if (!empty($CONFIG['drafts_mbox'])) {
 }
 // set current mailbox in client environment
 $OUTPUT->set_env('mailbox', $IMAP->get_mailbox_name());
+$OUTPUT->set_env('sig_above', $CONFIG['sig_above']);
+$OUTPUT->set_env('top_posting', $CONFIG['top_posting']);
+$OUTPUT->set_env('autocomplete_min_length', $CONFIG['autocomplete_min_length']);
 
 // get reference message and set compose mode
 if ($msg_uid = $_SESSION['compose']['param']['reply_uid'])
@@ -116,13 +138,30 @@ else if ($msg_uid = $_SESSION['compose']['param']['draft_uid']) {
   $compose_mode = RCUBE_COMPOSE_DRAFT;
 }
 
+$config_show_sig = $RCMAIL->config->get('show_sig', 1);
+if ($config_show_sig == 1)
+  $OUTPUT->set_env('show_sig', true);
+else if ($config_show_sig == 2 && (empty($compose_mode) || $compose_mode == RCUBE_COMPOSE_EDIT || $compose_mode == RCUBE_COMPOSE_DRAFT))
+  $OUTPUT->set_env('show_sig', true);
+else if ($config_show_sig == 3 && ($compose_mode == RCUBE_COMPOSE_REPLY || $compose_mode == RCUBE_COMPOSE_FORWARD))
+  $OUTPUT->set_env('show_sig', true);
+else
+  $OUTPUT->set_env('show_sig', false);
+
+// set line length for body wrapping
+$LINE_LENGTH = $RCMAIL->config->get('line_length', 72);
+
 if (!empty($msg_uid))
 {
   // similar as in program/steps/mail/show.inc
   // re-set 'prefer_html' to have possibility to use html part for compose
-  $CONFIG['prefer_html'] = $CONFIG['htmleditor'] || $compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT;
+  $CONFIG['prefer_html'] = $CONFIG['prefer_html'] || $CONFIG['htmleditor'] || $compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT;
   $MESSAGE = new rcube_message($msg_uid);
   
+  // make sure message is marked as read
+  if ($MESSAGE && $MESSAGE->headers && !$MESSAGE->headers->seen)
+    $IMAP->set_flag($msg_uid, 'SEEN');
+
   if (!empty($MESSAGE->headers->charset))
     $IMAP->set_charset($MESSAGE->headers->charset);
     
@@ -133,64 +172,91 @@ if (!empty($msg_uid))
     $_SESSION['compose']['references']  = trim($MESSAGE->headers->references . " " . $MESSAGE->headers->messageID);
 
     if (!empty($_SESSION['compose']['param']['all']))
-      $MESSAGE->reply_all = 1;
+      $MESSAGE->reply_all = $_SESSION['compose']['param']['all'];
+
+    $OUTPUT->set_env('compose_mode', 'reply');
+
+    // Save the sent message in the same folder of the message being replied to
+    if ($RCMAIL->config->get('reply_same_folder') && ($sent_folder = $_SESSION['compose']['mailbox'])
+      && rcmail_check_sent_folder($sent_folder, false)
+    ) {
+      $_SESSION['compose']['param']['sent_mbox'] = $sent_folder;
+    }
   }
   else if ($compose_mode == RCUBE_COMPOSE_DRAFT)
   {
-    if($MESSAGE->headers->in_reply_to)
+    if ($MESSAGE->headers->others['x-draft-info'])
     {
-      // TODO: how to get reply_uid/forward_uid value, maybe we must set X-Reply-UID/X-Forward-UID
-      // $_SESSION['compose']['reply_uid'] = ?
-      // $_SESSION['compose']['forward_uid'] = ?
-      $_SESSION['compose']['reply_msgid'] = '<'.$MESSAGE->headers->in_reply_to.'>';
+      // get reply_uid/forward_uid to flag the original message when sending
+      $info = rcmail_draftinfo_decode($MESSAGE->headers->others['x-draft-info']);
+
+      if ($info['type'] == 'reply')
+        $_SESSION['compose']['reply_uid'] = $info['uid'];
+      else if ($info['type'] == 'forward')
+        $_SESSION['compose']['forward_uid'] = $info['uid'];
+
+      $_SESSION['compose']['mailbox'] = $info['folder'];
+
+      // Save the sent message in the same folder of the message being replied to
+      if ($RCMAIL->config->get('reply_same_folder') && ($sent_folder = $info['folder'])
+        && rcmail_check_sent_folder($sent_folder, false)
+      ) {
+        $_SESSION['compose']['param']['sent_mbox'] = $sent_folder;
+      }
     }
+
+    if ($MESSAGE->headers->in_reply_to)
+      $_SESSION['compose']['reply_msgid'] = '<'.$MESSAGE->headers->in_reply_to.'>';
+
     $_SESSION['compose']['references']  = $MESSAGE->headers->references;
   }
   else if ($compose_mode == RCUBE_COMPOSE_FORWARD)
   {
     $_SESSION['compose']['forward_uid'] = $msg_uid;
+    $OUTPUT->set_env('compose_mode', 'forward');
   }
 }
 
-/****** compose mode functions ********/
+// process $MESSAGE body/attachments, set $MESSAGE_BODY/$HTML_MODE vars and some session data
+$MESSAGE_BODY = rcmail_prepare_message_body();
 
 
+/****** compose mode functions ********/
+
 function rcmail_compose_headers($attrib)
 {
   global $IMAP, $MESSAGE, $DB, $compose_mode;
   static $sa_recipients = array();
 
   list($form_start, $form_end) = get_form_tags($attrib);
-  
+
   $out = '';
   $part = strtolower($attrib['part']);
-  
+
   switch ($part)
   {
     case 'from':
-      return rcmail_compose_header_from($attrib);
+      return $form_start . rcmail_compose_header_from($attrib);
 
     case 'to':
       $fname = '_to';
       $header = $param = 'to';
-      
+
       // we have a set of recipients stored is session
       if (($mailto_id = $_SESSION['compose']['param']['mailto']) && $_SESSION['mailto'][$mailto_id])
         $fvalue = urldecode($_SESSION['mailto'][$mailto_id]);
-      
+
     case 'cc':
-      if (!$fname)
-      {
+      if (!$fname) {
         $fname = '_cc';
         $header = $param = 'cc';
       }
     case 'bcc':
-      if (!$fname)
-      {
+      if (!$fname) {
         $fname = '_bcc';
         $header = $param = 'bcc';
       }
-        
+
       $allow_attrib = array('id', 'class', 'style', 'cols', 'rows', 'tabindex');
       $field_type = 'html_textarea';
       break;
@@ -199,11 +265,21 @@ function rcmail_compose_headers($attrib)
     case 'reply-to':
       $fname = '_replyto';
       $param = 'replyto';
+      $header = 'reply-to';
+
+    case 'followupto':
+    case 'followup-to':
+      if (!$fname) {
+        $fname = '_followupto';
+        $param = 'followupto';
+        $header = 'mail-followup-to';
+      }
+
       $allow_attrib = array('id', 'class', 'style', 'size', 'tabindex');
       $field_type = 'html_inputfield';
       break;
   }
+
   if ($fname && !empty($_POST[$fname])) {
     $fvalue = get_input_value($fname, RCUBE_INPUT_POST, TRUE);
   }
@@ -212,56 +288,88 @@ function rcmail_compose_headers($attrib)
   }
   else if ($header && $compose_mode == RCUBE_COMPOSE_REPLY) {
     // get recipent address(es) out of the message headers
-    if ($header=='to' && !empty($MESSAGE->headers->replyto))
-      $fvalue = $MESSAGE->headers->replyto;
-
-    else if ($header=='to' && !empty($MESSAGE->headers->from))
-      $fvalue = $MESSAGE->headers->from;
-
+    if ($header == 'to') {
+      $mailfollowup = $MESSAGE->headers->others['mail-followup-to'];
+      $mailreplyto  = $MESSAGE->headers->others['mail-reply-to'];
+
+      if ($MESSAGE->reply_all == 'list' && $mailfollowup)
+        $fvalue = $mailfollowup;
+      else if ($MESSAGE->reply_all == 'list'
+        && preg_match('/<mailto:([^>]+)>/i', $MESSAGE->headers->others['list-post'], $m))
+        $fvalue = $m[1];
+      else if ($mailreplyto)
+        $fvalue = $mailreplyto;
+      else if (!empty($MESSAGE->headers->replyto))
+        $fvalue = $MESSAGE->headers->replyto;
+      else if (!empty($MESSAGE->headers->from))
+        $fvalue = $MESSAGE->headers->from;
+    }
     // add recipent of original message if reply to all
-    else if ($header=='cc' && !empty($MESSAGE->reply_all))
-    {
+    else if ($header == 'cc' && !empty($MESSAGE->reply_all) && $MESSAGE->reply_all != 'list') {
       if ($v = $MESSAGE->headers->to)
         $fvalue .= $v;
-
       if ($v = $MESSAGE->headers->cc)
         $fvalue .= (!empty($fvalue) ? ', ' : '') . $v;
     }
 
     // split recipients and put them back together in a unique way
-    if (!empty($fvalue))
-    {
+    if (!empty($fvalue)) {
       $to_addresses = $IMAP->decode_address_list($fvalue);
       $fvalue = '';
 
-      foreach ($to_addresses as $addr_part)
-      {
-        if (!empty($addr_part['mailto'])
-            && !in_array($addr_part['mailto'], $sa_recipients)
+      foreach ($to_addresses as $addr_part) {
+        if (empty($addr_part['mailto']))
+          continue;
+
+        $mailto = idn_to_utf8($addr_part['mailto']);
+
+        if (!in_array($mailto, $sa_recipients)
             && (!$MESSAGE->compose_from
-                || !in_array_nocase($addr_part['mailto'], $MESSAGE->compose_from)
-                || (count($to_addresses)==1 && $header=='to'))) // allow reply to yourself
-        {
-          $fvalue .= (strlen($fvalue) ? ', ':'').$addr_part['string'];
+                || !in_array_nocase($mailto, $MESSAGE->compose_from)
+                || (count($to_addresses)==1 && $header=='to')) // allow reply to yourself
+        ) {
+          if ($addr_part['name'] && $addr_part['mailto'] != $addr_part['name'])
+            $string = format_email_recipient($mailto, $addr_part['name']);
+          else
+            $string = $mailto;
+          $fvalue .= (strlen($fvalue) ? ', ':'') . $string;
           $sa_recipients[] = $addr_part['mailto'];
         }
       }
     }
   }
-  else if ($header && in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT)))
-  {
+  else if ($header && in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT))) {
     // get drafted headers
     if ($header=='to' && !empty($MESSAGE->headers->to))
       $fvalue = $MESSAGE->get_header('to');
-
-    if ($header=='cc' && !empty($MESSAGE->headers->cc))
+    else if ($header=='cc' && !empty($MESSAGE->headers->cc))
       $fvalue = $MESSAGE->get_header('cc');
-
-    if ($header=='bcc' && !empty($MESSAGE->headers->bcc))
+    else if ($header=='bcc' && !empty($MESSAGE->headers->bcc))
       $fvalue = $MESSAGE->get_header('bcc');
+    else if ($header=='reply-to' && !empty($MESSAGE->headers->others['mail-reply-to']))
+      $fvalue = $MESSAGE->get_header('mail-reply-to');
+    else if ($header=='reply-to' && !empty($MESSAGE->headers->replyto))
+      $fvalue = $MESSAGE->get_header('reply-to');
+    else if ($header=='mail-followup-to' && !empty($MESSAGE->headers->others['mail-followup-to']))
+      $fvalue = $MESSAGE->get_header('mail-followup-to');
+
+    $addresses = $IMAP->decode_address_list($fvalue);
+    $fvalue = '';
+
+    foreach ($addresses as $addr_part) {
+      if (empty($addr_part['mailto']))
+        continue;
+
+      $mailto = idn_to_utf8($addr_part['mailto']);
+
+      if ($addr_part['name'] && $addr_part['mailto'] != $addr_part['name'])
+        $string = format_email_recipient($mailto, $addr_part['name']);
+      else
+        $string = $mailto;
+      $fvalue .= (strlen($fvalue) ? ', ':'') . $string;
+    }
   }
 
-        
   if ($fname && $field_type)
   {
     // pass the following attributes to the form class
@@ -278,11 +386,10 @@ function rcmail_compose_headers($attrib)
   if ($form_start)
     $out = $form_start.$out;
 
-  return $out;  
+  return $out;
 }
 
 
-
 function rcmail_compose_header_from($attrib)
 {
   global $IMAP, $MESSAGE, $DB, $USER, $OUTPUT, $compose_mode;
@@ -303,7 +410,7 @@ function rcmail_compose_header_from($attrib)
     foreach ($a_to as $addr)
     {
       if (!empty($addr['mailto']))
-        $a_recipients[] = mb_strtolower($addr['mailto']);
+        $a_recipients[] = strtolower($addr['mailto']);
     }
 
     if (!empty($MESSAGE->headers->cc))
@@ -312,7 +419,7 @@ function rcmail_compose_header_from($attrib)
       foreach ($a_cc as $addr)
       {
         if (!empty($addr['mailto']))
-          $a_recipients[] = mb_strtolower($addr['mailto']);
+          $a_recipients[] = strtolower($addr['mailto']);
       }
     }
   }
@@ -322,16 +429,17 @@ function rcmail_compose_header_from($attrib)
 
   if (count($user_identities))
   {
-    $from_id = 0;
     $a_signatures = array();
 
     $field_attrib['onchange'] = JS_OBJECT_NAME.".change_identity(this)";
     $select_from = new html_select($field_attrib);
 
+    // create SELECT element
     foreach ($user_identities as $sql_arr)
     {
+      $email = mb_strtolower(idn_to_utf8($sql_arr['email']));
       $identity_id = $sql_arr['identity_id'];
-      $select_from->add(format_email_recipient($sql_arr['email'], $sql_arr['name']), $identity_id);
+      $select_from->add(format_email_recipient($email, $sql_arr['name']), $identity_id);
 
       // add signature to array
       if (!empty($sql_arr['signature']) && empty($_SESSION['compose']['param']['nosig']))
@@ -346,81 +454,129 @@ function rcmail_compose_header_from($attrib)
       }
 
       if ($compose_mode == RCUBE_COMPOSE_REPLY && is_array($MESSAGE->compose_from))
-        $MESSAGE->compose_from[] = $sql_arr['email'];
+        $MESSAGE->compose_from[] = $email;
+    }
 
-      if (empty($_POST['_from']))
-      {
+    $from_id = 0;
+
+    // overwrite identity selection with post parameter
+    if (!empty($_POST['_from']))
+      $from_id = get_input_value('_from', RCUBE_INPUT_POST);
+    else if (!empty($_SESSION['compose']['param']['from']))
+      $from_id = $_SESSION['compose']['param']['from'];
+    else {
+      $return_path = $MESSAGE->headers->others['return-path'];
+
+      // Set identity
+      foreach ($user_identities as $sql_arr) {
         // set draft's identity
-        if ($compose_mode == RCUBE_COMPOSE_DRAFT && strstr($MESSAGE->headers->from, $sql_arr['email']))
-          $from_id = $sql_arr['identity_id'];
+        if ($compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT) {
+          if ($MESSAGE->headers->from == format_email_recipient($sql_arr['email'], $sql_arr['name'])) {
+            $from_id = $sql_arr['identity_id'];
+            break;
+          }
+        }
         // set identity if it's one of the reply-message recipients (with prio for default identity)
-        else if (in_array(mb_strtolower($sql_arr['email']), $a_recipients) && (empty($from_id) || $sql_arr['standard']))
+        else if (in_array($sql_arr['email'], $a_recipients) && (empty($from_id) || $sql_arr['standard']))
+          $from_id = $sql_arr['identity_id'];
+        // set identity when replying to mailing list
+        else if (strpos($return_path, str_replace('@', '=', $sql_arr['email']).'@') !== false)
           $from_id = $sql_arr['identity_id'];
+
+        if ($from_id)
+          break;
       }
     }
 
-    // overwrite identity selection with post parameter
-    if (!empty($_POST['_from']))
-      $from_id = get_input_value('_from', RCUBE_INPUT_POST);
-
     $out = $select_from->show($from_id);
 
     // add signatures to client
     $OUTPUT->set_env('signatures', $a_signatures);
   }
-  else
-  {
+  // no identities, display text input field
+  else {
+    $field_attrib['class'] = 'from_address';
     $input_from = new html_inputfield($field_attrib);
     $out = $input_from->show($_POST['_from']);
   }
-  
-  if ($form_start)
-    $out = $form_start.$out;
 
   return $out;
 }
 
 
-function rcmail_compose_body($attrib)
+function rcmail_compose_editor_mode()
 {
-  global $RCMAIL, $CONFIG, $OUTPUT, $MESSAGE, $compose_mode;
-  
-  list($form_start, $form_end) = get_form_tags($attrib);
-  unset($attrib['form']);
-  
-  if (empty($attrib['id']))
-    $attrib['id'] = 'rcmComposeBody';
+  global $RCMAIL, $MESSAGE, $compose_mode;
+  static $useHtml;
 
-  $attrib['name'] = '_message';
+  if ($useHtml !== null)
+    return $useHtml;
 
-  if ($CONFIG['htmleditor'] || (($compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT) && $MESSAGE->has_html_part()))
-    $isHtml = true;
-  else
-    $isHtml = false;
+  $html_editor = intval($RCMAIL->config->get('htmleditor'));
+
+  if ($compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT) {
+    $useHtml = $MESSAGE->has_html_part();
+  }
+  else if ($compose_mode == RCUBE_COMPOSE_REPLY) {
+    $useHtml = ($html_editor == 1 || ($html_editor == 2 && $MESSAGE->has_html_part()));
+  }
+  else { // RCUBE_COMPOSE_FORWARD or NEW
+    $useHtml = ($html_editor == 1);
+  }
+
+  return $useHtml;
+}
 
-  $body = '';
+
+function rcmail_prepare_message_body()
+{
+  global $RCMAIL, $MESSAGE, $compose_mode, $LINE_LENGTH, $HTML_MODE;
 
   // use posted message body
-  if (!empty($_POST['_message']))
-  {
+  if (!empty($_POST['_message'])) {
     $body = get_input_value('_message', RCUBE_INPUT_POST, true);
+    $isHtml = (bool) get_input_value('_is_html', RCUBE_INPUT_POST);
   }
-  else if ($_SESSION['compose']['param']['body'])
-  {
+  else if ($_SESSION['compose']['param']['body']) {
     $body = $_SESSION['compose']['param']['body'];
     $isHtml = false;
   }
-  else if ($compose_mode)
-  {
-    if (($isHtml || $compose_mode == RCUBE_COMPOSE_DRAFT) && $MESSAGE->has_html_part())
-    {
-      $body = $MESSAGE->first_html_part();
-      $isHtml = true;
+  // reply/edit/draft/forward
+  else if ($compose_mode) {
+    $has_html_part = $MESSAGE->has_html_part();
+    $isHtml = rcmail_compose_editor_mode();
+
+    if ($isHtml) {
+      if ($has_html_part) {
+        $body = $MESSAGE->first_html_part();
+      }
+      else {
+        $body = $MESSAGE->first_text_part();
+        // try to remove the signature
+        if ($RCMAIL->config->get('strip_existing_sig', true))
+          $body = rcmail_remove_signature($body);
+        // add HTML formatting
+        $body = rcmail_plain_body($body);
+        if ($body)
+          $body = '<pre>' . $body . '</pre>';
+      }
     }
-    else
-    {
-      $body = $MESSAGE->first_text_part();
-      $isHtml = false;
+    else {
+      if ($has_html_part) {
+        // use html part if it has been used for message (pre)viewing
+        // decrease line length for quoting
+        $len = $compose_mode == RCUBE_COMPOSE_REPLY ? $LINE_LENGTH-2 : $LINE_LENGTH;
+        $txt = new html2text($MESSAGE->first_html_part(), false, true, $len);
+        $body = $txt->get_text();
+      }
+      else {
+        $body = $MESSAGE->first_text_part($part);
+        if ($body && $part && $part->ctype_secondary == 'plain'
+            && $part->ctype_parameters['format'] == 'flowed'
+        ) {
+          $body = rcube_message::unfold_flowed($body);
+        }
+      }
     }
 
     // compose reply-body
@@ -433,11 +589,44 @@ function rcmail_compose_body($attrib)
     else if ($compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT)
       $body = rcmail_create_draft_body($body, $isHtml);
   }
-  else if (!empty($_SESSION['compose']['param']['body']))
-  {
-    $body = $_SESSION['compose']['param']['body'];
+  else { // new message
+    $isHtml = rcmail_compose_editor_mode();
   }
 
+  $plugin = $RCMAIL->plugins->exec_hook('message_compose_body',
+    array('body' => $body, 'html' => $isHtml, 'mode' => $compose_mode));
+  $body = $plugin['body'];
+  unset($plugin);
+
+  // add blocked.gif attachment (#1486516)
+  if ($isHtml && preg_match('#<img src="\./program/blocked\.gif"#', $body)) {
+    if ($attachment = rcmail_save_image('program/blocked.gif', 'image/gif')) {
+      $_SESSION['compose']['attachments'][$attachment['id']] = $attachment;
+      $body = preg_replace('#\./program/blocked\.gif#',
+        $RCMAIL->comm_path.'&_action=display-attachment&_file=rcmfile'.$attachment['id'],
+        $body);
+    }
+  }
+  
+  $HTML_MODE = $isHtml;
+  
+  return $body;
+}
+
+function rcmail_compose_body($attrib)
+{
+  global $RCMAIL, $CONFIG, $OUTPUT, $MESSAGE, $compose_mode, $LINE_LENGTH, $HTML_MODE, $MESSAGE_BODY;
+  
+  list($form_start, $form_end) = get_form_tags($attrib);
+  unset($attrib['form']);
+  
+  if (empty($attrib['id']))
+    $attrib['id'] = 'rcmComposeBody';
+
+  $attrib['name'] = '_message';
+
+  $isHtml = $HTML_MODE;
+  
   $out = $form_start ? "$form_start\n" : '';
 
   $saveid = new html_hiddenfield(array('name' => '_draft_saveid', 'value' => $compose_mode==RCUBE_COMPOSE_DRAFT ? str_replace(array('<','>'), "", $MESSAGE->headers->messageID) : ''));
@@ -450,9 +639,20 @@ function rcmail_compose_body($attrib)
   $out .= $msgtype->show();
 
   // If desired, set this textarea to be editable by TinyMCE
-  if ($isHtml) $attrib['class'] = 'mce_editor';
-  $textarea = new html_textarea($attrib);
-  $out .= $textarea->show($body);
+  if ($isHtml) {
+    $attrib['class'] = 'mce_editor';
+    $textarea = new html_textarea($attrib);
+    $out .= $textarea->show($MESSAGE_BODY);
+  }
+  else {
+    $textarea = new html_textarea($attrib);
+    $out .= $textarea->show('');
+    // quote plain text, inject into textarea
+    $table = get_html_translation_table(HTML_SPECIALCHARS);
+    $MESSAGE_BODY = strtr($MESSAGE_BODY, $table);
+    $out = substr($out, 0, -11) . $MESSAGE_BODY . '</textarea>';
+  }
+
   $out .= $form_end ? "\n$form_end" : '';
 
   $OUTPUT->set_env('composebody', $attrib['id']);
@@ -463,20 +663,40 @@ function rcmail_compose_body($attrib)
   // include GoogieSpell
   if (!empty($CONFIG['enable_spellcheck'])) {
 
-    $lang = strtolower(substr($_SESSION['language'], 0, 2));
-  
-    $spellcheck_langs = (array)$RCMAIL->config->get('spellcheck_languages', array('da'=>'Dansk', 'de'=>'Deutsch', 'en' => 'English', 'es'=>'Español', 'fr'=>'Français', 'it'=>'Italiano', 'nl'=>'Nederlands', 'pl'=>'Polski', 'pt'=>'Português', 'fi'=>'Suomi', 'sv'=>'Svenska'));
+    $engine = $RCMAIL->config->get('spellcheck_engine','googie');
+    $spellcheck_langs = (array) $RCMAIL->config->get('spellcheck_languages',
+      array('da'=>'Dansk', 'de'=>'Deutsch', 'en' => 'English', 'es'=>'Español',
+            'fr'=>'Français', 'it'=>'Italiano', 'nl'=>'Nederlands', 'pl'=>'Polski',
+            'pt'=>'Português', 'fi'=>'Suomi', 'sv'=>'Svenska'));
+
+    // googie works only with two-letter codes
+    if ($engine == 'googie') {
+      $lang = strtolower(substr($_SESSION['language'], 0, 2));
+
+      $spellcheck_langs_googie = array();
+      foreach ($spellcheck_langs as $key => $name)
+        $spellcheck_langs_googie[strtolower(substr($key,0,2))] = $name;
+        $spellcheck_langs = $spellcheck_langs_googie;
+    }
+    else {
+      $lang = $_SESSION['language'];
+
+      // if not found in the list, try with two-letter code
+      if (!$spellcheck_langs[$lang])
+        $lang = strtolower(substr($lang, 0, 2));
+    }
+
     if (!$spellcheck_langs[$lang])
       $lang = 'en';
-    
+
     $editor_lang_set = array();
     foreach ($spellcheck_langs as $key => $name) {
       $editor_lang_set[] = ($key == $lang ? '+' : '') . JQ($name).'='.JQ($key);
-      }
+    }
     
     $OUTPUT->include_script('googiespell.js');
     $OUTPUT->add_script(sprintf(
-      "var googie = new GoogieSpell('\$__skin_path/images/googiespell/','%s&_action=spell&lang=');\n".
+      "var googie = new GoogieSpell('\$__skin_path/images/googiespell/','?_task=utils&_action=spell&lang=');\n".
       "googie.lang_chck_spell = \"%s\";\n".
       "googie.lang_rsm_edt = \"%s\";\n".
       "googie.lang_close = \"%s\";\n".
@@ -487,7 +707,6 @@ function rcmail_compose_body($attrib)
       "googie.setSpellContainer('spellcheck-control');\n".
       "googie.decorateTextarea('%s');\n".
       "%s.set_env('spellcheck', googie);",
-      $RCMAIL->comm_path,
       JQ(Q(rcube_label('checkspelling'))),
       JQ(Q(rcube_label('resumeediting'))),
       JQ(Q(rcube_label('close'))),
@@ -510,46 +729,30 @@ function rcmail_compose_body($attrib)
 
 function rcmail_create_reply_body($body, $bodyIsHtml)
 {
-  global $IMAP, $MESSAGE, $OUTPUT;
-
-  if (! $bodyIsHtml)
-  {
-    // try to remove the signature
-    if (($sp = strrpos($body, '-- ')) !== false && ($sp == 0 || $body{$sp-1} == "\n"))
-      {
-      if ($body{$sp+3}==' ' || $body{$sp+3}=="\n" || $body{$sp+3}=="\r")
-        $body = substr($body, 0, max(0, $sp-1));
-      }
-
-    // soft-wrap message first
-    $body = rcmail_wrap_quoted($body, 75);
+  global $RCMAIL, $MESSAGE, $LINE_LENGTH;
 
-    $body = rtrim($body, "\r\n");
+  // build reply prefix
+  $from = array_pop($RCMAIL->imap->decode_address_list($MESSAGE->get_header('from')));
+  $prefix = sprintf("On %s, %s wrote:",
+    $MESSAGE->headers->date, $from['name'] ? $from['name'] : idn_to_utf8($from['mailto']));
 
-    if ($body) {
-      // split body into single lines
-      $a_lines = preg_split('/\r?\n/', $body);
+  if (!$bodyIsHtml) {
+    $body = preg_replace('/\r?\n/', "\n", $body);
 
-      // add > to each line
-      for($n=0; $n<sizeof($a_lines); $n++) {
-        if (strpos($a_lines[$n], '>')===0)
-          $a_lines[$n] = '>'.$a_lines[$n];
-        else
-          $a_lines[$n] = '> '.$a_lines[$n];
-        }
-      $body = join("\n", $a_lines);
-      }
+    // try to remove the signature
+    if ($RCMAIL->config->get('strip_existing_sig', true))
+      $body = rcmail_remove_signature($body);
 
-    // add title line(s)
-    $prefix = rc_wordwrap(sprintf("On %s, %s wrote:\n",
-      $MESSAGE->headers->date,
-      $MESSAGE->get_header('from')), 76);
+    // soft-wrap and quote message text
+    $body = rcmail_wrap_and_quote(rtrim($body, "\n"), $LINE_LENGTH);
 
+    $prefix .= "\n";
     $suffix = '';
+
+    if ($RCMAIL->config->get('top_posting'))
+      $prefix = "\n\n\n" . $prefix;
   }
-  else
-  {
+  else {
     // save inline images to files
     $cid_map = rcmail_write_inline_attachments($MESSAGE);
     // set is_safe flag (we need this for html body washing)
@@ -558,11 +761,16 @@ function rcmail_create_reply_body($body, $bodyIsHtml)
     $body = rcmail_wash_html($body, array('safe' => $MESSAGE->is_safe), $cid_map);
 
     // build reply (quote content)
-    $prefix = sprintf("On %s, %s wrote:<br />\n",
-      $MESSAGE->headers->date,
-      htmlspecialchars(Q($MESSAGE->get_header('from'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset()));
-    $prefix .= '<blockquote type="cite" style="padding-left:5px; border-left:#1010ff 2px solid; margin-left:5px; width:100%">';
-    $suffix = "</blockquote><p></p>";
+    $prefix = '<p>' . Q($prefix) . "</p>\n";
+    $prefix .= '<blockquote>';
+
+    if ($RCMAIL->config->get('top_posting')) {
+      $prefix = '<br>' . $prefix;
+      $suffix = '</blockquote>';
+    }
+    else {
+      $suffix = '</blockquote><p></p>';
+    }
   }
 
   return $prefix.$body.$suffix;
@@ -584,8 +792,12 @@ function rcmail_create_forward_body($body, $bodyIsHtml)
     $prefix .= 'Date: ' . $MESSAGE->headers->date . "\n";
     $prefix .= 'From: ' . $MESSAGE->get_header('from') . "\n";
     $prefix .= 'To: ' . $MESSAGE->get_header('to') . "\n";
+
+    if ($MESSAGE->headers->cc)
+      $prefix .= 'Cc: ' . $MESSAGE->get_header('cc') . "\n";
     if ($MESSAGE->headers->replyto && $MESSAGE->headers->replyto != $MESSAGE->headers->from)
       $prefix .= 'Reply-To: ' . $MESSAGE->get_header('replyto') . "\n";
+
     $prefix .= "\n";
   }
   else
@@ -596,7 +808,7 @@ function rcmail_create_forward_body($body, $bodyIsHtml)
     $body = rcmail_wash_html($body, array('safe' => $MESSAGE->is_safe), $cid_map);
 
     $prefix = sprintf(
-      "<br><br>-------- Original Message --------" .
+      "<br /><p>-------- Original Message --------</p>" .
         "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody>" .
         "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Subject: </th><td>%s</td></tr>" .
         "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Date: </th><td>%s</td></tr>" .
@@ -607,6 +819,10 @@ function rcmail_create_forward_body($body, $bodyIsHtml)
       htmlspecialchars(Q($MESSAGE->get_header('from'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset()),
       htmlspecialchars(Q($MESSAGE->get_header('to'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset()));
 
+    if ($MESSAGE->headers->cc)
+      $prefix .= sprintf("<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Cc: </th><td>%s</td></tr>",
+        htmlspecialchars(Q($MESSAGE->get_header('cc'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset()));
+
     if ($MESSAGE->headers->replyto && $MESSAGE->headers->replyto != $MESSAGE->headers->from)
       $prefix .= sprintf("<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Reply-To: </th><td>%s</td></tr>",
         htmlspecialchars(Q($MESSAGE->get_header('replyto'), 'replace'), ENT_COMPAT, $OUTPUT->get_charset()));
@@ -639,22 +855,60 @@ function rcmail_create_draft_body($body, $bodyIsHtml)
   
   return $body;
 }
-  
-  
+
+
+function rcmail_remove_signature($body)
+{
+  global $RCMAIL;
+
+  $len = strlen($body);
+  $sig_max_lines = $RCMAIL->config->get('sig_max_lines', 15);
+
+  while (($sp = strrpos($body, "-- \n", $sp ? -$len+$sp-1 : 0)) !== false) {
+    if ($sp == 0 || $body[$sp-1] == "\n") {
+      // do not touch blocks with more that X lines
+      if (substr_count($body, "\n", $sp) < $sig_max_lines) {
+        $body = substr($body, 0, max(0, $sp-1));
+      }
+      break;
+    }
+  }
+
+  return $body;
+}
+
+
 function rcmail_write_compose_attachments(&$message, $bodyIsHtml)
 {
-  global $OUTPUT;
+  global $RCMAIL;
 
-  $cid_map = array();
+  $cid_map = $messages = array();
   foreach ((array)$message->mime_parts as $pid => $part)
   {
     if (($part->ctype_primary != 'message' || !$bodyIsHtml) && $part->ctype_primary != 'multipart' && 
-        ($part->disposition == 'attachment' || ($part->disposition == 'inline' && $bodyIsHtml) || $part->filename))
-    {
-      if ($attachment = rcmail_save_attachment($message, $pid)) {
+        ($part->disposition == 'attachment' || ($part->disposition == 'inline' && $bodyIsHtml) || $part->filename)
+        && $part->mimetype != 'application/ms-tnef'
+    ) {
+      $skip = false;
+      if ($part->mimetype == 'message/rfc822') {
+        $messages[] = $part->mime_id;
+      } else if ($messages) {
+        // skip attachments included in message/rfc822 attachment (#1486487)
+        foreach ($messages as $mimeid)
+          if (strpos($part->mime_id, $mimeid.'.') === 0) {
+            $skip = true;
+            break;
+          }
+      }
+
+      if (!$skip && ($attachment = rcmail_save_attachment($message, $pid))) {
         $_SESSION['compose']['attachments'][$attachment['id']] = $attachment;
-        if ($bodyIsHtml && $part->content_id) {
-          $cid_map['cid:'.$part->content_id] = $OUTPUT->app->comm_path.'&_action=display-attachment&_file=rcmfile'.$attachment['id'];
+        if ($bodyIsHtml && ($part->content_id || $part->content_location)) {
+          $url = $RCMAIL->comm_path.'&_action=display-attachment&_file=rcmfile'.$attachment['id'];
+          if ($part->content_id)
+            $cid_map['cid:'.$part->content_id] = $url;
+          else
+            $cid_map[$part->content_location] = $url;
         }
       }
     }
@@ -668,18 +922,22 @@ function rcmail_write_compose_attachments(&$message, $bodyIsHtml)
 
 function rcmail_write_inline_attachments(&$message)
 {
-  global $OUTPUT;
+  global $RCMAIL;
 
   $cid_map = array();
   foreach ((array)$message->mime_parts as $pid => $part) {
-    if ($part->content_id && $part->filename) {
+    if (($part->content_id || $part->content_location) && $part->filename) {
       if ($attachment = rcmail_save_attachment($message, $pid)) {
         $_SESSION['compose']['attachments'][$attachment['id']] = $attachment;
-        $cid_map['cid:'.$part->content_id] = $OUTPUT->app->comm_path.'&_action=display-attachment&_file=rcmfile'.$attachment['id'];
+        $url = $RCMAIL->comm_path.'&_action=display-attachment&_file=rcmfile'.$attachment['id'];
+        if ($part->content_id)
+          $cid_map['cid:'.$part->content_id] = $url;
+        else
+          $cid_map[$part->content_location] = $url;
       }
     }
   }
-  
+
   return $cid_map;
 }
 
@@ -709,10 +967,11 @@ function rcmail_save_attachment(&$message, $pid)
     'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary,
     'content_id' => $part->content_id,
     'data' => $data,
-    'path' => $path
+    'path' => $path,
+    'size' => $path ? filesize($path) : strlen($data),
   );
-  
-  $attachment = rcmail::get_instance()->plugins->exec_hook('save_attachment', $attachment);
+
+  $attachment = rcmail::get_instance()->plugins->exec_hook('attachment_save', $attachment);
 
   if ($attachment['status']) {
     unset($attachment['data'], $attachment['status'], $attachment['content_id'], $attachment['abort']);
@@ -724,6 +983,37 @@ function rcmail_save_attachment(&$message, $pid)
   return false;
 }
 
+function rcmail_save_image($path, $mimetype='')
+{
+  // handle attachments in memory
+  $data = file_get_contents($path);
+
+  $attachment = array(
+    'name' => rcmail_basename($path),
+    'mimetype' => $mimetype ? $mimetype : rc_mime_content_type($path, $name),
+    'data' => $data,
+    'size' => strlen($data),
+  );
+
+  $attachment = rcmail::get_instance()->plugins->exec_hook('attachment_save', $attachment);
+
+  if ($attachment['status']) {
+    unset($attachment['data'], $attachment['status'], $attachment['content_id'], $attachment['abort']);
+    return $attachment;
+  }
+  
+  return false;
+}
+
+function rcmail_basename($filename)
+{
+  // basename() is not unicode safe and locale dependent
+  if (stristr(PHP_OS, 'win') || stristr(PHP_OS, 'netware')) {
+    return preg_replace('/^.*[\\\\\\/]/', '', $filename);
+  } else {
+    return preg_replace('/^.*[\/]/', '', $filename);
+  }
+}
 
 function rcmail_compose_subject($attrib)
 {
@@ -767,7 +1057,7 @@ function rcmail_compose_subject($attrib)
   $out = $form_start ? "$form_start\n" : '';
   $out .= $textfield->show($subject);
   $out .= $form_end ? "\n$form_end" : '';
-         
+
   return $out;
 }
 
@@ -782,7 +1072,7 @@ function rcmail_compose_attachment_list($attrib)
   
   $out = "\n";
   $jslist = array();
-  
+
   if (is_array($_SESSION['compose']['attachments']))
   {
     if ($attrib['deleteicon']) {
@@ -842,11 +1132,11 @@ function rcmail_compose_attachment_form($attrib)
   $button = new html_inputfield(array('type' => 'button'));
   
   $out = html::div($attrib,
-    $OUTPUT->form_tag(array('name' => 'form', 'method' => 'post', 'enctype' => 'multipart/form-data'),
+    $OUTPUT->form_tag(array('name' => 'uploadform', 'method' => 'post', 'enctype' => 'multipart/form-data'),
       html::div(null, rcmail_compose_attachment_field(array('size' => $attrib[attachmentfieldsize]))) .
       html::div('hint', rcube_label(array('name' => 'maxuploadsize', 'vars' => array('size' => $max_filesize)))) .
       html::div('buttons',
-        $button->show(rcube_label('close'), array('class' => 'button', 'onclick' => "document.getElementById('$attrib[id]').style.visibility='hidden'")) . ' ' .
+        $button->show(rcube_label('close'), array('class' => 'button', 'onclick' => "$('#$attrib[id]').hide()")) . ' ' .
         $button->show(rcube_label('upload'), array('class' => 'button mainaction', 'onclick' => JS_OBJECT_NAME . ".command('send-attachment', this.form)"))
       )
     )
@@ -872,7 +1162,7 @@ function rcmail_priority_selector($attrib)
   
   list($form_start, $form_end) = get_form_tags($attrib);
   unset($attrib['form']);
-  
+
   $attrib['name'] = '_priority';
   $selector = new html_select($attrib);
 
@@ -882,7 +1172,7 @@ function rcmail_priority_selector($attrib)
                        rcube_label('high'),
                        rcube_label('highest')),
                  array(5, 4, 0, 2, 1));
-                 
+
   if (isset($_POST['_priority']))
     $sel = $_POST['_priority'];
   else if (intval($MESSAGE->headers->priority) != 3)
@@ -893,18 +1183,18 @@ function rcmail_priority_selector($attrib)
   $out = $form_start ? "$form_start\n" : '';
   $out .= $selector->show($sel);
   $out .= $form_end ? "\n$form_end" : '';
-         
+
   return $out;
 }
 
 
 function rcmail_receipt_checkbox($attrib)
 {
-  global $MESSAGE, $compose_mode;
-  
+  global $RCMAIL, $MESSAGE, $compose_mode;
+
   list($form_start, $form_end) = get_form_tags($attrib);
   unset($attrib['form']);
-  
+
   if (!isset($attrib['id']))
     $attrib['id'] = 'receipt';  
 
@@ -912,9 +1202,35 @@ function rcmail_receipt_checkbox($attrib)
   $attrib['value'] = '1';
   $checkbox = new html_checkbox($attrib);
 
+  if ($MESSAGE && in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT)))
+    $mdn_default = (bool) $MESSAGE->headers->mdn_to;
+  else
+    $mdn_default = $RCMAIL->config->get('mdn_default');
+
+  $out = $form_start ? "$form_start\n" : '';
+  $out .= $checkbox->show($mdn_default);
+  $out .= $form_end ? "\n$form_end" : '';
+
+  return $out;
+}
+
+
+function rcmail_dsn_checkbox($attrib)
+{
+  global $RCMAIL;
+
+  list($form_start, $form_end) = get_form_tags($attrib);
+  unset($attrib['form']);
+
+  if (!isset($attrib['id']))
+    $attrib['id'] = 'dsn';
+
+  $attrib['name'] = '_dsn';
+  $attrib['value'] = '1';
+  $checkbox = new html_checkbox($attrib);
+
   $out = $form_start ? "$form_start\n" : '';
-  $out .= $checkbox->show(in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT))
-       && $MESSAGE->headers->mdn_to ? 1 : 0);
+  $out .= $checkbox->show($RCMAIL->config->get('dsn_default'));
   $out .= $form_end ? "\n$form_end" : '';
 
   return $out;
@@ -926,19 +1242,15 @@ function rcmail_editor_selector($attrib)
   global $CONFIG, $MESSAGE, $compose_mode;
 
   // determine whether HTML or plain text should be checked
-  if ($compose_mode)
-    $useHtml = (($CONFIG['htmleditor'] || $compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT)
-       && $MESSAGE->has_html_part());
-  else
-    $useHtml = $CONFIG['htmleditor'] ? true : false;
+  $useHtml = rcmail_compose_editor_mode();
 
   if (empty($attrib['editorid']))
     $attrib['editorid'] = 'rcmComposeBody';
 
   if (empty($attrib['name']))
     $attrib['name'] = 'editorSelect';
-    
-  $attrib['onchange'] = "return rcmail_toggle_editor(this.value=='html', '".$attrib['editorid']."', '_is_html')";
+
+  $attrib['onchange'] = "return rcmail_toggle_editor(this, '".$attrib['editorid']."', '_is_html')";
 
   $select = new html_select($attrib);
 
@@ -947,8 +1259,7 @@ function rcmail_editor_selector($attrib)
 
   return $select->show($useHtml ? 'html' : 'plain');
 
-  foreach ($choices as $value => $text)
-  {
+  foreach ($choices as $value => $text) {
     $attrib['id'] = '_' . $value;
     $attrib['value'] = $value;
     $selector .= $radio->show($chosenvalue, $attrib) . html::label($attrib['id'], Q(rcube_label($text)));
@@ -962,7 +1273,27 @@ function rcmail_store_target_selection($attrib)
 {
   $attrib['name'] = '_store_target';
   $select = rcmail_mailbox_select(array_merge($attrib, array('noselection' => '- '.rcube_label('dontsave').' -')));
-  return $select->show(rcmail::get_instance()->config->get('sent_mbox'), $attrib);
+  return $select->show($_SESSION['compose']['param']['sent_mbox'], $attrib);
+}
+
+
+function rcmail_check_sent_folder($folder, $create=false)
+{
+  global $IMAP;
+
+  if ($IMAP->mailbox_exists($folder, true)) {
+    return true;
+  }
+
+  // folder may exist but isn't subscribed (#1485241)
+  if ($create) {
+    if (!$IMAP->mailbox_exists($folder))
+      return $IMAP->create_mailbox($folder, true);
+    else
+      return $IMAP->subscribe($folder);
+  }
+
+  return false;
 }
 
 
@@ -971,7 +1302,7 @@ function get_form_tags($attrib)
   global $RCMAIL, $MESSAGE_FORM;
 
   $form_start = '';
-  if (!strlen($MESSAGE_FORM))
+  if (!$MESSAGE_FORM)
   {
     $hiddenfields = new html_hiddenfield(array('name' => '_task', 'value' => $RCMAIL->task));
     $hiddenfields->add(array('name' => '_action', 'value' => 'send'));
@@ -979,13 +1310,13 @@ function get_form_tags($attrib)
     $form_start = empty($attrib['form']) ? $RCMAIL->output->form_tag(array('name' => "form", 'method' => "post")) : '';
     $form_start .= $hiddenfields->show();
   }
-    
-  $form_end = (strlen($MESSAGE_FORM) && !strlen($attrib['form'])) ? '</form>' : '';
+
+  $form_end = ($MESSAGE_FORM && !strlen($attrib['form'])) ? '</form>' : '';
   $form_name = !empty($attrib['form']) ? $attrib['form'] : 'form';
-  
-  if (!strlen($MESSAGE_FORM))
+
+  if (!$MESSAGE_FORM)
     $RCMAIL->output->add_gui_object('messageform', $form_name);
-  
+
   $MESSAGE_FORM = $form_name;
 
   return array($form_start, $form_end);
@@ -1003,9 +1334,10 @@ $OUTPUT->add_handlers(array(
   'priorityselector' => 'rcmail_priority_selector',
   'editorselector' => 'rcmail_editor_selector',
   'receiptcheckbox' => 'rcmail_receipt_checkbox',
+  'dsncheckbox' => 'rcmail_dsn_checkbox',
   'storetarget' => 'rcmail_store_target_selection',
 ));
 
 $OUTPUT->send('compose');
 
-?>
+
diff --git a/program/steps/mail/copy.inc b/program/steps/mail/copy.inc
new file mode 100644 (file)
index 0000000..baebad3
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/mail/copy.inc                                           |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Copy the submitted messages to a specific mailbox                   |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
+ +-----------------------------------------------------------------------+
+
+ $Id: copy.inc 4321 2010-12-08 12:52:04Z alec $
+
+*/
+
+// only process ajax requests
+if (!$OUTPUT->ajax_call)
+  return;
+
+// move messages
+if (!empty($_POST['_uid']) && !empty($_POST['_target_mbox'])) {
+    $uids = get_input_value('_uid', RCUBE_INPUT_POST);
+    $target = get_input_value('_target_mbox', RCUBE_INPUT_POST, true);
+    $mbox = get_input_value('_mbox', RCUBE_INPUT_POST, true);
+
+    $copied = $IMAP->copy_message($uids, $target, $mbox);
+
+    if (!$copied) {
+        // send error message
+        rcmail_display_server_error('errorcopying');
+        $OUTPUT->send();
+        exit;
+    }
+    else {
+        $OUTPUT->show_message('messagecopied', 'confirmation');
+    }
+
+    rcmail_send_unread_count($target, true);
+
+    $OUTPUT->command('set_quota', rcmail_quota_content());
+}
+// unknown action or missing query param
+else {
+    exit;
+}
+
+// send response
+$OUTPUT->send();
index 4e731d0b1145fbb9d06c1e223cc77dd653387997..5879afb9444eacc4bed57fb316565f6835f4f252 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/folders.inc                                        |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: folders.inc 2959 2009-09-17 12:07:58Z alec $
+ $Id: folders.inc 4321 2010-12-08 12:52:04Z alec $
 */
 
 // only process ajax requests
 if (!$OUTPUT->ajax_call)
-  return;
+    return;
 
-$mbox_name = $IMAP->get_mailbox_name();
+$mbox = get_input_value('_mbox', RCUBE_INPUT_POST, true);
 
 // send EXPUNGE command
-if ($RCMAIL->action=='expunge' && ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST)))
-{
-  $success = $IMAP->expunge($mbox);
+if ($RCMAIL->action == 'expunge') {
 
-  // reload message list if current mailbox  
-  if ($success && !empty($_REQUEST['_reload']))
-  {
-    $OUTPUT->command('message_list.clear');
-    $RCMAIL->action = 'list';
-    return;
-  }
-  else
-    $commands = "// expunged: $success\n";
+    $success = $IMAP->expunge($mbox);
+
+    // reload message list if current mailbox
+    if ($success) {
+        $OUTPUT->show_message('folderexpunged', 'confirmation');
+
+        if (!empty($_REQUEST['_reload'])) {
+            $OUTPUT->command('set_quota', rcmail_quota_content());
+            $OUTPUT->command('message_list.clear');
+            $RCMAIL->action = 'list';
+            return;
+        }
+    }
+    else {
+        rcmail_display_server_error();
+    }
 }
 
 // clear mailbox
-else if ($RCMAIL->action=='purge' && ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST)))
+else if ($RCMAIL->action == 'purge')
 {
-  $delimiter = $IMAP->get_hierarchy_delimiter();
-  $trash_regexp = '/^' . preg_quote($CONFIG['trash_mbox'] . $delimiter, '/') . '/';
-  $junk_regexp = '/^' . preg_quote($CONFIG['junk_mbox'] . $delimiter, '/') . '/';                    
+    $delimiter = $IMAP->get_hierarchy_delimiter();
+    $trash_regexp = '/^' . preg_quote($CONFIG['trash_mbox'] . $delimiter, '/') . '/';
+    $junk_regexp  = '/^' . preg_quote($CONFIG['junk_mbox'] . $delimiter, '/') . '/';
+
+    // we should only be purging trash and junk (or their subfolders)
+    if ($mbox == $CONFIG['trash_mbox'] || $mbox == $CONFIG['junk_mbox']
+        || preg_match($trash_regexp, $mbox) || preg_match($junk_regexp, $mbox)
+    ) {
+        $success = $IMAP->clear_mailbox($mbox);
 
-  // we should only be purging trash and junk (or their subfolders)
-  if ($mbox == $CONFIG['trash_mbox'] || $mbox == $CONFIG['junk_mbox']
-    || preg_match($trash_regexp, $mbox) || preg_match($junk_regexp, $mbox))
-  {
-    $success = $IMAP->clear_mailbox($mbox);
-  
-    if ($success && !empty($_REQUEST['_reload']))
-    {
-      $OUTPUT->set_env('messagecount', 0);
-      $OUTPUT->set_env('pagecount', 0);
-      $OUTPUT->command('message_list.clear');
-      $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text());
-      $OUTPUT->command('set_unread_count', $mbox_name, 0);
-      $_SESSION['unseen_count'][$mbox_name] = 0;
+        if ($success) {
+            $OUTPUT->show_message('folderpurged', 'confirmation');
+
+            if (!empty($_REQUEST['_reload'])) {
+                $OUTPUT->set_env('messagecount', 0);
+                $OUTPUT->set_env('pagecount', 0);
+                $OUTPUT->command('message_list.clear');
+                $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text());
+                $OUTPUT->command('set_unread_count', $mbox, 0);
+                $OUTPUT->command('set_quota', rcmail_quota_content());
+                rcmail_set_unseen_count($mbox, 0);
+            }
+        }
+        else {
+            rcmail_display_server_error();
+        }
     }
-    else
-      $commands = "// purged: $success";
-  }
 }
 
-$OUTPUT->send($commands);
-
-?>
+$OUTPUT->send();
index 2f9060a561632bdfd9708681717097aba2b6bf56..3d4572d1f6e1a19422008f32c2e00a114591d576 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/func.inc                                           |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: func.inc 3058 2009-10-24 19:09:23Z alec $
+ $Id: func.inc 4389 2011-01-04 11:16:54Z alec $
 
 */
 
-$EMAIL_ADDRESS_PATTERN = '([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9][a-z0-9\-\.]*\\.[a-z]{2,5})';
+// setup some global vars used by mail steps
+$SENT_MBOX = $RCMAIL->config->get('sent_mbox');
+$DRAFTS_MBOX = $RCMAIL->config->get('drafts_mbox');
+$SEARCH_MODS_DEFAULT = array('*' => array('subject'=>1, 'from'=>1), $SENT_MBOX => array('subject'=>1, 'to'=>1), $DRAFTS_MBOX => array('subject'=>1, 'to'=>1));
 
-// actions that do not require imap connection
-$NOIMAP_ACTIONS = array('spell', 'addcontact', 'autocomplete', 'upload', 'display-attachment', 'remove-attachment');
+// Simplified for IDN in Unicode
+//$EMAIL_ADDRESS_PATTERN = '([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9][a-z0-9\-\.]*\\.[a-z]{2,5})';
+$EMAIL_ADDRESS_PATTERN = '([a-z0-9][a-z0-9\-\.\+\_]*@[^&@"\'.][^@&"\']*\\.[a-z]{2,5})';
 
+// actions that do not require imap connection here
+$NOIMAP_ACTIONS = array('addcontact', 'autocomplete', 'upload', 'display-attachment', 'remove-attachment', 'get');
+
+// always instantiate imap object (but not yet connect to server)
+$RCMAIL->imap_init();
 
 // log in to imap server
 if (!in_array($RCMAIL->action, $NOIMAP_ACTIONS) && !$RCMAIL->imap_connect()) {
@@ -36,11 +45,10 @@ if (!in_array($RCMAIL->action, $NOIMAP_ACTIONS) && !$RCMAIL->imap_connect()) {
   $OUTPUT->send('login');
 }
 
-
 // set imap properties and session vars
-if ($mbox = get_input_value('_mbox', RCUBE_INPUT_GPC))
+if (strlen(trim($mbox = get_input_value('_mbox', RCUBE_INPUT_GPC, true))))
   $IMAP->set_mailbox(($_SESSION['mbox'] = $mbox));
-else
+else if ($IMAP)
   $_SESSION['mbox'] = $IMAP->get_mailbox_name();
 
 if (!empty($_GET['_page']))
@@ -52,40 +60,52 @@ if (!isset($_SESSION['sort_col']))
 if (!isset($_SESSION['sort_order']))
   $_SESSION['sort_order'] = $CONFIG['message_sort_order'];
 
+// set threads mode
+$a_threading = $RCMAIL->config->get('message_threading', array());
+if (isset($_GET['_threads'])) {
+  if ($_GET['_threads'])
+    $a_threading[$_SESSION['mbox']] = true;
+  else
+    unset($a_threading[$_SESSION['mbox']]);
+  $RCMAIL->user->save_prefs(array('message_threading' => $a_threading));
+}
+$IMAP->set_threading($a_threading[$_SESSION['mbox']]);
+
 // set message set for search result
-if (!empty($_REQUEST['_search']) && isset($_SESSION['search'][$_REQUEST['_search']]))
-  {
-  $IMAP->set_search_set($_SESSION['search'][$_REQUEST['_search']]);
+if (!empty($_REQUEST['_search']) && isset($_SESSION['search'])
+    && $_SESSION['search_request'] == $_REQUEST['_search']
+) {
+  $IMAP->set_search_set($_SESSION['search']);
   $OUTPUT->set_env('search_request', $_REQUEST['_search']);
   $OUTPUT->set_env('search_text', $_SESSION['last_text_search']);
-  }
+}
 
 // set main env variables, labels and page title
-if (empty($RCMAIL->action) || $RCMAIL->action == 'list')
-  {
+if (empty($RCMAIL->action) || $RCMAIL->action == 'list') {
   $mbox_name = $IMAP->get_mailbox_name();
 
-  if (empty($RCMAIL->action))
-    {
+  if (empty($RCMAIL->action)) {
     // initialize searching result if search_filter is used
-    if ($_SESSION['search_filter'] && $_SESSION['search_filter'] != 'ALL')
-      {
+    if ($_SESSION['search_filter'] && $_SESSION['search_filter'] != 'ALL') {
       $search_request = md5($mbox_name.$_SESSION['search_filter']);
-  
+
       $IMAP->search($mbox_name, $_SESSION['search_filter'], RCMAIL_CHARSET, $_SESSION['sort_col']);
-      $_SESSION['search'][$search_request] = $IMAP->get_search_set();
+      $_SESSION['search'] = $IMAP->get_search_set();
+      $_SESSION['search_request'] = $search_request;
       $OUTPUT->set_env('search_request', $search_request);
       }
-    
-      $OUTPUT->set_env('search_mods', $_SESSION['search_mods'] ? $_SESSION['search_mods'] : array('subject'=>'subject'));
-      // make sure the message count is refreshed (for default view)
-      $IMAP->messagecount($mbox_name, 'ALL', true);
-    }
-       
-  // set current mailbox in client environment
+
+      $search_mods = $RCMAIL->config->get('search_mods', $SEARCH_MODS_DEFAULT);
+      $OUTPUT->set_env('search_mods', $search_mods);
+  }
+
+  // set current mailbox and some other vars in client environment
   $OUTPUT->set_env('mailbox', $mbox_name);
-  $OUTPUT->set_env('quota', $IMAP->get_capability('quota'));
+  $OUTPUT->set_env('pagesize', $IMAP->page_size);
+  $OUTPUT->set_env('quota', $IMAP->get_capability('QUOTA'));
   $OUTPUT->set_env('delimiter', $IMAP->get_hierarchy_delimiter());
+  $OUTPUT->set_env('threading', (bool) $IMAP->threading);
+  $OUTPUT->set_env('threads', $IMAP->threading || $IMAP->get_capability('THREAD'));
 
   if ($CONFIG['flag_for_deletion'])
     $OUTPUT->set_env('flag_for_deletion', true);
@@ -95,7 +115,9 @@ if (empty($RCMAIL->action) || $RCMAIL->action == 'list')
     $OUTPUT->set_env('skip_deleted', true);
   if ($CONFIG['display_next'])
     $OUTPUT->set_env('display_next', true);
-         
+
+  $OUTPUT->set_env('preview_pane_mark_read', $RCMAIL->config->get('preview_pane_mark_read', 0));
+
   if ($CONFIG['trash_mbox'])
     $OUTPUT->set_env('trash_mailbox', $CONFIG['trash_mbox']);
   if ($CONFIG['drafts_mbox'])
@@ -104,349 +126,177 @@ if (empty($RCMAIL->action) || $RCMAIL->action == 'list')
     $OUTPUT->set_env('junk_mailbox', $CONFIG['junk_mbox']);
 
   if (!$OUTPUT->ajax_call)
-    $OUTPUT->add_label('checkingmail', 'deletemessage', 'movemessagetotrash', 'movingmessage');
+    $OUTPUT->add_label('checkingmail', 'deletemessage', 'movemessagetotrash',
+      'movingmessage', 'copyingmessage', 'deletingmessage', 'markingmessage',
+      'copy', 'move', 'quota');
 
   $OUTPUT->set_pagetitle(rcmail_localize_foldername($mbox_name));
-  }
+}
 
 
 /**
  * return the message list as HTML table
  */
 function rcmail_message_list($attrib)
-  {
-  global $IMAP, $CONFIG, $COMM_PATH, $OUTPUT;
-
-  $skin_path = $CONFIG['skin_path'];
-  $image_tag = '<img src="%s%s" alt="%s" />';
+{
+  global $IMAP, $CONFIG, $OUTPUT;
 
-  // check to see if we have some settings for sorting
-  $sort_col   = $_SESSION['sort_col'];
-  $sort_order = $_SESSION['sort_order'];
-  
   // add some labels to client
   $OUTPUT->add_label('from', 'to');
 
-  // get message headers
-  $a_headers = $IMAP->list_headers('', '', $sort_col, $sort_order);
-
   // add id to message list table if not specified
   if (!strlen($attrib['id']))
     $attrib['id'] = 'rcubemessagelist';
 
-  // allow the following attributes to be added to the <table> tag
-  $attrib_str = create_attrib_string($attrib, array('style', 'class', 'id', 'cellpadding', 'cellspacing', 'border', 'summary'));
-
-  $out = '<table' . $attrib_str . ">\n";
-
   // define list of cols to be displayed based on parameter or config
-  if (empty($attrib['columns']))
-      $a_show_cols = is_array($CONFIG['list_cols']) ? $CONFIG['list_cols'] : array('subject');
-  else
-      $a_show_cols = preg_split('/[\s,;]+/', strip_quotes($attrib['columns']));
+  if (empty($attrib['columns'])) {
+    $a_show_cols = is_array($CONFIG['list_cols']) ? $CONFIG['list_cols'] : array('subject');
+    $OUTPUT->set_env('col_movable', !in_array('list_cols', (array)$CONFIG['dont_override']));
+  }
+  else {
+    $a_show_cols = preg_split('/[\s,;]+/', strip_quotes($attrib['columns']));
+    $attrib['columns'] = $a_show_cols;
+  }
 
-  // store column list in a session-variable
-  $_SESSION['list_columns'] = $a_show_cols;
-  
-  // define sortable columns
-  $a_sort_cols = array('subject', 'date', 'from', 'to', 'size');
+  // save some variables for use in ajax list
+  $_SESSION['list_attrib'] = $attrib;
 
   $mbox = $IMAP->get_mailbox_name();
   $delim = $IMAP->get_hierarchy_delimiter();
 
   // show 'to' instead of 'from' in sent/draft messages
   if ((strpos($mbox.$delim, $CONFIG['sent_mbox'].$delim)===0 || strpos($mbox.$delim, $CONFIG['drafts_mbox'].$delim)===0)
-      && ($f = array_search('from', $a_show_cols)) && !array_search('to', $a_show_cols))
+      && (($f = array_search('from', $a_show_cols)) !== false) && array_search('to', $a_show_cols) === false)
     $a_show_cols[$f] = 'to';
-  
-  // add col definition
-  $out .= '<colgroup>';
-  $out .= '<col class="icon" />';
-
-  foreach ($a_show_cols as $col)
-    $out .= ($col!='attachment') ? sprintf('<col class="%s" />', $col) : '<col class="icon" />';
 
-  $out .= "</colgroup>\n";
+  // make sure 'threads' and 'subject' columns are present
+  if (!in_array('subject', $a_show_cols))
+    array_unshift($a_show_cols, 'subject');
+  if (!in_array('threads', $a_show_cols))
+    array_unshift($a_show_cols, 'threads');
 
-  // add table title
-  $out .= "<thead><tr>\n<td class=\"icon\">&nbsp;</td>\n";
-
-  $javascript = '';
-  foreach ($a_show_cols as $col)
-    {
-    // get column name
-    switch ($col)
-      {
-      case 'flag':
-        $col_name = sprintf($image_tag, $skin_path, $attrib['unflaggedicon'], '');
-        break;
-      case 'attachment':
-        $col_name = sprintf($image_tag, $skin_path, $attrib['attachmenticon'], '');
-        break;
-      default:
-        $col_name = Q(rcube_label($col));
-    }
+  $skin_path = $_SESSION['skin_path'] = $CONFIG['skin_path'];
 
-    // make sort links
-    $sort = '';
-    if (in_array($col, $a_sort_cols))
-      {
-      // have buttons configured
-      if (!empty($attrib['sortdescbutton']) || !empty($attrib['sortascbutton']))
-        {
-        $sort = '&nbsp;&nbsp;';
-
-        // asc link
-        if (!empty($attrib['sortascbutton']))
-          {
-          $sort .= $OUTPUT->button(array(
-            'command' => 'sort',
-            'prop' => $col.'_ASC',
-            'image' => $attrib['sortascbutton'],
-            'align' => 'absmiddle',
-            'title' => 'sortasc'));
-          }       
-        
-        // desc link
-        if (!empty($attrib['sortdescbutton']))
-          {
-          $sort .= $OUTPUT->button(array(
-            'command' => 'sort',
-            'prop' => $col.'_DESC',
-            'image' => $attrib['sortdescbutton'],
-            'align' => 'absmiddle',
-            'title' => 'sortdesc'));
-          }
-        }
-      // just add a link tag to the header
-      else
-        {
-        $col_name = sprintf(
-          '<a href="./#sort" onclick="return %s.command(\'sort\',\'%s\',this)" title="%s">%s</a>',
-          JS_OBJECT_NAME,
-          $col,
-          rcube_label('sortby'),
-          $col_name);
-        }
-      }
-      
-    $sort_class = $col==$sort_col ? " sorted$sort_order" : '';
-
-    // put it all together
-    if ($col!='attachment')
-      $out .= '<td class="'.$col.$sort_class.'" id="rcm'.$col.'">' . "$col_name$sort</td>\n";
-    else    
-      $out .= '<td class="icon" id="rcm'.$col.'">' . "$col_name$sort</td>\n";
-    }
-
-  $out .= "</tr></thead>\n<tbody>\n";
-
-  // no messages in this mailbox
-  if (!sizeof($a_headers))
-    $OUTPUT->show_message('nomessagesfound', 'notice');
-
-  $a_js_message_arr = array();
-
-  // create row for each message
-  foreach ($a_headers as $i => $header)  //while (list($i, $header) = each($a_headers))
-    {
-    $message_icon = $attach_icon = $flagged_icon = '';
-    $js_row_arr = array();
-    $zebra_class = $i%2 ? ' even' : ' odd';
-
-    // set messag attributes to javascript array
-    if ($header->deleted)
-      $js_row_arr['deleted'] = true;
-    if (!$header->seen)
-      $js_row_arr['unread'] = true;
-    if ($header->answered)
-      $js_row_arr['replied'] = true;
-    if ($header->forwarded)
-      $js_row_arr['forwarded'] = true;
-    if ($header->flagged)
-      $js_row_arr['flagged'] = true;
-
-    // set message icon  
-    if ($attrib['deletedicon'] && $header->deleted)
-      $message_icon = $attrib['deletedicon'];
-    else if ($attrib['repliedicon'] && $header->answered)
-      {
-      if ($attrib['forwardedrepliedicon'] && $header->forwarded)
-        $message_icon = $attrib['forwardedrepliedicon'];
-      else
-        $message_icon = $attrib['repliedicon'];
-      }
-    else if ($attrib['forwardedicon'] && $header->forwarded)
-      $message_icon = $attrib['forwardedicon'];
-    else if ($attrib['unreadicon'] && !$header->seen)
-      $message_icon = $attrib['unreadicon'];
-    else if ($attrib['messageicon'])
-      $message_icon = $attrib['messageicon'];
-
-    if ($attrib['flaggedicon'] && $header->flagged)
-      $flagged_icon = $attrib['flaggedicon'];
-    else if ($attrib['unflaggedicon'] && !$header->flagged)
-      $flagged_icon = $attrib['unflaggedicon'];
-    
-    // set attachment icon
-    if ($attrib['attachmenticon'] && preg_match("/multipart\/m/i", $header->ctype))
-      $attach_icon = $attrib['attachmenticon'];
-        
-    $out .= sprintf('<tr id="rcmrow%d" class="message%s%s%s%s">'."\n",
-                    $header->uid,
-                    $header->seen ? '' : ' unread',
-                    $header->deleted ? ' deleted' : '',
-                    $header->flagged ? ' flagged' : '',
-                    $zebra_class);
-    
-    $out .= sprintf("<td class=\"icon\">%s</td>\n", $message_icon ? sprintf($image_tag, $skin_path, $message_icon, '') : '');
-
-    $IMAP->set_charset(!empty($header->charset) ? $header->charset : $CONFIG['default_charset']);
-  
-    // format each col
-    foreach ($a_show_cols as $col)
-      {
-      if ($col=='from' || $col=='to')
-        $cont = Q(rcmail_address_string($header->$col, 3, false, $attrib['addicon']), 'show');
-      else if ($col=='subject')
-        {
-        $action = $mbox==$CONFIG['drafts_mbox'] ? 'compose' : 'show';
-        $uid_param = $mbox==$CONFIG['drafts_mbox'] ? '_draft_uid' : '_uid';
-        $cont = abbreviate_string(trim($IMAP->decode_header($header->$col)), 160);
-        if (empty($cont)) $cont = rcube_label('nosubject');
-        $cont = $OUTPUT->browser->ie ? Q($cont) : sprintf('<a href="%s" onclick="return rcube_event.cancel(event)">%s</a>', Q(rcmail_url($action, array($uid_param=>$header->uid, '_mbox'=>$mbox))), Q($cont));
-        }
-      else if ($col=='flag')
-        $cont = $flagged_icon ? sprintf($image_tag, $skin_path, $flagged_icon, '') : '';
-      else if ($col=='size')
-        $cont = show_bytes($header->$col);
-      else if ($col=='date')
-        $cont = format_date($header->date);
-      else
-        $cont = Q($header->$col);
-        
-      if ($col!='attachment')
-        $out .= '<td class="'.$col.'">' . $cont . "</td>\n";
-      else
-        $out .= sprintf("<td class=\"icon\">%s</td>\n", $attach_icon ? sprintf($image_tag, $skin_path, $attach_icon, '') : '&nbsp;');
-      }
-
-    $out .= "</tr>\n";
-    
-    if (sizeof($js_row_arr))
-      $a_js_message_arr[$header->uid] = $js_row_arr;
-    }
-  
-  // complete message table
-  $out .= "</tbody></table>\n";
-  
-  $message_count = $IMAP->messagecount();
-  
   // set client env
-  $OUTPUT->add_gui_object('mailcontframe', 'mailcontframe');
   $OUTPUT->add_gui_object('messagelist', $attrib['id']);
-  $OUTPUT->set_env('messagecount', $message_count);
-  $OUTPUT->set_env('current_page', $IMAP->list_page);
-  $OUTPUT->set_env('pagecount', ceil($message_count/$IMAP->page_size));
-  $OUTPUT->set_env('sort_col', $sort_col);
-  $OUTPUT->set_env('sort_order', $sort_order);
-  
-  if ($attrib['messageicon'])
-    $OUTPUT->set_env('messageicon', $skin_path . $attrib['messageicon']);
-  if ($attrib['deletedicon'])
-    $OUTPUT->set_env('deletedicon', $skin_path . $attrib['deletedicon']);
-  if ($attrib['unreadicon'])
-    $OUTPUT->set_env('unreadicon', $skin_path . $attrib['unreadicon']);
-  if ($attrib['repliedicon'])
-    $OUTPUT->set_env('repliedicon', $skin_path . $attrib['repliedicon']);
-  if ($attrib['forwardedicon'])
-    $OUTPUT->set_env('forwardedicon', $skin_path . $attrib['forwardedicon']);
-  if ($attrib['forwardedrepliedicon'])
-    $OUTPUT->set_env('forwardedrepliedicon', $skin_path . $attrib['forwardedrepliedicon']);
-  if ($attrib['attachmenticon'])
-    $OUTPUT->set_env('attachmenticon', $skin_path . $attrib['attachmenticon']);
-  if ($attrib['flaggedicon'])
-    $OUTPUT->set_env('flaggedicon', $skin_path . $attrib['flaggedicon']);
-  if ($attrib['unflaggedicon'])
-    $OUTPUT->set_env('unflaggedicon', $skin_path . $attrib['unflaggedicon']);
-  
-  $OUTPUT->set_env('messages', $a_js_message_arr);
+  $OUTPUT->set_env('autoexpand_threads', intval($CONFIG['autoexpand_threads']));
+  $OUTPUT->set_env('sort_col', $_SESSION['sort_col']);
+  $OUTPUT->set_env('sort_order', $_SESSION['sort_order']);
+  $OUTPUT->set_env('messages', array());
   $OUTPUT->set_env('coltypes', $a_show_cols);
-  
+
   $OUTPUT->include_script('list.js');
-  
-  return $out;
-  }
+
+  $thead = '';
+  foreach (rcmail_message_list_head($attrib, $a_show_cols) as $cell)
+    $thead .= html::tag('td', array('class' => $cell['className'], 'id' => $cell['id']), $cell['html']);
+
+  return html::tag('table',
+    $attrib,
+    html::tag('thead', null, html::tag('tr', null, $thead)) .
+      html::tag('tbody', null, ''),
+        array('style', 'class', 'id', 'cellpadding', 'cellspacing', 'border', 'summary'));
+}
 
 
 /**
  * return javascript commands to add rows to the message list
- * or to replace the whole list (IE only)
  */
-function rcmail_js_message_list($a_headers, $insert_top=FALSE, $replace=TRUE)
-  {
-  global $CONFIG, $IMAP, $OUTPUT;
+function rcmail_js_message_list($a_headers, $insert_top=FALSE, $a_show_cols=null)
+{
+  global $CONFIG, $IMAP, $RCMAIL, $OUTPUT;
 
-  if (empty($_SESSION['list_columns']))
-    $a_show_cols = is_array($CONFIG['list_cols']) ? $CONFIG['list_cols'] : array('subject');
-  else
-    $a_show_cols = $_SESSION['list_columns'];
+  if (empty($a_show_cols)) {
+    if (!empty($_SESSION['list_attrib']['columns']))
+      $a_show_cols = $_SESSION['list_attrib']['columns'];
+    else
+      $a_show_cols = is_array($CONFIG['list_cols']) ? $CONFIG['list_cols'] : array('subject');
+  }
+  else {
+    if (!is_array($a_show_cols))
+      $a_show_cols = preg_split('/[\s,;]+/', strip_quotes($a_show_cols));
+    $head_replace = true;
+  }
 
   $mbox = $IMAP->get_mailbox_name();
   $delim = $IMAP->get_hierarchy_delimiter();
-  
+
+  // make sure 'threads' and 'subject' columns are present
+  if (!in_array('subject', $a_show_cols))
+    array_unshift($a_show_cols, 'subject');
+  if (!in_array('threads', $a_show_cols))
+    array_unshift($a_show_cols, 'threads');
+
+  $_SESSION['list_attrib']['columns'] = $a_show_cols;
+
   // show 'to' instead of 'from' in sent/draft messages
   if ((strpos($mbox.$delim, $CONFIG['sent_mbox'].$delim)===0 || strpos($mbox.$delim, $CONFIG['drafts_mbox'].$delim)===0)
       && (($f = array_search('from', $a_show_cols)) !== false) && array_search('to', $a_show_cols) === false)
     $a_show_cols[$f] = 'to';
 
-  $browser = new rcube_browser;
+  // Make sure there are no duplicated columns (#1486999)
+  $a_show_cols = array_unique($a_show_cols);
+
+  // Plugins may set header's list_cols/list_flags and other rcube_mail_header variables
+  // and list columns
+  $plugin = $RCMAIL->plugins->exec_hook('messages_list',
+    array('messages' => $a_headers, 'cols' => $a_show_cols));
 
-  $OUTPUT->command('set_message_coltypes', $a_show_cols);
+  $a_show_cols = $plugin['cols'];
+  $a_headers   = $plugin['messages'];
 
-  // remove 'attachment' and 'flag' columns, we don't need them here
-  if(($key = array_search('attachment', $a_show_cols)) !== FALSE)
-    unset($a_show_cols[$key]);
-  if(($key = array_search('flag', $a_show_cols)) !== FALSE)
-    unset($a_show_cols[$key]);
+  $thead = $head_replace ? rcmail_message_list_head($_SESSION['list_attrib'], $a_show_cols) : NULL;
 
-  if ($browser->ie && $replace)
-    $OUTPUT->command('offline_message_list', true);
+  $OUTPUT->command('set_message_coltypes', $a_show_cols, $thead);
+
+  if (empty($a_headers))
+    return;
+
+  // remove 'threads', 'attachment', 'flag', 'status' columns, we don't need them here
+  foreach (array('threads', 'attachment', 'flag', 'status') as $col) {
+    if (($key = array_search($col, $a_show_cols)) !== FALSE)
+      unset($a_show_cols[$key]);
+  }
 
   // loop through message headers
-  foreach ($a_headers as $n => $header)
-    {
-    $a_msg_cols = array();
-    $a_msg_flags = array();
-    
+  foreach ($a_headers as $n => $header) {
     if (empty($header))
       continue;
 
+    $a_msg_cols = array();
+    $a_msg_flags = array();
+
     $IMAP->set_charset(!empty($header->charset) ? $header->charset : $CONFIG['default_charset']);
 
     // format each col; similar as in rcmail_message_list()
-    foreach ($a_show_cols as $col)
-      {
-      if ($col=='from' || $col=='to')
+    foreach ($a_show_cols as $col) {
+      if (in_array($col, array('from', 'to', 'cc', 'replyto')))
         $cont = Q(rcmail_address_string($header->$col, 3), 'show');
-      else if ($col=='subject')
-        {
-        $action = $mbox==$CONFIG['drafts_mbox'] ? 'compose' : 'show';
-        $uid_param = $mbox==$CONFIG['drafts_mbox'] ? '_draft_uid' : '_uid';
-       $cont = abbreviate_string(trim($IMAP->decode_header($header->$col)), 160);
+      else if ($col=='subject') {
+        $cont = abbreviate_string(trim($IMAP->decode_header($header->$col)), 160);
         if (!$cont) $cont = rcube_label('nosubject');
-        $cont = $browser->ie ? Q($cont) : sprintf('<a href="%s" onclick="return rcube_event.cancel(event)">%s</a>', Q(rcmail_url($action, array($uid_param=>$header->uid, '_mbox'=>$mbox))), Q($cont));
-        }
+        $cont = Q($cont);
+      }
       else if ($col=='size')
         $cont = show_bytes($header->$col);
       else if ($col=='date')
         $cont = format_date($header->date);
       else
         $cont = Q($header->$col);
-          
+
       $a_msg_cols[$col] = $cont;
-      }
+    }
 
+    if ($header->depth)
+      $a_msg_flags['depth'] = $header->depth;
+    else if ($header->has_children)
+      $roots[] = $header->uid;
+    if ($header->parent_uid)
+      $a_msg_flags['parent_uid'] = $header->parent_uid;
+    if ($header->has_children)
+      $a_msg_flags['has_children'] = $header->has_children;
+    if ($header->unread_children)
+      $a_msg_flags['unread_children'] = $header->unread_children;
     if ($header->deleted)
       $a_msg_flags['deleted'] = 1;
     if (!$header->seen)
@@ -457,140 +307,152 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE, $replace=TRUE)
       $a_msg_flags['forwarded'] = 1;
     if ($header->flagged)
       $a_msg_flags['flagged'] = 1;
-      
-    if ($browser->ie)
-      $a_msg_cols = rc_utf8_clean($a_msg_cols);
-    
+    if ($header->others['list-post'])
+      $a_msg_flags['ml'] = 1;
+
+    $a_msg_flags['ctype'] = Q($header->ctype);
+    $a_msg_flags['mbox'] = $mbox;
+
+    // merge with plugin result
+    if (!empty($header->list_flags) && is_array($header->list_flags))
+      $a_msg_flags = array_merge($a_msg_flags, $header->list_flags);
+    if (!empty($header->list_cols) && is_array($header->list_cols))
+      $a_msg_cols = array_merge($a_msg_cols, $header->list_cols);
+
     $OUTPUT->command('add_message_row',
       $header->uid,
       $a_msg_cols,
       $a_msg_flags,
-      preg_match("/multipart\/m/i", $header->ctype),
       $insert_top);
-    }
+  }
 
-  if ($browser->ie && $replace)
-    $OUTPUT->command('offline_message_list', false);
+  if ($IMAP->threading) {
+    $OUTPUT->command('init_threads', (array) $roots);
   }
+}
 
 
-/**
- * return an HTML iframe for loading mail content
+/*
+ * Creates <THEAD> for message list table
  */
-function rcmail_messagecontent_frame($attrib)
-  {
-  global $OUTPUT;
-  
-  if (empty($attrib['id']))
-    $attrib['id'] = 'rcmailcontentwindow';
+function rcmail_message_list_head($attrib, $a_show_cols)
+{
+  global $CONFIG;
 
-  $attrib['name'] = $attrib['id'];
+  $skin_path = $_SESSION['skin_path'];
+  $image_tag = html::img(array('src' => "%s%s", 'alt' => "%s"));
 
-  $OUTPUT->set_env('contentframe', $attrib['id']);
-  $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/blank.gif');
+  // check to see if we have some settings for sorting
+  $sort_col   = $_SESSION['sort_col'];
+  $sort_order = $_SESSION['sort_order'];
 
-  return html::iframe($attrib);
+  // define sortable columns
+  $a_sort_cols = array('subject', 'date', 'from', 'to', 'size', 'cc');
+
+  if (!empty($attrib['optionsmenuicon'])) {
+    $onclick = 'return ' . JS_OBJECT_NAME . ".command('menu-open', 'messagelistmenu')";
+    if ($attrib['optionsmenuicon'] === true || $attrib['optionsmenuicon'] == 'true')
+      $list_menu = html::div(array('onclick' => $onclick, 'class' => 'listmenu',
+        'id' => 'listmenulink', 'title' => rcube_label('listoptions')));
+    else
+      $list_menu = html::a(array('href' => '#', 'onclick' => $onclick),
+        html::img(array('src' => $skin_path . $attrib['optionsmenuicon'],
+          'id' => 'listmenulink', 'title' => rcube_label('listoptions')))
+      );
   }
+  else
+    $list_menu = '';
 
+  $cells = array();
 
-function rcmail_messagecount_display($attrib)
-  {
-  global $IMAP, $OUTPUT;
-  
-  if (!$attrib['id'])
-    $attrib['id'] = 'rcmcountdisplay';
+  foreach ($a_show_cols as $col) {
+    // get column name
+    switch ($col) {
+      case 'flag':
+        $col_name = '<span class="flagged">&nbsp;</span>';
+        break;
+      case 'attachment':
+      case 'status':
+        $col_name = '<span class="' . $col .'">&nbsp;</span>';
+        break;
+      case 'threads':
+        $col_name = $list_menu;
+        break;
+      default:
+        $col_name = Q(rcube_label($col));
+    }
+
+    // make sort links
+    if (in_array($col, $a_sort_cols))
+      $col_name = html::a(array('href'=>"./#sort", 'onclick' => 'return '.JS_OBJECT_NAME.".command('sort','".$col."',this)", 'title' => rcube_label('sortby')), $col_name);
 
-  $OUTPUT->add_gui_object('countdisplay', $attrib['id']);
+    $sort_class = $col == $sort_col ? " sorted$sort_order" : '';
+    $class_name = $col.$sort_class;
 
-  return html::span($attrib, rcmail_get_messagecount_text());
+    // put it all together
+    $cells[] = array('className' => $class_name, 'id' => "rcm$col", 'html' => $col_name);
   }
 
+  return $cells;
+}
 
-function rcmail_quota_display($attrib)
+
+/**
+ * return an HTML iframe for loading mail content
+ */
+function rcmail_messagecontent_frame($attrib)
   {
-  global $OUTPUT, $COMM_PATH;
+  global $OUTPUT, $RCMAIL;
 
-  if (!$attrib['id'])
-    $attrib['id'] = 'rcmquotadisplay';
+  if (empty($attrib['id']))
+    $attrib['id'] = 'rcmailcontentwindow';
 
-  if(isset($attrib['display']))
-    $_SESSION['quota_display'] = $attrib['display'];
+  $attrib['name'] = $attrib['id'];
 
-  $OUTPUT->add_gui_object('quotadisplay', $attrib['id']);
-  
-  $quota = rcmail_quota_content(NULL, $attrib);
-  
-  if (is_array($quota)) {
-    $OUTPUT->add_script('$(document).ready(function(){
-       rcmail.set_quota('.json_serialize($quota).')});', 'foot');
-    $quota = '';
-    }
-  
-  return html::span($attrib, $quota);
+  if ($RCMAIL->config->get('preview_pane'))
+    $OUTPUT->set_env('contentframe', $attrib['id']);
+  $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/blank.gif');
+
+  return html::iframe($attrib);
   }
 
 
-function rcmail_quota_content($quota=NULL, $attrib=NULL)
+function rcmail_messagecount_display($attrib)
   {
-  global $IMAP, $COMM_PATH, $RCMAIL;
+  global $RCMAIL;
 
-  $display = isset($_SESSION['quota_display']) ? $_SESSION['quota_display'] : '';
+  if (!$attrib['id'])
+    $attrib['id'] = 'rcmcountdisplay';
 
-  if (empty($quota)) {
-    if (!$IMAP->get_capability('QUOTA'))
-      return rcube_label('unknown');
-    else 
-      $quota = $IMAP->get_quota();
-    }
+  $RCMAIL->output->add_gui_object('countdisplay', $attrib['id']);
 
-  if ($quota && !($quota['total']==0 && $RCMAIL->config->get('quota_zero_as_unlimited')))
-    {
-    $quota_result = sprintf('%s / %s (%.0f%%)',
-        show_bytes($quota['used'] * 1024), show_bytes($quota['total'] * 1024),
-        $quota['percent']);
-
-    if ($display == 'image') {
-      $quota_result = array(       
-       'percent'       => $quota['percent'],
-        'title'                => $quota_result,
-       );
-      if ($attrib['width'])
-        $quota_result['width'] = $attrib['width'];
-      if ($attrib['height'])
-        $quota_result['height']        = $attrib['height'];
-      }
-    }
-  else
-    return rcube_label('unlimited');
+  $content =  $RCMAIL->action != 'show' ? rcmail_get_messagecount_text() : rcube_label('loading');
 
-  return $quota_result;
+  return html::span($attrib, $content);
   }
 
 
 function rcmail_get_messagecount_text($count=NULL, $page=NULL)
   {
-  global $IMAP, $MESSAGE;
-  
-  if (isset($MESSAGE->index))
-    {
-    return rcube_label(array('name' => 'messagenrof',
-                             'vars' => array('nr'  => $MESSAGE->index+1,
-                                             'count' => $count!==NULL ? $count : $IMAP->messagecount())));
-    }
+  global $RCMAIL, $IMAP;
 
   if ($page===NULL)
     $page = $IMAP->list_page;
-    
+
   $start_msg = ($page-1) * $IMAP->page_size + 1;
-  $max = $count!==NULL ? $count : $IMAP->messagecount();
+
+  if ($count!==NULL)
+    $max = $count;
+  else if ($RCMAIL->action)
+    $max = $IMAP->messagecount(NULL, $IMAP->threading ? 'THREADS' : 'ALL');
 
   if ($max==0)
     $out = rcube_label('mailboxempty');
   else
-    $out = rcube_label(array('name' => 'messagesfromto',
-                              'vars' => array('from'  => $start_msg,
-                                              'to'    => min($max, $start_msg + $IMAP->page_size - 1),
-                                              'count' => $max)));
+    $out = rcube_label(array('name' => $IMAP->threading ? 'threadsfromto' : 'messagesfromto',
+            'vars' => array('from'  => $start_msg,
+            'to'    => min($max, $start_msg + $IMAP->page_size - 1),
+            'count' => $max)));
 
   return Q($out);
   }
@@ -608,6 +470,7 @@ function rcmail_mailbox_name_display($attrib)
   return html::span($attrib, rcmail_get_mailbox_name_text());
 }
 
+
 function rcmail_get_mailbox_name_text()
 {
   global $RCMAIL;
@@ -615,22 +478,46 @@ function rcmail_get_mailbox_name_text()
 }
 
 
-function rcmail_send_unread_count($mbox_name, $force=false)
+function rcmail_send_unread_count($mbox_name, $force=false, $count=null)
 {
   global $RCMAIL;
-    
-  $old_unseen = $_SESSION['unseen_count'][$mbox_name];
-  $unseen = $RCMAIL->imap->messagecount($mbox_name, 'UNSEEN', $force);
+
+  $old_unseen = rcmail_get_unseen_count($mbox_name);
+
+  if ($count === null)
+    $unseen = $RCMAIL->imap->messagecount($mbox_name, 'UNSEEN', $force);
+  else
+    $unseen = $count;
 
   if ($unseen != $old_unseen || ($mbox_name == 'INBOX'))
     $RCMAIL->output->command('set_unread_count', $mbox_name, $unseen, ($mbox_name == 'INBOX'));
 
-  // @TODO: this data is doubled (session and cache tables) if caching is enabled
-  $_SESSION['unseen_count'][$mbox_name] = $unseen;
-    
+  rcmail_set_unseen_count($mbox_name, $unseen);
+
   return $unseen;
 }
-                             
+
+
+function rcmail_set_unseen_count($mbox_name, $count)
+{
+  // @TODO: this data is doubled (session and cache tables) if caching is enabled
+
+  // Make sure we have an array here (#1487066)
+  if (!is_array($_SESSION['unseen_count']))
+    $_SESSION['unseen_count'] = array();
+
+  $_SESSION['unseen_count'][$mbox_name] = $count;
+}
+
+
+function rcmail_get_unseen_count($mbox_name)
+{
+  if (is_array($_SESSION['unseen_count']) && array_key_exists($mbox_name, $_SESSION['unseen_count']))
+    return $_SESSION['unseen_count'][$mbox_name];
+  else
+    return null;
+}
+
 
 /**
  * Sets message is_safe flag according to 'show_images' option value
@@ -660,6 +547,7 @@ function rcmail_check_safe(&$message)
   }
 }
 
+
 /**
  * Cleans up the given message HTML Body (for displaying)
  *
@@ -671,13 +559,13 @@ function rcmail_check_safe(&$message)
 function rcmail_wash_html($html, $p = array(), $cid_replaces)
 {
   global $REMOTE_OBJECTS;
-  
+
   $p += array('safe' => false, 'inline_html' => true);
 
   // special replacements (not properly handled by washtml class)
   $html_search = array(
     '/(<\/nobr>)(\s+)(<nobr>)/i',      // space(s) between <NOBR>
-    '/<title>.*<\/title>/i',           // PHP bug #32547 workaround: remove title tag
+    '/<title[^>]*>.*<\/title>/i',      // PHP bug #32547 workaround: remove title tag
     '/^(\0\0\xFE\xFF|\xFF\xFE\0\0|\xFE\xFF|\xFF\xFE|\xEF\xBB\xBF)/',   // byte-order mark (only outlook?)
     '/<html\s[^>]+>/i',                        // washtml/DOMDocument cannot handle xml namespaces
   );
@@ -689,14 +577,29 @@ function rcmail_wash_html($html, $p = array(), $cid_replaces)
   );
   $html = preg_replace($html_search, $html_replace, $html);
 
+  // PCRE errors handling (#1486856), should we use something like for every preg_* use?
+  if ($html === null && ($preg_error = preg_last_error()) != PREG_NO_ERROR) {
+    $errstr = "Could not clean up HTML message! PCRE Error: $preg_error.";
+
+    if ($preg_error == PREG_BACKTRACK_LIMIT_ERROR)
+      $errstr .= " Consider raising pcre.backtrack_limit!";
+    if ($preg_error == PREG_RECURSION_LIMIT_ERROR)
+      $errstr .= " Consider raising pcre.recursion_limit!";
+
+    raise_error(array('code' => 600, 'type' => 'php',
+        'line' => __LINE__, 'file' => __FILE__,
+        'message' => $errstr), true, false);
+    return '';
+  }
+
   // fix (unknown/malformed) HTML tags before "wash"
   $html = preg_replace_callback('/(<[\/]*)([^\s>]+)/', 'rcmail_html_tag_callback', $html);
 
   // charset was converted to UTF-8 in rcube_imap::get_message_part(),
   // -> change charset specification in HTML accordingly
-  $charset_pattern = '(<meta\s+[^>]*)(content=[\'"]?\w+\/\w+;\s*charset)=([a-z0-9-_]+)';
+  $charset_pattern = '(<meta\s+[^>]*content=)[\'"]?(\w+\/\w+;\s*charset=)([a-z0-9-_]+[\'"]?)';
   if (preg_match("/$charset_pattern/Ui", $html)) {
-    $html = preg_replace("/$charset_pattern/i", '\\1\\2='.RCMAIL_CHARSET, $html);
+    $html = preg_replace("/$charset_pattern/i", '\\1"\\2'.RCMAIL_CHARSET.'"', $html);
   }
   else {
     // add meta content-type to malformed messages, washtml cannot work without that
@@ -704,7 +607,6 @@ function rcmail_wash_html($html, $p = array(), $cid_replaces)
       $html = '<head></head>'. $html;
     $html = substr_replace($html, '<meta http-equiv="Content-Type" content="text/html; charset='.RCMAIL_CHARSET.'" />', intval(stripos($html, '<head>')+6), 0);
   }
-
   // turn relative into absolute urls
   $html = rcmail_resolve_base($html);
 
@@ -717,7 +619,7 @@ function rcmail_wash_html($html, $p = array(), $cid_replaces)
     'cid_map' => $cid_replaces,
     'html_elements' => array('body'),
   );
-    
+
   if (!$p['inline_html']) {
     $wash_opts['html_elements'] = array('html','head','title','body');
   }
@@ -725,16 +627,26 @@ function rcmail_wash_html($html, $p = array(), $cid_replaces)
     $wash_opts['html_elements'][] = 'link';
     $wash_opts['html_attribs'] = array('rel','type');
   }
-    
+
+  // overwrite washer options with options from plugins
+  if (isset($p['html_elements']))
+    $wash_opts['html_elements'] = $p['html_elements'];
+  if (isset($p['html_attribs']))
+    $wash_opts['html_attribs'] = $p['html_attribs'];
+
+  // initialize HTML washer
   $washer = new washtml($wash_opts);
-  $washer->add_callback('form', 'rcmail_washtml_callback');
+
+  if (!$p['skip_washer_form_callback'])
+    $washer->add_callback('form', 'rcmail_washtml_callback');
 
   // allow CSS styles, will be sanitized by rcmail_washtml_callback()
-  $washer->add_callback('style', 'rcmail_washtml_callback');
+  if (!$p['skip_washer_style_callback'])
+    $washer->add_callback('style', 'rcmail_washtml_callback');
 
   $html = $washer->wash($html);
   $REMOTE_OBJECTS = $washer->extlinks;
-  
+
   return $html;
 }
 
@@ -750,7 +662,7 @@ function rcmail_wash_html($html, $p = array(), $cid_replaces)
 function rcmail_print_body($part, $p = array())
 {
   global $RCMAIL;
-  
+
   // trigger plugin hook
   $data = $RCMAIL->plugins->exec_hook('message_part_before',
     array('type' => $part->ctype_secondary, 'body' => $part->body) + $p + array('safe' => false, 'plain' => false, 'inline_html' => true));
@@ -777,13 +689,13 @@ function rcmail_print_body($part, $p = array())
     $body = $part->body;
     $part->ctype_secondary = $data['type'] = 'plain';
   }
-  
+
   // free some memory (hopefully)
   unset($data['body']);
 
   // plaintext postprocessing
   if ($part->ctype_secondary == 'plain')
-    $body = rcmail_plain_body($body);
+    $body = rcmail_plain_body($body, $part->ctype_parameters['format'] == 'flowed');
 
   // allow post-processing of the message body
   $data = $RCMAIL->plugins->exec_hook('message_part_after', array('type' => $part->ctype_secondary, 'body' => $body) + $data);
@@ -791,78 +703,115 @@ function rcmail_print_body($part, $p = array())
   return $data['type'] == 'html' ? $data['body'] : html::tag('pre', array(), $data['body']);
 }
 
+
 /**
  * Handle links and citation marks in plain text message
  *
- * @param string  Plain text string 
+ * @param string  Plain text string
+ * @param boolean Text uses format=flowed
+ *
  * @return string Formatted HTML string
  */
-function rcmail_plain_body($body)
+function rcmail_plain_body($body, $flowed=false)
 {
+  global $RCMAIL;
+
   // make links and email-addresses clickable
-  $replacements = new rcube_string_replacer;
-    
+  $replacer = new rcube_string_replacer;
+
   // search for patterns like links and e-mail addresses
-  $body = preg_replace_callback($replacements->link_pattern, array($replacements, 'link_callback'), $body);
-  $body = preg_replace_callback($replacements->mailto_pattern, array($replacements, 'mailto_callback'), $body);
+  $body = preg_replace_callback($replacer->link_pattern, array($replacer, 'link_callback'), $body);
+  $body = preg_replace_callback($replacer->mailto_pattern, array($replacer, 'mailto_callback'), $body);
 
   // split body into single lines
   $a_lines = preg_split('/\r?\n/', $body);
-  $q_lines = array();
   $quote_level = 0;
+  $last = -1;
 
   // find/mark quoted lines...
   for ($n=0, $cnt=count($a_lines); $n < $cnt; $n++) {
-    $q = 0;
-
     if ($a_lines[$n][0] == '>' && preg_match('/^(>+\s*)+/', $a_lines[$n], $regs)) {
       $q = strlen(preg_replace('/\s/', '', $regs[0]));
-        $a_lines[$n] = substr($a_lines[$n], strlen($regs[0]));
+      $a_lines[$n] = substr($a_lines[$n], strlen($regs[0]));
 
       if ($q > $quote_level)
-        $q_lines[$n]['quote'] = $q - $quote_level;
+        $a_lines[$n] = $replacer->get_replacement($replacer->add(
+          str_repeat('<blockquote>', $q - $quote_level))) . $a_lines[$n];
       else if ($q < $quote_level)
-        $q_lines[$n]['endquote'] = $quote_level - $q;
+        $a_lines[$n] = $replacer->get_replacement($replacer->add(
+          str_repeat('</blockquote>', $quote_level - $q))) . $a_lines[$n];
+      else if ($flowed) {
+        // previous line is flowed
+        if (isset($a_lines[$last]) && $a_lines[$n]
+          && $a_lines[$last][strlen($a_lines[$last])-1] == ' ') {
+          // merge lines
+          $a_lines[$last] .= $a_lines[$n];
+          unset($a_lines[$n]);
+        }
+        else
+          $last = $n;
+      }
+    }
+    else {
+      $q = 0;
+      if ($flowed) {
+        // sig separator - line is fixed
+        if ($a_lines[$n] == '-- ') {
+          $last = $n;
+        }
+        else {
+          // remove space-stuffing
+          if ($a_lines[$n][0] == ' ')
+            $a_lines[$n] = substr($a_lines[$n], 1);
+
+          // previous line is flowed?
+          if (isset($a_lines[$last]) && $a_lines[$n]
+            && $a_lines[$last] != '-- '
+            && $a_lines[$last][strlen($a_lines[$last])-1] == ' '
+          ) {
+            $a_lines[$last] .= $a_lines[$n];
+            unset($a_lines[$n]);
+          }
+          else {
+            $last = $n;
+          }
+        }
+        if ($quote_level > 0)
+          $a_lines[$last] = $replacer->get_replacement($replacer->add(
+            str_repeat('</blockquote>', $quote_level))) . $a_lines[$last];
+      }
+      else if ($quote_level > 0)
+        $a_lines[$n] = $replacer->get_replacement($replacer->add(
+          str_repeat('</blockquote>', $quote_level))) . $a_lines[$n];
     }
-    else if ($quote_level > 0)
-      $q_lines[$n]['endquote'] = $quote_level;
 
     $quote_level = $q;
   }
 
-  // quote plain text
-  $body = Q(join("\n", $a_lines), 'replace', false);
-
-  // colorize signature
-  if (($sp = strrpos($body, '-- ')) !== false)
-    if (($sp == 0 || $body[$sp-1] == "\n") && $body[$sp+3] == "\n") {
-      $body = substr($body, 0, max(0, $sp))
-       .'<span class="sig">'.substr($body, $sp).'</span>';
+  $body = join("\n", $a_lines);
+
+  // quote plain text (don't use Q() here, to display entities "as is")
+  $table = get_html_translation_table(HTML_SPECIALCHARS);
+  unset($table['?']);
+  $body = strtr($body, $table);
+
+  // colorize signature (up to <sig_max_lines> lines)
+  $len = strlen($body);
+  $sig_max_lines = $RCMAIL->config->get('sig_max_lines', 15);
+  while (($sp = strrpos($body, "-- \n", $sp ? -$len+$sp-1 : 0)) !== false) {
+    if ($sp == 0 || $body[$sp-1] == "\n") {
+      // do not touch blocks with more that X lines
+      if (substr_count($body, "\n", $sp) < $sig_max_lines)
+        $body = substr($body, 0, max(0, $sp))
+          .'<span class="sig">'.substr($body, $sp).'</span>';
+      break;
     }
+  }
 
-  // colorize quoted lines
-  $a_lines = preg_split('/\n/', $body);
-  foreach ($q_lines as $i => $q)
-    if ($q['quote'])
-      $a_lines[$i] = str_repeat('<blockquote>', $q['quote']) . $a_lines[$i];
-    else if ($q['endquote'])
-      $a_lines[$i] = str_repeat('</blockquote>', $q['endquote']) . $a_lines[$i];
-
-  // insert the links for urls and mailtos
-  $body = $replacements->resolve(join("\n", $a_lines));
-    
-  return $body;
-}
-
+  // insert url/mailto links and citation tags
+  $body = $replacer->resolve($body);
 
-/**
- * add a string to the replacement array and return a replacement string
- */
-function rcmail_str_replacement($str, &$rep)
-{
-  static $count = 0;
-  $rep[$count] = stripslashes($str);
-  return "##string_replacement{".($count++)."}##";
+  return $body;
 }
 
 
@@ -875,21 +824,21 @@ function rcmail_washtml_callback($tagname, $attrib, $content)
     case 'form':
       $out = html::div('form', $content);
       break;
-      
+
     case 'style':
       // decode all escaped entities and reduce to ascii strings
       $stripped = preg_replace('/[^a-zA-Z\(:]/', '', rcmail_xss_entity_decode($content));
-      
+
       // now check for evil strings like expression, behavior or url()
       if (!preg_match('/expression|behavior|url\(|import/', $stripped)) {
         $out = html::tag('style', array('type' => 'text/css'), $content);
         break;
       }
-    
+
     default:
       $out = '';
   }
-  
+
   return $out;
 }
 
@@ -902,8 +851,8 @@ function rcmail_html_tag_callback($matches)
   $tagname = $matches[2];
 
   $tagname = preg_replace(array(
-    '/:.*$/',          // Microsoft's Smart Tags <st1:xxxx>
-    '/[^a-z0-9_-]/i',  // forbidden characters
+    '/:.*$/',                  // Microsoft's Smart Tags <st1:xxxx>
+    '/[^a-z0-9_\[\]\!-]/i',    // forbidden characters
     ), '', $tagname);
 
   return $matches[1].$tagname;
@@ -917,13 +866,13 @@ function rcmail_message_headers($attrib, $headers=NULL)
   {
   global $IMAP, $OUTPUT, $MESSAGE, $PRINT_MODE, $RCMAIL;
   static $sa_attrib;
-  
+
   // keep header table attrib
   if (is_array($attrib) && !$sa_attrib)
     $sa_attrib = $attrib;
   else if (!is_array($attrib) && is_array($sa_attrib))
     $attrib = $sa_attrib;
-  
+
   if (!isset($MESSAGE))
     return FALSE;
 
@@ -932,43 +881,63 @@ function rcmail_message_headers($attrib, $headers=NULL)
     $headers = is_object($MESSAGE->headers) ? get_object_vars($MESSAGE->headers) : $MESSAGE->headers;
 
   // show these headers
-  $standard_headers = array('subject', 'from', 'to', 'cc', 'bcc', 'replyto', 'date');
+  $standard_headers = array('subject', 'from', 'to', 'cc', 'bcc', 'replyto',
+    'mail-reply-to', 'mail-followup-to', 'date');
   $output_headers = array();
 
   foreach ($standard_headers as $hkey) {
-    if (!$headers[$hkey])
+    if ($headers[$hkey])
+      $value = $headers[$hkey];
+    else if ($headers['others'][$hkey])
+      $value = $headers['others'][$hkey];
+    else
       continue;
 
     if ($hkey == 'date') {
       if ($PRINT_MODE)
-        $header_value = format_date($headers[$hkey], $RCMAIL->config->get('date_long', 'x'));
+        $header_value = format_date($value, $RCMAIL->config->get('date_long', 'x'));
       else
-        $header_value = format_date($headers[$hkey]);
+        $header_value = format_date($value);
     }
     else if ($hkey == 'replyto') {
       if ($headers['replyto'] != $headers['from'])
-        $header_value = rcmail_address_string($headers['replyto'], null, true, $attrib['addicon']);
+        $header_value = rcmail_address_string($value, null, true, $attrib['addicon']);
+      else
+        continue;
+    }
+    else if ($hkey == 'mail-reply-to') {
+      if ($headers['mail-replyto'] != $headers['reply-to']
+        && $headers['reply-to'] != $headers['from']
+      )
+        $header_value = rcmail_address_string($value, null, true, $attrib['addicon']);
       else
         continue;
     }
+    else if ($hkey == 'mail-followup-to') {
+      $header_value = rcmail_address_string($value, null, true, $attrib['addicon']);
+    }
     else if (in_array($hkey, array('from', 'to', 'cc', 'bcc')))
-      $header_value = rcmail_address_string($headers[$hkey], null, true, $attrib['addicon']);
-    else if ($hkey == 'subject' && empty($headers[$hkey]))
+      $header_value = rcmail_address_string($value, null, true, $attrib['addicon']);
+    else if ($hkey == 'subject' && empty($value))
       $header_value = rcube_label('nosubject');
     else
-      $header_value = trim($IMAP->decode_header($headers[$hkey]));
-      
-    $output_headers[$hkey] = array('title' => rcube_label($hkey), 'value' => $header_value, 'raw' => $headers[$hkey]);
+      $header_value = trim($IMAP->decode_header($value));
+
+    $output_headers[$hkey] = array(
+        'title' => rcube_label(preg_replace('/(^mail-|-)/', '', $hkey)),
+        'value' => $header_value, 'raw' => $value
+    );
   }
-    
-  $plugin = $RCMAIL->plugins->exec_hook('message_headers_output', array('output' => $output_headers, 'headers' => $MESSAGE->headers));
-  
+
+  $plugin = $RCMAIL->plugins->exec_hook('message_headers_output',
+    array('output' => $output_headers, 'headers' => $MESSAGE->headers));
+
   // compose html table
   $table = new html_table(array('cols' => 2));
-  
+
   foreach ($plugin['output'] as $hkey => $row) {
     $table->add(array('class' => 'header-title'), Q($row['title']));
-    $table->add(array('class' => $hkey, 'width' => "90%"), Q($row['value'], ($hkey == 'subject' ? 'strict' : 'show')));
+    $table->add(array('class' => 'header '.$hkey), Q($row['value'], ($hkey == 'subject' ? 'strict' : 'show')));
   }
 
   // all headers division
@@ -991,17 +960,17 @@ function rcmail_message_headers($attrib, $headers=NULL)
  */
 function rcmail_message_body($attrib)
   {
-  global $CONFIG, $OUTPUT, $MESSAGE, $IMAP, $REMOTE_OBJECTS;
+  global $CONFIG, $OUTPUT, $MESSAGE, $IMAP, $RCMAIL, $REMOTE_OBJECTS;
 
   if (!is_array($MESSAGE->parts) && empty($MESSAGE->body))
     return '';
-    
+
   if (!$attrib['id'])
     $attrib['id'] = 'rcmailMsgBody';
 
   $safe_mode = $MESSAGE->is_safe || intval($_GET['_safe']);
   $out = '';
-  
+
   $header_attrib = array();
   foreach ($attrib as $attr => $value)
     if (preg_match('/^headertable([a-z]+)$/i', $attr, $regs))
@@ -1022,18 +991,42 @@ function rcmail_message_body($attrib)
         if (!isset($part->body))
           $part->body = $MESSAGE->get_part_content($part->mime_id);
 
+        // message is cached but not exists (#1485443), or other error
+        if ($part->body === false) {
+          rcmail_message_error($MESSAGE->uid);
+        }
+
+        $plugin = $RCMAIL->plugins->exec_hook('message_body_prefix', array(
+          'part' => $part, 'prefix' => ''));
+
         $body = rcmail_print_body($part, array('safe' => $safe_mode, 'plain' => !$CONFIG['prefer_html']));
 
-        if ($part->ctype_secondary == 'html')
-          $out .= html::div('message-htmlpart', rcmail_html4inline($body, $attrib['id']));
+        if ($part->ctype_secondary == 'html') {
+          $body = rcmail_html4inline($body, $attrib['id'], 'rcmBody', $attrs);
+          $div_attr = array('class' => 'message-htmlpart');
+          $style = array();
+
+          if (!empty($attrs)) {
+            foreach ($attrs as $a_idx => $a_val)
+              $style[] = $a_idx . ': ' . $a_val;
+            if (!empty($style))
+              $div_attr['style'] = implode('; ', $style);
+          }
+
+          $out .= html::div($div_attr, $plugin['prefix'] . $body);
+        }
         else
-          $out .= html::div('message-part', $body);
+          $out .= html::div('message-part', $plugin['prefix'] . $body);
         }
       }
     }
-  else
-    $out .= html::div('message-part', html::tag('pre', array(),
+  else {
+    $plugin = $RCMAIL->plugins->exec_hook('message_body_prefix', array(
+      'part' => $MESSAGE, 'prefix' => ''));
+
+    $out .= html::div('message-part', $plugin['prefix'] . html::tag('pre', array(),
       rcmail_plain_body(Q($MESSAGE->body, 'strict', false))));
+    }
 
   $ctype_primary = strtolower($MESSAGE->structure->ctype_primary);
   $ctype_secondary = strtolower($MESSAGE->structure->ctype_secondary);
@@ -1041,11 +1034,16 @@ function rcmail_message_body($attrib)
   // list images after mail body
   if ($CONFIG['inline_images']
       && $ctype_primary == 'multipart'
-      && !empty($MESSAGE->attachments) 
-      && !strstr($message_body, '<html'))
+      && !empty($MESSAGE->attachments))
     {
     foreach ($MESSAGE->attachments as $attach_prop) {
-      if (strpos($attach_prop->mimetype, 'image/') === 0) {
+      // Content-Type: image/*...
+      if (preg_match('/^image\//i', $attach_prop->mimetype) ||
+        // ...or known file extension: many clients are using application/octet-stream
+        ($attach_prop->filename &&
+          preg_match('/^application\/octet-stream$/i', $attach_prop->mimetype) &&
+          preg_match('/\.(jpg|jpeg|png|gif|bmp)$/i', $attach_prop->filename))
+      ) {
         $out .= html::tag('hr') . html::p(array('align' => "center"),
           html::img(array(
             'src' => $MESSAGE->get_part_url($attach_prop->mime_id),
@@ -1055,7 +1053,7 @@ function rcmail_message_body($attrib)
         }
     }
   }
-  
+
   // tell client that there are blocked remote objects
   if ($REMOTE_OBJECTS && !$safe_mode)
     $OUTPUT->set_env('blockedobjects', true);
@@ -1084,51 +1082,101 @@ function rcmail_resolve_base($body)
 /**
  * modify a HTML message that it can be displayed inside a HTML page
  */
-function rcmail_html4inline($body, $container_id)
-  {
+function rcmail_html4inline($body, $container_id, $body_id='', &$attributes=null)
+{
   $last_style_pos = 0;
   $body_lc = strtolower($body);
-  
+  $cont_id = $container_id.($body_id ? ' div.'.$body_id : '');
+
   // find STYLE tags
   while (($pos = strpos($body_lc, '<style', $last_style_pos)) && ($pos2 = strpos($body_lc, '</style>', $pos)))
-    {
+  {
     $pos = strpos($body_lc, '>', $pos)+1;
 
     // replace all css definitions with #container [def]
-    $styles = rcmail_mod_css_styles(substr($body, $pos, $pos2-$pos), $container_id);
+    $styles = rcmail_mod_css_styles(
+      substr($body, $pos, $pos2-$pos), $cont_id);
 
     $body = substr($body, 0, $pos) . $styles . substr($body, $pos2);
     $body_lc = strtolower($body);
     $last_style_pos = $pos2;
-    }
+  }
 
   // modify HTML links to open a new window if clicked
   $GLOBALS['rcmail_html_container_id'] = $container_id;
   $body = preg_replace_callback('/<(a|link)\s+([^>]+)>/Ui', 'rcmail_alter_html_link', $body);
   unset($GLOBALS['rcmail_html_container_id']);
 
-  // add comments arround html and other tags
-  $out = preg_replace(array(
+  $body = preg_replace(array(
+      // add comments arround html and other tags
       '/(<!DOCTYPE[^>]*>)/i',
       '/(<\?xml[^>]*>)/i',
       '/(<\/?html[^>]*>)/i',
       '/(<\/?head[^>]*>)/i',
       '/(<title[^>]*>.*<\/title>)/Ui',
-      '/(<\/?meta[^>]*>)/i'),
-    '<!--\\1-->',
+      '/(<\/?meta[^>]*>)/i',
+      // quote <? of php and xml files that are specified as text/html
+      '/<\?/',
+      '/\?>/',
+      // replace <body> with <div>
+      '/<body([^>]*)>/i',
+      '/<\/body>/i',
+      ),
+    array(
+      '<!--\\1-->',
+      '<!--\\1-->',
+      '<!--\\1-->',
+      '<!--\\1-->',
+      '<!--\\1-->',
+      '<!--\\1-->',
+      '&lt;?',
+      '?&gt;',
+      '<div class="'.$body_id.'"\\1>',
+      '</div>',
+      ),
     $body);
 
-  $out = preg_replace(
-    array('/<body([^>]*)>/i', '/<\/body>/i'),
-    array('<div class="rcmBody"\\1>', '</div>'),
-    $out);
+  $attributes = array();
 
-  // quote <? of php and xml files that are specified as text/html
-  $out = preg_replace(array('/<\?/', '/\?>/'), array('&lt;?', '?&gt;'), $out);
+  // Handle body attributes that doesn't play nicely with div elements
+  $regexp = '/<div class="' . preg_quote($body_id, '/') . '"([^>]*)/';
+  if (preg_match($regexp, $body, $m)) {
+    $attrs = $m[0];
+    // Get bgcolor, we'll set it as background-color of the message container
+    if ($m[1] && preg_match('/bgcolor=["\']*([a-z0-9#]+)["\']*/', $attrs, $mb)) {
+      $attributes['background-color'] = $mb[1];
+      $attrs = preg_replace('/bgcolor=["\']*([a-z0-9#]+)["\']*/', '', $attrs);
+    }
+    // Get background, we'll set it as background-image of the message container
+    if ($m[1] && preg_match('/background=["\']*([^"\'>\s]+)["\']*/', $attrs, $mb)) {
+      $attributes['background-image'] = 'url('.$mb[1].')';
+      $attrs = preg_replace('/background=["\']*([^"\'>\s]+)["\']*/', '', $attrs);
+    }
+    if (!empty($attributes)) {
+      $body = preg_replace($regexp, rtrim($attrs), $body, 1);
+    }
 
-  return $out;
+    // handle body styles related to background image
+    if ($attributes['background-image']) {
+      // get body style
+      if (preg_match('/#'.preg_quote($cont_id, '/').'\s+\{([^}]+)}/i', $body, $m)) {
+        // get background related style
+        if (preg_match_all('/(background-position|background-repeat)\s*:\s*([^;]+);/i', $m[1], $ma, PREG_SET_ORDER)) {
+          foreach ($ma as $style)
+            $attributes[$style[1]] = $style[2];
+        }
+      }
+    }
+  }
+  // make sure there's 'rcmBody' div, we need it for proper css modification
+  // its name is hardcoded in rcmail_message_body() also
+  else {
+    $body = '<div class="' . $body_id . '">' . $body . '</div>';
   }
 
+  return $body;
+}
+
 
 /**
  * parse link attributes and set correct target
@@ -1136,21 +1184,22 @@ function rcmail_html4inline($body, $container_id)
 function rcmail_alter_html_link($matches)
 {
   global $EMAIL_ADDRESS_PATTERN;
-  
+
   $tag = $matches[1];
   $attrib = parse_attrib_string($matches[2]);
   $end = '>';
 
   if ($tag == 'link' && preg_match('/^https?:\/\//i', $attrib['href'])) {
-    $attrib['href'] = "./bin/modcss.php?u=" . urlencode($attrib['href']) . "&amp;c=" . urlencode($GLOBALS['rcmail_html_container_id']);
+    $attrib['href'] = "?_task=utils&amp;_action=modcss&amp;u=" . urlencode($attrib['href'])
+        . "&amp;c=" . urlencode($GLOBALS['rcmail_html_container_id']);
     $end = ' />';
   }
-  else if (preg_match("/^mailto:$EMAIL_ADDRESS_PATTERN/i", $attrib['href'], $mailto)) {
+  else if (preg_match('/^mailto:'.$EMAIL_ADDRESS_PATTERN.'(\?[^"\'>]+)?/i', $attrib['href'], $mailto)) {
     $attrib['href'] = $mailto[0];
     $attrib['onclick'] = sprintf(
       "return %s.command('compose','%s',this)",
       JS_OBJECT_NAME,
-      JQ($mailto[1]));
+      JQ($mailto[1].$mailto[2]));
   }
   else if (!empty($attrib['href']) && $attrib['href'][0] != '#') {
     $attrib['target'] = '_blank';
@@ -1165,7 +1214,8 @@ function rcmail_alter_html_link($matches)
  */
 function rcmail_address_string($input, $max=null, $linked=false, $addicon=null)
 {
-  global $IMAP, $PRINT_MODE, $CONFIG, $OUTPUT, $EMAIL_ADDRESS_PATTERN;
+  global $IMAP, $RCMAIL, $PRINT_MODE, $CONFIG;
+  static $got_writable_abook = null;
 
   $a_parts = $IMAP->decode_address_list($input);
 
@@ -1176,29 +1226,46 @@ function rcmail_address_string($input, $max=null, $linked=false, $addicon=null)
   $j = 0;
   $out = '';
 
+  if ($got_writable_abook === null && $books = $RCMAIL->get_address_sources(true)) {
+    $got_writable_abook = true;
+  }
+
   foreach ($a_parts as $part) {
     $j++;
+
+    $name   = $part['name'];
+    $mailto = $part['mailto'];
+    $string = $part['string'];
+
+    // IDNA ASCII to Unicode
+    if ($name == $mailto)
+      $name = idn_to_utf8($name);
+    if ($string == $mailto)
+      $string = idn_to_utf8($string);
+    $mailto = idn_to_utf8($mailto);
+
     if ($PRINT_MODE) {
-      $out .= sprintf('%s &lt;%s&gt;', Q($part['name']), $part['mailto']);
+      $out .= sprintf('%s &lt;%s&gt;', Q($name), $mailto);
     }
-    else if (preg_match("/$EMAIL_ADDRESS_PATTERN/i", $part['mailto'])) {
+    else if (check_email($part['mailto'], false)) {
       if ($linked) {
         $out .= html::a(array(
-            'href' => 'mailto:'.$part['mailto'],
-            'onclick' => sprintf("return %s.command('compose','%s',this)", JS_OBJECT_NAME, JQ($part['mailto'])),
-            'title' => $part['mailto'],
+            'href' => 'mailto:'.$mailto,
+            'onclick' => sprintf("return %s.command('compose','%s',this)", JS_OBJECT_NAME, JQ($mailto)),
+            'title' => $mailto,
             'class' => "rcmContactAddress",
           ),
-        Q($part['name']));
+        Q($name ? $name : $mailto));
       }
       else {
-        $out .= html::span(array('title' => $part['mailto'], 'class' => "rcmContactAddress"), Q($part['name']));
+        $out .= html::span(array('title' => $mailto, 'class' => "rcmContactAddress"),
+          Q($name ? $name : $mailto));
       }
 
-      if ($addicon) {
+      if ($addicon && $got_writable_abook) {
         $out .= '&nbsp;' . html::a(array(
             'href' => "#add",
-            'onclick' => sprintf("return %s.command('add-contact','%s',this)", JS_OBJECT_NAME, urlencode($part['string'])),
+            'onclick' => sprintf("return %s.command('add-contact','%s',this)", JS_OBJECT_NAME, urlencode($string)),
             'title' => rcube_label('addtoaddressbook'),
           ),
           html::img(array(
@@ -1208,155 +1275,202 @@ function rcmail_address_string($input, $max=null, $linked=false, $addicon=null)
       }
     }
     else {
-      if ($part['name'])
-        $out .= Q($part['name']);
-      if ($part['mailto'])
-        $out .= (strlen($out) ? ' ' : '') . sprintf('&lt;%s&gt;', Q($part['mailto']));
+      if ($name)
+        $out .= Q($name);
+      if ($mailto)
+        $out .= (strlen($out) ? ' ' : '') . sprintf('&lt;%s&gt;', Q($mailto));
     }
-      
+
     if ($c>$j)
       $out .= ','.($max ? '&nbsp;' : ' ');
-        
+
     if ($max && $j==$max && $c>$j) {
       $out .= '...';
       break;
     }
   }
-    
+
   return $out;
 }
 
 
 /**
  * Wrap text to a given number of characters per line
- * but respect the mail quotation of replies messages (>)
+ * but respect the mail quotation of replies messages (>).
+ * Finally add another quotation level by prpending the lines
+ * with >
  *
  * @param string Text to wrap
  * @param int The line width
  * @return string The wrapped text
  */
-function rcmail_wrap_quoted($text, $max = 76)
+function rcmail_wrap_and_quote($text, $length = 72)
 {
   // Rebuild the message body with a maximum of $max chars, while keeping quoted message.
+  $max = min(77, $length + 8);
   $lines = preg_split('/\r?\n/', trim($text));
   $out = '';
 
   foreach ($lines as $line) {
-    if (strlen($line) > $max) {
-      if (preg_match('/^([>\s]+)/', $line, $regs)) {
-        $length = strlen($regs[0]);
-        $prefix = substr($line, 0, $length);
-
-        // Remove '> ' from the line, then wordwrap() the line
-        $line = rc_wordwrap(substr($line, $length), $max - $length);
-
-        // Rebuild the line with '> ' at the beginning of each 'subline'
-        $newline = '';
-        foreach (explode("\n", $line) as $l) {
-          $newline .= $prefix . $l . "\n";
-        }
-
-        // Remove the righest newline char
-        $line = rtrim($newline);
-      }
-      else {
-        $line = rc_wordwrap($line, $max);
+    // don't wrap already quoted lines
+    if ($line[0] == '>')
+      $line = '>' . rtrim($line);
+    else if (mb_strlen($line) > $max) {
+      $newline = '';
+      foreach(explode("\n", rc_wordwrap($line, $length - 2)) as $l) {
+        if (strlen($l))
+          $newline .= '> ' . $l . "\n";
+        else
+          $newline .= ">\n";
       }
+      $line = rtrim($newline);
     }
+    else
+      $line = '> ' . $line;
 
     // Append the line
     $out .= $line . "\n";
   }
-  
+
   return $out;
 }
 
 
+function rcmail_draftinfo_encode($p)
+{
+  $parts = array();
+  foreach ($p as $key => $val)
+    $parts[] = $key . '=' . ($key == 'folder' ? base64_encode($val) : $val);
+
+  return join('; ', $parts);
+}
+
+
+function rcmail_draftinfo_decode($str)
+{
+  $info = array();
+  foreach (preg_split('/;\s+/', $str) as $part) {
+    list($key, $val) = explode('=', $part, 2);
+    if ($key == 'folder')
+      $val = base64_decode($val);
+    $info[$key] = $val;
+  }
+
+  return $info;
+}
+
+
 function rcmail_message_part_controls()
-  {
+{
   global $MESSAGE;
-  
+
   $part = asciiwords(get_input_value('_part', RCUBE_INPUT_GPC));
   if (!is_object($MESSAGE) || !is_array($MESSAGE->parts) || !($_GET['_uid'] && $_GET['_part']) || !$MESSAGE->mime_parts[$part])
     return '';
-    
+
   $part = $MESSAGE->mime_parts[$part];
   $table = new html_table(array('cols' => 3));
-  
+
   if (!empty($part->filename)) {
     $table->add('title', Q(rcube_label('filename')));
     $table->add(null, Q($part->filename));
     $table->add(null, '[' . html::a('?'.str_replace('_frame=', '_download=', $_SERVER['QUERY_STRING']), Q(rcube_label('download'))) . ']');
   }
-  
+
   if (!empty($part->size)) {
     $table->add('title', Q(rcube_label('filesize')));
     $table->add(null, Q(show_bytes($part->size)));
   }
-  
+
   return $table->show($attrib);
-  }
+}
 
 
 
 function rcmail_message_part_frame($attrib)
-  {
+{
   global $MESSAGE;
-  
+
   $part = $MESSAGE->mime_parts[asciiwords(get_input_value('_part', RCUBE_INPUT_GPC))];
   $ctype_primary = strtolower($part->ctype_primary);
 
   $attrib['src'] = './?' . str_replace('_frame=', ($ctype_primary=='text' ? '_show=' : '_preload='), $_SERVER['QUERY_STRING']);
 
   return html::iframe($attrib);
-  }
+}
 
 
 /**
  * clear message composing settings
  */
 function rcmail_compose_cleanup()
-  {
+{
   if (!isset($_SESSION['compose']))
     return;
 
-  rcmail::get_instance()->plugins->exec_hook('cleanup_attachments',array());
-  
-  rcube_sess_unset('compose');
-  }
-  
+  $rcmail = rcmail::get_instance();
+  $rcmail->plugins->exec_hook('attachments_cleanup', array());
+  $rcmail->session->remove('compose');
+}
+
 
 /**
- * Send the given message compose object using the configured method
+ * Send the given message using the configured method
+ *
+ * @param object $message    Reference to Mail_MIME object
+ * @param string $from       Sender address string
+ * @param array  $mailto     Array of recipient address strings
+ * @param array  $smtp_error SMTP error array (reference)
+ * @param string $body_file  Location of file with saved message body (reference)
+ * @param array  $smtp_opts  SMTP options (e.g. DSN request)
+ *
+ * @return boolean Send status.
  */
-function rcmail_deliver_message(&$message, $from, $mailto, &$smtp_error)
+function rcmail_deliver_message(&$message, $from, $mailto, &$smtp_error, &$body_file, $smtp_opts=null)
 {
   global $CONFIG, $RCMAIL;
 
-  $msg_body = $message->get();
   $headers = $message->headers();
 
   // send thru SMTP server using custom SMTP library
   if ($CONFIG['smtp_server']) {
     // generate list of recipients
     $a_recipients = array($mailto);
-  
+
     if (strlen($headers['Cc']))
       $a_recipients[] = $headers['Cc'];
     if (strlen($headers['Bcc']))
       $a_recipients[] = $headers['Bcc'];
-  
+
     // clean Bcc from header for recipients
     $send_headers = $headers;
     unset($send_headers['Bcc']);
     // here too, it because txtHeaders() below use $message->_headers not only $send_headers
     unset($message->_headers['Bcc']);
 
+    $smtp_headers = $message->txtHeaders($send_headers, true);
+
+    if ($message->getParam('delay_file_io')) {
+      // use common temp dir
+      $temp_dir = $RCMAIL->config->get('temp_dir');
+      $body_file = tempnam($temp_dir, 'rcmMsg');
+      if (PEAR::isError($mime_result = $message->saveMessageBody($body_file))) {
+        raise_error(array('code' => 600, 'type' => 'php',
+            'file' => __FILE__, 'line' => __LINE__,
+            'message' => "Could not create message: ".$mime_result->getMessage()),
+            TRUE, FALSE);
+        return false;
+      }
+      $msg_body = fopen($body_file, 'r');
+    } else {
+      $msg_body = $message->get();
+    }
+
     // send message
     if (!is_object($RCMAIL->smtp))
       $RCMAIL->smtp_init(true);
-     
-    $sent = $RCMAIL->smtp->send_mail($from, $a_recipients, ($foo = $message->txtHeaders($send_headers, true)), $msg_body);
+
+    $sent = $RCMAIL->smtp->send_mail($from, $a_recipients, $smtp_headers, $msg_body, $smtp_opts);
     $smtp_response = $RCMAIL->smtp->get_response();
     $smtp_error = $RCMAIL->smtp->get_error();
 
@@ -1371,30 +1485,59 @@ function rcmail_deliver_message(&$message, $from, $mailto, &$smtp_error)
     $headers_enc = $message->headers($headers);
     $headers_php = $message->_headers;
     unset($headers_php['To'], $headers_php['Subject']);
-    
+
     // reset stored headers and overwrite
     $message->_headers = array();
     $header_str = $message->txtHeaders($headers_php);
-    
+
     // #1485779
     if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
       if (preg_match_all('/<([^@]+@[^>]+)>/', $headers_enc['To'], $m)) {
         $headers_enc['To'] = implode(', ', $m[1]);
-        }
       }
-       
-    if (ini_get('safe_mode'))
-      $sent = mail($headers_enc['To'], $headers_enc['Subject'], $msg_body, $header_str);
-    else
-      $sent = mail($headers_enc['To'], $headers_enc['Subject'], $msg_body, $header_str, "-f$from");
+    }
+
+    $msg_body = $message->get();
+
+    if (PEAR::isError($msg_body))
+      raise_error(array('code' => 600, 'type' => 'php',
+            'file' => __FILE__, 'line' => __LINE__,
+            'message' => "Could not create message: ".$msg_body->getMessage()),
+            TRUE, FALSE);
+    else {
+      $delim   = $RCMAIL->config->header_delimiter();
+      $to      = $headers_enc['To'];
+      $subject = $headers_enc['Subject'];
+      $header_str = rtrim($header_str);
+
+      if ($delim != "\r\n") {
+        $header_str = str_replace("\r\n", $delim, $header_str);
+        $msg_body   = str_replace("\r\n", $delim, $msg_body);
+        $to         = str_replace("\r\n", $delim, $to);
+        $subject    = str_replace("\r\n", $delim, $subject);
+      }
+
+      if (ini_get('safe_mode'))
+        $sent = mail($to, $subject, $msg_body, $header_str);
+      else
+        $sent = mail($to, $subject, $msg_body, $header_str, "-f$from");
+    }
   }
-  
+
   if ($sent) {
     $RCMAIL->plugins->exec_hook('message_sent', array('headers' => $headers, 'body' => $msg_body));
-    
+
     // remove MDN headers after sending
     unset($headers['Return-Receipt-To'], $headers['Disposition-Notification-To']);
-    
+
+    // get all recipients
+    if ($headers['Cc'])
+      $mailto .= $headers['Cc'];
+    if ($headers['Bcc'])
+      $mailto .= $headers['Bcc'];
+    if (preg_match_all('/<([^@]+@[^>]+)>/', $mailto, $m))
+      $mailto = implode(', ', array_unique($m[1]));
+
     if ($CONFIG['smtp_log']) {
       write_log('sendmail', sprintf("User %s [%s]; Message for %s; %s",
         $RCMAIL->user->get_username(),
@@ -1403,20 +1546,32 @@ function rcmail_deliver_message(&$message, $from, $mailto, &$smtp_error)
         !empty($smtp_response) ? join('; ', $smtp_response) : ''));
     }
   }
-  
+
+  if (is_resource($msg_body)) {
+    fclose($msg_body);
+  }
+
   $message->_headers = array();
   $message->headers($headers);
-  
+
   return $sent;
 }
 
-
-function rcmail_send_mdn($uid, &$smtp_error)
+/**
+ * Send the MDN response
+ *
+ * @param mixed $message    Original message object (rcube_message) or UID
+ * @param array $smtp_error SMTP error array (reference)
+ *
+ * @return boolean Send status
+ */
+function rcmail_send_mdn($message, &$smtp_error)
 {
   global $RCMAIL, $IMAP;
 
-  $message = new rcube_message($uid);
-  
+  if (!is_a($message, rcube_message))
+    $message = new rcube_message($message);
+
   if ($message->headers->mdn_to && !$message->headers->mdn_sent &&
     ($IMAP->check_permflag('MDNSENT') || $IMAP->check_permflag('*')))
   {
@@ -1425,27 +1580,26 @@ function rcmail_send_mdn($uid, &$smtp_error)
     $recipient = array_shift($IMAP->decode_address_list($message->headers->mdn_to));
     $mailto = $recipient['mailto'];
 
-    $compose = new rcube_mail_mime($RCMAIL->config->header_delimiter());
-    $compose->setParam(array(
-      'text_encoding' => 'quoted-printable',
-      'html_encoding' => 'quoted-printable',
-      'head_encoding' => 'quoted-printable',
-      'head_charset'  => RCMAIL_CHARSET,
-      'html_charset'  => RCMAIL_CHARSET,
-      'text_charset'  => RCMAIL_CHARSET,
-    ));
-    
+    $compose = new Mail_mime("\r\n");
+
+    $compose->setParam('text_encoding', 'quoted-printable');
+    $compose->setParam('html_encoding', 'quoted-printable');
+    $compose->setParam('head_encoding', 'quoted-printable');
+    $compose->setParam('head_charset', RCMAIL_CHARSET);
+    $compose->setParam('html_charset', RCMAIL_CHARSET);
+    $compose->setParam('text_charset', RCMAIL_CHARSET);
+
     // compose headers array
     $headers = array(
-      'Date' => date('r'),
+      'Date' => rcmail_user_date(),
       'From' => $sender,
       'To'   => $message->headers->mdn_to,
       'Subject' => rcube_label('receiptread') . ': ' . $message->subject,
-      'Message-ID' => sprintf('<%s@%s>', md5(uniqid('rcmail'.mt_rand(),true)), $RCMAIL->config->mail_domain($_SESSION['imap_host'])),
+      'Message-ID' => rcmail_gen_message_id(),
       'X-Sender' => $identity['email'],
-      'Content-Type' => 'multipart/report; report-type=disposition-notification',
+      'References' => trim($message->headers->references . ' ' . $message->headers->messageID),
     );
-    
+
     if ($agent = $RCMAIL->config->get('useragent'))
       $headers['User-Agent'] = $agent;
 
@@ -1454,22 +1608,23 @@ function rcmail_send_mdn($uid, &$smtp_error)
       "\t" . rcube_label("subject") . ': ' . $message->subject . "\r\n" .
       "\t" . rcube_label("sent") . ': ' . format_date($message->headers->date, $RCMAIL->config->get('date_long')) . "\r\n" .
       "\r\n" . rcube_label("receiptnote") . "\r\n";
-    
-    $ua = $RCMAIL->config->get('useragent', "RoundCube Webmail (Version ".RCMAIL_VERSION.")");
+
+    $ua = $RCMAIL->config->get('useragent', "Roundcube Webmail (Version ".RCMAIL_VERSION.")");
     $report = "Reporting-UA: $ua\r\n";
-    
+
     if ($message->headers->to)
         $report .= "Original-Recipient: {$message->headers->to}\r\n";
-    
+
     $report .= "Final-Recipient: rfc822; {$identity['email']}\r\n" .
                "Original-Message-ID: {$message->headers->messageID}\r\n" .
                "Disposition: manual-action/MDN-sent-manually; displayed\r\n";
-    
+
     $compose->headers($headers);
+    $compose->setContentType('multipart/report', array('report-type'=> 'disposition-notification'));
     $compose->setTXTBody(rc_wordwrap($body, 75, "\r\n"));
     $compose->addAttachment($report, 'message/disposition-notification', 'MDNPart2.txt', false, '7bit', 'inline');
 
-    $sent = rcmail_deliver_message($compose, $identity['email'], $mailto, $smtp_error);
+    $sent = rcmail_deliver_message($compose, $identity['email'], $mailto, $smtp_error, $body_file);
 
     if ($sent)
     {
@@ -1477,10 +1632,66 @@ function rcmail_send_mdn($uid, &$smtp_error)
       return true;
     }
   }
-  
+
   return false;
 }
 
+// Returns unique Message-ID
+function rcmail_gen_message_id()
+{
+  global $RCMAIL;
+
+  $local_part  = md5(uniqid('rcmail'.mt_rand(),true));
+  $domain_part = $RCMAIL->user->get_username('domain');
+
+  // Try to find FQDN, some spamfilters doesn't like 'localhost' (#1486924)
+  if (!preg_match('/\.[a-z]+$/i', $domain_part)) {
+    if (($host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']))
+      && preg_match('/\.[a-z]+$/i', $host)) {
+        $domain_part = $host;
+    }
+    else if (($host = preg_replace('/:[0-9]+$/', '', $_SERVER['SERVER_NAME']))
+      && preg_match('/\.[a-z]+$/i', $host)) {
+        $domain_part = $host;
+    }
+  }
+
+  return sprintf('<%s@%s>', $local_part, $domain_part);
+}
+
+// Returns RFC2822 formatted current date in user's timezone
+function rcmail_user_date()
+{
+  global $CONFIG;
+
+  // get user's timezone
+  if ($CONFIG['timezone'] === 'auto') {
+    $tz = isset($_SESSION['timezone']) ? $_SESSION['timezone'] : date('Z')/3600;
+  }
+  else {
+    $tz = $CONFIG['timezone'];
+    if ($CONFIG['dst_active'])
+      $tz++;
+  }
+
+  $date = time() + $tz * 60 * 60;
+  $date = gmdate('r', $date);
+  $tz   = sprintf('%+05d', intval($tz) * 100 + ($tz - intval($tz)) * 60);
+  $date = preg_replace('/[+-][0-9]{4}$/', $tz, $date);
+
+  return $date;
+}
+
+// Fixes some content-type names
+function rcmail_fix_mimetype($name)
+{
+  // Some versions of Outlook create garbage Content-Type:
+  // application/pdf.A520491B_3BF7_494D_8855_7FAC2C6C0608
+  if (preg_match('/^application\/pdf.+/', $name))
+    $name = 'application/pdf';
+
+  return $name;
+}
 
 function rcmail_search_filter($attrib)
 {
@@ -1490,7 +1701,7 @@ function rcmail_search_filter($attrib)
     $attrib['id'] = 'rcmlistfilter';
 
   $attrib['onchange'] = JS_OBJECT_NAME.'.filter_mailbox(this.value)';
-  
+
   /*
     RFC3501 (6.4.4): 'ALL', 'RECENT', 
     'ANSWERED', 'DELETED', 'FLAGGED', 'SEEN',
@@ -1511,7 +1722,23 @@ function rcmail_search_filter($attrib)
 
   $OUTPUT->add_gui_object('search_filter', $attrib['id']);
 
-  return $out;                                                                         
+  return $out;
+}
+
+function rcmail_message_error($uid=null)
+{
+  global $RCMAIL;
+
+  // Set env variables for messageerror.html template
+  if ($RCMAIL->action == 'show') {
+    $mbox_name = $RCMAIL->imap->get_mailbox_name();
+    $RCMAIL->output->set_env('mailbox', $mbox_name);
+    $RCMAIL->output->set_env('uid', null);
+  }
+  // display error message
+  $RCMAIL->output->show_message('messageopenerror', 'error');
+  // ... display message error page
+  $RCMAIL->output->send('messageerror');
 }
 
 // register UI objects
@@ -1530,4 +1757,4 @@ $OUTPUT->add_handlers(array(
   'searchform' => array($OUTPUT, 'search_form'),
 ));
 
-?>
+
index d20714a6cc80c6cff988b7d92140b4d27368ba53..3b5810fa396105efdcd3bc9f2da9a74b6836701a 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/get.inc                                            |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: get.inc 2979 2009-09-22 07:50:32Z alec $
+ $Id: get.inc 4115 2010-10-20 11:41:48Z alec $
 
 */
 
@@ -35,12 +35,36 @@ if (!empty($_GET['_preload'])) {
 
 ob_end_clean();
 
+// Now we need IMAP connection
+if (!$RCMAIL->imap_connect()) {
+  // Get action is often executed simultanously.
+  // Some servers have MAXPERIP or other limits.
+  // To workaround this we'll wait for some time
+  // and try again (once).
+  // Note: Random sleep interval is used to minimize concurency
+  // in getting message parts
+  if (!isset($_GET['_redirected'])) {
+    usleep(rand(10,30)*100000); // 1-3 sec.
+    header('Location: ' . $_SERVER['REQUEST_URI'] . '&_redirected=1');
+  }
+  else {
+    raise_error(array(
+      'code' => 500, 'type' => 'php',
+      'file' => __FILE__, 'line' => __LINE__,
+      'message' => 'Unable to get/display message part. IMAP connection error'),
+      true, true);
+  }
+  // Don't kill session, just quit (#1486995)
+  exit;
+}
+
 // similar code as in program/steps/mail/show.inc
 if (!empty($_GET['_uid'])) {
   $RCMAIL->config->set('prefer_html', true);
   $MESSAGE = new rcube_message(get_input_value('_uid', RCUBE_INPUT_GET));
 }
 
+send_nocacheing_headers();
 
 // show part page
 if (!empty($_GET['_frame'])) {
@@ -49,25 +73,14 @@ if (!empty($_GET['_frame'])) {
 }
 
 else if ($pid = get_input_value('_part', RCUBE_INPUT_GET)) {
-  // TNEF encoded attachment part
-  if (preg_match('/^winmail\.([0-9.]+)\.([0-9]+)$/', $pid, $nt)) {
-    $pid = $nt[1]; $i = $nt[2];
-    if ($part = $MESSAGE->mime_parts[$pid]) {
-      $tnef_arr = $IMAP->tnef_decode($part, $MESSAGE->uid);
-      if (is_a($tnef_arr[$i], 'rcube_message_part'))
-        $MESSAGE->mime_parts[$pid] = $tnef_arr[$i];
-    }
-  }
-  
+
   if ($part = $MESSAGE->mime_parts[$pid]) {
     $ctype_primary = strtolower($part->ctype_primary);
     $ctype_secondary = strtolower($part->ctype_secondary);
     $mimetype = sprintf('%s/%s', $ctype_primary, $ctype_secondary);
-    
-    $browser = new rcube_browser;
 
-    send_nocacheing_headers();
-    
+    $browser = $RCMAIL->output->browser;
+
     // send download headers
     if ($_GET['_download']) {
       header("Content-Type: application/octet-stream");
@@ -78,12 +91,13 @@ else if ($pid = get_input_value('_part', RCUBE_INPUT_GET)) {
       header("Content-Type: text/$ctype_secondary; charset=" . ($part->charset ? $part->charset : RCMAIL_CHARSET));
     }
     else {
+      $mimetype = rcmail_fix_mimetype($mimetype);
       header("Content-Type: $mimetype");
       header("Content-Transfer-Encoding: binary");
     }
 
     // deliver part content
-    if ($ctype_primary == 'text' && $ctype_secondary == 'html') {
+    if ($ctype_primary == 'text' && $ctype_secondary == 'html' && empty($_GET['_download'])) {
       // get part body if not available
       if (!$part->body)
         $part->body = $MESSAGE->get_part_content($part->mime_id);
@@ -94,20 +108,21 @@ else if ($pid = get_input_value('_part', RCUBE_INPUT_GET)) {
     else {
       // don't kill the connection if download takes more than 30 sec.
       @set_time_limit(0);
-      
+
       $filename = $part->filename ? $part->filename : ($MESSAGE->subject ? $MESSAGE->subject : 'roundcube') . '.'.$ctype_secondary;
-      
+      $filename = preg_replace('[\r\n]', '', $filename);
+
       if ($browser->ie && $browser->ver < 7)
         $filename = rawurlencode(abbreviate_string($filename, 55));
       else if ($browser->ie)
         $filename = rawurlencode($filename);
       else
         $filename = addcslashes($filename, '"');
-      
+
       $disposition = !empty($_GET['_download']) ? 'attachment' : 'inline';
-      
+
       header("Content-Disposition: $disposition; filename=\"$filename\"");
-      
+
       // turn off output buffering and print part content
       if ($part->body)
         echo $part->body;
@@ -139,4 +154,4 @@ else {
 header('HTTP/1.1 404 Not Found');
 exit;
 
-?>
+
index 7dd7853df6356098ce5a2958c7083c215f4f79e9..9418f5749734d6d3accac1827c611aa3b5970c10 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/getunread.inc                                      |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: getunread.inc 2966 2009-09-18 10:15:17Z alec $
+ $Id: getunread.inc 4294 2010-12-01 09:52:23Z alec $
 
 */
 
@@ -23,17 +23,26 @@ $a_folders = $IMAP->list_mailboxes();
 
 if (!empty($a_folders))
 {
-  $inbox = ($IMAP->get_mailbox_name() == 'INBOX');
+  $current = $IMAP->get_mailbox_name();
+  $inbox = ($current == 'INBOX');
+  $check_all = (bool)$RCMAIL->config->get('check_all_folders');
+
   foreach ($a_folders as $mbox_row) {
-    $unseen = $IMAP->messagecount($mbox_row, 'UNSEEN', !isset($_SESSION['unseen_count'][$mbox_row]));
+    $unseen_old = rcmail_get_unseen_count($mbox_row);
+
+    if (!$check_all && $unseen_old !== null && $mbox_row != $current)
+      $unseen = $unseen_old;
+    else
+      $unseen = $IMAP->messagecount($mbox_row, 'UNSEEN', $unseen_old === null);
 
-    if ($unseen || !isset($_SESSION['unseen_count'][$mbox_row])) {
+    if ($unseen || $unseen_old === null) {
       $OUTPUT->command('set_unread_count', $mbox_row, $unseen, $inbox && $mbox_row == 'INBOX');
     }
-    $_SESSION['unseen_count'][$mbox_row] = $unseen;
+
+    rcmail_set_unseen_count($mbox_row, $unseen);
   }
 }
 
 $OUTPUT->send();
 
-?>
+
index 4e3f969bd23a5524cee64e298f5d7becb7bb79ec..8966ba541f29439e2d17437992a5222f8934734f 100644 (file)
@@ -3,8 +3,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/headers.inc                                        |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Aleksander Machniak <alec@alec.pl>                            |
  +-----------------------------------------------------------------------+
 
- $Id: mark.inc 1580 2008-06-30 09:36:18Z alec $
+ $Id: headers.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
 if ($uid = get_input_value('_uid', RCUBE_INPUT_POST))
 {
-  $source = $IMAP->get_raw_headers($uid);
-
-  if ($source)
-    {
-    $browser = new rcube_browser;
-    
-    if ($browser->ie)
-      $source = rc_utf8_clean($source);          
-
-    $source = htmlspecialchars(trim($source));
-    $source = preg_replace('/\t/', '&nbsp;&nbsp;&nbsp;&nbsp;', $source);
-    $source = preg_replace('/^([a-z0-9_:-]+)/im', '<font class="bold">'.'\1'.'</font>', $source);
-    $source = preg_replace('/\r?\n/', '<br />', $source);
-    
-    $OUTPUT->command('set_headers', $source);
-    $OUTPUT->send();
+    $source = $IMAP->get_raw_headers($uid);
+
+    if ($source !== false) {
+        $source = htmlspecialchars(trim($source));
+        $source = preg_replace(
+            array(
+                '/\n[\t\s]+/',
+                '/^([a-z0-9_:-]+)/im',
+                '/\r?\n/'
+            ),
+            array(
+                "\n&nbsp;&nbsp;&nbsp;&nbsp;",
+                '<font class="bold">\1</font>',
+                '<br />'
+            ), $source);
+
+        $OUTPUT->command('set_headers', $source);
+    }
+    else {
+        $RCMAIL->output->show_message('messageopenerror', 'error');
     }
+
+    $OUTPUT->send();
 }
-  
+
 exit;
 
-?>
+
index bd4080a762b6d418b2876ad557c9bdcb4e3afe39..682e066f5af8c421d08b0d0d623be1f342dec80e 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/list.inc                                           |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: list.inc 2983 2009-09-23 12:32:09Z alec $
+ $Id: list.inc 4321 2010-12-08 12:52:04Z alec $
 
 */
 
@@ -33,8 +33,6 @@ if ($sort = get_input_value('_sort', RCUBE_INPUT_GET))
   $save_arr = array();
   $_SESSION['sort_col'] = $save_arr['message_sort_col'] = $sort_col;
   $_SESSION['sort_order'] = $save_arr['message_sort_order'] = $sort_order;
-  
-  $RCMAIL->user->save_prefs($save_arr);
 }
 else
 {
@@ -43,6 +41,16 @@ else
   $sort_order = isset($_SESSION['sort_order']) ? $_SESSION['sort_order'] : $CONFIG['message_sort_order'];
 }
 
+// is there a set of columns for this request?
+if ($cols = get_input_value('_cols', RCUBE_INPUT_GET))
+{
+  $save_arr = array();
+  $save_arr['list_cols'] = explode(',', $cols);
+}
+
+if ($save_arr)
+  $RCMAIL->user->save_prefs($save_arr);
+
 $mbox_name = $IMAP->get_mailbox_name();
 
 // initialize searching result if search_filter is used
@@ -50,37 +58,63 @@ if ($_SESSION['search_filter'] && $_SESSION['search_filter'] != 'ALL')
 {
   $search_request = md5($mbox_name.$_SESSION['search_filter']);
   $IMAP->search($mbox_name, $_SESSION['search_filter'], RCMAIL_CHARSET, $sort_col);
-  $_SESSION['search'][$search_request] = $IMAP->get_search_set();
+  $_SESSION['search'] = $IMAP->get_search_set();
+  $_SESSION['search_request'] = $search_request;
   $OUTPUT->set_env('search_request', $search_request);
 }
 
 // fetch message headers
-if ($count = $IMAP->messagecount($mbox_name, 'ALL', !empty($_REQUEST['_refresh'])))
+if ($count = $IMAP->messagecount($mbox_name, $IMAP->threading ? 'THREADS' : 'ALL', !empty($_REQUEST['_refresh'])))
   $a_headers = $IMAP->list_headers($mbox_name, NULL, $sort_col, $sort_order);
 
+// update search set (possible change of threading mode)
+if (!empty($_REQUEST['_search']) && isset($_SESSION['search'])
+    && $_SESSION['search_request'] == $_REQUEST['_search']
+) {
+  $_SESSION['search'] = $IMAP->get_search_set();
+}
+// remove old search data
+else if (empty($_REQUEST['_search']) && isset($_SESSION['search'])) {
+  $RCMAIL->session->remove('search');
+}
+
+
+// empty result? we'll skip UNSEEN counting in rcmail_send_unread_count()
+if (empty($search_request) && empty($a_headers)) {
+    $unseen = 0;
+}
+
 // update mailboxlist
-rcmail_send_unread_count($mbox_name, !empty($_REQUEST['_refresh']));
+rcmail_send_unread_count($mbox_name, !empty($_REQUEST['_refresh']), $unseen);
 
 // update message count display
 $pages = ceil($count/$IMAP->page_size);
 $OUTPUT->set_env('messagecount', $count);
 $OUTPUT->set_env('pagecount', $pages);
+$OUTPUT->set_env('threading', (bool) $IMAP->threading);
+$OUTPUT->set_env('current_page', $count ? $IMAP->list_page : 1);
 $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count));
 $OUTPUT->command('set_mailboxname', rcmail_get_mailbox_name_text());
 
 // add message rows
+rcmail_js_message_list($a_headers, FALSE, $cols);
 if (isset($a_headers) && count($a_headers))
 {
-  rcmail_js_message_list($a_headers);
   if ($search_request)
     $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $count));
 }
-else if ($search_request)
-  $OUTPUT->show_message('searchnomatch', 'notice');
-else
-  $OUTPUT->show_message('nomessagesfound', 'notice');
+else {
+  // handle IMAP errors (e.g. #1486905)
+  if ($err_code = $IMAP->get_error_code()) {
+    rcmail_display_server_error();
+  }
+  else if ($search_request)
+    $OUTPUT->show_message('searchnomatch', 'notice');
+  else
+    $OUTPUT->show_message('nomessagesfound', 'notice');
+}
 
 // send response
 $OUTPUT->send();
 
-?>
+
index 81b87d8a14cbc2c858da0a545288450715dcefb9..e3def529edbc198b52bbfdfd778a98b86159d4ef 100644 (file)
@@ -3,8 +3,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/mark.inc                                           |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -14,7 +14,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: mark.inc 2960 2009-09-17 12:36:32Z alec $
+ $Id: mark.inc 4321 2010-12-08 12:52:04Z alec $
 
 */
 
@@ -36,30 +36,33 @@ if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_va
 
   if ($flag == 'DELETED' && $CONFIG['skip_deleted'] && $_POST['_from'] != 'show') {
     // count messages before changing anything
-    $old_count = $IMAP->messagecount();
+    $old_count = $IMAP->messagecount(NULL, $IMAP->threading ? 'THREADS' : 'ALL');
     $old_pages = ceil($old_count / $IMAP->page_size);
     $count = sizeof(explode(',', $uids));
   }
 
   $marked = $IMAP->set_flag($uids, $flag);
-  
-  if ($marked == -1) {
+
+  if (!$marked) {
     // send error message
     if ($_POST['_from'] != 'show')
       $OUTPUT->command('list_mailbox');
-    $OUTPUT->show_message('errormarking', 'error');
+    rcmail_display_server_error('errormarking');
     $OUTPUT->send();
     exit;
   }
+  else if (empty($_POST['_quiet'])) {
+    $OUTPUT->show_message('messagemarked', 'confirmation');
+  }
+
+  if ($flag == 'DELETED' && $CONFIG['read_when_deleted'] && !empty($_POST['_ruid'])) {
+    $ruids = get_input_value('_ruid', RCUBE_INPUT_POST);
+    $read = $IMAP->set_flag($ruids, 'SEEN');
 
-  if($flag == 'DELETED' && $CONFIG['read_when_deleted'] && !empty($_POST['_ruid'])) {
-    $uids = get_input_value('_ruid', RCUBE_INPUT_POST);
-    $read = $IMAP->set_flag($uids, 'SEEN');
-    
-    if ($read != -1 && !$CONFIG['skip_deleted'])
-      $OUTPUT->command('flag_deleted_as_read', $uids);
+    if ($read && !$CONFIG['skip_deleted'])
+      $OUTPUT->command('flag_deleted_as_read', $ruids);
   }
-    
+
   if ($flag == 'SEEN' || $flag == 'UNSEEN' || ($flag == 'DELETED' && !$CONFIG['skip_deleted'])) {
     rcmail_send_unread_count($IMAP->get_mailbox_name());
   }
@@ -72,16 +75,16 @@ if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_va
     } else {
       // refresh saved search set after moving some messages
       if (($search_request = get_input_value('_search', RCUBE_INPUT_GPC)) && $IMAP->search_set) {
-        $_SESSION['search'][$search_request] = $IMAP->refresh_search();
+        $_SESSION['search'] = $IMAP->refresh_search();
       }
 
-      $msg_count      = $IMAP->messagecount();
+      $msg_count      = $IMAP->messagecount(NULL, $IMAP->threading ? 'THREADS' : 'ALL');
       $pages          = ceil($msg_count / $IMAP->page_size);
       $nextpage_count = $old_count - $IMAP->page_size * $IMAP->list_page;
       $remaining      = $msg_count - $IMAP->page_size * ($IMAP->list_page - 1);
 
       // jump back one page (user removed the whole last page)
-      if ($IMAP->list_page > 1 && $nextpage_count <= 0 && $remaining == 0) {
+      if ($IMAP->list_page > 1 && $remaining == 0) {
         $IMAP->set_page($IMAP->list_page-1);
         $_SESSION['page'] = $IMAP->list_page;
         $jump_back = true;
@@ -95,27 +98,32 @@ if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_va
       // update mailboxlist
       $mbox = $IMAP->get_mailbox_name();
       $unseen_count = $msg_count ? $IMAP->messagecount($mbox, 'UNSEEN') : 0;
-      $old_unseen = $_SESSION['unseen_count'][$mbox];
+      $old_unseen = rcmail_get_unseen_count($mbox);
+
       if ($old_unseen != $unseen_count) {
         $OUTPUT->command('set_unread_count', $mbox, $unseen_count, ($mbox == 'INBOX'));
-       $_SESSION['unseen_count'][$mbox] = $unseen_count;
+        rcmail_set_unseen_count($mbox, $unseen_count);
       }
       $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($msg_count));
 
+      if ($IMAP->threading)
+           $count = get_input_value('_count', RCUBE_INPUT_POST);
+
       // add new rows from next page (if any)
-      if (($jump_back || $nextpage_count > 0)) {
+      if ($count && $uids != '*' && ($jump_back || $nextpage_count > 0)) {
         $sort_col   = isset($_SESSION['sort_col'])   ? $_SESSION['sort_col']   : $CONFIG['message_sort_col'];
         $sort_order = isset($_SESSION['sort_order']) ? $_SESSION['sort_order'] : $CONFIG['message_sort_order'];
-  
-        $a_headers = $IMAP->list_headers($mbox, NULL, $sort_col, $sort_order, $count);
-      
-        rcmail_js_message_list($a_headers, false, false);
+
+        $a_headers = $IMAP->list_headers($mbox, NULL, $sort_col, $sort_order,
+           $jump_back ? NULL : $count);
+
+        rcmail_js_message_list($a_headers, false);
       }
     }
   }
-  
+
   $OUTPUT->send();
 }
-  
+
 exit;
-?>
+
index 967178a4ce5206e5bfa9416f70d0a4daf3213ee6..7bd7fe498349f38de11a54f057b60a23ecfc414f 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/move_del.inc                                       |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: move_del.inc 2960 2009-09-17 12:36:32Z alec $
+ $Id: move_del.inc 4321 2010-12-08 12:52:04Z alec $
 
 */
 
@@ -24,43 +24,50 @@ if (!$OUTPUT->ajax_call)
   return;
 
 // count messages before changing anything
-$old_count = $IMAP->messagecount();
+$old_count = $IMAP->messagecount(NULL, $IMAP->threading ? 'THREADS' : 'ALL');
 $old_pages = ceil($old_count / $IMAP->page_size);
 
 // move messages
-if ($RCMAIL->action=='moveto' && !empty($_POST['_uid']) && !empty($_POST['_target_mbox'])) {
+if ($RCMAIL->action=='moveto' && !empty($_POST['_uid']) && strlen($_POST['_target_mbox'])) {
     $count = sizeof(explode(',', ($uids = get_input_value('_uid', RCUBE_INPUT_POST))));
-    $target = get_input_value('_target_mbox', RCUBE_INPUT_POST);
-    $mbox = get_input_value('_mbox', RCUBE_INPUT_POST);
+    $target = get_input_value('_target_mbox', RCUBE_INPUT_POST, true);
+    $mbox = get_input_value('_mbox', RCUBE_INPUT_POST, true);
 
     $moved = $IMAP->move_message($uids, $target, $mbox);
-  
+
     if (!$moved) {
         // send error message
-       if ($_POST['_from'] != 'show')
-          $OUTPUT->command('list_mailbox');
-        $OUTPUT->show_message('errormoving', 'error');
+           if ($_POST['_from'] != 'show')
+            $OUTPUT->command('list_mailbox');
+        rcmail_display_server_error('errormoving');
         $OUTPUT->send();
         exit;
     }
+    else {
+      $OUTPUT->show_message('messagemoved', 'confirmation');
+    }
 
     $addrows = true;
 }
 // delete messages 
 else if ($RCMAIL->action=='delete' && !empty($_POST['_uid'])) {
     $count = sizeof(explode(',', ($uids = get_input_value('_uid', RCUBE_INPUT_POST))));
-    $mbox = get_input_value('_mbox', RCUBE_INPUT_POST);
+    $mbox = get_input_value('_mbox', RCUBE_INPUT_POST, true);
+
     $del = $IMAP->delete_message($uids, $mbox);
-  
+
     if (!$del) {
         // send error message
-       if ($_POST['_from'] != 'show')
-          $OUTPUT->command('list_mailbox');
-        $OUTPUT->show_message('errordeleting', 'error');
+           if ($_POST['_from'] != 'show')
+            $OUTPUT->command('list_mailbox');
+        rcmail_display_server_error('errordeleting');
         $OUTPUT->send();
         exit;
     }
-    
+    else {
+      $OUTPUT->show_message('messagedeleted', 'confirmation');
+    }
+
     $addrows = true;
 }
 // unknown action or missing query param
@@ -70,7 +77,7 @@ else {
 
 // refresh saved search set after moving some messages
 if (($search_request = get_input_value('_search', RCUBE_INPUT_GPC)) && $IMAP->search_set) {
-    $_SESSION['search'][$search_request] = $IMAP->refresh_search();
+    $_SESSION['search'] = $IMAP->refresh_search();
 }
 
 if ($_POST['_from'] == 'show')
@@ -82,13 +89,13 @@ if ($_POST['_from'] == 'show')
 }
 else
 {
-  $msg_count      = $IMAP->messagecount();
+  $msg_count      = $IMAP->messagecount(NULL, $IMAP->threading ? 'THREADS' : 'ALL');
   $pages          = ceil($msg_count / $IMAP->page_size);
   $nextpage_count = $old_count - $IMAP->page_size * $IMAP->list_page;
   $remaining      = $msg_count - $IMAP->page_size * ($IMAP->list_page - 1);
 
   // jump back one page (user removed the whole last page)
-  if ($IMAP->list_page > 1 && $nextpage_count <= 0 && $remaining == 0) {
+  if ($IMAP->list_page > 1 && $remaining == 0) {
     $IMAP->set_page($IMAP->list_page-1);
     $_SESSION['page'] = $IMAP->list_page;
     $jump_back = true;
@@ -102,32 +109,36 @@ else
   // update mailboxlist
   $mbox = $IMAP->get_mailbox_name();
   $unseen_count = $msg_count ? $IMAP->messagecount($mbox, 'UNSEEN') : 0;
-  $old_unseen = $_SESSION['unseen_count'][$mbox];
-  
+  $old_unseen = rcmail_get_unseen_count($mbox);
+
   if ($old_unseen != $unseen_count) {
     $OUTPUT->command('set_unread_count', $mbox, $unseen_count, ($mbox == 'INBOX'));
-    $_SESSION['unseen_count'][$mbox] = $unseen_count;
+    rcmail_set_unseen_count($mbox, $unseen_count);
   }
 
-  if ($RCMAIL->action=='moveto' && $target) {
+  if ($RCMAIL->action=='moveto' && strlen($target)) {
     rcmail_send_unread_count($target, true);
   }
 
-  $OUTPUT->command('set_quota', rcmail_quota_content($IMAP->get_quota()));
+  $OUTPUT->command('set_quota', rcmail_quota_content());
   $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($msg_count));
 
+  if ($IMAP->threading)
+    $count = get_input_value('_count', RCUBE_INPUT_POST);
+
   // add new rows from next page (if any)
-  if ($addrows && ($jump_back || $nextpage_count > 0)) {
+  if ($addrows && $count && $uids != '*' && ($jump_back || $nextpage_count > 0)) {
     $sort_col   = isset($_SESSION['sort_col'])   ? $_SESSION['sort_col']   : $CONFIG['message_sort_col'];
     $sort_order = isset($_SESSION['sort_order']) ? $_SESSION['sort_order'] : $CONFIG['message_sort_order'];
 
-    $a_headers = $IMAP->list_headers($mbox, NULL, $sort_col, $sort_order, $count);
+    $a_headers = $IMAP->list_headers($mbox, NULL, $sort_col, $sort_order,
+      $jump_back ? NULL : $count);
 
-    rcmail_js_message_list($a_headers, false, false);
+    rcmail_js_message_list($a_headers, false);
   }
 }
 
 // send response
 $OUTPUT->send();
 
-?>
+
diff --git a/program/steps/mail/pagenav.inc b/program/steps/mail/pagenav.inc
new file mode 100644 (file)
index 0000000..e295114
--- /dev/null
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/mail/pagenav.inc                                        |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Updates message page navigation controls                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
+ +-----------------------------------------------------------------------+
+
+ $Id: show.inc 4176 2010-11-04 09:59:55Z alec $
+
+*/
+
+$uid = get_input_value('_uid', RCUBE_INPUT_GET);
+
+// Select mailbox first, for better performance
+$mbox_name = $IMAP->get_mailbox_name();
+$IMAP->select_mailbox($mbox_name);
+
+// Get messages count (only messages, no threads here)
+$cnt  = $IMAP->messagecount(NULL, 'ALL');
+
+if ($_SESSION['sort_col'] == 'date' && $_SESSION['sort_order'] != 'DESC'
+    && empty($_REQUEST['_search']) && !$CONFIG['skip_deleted'] && !$IMAP->threading
+) {
+    // this assumes that we are sorted by date_DESC
+    $seq   = $IMAP->get_id($uid);
+    $index = $cnt - $seq;
+
+    $prev  = $IMAP->get_uid($seq + 1);
+    $first = $IMAP->get_uid($cnt);
+    $next  = $IMAP->get_uid($seq - 1);
+    $last  = $IMAP->get_uid(1);
+}
+else {
+    // Only if we use custom sorting
+    $a_msg_index = $IMAP->message_index(NULL, $_SESSION['sort_col'], $_SESSION['sort_order']);
+
+    $index = array_search($IMAP->get_id($uid), $a_msg_index);
+
+    $count = count($a_msg_index);
+    $prev  = isset($a_msg_index[$index-1]) ? $IMAP->get_uid($a_msg_index[$index-1]) : -1;
+    $first = $count > 1 ? $IMAP->get_uid($a_msg_index[0]) : -1;
+    $next  = isset($a_msg_index[$index+1]) ? $IMAP->get_uid($a_msg_index[$index+1]) : -1;
+    $last  = $count > 1 ? $IMAP->get_uid($a_msg_index[$count-1]) : -1;
+}
+
+// Set UIDs and activate navigation buttons
+if ($prev > 0) {
+    $OUTPUT->set_env('prev_uid', $prev);
+    $OUTPUT->command('enable_command', 'previousmessage', 'firstmessage', true);
+}
+if ($next > 0) {
+    $OUTPUT->set_env('next_uid', $next);
+    $OUTPUT->command('enable_command', 'nextmessage', 'lastmessage', true);
+}
+if ($first > 0)
+    $OUTPUT->set_env('first_uid', $first);
+if ($last > 0)
+    $OUTPUT->set_env('last_uid', $last);
+
+// Don't need a real messages count value
+$OUTPUT->set_env('messagecount', 1);
+
+// Set rowcount text
+$OUTPUT->command('set_rowcount', rcube_label(array(
+    'name' => 'messagenrof',
+    'vars' => array('nr'  => $index+1, 'count' => $cnt)
+)));
+
+$OUTPUT->send();
+
diff --git a/program/steps/mail/rss.inc b/program/steps/mail/rss.inc
deleted file mode 100644 (file)
index 54362c7..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/steps/mail/rss.inc                                            |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Send mailboxcontents as RSS feed                                    |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Sjon Hortensius <sjon@hortensius.net>                         |
- +-----------------------------------------------------------------------+
-
- $Id: rss.inc 2927 2009-09-05 12:31:19Z alec $
-
-*/
-
-
-function rss_encode($string){
-       $string = rep_specialchars_output($string, 'xml');
-       return $string;
-}
-
-
-$REMOTE_REQUEST = TRUE;
-$OUTPUT_TYPE = 'rss';
-
-$webmail_url = 'http';
-if (strstr('HTTPS', $_SERVER['SERVER_PROTOCOL'] )!== FALSE || $RCMAIL->config->get('use_https'))
-  $webmail_url .= 's';
-$webmail_url .= '://'.$_SERVER['SERVER_NAME'];
-if ($_SERVER['SERVER_PORT'] != '80')
-       $webmail_url .= ':'.$_SERVER['SERVER_PORT'];
-$webmail_url .= '/';
-if (dirname($_SERVER['SCRIPT_NAME']) != '/')
-       $webmail_url .= dirname($_SERVER['SCRIPT_NAME']).'/';
-
-$webmail_url .= '?_task=mail';
-
-$messagecount_unread = $IMAP->messagecount('INBOX', 'UNSEEN', TRUE);
-$messagecount = $IMAP->messagecount();
-
-$sort_col = 'date';
-$sort_order = 'DESC';
-
-// Send global XML output
-header('Content-type: text/xml');
-echo '<?xml version="1.0" encoding="'.RCMAIL_CHARSET.'"?>
-       <rss version="2.0"
-        xmlns:dc="http://purl.org/dc/elements/1.1/"
-        xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
-        xmlns:admin="http://webns.net/mvcb/"
-        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-        xmlns:content="http://purl.org/rss/1.0/modules/content/">';
-
-// Send channel-specific output
-echo '
-       <channel>
-               <pubDate>'.date('r').'</pubDate>
-               <lastBuildDate>'.date('r').'</lastBuildDate>
-               <ttl>5</ttl>
-               <docs>http://blogs.law.harvard.edu/tech/rss</docs>
-               <description>INBOX contains '.$messagecount.' messages, of which '.$messagecount_unread.' unread</description>
-               <link>'.rss_encode($webmail_url, 'xml') .'</link>
-               <title>webmail for '.rss_encode($_SESSION['username'].' @ '.$_SESSION['imap_host']).'</title>
-               <generator>'.rss_encode($CONFIG['useragent'], 'xml').' (RSS extension by Sjon Hortensius)</generator>
-               <image>
-                       <link>http://www.roundcube.net/</link>
-                       <title>'.rss_encode($CONFIG['product_name']).' logo</title>
-                       <url>'.rss_encode($webmail_url.'skins/default/images/roundcube_logo.png').'</url>
-               </image>';
-
-// Check if the user wants to override the default sortingmethode
-if (isset($_GET['_sort']))
-  list($sort_col, $sort_order) = explode('_', get_input_value('_sort', RCUBE_INPUT_GET));
-
-// Add message to output
-if ($messagecount > 0)
-  {
-  $items = $IMAP->list_headers('INBOX', null, $sort_col, $sort_order);
-  foreach ($items as $item)
-    {
-
-    // Convert '"name" <email>' to 'email (name)'
-    if (strstr($item->from, '<'))
-      $item->from = preg_replace('~"?([^"]*)"? <([^>]*)>~', '\2 (\1)', $item->from);
-
-    $item->link = $webmail_url.'&_task=mail&_action=show&_uid='.$item->uid.'&_mbox=INBOX';
-
-    $item->body = $IMAP->get_body($item->uid);
-
-    // Print the actual messages
-    echo '
-                       <item>
-                               <title>'.rss_encode($item->subject).'</title>
-                               <link>'.rss_encode($item->link).'</link>
-                               <description><![CDATA['."\n".nl2br(rss_encode($item->body))."\n".']]></description>
-                               <author>'.rss_encode($item->from).'</author>
-                               <category></category>
-                               <guid>'.rss_encode($item->link).'</guid>
-                               <pubDate>'.date('r', $item->timestamp).'</pubDate>
-                       </item>';
-    }
-  }
-
-echo '</channel>
-</rss>';
-
-exit;
-?>
index 9f054f9387057c95310b7058d2268c7ed003a3b7..da2627152d4f758dbe543197e3f54bc4ebfbae51 100644 (file)
@@ -11,6 +11,8 @@
  |         Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
+ $Id: search.inc 4321 2010-12-08 12:52:04Z alec $
+
 */
 
 $REMOTE_REQUEST = TRUE;
@@ -70,12 +72,16 @@ else if (preg_match("/^body:.*/i", $str))
 else if(trim($str))
 {
   if ($headers) {
-    $headers = explode(',', $headers);
-    foreach($headers as $header)
+    foreach(explode(',', $headers) as $header)
       switch ($header) {
         case 'text': $subject['text'] = 'TEXT'; break;
-        default: $subject[$header] = 'HEADER '.$header;
+        default:     $subject[$header] = 'HEADER '.strtoupper($header);
       }
+    
+    // save search modifiers for the current folder to user prefs
+    $search_mods = $RCMAIL->config->get('search_mods', $SEARCH_MODS_DEFAULT);
+    $search_mods[$mbox] = array_fill_keys(array_keys($subject), 1);
+    $RCMAIL->user->save_prefs(array('search_mods' => $search_mods));
   } else {
     // search in subject by default
     $subject['subject'] = 'HEADER SUBJECT';
@@ -88,7 +94,6 @@ if ($subject) {
   $search_str .= str_repeat(' OR', count($subject)-1);
   foreach ($subject as $sub)
     $search_str .= sprintf(" %s {%d}\r\n%s", $sub, strlen($search), $search);
-  $_SESSION['search_mods'] = $subject;
 }
 
 $search_str = trim($search_str);
@@ -99,34 +104,37 @@ if ($search_str)
 
 // Get the headers
 $result_h = $IMAP->list_headers($mbox, 1, $_SESSION['sort_col'], $_SESSION['sort_order']);
-$count = $IMAP->messagecount();
+$count = $IMAP->messagecount(NULL, $IMAP->threading ? 'THREADS' : 'ALL');
 
 // save search results in session
 if (!is_array($_SESSION['search']))
   $_SESSION['search'] = array();
 
 if ($search_str) {
-  $_SESSION['search'][$search_request] = $IMAP->get_search_set();
+  $_SESSION['search'] = $IMAP->get_search_set();
   $_SESSION['last_text_search'] = $str;
 }
+$_SESSION['search_request'] = $search_request;
 
 // Make sure we got the headers
-if (!empty($result_h))
-{
+if (!empty($result_h)) {
   rcmail_js_message_list($result_h);
   if ($search_str)
-    $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $count));
+    $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $IMAP->messagecount(NULL, 'ALL')));
 }
-else
-{
+// handle IMAP errors (e.g. #1486905)
+else  if ($err_code = $IMAP->get_error_code()) {
+  rcmail_display_server_error();
+}
+else {
   $OUTPUT->show_message('searchnomatch', 'notice');
 }
 
 // update message count display
-$OUTPUT->set_env('search_request', $search_str ? $search_request : -1);
+$OUTPUT->set_env('search_request', $search_str ? $search_request : '');
 $OUTPUT->set_env('messagecount', $count);
 $OUTPUT->set_env('pagecount', ceil($count/$IMAP->page_size));
 $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count, 1));
 $OUTPUT->send();
 
-?>
+
index afd1735e76fe867a0416061d8083cb2622aff5d5..eed6081047febe71a17133ad4c8592eb99960a06 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/sendmail.inc                                       |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: sendmail.inc 3042 2009-10-14 10:52:27Z alec $
+ $Id: sendmail.inc 4395 2011-01-06 11:48:11Z thomasb $
 
 */
 
-
 // remove all scripts and act as called in frame
 $OUTPUT->reset();
 $OUTPUT->framed = TRUE;
 
-$savedraft = !empty($_POST['_draft']) ? TRUE : FALSE;
+$savedraft = !empty($_POST['_draft']) ? true : false;
 
 /****** checks ********/
 
 if (!isset($_SESSION['compose']['id'])) {
-  raise_error(array('code' => 500, 'type' => 'smtp', 'file' => __FILE__, 'message' => "Invalid compose ID"), true, false);
-  console("Sendmail error", $_SESSION['compose']);
-  $OUTPUT->show_message("An internal error occured. Please try again.", 'error');
+  raise_error(array('code' => 500, 'type' => 'php',
+    'file' => __FILE__, 'line' => __LINE__,
+    'message' => "Invalid compose ID"), true, false);
+
+  $OUTPUT->show_message('internalerror', 'error');
   $OUTPUT->send('iframe');
 }
 
@@ -59,8 +60,7 @@ if (!$savedraft) {
 function rcmail_encrypt_header($what)
 {
   global $CONFIG, $RCMAIL;
-  if (!$CONFIG['http_received_header_encrypt'])
-  {
+  if (!$CONFIG['http_received_header_encrypt']) {
     return $what;
   }
   return $RCMAIL->encrypt($what);
@@ -68,52 +68,39 @@ function rcmail_encrypt_header($what)
 
 // get identity record
 function rcmail_get_identity($id)
-  {
+{
   global $USER, $OUTPUT;
-  
-  if ($sql_arr = $USER->get_identity($id))
-    {
+
+  if ($sql_arr = $USER->get_identity($id)) {
     $out = $sql_arr;
     $out['mailto'] = $sql_arr['email'];
-    
-    // Special chars as defined by RFC 822 need to in quoted string (or escaped).
-    if (preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $sql_arr['name']))
-      $name = '"' . addcslashes($sql_arr['name'], '"') . '"';
-    else
-      $name = $sql_arr['name'];
-
-    $out['string'] = rcube_charset_convert($name, RCMAIL_CHARSET, $OUTPUT->get_charset());
-    if ($sql_arr['email'])
-      $out['string'] .= ' <' . $sql_arr['email'] . '>';
+    $out['string'] = format_email_recipient($sql_arr['email'],
+      rcube_charset_convert($sql_arr['name'], RCMAIL_CHARSET, $OUTPUT->get_charset()));
 
     return $out;
-    }
-
-  return FALSE;  
   }
 
+  return FALSE;
+}
+
 /**
  * go from this:
- * <img src=".../tiny_mce/plugins/emotions/images/smiley-cool.gif" border="0" alt="Cool" title="Cool" />
+ * <img src="http[s]://.../tiny_mce/plugins/emotions/images/smiley-cool.gif" border="0" alt="Cool" title="Cool" />
  *
  * to this:
  *
- * <IMG src="cid:smiley-cool.gif"/>
+ * <img src="/path/on/server/.../tiny_mce/plugins/emotions/images/smiley-cool.gif" border="0" alt="Cool" title="Cool" />
  * ...
- * ------part...
- * Content-Type: image/gif
- * Content-Transfer-Encoding: base64
- * Content-ID: <smiley-cool.gif>
  */
-function rcmail_attach_emoticons(&$mime_message)
+function rcmail_fix_emoticon_paths(&$mime_message)
 {
   global $CONFIG;
 
-  $body = $mime_message->getHtmlBody();
+  $body = $mime_message->getHTMLBody();
 
   // remove any null-byte characters before parsing
   $body = preg_replace('/\x00/', '', $body);
-  
+
   $searchstr = 'program/js/tiny_mce/plugins/emotions/img/';
   $offset = 0;
 
@@ -132,7 +119,7 @@ function rcmail_attach_emoticons(&$mime_message)
 
         if (! in_array($image_name, $included_images)) {
           // add the image to the MIME message
-          if(! $mime_message->addHTMLImage($img_file, 'image/gif', '', true, $image_name))
+          if (! $mime_message->addHTMLImage($img_file, 'image/gif', '', true, $image_name))
             $OUTPUT->show_message("emoticonerror", 'error');
           array_push($included_images, $image_name);
         }
@@ -148,10 +135,10 @@ function rcmail_attach_emoticons(&$mime_message)
   return $body;
 }
 
-// parse email address input
-function rcmail_email_input_format($mailto)
+// parse email address input (and count addresses)
+function rcmail_email_input_format($mailto, $count=false, $check=true)
 {
-  global $EMAIL_FORMAT_ERROR;
+  global $EMAIL_FORMAT_ERROR, $RECIPIENT_COUNT;
 
   $regexp = array('/[,;]\s*[\r\n]+/', '/[\r\n]+/', '/[,;]\s*$/m', '/;/', '/(\S{1})(<\S+@\S+>)/U');
   $replace = array(', ', ', ', '', ',', '\\1 \\2');
@@ -166,9 +153,11 @@ function rcmail_email_input_format($mailto)
     $item = trim($item);
     // address in brackets without name (do nothing)
     if (preg_match('/^<\S+@\S+>$/', $item)) {
+      $item = idn_to_ascii($item);
       $result[] = $item;
     // address without brackets and without name (add brackets)
     } else if (preg_match('/^\S+@\S+$/', $item)) {
+      $item = idn_to_ascii($item);
       $result[] = '<'.$item.'>';
     // address with name (handle name)
     } else if (preg_match('/\S+@\S+>*$/', $item, $matches)) {
@@ -177,8 +166,9 @@ function rcmail_email_input_format($mailto)
       $name = trim($name);
       if ($name && ($name[0] != '"' || $name[strlen($name)-1] != '"')
           && preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $name)) {
-         $name = '"'.addcslashes($name, '"').'"';
+            $name = '"'.addcslashes($name, '"').'"';
       }
+      $address = idn_to_ascii($address);
       if (!preg_match('/^<\S+@\S+>$/', $address))
         $address = '<'.$address.'>';
 
@@ -190,34 +180,40 @@ function rcmail_email_input_format($mailto)
 
     // check address format
     $item = trim($item, '<>');
-    if ($item && !check_email($item)) {
+    if ($item && $check && !check_email($item)) {
       $EMAIL_FORMAT_ERROR = $item;
       return;
     }
   }
 
+  if ($count) {
+    $RECIPIENT_COUNT += count($result);
+  }
+
   return implode(', ', $result);
 }
 
+
 /****** compose message ********/
 
 if (strlen($_POST['_draft_saveid']) > 3)
   $olddraftmessageid = get_input_value('_draft_saveid', RCUBE_INPUT_POST);
 
-$message_id = sprintf('<%s@%s>', md5(uniqid('rcmail'.mt_rand(),true)), $RCMAIL->config->mail_domain($_SESSION['imap_host']));
+$message_id = rcmail_gen_message_id();
 
 // set default charset
 $input_charset = $OUTPUT->get_charset();
 $message_charset = isset($_POST['_charset']) ? $_POST['_charset'] : $input_charset;
 
 $EMAIL_FORMAT_ERROR = NULL;
+$RECIPIENT_COUNT = 0;
 
-$mailto = rcmail_email_input_format(get_input_value('_to', RCUBE_INPUT_POST, TRUE, $message_charset));
-$mailcc = rcmail_email_input_format(get_input_value('_cc', RCUBE_INPUT_POST, TRUE, $message_charset));
-$mailbcc = rcmail_email_input_format(get_input_value('_bcc', RCUBE_INPUT_POST, TRUE, $message_charset));
+$mailto = rcmail_email_input_format(get_input_value('_to', RCUBE_INPUT_POST, TRUE, $message_charset), true);
+$mailcc = rcmail_email_input_format(get_input_value('_cc', RCUBE_INPUT_POST, TRUE, $message_charset), true);
+$mailbcc = rcmail_email_input_format(get_input_value('_bcc', RCUBE_INPUT_POST, TRUE, $message_charset), true);
 
 if ($EMAIL_FORMAT_ERROR) {
-  $OUTPUT->show_message('emailformaterror', 'error', array('email' => $EMAIL_FORMAT_ERROR)); 
+  $OUTPUT->show_message('emailformaterror', 'error', array('email' => $EMAIL_FORMAT_ERROR));
   $OUTPUT->send('iframe');
 }
 
@@ -228,18 +224,30 @@ if (empty($mailto) && !empty($mailcc)) {
 else if (empty($mailto))
   $mailto = 'undisclosed-recipients:;';
 
-// get sender name and address
+// Get sender name and address...
 $from = get_input_value('_from', RCUBE_INPUT_POST, true, $message_charset);
-$identity_arr = rcmail_get_identity($from);
-
-if (!$identity_arr && ($from = rcmail_email_input_format($from))) {
-  if (preg_match('/(\S+@\S+)/', $from, $m))
-    $identity_arr['mailto'] = $m[1];
-} else
-  $from = $identity_arr['mailto'];
+// ... from identity...
+if (is_numeric($from)) {
+  if (is_array($identity_arr = rcmail_get_identity($from))) {
+    if ($identity_arr['mailto'])
+      $from = $identity_arr['mailto'];
+    if ($identity_arr['string'])
+      $from_string = $identity_arr['string'];
+  }
+  else {
+    $from = null;
+  }
+}
+// ... if there is no identity record, this might be a custom from
+else if ($from_string = rcmail_email_input_format($from)) {
+  if (preg_match('/(\S+@\S+)/', $from_string, $m))
+    $from = trim($m[1], '<>');
+  else
+    $from = null;
+}
 
-if (empty($identity_arr['string']))
-  $identity_arr['string'] = $from;
+if (!$from_string && $from)
+  $from_string = $from;
 
 // compose headers array
 $headers = array();
@@ -247,7 +255,7 @@ $headers = array();
 // if configured, the Received headers goes to top, for good measure
 if ($CONFIG['http_received_header'])
 {
-  $nldlm = $RCMAIL->config->header_delimiter() . "\t";
+  $nldlm = "\r\n\t";
   // FROM/VIA
   $http_header = 'from ';
   if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
@@ -259,8 +267,8 @@ if ($CONFIG['http_received_header'])
         $http_header .= ' ('. rcmail_encrypt_header($host) . ')';
     } else {
       $http_header .= (($host != $hostname) ? $hostname : '[' . $host . ']');
-      $http_header .= ' ('. ($host == $hostname ? '' : $hostname . ' ') .
-        '[' . $host .'])';
+      if ($host != $hostname)
+        $http_header .= ' (['. $host .'])';
     }
     $http_header .= $nldlm . ' via ';
   }
@@ -272,143 +280,241 @@ if ($CONFIG['http_received_header'])
       $http_header .= ' ('. rcmail_encrypt_header($host) . ')';
   } else {
     $http_header .= (($host != $hostname) ? $hostname : '[' . $host . ']');
-    $http_header .= ' ('. ($host == $hostname ? '' : $hostname . ' ') .
-      '[' . $host .'])';
+    if ($host != $hostname)
+      $http_header .= ' (['. $host .'])';
   }
   // BY
   $http_header .= $nldlm . 'by ' . $_SERVER['HTTP_HOST'];
   // WITH
-  $http_header .= $nldlm . 'with ' . $_SERVER['SERVER_PROTOCOL'] .
-      ' ('.$_SERVER['REQUEST_METHOD'] . '); ' . date('r');
+  $http_header .= $nldlm . 'with HTTP (' . $_SERVER['SERVER_PROTOCOL'] .
+      ' '.$_SERVER['REQUEST_METHOD'] . '); ' . date('r');
   $http_header = wordwrap($http_header, 69, $nldlm);
 
   $headers['Received'] = $http_header;
 }
 
-$headers['Date'] = date('r');
-$headers['From'] = rcube_charset_convert($identity_arr['string'], RCMAIL_CHARSET, $message_charset);
+$headers['Date'] = rcmail_user_date();
+$headers['From'] = rcube_charset_convert($from_string, RCMAIL_CHARSET, $message_charset);
 $headers['To'] = $mailto;
 
 // additional recipients
-if (!empty($mailcc))
+if (!empty($mailcc)) {
   $headers['Cc'] = $mailcc;
-
-if (!empty($mailbcc))
+}
+if (!empty($mailbcc)) {
   $headers['Bcc'] = $mailbcc;
-  
-if (!empty($identity_arr['bcc']))
+}
+if (!empty($identity_arr['bcc'])) {
   $headers['Bcc'] = ($headers['Bcc'] ? $headers['Bcc'].', ' : '') . $identity_arr['bcc'];
+  $RECIPIENT_COUNT ++;
+}
+
+if (($max_recipients = (int) $RCMAIL->config->get('max_recipients')) > 0) {
+  if ($RECIPIENT_COUNT > $max_recipients) {
+    $OUTPUT->show_message('toomanyrecipients', 'error', array('max' => $max_recipients));
+    $OUTPUT->send('iframe');
+  }
+}
 
 // add subject
 $headers['Subject'] = trim(get_input_value('_subject', RCUBE_INPUT_POST, TRUE, $message_charset));
 
-if (!empty($identity_arr['organization']))
+if (!empty($identity_arr['organization'])) {
   $headers['Organization'] = $identity_arr['organization'];
-
-if (!empty($_POST['_replyto']))
+}
+if (!empty($_POST['_replyto'])) {
   $headers['Reply-To'] = rcmail_email_input_format(get_input_value('_replyto', RCUBE_INPUT_POST, TRUE, $message_charset));
-else if (!empty($identity_arr['reply-to']))
-  $headers['Reply-To'] = $identity_arr['reply-to'];
-
-if (!empty($_SESSION['compose']['reply_msgid']))
+}
+else if (!empty($identity_arr['reply-to'])) {
+  $headers['Reply-To'] = rcmail_email_input_format($identity_arr['reply-to'], false, true);
+}
+if (!empty($headers['Reply-To'])) {
+  $headers['Mail-Reply-To'] = $headers['Reply-To'];
+}
+if (!empty($_POST['_followupto'])) {
+  $headers['Mail-Followup-To'] = rcmail_email_input_format(get_input_value('_followupto', RCUBE_INPUT_POST, TRUE, $message_charset));
+}
+if (!empty($_SESSION['compose']['reply_msgid'])) {
   $headers['In-Reply-To'] = $_SESSION['compose']['reply_msgid'];
+}
+
+// remember reply/forward UIDs in special headers
+if (!empty($_SESSION['compose']['reply_uid']) && $savedraft) {
+  $headers['X-Draft-Info'] = array('type' => 'reply', 'uid' => $_SESSION['compose']['reply_uid']);
+}
+else if (!empty($_SESSION['compose']['forward_uid']) && $savedraft) {
+  $headers['X-Draft-Info'] = array('type' => 'forward', 'uid' => $_SESSION['compose']['forward_uid']);
+}
 
-if (!empty($_SESSION['compose']['references']))
+if (!empty($_SESSION['compose']['references'])) {
   $headers['References'] = $_SESSION['compose']['references'];
+}
 
-if (!empty($_POST['_priority']))
-  {
+if (!empty($_POST['_priority'])) {
   $priority = intval($_POST['_priority']);
   $a_priorities = array(1=>'highest', 2=>'high', 4=>'low', 5=>'lowest');
-  if ($str_priority = $a_priorities[$priority])
+  if ($str_priority = $a_priorities[$priority]) {
     $headers['X-Priority'] = sprintf("%d (%s)", $priority, ucfirst($str_priority));
   }
+}
 
-if (!empty($_POST['_receipt']))
-  {
-  $headers['Return-Receipt-To'] = $identity_arr['string'];
-  $headers['Disposition-Notification-To'] = $identity_arr['string'];
-  }
+if (!empty($_POST['_receipt'])) {
+  $headers['Return-Receipt-To'] = $from_string;
+  $headers['Disposition-Notification-To'] = $from_string;
+}
 
 // additional headers
 $headers['Message-ID'] = $message_id;
 $headers['X-Sender'] = $from;
 
-if (!empty($CONFIG['useragent']))
+if (is_array($headers['X-Draft-Info'])) {
+  $headers['X-Draft-Info'] = rcmail_draftinfo_encode($headers['X-Draft-Info'] + array('folder' => $_SESSION['compose']['mailbox']));
+}
+if (!empty($CONFIG['useragent'])) {
   $headers['User-Agent'] = $CONFIG['useragent'];
+}
+
+// exec hook for header checking and manipulation
+$data = $RCMAIL->plugins->exec_hook('message_outgoing_headers', array('headers' => $headers));
+
+// sending aborted by plugin
+if ($data['abort'] && !$savedraft) {
+  $OUTPUT->show_message($data['message'] ? $data['message'] : 'sendingfailed');
+  $OUTPUT->send('iframe');
+}
+else
+  $headers = $data['headers'];
+
 
-$isHtmlVal = strtolower(get_input_value('_is_html', RCUBE_INPUT_POST));
-$isHtml = ($isHtmlVal == "1");
+$isHtml = (bool) get_input_value('_is_html', RCUBE_INPUT_POST);
 
 // fetch message body
 $message_body = get_input_value('_message', RCUBE_INPUT_POST, TRUE, $message_charset);
 
 if (!$savedraft) {
-  // remove signature's div ID
-  if ($isHtml)
+  if ($isHtml) {
+    // remove signature's div ID
     $message_body = preg_replace('/\s*id="_rc_sig"/', '', $message_body);
 
+    // add inline css for blockquotes
+    $bstyle = 'padding-left:5px; border-left:#1010ff 2px solid; margin-left:5px; width:100%';
+    $message_body = preg_replace('/<blockquote>/',
+      '<blockquote type="cite" style="'.$bstyle.'">', $message_body);
+
+    // append doctype and html/body wrappers
+    $message_body = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">' .
+      "\r\n<html><body>\r\n" . $message_body;
+  }
+
   // generic footer for all messages
-  if (!empty($CONFIG['generic_message_footer'])) {
+  if ($isHtml && !empty($CONFIG['generic_message_footer_html'])) {
+      $footer = file_get_contents(realpath($CONFIG['generic_message_footer_html']));
+      $footer = rcube_charset_convert($footer, RCMAIL_CHARSET, $message_charset);
+  }
+  else if (!empty($CONFIG['generic_message_footer'])) {
     $footer = file_get_contents(realpath($CONFIG['generic_message_footer']));
     $footer = rcube_charset_convert($footer, RCMAIL_CHARSET, $message_charset);
+    if ($isHtml)
+      $footer = '<pre>'.$footer.'</pre>';
   }
+  if ($footer)
+    $message_body .= "\r\n" . $footer;
+  if ($isHtml)
+    $message_body .= "\r\n</body></html>\r\n";
 }
 
-// create extended PEAR::Mail_mime instance
-$MAIL_MIME = new rcube_mail_mime($RCMAIL->config->header_delimiter());
+// set line length for body wrapping
+$LINE_LENGTH = $RCMAIL->config->get('line_length', 72);
+
+// Since we can handle big messages with disk usage, we need more time to work
+@set_time_limit(0);
+
+// create PEAR::Mail_mime instance
+$MAIL_MIME = new Mail_mime("\r\n");
+
+// Check if we have enough memory to handle the message in it
+// It's faster than using files, so we'll do this if we only can
+if (is_array($_SESSION['compose']['attachments']) && $CONFIG['smtp_server']
+  && ($mem_limit = parse_bytes(ini_get('memory_limit'))))
+{
+  $memory = function_exists('memory_get_usage') ? memory_get_usage() : 16*1024*1024; // safe value: 16MB
+
+  foreach ($_SESSION['compose']['attachments'] as $id => $attachment)
+    $memory += $attachment['size'];
+
+  // Yeah, Net_SMTP needs up to 12x more memory, 1.33 is for base64
+  if ($memory * 1.33 * 12 > $mem_limit)
+    $MAIL_MIME->setParam('delay_file_io', true);
+}
 
 // For HTML-formatted messages, construct the MIME message with both
 // the HTML part and the plain-text part
 
 if ($isHtml) {
-  $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body', array('body' => $message_body, 'type' => 'html', 'message' => $MAIL_MIME));
-  $MAIL_MIME->setHTMLBody($plugin['body'] . ($footer ? "\r\n<pre>".$footer.'</pre>' : ''));
+  $plugin = $RCMAIL->plugins->exec_hook('message_outgoing_body',
+    array('body' => $message_body, 'type' => 'html', 'message' => $MAIL_MIME));
+
+  $MAIL_MIME->setHTMLBody($plugin['body']);
+
+  // replace emoticons
+  $plugin['body'] = rcmail_replace_emoticons($plugin['body']);
 
   // add a plain text version of the e-mail as an alternative part.
   $h2t = new html2text($plugin['body'], false, true, 0);
-  $plainTextPart = rc_wordwrap($h2t->get_text(), 75, "\r\n") . ($footer ? "\r\n".$footer : '');
+  $plainTextPart = rc_wordwrap($h2t->get_text(), $LINE_LENGTH, "\r\n");
   $plainTextPart = wordwrap($plainTextPart, 998, "\r\n", true);
-  if (!strlen($plainTextPart)) {
-    // empty message body breaks attachment handling in drafts 
-    $plainTextPart = "\r\n"; 
+  if (!$plainTextPart) {
+    // empty message body breaks attachment handling in drafts
+    $plainTextPart = "\r\n";
+  }
+  else {
+    // make sure all line endings are CRLF (#1486712)
+    $plainTextPart = preg_replace('/\r?\n/', "\r\n", $plainTextPart);
   }
-  $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body', array('body' => $plainTextPart, 'type' => 'alternative', 'message' => $MAIL_MIME));
+
+  $plugin = $RCMAIL->plugins->exec_hook('message_outgoing_body',
+    array('body' => $plainTextPart, 'type' => 'alternative', 'message' => $MAIL_MIME));
+
   $MAIL_MIME->setTXTBody($plugin['body']);
 
-  // look for "emoticon" images from TinyMCE and copy into message as attachments
-  $message_body = rcmail_attach_emoticons($MAIL_MIME);
+  // look for "emoticon" images from TinyMCE and change their src paths to
+  // be file paths on the server instead of URL paths.
+  $message_body = rcmail_fix_emoticon_paths($MAIL_MIME);
 }
-else
-  {
-  $message_body = rc_wordwrap($message_body, 75, "\r\n");
-  if ($footer)
-    $message_body .= "\r\n" . $footer;
+else {
+  $plugin = $RCMAIL->plugins->exec_hook('message_outgoing_body',
+    array('body' => $message_body, 'type' => 'plain', 'message' => $MAIL_MIME));
+
+  $message_body = $plugin['body'];
+
+  // compose format=flowed content if enabled
+  if ($flowed = $RCMAIL->config->get('send_format_flowed', true))
+    $message_body = rcube_message::format_flowed($message_body, min($LINE_LENGTH+2, 79));
+  else
+    $message_body = rc_wordwrap($message_body, $LINE_LENGTH, "\r\n");
+
   $message_body = wordwrap($message_body, 998, "\r\n", true);
   if (!strlen($message_body)) { 
     // empty message body breaks attachment handling in drafts 
     $message_body = "\r\n"; 
   }
-  $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body', array('body' => $message_body, 'type' => 'plain', 'message' => $MAIL_MIME));
-  $MAIL_MIME->setTXTBody($plugin['body'], false, true);
-}
 
-// chose transfer encoding
-$charset_7bit = array('ASCII', 'ISO-2022-JP', 'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-15');
-$transfer_encoding = in_array(strtoupper($message_charset), $charset_7bit) ? '7bit' : '8bit';
+  $MAIL_MIME->setTXTBody($message_body, false, true);
+}
 
 // add stored attachments, if any
-if (is_array($_SESSION['compose']['attachments'])) {
+if (is_array($_SESSION['compose']['attachments']))
+{
   foreach ($_SESSION['compose']['attachments'] as $id => $attachment) {
     // This hook retrieves the attachment contents from the file storage backend
-    $attachment = $RCMAIL->plugins->exec_hook('get_attachment', $attachment);
+    $attachment = $RCMAIL->plugins->exec_hook('attachment_get', $attachment);
 
-    $dispurl = '/\ssrc\s*=\s*[\'"]*\S+display-attachment\S+file=rcmfile' . preg_quote($attachment['id']) . '[\s\'"]\s*/';
+    $dispurl = '/\ssrc\s*=\s*[\'"]*\S+display-attachment\S+file=rcmfile' . preg_quote($attachment['id']) . '[\s\'"]*/';
     $message_body = $MAIL_MIME->getHTMLBody();
     if ($isHtml && (preg_match($dispurl, $message_body) > 0)) {
       $message_body = preg_replace($dispurl, ' src="'.$attachment['name'].'" ', $message_body);
       $MAIL_MIME->setHTMLBody($message_body);
-      
+
       if ($attachment['data'])
         $MAIL_MIME->addHTMLImage($attachment['data'], $attachment['mimetype'], $attachment['name'], false);
       else
@@ -420,72 +526,70 @@ if (is_array($_SESSION['compose']['attachments'])) {
 
       // .eml attachments send inline
       $MAIL_MIME->addAttachment($file,
-        $ctype, 
+        $ctype,
         $attachment['name'],
         ($attachment['data'] ? false : true),
-        ($ctype == 'message/rfc822' ? $transfer_encoding : 'base64'),
+        ($ctype == 'message/rfc822' ? '8bit' : 'base64'),
         ($ctype == 'message/rfc822' ? 'inline' : 'attachment'),
-        $message_charset, '', '', 
+        '', '', '',
         $CONFIG['mime_param_folding'] ? 'quoted-printable' : NULL,
-        $CONFIG['mime_param_folding'] == 2 ? 'quoted-printable' : NULL
+        $CONFIG['mime_param_folding'] == 2 ? 'quoted-printable' : NULL,
+        '', RCMAIL_CHARSET
       );
     }
   }
 }
 
-// add submitted attachments
-if (is_array($_FILES['_attachments']['tmp_name'])) {
-  foreach ($_FILES['_attachments']['tmp_name'] as $i => $filepath) {
-    $ctype = $files['type'][$i];
-    $ctype = str_replace('image/pjpeg', 'image/jpeg', $ctype); // #1484914
-    
-    $MAIL_MIME->addAttachment($filepath, $ctype, $files['name'][$i], true,
-      $ctype == 'message/rfc822' ? $transfer_encoding : 'base64',
-      'attachment', $message_charset, '', '', 
-      $CONFIG['mime_param_folding'] ? 'quoted-printable' : NULL,
-      $CONFIG['mime_param_folding'] == 2 ? 'quoted-printable' : NULL
-    );
-  }
-}
+// choose transfer encoding for plain/text body
+if (preg_match('/[^\x00-\x7F]/', $MAIL_MIME->getTXTBody()))
+  $transfer_encoding = $RCMAIL->config->get('force_7bit') ? 'quoted-printable' : '8bit';
+else
+  $transfer_encoding = '7bit';
 
 // encoding settings for mail composing
-$MAIL_MIME->setParam(array(
-  'text_encoding' => $transfer_encoding,
-  'html_encoding' => 'quoted-printable',
-  'head_encoding' => 'quoted-printable',
-  'head_charset'  => $message_charset,
-  'html_charset'  => $message_charset,
-  'text_charset'  => $message_charset,
-));
-
-$data = $RCMAIL->plugins->exec_hook('outgoing_message_headers', array('headers' => $headers));
-$headers = $data['headers'];
+$MAIL_MIME->setParam('text_encoding', $transfer_encoding);
+$MAIL_MIME->setParam('html_encoding', 'quoted-printable');
+$MAIL_MIME->setParam('head_encoding', 'quoted-printable');
+$MAIL_MIME->setParam('head_charset', $message_charset);
+$MAIL_MIME->setParam('html_charset', $message_charset);
+$MAIL_MIME->setParam('text_charset', $message_charset . ($flowed ? ";\r\n format=flowed" : ''));
 
 // encoding subject header with mb_encode provides better results with asian characters
-if (function_exists("mb_encode_mimeheader"))
-{
+if (function_exists('mb_encode_mimeheader')) {
   mb_internal_encoding($message_charset);
-  $headers['Subject'] = mb_encode_mimeheader($headers['Subject'], $message_charset, 'Q');
+  $headers['Subject'] = mb_encode_mimeheader($headers['Subject'],
+    $message_charset, 'Q', "\r\n", 8);
   mb_internal_encoding(RCMAIL_CHARSET);
 }
 
 // pass headers to message object
 $MAIL_MIME->headers($headers);
 
-// Begin SMTP Delivery Block 
+// Begin SMTP Delivery Block
 if (!$savedraft)
 {
-  // check for 'From' address (identity may be incomplete)
-  if ($identity_arr && !$identity_arr['mailto']) {
+  // check 'From' address (identity may be incomplete)
+  if (empty($from)) {
     $OUTPUT->show_message('nofromaddress', 'error');
-    $OUTPUT->send('iframe'); 
+    $OUTPUT->send('iframe');
   }
 
-  $sent = rcmail_deliver_message($MAIL_MIME, $from, $mailto, $smtp_error);
-  
+  // Handle Delivery Status Notification request
+  if (!empty($_POST['_dsn'])) {
+    $smtp_opts['dsn'] = true;
+  }
+
+  $sent = rcmail_deliver_message($MAIL_MIME, $from, $mailto,
+    $smtp_error, $mailbody_file, $smtp_opts);
+
   // return to compose page if sending failed
   if (!$sent)
     {
+    // remove temp file
+    if ($mailbody_file) {
+      unlink($mailbody_file);
+      }
+
     if ($smtp_error)
       $OUTPUT->show_message($smtp_error['label'], 'error', $smtp_error['vars']); 
     else
@@ -506,7 +610,6 @@ if (!$savedraft)
 } // End of SMTP Delivery Block
 
 
-
 // Determine which folder to save message
 if ($savedraft)
   $store_target = $CONFIG['drafts_mbox'];
@@ -515,55 +618,91 @@ else
 
 if ($store_target)
   {
-  // check if mailbox exists
-  if (!in_array_nocase($store_target, $IMAP->list_mailboxes()))
-    {
-      // folder may be existing but not subscribed (#1485241)
-      if (!in_array_nocase($store_target, $IMAP->list_unsubscribed()))
-        $store_folder = $IMAP->create_mailbox($store_target, TRUE);
-      else if ($IMAP->subscribe($store_target))
-        $store_folder = TRUE;
-    }
-  else
-    $store_folder = TRUE;
-  
+  // check if folder is subscribed
+  if ($IMAP->mailbox_exists($store_target, true))
+    $store_folder = true;
+  // folder may be existing but not subscribed (#1485241)
+  else if (!$IMAP->mailbox_exists($store_target))
+    $store_folder = $IMAP->create_mailbox($store_target, true);
+  else if ($IMAP->subscribe($store_target))
+    $store_folder = true;
+
   // append message to sent box
-  if ($store_folder)
-    $saved = $IMAP->save_message($store_target, $MAIL_MIME->getMessage());
+  if ($store_folder) {
 
-  // raise error if saving failed
-  if (!$saved)
-    {
-    raise_error(array('code' => 800, 'type' => 'imap', 'file' => __FILE__,
-                      'message' => "Could not save message in $store_target"), TRUE, FALSE);
+    // message body in file
+    if ($mailbody_file || $MAIL_MIME->getParam('delay_file_io')) {
+      $headers = $MAIL_MIME->txtHeaders();
+      
+      // file already created
+      if ($mailbody_file)
+        $msg = $mailbody_file;
+      else {
+        $temp_dir = $RCMAIL->config->get('temp_dir');
+        $mailbody_file = tempnam($temp_dir, 'rcmMsg');
+        if (!PEAR::isError($msg = $MAIL_MIME->saveMessageBody($mailbody_file)))
+          $msg = $mailbody_file;
+        }
+      }
+    else {
+      $msg = $MAIL_MIME->getMessage();
+      $headers = '';
+      }
+
+    if (PEAR::isError($msg))
+      raise_error(array('code' => 600, 'type' => 'php',
+           'file' => __FILE__, 'line' => __LINE__,
+            'message' => "Could not create message: ".$msg->getMessage()),
+            TRUE, FALSE);
+    else {
+      $saved = $IMAP->save_message($store_target, $msg, $headers, $mailbody_file ? true : false);
+      }
+
+    if ($mailbody_file) {
+      unlink($mailbody_file);
+      $mailbody_file = null;
+      }
+
+    // raise error if saving failed
+    if (!$saved) {
+      raise_error(array('code' => 800, 'type' => 'imap',
+           'file' => __FILE__, 'line' => __LINE__,
+            'message' => "Could not save message in $store_target"), TRUE, FALSE);
     
-    if ($savedraft) {
-      $OUTPUT->show_message('errorsaving', 'error');
-      $OUTPUT->send('iframe');
+      if ($savedraft) {
+        $OUTPUT->show_message('errorsaving', 'error');
+        $OUTPUT->send('iframe');
+        }
       }
     }
 
   if ($olddraftmessageid)
     {
     // delete previous saved draft
-    $a_deleteid = $IMAP->search($CONFIG['drafts_mbox'], 'HEADER Message-ID '.$olddraftmessageid);
-
-    $deleted = $IMAP->delete_message($IMAP->get_uid($a_deleteid[0], $CONFIG['drafts_mbox']), $CONFIG['drafts_mbox']);
+    $a_deleteid = $IMAP->search_once($CONFIG['drafts_mbox'],
+        'HEADER Message-ID '.$olddraftmessageid, true);
+    $deleted = $IMAP->delete_message($a_deleteid, $CONFIG['drafts_mbox']);
 
     // raise error if deletion of old draft failed
     if (!$deleted)
-      raise_error(array('code' => 800, 'type' => 'imap', 'file' => __FILE__,
-                        'message' => "Could not delete message from ".$CONFIG['drafts_mbox']), TRUE, FALSE);
+      raise_error(array('code' => 800, 'type' => 'imap',
+               'file' => __FILE__, 'line' => __LINE__,
+                'message' => "Could not delete message from ".$CONFIG['drafts_mbox']), TRUE, FALSE);
     }
   }
+// remove temp file
+else if ($mailbody_file) {
+  unlink($mailbody_file);
+  }
+
 
 if ($savedraft)
   {
   $msgid = strtr($message_id, array('>' => '', '<' => ''));
   
   // remember new draft-uid
-  $draftids = $IMAP->search($CONFIG['drafts_mbox'], 'HEADER Message-ID '.$msgid);
-  $_SESSION['compose']['param']['_draft_uid'] = $IMAP->get_uid($draftids[0], $CONFIG['drafts_mbox']);
+  $draftuids = $IMAP->search_once($CONFIG['drafts_mbox'], 'HEADER Message-ID '.$msgid, true);
+  $_SESSION['compose']['param']['_draft_uid'] = $draftuids[0];
 
   // display success
   $OUTPUT->show_message('messagesaved', 'confirmation');
@@ -588,4 +727,4 @@ else
   $OUTPUT->send('iframe');
   }
 
-?>
+
index f1fb7929668484b525f6f0d1a0a9957044bc3fd5..5183154deb86c076fcb2d6c0f4ef70f7cd42e62c 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/sendmdn.inc                                        |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2008-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2008-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: sendmail.inc 930 2007-11-25 17:34:19Z thomasb $
+ $Id: sendmdn.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
@@ -40,5 +40,3 @@ else {
 }
 
 $OUTPUT->send();
-
-?>
\ No newline at end of file
index 5f8790bfcac773802f73e665503c3b6b4e65c2cf..c33f6e9d5d9a502687a1679f514b0169678ad369 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/show.inc                                           |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: show.inc 2933 2009-09-08 08:04:17Z alec $
+ $Id: show.inc 4294 2010-12-01 09:52:23Z alec $
 
 */
 
 $PRINT_MODE = $RCMAIL->action=='print' ? TRUE : FALSE;
 
 // similar code as in program/steps/mail/get.inc
-if ($_GET['_uid']) {
-  $MESSAGE = new rcube_message(get_input_value('_uid', RCUBE_INPUT_GET));
+if ($uid = get_input_value('_uid', RCUBE_INPUT_GET)) {
+  $MESSAGE = new rcube_message($uid);
 
   // if message not found (wrong UID)...
   if (empty($MESSAGE->headers)) {
-    $OUTPUT->show_message('messageopenerror', 'error');
-    // ... display error or preview page
-    if ($RCMAIL->action=='preview' && $OUTPUT->template_exists('messageerror'))
-      $OUTPUT->send('messageerror');
-    else if ($RCMAIL->action=='preview' && $OUTPUT->template_exists('messagepreview'))
-      $OUTPUT->send('messagepreview');
-    // ... go back to the list
-    else {
-      rcmail_overwrite_action('');
-      return;
-    }
+    rcmail_message_error($uid);
   }
 
+  send_nocacheing_headers();
+
   $mbox_name = $IMAP->get_mailbox_name();
-  
+
   // show images?
   rcmail_check_safe($MESSAGE);
 
-  // calculate Etag for this request
-  $etag = md5($MESSAGE->uid.$mbox_name.session_id()
-    .intval($MESSAGE->headers->mdn_sent)
-    .intval($MESSAGE->is_safe)
-    .(!empty($MESSAGE->attachments) ? intval($CONFIG['inline_images']) : '')
-    .intval($PRINT_MODE)
-    .$_SESSION['sort_col'].$_SESSION['sort_order']
-    .$IMAP->messagecount($mbox_name, 'ALL', true)
-    );
-
-  // allow caching, unless remote images are present
-  if ((bool)$MESSAGE->is_safe)
-    send_nocacheing_headers();
-  else if (empty($CONFIG['devel_mode']))
-    send_modified_header($_SESSION['login_time'], $etag, !$MESSAGE->headers->seen);
-
   // set message charset as default
   if (!empty($MESSAGE->headers->charset))
     $IMAP->set_charset($MESSAGE->headers->charset);
 
-  $OUTPUT->set_pagetitle($MESSAGE->subject);
-  
+  $OUTPUT->set_pagetitle(abbreviate_string($MESSAGE->subject, 128, '...', true));
+
   // give message uid to the client
   $OUTPUT->set_env('uid', $MESSAGE->uid);
   // set environement
   $OUTPUT->set_env('safemode', $MESSAGE->is_safe);
   $OUTPUT->set_env('sender', $MESSAGE->sender['string']);
   $OUTPUT->set_env('permaurl', rcmail_url('show', array('_uid' => $MESSAGE->uid, '_mbox' => $mbox_name)));
+  $OUTPUT->set_env('delimiter', $IMAP->get_hierarchy_delimiter());
   $OUTPUT->set_env('mailbox', $mbox_name);
 
   if ($CONFIG['trash_mbox'])
@@ -85,10 +62,13 @@ if ($_GET['_uid']) {
     $OUTPUT->set_env('skip_deleted', true);
   if ($CONFIG['display_next'])
     $OUTPUT->set_env('display_next', true);
+  if ($MESSAGE->headers->others['list-post'])
+    $OUTPUT->set_env('list_post', true);
 
   if (!$OUTPUT->ajax_call)
-    $OUTPUT->add_label('checkingmail', 'deletemessage', 'movemessagetotrash', 'movingmessage');
-        
+    $OUTPUT->add_label('checkingmail', 'deletemessage', 'movemessagetotrash',
+      'movingmessage', 'deletingmessage');
+
   // check for unset disposition notification
   if ($MESSAGE->headers->mdn_to &&
       !$MESSAGE->headers->mdn_sent && !$MESSAGE->headers->seen &&
@@ -96,66 +76,27 @@ if ($_GET['_uid']) {
       $mbox_name != $CONFIG['drafts_mbox'] &&
       $mbox_name != $CONFIG['sent_mbox'])
   {
-    if (intval($CONFIG['mdn_requests']) === 1)
-    {
-      if (rcmail_send_mdn($MESSAGE->uid, $smtp_error))
+    $mdn_cfg = intval($CONFIG['mdn_requests']);
+
+    if ($mdn_cfg == 1 || (($mdn_cfg == 3 || $mdn_cfg ==  4) && rcmail_contact_exists($MESSAGE->sender['mailto']))) {
+      // Send MDN
+      if (rcmail_send_mdn($MESSAGE, $smtp_error))
         $OUTPUT->show_message('receiptsent', 'confirmation');
       else if ($smtp_error)
         $OUTPUT->show_message($smtp_error['label'], 'error', $smtp_error['vars']);
-      else     
+      else
         $OUTPUT->show_message('errorsendingreceipt', 'error');
     }
-    else if (empty($CONFIG['mdn_requests']))
-    {
+    else if ($mdn_cfg != 2 && $mdn_cfg != 4) {
+      // Ask user
       $OUTPUT->add_label('mdnrequest');
       $OUTPUT->set_env('mdn_request', true);
     }
   }
 
-  // get previous, first, next and last message UID
-  if ($RCMAIL->action != 'preview' && $RCMAIL->action != 'print')
-    {
-    $next = $prev = $first = $last = -1;
-
-    if ($_SESSION['sort_col'] == 'date' && $_SESSION['sort_order'] != 'DESC'
-        && empty($_REQUEST['_search']) && !$IMAP->skip_deleted)
-      {
-      // this assumes that we are sorted by date_DESC
-      $cnt = $IMAP->messagecount();
-      $seq = $IMAP->get_id($MESSAGE->uid);
-      $MESSAGE->index = $cnt - $seq;
-
-      $prev = $IMAP->get_uid($seq + 1);
-      $first = $IMAP->get_uid($cnt);
-      $next = $IMAP->get_uid($seq - 1);
-      $last = $IMAP->get_uid(1);
-      }
-    else 
-      {
-      // Only if we use custom sorting
-      $a_msg_index = $IMAP->message_index(NULL, $_SESSION['sort_col'], $_SESSION['sort_order']);
-
-      $MESSAGE->index = array_search($IMAP->get_id($MESSAGE->uid), $a_msg_index);
-
-      $prev = isset($a_msg_index[$MESSAGE->index-1]) ? $IMAP->get_uid($a_msg_index[$MESSAGE->index-1]) : -1 ;
-      $first = count($a_msg_index)>0 ? $IMAP->get_uid($a_msg_index[0]) : -1;
-      $next = isset($a_msg_index[$MESSAGE->index+1]) ? $IMAP->get_uid($a_msg_index[$MESSAGE->index+1]) : -1 ;
-      $last = count($a_msg_index)>0 ? $IMAP->get_uid($a_msg_index[count($a_msg_index)-1]) : -1;
-      }
-
-    if ($prev > 0)
-      $OUTPUT->set_env('prev_uid', $prev);
-    if ($first > 0)
-      $OUTPUT->set_env('first_uid', $first);
-    if ($next > 0)
-      $OUTPUT->set_env('next_uid', $next);
-    if ($last > 0)
-      $OUTPUT->set_env('last_uid', $last);
-    }
-
-  if (!$MESSAGE->headers->seen)
+  if (!$MESSAGE->headers->seen && ($RCMAIL->action == 'show' || ($RCMAIL->action == 'preview' && intval($CONFIG['preview_pane_mark_read']) == 0)))
     $RCMAIL->plugins->exec_hook('message_read', array('uid' => $MESSAGE->uid,
-      'mailbox' => $IMAP->mailbox, 'message' => $MESSAGE));
+      'mailbox' => $mbox_name, 'message' => $MESSAGE));
 }
 
 
@@ -163,7 +104,7 @@ if ($_GET['_uid']) {
 function rcmail_message_attachments($attrib)
 {
   global $PRINT_MODE, $MESSAGE;
-  
+
   $out = $ol = '';
 
   if (sizeof($MESSAGE->attachments)) {
@@ -188,7 +129,7 @@ function rcmail_message_attachments($attrib)
               'return %s.command(\'load-attachment\',{part:\'%s\', mimetype:\'%s\'},this)',
               JS_OBJECT_NAME,
               $attach_prop->mime_id,
-              $attach_prop->mimetype),
+              rcmail_fix_mimetype($attach_prop->mimetype)),
               'title' => Q($title),
             ),
             Q($filename)));
@@ -196,33 +137,46 @@ function rcmail_message_attachments($attrib)
     }
 
     $out = html::tag('ul', $attrib, $ol, html::$common_attrib);
-  } 
-  
+  }
+
   return $out;
 }
 
-
-
 function rcmail_remote_objects_msg($attrib)
 {
   global $MESSAGE, $RCMAIL;
-  
+
   if (!$attrib['id'])
     $attrib['id'] = 'rcmremoteobjmsg';
-  
+
   $msg = Q(rcube_label('blockedimages')) . '&nbsp;';
   $msg .= html::a(array('href' => "#loadimages", 'onclick' => JS_OBJECT_NAME.".command('load-images')"), Q(rcube_label('showimages')));
-  
+
   // add link to save sender in addressbook and reload message
   if ($MESSAGE->sender['mailto'] && $RCMAIL->config->get('show_images') == 1) {
     $msg .= ' ' . html::a(array('href' => "#alwaysload", 'onclick' => JS_OBJECT_NAME.".command('always-load')", 'style' => "white-space:nowrap"),
       Q(rcube_label(array('name' => 'alwaysshow', 'vars' => array('sender' => $MESSAGE->sender['mailto'])))));
   }
-  
+
   $RCMAIL->output->add_gui_object('remoteobjectsmsg', $attrib['id']);
   return html::div($attrib, $msg);
 }
 
+function rcmail_contact_exists($email)
+{
+  global $RCMAIL;
+
+  if ($email) {
+    // @TODO: search in all address books?
+    $CONTACTS = $RCMAIL->get_address_book(null, true);
+    $existing = $CONTACTS->search('email', $email, true, false);
+    if ($existing->count)
+      return true;
+  }
+
+  return false;
+}
+
 
 $OUTPUT->add_handlers(array(
   'messageattachments' => 'rcmail_message_attachments',
@@ -230,8 +184,8 @@ $OUTPUT->add_handlers(array(
   'blockedobjects' => 'rcmail_remote_objects_msg'));
 
 
-if ($RCMAIL->action=='print' && $OUTPUT->template_exists('printmessage'))
-  $OUTPUT->send('printmessage', false);
+if ($RCMAIL->action=='print' && $OUTPUT->template_exists('messageprint'))
+  $OUTPUT->send('messageprint', false);
 else if ($RCMAIL->action=='preview' && $OUTPUT->template_exists('messagepreview'))
   $OUTPUT->send('messagepreview', false);
 else
@@ -239,9 +193,15 @@ else
 
 
 // mark message as read
-if ($MESSAGE && $MESSAGE->headers && !$MESSAGE->headers->seen)
-  $IMAP->set_flag($MESSAGE->uid, 'SEEN');
+if ($MESSAGE && $MESSAGE->headers && !$MESSAGE->headers->seen &&
+  ($RCMAIL->action == 'show' || ($RCMAIL->action == 'preview' && intval($CONFIG['preview_pane_mark_read']) == 0)))
+{
+  if ($IMAP->set_flag($MESSAGE->uid, 'SEEN')) {
+    if ($count = rcmail_get_unseen_count($mbox_name)) {
+      rcmail_set_unseen_count($mbox_name, $count - 1);
+    }
+  }
+}
 
 exit;
 
-?>
diff --git a/program/steps/mail/spell.inc b/program/steps/mail/spell.inc
deleted file mode 100644 (file)
index a567c7b..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/steps/mail/spell.inc                                          |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Invoke the configured or default spell checking engine.             |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Kris Steinhoff <steinhof@umich.edu>                           |
- +-----------------------------------------------------------------------+
-
- $Id$
-
-*/
-
-if ($spell_engine = $RCMAIL->config->get('spellcheck_engine', 'googie')) {
-    include('spell_'.$spell_engine.'.inc');
-}
-
-header('HTTP/1.1 404 Not Found');
-exit;
-
-?>
diff --git a/program/steps/mail/spell_googie.inc b/program/steps/mail/spell_googie.inc
deleted file mode 100644 (file)
index 1dd2c27..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/steps/mail/spell.inc                                          |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Submit request to Google's spell checking engine                    |
- |                                                                       |
- | CREDITS:                                                              |
- |   Script from GoogieSpell by amix.dk                                  |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: spell_googie.inc 1649 2008-08-15 10:35:09Z thomasb $
-
-*/
-
-$REMOTE_REQUEST = TRUE;
-
-// default settings
-$host = "ssl://www.google.com";
-$port = 443;
-$lang = get_input_value('lang', RCUBE_INPUT_GET);
-$path = "/tbproxy/spell?lang=$lang";
-
-// spell check uri is configured
-if (!empty($CONFIG['spellcheck_uri']))
-  {
-  $a_uri = parse_url($CONFIG['spellcheck_uri']);
-  $ssl = ($a_uri['scheme']=='https' || $a_uri['scheme']=='ssl');
-  $port = $a_uri['port'] ? $a_uri['port'] : ($ssl ? 443 : 80);
-  $host = ($ssl ? 'ssl://' : '') . $a_uri['host'];
-  $path = $a_uri['path'] . ($a_uri['query'] ? '?'.$a_uri['query'] : '') . $lang;
-  }
-
-$data = file_get_contents('php://input');
-$store = "";
-
-if ($fp = fsockopen($host, $port, $errno, $errstr, 30))
-  {
-  $out = "POST $path HTTP/1.0\r\n";
-  $out .= "Host: $host\r\n";
-  $out .= "Content-Length: " . strlen($data) . "\r\n";
-  $out .= "Content-type: application/x-www-form-urlencoded\r\n";
-  $out .= "Connection: Close\r\n\r\n";
-  $out .= $data;
-  fwrite($fp, $out);
-  
-  while (!feof($fp))
-    $store .= fgets($fp, 128);
-  fclose($fp);
-  }
-
-print $store;  
-exit;
-
-?>
diff --git a/program/steps/mail/spell_pspell.inc b/program/steps/mail/spell_pspell.inc
deleted file mode 100644 (file)
index 0abdc9e..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/steps/mail/spell_pspell.inc                                   |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Use the Pspell extension to check spelling, returns results         |
- |   compatible with spell_googie.inc.                                   |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Kris Steinhoff <steinhof@umich.edu>                           |
- +-----------------------------------------------------------------------+
-
- $Id$
-
-*/
-
-if (!extension_loaded('pspell')) {
-    raise_error(array(
-      'code' => 500,
-      'type' => 'php',
-      'file' => __FILE__,
-      'message' => "Pspell extension not available"), true, false);
-      
-    header('HTTP/1.1 404 Not Found');
-    exit;
-}
-
-// max. number of suggestions for one word
-define('MAX_SUGGESTIONS', 10);
-
-// read input
-$data = file_get_contents('php://input');
-
-// parse data (simplexml_load_string breaks CRLFs)
-$left = strpos($data, '<text>');
-$right = strrpos($data, '</text>');
-$text = substr($data, $left+6, $right-($left+6));
-$text = html_entity_decode($text, ENT_QUOTES, RCMAIL_CHARSET);
-
-// tokenize
-$words = preg_split('/[ !"#$%&()*+\\,\/\n:;<=>?@\[\]^_{|}-]+|\.[^\w]/', $text, NULL,  PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE );
-
-// init spellchecker
-$plink = pspell_new(get_input_value('lang', RCUBE_INPUT_GET), null, null, RCMAIL_CHARSET, PSPELL_FAST);
-
-// send output
-$out = '<?xml version="1.0" encoding="'.RCMAIL_CHARSET.'"?><spellresult charschecked="'.mb_strlen($text).'">';
-
-$diff = 0;
-foreach ($words as $w) {
-    $word = trim($w[0]);
-    $pos  = $w[1] - $diff;
-    $len  = mb_strlen($word);
-    if ($word && $plink && preg_match('/[^0-9\.]/', $word)
-       && !pspell_check($plink, $word)) {
-        $suggestions = pspell_suggest($plink, $word);
-       if (sizeof($suggestions)>10)
-         $suggestions = array_slice($suggestions, 0, MAX_SUGGESTIONS);
-
-        $out .= '<c o="'.$pos.'" l="'.$len.'">';
-        $out .= implode("\t", $suggestions);
-        $out .= '</c>';
-    }
-    $diff += (strlen($word) - $len);
-}
-
-$out .= '</spellresult>';
-
-header("Content-Type: text/xml");
-echo $out;
-exit;
-
-?>
index 38c3f6516b5b8a7d6e09fbdd8e1a5b87446b4060..003438aae2cef1db46e698ac79238b2efab491c5 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/mail/viewsource.inc                                     |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: viewsource.inc 2613 2009-06-05 13:34:07Z alec $
+ $Id: viewsource.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
@@ -25,13 +25,13 @@ ob_end_clean();
 if ($uid = get_input_value('_uid', RCUBE_INPUT_GET))
 {
   $headers = $IMAP->get_headers($uid);
-  $charset = $headers->charset ? $headers->charset : $IMAP->default_charset;
+  $charset = $headers->charset ? $headers->charset : $CONFIG['default_charset'];
   header("Content-Type: text/plain; charset={$charset}");
 
   if (!empty($_GET['_save'])) {
     $filename = ($headers->subject ? $IMAP->decode_header($headers->subject) : 'roundcube') . '.eml';
-    $browser = new rcube_browser;
-    
+    $browser = $RCMAIL->output->browser;
+
     if ($browser->ie && $browser->ver < 7)
       $filename = rawurlencode(abbreviate_string($filename, 55));
     else if ($browser->ie)
@@ -42,7 +42,7 @@ if ($uid = get_input_value('_uid', RCUBE_INPUT_GET))
     header("Content-Length: {$headers->size}");
     header("Content-Disposition: attachment; filename=\"$filename\"");
   }
-  
+
   $IMAP->print_raw_body($uid);
 }
 else
@@ -50,10 +50,10 @@ else
   raise_error(array(
       'code' => 500,
       'type' => 'php',
+      'file' => __FILE__, 'line' => __LINE__,
       'message' => 'Message UID '.$uid.' not found'),
-    true,
-    true);
+    true, true);
 }
 
 exit;
-?>
+
index c3410603c33b496a9fda5fbc1ebacda621390612..aa599461364c298b985cc7d2cbd416c472113ae5 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/settings/delete_identity.inc                            |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: delete_identity.inc 2779 2009-07-21 16:13:42Z thomasb $
+ $Id: delete_identity.inc 4025 2010-09-30 13:24:33Z alec $
 
 */
 
@@ -30,14 +30,15 @@ if (!$OUTPUT->ajax_call && !$RCMAIL->check_request(RCUBE_INPUT_GPC)) {
 
 if ($iid && preg_match('/^[0-9]+(,[0-9]+)*$/', $iid))
 {
-  $plugin = $RCMAIL->plugins->exec_hook('delete_identity', array('id' => $iid));
+  $plugin = $RCMAIL->plugins->exec_hook('identity_delete', array('id' => $iid));
   
-  if (!$plugin['abort'] && $USER->delete_identity($iid)) {
+  $deleted = !$plugin['abort'] ? $USER->delete_identity($iid) : $plugin['result'];
+
+  if ($deleted)
     $OUTPUT->show_message('deletedsuccessfully', 'confirmation', null, false);
-  }
-  else {
-    $OUTPUT->show_message('nodeletelastidentity', 'error', null, false);
-  }
+  else
+    $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'nodeletelastidentity', 'error', null, false);
+
   // send response
   if ($OUTPUT->ajax_call)
     $OUTPUT->send();
@@ -48,5 +49,3 @@ if ($OUTPUT->ajax_call)
 
 // go to identities page
 rcmail_overwrite_action('identities');
-
-?>
diff --git a/program/steps/settings/edit_folder.inc b/program/steps/settings/edit_folder.inc
new file mode 100644 (file)
index 0000000..dcd6d4c
--- /dev/null
@@ -0,0 +1,292 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/settings/edit_folder.inc                                |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Provide functionality to create/edit a folder                       |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
+ +-----------------------------------------------------------------------+
+
+ $Id: edit_folder.inc 4389 2011-01-04 11:16:54Z alec $
+
+*/
+
+// WARNING: folder names in UI are encoded with RCMAIL_CHARSET
+
+// init IMAP connection
+$RCMAIL->imap_connect();
+
+function rcube_folder_form($attrib)
+{
+    global $RCMAIL;
+
+    // edited folder name (empty in create-folder mode)
+    $mbox      = trim(get_input_value('_mbox', RCUBE_INPUT_GPC, true));
+    $mbox_imap = rcube_charset_convert($mbox, RCMAIL_CHARSET, 'UTF7-IMAP');
+
+    // predefined path for new folder
+    $parent      = trim(get_input_value('_path', RCUBE_INPUT_GPC, true));
+    $parent_imap = rcube_charset_convert($parent, RCMAIL_CHARSET, 'UTF7-IMAP');
+
+    $delimiter = $RCMAIL->imap->get_hierarchy_delimiter();
+    $special   = (strlen($mbox_imap) && in_array($mbox_imap, (array) $RCMAIL->config->get('default_imap_folders')));
+    $protected = ($special && $RCMAIL->config->get('protect_default_folders'));
+    $threading_supported = $RCMAIL->imap->get_capability('THREAD');
+
+    // Get mailbox stats (messages count, etc.), mailbox name and parent
+    if (strlen($mbox)) {
+        $msgcount = $RCMAIL->imap->messagecount($mbox_imap, 'ALL', true, false);
+
+        $path   = explode($delimiter, $mbox_imap);
+        $folder = array_pop($path);
+        $path   = implode($delimiter, $path);
+
+        $folder = rcube_charset_convert($folder, 'UTF7-IMAP');
+
+        $hidden_fields = array('name' => '_mbox', 'value' => $mbox);
+    }
+    else {
+        $path = $parent_imap;
+    }
+
+    $form = array();
+
+    // General tab
+    $form['props'] = array(
+        'name' => rcube_label('properties'),
+    );
+
+    // Location (name)
+    if ($protected)
+        $foldername = rcmail_localize_foldername($mbox_imap);
+    else {
+        if (isset($_POST['_name']))
+            $folder = trim(get_input_value('_name', RCUBE_INPUT_POST, true));
+
+        $foldername = new html_inputfield(array('name' => '_name', 'id' => '_name', 'size' => 30));
+        $foldername = $foldername->show($folder);
+
+        if ($special)
+            $foldername .= '&nbsp;(' . rcmail_localize_foldername($mbox_imap) .')';
+    }
+
+    $form['props']['fieldsets']['location'] = array(
+        'name'  => rcube_label('location'),
+        'content' => array(
+            'name' => array(
+                'label' => rcube_label('foldername'),
+                'value' => $foldername,
+            ),
+        ),
+    );
+
+    if (strlen($path)) {
+        $radio1 = new html_radiobutton(array('name' => '_parent', 'value' => ''));
+        $radio2 = new html_radiobutton(array('name' => '_parent', 'value' => $path));
+        $selected  = isset($_POST['_parent']) ? $_POST['_parent'] : $path;
+
+        $html_path = str_replace($delimiter, ' &raquo; ', rcmail_localize_folderpath($path));
+
+        $folderpath = $radio1->show($selected) . Q(rcube_label('none')) . '&nbsp;'
+            .$radio2->show($selected) . Q($html_path);
+
+        $form['props']['fieldsets']['location']['content']['path'] = array(
+            'label' => rcube_label('parentfolder'),
+            'value' => $folderpath,
+        );
+    }
+
+    // Settings
+    $form['props']['fieldsets']['settings'] = array(
+        'name'  => rcube_label('settings'),
+    );
+
+    // Settings: threading
+    if ($threading_supported) {
+        $select = new html_select(array('name' => '_viewmode', 'id' => '_listmode'));
+        $select->add(rcube_label('list'), 0);
+        $select->add(rcube_label('threads'), 1);
+
+        if (isset($_POST['_viewmode'])) {
+            $value = (int) $_POST['_viewmode'];
+        }
+        else if (strlen($mbox_imap)) {
+            $a_threaded = $RCMAIL->config->get('message_threading', array());
+            $value = (int) isset($a_threaded[$mbox_imap]);
+        }
+
+        $form['props']['fieldsets']['settings']['content']['viewmode'] = array(
+            'label' => rcube_label('listmode'),
+            'value' => $select->show($value),
+        );
+    }
+/*
+    // Settings: sorting column
+    $select = new html_select(array('name' => '_sortcol', 'id' => '_sortcol'));
+    $select->add(rcube_label('nonesort'), '');
+    $select->add(rcube_label('arrival'), 'arrival');
+    $select->add(rcube_label('sentdate'), 'date');
+    $select->add(rcube_label('subject'), 'subject');
+    $select->add(rcube_label('fromto'), 'from');
+    $select->add(rcube_label('replyto'), 'replyto');
+    $select->add(rcube_label('cc'), 'cc');
+    $select->add(rcube_label('size'), 'size');
+
+    $value = isset($_POST['_sortcol']) ? $_POST['_sortcol'] : '';
+
+    $form['props']['fieldsets']['settings']['content']['sortcol'] = array(
+        'label' => rcube_label('listsorting'),
+        'value' => $select->show($value),
+    );
+
+    // Settings: sorting order
+    $select = new html_select(array('name' => '_sortord', 'id' => '_sortord'));
+    $select->add(rcube_label('asc'), 'ASC');
+    $select->add(rcube_label('desc'), 'DESC');
+
+    $value = isset($_POST['_sortord']) ? $_POST['_sortord'] : '';
+
+    $form['props']['fieldsets']['settings']['content']['sortord'] = array(
+        'label' => rcube_label('listorder'),
+        'value' => $select->show(),
+    );
+*/
+    // Information (count, size) - Edit mode
+    if (strlen($mbox)) {
+        // Number of messages
+        $form['props']['fieldsets']['info'] = array(
+            'name'  => rcube_label('info'),
+            'content' => array(
+                'count' => array(
+                    'label' => rcube_label('messagecount'),
+                    'value' => (int) $msgcount,
+                ),
+            ),
+        );
+
+        // Size
+        if ($msgcount) {
+            // create link with folder-size command
+            $onclick = sprintf("return %s.command('folder-size', '%s', this)",
+                JS_OBJECT_NAME, JQ($mbox_imap));
+            $size = html::a(array('href' => '#', 'onclick' => $onclick, 'id' => 'folder-size'),
+                rcube_label('getfoldersize'));
+        }
+        else {
+            // no messages -> zero size
+            $size = 0;
+        }
+        $form['props']['fieldsets']['info']['content']['size'] = array(
+            'label' => rcube_label('size'),
+            'value' => $size,
+        );
+    }
+
+    // Allow plugins to modify folder form content
+    $plugin = $RCMAIL->plugins->exec_hook('folder_form', array('form' => $form));
+
+    $form = $plugin['form'];
+
+    // Set form tags and hidden fields
+    list($form_start, $form_end) = get_form_tags($attrib, 'save-folder', null, $hidden_fields);
+
+    unset($attrib['form']);
+
+    // return the complete edit form as table
+    $out = "$form_start\n";
+
+    // Create form output
+    foreach ($form as $tab) {
+        if (!empty($tab['fieldsets']) && is_array($tab['fieldsets'])) {
+            $content = '';
+            foreach ($tab['fieldsets'] as $fieldset) {
+                $subcontent = rcmail_get_form_part($fieldset);
+                if ($subcontent) {
+                    $content .= html::tag('fieldset', null, html::tag('legend', null, Q($fieldset['name'])) . $subcontent) ."\n";
+                }
+            }
+        }
+        else {
+            $content = rcmail_get_form_part($tab);
+        }
+
+        if ($content) {        
+            $out .= html::tag('fieldset', null, html::tag('legend', null, Q($tab['name'])) . $content) ."\n";
+        }
+    }
+
+    $out .= "\n$form_end";
+
+    $RCMAIL->output->set_env('messagecount', (int) $msgcount);
+
+    return $out;
+}
+
+function rcmail_get_form_part($form)
+{
+    $content = '';
+
+    if (is_array($form['content']) && !empty($form['content'])) {
+        $table = new html_table(array('cols' => 2));
+        foreach ($form['content'] as $col => $colprop) {
+            $colprop['id'] = '_'.$col;
+            $label = !empty($colprop['label']) ? $colprop['label'] : rcube_label($col);
+
+            $table->add('title', sprintf('<label for="%s">%s</label>', $colprop['id'], Q($label)));
+            $table->add(null, $colprop['value']);
+        }
+        $content = $table->show();
+    }
+    else {
+        $content = $form['content'];
+    }
+
+    return $content;
+}
+
+function rcmail_localize_folderpath($path)
+{
+    global $RCMAIL;
+
+    $protect_folders = $RCMAIL->config->get('protect_default_folders');
+    $default_folders = (array) $RCMAIL->config->get('default_imap_folders');
+    $delimiter       = $RCMAIL->imap->get_hierarchy_delimiter();
+    $path            = explode($delimiter, $path);
+    $result          = array();
+
+    foreach ($path as $idx => $dir) {
+        $directory = implode($delimiter, array_slice($path, 0, $idx+1));
+        if ($protect_folders && in_array($directory, $default_folders)) {
+            unset($result);
+            $result[] = rcmail_localize_foldername($directory);
+        }
+        else if ($protect_folders && in_array($dir, $default_folders)) {
+            $result[] = rcmail_localize_foldername($dir);
+        }
+        else {
+            $result[] = rcube_charset_convert($dir, 'UTF7-IMAP');
+        }
+    }
+
+    return implode($delimiter, $result);
+}
+
+
+//$OUTPUT->set_pagetitle(rcube_label('folders'));
+
+// register UI objects
+$OUTPUT->add_handlers(array(
+    'folderdetails' => 'rcube_folder_form',
+));
+
+$OUTPUT->add_label('nonamewarning');
+
+$OUTPUT->send('folderedit');
index 0e5d58d22a2a8e6d5635aa1a47a2153e606ecdad..e8de28f42f5edc9524c0455216a116990adb8c79 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/settings/edit_identity.inc                              |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: edit_identity.inc 2755 2009-07-15 09:49:35Z thomasb $
+ $Id: edit_identity.inc 4328 2010-12-09 19:10:44Z alec $
 
 */
 
@@ -24,7 +24,7 @@ define('IDENTITIES_LEVEL', intval($RCMAIL->config->get('identities_level', 0)));
 // edit-identity
 if (($_GET['_iid'] || $_POST['_iid']) && $RCMAIL->action=='edit-identity') {
   $IDENTITY_RECORD = $USER->get_identity(get_input_value('_iid', RCUBE_INPUT_GPC));
-  
+
   if (is_array($IDENTITY_RECORD))
     $OUTPUT->set_env('iid', $IDENTITY_RECORD['identity_id']);
   else {
@@ -48,9 +48,10 @@ else {
 
 
 function rcube_identity_form($attrib)
-  {
+{
   global $IDENTITY_RECORD, $RCMAIL, $OUTPUT;
 
+  // Add HTML editor script(s)
   rcube_html_editor('identity');
 
   // add some labels to client
@@ -60,79 +61,102 @@ function rcube_identity_form($attrib)
   $t_rows = !empty($attrib['textarearows']) ? $attrib['textarearows'] : 6;
   $t_cols = !empty($attrib['textareacols']) ? $attrib['textareacols'] : 40;
 
-  list($form_start, $form_end) = get_form_tags($attrib, 'save-identity', intval($IDENTITY_RECORD['identity_id']), array('name' => '_iid', 'value' => $IDENTITY_RECORD['identity_id']));
-  unset($attrib['form']);
-
   // list of available cols
-  $a_show_cols = array('name'         => array('type' => 'text', 'size' => $i_size),
-                       'email'        => array('type' => 'text', 'size' => $i_size),
-                       'organization' => array('type' => 'text', 'size' => $i_size),
-                       'reply-to'     => array('type' => 'text', 'label' => 'reply-to', 'size' => $i_size),
-                       'bcc'          => array('type' => 'text', 'size' => $i_size),
-                       'signature'       => array('type' => 'textarea', 'size' => $t_cols, 'rows' => $t_rows),
-                       'html_signature'=>array('type' => 'checkbox', 'label' => 'htmlsignature', 'onclick' => 'return rcmail_toggle_editor(this.checked, \'rcmfd_signature\');'),
-                       'standard'     => array('type' => 'checkbox', 'label' => 'setdefault'));
+  $form = array(
+    'addressing' => array(
+      'name'    => rcube_label('settings'),
+      'content' => array(
+        'name'         => array('type' => 'text', 'size' => $i_size),
+        'email'        => array('type' => 'text', 'size' => $i_size),
+        'organization' => array('type' => 'text', 'size' => $i_size),
+        'reply-to'     => array('type' => 'text', 'size' => $i_size),
+        'bcc'          => array('type' => 'text', 'size' => $i_size),
+        'standard'       => array('type' => 'checkbox', 'label' => rcube_label('setdefault')),
+      )),
+    'signature' => array(
+      'name' => rcube_label('signature'),
+      'content' => array(
+        'signature'         => array('type' => 'textarea', 'size' => $t_cols, 'rows' => $t_rows,
+            'spellcheck' => true),
+        'html_signature' => array('type' => 'checkbox', 'label' => rcube_label('htmlsignature'),
+            'onclick' => 'return rcmail_toggle_editor(this, \'rcmfd_signature\');'),
+    ))
+  );
+
+  // Enable TinyMCE editor
+  if ($IDENTITY_RECORD['html_signature']) {
+    $form['signature']['content']['signature']['class'] = 'mce_editor';
+  }
 
   // disable some field according to access level
   if (IDENTITIES_LEVEL == 1 || IDENTITIES_LEVEL == 3) {
-    $a_show_cols['email']['disabled'] = true;
-    $a_show_cols['email']['class'] = 'disabled';
+    $form['addressing']['content']['email']['disabled'] = true;
+    $form['addressing']['content']['email']['class'] = 'disabled';
   }
-  
-  // a specific part is requested
-  if ($attrib['part'])
-    {
-    $colprop = $a_show_cols[$attrib['part']];
-    if (is_array($colprop))
-      {
-      $out = $form_start;
-      $out .= rcmail_get_edit_field($attrib['part'], $IDENTITY_RECORD[$attrib['part']], $attrib, $colprop['type']); 
-      return $out;
-      }
-    else
-      return '';
-    }
 
+  $IDENTITY_RECORD['email']    = idn_to_utf8($IDENTITY_RECORD['email']);
+  $IDENTITY_RECORD['reply-to'] = idn_to_utf8($IDENTITY_RECORD['reply-to']);
+  $IDENTITY_RECORD['bcc']      = idn_to_utf8($IDENTITY_RECORD['bcc']);
+
+  // Allow plugins to modify identity form content
+  $plugin = $RCMAIL->plugins->exec_hook('identity_form', array(
+    'form' => $form, 'record' => $IDENTITY_RECORD));
+
+  $form = $plugin['form'];
+  $IDENTITY_RECORD = $plugin['record'];
+
+  // Set form tags and hidden fields
+  list($form_start, $form_end) = get_form_tags($attrib, 'save-identity',
+    intval($IDENTITY_RECORD['identity_id']),
+    array('name' => '_iid', 'value' => $IDENTITY_RECORD['identity_id']));
+
+  unset($plugin);
+  unset($attrib['form']);
 
   // return the complete edit form as table
-  $out = "$form_start<table>\n\n";
-
-  foreach ($a_show_cols as $col => $colprop)
-    {
-    $colprop['id'] = 'rcmfd_'.$col;
-
-    if ($col == 'signature')
-      {
-      $colprop['spellcheck'] = true;
-      if ($IDENTITY_RECORD['html_signature'])
-        {
-        $colprop['class'] = 'mce_editor';
-        }
-      }
+  $out = "$form_start\n";
 
-    $label = strlen($colprop['label']) ? $colprop['label'] : $col;
-    $value = rcmail_get_edit_field($col, $IDENTITY_RECORD[$col], $colprop, $colprop['type']);
+  foreach ($form as $fieldset) {
+    if (empty($fieldset['content']))
+      continue;
 
-    $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
-                    $colprop['id'],
-                    Q(rcube_label($label)),
-                    $value);
-    }
+    $content = '';
+    if (is_array($fieldset['content'])) {
+      $table = new html_table(array('cols' => 2));
+      foreach ($fieldset['content'] as $col => $colprop) {
+        $colprop['id'] = 'rcmfd_'.$col;
+
+        $label = !empty($colprop['label']) ? $colprop['label'] :
+            rcube_label(str_replace('-', '', $col));
+        $value = !empty($colprop['value']) ? $colprop['value'] :
+            rcmail_get_edit_field($col, $IDENTITY_RECORD[$col], $colprop, $colprop['type']);
 
-  $out .= "\n</table>$form_end";
+        $table->add('title', sprintf('<label for="%s">%s</label>', $colprop['id'], Q($label)));
+        $table->add(null, $value);
+      }
+      $content = $table->show();
+    }
+    else {
+      $content = $fieldset['content'];
+    }
 
-  return $out;  
+    $out .= html::tag('fieldset', null, html::tag('legend', null, Q($fieldset['name'])) . $content) ."\n";
   }
 
+  $out .= $form_end;
+
+  return $out;
+}
+
 $OUTPUT->include_script('list.js');
 $OUTPUT->add_handler('identityform', 'rcube_identity_form');
 $OUTPUT->set_env('identities_level', IDENTITIES_LEVEL);
 
 $OUTPUT->set_pagetitle(rcube_label(($RCMAIL->action=='add-identity' ? 'newidentity' : 'edititem')));
 
-if ($RCMAIL->action=='add-identity' && $OUTPUT->template_exists('addidentity'))
-  $OUTPUT->send('addidentity');
+if ($RCMAIL->action=='add-identity' && $OUTPUT->template_exists('identityadd'))
+  $OUTPUT->send('identityadd');
+
+$OUTPUT->send('identityedit');
 
-$OUTPUT->send('editidentity');
 
-?>
index 06ae250b35674016d3c67863c0c96330c2817ec0..8679c94d0bd96ec77e3027dcf5784d0c8eca1f07 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/settings/edit_prefs.inc                                 |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -34,28 +34,31 @@ function rcmail_user_prefs_form($attrib)
   $RCMAIL->output->add_label('nopagesizewarning');
 
   unset($attrib['form']);
-  
+
   list($form_start, $form_end) = get_form_tags($attrib, 'save-prefs', null,
     array('name' => '_section', 'value' => $CURR_SECTION));
 
   $out = $form_start;
 
   foreach ($SECTIONS[$CURR_SECTION]['blocks'] as $idx => $block) {
-    if ($block['options']) {
+    if (!empty($block['options'])) {
       $table = new html_table(array('cols' => 2));
 
       foreach ($block['options'] as $option) {
         if ($option['advanced'])
-         $table->set_row_attribs('advanced');
-    
+             $table->set_row_attribs('advanced');
+
         $table->add('title', $option['title']);
-       $table->add(null, $option['content']);
-        }
-    
-      $out .= html::tag('fieldset', null, html::tag('legend', null, $block['name']) . $table->show($attrib));
+           $table->add(null, $option['content']);
       }
+
+      $out .= html::tag('fieldset', null, html::tag('legend', null, $block['name']) . $table->show($attrib));
+    }
+    else if (!empty($block['content'])) {
+      $out .= html::tag('fieldset', null, html::tag('legend', null, $block['name']) . $block['content']);
     }
-                                                                     
+  }
+
   return $out . $form_end;
 }
 
@@ -75,4 +78,4 @@ $OUTPUT->add_handlers(array(
 
 $OUTPUT->send('settingsedit');
 
-?>
+
diff --git a/program/steps/settings/folders.inc b/program/steps/settings/folders.inc
new file mode 100644 (file)
index 0000000..f118171
--- /dev/null
@@ -0,0 +1,377 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/settings/folders.inc                                    |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Provide functionality of folders management                         |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
+ +-----------------------------------------------------------------------+
+
+ $Id: folders.inc 4321 2010-12-08 12:52:04Z alec $
+
+*/
+
+// WARNING: folder names in UI are encoded with RCMAIL_CHARSET
+
+// init IMAP connection
+$RCMAIL->imap_connect();
+
+// subscribe mailbox
+if ($RCMAIL->action == 'subscribe')
+{
+    $mbox = get_input_value('_mbox', RCUBE_INPUT_POST, true, 'UTF7-IMAP');
+    if (strlen($mbox)) {
+        $result = $IMAP->subscribe(array($mbox));
+
+        // Handle virtual (non-existing) folders
+        if (!$result && $IMAP->get_error_code() == -1 &&
+            $IMAP->get_response_code() == rcube_imap::TRYCREATE
+        ) {
+            $result = $IMAP->create_mailbox($mbox, true);
+            if ($result) {
+                // @TODO: remove 'virtual' class of folder's row
+            }
+        }
+
+        if ($result)
+            $OUTPUT->show_message('foldersubscribed', 'confirmation');
+        else
+            rcmail_display_server_error('errorsaving');
+    }
+}
+
+// unsubscribe mailbox
+else if ($RCMAIL->action == 'unsubscribe')
+{
+    $mbox = get_input_value('_mbox', RCUBE_INPUT_POST, true, 'UTF7-IMAP');
+    if (strlen($mbox)) {
+        $result = $IMAP->unsubscribe(array($mbox));
+        if ($result)
+            $OUTPUT->show_message('folderunsubscribed', 'confirmation');
+        else
+            rcmail_display_server_error('errorsaving');
+    }
+}
+
+// delete an existing mailbox
+else if ($RCMAIL->action == 'delete-folder')
+{
+    $mbox_utf8 = get_input_value('_mbox', RCUBE_INPUT_POST, true);
+    $mbox      = rcube_charset_convert($mbox_utf8, RCMAIL_CHARSET, 'UTF7-IMAP');
+
+    // get folder's children or all folders if the name contains special characters
+    $delimiter = $IMAP->get_hierarchy_delimiter();
+    if ((strpos($mbox, '%') === false) && (strpos($mbox, '*') === false))
+        $a_mboxes  = $IMAP->list_unsubscribed('', $mbox.$delimiter.'*');
+    else
+        $a_mboxes  = $IMAP->list_unsubscribed();
+
+    if (strlen($mbox))
+        $deleted = $IMAP->delete_mailbox($mbox);
+
+    if ($OUTPUT->ajax_call && $deleted) {
+        // Remove folder and subfolders rows
+        $OUTPUT->command('remove_folder_row', $mbox_utf8);
+        foreach ($a_mboxes as $folder) {
+            if (preg_match('/^'. preg_quote($mbox.$delimiter, '/') .'/', $folder)) {
+                $OUTPUT->command('remove_folder_row', rcube_charset_convert($folder, 'UTF7-IMAP'));
+            }
+        }
+        $OUTPUT->show_message('folderdeleted', 'confirmation');
+        // Clear content frame
+        $OUTPUT->command('subscription_select');
+        $OUTPUT->command('set_quota', rcmail_quota_content());
+    }
+    else if (!$deleted) {
+        rcmail_display_server_error('errorsaving');
+    }
+}
+
+// rename an existing mailbox
+else if ($RCMAIL->action == 'rename-folder')
+{
+    $name_utf8    = trim(get_input_value('_folder_newname', RCUBE_INPUT_POST, true));
+    $oldname_utf8 = trim(get_input_value('_folder_oldname', RCUBE_INPUT_POST, true));
+
+    if (strlen($name_utf8) && strlen($oldname_utf8)) {
+        $name    = rcube_charset_convert($name_utf8, RCMAIL_CHARSET, 'UTF7-IMAP');
+        $oldname = rcube_charset_convert($oldname_utf8, RCMAIL_CHARSET, 'UTF7-IMAP');
+
+        $rename = rcmail_rename_folder($oldname, $name);
+    }
+
+    if ($rename && $OUTPUT->ajax_call) {
+        $folderlist = $IMAP->list_unsubscribed();
+        $delimiter  = $IMAP->get_hierarchy_delimiter();
+
+        $regexp = '/^' . preg_quote($name . $delimiter, '/') . '/';
+
+        // subfolders
+        for ($x=sizeof($folderlist)-1; $x>=0; $x--) {
+            if (preg_match($regexp, $folderlist[$x])) {
+                $oldfolder = $oldname . $delimiter . preg_replace($regexp, '', $folderlist[$x]);
+                $foldersplit = explode($delimiter, $folderlist[$x]);
+                $level = count($foldersplit) - 1;
+                $display_rename = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) 
+                    . rcube_charset_convert($foldersplit[$level], 'UTF7-IMAP');
+
+                $before = isset($folderlist[$x+1]) ? rcube_charset_convert($folderlist[$x+1], 'UTF7-IMAP') : false;
+
+                $OUTPUT->command('replace_folder_row', rcube_charset_convert($oldfolder, 'UTF7-IMAP'),
+                    rcube_charset_convert($folderlist[$x], 'UTF7-IMAP'), $display_rename, $before);
+            }
+        }
+
+        $foldersplit = explode($delimiter, $name);
+        $level = count($foldersplit) - 1;
+        $display_rename = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) . rcube_charset_convert($foldersplit[$level], 'UTF7-IMAP');
+        $index = array_search($name, $folderlist);
+        $before = $index !== false && isset($folderlist[$index+1]) ? rcube_charset_convert($folderlist[$index+1], 'UTF7-IMAP') : false;
+
+        $OUTPUT->command('replace_folder_row', $oldname_utf8,
+            rcube_charset_convert($name, 'UTF7-IMAP'), $display_rename, $before);
+    }
+    else if (!$rename) {
+        rcmail_display_server_error('errorsaving');
+    }
+}
+
+// clear mailbox
+else if ($RCMAIL->action == 'purge')
+{
+    $mbox_utf8 = get_input_value('_mbox', RCUBE_INPUT_POST, true);
+    $mbox      = rcube_charset_convert($mbox_utf8, RCMAIL_CHARSET, 'UTF7-IMAP');
+    $delimiter = $IMAP->get_hierarchy_delimiter();
+    $trash_regexp = '/^' . preg_quote($CONFIG['trash_mbox'] . $delimiter, '/') . '/';
+
+    // we should only be purging trash (or their subfolders)
+    if (!strlen($CONFIG['trash_mbox']) || $mbox == $CONFIG['trash_mbox']
+        || preg_match($trash_regexp, $mbox)
+    ) {
+        $success = $IMAP->clear_mailbox($mbox);
+        $delete = true;
+    }
+    // copy to Trash
+    else {
+        $success = $IMAP->move_message('1:*', $CONFIG['trash_mbox'], $mbox);
+        $delete = false;
+    }
+
+    if ($success) {
+        $OUTPUT->set_env('messagecount', 0);
+        if ($delete) {
+            $OUTPUT->show_message('folderpurged', 'confirmation');
+            $OUTPUT->command('set_quota', rcmail_quota_content());
+        }
+        else {
+            $OUTPUT->show_message('messagemoved', 'confirmation');
+        }
+        $_SESSION['unseen_count'][$mbox] = 0;
+        $OUTPUT->command('show_folder', $mbox_utf8, null, true);
+    }
+    else {
+        rcmail_display_server_error('errorsaving');
+    }
+}
+
+// get mailbox size
+else if ($RCMAIL->action == 'folder-size')
+{
+    $name = trim(get_input_value('_mbox', RCUBE_INPUT_POST, true));
+
+    $size = $IMAP->get_mailbox_size($name);
+
+    // @TODO: check quota and show percentage usage of specified mailbox?
+
+    if ($size !== false) {
+        $OUTPUT->command('folder_size_update', show_bytes($size));
+    }
+    else {
+        rcmail_display_server_error();
+    }
+}
+
+if ($OUTPUT->ajax_call)
+    $OUTPUT->send();
+
+
+// build table with all folders listed by server
+function rcube_subscription_form($attrib)
+{
+    global $RCMAIL, $IMAP, $CONFIG, $OUTPUT;
+
+    list($form_start, $form_end) = get_form_tags($attrib, 'folders');
+    unset($attrib['form']);
+  
+    if (!$attrib['id'])
+        $attrib['id'] = 'rcmSubscriptionlist';
+
+    $table = new html_table();
+
+    if ($attrib['noheader'] !== true && $attrib['noheader'] != "true") {
+        // add table header
+        $table->add_header('name', rcube_label('foldername'));
+        $table->add_header('subscribed', '');
+    }
+
+    // get folders from server
+    $IMAP->clear_cache('mailboxes');
+
+    $a_unsubscribed = $IMAP->list_unsubscribed();
+    $a_subscribed   = $IMAP->list_mailboxes();
+    $delimiter      = $IMAP->get_hierarchy_delimiter();
+    $a_js_folders   = array();
+    $seen           = array();
+    $list_folders   = array();
+
+    // pre-process folders list
+    foreach ($a_unsubscribed as $i => $folder) {
+        $foldersplit = explode($delimiter, $folder);
+        $name = rcube_charset_convert(array_pop($foldersplit), 'UTF7-IMAP');
+        $parent_folder = join($delimiter, $foldersplit);
+        $level = count($foldersplit);
+
+        // add any necessary "virtual" parent folders
+        if ($parent_folder && !$seen[$parent_folder]) {
+            for ($i=1; $i<=$level; $i++) {
+                   $ancestor_folder = join($delimiter, array_slice($foldersplit, 0, $i));
+                   if ($ancestor_folder && !$seen[$ancestor_folder]++) {
+                       $ancestor_name = rcube_charset_convert($foldersplit[$i-1], 'UTF7-IMAP');
+                       $list_folders[] = array(
+                        'id'      => $ancestor_folder,
+                        'name'    => $ancestor_name,
+                        'level'   => $i-1,
+                        'virtual' => true,
+                    );
+                   }
+            }
+        }
+    
+        $seen[$folder]++;
+
+        $list_folders[] = array(
+            'id'    => $folder,
+            'name'  => $name,
+            'level' => $level,
+        );
+    }
+
+    unset($seen);
+
+    $checkbox_subscribe = new html_checkbox(array(
+        'name'    => '_subscribed[]',
+        'title'   => rcube_label('changesubscription'),
+        'onclick' => JS_OBJECT_NAME.".command(this.checked?'subscribe':'unsubscribe',this.value)",
+    ));
+
+    // create list of available folders
+    foreach ($list_folders as $i => $folder) {
+        $idx        = $i + 1;
+        $subscribed = in_array($folder['id'], $a_subscribed);
+        $protected  = ($CONFIG['protect_default_folders'] == true && in_array($folder['id'], $CONFIG['default_imap_folders']));
+        $classes    = array($i%2 ? 'even' : 'odd');
+
+        $folder_js      = Q($folder['id']);
+        $folder_utf8    = rcube_charset_convert($folder['id'], 'UTF7-IMAP');
+        $display_folder = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $folder['level'])
+            . Q($protected ? rcmail_localize_foldername($folder['id']) : $folder['name']);
+    
+        if ($folder['virtual']) {
+            $classes[] = 'virtual';
+        }
+
+        if (!$protected) {
+            $opts = $IMAP->mailbox_options($folder['id']);
+            $noselect = in_array('\\Noselect', $opts);
+        }
+
+        $table->add_row(array('id' => 'rcmrow'.$idx, 'class' => join(' ', $classes)));
+    
+        $table->add('name', $display_folder);
+        $table->add('subscribed', $checkbox_subscribe->show(($subscribed ? $folder_utf8 : ''),
+            array('value' => $folder_utf8, 'disabled' => ($protected || $noselect) ? 'disabled' : '')));
+
+        $a_js_folders['rcmrow'.$idx] = array($folder_utf8, Q($display_folder), $protected || $folder['virtual']);
+    }
+
+    $RCMAIL->plugins->exec_hook('folders_list', array('table' => $table));
+
+    $OUTPUT->add_gui_object('subscriptionlist', $attrib['id']);
+    $OUTPUT->set_env('subscriptionrows', $a_js_folders);
+    $OUTPUT->set_env('defaultfolders', $CONFIG['default_imap_folders']);
+    $OUTPUT->set_env('delimiter', $delimiter);
+
+    return $form_start . $table->show($attrib) . $form_end;
+}
+
+function rcmail_folder_frame($attrib)
+{
+    global $OUTPUT;
+
+    if (!$attrib['id'])
+        $attrib['id'] = 'rcmfolderframe';
+    
+    $attrib['name'] = $attrib['id'];
+
+    $OUTPUT->set_env('contentframe', $attrib['name']);
+    $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/blank.gif');
+
+    return html::iframe($attrib);
+}
+
+function rcmail_rename_folder($oldname, $newname)
+{
+    global $RCMAIL;
+
+    $delimiter = $RCMAIL->imap->get_hierarchy_delimiter();
+    $rename    = $RCMAIL->imap->rename_mailbox($oldname, $newname);
+
+    // update per-folder options for modified folder and its subfolders
+    if ($rename !== false) {
+        $a_threaded = (array) $RCMAIL->config->get('message_threading', array());
+        $oldprefix  = '/^' . preg_quote($oldname . $delimiter, '/') . '/';
+
+        foreach ($a_threaded as $key => $val) {
+            if ($key == $oldname) {
+                unset($a_threaded[$key]);
+               $a_threaded[$newname] = true;
+            }
+            else if (preg_match($oldprefix, $key)) {
+                unset($a_threaded[$key]);
+                   $a_threaded[preg_replace($oldprefix, $newname.$delimiter, $key)] = true;
+            }
+        }
+        $RCMAIL->user->save_prefs(array('message_threading' => $a_threaded));
+
+        return true;
+    }
+
+    return false;
+}
+
+$OUTPUT->set_pagetitle(rcube_label('folders'));
+$OUTPUT->include_script('list.js');
+$OUTPUT->set_env('quota', $IMAP->get_capability('QUOTA'));
+
+// add some labels to client
+$OUTPUT->add_label('deletefolderconfirm', 'purgefolderconfirm', 'folderdeleting',
+    'foldermoving', 'foldersubscribing', 'folderunsubscribing', 'quota');
+
+// register UI objects
+$OUTPUT->add_handlers(array(
+    'foldersubscription' => 'rcube_subscription_form',
+    'folderframe' => 'rcmail_folder_frame',
+    'quotadisplay' => 'rcmail_quota_display',
+));
+
+$OUTPUT->send('folders');
+
index 0f6b2f477e351d9c177bdb829ea0ecb189039880..fde0871b2887d2ac7ac75844d962f1742283d528 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/settings/func.inc                                       |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: func.inc 3055 2009-10-23 18:11:41Z alec $
+ $Id: func.inc 4389 2011-01-04 11:16:54Z alec $
 
 */
 
@@ -25,7 +25,7 @@ if (!$OUTPUT->ajax_call)
 
 // similar function as /steps/settings/identities.inc::rcmail_identity_frame()
 function rcmail_preferences_frame($attrib)
-  {
+{
   global $OUTPUT;
 
   if (!$attrib['id'])
@@ -35,21 +35,21 @@ function rcmail_preferences_frame($attrib)
 
   $OUTPUT->set_env('contentframe', $attrib['name']);
   $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/blank.gif');
-  
+
   return html::iframe($attrib);
-  }
+}
 
 
 function rcmail_sections_list($attrib)
-  {
+{
   global $RCMAIL;
-  
+
   // add id to message list table if not specified
   if (!strlen($attrib['id']))
     $attrib['id'] = 'rcmsectionslist';
 
   list($list, $cols) = rcmail_user_prefs();
-           
+
   // create XHTML table
   $out = rcube_table_output($attrib, $list, $cols, 'id');
 
@@ -58,51 +58,61 @@ function rcmail_sections_list($attrib)
   $RCMAIL->output->include_script('list.js');
 
   return $out;
-  }
+}
 
 
 function rcmail_identities_list($attrib)
-  {
+{
   global $OUTPUT, $USER, $RCMAIL;
 
   // add id to message list table if not specified
   if (!strlen($attrib['id']))
     $attrib['id'] = 'rcmIdentitiesList';
 
+  // get identities list and define 'mail' column
+  $list = $USER->list_identities();
+  foreach ($list as $idx => $row)
+    $list[$idx]['mail'] = trim($row['name'] . ' <' . idn_to_utf8($row['email']) .'>');
+
   // get all identites from DB and define list of cols to be displayed
-  $plugin = $RCMAIL->plugins->exec_hook('list_identities', array(
-    'list' => $USER->list_identities(),
-    'cols' => array('name', 'email')));
+  $plugin = $RCMAIL->plugins->exec_hook('identities_list', array(
+    'list' => $list,
+    'cols' => array('mail')));
 
-  // create XHTML table  
+  // @TODO: use <UL> instead of <TABLE> for identities list
+  // create XHTML table
   $out = rcube_table_output($attrib, $plugin['list'], $plugin['cols'], 'identity_id');
-  
+
   // set client env
   $OUTPUT->add_gui_object('identitieslist', $attrib['id']);
 
   return $out;
-  }
+}
 
 
 // similar function as in /steps/addressbook/edit.inc
 function get_form_tags($attrib, $action, $id = null, $hidden = null)
-  {
+{
   global $EDIT_FORM, $RCMAIL;
 
   $form_start = $form_end = '';
-  
+
   if (empty($EDIT_FORM)) {
     $request_key = $action . (isset($id) ? '.'.$id : '');
     $form_start = $RCMAIL->output->request_form(array(
-       'name' => 'form', 'method' => 'post',
-       'task' => $RCMAIL->task, 'action' => $action,
-       'request' => $request_key, 'noclose' => true) + $attrib);
-    
+         'name'    => 'form',
+         'method'  => 'post',
+         'task'    => $RCMAIL->task,
+         'action'  => $action,
+         'request' => $request_key,
+         'noclose' => true
+       ) + $attrib);
+
     if (is_array($hidden)) {
       $hiddenfields = new html_hiddenfield($hidden);
       $form_start .= $hiddenfields->show();
     }
-    
+
     $form_end = !strlen($attrib['form']) ? '</form>' : '';
 
     $EDIT_FORM = !empty($attrib['form']) ? $attrib['form'] : 'form';
@@ -110,7 +120,7 @@ function get_form_tags($attrib, $action, $id = null, $hidden = null)
   }
 
   return array($form_start, $form_end);
-  }
+}
 
 
 function rcmail_user_prefs($current=null)
@@ -125,30 +135,30 @@ function rcmail_user_prefs($current=null)
   $sections['server'] = array('id' => 'server',  'section' => rcube_label('serversettings'));
 
   // hook + define list cols
-  $plugin = $RCMAIL->plugins->exec_hook('list_prefs_sections',
+  $plugin = $RCMAIL->plugins->exec_hook('preferences_sections_list',
         array('list' => $sections, 'cols' => array('section')));
 
   $sections = $plugin['list'];
-       
+
   $config = $RCMAIL->config->all();
   $no_override = array_flip($RCMAIL->config->get('dont_override', array()));
-  
+
   foreach ($sections as $idx => $sect) {
-  
+
     if ($current && $sect['id'] != $current)
       continue;
-  
+
     $blocks = array();
-    
+
     switch ($sect['id']) {
     // general
     case 'general':
-    
+
     $blocks = array(
       'main' => array('name' => Q(rcube_label('mainoptions'))),
       'list' => array('name' => Q(rcube_label('listoptions'))),
     );
-    
+
     // language selection
     if (!isset($no_override['language'])) {
       $a_lang = $RCMAIL->list_languages();
@@ -248,17 +258,6 @@ function rcmail_user_prefs($current=null)
       );
     }
 
-    // Show checkbox for toggling 'index_sort' 
-    if (!isset($no_override['index_sort'])) {
-      $field_id = 'rcmfd_indexsort';
-      $input_indexsort = new html_checkbox(array('name' => '_index_sort', 'id' => $field_id, 'value' => 1));
-
-      $blocks['list']['options']['index_sort'] = array(
-        'title' => html::label($field_id, Q(rcube_label('indexsort'))),
-        'content' => $input_indexsort->show($config['index_sort']?1:0),
-      );
-    }
-
     // show drop-down for available skins
     if (!isset($no_override['skin'])) {
       $skins = rcmail_get_skins();
@@ -276,12 +275,12 @@ function rcmail_user_prefs($current=null)
         );
       }
     }
-    
-    break;    
-    
+
+    break;
+
     // Mailbox view (mail screen)
     case 'mailbox':
-    
+
     $blocks = array(
       'main' => array('name' => Q(rcube_label('mainoptions'))),
       'new_message' => array('name' => Q(rcube_label('newmessage'))),
@@ -290,7 +289,8 @@ function rcmail_user_prefs($current=null)
     // show config parameter for preview pane
     if (!isset($no_override['preview_pane'])) {
       $field_id = 'rcmfd_preview';
-      $input_preview = new html_checkbox(array('name' => '_preview_pane', 'id' => $field_id, 'value' => 1));
+      $input_preview = new html_checkbox(array('name' => '_preview_pane', 'id' => $field_id, 'value' => 1,
+        'onchange' => JS_OBJECT_NAME.'.toggle_preview_pane(this)'));
 
       $blocks['main']['options']['preview_pane'] = array(
         'title' => html::label($field_id, Q(rcube_label('previewpane'))),
@@ -298,11 +298,33 @@ function rcmail_user_prefs($current=null)
       );
     }
 
+    // show config parameter for preview pane auto mark as read delay
+    if (!isset($no_override['preview_pane_mark_read'])) {
+      // apply default if config option is not set at all
+      $config['preview_pane_mark_read'] = $RCMAIL->config->get('preview_pane_mark_read', 0);
+
+      $field_id = 'rcmfd_preview_pane_mark_read';
+      $select_delay = new html_select(array('name' => '_preview_pane_mark_read', 'id' => $field_id,
+        'disabled' => $config['preview_pane']?0:1));
+
+      $select_delay->add(rcube_label('never'), '-1');
+      $select_delay->add(rcube_label('immediately'), 0);
+      foreach(array(5, 10, 20, 30) as $sec)
+        $select_delay->add(rcube_label(array('name' => 'afternseconds', 'vars' => array('n' => $sec))), $sec);
+
+      $blocks['main']['options']['preview_pane_mark_read'] = array(
+        'title' => html::label($field_id, Q(rcube_label('previewpanemarkread'))),
+        'content' => $select_delay->show(intval($config['preview_pane_mark_read'])),
+      );
+    }
+
     if (!isset($no_override['mdn_requests'])) {
       $field_id = 'rcmfd_mdn_requests';
       $select_mdn_requests = new html_select(array('name' => '_mdn_requests', 'id' => $field_id));
       $select_mdn_requests->add(rcube_label('askuser'), 0);
       $select_mdn_requests->add(rcube_label('autosend'), 1);
+      $select_mdn_requests->add(rcube_label('autosendknown'), 3);
+      $select_mdn_requests->add(rcube_label('autosendknownignore'), 4);
       $select_mdn_requests->add(rcube_label('ignore'), 2);
 
       $blocks['main']['options']['mdn_requests'] = array(
@@ -311,6 +333,22 @@ function rcmail_user_prefs($current=null)
       );
     }
 
+    $RCMAIL->imap_connect();
+    $threading_supported = $RCMAIL->imap->get_capability('THREAD');
+
+    if (!isset($no_override['autoexpand_threads']) && $threading_supported) {
+      $field_id = 'rcmfd_autoexpand_threads';
+      $select_autoexpand_threads = new html_select(array('name' => '_autoexpand_threads', 'id' => $field_id));
+      $select_autoexpand_threads->add(rcube_label('never'), 0);
+      $select_autoexpand_threads->add(rcube_label('do_expand'), 1);
+      $select_autoexpand_threads->add(rcube_label('expand_only_unread'), 2);
+
+      $blocks['main']['options']['autoexpand_threads'] = array(
+        'title' => html::label($field_id, Q(rcube_label('autoexpand_threads'))),
+        'content' => $select_autoexpand_threads->show($config['autoexpand_threads']),
+      );
+    }
+
     if (!isset($no_override['focus_on_new_message'])) {
       $field_id = 'rcmfd_focus_on_new_message';
       $input_focus_on_new_message = new html_checkbox(array('name' => '_focus_on_new_message', 'id' => $field_id, 'value' => 1));
@@ -348,10 +386,10 @@ function rcmail_user_prefs($current=null)
     }
 
     break;
-    
+
     // Message viewing
     case 'mailview':
-    
+
     $blocks = array(
       'main' => array('name' => Q(rcube_label('mainoptions'))),
     );
@@ -368,6 +406,17 @@ function rcmail_user_prefs($current=null)
       );
     }
 
+    if (!isset($no_override['default_charset'])) {
+      $field_id = 'rcmfd_default_charset';
+
+      $blocks['main']['options']['default_charset'] = array(
+        'title' => html::label($field_id, Q(rcube_label('defaultcharset'))),
+        'content' => $RCMAIL->output->charset_selector(array(
+         'name' => '_default_charset', 'selected' => $config['default_charset']
+         ))
+      );
+    }
+
     if (!isset($no_override['show_images'])) {
       $field_id = 'rcmfd_show_images';
       $input_show_images = new html_select(array('name' => '_show_images', 'id' => $field_id));
@@ -403,22 +452,26 @@ function rcmail_user_prefs($current=null)
     }
 
     break;
-    
+
     // Mail composition
     case 'compose':
-    
+
     $blocks = array(
       'main' => array('name' => Q(rcube_label('mainoptions'))),
+      'sig' => array('name' => Q(rcube_label('signatureoptions'))),
     );
 
     // Show checkbox for HTML Editor
     if (!isset($no_override['htmleditor'])) {
       $field_id = 'rcmfd_htmleditor';
-      $input_htmleditor = new html_checkbox(array('name' => '_htmleditor', 'id' => $field_id, 'value' => 1));
+      $select_htmleditor = new html_select(array('name' => '_htmleditor', 'id' => $field_id));
+      $select_htmleditor->add(rcube_label('never'), 0);
+      $select_htmleditor->add(rcube_label('always'), 1);
+      $select_htmleditor->add(rcube_label('htmlonreply'), 2);
 
       $blocks['main']['options']['htmleditor'] = array(
         'title' => html::label($field_id, Q(rcube_label('htmleditor'))),
-        'content' => $input_htmleditor->show($config['htmleditor']?1:0),
+        'content' => $select_htmleditor->show(intval($config['htmleditor'])),
       );
     }
 
@@ -443,26 +496,121 @@ function rcmail_user_prefs($current=null)
       $select_param_folding->add(rcube_label('2047folding'), 2);
 
       $blocks['main']['options']['mime_param_folding'] = array(
-       'advanced' => true,
+        'advanced' => true,
         'title' => html::label($field_id, Q(rcube_label('mimeparamfolding'))),
         'content' => $select_param_folding->show($config['mime_param_folding']),
       );
     }
 
+    if (!isset($no_override['force_7bit'])) {
+      $field_id = 'rcmfd_force_7bit';
+      $input_7bit = new html_checkbox(array('name' => '_force_7bit', 'id' => $field_id, 'value' => 1));
+
+      $blocks['main']['options']['force_7bit'] = array(
+        'title' => html::label($field_id, Q(rcube_label('force7bit'))),
+        'content' => $input_7bit->show($config['force_7bit']?1:0),
+      );
+    }
+
+    if (!isset($no_override['mdn_default'])) {
+      $field_id = 'rcmfd_mdn_default';
+      $input_mdn = new html_checkbox(array('name' => '_mdn_default', 'id' => $field_id, 'value' => 1));
+
+      $blocks['main']['options']['mdn_default'] = array(
+        'title' => html::label($field_id, Q(rcube_label('reqmdn'))),
+        'content' => $input_mdn->show($config['mdn_default']?1:0),
+      );
+    }
+
+    if (!isset($no_override['dsn_default'])) {
+      $field_id = 'rcmfd_dsn_default';
+      $input_dsn = new html_checkbox(array('name' => '_dsn_default', 'id' => $field_id, 'value' => 1));
+
+      $blocks['main']['options']['dsn_default'] = array(
+        'title' => html::label($field_id, Q(rcube_label('reqdsn'))),
+        'content' => $input_dsn->show($config['dsn_default']?1:0),
+      );
+    }
+
+    if (!isset($no_override['reply_same_folder'])) {
+      $field_id = 'rcmfd_reply_same_folder';
+      $input_reply_same_folder = new html_checkbox(array('name' => '_reply_same_folder', 'id' => $field_id, 'value' => 1));
+
+      $blocks['main']['options']['reply_same_folder'] = array(
+        'title' => html::label($field_id, Q(rcube_label('replysamefolder'))),
+        'content' => $input_reply_same_folder->show($config['reply_same_folder']?1:0),
+      );
+    }
+
+    if (!isset($no_override['top_posting'])) {
+      $field_id = 'rcmfd_top_posting';
+      $select_replymode = new html_select(array('name' => '_top_posting', 'id' => $field_id, 'onchange' => "\$('#rcmfd_sig_above').attr('disabled',this.selectedIndex==0)"));
+      $select_replymode->add(rcube_label('replybottomposting'), 0);
+      $select_replymode->add(rcube_label('replytopposting'), 1);
+
+      $blocks['main']['options']['top_posting'] = array(
+        'title' => html::label($field_id, Q(rcube_label('whenreplying'))),
+        'content' => $select_replymode->show($config['top_posting']?1:0),
+      );
+    }
+
+    if (!isset($no_override['show_sig'])) {
+      $field_id = 'rcmfd_show_sig';
+      $select_show_sig = new html_select(array('name' => '_show_sig', 'id' => $field_id));
+      $select_show_sig->add(rcube_label('never'), 0);
+      $select_show_sig->add(rcube_label('always'), 1);
+      $select_show_sig->add(rcube_label('newmessageonly'), 2);
+      $select_show_sig->add(rcube_label('replyandforwardonly'), 3);
+
+      $blocks['sig']['options']['show_sig'] = array(
+        'title' => html::label($field_id, Q(rcube_label('autoaddsignature'))),
+        'content' => $select_show_sig->show($RCMAIL->config->get('show_sig', 1)),
+      );
+    }
+
+    if (!isset($no_override['sig_above'])) {
+      $field_id = 'rcmfd_sig_above';
+      $select_sigabove = new html_select(array('name' => '_sig_above', 'id' => $field_id, 'disabled' => !$config['top_posting']));
+      $select_sigabove->add(rcube_label('belowquote'), 0);
+      $select_sigabove->add(rcube_label('abovequote'), 1);
+
+      $blocks['sig']['options']['sig_above'] = array(
+        'title' => html::label($field_id, Q(rcube_label('replysignaturepos'))),
+        'content' => $select_sigabove->show($config['sig_above']?1:0),
+      );
+    }
+
+    if (!isset($no_override['strip_existing_sig'])) {
+      $field_id = 'rcmfd_strip_existing_sig';
+      $input_stripexistingsig = new html_checkbox(array('name' => '_strip_existing_sig', 'id' => $field_id, 'value' => 1));
+
+      $blocks['sig']['options']['strip_existing_sig'] = array(
+        'title' => html::label($field_id, Q(rcube_label('replyremovesignature'))),
+        'content' => $input_stripexistingsig->show($config['strip_existing_sig']?1:0),
+      );
+    }
+
     break;
-    
+
     // Special IMAP folders
     case 'folders':
-    
+
     $blocks = array(
       'main' => array('name' => Q(rcube_label('mainoptions'))),
     );
 
     // Configure special folders
     if (!isset($no_override['default_imap_folders'])) {
-      $RCMAIL->imap_init(true);
-      $select = rcmail_mailbox_select(array('noselection' => '---', 'realnames' => true,
-        'maxlength' => 30, 'exceptions' => array('INBOX')));
+
+      $RCMAIL->imap_connect();
+
+      // load folders list only when needed
+      if ($current) {
+        $select = rcmail_mailbox_select(array('noselection' => '---', 'realnames' => true,
+          'maxlength' => 30, 'exceptions' => array('INBOX')));
+      }
+      else // dummy select
+        $select = new html_select();
 
       if (!isset($no_override['drafts_mbox']))
         $blocks['main']['options']['drafts_mbox'] = array(
@@ -490,10 +638,10 @@ function rcmail_user_prefs($current=null)
     }
 
     break;
-    
+
     // Server settings
     case 'server':
-    
+
     $blocks = array(
       'main' => array('name' => Q(rcube_label('mainoptions'))),
       'maintenance' => array('name' => Q(rcube_label('maintenance'))),
@@ -530,6 +678,16 @@ function rcmail_user_prefs($current=null)
       );
     }
 
+    if (!isset($no_override['delete_always'])) {
+      $field_id = 'rcmfd_delete_always';
+      $input_delete_always = new html_checkbox(array('name' => '_delete_always', 'id' => $field_id, 'value' => 1));
+
+      $blocks['main']['options']['delete_always'] = array(
+        'title' => html::label($field_id, Q(rcube_label('deletealways'))),
+        'content' => $input_delete_always->show($config['delete_always']?1:0),
+      );
+    }
+
     // Trash purging on logout
     if (!isset($no_override['logout_purge'])) {
       $field_id = 'rcmfd_logout_purge';
@@ -551,20 +709,18 @@ function rcmail_user_prefs($current=null)
         'content' => $input_expunge->show($config['logout_expunge']?1:0),
       );
     }
-    
+
     break;
     }
 
-    $data = $RCMAIL->plugins->exec_hook('user_preferences', array('section' => $sect['id'], 'blocks' => $blocks));
+    $data = $RCMAIL->plugins->exec_hook('preferences_list', array('section' => $sect['id'], 'blocks' => $blocks));
     $found = false;
-    
+
     // create output
     foreach ($data['blocks'] as $block) {
-      if ($block['options']) {
-        foreach ($block['options'] as $option) {
-          $found = true;
-         break 2;
-       }
+      if (!empty($block['content']) || !empty($block['options'])) {
+        $found = true;
+           break;
       }
     }
 
@@ -584,15 +740,14 @@ function rcmail_get_skins()
   $skins = array();
 
   $dir = opendir($path);
-  
+
   if (!$dir)
        return false;
-  
+
   while (($file = readdir($dir)) !== false)
   {
     $filename = $path.'/'.$file;
-    if (is_dir($filename) && is_readable($filename) 
-       && !in_array($file, array('.', '..', '.svn')))
+    if (!preg_match('/^\./', $file) && is_dir($filename) && is_readable($filename))
       $skins[] = $file;
   }
 
@@ -609,4 +764,3 @@ $OUTPUT->add_handlers(array(
   'identitieslist' => 'rcmail_identities_list',
 ));
 
-?>
index f095cb18e6bb5ca1a80266491f5513ee3f7aca67..85de86abccc69f8f8fb824daa8d2ad828664f8cc 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/settings/identities.inc                                 |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: identities.inc 2006 2008-10-24 07:57:21Z alec $
+ $Id: identities.inc 3989 2010-09-25 13:03:53Z alec $
 
 */
 
@@ -45,4 +45,3 @@ $OUTPUT->add_handler('identityframe', 'rcmail_identity_frame');
 $OUTPUT->set_env('identities_level', IDENTITIES_LEVEL);
 
 $OUTPUT->send('identities');
-?>
\ No newline at end of file
diff --git a/program/steps/settings/manage_folders.inc b/program/steps/settings/manage_folders.inc
deleted file mode 100644 (file)
index 66b7edf..0000000
+++ /dev/null
@@ -1,352 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/steps/settings/manage_folders.inc                             |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Provide functionality to create/delete/rename folders               |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: manage_folders.inc 2505 2009-05-20 09:55:15Z alec $
-
-*/
-
-// WARNING: folder names in UI are encoded with RCMAIL_CHARSET
-
-// init IMAP connection
-$RCMAIL->imap_init(true);
-
-// subscribe to one or more mailboxes
-if ($RCMAIL->action=='subscribe')
-  {
-  if ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST, false, 'UTF7-IMAP'))
-    $IMAP->subscribe(array($mbox));
-  }
-
-// unsubscribe one or more mailboxes
-else if ($RCMAIL->action=='unsubscribe')
-  {
-  if ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST, false, 'UTF7-IMAP'))
-    $IMAP->unsubscribe(array($mbox));
-  }
-
-// create a new mailbox
-else if ($RCMAIL->action=='create-folder')
-  {
-  if (!empty($_POST['_name']))
-    {
-    $name = trim(get_input_value('_name', RCUBE_INPUT_POST, FALSE, 'UTF7-IMAP'));
-    $create = $IMAP->create_mailbox($name, TRUE);
-    }
-  
-  if ($create && $OUTPUT->ajax_call)
-    {
-    $delimiter = $IMAP->get_hierarchy_delimiter();
-    $folderlist = $IMAP->list_unsubscribed();
-    $index = array_search($create, $folderlist);
-    $before = $index !== false && isset($folderlist[$index+1]) ? rcube_charset_convert($folderlist[$index+1], 'UTF7-IMAP') : false;
-    
-    $create = rcube_charset_convert($create, 'UTF7-IMAP');
-    $foldersplit = explode($delimiter, $create);
-    $display_create = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', substr_count($create, $delimiter)) . $foldersplit[count($foldersplit)-1];
-
-    $OUTPUT->command('add_folder_row', $create, $display_create, false, $before);
-    }
-  else if (!$create)
-    {
-    $OUTPUT->show_message('errorsaving', 'error');
-    }
-  }
-
-// rename a mailbox
-else if ($RCMAIL->action=='rename-folder')
-  {
-  if (!empty($_POST['_folder_oldname']) && !empty($_POST['_folder_newname']))
-    {
-    $name_utf8 = trim(get_input_value('_folder_newname', RCUBE_INPUT_POST));
-    $oldname_utf8 = get_input_value('_folder_oldname', RCUBE_INPUT_POST);
-    $name = rcube_charset_convert($name_utf8, RCMAIL_CHARSET, 'UTF7-IMAP');
-    $oldname = rcube_charset_convert($oldname_utf8, RCMAIL_CHARSET, 'UTF7-IMAP');
-
-    $rename = $IMAP->rename_mailbox($oldname, $name);
-    }
-
-  if ($rename && $OUTPUT->ajax_call)
-    {
-    $folderlist = $IMAP->list_unsubscribed();
-    $delimiter = $IMAP->get_hierarchy_delimiter();
-
-    $regexp = '/^' . preg_quote($rename . $delimiter, '/') . '/';
-
-    // subfolders
-    for ($x=sizeof($folderlist)-1; $x>=0; $x--)
-      {
-      if (preg_match($regexp, $folderlist[$x]))
-        {
-        $oldfolder = $oldname . $delimiter . preg_replace($regexp, '', $folderlist[$x]);
-        $foldersplit = explode($delimiter, $folderlist[$x]);
-        $level = count($foldersplit) - 1;
-        $display_rename = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) 
-          . rcube_charset_convert($foldersplit[$level], 'UTF7-IMAP');
-
-        $before = isset($folderlist[$x+1]) ? rcube_charset_convert($folderlist[$x+1], 'UTF7-IMAP') : false;
-        
-        $OUTPUT->command('replace_folder_row', rcube_charset_convert($oldfolder, 'UTF7-IMAP'),
-          rcube_charset_convert($folderlist[$x], 'UTF7-IMAP'), $display_rename, $before);
-        }
-      }
-
-    $foldersplit = explode($delimiter, $rename);
-    $level = count($foldersplit) - 1;
-    $display_rename = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) . rcube_charset_convert($foldersplit[$level], 'UTF7-IMAP');
-    $index = array_search($rename, $folderlist);
-    $before = $index !== false && isset($folderlist[$index+1]) ? rcube_charset_convert($folderlist[$index+1], 'UTF7-IMAP') : false;
-
-    $OUTPUT->command('replace_folder_row', $oldname_utf8, rcube_charset_convert($rename, 'UTF7-IMAP'), $display_rename, $before);
-    $OUTPUT->command('reset_folder_rename');
-    }
-  else if (!$rename && $OUTPUT->ajax_call)
-    {
-    $OUTPUT->command('reset_folder_rename');
-    $OUTPUT->show_message('errorsaving', 'error');
-    }
-  else if (!$rename)
-    $OUTPUT->show_message('errorsaving', 'error');
-  }
-
-// delete an existing IMAP mailbox
-else if ($RCMAIL->action=='delete-folder')
-  {
-  $a_mboxes = $IMAP->list_unsubscribed();
-  $delimiter = $IMAP->get_hierarchy_delimiter();
-  
-  $mboxes_utf8 = get_input_value('_mboxes', RCUBE_INPUT_POST);
-  $mboxes = rcube_charset_convert($mboxes_utf8, RCMAIL_CHARSET, 'UTF7-IMAP');
-
-  if ($mboxes)
-    $deleted = $IMAP->delete_mailbox(array($mboxes));
-
-  if ($OUTPUT->ajax_call && $deleted)
-    {
-    $OUTPUT->command('remove_folder_row', $mboxes_utf8);
-    foreach ($a_mboxes as $mbox)
-      {
-      if (preg_match('/^'. preg_quote($mboxes.$delimiter, '/') .'/', $mbox))
-        {
-        $OUTPUT->command('remove_folder_row', rcube_charset_convert($mbox, 'UTF7-IMAP'));
-        }
-      }
-    $OUTPUT->show_message('folderdeleted', 'confirmation');
-    }
-  else if (!$deleted)
-    {
-    $OUTPUT->show_message('errorsaving', 'error');
-    }
-  }
-
-if ($OUTPUT->ajax_call)
-  $OUTPUT->send();
-
-
-// build table with all folders listed by server
-function rcube_subscription_form($attrib)
-  {
-  global $IMAP, $CONFIG, $OUTPUT;
-
-  list($form_start, $form_end) = get_form_tags($attrib, 'folders');
-  unset($attrib['form']);
-  
-  if (!$attrib['id'])
-    $attrib['id'] = 'rcmSubscriptionlist';
-
-  $table = new html_table();
-
-  // add table header
-  $table->add_header('name', rcube_label('foldername'));
-  $table->add_header('msgcount', rcube_label('messagecount'));
-  $table->add_header('subscribed', rcube_label('subscribed'));
-  $table->add_header('rename', '&nbsp;');
-  $table->add_header('delete', '&nbsp;');
-
-
-  // get folders from server
-  $IMAP->clear_cache('mailboxes');
-
-  $a_unsubscribed = $IMAP->list_unsubscribed();
-  $a_subscribed = $IMAP->list_mailboxes();
-  $delimiter = $IMAP->get_hierarchy_delimiter();
-  $a_js_folders = $seen_folders = $list_folders = array();
-
-  // pre-process folders list
-  foreach ($a_unsubscribed as $i => $folder) {
-    $foldersplit = explode($delimiter, $folder);
-    $name = rcube_charset_convert(array_pop($foldersplit), 'UTF7-IMAP');
-    $parent_folder = join($delimiter, $foldersplit);
-    $level = count($foldersplit);
-
-    // add any necessary "virtual" parent folders
-    if ($parent_folder && !$seen[$parent_folder]) {
-      for ($i=1; $i<=$level; $i++) {
-       $ancestor_folder = join($delimiter, array_slice($foldersplit, 0, $i));
-       if ($ancestor_folder && !$seen[$ancestor_folder]++) {
-         $ancestor_name = rcube_charset_convert($foldersplit[$i-1], 'UTF7-IMAP');
-         $list_folders[] = array('id' => $ancestor_folder, 'name' => $ancestor_name, 'level' => $i-1, 'virtual' => true);
-       }
-      }
-    }
-    
-    $list_folders[] = array('id' => $folder, 'name' => $name, 'level' => $level);
-    $seen[$folder]++;
-  }
-
-  $checkbox_subscribe = new html_checkbox(array(
-    'name' => '_subscribed[]',
-    'onclick' => JS_OBJECT_NAME.".command(this.checked?'subscribe':'unsubscribe',this.value)",
-  ));
-  
-  if (!empty($attrib['deleteicon']))
-    $del_button = html::img(array('src' => $CONFIG['skin_path'] . $attrib['deleteicon'], 'alt' => rcube_label('delete')));
-  else
-    $del_button = rcube_label('delete');
-
-  if (!empty($attrib['renameicon']))
-    $edit_button = html::img(array('src' => $CONFIG['skin_path'] . $attrib['renameicon'], 'alt' => rcube_label('rename')));
-  else
-    $edit_button = rcube_label('rename');
-    
-  // create list of available folders
-  foreach ($list_folders as $i => $folder) {
-    $idx = $i + 1;
-    $subscribed = in_array($folder['id'], $a_subscribed);
-    $protected = ($CONFIG['protect_default_folders'] == true && in_array($folder['id'], $CONFIG['default_imap_folders']));
-    $classes = array($i%2 ? 'even' : 'odd');
-    $folder_js = JQ($folder['id']);
-    $display_folder = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $folder['level']) . ($protected ? rcmail_localize_foldername($folder['id']) : $folder['name']);
-    $folder_utf8 = rcube_charset_convert($folder['id'], 'UTF7-IMAP');
-    
-    if ($folder['virtual'])
-      $classes[] = 'virtual';
-    
-    $table->add_row(array('id' => 'rcmrow'.$idx, 'class' => join(' ', $classes)));
-    
-    $table->add('name', Q($display_folder));
-    $table->add('msgcount', ($folder['virtual'] ? '' : $IMAP->messagecount($folder['id'])));
-    $table->add('subscribed', ($protected || $folder['virtual']) ? ($subscribed ? '&nbsp;&#x2022;' : '&nbsp;') :
-        $checkbox_subscribe->show(($subscribed ? $folder_utf8 : ''), array('value' => $folder_utf8)));
-    
-    // add rename and delete buttons
-    if (!$protected && !$folder['virtual']) {
-      $table->add('rename', html::a(array('href' => "#rename", 'title' => rcube_label('renamefolder')), $edit_button));
-      $table->add('delete', html::a(array('href' => "#delete", 'title' => rcube_label('deletefolder')), $del_button));
-    }
-    else {
-      $table->add('rename', '&nbsp;');
-      $table->add('delete', '&nbsp;');
-    }
-    
-    $a_js_folders['rcmrow'.$idx] = array($folder_utf8, $display_folder, $protected || $folder['virtual']);
-  }
-
-  rcmail::get_instance()->plugins->exec_hook('manage_folders', array('table'=>$table));
-
-  $OUTPUT->add_gui_object('subscriptionlist', $attrib['id']);
-  $OUTPUT->set_env('subscriptionrows', $a_js_folders);
-  $OUTPUT->set_env('defaultfolders', $CONFIG['default_imap_folders']);
-  $OUTPUT->set_env('delimiter', $delimiter);
-
-  return $form_start . $table->show($attrib) . $form_end;
-  }
-
-
-function rcube_create_folder_form($attrib)
-  {
-  global $OUTPUT;
-  
-  list($form_start, $form_end) = get_form_tags($attrib, 'create-folder');
-  unset($attrib['form']);
-
-  if ($attrib['hintbox'])
-    $OUTPUT->add_gui_object('createfolderhint', $attrib['hintbox']);
-
-  // return the complete edit form as table
-  $out = "$form_start\n";
-
-  $input = new html_inputfield(array('name' => '_folder_name'));
-  $out .= $input->show();
-  
-  if (get_boolean($attrib['button']))
-    {
-    $button = new html_inputfield(array('type' => 'button',
-                                    'value' => rcube_label('create'),
-                                    'onclick' => JS_OBJECT_NAME.".command('create-folder',this.form)"));
-    $out .= $button->show();
-    }
-
-  $out .= "\n$form_end";
-
-  return $out;
-  }
-
-function rcube_rename_folder_form($attrib)
-  {
-  global $CONFIG, $IMAP;
-
-  list($form_start, $form_end) = get_form_tags($attrib, 'rename-folder');
-  unset($attrib['form']);
-
-  // return the complete edit form as table
-  $out = "$form_start\n";
-
-  $a_unsubscribed = $IMAP->list_unsubscribed();
-  $select_folder = new html_select(array('name' => '_folder_oldname', 'id' => 'rcmfd_oldfolder'));
-
-  foreach ($a_unsubscribed as $i => $folder)
-    {
-    if ($CONFIG['protect_default_folders'] == TRUE && in_array($folder,$CONFIG['default_imap_folders'])) 
-      continue;
-
-    $select_folder->add($folder);
-    }
-
-  $out .= $select_folder->show();
-
-  $out .= " to ";
-  $inputtwo = new html_inputfield(array('name' => '_folder_newname'));
-  $out .= $inputtwo->show();
-
-  if (get_boolean($attrib['button']))
-    {
-    $button = new html_inputfield(array('type' => 'button',
-                                    'value' => rcube_label('rename'),
-                                    'onclick' => JS_OBJECT_NAME.".command('rename-folder',this.form)"));
-    $out .= $button->show();
-    }
-
-  $out .= "\n$form_end";
-  
-  return $out;
-  }
-
-$OUTPUT->set_pagetitle(rcube_label('folders'));
-$OUTPUT->include_script('list.js');
-
-// register UI objects
-$OUTPUT->add_handlers(array(
-  'foldersubscription' => 'rcube_subscription_form',
-  'createfolder' => 'rcube_create_folder_form',
-  'renamefolder' => 'rcube_rename_folder_form'
-));
-
-// add some labels to client
-$OUTPUT->add_label('deletefolderconfirm','addsubfolderhint','forbiddencharacter','folderdeleting','folderrenaming','foldercreating','foldermoving');
-
-$OUTPUT->send('managefolders');
-?>
diff --git a/program/steps/settings/save_folder.inc b/program/steps/settings/save_folder.inc
new file mode 100644 (file)
index 0000000..074418b
--- /dev/null
@@ -0,0 +1,176 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/settings/save_folder.inc                                |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Provide functionality to create/edit a folder                       |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
+ +-----------------------------------------------------------------------+
+
+ $Id: save_folder.inc 4304 2010-12-03 10:58:40Z alec $
+
+*/
+
+// WARNING: folder names in UI are encoded with RCMAIL_CHARSET
+
+// init IMAP connection
+$RCMAIL->imap_connect();
+
+
+$name = trim(get_input_value('_name', RCUBE_INPUT_POST, true));
+$old  = trim(get_input_value('_mbox', RCUBE_INPUT_POST, true));
+$path = trim(get_input_value('_parent', RCUBE_INPUT_POST, true));
+
+$name_imap = rcube_charset_convert($name, RCMAIL_CHARSET, 'UTF7-IMAP');
+$old_imap  = rcube_charset_convert($old, RCMAIL_CHARSET, 'UTF7-IMAP');
+// $path is in UTF7-IMAP already
+
+$delimiter = $IMAP->get_hierarchy_delimiter();
+$special   = (strlen($old_imap) && in_array($old_imap, (array) $RCMAIL->config->get('default_imap_folders')));
+$protected = ($special && $RCMAIL->config->get('protect_default_folders'));
+
+
+// Folder name checks
+if ($protected) {
+}
+else if (!strlen($name)) {
+    $error = rcube_label('cannotbeempty');
+}
+else if (mb_strlen($name) > 128) {
+    $error = rcube_label('nametoolong');
+}
+else {
+    // these characters are problematic e.g. when used in LIST/LSUB
+    foreach (array($delimiter, '%', '*') as $char) {
+        if (strpos($name, $delimiter) !== false) {
+            $error = rcube_label('forbiddencharacter') . " ($char)";
+            break;
+        }
+    }
+}
+
+if ($error) {
+    $OUTPUT->command('display_message', $error, 'error');
+}
+else {
+    if ($protected) {
+        $name_imap = $old_imap;
+    }
+    else if (strlen($path)) {
+        $name_imap = $path . $delimiter . $name_imap;
+    }
+
+    $folder['name']     = $name_imap;
+    $folder['oldname']  = $old_imap;
+    $folder['settings'] = array(
+        // List view mode: 0-list, 1-threads
+        'view_mode'   => (int) get_input_value('_viewmode', RCUBE_INPUT_POST),
+        'sort_column' => get_input_value('_sortcol', RCUBE_INPUT_POST),
+        'sort_order'  => get_input_value('_sortord', RCUBE_INPUT_POST),
+    );
+}
+
+// create a new mailbox
+if (!$error && !strlen($old)) {
+
+    $plugin = $RCMAIL->plugins->exec_hook('folder_create', array('record' => $folder));
+
+    $folder = $plugin['record'];
+
+    if (!$plugin['abort']) {
+        $created = $IMAP->create_mailbox($folder['name'], TRUE);
+    }
+    else {
+        $created = $plugin['result'];
+    }
+
+    if ($created) {
+        // Save folder settings
+        if (isset($_POST['_viewmode'])) {
+            $a_threaded = (array) $RCMAIL->config->get('message_threading', array());
+
+            if ($_POST['_viewmode'])
+                $a_threaded[$folder['name']] = true;
+            else
+                unset($a_threaded[$folder['name']]);
+
+            $RCMAIL->user->save_prefs(array('message_threading' => $a_threaded));
+        }
+
+        $OUTPUT->show_message('foldercreated', 'confirmation');
+        $OUTPUT->command('reload', 250);
+        $OUTPUT->send('iframe');
+    }
+    else {
+        // show error message
+        $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error', null, false);
+    }
+}
+
+// update a mailbox
+else if (!$error) {
+    $plugin = $RCMAIL->plugins->exec_hook('folder_update', array('record' => $folder));
+
+    $folder = $plugin['record'];
+    $rename = ($folder['oldname'] != $folder['name']);
+
+    if (!$plugin['abort']) {
+        if ($rename) {
+            $updated = $RCMAIL->imap->rename_mailbox($folder['oldname'], $folder['name']);
+        }
+        else {
+            $updated = true;
+        }
+    }
+    else {
+        $updated = $plugin['result'];
+    }
+
+    if ($updated) {
+        // Update folder settings,
+        if (isset($_POST['_viewmode'])) {
+            $a_threaded = (array) $RCMAIL->config->get('message_threading', array());
+
+            // In case of name change update names of childrens in settings
+            if ($rename) {
+                $delimiter  = $RCMAIL->imap->get_hierarchy_delimiter();
+                $oldprefix  = '/^' . preg_quote($folder['oldname'] . $delimiter, '/') . '/';
+                foreach ($a_threaded as $key => $val) {
+                    if ($key == $folder['oldname']) {
+                        unset($a_threaded[$key]);
+                    }
+                    else if (preg_match($oldprefix, $key)) {
+                        unset($a_threaded[$key]);
+                           $a_threaded[preg_replace($oldprefix, $folder['name'].$delimiter, $key)] = true;
+                    }
+                }
+            }
+            if ($_POST['_viewmode'])
+                $a_threaded[$folder['name']] = true;
+            else
+                unset($a_threaded[$folder['name']]);
+
+            $RCMAIL->user->save_prefs(array('message_threading' => $a_threaded));
+        }
+
+        $OUTPUT->show_message('folderupdated', 'confirmation');
+        if ($rename) {
+            $OUTPUT->command('reload', 250);
+            $OUTPUT->send('iframe');
+        }
+    }
+    else {
+        // show error message
+        $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error', null, false);
+    }
+}
+
+rcmail_overwrite_action('edit-folder');
index 977d7033adc35000ba488637ea5a8e5c760012fa..f07197397b3bfbd2e13ab270f71256ec4b2e0b09 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/settings/save_identity.inc                              |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: save_identity.inc 2778 2009-07-21 16:02:33Z thomasb $
+ $Id: save_identity.inc 4025 2010-09-30 13:24:33Z alec $
 
 */
 
@@ -56,31 +56,52 @@ foreach ($a_boolean_cols as $col)
 if (IDENTITIES_LEVEL == 1 || IDENTITIES_LEVEL == 3)
   unset($save_data['email']);
 
+// Validate e-mail addresses
+foreach (array('email', 'reply-to', 'bcc') as $item) {
+  if ($email = $save_data[$item]) {
+    $ascii_email = idn_to_ascii($email);
+    if (!check_email($ascii_email, false)) {
+      // show error message
+      $OUTPUT->show_message('emailformaterror', 'error', array('email' => $email), false);
+      rcmail_overwrite_action('edit-identity');
+      return;
+    }
+  }
+}
 
 // update an existing contact
 if ($_POST['_iid'])
 {
   $iid = get_input_value('_iid', RCUBE_INPUT_POST);
-  $plugin = $RCMAIL->plugins->exec_hook('save_identity', array('id' => $iid, 'record' => $save_data));
+  $plugin = $RCMAIL->plugins->exec_hook('identity_update', array('id' => $iid, 'record' => $save_data));
   $save_data = $plugin['record'];
 
-  if (!$plugin['abort'] && ($updated = $USER->update_identity($iid, $save_data)))
-  {
+  if ($save_data['email'])
+    $save_data['email'] = idn_to_ascii($save_data['email']);
+  if ($save_data['bcc'])
+    $save_data['bcc'] = idn_to_ascii($save_data['bcc']);
+  if ($save_data['reply-to'])
+    $save_data['reply-to'] = idn_to_ascii($save_data['reply-to']);
+
+  if (!$plugin['abort'])
+    $updated = $USER->update_identity($iid, $save_data);
+  else
+    $updated = $plugin['result'];
+
+  if ($updated) {
     $OUTPUT->show_message('successfullysaved', 'confirmation');
-    
+
     if (!empty($_POST['_standard']))
       $default_id = get_input_value('_iid', RCUBE_INPUT_POST);
-    
-    if ($_POST['_framed'])
-    {
+
+    if ($_POST['_framed']) {
       // update the changed col in list
-      // ...      
+      // ...
     }
   }
-  else if ($plugin['abort'] || $DB->is_error())
-  {
+  else {
     // show error message
-    $OUTPUT->show_message('errorsaving', 'error', null, false);
+    $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error', null, false);
     rcmail_overwrite_action('edit-identity');
     return;
   }
@@ -92,11 +113,19 @@ else if (IDENTITIES_LEVEL < 2)
   if (IDENTITIES_LEVEL == 1)
     $save_data['email'] = $RCMAIL->user->get_username();
 
-  $plugin = $RCMAIL->plugins->exec_hook('create_identity', array('record' => $save_data));
+  $plugin = $RCMAIL->plugins->exec_hook('identity_create', array('record' => $save_data));
   $save_data = $plugin['record'];
 
-  if (!$plugin['abort'] && $save_data['email'] && ($insert_id = $USER->insert_identity($save_data)))
-  {
+  $save_data['email']    = idn_to_ascii($save_data['email']);
+  $save_data['bcc']      = idn_to_ascii($save_data['bcc']);
+  $save_data['reply-to'] = idn_to_ascii($save_data['reply-to']);
+
+  if (!$plugin['abort'])
+    $insert_id = $save_data['email'] ? $USER->insert_identity($save_data) : null;
+  else
+    $insert_id = $plugin['result'];
+
+  if ($insert_id) {
     $OUTPUT->show_message('successfullysaved', 'confirmation', null, false);
     
     $_GET['_iid'] = $insert_id;
@@ -104,10 +133,9 @@ else if (IDENTITIES_LEVEL < 2)
     if (!empty($_POST['_standard']))
       $default_id = $insert_id;
   }
-  else
-  {
+  else {
     // show error message
-    $OUTPUT->show_message('errorsaving', 'error', null, false);
+    $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error', null, false);
     rcmail_overwrite_action('edit-identity');
     return;
   }
@@ -122,5 +150,3 @@ if ($default_id)
 
 // go to next step
 rcmail_overwrite_action('identities');
-
-?>
index ebcd090f0f2e8abeaafa06c48adf83b37e443d1a..a0469ae1231692ee3a26809ca569b8f2e49b5b18 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/steps/settings/save_prefs.inc                                 |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2009, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: save_prefs.inc 2983 2009-09-23 12:32:09Z alec $
+ $Id: save_prefs.inc 4169 2010-11-02 14:53:54Z alec $
 
 */
 
@@ -32,7 +32,6 @@ switch ($CURR_SECTION)
       'timezone'     => isset($_POST['_timezone']) ? (is_numeric($_POST['_timezone']) ? floatval($_POST['_timezone']) : get_input_value('_timezone', RCUBE_INPUT_POST)) : $CONFIG['timezone'],
       'dst_active'   => isset($_POST['_dst_active']) ? TRUE : FALSE,
       'pagesize'     => is_numeric($_POST['_pagesize']) ? max(2, intval($_POST['_pagesize'])) : $CONFIG['pagesize'],
-      'index_sort'   => isset($_POST['_index_sort']) ? TRUE : FALSE,
       'prettydate'   => isset($_POST['_pretty_date']) ? TRUE : FALSE,
       'skin'        => isset($_POST['_skin']) ? get_input_value('_skin', RCUBE_INPUT_POST) : $CONFIG['skin'],
     );
@@ -41,7 +40,9 @@ switch ($CURR_SECTION)
   case 'mailbox':
     $a_user_prefs = array(
       'focus_on_new_message' => isset($_POST['_focus_on_new_message']) ? TRUE : FALSE,
-      'preview_pane'        => isset($_POST['_preview_pane']) ? TRUE : FALSE,
+      'preview_pane'         => isset($_POST['_preview_pane']) ? TRUE : FALSE,
+      'preview_pane_mark_read' => isset($_POST['_preview_pane_mark_read']) ? intval($_POST['_preview_pane_mark_read']) : $CONFIG['preview_pane_mark_read'],
+      'autoexpand_threads'   => isset($_POST['_autoexpand_threads']) ? intval($_POST['_autoexpand_threads']) : 0,
       'mdn_requests'         => isset($_POST['_mdn_requests']) ? intval($_POST['_mdn_requests']) : 0,
       'keep_alive'           => isset($_POST['_keep_alive']) ? intval($_POST['_keep_alive'])*60 : $CONFIG['keep_alive'],
       'check_all_folders'    => isset($_POST['_check_all_folders']) ? TRUE : FALSE,
@@ -54,14 +55,23 @@ switch ($CURR_SECTION)
       'inline_images'   => isset($_POST['_inline_images']) ? TRUE : FALSE,
       'show_images'     => isset($_POST['_show_images']) ? intval($_POST['_show_images']) : 0,
       'display_next'    => isset($_POST['_display_next']) ? TRUE : FALSE,
+      'default_charset' => get_input_value('_default_charset', RCUBE_INPUT_POST),
     );
 
   break;
   case 'compose':
     $a_user_prefs = array(
-      'htmleditor'         => isset($_POST['_htmleditor']) ? TRUE : FALSE,
+      'htmleditor'         => intval($_POST['_htmleditor']),
       'draft_autosave'     => isset($_POST['_draft_autosave']) ? intval($_POST['_draft_autosave']) : 0,
       'mime_param_folding' => isset($_POST['_mime_param_folding']) ? intval($_POST['_mime_param_folding']) : 0,
+      'force_7bit'         => isset($_POST['_force_7bit']) ? TRUE : FALSE,
+      'mdn_default'        => isset($_POST['_mdn_default']) ? TRUE : FALSE,
+      'dsn_default'        => isset($_POST['_dsn_default']) ? TRUE : FALSE,
+      'reply_same_folder'  => isset($_POST['_reply_same_folder']) ? TRUE : FALSE,
+      'show_sig'           => isset($_POST['_show_sig']) ? intval($_POST['_show_sig']) : 1,
+      'top_posting'        => !empty($_POST['_top_posting']),
+      'strip_existing_sig' => isset($_POST['_strip_existing_sig']),
+      'sig_above'          => !empty($_POST['_sig_above']) && !empty($_POST['_top_posting']),
     );
 
   break;
@@ -70,6 +80,7 @@ switch ($CURR_SECTION)
       'read_when_deleted' => isset($_POST['_read_when_deleted']) ? TRUE : FALSE,
       'skip_deleted'      => isset($_POST['_skip_deleted']) ? TRUE : FALSE,
       'flag_for_deletion' => isset($_POST['_flag_for_deletion']) ? TRUE : FALSE,
+      'delete_always'    => isset($_POST['_delete_always']) ? TRUE : FALSE,
       'logout_purge'      => isset($_POST['_logout_purge']) ? TRUE : FALSE,
       'logout_expunge'    => isset($_POST['_logout_expunge']) ? TRUE : FALSE,
     );
@@ -86,8 +97,7 @@ switch ($CURR_SECTION)
   break;
 }
 
-
-$data = rcmail::get_instance()->plugins->exec_hook('save_preferences',
+$data = rcmail::get_instance()->plugins->exec_hook('preferences_save',
   array('prefs' => $a_user_prefs, 'section' => $CURR_SECTION));
 
 $a_user_prefs = $data['prefs'];
@@ -108,8 +118,9 @@ switch ($CURR_SECTION)
       $OUTPUT->command('reload', 500);
     }
 
-    // switch skin
-    $OUTPUT->set_skin($a_user_prefs['skin']);
+    // switch skin (if valid, otherwise unset the pref and fall back to default)
+    if (!$OUTPUT->set_skin($a_user_prefs['skin']))
+      unset($a_user_prefs['skin']);
 
     // force min size
     if ($a_user_prefs['pagesize'] < 1)
@@ -152,4 +163,4 @@ if ($USER->save_prefs($a_user_prefs))
 // display the form again
 rcmail_overwrite_action('edit-prefs');
 
-?>
+
diff --git a/program/steps/utils/error.inc b/program/steps/utils/error.inc
new file mode 100644 (file)
index 0000000..ed79c1e
--- /dev/null
@@ -0,0 +1,129 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/utils/error.inc                                         |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Display error message page                                          |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: error.inc 3989 2010-09-25 13:03:53Z alec $
+
+*/
+
+
+// browser is not compatible with this application
+if ($ERROR_CODE==409) {
+  $user_agent = $GLOBALS['HTTP_SERVER_VARS']['HTTP_USER_AGENT'];
+  $__error_title = 'Your browser does not suit the requirements for this application';
+  $__error_text = <<<EOF
+<i>Supported browsers:</i><br />
+&raquo; &nbsp;Netscape 7+<br />
+&raquo; &nbsp;Microsoft Internet Explorer 6+<br />
+&raquo; &nbsp;Mozilla Firefox 1.0+<br />
+&raquo; &nbsp;Opera 8.0+<br />
+&raquo; &nbsp;Safari 1.2+<br />
+<br />
+&raquo; &nbsp;JavaScript enabled<br />
+&raquo; &nbsp;Support for XMLHTTPRequest<br />
+
+<p><i>Your configuration:</i><br />
+$user_agent</p>
+EOF;
+}
+
+// authorization error
+else if ($ERROR_CODE==401) {
+  $__error_title = "AUTHORIZATION FAILED";
+  $__error_text  = "Could not verify that you are authorized to access this service!<br />\n".
+                   "Please contact your server-administrator.";
+}
+
+// failed request (wrong step in URL)
+else if ($ERROR_CODE==404) {
+  $__error_title = "REQUEST FAILED/FILE NOT FOUND";
+  $request_url = htmlentities($_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
+  $__error_text  = <<<EOF
+The requested page was not found!<br />
+Please contact your server-administrator.
+
+<p><i>Failed request:</i><br />
+http://$request_url</p>
+EOF;
+}
+
+// database connection error
+else if ($ERROR_CODE==601)
+{
+  $__error_title = "CONFIGURATION ERROR";
+  $__error_text  =  nl2br($ERROR_MESSAGE) . "<br />Please read the INSTALL instructions!";
+}
+
+// database connection error
+else if ($ERROR_CODE==603) {
+  $__error_title = "DATABASE ERROR: CONNECTION FAILED!";
+  $__error_text  =  "Unable to connect to the database!<br />Please contact your server-administrator.";
+}
+
+// system error
+else {
+  $__error_title = "SERVICE CURRENTLY NOT AVAILABLE!";
+  $__error_text  = "Please contact your server-administrator.";
+
+  if (($CONFIG['debug_level'] & 4) && $ERROR_MESSAGE)
+    $__error_text = $ERROR_MESSAGE;
+  else
+    $__error_text = sprintf('Error No. [%s]', $ERROR_CODE);
+}
+
+
+// Ajax request
+if ($OUTPUT && ($OUTPUT instanceof rcube_json_output)) {
+  header("HTTP/1.0 $ERROR_CODE $__error_title");
+  die;
+}
+
+// compose page content
+$__page_content = <<<EOF
+<div>
+<h3 class="error-title">$__error_title</h3>
+<p class="error-text">$__error_text</p>
+</div>
+EOF;
+
+if ($OUTPUT && $OUTPUT->template_exists('error')) {
+  $OUTPUT->reset();
+  $OUTPUT->send('error');
+}
+
+$__skin = $CONFIG->skin ? $CONFIG->skin : 'default';
+
+// print system error page
+print <<<EOF
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<title>Roundcube|Mail : ERROR $ERROR_CODE</title>
+<link rel="stylesheet" type="text/css" href="skins/$__skin/common.css" />
+</head>
+<body>
+
+<table border="0" cellsapcing="0" cellpadding="0" width="100%" height="80%"><tr><td align="center">
+
+$__page_content
+
+</td></tr></table>
+
+</body>
+</html>
+EOF;
+
+exit;
+
diff --git a/program/steps/utils/html2text.inc b/program/steps/utils/html2text.inc
new file mode 100644 (file)
index 0000000..d61eb7c
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+/*
+
+ +-----------------------------------------------------------------------+
+ | program/steps/utils/html2text.inc                                     |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Convert HTML message to plain text                                  |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: html2text.inc 4309 2010-12-06 11:13:55Z alec $
+
+*/
+
+$html = $HTTP_RAW_POST_DATA;
+
+// Replace emoticon images with its text representation
+$html = rcmail_replace_emoticons($html);
+
+$converter = new html2text($html);
+
+header('Content-Type: text/plain; charset=UTF-8');
+print rtrim($converter->get_text());
+exit;
+
+
diff --git a/program/steps/utils/killcache.inc b/program/steps/utils/killcache.inc
new file mode 100644 (file)
index 0000000..1aa37e8
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/*
+
+ +-----------------------------------------------------------------------+
+ | program/steps/utils/killcache.inc                                     |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Delete rows from cache and messages tables                          |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Dennis P. Nikolaenko <dennis@nikolaenko.ru>                   |
+ +-----------------------------------------------------------------------+
+
+ $Id: killcache.inc 3989 2010-09-25 13:03:53Z alec $
+
+*/
+
+// don't allow public access if not in devel_mode
+if (!$RCMAIL->config->get('devel_mode')) {
+    header("HTTP/1.0 401 Access denied");
+    die("Access denied!");
+}
+
+$options = array(
+    'use_transactions' => false,
+    'log_line_break' => "\n",
+    'idxname_format' => '%s',
+    'debug' => false,
+    'quote_identifier' => true,
+    'force_defaults' => false,
+    'portability' => true
+);
+
+// @TODO: transaction here (if supported by DB) would be a good thing
+$res = $RCMAIL->db->query("DELETE FROM cache");
+if (PEAR::isError($res)) {
+    exit($res->getMessage());
+}
+
+$res = $RCMAIL->db->query("DELETE FROM messages");
+if (PEAR::isError($res)) {
+    exit($res->getMessage());
+}
+
+echo "Cache cleared\n";
+exit;
+
+
diff --git a/program/steps/utils/modcss.inc b/program/steps/utils/modcss.inc
new file mode 100644 (file)
index 0000000..86129d5
--- /dev/null
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/utils/modcss.inc                                        |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2007-2010, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Modify CSS source from a URL                                        |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: modcss.inc 3989 2010-09-25 13:03:53Z alec $
+
+*/
+
+$source = '';
+
+$url = preg_replace('![^a-z0-9:./\-_?$&=%]!i', '', $_GET['u']);
+if ($url === null) {
+    header('HTTP/1.1 403 Forbidden');
+    echo $error;
+    exit;
+}
+
+$a_uri = parse_url($url);
+$port  = $a_uri['port'] ? $a_uri['port'] : 80;
+$host  = $a_uri['host'];
+$path  = $a_uri['path'] . ($a_uri['query'] ? '?'.$a_uri['query'] : '');
+
+// don't allow any other connections than http(s)
+if (strtolower(substr($a_uri['scheme'], 0, 4)) != 'http') {
+    header('HTTP/1.1 403 Forbidden');
+    echo "Invalid URL";
+    exit;
+}
+
+// try to open socket connection
+if (!($fp = fsockopen($host, $port, $errno, $error, 15))) {
+    header('HTTP/1.1 500 Internal Server Error');
+    echo $error;
+    exit;
+}
+
+// set timeout for socket
+stream_set_timeout($fp, 30);
+
+// send request
+$out  = "GET $path HTTP/1.0\r\n";
+$out .= "Host: $host\r\n";
+$out .= "Connection: Close\r\n\r\n";
+fwrite($fp, $out);
+
+// read response
+$header = true;
+$headers = array();
+while (!feof($fp)) {
+    $line = trim(fgets($fp, 4048));
+
+    if ($header) {
+        if (preg_match('/^HTTP\/1\..\s+(\d+)/', $line, $regs)
+            && intval($regs[1]) != 200) {
+            break;
+        }
+        else if (empty($line)) {
+            $header = false;
+        }
+        else {
+            list($key, $value) = explode(': ', $line);
+            $headers[strtolower($key)] = $value;
+        }
+    }
+    else {
+        $source .= "$line\n";
+    }
+}
+fclose($fp);
+
+// check content-type header and mod styles
+$mimetype = strtolower($headers['content-type']);
+if (!empty($source) && in_array($mimetype, array('text/css','text/plain'))) {
+    header('Content-Type: text/css');
+    echo rcmail_mod_css_styles($source, preg_replace('/[^a-z0-9]/i', '', $_GET['c']));
+    exit;
+}
+else
+    $error = "Invalid response returned by server";
+
+header('HTTP/1.0 404 Not Found');
+echo $error;
+exit;
+
+
diff --git a/program/steps/utils/save_pref.inc b/program/steps/utils/save_pref.inc
new file mode 100644 (file)
index 0000000..834f3fc
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/*
+
+ +-----------------------------------------------------------------------+
+ | program/steps/utils/save_pref.inc                                     |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Save preferences setting in database                                |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
+ +-----------------------------------------------------------------------+
+
+ $Id: save_pref.inc 3989 2010-09-25 13:03:53Z alec $
+
+*/
+
+$name = get_input_value('_name', RCUBE_INPUT_POST);
+$value = get_input_value('_value', RCUBE_INPUT_POST);
+
+// save preference value
+$RCMAIL->user->save_prefs(array($name => $value));
+
+// update also session if requested
+if ($sessname = get_input_value('_session', RCUBE_INPUT_POST)) {
+    // Support multidimensional arrays...
+    $vars = explode('/', $sessname);
+
+    // ... up to 3 levels
+    if (count($vars) == 1)
+        $_SESSION[$vars[0]] = $value;
+    else if (count($vars) == 2)
+        $_SESSION[$vars[0]][$vars[1]] = $value;
+    else if (count($vars) == 3)
+        $_SESSION[$vars[0]][$vars[1]][$vars[2]] = $value;
+}
+
+$OUTPUT->reset();
+$OUTPUT->send();
+
+
diff --git a/program/steps/utils/spell.inc b/program/steps/utils/spell.inc
new file mode 100644 (file)
index 0000000..d14b19a
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/utils/spell.inc                                         |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Invoke the configured or default spell checking engine.             |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Kris Steinhoff <steinhof@umich.edu>                           |
+ +-----------------------------------------------------------------------+
+
+ $Id: spell.inc 3989 2010-09-25 13:03:53Z alec $
+
+*/
+
+// max. number of suggestions for one word
+define('MAX_SUGGESTIONS', 10);
+
+$tiny = !empty($_GET['tiny']) ? 'html_' : '';
+
+if ($spell_engine = $RCMAIL->config->get('spellcheck_engine', 'googie')) {
+    include('spell_'.$tiny.$spell_engine.'.inc');
+}
+
+header('HTTP/1.1 404 Not Found');
+exit;
+
diff --git a/program/steps/utils/spell_googie.inc b/program/steps/utils/spell_googie.inc
new file mode 100644 (file)
index 0000000..bfe8f6d
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/utils/spell_googie.inc                                  |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2007, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Submit request to Google's spell checking engine                    |
+ |                                                                       |
+ | CREDITS:                                                              |
+ |   Script from GoogieSpell by amix.dk                                  |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: spell_googie.inc 3989 2010-09-25 13:03:53Z alec $
+
+*/
+
+$REMOTE_REQUEST = TRUE;
+
+// default settings
+$host = "ssl://www.google.com";
+$port = 443;
+$lang = get_input_value('lang', RCUBE_INPUT_GET);
+$path = "/tbproxy/spell?lang=$lang";
+
+// spell check uri is configured
+if (!empty($CONFIG['spellcheck_uri']))
+  {
+  $a_uri = parse_url($CONFIG['spellcheck_uri']);
+  $ssl = ($a_uri['scheme']=='https' || $a_uri['scheme']=='ssl');
+  $port = $a_uri['port'] ? $a_uri['port'] : ($ssl ? 443 : 80);
+  $host = ($ssl ? 'ssl://' : '') . $a_uri['host'];
+  $path = $a_uri['path'] . ($a_uri['query'] ? '?'.$a_uri['query'] : '') . $lang;
+  }
+
+$data = file_get_contents('php://input');
+$store = "";
+
+if ($fp = fsockopen($host, $port, $errno, $errstr, 30))
+  {
+  $out = "POST $path HTTP/1.0\r\n";
+  $out .= "Host: " . str_replace('ssl://', '', $host) . "\r\n";
+  $out .= "Content-Length: " . strlen($data) . "\r\n";
+  $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
+  $out .= "Connection: Close\r\n\r\n";
+  $out .= $data;
+  fwrite($fp, $out);
+
+  while (!feof($fp))
+    $store .= fgets($fp, 128);
+  fclose($fp);
+  }
+
+// remove headers
+$pos = strpos($store, '<?xml');
+$store = substr($store, $pos);
+
+// set response length
+header("Content-Length: " . strlen($store));
+
+// Don't use server's default Content-Type charset (#1486406)
+header("Content-Type: text/xml; charset=".RCMAIL_CHARSET);
+print $store;
+exit;
+
+
diff --git a/program/steps/utils/spell_html_googie.inc b/program/steps/utils/spell_html_googie.inc
new file mode 100644 (file)
index 0000000..1a4fbd4
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/utils/spell_html_googie.inc                             |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Submit request to Google's spell checking engine                    |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
+ +-----------------------------------------------------------------------+
+
+ $Id: spell_googie.inc 3780 2010-06-23 09:55:08Z alec $
+
+*/
+
+function json_error($str)
+{
+    echo '{"error":{"errstr":"' . addslashes($str) . '","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}';
+    exit;
+}
+
+function googie_get($host, $port, $path, $data)
+{
+    $store = '';
+    if ($fp = fsockopen($host, $port, $errno, $errstr, 30)) {
+        $out = "POST $path HTTP/1.0\r\n";
+        $out .= "Host: " . str_replace('ssl://', '', $host) . "\r\n";
+        $out .= "Content-Length: " . strlen($data) . "\r\n";
+        $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
+        $out .= "Connection: Close\r\n\r\n";
+        $out .= $data;
+        fwrite($fp, $out);
+
+        while (!feof($fp))
+            $store .= fgets($fp, 128);
+        fclose($fp);
+    }
+
+    if (!$store) {
+        json_error("Empty result from spelling engine");
+    }
+
+    $matches = array();
+    preg_match_all('/<c o="([^"]*)" l="([^"]*)" s="([^"]*)">([^<]*)<\/c>/', $store, $matches, PREG_SET_ORDER);
+
+    return $matches;
+}
+
+$REMOTE_REQUEST = TRUE;
+
+// read input
+$data = file_get_contents('php://input');
+
+// Decode JSON input
+$request = json_decode($data, true);
+$result = array();
+
+$lang = $request['params'][0];
+$data = $request['params'][1];
+$result['id'] = $request['id'];
+
+// default settings
+$host = "ssl://www.google.com";
+$port = 443;
+$path = "/tbproxy/spell?lang=$lang";
+
+// spell check uri is configured
+if (!empty($CONFIG['spellcheck_uri']))
+  {
+  $a_uri = parse_url($CONFIG['spellcheck_uri']);
+  $ssl = ($a_uri['scheme']=='https' || $a_uri['scheme']=='ssl');
+  $port = $a_uri['port'] ? $a_uri['port'] : ($ssl ? 443 : 80);
+  $host = ($ssl ? 'ssl://' : '') . $a_uri['host'];
+  $path = $a_uri['path'] . ($a_uri['query'] ? '?'.$a_uri['query'] : '') . $lang;
+  }
+
+$wordstr = implode(' ', (array) $data);
+$data = '<?xml version="1.0" encoding="utf-8" ?>'
+    .'<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1">'
+    .'<text>' . $wordstr . '</text>'
+    .'</spellrequest>';
+$matches = googie_get($host, $port, $path, $data);
+
+if ($request['method'] == 'checkWords') {
+    $result['result'] = array();
+    for ($i=0, $len=count($matches); $i<$len; $i++)
+        $result['result'][] = mb_substr($wordstr, $matches[$i][1], $matches[$i][2], RCMAIL_CHARSET);
+}
+else if ($request['method'] == 'getSuggestions') {
+    if ($matches[0][4]) {
+        $suggestions = explode("\t", $matches[0][4]);
+        if (sizeof($suggestions)>MAX_SUGGESTIONS)
+            $suggestions = array_slice($suggestions, 0, MAX_SUGGESTIONS);
+        $result['result'] = $suggestions;
+    }
+    else
+        $result['result'] = array();
+}
+
+// send output
+header("Content-Type: text/xml; charset=".RCMAIL_CHARSET);
+echo json_encode($result);
+exit;
+
diff --git a/program/steps/utils/spell_html_pspell.inc b/program/steps/utils/spell_html_pspell.inc
new file mode 100644 (file)
index 0000000..b38324c
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/utils/spell_pspell_tiny.inc                             |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2005-2010, Roundcube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Use the Pspell extension to check spelling in TinyMCE               |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aleksander Machniak <alec@alec.pl>                            |
+ +-----------------------------------------------------------------------+
+
+ $Id: spell_pspell.inc 3780 2010-06-23 09:55:08Z alec $
+
+*/
+
+function json_error($str)
+{
+    echo '{"error":{"errstr":"' . addslashes($str) . '","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}';
+    exit;
+}
+
+if (!extension_loaded('pspell')) {
+    raise_error(array(
+      'code' => 500,
+      'type' => 'php',
+      'file' => __FILE__, 'line' => __LINE__,
+      'message' => "Pspell extension not available"), true, false);
+
+    json_error("Pspell extension not available");
+}
+
+// read input
+$data = file_get_contents('php://input');
+
+// Decode JSON input
+$request = json_decode($data, true);
+$result = array();
+
+$lang = $request['params'][0];
+$data = $request['params'][1];
+$result['id'] = $request['id'];
+
+// init spellchecker
+$plink = pspell_new($lang, null, null, RCMAIL_CHARSET, PSPELL_FAST);
+
+if (!$plink) {
+    json_error("Unable to load Pspell engine for selected language");
+}
+
+if ($request['method'] == 'checkWords') {
+    $result['result'] = array();
+    foreach ((array)$data as $word) {
+        if ($word && preg_match('/[^0-9\.]/', $word)
+               && !pspell_check($plink, $word)) {
+            $result['result'][] = $word;
+        }
+    }
+}
+else if ($request['method'] == 'getSuggestions') {
+    $suggestions = pspell_suggest($plink, $data);
+    if (sizeof($suggestions)>MAX_SUGGESTIONS)
+        $suggestions = array_slice($suggestions, 0, MAX_SUGGESTIONS);
+    $result['result'] = $suggestions;
+}
+
+// send output
+header("Content-Type: text/xml; charset=".RCMAIL_CHARSET);
+echo json_encode($result);
+exit;
+
diff --git a/program/steps/utils/spell_pspell.inc b/program/steps/utils/spell_pspell.inc
new file mode 100644 (file)
index 0000000..f3178ec
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/utils/spell_pspell.inc                                  |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Use the Pspell extension to check spelling, returns results         |
+ |   compatible with spell_googie.inc.                                   |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Kris Steinhoff <steinhof@umich.edu>                           |
+ +-----------------------------------------------------------------------+
+
+ $Id: spell_pspell.inc 3989 2010-09-25 13:03:53Z alec $
+
+*/
+
+if (!extension_loaded('pspell')) {
+    raise_error(array(
+      'code' => 500,
+      'type' => 'php',
+      'file' => __FILE__, 'line' => __LINE__,
+      'message' => "Pspell extension not available"), true, false);
+
+    header('HTTP/1.1 404 Not Found');
+    exit;
+}
+
+// read input
+$data = file_get_contents('php://input');
+
+// parse data (simplexml_load_string breaks CRLFs)
+$left = strpos($data, '<text>');
+$right = strrpos($data, '</text>');
+$text = substr($data, $left+6, $right-($left+6));
+$text = html_entity_decode($text, ENT_QUOTES, RCMAIL_CHARSET);
+
+// tokenize
+$words = preg_split('/[ !"#$%&()*+\\,\/\n:;<=>?@\[\]^_{|}-]+|\.[^\w]/', $text, NULL,  PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE );
+
+// init spellchecker
+$plink = pspell_new(get_input_value('lang', RCUBE_INPUT_GET), null, null, RCMAIL_CHARSET, PSPELL_FAST);
+
+// send output
+$out = '<?xml version="1.0" encoding="'.RCMAIL_CHARSET.'"?><spellresult charschecked="'.mb_strlen($text).'">';
+
+$diff = 0;
+foreach ($words as $w) {
+    $word = trim($w[0]);
+    $pos  = $w[1] - $diff;
+    $len  = mb_strlen($word);
+    if ($word && $plink && preg_match('/[^0-9\.]/', $word)
+       && !pspell_check($plink, $word)) {
+        $suggestions = pspell_suggest($plink, $word);
+       if (sizeof($suggestions)>MAX_SUGGESTIONS)
+         $suggestions = array_slice($suggestions, 0, MAX_SUGGESTIONS);
+
+        $out .= '<c o="'.$pos.'" l="'.$len.'">';
+        $out .= implode("\t", $suggestions);
+        $out .= '</c>';
+    }
+    $diff += (strlen($word) - $len);
+}
+
+$out .= '</spellresult>';
+
+header("Content-Type: text/xml; charset=".RCMAIL_CHARSET);
+echo $out;
+exit;
+
+
diff --git a/skins/default/README b/skins/default/README
new file mode 100644 (file)
index 0000000..ba690d7
--- /dev/null
@@ -0,0 +1,23 @@
+ROUNDCUBE WEBMAIL DEFAULT SKIN
+==============================
+
+This skin package contains the current development theme of the Roundcube
+Webmail software. It can be used, modified and redistributed according to
+the terms described in the LICENSE section.
+
+For information about building or modifiying Roundcube skins please visit
+http://trac.roundcube.net/wiki/Doc_Skins
+
+The theme uses icons originally designed by Stephen Horlander and Kevin Gerich
+for Mozilla.org. In case of redistribution giving credit to these artwork
+creators is mandatory.
+
+
+LICENSE
+-------
+The contents of this folder are subject to the Creative Commons
+Attribution-ShareAlike License. It is allowed to copy, distribute,
+transmit and to adapt the work by keeping credits to the original
+autors in the README file.
+See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+
diff --git a/skins/default/addressbook.css b/skins/default/addressbook.css
new file mode 100644 (file)
index 0000000..a90dcf1
--- /dev/null
@@ -0,0 +1,216 @@
+/***** Roundcube|Mail address book task styles *****/
+
+#abooktoolbar
+{
+  position: absolute;
+  top: 45px;
+  left: 225px;
+  height: 35px;
+}
+
+#abooktoolbar a
+{
+  padding-right: 10px;
+}
+
+#abooktoolbar a.button,
+#abooktoolbar a.buttonPas,
+#abooktoolbar span.separator {
+  display: block;
+  float: left;
+  width: 32px;
+  height: 32px;
+  padding: 0;
+  margin-right: 10px;
+  overflow: hidden;
+  background: url(images/abook_toolbar.png) 0 0 no-repeat transparent;
+  opacity: 0.99; /* this is needed to make buttons appear correctly in Chrome */
+}
+
+#abooktoolbar a.buttonPas {
+  opacity: 0.35;
+}
+
+#abooktoolbar a.addcontactSel {
+  background-position: 0 -32px;
+}
+
+#abooktoolbar a.compose {
+  background-position: -32px 0;
+}
+
+#abooktoolbar a.composeSel {
+  background-position: -32px -32px;
+}
+
+#abooktoolbar a.delete {
+  background-position: -64px 0;
+}
+
+#abooktoolbar a.deleteSel {
+  background-position: -64px -32px;
+}
+
+#abooktoolbar a.import {
+  background-position: -96px 0;
+}
+
+#abooktoolbar a.importSel {
+  background-position: -96px -32px;
+}
+
+#abooktoolbar a.export {
+  background-position: -128px 0;
+}
+
+#abooktoolbar a.exportSel {
+  background-position: -128px -32px;
+}
+
+#abooktoolbar span.separator {
+  width: 5px;
+  background-position: -162px 0;
+}
+
+#abookcountbar
+{
+  margin-top: 4px;
+  margin-left: 4px;
+}
+
+#addressscreen
+{
+  position: absolute;
+  top: 85px;
+  right: 20px;
+  bottom: 20px;
+  left: 225px;
+}
+
+#directorylistbox
+{
+  position: absolute;
+  top: 85px;
+  bottom: 20px;
+  left: 20px;
+  width: 195px;
+  border: 1px solid #999999;
+  background-color: #F9F9F9;
+  overflow: hidden;
+}
+
+#directorylistbox input
+{
+  margin: 2px;
+  width: 90%;
+}
+
+#addresslist
+{
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  border: 1px solid #999999;
+  background-color: #F9F9F9;
+  overflow: hidden;
+}
+
+#contactgroupslist
+{
+  border-top: 1px solid #999;
+}
+
+#addresslist
+{
+  left: 0px;
+  width: 280px;
+}
+
+#directorylist
+{
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  background-color: #FFFFFF;
+}
+
+#directorylist li
+{
+  display: block;
+  font-size: 11px;
+  background: url(images/icons/folders.png) 5px -108px no-repeat;
+  border-bottom: 1px solid #EBEBEB;
+  white-space: nowrap;
+}
+
+#directorylist li a
+{
+  cursor: default;
+  display: block;
+  padding-left: 25px;
+  padding-top: 2px;
+  padding-bottom: 2px;
+  text-decoration: none;
+  white-space: nowrap;
+}
+
+#directorylist li.contactgroup
+{
+  padding-left: 15px;
+  background-position: 20px -144px;
+}
+
+#directorylist li.selected
+{
+  background-color: #929292;
+  border-bottom: 1px solid #898989;
+}
+
+#directorylist li.selected a
+{
+  color: #FFF;
+  font-weight: bold;
+}
+
+#directorylist li.droptarget
+{
+  background-color: #FFFFA6;
+}
+
+#contacts-table
+{
+  width: 100%;
+  table-layout: fixed;
+}
+
+#contacts-table tbody td
+{
+  cursor: default;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+}
+
+#contacts-box
+{
+  position: absolute;
+  top: 0px;
+  left: 290px;
+  right: 0px;
+  bottom: 0px;
+  border: 1px solid #999999;
+  overflow: hidden;
+}
+
+body.iframe,
+#contact-frame
+{
+  background-color: #F2F2F2;
+  border: none;
+}
+
+#contact-details table td.title
+{
+  font-weight: bold;
+  text-align: right;
+}
+
diff --git a/skins/default/addresses.css b/skins/default/addresses.css
deleted file mode 100644 (file)
index 4d831f8..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-/***** RoundCube|Mail address book task styles *****/
-
-#abooktoolbar
-{
-  position: absolute;
-  top: 45px;
-  left: 205px;
-  height: 35px;
-}
-
-#abooktoolbar a
-{
-  padding-right: 10px;
-}
-
-#abooktoolbar a.button,
-#abooktoolbar a.buttonPas,
-#abooktoolbar span.separator {
-  display: block;
-  float: left;
-  width: 32px;
-  height: 32px;
-  padding: 0;
-  margin-right: 10px;
-  overflow: hidden;
-  background: url('images/abook_toolbar.png') 0 0 no-repeat transparent;
-  opacity: 0.99; /* this is needed to make buttons appear correctly in Chrome */
-}
-
-#abooktoolbar a.buttonPas {
-  opacity: 0.35;
-}
-
-#abooktoolbar a.addcontactSel {
-  background-position: 0 -32px;
-}
-
-#abooktoolbar a.compose {
-  background-position: -32px 0;
-}
-
-#abooktoolbar a.composeSel {
-  background-position: -32px -32px;
-}
-
-#abooktoolbar a.delete {
-  background-position: -64px 0;
-}
-
-#abooktoolbar a.deleteSel {
-  background-position: -64px -32px;
-}
-
-#abooktoolbar a.import {
-  background-position: -96px 0;
-}
-
-#abooktoolbar a.importSel {
-  background-position: -96px -32px;
-}
-
-#abooktoolbar a.export {
-  background-position: -128px 0;
-}
-
-#abooktoolbar a.exportSel {
-  background-position: -128px -32px;
-}
-
-#abooktoolbar span.separator {
-  width: 5px;
-  background-image: url('images/abook_toolbar.png');
-  background-position: -162px 0;
-}
-
-#abookcountbar
-{
-  position: absolute;
-  bottom: 16px;
-  left: 200px;
-  width: 240px;
-  height: 20px;
-  text-align: left;
-}
-
-#abookcountbar span
-{
-  font-size: 11px;
-  color: #333333;
-}
-
-#addressscreen
-{
-  position: absolute;
-  top: 85px;
-  right: 20px;
-  bottom: 40px;
-  left: 205px;
-}
-
-#directorylist
-{
-  position: absolute;
-  top: 85px;
-  bottom: 40px;
-  left: 20px;
-  width: 175px;
-  border: 1px solid #999999;
-  background-color: #F9F9F9;
-  overflow: hidden;
-}
-
-#addresslist
-{
-  position: absolute;
-  top: 0px;
-  bottom: 0px;
-  border: 1px solid #999999;
-  background-color: #F9F9F9;
-  overflow: auto;
-}
-
-#importbox
-{
-  position: absolute;
-  top: 85px;
-  bottom: 40px;
-  left: 20px;
-  right: 20px;
-  border: 1px solid #999999;
-  background-color: #F9F9F9;
-  padding-bottom: 4ex;
-  overflow: auto;
-}
-
-#addresslist
-{
-  left: 0px;
-  width: 340px;
-}
-
-#importbox a
-{
-  color: blue;
-}
-
-#directorylist ul
-{
-  list-style: none;
-  margin: 0;
-  padding: 0;
-}
-
-#directorylist ul li
-{
-  font-size: 11px;
-  border-bottom: 1px solid #EBEBEB;
-  white-space: nowrap;
-}
-
-#directorylist ul li a
-{
-  display: block;
-  padding-left: 6px;
-  padding-top: 2px;
-  padding-bottom: 2px;
-  text-decoration: none;
-  white-space: nowrap;
-}
-
-#directorylist li.selected
-{
-  background-color: #929292;
-  border-bottom: 1px solid #898989;
-}
-
-#directorylist li.selected a
-{
-  color: #FFF;
-  font-weight: bold;
-}
-
-#directorylist li.droptarget
-{
-  background-color: #FFFFA6;
-}
-
-#contacts-table
-{
-  width: 100%;
-  table-layout: fixed;
-}
-
-#contacts-table tbody td
-{
-  cursor: default;
-}
-
-#contacts-box
-{
-  position: absolute;
-  top: 0px;
-  left: 555px;
-  right: 0px;
-  bottom: 0px;
-  border: 1px solid #999999;
-  overflow: hidden;
-}
-
-body.iframe,
-#contact-frame
-{
-  background-color: #F9F9F9;
-}
-
-#contact-frame
-{
-  border: none;
-}
-
-#contact-details table td.title
-{
-  font-weight: bold;
-  text-align: right;
-}
diff --git a/skins/default/colorpicker.css b/skins/default/colorpicker.css
deleted file mode 100644 (file)
index 4b0360b..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Colorpicker dialog specific CSS */\r
-\r
-#preview {\r
-       float: right;\r
-       width: 50px;\r
-       height: 14px;\r
-       line-height: 1px;\r
-       border: 1px solid black;\r
-       margin-left: 5px;\r
-}\r
-\r
-#colorpicker {\r
-       float: left;\r
-       cursor: crosshair;\r
-}\r
-\r
-#light {\r
-       border: 1px solid gray;\r
-       margin-left: 5px;\r
-       float: left;\r
-       width: 15px;\r
-       cursor: crosshair;\r
-}\r
-\r
-#light div {\r
-       overflow: hidden;\r
-}\r
-\r
-#previewblock {\r
-       float: right;\r
-       padding-left: 10px;\r
-       height: 20px;\r
-}\r
-\r
-.panel_wrapper div.current {\r
-       height: 175px;\r
-}\r
-\r
-#namedcolors {\r
-       width: 150px;\r
-}\r
-\r
-#namedcolors a {\r
-       display: block;\r
-       float: left;\r
-       width: 10px; height: 10px;\r
-       margin: 1px 1px 0 0;\r
-       overflow: hidden;\r
-}\r
-\r
-#colornamecontainer {\r
-       margin-top: 5px;\r
-}
\ No newline at end of file
index eeb316211ab6e47bbee15f2e1f541311d07891ba..e052552d01bab09f902edf6411e5851b8afa22dc 100644 (file)
@@ -1,9 +1,9 @@
-/***** RoundCube|Mail basic styles *****/
+/***** Roundcube|Mail basic styles *****/
 
 body
 {
   margin: 8px;
-  background-color: #F6F6F6; /* #EBEBEB; */
+  background-color: #F6F6F6;
   color: #000000;
 }
 
@@ -18,11 +18,10 @@ body.extwin
   margin: 10px;
 }
 
-body, td, th, div, p, h3
+body, td, th, div, p, h3, select, input, textarea
 {
   font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
   font-size: 12px;
-  color: #000000;
 }
 
 th
@@ -32,9 +31,7 @@ th
 
 h3
 {
-  font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
   font-size: 18px;
-  color: #000000;
 }
 
 a, a:active, a:visited
@@ -68,11 +65,6 @@ input[type="button"],
 input[type="password"],
 textarea
 {
-  font-size: 9pt;
-  font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
-  padding: 1px;
-  padding-left: 3px;
-  padding-right: 3px;
   border: 1px solid #666666;
   color: #333333;
   background-color: #ffffff;
@@ -80,11 +72,8 @@ textarea
 
 input, textarea
 {
-  font-size: 9pt;
-  font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
   color: black;
-  padding-left: 3px;
-  padding-right: 3px;
+  padding: 1px 3px;
 }
 
 input.button
@@ -127,6 +116,15 @@ img
 
 /** common user interface objects */
 
+#mainscreen
+{
+  position: absolute;
+  top: 85px;
+  right: 20px;
+  bottom: 20px;
+  left: 20px;
+}
+
 #header
 {
   position: absolute;
@@ -142,10 +140,10 @@ img
   position: absolute;
   top: 0px;
   right: 0px;
-  width: 600px;
-  height: 37px;
-  background: url(images/taskbar.gif) top right no-repeat;
-  padding: 10px 4px 10px 0px;
+  height: 24px;
+  width: 100%;
+  background: url(images/taskbar.png) top right no-repeat;
+  padding: 10px 4px 5px 0px;
   text-align: right;
   white-space: nowrap;
   z-index: 2;
@@ -156,8 +154,8 @@ img
   font-size: 11px;
   color: #666666;
   text-decoration: none;
-  padding: 6px 14px 6px 27px;
-  background: url('images/taskicons.gif') no-repeat;
+  padding: 6px 12px 6px 26px;
+  background: url(images/taskicons.gif) no-repeat;
 }
 
 #taskbar a:hover
@@ -190,8 +188,8 @@ img
   position: absolute;
   display: none;
   top: -1px;
-  left: 200px;
-  right: 200px;
+  margin-left: -225px;
+  left: 50%;
   z-index: 5000;
   opacity: 0.85;
 }
@@ -199,7 +197,7 @@ img
 #message div
 {
   width: 400px;
-  margin: 0px auto;
+  margin: 0px;
   min-height: 22px;
   padding: 8px 10px 8px 46px;
 }
@@ -207,7 +205,7 @@ img
 #message div.notice,
 #remote-objects-message
 {
-  background: url('images/display/icons.png') 6px 3px no-repeat;
+  background: url(images/display/icons.png) 6px 3px no-repeat;
   background-color: #F7FDCB;
   border: 1px solid #C2D071;
 }
@@ -215,30 +213,130 @@ img
 #message div.error,
 #message div.warning
 {
-  background: url('images/display/icons.png') 6px -97px no-repeat;
+  background: url(images/display/icons.png) 6px -97px no-repeat;
   background-color: #EF9398;
   border: 1px solid #DC5757;
 }
 
 #message div.confirmation
 {
-  background: url('images/display/icons.png') 6px -47px no-repeat;
+  background: url(images/display/icons.png) 6px -47px no-repeat;
   background-color: #A6EF7B;
   border: 1px solid #76C83F;
 }
 
 #message div.loading
 {
-  background: url('images/display/loading.gif') 6px 3px no-repeat;
+  background: url(images/display/loading.gif) 6px 3px no-repeat;
   background-color: #EBEBEB;
   border: 1px solid #CCCCCC;
 }
 
-#pagecontent
+.box
+{
+  border: 1px solid #999;
+}
+
+.boxtitle
+{
+  height: 12px !important;
+  padding: 2px 10px 5px 5px;
+  border-bottom: 1px solid #999;
+  color: #333;
+  font-size: 11px;
+  font-weight: bold;
+  overflow: hidden;
+  background: url(images/listheader.gif) top left repeat-x #CCC;
+}
+
+.boxtitle .rightalign
+{
+  float: right;
+}
+
+.boxcontent
+{
+  padding: 15px 10px 10px 10px;
+  background-color: #F2F2F2;
+}
+
+.boxcontent table td.title
+{
+  color: #666;
+  padding-right: 10px;
+}
+
+.boxlistcontent
 {
   position: absolute;
-  top: 95px;
-  left: 20px;
+  top: 20px;
+  bottom: 22px;
+  left: 0;
+  right: 0;
+  width: 100%;
+  overflow-y: auto;
+  overflow-x: hidden;
+}
+
+.boxsubject
+{
+  position: absolute;
+  top: 0px;
+  left: 0px;
+  right: 0px;
+  overflow: hidden;
+  height: 22px;
+  border-bottom: 1px solid #999;
+  background: url(images/listheader.gif) top left repeat-x #CCC;
+}
+
+.boxfooter
+{
+  position: absolute;
+  bottom: 0px;
+  left: 0px;
+  right: 0px;
+  overflow: hidden;
+  height: 22px;
+  border-top: 1px solid #999;
+  background: url(images/listheader.gif) top left repeat-x #CCC;
+}
+
+.boxfooter a.button,
+.boxfooter a.buttonPas
+{
+  display: block;
+  float: left;
+  width: 34px;
+  height: 22px;
+  padding: 0px;
+  margin: 0;
+  overflow: hidden;
+  background: url(images/icons/groupactions.png) 0 0 no-repeat transparent;
+  opacity: 0.99; /* this is needed to make buttons appear correctly in Chrome */
+}
+
+.boxfooter a.groupactions
+{
+  background-position: 0 -26px;
+}
+
+.boxfooter a.buttonPas
+{
+  opacity: 0.35;
+}
+
+.pagenav
+{
+  min-width: 250px;
+}
+
+.pagenav span
+{
+  color: #444;
+  font-size: 11px;
+  text-shadow: white 1px 1px;
+  white-space: nowrap;
 }
 
 .pagenav a.button,
@@ -251,7 +349,7 @@ img
   padding: 0;
   margin: 1px;
   overflow: hidden;
-  background: url('images/pagenav.gif') 0 0 no-repeat transparent;
+  background: url(images/pagenav.gif) 0 0 no-repeat transparent;
   opacity: 0.99; /* this is needed to make buttons appear correctly in Chrome */
 }
 
@@ -298,36 +396,99 @@ img
 
 .splitter-h
 {
-  cursor: n-resize;
+  cursor: n-resize; cursor: row-resize;
   background-position: center 2px;
 }
 
 .splitter-v
 {
-  cursor: e-resize;
+  cursor: e-resize; cursor: col-resize;
   background-position: 2px center;
 }
 
-.boxtitle
+.popupmenu
+{
+  position: absolute;
+  top: 32px;
+  left: 90px;
+  width: auto;
+  display: none;
+  background-color: #fff;
+  background-color: rgba(255, 255, 255, 0.95);
+  border: 1px solid #999;
+  padding: 4px;
+  z-index: 240;
+  border-radius: 3px;
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  -moz-box-shadow: 1px 1px 12px #999;
+  -webkit-box-shadow: #999 1px 1px 12px;
+}
+
+.popupmenu ul
+{
+  margin: -4px 0;
+  padding: 0;
+  list-style: none;
+}
+
+.popupmenu ul li
 {
-  height: 12px !important;
-  padding: 2px 10px 5px 5px;
-  border-bottom: 1px solid #999;
-  color: #333;
   font-size: 11px;
-  font-weight: bold;
-  background: url('images/listheader.gif') top left repeat-x #CCC;
+  white-space: nowrap;
+  min-width: 100px;
+  margin: 3px -4px;
 }
 
-.boxcontent
+.popupmenu li a
 {
-  padding: 15px 10px 10px 10px;
+  display: block;
+  color: #a0a0a0;
+  padding: 2px 10px;
+  text-decoration: none;
+  min-height: 14px;
 }
 
-.boxcontent table td.title
+.popupmenu li a.active,
+.popupmenu li a.active:active,
+.popupmenu li a.active:visited
 {
-  color: #666;
-  padding-right: 10px;
+  color: #333;
+}
+
+.popupmenu li a.active:hover
+{
+  color: #fff;
+  background-color: #c00;
+}
+
+.darkbg
+{
+  background-color: #F2F2F2 !important;
+}
+
+.dropbutton,
+.dropbutton span
+{
+  float: left;
+  height: 32px;
+}
+
+.dropbutton:hover
+{
+/*  background: url(images/dbutton.png) 0 0 no-repeat transparent; */
+}
+
+.dropbutton span
+{
+  width: 9px;
+  background: url(images/dbutton.png) -53px 0 no-repeat transparent;
+}
+
+.dropbutton span:hover
+{
+  cursor: pointer;
+  background-position: -74px 0;
 }
 
 
@@ -340,7 +501,7 @@ table.records-table thead tr td
   vertical-align: middle;
   border-bottom: 1px solid #999999;
   color: #333333;
-  background: url('images/listheader.gif') top left repeat-x #CCC;
+  background: url(images/listheader.gif) top left repeat-x #CCC;
   font-size: 11px;
   font-weight: bold;
 }
@@ -388,7 +549,7 @@ table.records-table tr.unfocused td
   width: 182px;
   height: 20px;
   text-align: right;
-  background: url('images/searchfield.gif') top left no-repeat;
+  background: url(images/searchfield.gif) top left no-repeat;
 }
 
 #searchreset
@@ -399,7 +560,7 @@ table.records-table tr.unfocused td
   text-decoration: none;
 }
 
-#searchmod
+#searchmenulink
 {
  position: absolute;
  top: 3px;
@@ -426,21 +587,15 @@ table.records-table tr.unfocused td
 
 /***** roundcube webmail pre-defined classes *****/
 
-#rcversion
+#rcmversion
 {
   position: absolute;
-  top: 67px;
-  left: 20px;
-  width: 160px;
-  text-align: center;
-
-  font-weight: normal;
-  font-size: x-small;
-  font-variant: small-caps;
-  
-  color: #999999;
-  /*border: 1px solid #308014;
-  background-color: #b4eeb4;*/
+  bottom: 10px;
+  right: 20px;
+  text-align: right;
+  white-space: nowrap;
+  font-size: 8pt;
+  color: #999;
 }
 
 #rcmdraglayer
@@ -449,14 +604,30 @@ table.records-table tr.unfocused td
   width: auto !important;
   width: 300px;
   border: 1px solid #999999;
-  background-color: #F9F9F9;
+  background-color: #fff;
   padding-left: 8px;
   padding-right: 8px;
   padding-top: 3px;
   padding-bottom: 3px;
   font-size: 11px;
   white-space: nowrap;
-  opacity: 0.7;
+  opacity: 0.82;
+  border-radius: 3px;
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  -moz-box-shadow: 1px 1px 12px #999;
+  -webkit-box-shadow: #999 1px 1px 12px;
+}
+
+.draglayercopy:before
+{
+  position: absolute;
+  bottom: -5px;
+  left: -6px;
+  content: " ";
+  width: 14px;
+  height: 14px;
+  background: url(images/messageactions.png) -2px -128px no-repeat;
 }
 
 a.rcmContactAddress
@@ -532,12 +703,22 @@ a.rcmContactAddress:hover
   opacity: 0.8;
 }
 
+.disabled
+{
+  color: #999;
+}
+
+font.bold
+{
+  font-weight: bold;
+}
+
 
 /***** onclick menu list *****/
 
 ul.toolbarmenu
 {
-  margin: 0;
+  margin: -4px 0 -4px 0;
   padding: 0;
   list-style: none;
 }
@@ -547,13 +728,14 @@ ul.toolbarmenu li
   font-size: 11px;
   white-space: nowrap;
   min-width: 130px;
+  margin: 2px -4px;
 }
 
 ul.toolbarmenu li a
 {
   display: block;
   color: #a0a0a0;
-  padding: 2px 8px 3px 22px;
+  padding: 1px 12px 3px 28px;
   text-decoration: none;
   min-height: 14px;
 }
@@ -584,6 +766,7 @@ ul.toolbarmenu li img
   margin: 0 2px;
 }
 
+div.popupmenu ul li.separator_below,
 ul.toolbarmenu li.separator_below
 {
   border-bottom: 1px solid #ccc;
@@ -591,9 +774,109 @@ ul.toolbarmenu li.separator_below
   padding-bottom: 2px;
 }
 
+div.popupmenu ul li.separator_above,
 ul.toolbarmenu li.separator_above
 {
   border-top: 1px solid #ccc;
   margin-top: 2px;
   padding-top: 2px;
 }
+
+
+/***** tabbed interface elements *****/
+
+div.tabsbar,
+#tabsbar
+{
+  position: absolute;
+  top: 50px;
+  left: 220px;
+  right: 20px;
+  height: 22px;
+  border-bottom: 1px solid #999999;
+  white-space: nowrap;
+}
+
+div.tabsbar
+{
+  top: 35px;
+  left: 12px;
+  right: 12px;
+}
+
+span.tablink,
+span.tablink-selected
+{
+  float: left;
+  height: 23px !important;
+  height: 22px;
+  overflow: hidden;
+  background: url(images/tabs-left.gif) top left no-repeat;
+}
+
+span.tablink
+{
+  cursor: pointer;
+}
+
+span.tablink-selected
+{
+  cursor: default;
+  background-position: 0px -23px;
+}
+
+span.tablink a,
+span.tablink-selected a
+{
+  display: block;
+  padding: 5px 10px 0 5px;
+  margin-left: 5px;
+  height: 23px;
+  color: #555555;
+  max-width: 185px;
+  text-decoration: none;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  background: url(images/tabs-right.gif) top right no-repeat;
+}
+
+span.tablink-selected a
+{
+  cursor: inherit;
+  color: #000000;
+  background-position: right -23px;
+}
+
+fieldset
+{
+  margin-bottom: 1em;
+  border: 1px solid #999999;
+  padding: 4px 8px 9px 8px; 
+}
+
+legend
+{
+  color: #999999;
+}
+
+fieldset.tabbed
+{
+  margin-top: 22px;
+  padding-top: 12px;
+}
+
+.quota_text {
+  text-align: center;
+  font-size: 10px;
+  color: #666;
+  border: 1px solid #999;
+  cursor: default;
+}
+.quota_bg { background-color: white; }
+.quota_high { background-color: #F33131; }
+.quota_mid { background-color: #F5AD3C; }
+.quota_low { background-color: #91E164; }
+.quota_text_high { color: white; }
+.quota_text_mid { color: #666; }
+.quota_text_low { color: #666; }
index cb3717ced1f546815805b440e8efc30ecc0952be..2ddc87fe97352f968db7ca0dce3722fd4b5b12a7 100644 (file)
@@ -2,10 +2,10 @@
 /* You can extend this CSS by adding your own CSS file with the the content_css option */
 
 body, td, pre {
-       font-family: Verdana, Arial, Helvetica, sans-serif;
+       font-family: "Lucida Grande", Verdana,  Arial, Helvetica, sans-serif;
        font-size: 12px;
 }
-  
+
 body {
        background-color: #FFFFFF;
        margin-left: 4px;
@@ -22,3 +22,11 @@ pre
        white-space: pre;
        word-wrap: break-word; /* IE (and Safari) */
 }
+
+blockquote
+{
+       padding-left:5px;
+       border-left:#1010ff 2px solid;
+       margin-left:5px;
+       width:100%;
+}
index 28af2e7e7bb3b5b2177a4332de6d0a9cf21cad8d..00e97fd1ac64d13d5befeab77934accce322ad3e 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * RoundCube functions for default skin interface
+ * Roundcube functions for default skin interface
  */
 
 /**
@@ -13,7 +13,7 @@ function rcube_init_settings_tabs()
     tab = '#settingstab' + (rcmail.env.action=='preferences' ? 'default' : (rcmail.env.action.indexOf('identity')>0 ? 'identities' : rcmail.env.action.replace(/\./g, '')));
 
   $(tab).addClass('tablink-selected');
-  $(tab + '> a').removeAttr('onclick').unbind('click').bind('click', function(){return false});
+  $(tab + '> a').removeAttr('onclick').unbind('click').bind('click', function(){return false;});
 }
 
 function rcube_show_advanced(visible)
@@ -21,205 +21,492 @@ function rcube_show_advanced(visible)
   $('tr.advanced').css('display', (visible ? (bw.ie ? 'block' : 'table-row') : 'none'));
 }
 
-/**
- * Mail Composing
- */
-
-function rcmail_show_header_form(id)
+// Fieldsets-to-tabs converter
+// Warning: don't place "caller" <script> inside page element (id)
+function rcube_init_tabs(id, current)
 {
-  var link, row, parent, ns, ps;
-  
-  link = document.getElementById(id + '-link');
-  parent = link.parentNode;
-
-  if ((ns = rcmail_next_sibling(link)))
-    ns.style.display = 'none';
-  else if ((ps = rcmail_prev_sibling(link)))
-    ps.style.display = 'none';
-    
-  link.style.display = 'none';
-
-  if (row = document.getElementById('compose-' + id))
-    {
-    var div = document.getElementById('compose-div');
-    var headers_div = document.getElementById('compose-headers-div');
-    row.style.display = (document.all && !window.opera) ? 'block' : 'table-row';
-    div.style.top = (parseInt(headers_div.offsetHeight)) + 'px';
-    }
-
-  return false;
+  var content = document.getElementById(id),
+    // get fieldsets of the higher-level (skip nested fieldsets)
+    fs = $('fieldset', content).not('fieldset > fieldset');
+
+  if (!fs.length)
+    return;
+
+  current = current ? current : 0;
+
+  // first hide not selected tabs
+  fs.each(function(idx) { if (idx != current) $(this).hide(); });
+
+  // create tabs container
+  var tabs = $('<div>').addClass('tabsbar').appendTo($(content));
+
+  // convert fildsets into tabs
+  fs.each(function(idx) {
+    var tab, a, elm = $(this),
+      // get first legend element
+      legend = $(elm).children('legend');
+
+    // create a tab
+    a   = $('<a>').text(legend.text()).attr('href', '#');
+    tab = $('<span>').attr({'id': 'tab'+idx, 'class': 'tablink'})
+        .click(function() { return rcube_show_tab(id, idx); })
+
+    // remove legend
+    legend.remove();
+    // style fieldset
+    elm.addClass('tabbed');
+    // style selected tab
+    if (idx == current)
+      tab.addClass('tablink-selected');
+
+    // add the tab to container
+    tab.append(a).appendTo(tabs);
+  });
 }
 
-function rcmail_hide_header_form(id)
+function rcube_show_tab(id, index)
 {
-  var row, parent, ns, ps, link, links;
-
-  link = document.getElementById(id + '-link');
-  link.style.display = '';
-  
-  parent = link.parentNode;
-  links = parent.getElementsByTagName('a');
-
-  for (var i=0; i<links.length; i++)
-    if (links[i].style.display != 'none')
-      for (var j=i+1; j<links.length; j++)
-       if (links[j].style.display != 'none')
-          if ((ns = rcmail_next_sibling(links[i]))) {
-           ns.style.display = '';
-           break;
-         }
+  var content = document.getElementById(id),
+    fs = $('fieldset', content).not('fieldset > fieldset');
+
+  fs.each(function(idx) {
+    // Show/hide fieldset (tab content)
+    $(this)[index==idx ? 'show' : 'hide']();
+    // Select/unselect tab
+    $('#tab'+idx).toggleClass('tablink-selected', idx==index);
+  });
+}
 
-  document.getElementById('_' + id).value = '';
+/**
+ * Mail UI
+ */
 
-  if (row = document.getElementById('compose-' + id))
-    {
-    var div = document.getElementById('compose-div');
-    var headers_div = document.getElementById('compose-headers-div');
-    row.style.display = 'none';
-    div.style.top = (parseInt(headers_div.offsetHeight)) + 'px';
+function rcube_mail_ui()
+{
+  this.popups = {
+    markmenu:       {id:'markmessagemenu'},
+    replyallmenu:   {id:'replyallmenu'},
+    searchmenu:     {id:'searchmenu', editable:1},
+    messagemenu:    {id:'messagemenu'},
+    listmenu:       {id:'listmenu', editable:1},
+    dragmessagemenu:{id:'dragmessagemenu', sticky:1},
+    groupmenu:      {id:'groupoptionsmenu', above:1},
+    mailboxmenu:    {id:'mailboxoptionsmenu', above:1},
+    composemenu:    {id:'composeoptionsmenu', editable:1},
+    // toggle: #1486823, #1486930
+    uploadmenu:     {id:'attachment-form', editable:1, above:1, toggle:!bw.ie&&!bw.linux }
+  };
+
+  var obj;
+  for (var k in this.popups) {
+    obj = $('#'+this.popups[k].id)
+    if (obj.length)
+      this.popups[k].obj = obj;
+    else {
+      delete this.popups[k];
     }
-
-  return false;
+  }
 }
 
-function rcmail_next_sibling(elm)
-{
-  var ns = elm.nextSibling;
-  while (ns && ns.nodeType == 3)
-    ns = ns.nextSibling;
-  return ns;
-}
+rcube_mail_ui.prototype = {
 
-function rcmail_prev_sibling(elm)
+show_popup: function(popup, show)
 {
-  var ps = elm.previousSibling;
-  while (ps && ps.nodeType == 3)
-    ps = ps.previousSibling;
-  return ps;
-}
+  if (typeof this[popup] == 'function')
+    return this[popup](show);
+  else
+    return this.show_popupmenu(popup, show);
+},
 
-function rcmail_init_compose_form()
+show_popupmenu: function(popup, show)
 {
-  var cc_field = document.getElementById('_cc');
-  if (cc_field && cc_field.value!='')
-    rcmail_show_header_form('cc');
+  var obj = this.popups[popup].obj,
+    above = this.popups[popup].above,
+    ref = rcube_find_object(popup+'link');
 
-  var bcc_field = document.getElementById('_bcc');
-  if (bcc_field && bcc_field.value!='')
-    rcmail_show_header_form('bcc');
+  if (typeof show == 'undefined')
+    show = obj.is(':visible') ? false : true;
+  else if (this.popups[popup].toggle && show && this.popups[popup].obj.is(':visible') )
+    show = false;
 
-  // prevent from form data loss when pressing ESC key in IE
-  if (bw.ie) {
-    var form = rcube_find_object('form');
-    form.onkeydown = function (e) { if (rcube_event.get_keycode(e) == 27) rcube_event.cancel(e); };
-  }
-}
+  if (show && ref) {
+    var parent = $(ref).parent(),
+      pos = parent.hasClass('dropbutton') ? parent.offset() : $(ref).offset();
 
-/**
- * Mailbox view
- */
+    if (!above && pos.top + ref.offsetHeight + obj.height() > window.innerHeight)
+      above = true;
 
-function rcube_mail_ui()
-{
-  this.markmenu = $('#markmessagemenu');
-  this.searchmenu = $('#searchmenu');
-  this.messagemenu = $('#messagemenu');
-}
+    obj.css({ left:pos.left, top:(pos.top + (above ? -obj.height() : ref.offsetHeight)) });
+  }
 
-rcube_mail_ui.prototype = {
+  obj[show?'show':'hide']();
+},
 
-show_markmenu: function(show)
+dragmessagemenu: function(show)
 {
-  if (typeof show == 'undefined')
-    show = this.markmenu.is(':visible') ? false : true;
-  
-  var ref = rcube_find_object('markreadbutton');
-  if (show && ref)
-    this.markmenu.css({ left:ref.offsetLeft, top:(ref.offsetTop + ref.offsetHeight) });
-  
-  this.markmenu[show?'show':'hide']();
+  this.popups.dragmessagemenu.obj[show?'show':'hide']();
 },
 
-show_messagemenu: function(show)
+uploadmenu: function(show)
 {
-  if (typeof show == 'undefined')
-    show = this.messagemenu.is(':visible') ? false : true;
+  if (typeof show == 'object') // called as event handler
+    show = false;
+
+  // clear upload form
+  if (!show) {
+    try { $('#attachment-form form')[0].reset(); }
+    catch(e){}  // ignore errors
+  }
 
-  var ref = rcube_find_object('messagemenulink');
-  if (show && ref)
-    this.messagemenu.css({ left:ref.offsetLeft, top:(ref.offsetTop + ref.offsetHeight) });
+  this.show_popupmenu('uploadmenu', show);
 
-  this.messagemenu[show?'show':'hide']();
+  if (!document.all && this.popups.uploadmenu.obj.is(':visible'))
+    $('#attachment-form input[type=file]').click();
 },
 
-show_searchmenu: function(show)
+searchmenu: function(show)
 {
+  var obj = this.popups.searchmenu.obj,
+    ref = rcube_find_object('searchmenulink');
+
   if (typeof show == 'undefined')
-    show = this.searchmenu.is(':visible') ? false : true;
+    show = obj.is(':visible') ? false : true;
 
-  var ref = rcube_find_object('searchmod');
   if (show && ref) {
     var pos = $(ref).offset();
-    this.searchmenu.css({ left:pos.left, top:(pos.top + ref.offsetHeight + 2)});
+    obj.css({ left:pos.left, top:(pos.top + ref.offsetHeight + 2)})
+        .find(':checked').attr('checked', false);
 
     if (rcmail.env.search_mods) {
-      for (var n in rcmail.env.search_mods) {
-        box = rcube_find_object('s_mod_' + n);
-        box.checked = 'checked';
-      }
+      var search_mods = rcmail.env.search_mods[rcmail.env.mailbox] ? rcmail.env.search_mods[rcmail.env.mailbox] : rcmail.env.search_mods['*'];
+      for (var n in search_mods)
+        $('#s_mod_' + n).attr('checked', true);
     }
   }
-  this.searchmenu[show?'show':'hide']();
+  obj[show?'show':'hide']();
 },
+
 set_searchmod: function(elem)
 {
   if (!rcmail.env.search_mods)
-    rcmail.env.search_mods = new Object();
-  
+    rcmail.env.search_mods = {};
+
+  if (!rcmail.env.search_mods[rcmail.env.mailbox])
+    rcmail.env.search_mods[rcmail.env.mailbox] = rcube_clone_object(rcmail.env.search_mods['*']);
+
   if (!elem.checked)
-    delete(rcmail.env.search_mods[elem.value]);
+    delete(rcmail.env.search_mods[rcmail.env.mailbox][elem.value]);
   else
-    rcmail.env.search_mods[elem.value] = elem.value;
+    rcmail.env.search_mods[rcmail.env.mailbox][elem.value] = elem.value;
+},
+
+listmenu: function(show)
+{
+  var obj = this.popups.listmenu.obj,
+    ref = rcube_find_object('listmenulink');
+
+  if (typeof show == 'undefined')
+    show = obj.is(':visible') ? false : true;
+
+  if (show && ref) {
+    var pos = $(ref).offset(),
+      menuwidth = obj.width(),
+      pagewidth = $(document).width();
+
+    if (pagewidth - pos.left < menuwidth && pos.left > menuwidth)
+      pos.left = pos.left - menuwidth;
+
+    obj.css({ left:pos.left, top:(pos.top + ref.offsetHeight + 2)});
+    // set form values
+    $('input[name="sort_col"][value="'+rcmail.env.sort_col+'"]').attr('checked', 1);
+    $('input[name="sort_ord"][value="DESC"]').attr('checked', rcmail.env.sort_order=='DESC' ? 1 : 0);
+    $('input[name="sort_ord"][value="ASC"]').attr('checked', rcmail.env.sort_order=='DESC' ? 0 : 1);
+    $('input[name="view"][value="thread"]').attr('checked', rcmail.env.threading ? 1 : 0);
+    $('input[name="view"][value="list"]').attr('checked', rcmail.env.threading ? 0 : 1);
+    // list columns
+    var cols = $('input[name="list_col[]"]');
+    for (var i=0; i<cols.length; i++) {
+      var found = 0;
+      if (cols[i].value != 'from')
+        found = jQuery.inArray(cols[i].value, rcmail.env.coltypes) != -1;
+      else
+        found = (jQuery.inArray('from', rcmail.env.coltypes) != -1
+           || jQuery.inArray('to', rcmail.env.coltypes) != -1);
+      $(cols[i]).attr('checked',found ? 1 : 0);
+    }
+  }
+
+  obj[show?'show':'hide']();
+
+  if (show) {
+    var maxheight=0;
+    $('#listmenu fieldset').each(function() {
+      var height = $(this).height();
+      if (height > maxheight) {
+        maxheight = height;
+      }
+    });
+    $('#listmenu fieldset').css("min-height", maxheight+"px")
+    // IE6 complains if you set this attribute using either method:
+    //$('#listmenu fieldset').css({'height':'auto !important'});
+    //$('#listmenu fieldset').css("height","auto !important");
+      .height(maxheight);
+  };
+},
+
+open_listmenu: function(e)
+{
+  this.listmenu();
+},
+
+save_listmenu: function()
+{
+  this.listmenu();
+
+  var sort = $('input[name="sort_col"]:checked').val(),
+    ord = $('input[name="sort_ord"]:checked').val(),
+    thread = $('input[name="view"]:checked').val(),
+    cols = $('input[name="list_col[]"]:checked')
+      .map(function(){ return this.value; }).get();
+
+  rcmail.set_list_options(cols, sort, ord, thread == 'thread' ? 1 : 0);
 },
 
 body_mouseup: function(evt, p)
 {
-  if (this.markmenu && this.markmenu.is(':visible') && rcube_event.get_target(evt) != rcube_find_object('markreadbutton'))
-    this.show_markmenu(false);
-  else if (this.messagemenu && this.messagemenu.is(':visible') && rcube_event.get_target(evt) != rcube_find_object('messagemenulink'))
-    this.show_messagemenu(false);
-  else if (this.searchmenu && this.searchmenu.is(':visible') && rcube_event.get_target(evt) != rcube_find_object('searchmod')) {
-    var menu = rcube_find_object('searchmenu');
-    var target = rcube_event.get_target(evt);
-    while (target.parentNode) {
-      if (target.parentNode == menu)
-        return;
-      target = target.parentNode;
+  var i, target = rcube_event.get_target(evt);
+
+  for (i in this.popups) {
+    if (this.popups[i].obj.is(':visible') && target != rcube_find_object(i+'link')
+      && !this.popups[i].toggle
+      && (!this.popups[i].editable || !this.target_overlaps(target, this.popups[i].id))
+      && (!this.popups[i].sticky || !rcube_mouse_is_over(evt, rcube_find_object(this.popups[i].id)))
+    ) {
+      window.setTimeout('$("#'+this.popups[i].id+'").hide()', 50);
     }
-    this.show_searchmenu(false);
   }
 },
 
-body_keypress: function(evt, p)
+target_overlaps: function (target, elementid)
+{
+  var element = rcube_find_object(elementid);
+  while (target.parentNode) {
+    if (target.parentNode == element)
+      return true;
+    target = target.parentNode;
+  }
+  return false;
+},
+
+body_keydown: function(evt, p)
 {
   if (rcube_event.get_keycode(evt) == 27) {
-    if (this.markmenu && this.markmenu.is(':visible'))
-      this.show_markmenu(false);
-    if (this.searchmenu && this.searchmenu.is(':visible'))
-      this.show_searchmenu(false);
-    if (this.messagemenu && this.messagemenu.is(':visible'))
-      this.show_messagemenu(false);
+    for (var k in this.popups) {
+      if (this.popups[k].obj.is(':visible'))
+        this.show_popup(k, false);
+    }
+  }
+},
+
+switch_preview_pane: function(elem)
+{
+  var uid, prev_frm = $('#mailpreviewframe');
+
+  if (elem.checked) {
+    rcmail.env.contentframe = 'messagecontframe';
+    if (mailviewsplit.layer) {
+      mailviewsplit.resize();
+      mailviewsplit.layer.elm.style.display = '';
+    }
+    else
+      mailviewsplit.init();
+
+    if (bw.opera) {
+      $('#messagelistcontainer').css({height: ''});
+    }
+    prev_frm.show();
+
+    if (uid = rcmail.message_list.get_single_selection())
+      rcmail.show_message(uid, false, true);
+  }
+  else {
+    prev_frm.hide();
+    if (bw.ie6 || bw.ie7) {
+      var fr = document.getElementById('mailcontframe');
+      fr.style.bottom = 0;
+      fr.style.height = parseInt(fr.parentNode.offsetHeight)+'px';
+    }
+    else {
+      $('#mailcontframe').css({height: 'auto', bottom: 0});
+      if (bw.opera)
+        $('#messagelistcontainer').css({height: 'auto'});
+    }
+    if (mailviewsplit.layer)
+      mailviewsplit.layer.elm.style.display = 'none';
+
+    rcmail.env.contentframe = null;
+    rcmail.show_contentframe(false);
+  }
+  rcmail.http_post('save-pref', '_name=preview_pane&_value='+(elem.checked?1:0));
+},
+
+/* Message composing */
+init_compose_form: function()
+{
+  var f, field, fields = ['cc', 'bcc', 'replyto', 'followupto'],
+    div = document.getElementById('compose-div'),
+    headers_div = document.getElementById('compose-headers-div');
+
+  // Show input elements with non-empty value
+  for (f=0; f<fields.length; f++) {
+    if ((field = $('#_'+fields[f])) && field.length && field.val() != '')
+      rcmail_ui.show_header_form(fields[f]);
+  }
+
+  // prevent from form data loss when pressing ESC key in IE
+  if (bw.ie) {
+    var form = rcube_find_object('form');
+    form.onkeydown = function (e) {
+      if (rcube_event.get_keycode(e) == 27)
+        rcube_event.cancel(e);
+    };
+  }
+
+  $(window).resize(function() {
+    rcmail_ui.resize_compose_body();
+  });
+
+  $('#compose-container').resize(function() {
+    rcmail_ui.resize_compose_body();
+  });
+
+  div.style.top = (parseInt(headers_div.offsetHeight, 10) + 3) + 'px';
+  $(window).resize();
+},
+
+resize_compose_body: function()
+{
+  var div = $('#compose-div .boxlistcontent'), w = div.width(), h = div.height();
+  w -= 8;  // 2 x 3px padding + 2 x 1px border
+  h -= 4;
+
+  $('#compose-body').width(w+'px').height(h+'px');
+
+  if (window.tinyMCE && tinyMCE.get('compose-body')) {
+    $('#compose-body_tbl').width((w+6)+'px').height('');
+    $('#compose-body_ifr').width((w+6)+'px').height((h-54)+'px');
   }
+  else {
+    $('#googie_edit_layer').height(h+'px');
+  }
+},
+
+resize_compose_body_ev: function()
+{
+  window.setTimeout(function(){rcmail_ui.resize_compose_body();}, 100);
+},
+
+show_header_form: function(id)
+{
+  var row, s,
+    link = document.getElementById(id + '-link');
+
+  if ((s = this.next_sibling(link)))
+    s.style.display = 'none';
+  else if ((s = this.prev_sibling(link)))
+    s.style.display = 'none';
+
+  link.style.display = 'none';
+
+  if ((row = document.getElementById('compose-' + id))) {
+    var div = document.getElementById('compose-div'),
+      headers_div = document.getElementById('compose-headers-div');
+    row.style.display = (document.all && !window.opera) ? 'block' : 'table-row';
+    div.style.top = (parseInt(headers_div.offsetHeight, 10) + 3) + 'px';
+    this.resize_compose_body();
+  }
+
+  return false;
+},
+
+hide_header_form: function(id)
+{
+  var row, ns,
+    link = document.getElementById(id + '-link'),
+    parent = link.parentNode,
+    links = parent.getElementsByTagName('a');
+
+  link.style.display = '';
+
+  for (var i=0; i<links.length; i++)
+    if (links[i].style.display != 'none')
+      for (var j=i+1; j<links.length; j++)
+           if (links[j].style.display != 'none')
+          if ((ns = this.next_sibling(links[i]))) {
+               ns.style.display = '';
+               break;
+             }
+
+  document.getElementById('_' + id).value = '';
+
+  if ((row = document.getElementById('compose-' + id))) {
+    var div = document.getElementById('compose-div'),
+      headers_div = document.getElementById('compose-headers-div');
+    row.style.display = 'none';
+    div.style.top = (parseInt(headers_div.offsetHeight, 10) + 1) + 'px';
+    this.resize_compose_body();
+  }
+
+  return false;
+},
+
+next_sibling: function(elm)
+{
+  var ns = elm.nextSibling;
+  while (ns && ns.nodeType == 3)
+    ns = ns.nextSibling;
+  return ns;
+},
+
+prev_sibling: function(elm)
+{
+  var ps = elm.previousSibling;
+  while (ps && ps.nodeType == 3)
+    ps = ps.previousSibling;
+  return ps;
 }
 
 };
 
+
 var rcmail_ui;
 
 function rcube_init_mail_ui()
 {
   rcmail_ui = new rcube_mail_ui();
   rcube_event.add_listener({ object:rcmail_ui, method:'body_mouseup', event:'mouseup' });
-  rcube_event.add_listener({ object:rcmail_ui, method:'body_keypress', event:'keypress' });
+  rcube_event.add_listener({ object:rcmail_ui, method:'body_keydown', event:'keydown' });
+
+  $('iframe').load(iframe_events)
+    .contents().mouseup(function(e){rcmail_ui.body_mouseup(e)});
+
+  if (rcmail.env.task == 'mail') {
+    rcmail.addEventListener('menu-open', 'open_listmenu', rcmail_ui);
+    rcmail.addEventListener('menu-save', 'save_listmenu', rcmail_ui);
+    rcmail.addEventListener('aftersend-attachment', 'uploadmenu', rcmail_ui);
+    rcmail.addEventListener('aftertoggle-editor', 'resize_compose_body_ev', rcmail_ui);
+    rcmail.gui_object('message_dragmenu', 'dragmessagemenu');
+
+    if (rcmail.env.action == 'compose')
+      rcmail_ui.init_compose_form();
+  }
 }
+
+// Events handling in iframes (eg. preview pane)
+function iframe_events()
+{
+  // this==iframe
+  var doc = this.contentDocument ? this.contentDocument : this.contentWindow ? this.contentWindow.document : null;
+  rcube_event.add_listener({ element: doc, object:rcmail_ui, method:'body_mouseup', event:'mouseup' });
+}
+
index 6e8d41c920eb2c4a8b2a4bff66043ed1ff06ad33..8adadc25645d53b19a4edf987fd126c802cd28c8 100644 (file)
@@ -3,27 +3,20 @@
 .googie_window {
   font-size: 11px;
   width: 185px;
-  text-align: left;
-  border: 1px solid #666666;
-  background-color: #ffffff;
   margin: 0;
   padding: 0;
-  position: absolute;
-  visibility: hidden;
 }
 
 .googie_edit_layer {
-  border: 1px solid #666666;
   background-color: #ffffff;
-  padding: 1px 4px;
-  margin: 1px 0px;
+  padding: 0 4px;
   font-size: 9pt;
-  font-family: "Courier New", Courier, monospace;
+  font-family: monospace;
+  border: 1px solid #999;
 }
 
 .googie_edit_layer span {
-  font-size: 9pt;
-  font-family: "Courier New", Courier, monospace;
+  font-family: monospace;
 }
 
 .googie_list {
 .googie_list_revert:hover {
   color: #fff;
 }
+
 .googie_link {
   color: #b91414;
   text-decoration: underline;
   cursor: pointer;
+  font-size: 9pt;
+  font-family: monospace;
 }
 
-.googie_check_spelling_link {  
+.googie_check_spelling_link {
   color: #CC0000;
   font-size: 11px;
   text-decoration: none;
@@ -94,7 +90,7 @@
   text-decoration: none;
 }
 
-.googie_check_spelling_ok, 
+.googie_check_spelling_ok,
 .googie_resume_editing {
   color: green;
   font-size: 11px;
index e256ea1c53b5bf82081e0e556a373e33855bb91e..1b8135dfe13cd32c213287bd2cc721fe4b06ff9a 100644 (file)
@@ -1,8 +1,19 @@
 /* CSS hacks for IE versions 5,6 */
 
+#taskbar
+{
+  background: url(images/taskbar.gif) top right no-repeat;
+}
+
 img
 {
-  behavior: url('skins/default/pngbehavior.htc');
+  behavior: url(skins/default/pngbehavior.htc);
+}
+
+#logo
+{
+  width: 178px;
+  height: 47px;
 }
 
 #message div.notice,
@@ -11,17 +22,17 @@ img
 #message div.confirmation,
 #remote-objects-message
 {
-  background-image: url('images/display/icons.gif');
+  background-image: url(images/display/icons.gif);
 }
 
 #messagemenu li a
 {
-  background-image: url('images/messageactions.gif');
+  background-image: url(images/messageactions.gif);
 }
 
 #mailboxlist li
 {
-  background-image: url('images/icons/folders.gif');
+  background-image: url(images/icons/folders.gif);
 }
 
 #attachment-list
@@ -36,24 +47,99 @@ img
   padding-right: 10px;
 }
 
+.boxfooter a.button,
+.boxfooter a.buttonPas
+{
+  background-image: url(images/icons/groupactions.gif);
+}
+
+.pagenav
+{
+  width: 200px;
+}
+
+.pagenav a.button,
+.pagenav a.buttonPas
+{
+  background-image: url(images/pagenav.gif);
+}
+
+#listcontrols a.button,
+#listcontrols a.buttonPas {
+  background-image: url(images/mail_footer.gif);
+}
+
 #messagetoolbar a.button,
 #messagetoolbar a.buttonPas {
-  background-image: url('images/mail_toolbar.gif');
+  background-image: url(images/mail_toolbar.gif);
 }
 
 #abooktoolbar a.button,
 #abooktoolbar a.buttonPas,
 #abooktoolbar span.separator {
-  background-image: url('images/abook_toolbar.gif');
+  background-image: url(images/abook_toolbar.gif);
+}
+
+ul.toolbarmenu li a,
+.popupmenu li a
+{
+  clear: left;
+  height: expression(Math.min(14, parseInt(document.documentElement.clientHeight))+'px');
+  width: expression(Math.min(130, parseInt(document.documentElement.clientWidth))+'px');
+}
+
+ul.toolbarmenu li.separator_below
+{
+  padding-bottom: 3px;
 }
 
-ul.toolbarmenu li
+.boxfooter
+{
+  width: 100%;
+  bottom: -1px;
+}
+
+.boxtitle,
+#directorylist li a
 {
   width: auto;
-  border: 1px solid #f6f6f6;
 }
 
-ul.toolbarmenu li a
+.boxlistcontent
 {
-  clear: left;
+  top: 21px;
+  height: expression((parseInt(this.parentNode.offsetHeight)-24-parseInt(this.style.top?this.style.top:21))+'px');
 }
+
+#compose-div .boxlistcontent
+{
+  height: expression((parseInt(this.parentNode.offsetHeight)-23-parseInt(this.style.top?this.style.top:21))+'px');
+}
+
+#directorylistbox
+{
+  height: expression((parseInt(document.documentElement.clientHeight)-105)+'px');
+}
+
+#messagelist tr td div.collapsed,
+#messagelist tr td div.expanded,
+#messagelist tr td.threads div.listmenu,
+#messagelist tr td.attachment span.attachment,
+#messagelist tr td.attachment span.report,
+#messagelist tr td.flag span.flagged,
+#messagelist tr td.flag span.unflagged:hover,
+#messagelist tr td.status span.status,
+#messagelist tr td.status span.msgicon,
+#messagelist tr td.status span.deleted,
+#messagelist tr td.status span.unread,
+#messagelist tr td.status span.unreadchildren,
+#messagelist tr td.subject span.msgicon,
+#messagelist tr td.subject span.deleted,
+#messagelist tr td.subject span.unread,
+#messagelist tr td.subject span.replied,
+#messagelist tr td.subject span.forwarded,
+#messagelist tr td.subject span.unreadchildren
+{
+  background-image: url(images/messageicons.gif);
+}
+
index 784c8d4ef4d3b72d2d594a75afdbb91fdcfa0b1a..29ab8cb750201fe136336edd620a6af44379672d 100644 (file)
@@ -1,4 +1,3 @@
-/* CSS hacks for IE versions <= 8 */
 
 input, textarea
 {
@@ -20,17 +19,12 @@ input, textarea
 
 #message
 {
-  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)";
   filter: alpha(opacity=85);
 }
 
-#markmessagemenu,
-#searchmenu,
-#messagemenu
+.popupmenu
 {
-  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=90)";
-  filter: alpha(opacity=90);
-
+  background-color: #ffffff;
 }
 
 #tabsbar
@@ -38,14 +32,10 @@ input, textarea
   width: expression((parseInt(document.documentElement.clientWidth)-240)+'px');
 }
 
-#folder-manager
-{
-  height: expression((parseInt(document.documentElement.clientHeight)-235)+'px');
-}
-
-#identities-list
+#mainscreen
 {
-  height: expression((parseInt(document.documentElement.clientHeight)-155)+'px');
+  width: expression((parseInt(document.documentElement.clientWidth)-40)+'px');
+  height: expression((parseInt(document.documentElement.clientHeight)-105)+'px');
 }
 
 #messagetoolbar
@@ -56,32 +46,25 @@ input, textarea
 
 #messagetoolbar select.mboxlist
 {
-  top: -8px;
+  margin: 0 8px;
+  top: 8px;
 }
 
 #abooktoolbar a.buttonPas
 {
   filter: alpha(opacity=35);
-  background-image: url('images/abook_toolbar.gif');
+  background-image: url(images/abook_toolbar.gif);
 }
 
 #messagetoolbar a.buttonPas
 {
   filter: alpha(opacity=35);
-  background-image: url('images/mail_toolbar.gif');
+  background-image: url(images/mail_toolbar.gif);
 }
 
-#listcontrols a.buttonPas,
-#mailboxcontrols a.buttonPas
+#listcontrols a.buttonPas
 {
   filter: alpha(opacity=35);
-  background-image: url('images/mail_footer.png');
-}
-
-#messagetoolbar select.mboxlist
-{
-  margin: 0 8px;
-  top: 8px;
 }
 
 #quicksearchbar
@@ -89,24 +72,21 @@ input, textarea
   z-index: 250;
 }
 
-#mainscreen
-{
-  width: expression((parseInt(document.documentElement.clientWidth)-40)+'px');
-  height: expression((parseInt(document.documentElement.clientHeight)-101)+'px');
-}
-
-#directorylist
-{
-  height: expression((parseInt(document.documentElement.clientHeight)-125)+'px');  
-}
-
 #addresslist,
-#sectionslist
-{
-  height: expression(parseInt(this.parentNode.offsetHeight)+'px');
-}
-
-#mailleftcontainer
+#sectionslist,
+#identities-list,
+#mailleftcontainer,
+#mailrightcontainer,
+#compose-container,
+#compose-attachments,
+#mailcontframe,
+#mailboxlist-container,
+#mailrightcontent,
+#messageframe,
+#identity-details,
+#contacts-box,
+#prefs-box,
+#folder-box
 {
   height: expression(parseInt(this.parentNode.offsetHeight)+'px');
 }
@@ -114,28 +94,22 @@ input, textarea
 #mailrightcontainer
 {
   width: expression((parseInt(this.parentNode.offsetWidth)-170)+'px');
-  height: expression(parseInt(this.parentNode.offsetHeight)+'px');
-}
-
-#mailrightcontent
-{
-  width: 100%;
 }
 
 #messagepartcontainer
 {
   width: expression((parseInt(document.documentElement.clientWidth)-40)+'px');
-  height: expression((parseInt(document.documentElement.clientHeight)-100)+'px');
+  height: expression((parseInt(document.documentElement.clientHeight)-90)+'px');
 }
 
-#mailcontframe
+#mailrightcontent
 {
-  height: expression(parseInt(this.parentNode.offsetHeight)+'px');
+  width: 100%;
 }
 
-#mailrightcontent
+#compose-div
 {
-  height: expression((parseInt(this.parentNode.offsetHeight)-20)+'px');
+  height: expression((parseInt(this.parentNode.offsetHeight)-1-parseInt(document.getElementById('compose-headers').offsetHeight))+'px');
 }
 
 #partheader
@@ -143,11 +117,6 @@ input, textarea
   width: expression((parseInt(document.documentElement.clientWidth)-240)+'px');
 }
 
-#mailboxlist-container
-{
-  height: expression((parseInt(this.parentNode.offsetHeight)-20)+'px');
-}
-
 #subscription-table
 {
   width: auto;
@@ -160,20 +129,27 @@ input, textarea
   border-collapse: collapse;
 }
 
-#messageframe
+#messagelist thead tr td,
+#messagelist tbody tr td
 {
-  width: expression((parseInt(this.parentNode.offsetWidth)-180)+'px');
-  height: expression((parseInt(this.parentNode.offsetHeight)-20)+'px');
+  height: 18px;
+}
+
+#messagelist tbody tr.unroot td.subject
+{
+  text-decoration: underline;
 }
 
-#messagecanvas 
+#messageframe
 {
-  width: expression((parseInt(this.parentNode.offsetWidth)-20)+'px');
+  width: expression((parseInt(this.parentNode.offsetWidth)-180)+'px');
+  overflow: hidden;
 }
 
 #countcontrols
 {
   width: 24em;
+  padding-right: 10px;
 }
 
 body.iframe 
@@ -181,19 +157,6 @@ body.iframe
   width: expression((parseInt(document.documentElement.clientWidth))+'px');
 }
 
-#compose-container
-{
-  width: expression((parseInt(document.documentElement.clientWidth)-230)+'px');
-  height: expression((parseInt(document.documentElement.clientHeight)-120)+'px');
-}
-
-#compose-body,
-#compose-headers td textarea,
-#compose-headers td input
-{
-  width: 99%;
-}
-
 div.message-part pre,
 div.message-htmlpart pre,
 div.message-part div.pre
@@ -203,50 +166,51 @@ div.message-part div.pre
 
 #addressscreen
 {
-  width: expression((parseInt(document.documentElement.clientWidth)-220)+'px');
-  height: expression((parseInt(document.documentElement.clientHeight)-125)+'px');
+  width: expression((parseInt(document.documentElement.clientWidth)-245)+'px');
+  height: expression((parseInt(document.documentElement.clientHeight)-105)+'px');
 }
 
-#prefsscreen
+#contacts-table
 {
-  width: expression((parseInt(document.documentElement.clientWidth)-40)+'px');
-  height: expression((parseInt(document.documentElement.clientHeight)-125)+'px');
+  width: expression(document.getElementById('addresslist').clientWidth);
 }
 
-#importbox
+#contacts-box,
+#prefs-box
 {
-  height: expression((parseInt(document.documentElement.clientHeight)-135)+'px');
+  width: expression((parseInt(this.parentNode.offsetWidth)-555)+'px');
 }
 
-#contacts-table
+#rcmdraglayer
 {
-  width: expression(document.getElementById('addresslist').clientWidth);
+  filter: alpha(opacity=82);
+  padding-left: 20px;
 }
 
-#contacts-box,
-#prefs-box
+div.draglayercopy
 {
-  height: expression(parseInt(this.parentNode.offsetHeight)+'px');
-  width: expression((parseInt(this.parentNode.offsetWidth)-555)+'px');
+  border-color: #00cc00;
+  background: url(images/messageactions.png) 0 -125px no-repeat #fff;
 }
 
-#identity-details
+html.ie8 .draglayercopy:before
 {
-  width: expression((parseInt(document.documentElement.clientWidth)-470)+'px');
-  height: expression((parseInt(document.documentElement.clientHeight)-155)+'px');
+  content: "";
+  display: none;
 }
 
-#rcmdraglayer
+ul.toolbarmenu
 {
-  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
-  filter: alpha(opacity=70);
+  margin: 0 0 -4px 0;
 }
 
+.popupmenu ul li,
 ul.toolbarmenu li
 {
   min-width: auto;
 }
 
+.popupmenu ul li a,
 ul.toolbarmenu li a
 {
   min-height: auto;
@@ -254,16 +218,21 @@ ul.toolbarmenu li a
 
 #console
 {
-  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
   filter: alpha(opacity=80);
 }
 
-#countcontrols
+table.records-table thead tr td
 {
-  padding-right: 10px;
+  height: 19px;
 }
 
-table.records-table thead tr td
+#listmenu fieldset
 {
-  height: 19px;
+  margin: 0 4px;
+  padding: 0.8em;
+}
+
+#listcontrols input
+{
+  margin-top: 2px;
 }
diff --git a/skins/default/images/dbutton.png b/skins/default/images/dbutton.png
new file mode 100644 (file)
index 0000000..58a1245
Binary files /dev/null and b/skins/default/images/dbutton.png differ
diff --git a/skins/default/images/icons/abcard.png b/skins/default/images/icons/abcard.png
deleted file mode 100644 (file)
index d0d8500..0000000
Binary files a/skins/default/images/icons/abcard.png and /dev/null differ
index e483b17e2ed7925fd508afdfd079822eb5d01cc9..07cc1ec7d625c3fc6ad855aa28030afd734818ad 100644 (file)
Binary files a/skins/default/images/icons/collapsed.png and b/skins/default/images/icons/collapsed.png differ
diff --git a/skins/default/images/icons/columnpicker.gif b/skins/default/images/icons/columnpicker.gif
new file mode 100644 (file)
index 0000000..e776519
Binary files /dev/null and b/skins/default/images/icons/columnpicker.gif differ
index 74726c8aebb428935aa412eef06e0b1555486722..1db079b79a953c59f3d664b287723b41998d7670 100644 (file)
Binary files a/skins/default/images/icons/expanded.png and b/skins/default/images/icons/expanded.png differ
index 95980850e0a1a20fce722f4f9d35a3d4b80d1037..0fccb2c18a1d19c7d537552a7c3713123c3726d3 100644 (file)
Binary files a/skins/default/images/icons/folders.gif and b/skins/default/images/icons/folders.gif differ
index a6c042c43d0b487f2207c15002afa8ac133a031e..5013318f8584a6c7d9661d2d3d7ffa245e0b4475 100644 (file)
Binary files a/skins/default/images/icons/folders.png and b/skins/default/images/icons/folders.png differ
diff --git a/skins/default/images/icons/groupactions.gif b/skins/default/images/icons/groupactions.gif
new file mode 100644 (file)
index 0000000..1564904
Binary files /dev/null and b/skins/default/images/icons/groupactions.gif differ
diff --git a/skins/default/images/icons/groupactions.png b/skins/default/images/icons/groupactions.png
new file mode 100644 (file)
index 0000000..2e9c5f1
Binary files /dev/null and b/skins/default/images/icons/groupactions.png differ
diff --git a/skins/default/images/icons/unread_children.png b/skins/default/images/icons/unread_children.png
new file mode 100644 (file)
index 0000000..45e671d
Binary files /dev/null and b/skins/default/images/icons/unread_children.png differ
index e7f5015374ff5bcc769056e6b07dcd5118d76ee8..2f5c7f862d4bef06655439a2a8e54b62e60ef459 100644 (file)
Binary files a/skins/default/images/listheader.gif and b/skins/default/images/listheader.gif differ
diff --git a/skins/default/images/mail_footer.gif b/skins/default/images/mail_footer.gif
new file mode 100644 (file)
index 0000000..302b558
Binary files /dev/null and b/skins/default/images/mail_footer.gif differ
index b1b63617e75d43a63f1b77cd0c8b45872a0e7df5..e0f82b578a13006606cf46b5a991060d91af3546 100644 (file)
Binary files a/skins/default/images/mail_footer.png and b/skins/default/images/mail_footer.png differ
index 4e2cecb8b6afc6b46c95dfee703386c2b33a5b7f..9856b426597b642f897d649656f081737fe2652a 100644 (file)
Binary files a/skins/default/images/mail_toolbar.gif and b/skins/default/images/mail_toolbar.gif differ
index e6f80291b40783474e629f33a8ed50582ee25c66..3ee0ce6d886a97bdf9f1ebf6c38fb2104681863d 100644 (file)
Binary files a/skins/default/images/mail_toolbar.png and b/skins/default/images/mail_toolbar.png differ
index 5f0a533fe724762e341379a98ec118b3c23255c5..b73fbb354a0e69ca1dc9f1493726eb1578cbba8f 100644 (file)
Binary files a/skins/default/images/messageactions.gif and b/skins/default/images/messageactions.gif differ
index 8dfb3896d0dfa770afecb56915ad2abacdc580e8..c09f60fe62bb2aadbf19c35c3d574311999b1aa2 100644 (file)
Binary files a/skins/default/images/messageactions.png and b/skins/default/images/messageactions.png differ
diff --git a/skins/default/images/messageicons.gif b/skins/default/images/messageicons.gif
new file mode 100644 (file)
index 0000000..60526f1
Binary files /dev/null and b/skins/default/images/messageicons.gif differ
diff --git a/skins/default/images/messageicons.png b/skins/default/images/messageicons.png
new file mode 100644 (file)
index 0000000..5afb4cb
Binary files /dev/null and b/skins/default/images/messageicons.png differ
diff --git a/skins/default/images/quota.gif b/skins/default/images/quota.gif
new file mode 100644 (file)
index 0000000..9896d4c
Binary files /dev/null and b/skins/default/images/quota.gif differ
diff --git a/skins/default/images/tabs-left.gif b/skins/default/images/tabs-left.gif
new file mode 100644 (file)
index 0000000..3465d1f
Binary files /dev/null and b/skins/default/images/tabs-left.gif differ
diff --git a/skins/default/images/tabs-right.gif b/skins/default/images/tabs-right.gif
new file mode 100644 (file)
index 0000000..252463c
Binary files /dev/null and b/skins/default/images/tabs-right.gif differ
diff --git a/skins/default/images/tabs.gif b/skins/default/images/tabs.gif
deleted file mode 100644 (file)
index 1448227..0000000
Binary files a/skins/default/images/tabs.gif and /dev/null differ
diff --git a/skins/default/images/taskbar.png b/skins/default/images/taskbar.png
new file mode 100644 (file)
index 0000000..5fa3660
Binary files /dev/null and b/skins/default/images/taskbar.png differ
diff --git a/skins/default/images/tree.gif b/skins/default/images/tree.gif
new file mode 100644 (file)
index 0000000..c78f15e
Binary files /dev/null and b/skins/default/images/tree.gif differ
index 2e47ff911d8993b6e4744ed25259123f2a8597ac..393ee921833e945813d4904d5174a28128fd710a 100644 (file)
@@ -1,3 +1,3 @@
-<div id="header"><roundcube:button command="mail" image="/images/roundcube_logo.png" alt="RoundCube Webmail" /></div>
+<div id="header"><a href="./"><img id="logo" src="/images/roundcube_logo.png" alt="logo" title="<roundcube:object name='productname' />" /></a></div>
 
 <roundcube:object name="message" id="message" />
index e2d176e2223801125e1f740e1f4f47a60e70feb1..18caa3d4d8d5367fe16cd002ed38d7c39702a4fe 100644 (file)
@@ -1,7 +1,9 @@
 <link rel="index" href="$__comm_path" />
 <link rel="shortcut icon" href="/images/favicon.ico"/>
 <link rel="stylesheet" type="text/css" href="/common.css" />
-<roundcube:if condition="env:task != 'login'" /><link rel="stylesheet" type="text/css" href="/<roundcube:exp expression="env:task=='addressbook'?'addresses':env:task" />.css" /><roundcube:endif />
+<roundcube:if condition="!empty(env:task) && !in_array(env:task, array('login', 'dummy', 'utils'))" />
+<link rel="stylesheet" type="text/css" href="/<roundcube:var name="env:task" />.css" />
+<roundcube:endif />
 <roundcube:if condition="browser:ie" />
 <!--[if lte IE 8]><link rel="stylesheet" type="text/css" href="/iehacks.css" /><![endif]-->
 <!--[if lte IE 6]><link rel="stylesheet" type="text/css" href="/ie6hacks.css" /><![endif]-->
index ad2a6c61e41a1352a0796d4d999397033f6ee850..e89155ae85f7e4391c8ed024ff94dcde8c74aba7 100644 (file)
@@ -1,4 +1,4 @@
-<div id="messagemenu">
+<div id="messagemenu" class="popupmenu">
   <ul class="toolbarmenu">
     <li><roundcube:button class="printlink" command="print" label="printmessage" classAct="printlink active" /></li>
     <li><roundcube:button class="downloadlink" command="download" label="emlsave" classAct="downloadlink active" /></li>
diff --git a/skins/default/includes/replyallmenu.html b/skins/default/includes/replyallmenu.html
new file mode 100644 (file)
index 0000000..5cf1236
--- /dev/null
@@ -0,0 +1,7 @@
+<div id="replyallmenu" class="popupmenu">
+    <ul>
+        <li><roundcube:button command="reply-all" label="replyall" prop="sub" classAct="replyalllink active" class="replyalllink" /></li>
+        <li><roundcube:button command="reply-list" label="replylist" prop="sub" classAct="replylistlink active" class="replylistlink" /></li>
+        <roundcube:container name="replyallmenu" id="replyallmenu" />
+    </ul>
+</div>
index f74ea99834acbb9fd1c01cacef3eb1f19902cc73..7bb308c06760c700229d94c7cf2f1382d47c3ae3 100644 (file)
@@ -1,4 +1,4 @@
-/***** RoundCube|Mail mail task styles *****/
+/***** Roundcube|Mail mail task styles *****/
 
 
 #messagetoolbar
@@ -13,7 +13,7 @@
 /*  border: 1px solid #cccccc; */
 }
 
-#messagetoolbar a
+#messagetoolbar a
 {
   display: block;
   float: left;
@@ -27,9 +27,9 @@
   width: 32px;
   height: 32px;
   padding: 0;
-  margin-right: 10px;
+  margin: 0 5px;
   overflow: hidden;
-  background: url('images/mail_toolbar.png') 0 0 no-repeat transparent;
+  background: url(images/mail_toolbar.png) 0 0 no-repeat transparent;
   opacity: 0.99; /* this is needed to make buttons appear correctly in Chrome */
 }
 
   background-position: -416px -32px;
 }
 
-
-#messagetoolbar select,
-#compose-container select
-{
-  font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
-  font-size: 11px;
-  color: #333333;
-  height: 21px;
-}
-
 #messagetoolbar select.mboxlist
 {
   position: relative;
   padding-left: 2px;
 }
 
-#markmessagemenu,
-#searchmenu,
-#messagemenu
+#searchmenu
 {
-  position: absolute;
-  top: 32px;
-  left: 90px;
-  width: auto;
-  display: none;
-  background-color: #F9F9F9;
-  border: 1px solid #CCC;
-  padding: 1px;
-  opacity: 0.9;
-  z-index: 240;
+  width: 160px;
 }
 
-#searchmenu
+#searchmenu ul.toolbarmenu
 {
-  width: 172px;
+  margin: 0;
+}
+
+#searchmenu ul.toolbarmenu li
+{
+  margin: 1px 4px 1px;
 }
 
 #messagemenu li a.active:hover,
 
 #messagemenu li a
 {
-  background: url('images/messageactions.png') no-repeat 1px 0;
-  background-position: 0px 20px;
+  background: url(images/messageactions.png) no-repeat 7px 0;
+  background-position: 7px 20px;
 }
 
 #messagemenu li a.printlink
 {
-  background-position: 1px 1px;
+  background-position: 7px 1px;
 }
 
 #messagemenu li a.downloadlink
 {
-  background-position: 1px -17px;
+  background-position: 7px -17px;
 }
 
 #messagemenu li a.sourcelink
 {
-  background-position: 1px -35px;
+  background-position: 7px -35px;
 }
 
 #messagemenu li a.openlink
 {
-  background-position: 1px -53px;
+  background-position: 7px -53px;
 }
 
 #messagemenu li a.editlink
 {
-  background-position: 1px -71px;
+  background-position: 7px -71px;
+}
+
+#markmessagemenu li a
+{
+  background: url(images/messageicons.png) no-repeat;
 }
 
-#markmessagemenu a.readlink
+#markmessagemenu li a.readlink
 {
-  background: url('images/icons/dot.png') no-repeat 2px;
+  background-position: 7px -51px;
 }
 
-#markmessagemenu a.unreadlink
+#markmessagemenu li a.unreadlink
 {
-  background: url('images/icons/unread.png') no-repeat 2px;
+  background-position: 7px -119px;
 }
 
-#markmessagemenu a.flaggedlink
+#markmessagemenu li a.flaggedlink
 {
-  background: url('images/icons/flagged.png') no-repeat 2px;
+  background-position: 7px -153px;
 }
 
-#markmessagemenu a.unflaggedlink
+#markmessagemenu li a.unflaggedlink
 {
-  background: url('images/icons/unflagged.png') no-repeat 2px;
+  background-position: 7px -136px;
 }
 
 #searchfilter
   font-size: 11px;
 }
 
-td.formlinks a,
-td.formlinks a:visited
-{
-  color: #999999;
-  font-size: 11px;
-  text-decoration: none;
-}
-
-td.formlinks a,
-td.formlinks a:visited
-{
-  color: #CC0000;
-}
-
-#mainscreen
-{
-  position: absolute;
-  top: 85px;
-  right: 20px;
-  bottom: 16px;
-  left: 20px;
-}
-
 #mailleftcontainer
 {
   position: absolute;
-  top: 0px;
-  left: 0px;
-  bottom: 0px;
+  top: 0;
+  left: 0;
+  bottom: 0;
   width: 195px;
 }
 
 #mailrightcontainer
 {
   position: absolute;
-  top: 0px;
+  top: 0;
   left: 170px;
-  bottom: 0px;
-  right: 0px;
+  bottom: 0;
+  right: 0;
   min-width: 600px;
 }
 
 #mailrightcontent
 {
   position: absolute;
-  top: 0px;
-  left: 0px;
-  right: 0px;
-  bottom: 20px;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
 }
 
 #messagepartcontainer
@@ -320,13 +286,11 @@ td.formlinks a:visited
 {
   position: absolute;
   width: 100%;
-  top: 0px;
-  bottom: 0px;
+  top: 0;
+  bottom: 0;
   border: 1px solid #999999;
   background-color: #F9F9F9;
-  overflow: auto;
-  overflow-y: auto;
-  overflow-x: hidden;
+  overflow: hidden;
 }
 
 #mailpreviewframe
@@ -385,29 +349,16 @@ td.formlinks a:visited
 
 /** mailbox list styles */
 
-#mailboxlist-header
-{
-  display: block;
-  height: 12px;
-  margin: 0;
-  padding: 3px 10px 4px 10px;
-  background: url('images/listheader.gif') top left repeat-x #CCC;
-  border-bottom: 1px solid #999;
-  color: #333333;
-  font-size: 11px;
-  font-weight: bold;  
-}
-
 #mailboxlist-container
 {
   position: absolute;
-  top: 0px;
-  left: 0px;
+  top: 0;
+  left: 0;
   width: 100%;
-  bottom: 20px;
+  bottom: 0;
   border: 1px solid #999;
   background-color: #F9F9F9;
-  overflow: auto;
+  overflow: hidden;
 }
 
 #mailboxlist
@@ -420,6 +371,7 @@ td.formlinks a:visited
   list-style-type: none;
   overflow: hidden;
   white-space: nowrap;
+  background-color: #FFF;
 }
 
 #mailboxlist li
@@ -427,7 +379,7 @@ td.formlinks a:visited
   display: block;
   position: relative;
   font-size: 11px;
-  background: url('images/icons/folders.png') 5px 1px no-repeat;
+  background: url(images/icons/folders.png) 5px 0 no-repeat;
   border-bottom: 1px solid #EBEBEB;
 }
 
@@ -436,7 +388,7 @@ td.formlinks a:visited
   position: absolute;
   left: 8px !important;
   left: -16px;
-  top: 2px;
+  top: 1px;
   width: 14px;
   height: 16px;
 }
@@ -449,37 +401,37 @@ td.formlinks a:visited
 
 #mailboxlist li div.collapsed
 {
-  background: url('images/icons/collapsed.png') bottom right no-repeat;
+  background: url(images/icons/collapsed.png) bottom right no-repeat;
 }
 
 #mailboxlist li div.expanded
 {
-  background: url('images/icons/expanded.png') bottom right no-repeat;
+  background: url(images/icons/expanded.png) bottom right no-repeat;
 }
 
 #mailboxlist li.inbox
 {
-  background-position: 5px -19px;
+  background-position: 5px -18px;
 }
 
 #mailboxlist li.drafts
 {
-  background-position: 5px -40px;
+  background-position: 5px -37px;
 }
 
 #mailboxlist li.sent
 {
-  background-position: 5px -60px;
+  background-position: 5px -54px;
 }
 
 #mailboxlist li.junk
 {
-  background-position: 5px -80px;
+  background-position: 5px -73px;
 }
 
 #mailboxlist li.trash
 {
-  background-position: 5px -100px;
+  background-position: 5px -91px;
 }
 
 #mailboxlist li a
@@ -525,75 +477,58 @@ td.formlinks a:visited
 #mailboxlist ul {
   list-style: none;
   padding: 0;
-  margin:0;
-  border-top: 1px solid #EBEBEB;  
+  margin: 0;
+  border-top: 1px solid #EBEBEB;
   padding-left: 15px;
   background-position: 25px 1px;
-  background-color: #F9F9F9;
+  background-color: #FFF;
   color: blue;
   font-weight: normal;
 }
 
-#listcontrols,
-#mailboxcontrols
+#listcontrols
 {
-  position: absolute;
+  position: relative;
   white-space: nowrap;
-  left: 0px;
-  bottom: 0px;
-  height: 15px;
+  left: 4px;
+  line-height: 22px;
   width: auto;
   min-width: 300px;
 }
 
 #listcontrols a,
-#listcontrols span,
-#mailboxcontrols a,
-#mailboxcontrols span
+#listcontrols span
 {
   display: block;
   float: left;
   font-size: 11px;
 }
 
+#listcontrols input
+{
+  margin-top: 6px;
+}
+
 #listcontrols a.button,
-#listcontrols a.buttonPas,
-#mailboxcontrols a.button,
-#mailboxcontrols a.buttonPas
+#listcontrols a.buttonPas
 {
   display: block;
   float: left;
   width: 15px;
   height: 15px;
   padding: 0;
+  margin-top: 4px;
   margin-right: 2px;
   overflow: hidden;
-  background: url('images/mail_footer.png') 0 0 no-repeat transparent;
+  background: url(images/mail_footer.png) 0 0 no-repeat transparent;
   opacity: 0.99; /* this is needed to make buttons appear correctly in Chrome */
 }
 
-#listcontrols a.buttonPas,
-#mailboxcontrols a.buttonPas
+#listcontrols a.buttonPas
 {
   opacity: 0.35;
 }
 
-#mailboxcontrols a.expunge {
-  background-position: 0 0;
-}
-
-#mailboxcontrols a.expungesel {
-  background-position: 0 -15px;
-}
-
-#mailboxcontrols a.purge {
-  background-position: -15px 0;
-}
-
-#mailboxcontrols a.purgesel {
-  background-position: -15px -15px;
-}
-
 #listcontrols a.all {
   background-position: -30px 0;
 }
@@ -602,6 +537,14 @@ td.formlinks a:visited
   background-position: -30px -15px;
 }
 
+#listcontrols a.page {
+  background-position: -135px 0;
+}
+
+#listcontrols a.pagesel {
+  background-position: -135px -15px;
+}
+
 #listcontrols a.unread {
   background-position: -45px 0;
 }
@@ -626,12 +569,35 @@ td.formlinks a:visited
   background-position: -75px -15px;
 }
 
+#listcontrols a.expand-all {
+  background-position: -90px 0;
+}
+
+#listcontrols a.expand-allsel {
+  background-position: -90px -15px;
+}
+
+#listcontrols a.collapse-all {
+  background-position: -105px 0;
+}
+
+#listcontrols a.collapse-allsel {
+  background-position: -105px -15px;
+}
+
+#listcontrols a.expand-unread {
+  background-position: -120px 0;
+}
+
+#listcontrols a.expand-unreadsel {
+  background-position: -120px -15px;
+}
+
 #countcontrols
 {
-  height: 15px;
   position: absolute;
-  bottom: 0;
-  right: 0;
+  top: 4px;
+  right: 4px;
   min-width: 25em;
   white-space: nowrap;
   font-size: 11px;
@@ -661,15 +627,12 @@ body.messagelist
 
 #messagelist thead tr td
 {
-  height: 19px;
-  padding-top: 0px;
-  padding-bottom: 0px;
-  padding-left: 2px;
-  padding-right: 4px;
+  height: 20px;
+  padding: 0 4px 0 2px;
   vertical-align: middle;
   border-bottom: 1px solid #999999;
   color: #333333;
-  background: url('images/listheader.gif') top left repeat-x #CCC;
+  background: url(images/listheader.gif) top left repeat-x #CCC;
   font-size: 11px;
   font-weight: bold;
 }
@@ -677,17 +640,17 @@ body.messagelist
 #messagelist thead tr td.sortedASC,
 #messagelist thead tr td.sortedDESC
 {
-  background-position: 0 -20px;
+  background-position: 0 -22px;
 }
 
 #messagelist thead tr td.sortedASC a
 {
-  background: url('images/icons/sort.gif') right 0 no-repeat;
+  background: url(images/icons/sort.gif) right 0 no-repeat;
 }
 
 #messagelist thead tr td.sortedDESC a
 {
-  background: url('images/icons/sort.gif') right -14px no-repeat;
+  background: url(images/icons/sort.gif) right -14px no-repeat;
 }
 
 #messagelist thead tr td a
@@ -699,13 +662,23 @@ body.messagelist
   text-decoration: none;
 }
 
+#messagelist thead tr td.size
+{
+  text-align: left;
+}
+
+#messagelist thead tr td.subject
+{
+  padding-left: 18px;
+}
+
 #messagelist tbody tr td
 {
-  height: 16px;
-  padding: 2px;
-  padding-right: 4px;
+  height: 20px;
+  padding: 0;
   font-size: 11px;
   overflow: hidden;
+  vertical-align: middle;
   white-space: nowrap;
   text-overflow: ellipsis;
   -o-text-overflow: ellipsis;
@@ -721,75 +694,188 @@ body.messagelist
   cursor: inherit;
 }
 
-#messagelist tbody tr td.subject a
+#messagelist td span,
+#messagelist td img
 {
-  cursor: default;
+  vertical-align: middle;
+  display: inline-block;
 }
 
-#messagelist col
+#messagelist tbody tr td.flag,
+#messagelist tbody tr td.status,
+#messagelist tbody tr td.subject span.status
 {
-  display: table-column;
-  text-align: left;
-  vertical-align: middle;
+  cursor: pointer;
 }
 
-#messagelist thead tr td.icon,
-#messagelist thead tr td.flag
+#messagelist tr td.flag span,
+#messagelist tr td.status span,
+#messagelist tr td.attachment span
 {
-  width: 22px;
-  padding: 0;
-  text-align: center;
+  width: 15px;
 }
 
-#messagelist tbody tr td.icon,
-#messagelist tbody tr td.flag
+#messagelist tr td div.collapsed,
+#messagelist tr td div.expanded,
+#messagelist tr td.threads div.listmenu,
+#messagelist tr td.attachment span.attachment,
+#messagelist tr td.attachment span.report,
+#messagelist tr td.flag span.flagged,
+#messagelist tr td.flag span.unflagged:hover,
+#messagelist tr td.status span.status,
+#messagelist tr td.status span.msgicon,
+#messagelist tr td.status span.deleted,
+#messagelist tr td.status span.unread,
+#messagelist tr td.status span.unreadchildren,
+#messagelist tr td.subject span.msgicon,
+#messagelist tr td.subject span.deleted,
+#messagelist tr td.subject span.unread,
+#messagelist tr td.subject span.replied,
+#messagelist tr td.subject span.forwarded,
+#messagelist tr td.subject span.unreadchildren
 {
-  padding: 2px 3px 2px 3px;
   vertical-align: middle;
+  height: 17px;
+  width: 15px;
+  background: url(images/messageicons.png) center no-repeat;
+}
+
+#messagelist tr td.attachment span.attachment
+{
+  background-position: 0 -170px;
+}
+
+#messagelist tr td.attachment span.report
+{
+  background-position: 0 -255px;
+}
+
+#messagelist tr td.flag span.flagged
+{
+  background-position: 0 -153px;
+}
+
+#messagelist tr td.flag span.unflagged:hover
+{
+  background-position: 0 -136px;
+}
+
+#messagelist tr td.subject span.msgicon,
+#messagelist tr td.subject span.unreadchildren
+{
+  background-position: 0 -51px;
+  margin: 0 2px;
+}
+
+#messagelist tr td.subject span.replied
+{
+  background-position: 0 -85px;
+}
+
+#messagelist tr td.subject span.forwarded
+{
+  background-position: 0 -68px;
+}
+
+#messagelist tr td.subject span.replied.forwarded
+{
+  background-position: 0 -102px;
+}
+
+#messagelist tr td.status span.msgicon,
+#messagelist tr td.status span.unreadchildren
+{
+  background-position: 0 17px; /* no icon */
+}
+
+#messagelist tr td.status span.msgicon:hover
+{
+  background-position: 0 -272px;
+}
+
+#messagelist tr td.status span.deleted,
+#messagelist tr td.subject span.deleted
+{
+  background-position: 0 -187px;
+}
+
+#messagelist tr td.status span.status,
+#messagelist tr td.status span.unread,
+#messagelist tr td.subject span.unread
+{
+  background-position: 0 -119px;
+}
+
+#messagelist tr td div.collapsed
+{
+  background-position: 0 -221px;
   cursor: pointer;
 }
 
-#messagelist tbody tr td.flag img:hover,
-#messagelist thead tr td.flag img
+#messagelist tr td div.expanded
 {
-  background: url(images/icons/unflagged.png) center no-repeat;
+  background-position: 0 -204px;
+  cursor: pointer;
 }
 
-#messagelist tr td.subject
+#messagelist tr td.threads div.listmenu
+{
+  background-position: 0 -238px;
+  cursor: pointer;
+}
+
+#messagelist tbody tr td.subject
 {
-  overflow: hidden;
-  vertical-align: middle;
   width: 99%;
 }
 
-#messagelist tr td.size
+#messagelist tbody tr td.subject a
 {
-  width: 70px;
-  text-align: right;
+  cursor: default;
+  display: inline-block;
   vertical-align: middle;
 }
 
-#messagelist thead tr td.size
+/* thread parent message with unread children */
+#messagelist tbody tr.unroot td.subject a
 {
-  text-align: left;
+  text-decoration: underline;
+}
+
+#messagelist tr td.attachment,
+#messagelist tr td.threads,
+#messagelist tr td.status,
+#messagelist tr td.flag
+{
+  width: 17px;
+  padding: 0 0 0 2px;
+}
+
+#messagelist tr td.size
+{
+  width: 60px;
+  text-align: right;
+  padding: 0 2px;
 }
 
 #messagelist tr td.from,
-#messagelist tr td.to
+#messagelist tr td.to,
+#messagelist tr td.cc,
+#messagelist tr td.replyto
 {
   width: 180px;
-  vertical-align: middle;
+  padding: 0 2px;
 }
 
 #messagelist tr td.date
 {
   width: 118px;
-  vertical-align: middle;
+  padding: 0 2px;
 }
 
 #messagelist tr.message
 {
-  background-color: #FFFFFF;
+  background-color: #FFF;
 }
 
 /*
@@ -839,31 +925,70 @@ body.messagelist
   color: #CCCCCC;
 }
 
-.quota_text {
+#listmenu
+{
+  padding: 6px;
+}
+
+#listmenu legend
+{
+  color: #999999;
+}
+
+#listmenu fieldset
+{
+  border: 1px solid #999999;
+  margin: 0 5px;
+  float: left;
+}
+
+#listmenu div
+{
+  padding: 8px 0 3px 0;
   text-align: center;
-  font-size: 10px;
-  color: #666;
-  border: 1px solid #999;
-  cursor: default;
+  clear: both;
+}
+
+/***** tree indicators *****/
+
+td span.branch div
+{
+  float: left;
+  height: 16px;
 }
-.quota_bg { background-color: white; }
-.quota_high { background-color: #F33131; }
-.quota_mid { background-color: #F5AD3C; }
-.quota_low { background-color: #91E164; }
-.quota_text_high { color: white; }
-.quota_text_mid { color: #666; }
-.quota_text_low { color: #666; }
-         
+
+td span.branch div.tree
+{
+  height: 17px;
+  width: 15px;
+  background: url(images/tree.gif) 0px 0px no-repeat;
+}
+
+td span.branch div.l1
+{
+  background-position: 0px 0px; /* L */
+}
+
+td span.branch div.l2
+{
+  background-position: -30px 0px; /* | */
+}
+
+td span.branch div.l3
+{
+  background-position: -15px 0px; /* |- */
+}
+
 
 /** message view styles */
 
 #messageframe
 {
   position: absolute;
-  top: 0px;
+  top: 0;
   left: 180px;
-  right: 0px;
-  bottom: 20px;
+  right: 0;
+  bottom: 0;
   border: 1px solid #999;
   background-color: #FFF;
   overflow: auto;
@@ -880,7 +1005,6 @@ table.headers-table
 {
   width: 100%;
   background-color: #EBEBEB;
-  table-layout: fixed;
 }
 
 #messagebody table.headers-table
@@ -902,19 +1026,23 @@ table.headers-table tr td
   border-bottom:1px solid #FFFFFF;
 }
 
-table.headers-table td.header-title
+table.headers-table tr td.header-title
 {
-  width: 80px;
+  width: 1%;
   color: #666666;
   font-weight: bold;
   text-align: right;
   white-space: nowrap;
-  padding-right: 4px;
+  padding: 0 4px;
+}
+
+table.headers-table tr td.header
+{
+  width: 99%;
 }
 
 table.headers-table tr td.subject
 {
-  width: 90%;
   font-weight: bold;
 }
 
@@ -939,12 +1067,12 @@ table.headers-table tr td.more-headers
 
 #attachment-list
 {
-  margin: 0px;
-  padding: 0px 0px 0px 72px;
+  margin: 0;
+  padding: 0 4px 0 8px;
   min-height: 16px;
   list-style-image: none;
   list-style-type: none;
-  background: url(images/icons/attachment.png) 60px 2px no-repeat #DFDFDF;
+  background: url(images/icons/attachment.png) 4px 2px no-repeat #DFDFDF;
 }
 
 #attachment-list:after
@@ -983,7 +1111,8 @@ table.headers-table tr td.more-headers
   background-color: #FFFFFF;
 }
 
-div.message-part
+div.message-part,
+div.message-htmlpart
 {
   padding: 10px 8px;
   border-top: 1px solid #ccc;
@@ -1081,49 +1210,83 @@ div.message-htmlpart div.rcmBody
   border: 0;
 }
 
-/** message compose styles */
+td.show-headers
+{
+  background: url(images/icons/down_small.gif) no-repeat center;
+}
 
-#compose-toolbar
+td.hide-headers
 {
-  white-space: nowrap;
+  background: url(images/icons/up_small.gif) no-repeat center;
 }
 
-#priority-selector,
-#receipt-selector
+#all-headers
 {
-  padding-left: 30px;
+  height: 150px;
+  display: none;
+}
+
+#headers-source
+{
+  margin: 0 5px;
+  padding: 0.5em;
+  height: 145px;
+  background: white;
+  overflow: auto;
+  font-size: 11px;
   white-space: nowrap;
+  border: 1px solid #999999;
+  display: none;
+  text-align: left;
+  color: #333;
 }
 
+
+/** message compose styles */
+
 #compose-container
 {
   position: absolute;
-  top: 90px;
-  left: 205px;
-  right: 25px;
-  bottom: 30px;
-  margin: 0px;
+  top: 0;
+  left: 185px;
+  right: 0;
+  bottom: 0;
+  margin: 0;
 }
 
-#spellcheck-control
+#compose-div
 {
-  text-align: right;
-  padding-top: 3px;
+  position: absolute;
+  top: 85px;
+  bottom: 0;
+  margin: 0;
+  width: 100%;
 }
 
-#editor-select
+#compose-div .boxfooter
 {
-  float: left;
+  height: 22px;
+  background: none;
+  border-top: 0;
 }
 
-#compose-div
+#compose-div .boxlistcontent
+{
+  bottom: 23px;
+}
+
+#compose-body
 {
   position: absolute;
-  top: 130px;
-  bottom: 30px;
-  width: 100%;
-  vertical-align: top;
-  padding-top: 2px;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  margin: 0;
+  font-size: 9pt;
+  font-family: monospace;
+  border: 1px solid #999;
+  resize: none;
 }
 
 #compose-headers
@@ -1131,6 +1294,12 @@ div.message-htmlpart div.rcmBody
   width: 100%;
 }
 
+#compose-headers td.editfield
+{
+  padding-right: 8px;
+  width: 95%;
+}
+
 #compose-headers td.top
 {
   vertical-align: top;
@@ -1140,54 +1309,92 @@ div.message-htmlpart div.rcmBody
 #compose-subject td.title
 {
   width: 80px !important;
-  color: #666666;
   font-size: 11px;
   font-weight: bold;
   padding-right: 10px;
   white-space: nowrap;
+  color: #666;
 }
 
-#compose-body,
 #compose-headers td textarea,
 #compose-headers td input
 {
+  resize: none;
   width: 100%;
+  border: 1px solid #999;
 }
 
 #compose-headers td textarea
 {
-  height: 38px;
+  height: 32px;
+}
+
+input.from_address
+{
+  width: 80% !important;
 }
 
 #compose-cc,
 #compose-bcc,
-#compose-replyto
+#compose-replyto,
+#compose-followupto
 {
   display: none;
 }
 
-#compose-body
+.formlinks a,
+.formlinks a:visited
 {
-  min-height: 100px;
-  height: 100%;
-  font-size: 9pt;
-  font-family: "Courier New", Courier, monospace;
+  color: #999999;
+  font-size: 11px;
+  text-decoration: none;
+}
+
+.formlinks a,
+.formlinks a:visited
+{
+  color: #CC0000;
+}
+
+#compose-editorfooter
+{
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  text-align: right;
+}
+
+#compose-editorfooter label
+{
+  font-size: 11px;
+  font-weight: bold;
+  color: #666;
+}
+
+#compose-buttons
+{
+  position: absolute;
+  left: 0;
+  bottom: 0;
+  width: auto;
 }
 
 #compose-attachments
 {
   position: absolute;
-  top: 100px;
-  left: 20px;
+  top: 0;
+  left: 0;
+  bottom: 0;
   width: 175px;
+  border: 1px solid #999;
+  background-color: #F9F9F9;
 }
 
 #compose-attachments ul
 {
   margin: 0px;
   padding: 0px;
-  border: 1px solid #CCCCCC;
-  background-color: #F9F9F9;
+  background-color: #FFF;
   list-style-image: none;
   list-style-type: none;
 }
@@ -1202,6 +1409,8 @@ div.message-htmlpart div.rcmBody
   border-bottom: 1px solid #EBEBEB;
   white-space: nowrap;
   overflow: hidden;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
 }
 
 #compose-attachments ul li img
@@ -1210,26 +1419,9 @@ div.message-htmlpart div.rcmBody
   vertical-align: middle;
 }
 
-#attachment-title
-{
-  color: #666666;
-  font-weight: bold;
-  font-size: 11px;
-  background: url(images/icons/attachment.png) top left no-repeat;
-  padding: 0px 0px 3px 18px;
-  margin-left: 3px;
-}
-
 #attachment-form
 {
-  position: absolute;
-  top: 150px;
-  left: 20px;
-  z-index: 200;
   padding: 6px;
-  visibility: hidden;
-  border: 1px solid #CCCCCC;
-  background-color: #F9F9F9;
 }
 
 #attachment-form div
@@ -1242,38 +1434,18 @@ div.message-htmlpart div.rcmBody
   margin-top: 4px;
 }
 
-td.show-headers
-{
-  background: url(images/icons/down_small.gif) no-repeat center;
-}
-
-td.hide-headers
+#quota
 {
-  background: url(images/icons/up_small.gif) no-repeat center;
-}
-
-#all-headers
-{
-  height: 150px;
-  display: none;
-}
-
-#headers-source
-{
-  margin: 0 5px;
-  padding: 0.5em;
-  height: 145px;
-  background: white;
-  overflow: auto;
-  font-size: 11px;
-  white-space: nowrap;
-  border: 1px solid #999999;
-  display: none;
-  text-align: left;
-  color: #333;
+  position: absolute;
+  top: 3px;
+  right: 8px;
+  width: 100px;
 }
 
-font.bold
+#quotaimg
 {
-  font-weight: bold;
+  position: absolute;
+  top: 3px;
+  right: 6px;
+  z-index: 101;
 }
index 54ee968903e61001837cfcb184dd11a16f0f0d0b..fb5f1c8d4e80bd33ec0d6719af40857f975cc5c7 100644 (file)
@@ -1,74 +1,84 @@
-<public:component>
+<public:component lightWeight="true">
 <public:attach event="onpropertychange" onevent="propertyChanged()" />
-<public:attach event="onbeforeprint" for="window" onevent="beforePrint()" />
-<public:attach event="onafterprint" for="window" onevent="afterPrint()" />
+<public:attach event="onbeforeprint" onevent="beforePrint()" for="window"/>
+<public:attach event="onafterprint" onevent="afterPrint()" for="window"/>
 <script>
 
 /*
  * PNG Behavior
  *
- * This script was created by Erik Arvidsson (erik(at)eae.net)
+ * This script was created by Erik Arvidsson (http://webfx.eae.net/contact.html#erik)
  * for WebFX (http://webfx.eae.net)
- * Copyright 2002
- * 
- * For usage see license at http://webfx.eae.net/license.html  
+ * Copyright 2002-2004
  *
- * Version: 1.01a
+ * For usage see license at http://webfx.eae.net/license.html
+ *
+ * Version: 1.02
+ * Created: 2001-??-?? First working version
+ * Updated: 2002-03-28 Fixed issue when starting with a non png image and
+ *                      switching between non png images
+ *          2003-01-06 Fixed RegExp to correctly work with IE 5.0x
+ *          2004-05-09  When printing revert to original
  *
  */
-var IS_PNG = /\.png$/i;
-var supported = /MSIE ((5\.5)|6)/.test(navigator.userAgent) && navigator.platform == 'Win32';
-var realSrc, realHeight, realWidth;
-var blankSrc = 'skins/default/images/blank.gif';
+
+var supported = /MSIE ((5\.5)|6)/.test(navigator.userAgent) && navigator.platform == "Win32",
+  realSrc,
+  blankSrc = "skins/default/images/blank.gif",
+  isPrinting = false;
+
 if (supported) fixImage();
+
 function propertyChanged() {
-  if (supported && event.propertyName == 'src') {
-    var i = element.src.lastIndexOf(blankSrc);
-    if (i == -1 || i != element.src.length - blankSrc.length) {
-      fixImage();
-    }
-  }
-}
+       if (!supported || isPrinting) return;
+
+       var pName = event.propertyName;
+       if (pName != "src") return;
+       // if not set to blank
+       if (!new RegExp(blankSrc).test(src))
+               fixImage();
+};
+
 function fixImage() {
-  if (realSrc && element.src == realSrc) {
-    // this is an attempt to set the image to itself!
-    // pointless - leave the filter as-is, restore the blank image
-    element.src = blankSrc;
-  } else {
-    // set the image to something different
-    if (IS_PNG.test(element.src)) {
-      // fixable PNG
-      realSrc = element.src;
-      realWidth = element.width;
-      realHeight = element.height;
-      element.src = blankSrc;
-      element.style.width = realWidth + 'px';
-      element.style.height = realHeight + 'px';
-      element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + encodeURI(realSrc) + "',sizingMethod='scale')";
-    } else {
-      // ordinary image - make sure the fix is removed
-      if (realSrc) {
-        realSrc = null;
-        element.runtimeStyle.filter = '';
-      }
-    }
-  }
+       // get src
+       var src = element.src;
+
+       // check for real change
+       if (src == realSrc && /\.png$/i.test(src)) {
+               element.src = blankSrc;
+               return;
+       }
+
+       if ( ! new RegExp(blankSrc).test(src)) {
+               // backup old src
+               realSrc = src;
+       }
+
+       // test for png
+       if (/\.png$/i.test(realSrc)) {
+               // set blank image
+               element.src = blankSrc;
+               // set filter
+               element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft." +
+                                       "AlphaImageLoader(src='" + src + "',sizingMethod='scale')";
+       }
+       else {
+               // remove filter
+               element.runtimeStyle.filter = "";
+       }
 }
+
 function beforePrint() {
-  if (realSrc) {
-    supported = false;
-    element.src = realSrc;
-    element.runtimeStyle.filter = '';
-    supported = true;
-  }
+       isPrinting = true;
+       element.src = realSrc;
+       element.runtimeStyle.filter = "";
+       realSrc = null;
 }
+
 function afterPrint() {
-  if (realSrc) {
-    var rs = realSrc;
-    realSrc = null;
-    element.src = rs;
-  }
+       isPrinting = false;
+       fixImage();
 }
+
 </script>
 </public:component>
index dada599cd949ca59b5269b0ad7002d9e3357f6f1..76c3e0c9159a5dbc42272a8fbedfc1979b0e1f48 100644 (file)
@@ -1,4 +1,4 @@
-/***** RoundCube|Mail message print styles *****/
+/***** Roundcube|Mail message print styles *****/
 
 body
 {
@@ -114,24 +114,24 @@ div.message-part div.pre
 
 div.message-part blockquote
 {
-       color: blue;
-       border-left: 2px solid blue;
-       border-right: 2px solid blue;
-       background-color: #F6F6F6;
-       margin: 0.5em 0em 0.5em 0em;
-       padding: 0.25em 1em 0.25em 1em;
+  color: blue;
+  border-left: 2px solid blue;
+  border-right: 2px solid blue;
+  background-color: #F6F6F6;
+  margin: 0.5em 0em 0.5em 0em;
+  padding: 0.25em 1em 0.25em 1em;
 }
 
 div.message-part blockquote blockquote
 {
-       color: green;
-       border-left: 2px solid green;
-       border-right: 2px solid green;
+  color: green;
+  border-left: 2px solid green;
+  border-right: 2px solid green;
 }
 
 div.message-part blockquote blockquote blockquote
 {
-       color: #990000;
-       border-left: 2px solid #bb0000;
-       border-right: 2px solid #bb0000;
+  color: #990000;
+  border-left: 2px solid #bb0000;
+  border-right: 2px solid #bb0000;
 }
index 942cf256bf4b46a786b252e9b7e228e0a6554bce..a1be85ab4909b6df020ff6d79bdf42a78a834447 100644 (file)
@@ -14,3 +14,9 @@ div.message-part div.pre
 {
   word-wrap: break-word;
 }
+
+#messagelist thead tr td,
+#messagelist tbody tr td
+{
+  height: 18px;
+}
index b08a85fa07eb6c9b7e3ab966f7be8e7b26089c94..5624f80e3492891a80b1c2fdffc7fb3564a70edd 100644 (file)
-/***** RoundCube|Mail settings task styles *****/
-
-
-#tabsbar
-{
-  position: absolute;
-  top: 50px;
-  left: 220px;
-  right: 20px;
-  height: 22px;
-  border-bottom: 1px solid #999999;
-  white-space: nowrap;
-}
-
-span.tablink,
-span.tablink-selected
-{
-  float: left;
-  width: 100px;
-  height: 24px !important;
-  height: 22px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  background: url('images/tabs.gif') top left no-repeat;
-}
-
-span.tablink-selected
-{
-  background-position: -102px 0;
-}
-
-span.tablink a,
-span.tablink-selected a
-{
-  display: block;
-  padding-left: 10px;
-  padding-top: 5px;
-  color: #555555;
-  text-decoration: none;
-}
-
-span.tablink-selected a
-{
-  color: #000000;
-  cursor: default;
-}
+/***** Roundcube|Mail settings task styles *****/
 
 #rcmfd_timezone
 {
   width: 300px;
 }
 
-#identities-list,
-#folder-manager
-{
-  position: absolute;
-  top: 95px;
-  left: 20px;
-  overflow: auto;
-}
-
-#folder-manager
-{
-  width: 600px;
-  bottom: 140px;
-  overflow: auto;
-  border: 1px solid #999999;
-}
-
 #folder-manager.droptarget
 {
   border: 1px solid #CC3333;
   background-color: #FFFFA6;
 }
 
-#identities-list
-{
-  bottom: 60px;
-  width: 420px;
-  border: 1px solid #999999;
-}
-
-#listbuttons
-{
-  position: absolute;
-  left: 20px;
-  bottom: 18px;
-}
-
-#identities-table
-{
-  width: 420px;
-  table-layout: fixed;
-  background-color: #F9F9F9;
-}
-
-#subscription-table
+#identities-table,
+#subscription-table,
+#sections-table
 {
   width: 100%;
+  table-layout: fixed;
 }
 
 #subscription-table input
@@ -105,26 +25,12 @@ span.tablink-selected a
 }
 
 #subscription-table tbody td,
-#identities-table tbody td
+#identities-table tbody td,
+#sections-table tbody td
 {
   cursor: default;
-  overflow: hidden;
   text-overflow: ellipsis;
-}
-
-#identities-table thead td.name
-{
-  width: 55%;
-}
-
-#identities-table thead td.email
-{
-  width: 45%;
-}
-
-#subscription-table tbody td
-{
-  height: 22px !important;
+  -o-text-overflow: ellipsis;
   height: 18px;
 }
 
@@ -133,51 +39,26 @@ span.tablink-selected a
   color: #666;
 }
 
-#subscription-table tr.selected td,
-#subscription-table tr.selected td a
+#subscription-table tr.selected td
 {
   color: #FFFFFF;
   background-color: #CC3333;
 }
 
-#subscription-table tr.droptarget td,
-#subscription-table tr.droptarget td a
+#subscription-table tr.droptarget td
 {
   background-color: #FFFFA6;
 }
 
-#subscription-table thead td.name
-{
-  width: 360px;
-}
-
-#subscription-table thead td.msgcount
-{
-  width: 90px;
-}
-
-#subscription-table thead td.subscribed
-{
-  width: 90px;
-}
-
-#subscription-table tbody td.subscribed,
-#subscription-table tbody td.rename,
-#subscription-table tbody td.delete
-{
-  padding: 1px 4px;
-}
-
-#subscription-table thead td.rename,
-#subscription-table thead td.delete
+#subscription-table td.name
 {
-  width: 30px;
+  width: auto;
 }
 
-#subscription-table td.name input
+#subscription-table td.subscribed
 {
-  font: inherit;
-  width: 240px;
+  text-align: right;
+  padding-right: 12px;
 }
 
 #identity-frame
@@ -187,18 +68,21 @@ span.tablink-selected a
   border: 1px solid #999999;
 }
 
-#identity-details
+#identity-details,
+#folder-box,
+#prefs-box
 {
   position: absolute;
-  top: 95px;
-  left: 450px;
-  right: 20px;
-  bottom: 60px;
+  top: 0;
+  right: 0;
+  bottom: 0;
   border: 1px solid #999999;
   overflow: auto;
+  background-color: #F2F2F2;
 }
 
-#identity-details table td.title
+#identity-details table td.title,
+#folder-details table td.title
 {
   font-weight: bold;
   text-align: right;
@@ -213,75 +97,29 @@ input.disabled
 {
   position: absolute;
   width: 600px;
-  height: 120px;
-  left: 20px;
-  bottom: 20px;
-}
-
-div.settingsbox
-{
-  width: 600px;
-  margin-top: 20px;
-  border: 1px solid #999999;
-}
-
-fieldset 
-{
-  margin-bottom: 0.5em;
-  border: 1px solid #999999;
-  padding: 4px 8px 9px 8px; 
-}
-
-legend
-{
-  color: #999999;
-}
-
-#prefsscreen
-{
-  position: absolute;
-  top: 95px;
-  right: 20px;
-  bottom: 30px;
-  left: 20px;
+  height: 95px;
+  left: 0;
+  bottom: 0;
 }
 
+#identities-list,
+#folder-manager,
 #sectionslist
 {
   position: absolute;
-  top: 0px;
-  left: 0px;
-  bottom: 0px;
+  top: 0;
+  left: 0;
+  bottom: 0;
   border: 1px solid #999999;
   background-color: #F9F9F9;
-  overflow: auto;
-}
-
-#sections-table
-{
-  width: 100%;
-  table-layout: fixed;
-}
-
-#sections-table tbody td
-{
-  cursor: default;
-}
-
-#prefs-box
-{
-  position: absolute;
-  top: 0px;
-  right: 0px;
-  bottom: 0px;
-  border: 1px solid #999999;
   overflow: hidden;
 }
 
 body.iframe,
-#prefs-frame
+#prefs-frame,
+#folder-frame
 {
-  background-color: #F9F9F9;
+  background-color: #F2F2F2;
   border: none;
 }
 
@@ -304,3 +142,24 @@ body.iframe,
   text-align: right;
   float: right;
 }
+
+#quota
+{
+  position: absolute;
+  top: 3px;
+  right: 8px;
+  width: 100px;
+}
+
+#quotaimg
+{
+  position: absolute;
+  top: 3px;
+  right: 6px;
+  z-index: 101;
+}
+
+#rcmfd_signature
+{
+  font-family: monospace;
+}
index b9318c0afb2e7cfb62bce8bd3552f842c75abfb7..e11f9fea5855c2698fe0ff93b0863533abfe24aa 100644 (file)
@@ -1,11 +1,11 @@
 
 /**
- * RoundCube splitter GUI class
+ * Roundcube splitter GUI class
  *
  * @constructor
  */
 function rcube_splitter(attrib)
-  {
+{
   this.p1id = attrib.p1;
   this.p2id = attrib.p2;
   this.id = attrib.id ? attrib.id : this.p1id + '_' + this.p2id + '_splitter';
@@ -17,26 +17,24 @@ function rcube_splitter(attrib)
   this.drag_active = false;
 
   this.init = function()
-    {
+  {
     this.p1 = document.getElementById(this.p1id);
     this.p2 = document.getElementById(this.p2id);
 
     // create and position the handle for this splitter
     this.p1pos = this.relative ? $(this.p1).position() : $(this.p1).offset();
     this.p2pos = this.relative ? $(this.p2).position() : $(this.p2).offset();
-    
-    if (this.horizontal)
-      {
+
+    if (this.horizontal) {
       var top = this.p1pos.top + this.p1.offsetHeight;
       this.layer = new rcube_layer(this.id, {x: 0, y: top, height: 10, 
            width: '100%', vis: 1, parent: this.p1.parentNode});
-      }
-    else
-      {
+    }
+    else {
       var left = this.p1pos.left + this.p1.offsetWidth;
       this.layer = new rcube_layer(this.id, {x: left, y: 0, width: 10, 
            height: '100%', vis: 1,  parent: this.p1.parentNode});
-      }
+    }
 
     this.elm = this.layer.elm;
     this.elm.className = 'splitter '+(this.horizontal ? 'splitter-h' : 'splitter-v');
@@ -49,53 +47,52 @@ function rcube_splitter(attrib)
 
     // read saved position from cookie
     var cookie = bw.get_cookie(this.id);
-    if (cookie && !isNaN(cookie))
-      {
+    if (cookie && !isNaN(cookie)) {
       this.pos = parseFloat(cookie);
       this.resize();
-      }
-    else if (this.pos)
-      {
+    }
+    else if (this.pos) {
       this.resize();
       this.set_cookie();
-      }
-    };
+    }
+  };
 
   /**
    * Set size and position of all DOM objects
    * according to the saved splitter position
    */
   this.resize = function()
-    {
-    if (this.horizontal)
-      {
+  {
+    if (this.horizontal) {
       var lh = this.layer.height - this.offset * 2;
       this.p1.style.height = Math.floor(this.pos - this.p1pos.top - lh / 2) + 'px';
       this.p2.style.top = Math.ceil(this.pos + lh / 2) + 'px';
       this.layer.move(this.layer.x, Math.round(this.pos - lh / 2 + 1));
-      if (bw.ie)
-        {
-        var new_height = (parseInt(this.p2.parentNode.offsetHeight) - parseInt(this.p2.style.top) - (bw.ie8 ? 2 : 0));
-        this.p2.style.height = (new_height > 0 ? new_height : 0) +'px';
-        }
+      if (bw.ie) {
+        var new_height = parseInt(this.p2.parentNode.offsetHeight, 10) - parseInt(this.p2.style.top, 10) - (bw.ie8 ? 2 : 0);
+        this.p2.style.height = (new_height > 0 ? new_height : 0) + 'px';
       }
-    else
-      {
+    }
+    else {
       this.p1.style.width = Math.floor(this.pos - this.p1pos.left - this.layer.width / 2) + 'px';
       this.p2.style.left = Math.ceil(this.pos + this.layer.width / 2) + 'px';
       this.layer.move(Math.round(this.pos - this.layer.width / 2 + 1), this.layer.y);
-      if (bw.ie)
-        this.p2.style.width = (parseInt(this.p2.parentNode.offsetWidth) - parseInt(this.p2.style.left))+'px';
+      if (bw.ie) {
+        var new_width = parseInt(this.p2.parentNode.offsetWidth, 10) - parseInt(this.p2.style.left, 10) ;
+        this.p2.style.width = (new_width > 0 ? new_width : 0) + 'px';
       }
-    };
+    }
+    $(this.p2).resize();
+    $(this.p1).resize();
+  };
 
   /**
    * Handler for mousedown events
    */
   this.onDragStart = function(e)
-    {
+  {
     // disable text selection while dragging the splitter
-    if (window.webkit || bw.safari)
+    if (bw.konq || bw.chrome || bw.safari)
       document.body.style.webkitUserSelect = 'none';
 
     this.p1pos = this.relative ? $(this.p1).position() : $(this.p1).offset();
@@ -106,83 +103,59 @@ function rcube_splitter(attrib)
     rcube_event.add_listener({element:document, event:'mousemove', object:this, method:'onDrag'});
     rcube_event.add_listener({element:document, event:'mouseup', object:this, method:'onDragStop'});
 
-    // need to listen in any iframe documents too, b/c otherwise the splitter stops moving when we move over an iframe
-    var iframes = document.getElementsByTagName('iframe');
-    this.iframe_events = Object();
-    for (var n in iframes)
-      {
-      var iframedoc = null;
-      if (iframes[n].contentDocument)
-        iframedoc = iframes[n].contentDocument;
-      else if (iframes[n].contentWindow)
-        iframedoc = iframes[n].contentWindow.document;
-      else if (iframes[n].document)
-        iframedoc = iframes[n].document;
-      if (iframedoc)
-        {
-        // I don't use the add_listener function for this one because I need to create closures to fetch
-        // the position of each iframe when the event is received
-        var s = this;
-        var id = '#'+iframes[n].id;
-        this.iframe_events[n] = function(e){ e._offset = $(id).offset(); return s.onDrag(e); }
-
-        if (iframedoc.addEventListener)
-          iframedoc.addEventListener('mousemove', this.iframe_events[n], false);
-        else if (iframes[n].attachEvent)
-          iframedoc.attachEvent('onmousemove', this.iframe_events[n]);
-        else
-          iframedoc['onmousemove'] = this.iframe_events[n];
-
-        rcube_event.add_listener({element:iframedoc, event:'mouseup', object:this, method:'onDragStop'});
-        }
-      }
-    }
+    // enable dragging above iframes
+    $('iframe').each(function() {
+      $('<div class="iframe-splitter-fix"></div>')
+        .css({background: '#fff',
+          width: this.offsetWidth+'px', height: this.offsetHeight+'px',
+          position: 'absolute', opacity: '0.001', zIndex: 1000
+        })
+        .css($(this).offset())
+        .appendTo('body');
+      });
+  };
 
   /**
    * Handler for mousemove events
    */
   this.onDrag = function(e)
-    {
-    if (!this.drag_active) return false;
+  {
+    if (!this.drag_active)
+      return false;
 
     var pos = rcube_event.get_mouse_pos(e);
 
-    if (this.relative)
-      {
+    if (this.relative) {
       var parent = $(this.p1.parentNode).offset();
       pos.x -= parent.left;
       pos.y -= parent.top;
-      }
+    }
 
-    if (this.horizontal)
-      {
-      if (((pos.y - this.layer.height * 1.5) > this.p1pos.top) && ((pos.y + this.layer.height * 1.5) < (this.p2pos.top + this.p2.offsetHeight)))
-        {
+    if (this.horizontal) {
+      if (((pos.y - this.layer.height * 1.5) > this.p1pos.top) && ((pos.y + this.layer.height * 1.5) < (this.p2pos.top + this.p2.offsetHeight))) {
         this.pos = pos.y;
         this.resize();
-        }
       }
-    else
-      {
-      if (((pos.x - this.layer.width * 1.5) > this.p1pos.left) && ((pos.x + this.layer.width * 1.5) < (this.p2pos.left + this.p2.offsetWidth)))
-        {
+    }
+    else {
+      if (((pos.x - this.layer.width * 1.5) > this.p1pos.left) && ((pos.x + this.layer.width * 1.5) < (this.p2pos.left + this.p2.offsetWidth))) {
         this.pos = pos.x;
         this.resize();
-        }
       }
+    }
 
     this.p1pos = this.relative ? $(this.p1).position() : $(this.p1).offset();
     this.p2pos = this.relative ? $(this.p2).position() : $(this.p2).offset();
     return false;
-    };
+  };
 
   /**
    * Handler for mouseup events
    */
   this.onDragStop = function(e)
-    {
+  {
     // resume the ability to highlight text
-    if(window.webkit || bw.safari)
+    if (bw.konq || bw.chrome || bw.safari)
       document.body.style.webkitUserSelect = 'auto';
 
     // cancel the listening for drag events
@@ -190,57 +163,37 @@ function rcube_splitter(attrib)
     rcube_event.remove_listener({element:document, event:'mouseup', object:this, method:'onDragStop'});
     this.drag_active = false;
 
-    var iframes = document.getElementsByTagName('iframe');
-
-    for (var n in iframes)
-      {
-      var iframedoc;
-      if (iframes[n].contentDocument)
-        iframedoc = iframes[n].contentDocument;
-      else if (iframes[n].contentWindow)
-        iframedoc = iframes[n].contentWindow.document;
-      else if (iframes[n].document)
-        iframedoc = iframes[n].document;
-      if (iframedoc)
-        {
-        if (this.iframe_events[n]) {
-          if (iframedoc.removeEventListener)
-            iframedoc.removeEventListener('mousemove', this.iframe_events[n], false);
-          else if (iframedoc.detachEvent)
-            iframedoc.detachEvent('onmousemove', this.iframe_events[n]);
-          else
-            iframedoc['onmousemove'] = null;
-          }
-
-        rcube_event.remove_listener({element:iframedoc, event:'mouseup', object:this, method:'onDragStop'});
-        }
-      }
+    // remove temp divs
+    $('div.iframe-splitter-fix').each(function() { this.parentNode.removeChild(this); });
 
     this.set_cookie();
 
     return bw.safari ? true : rcube_event.cancel(e);
-    };
+  };
 
   /**
    * Handler for window resize events
    */
   this.onResize = function(e)
-    {
-    if (this.horizontal)
-      {
-      var new_height = (parseInt(this.p2.parentNode.offsetHeight) - parseInt(this.p2.style.top) - (bw.ie8 ? 2 : 0));
+  {
+    if (this.horizontal) {
+      var new_height = parseInt(this.p2.parentNode.offsetHeight, 10) - parseInt(this.p2.style.top, 10) - (bw.ie8 ? 2 : 0);
       this.p2.style.height = (new_height > 0 ? new_height : 0) +'px';
-      }
-    else
-      this.p2.style.width = (parseInt(this.p2.parentNode.offsetWidth) - parseInt(this.p2.style.left))+'px';
-    };
+    }
+    else {
+      var new_width = parseInt(this.p2.parentNode.offsetWidth, 10) - parseInt(this.p2.style.left, 10);
+      this.p2.style.width = (new_width > 0 ? new_width : 0) + 'px';
+    }
+  };
 
+  /**
+   * Saves splitter position in cookie
+   */
   this.set_cookie = function()
-    {
-    // save state in cookie
+  {
     var exp = new Date();
     exp.setYear(exp.getFullYear() + 1);
     bw.set_cookie(this.id, this.pos, exp);
-    }
+  };
 
-  }  // end class rcube_splitter
+} // end class rcube_splitter
diff --git a/skins/default/templates/addcontact.html b/skins/default/templates/addcontact.html
deleted file mode 100644 (file)
index 08f5ca2..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title><roundcube:object name="pagetitle" /></title>
-<roundcube:include file="/includes/links.html" />
-</head>
-<body class="iframe">
-
-<div id="contact-title" class="boxtitle"><roundcube:label name="addcontact" /></div>
-
-<div id="contact-details" class="boxcontent">
-<roundcube:object name="contacteditform" size="40" />
-
-<p><br />
-<input type="button" value="<roundcube:label name="cancel" />" class="button" onclick="history.back()" />&nbsp;
-<roundcube:button command="save" type="input" class="button mainaction" label="save" />
-</p>
-
-</form>
-</div>
-
-</body>
-</html>
index 28bfb86378d5fb38db98dbd3d5bf69b58291b4c9..668b309a75f81e572510a9025147b6050bd5ee0c 100644 (file)
@@ -4,33 +4,22 @@
 <title><roundcube:object name="pagetitle" /></title>
 <roundcube:include file="/includes/links.html" />
 <script type="text/javascript" src="/splitter.js"></script>
-
+<script type="text/javascript" src="/functions.js"></script>
 <style type="text/css">
-<roundcube:if condition="count(env:address_sources) &lt;= 1" />
-#abookcountbar { left: 20px; }
-#addressscreen { left: 20px; 
-<roundcube:exp expression="browser:ie ? 'width:expression((parseInt(document.documentElement.clientWidth)-40)+\\'px\\');' : ''" />
-}
 #addresslist { width: <roundcube:exp expression="!empty(cookie:addressviewsplitter) ? cookie:addressviewsplitter-5 : 245" />px; }
 #contacts-box { left: <roundcube:exp expression="!empty(cookie:addressviewsplitter) ? cookie:addressviewsplitter+5 : 255" />px;
-<roundcube:exp expression="browser:ie ? ('width:expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:addressviewsplitter) ? cookie:addressviewsplitter+5 : 255).')+\\'px\\');') : ''" />
+       <roundcube:exp expression="browser:ie ? ('width:expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:addressviewsplitter) ? cookie:addressviewsplitter+5 : 255).')+\\'px\\');') : ''" />
 }
-<roundcube:else />
-#addresslist { width: <roundcube:exp expression="!empty(cookie:addressviewsplitter) ? cookie:addressviewsplitter-5 : 245" />px; }
-#contacts-box { left: <roundcube:exp expression="!empty(cookie:addressviewsplitter) ? cookie:addressviewsplitter+5 : 255" />px;
-<roundcube:exp expression="browser:ie ? ('width:expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:addressviewsplitter) ? cookie:addressviewsplitter+5 : 255).')+\\'px\\');') : ''" />
-}
-<roundcube:endif />
 </style>
 
 </head>
-<body>
+<body onload="rcube_init_mail_ui()">
 
 <roundcube:include file="/includes/taskbar.html" />
 <roundcube:include file="/includes/header.html" />
 
 <div id="abooktoolbar">
-<roundcube:button command="add" type="link" class="button addcontact" classAct="button addcontact" classSel="button addcontactSel" title="newcontact" content=" " />
+<roundcube:button command="add" type="link" class="buttonPas addcontact" classAct="button addcontact" classSel="button addcontactSel" title="newcontact" content=" " />
 <roundcube:button command="compose" type="link" class="buttonPas compose" classAct="button compose" classSel="button composeSel" title="composeto" content=" " />
 <roundcube:button command="delete" type="link" class="buttonPas delete" classAct="button delete" classSel="button deleteSel" title="deletecontact" content=" " />
 <span class="separator">&nbsp;</span>
 </div>
 
 <div id="quicksearchbar">
-<roundcube:button name="searchmod" id="searchmod" image="/images/icons/glass.png" />
+<roundcube:button name="searchmenulink" id="searchmenulink" image="/images/icons/glass.png" />
 <roundcube:object name="searchform" id="quicksearchbox" />
 <roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" />
 </div>
 
-<roundcube:if condition="count(env:address_sources) &gt; 1" />
-<div id="directorylist">
-<div id="groups-title" class="boxtitle"><roundcube:label name="groups" /></div>
-<roundcube:object name="directorylist" id="directories-list" />
+<div id="directorylistbox">
+<div id="directorylist-title" class="boxtitle"><roundcube:label name="groups" /></div>
+<div class="boxlistcontent">
+  <roundcube:object name="directorylist" id="directorylist" />
+  <roundcube:object name="groupslist" id="contactgroupslist" />
+</div>
+<div class="boxfooter">
+  <roundcube:button command="group-create" type="link" title="newcontactgroup" class="buttonPas addgroup" classAct="button addgroup" content=" " />
+  <roundcube:button name="groupmenulink" id="groupmenulink" type="link" title="groupactions" class="button groupactions" onclick="rcmail_ui.show_popup('groupmenu');return false" content=" " />
+</div>
+</div>
+
+<div id="groupoptionsmenu" class="popupmenu">
+  <ul>
+    <li><roundcube:button command="group-rename" label="rename" classAct="active" /></li>
+    <li><roundcube:button command="group-delete" label="delete" classAct="active" /></li>
+  </ul>
 </div>
-<roundcube:endif />
 
 <div id="addressscreen">
 
 <div id="addresslist">
-<roundcube:object name="addresslist" id="contacts-table" class="records-table" cellspacing="0" summary="Contacts list" />
+<div class="boxtitle"><roundcube:label name="contacts" /></div>
+<div class="boxlistcontent">
+<roundcube:object name="addresslist" id="contacts-table" class="records-table" cellspacing="0" summary="Contacts list" noheader="true" />
+</div>
+<div class="boxfooter">
+<div id="abookcountbar" class="pagenav">
+  <roundcube:button command="firstpage" type="link" class="buttonPas firstpage" classAct="button firstpage" classSel="button firstpageSel" title="firstpage" content=" " />
+  <roundcube:button command="previouspage" type="link" class="buttonPas prevpage" classAct="button prevpage" classSel="button prevpageSel" title="previouspage" content=" " />
+  <roundcube:object name="recordsCountDisplay" style="padding:0 .5em; float:left" />
+  <roundcube:button command="nextpage" type="link" class="buttonPas nextpage" classAct="button nextpage" classSel="button nextpageSel" title="nextpage" content=" " />
+  <roundcube:button command="lastpage" type="link" class="buttonPas lastpage" classAct="button lastpage" classSel="button lastpageSel" title="lastpage" content=" " />
+</div>
+</div>
 </div>
 
 <script type="text/javascript">
 
 </div>
 
-<div id="abookcountbar" class="pagenav">
-  <roundcube:button command="firstpage" type="link" class="buttonPas firstpage" classAct="button firstpage" classSel="button firstpageSel" title="firstpage" content=" " />
-  <roundcube:button command="previouspage" type="link" class="buttonPas prevpage" classAct="button prevpage" classSel="button prevpageSel" title="previouspage" content=" " />
-  <roundcube:object name="recordsCountDisplay" style="padding:0 .5em; float:left" />
-  <roundcube:button command="nextpage" type="link" class="buttonPas nextpage" classAct="button nextpage" classSel="button nextpageSel" title="nextpage" content=" " />
-  <roundcube:button command="lastpage" type="link" class="buttonPas lastpage" classAct="button lastpage" classSel="button lastpageSel" title="lastpage" content=" " />
-</div>
-
 </body>
 </html>
index d2b36e045c95c2711e272c600887a54f0a1a5574..2dcf8b0c10642eba5e656541f43e6bc3c38fb13c 100644 (file)
@@ -5,8 +5,15 @@
 <roundcube:include file="/includes/links.html" />
 <link rel="stylesheet" type="text/css" href="/googiespell.css" />
 <script type="text/javascript" src="/functions.js"></script>
+<script type="text/javascript" src="/splitter.js"></script>
+<style type="text/css">
+#compose-attachments { width: <roundcube:exp expression="!empty(cookie:composesplitterv) ? cookie:composesplitterv-5 : 175" />px; }
+#compose-container { left: <roundcube:exp expression="!empty(cookie:composesplitterv) ? cookie:composesplitterv+5 : 185" />px;
+<roundcube:exp expression="browser:ie ? ('width: expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:composesplitterv) ? cookie:composesplitterv+5 : 180).')+\\'px\\');') : ''" />
+}
+</style>
 </head>
-<body onload="rcmail_init_compose_form()">
+<body onload="rcube_init_mail_ui()">
 
 <roundcube:include file="/includes/taskbar.html" />
 <roundcube:include file="/includes/header.html" />
 <form name="form" action="./" method="post">
 
 <div id="messagetoolbar">
-<table border="0" cellspacing="0" cellpadding="0"><tr>
-    <td id="compose-toolbar">
-      <roundcube:button command="list" type="link" class="button back" classAct="button back" classSel="button backSel" title="backtolist" content=" " />
-      <roundcube:button command="send" type="link" class="buttonPas send" classAct="button send" classSel="button sendSel" title="sendmessage" content=" " />
-      <roundcube:button command="spellcheck" type="link" class="buttonPas spellcheck" classAct="button spellcheck" classSel="button spellcheckSel" title="checkspelling" content=" " />
-      <roundcube:button command="add-attachment" type="link" class="buttonPas attach" classAct="button attach" classSel="button attachSel" title="addattachment" content=" " />
-      <roundcube:button command="savedraft" type="link" class="buttonPas savedraft" classAct="button savedraft" classSel="button savedraftSel" title="savemessage" content=" " />
-      <roundcube:container name="toolbar" id="compose-toolbar" />
-    </td>
-    <td id="priority-selector">
-      <label for="rcmcomposepriority"><roundcube:label name="priority" />:</label>&nbsp;<roundcube:object name="prioritySelector" form="form" id="rcmcomposepriority" />
-    </td>
-    <td id="receipt-selector">
-      <roundcube:object name="receiptCheckBox" form="form" id="rcmcomposereceipt" />&nbsp;<label for="rcmcomposereceipt"><roundcube:label name="returnreceipt" /></label>
-    </td>
-</tr></table>
+    <roundcube:button command="list" type="link" class="button back" classAct="button back" classSel="button backSel" title="backtolist" content=" " />
+    <roundcube:button command="send" type="link" class="buttonPas send" classAct="button send" classSel="button sendSel" title="sendmessage" content=" " />
+    <roundcube:button command="spellcheck" type="link" class="buttonPas spellcheck" classAct="button spellcheck" classSel="button spellcheckSel" title="checkspelling" content=" " />
+    <roundcube:button name="addattachment" type="link" class="button attach" classAct="button attach" classSel="button attachSel" title="addattachment" onclick="rcmail_ui.show_popup('uploadmenu', true);return false" content=" " />
+    <roundcube:button command="insert-sig" type="link" class="buttonPas insertsig" classAct="button insertsig" classSel="button insertsigSel" title="insertsignature" content=" " />
+    <roundcube:button command="savedraft" type="link" class="buttonPas savedraft" classAct="button savedraft" classSel="button savedraftSel" title="savemessage" content=" " />
+    <roundcube:container name="toolbar" id="compose-toolbar" />
+    <roundcube:button name="messageoptions" id="composemenulink" type="link" class="button messagemenu" title="messageoptions" onclick="rcmail_ui.show_popup('composemenu', true);return false" content=" " />
 </div>
 
+<div id="mainscreen">
+
+<div id="compose-attachments">
+<div class="boxtitle"><roundcube:label name="attachments" /></div>
+<div class="boxlistcontent">
+    <roundcube:object name="composeAttachmentList" deleteIcon="/images/icons/delete.png" cancelIcon="/images/icons/delete.png" loadingIcon="/images/display/loading_blue.gif" />
+</div>
+<div class="boxfooter">
+  <roundcube:button name="uploadmenulink" id="uploadmenulink" type="link" title="addattachment" class="button addgroup" onclick="rcmail_ui.show_popup('uploadmenu', true);return false" content=" " />
+</div>
+</div>
+
+<script type="text/javascript">
+  var composesplitv = new rcube_splitter({id:'composesplitterv', p1: 'compose-attachments', p2: 'compose-container', orientation: 'v', relative: true, start: 175});
+  rcmail.add_onload('composesplitv.init()');
+</script>
+
 <div id="compose-container">
     <div id="compose-headers-div" style="width: 100%;">
-       <table border="0" cellspacing="0" cellpadding="1" id="compose-headers" summary="">
-       <tbody>
-           <tr>
-               <td class="title"><label for="_from"><roundcube:label name="from" /></label></td>
-               <td><roundcube:object name="composeHeaders" part="from" form="form" id="_from" tabindex="1" /></td>
-           </tr><tr>
-               <td class="title top"><label for="_to"><roundcube:label name="to" /></label></td>
-               <td><roundcube:object name="composeHeaders" part="to" form="form" id="_to" cols="70" rows="2" tabindex="2" /></td>
-           </tr><tr id="compose-cc">
-               <td class="title top"><a href="#cc" onclick="return rcmail_hide_header_form('cc');"><img src="/images/icons/minus.gif" alt="" title="<roundcube:label name='delete' />" /></a>
-               <label for="_cc"><roundcube:label name="cc" /></label></td>
-               <td><roundcube:object name="composeHeaders" part="cc" form="form" id="_cc" cols="70" rows="2" tabindex="3" /></td>
-           </tr><tr id="compose-bcc">
-               <td class="title top"><a href="#bcc" onclick="return rcmail_hide_header_form('bcc');"><img src="/images/icons/minus.gif" alt="" title="<roundcube:label name='delete' />" /></a>
-               <label for="_bcc"><roundcube:label name="bcc" /></label></td>
-               <td><roundcube:object name="composeHeaders" part="bcc" form="form" id="_bcc" cols="70" rows="2" tabindex="4" /></td>
-           </tr><tr id="compose-replyto">
-               <td class="title top"><a href="#replyto" onclick="return rcmail_hide_header_form('replyto');"><img src="/images/icons/minus.gif" alt="" title="<roundcube:label name='delete' />" /></a>
-               <label for="_replyto"><roundcube:label name="replyto" /></label></td>
-               <td><roundcube:object name="composeHeaders" part="replyto" form="form" id="_replyto" size="70" tabindex="5" /></td>
-           </tr><tr id="compose-links">
-               <td></td>
-               <td class="formlinks">
-                   <a href="#cc" onclick="return rcmail_show_header_form('cc')" id="cc-link"><roundcube:label name="addcc" /></a>
-                   <span class="separator">|</span>
-                   <a href="#bcc" onclick="return rcmail_show_header_form('bcc')" id="bcc-link"><roundcube:label name="addbcc" /></a>
-                   <span class="separator">|</span>
-                   <a href="#reply-to" onclick="return rcmail_show_header_form('replyto')" id="replyto-link"><roundcube:label name="addreplyto" /></a>
-               </td>
-           </tr><tr>
-               <td class="title"><label for="compose-subject"><roundcube:label name="subject" /></label></td>
-               <td><roundcube:object name="composeSubject" id="compose-subject" form="form" tabindex="6" /></td>
-           </tr><tr>
-               <td class="title"><roundcube:label name="editortype" /></td>
-               <td>
-                   <div id="editor-select"><roundcube:object name="editorSelector" editorid="compose-body" /></div>
-                   <div id="spellcheck-control"></div>
-               </td>
-           </tr>
-       </tbody>
-       </table>
+        <table border="0" cellspacing="0" cellpadding="1" id="compose-headers">
+        <tr>
+            <td class="title"><label for="_from"><roundcube:label name="from" /></label></td>
+            <td class="editfield formlinks">
+                <roundcube:object name="composeHeaders" part="from" form="form" id="_from" tabindex="1" />
+                <a href="#identities" onclick="return rcmail.command('identities')"><roundcube:label name="editidents" /></a>
+            </td>
+        </tr><tr>
+            <td class="title top"><label for="_to"><roundcube:label name="to" /></label></td>
+            <td class="editfield"><roundcube:object name="composeHeaders" part="to" form="form" id="_to" cols="70" rows="2" tabindex="2" /></td>
+        </tr><tr id="compose-cc">
+            <td class="title top">
+                <a href="#cc" onclick="return rcmail_ui.hide_header_form('cc');"><img src="/images/icons/minus.gif" alt="" title="<roundcube:label name='delete' />" /></a>
+                <label for="_cc"><roundcube:label name="cc" /></label>
+            </td>
+            <td class="editfield"><roundcube:object name="composeHeaders" part="cc" form="form" id="_cc" cols="70" rows="2" tabindex="3" /></td>
+        </tr><tr id="compose-bcc">
+            <td class="title top">
+                <a href="#bcc" onclick="return rcmail_ui.hide_header_form('bcc');"><img src="/images/icons/minus.gif" alt="" title="<roundcube:label name='delete' />" /></a>
+                <label for="_bcc"><roundcube:label name="bcc" /></label>
+            </td>
+            <td colspan="2" class="editfield"><roundcube:object name="composeHeaders" part="bcc" form="form" id="_bcc" cols="70" rows="2" tabindex="4" /></td>
+        </tr><tr id="compose-replyto">
+            <td class="title top">
+                <a href="#replyto" onclick="return rcmail_ui.hide_header_form('replyto');"><img src="/images/icons/minus.gif" alt="" title="<roundcube:label name='delete' />" /></a>
+                <label for="_replyto"><roundcube:label name="replyto" /></label>
+            </td>
+            <td class="editfield"><roundcube:object name="composeHeaders" part="replyto" form="form" id="_replyto" size="70" tabindex="5" /></td>
+        </tr><tr id="compose-followupto">
+            <td class="title top">
+                <a href="#followupto" onclick="return rcmail_ui.hide_header_form('followupto');"><img src="/images/icons/minus.gif" alt="" title="<roundcube:label name='delete' />" /></a>
+                <label for="_followupto"><roundcube:label name="followupto" /></label>
+            </td>
+            <td class="editfield"><roundcube:object name="composeHeaders" part="followupto" form="form" id="_followupto" size="70" tabindex="7" /></td>
+        </tr><tr>
+            <td></td>
+            <td class="formlinks">
+                <a href="#cc" onclick="return rcmail_ui.show_header_form('cc')" id="cc-link"><roundcube:label name="addcc" /></a>
+                <span class="separator">|</span>
+                <a href="#bcc" onclick="return rcmail_ui.show_header_form('bcc')" id="bcc-link"><roundcube:label name="addbcc" /></a>
+                <span class="separator">|</span>
+                <a href="#reply-to" onclick="return rcmail_ui.show_header_form('replyto')" id="replyto-link"><roundcube:label name="addreplyto" /></a>
+                <span class="separator">|</span>
+                <a href="#followup-to" onclick="return rcmail_ui.show_header_form('followupto')" id="followupto-link"><roundcube:label name="addfollowupto" /></a>
+            </td>
+        </tr><tr>
+            <td class="title"><label for="compose-subject"><roundcube:label name="subject" /></label></td>
+            <td class="editfield"><roundcube:object name="composeSubject" id="compose-subject" form="form" tabindex="8" /></td>
+        </tr>
+        </table>
     </div>
     <div id="compose-div">
-       <roundcube:object name="composeBody" id="compose-body" form="form" cols="70" rows="20" tabindex="7" />
-       <table border="0" cellspacing="0" summary="" style="width:100%; margin-top: 5px;"><tbody>
-           <tr>
-               <td style="white-space: nowrap">
-                   <roundcube:button type="input" command="send" class="button mainaction" label="sendmessage" tabindex="8" />
-                   <roundcube:button type="input" command="list" class="button" label="cancel" tabindex="9" />
-               </td>
-               <td style="text-align:right; white-space: nowrap">
-                   <label><roundcube:label name="savesentmessagein" />: <roundcube:object name="storetarget" maxlength="30" tabindex="10" /></label>
-               </td>
-           </tr>
-       </tbody></table>
+        <div class="boxlistcontent" style="overflow: hidden; top: 0">
+            <roundcube:object name="composeBody" id="compose-body" form="form" cols="70" rows="20" tabindex="9" />
+        </div>
+        <div class="boxfooter">
+            <div id="compose-buttons">
+                <roundcube:button type="input" command="send" class="button mainaction" label="sendmessage" tabindex="10" />
+                <roundcube:button type="input" command="list" class="button" label="cancel" tabindex="11" />
+            </div>
+            <div id="compose-editorfooter">
+                <span id="spellcheck-control" style="margin-right:10px"></span>
+                <span>
+                    <label><roundcube:label name="editortype" /></label>
+                    <roundcube:object name="editorSelector" editorid="compose-body" tabindex="12" />
+                </span>
+            </div>
+        </div>
     </div>
 </div>
 
-<div id="compose-attachments">
-<div id="attachment-title"><roundcube:label name="attachments" /></div>
-<roundcube:object name="composeAttachmentList" deleteIcon="/images/icons/delete.png" cancelIcon="/images/icons/delete.png" loadingIcon="/images/display/loading_blue.gif" />
-<p><roundcube:button command="add-attachment" imagePas="/images/buttons/add_pas.png" imageSel="/images/buttons/add_sel.png" imageAct="/images/buttons/add_act.png" width="23" height="18" title="addattachment" /></p>
+</div>
+
+<div id="composeoptionsmenu" class="popupmenu">
+    <table>
+    <tr>
+        <td><label for="rcmcomposereceipt"><roundcube:label name="returnreceipt" />:</label></td>
+        <td><roundcube:object name="receiptCheckBox" form="form" id="rcmcomposereceipt" /></td>
+    </tr><tr>
+        <td><label for="rcmcomposedsn"><roundcube:label name="dsn" />:</label></td>
+        <td><roundcube:object name="dsnCheckBox" form="form" id="rcmcomposedsn" /></td>
+    </tr><tr>
+        <td><label for="rcmcomposepriority"><roundcube:label name="priority" />:</label></td>
+        <td><roundcube:object name="prioritySelector" form="form" id="rcmcomposepriority" /></td>
+    </tr><tr>
+        <td><label><roundcube:label name="savesentmessagein" />:</label></td>
+        <td><roundcube:object name="storetarget" maxlength="30" /></td>
+    </tr>
+    </table>
 </div>
 
 </form>
 
-<roundcube:object name="composeAttachmentForm" id="attachment-form" attachmentFieldSize="40" />
+<roundcube:object name="composeAttachmentForm" id="attachment-form" attachmentFieldSize="40" class="popupmenu" />
 
 </body>
 </html>
diff --git a/skins/default/templates/contact.html b/skins/default/templates/contact.html
new file mode 100644 (file)
index 0000000..06d0fbe
--- /dev/null
@@ -0,0 +1,20 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<script type="text/javascript" src="/functions.js"></script>
+</head>
+<body class="iframe">
+
+<div id="contact-title" class="boxtitle"><roundcube:label name="contactproperties" /></div>
+<div id="contact-details" class="boxcontent">
+  <roundcube:object name="contactdetails" />
+  <p>
+    <roundcube:button command="edit" type="input" class="button" label="editcontact" condition="!ENV:readonly" />
+  </p>
+</div>
+<script type="text/javascript">rcube_init_tabs('contact-details')</script>
+
+</body>
+</html>
diff --git a/skins/default/templates/contactadd.html b/skins/default/templates/contactadd.html
new file mode 100644 (file)
index 0000000..1a10f10
--- /dev/null
@@ -0,0 +1,22 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<script type="text/javascript" src="/functions.js"></script>
+</head>
+<body class="iframe">
+
+<div id="contact-title" class="boxtitle"><roundcube:label name="addcontact" /></div>
+<div id="contact-details" class="boxcontent">
+  <roundcube:object name="contacteditform" size="40" />
+  <p>
+    <input type="button" value="<roundcube:label name="cancel" />" class="button" onclick="history.back()" />&nbsp;
+    <roundcube:button command="save" type="input" class="button mainaction" label="save" />
+  </p>
+</form>
+</div>
+<script type="text/javascript">rcube_init_tabs('contact-details')</script>
+
+</body>
+</html>
diff --git a/skins/default/templates/contactedit.html b/skins/default/templates/contactedit.html
new file mode 100644 (file)
index 0000000..a15aaf2
--- /dev/null
@@ -0,0 +1,22 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<script type="text/javascript" src="/functions.js"></script>
+</head>
+<body class="iframe">
+
+<div id="contact-title" class="boxtitle"><roundcube:label name="editcontact" /></div>
+<div id="contact-details" class="boxcontent">
+  <roundcube:object name="contacteditform" size="40" />
+  <p>
+    <roundcube:button command="show" type="input" class="button" label="cancel" />&nbsp;
+    <roundcube:button command="save" type="input" class="button mainaction" label="save" />
+  </p>
+</form>
+</div>
+<script type="text/javascript">rcube_init_tabs('contact-details')</script>
+
+</body>
+</html>
diff --git a/skins/default/templates/editcontact.html b/skins/default/templates/editcontact.html
deleted file mode 100644 (file)
index 4411195..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title><roundcube:object name="pagetitle" /></title>
-<roundcube:include file="/includes/links.html" />
-</head>
-<body class="iframe">
-
-<div id="contact-title" class="boxtitle"><roundcube:label name="editcontact" /></div>
-
-<div id="contact-details" class="boxcontent">
-<roundcube:object name="contacteditform" size="40" />
-
-<p><br />
-<roundcube:button command="show" type="input" class="button" label="cancel" />&nbsp;
-<roundcube:button command="save" type="input" class="button mainaction" label="save" />
-</p>
-
-</form>
-</div>
-
-</body>
-</html>
diff --git a/skins/default/templates/editidentity.html b/skins/default/templates/editidentity.html
deleted file mode 100644 (file)
index 0cfec60..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title><roundcube:object name="pagetitle" /></title>
-<roundcube:include file="/includes/links.html" />
-<script type="text/javascript" src="/functions.js"></script>
-</head>
-<body>
-
-<roundcube:include file="/includes/taskbar.html" />
-<roundcube:include file="/includes/header.html" />
-<roundcube:include file="/includes/settingstabs.html" />
-
-<div id="identities-list">
-<roundcube:object name="identitiesList" id="identities-table" class="records-table" cellspacing="0" summary="Identities list" editIcon="" />
-</div>
-
-<p id="listbuttons">
-<roundcube:button command="add" type="input" label="newidentity" class="button" condition="config:identities_level:0<2" />
-</p>
-
-<div id="identity-details">
-<div id="identity-title" class="boxtitle"><roundcube:object name="steptitle" /></div>
-
-<div class="boxcontent">
-<roundcube:object name="identityform" size="40" textareacols="60" textarearows="6" />
-
-<p><br />
-<roundcube:button command="delete" type="input" class="button" label="delete" condition="env:action=='edit-identity'" style="margin-right:0.5em" />
-<roundcube:button command="save" type="input" class="button mainaction" label="save" />
-</p>
-</div>
-</div>
-
-</body>
-</html>
index 9f4f9936c29f526ebac4c716351c09a83ccdd510..36862ce38d52e58493d8eb64611e64953179327a 100644 (file)
@@ -6,7 +6,7 @@
 </head>
 <body>
 
-<div id="header"><img src="/images/roundcube_logo.png" alt="RoundCube Webmail" /></div>
+<div id="header"><img src="/images/roundcube_logo.png" alt="<roundcube:object name='productname' />" /></div>
 
 <div style="width:400px; margin:60px auto;">
 $__page_content
diff --git a/skins/default/templates/folderedit.html b/skins/default/templates/folderedit.html
new file mode 100644 (file)
index 0000000..78ddd33
--- /dev/null
@@ -0,0 +1,24 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<script type="text/javascript" src="/functions.js"></script>
+</head>
+<body class="iframe">
+
+<div id="folder-title" class="boxtitle"><roundcube:label name="folderproperties" /></div>
+
+<div id="folder-details" class="boxcontent">
+  <roundcube:object name="folderdetails" />
+  <p>
+    <roundcube:if condition="!strlen(request:_mbox)" />
+    <input type="button" value="<roundcube:label name="cancel" />" class="button" onclick="history.back()" />&nbsp;
+    <roundcube:endif />
+    <roundcube:button command="save" type="input" class="button mainaction" label="save" />
+  </p>
+</div>
+<script type="text/javascript">rcube_init_tabs('folder-details')</script>
+
+</body>
+</html>
diff --git a/skins/default/templates/folders.html b/skins/default/templates/folders.html
new file mode 100644 (file)
index 0000000..95634f3
--- /dev/null
@@ -0,0 +1,62 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<script type="text/javascript" src="/functions.js"></script>
+<script type="text/javascript" src="/splitter.js"></script>
+<style type="text/css">
+#folder-manager { width: <roundcube:exp expression="!empty(cookie:folderviewsplitter) ? cookie:folderviewsplitter-5 : 295" />px; }
+#folder-box { left: <roundcube:exp expression="!empty(cookie:folderviewsplitter) ? cookie:folderviewsplitter+5 : 305" />px;
+    <roundcube:exp expression="browser:ie ? ('width:expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:folderviewsplitter) ? cookie:folderviewsplitter+5 : 305).')+\\'px\\');') : ''" />
+}
+</style>
+</head>
+<body onload="rcube_init_mail_ui()">
+
+<roundcube:include file="/includes/taskbar.html" />
+<roundcube:include file="/includes/header.html" />
+<roundcube:include file="/includes/settingstabs.html" />
+
+<div id="mainscreen">
+
+<div id="folder-manager">
+<div id="folder-title" class="boxtitle"><span class="rightalign"><roundcube:label name="subscribed" /></span><roundcube:label name="folders" /></div>
+<div class="boxlistcontent">
+    <roundcube:object name="foldersubscription" form="subscriptionform" id="subscription-table" noheader="true"
+        cellpadding="1" cellspacing="0" summary="Folder subscription table" class="records-table" />
+</div>
+<div class="boxfooter">
+    <roundcube:button command="create-folder" type="link" title="createfolder" class="buttonPas addgroup" classAct="button addgroup" content=" " />
+    <roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="button groupactions" onclick="rcmail_ui.show_popup('mailboxmenu');return false" content=" " />
+
+    <roundcube:if condition="env:quota" />
+    <img id="quotaimg" src="/images/quota.gif" alt="" />
+    <div id="quota">
+        <roundcube:object name="quotaDisplay" display="image" width="100" height="14" id="quotadisplay" />
+    </div>
+    <roundcube:endif />
+</div>
+</div>
+
+<script type="text/javascript">
+    var folderviewsplit = new rcube_splitter({id:'folderviewsplitter', p1: 'folder-manager', p2: 'folder-box', orientation: 'v', relative: true, start: 300 });
+    rcmail.add_onload('folderviewsplit.init()');
+</script>
+
+<div id="folder-box">
+    <roundcube:object name="folderframe" id="folder-frame" width="100%" height="100%" frameborder="0" src="/watermark.html" />
+</div>
+
+</div>
+
+<div id="mailboxoptionsmenu" class="popupmenu">
+  <ul>
+    <li><roundcube:button command="delete-folder" label="delete" classAct="active" /></li>
+    <li><roundcube:button command="purge" type="link" label="empty" classAct="active" /></li>
+    <roundcube:container name="mailboxoptions" id="mailboxoptionsmenu" />
+  </ul>
+</div>
+
+</body>
+</html>
index 395da1cfcd1ff17d27bf8857f68ea69be24a8a8c..f40f394fcd79c35ac722b1f9ab3f5e3cda2a61d0 100644 (file)
@@ -4,6 +4,14 @@
 <title><roundcube:object name="pagetitle" /></title>
 <roundcube:include file="/includes/links.html" />
 <script type="text/javascript" src="/functions.js"></script>
+<script type="text/javascript" src="/splitter.js"></script>
+<style type="text/css">
+#identities-list { width: <roundcube:exp expression="!empty(cookie:identviewsplitter) ? cookie:identviewsplitter-5 : 295" />px; }
+#identity-details { left: <roundcube:exp expression="!empty(cookie:identviewsplitter) ? cookie:identviewsplitter+5 : 305" />px;
+  <roundcube:exp expression="browser:ie ? ('width:expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:identviewsplitter) ? cookie:identviewsplitter+5 : 305).')+\\'px\\');') : ''" />
+}
+</style>
+
 </head>
 <body>
 
 <roundcube:include file="/includes/header.html" />
 <roundcube:include file="/includes/settingstabs.html" />
 
+<div id="mainscreen">
+
 <div id="identities-list">
-<roundcube:object name="identitiesList" id="identities-table" class="records-table" cellspacing="0" summary="Identities list" editIcon="" />
+<div id="identity-title" class="boxtitle"><roundcube:label name="identities" /></div>
+<div class="boxlistcontent">
+<roundcube:object name="identitiesList" id="identities-table" class="records-table" cellspacing="0" summary="Identities list" noheader="true" editIcon="" />
+</div>
+<div class="boxfooter">
+<roundcube:button command="add" type="link" title="newidentity" class="buttonPas addgroup" classAct="button addgroup" content=" " condition="config:identities_level:0<2" />
+</div>
 </div>
 
-<p id="listbuttons">
-<roundcube:button command="add" type="input" label="newidentity" class="button" condition="config:identities_level:0<2" />
-</p>
+<script type="text/javascript">
+  var identviewsplit = new rcube_splitter({id:'identviewsplitter', p1: 'identities-list', p2: 'identity-details', orientation: 'v', relative: true, start: 300 });
+  rcmail.add_onload('identviewsplit.init()');
+</script>
 
 <div id="identity-details">
   <div style="margin:10px auto; text-align:center">
@@ -25,5 +42,7 @@
   </div>
 </div>
 
+</div>
+
 </body>
 </html>
diff --git a/skins/default/templates/identityedit.html b/skins/default/templates/identityedit.html
new file mode 100644 (file)
index 0000000..45c68f1
--- /dev/null
@@ -0,0 +1,56 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<roundcube:include file="/includes/links.html" />
+<script type="text/javascript" src="/functions.js"></script>
+<script type="text/javascript" src="/splitter.js"></script>
+<style type="text/css">
+#identities-list { width: <roundcube:exp expression="!empty(cookie:identviewsplitter) ? cookie:identviewsplitter-5 : 295" />px; }
+#identity-details { left: <roundcube:exp expression="!empty(cookie:identviewsplitter) ? cookie:identviewsplitter+5 : 305" />px;
+  <roundcube:exp expression="browser:ie ? ('width:expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:identviewsplitter) ? cookie:identviewsplitter+5 : 305).')+\\'px\\');') : ''" />
+}
+</style>
+
+</head>
+<body>
+
+<roundcube:include file="/includes/taskbar.html" />
+<roundcube:include file="/includes/header.html" />
+<roundcube:include file="/includes/settingstabs.html" />
+
+<div id="mainscreen">
+
+<div id="identities-list">
+<div id="identity-title" class="boxtitle"><roundcube:label name="identities" /></div>
+<div class="boxlistcontent">
+<roundcube:object name="identitiesList" id="identities-table" class="records-table" cellspacing="0" summary="Identities list" noheader="true" editIcon="" />
+</div>
+<div class="boxfooter">
+<roundcube:button command="add" type="link" title="newidentity" class="buttonPas addgroup" classAct="button addgroup" content=" " condition="config:identities_level:0<2" />
+</div>
+</div>
+
+<script type="text/javascript">
+  var identviewsplit = new rcube_splitter({id:'identviewsplitter', p1: 'identities-list', p2: 'identity-details', orientation: 'v', relative: true, start: 300 });
+  rcmail.add_onload('identviewsplit.init()');
+</script>
+
+<div id="identity-details">
+<div id="identity-title" class="boxtitle"><roundcube:object name="steptitle" /></div>
+
+<div class="boxcontent">
+<roundcube:object name="identityform" size="40" textareacols="70" textarearows="6" />
+<p>
+<roundcube:button command="delete" type="input" class="button" label="delete" condition="env:action=='edit-identity'" style="margin-right:0.5em" />
+<roundcube:button command="save" type="input" class="button mainaction" label="save" />
+</p>
+</div>
+<script type="text/javascript">rcube_init_tabs('identity-details')</script>
+
+</div>
+
+</div>
+
+</body>
+</html>
index 83ab4ab3d4a55e87600e918b06dcc7f91b2a99c6..05c7eb7b741e8b6644778d63fd966231b92699c0 100644 (file)
@@ -9,7 +9,7 @@
 <roundcube:include file="/includes/taskbar.html" />
 <roundcube:include file="/includes/header.html" />
 
-<div id="importbox">
+<div id="mainscreen" class="box darkbg">
 <div class="boxtitle"><roundcube:label name="importcontacts" /></div>
 
 <div class="boxcontent">
index a61e70c0b55fd90f0d50dc4749f7c7343ec9d64a..a315557bffe4ec7d0c6d8a57e3ca26d1e68b10d6 100644 (file)
@@ -7,7 +7,7 @@
 </head>
 <body>
 
-<img src="/images/roundcube_logo.png" border="0" alt="<roundcube:object name='productname' />" style="margin:0 11px" />
+<img id="logo" src="/images/roundcube_logo.png" border="0" alt="<roundcube:object name='productname' />" style="margin:0 11px" />
 
 <roundcube:object name="message" id="message" />
 
@@ -16,7 +16,7 @@
 <div class="boxcontent">
 
 <form name="form" action="./" method="post">
-<roundcube:object name="loginform" form="form" autocomplete="off" />
+<roundcube:object name="loginform" form="form" />
 
 <p style="text-align:center;"><input type="submit" class="button mainaction" value="<roundcube:label name='login' />" /></p>
 
 </div>
 </div>
 
+<roundcube:object name="preloader" images="
+    /images/icons/folders.png
+    /images/mail_footer.png
+    /images/taskicons.gif
+    /images/display/loading.gif
+    /images/pagenav.gif
+    /images/mail_toolbar.png
+    /images/searchfield.gif
+    /images/messageicons.png
+    /images/icons/reset.gif
+    /images/abook_toolbar.png
+    /images/icons/groupactions.png
+    /images/watermark.gif
+" />
+
 </body>
 </html>
index db2f4fe16df857b162024fea90f468b14f0cbce1..08469faa0b2cc5516a76f540cb4ccd3e9b3bc82b 100644 (file)
 <div id="mainscreen">
 <div id="mailleftcontainer">
 <div id="mailboxlist-container">
-<h3 id="mailboxlist-header"><roundcube:label name="mailboxlist" /></h3>
-<roundcube:object name="mailboxlist" id="mailboxlist" maxlength="16" />
+<div id="mailboxlist-title" class="boxtitle"><roundcube:label name="mailboxlist" /></div>
+<div class="boxlistcontent">
+<roundcube:object name="mailboxlist" id="mailboxlist" maxlength="25" />
+</div>
+<div class="boxfooter">
+  <roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="button groupactions" onclick="rcmail_ui.show_popup('mailboxmenu');return false" content=" " />
+
+<roundcube:if condition="env:quota" />
+<img id="quotaimg" src="/images/quota.gif" alt="" />
+<div id="quota">
+  <roundcube:object name="quotaDisplay" display="image" width="100" height="14" id="quotadisplay" />
+</div>
+<roundcube:endif />
+</div>
 </div>
 
 <script type="text/javascript">
   rcmail.add_onload('mailviewsplitv.init()');
 </script>
 
-<div id="mailboxcontrols">
-  <span><roundcube:label name="folder" />:&nbsp;</span>
-  <roundcube:button command="expunge" type="link" title="compact" class="buttonPas expunge" classAct="button expunge" classSel="button expungesel" content=" " />
-  <roundcube:button command="purge" type="link" title="empty" class="buttonPas purge" classAct="button purge" classSel="button purgesel" content=" " />
-  <roundcube:container name="mailboxcontrols" id="mailboxcontrols" />
-</div>
 </div>
 
 <div id="mailrightcontainer">
 <div id="mailrightcontent">
 <div id="mailcontframe">
+<div id="messagelistcontainer" class="boxlistcontent" style="top:0">
 <roundcube:object name="messages"
   id="messagelist"
   cellspacing="0"
   columns=""
   summary="Message list"
-  messageIcon="/images/icons/dot.png"
-  unreadIcon="/images/icons/unread.png"
-  deletedIcon="/images/icons/deleted.png"
-  repliedIcon="/images/icons/replied.png"
-  forwardedIcon="/images/icons/forwarded.png"
-  forwardedrepliedIcon="/images/icons/forwarded_replied.png"
-  attachmentIcon="/images/icons/attachment.png"
-  flaggedIcon="/images/icons/flagged.png"
-  unflaggedIcon="/images/icons/blank.gif" />
+  optionsmenuIcon="true" />
+</div>
+<div class="boxfooter">
+    <div id="listcontrols" class="pagenav">
+        <span><roundcube:label name="select" />:&nbsp;</span>
+        <roundcube:button command="select-all" type="link" title="all" class="buttonPas all" classAct="button all" classSel="button allsel" content=" " />
+        <roundcube:button command="select-all" type="link" prop="page" title="currpage" class="buttonPas page" classAct="button page" classSel="button pagesel" content=" " />
+        <roundcube:button command="select-all" type="link" prop="unread" title="unread" class="buttonPas unread" classAct="button unread" classSel="button unreadsel" content=" " />
+        <roundcube:button command="select-all" type="link" prop="invert" title="invert" class="buttonPas invert" classAct="button invert" classSel="button invertsel" content=" " />
+        <roundcube:button command="select-none" type="link" title="none" class="buttonPas none" classAct="button none" classSel="button nonesel" content=" " />
+        <roundcube:container name="listcontrols" id="listcontrols" />
+    <roundcube:if condition="env:threads" />
+        <span style="margin-left: 12px"><roundcube:label name="threads" />:&nbsp;</span>
+        <roundcube:button command="expand-all" type="link" title="expand-all" class="buttonPas expand-all" classAct="button expand-all" classSel="button expand-allsel" content=" "  />
+        <roundcube:button command="expand-unread" type="link" title="expand-unread" class="buttonPas expand-unread" classAct="button expand-unread" classSel="button expand-unreadsel" content=" " />
+        <roundcube:button command="collapse-all" type="link" title="collapse-all" class="buttonPas collapse-all" classAct="button collapse-all" classSel="button collapse-allsel" content=" " />
+    <roundcube:endif />
+    <roundcube:if condition="!in_array('preview_pane', (array)config:dont_override)" />
+        <label><span style="margin-left: 12px"><roundcube:label name="previewpane" />:&nbsp;</span>
+        <input type="checkbox" onclick="rcmail_ui.switch_preview_pane(this)"<roundcube:exp expression="config:preview_pane == true ? ' checked=checked' : ''" /> /></label>
+    <roundcube:endif />
+    </div>
+    <div id="countcontrols" class="pagenav">
+        <roundcube:button command="lastpage" type="link" class="buttonPas lastpage" classAct="button lastpage" classSel="button lastpageSel" title="lastmessages" content=" " />
+        <roundcube:button command="nextpage" type="link" class="buttonPas nextpage" classAct="button nextpage" classSel="button nextpageSel" title="nextmessages" content=" " />
+        <roundcube:object name="messageCountDisplay" style="padding:0 .5em; float:right" />
+        <roundcube:button command="previouspage" type="link" class="buttonPas prevpage" classAct="button prevpage" classSel="button prevpageSel" title="previousmessages" content=" " />
+        <roundcube:button command="firstpage" type="link" class="buttonPas firstpage" classAct="button firstpage" classSel="button firstpageSel" title="firstmessages" content=" " />
+    </div>
+</div>
 </div>
-
-<roundcube:if condition="config:preview_pane == true" />
 
 <script type="text/javascript">
   var mailviewsplit = new rcube_splitter({id:'mailviewsplitter', p1: 'mailcontframe', p2: 'mailpreviewframe', orientation: 'h', relative: true, start: 205});
+<roundcube:if condition="config:preview_pane == true" />
   rcmail.add_onload('mailviewsplit.init()');
+<roundcube:endif />
 </script>
 
-<div id="mailpreviewframe">
+<div id="mailpreviewframe"<roundcube:if condition="config:preview_pane != true" /> style="display:none"<roundcube:endif />>
 <roundcube:object name="messagecontentframe" id="messagecontframe" width="100%" height="100%" frameborder="0" src="/watermark.html" />
 </div>
-
-<roundcube:endif />
-</div>
-
-<div id="listcontrols">
-      <span><roundcube:label name="select" />:&nbsp;</span>
-      <roundcube:button command="select-all" type="link" title="all" class="buttonPas all" classAct="button all" classSel="button allsel" content=" " />
-      <roundcube:button command="select-all" type="link" prop="unread" title="unread" class="buttonPas unread" classAct="button unread" classSel="button unreadsel" content=" " />
-      <roundcube:button command="select-all" type="link" prop="invert" title="invert" class="buttonPas invert" classAct="button invert" classSel="button invertsel" content=" " />
-      <roundcube:button command="select-none" type="link" title="none" class="buttonPas none" classAct="button none" classSel="button nonesel" content=" " />
-      <roundcube:container name="listcontrols" id="listcontrols" />
-  <roundcube:if condition="env:quota" />
-  <span style="margin-left: 20px; margin-right: 5px"><roundcube:label name="quota" />:</span>
-  <roundcube:object name="quotaDisplay" display="image" width="100" height="14" id="quotadisplay" />
-  <roundcube:endif />
 </div>
 
-<div id="countcontrols" class="pagenav">
-    <roundcube:button command="lastpage" type="link" class="buttonPas lastpage" classAct="button lastpage" classSel="button lastpageSel" title="lastmessages" content=" " />
-    <roundcube:button command="nextpage" type="link" class="buttonPas nextpage" classAct="button nextpage" classSel="button nextpageSel" title="nextmessages" content=" " />
-    <roundcube:object name="messageCountDisplay" style="padding:0 .5em; float:right" />
-    <roundcube:button command="previouspage" type="link" class="buttonPas prevpage" classAct="button prevpage" classSel="button prevpageSel" title="previousmessages" content=" " />
-    <roundcube:button command="firstpage" type="link" class="buttonPas firstpage" classAct="button firstpage" classSel="button firstpageSel" title="firstmessages" content=" " />
-</div>
 
 </div>
 </div>
 <roundcube:button command="checkmail" type="link" class="button checkmail" classAct="button checkmail" classSel="button checkmailSel" title="checkmail" content=" " />
 <roundcube:button command="compose" type="link" class="button compose" classAct="button compose" classSel="button composeSel" title="writenewmessage" content=" " />
 <roundcube:button command="reply" type="link" class="buttonPas reply" classAct="button reply" classSel="button replySel" title="replytomessage" content=" " />
+<span class="dropbutton">
 <roundcube:button command="reply-all" type="link" class="buttonPas replyAll" classAct="button replyAll" classSel="button replyAllSel" title="replytoallmessage" content=" " />
+<span id="replyallmenulink" onclick="rcmail_ui.show_popup('replyallmenu');return false"></span></span>
 <roundcube:button command="forward" type="link" class="buttonPas forward" classAct="button forward" classSel="button forwardSel" title="forwardmessage" content=" " />
 <roundcube:button command="delete" type="link" class="buttonPas delete" classAct="button delete" classSel="button deleteSel" title="deletemessage" content=" " />
 <roundcube:container name="toolbar" id="messagetoolbar" />
-<roundcube:button name="markreadbutton" id="markreadbutton" type="link" class="button markmessage" title="markmessages" onclick="rcmail_ui.show_markmenu();return false" content=" " />
-<roundcube:button name="messagemenulink" id="messagemenulink" type="link" class="button messagemenu" title="messageactions" onclick="rcmail_ui.show_messagemenu();return false" content=" " />
+<roundcube:button name="markmenulink" id="markmenulink" type="link" class="button markmessage" title="markmessages" onclick="rcmail_ui.show_popup('markmenu');return false" content=" " />
+<roundcube:button name="messagemenulink" id="messagemenulink" type="link" class="button messagemenu" title="messageactions" onclick="rcmail_ui.show_popup('messagemenu');return false" content=" " />
+</div>
 
-<div id="markmessagemenu">
+<div id="markmessagemenu" class="popupmenu">
   <ul class="toolbarmenu">
     <li><roundcube:button command="mark" prop="read" label="markread" classAct="readlink active" class="readlink" /></li>
     <li><roundcube:button command="mark" prop="unread" label="markunread" classAct="unreadlink active" class="unreadlink" /></li>
   </ul>
 </div>
 
+<roundcube:include file="/includes/replyallmenu.html" />
 <roundcube:include file="/includes/messagemenu.html" />
 
-</div>
-
-<div id="searchmenu">
+<div id="searchmenu" class="popupmenu">
   <ul class="toolbarmenu">
     <li><input type="checkbox" name="s_mods[]" value="subject" id="s_mod_subject" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_subject"><roundcube:label name="subject" /></label></li>
     <li><input type="checkbox" name="s_mods[]" value="from" id="s_mod_from" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_from"><roundcube:label name="from" /></label></li>
   <label for="rcmlistfilter"><roundcube:label name="filter" /></label>:
   <roundcube:object name="searchfilter" class="searchfilter" />
 </div>
-<roundcube:button name="searchmod" id="searchmod" image="/images/icons/glass_roll.png" onclick="rcmail_ui.show_searchmenu();return false" title="searchmod" />
+<roundcube:button name="searchmenulink" id="searchmenulink" image="/images/icons/glass_roll.png" onclick="rcmail_ui.show_popup('searchmenu');return false" title="searchmod" />
 <roundcube:object name="searchform" id="quicksearchbox" />
 <roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" />
 </div>
 
+<div id="dragmessagemenu" class="popupmenu">
+  <ul>
+    <li><roundcube:button command="moveto" onclick="return rcmail.drag_menu_action('moveto')" label="move" classAct="active" /></li>
+    <li><roundcube:button command="copy" onclick="return rcmail.drag_menu_action('copy')" label="copy" classAct="active" /></li>
+  </ul>
+</div>
+
+<div id="mailboxoptionsmenu" class="popupmenu">
+  <ul>
+    <li><roundcube:button command="expunge" type="link" label="compact" classAct="active" /></li>
+    <li class="separator_below"><roundcube:button command="purge" type="link" label="empty" classAct="active" /></li>
+    <li><roundcube:button command="folders" task="settings" type="link" label="managefolders" classAct="active" /></li>
+    <roundcube:container name="mailboxoptions" id="mailboxoptionsmenu" />
+  </ul>
+</div>
+
+<div id="listmenu" class="popupmenu">
+<roundcube:if condition="env:threads" />
+<fieldset class="thinbordered"><legend><roundcube:label name="listmode" /></legend>
+  <ul class="toolbarmenu">
+    <li><input type="radio" name="view" value="list" id="view_default" /><label for="view_default"><roundcube:label name="list" /></label></li>
+    <li><input type="radio" name="view" value="thread" id="view_thread" /><label for="view_thread"><roundcube:label name="threads" /></label></li>
+  </ul>
+</fieldset>
+<roundcube:endif />
+<roundcube:if condition="!in_array('list_cols', (array)config:dont_override)" />
+<fieldset class="thinbordered"><legend><roundcube:label name="listcolumns" /></legend>
+  <ul class="toolbarmenu">
+    <li><input type="checkbox" name="list_col[]" value="threads" id="cols_threads" checked="checked" disabled="disabled" /><label for="cols_threads" class="disabled"><roundcube:label name="threads" /></label></li>
+    <li><input type="checkbox" name="list_col[]" value="subject" id="cols_subject" checked="checked" disabled="disabled" /><label for="cols_subject" class="disabled"><roundcube:label name="subject" /></label></li>
+    <li><input type="checkbox" name="list_col[]" value="from" id="cols_fromto" /><label for="cols_fromto"><roundcube:label name="fromto" /></label></li>
+    <li><input type="checkbox" name="list_col[]" value="replyto" id="cols_replyto" /><label for="cols_replyto"><roundcube:label name="replyto" /></label></li>
+    <li><input type="checkbox" name="list_col[]" value="cc" id="cols_cc" /><label for="cols_cc"><roundcube:label name="cc" /></label></li>
+    <li><input type="checkbox" name="list_col[]" value="date" id="cols_date" /><label for="cols_date"><roundcube:label name="date" /></label></li>
+    <li><input type="checkbox" name="list_col[]" value="size" id="cols_size" /><label for="cols_size"><roundcube:label name="size" /></label></li>
+    <li><input type="checkbox" name="list_col[]" value="status" id="cols_status" /><label for="cols_status"><roundcube:label name="readstatus" /></label></li>
+    <li><input type="checkbox" name="list_col[]" value="attachment" id="cols_attachment" /><label for="cols_attachment"><roundcube:label name="attachment" /></label></li>
+    <li><input type="checkbox" name="list_col[]" value="flag" id="cols_flag" /><label for="cols_flag"><roundcube:label name="flag" /></label></li>
+  </ul>
+</fieldset>
+<roundcube:endif />
+<roundcube:if condition="!in_array('message_sort_col', (array)config:dont_override)" />
+<fieldset class="thinbordered"><legend><roundcube:label name="listsorting" /></legend>
+  <ul class="toolbarmenu">
+    <li><input type="radio" name="sort_col" value="" id="sort_default" /><label for="sort_default"><roundcube:label name="nonesort" /></label></li>
+    <li><input type="radio" name="sort_col" value="arrival" id="sort_arrival" /><label for="sort_arrival"><roundcube:label name="arrival" /></label></li>
+    <li><input type="radio" name="sort_col" value="date" id="sort_date" /><label for="sort_date"><roundcube:label name="sentdate" /></label></li>
+    <li><input type="radio" name="sort_col" value="subject" id="sort_subject" /><label for="sort_subject"><roundcube:label name="subject" /></label></li>
+    <li><input type="radio" name="sort_col" value="from" id="sort_fromto" /><label for="sort_fromto"><roundcube:label name="fromto" /></label></li>
+    <li><input type="radio" name="sort_col" value="to" id="sort_replyto" /><label for="sort_replyto"><roundcube:label name="replyto" /></label></li>
+    <li><input type="radio" name="sort_col" value="cc" id="sort_cc" /><label for="sort_cc"><roundcube:label name="cc" /></label></li>
+    <li><input type="radio" name="sort_col" value="size" id="sort_size" /><label for="sort_size"><roundcube:label name="size" /></label></li>
+  </ul>
+</fieldset>
+<roundcube:endif />
+<roundcube:if condition="!in_array('message_sort_order', (array)config:dont_override)" />
+<fieldset><legend><roundcube:label name="listorder" /></legend> 
+         <ul class="toolbarmenu"> 
+           <li><input type="radio" name="sort_ord" value="ASC" id="sort_asc" /><label for="sort_asc"><roundcube:label name="asc" /></label></li> 
+           <li><input type="radio" name="sort_ord" value="DESC" id="sort_desc" /><label for="sort_desc"><roundcube:label name="desc" /></label></li> 
+         </ul> 
+</fieldset>
+<roundcube:endif />
+<div>
+  <roundcube:button command="menu-open" id="listmenucancel" type="input" class="button" label="cancel" />
+  <roundcube:button command="menu-save" id="listmenusave" type="input" class="button mainaction" label="save" />
+</div>
+</div>
+
 </body>
 </html>
diff --git a/skins/default/templates/managefolders.html b/skins/default/templates/managefolders.html
deleted file mode 100644 (file)
index 9775888..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title><roundcube:object name="pagetitle" /></title>
-<roundcube:include file="/includes/links.html" />
-<script type="text/javascript" src="/functions.js"></script>
-</head>
-<body>
-
-<roundcube:include file="/includes/taskbar.html" />
-<roundcube:include file="/includes/header.html" />
-<roundcube:include file="/includes/settingstabs.html" />
-
-<form name="subscriptionform" action="./" onsubmit="rcmail.command('create-folder');return false;">
-
-<div id="folder-manager">
-<roundcube:object name="foldersubscription" form="subscriptionform" id="subscription-table"
-  cellpadding="1" cellspacing="0" summary="Folder subscription table" class="records-table"
-  deleteIcon="/images/icons/delete.png"
-  renameIcon="/images/icons/rename.png" />
-</div>
-
-<div id="bottomboxes">
-<div class="settingsbox">
-<div class="boxtitle"><roundcube:label name="createfolder" /></div>
-
-<div class="boxcontent">
-<roundcube:label name="foldername" />:&nbsp;
-<roundcube:object name="createfolder" form="subscriptionform" hintbox="rcmailaddfolderhint" />
-<roundcube:button command="create-folder" type="input" class="button" label="create" />
-<div id="rcmailaddfolderhint" class="hint" style="margin-top:1em; height:16px"></div>
-</div>
-</div>
-
-</div>
-
-</form>
-
-</body>
-</html>
index fcf55df0b42113a7eb93ffcc931040d05939d65c..8e8af931ff6dbf62370c4468cbbead4b8ebc9184 100644 (file)
 <roundcube:button command="list" type="link" class="button back" classAct="button back" classSel="button backSel" title="backtolist" content=" " />
 <roundcube:button command="compose" type="link" class="button compose" classAct="button compose" classSel="button composeSel" title="writenewmessage" content=" " />
 <roundcube:button command="reply" type="link" class="buttonPas reply" classAct="button reply" classSel="button replySel" title="replytomessage" content=" " />
+<span class="dropbutton">
 <roundcube:button command="reply-all" type="link" class="buttonPas replyAll" classAct="button replyAll" classSel="button replyAllSel" title="replytoallmessage" content=" " />
+<span id="replyallmenulink" onclick="rcmail_ui.show_popup('replyallmenu');return false"></span></span>
 <roundcube:button command="forward" type="link" class="buttonPas forward" classAct="button forward" classSel="button forwardSel" title="forwardmessage" content=" " />
 <roundcube:button command="delete" type="link" class="buttonPas delete" classAct="button delete" classSel="button deleteSel" title="deletemessage" content=" " />
 <roundcube:container name="toolbar" id="messagetoolbar" />
-<roundcube:button name="messagemenulink" id="messagemenulink" type="link" class="button messagemenu" title="messageactions" onclick="rcmail_ui.show_messagemenu();return false" content=" " />
+<roundcube:button name="messagemenulink" id="messagemenulink" type="link" class="button messagemenu" title="messageactions" onclick="rcmail_ui.show_popup('messagemenu');return false" content=" " />
 <roundcube:object name="mailboxlist" type="select" noSelection="moveto" maxlength="25" onchange="rcmail.command('moveto', this.options[this.selectedIndex].value)" class="mboxlist" />
+</div>
 
+<roundcube:include file="/includes/replyallmenu.html" />
 <roundcube:include file="/includes/messagemenu.html" />
-</div>
 
 <div id="mainscreen">
 <div id="mailleftcontainer">
 <div id="mailboxlist-container">
-<div id="mailboxlist-header"><roundcube:label name="mailboxlist" /></div>
+<div id="mailboxlist-title" class="boxtitle"><roundcube:label name="mailboxlist" /></div>
+<div class="boxlistcontent">
 <roundcube:object name="mailboxlist" id="mailboxlist" maxlength="25" />
 </div>
+<div class="boxfooter">
+  <roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="button groupactions" onclick="rcmail_ui.show_popup('mailboxmenu');return false" content=" " />
+</div>
+</div>
 </div>
 
 <div id="messageframe">
-<div id="messagecanvas">
+<div class="boxlistcontent" style="top:0; overflow-x:auto">
 <roundcube:object name="messageHeaders" class="headers-table" cellspacing="0" cellpadding="2" addicon="/images/icons/silhouette.png" summary="Message headers" />
 <roundcube:object name="messageAttachments" id="attachment-list" />
 
 <roundcube:object name="blockedObjects" id="remote-objects-message" />
 <roundcube:object name="messageBody" id="messagebody" />
 </div>
-</div>
-
+<div class="boxfooter">
 <div id="countcontrols" class="pagenav">
   <roundcube:button command="lastmessage" type="link" class="buttonPas lastpage" classAct="button lastpage" classSel="button lastpageSel" title="lastmessage" content=" " />
   <roundcube:button command="nextmessage" type="link" class="buttonPas nextpage" classAct="button nextpage" classSel="button nextpageSel" title="nextmessage" content=" " />
@@ -56,6 +63,9 @@
   <roundcube:button command="previousmessage" type="link" class="buttonPas prevpage" classAct="button prevpage" classSel="button prevpageSel" title="previousmessage" content=" " />
   <roundcube:button command="firstmessage" type="link" class="buttonPas firstpage" classAct="button firstpage" classSel="button firstpageSel" title="firstmessage" content=" " />
 </div>
+</div>
+</div>
+
 </div>
 
 <script type="text/javascript">
     rcmail.add_onload('mailviewsplitv.init()');
 </script>
 
+<div id="mailboxoptionsmenu" class="popupmenu">
+  <ul>
+    <li><roundcube:button command="expunge" type="link" label="compact" classAct="active" /></li>
+    <li class="separator_below"><roundcube:button command="purge" type="link" label="empty" classAct="active" /></li>
+    <li><roundcube:button command="folders" task="settings" type="link" label="managefolders" classAct="active" /></li>
+    <roundcube:container name="mailboxoptions" id="mailboxoptionsmenu" />
+  </ul>
+</div>
+
 </body>
 </html>
index d180e74354c94e92b0d2552a247a109b33e288ee..559d16687290adf03a9aa3c4838c96ead63e99e8 100644 (file)
@@ -1,8 +1,11 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<title></title>
+<title><roundcube:object name='productname' /> :: <roundcube:label name='servererror' /></title>
 <roundcube:include file="/includes/links.html" />
+
+<roundcube:if condition="env:action!='show'" />
+
 </head>
 <body class="iframe" style="background-color:#F2F2F2;">
 
 </div>
 
 </body>
+
+<roundcube:else />
+
+<script type="text/javascript" src="/splitter.js"></script>
+<script type="text/javascript" src="/functions.js"></script>
+<style type="text/css">
+#mailboxlist-container { width: <roundcube:exp expression="!empty(cookie:mailviewsplitterv) ? cookie:mailviewsplitterv-5 : 170" />px; }
+#messageframe { left: <roundcube:exp expression="!empty(cookie:mailviewsplitterv) ? cookie:mailviewsplitterv+5 : 180" />px;
+<roundcube:exp expression="browser:ie ? ('width: expression((parseInt(this.parentNode.offsetWidth)-'.(!empty(cookie:mailviewsplitterv) ? cookie:mailviewsplitterv+5 : 180).')+\\'px\\');') : ''" />
+}
+</style>
+</head>
+
+<body onload="rcube_init_mail_ui()">
+
+<roundcube:include file="/includes/taskbar.html" />
+<roundcube:include file="/includes/header.html" />
+
+<div id="messagetoolbar">
+<roundcube:button command="list" type="link" class="button back" classAct="button back" classSel="button backSel" title="backtolist" content=" " />
+<roundcube:button command="compose" type="link" class="button compose" classAct="button compose" classSel="button composeSel" title="writenewmessage" content=" " />
+</div>
+
+<div id="mainscreen">
+<div id="mailleftcontainer">
+<div id="mailboxlist-container">
+<div class="boxtitle"><roundcube:label name="mailboxlist" /></div>
+<div class="boxlistcontent">
+<roundcube:object name="mailboxlist" id="mailboxlist" maxlength="25" />
+</div>
+<div class="boxfooter">
+  <roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="button groupactions" onclick="rcmail_ui.show_popup('mailboxmenu');return false" content=" " />
+</div>
+</div>
+</div>
+
+<div id="messageframe" style="background-color:#F2F2F2;">
+<div style="margin:20px auto; text-align:center">
+<img src="/images/watermark.gif" width="260" height="228" alt="" />
+</div>
+</div>
+
+</div>
+
+<script type="text/javascript">
+    var mailviewsplitv = new rcube_splitter({id:'mailviewsplitterv', p1: 'mailboxlist-container', p2: 'messageframe', orientation: 'v', relative: true, start: 165});
+    rcmail.add_onload('mailviewsplitv.init()');
+</script>
+
+<div id="mailboxoptionsmenu" class="popupmenu">
+  <ul>
+    <li><roundcube:button command="expunge" type="link" label="compact" classAct="active" /></li>
+    <li class="separator_below"><roundcube:button command="purge" type="link" label="empty" classAct="active" /></li>
+    <li><roundcube:button command="folders" task="settings" type="link" label="managefolders" classAct="active" /></li>
+    <roundcube:container name="mailboxoptions" id="mailboxoptionsmenu" />
+  </ul>
+</div>
+
+</body>
+<roundcube:endif />
+
 </html>
diff --git a/skins/default/templates/messageprint.html b/skins/default/templates/messageprint.html
new file mode 100644 (file)
index 0000000..f2775cd
--- /dev/null
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title><roundcube:object name="pagetitle" /></title>
+<link rel="stylesheet" type="text/css" href="/print.css" />
+</head>
+<body>
+
+<div id="header"><img src="/images/roundcube_logo.png" alt="<roundcube:object name="productname" />" /></div>
+
+<div id="printmessageframe">
+<roundcube:object name="messageHeaders" class="headers-table" cellspacing="0" cellpadding="2" />
+<roundcube:object name="messageAttachments" id="attachment-list" />
+<roundcube:object name="messageBody" id="messagebody" showImages="false" />
+</div>
+
+</body>
+</html>
index 03f020307b0ff005edaf39a8ed89d6016c4a45c6..cec701301c7461cf883f19a76234d2f430dc2f80 100644 (file)
@@ -13,7 +13,7 @@
   <roundcube:include file="/includes/settingstabs.html" />
 <roundcube:endif />
 
-<div id="pagecontent">
+<div id="mainscreen">
 <roundcube:object name="plugin.body" />
 </div>
   
diff --git a/skins/default/templates/printmessage.html b/skins/default/templates/printmessage.html
deleted file mode 100644 (file)
index f2775cd..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title><roundcube:object name="pagetitle" /></title>
-<link rel="stylesheet" type="text/css" href="/print.css" />
-</head>
-<body>
-
-<div id="header"><img src="/images/roundcube_logo.png" alt="<roundcube:object name="productname" />" /></div>
-
-<div id="printmessageframe">
-<roundcube:object name="messageHeaders" class="headers-table" cellspacing="0" cellpadding="2" />
-<roundcube:object name="messageAttachments" id="attachment-list" />
-<roundcube:object name="messageBody" id="messagebody" showImages="false" />
-</div>
-
-</body>
-</html>
index 0ff86ad2cf2d9b6e04d92c6fc04a69b6b7d27b98..0cd623f75c27b3c7d81e9dbc075658c63b0a87e6 100644 (file)
@@ -20,7 +20,7 @@
 <roundcube:include file="/includes/header.html" />
 <roundcube:include file="/includes/settingstabs.html" />
 
-<div id="prefsscreen">
+<div id="mainscreen">
 
 <div id="sectionslist">
 <roundcube:object name="sectionslist" id="sections-table" class="records-table" cellspacing="0" />
diff --git a/skins/default/templates/showcontact.html b/skins/default/templates/showcontact.html
deleted file mode 100644 (file)
index be663a7..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title><roundcube:object name="pagetitle" /></title>
-<roundcube:include file="/includes/links.html" />
-</head>
-<body class="iframe">
-
-<div id="contact-title" class="boxtitle"><roundcube:object name="contactdetails" part="name" /></div>
-
-<div id="contact-details" class="boxcontent">
-<roundcube:object name="contactdetails" />
-
-<p><br /><roundcube:button command="edit" type="input" class="button" label="editcontact" condition="!ENV:readonly" /></p>
-</div>
-
-</body>
-</html>