]> git.donarmstrong.com Git - roundcube.git/commitdiff
Imported Upstream version 0.1~rc2
authorJérémy Bobbio <lunar@debian.org>
Sat, 18 Jun 2011 15:00:01 +0000 (17:00 +0200)
committerJérémy Bobbio <lunar@debian.org>
Sat, 18 Jun 2011 15:00:01 +0000 (17:00 +0200)
371 files changed:
.htaccess
CHANGELOG
INSTALL
README
SQL/mssql.initial.sql [changed mode: 0755->0644]
SQL/mysql.initial.sql
SQL/mysql.update-0.1a.sql [deleted file]
SQL/mysql.update.sql
SQL/mysql5.initial.sql
SQL/postgres.initial.sql [changed mode: 0755->0644]
SQL/sqlite.initial.sql
UPGRADING
bin/html2text.php
bin/modcss.php [new file with mode: 0644]
bin/msgimport [deleted file]
bin/quotaimg.php
config/db.inc.php.dist
config/main.inc.php.dist
index.php
program/include/bugs.inc
program/include/cache.inc [deleted file]
program/include/main.inc
program/include/rcmail_template.inc
program/include/rcube_contacts.inc
program/include/rcube_db.inc [changed mode: 0755->0644]
program/include/rcube_html.inc [new file with mode: 0644]
program/include/rcube_imap.inc
program/include/rcube_ldap.inc
program/include/rcube_mdb2.inc [changed mode: 0755->0644]
program/include/rcube_shared.inc
program/include/rcube_smtp.inc
program/include/rcube_sqlite.inc
program/include/session.inc
program/js/app.js
program/js/common.js
program/js/editor.js [new file with mode: 0644]
program/js/googiespell.js [changed mode: 0755->0644]
program/js/list.js
program/js/tiny_mce/blank.htm [new file with mode: 0644]
program/js/tiny_mce/langs/en.js [new file with mode: 0644]
program/js/tiny_mce/langs/readme.txt [new file with mode: 0644]
program/js/tiny_mce/license.txt [new file with mode: 0644]
program/js/tiny_mce/plugins/cleanup/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/cleanup/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/cleanup/readme.txt [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/emotions.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/emotions.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/readme.txt [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-cool.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-cry.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-embarassed.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-frown.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-innocent.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-kiss.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-laughing.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-sealed.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-smile.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-surprised.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-undecided.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-wink.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/images/smiley-yell.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/jscripts/functions.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/langs/en.js [new file with mode: 0644]
program/js/tiny_mce/plugins/emotions/readme.txt [new file with mode: 0644]
program/js/tiny_mce/plugins/media/css/content.css [new file with mode: 0644]
program/js/tiny_mce/plugins/media/css/media.css [new file with mode: 0644]
program/js/tiny_mce/plugins/media/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/images/flash.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/media/images/media.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/media/images/quicktime.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/media/images/realmedia.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/media/images/shockwave.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/media/images/windowsmedia.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/media/jscripts/embed.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/jscripts/media.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/langs/en.js [new file with mode: 0644]
program/js/tiny_mce/plugins/media/media.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/nonbreaking/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/nonbreaking/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/nonbreaking/langs/en.js [new file with mode: 0644]
program/js/tiny_mce/plugins/readme.txt [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/css/searchreplace.css [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/images/replace.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/images/search.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/jscripts/searchreplace.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/langs/en.js [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/readme.txt [new file with mode: 0644]
program/js/tiny_mce/plugins/searchreplace/searchreplace.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/changelog [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/classes/TinyGoogleSpell.class.php [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/classes/TinyPspell.class.php [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/classes/TinyPspellShell.class.php [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/config.php [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/css/content.css [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/css/spellchecker.css [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/images/spellchecker.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/images/wline.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/langs/en.js [new file with mode: 0644]
program/js/tiny_mce/plugins/spellchecker/tinyspell.php [new file with mode: 0644]
program/js/tiny_mce/plugins/table/cell.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/table/css/cell.css [new file with mode: 0644]
program/js/tiny_mce/plugins/table/css/row.css [new file with mode: 0644]
program/js/tiny_mce/plugins/table/css/table.css [new file with mode: 0644]
program/js/tiny_mce/plugins/table/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/images/buttons.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/table/images/table.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/table/images/table_cell_props.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/table/images/table_delete.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/table/images/table_delete_col.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/table/images/table_delete_row.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/table/images/table_insert_col_after.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/table/images/table_insert_col_before.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/table/images/table_insert_row_after.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/table/images/table_insert_row_before.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/table/images/table_merge_cells.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/table/images/table_row_props.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/table/images/table_split_cells.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/table/jscripts/cell.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/jscripts/merge_cells.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/jscripts/row.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/jscripts/table.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/langs/en.js [new file with mode: 0644]
program/js/tiny_mce/plugins/table/merge_cells.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/table/readme.txt [new file with mode: 0644]
program/js/tiny_mce/plugins/table/row.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/table/table.htm [new file with mode: 0644]
program/js/tiny_mce/plugins/visualchars/editor_plugin.js [new file with mode: 0644]
program/js/tiny_mce/plugins/visualchars/editor_plugin_src.js [new file with mode: 0644]
program/js/tiny_mce/plugins/visualchars/images/visualchars.gif [new file with mode: 0644]
program/js/tiny_mce/plugins/visualchars/langs/en.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/about.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/anchor.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/charmap.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/color_picker.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/docs/en/about.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/docs/en/common_buttons.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/docs/en/index.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/docs/en/insert_image_button.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/docs/en/insert_link_button.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/docs/en/insert_table_button.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/docs/en/style.css [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/editor_template.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/editor_template_src.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/image.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/anchor.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/anchor_symbol.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/backcolor.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/bold.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/bold_de_se.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/bold_es.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/bold_fr.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/bold_ru.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/bold_tw.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/browse.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/bullist.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/button_menu.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/buttons.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/cancel_button_bg.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/charmap.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/cleanup.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/close.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/code.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/color.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/colors.jpg [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/copy.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/custom_1.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/cut.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/forecolor.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/help.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/hr.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/image.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/indent.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/insert_button_bg.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/italic.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/italic_de_se.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/italic_es.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/italic_ru.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/italic_tw.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/justifycenter.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/justifyfull.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/justifyleft.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/justifyright.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/link.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/menu_check.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/newdocument.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/numlist.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/opacity.png [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/outdent.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/paste.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/redo.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/removeformat.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/separator.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/spacer.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/statusbar_resize.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/strikethrough.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/sub.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/sup.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/underline.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/underline_es.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/underline_fr.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/underline_ru.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/underline_tw.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/undo.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/unlink.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/visualaid.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/xp/tab_bg.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/xp/tab_end.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/images/xp/tabs_bg.gif [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/jscripts/about.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/jscripts/anchor.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/jscripts/charmap.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/jscripts/color_picker.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/jscripts/image.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/jscripts/link.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/jscripts/source_editor.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/langs/en.js [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/link.htm [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/source_editor.htm [new file with mode: 0644]
program/js/tiny_mce/tiny_mce.js [new file with mode: 0644]
program/js/tiny_mce/tiny_mce_popup.js [new file with mode: 0644]
program/js/tiny_mce/tiny_mce_src.js [new file with mode: 0644]
program/js/tiny_mce/utils/editable_selects.js [new file with mode: 0644]
program/js/tiny_mce/utils/form_utils.js [new file with mode: 0644]
program/js/tiny_mce/utils/mclayer.js [new file with mode: 0644]
program/js/tiny_mce/utils/mctabs.js [new file with mode: 0644]
program/js/tiny_mce/utils/validate.js [new file with mode: 0644]
program/lib/imap.inc
program/lib/mime.inc
program/localization/am/labels.inc [changed mode: 0755->0644]
program/localization/am/messages.inc [changed mode: 0755->0644]
program/localization/ar/labels.inc [new file with mode: 0644]
program/localization/ar/messages.inc [new file with mode: 0644]
program/localization/ca/labels.inc
program/localization/ca/messages.inc
program/localization/cz/labels.inc [changed mode: 0755->0644]
program/localization/cz/messages.inc [changed mode: 0755->0644]
program/localization/da/labels.inc
program/localization/da/messages.inc
program/localization/de_CH/labels.inc
program/localization/de_DE/labels.inc
program/localization/de_DE/messages.inc
program/localization/el/labels.inc [changed mode: 0755->0644]
program/localization/el/messages.inc [changed mode: 0755->0644]
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 [new file with mode: 0644]
program/localization/eo/messages.inc [new file with mode: 0644]
program/localization/es/labels.inc
program/localization/es/messages.inc
program/localization/et_EE/labels.inc
program/localization/et_EE/messages.inc
program/localization/eu/labels.inc
program/localization/eu/messages.inc
program/localization/fa/labels.inc [new file with mode: 0644]
program/localization/fa/messages.inc [new file with mode: 0644]
program/localization/fi/labels.inc
program/localization/fi/messages.inc
program/localization/fr/labels.inc
program/localization/fr/messages.inc
program/localization/ga_IE/labels.inc [new file with mode: 0755]
program/localization/ga_IE/messages.inc [new file with mode: 0755]
program/localization/gl/labels.inc [new file with mode: 0644]
program/localization/gl/messages.inc [new file with mode: 0644]
program/localization/hr/labels.inc [new file with mode: 0644]
program/localization/hr/messages.inc [new file with mode: 0644]
program/localization/hu/labels.inc
program/localization/hu/messages.inc
program/localization/index.inc
program/localization/it/labels.inc
program/localization/it/messages.inc
program/localization/ja/labels.inc
program/localization/ja/messages.inc
program/localization/lt/labels.inc
program/localization/lt/messages.inc
program/localization/mk/labels.inc [new file with mode: 0755]
program/localization/mk/messages.inc [new file with mode: 0755]
program/localization/ms_MY/labels.inc [new file with mode: 0644]
program/localization/ms_MY/messages.inc [new file with mode: 0644]
program/localization/nl_NL/labels.inc
program/localization/nl_NL/messages.inc
program/localization/pl/labels.inc
program/localization/pl/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/ru/labels.inc [changed mode: 0755->0644]
program/localization/ru/messages.inc [changed mode: 0755->0644]
program/localization/se/labels.inc
program/localization/se/messages.inc
program/localization/si/messages.inc
program/localization/sk/labels.inc
program/localization/sk/messages.inc
program/localization/sl/labels.inc [changed mode: 0755->0644]
program/localization/sl/messages.inc [changed mode: 0755->0644]
program/localization/tr/labels.inc
program/localization/tr/messages.inc
program/localization/uk/labels.inc [new file with mode: 0644]
program/localization/uk/messages.inc [new file with mode: 0644]
program/localization/zh_CN/labels.inc [new file with mode: 0644]
program/localization/zh_CN/messages.inc [new file with mode: 0644]
program/localization/zh_TW/labels.inc [changed mode: 0755->0644]
program/localization/zh_TW/messages.inc [changed mode: 0755->0644]
program/steps/addressbook/copy.inc
program/steps/addressbook/func.inc
program/steps/addressbook/mailto.inc
program/steps/addressbook/save.inc
program/steps/error.inc
program/steps/mail/addcontact.inc
program/steps/mail/check_recent.inc
program/steps/mail/compose.inc
program/steps/mail/folders.inc
program/steps/mail/func.inc
program/steps/mail/get.inc
program/steps/mail/getunread.inc
program/steps/mail/list.inc
program/steps/mail/move_del.inc
program/steps/mail/quotadisplay.inc
program/steps/mail/rss.inc
program/steps/mail/search.inc
program/steps/mail/sendmail.inc
program/steps/mail/show.inc
program/steps/mail/spell.inc
program/steps/mail/upload.inc
program/steps/mail/viewsource.inc
program/steps/settings/edit_identity.inc
program/steps/settings/func.inc
program/steps/settings/manage_folders.inc
program/steps/settings/save_prefs.inc
skins/default/colorpicker.css [new file with mode: 0644]
skins/default/common.css [changed mode: 0755->0644]
skins/default/editor_content.css [new file with mode: 0644]
skins/default/editor_popup.css [new file with mode: 0644]
skins/default/editor_ui.css [new file with mode: 0644]
skins/default/googiespell.css [changed mode: 0755->0644]
skins/default/images/buttons/down_arrow.png [changed mode: 0755->0644]
skins/default/images/buttons/up_arrow.png [changed mode: 0755->0644]
skins/default/images/display/loading.gif [changed mode: 0755->0644]
skins/default/images/icons/plus.gif [changed mode: 0755->0644]
skins/default/mail.css
skins/default/pngbehavior.htc
skins/default/settings.css
skins/default/splitter.js [new file with mode: 0644]
skins/default/templates/addressbook.html
skins/default/templates/compose.html
skins/default/templates/mail.html
skins/default/templates/message.html

index 9474105deebc1b20727adaf9a95ffaeeed5c8e3f..b40b7ea8a5a909ece100624095dd5252e6130c77 100644 (file)
--- a/.htaccess
+++ b/.htaccess
@@ -1,10 +1,23 @@
 # AddDefaultCharset    UTF-8
-php_flag       display_errors  Off
-php_flag       log_errors      On
-php_value      error_log       logs/errors
-php_value      upload_max_filesize     2M
+AddType text/x-component .htc
 
-<FilesMatch "(\.inc|\~)$|^_">
+<IfModule mod_php4.c>
+  php_flag     display_errors  Off
+  php_flag     log_errors      On
+  php_value    error_log       logs/errors
+  php_value    upload_max_filesize     5M
+  php_value    post_max_size   6M
+</IfModule>
+
+<IfModule mod_php5.c>
+  php_flag     display_errors  Off
+  php_flag     log_errors      On
+  php_value    error_log       logs/errors
+  php_value    upload_max_filesize     5M
+  php_value    post_max_size   6M
+</IfModule>
+
+<FilesMatch "(\.inc|\~)$">
   Order allow,deny
   Deny from all
 </FilesMatch>
index 2ab885f4bb1abcbfac5ee8723fc211094fd56a6e..96c8b269c2c448af9fd2628dfc14518c0cefc1e7 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
 CHANGELOG RoundCube Webmail
 ---------------------------
 
-2007/05/18 (thomasb)
-----------
+- Enable drag-&-dropping of folders to a new parent and allow to create subfolders (#1457344)
+- Suppress IE errors when clearing attachments form (#1484356)
+- Set preferences field in user table to NULL (#1484386)
+- Log error when login fails due to auto_create_user turned off
+- Filter linked/imported CSS files (closes #1484056)
+- Improve message compose screen (closes #1484383)
+- Select next row after removing one from list (#1484387)
+- Make smtp HELO/EHLO hostname configurable (#1484067)
+- IPv6 Compatability (#1484322), Patch #1484373
+- Unlock interface when message sending fails (#1484570)
+- Eval PHP code in template includes (if configured)
+- Show message when folder is empty. Mo more static text in table (#1484395)
+- Only display unread count in page title when new messages arrived
+- Fixed wrong delete button tooltip (#1483965)
+- Fixed charset encoding bug (#1484429)
+- Applied patch for LDAP version (#1484552)
+- Improved XHTML validation
+- Fix message list selection (#1484550)
+- Better fix lowercased usernames (#1484473)
+- Update pngbehavior Script as suggested in #1484490
+- Fixed moving/deleting messages when more than 1 is selected
+- Applied patch for LDAP contacts listing by Glen Ogilvie
+- Applied patch for more address fields in LDAP contacts (#1484402)
+- Add alternative for getallheaders() (fix #1484508)
+- Identify mailboxes case-sensitive
+- Sort mailbox list case-insensitive (closes #1484338)
+- Fix display of multipart messages from Apple Mail (closes #1484027)
+- Protect AJAX request from being fetched by a foreign site (XSS)
+- Make autocomplete for loginform configurable by the skin template
+- Fix compose function from address book (closes #1484426)
+- Added //IGNORE to iconv call (patch #1484420, closes #1484023)
+- Check if mbstring supports charset (#1484290 and #1484292)
+- Prefer iconv over mbstring (as suggested in #1484292)
+- Check filesize of template includes (#1484409)
+- Fixed bug with buttons not dimming/enabling properly after switching folders
+- Fixed compose window becoming unresponsive after saving a draft (#1484487)
+- Re-enabled "Back" button in compose window now that bug #1484487 is fixed
+- Fixed unresponsive interface issue when downloading attachments (#1484496)
+- Lowered status message time from 5 to 3 seconds to improve responsiveness
+- Raised .htaccess upload_max_filesize from 2M to 5M to differ from default php.ini
+- Increased "mailboxcontrols" mail.css width from 160 to 170px to fix non-english languages (#1484499)
+- Fix status message bug #1484464 with regard to #1484353
+- Fix address adding bug reported by David Koblas
+- Applied socket error patch by Thomas Mangin
+- Pass-by-reference workarround for PHP5 in sendmail.inc
+- Fixed buggy imap_root settings (closes #1484379)
+- Prevent default events on subject links (#1484399)
 - Use HTTP-POST requests for actions that change state
 
+RELEASE 0.1.-RC1
 
-2007/05/17 (thomasb)
-----------
-- Updated Catalan, Russian, Portuguese, Slovak and Chinese translations
-- Renamed localization folder for Chinese (Big5)
-- Chanegd Slovenian language code from 'si' to 'sl'
-- Added Sinhala (Sri-Lanka) localization
 - Use global filters and bind username/ for Ldap searches (#1484159)
 - Hide quota display if imap server does not support it
 - Hide address groups if no LDAP servers configured
 - Add link to message subjects (closes #1484257)
 - Better SQL query for contact listing/search (closes #1484369)
-
-
-2007/05/13 (thomasb)
-----------
-- Updated Norwegian (bokmal), Czech, Danish and Portuguese (standard) translation
 - Fixed marking as read in preview pane (closes #1484364)
 - CSS hack to display attachments correctly in IE6
 - Wrap message body text (closes #1484148)
-
-
-2007/05/03 (yllar)
-----------
-- Updated French, Lithuanian, Armenian, Spanish and Italian translations
-
-
-2007/05/01 (thomasb)
-----------
-- Updated German, Euskara, Hungarian, Romanian and Spanish translation
-- Added Hindi and Kurdish localization
-
-
-2007/04/28 (thomasb)
-----------
 - LDAP access is back in address book (closes #1484087)
 - Added search function for contacts
 - New Template parsing and output encoding
 - Fixed bugs #1484119 and #1483978
-
-
-2007/04/08 (thomasb)
-----------
 - Fixed message moving procedure (closes #1484308)
 - Fixed display of multiple attachments (closes #1466563)
 - Fixed check for new messages (closes #1484310)
 - List attachments without filename
-
-
-2007/03/27 (thomasb)
-----------
 - New session authentication: Change sessid cookie when login, authentication with sessauth cookie is now configurable.
   Should close bugs #1483951 and #1484299
-
-
-2007/03/23 (thomasb)
-----------
 - Correctly translate mailbox names (closes #1484276)
 - Quote e-mail address links (closes #1484300)
-
-
-2007/03/21 (thomasb)
-----------
 - Updated PEAR::Mail_mime package
-- Added Persian localization
-- Updated Catalan and Brazilian Portuguese translations
-- Updated INSTALL manual with a note about database passwords
 - Accept single quotes for HTML attributes when modifying message body (thanks Jason)
 - Sanitize input for new users/identities (thanks Colin Alston)
-
-
-2007/03/19 (thomasb)
-----------
 - Don't download HTML message parts
 - Convert HTML parts to plaintext if 'prefer_html' is off
 - Correctly parse message/rfc822 parts (closes #1484045)
-- Code cleanup
-
-
-2007/03/18 (thomasb)
-----------
 - Also use user_id for unique key in messages table (closes #1484074)
 - Hide contacts drop down on blur (closes #1484203)
 - Make entries in contacts drop down clickable
 - Turn off browser autocompletion on login page
 - Quote <? in text/html message parts
 - Hide border around radio buttons
-- Replaced old JS function calls.
-
-
-2007/03/13 (thomasb)
-----------
 - Applied patch for attachment download by crichardson (closes #1484198)
 - Fixed bug in Postgres DB handling (closes #1484068)
 - Fixed bug of invalid calls to fetchRow() in rcube_db.inc (closes #1484280)
@@ -104,111 +91,31 @@ CHANGELOG RoundCube Webmail
 - Fixed flag for deletion in list view (closes #1484264)
 - Finally support semicolons as recipient separator (closes ##1484251)
 - Fixed message headers (subject) encoding
-
-
-2007/03/04 (tomekp)
-----------
 - check if safe mode is on or not (closes #1484269)
-
-
-2007/03/02 (thomasb)
-----------
 - Show "no subject" in message list if subject is missing (closes #1484243)
 - Solved page caching of message preview (closes #1484153)
 - Only use gzip compression if configured (closes #1484236)
-
-
-2007/02/25 (estadtherr)
-----------
 - Fixed priority selector issue (#1484150)
-- Upgraded to TinyMCE v2.1.0
-
-
-2007/02/21 (thomasb)
-----------
 - Fixed some CSS issues in default skin (closes #1484210 and #1484161)
 - Prevent from double quoting of numeric HTML character references (closes #1484253)
-
-
-2007/02/07 (tomekp)
-----------
-- Updated (bg) translation (Doichin Dokov)
-
-
-2007/02/06 (tomekp)
-----------
-- Updated (pl) translation
-- Updated (pt_BR) translation (Robson F. Ramaldes)
-- Big cleanup in program/localization
-
-
-2007/02/05 (thomasb)
-----------
-- Updated Italian, Slovenian, Greek, Bulgarian, Hungarian and Croatian translation
-
-
-2007/01/07 (estadtherr)
-----------
 - Fixed display of HTML message attachments (closes #1484178)
-
-
-2007/01/07 (thomasb)
-----------
 - Applied patch for preview caching (closes #1484186)
-- Added Thai and Vietnamese localization files
-
-
-2006/12/29 (thomasb)
-----------
 - Added error handling for attachment uploads
 - Use multibyte safe string functions where necessary (closes #1483988)
-- Updated Swiss German localization (de_CH)
-
-
-2006/12/22 (thomasb)
-----------
 - Applied security patch to validate the submitted host value (by Kees Cook)
 - Applied security patch to validate input values when deleting contacts (by Kees Cook)
 - Applied security patch that sanitizes emoticon paths when attaching them (by Kees Cook)
 - Applied a patch to more aggressively sanitize a HTML message
 - Visualize blocked images in HTML messages
-
-
-2006/12/20 (thomasb)
-----------
 - Fixed wrong message listing when showing search results (closes #1484131)
-- Introduced functions Q() and JQ() as aliases for rep_specialchars_output()
 - Show remote images when opening HTML message part as attachment
-
-
-2006/12/17 (thomasb)
-----------
-- Added patch by Ryan Rittenhouse & David Glick for a resizeable preview pane
-
-
-2006/12/06 (thomasb)
-----------
 - Improve memory usage when sending mail (closes #1484098)
 - Mark messages as read once the preview is loaded (closes #1484132)
 - Include smtp final response in log (closes #1484081)
-
-
-2006/12/04 (thomasb)
-----------
 - Corrected date string in sent message header (closes #1484125)
 - Correclty choose "To" column in sent and draft mailboxes (closes #1483943)
 - Changed srong tooltips for message browse buttons (closes #1483930)
-
-
-2006/12/03 (estadtherr)
-----------
-- Added fix to convert HTML signatures for plain text messages
 - Fixed signature delimeter character to be standard (Bug #1484035)
-
-
-2006/12/01 (thomasb)
-----------
-- Implemented preview pane
 - Fixed XSS vulnerability (Bug #1484109)
 - Remove newlines from mail headers (Bug #1484031)
 - Selection issues when moving/deleting (Bug #1484044)
@@ -216,504 +123,34 @@ CHANGELOG RoundCube Webmail
 - ISO-encode IMAP password for plaintext login (Bugs #1483977 & #1483886)
 - Fixed folder name encoding in subscription list (Bug #1484113)
 - Fixed JS errors in identity list (Bug #1484120)
-- Show client debug console on debug_level 8
-- Added Serbian translation
-- Updated Spanish and Bulgarian localization
-
-
-2006/11/22 (robin)
-----------
-- Fix a bug introduced with Shift-Del yesterday
-
-
-2006/11/21 (robin)
-----------
-- Add missing nl_NL translations
 - Translate foldernames in folder form (closes #1484113)
-
-
-2006/11/21 (robin)
-----------
 - Added first and last buttons to message list, address book
   and message detail
 - Pressing Shift-Del bypasses Trash folder
 - Enable purge command for Junk folder
-
-
-2006/11/17 (robin)
-----------
-- Re-initialize message list after shift-select and delete
-
-
-2006/11/16 (robin)
-----------
-- Fixed updating message list after expunge and purge
 - Fetch all aliases if virtuser_query is used instead
-  of only the first one
-
-
-2006/11/11 (estadtherr)
-----------
-- fixed deletion/moving of messages from within "show" page
-
-
-2006/11/09 (thomasb)
-----------
-- Little bugfix in HTML encoding
-- Fixed encoding issues and delete-on-reply problem
-- Corrected template parsing
-
-
-2006/11/07 (estadtherr)
-----------
-- Upgraded to TinyMCE v2.0.8
-- Fixed CSS path for editor popups
-
-2006/09/26 (estadtherr)
-----------
-- Added spellchecker plugin to TinyMCE configuration
-- Fixed HTML/Plain toggle labels
-
-
-2006/09/24 (thomasb)
-----------
-- Partial client re-write with a common list class
 - Re-enabled multi select of contacts (Bug #1484017)
 - Enable contact editing right after creation (Bug #1459641)
-- Updated Hungarian, Estonian and Traditional Chinese localization
-
-
-2006/09/19 (thomasb)
-----------
 - Correct UTF-7 to UTF-8 conversion if mbstring is not available
-
-
-2006/09/13 (estadtherr)
-----------
-- Introduction of TinyMCE HTML editor support for message composition and signatures
-  Note : a new column is added to the "identities" database table
-
-
-2006/09/12 (estadtherr)
-----------
-- Fixed html2text treatment of table headers (Bug #1484020)
 - Fixed IMAP fetch of message body (Bug #1484019)
-
-
-2006/09/08 (thomasb)
-----------
 - Fixed safe_mode problems (Bug #1418381)
 - Fixed wrong header encoding (Bug #1483976)
-
-
-2006/09/07 (thomasb)
-----------
 - Made automatic draft saving configurable
 - Fixed JS bug when renaming folders (Bug #1483989)
-- Don't wait for complete page load when calling JavaScript init()
-- Some improvements to prevent session expiration
-- Prevent from double submit of spell check requests
-
-
-2006/09/01 (thomasb)
-----------
-- Imporoved message parsing and HTML validation
 - Added quota display as image (by Brett Patterson)
 - Corrected creation of a message-id
-- Updated Norwegian (bokmal) localization
-
-
-2006/08/30 (thomasb)
-----------
 - New indentation for quoted message text
 - Improved HTML validity
-
-
-2006/08/28 (estadtherr)
-----------
 - Fixed URL character set (Ticket #1445501)
 - Fixed saving of contact into MySQL from LDAP query results (Ticket #1483820)
-
-
-2006/08/25 (thomasb)
-----------
 - Fixed folder renaming: unsubscribe before rename (Bug #1483920)
 - Finalized new message parsing (+ chaching)
-- Updated SQL scripts and UPGRADING instructions
-
-
-2006/08/23 (thomasb)
-----------
-- Updated Polish, Portuguese, Latvian, Chinese and Japanese localization
-
-
-2006/08/20 (thomasb)
-----------
 - Fixed wrong usage of mbstring (Bug #1462439)
 - Set default spelling language (Ticket #1483938)
 - Added support for Nox Spell Server
-
-
-2006/08/18 (thomasb)
-----------
 - Re-built message parsing (Bug #1327068)
   Now based on the message structure delivered by the IMAP server.
 - Fixed some XSS and SQL injection issues
-
-
-2006/08/10 (thomasb)
-----------
 - Fixed charset problems with folder renaming
 
 
-2006/08/04 (thomasb)
-----------
-- Fixed Bug in saving identities (Ticket #1483915)
-- Set folder name in window title (Bug #1483919)
-- Don't add imap_root to INBOX path (Bug #1483816)
-- Attempt to create default folders only after login
-- Avoid usage of $CONFIG in rcube_imap class
-
-
-2006/07/30 (thomasb)
-----------
-- Alter links in HTML messages (Bug #1326402)
-- Added fallback if host not found in 'mail_domain' array
-- Applied patch of Charles to highlight droptargets (Ticket #1473034)
-- Fixed folder renaming (Bug #1483914)
-- Added confirmation message after deleting a folder
-
-
-2006/07/25 (thomasb)
-----------
-- Made folder renaming a bit more ajax-style
-- Changed rename-labels and German translation
-- Fixed addressbox countbar width (Bug #1483845)
-- Fixed refresh interval problems in Safari (Bug #1483902) 
-- Fixed clear_message_list_header() errors (Bug #1483898)
-- Sanity check of $message_set in imap.inc (Bug #1443200)
-- Added correct changing of message list headers for Sent folder
-- Updated Spanish localization (Ticket #1483887)
-- Applied patch #1483846
-
-
-2006/07/24 (richs)
-----------
-- Draft window no longer reloads. It saves to an iframe in the background instead (fixes bug #1483869)
-- Draft timer now part of program/js/app.js instead of skins/default/templates/compose.inc
-- Draft saving now properly returns an error when saving fails
-- Draft timer stops and resets properly when attachments are uploaded, or when saving manually
-- Old compose session/attachments are now cleaned up when a new/forward/reply/draft is made/opened
-
-
-2006/07/19 (thomasb)
-----------
-- Correct entity encoding of link urls (HTML validity)
-- Improved usability in compose step (Ticket #1483807)
-- Added absolute URLs to several buttons (for "open in new window")
-- Applied patch #1328032
-- Fixed Bug/Patch #1443200
-
-
-2006/07/18 (thomasb)
-----------
-- Fixed password with spaces issue (Bug #1364122)
-- Replaced _auth hash with second cookie (Ticket #1483811)
-- Don't use get_input_value() for passwords (Bug #1468895)
-- Made password encryption key configurable
-- Minor bugfixes with charset encoding
-- Added <label> tags to forms (Ticket #1483810)
-
-
-2006/07/07 (thomasb)
-----------
-- Fixed INSTALL_PATH bug #1425663
-
-
-2006/07/03 (richs)
-----------
-- Fixed compatibility with in-body email addresses containing "+" (Bug #1483836)
-- Updated French localizations (Ticket #1483862)
-- Incoming messages can now be moved to Drafts, edited, saved, then moved back (Feature #1436191)
-- Added Firefox workaround when clicking whitespace to drag messages (Bug #1483857)
-- Corrected Dutch and Italian localizations (Ticket #1483851 and #1483848)
-- Enabled 'Empty' (purge) command for Junk mailbox (defined in main.inc.php) 
-
-
-2006/06/30 (richs)
-----------
-- Fixed empty INBOX compatibility bug (Patch #1443200)
-- Temporarily fixed French "compact" localization (Patch #1483862)
-- Fixed "Select All" not working with Delete interface button (Bug #1332434)
-- Fixed messsage list column compatibility with Konqueror (Bug #1395711)
-- Fixed "unread count" in window title when count changed (Bug #1483812)
-- Fixed DB error when deleting from message table (Patch #1483835)
-
-
-2006/06/29 (richs)
-----------
-- Added ability to remove attachments (Feature #1436721)
-- Default folders are now auto-created on first login (Feature #1471594)
-- Fixed compatibility with folder apostrophes (e.g.: Joe's Folder) (Bug #1429458)
-- Corrected Italian localizations
-- Tweaked rename-folder form to clear after a rename
-
-
-2006/06/26 (richs)
-----------
-- Added button to immediately check for new messages 
-- New message checking now displays status "Checking for new messages..."
-- New message checking now looks for unread messages in all mailboxes (Feature #1326401)
-- Task buttons now respond to clicks by darkening (as in other applications)
-- Fixed "Sender" column changing to "Recipient" for "Sent" and "Drafts" message lists
-- Added ability to sort messages by "Size"
-- Added ability to rename folders (Feature #1326396)
-- Added 'protect_default_folders' option to main.inc.php to prevent renames/deletes/unsubscribes of default folders
-- Corrected 5 typos of "INSTLL" to "INSTALL" in program/include/main.inc
-
-
-2006/06/25
-----------
-- Changed behavior to include host-specific configuration (Bug #1483849)
-- Assume ISO-8859-1 encoding of mail messages by default (Patch #1483839)
-- Fixed spell checker to work with the new URL at google.com
-- Some memory and security optimizations sendmail.inc
-- Updated UGRADING description
-
-
-2006/06/19
-----------
-- Added Drafts support (Feature #1326839) (richs)
-
-
-2006/06/02
-----------
-- Updated Estonian localization and moved from ee to et
-- Added Bulgarian localization
-
-
-2006/05/25
-----------
-- Finalized GoogieSpell integration
-
-
-2006/05/18
-----------
-- Added Arabic and Armenian localizations
-- Updated Russian localization
-- Removed MDB2 classes from repository. Install them seperately if used.
-- Updated MDB2 wrapper class contributed by Lukas Kahwe Smith
-- Allow & in e-mail addresses
-
-
-2006/05/05
-----------
-- Fixed typos in function rcube_button() (Bugs #1473198 and #1473201)
-- Check for zlib.output_compression before using ob_gzhandler (Bug #1471069)
-- Casting date parts in iil_StrToTime() to avoid warnings (Bug #1482140)
-- Corrected INSTALL description (Bug #1476106)
-- Added charset to javascript HTTP headers
-- Fixed Opera bug with CC and BCC fields (Bug #1474576)
-- Changed login page title regarding product name (Bug #1476413)
-- Pimped search function
-- Applied attachment viewing/forwarding patches by Andrew Fladmark
-- Applied prev/next patch by Leonard Bouchet
-- Applied patches by Mark Bucciarelli
-- Applied patch for requesting receipts by Salvatore Ansani
-- Integrated GoogieSpell as suggested by phil (styling is not perfect yet, localization is missing)
-
-
-2006/04/13
-----------
-- Added Slovenian localization
-- Updated Portuguese localization
-- Fixed parent.location problem for compose-links
-- Added sort order saving patch by Jacob Brunson
-- Added gzip compression support
-
-
-2006/04/02
-----------
-- Added Lithuanian localization
-- Improved search function
-- Added version string as template object
-- Load host-specific configuration file (see config/main.inc.php)
-- New config parameter adding domain to user names for login
-- Strip tags on _auth, _action, _task parameters
-- Corrected labels for next/previous page buttons in address book 
-
-
-2006/03/23
-----------
-- Auto-detect mail header delimiters
-- Regard daylight savings
-- Localized quota display
-- Started implementing search function
-
-
-2006/03/20
-----------
-- Avoid error message when saving an unchanged identity (Bug #1429510)
-- Fixed hard-coded cols selection for sent folder (Bug #1354586)
-- Enable some HTML links for use with "open in new window" or "save target"
-- Check meta-key instead of ctrl on Macs
-- Ignore double clicks when holding down a modifier key
-- Fixed reloading of the login page
-- Fixed typo in compose template (Bug #1446852)
-- Added compose button to message read step (Request #1433288)
-- New config parameter for persistent database connections (Bug #1431817)
-
-
-2006/03/14
-----------
-- Don't remove internal HTML tags in plaintext messages
-- Improved error handling in DB connection failure
-
-
-2006/02/22
-----------
-- Updated localizations
-- Fixed bug #1435989
-
-
-2006/02/19
-----------
-- Updated localizations
-- Applied patch of Anders Karlsson
-- Applied patch of Jacob Brunson
-- Applied patch for virtuser_query by Robin Elfrink
-- Added support for References header (patch by Auke)
-- Added support for mbstring module by Tadashi Jokagi
-- Added function for automatic remove of slashes on GET and POST vars
-  if magic_quotes is enabled
-
-
-2006/02/05
-----------
-- Added Slovak, Hungarian, Bosnian and Croation translation
-- Fixed bug when inserting signatures with !?&
-- Chopping message headers before inserting into the message cache table
-  (to avoid bugs in Postgres)
-- Allow one-char domains in e-mail addresses
-- Make product name in page title configurable
-- Make username available as skin object
-- Added session_write_close() in rcube_db class destructor to avoid problems
-  in PHP 5.0.5
-- Use move_uploaded_file() instead of copy() for a more secure handling of
-  uploaded attachments
-- Additional config parameter to show/hide deleted messages
-- Added periodic request for checking new mails (Request #1307821)
-- Added EXPUNGE command
-- Optimized loading time for mail interface
-- Changed to full UTF-8 support
-- Additional timezones (Patch #1389912)
-- Added LDAP public search (experimental)
-- Applied patch for correct ctrl/shift behavior for message selection (Bug #1326364)
-- Casting to strings when adding empty headers to message cache (Bug #1406026)
-- Skip sender-address as recipient when Reply-to-all
-- Fixes in utf8-class
-- Added patch for Quota display by Aury Fink Filho <nuny@aury.com.br>
-- Added garbage collector for message cache
-- Added patches for BCC headers
-
-
-2005/12/16
-----------
-- Added Turkish and Simplified Chinese translation
-- Use virtusertable to resolve e-mail addresses at login
-- Configurable mail_domain used to compose correct e-mail addresses
-  on first login
-
-
-2005/12/03
-----------
-- Added Finnish, Romanian, Polish, Czech, British, Norwegian, Greek, Russian,
-  Estonian and Chinese translation
-- Get IMAP server capabilities in array
-- Check for NAMESPACE capability before sending command
-- Set default user language from config 'locale_string'
-- Added sorting patch for message list
-- Make default sort col/order configurable
-- Fixed XSS in address book and identities
-- Added more XSS protection (Bug #1308236)
-- Added tab indexes for compose form
-- Added 'changed' col to contacts table
-- Support for 160-bit session hashes
-- Added input check for contacts and identities (Patch #1346523)
-- Added messages/warning to compose step (Patch #1323895)
-- Added favicon to the default skin
-- Fixed Bug #1334337 as far as possible
-- Added Reply-To-All functionality (Request #1326395, Patch #1349777)
-- Redesign of client side AJAX code (enable multi threading)
-- Added keep-alive signal every minute
-- Make logs dir configurable
-- Added support for SMTPS
-- Decode attachment file names
-- Make delimiter for message headers configurable
-- Add generic footer to sent messages
-- Choose the rigt identity when replying
-- Remove signature when replying (Request #1333167)
-- Signatures for each identity
-- Select charset when composing message
-- Complete re-design of the caching mechanism
-
-
-2005/08/11
-----------
-- Write list header to client even if list is empty
-- Add functions "select all", "select none" to message list
-- Improved filter for HTML messages to remove potentially malicious tags
-  (script, iframe, object) and event handlers.
-- Buttons for next/previous message in view mode
-- Add new created contact to list and show confirmation status
-- Added folder management (subscribe/create/delete)
-- Log message sending (SMTP log)
-- Grant access for Camino browser
-- Added German translation
-
-
-2005/10/20
-----------
-- Added Swedish, Latvian, Portuguese and Catalan translation
-- Make SMTP auth method configurable
-- Make mailboxlist scrollable (Bug #1326372)
-- Fixed SSL support
-- Improved support for Courier IMAP (root folder and delimiter issues)
-- Moved taskbar from bottom to top
-- Added 'session_lifetime' parameter
-- Fixed wrong unread count when deleting message (Bug #1332434)
-- Srip tags when creating a new folder (Bug #1332084)
-- Translate HTML tags in message headers (Bug #1330134)
-- Correction in German translation (Bug #1329434)
-- Display folder names with special chars correctly (Bug #1330157)
-
-
-2005/10/07
-----------
-- Added French, Italian, Spanish, Danish, Dutch translation
-- Clarified license (Bug #1305966)
-- Fixed PHP warnings (Bug #1299403)
-- Fixed english translation (Bug #1295406)
-- Fixed bug #1290833: Last character of email not seen
-- Fixed bug #1292199 when creating new user
-- Allow more browsers (Bug #1285101)
-- Added setting for showing pretty dates
-- Added support for SQLite database
-- Make use of message caching configurable
-- Also add attachments when forwarding a message
-- Long folder names will not flow over message list (Bug #1267232)
-- Show nested mailboxes hieracically
-- Enable IMAPS by host
-
-
-2005/08/20
-----------
-- Improved cacheing of mailbox messagecount
-- Fixed javascript bug when creating a new message folder
-- Fixed javascript bugs #1260990 and #1260992: folder selection
-- Make Trash folder configurable
-- Auto create folders Inbox, Sent and Trash (if configured)
-- Support for IMAP root folder
-- Added support fot text/enriched messages
-- Make list of special mailboxes configurable
-
diff --git a/INSTALL b/INSTALL
index 17789729d58e91f63c39ec734712414af713641b..5032e4a428461319cb925754935cad40906d4f10 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -18,6 +18,7 @@ REQUIREMENTS
    - DB (1.7.11)
    - Mail_Mime (1.3.1)
    - Net_SMTP (1.2.10)
+* PHP compiled with Open SSL to connect to IMAPS and to use the spell checker
 * A MySQL or PostgreSQL database engine or the SQLite extension for PHP
 * A database with permission to create tables
 
@@ -109,8 +110,14 @@ CONFIGURATION
 =============
 
 Change the files in config/* according your to environment and your needs.
-Details about the config parameters can be found in the config files
-or in the wiki: http://trac.roundcube.net/trac.cgi/wiki/Howto_Config
+Details about the config paramaters can be found in the config files.
+
+You can also modify the default .htaccess file. This is necessary to
+increase the allowed size of file attachments, for example:
+  php_value       upload_max_filesize     2M
+
+To enable the experimental HTML editor you need to set the config
+parameter 'enable_htmleditor' to true.
 
 
 UPGRADING
diff --git a/README b/README
index 40b5b975c2626ad368a3e85016b2be1815bac665..da1bd2e1ddf54300cac5d5664e3bc83a17bbd893 100644 (file)
--- a/README
+++ b/README
@@ -1,6 +1,5 @@
 RoundCube Webmail (http://roundcube.net)
 
-
 Introduction:
 -------------
 RoundCube Webmail is a browser-based multilingual IMAP client with an
@@ -44,6 +43,24 @@ already have a corresponding entry in the user's table (username and hostname)
 will be allowed.
 
 
+Code Layout:
+------------
+Basic sequence (index.php):
+  - index.php -> rcmail_load_gui -> new rcmail_template -> rcmail_template::send
+  - authentication details in this sequence
+
+Tasks
+  - index.php limits tasks to set list
+  - can see task in roundcube link when you mouse over it
+  - task templates stored in skins/default/templates
+  - templates "roundcube:" tokens that get replaced in rcmail_template class
+
+program/include/rcube_shared.inc
+  - defines rcube_html_page, class that lays out a roundcube web page
+  - defines form control classes
+  - provides common functions
+
+
 Contact:
 --------
 For any bug reports or feature requests please refer to the tracking system
@@ -52,6 +69,6 @@ subscribe to our mailing list. See http://www.roundcube.net/?p=mailinglists
 for details.
 
 You're always welcome to send a message to the project admin:
-roundcube@gmail.com
+hello@roundcube.net
 
 
old mode 100755 (executable)
new mode 100644 (file)
index 59916e8..f3b5d5c
@@ -58,7 +58,7 @@ CREATE TABLE [dbo].[session] (
        [sess_id] [varchar] (32) COLLATE Latin1_General_CI_AI NOT NULL ,\r
        [created] [datetime] NOT NULL ,\r
        [changed] [datetime] NULL ,\r
-       [ip] [varchar] (15) COLLATE Latin1_General_CI_AI NOT NULL ,\r
+       [ip] [varchar] (40) COLLATE Latin1_General_CI_AI NOT NULL ,\r
        [vars] [text] COLLATE Latin1_General_CI_AI NOT NULL \r
 ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]\r
 GO\r
index 4a92734d5bc5fee413a1b7060e9495f2f8acf25e..926a83eab4a9b1c9d1b7fc831a7552e5a9fccb33 100644 (file)
@@ -73,7 +73,7 @@ CREATE TABLE `session` (
   `sess_id` varchar(40) NOT NULL default '',
   `created` datetime NOT NULL default '0000-00-00 00:00:00',
   `changed` datetime NOT NULL default '0000-00-00 00:00:00',
-  `ip` VARCHAR(15) NOT NULL default '',
+  `ip` VARCHAR(40) NOT NULL default '',
   `vars` text NOT NULL,
   PRIMARY KEY  (`sess_id`)
 );
@@ -92,7 +92,7 @@ CREATE TABLE `users` (
   `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) NOT NULL default 'en',
-  `preferences` text NOT NULL default '',
+  `preferences` text,
   PRIMARY KEY  (`user_id`)
 );
 
diff --git a/SQL/mysql.update-0.1a.sql b/SQL/mysql.update-0.1a.sql
deleted file mode 100644 (file)
index 054814a..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
--- RoundCube Webmail update script for MySQL databases
--- Updates from version 0.1-20051007
-
-
-ALTER TABLE `session` ADD `ip` VARCHAR(15) NOT NULL AFTER changed;
-ALTER TABLE `users` ADD `alias` VARCHAR(128) NOT NULL AFTER mail_host;
-
-
-
--- RoundCube Webmail update script for MySQL databases
--- Updates from version 0.1-20051021
-
-ALTER TABLE `session` CHANGE `sess_id` `sess_id` VARCHAR(40) NOT NULL;
-
-ALTER TABLE `contacts` CHANGE `del` `del` TINYINT(1) NOT NULL;
-ALTER TABLE `contacts` ADD `changed` DATETIME NOT NULL AFTER `user_id`;
-
-UPDATE `contacts`  SET `del`=0 WHERE `del`=1;
-UPDATE `contacts`  SET `del`=1 WHERE `del`=2;
-
-ALTER TABLE `identities` CHANGE `default` `standard` TINYINT(1) NOT NULL;
-ALTER TABLE `identities` CHANGE `del` `del` TINYINT(1) NOT NULL;
-
-UPDATE `identities`  SET `del`=0 WHERE `del`=1;
-UPDATE `identities`  SET `del`=1 WHERE `del`=2;
-UPDATE `identities`  SET `standard`=0 WHERE `standard`=1;
-UPDATE `identities`  SET `standard`=1 WHERE `standard`=2;
-
-CREATE TABLE `messages` (
-  `message_id` int(11) unsigned NOT NULL auto_increment,
-  `user_id` int(11) unsigned NOT NULL default '0',
-  `del` tinyint(1) NOT NULL default '0',
-  `cache_key` varchar(128) NOT NULL default '',
-  `created` datetime NOT NULL default '0000-00-00 00:00:00',
-  `idx` int(11) unsigned NOT NULL default '0',
-  `uid` int(11) unsigned NOT NULL default '0',
-  `subject` varchar(255) NOT NULL default '',
-  `from` varchar(255) NOT NULL default '',
-  `to` varchar(255) NOT NULL default '',
-  `cc` varchar(255) NOT NULL default '',
-  `date` datetime NOT NULL default '0000-00-00 00:00:00',
-  `size` int(11) unsigned NOT NULL default '0',
-  `headers` text NOT NULL,
-  `structure` text,
-  PRIMARY KEY  (`message_id`),
-  KEY `user_id` (`user_id`),
-  KEY `idx` (`idx`),
-  KEY `uid` (`uid`),
-  UNIQUE `uniqueness` (`cache_key`, `uid`)
-) TYPE=MyISAM;
-
index b64f407c71a1570b02efd41a5c68b5e4001f3c4b..e904be278a688ab2ba8f36d2cf8ead11a7446476 100644 (file)
@@ -1,6 +1,8 @@
 -- RoundCube Webmail update script for MySQL databases
 -- Updates from version 0.1-beta and 0.1-beta2
 
+TRUNCATE TABLE `messages`;
+
 ALTER TABLE `messages`
   DROP `body`,
   DROP INDEX `cache_key`,
@@ -10,6 +12,8 @@ ALTER TABLE `messages`
 ALTER TABLE `identities`
   ADD `html_signature` tinyint(1) default 0 NOT NULL;
 
+ALTER TABLE `session` CHANGE `ip` `ip` VARCHAR(40) 
+  
 -- Uncomment these lines if you're using MySQL 4.1 or higher
 -- ALTER TABLE `users`
 --  DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci,
index 0c0dcb199a2fcd990dc8636cd8f374717f3e66be..1a6ef1990f5ab96d004bf0d1f3a4bfa6cdc975aa 100644 (file)
@@ -12,10 +12,10 @@ CREATE TABLE `session` (
  `sess_id` varchar(40) NOT NULL,
  `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `changed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
- `ip` varchar(15) NOT NULL,
+ `ip` varchar(40) NOT NULL,
  `vars` text NOT NULL,
  PRIMARY KEY(`sess_id`)
-) TYPE=MYISAM CHARACTER SET ascii COLLATE ascii_general_ci;
+) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
 
 
 -- Table structure for table `users`
@@ -28,7 +28,7 @@ CREATE TABLE `users` (
  `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) NOT NULL DEFAULT 'en',
- `preferences` text NOT NULL DEFAULT '',
+ `preferences` text,
  PRIMARY KEY(`user_id`)
 ) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
 
old mode 100755 (executable)
new mode 100644 (file)
index bf82b9b..356a579
@@ -36,7 +36,7 @@ CREATE TABLE "session" (
     sess_id character varying(40) DEFAULT ''::character varying PRIMARY KEY,
     created timestamp with time zone DEFAULT now() NOT NULL,
     changed timestamp with time zone DEFAULT now() NOT NULL,
-    ip character varying(16) NOT NULL,
+    ip character varying(41) NOT NULL,
     vars text NOT NULL
 );
 
index fd2a22f77d67bd38708cdb248f9c8072198b4c6e..4ae752983652d479290231d57fb0743f9fe0e58c 100644 (file)
@@ -93,7 +93,7 @@ CREATE TABLE session (
   sess_id varchar(40) NOT NULL PRIMARY KEY,
   created datetime NOT NULL default '0000-00-00 00:00:00',
   changed datetime NOT NULL default '0000-00-00 00:00:00',
-  ip varchar(15) NOT NULL default '',
+  ip varchar(40) NOT NULL default '',
   vars text NOT NULL
 );
 
index 4f4d0da01abba3d6ce6a9cc8a40b2e79fb97b3f8..a88f92d7ade7a2fc4d55b576892eb36ee77f8703 100644 (file)
--- a/UPGRADING
+++ b/UPGRADING
@@ -4,150 +4,46 @@ UPDATE instructions
 Follow these instructions if upgrading from a previous version
 of RoundCube Webmail.
 
-
-from version 1.0-beta2
+from version 0.1-rc1
 ----------------------------------------
 * replace index.php
 * replace all files in folder /program/
 * replace all files in folder /skins/default/
-* run all commands in SQL/*.update.sql or re-initalize database with *.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, change prop key 'mail_field'
-  to 'email_field' for each server confgured in /config/main.inc.php
+* 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
+from version 0.1-beta2
 ----------------------------------------
 * replace index.php
 * replace all files in folder /program/
 * replace all files in folder /skins/default/
-* run all commands in SQL/*.update.sql or re-initalize database with *.initial.sql
-* add these line to /config/db.inc.php
-  $rcmail_config['db_persistent'] = TRUE;
+* 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['drafts_mbox'] = 'Drafts';
-  $rcmail_config['junk_mbox'] = 'Junk';
-  $rcmail_config['product_name'] = 'RoundCube Webmail';
-  $rcmail_config['read_when_deleted'] = TRUE;
-  $rcmail_config['enable_spellcheck'] = TRUE;
-  $rcmail_config['protect_default_folders'] = TRUE;
-  $rcmail_config['draft_autosave'] = 300;
-  $rcmail_config['date_today'] = 'H:i';
-* replace the following line from /config/main.inc.php
-   @include($_SERVER['HTTP_HOST'].'.inc.php');
-  with 
-   $rcmail_config['include_host_config'] = TRUE;
-
+   $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
 
 
-from version 0.1-20051021
-----------------------------------------
-* replace index.php
-* replace all files in folder /program/
-* replace all files in folder /skins/default/
-* run all commands in SQL/*.update-0.1a.sql or re-initalize database with *.initial.sql
-* add these lines to /config/main.inc.php
-  $rcmail_config['skip_deleted'] = FALSE;
-  $rcmail_config['message_sort_col'] = 'date';
-  $rcmail_config['message_sort_order'] = 'DESC';
-  $rcmail_config['log_dir'] = 'logs/';
-  $rcmail_config['temp_dir'] = 'temp/';
-  $rcmail_config['message_cache_lifetime'] = '10d';
-  $rcmail_config['drafts_mbox'] = 'Drafts';
-  $rcmail_config['product_name'] = 'RoundCube Webmail';
-  $rcmail_config['read_when_deleted'] = TRUE;
-  $rcmail_config['enable_spellcheck'] = TRUE;
-* add these lines to /config/db.inc.php
-  $rcmail_config['db_max_length'] = 512000;
-  $rcmail_config['db_sequence_user_ids'] = 'user_ids';
-  $rcmail_config['db_sequence_identity_ids'] = 'identity_ids';
-  $rcmail_config['db_sequence_contact_ids'] = 'contact_ids';
-  $rcmail_config['db_sequence_cache_ids'] = 'cache_ids';
-  $rcmail_config['db_sequence_message_ids'] = 'message_ids';
-  $rcmail_config['db_persistent'] = TRUE;
-
-
-
-from version 0.1-20051007
+form version 0.1-beta
 ----------------------------------------
 * replace index.php
 * replace all files in folder /program/
 * replace all files in folder /skins/default/
-* run all commands in SQL/*.update-0.1a.sql or re-initalize database with *.initial.sql
+* 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['smtp_auth_type'] = '';  // if you need to specify an auth method for SMTP
-  $rcmail_config['session_lifetime'] = 20;  // to specify the session lifetime in minutes
-  $rcmail_config['skip_deleted'] = FALSE;
-  $rcmail_config['message_sort_col'] = 'date';
-  $rcmail_config['message_sort_order'] = 'DESC';
-  $rcmail_config['log_dir'] = 'logs/';
-  $rcmail_config['temp_dir'] = 'temp/';
-  $rcmail_config['message_cache_lifetime'] = '10d';
-  $rcmail_config['drafts_mbox'] = 'Drafts';
-  $rcmail_config['product_name'] = 'RoundCube Webmail';
-  $rcmail_config['read_when_deleted'] = TRUE;
-  $rcmail_config['enable_spellcheck'] = TRUE;
-* add these lines to /config/db.inc.php
-  $rcmail_config['db_max_length'] = 512000;  
-  $rcmail_config['db_sequence_user_ids'] = 'user_ids';
-  $rcmail_config['db_sequence_identity_ids'] = 'identity_ids';
-  $rcmail_config['db_sequence_contact_ids'] = 'contact_ids';
-  $rcmail_config['db_sequence_cache_ids'] = 'cache_ids';
-  $rcmail_config['db_sequence_message_ids'] = 'message_ids';  
-  $rcmail_config['db_persistent'] = TRUE;
-
-
-
-from version 0.1-20050820
-----------------------------------------
-* replace index.php
-* replace all files in folder /program/
-* replace all files in folder /skins/default/
-* run all commands in SQL/*.update-0.1a.sql or re-initalize database with *.initial.sql
-* add these line to /config/main.inc.php
-  $rcmail_config['prettydate'] = TRUE;
-  $rcmail_config['smtp_port'] = 25;
-  $rcmail_config['default_port'] = 143;
-  $rcmail_config['session_lifetime'] = 20;
-  $rcmail_config['skip_deleted'] = FALSE;
-  $rcmail_config['message_sort_col'] = 'date';
-  $rcmail_config['message_sort_order'] = 'DESC';
-  $rcmail_config['log_dir'] = 'logs/';
-  $rcmail_config['temp_dir'] = 'temp/';
-  $rcmail_config['message_cache_lifetime'] = '10d';
-* replace database properties (db_type, db_host, db_user, db_pass, $d_name)
-  in /config/db.inc.php with the following line:
-  $rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';
-* add these lines to /config/db.inc.php
-  $rcmail_config['db_max_length'] = 512000;
-
-
-
-from versions 0.1-alpha and 0.1-20050811
-----------------------------------------
-* replace index.php
-* replace all files in folder /program/
-* replace all files in folder /skins/default/
-* run all commands in SQL/*.update-0.1a.sql or re-initalize database with *.initial.sql
-* add these line to /config/main.inc.php
-  $rcmail_config['trash_mbox'] = 'Trash';
-  $rcmail_config['default_imap_folders'] = array('INBOX', 'Drafts', 'Sent', 'Junk', 'Trash');
-  $rcmail_config['prefer_html'] = TRUE;
-  $rcmail_config['prettydate'] = TRUE;
-  $rcmail_config['smtp_port'] = 25;
-  $rcmail_config['default_port'] = 143;
-  $rcmail_config['session_lifetime'] = 20;
-  $rcmail_config['skip_deleted'] = FALSE;
-  $rcmail_config['message_sort_col'] = 'date';
-  $rcmail_config['message_sort_order'] = 'DESC';
-  $rcmail_config['log_dir'] = 'logs/';
-  $rcmail_config['temp_dir'] = 'temp/';
-  $rcmail_config['message_cache_lifetime'] = '10d';
-* replace database properties (db_type, db_host, db_user, db_pass, $d_name)
-  in /config/db.inc.php with the following line:
-  $rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';
-* add these lines to /config/db.inc.php
-  $rcmail_config['db_max_length'] = 512000;
-
+   $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;
index e0e2679f7fe4c23d38268fe1bb2ab26b41e86d7b..7f74ac622cfb8532dba063a0ac396068352a64a8 100644 (file)
@@ -8,9 +8,14 @@ $converter = new html2text($htmlText);
 header('Content-Type: text/plain; charset=UTF-8');
 $plaintext = $converter->get_text();
 
-if (function_exists('html_entity_decode'))
+$phpver = explode('.', phpversion());
+$vernum = $phpver[0] . $phpver[1] . $phpver[2];
+
+# html_entity_decode doesn't handle UTF character sets in PHP 4.x
+
+if (($vernum >= 500) && function_exists('html_entity_decode'))
        print html_entity_decode($plaintext, ENT_COMPAT, 'UTF-8');
 else
        print $plaintext;
 
-?>
\ No newline at end of file
+?>
diff --git a/bin/modcss.php b/bin/modcss.php
new file mode 100644 (file)
index 0000000..e482389
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/bin/modcss.php                                                |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2007, RoundCube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Modify CSS source from a URL                                        |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id:  $
+
+*/
+
+$INSTALL_PATH = realpath("./../") . "/";
+ini_set('include_path', $INSTALL_PATH.PATH_SEPARATOR.$INSTALL_PATH.'program'.PATH_SEPARATOR.ini_get('include_path'));
+
+require 'include/main.inc';
+
+$source = "";
+if ($url = preg_replace('/[^a-z0-9.-_\?\$&=%]/i', '', $_GET['u']))
+{
+       $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'] : '');
+
+
+       if ($fp = fsockopen($host, $port, $errno, $errstr, 30))
+       {
+               $out = "GET $path HTTP/1.0\r\n";
+               $out .= "Host: $host\r\n";
+               $out .= "Connection: Close\r\n\r\n";
+               fwrite($fp, $out);
+
+               $header = true;
+               while (!feof($fp))
+               {
+                       $line = trim(fgets($fp, 4048));
+                       
+                       if ($header && preg_match('/^HTTP\/1\..\s+(\d+)/', $line, $regs) && intval($regs[1]) != 200)
+                               break;
+                       else if (empty($line) && $header)
+                               $header = false;
+                       else if (!$header)
+                               $source .= "$line\n";
+               }
+               fclose($fp);
+        }
+}
+
+if (!empty($source))
+{
+       header("Content-Type: text/css");
+       echo rcmail_mod_css_styles($source, preg_replace('/[^a-z0-9]/i', '', $_GET['c']), $url);
+}
+else
+       header("HTTP/1.0 404 Not Found");
+
+?>
diff --git a/bin/msgimport b/bin/msgimport
deleted file mode 100755 (executable)
index f0ed3c0..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/usr/bin/php -qC 
-<?php
-
-$CWD = $INSTALL_PATH = preg_replace('/bin\/$/', '', getcwd() . '/');
-ini_set('include_path',  ini_get('include_path') . PATH_SEPARATOR . $CWD.'program/');
-
-require_once('include/rcube_shared.inc');
-require_once('include/rcube_imap.inc');
-require_once('include/main.inc');
-require_once('include/bugs.inc');
-
-/**
- * Parse commandline arguments into a hash array
- */
-function get_args($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;
-}
-
-
-function print_usage()
-{
-       print "Usage:  msgimport -h imap-host -u user-name -f message-file\n";
-       print "-host   IMAP host\n";
-       print "-user   IMAP user name\n";
-       print "-file   Message file to upload\n";
-}
-
-
-// get arguments
-$args = get_args(array('h' => 'host', 'u' => 'user', 'p' => 'pass', 'f' => 'file')) + array('host' => 'localhost');
-
-if ($_SERVER['argv'][1] == 'help')
-{
-       print_usage();
-       exit;
-}
-else if (!($args['host'] && $args['file']))
-{
-       print "Missing required parameters.\n";
-       print_usage();
-       exit;
-}
-else if (!is_file($args['file']))
-{
-       print "Cannot read message file\n";
-       exit;
-}
-
-// prompt for username if not set
-if (empty($args['user']))
-{
-       //fwrite(STDOUT, "Please enter your name\n");
-       echo "IMAP user: ";
-       $args['user'] = trim(fgets(STDIN));
-}
-
-// prompt for password
-echo "Password: ";
-$args['pass'] = trim(fgets(STDIN));
-
-// parse $host URL
-$a_host = parse_url($args['host']);
-if ($a_host['host'])
-{
-       $host = $a_host['host'];
-       $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? TRUE : FALSE;
-       $imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : 143);
-}
-else
-{
-       $host = $args['host'];
-       $imap_port = 143;
-}
-
-// instantiate IMAP class
-$IMAP = new rcube_imap(null);
-
-// try to connect to IMAP server
-if ($IMAP->connect($host, $args['user'], $args['pass'], $imap_port, $imap_ssl))
-{
-       print "IMAP login successful.\n";
-       print "Uploading message...\n";
-       
-       // upload message from file
-       if  ($IMAP->save_message('INBOX', file_get_contents($args['file'])))
-               print "Message successfully added to INBOX.\n";
-       else
-               print "Adding message failed!\n";
-}
-else
-{
-       print "IMAP login failed.\n";
-}
-
-?>
\ No newline at end of file
index 47696ef69f0483af1812685e59dba96d254e0082..5896eac129e28c29cf15c4321222f2da3c00c454 100644 (file)
@@ -5,7 +5,7 @@
  | program/bin/quotaimg.php                                              |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -166,4 +166,4 @@ function genQuota($used, $total, $width, $height)
 
 genQuota($used, $quota, $width, $height);
 exit;
-?>
\ No newline at end of file
+?>
index 895aa45f23e6a81a25e5bc865fc90b955d4c19df..e142dd71c835b3dec0e71212d72b7f55a42d9c95 100644 (file)
@@ -16,7 +16,7 @@ $rcmail_config = array();
 
 // PEAR database DSN for read/write operations
 // format is db_provider://user:password@host/databse
-// currentyl suported db_providers: mysql, pgsql, sqlite
+// currently supported db_providers: mysql, sqlite
 
 $rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';
 // postgres example: 'pgsql://roundcube:pass@localhost/roundcubemail';
@@ -33,7 +33,9 @@ $rcmail_config['db_backend'] = 'db';
 $rcmail_config['db_max_length'] = 512000;  // 500K
 
 // use persistent db-connections
-$rcmail_config['db_persistent'] = TRUE;
+// beware this will not "always" work as expected
+// see: http://www.php.net/manual/en/features.persistent-connections.php
+$rcmail_config['db_persistent'] = FALSE;
 
 
 // you can define specific table names used to store webmail data
@@ -63,4 +65,4 @@ $rcmail_config['db_sequence_messages'] = 'message_ids';
 
 
 // end db config file
-?>
\ No newline at end of file
+?>
index 3b8e407c8bceaa33aef91fca05ee08a4bd021c4a..926b4e0088c169571782a4aecf1d6c87cdb6c4e5 100644 (file)
@@ -77,6 +77,12 @@ $rcmail_config['smtp_pass'] = '';
 // best server supported one)
 $rcmail_config['smtp_auth_type'] = '';
 
+// 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;
 
@@ -87,6 +93,9 @@ $rcmail_config['list_cols'] = array('subject', 'from', 'date', 'size');
 // relative path to the skin folder
 $rcmail_config['skin_path'] = 'skins/default/';
 
+// includes should be interpreted as PHP files
+$rcmail_config['skin_include_php'] = FALSE;
+
 // use this folder to store temp files (must be writebale for apache user)
 $rcmail_config['temp_dir'] = 'temp/';
 
@@ -121,7 +130,7 @@ $rcmail_config['date_long'] = 'd.m.Y H:i';
 $rcmail_config['date_today'] = 'H:i';
 
 // add this user-agent to message headers when sending
-$rcmail_config['useragent'] = 'RoundCube Webmail/0.1-rc1';
+$rcmail_config['useragent'] = 'RoundCube Webmail/0.1-rc2';
 
 // use this name to compose page titles
 $rcmail_config['product_name'] = 'RoundCube Webmail';
@@ -165,6 +174,8 @@ $rcmail_config['read_when_deleted'] = TRUE;
 $rcmail_config['flag_for_deletion'] = TRUE;
 
 // 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;
 
 // For a locally installed Nox Spell Server, please specify the URI to call it.
@@ -199,14 +210,20 @@ $rcmail_config['mail_header_delimiter'] = NULL;
  *  'base_dn'       => '',
  *  'bind_dn'       => '',
  *  'bind_pass'     => '',
+ *  'ldap_version'  => 3,       // using LDAPv3
  *  'search_fields' => array('mail', 'cn'),  // fields to search in
  *  'name_field'    => 'cn',    // this field represents the contact's name
  *  'email_field'   => 'mail',  // this field represents the contact's e-mail
+ *  'surname_field' => 'sn',    // this field represents the contact's last name
+ *  'firstname_field' => 'gn',  // this field represents the contact's first name
  *  'scope'         => 'sub',   // search mode: sub|base|list
- *  'filter'        => '',      // will be &'d with search field ex: (status=act)
+ *  'filter'        => '',      // used for basic listing (if not empty) and will be &'d with search queries. ex: (status=act)
  *  'fuzzy_search'  => true);   // server allows wildcard search
  */
 
+// enable composing html formatted messages (experimental)
+$rcmail_config['enable_htmleditor'] = FALSE;
+
 // don't allow these settings to be overriden by the user
 $rcmail_config['dont_override'] = array();
 
@@ -223,10 +240,10 @@ $rcmail_config['include_host_config'] = FALSE;
 $rcmail_config['pagesize'] = 40;
 
 // use this timezone to display date/time
-$rcmail_config['timezone'] = 1;
+$rcmail_config['timezone'] = intval(date('O'))/100 - date('I');
 
-// daylight savings are On
-$rcmail_config['dst_active'] = TRUE;
+// is daylight saving On?
+$rcmail_config['dst_active'] = (bool)date('I');
 
 // prefer displaying HTML messages
 $rcmail_config['prefer_html'] = TRUE;
@@ -243,5 +260,8 @@ $rcmail_config['message_sort_order'] = 'DESC';
 // save compose message every 300 seconds (5min)
 $rcmail_config['draft_autosave'] = 300;
 
+// don't let users set pagesize to more than this value if set
+$rcmail_config['max_pagesize'] = 200;
+
 // end of config file
 ?>
index fccfaace7afd597aba1372be6ce8eef53d5124e3..fd12c11c99fdf33806cf75d2e6c45aa20c7140af 100644 (file)
--- a/index.php
+++ b/index.php
@@ -2,7 +2,7 @@
 /*
  +-----------------------------------------------------------------------+
  | RoundCube Webmail IMAP Client                                         |
- | Version 0.1-rc1-dependent                                             |
+ | Version 0.1-rc2-dependent                                             |
  |                                                                       |
  | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: index.php 618 2007-06-13 07:03:59Z thomasb $
+ $Id: index.php 903 2007-10-22 06:52:13Z thomasb $
 
 */
 
 // application constants
-define('RCMAIL_VERSION', '0.1-rc1');
+define('RCMAIL_VERSION', '0.1-rc2');
 define('RCMAIL_CHARSET', 'UTF-8');
 define('JS_OBJECT_NAME', 'rcmail');
 
@@ -66,11 +66,12 @@ if (!defined('PATH_SEPARATOR'))
 // instead the ones provided by RC
 ini_set('include_path', $INSTALL_PATH.PATH_SEPARATOR.$INSTALL_PATH.'program'.PATH_SEPARATOR.$INSTALL_PATH.'program/lib'.PATH_SEPARATOR.ini_get('include_path'));
 
-ini_set('session.name', 'sessid');
+ini_set('session.name', 'roundcube_sessid');
 ini_set('session.use_cookies', 1);
 ini_set('session.gc_maxlifetime', 21600);
 ini_set('session.gc_divisor', 500);
 ini_set('error_reporting', E_ALL&~E_NOTICE); 
+set_magic_quotes_runtime(0);
 
 // increase maximum execution time for php scripts
 // (does not work in safe mode)
@@ -81,7 +82,6 @@ require_once('include/rcube_shared.inc');
 require_once('include/rcube_imap.inc');
 require_once('include/bugs.inc');
 require_once('include/main.inc');
-require_once('include/cache.inc');
 require_once('PEAR.php');
 
 
@@ -172,8 +172,8 @@ if ($_action=='login' && $_task=='mail')
   }
   else
   {
-    $OUTPUT->show_message("loginfailed", 'warning');
-    $_SESSION['user_id'] = '';
+    $OUTPUT->show_message($IMAP->error_code == -1 ? 'imaperror' : 'loginfailed', 'warning');
+    rcmail_kill_session();
   }
 }
 
@@ -201,8 +201,8 @@ if (!empty($_SESSION['user_id']) && $_task=='mail')
   $conn = $IMAP->connect($_SESSION['imap_host'], $_SESSION['username'], decrypt_passwd($_SESSION['password']), $_SESSION['imap_port'], $_SESSION['imap_ssl']);
   if (!$conn)
   {
-    $OUTPUT->show_message('imaperror', 'error');
-    $_SESSION['user_id'] = '';
+    $OUTPUT->show_message($IMAP->error_code == -1 ? 'imaperror' : 'sessionerror', 'error');
+    rcmail_kill_session();
   }
   else
     rcmail_set_imap_prop();
@@ -219,6 +219,16 @@ if (empty($_SESSION['user_id']))
 }
 
 
+// check client X-header to verify request origin
+if ($OUTPUT->ajax_call)
+{
+  if (empty($CONFIG['devel_mode']) && !rc_request_header('X-RoundCube-Referer'))
+  {
+    header('HTTP/1.1 404 Not Found');
+    die("Invalid Request");
+  }
+}
+
 
 // set task and action to client
 $OUTPUT->set_env('task', $_task);
index 46384ff728216b463b2d484fc6b27865fb358da5..4a3cdec73b14b8e3abe46dc4dc5016aaf2b011ff 100644 (file)
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/bugs.inc                                              |
  |                                                                       |
- | This file is part of the BQube Webmail client                         |
- | Copyright (C) 2005, BQube Dev - Switzerland                           |
+ | This file is part of the RoudCube Webmail client                      |
+ | Copyright (C) 2005-2007, RoudCube Dev - Switzerland                   |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: bugs.inc 347 2006-09-16 22:58:51Z estadtherr $
+ $Id: bugs.inc 666 2007-08-07 21:02:12Z thomasb $
 
 */
 
 
-// throw system error and show error page
-function raise_error($arg=array(), $log=FALSE, $terminate=FALSE)
+/**
+ * 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;
   
-  /* $arg keys:
-       int     code
-       string  type (php, xpath, db, imap, javascript)
-       string  message
-       sring   file
-       int     line
-  */
-
   // report bug (if not incompatible browser)
   if ($log && $arg['type'] && $arg['message'])
     log_bug($arg);
@@ -48,61 +58,53 @@ function raise_error($arg=array(), $log=FALSE, $terminate=FALSE)
   }
 
 
-// report error
+/**
+ * Report error according to configured debug_level
+ *
+ * @param array Named parameters
+ * @see raise_error()
+ */
 function log_bug($arg_arr)
-  {
+{
   global $CONFIG, $INSTALL_PATH;
   $program = $arg_arr['type']=='xpath' ? 'XPath' : strtoupper($arg_arr['type']);
 
   // write error to local log file
   if ($CONFIG['debug_level'] & 1)
-    {
-    $log_entry = sprintf("[%s] %s Error: %s in %s on line %d\n",
-                 date("d-M-Y H:i:s O", mktime()),
-                 $program,
-                 $arg_arr['message'],
-                 $arg_arr['file'],
-                 $arg_arr['line']);
+  {
+    $log_entry = sprintf(
+      "[%s] %s Error: %s in %s on line %d\n",
+      date("d-M-Y H:i:s O", mktime()),
+      $program,
+      $arg_arr['message'],
+      $arg_arr['file'],
+      $arg_arr['line']);
                  
     if (empty($CONFIG['log_dir']))
       $CONFIG['log_dir'] = $INSTALL_PATH.'logs';
       
     // try to open specific log file for writing
     if ($fp = @fopen($CONFIG['log_dir'].'/errors', 'a'))
-    
-      {
+    {
       fwrite($fp, $log_entry);
       fclose($fp);
-      }
+    }
     else
-      {
+    {
       // send error to PHPs error handler
       trigger_error($arg_arr['message']);
-      }
     }
+  }
 
-/*
   // resport the bug to the global bug reporting system
   if ($CONFIG['debug_level'] & 2)
-    {
-    $delm = '%AC';
-    http_request(sprintf('http://roundcube.net/log/bug.php?_type=%s&_domain=%s&_server_ip=%s&_client_ip=%s&_useragent=%s&_url=%s%%3A//%s&_errors=%s%s%s%s%s',
-                 $arg_arr['type'],
-                $GLOBALS['HTTP_HOST'],
-                 $GLOBALS['SERVER_ADDR'],
-                 $GLOBALS['REMOTE_ADDR'],
-                 rawurlencode($GLOBALS['HTTP_USER_AGENT']),
-                        $GLOBALS['SERVER_PORT']==43 ? 'https' : 'http',
-                        $GLOBALS['HTTP_HOST'].$GLOBALS['REQUEST_URI'],
-                        $arg_arr['file'], $delm,
-                 $arg_arr['line'], $delm,
-                 rawurlencode($arg_arr['message'])));
-    }
-*/
+  {
+    // 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']))
@@ -112,7 +114,7 @@ function log_bug($arg_arr)
     print nl2br($arg_arr['message']);
     print '<br />';
     flush();
-    }
   }
+}
 
 ?>
diff --git a/program/include/cache.inc b/program/include/cache.inc
deleted file mode 100644 (file)
index 0cfa67b..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/include/cache.inc                                             |
- |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev, - Switzerland                      |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- | PURPOSE:                                                              |
- |   Provide access to the application cache                             |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
- +-----------------------------------------------------------------------+
-
- $Id: cache.inc 88 2005-12-03 16:54:12Z roundcube $
-
-*/
-
-
-function rcube_read_cache($key)
-  {
-  global $DB, $CACHE_KEYS;
-  
-  // query db
-  $sql_result = $DB->query("SELECT cache_id, data
-                            FROM ".get_table_name('cache')."
-                            WHERE  user_id=?
-                            AND    cache_key=?",
-                            $_SESSION['user_id'],
-                            $key);
-
-  // get cached data
-  if ($sql_arr = $DB->fetch_assoc($sql_result))
-    {
-    $data = $sql_arr['data'];
-    $CACHE_KEYS[$key] = $sql_arr['cache_id'];
-    }
-  else
-    $data = FALSE;
-
-  return $data;
-  }
-
-
-function rcube_write_cache($key, $data, $session_cache=FALSE)
-  {
-  global $DB, $CACHE_KEYS, $sess_id;
-  
-  // check if we already have a cache entry for this key
-  if (!isset($CACHE_KEYS[$key]))
-    {
-    $sql_result = $DB->query("SELECT cache_id
-                              FROM ".get_table_name('cache')."
-                              WHERE  user_id=?
-                              AND    cache_key=?",
-                              $_SESSION['user_id'],
-                              $key);
-                                     
-    if ($sql_arr = $DB->fetch_assoc($sql_result))
-      $CACHE_KEYS[$key] = $sql_arr['cache_id'];
-    else
-      $CACHE_KEYS[$key] = FALSE;
-    }
-
-  // update existing cache record
-  if ($CACHE_KEYS[$key])
-    {
-    $DB->query("UPDATE ".get_table_name('cache')."
-                SET    created=now(),
-                       data=?
-                WHERE  user_id=?
-                AND    cache_key=?",
-                $data,
-                $_SESSION['user_id'],
-                $key);
-    }
-  // add new cache record
-  else
-    {
-    $DB->query("INSERT INTO ".get_table_name('cache')."
-                (created, user_id, session_id, cache_key, data)
-                VALUES (now(), ?, ?, ?, ?)",
-                $_SESSION['user_id'],
-                $session_cache ? $sess_id : 'NULL',
-                $key,
-                $data);
-    }
-  }
-
-
-function rcube_clear_cache($key)
-  {
-  global $DB;
-
-  $DB->query("DELETE FROM ".get_table_name('cache')."
-              WHERE  user_id=?
-              AND    cache_key=?",
-              $_SESSION['user_id'],
-              $key);
-  }
-
-
-?>
\ No newline at end of file
index f5c58a4225b6f198241540d8d3ed6ccf7be92b96..55135eb8cc682fc2faaf18c0f0c976522d0f7445 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: main.inc 617 2007-06-13 06:57:22Z thomasb $
+ $Id: main.inc 903 2007-10-22 06:52:13Z thomasb $
 
 */
 
+/**
+ * RoundCube Webmail common functions
+ *
+ * @package Core
+ * @author Thomas Bruederli <roundcube@gmail.com>
+ */
+
 require_once('lib/utf7.inc');
+require_once('include/rcube_shared.inc');
 require_once('include/rcmail_template.inc');
 
 
@@ -29,7 +37,12 @@ define('RCUBE_INPUT_POST', 0x0102);
 define('RCUBE_INPUT_GPC', 0x0103);
 
 
-// register session and connect to server
+/**
+ * Initial startup function
+ * to register session, create database and imap connections
+ *
+ * @param string Current task
+ */
 function rcmail_startup($task='mail')
   {
   global $sess_id, $sess_user_lang;
@@ -46,9 +59,11 @@ function rcmail_startup($task='mail')
     ini_set('session.gc_maxlifetime', ($CONFIG['session_lifetime']) * 120);
 
   // prepare DB connection
-  require_once('include/rcube_'.(empty($CONFIG['db_backend']) ? 'db' : $CONFIG['db_backend']).'.inc');
+  $dbwrapper = empty($CONFIG['db_backend']) ? 'db' : $CONFIG['db_backend'];
+  $dbclass = "rcube_" . $dbwrapper;
+  require_once("include/$dbclass.inc");
   
-  $DB = new rcube_db($CONFIG['db_dsnw'], $CONFIG['db_dsnr'], $CONFIG['db_persistent']);
+  $DB = new $dbclass($CONFIG['db_dsnw'], $CONFIG['db_dsnr'], $CONFIG['db_persistent']);
   $DB->sqlite_initials = $INSTALL_PATH.'SQL/sqlite.initial.sql';
   $DB->db_connect('w');
 
@@ -99,7 +114,11 @@ function rcmail_startup($task='mail')
   }
 
 
-// load roundcube configuration into global var
+/**
+ * Load roundcube configuration array
+ *
+ * @return array Named configuration parameters
+ */
 function rcmail_load_config()
   {
   global $INSTALL_PATH;
@@ -137,7 +156,12 @@ function rcmail_load_config()
   }
 
 
-// load a host-specific config file if configured
+/**
+ * Load a host-specific config file if configured
+ * This will merge the host specific configuration with the given one
+ *
+ * @param array Global configuration parameters
+ */
 function rcmail_load_host_config(&$config)
   {
   $fname = NULL;
@@ -155,7 +179,13 @@ function rcmail_load_host_config(&$config)
   }
 
 
-// create authorization hash
+/**
+ * Create unique authorization hash
+ *
+ * @param string Session ID
+ * @param int Timestamp
+ * @return string The generated auth hash
+ */
 function rcmail_auth_hash($sess_id, $ts)
   {
   global $CONFIG;
@@ -173,7 +203,11 @@ function rcmail_auth_hash($sess_id, $ts)
   }
 
 
-// compare the auth hash sent by the client with the local session credentials
+/**
+ * Check the auth hash sent by the client against the local session credentials
+ *
+ * @return boolean True if valid, False if not
+ */
 function rcmail_authenticate_session()
   {
   global $CONFIG, $SESS_CLIENT_IP, $SESS_CHANGED;
@@ -199,12 +233,16 @@ function rcmail_authenticate_session()
   // check session filetime
   if (!empty($CONFIG['session_lifetime']) && isset($SESS_CHANGED) && $SESS_CHANGED + $CONFIG['session_lifetime']*60 < time())
     $valid = false;
-
+  
   return $valid;
   }
 
 
-// create IMAP object and connect to server
+/**
+ * Create global IMAP object and connect to server
+ *
+ * @param boolean True if connection should be established
+ */
 function rcmail_imap_init($connect=FALSE)
   {
   global $CONFIG, $DB, $IMAP, $OUTPUT;
@@ -233,8 +271,10 @@ function rcmail_imap_init($connect=FALSE)
   }
 
 
-// set root dir and last stored mailbox
-// this must be done AFTER connecting to the server
+/**
+ * Set root dir and last stored mailbox
+ * This must be done AFTER connecting to the server!
+ */
 function rcmail_set_imap_prop()
   {
   global $CONFIG, $IMAP;
@@ -253,10 +293,12 @@ function rcmail_set_imap_prop()
   }
 
 
-// do these things on script shutdown
+/**
+ * Do these things on script shutdown
+ */
 function rcmail_shutdown()
   {
-  global $IMAP;
+  global $IMAP, $CONTACTS;
   
   if (is_object($IMAP))
     {
@@ -264,12 +306,17 @@ function rcmail_shutdown()
     $IMAP->write_cache();
     }
     
+  if (is_object($CONTACTS))
+    $CONTACTS->close();
+    
   // before closing the database connection, write session data
   session_write_close();
   }
 
 
-// destroy session data and remove cookie
+/**
+ * Destroy session data and remove cookie
+ */
 function rcmail_kill_session()
   {
   // save user preferences
@@ -290,7 +337,12 @@ function rcmail_kill_session()
   }
 
 
-// return correct name for a specific database table
+/**
+ * Return correct name for a specific database table
+ *
+ * @param string Table name
+ * @return string Translated table name
+ */
 function get_table_name($table)
   {
   global $CONFIG;
@@ -305,8 +357,13 @@ function get_table_name($table)
   }
 
 
-// return correct name for a specific database sequence
-// (used for Postres only)
+/**
+ * Return correct name for a specific database sequence
+ * (used for Postres only)
+ *
+ * @param string Secuence name
+ * @return string Translated sequence name
+ */
 function get_sequence_name($sequence)
   {
   global $CONFIG;
@@ -321,7 +378,13 @@ function get_sequence_name($sequence)
   }
 
 
-// check the given string and returns language properties
+/**
+ * Check the given string and returns language properties
+ *
+ * @param string Language code
+ * @param string Peropert name
+ * @return string Property value
+ */
 function rcube_language_prop($lang, $prop='lang')
   {
   global $INSTALL_PATH;
@@ -358,7 +421,11 @@ function rcube_language_prop($lang, $prop='lang')
   }
   
 
-// init output object for GUI and add common scripts
+/**
+ * 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
+ */
 function rcmail_load_gui()
   {
   global $CONFIG, $OUTPUT, $sess_user_lang;
@@ -393,22 +460,25 @@ function rcmail_load_gui()
 
   // add some basic label to client
   if (!$OUTPUT->ajax_call)
-    rcube_add_label('loading');
+    rcube_add_label('loading', 'movingmessage');
   }
 
 
-// set localization charset based on the given language
+/**
+ * Set localization charset based on the given language.
+ * This also creates a global property for mbstring usage.
+ */
 function rcmail_set_locale($lang)
   {
   global $OUTPUT, $MBSTRING;
   static $s_mbstring_loaded = NULL;
   
   // settings for mbstring module (by Tadashi Jokagi)
-  if (is_null($s_mbstring_loaded))
-    $MBSTRING = $s_mbstring_loaded = extension_loaded("mbstring");
+  if (is_null($s_mbstring_loaded)) 
+    $MBSTRING = $s_mbstring_loaded = extension_loaded("mbstring"); 
   else
     $MBSTRING = $s_mbstring_loaded = FALSE;
-    
+  
   if ($MBSTRING)
     mb_internal_encoding(RCMAIL_CHARSET);
 
@@ -416,7 +486,11 @@ function rcmail_set_locale($lang)
   }
 
 
-// auto-select IMAP host based on the posted login information
+/**
+ * Auto-select IMAP host based on the posted login information
+ *
+ * @return string Selected IMAP host
+ */
 function rcmail_autoselect_host()
   {
   global $CONFIG;
@@ -444,7 +518,15 @@ function rcmail_autoselect_host()
   }
 
 
-// perfom login to the IMAP server and to the webmail service
+/**
+ * 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 rcmail_login($user, $pass, $host=NULL)
   {
   global $CONFIG, $IMAP, $DB, $sess_user_lang;
@@ -489,7 +571,7 @@ function rcmail_login($user, $pass, $host=NULL)
      Inspired by Marco <P0L0_notspam_binware.org>
   */
   // Check if we need to add domain
-  if (!empty($CONFIG['username_domain']) && !strstr($user, '@'))
+  if (!empty($CONFIG['username_domain']) && !strpos($user, '@'))
     {
     if (is_array($CONFIG['username_domain']) && isset($CONFIG['username_domain'][$host]))
       $user .= '@'.$CONFIG['username_domain'][$host];
@@ -497,14 +579,22 @@ function rcmail_login($user, $pass, $host=NULL)
       $user .= '@'.$CONFIG['username_domain'];
     }
 
+  // try to resolve email address from virtuser table    
+  if (!empty($CONFIG['virtuser_file']) && strpos($user, '@'))
+    $user = rcmail_email2user($user);
+
+  // lowercase username if it's an e-mail address (#1484473)
+  if (strpos($user, '@'))
+    $user = strtolower($user);
 
   // query if user already registered
-  $sql_result = $DB->query("SELECT user_id, username, language, preferences
-                            FROM ".get_table_name('users')."
-                            WHERE  mail_host=? AND (username=? OR alias=?)",
-                            $host,
-                            $user,
-                            $user);
+  $sql_result = $DB->query(
+    "SELECT user_id, username, language, preferences
+     FROM ".get_table_name('users')."
+     WHERE  mail_host=? AND (username=? OR alias=?)",
+    $host,
+    $user,
+    $user);
 
   // user already registered -> overwrite username
   if ($sql_arr = $DB->fetch_assoc($sql_result))
@@ -513,11 +603,6 @@ function rcmail_login($user, $pass, $host=NULL)
     $user = $sql_arr['username'];
     }
 
-  // try to resolve email address from virtuser table    
-  if (!empty($CONFIG['virtuser_file']) && strstr($user, '@'))
-    $user = rcmail_email2user($user);
-
-
   // exit if IMAP login failed
   if (!($imap_login  = $IMAP->connect($host, $user, $pass, $imap_port, $imap_ssl)))
     return FALSE;
@@ -549,6 +634,15 @@ function rcmail_login($user, $pass, $host=NULL)
     {
     $user_id = rcmail_create_user($user, $host);
     }
+  else
+    {
+    raise_error(array(
+      'code' => 600,
+      'type' => 'php',
+      'file' => "config/main.inc.php",
+      'message' => "Acces denied for new user $user. 'auto_create_user' is disabled"
+      ), true, false);
+    }
 
   if ($user_id)
     {
@@ -573,15 +667,21 @@ function rcmail_login($user, $pass, $host=NULL)
   }
 
 
-// create new entry in users and identities table
+/**
+ * Create new entry in users and identities table
+ *
+ * @param string User name
+ * @param string IMAP host
+ * @return mixed New user ID or False on failure
+ */
 function rcmail_create_user($user, $host)
-  {
+{
   global $DB, $CONFIG, $IMAP;
 
   $user_email = '';
 
   // try to resolve user in virtusertable
-  if (!empty($CONFIG['virtuser_file']) && strstr($user, '@')==FALSE)
+  if (!empty($CONFIG['virtuser_file']) && !strpos($user, '@'))
     $user_email = rcmail_user2email($user);
 
   $DB->query("INSERT INTO ".get_table_name('users')."
@@ -593,29 +693,31 @@ function rcmail_create_user($user, $host)
               $_SESSION['user_lang']);
 
   if ($user_id = $DB->insert_id(get_sequence_name('users')))
-    {
+  {
     $mail_domain = rcmail_mail_domain($host);
    
     if ($user_email=='')
-      $user_email = strstr($user, '@') ? $user : sprintf('%s@%s', $user, $mail_domain);
+      $user_email = strpos($user, '@') ? $user : sprintf('%s@%s', $user, $mail_domain);
 
     $user_name = $user!=$user_email ? $user : '';
 
     // try to resolve the e-mail address from the virtuser table
     if (!empty($CONFIG['virtuser_query']) &&
-        ($sql_result = $DB->query(preg_replace('/%u/', $user, $CONFIG['virtuser_query']))) &&
+        ($sql_result = $DB->query(preg_replace('/%u/', $DB->quote($user), $CONFIG['virtuser_query']))) &&
         ($DB->num_rows()>0))
+    {
       while ($sql_arr = $DB->fetch_array($sql_result))
-        {
+      {
         $DB->query("INSERT INTO ".get_table_name('identities')."
                    (user_id, del, standard, name, email)
                    VALUES (?, 0, 1, ?, ?)",
                    $user_id,
                    strip_newlines($user_name),
                    preg_replace('/^@/', $user . '@', $sql_arr[0]));
-        }
+      }
+    }
     else
-      {
+    {
       // also create new identity records
       $DB->query("INSERT INTO ".get_table_name('identities')."
                   (user_id, del, standard, name, email)
@@ -623,25 +725,30 @@ function rcmail_create_user($user, $host)
                   $user_id,
                   strip_newlines($user_name),
                   strip_newlines($user_email));
-      }
+    }
                        
     // get existing mailboxes
     $a_mailboxes = $IMAP->list_mailboxes();
-    }
+  }
   else
-    {
-    raise_error(array('code' => 500,
-                      'type' => 'php',
-                      'line' => __LINE__,
-                      'file' => __FILE__,
-                      'message' => "Failed to create new user"), TRUE, FALSE);
-    }
+  {
+    raise_error(array(
+      'code' => 500,
+      'type' => 'php',
+      'line' => __LINE__,
+      'file' => __FILE__,
+      'message' => "Failed to create new user"), TRUE, FALSE);
+  }
     
   return $user_id;
-  }
+}
 
 
-// load virtuser table in array
+/**
+ * Load virtuser table in array
+ *
+ * @return array Virtuser table entries
+ */
 function rcmail_getvirtualfile()
   {
   global $CONFIG;
@@ -654,7 +761,12 @@ function rcmail_getvirtualfile()
   }
 
 
-// find matches of the given pattern in virtuser table
+/**
+ * Find matches of the given pattern in virtuser table
+ * 
+ * @param string Regular expression to search for
+ * @return array Matching entries
+ */
 function rcmail_findinvirtual($pattern)
   {
   $result = array();
@@ -677,7 +789,12 @@ function rcmail_findinvirtual($pattern)
   }
 
 
-// resolve username with virtuser table
+/**
+ * Resolve username using a virtuser table
+ *
+ * @param string E-mail address to resolve
+ * @return string Resolved IMAP username
+ */
 function rcmail_email2user($email)
   {
   $user = $email;
@@ -698,7 +815,12 @@ function rcmail_email2user($email)
   }
 
 
-// resolve e-mail address with virtuser table
+/**
+ * Resolve e-mail address from virtuser table
+ *
+ * @param string User name
+ * @return string Resolved e-mail address
+ */
 function rcmail_user2email($user)
   {
   $email = "";
@@ -719,10 +841,19 @@ function rcmail_user2email($user)
   } 
 
 
+/**
+ * Write the given user prefs to the user's record
+ *
+ * @param mixed User prefs to save
+ * @return boolean True on success, False on failure
+ */
 function rcmail_save_user_prefs($a_user_prefs)
   {
   global $DB, $CONFIG, $sess_user_lang;
   
+  // merge (partial) prefs array with existing settings
+  $a_user_prefs += (array)$_SESSION['user_prefs'];
+  
   $DB->query("UPDATE ".get_table_name('users')."
               SET    preferences=?,
                      language=?
@@ -742,7 +873,11 @@ function rcmail_save_user_prefs($a_user_prefs)
   }
 
 
-// overwrite action variable  
+/**
+ * Overwrite action variable
+ *
+ * @param string New action value
+ */
 function rcmail_overwrite_action($action)
   {
   global $OUTPUT;
@@ -784,7 +919,12 @@ function show_message($message, $type='notice', $vars=NULL)
   }
 
 
-// encrypt IMAP password using DES encryption
+/**
+ * Encrypt IMAP password using DES encryption
+ *
+ * @param string Password to encrypt
+ * @return string Encryprted string
+ */
 function encrypt_passwd($pass)
   {
   $td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, "");
@@ -797,7 +937,12 @@ function encrypt_passwd($pass)
   }
 
 
-// decrypt IMAP password using DES encryption
+/**
+ * Decrypt IMAP password using DES encryption
+ *
+ * @param string Encrypted password
+ * @return string Plain password
+ */
 function decrypt_passwd($cypher)
   {
   $td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, "");
@@ -810,7 +955,11 @@ function decrypt_passwd($cypher)
   }
 
 
-// return a 24 byte key for the DES encryption
+/**
+ * Return a 24 byte key for the DES encryption
+ *
+ * @return string DES encryption key
+ */
 function get_des_key()
   {
   $key = !empty($GLOBALS['CONFIG']['des_key']) ? $GLOBALS['CONFIG']['des_key'] : 'rcmail?24BitPwDkeyF**ECB';
@@ -826,7 +975,11 @@ function get_des_key()
   }
 
 
-// read directory program/localization/ and return a list of available languages
+/**
+ * Read directory program/localization and return a list of available languages
+ *
+ * @return array List of available localizations
+ */
 function rcube_list_languages()
   {
   global $CONFIG, $INSTALL_PATH;
@@ -853,7 +1006,9 @@ function rcube_list_languages()
   }
 
 
-// add a localized label to the client environment
+/**
+ * Add a localized label to the client environment
+ */
 function rcube_add_label()
   {
   global $OUTPUT;
@@ -864,7 +1019,10 @@ function rcube_add_label()
   }
 
 
-// remove temp files older than two day
+/**
+ * Garbage collector function for temp files.
+ * Remove temp files older than two days
+ */
 function rcmail_temp_gc()
   {
   $tmp = unslashify($CONFIG['temp_dir']);
@@ -886,7 +1044,10 @@ function rcmail_temp_gc()
   }
 
 
-// remove all expired message cache records
+/**
+ * Garbage collector for cache entries.
+ * Remove all expired message cache records
+ */
 function rcmail_message_cache_gc()
   {
   global $DB, $CONFIG;
@@ -922,21 +1083,23 @@ function rcube_charset_convert($str, $from, $to=NULL)
   if ($from==$to || $str=='' || empty($from))
     return $str;
 
+  // convert charset using iconv module  
+  if (function_exists('iconv') && $from != 'UTF-7' && $to != 'UTF-7')
+    {
+    $iconv_map = array('KS_C_5601-1987' => 'EUC-KR');
+    return iconv(($iconv_map[$from] ? $iconv_map[$from] : $from), ($iconv_map[$to] ? $iconv_map[$to] : $to) . "//IGNORE", $str);
+    }
+
   // convert charset using mbstring module  
   if ($MBSTRING)
     {
-    $to = $to=="UTF-7" ? "UTF7-IMAP" : $to;
-    $from = $from=="UTF-7" ? "UTF7-IMAP": $from;
-
+    $mb_map = array('UTF-7' => 'UTF7-IMAP', 'KS_C_5601-1987' => 'EUC-KR');
+    
     // return if convert succeeded
-    if (($out = mb_convert_encoding($str, $to, $from)) != '')
+    if (($out = mb_convert_encoding($str, ($mb_map[$to] ? $mb_map[$to] : $to), ($mb_map[$from] ? $mb_map[$from] : $from))) != '')
       return $out;
     }
 
-  // convert charset using iconv module  
-  if (function_exists('iconv') && $from!='UTF-7' && $to!='UTF-7')
-    return iconv($from, $to, $str);
-
   // convert string to UTF-8
   if ($from=='UTF-7')
     $str = utf7_to_utf8($str);
@@ -971,10 +1134,6 @@ function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
   if (!$enctype)
     $enctype = $GLOBALS['OUTPUT_TYPE'];
 
-  // convert nbsps back to normal spaces if not html
-  if ($enctype!='html')
-    $str = str_replace(chr(160), ' ', $str);
-
   // encode for plaintext
   if ($enctype=='text')
     return str_replace("\r\n", "\n", $mode=='remove' ? strip_tags($str) : $str);
@@ -1019,11 +1178,10 @@ function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
 
     for ($c=160; $c<256; $c++)  // can be increased to support more charsets
       {
-      $hex = dechex($c);
       $xml_rep_table[Chr($c)] = "&#$c;";
       
       if ($OUTPUT->get_charset()=='ISO-8859-1')
-        $js_rep_table[Chr($c)] = sprintf("\u%s%s", str_repeat('0', 4-strlen($hex)), $hex);
+        $js_rep_table[Chr($c)] = sprintf("\\u%04x", $c);
       }
 
     $xml_rep_table['"'] = '&quot;';
@@ -1047,8 +1205,11 @@ function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
   }
   
 /**
- * Quote a given string. Alias function for rep_specialchars_output
- * @see rep_specialchars_output
+ * Quote a given string.
+ * Shortcut function for rep_specialchars_output
+ *
+ * @return string HTML-quoted string
+ * @see rep_specialchars_output()
  */
 function Q($str, $mode='strict', $newlines=TRUE)
   {
@@ -1056,8 +1217,11 @@ function Q($str, $mode='strict', $newlines=TRUE)
   }
 
 /**
- * Quote a given string. Alias function for rep_specialchars_output
- * @see rep_specialchars_output
+ * Quote a given string for javascript output.
+ * Shortcut function for rep_specialchars_output
+ * 
+ * @return string JS-quoted string
+ * @see rep_specialchars_output()
  */
 function JQ($str)
   {
@@ -1109,16 +1273,24 @@ function get_input_value($fname, $source, $allow_html=FALSE, $charset=NULL)
     return $value;
   }
 
+
 /**
  * Remove single and double quotes from given string
+ *
+ * @param string Input value
+ * @return string Dequoted string
  */
 function strip_quotes($str)
 {
   return preg_replace('/[\'"]/', '', $str);
 }
 
+
 /**
  * Remove new lines characters from given string
+ *
+ * @param string Input value
+ * @return string Stripped string
  */
 function strip_newlines($str)
 {
@@ -1126,7 +1298,12 @@ function strip_newlines($str)
 }
 
 
-// return boolean if a specific template exists
+/**
+ * Check if a specific template exists
+ *
+ * @param string Template name
+ * @return boolean True if template exists
+ */
 function template_exists($name)
   {
   global $CONFIG;
@@ -1137,15 +1314,25 @@ function template_exists($name)
   }
 
 
-// Wrapper for rcmail_template::parse()
-// @deprecated
+/**
+ * Wrapper for rcmail_template::parse()
+ * @deprecated
+ */
 function parse_template($name='main', $exit=true)
   {
   $GLOBALS['OUTPUT']->parse($name, $exit);
   }
 
 
-
+/**
+ * Create a HTML table based on the given data
+ *
+ * @param  array  Named table attributes
+ * @param  mixed  Table row data. Either a two-dimensional array or a valid SQL result set
+ * @param  array  List of cols to show
+ * @param  string Name of the identifier col
+ * @return string HTML table code
+ */
 function rcube_table_output($attrib, $table_data, $a_show_cols, $id_col)
   {
   global $DB;
@@ -1247,7 +1434,12 @@ function rcmail_get_edit_field($col, $value, $attrib, $type='text')
   }
 
 
-// return the mail domain configured for the given host
+/**
+ * Return the mail domain configured for the given host
+ *
+ * @param string IMAP host
+ * @return string Resolved SMTP host
+ */
 function rcmail_mail_domain($host)
   {
   global $CONFIG;
@@ -1265,7 +1457,57 @@ function rcmail_mail_domain($host)
   }
 
 
-// compose a valid attribute string for HTML tags
+/**
+ * Replace all css definitions with #container [def]
+ *
+ * @param string CSS source code
+ * @param string Container ID to use as prefix
+ * @return string Modified CSS source
+ */
+function rcmail_mod_css_styles($source, $container_id, $base_url = '')
+  {
+  $a_css_values = array();
+  $last_pos = 0;
+
+  // cut out all contents between { and }
+  while (($pos = strpos($source, '{', $last_pos)) && ($pos2 = strpos($source, '}', $pos)))
+  {
+    $key = sizeof($a_css_values);
+    $a_css_values[$key] = substr($source, $pos+1, $pos2-($pos+1));
+    $source = substr($source, 0, $pos+1) . "<<str_replacement[$key]>>" . substr($source, $pos2, strlen($source)-$pos2);
+    $last_pos = $pos+2;
+  }
+
+  // remove html commends 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',
+      '/@import\s+(url\()?[\'"]?([^\)\'"]+)[\'"]?(\))?/ime',
+      '/<<str_replacement\[([0-9]+)\]>>/e',
+      "/$container_id\s+body/i"
+    ),
+    array(
+      '',
+      "\\1#$container_id \\2",
+      "sprintf(\"@import url('./bin/modcss.php?u=%s&c=%s')\", urlencode(make_absolute_url('\\2','$base_url')), urlencode($container_id))",
+      "\$a_css_values[\\1]",
+      "$container_id div.rcmBody"
+    ),
+    $source);
+
+  return $styles;
+  }
+
+
+/**
+ * Compose a valid attribute string for HTML tags
+ *
+ * @param array Named tag attributes
+ * @param array List of allowed attributes
+ * @return string HTML formatted attribute string
+ */
 function create_attrib_string($attrib, $allowed_attribs=array('id', 'class', 'style'))
   {
   // allow the following attributes to be added to the <iframe> tag
@@ -1278,7 +1520,12 @@ function create_attrib_string($attrib, $allowed_attribs=array('id', 'class', 'st
   }
 
 
-// convert a HTML attribute string attributes to an associative array (name => value)
+/**
+ * Convert a HTML attribute string attributes to an associative array (name => value)
+ *
+ * @param string Input string
+ * @return array Key-value pairs of parsed attributes
+ */
 function parse_attrib_string($str)
   {
   $attrib = array();
@@ -1293,6 +1540,14 @@ function parse_attrib_string($str)
   }
 
 
+/**
+ * Convert the given date to a human readable form
+ * This uses the date formatting properties from config
+ *
+ * @param mixed Date representation (string or timestamp)
+ * @param string Date format to use
+ * @return string Formatted date string
+ */
 function format_date($date, $format=NULL)
   {
   global $CONFIG, $sess_user_lang;
@@ -1364,6 +1619,13 @@ function format_date($date, $format=NULL)
   }
 
 
+/**
+ * Compose a valid representaion of name and e-mail address
+ *
+ * @param string E-mail address
+ * @param string Person name
+ * @return string Formatted string
+ */
 function format_email_recipient($email, $name='')
   {
   if ($name && $name != $email)
@@ -1374,206 +1636,6 @@ function format_email_recipient($email, $name='')
 
 
 
-// ************** functions delivering gui objects **************
-
-
-
-function rcmail_message_container($attrib)
-  {
-  global $OUTPUT;
-
-  if (!$attrib['id'])
-    $attrib['id'] = 'rcmMessageContainer';
-
-  // allow the following attributes to be added to the <table> tag
-  $attrib_str = create_attrib_string($attrib, array('style', 'class', 'id'));
-  $out = '<div' . $attrib_str . "></div>";
-  
-  $OUTPUT->add_gui_object('message', $attrib['id']);
-  
-  return $out;
-  }
-
-
-// return the IMAP username of the current session
-function rcmail_current_username($attrib)
-  {
-  global $DB;
-  static $s_username;
-
-  // alread fetched  
-  if (!empty($s_username))
-    return $s_username;
-
-  // get e-mail address form default identity
-  $sql_result = $DB->query("SELECT email AS mailto
-                            FROM ".get_table_name('identities')."
-                            WHERE  user_id=?
-                            AND    standard=1
-                            AND    del<>1",
-                            $_SESSION['user_id']);
-                                   
-  if ($DB->num_rows($sql_result))
-    {
-    $sql_arr = $DB->fetch_assoc($sql_result);
-    $s_username = $sql_arr['mailto'];
-    }
-  else if (strstr($_SESSION['username'], '@'))
-    $s_username = $_SESSION['username'];
-  else
-    $s_username = $_SESSION['username'].'@'.$_SESSION['imap_host'];
-
-  return $s_username;
-  }
-
-
-// return code for the webmail login form
-function rcmail_login_form($attrib)
-  {
-  global $CONFIG, $OUTPUT, $SESS_HIDDEN_FIELD;
-  
-  $labels = array();
-  $labels['user'] = rcube_label('username');
-  $labels['pass'] = rcube_label('password');
-  $labels['host'] = rcube_label('server');
-  
-  $input_user = new textfield(array('name' => '_user', 'id' => 'rcmloginuser', 'size' => 30, 'autocomplete' => 'off'));
-  $input_pass = new passwordfield(array('name' => '_pass', 'id' => 'rcmloginpwd', 'size' => 30));
-  $input_action = new hiddenfield(array('name' => '_action', 'value' => 'login'));
-    
-  $fields = array();
-  $fields['user'] = $input_user->show(get_input_value('_user', RCUBE_INPUT_POST));
-  $fields['pass'] = $input_pass->show();
-  $fields['action'] = $input_action->show();
-  
-  if (is_array($CONFIG['default_host']))
-    {
-    $select_host = new select(array('name' => '_host', 'id' => 'rcmloginhost'));
-    
-    foreach ($CONFIG['default_host'] as $key => $value)
-    {
-      if (!is_array($value))
-        $select_host->add($value, (is_numeric($key) ? $value : $key));
-      else
-        {
-        unset($select_host);
-        break;
-        }
-    }
-      
-    $fields['host'] = isset($select_host) ? $select_host->show($_POST['_host']) : null;
-    }
-  else if (!strlen($CONFIG['default_host']))
-    {
-    $input_host = new textfield(array('name' => '_host', 'id' => 'rcmloginhost', 'size' => 30));
-    $fields['host'] = $input_host->show($_POST['_host']);
-    }
-
-  $form_name = strlen($attrib['form']) ? $attrib['form'] : 'form';
-  $form_start = !strlen($attrib['form']) ? '<form name="form" action="./" method="post">' : '';
-  $form_end = !strlen($attrib['form']) ? '</form>' : '';
-  
-  if ($fields['host'])
-    $form_host = <<<EOF
-    
-</tr><tr>
-
-<td class="title"><label for="rcmloginhost">$labels[host]</label></td>
-<td>$fields[host]</td>
-
-EOF;
-
-  $OUTPUT->add_gui_object('loginform', $form_name);
-  
-  $out = <<<EOF
-$form_start
-$SESS_HIDDEN_FIELD
-$fields[action]
-<table><tr>
-
-<td class="title"><label for="rcmloginuser">$labels[user]</label></td>
-<td>$fields[user]</td>
-
-</tr><tr>
-
-<td class="title"><label for="rcmloginpwd">$labels[pass]</label></td>
-<td>$fields[pass]</td>
-$form_host
-</tr></table>
-$form_end
-EOF;
-
-  return $out;
-  }
-
-
-function rcmail_charset_selector($attrib)
-  {
-  global $OUTPUT;
-  
-  // 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')))
-      $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 select($field_attrib);
-  $select->add(array_values($charsets), array_keys($charsets));
-  
-  $set = $_POST['_charset'] ? $_POST['_charset'] : $OUTPUT->get_charset();
-  return $select->show($set);
-  }
-
-
-// return code for search function
-function rcmail_search_form($attrib)
-  {
-  global $OUTPUT;
-
-  // add some labels to client
-  rcube_add_label('searching');
-
-  $attrib['name'] = '_q';
-
-  if (empty($attrib['id']))
-    $attrib['id'] = 'rcmqsearchbox';
-
-  $input_q = new textfield($attrib);
-  $out = $input_q->show();
-
-  $OUTPUT->add_gui_object('qsearchbox', $attrib['id']);
-
-  // add form tag around text field
-  if (empty($attrib['form']))
-    $out = sprintf(
-      '<form name="rcmqsearchform" action="./" '.
-      'onsubmit="%s.command(\'search\');return false" style="display:inline;">%s</form>',
-      JS_OBJECT_NAME,
-      $out);
-
-  return $out;
-  } 
-
-
 /****** debugging functions ********/
 
 
@@ -1609,7 +1671,7 @@ function console($msg)
  */
 function write_log($name, $line)
   {
-  global $CONFIG;
+  global $CONFIG, $INSTALL_PATH;
 
   if (!is_string($line))
     $line = var_export($line, true);
@@ -1630,6 +1692,9 @@ function write_log($name, $line)
   }
 
 
+/**
+ * @access private
+ */
 function rcube_timer()
   {
   list($usec, $sec) = explode(" ", microtime());
@@ -1637,6 +1702,9 @@ function rcube_timer()
   }
   
 
+/**
+ * @access private
+ */
 function rcube_print_time($timer, $label='Timer')
   {
   static $print_count = 0;
@@ -1651,4 +1719,234 @@ function rcube_print_time($timer, $label='Timer')
   console(sprintf("%s: %0.4f sec", $label, $diff));
   }
 
+
+/**
+ * Return the mailboxlist in HTML
+ *
+ * @param array Named parameters
+ * @return string HTML code for the gui object
+ */
+function rcmail_mailbox_list($attrib)
+  {
+  global $IMAP, $CONFIG, $OUTPUT, $COMM_PATH;
+  static $s_added_script = FALSE;
+  static $a_mailboxes;
+
+  // add some labels to client
+  rcube_add_label('purgefolderconfirm');
+  rcube_add_label('deletemessagesconfirm');
+  
+// $mboxlist_start = rcube_timer();
+  
+  $type = $attrib['type'] ? $attrib['type'] : 'ul';
+  $add_attrib = $type=='select' ? array('style', 'class', 'id', 'name', 'onchange') :
+                                  array('style', 'class', 'id');
+                                  
+  if ($type=='ul' && !$attrib['id'])
+    $attrib['id'] = 'rcmboxlist';
+
+  // allow the following attributes to be added to the <ul> tag
+  $attrib_str = create_attrib_string($attrib, $add_attrib);
+  $out = '<' . $type . $attrib_str . ">\n";
+  
+  // add no-selection option
+  if ($type=='select' && $attrib['noselection'])
+    $out .= sprintf('<option value="0">%s</option>'."\n",
+                    rcube_label($attrib['noselection']));
+  
+  // get mailbox list
+  $mbox_name = $IMAP->get_mailbox_name();
+  
+  // for these mailboxes we have localized labels
+  $special_mailboxes = array('inbox', 'sent', 'drafts', 'trash', 'junk');
+
+
+  // build the folders tree
+  if (empty($a_mailboxes))
+    {
+    // get mailbox list
+    $a_folders = $IMAP->list_mailboxes();
+    $delimiter = $IMAP->get_hierarchy_delimiter();
+    $a_mailboxes = array();
+
+// rcube_print_time($mboxlist_start, 'list_mailboxes()');
+
+    foreach ($a_folders as $folder)
+      rcmail_build_folder_tree($a_mailboxes, $folder, $delimiter);
+    }
+
+// var_dump($a_mailboxes);
+
+  if ($type=='select')
+    $out .= rcmail_render_folder_tree_select($a_mailboxes, $special_mailboxes, $mbox_name, $attrib['maxlength']);
+   else
+    $out .= rcmail_render_folder_tree_html($a_mailboxes, $special_mailboxes, $mbox_name, $attrib['maxlength']);
+
+// rcube_print_time($mboxlist_start, 'render_folder_tree()');
+
+
+  if ($type=='ul')
+    $OUTPUT->add_gui_object('mailboxlist', $attrib['id']);
+
+  return $out . "</$type>";
+  }
+
+
+
+
+/**
+ * Create a hierarchical array of the mailbox list
+ * @access private
+ */
+function rcmail_build_folder_tree(&$arrFolders, $folder, $delm='/', $path='')
+  {
+  $pos = strpos($folder, $delm);
+  if ($pos !== false)
+    {
+    $subFolders = substr($folder, $pos+1);
+    $currentFolder = substr($folder, 0, $pos);
+    }
+  else
+    {
+    $subFolders = false;
+    $currentFolder = $folder;
+    }
+
+  $path .= $currentFolder;
+
+  if (!isset($arrFolders[$currentFolder]))
+    {
+    $arrFolders[$currentFolder] = array('id' => $path,
+                                        'name' => rcube_charset_convert($currentFolder, 'UTF-7'),
+                                        'folders' => array());
+    }
+
+  if (!empty($subFolders))
+    rcmail_build_folder_tree($arrFolders[$currentFolder]['folders'], $subFolders, $delm, $path.$delm);
+  }
+  
+
+/**
+ * Return html for a structured list &lt;ul&gt; for the mailbox tree
+ * @access private
+ */
+function rcmail_render_folder_tree_html(&$arrFolders, &$special, &$mbox_name, $maxlength, $nestLevel=0)
+  {
+  global $COMM_PATH, $IMAP, $CONFIG, $OUTPUT;
+
+  $idx = 0;
+  $out = '';
+  foreach ($arrFolders as $key => $folder)
+    {
+    $zebra_class = ($nestLevel*$idx)%2 ? 'even' : 'odd';
+    $title = '';
+
+    $folder_lc = strtolower($folder['id']);
+    if (in_array($folder_lc, $special))
+      $foldername = rcube_label($folder_lc);
+    else
+      {
+      $foldername = $folder['name'];
+
+      // shorten the folder name to a given length
+      if ($maxlength && $maxlength>1)
+        {
+        $fname = abbrevate_string($foldername, $maxlength);
+        if ($fname != $foldername)
+          $title = ' title="'.Q($foldername).'"';
+        $foldername = $fname;
+        }
+      }
+
+    // add unread message count display
+    if ($unread_count = $IMAP->messagecount($folder['id'], 'RECENT', ($folder['id']==$mbox_name)))
+      $foldername .= sprintf(' (%d)', $unread_count);
+
+    // make folder name safe for ids and class names
+    $folder_id = preg_replace('/[^A-Za-z0-9\-_]/', '', $folder['id']);
+    $class_name = preg_replace('/[^a-z0-9\-_]/', '', $folder_lc);
+
+    // set special class for Sent, Drafts, Trash and Junk
+    if ($folder['id']==$CONFIG['sent_mbox'])
+      $class_name = 'sent';
+    else if ($folder['id']==$CONFIG['drafts_mbox'])
+      $class_name = 'drafts';
+    else if ($folder['id']==$CONFIG['trash_mbox'])
+      $class_name = 'trash';
+    else if ($folder['id']==$CONFIG['junk_mbox'])
+      $class_name = 'junk';
+
+    $js_name = htmlspecialchars(JQ($folder['id']));
+    $out .= sprintf('<li id="rcmli%s" class="mailbox %s %s%s%s"><a href="%s"'.
+                    ' onclick="return %s.command(\'list\',\'%s\',this)"'.
+                    ' onmouseover="return %s.focus_folder(\'%s\')"' .
+                    ' onmouseout="return %s.unfocus_folder(\'%s\')"' .
+                    ' onmouseup="return %s.folder_mouse_up(\'%s\')"%s>%s</a>',
+                    $folder_id,
+                    $class_name,
+                    $zebra_class,
+                    $unread_count ? ' unread' : '',
+                    $folder['id']==$mbox_name ? ' selected' : '',
+                    Q(rcmail_url('', array('_mbox' => $folder['id']))),
+                    JS_OBJECT_NAME,
+                    $js_name,
+                    JS_OBJECT_NAME,
+                    $js_name,
+                    JS_OBJECT_NAME,
+                    $js_name,
+                    JS_OBJECT_NAME,
+                    $js_name,
+                    $title,
+                    Q($foldername));
+
+    if (!empty($folder['folders']))
+      $out .= "\n<ul>\n" . rcmail_render_folder_tree_html($folder['folders'], $special, $mbox_name, $maxlength, $nestLevel+1) . "</ul>\n";
+
+    $out .= "</li>\n";
+    $idx++;
+    }
+
+  return $out;
+  }
+
+
+/**
+ * Return html for a flat list <select> for the mailbox tree
+ * @access private
+ */
+function rcmail_render_folder_tree_select(&$arrFolders, &$special, &$mbox_name, $maxlength, $nestLevel=0)
+  {
+  global $IMAP, $OUTPUT;
+
+  $idx = 0;
+  $out = '';
+  foreach ($arrFolders as $key=>$folder)
+    {
+    $folder_lc = strtolower($folder['id']);
+    if (in_array($folder_lc, $special))
+      $foldername = rcube_label($folder_lc);
+    else
+      {
+      $foldername = $folder['name'];
+      
+      // shorten the folder name to a given length
+      if ($maxlength && $maxlength>1)
+        $foldername = abbrevate_string($foldername, $maxlength);
+      }
+
+    $out .= sprintf('<option value="%s">%s%s</option>'."\n",
+                    htmlspecialchars($folder['id']),
+                    str_repeat('&nbsp;', $nestLevel*4),
+                    Q($foldername));
+
+    if (!empty($folder['folders']))
+      $out .= rcmail_render_folder_tree_select($folder['folders'], $special, $mbox_name, $maxlength, $nestLevel+1);
+
+    $idx++;
+    }
+
+  return $out;
+  }
+
 ?>
index 3609bec1b64b6da76b34d3be7b02d42a5ea9cfe9..15752f8bc4ea04b8d64e671de57af686491c8e42 100644 (file)
@@ -10,7 +10,7 @@
  |                                                                       |
  | PURPOSE:                                                              |
  |   Class to handle HTML page output using a skin template.             |
- |   Extends rcube_html_page class from rcube_shared.inc                 |
+ |   Extends rcube_html_page class from rcube_html.inc                   |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
 
 */
 
-require_once('include/rcube_shared.inc');
 
+/**
+ * Classes and functions for HTML output
+ *
+ * @package View
+ */
 
+require_once('include/rcube_html.inc');
+
+
+/**
+ * Class to create HTML page output using a skin template
+ */
 class rcmail_template extends rcube_html_page
 {
   var $config;
@@ -36,11 +46,14 @@ class rcmail_template extends rcube_html_page
   var $object_handlers = array();
 
 
-  // PHP 5 constructor
+  /**
+   * Constructor
+   *
+   * @param array Configuration array
+   * @param string Current task
+   */
   function __construct(&$config, $task)
   {
-    parent::__construct();
-    
     $this->task = $task;
     $this->config = $config;
     $this->ajax_call = !empty($_GET['_remote']) || !empty($_POST['_remote']);
@@ -61,7 +74,10 @@ class rcmail_template extends rcube_html_page
     }
   }
 
-  // PHP 4 compatibility
+  /**
+   * PHP 4 compatibility
+   * @see rcmail_template::__construct()
+   */
   function rcmail_template(&$config, $task)
   {
     $this->__construct($config, $task);
@@ -70,6 +86,10 @@ class rcmail_template extends rcube_html_page
   
   /**
    * Set environment variable
+   *
+   * @param string Property name
+   * @param mixed Property value
+   * @param boolean True if this property should be added to client environment
    */
   function set_env($name, $value, $addtojs=true)
   {
@@ -135,6 +155,10 @@ class rcmail_template extends rcube_html_page
 
   /**
    * 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
    */
   function show_message($message, $type='notice', $vars=NULL)
   {
@@ -211,10 +235,17 @@ class rcmail_template extends rcube_html_page
   
   
   /**
-   * @override
+   * Process template and write to stdOut
+   *
+   * @param string HTML template
+   * @see rcube_html_page::write()
    */
   function write($template='')
   {
+    // unlock interface after iframe load
+    if ($this->framed)
+      array_unshift($this->js_commands, array('set_busy', false));
+    
     // write all env variables to client
     $js = $this->framed ? "if(window.parent) {\n" : '';
     $js .= $this->get_js_commands() . ($this->framed ? ' }' : '');
@@ -273,12 +304,12 @@ class rcmail_template extends rcube_html_page
 
   /**
    * Return executable javascript code for all registered commands
-   * @private
+   * @access private
    */
   function get_js_commands()
   {
     $out = '';
-    if (!$this->framed)
+    if (!$this->framed && !empty($this->js_env))
       $out .= ($this->ajax_call ? 'this' : JS_OBJECT_NAME) . '.set_env('.json_serialize($this->js_env).");\n";
     
     foreach ($this->js_commands as $i => $args)
@@ -295,11 +326,19 @@ class rcmail_template extends rcube_html_page
         join(',', $args));
     }
     
+    // add command to set page title
+    if ($this->ajax_call && !empty($this->pagetitle))
+      $out .= sprintf(
+        "this.set_pagetitle('%s');\n",
+        JQ((!empty($this->config['product_name']) ? $this->config['product_name'].' :: ' : '') . $this->pagetitle)
+      );
+    
     return $out;
   }
   
   /**
    * Make URLs starting with a slash point to skin directory
+   * @access private
    */
   function abs_url($str)
   {
@@ -311,18 +350,20 @@ class rcmail_template extends rcube_html_page
   /*****  Template parsing methods  *****/
   
   /**
-   * Replace all strings ($varname) with the content
-   * of the according global variable.
+   * Replace all strings ($varname)
+   * with the content of the according global variable.
+   * @access private
    */
   function parse_with_globals($input)
   {
-    $GLOBALS['__comm_path'] = $GLOBALS['COMM_PATH'];
+    $GLOBALS['__comm_path'] = urlencode($GLOBALS['COMM_PATH']);
     return preg_replace('/\$(__[a-z0-9_\-]+)/e', '$GLOBALS["\\1"]', $input);
   }
   
   
   /**
    * Parse for conditional tags
+   * @access private
    */
   function parse_conditions($input)
   {
@@ -361,6 +402,7 @@ class rcmail_template extends rcube_html_page
    * Determines if a given condition is met
    *
    * @return True if condition is valid, False is not
+   * @access private
    */
   function check_condition($condition)
   {
@@ -379,6 +421,7 @@ class rcmail_template extends rcube_html_page
    *
    * @param string Input string to parse
    * @return Altered input string
+   * @access private
    */
   function parse_xml($input)
   {
@@ -392,9 +435,10 @@ class rcmail_template extends rcube_html_page
    * @param string Tag command: object,button,label, etc.
    * @param string Attribute string
    * @return Tag/Object content string
+   * @access private
    */
   function xml_command($command, $str_attrib, $add_attrib=array())
-    {
+  {
     $command = strtolower($command);
     $attrib = parse_attrib_string($str_attrib) + $add_attrib;
 
@@ -420,10 +464,15 @@ class rcmail_template extends rcube_html_page
       // include a file 
       case 'include':
         $path = realpath($this->config['skin_path'].$attrib['file']);
-        if ($fp = @fopen($path, 'r'))
+        if (filesize($path))
         {
-          $incl = fread($fp, filesize($path));
-          fclose($fp);        
+          if ($this->config['skin_include_php'])
+            $incl = $this->include_php($path);
+          else if ($fp = @fopen($path, 'r'))
+          {
+            $incl = fread($fp, filesize($path));
+            fclose($fp);
+          }
           return $this->parse_xml($incl);
         }
         break;
@@ -437,16 +486,16 @@ class rcmail_template extends rcube_html_page
           return call_user_func($this->object_handlers[$object], $attrib);
 
         else if ($object=='productname')
-          {
+        {
           $name = !empty($this->config['product_name']) ? $this->config['product_name'] : 'RoundCube Webmail';
           return Q($name);
-          }
+        }
         else if ($object=='version')
-          {
+        {
           return (string)RCMAIL_VERSION;
-          }
+        }
         else if ($object=='pagetitle')
-          {
+        {
           $task = $this->task;
           $title = !empty($this->config['product_name']) ? $this->config['product_name'].' :: ' : '';
 
@@ -458,13 +507,59 @@ class rcmail_template extends rcube_html_page
             $title .= ucfirst($task);
 
           return Q($title);
-          }
+        }
 
         break;
-      }
+      
+      // return variable
+      case 'var':
+        $var = explode(':', $attrib['name']);
+        $name = $var[1];
+        $value = '';
+        
+        switch ($var[0])
+        {
+          case 'env':
+            $value = $this->env[$name];
+            break;
+          case 'config':
+            $value = $this->config[$name];
+            if (is_array($value) && $value[$_SESSION['imap_host']])
+              $value = $value[$_SESSION['imap_host']];
+            break;
+          case 'request':
+            $value = get_input_value($name, RCUBE_INPUT_GPC);
+            break;
+          case 'session':
+            $value = $_SESSION[$name];
+            break;
+        }
+        
+        if (is_array($value))
+          $value = join(", ", $value);
+        
+        return Q($value);
+    }
 
     return '';
-    }
+  }
+
+
+  /**
+   * Include a specific file and return it's contents
+   *
+   * @param string File path
+   * @return string Contents of the processed file
+   */
+  function include_php($file)
+  {
+    ob_start();
+    @include($file);
+    $out = ob_get_contents();
+    ob_end_clean();
+    
+    return $out;
+  }
 
 
   /**
@@ -472,9 +567,10 @@ class rcmail_template extends rcube_html_page
    *
    * @param array Button attributes
    * @return HTML button
+   * @access private
    */
   function button($attrib)
-    {
+  {
     global $CONFIG, $OUTPUT, $BROWSER, $MAIN_TASKS;
     static $sa_buttons = array();
     static $s_button_count = 100;
@@ -613,7 +709,7 @@ class rcmail_template extends rcube_html_page
         $attrib['value'] = $attrib['label'];
 
       $attrib_str = create_attrib_string($attrib, array('type', 'value', 'onclick', 'id', 'class', 'style'));
-      $out = sprintf('<input%s disabled />', $attrib_str);
+      $out = sprintf('<input%s disabled="disabled" />', $attrib_str);
     }
 
     // generate html code for button
@@ -626,6 +722,238 @@ class rcmail_template extends rcube_html_page
     return $out;
   }
 
-}
+}  // end class rcmail_template
+
+
+
+// ************** common functions delivering gui objects **************
+
+
+/**
+ * Builder for GUI object 'message'
+ *
+ * @param array Named tag parameters
+ * @return string HTML code for the gui object
+ */
+function rcmail_message_container($attrib)
+  {
+  global $OUTPUT;
+
+  if (!$attrib['id'])
+    $attrib['id'] = 'rcmMessageContainer';
+
+  // allow the following attributes to be added to the <table> tag
+  $attrib_str = create_attrib_string($attrib, array('style', 'class', 'id'));
+  $out = '<div' . $attrib_str . "></div>";
+  
+  $OUTPUT->add_gui_object('message', $attrib['id']);
+  
+  return $out;
+  }
+
+
+/**
+ * GUI object 'username'
+ * Showing IMAP username of the current session
+ *
+ * @param array Named tag parameters (currently not used)
+ * @return string HTML code for the gui object
+ */
+function rcmail_current_username($attrib)
+  {
+  global $DB;
+  static $s_username;
+
+  // alread fetched  
+  if (!empty($s_username))
+    return $s_username;
+
+  // get e-mail address form default identity
+  $sql_result = $DB->query(
+    "SELECT email AS mailto
+     FROM ".get_table_name('identities')."
+     WHERE  user_id=?
+     AND    standard=1
+     AND    del<>1",
+    $_SESSION['user_id']);
+                                   
+  if ($DB->num_rows($sql_result))
+    {
+    $sql_arr = $DB->fetch_assoc($sql_result);
+    $s_username = $sql_arr['mailto'];
+    }
+  else if (strstr($_SESSION['username'], '@'))
+    $s_username = $_SESSION['username'];
+  else
+    $s_username = $_SESSION['username'].'@'.$_SESSION['imap_host'];
+
+  return $s_username;
+  }
+
+
+/**
+ * GUI object 'loginform'
+ * Returns code for the webmail login form
+ *
+ * @param array Named parameters
+ * @return string HTML code for the gui object
+ */
+function rcmail_login_form($attrib)
+  {
+  global $CONFIG, $OUTPUT, $SESS_HIDDEN_FIELD;
+  
+  $labels = array();
+  $labels['user'] = rcube_label('username');
+  $labels['pass'] = rcube_label('password');
+  $labels['host'] = rcube_label('server');
+  
+  $input_user = new textfield(array('name' => '_user', 'id' => 'rcmloginuser', 'size' => 30) + $attrib);
+  $input_pass = new passwordfield(array('name' => '_pass', 'id' => 'rcmloginpwd', 'size' => 30) + $attrib);
+  $input_action = new hiddenfield(array('name' => '_action', 'value' => 'login'));
+    
+  $fields = array();
+  $fields['user'] = $input_user->show(get_input_value('_user', RCUBE_INPUT_POST));
+  $fields['pass'] = $input_pass->show();
+  $fields['action'] = $input_action->show();
+  
+  if (is_array($CONFIG['default_host']))
+    {
+    $select_host = new select(array('name' => '_host', 'id' => 'rcmloginhost'));
+    
+    foreach ($CONFIG['default_host'] as $key => $value)
+    {
+      if (!is_array($value))
+        $select_host->add($value, (is_numeric($key) ? $value : $key));
+      else
+        {
+        unset($select_host);
+        break;
+        }
+    }
+      
+    $fields['host'] = isset($select_host) ? $select_host->show($_POST['_host']) : null;
+    }
+  else if (!strlen($CONFIG['default_host']))
+    {
+    $input_host = new textfield(array('name' => '_host', 'id' => 'rcmloginhost', 'size' => 30));
+    $fields['host'] = $input_host->show($_POST['_host']);
+    }
+
+  $form_name = strlen($attrib['form']) ? $attrib['form'] : 'form';
+  $form_start = !strlen($attrib['form']) ? '<form name="form" action="./" method="post">' : '';
+  $form_end = !strlen($attrib['form']) ? '</form>' : '';
+  
+  if ($fields['host'])
+    $form_host = <<<EOF
+    
+</tr><tr>
+
+<td class="title"><label for="rcmloginhost">$labels[host]</label></td>
+<td>$fields[host]</td>
+
+EOF;
+
+  $OUTPUT->add_gui_object('loginform', $form_name);
+  
+  $out = <<<EOF
+$form_start
+$SESS_HIDDEN_FIELD
+$fields[action]
+<table><tr>
+
+<td class="title"><label for="rcmloginuser">$labels[user]</label></td>
+<td>$fields[user]</td>
+
+</tr><tr>
+
+<td class="title"><label for="rcmloginpwd">$labels[pass]</label></td>
+<td>$fields[pass]</td>
+$form_host
+</tr></table>
+$form_end
+EOF;
+
+  return $out;
+  }
+
+
+/**
+ * GUI object 'charsetselector'
+ *
+ * @param array Named parameters for the select tag
+ * @return string HTML code for the gui object
+ */
+function rcmail_charset_selector($attrib)
+  {
+  global $OUTPUT;
+  
+  // 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')))
+      $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 select($field_attrib);
+  $select->add(array_values($charsets), array_keys($charsets));
+  
+  $set = $_POST['_charset'] ? $_POST['_charset'] : $OUTPUT->get_charset();
+  return $select->show($set);
+  }
+
+
+/**
+ * GUI object 'searchform'
+ * Returns code for search function
+ *
+ * @param array Named parameters
+ * @return string HTML code for the gui object
+ */
+function rcmail_search_form($attrib)
+  {
+  global $OUTPUT;
+
+  // add some labels to client
+  rcube_add_label('searching');
+
+  $attrib['name'] = '_q';
+
+  if (empty($attrib['id']))
+    $attrib['id'] = 'rcmqsearchbox';
+
+  $input_q = new textfield($attrib);
+  $out = $input_q->show();
+
+  $OUTPUT->add_gui_object('qsearchbox', $attrib['id']);
+
+  // add form tag around text field
+  if (empty($attrib['form']))
+    $out = sprintf(
+      '<form name="rcmqsearchform" action="./" '.
+      'onsubmit="%s.command(\'search\');return false" style="display:inline;">%s</form>',
+      JS_OBJECT_NAME,
+      $out);
+
+  return $out;
+  } 
+
 
-?>
\ No newline at end of file
+?>
index 3902e2a3b108681b3fca4a373031f4fa9a718aaa..f01d2227960a5c7cfcc76b50ce843371c8919b79 100644 (file)
 
 */
 
+
+/**
+ * Model class for the local address book database
+ *
+ * @package Addressbook
+ */
 class rcube_contacts
 {
   var $db = null;
@@ -55,7 +61,7 @@ class rcube_contacts
   /**
    * PHP 4 object constructor
    *
-   * @see  rcube_contacts::__construct
+   * @see rcube_contacts::__construct()
    */
   function rcube_contacts($dbconn, $user)
   {
@@ -121,10 +127,18 @@ class rcube_contacts
   }
   
   
+  /**
+   * Close connection to source
+   * Called on script shutdown
+   */
+  function close(){}
+  
+  
   /**
    * 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)
@@ -171,7 +185,7 @@ class rcube_contacts
    * @param boolean True if results are requested, False if count only
    * @return Indexed list of contact records and 'count' value
    */
-  function search($fields, $value, $select=true)
+  function search($fields, $value, $strict=false, $select=true)
   {
     if (!is_array($fields))
       $fields = array($fields);
@@ -184,6 +198,8 @@ class rcube_contacts
         $ids = !is_array($value) ? split(',', $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->quoteIdentifier($col)." LIKE ".$this->db->quote(strlen($value)>2 ? "%$value%" : "$value%");
     }
@@ -278,7 +294,7 @@ class rcube_contacts
     $insert_id = $existing = false;
 
     if ($check)
-      $existing = $this->search('email', $save_data['email'], false);
+      $existing = $this->search('email', $save_data['email'], true, false);
 
     $a_insert_cols = $a_insert_values = array();
     foreach ($this->table_cols as $col)
old mode 100755 (executable)
new mode 100644 (file)
index 6510483..9c3eaa8
@@ -17,7 +17,7 @@
  |         Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_db.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: rcube_db.inc 666 2007-08-07 21:02:12Z thomasb $
 
 */
 
@@ -33,7 +33,7 @@ require_once('DB.php');
  *
  * This is a wrapper for the PEAR::DB class
  *
- * @package    RoundCube Webmail
+ * @package    Database
  * @author     David Saez Padros <david@ols.es>
  * @author     Thomas Bruederli <roundcube@gmail.com>
  * @version    1.17
diff --git a/program/include/rcube_html.inc b/program/include/rcube_html.inc
new file mode 100644 (file)
index 0000000..a31594a
--- /dev/null
@@ -0,0 +1,671 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | rcube_html.inc                                                        |
+ |                                                                       |
+ | This file is part of the RoundCube PHP suite                          |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | CONTENTS:                                                             |
+ |   Common Classes to create HTML output                                |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id:  $
+
+*/
+
+
+/**
+ * HTML page builder class
+ *
+ * @package HTML
+ */
+class rcube_html_page
+{
+  var $scripts_path = '';
+  var $script_files = array();
+  var $scripts = array();
+  var $charset = 'UTF-8';
+  
+  var $script_tag_file = "<script type=\"text/javascript\" src=\"%s%s\"></script>\n";
+  var $script_tag      = "<script type=\"text/javascript\">\n<!--\n%s\n\n//-->\n</script>\n";
+  var $default_template = "<html>\n<head><title></title></head>\n<body></body>\n</html>";
+
+  var $title = 'RoundCube Mail';
+  var $header = '';
+  var $footer = '';
+  var $body = '';
+  var $body_attrib = array();
+  var $meta_tags = array();
+  
+  
+  /**
+   * Link an external script file
+   *
+   * @param string File URL
+   * @param string Target position [head|foot]
+   */
+  function include_script($file, $position='head')
+  {
+    static $sa_files = array();
+    
+    if (in_array($file, $sa_files))
+      return;
+      
+    if (!is_array($this->script_files[$position]))
+      $this->script_files[$position] = array();
+      
+    $this->script_files[$position][] = $file;
+  }
+  
+  /**
+   * Add inline javascript code
+   *
+   * @param string JS code snippet
+   * @param string Target position [head|head_top|foot]
+   */
+  function add_script($script, $position='head')
+  {
+    if (!isset($this->scripts[$position]))
+      $this->scripts[$position] = "\n".rtrim($script);
+    else
+      $this->scripts[$position] .= "\n".rtrim($script);
+  }
+
+  /**
+   * Add HTML code to the page header
+   */
+  function add_header($str)
+  {
+    $this->header .= "\n".$str;
+  }
+
+  /**
+   * Add HTML code to the page footer
+   * To be added right befor </body>
+   */
+  function add_footer($str)
+  {
+    $this->footer .= "\n".$str;
+  }
+
+  /**
+   * Setter for page title
+   */
+  function set_title($t)
+  {
+    $this->title = $t;
+  }
+
+
+  /**
+   * Setter for output charset.
+   * To be specified in a meta tag and sent as http-header
+   */
+  function set_charset($charset)
+  {
+    global $MBSTRING;
+    
+    $this->charset = $charset;
+    
+    if ($MBSTRING && function_exists("mb_internal_encoding"))
+      {
+      if(!@mb_internal_encoding($charset))
+        $MBSTRING = FALSE;
+      }
+  }
+
+  /**
+   * Getter for output charset
+   */
+  function get_charset()
+  {
+    return $this->charset;
+  }
+
+
+  /**
+   * Reset all saved properties
+   */
+  function reset()
+  {
+    $this->script_files = array();
+    $this->scripts = array();
+    $this->title = '';
+    $this->header = '';
+    $this->footer = '';
+  }
+
+
+  /**
+   * Process template and write to stdOut
+   *
+   * @param string HTML template
+   * @param string Base for absolute paths
+   */
+  function write($templ='', $base_path='')
+  {
+    $output = empty($templ) ? $this->default_template : trim($templ);
+    
+    // replace specialchars in content
+    $__page_title = Q($this->title, 'show', FALSE);
+    $__page_header = $__page_body = $__page_footer = '';
+    
+    
+    // include meta tag with charset
+    if (!empty($this->charset))
+    {
+      header('Content-Type: text/html; charset='.$this->charset, true);
+      $__page_header = '<meta http-equiv="content-type" content="text/html; charset='.$this->charset.'" />'."\n";
+    }
+  
+  
+    // definition of the code to be placed in the document header and footer
+    if (is_array($this->script_files['head']))
+      foreach ($this->script_files['head'] as $file)
+        $__page_header .= sprintf($this->script_tag_file, $this->scripts_path, $file);
+
+    $head_script = $this->scripts['head_top'] . $this->scripts['head'];
+    if (!empty($head_script))
+      $__page_header .= sprintf($this->script_tag, $head_script);
+
+    if (!empty($this->header))
+      $__page_header .= $this->header;
+
+    if (is_array($this->script_files['foot']))
+      foreach ($this->script_files['foot'] as $file)
+        $__page_footer .= sprintf($this->script_tag_file, $this->scripts_path, $file);
+
+    if (!empty($this->scripts['foot']))
+      $__page_footer .= sprintf($this->script_tag, $this->scripts['foot']);
+      
+    if (!empty($this->footer))
+      $__page_footer .= $this->footer;
+
+    // find page header
+    if ($hpos = strpos(strtolower($output), '</head>'))
+      $__page_header .= "\n";
+    else 
+    {
+      if (!is_numeric($hpos))
+        $hpos = strpos(strtolower($output), '<body');
+      if (!is_numeric($hpos) && ($hpos = strpos(strtolower($output), '<html')))
+      {
+        while($output[$hpos]!='>')
+          $hpos++;
+        $hpos++;
+      }
+  
+      $__page_header = "<head>\n<title>$__page_title</title>\n$__page_header\n</head>\n";
+    }
+  
+    // add page hader
+    if ($hpos)
+      $output = substr($output,0,$hpos) . $__page_header . substr($output,$hpos,strlen($output));
+    else
+      $output = $__page_header . $output;
+  
+  
+    // find page body
+    if($bpos = strpos(strtolower($output), '<body'))
+    {
+      while($output[$bpos]!='>') $bpos++;
+      $bpos++;
+    }
+    else
+      $bpos = strpos(strtolower($output), '</head>')+7;
+  
+    // add page body
+    if($bpos && $__page_body)
+      $output = substr($output,0,$bpos) . "\n$__page_body\n" . substr($output,$bpos,strlen($output));
+  
+  
+    // find and add page footer
+    $output_lc = strtolower($output);
+    if(($fpos = strrstr($output_lc, '</body>')) ||
+       ($fpos = strrstr($output_lc, '</html>')))
+      $output = substr($output, 0, $fpos) . "$__page_footer\n" . substr($output, $fpos);
+    else
+      $output .= "\n$__page_footer";
+  
+  
+    // reset those global vars
+    $__page_header = $__page_footer = '';
+  
+  
+    // correct absolute paths in images and other tags
+    $output = preg_replace('/(src|href|background)=(["\']?)(\/[a-z0-9_\-]+)/Ui', "\\1=\\2$base_path\\3", $output);
+    $output = str_replace('$__skin_path', $base_path, $output);
+  
+    print rcube_charset_convert($output, 'UTF-8', $this->charset);
+  }
+    
+}  // end class rcube_html_page
+
+
+
+/**
+ * Base class to build a HTML for element
+ *
+ * @package HTML
+ */
+class rcube_form_element
+  {
+  var $uppertags = FALSE;
+  var $upperattribs = FALSE;
+  var $upperprops = FALSE;
+  var $newline = FALSE;
+  
+  var $attrib = array();
+
+
+  /**
+   * Create string with saved attributes
+   *
+   * @return string HTML formatted tag attributes
+   */
+  function create_attrib_string()
+  {
+    if (!sizeof($this->attrib))
+      return '';
+
+    if ($this->name!='')
+      $this->attrib['name'] = $this->name;
+
+    $attrib_arr = array();
+    foreach ($this->attrib as $key => $value)
+    {
+      // don't output some internally used attributes
+      if (in_array($key, array('form', 'quicksearch')))
+        continue;
+
+      // skip if size if not numeric
+      if (($key=='size' && !is_numeric($value)))
+        continue;
+        
+      // skip empty eventhandlers
+      if ((strpos($key,'on')===0 && $value==''))
+        continue;
+
+      // encode textarea content
+      if ($key=='value')
+        $value = Q($value, 'strict', FALSE);
+
+      // attributes with no value
+      if (in_array($key, array('checked', 'multiple', 'disabled', 'selected', 'nowrap')))
+      {
+        if ($value)
+          $attrib_arr[] = sprintf('%s="%s"', $this->_conv_case($key, 'attrib'), $key);
+      }
+      // don't convert size of value attribute
+      else if ($key=='value')
+        $attrib_arr[] = sprintf('%s="%s"', $this->_conv_case($key, 'attrib'), $value);
+        
+      // regular tag attributes
+      else
+        $attrib_arr[] = sprintf('%s="%s"', $this->_conv_case($key, 'attrib'), $this->_conv_case($value, 'value'));
+    }
+
+    return sizeof($attrib_arr) ? ' '.implode(' ', $attrib_arr) : '';
+  }
+    
+    
+  /**
+   * Convert tags and attributes to upper-/lowercase
+   *
+   * @param string Input string
+   * @param string Value type (can either be "tag" or "attrib")
+   * @return string Converted output string
+   * @access private
+   */
+  function _conv_case($str, $type='attrib')
+    {
+    if ($type == 'tag')
+      return $this->uppertags ? strtoupper($str) : strtolower($str);
+    else if ($type == 'attrib')
+      return $this->upperattribs ? strtoupper($str) : strtolower($str);
+    else if ($type == 'value')
+      return $this->upperprops ? strtoupper($str) : strtolower($str);
+    }    
+  }
+
+
+/**
+ * Builder for an <input> field
+ *
+ * @package HTML
+ */
+class input_field extends rcube_form_element
+{
+  var $type = 'text';
+  
+  /**
+   * Constructor
+   * @param array Named tag attributes
+   */
+  function input_field($attrib=array())
+  {
+    if (is_array($attrib))
+      $this->attrib = $attrib;
+
+    if ($attrib['type'])
+      $this->type = $attrib['type'];    
+
+    if ($attrib['newline'])
+      $this->newline = TRUE;    
+  }  
+
+  /**
+   * Compose input tag
+   *
+   * @param string Field value
+   * @param array  Additional tag attributes
+   * @return string Final HTML code
+   */
+  function show($value=NULL, $attrib=NULL)
+  {
+    // overwrite object attributes
+    if (is_array($attrib))
+      $this->attrib = array_merge($this->attrib, $attrib);
+
+    // set value attribute
+    if ($value!==NULL)
+      $this->attrib['value'] = $value;
+
+    $this->attrib['type'] = $this->type;
+
+    // return final tag
+    return sprintf(
+      '<%s%s />%s',
+      $this->_conv_case('input', 'tag'),
+      $this->create_attrib_string(),
+      ($this->newline ? "\n" : ""));
+  }  
+}
+
+
+/**
+ * Builder for a <input type="text"> field
+ *
+ * @package HTML
+ */
+class textfield extends input_field
+{
+  var $type = 'text';
+}
+
+/**
+ * Builder for a <input type="password"> field
+ *
+ * @package HTML
+ */
+class passwordfield extends input_field
+{
+  var $type = 'password';
+}
+
+/**
+ * Builder for <input type="radio"> fields
+ *
+ * @package HTML
+ */
+class radiobutton extends input_field
+{
+  var $type = 'radio';
+}
+
+/**
+ * Builder for <input type="checkbox"> fields
+ *
+ * @package HTML
+ */
+class checkbox extends input_field
+{
+  var $type = 'checkbox';
+
+
+  /**
+   * Compose input tag
+   *
+   * @param string Field value
+   * @param array  Additional tag attributes
+   * @return string Final HTML code
+   */
+  function show($value='', $attrib=NULL)
+  {
+    // overwrite object attributes
+    if (is_array($attrib))
+      $this->attrib = array_merge($this->attrib, $attrib);    
+
+    $this->attrib['type'] = $this->type;
+
+    if ($value && (string)$value==(string)$this->attrib['value'])
+      $this->attrib['checked'] = TRUE;
+    else
+      $this->attrib['checked'] = FALSE;
+
+    // return final tag
+    return sprintf(
+      '<%s%s />%s',
+      $this->_conv_case('input', 'tag'),
+      $this->create_attrib_string(),
+      ($this->newline ? "\n" : ""));
+  }
+}
+
+
+/**
+ * Builder for a <textarea> field
+ *
+ * @package HTML
+ */
+class textarea extends rcube_form_element
+  {
+
+  /**
+   * Constructor
+   * @param array Named tag attributes
+   */
+  function textarea($attrib=array())
+  {
+    $this->attrib = $attrib;
+
+    if ($attrib['newline'])
+      $this->newline = TRUE;
+  }
+  
+  /**
+   * Create HTML representation for this field
+   *
+   * @param string Field value
+   * @param array  Additional tag attributes
+   * @return string Final HTML code
+   */
+  function show($value='', $attrib=NULL)
+  {
+    // overwrite object attributes
+    if (is_array($attrib))
+      $this->attrib = array_merge($this->attrib, $attrib);
+    
+    // take value attribute as content
+    if ($value=='')
+      $value = $this->attrib['value'];
+    
+    // make shure we don't print the value attribute
+    if (isset($this->attrib['value']))
+      unset($this->attrib['value']);
+
+    if (!empty($value) && !isset($this->attrib['mce_editable']))
+      $value = Q($value, 'strict', FALSE);
+
+    // return final tag
+    return sprintf(
+      '<%s%s>%s</%s>%s',
+      $this->_conv_case('textarea', 'tag'),
+      $this->create_attrib_string(),
+      $value,
+      $this->_conv_case('textarea', 'tag'),
+      ($this->newline ? "\n" : ""));       
+  }
+}
+
+
+/**
+ * Builder for group of hidden form fields
+ *
+ * @package HTML
+ */
+class hiddenfield extends rcube_form_element
+{
+  var $fields_arr = array();
+  var $newline = TRUE;
+
+  /**
+   * Constructor
+   *
+   * @param array Named tag attributes
+   */
+  function hiddenfield($attrib=NULL)
+  {
+    if (is_array($attrib))
+      $this->add($attrib);
+  }
+
+  /**
+   * Add a hidden field to this instance
+   * @param array Named tag attributes
+   */
+  function add($attrib)
+  {
+    $this->fields_arr[] = $attrib;
+  }
+
+
+  /**
+   * Create HTML code for the hidden fields
+   *
+   * @return string Final HTML code
+   */
+  function show()
+  {
+    $out = '';
+    foreach ($this->fields_arr as $attrib)
+    {
+      $this->attrib = $attrib;
+      $this->attrib['type'] = 'hidden';
+      
+      $out .= sprintf(
+        '<%s%s />%s',
+        $this->_conv_case('input', 'tag'),
+        $this->create_attrib_string(),
+        ($this->newline ? "\n" : ""));
+    }
+
+    return $out;
+  }
+}
+
+
+/**
+ * Builder for HTML drop-down menus
+ * Syntax:<pre>
+ * // create instance. arguments are used to set attributes of select-tag
+ * $select = new select(array('name' => 'fieldname'));
+ *
+ * // add one option
+ * $select->add('Switzerland', 'CH');
+ *
+ * // add multiple options
+ * $select->add(array('Switzerland','Germany'), array('CH','DE'));
+ *
+ * // generate pulldown with selection 'Switzerland'  and return html-code
+ * // as second argument the same attributes available to instanciate can be used
+ * print $select->show('CH');
+ * </pre>
+ *
+ * @package HTML
+ */
+class select extends rcube_form_element
+{
+  var $options = array();
+
+  /**
+   * Constructor
+   *
+   * @param array Named tag attributes
+   */
+  function select($attrib=NULL)
+  {
+    if (is_array($attrib))
+      $this->attrib = $attrib;
+
+    if ($attrib['newline'])
+      $this->newline = TRUE;
+  }
+
+
+  /**
+   * Add one ore more menu options
+   *
+   * @param mixed Array with names or single option name
+   * @param mixed Array with values or single option value
+   */
+  function add($names, $values=NULL)
+  {
+    if (is_array($names))
+    {
+      foreach ($names as $i => $text)
+        $this->options[] = array('text' => $text, 'value' => (string)$values[$i]);
+    }
+    else
+      $this->options[] = array('text' => $names, 'value' => (string)$values);
+  }
+
+
+  /**
+   * Generate HTML code for this drop-down menu
+   *
+   * @param string Value of the selected option
+   * @param array Additional tag attributes
+   * @return string Final HTML code
+   */
+  function show($select=array(), $attrib=NULL)
+  {
+    $options_str = "\n";
+    $value_str = $this->_conv_case(' value="%s"', 'attrib');
+    
+    if (!is_array($select))
+      $select = array((string)$select);
+
+    foreach ($this->options as $option)
+    {
+      $selected = ((isset($option['value']) &&
+                    in_array($option['value'], $select, TRUE)) ||
+                   (in_array($option['text'], $select, TRUE))) ?
+        $this->_conv_case(' selected="selected"', 'attrib') : '';
+                   
+      $options_str .= sprintf("<%s%s%s>%s</%s>\n",
+                             $this->_conv_case('option', 'tag'),
+                             !empty($option['value']) ? sprintf($value_str, Q($option['value'])) : '',
+                             $selected, 
+                             Q($option['text'], 'strict', FALSE),
+                             $this->_conv_case('option', 'tag'));
+    }
+
+    // return final tag
+    return sprintf('<%s%s>%s</%s>%s',
+                   $this->_conv_case('select', 'tag'),
+                   $this->create_attrib_string(),
+                   $options_str,
+                   $this->_conv_case('select', 'tag'),
+                   ($this->newline ? "\n" : ""));    
+  }
+}
+
+
+?>
index 98bfd2d73a00d06d844b9f481250845e5b4c7ee3..7c6caf3773e79485ab069b765d97aa7b3995d7cd 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_imap.inc 587 2007-05-28 19:21:36Z thomasb $
+ $Id: rcube_imap.inc 883 2007-10-17 21:27:20Z thomasb $
 
 */
 
 
-/**
+/*
  * Obtain classes from the Iloha IMAP library
  */
 require_once('lib/imap.inc');
@@ -33,13 +33,13 @@ require_once('lib/mime.inc');
  *
  * This is a wrapper that implements the Iloha IMAP Library (IIL)
  *
- * @package    RoundCube Webmail
+ * @package    Mail
  * @author     Thomas Bruederli <roundcube@gmail.com>
- * @version    1.36
+ * @version    1.39
  * @link       http://ilohamail.org
  */
 class rcube_imap
-  {
+{
   var $db;
   var $conn;
   var $root_ns = '';
@@ -65,12 +65,13 @@ class rcube_imap
   var $search_string = '';
   var $search_charset = '';
   var $debug_level = 1;
+  var $error_code = 0;
 
 
   /**
    * Object constructor
    *
-   * @param  object  Database connection
+   * @param object DB Database connection
    */
   function __construct($db_conn)
     {
@@ -131,6 +132,7 @@ class rcube_imap
     // 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);
@@ -287,13 +289,14 @@ class rcube_imap
       
     $this->search_subject = $subject;
     $this->search_string = $str;
-    $this->search_set = is_array($msgs) ? $msgs : NULL;
+    $this->search_set = (array)$msgs;
     $this->search_charset = $charset;
     }
 
 
   /**
    * Return the saved search set as hash array
+   * @return array Search set
    */
   function get_search_set()
     {
@@ -382,8 +385,8 @@ class rcube_imap
    * Private method for mailbox listing
    *
    * @return  array   List of mailboxes/folders
+   * @see     rcube_imap::list_mailboxes()
    * @access  private
-   * @see     rcube_imap::list_mailboxes
    */
   function _list_mailboxes($root='', $filter='*')
     {
@@ -413,8 +416,8 @@ class rcube_imap
    * @param   string   Mailbox/folder name
    * @param   string   Mode for count [ALL|UNSEEN|RECENT]
    * @param   boolean  Force reading from server and update cache
-   * @return  number   Number of messages
-   * @access  public   
+   * @return  int      Number of messages
+   * @access  public
    */
   function messagecount($mbox_name='', $mode='ALL', $force=FALSE)
     {
@@ -427,7 +430,7 @@ class rcube_imap
    * Private method for getting nr of messages
    *
    * @access  private
-   * @see     rcube_imap::messagecount
+   * @see     rcube_imap::messagecount()
    */
   function _messagecount($mailbox='', $mode='ALL', $force=FALSE)
     {
@@ -438,8 +441,8 @@ class rcube_imap
       $mailbox = $this->mailbox;
       
     // count search set
-    if ($this->search_set && $mailbox == $this->mailbox && $mode == 'ALL')
-      return count($this->search_set);
+    if ($this->search_string && $mailbox == $this->mailbox && $mode == 'ALL')
+      return count((array)$this->search_set);
 
     $a_mailbox_cache = $this->get_cache('messagecount');
     
@@ -496,7 +499,7 @@ class rcube_imap
    * convert mailbox name with root dir first
    *
    * @param   string   Mailbox/folder name
-   * @param   number   Current page to list
+   * @param   int      Current page to list
    * @param   string   Header field to sort by
    * @param   string   Sort order [ASC|DESC]
    * @return  array    Indexed array with message header objects
@@ -521,7 +524,7 @@ class rcube_imap
       return array();
 
     // use saved message set
-    if ($this->search_set && $mailbox == $this->mailbox)
+    if ($this->search_string && $mailbox == $this->mailbox)
       return $this->_list_header_set($mailbox, $this->search_set, $page, $sort_field, $sort_order);
 
     if ($sort_field!=NULL)
@@ -616,7 +619,7 @@ class rcube_imap
    *
    * @param   string   Mailbox/folder name
    * @param   array    List of message ids to list
-   * @param   number   Current page to list
+   * @param   int      Current page to list
    * @param   string   Header field to sort by
    * @param   string   Sort order [ASC|DESC]
    * @return  array    Indexed array with message header objects
@@ -633,7 +636,7 @@ class rcube_imap
    * Private method for listing a set of message headers
    *
    * @access  private
-   * @see     rcube_imap::list_header_set
+   * @see     rcube_imap::list_header_set()
    */
   function _list_header_set($mailbox, $msgs, $page=NULL, $sort_field=NULL, $sort_order=NULL)
     {
@@ -671,7 +674,7 @@ class rcube_imap
   /**
    * Helper function to get first and last index of the requested set
    *
-   * @param  number  message count
+   * @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
@@ -713,7 +716,7 @@ class rcube_imap
    * @param  string  Message index to fetch
    * @param  array   Reference to message headers array
    * @param  array   Array with cache index
-   * @return number  Number of deleted messages
+   * @return int     Number of deleted messages
    * @access private
    */
   function _fetch_headers($mailbox, $msgs, &$a_msg_headers, $cache_key)
@@ -815,6 +818,9 @@ class rcube_imap
     }
 
 
+  /**
+   * @access private
+   */
   function sync_header_index($mailbox)
     {
     $cache_key = $mailbox.'.msg';
@@ -927,6 +933,8 @@ class rcube_imap
   
   /**
    * Refresh saved search set
+   *
+   * @return array Current search set
    */
   function refresh_search()
     {
@@ -973,8 +981,8 @@ class rcube_imap
    * 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
-   * @return object Standard object tree or False on failure
+   * @param int Message UID to fetch
+   * @return object stdClass Message part tree or False on failure
    */
   function &get_structure($uid)
     {
@@ -1136,7 +1144,7 @@ class rcube_imap
   /**
    * Return a flat array with references to all parts, indexed by part numbers
    *
-   * @param object Message body structure
+   * @param object rcube_message_part Message body structure
    * @return Array with part number -> object pairs
    */
   function get_mime_numbers(&$structure)
@@ -1150,7 +1158,7 @@ class rcube_imap
   /**
    * Helper method for recursive calls
    *
-   * @access 
+   * @access private
    */
   function _get_part_numbers(&$part, &$a_parts)
     {
@@ -1168,9 +1176,9 @@ class rcube_imap
    *
    * @param  int    Message UID
    * @param  string Part number
-   * @param  object Part object created by get_structure()
+   * @param  object rcube_message_part Part object created by get_structure()
    * @param  mixed  True to print part, ressource to write part contents in
-   * @return Message/part body if not printed
+   * @return string Message/part body if not printed
    */
   function &get_message_part($uid, $part=1, $o_part=NULL, $print=NULL)
     {
@@ -1223,8 +1231,8 @@ class rcube_imap
    * Fetch message body of a specific message from the server
    *
    * @param  int    Message UID
-   * @return Message/part body
-   * @see    ::get_message_part()
+   * @return string Message/part body
+   * @see    rcube_imap::get_message_part()
    */
   function &get_body($uid, $part=1)
     {
@@ -1236,15 +1244,15 @@ class rcube_imap
    * Returns the whole message source as string
    *
    * @param int  Message UID
-   * @return Message source string
+   * @return string Message source string
    */
   function &get_raw_body($uid)
     {
     if (!($msg_id = $this->_uid2id($uid)))
       return FALSE;
 
-       $body = iil_C_FetchPartHeader($this->conn, $this->mailbox, $msg_id, NULL);
-       $body .= iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, NULL, 1);
+    $body = iil_C_FetchPartHeader($this->conn, $this->mailbox, $msg_id, NULL);
+    $body .= iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, NULL, 1);
 
     return $body;    
     }
@@ -1260,9 +1268,9 @@ class rcube_imap
     if (!($msg_id = $this->_uid2id($uid)))
       return FALSE;
 
-       print iil_C_FetchPartHeader($this->conn, $this->mailbox, $msg_id, NULL);
-       flush();
-       iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, NULL, 2);
+    print iil_C_FetchPartHeader($this->conn, $this->mailbox, $msg_id, NULL);
+    flush();
+    iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, NULL, 2);
     }
 
 
@@ -1271,7 +1279,7 @@ class rcube_imap
    *
    * @param mixed  Message UIDs as array or as comma-separated string
    * @param string Flag to set: SEEN, UNDELETED, DELETED, RECENT, ANSWERED, DRAFT
-   * @return True on success, False on failure
+   * @return boolean True on success, False on failure
    */
   function set_flag($uids, $flag)
     {
@@ -1324,7 +1332,13 @@ class rcube_imap
     }
 
 
-  // append a mail message (source) to a specific mailbox
+  /**
+   * 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)
     {
     $mbox_name = stripslashes($mbox_name);
@@ -1344,7 +1358,14 @@ class rcube_imap
     }
 
 
-  // move a message from one mailbox to another
+  /**
+   * 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='')
     {
     $to_mbox = stripslashes($to_mbox);
@@ -1355,7 +1376,7 @@ class rcube_imap
     // make sure mailbox exists
     if (!in_array($to_mbox, $this->_list_mailboxes()))
       {
-      if (in_array(strtolower($to_mbox), $this->default_folders))
+      if (in_array($to_mbox, $this->default_folders))
         $this->create_mailbox($to_mbox, TRUE);
       else
         return FALSE;
@@ -1408,7 +1429,13 @@ class rcube_imap
     }
 
 
-  // mark messages as deleted and expunge mailbox
+  /**
+   * 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='')
     {
     $mbox_name = stripslashes($mbox_name);
@@ -1460,7 +1487,12 @@ class rcube_imap
     }
 
 
-  // clear all messages in a specific mailbox
+  /**
+   * Clear all messages in a specific mailbox
+   *
+   * @param string Mailbox name
+   * @return int Above 0 on success
+   */
   function clear_mailbox($mbox_name=NULL)
     {
     $mbox_name = stripslashes($mbox_name);
@@ -1487,7 +1519,13 @@ class rcube_imap
     }
 
 
-  // send IMAP expunge command and clear cache
+  /**
+   * 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)
     {
     $mbox_name = stripslashes($mbox_name);
@@ -1496,14 +1534,19 @@ class rcube_imap
     }
 
 
-  // send IMAP expunge command and clear cache
+  /**
+   * Send IMAP expunge command and clear cache
+   *
+   * @see rcube_imap::expunge()
+   * @access private
+   */
   function _expunge($mailbox, $clear_cache=TRUE)
     {
     $result = iil_C_Expunge($this->conn, $mailbox);
 
     if ($result>=0 && $clear_cache)
       {
-      //$this->clear_message_cache($mailbox.'.msg');
+      $this->clear_message_cache($mailbox.'.msg');
       $this->_clear_messagecount($mailbox);
       }
       
@@ -1520,7 +1563,7 @@ class rcube_imap
    * Get a list of all folders available on the IMAP server
    * 
    * @param string IMAP root dir
-   * @return array Inbdexed array with folder names 
+   * @return array Indexed array with folder names
    */
   function list_unsubscribed($root='')
     {
@@ -1547,8 +1590,10 @@ class rcube_imap
 
 
   /**
-   * Get quota
+   * Get mailbox quota information
    * added by Nuny
+   * 
+   * @return mixed Quota info or False if not supported
    */
   function get_quota()
     {
@@ -1560,9 +1605,12 @@ class rcube_imap
 
 
   /**
-   * subscribe to a specific mailbox(es)
+   * Subscribe to a specific mailbox(es)
+   *
+   * @param string Mailbox name(s)
+   * @return boolean True on success
    */ 
-  function subscribe($mbox_name, $mode='subscribe')
+  function subscribe($mbox_name)
     {
     if (is_array($mbox_name))
       $a_mboxes = $mbox_name;
@@ -1575,7 +1623,10 @@ class rcube_imap
 
 
   /**
-   * unsubscribe mailboxes
+   * Unsubscribe mailboxes
+   *
+   * @param string Mailbox name(s)
+   * @return boolean True on success
    */
   function unsubscribe($mbox_name)
     {
@@ -1609,11 +1660,11 @@ class rcube_imap
     $abs_name = $this->_mod_mailbox($name);
     $a_mailbox_cache = $this->get_cache('mailboxes');
 
-    if (strlen($abs_name) && (!is_array($a_mailbox_cache) || !in_array_nocase($abs_name, $a_mailbox_cache)))
+    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 ($subscribe)
+    if ($result && $subscribe)
       $this->subscribe($name);
 
     return $result ? $name : FALSE;
@@ -1625,7 +1676,7 @@ class rcube_imap
    *
    * @param string Mailbox to rename (as utf-7 string)
    * @param string New mailbox name (as utf-7 string)
-   * @param string Name of the renames mailbox, false on error
+   * @return string Name of the renames mailbox, False on error
    */
   function rename_mailbox($mbox_name, $new_name)
     {
@@ -1652,9 +1703,19 @@ class rcube_imap
     if (strlen($abs_name))
       $result = iil_C_RenameFolder($this->conn, $mailbox, $abs_name);
 
-    // clear cache
     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));
+          }
+
+      // clear cache
       $this->clear_message_cache($mailbox.'.msg');
       $this->clear_cache('mailboxes');      
       }
@@ -1668,7 +1729,10 @@ class rcube_imap
 
 
   /**
-   * remove mailboxes from server
+   * Remove mailboxes from server
+   *
+   * @param string Mailbox name
+   * @return boolean True on success
    */
   function delete_mailbox($mbox_name)
     {
@@ -1679,6 +1743,8 @@ class rcube_imap
     else if (is_string($mbox_name) && strlen($mbox_name))
       $a_mboxes = explode(',', $mbox_name);
 
+    $all_mboxes = iil_C_ListMailboxes($this->conn, $this->_mod_mailbox($root), '*');
+
     if (is_array($a_mboxes))
       foreach ($a_mboxes as $mbox_name)
         {
@@ -1691,6 +1757,15 @@ class rcube_imap
         $result = iil_C_DeleteFolder($this->conn, $mailbox);
         if ($result>=0)
           $deleted = TRUE;
+
+        foreach ($all_mboxes as $c_mbox)
+          if (preg_match('/^'.preg_quote($mailbox.$this->delimiter).'/', $c_mbox))
+            {
+            iil_C_UnSubscribe($this->conn, $c_mbox);
+            $result = iil_C_DeleteFolder($this->conn, $c_mbox);
+            if ($result>=0)
+              $deleted = TRUE;
+            }
         }
 
     // clear mailboxlist cache
@@ -1716,17 +1791,10 @@ class rcube_imap
     foreach ($this->default_folders as $folder)
       {
       $abs_name = $this->_mod_mailbox($folder);
-      if (!in_array_nocase($abs_name, $a_subscribed))
-        {
-        if (!in_array_nocase($abs_name, $a_folders))
-          $this->create_mailbox($folder, TRUE);
-        else
-          $this->subscribe($folder);
-        }
-      else if (!in_array_nocase($abs_name, $a_folders))
-        {
-        $this->create_mailbox($folder, FALSE);
-        }
+      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);
       }
     }
 
@@ -1736,7 +1804,9 @@ class rcube_imap
    *   internal caching methods
    * --------------------------------*/
 
-
+  /**
+   * @access private
+   */
   function set_caching($set)
     {
     if ($set && is_object($this->db))
@@ -1745,7 +1815,9 @@ class rcube_imap
       $this->caching_enabled = FALSE;
     }
 
-
+  /**
+   * @access private
+   */
   function get_cache($key)
     {
     // read cache
@@ -1758,7 +1830,9 @@ class rcube_imap
     return $this->cache[$key];
     }
 
-
+  /**
+   * @access private
+   */
   function update_cache($key, $data)
     {
     $this->cache[$key] = $data;
@@ -1766,7 +1840,9 @@ class rcube_imap
     $this->cache_changes[$key] = TRUE;
     }
 
-
+  /**
+   * @access private
+   */
   function write_cache()
     {
     if ($this->caching_enabled && $this->cache_changed)
@@ -1779,7 +1855,9 @@ class rcube_imap
       }    
     }
 
-
+  /**
+   * @access private
+   */
   function clear_cache($key=NULL)
     {
     if ($key===NULL)
@@ -1799,8 +1877,9 @@ class rcube_imap
       }
     }
 
-
-
+  /**
+   * @access private
+   */
   function _read_cache_record($key)
     {
     $cache_data = FALSE;
@@ -1823,10 +1902,12 @@ class rcube_imap
         }
       }
 
-    return $cache_data;    
+    return $cache_data;
     }
-    
 
+  /**
+   * @access private
+   */
   function _write_cache_record($key, $data)
     {
     if (!$this->db)
@@ -1875,7 +1956,9 @@ class rcube_imap
       }
     }
 
-
+  /**
+   * @access private
+   */
   function _clear_cache_record($key)
     {
     $this->db->query(
@@ -1893,8 +1976,13 @@ class rcube_imap
    * --------------------------------*/
    
 
-  // checks if the cache is up-to-date
-  // return: -3 = off, -2 = incomplete, -1 = dirty
+  /**
+   * Checks if the cache is up-to-date
+   *
+   * @param string Mailbox name
+   * @param string Internal cache key
+   * @return int -3 = off, -2 = incomplete, -1 = dirty
+   */
   function check_cache_status($mailbox, $cache_key)
     {
     if (!$this->caching_enabled)
@@ -1926,8 +2014,9 @@ class rcube_imap
       return -2;
     }
 
-
-
+  /**
+   * @access private
+   */
   function get_message_cache($key, $from, $to, $sort_field, $sort_order)
     {
     $cache_key = "$key:$from:$to:$sort_field:$sort_order";
@@ -1955,13 +2044,19 @@ class rcube_imap
         {
         $uid = $sql_arr['uid'];
         $this->cache[$cache_key][$uid] = 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);
         }
       }
       
     return $this->cache[$cache_key];
     }
 
-
+  /**
+   * @access private
+   */
   function &get_cached_message($key, $uid, $struct=false)
     {
     if (!$this->caching_enabled)
@@ -1993,7 +2088,9 @@ class rcube_imap
     return $this->cache[$internal_key][$uid];
     }
 
-   
+  /**
+   * @access private
+   */  
   function get_message_cache_index($key, $force=FALSE, $sort_col='idx', $sort_order='ASC')
     {
     static $sa_message_index = array();
@@ -2021,7 +2118,9 @@ class rcube_imap
     return $sa_message_index[$key];
     }
 
-
+  /**
+   * @access private
+   */
   function add_message_cache($key, $index, $headers, $struct=null)
     {
     if (!$this->caching_enabled || empty($key) || !is_object($headers) || empty($headers->uid))
@@ -2073,7 +2172,9 @@ class rcube_imap
       }
     }
     
-    
+  /**
+   * @access private
+   */
   function remove_message_cache($key, $index)
     {
     $this->db->query(
@@ -2086,7 +2187,9 @@ class rcube_imap
       $index);
     }
 
-
+  /**
+   * @access private
+   */
   function clear_message_cache($key, $start_index=1)
     {
     $this->db->query(
@@ -2106,7 +2209,14 @@ class rcube_imap
    *   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);
@@ -2142,6 +2252,13 @@ class rcube_imap
     }
 
 
+  /**
+   * 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 = $this->decode_mime_string((string)$input);
@@ -2155,7 +2272,10 @@ class rcube_imap
   /**
    * Decode a mime-encoded string to internal charset
    *
-   * @access static
+   * @param string  Header value
+   * @param string  Fallback charset if none specified
+   * @return string Decoded string
+   * @static
    */
   function decode_mime_string($input, $fallback=null)
     {
@@ -2187,7 +2307,7 @@ class rcube_imap
   /**
    * Decode a part of a mime-encoded string
    *
-   * @access static
+   * @access private
    */
   function _decode_mime_string_part($str)
     {
@@ -2215,6 +2335,14 @@ class rcube_imap
     }
 
 
+  /**
+   * Decode a mime part
+   *
+   * @param string Input string
+   * @param string Part encoding
+   * @return string Decoded string
+   * @access private
+   */
   function mime_decode($input, $encoding='7bit')
     {
     switch (strtolower($encoding))
@@ -2237,25 +2365,13 @@ class rcube_imap
     }
 
 
-  function mime_encode($input, $encoding='7bit')
-    {
-    switch ($encoding)
-      {
-      case 'quoted-printable':
-        return quoted_printable_encode($input);
-        break;
-
-      case 'base64':
-        return base64_encode($input);
-        break;
-
-      default:
-        return $input;
-      }
-    }
-
-
-  // convert body chars according to the ctype_parameters
+  /**
+   * Convert body charset to UTF-8 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']))
@@ -2266,6 +2382,33 @@ class rcube_imap
     }
 
 
+  /**
+   * Translate UID to message ID
+   *
+   * @param int    Message UID
+   * @param string Mailbox name
+   * @return int   Message ID
+   */
+  function get_id($uid, $mbox_name=NULL) 
+    {
+      $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
+      return $this->_uid2id($uid, $mailbox);
+    }
+
+
+  /**
+   * 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);
+    }
+
 
 
   /* --------------------------------
@@ -2273,6 +2416,9 @@ class rcube_imap
    * --------------------------------*/
 
 
+  /**
+   * @access private
+   */
   function _mod_mailbox($mbox_name, $mode='in')
     {
     if ((!empty($this->root_ns) && $this->root_ns == $mbox_name) || $mbox_name == 'INBOX')
@@ -2287,7 +2433,10 @@ class rcube_imap
     }
 
 
-  // sort mailboxes first by default folders and then in alphabethical order
+  /**
+   * Sort mailboxes first by default folders and then in alphabethical order
+   * @access private
+   */
   function _sort_mailbox_list($a_folders)
     {
     $a_out = $a_defaults = array();
@@ -2296,32 +2445,23 @@ class rcube_imap
     foreach($a_folders as $i => $folder)
       {
       if ($folder{0}=='.')
-       continue;
+        continue;
 
       if (($p = array_search(strtolower($folder), $this->default_folders_lc))!==FALSE)
-       $a_defaults[$p] = $folder;
+        $a_defaults[$p] = $folder;
       else
         $a_out[] = $folder;
       }
 
-    sort($a_out);
+    natcasesort($a_out);
     ksort($a_defaults);
     
     return array_merge($a_defaults, $a_out);
     }
 
-  function get_id($uid, $mbox_name=NULL) 
-    {
-      $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
-      return $this->_uid2id($uid, $mailbox);
-    }
-  
-  function get_uid($id,$mbox_name=NULL)
-    {
-      $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
-      return $this->_id2uid($id, $mailbox);
-    }
-
+  /**
+   * @access private
+   */
   function _uid2id($uid, $mbox_name=NULL)
     {
     if (!$mbox_name)
@@ -2333,6 +2473,9 @@ class rcube_imap
     return $this->uid_id_map[$mbox_name][$uid];
     }
 
+  /**
+   * @access private
+   */
   function _id2uid($id, $mbox_name=NULL)
     {
     if (!$mbox_name)
@@ -2342,7 +2485,10 @@ class rcube_imap
     }
 
 
-  // parse string or array of server capabilities and put them in internal array
+  /**
+   * Parse string or array of server capabilities and put them in internal array
+   * @access private
+   */
   function _parse_capability($caps)
     {
     if (!is_array($caps))
@@ -2369,7 +2515,10 @@ class rcube_imap
     }
 
 
-  // subscribe/unsubscribe a list of mailboxes and update local cache
+  /**
+   * Subscribe/unsubscribe a list of mailboxes and update local cache
+   * @access private
+   */
   function _change_subscription($a_mboxes, $mode)
     {
     $updated = FALSE;
@@ -2410,7 +2559,10 @@ class rcube_imap
     }
 
 
-  // increde/decrese messagecount for a specific mailbox
+  /**
+   * Increde/decrese messagecount for a specific mailbox
+   * @access private
+   */
   function _set_messagecount($mbox_name, $mode, $increment)
     {
     $a_mailbox_cache = FALSE;
@@ -2436,7 +2588,10 @@ class rcube_imap
     }
 
 
-  // remove messagecount of a specific mailbox from cache
+  /**
+   * Remove messagecount of a specific mailbox from cache
+   * @access private
+   */
   function _clear_messagecount($mbox_name='')
     {
     $a_mailbox_cache = FALSE;
@@ -2452,7 +2607,10 @@ class rcube_imap
     }
 
 
-  // split RFC822 header string into an associative array
+  /**
+   * Split RFC822 header string into an associative array
+   * @access private
+   */
   function _parse_headers($headers)
     {
     $a_headers = array();
@@ -2473,6 +2631,9 @@ class rcube_imap
     }
 
 
+  /**
+   * @access private
+   */
   function _parse_address_list($str, $decode=true)
     {
     // remove any newlines and carriage returns before
@@ -2501,6 +2662,9 @@ class rcube_imap
     }
 
 
+  /**
+   * @access private
+   */
   function _explode_quoted_string($delimiter, $string)
     {
     $result = array();
@@ -2519,11 +2683,14 @@ class rcube_imap
     $result[] = substr($string, $p);
     return $result;
     }
-  }
+
+}  // end class rcube_imap
 
 
 /**
  * Class representing a message part
+ *
+ * @package Mail
  */
 class rcube_message_part
 {
@@ -2544,10 +2711,9 @@ class rcube_message_part
 
 
 /**
- * rcube_header_sorter
- * 
  * Class for sorting an array of iilBasicHeader objects in a predetermined order.
  *
+ * @package Mail
  * @author Eric Stadtherr
  */
 class rcube_header_sorter
@@ -2555,9 +2721,9 @@ class rcube_header_sorter
    var $sequence_numbers = array();
    
    /**
-    * set the predetermined sort order.
+    * Set the predetermined sort order.
     *
-    * @param array $seqnums numerically indexed array of IMAP message sequence numbers
+    * @param array Numerically indexed array of IMAP message sequence numbers
     */
    function set_sequence_numbers($seqnums)
    {
@@ -2565,9 +2731,9 @@ class rcube_header_sorter
    }
  
    /**
-    * sort the array of header objects
+    * Sort the array of header objects
     *
-    * @param array $headers array of iilBasicHeader objects indexed by UID
+    * @param array Array of iilBasicHeader objects indexed by UID
     */
    function sort_headers(&$headers)
    {
@@ -2582,9 +2748,10 @@ class rcube_header_sorter
    }
  
    /**
-    * get the position of a message sequence number in my sequence_numbers array
+    * Get the position of a message sequence number in my sequence_numbers array
     *
-    * @param integer $seqnum message sequence number contained in sequence_numbers  
+    * @param int Message sequence number contained in sequence_numbers
+    * @return int Position, -1 if not found
     */
    function position_of($seqnum)
    {
@@ -2620,10 +2787,10 @@ class rcube_header_sorter
 /**
  * Add quoted-printable encoding to a given string
  * 
- * @param string  $input      string to encode
- * @param int     $line_max   add new line after this number of characters
- * @param boolena $space_conf true if spaces should be converted into =20
- * @return encoded string
+ * @param string   String to encode
+ * @param int      Add new line after this number of characters
+ * @param boolean  True if spaces should be converted into =20
+ * @return string Encoded string
  */
 function quoted_printable_encode($input, $line_max=76, $space_conv=false)
   {
index 074ca7948bacc7dda8d35381ccf4fb7c003f4192..f3828eb65c45e7c02dbc24907d2352ea3dce20ac 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_ldap.inc 563 2007-05-17 15:58:51Z thomasb $
+ $Id: rcube_ldap.inc 787 2007-09-09 17:58:13Z thomasb $
 
 */
 
+
+/**
+ * Model class to access an LDAP address directory
+ *
+ * @package Addressbook
+ */
 class rcube_ldap
 {
   var $conn;
@@ -52,14 +58,13 @@ class rcube_ldap
       if (preg_match('/^(.+)_field$/', $prop, $matches))
         $this->fieldmap[$matches[1]] = $value;
     
-    // $this->filter = "(dn=*)";
     $this->connect();
   }
 
   /**
    * PHP 4 object constructor
    *
-   * @see  rcube_ldap::__construct
+   * @see  rcube_ldap::__construct()
    */
   function rcube_ldap($p)
   {
@@ -81,11 +86,14 @@ class rcube_ldap
     if (!is_array($this->prop['hosts']))
       $this->prop['hosts'] = array($this->prop['hosts']);
 
+    if (empty($this->prop['ldap_version']))
+      $this->prop['ldap_version'] = 3;
+
     foreach ($this->prop['hosts'] as $host)
     {
       if ($lc = @ldap_connect($host, $this->prop['port']))
       {
-        ldap_set_option($lc, LDAP_OPT_PROTOCOL_VERSION, $this->prop['port']);
+        ldap_set_option($lc, LDAP_OPT_PROTOCOL_VERSION, $this->prop['ldap_version']);
         $this->prop['host'] = $host;
         $this->conn = $lc;
         break;
@@ -105,6 +113,10 @@ class rcube_ldap
 
   /**
    * Bind connection with DN and password
+   *
+   * @param string Bind DN
+   * @param string Bind password
+   * @return boolean True on success, False on error
    */
   function bind($dn, $pass)
   {
@@ -132,7 +144,10 @@ class rcube_ldap
   function close()
   {
     if ($this->conn)
+    {
       @ldap_unbind($this->conn);
+      $this->conn = null;
+    }
   }
 
 
@@ -163,7 +178,7 @@ class rcube_ldap
   /**
    * Save a search string for future listings
    *
-   * @param string ??
+   * @param string Filter string
    */
   function set_search_set($filter)
   {
@@ -197,10 +212,18 @@ class rcube_ldap
    * List the current set of contact records
    *
    * @param  array  List of cols to show
+   * @param  int    Only return this number of records (not implemented)
    * @return array  Indexed list of contact records, each a hash array
    */
   function list_records($cols=null, $subset=0)
   {
+    // add general filter to query
+    if (!empty($this->prop['filter']))
+    {
+      $filter = $this->prop['filter'];
+      $this->set_search_set($filter);
+    }
+    
     // exec LDAP search if no result resource is stored
     if ($this->conn && !$this->ldap_result)
       $this->_exec_search();
@@ -229,9 +252,9 @@ class rcube_ldap
    * @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
+   * @return array  Indexed list of contact records and 'count' value
    */
-  function search($fields, $value, $select=true)
+  function search($fields, $value, $strict=false, $select=true)
   {
     // special treatment for ID-based search
     if ($fields == 'ID' || $fields == $this->primary_key)
@@ -249,7 +272,7 @@ class rcube_ldap
     }
     
     $filter = '(|';
-    $wc = $this->prop['fuzzy_search'] ? '*' : '';
+    $wc = !$strict && $this->prop['fuzzy_search'] ? '*' : '';
     if (is_array($this->prop['search_fields']))
     {
       foreach ($this->prop['search_fields'] as $k => $field)
@@ -283,7 +306,7 @@ class rcube_ldap
   /**
    * Count number of available contacts in database
    *
-   * @return Result array with values for 'count' and 'first'
+   * @return object rcube_result_set Resultset with values for 'count' and 'first'
    */
   function count()
   {
@@ -298,7 +321,7 @@ class rcube_ldap
   /**
    * Return the last result set
    *
-   * @return Result array or NULL if nothing selected yet
+   * @return object rcube_result_set Current resultset or NULL if nothing selected yet
    */
   function get_result()
   {
@@ -309,8 +332,9 @@ class rcube_ldap
   /**
    * Get a specific contact record
    *
-   * @param mixed record identifier
-   * @return Hash array with all record fields or False if not found
+   * @param mixed   Record identifier
+   * @param boolean Return as associative array
+   * @return mixed  Hash array or rcube_result_set with all record fields
    */
   function get_record($dn, $assoc=false)
   {
@@ -335,8 +359,8 @@ class rcube_ldap
   /**
    * Create a new contact record
    *
-   * @param array Assoziative array with save data
-   * @return The create record ID on success, False on error
+   * @param array    Hash array with save data
+   * @return boolean The create record ID on success, False on error
    */
   function insert($save_cols)
   {
@@ -349,8 +373,8 @@ class rcube_ldap
    * Update a specific contact record
    *
    * @param mixed Record identifier
-   * @param array Assoziative array with save data
-   * @return True on success, False on error
+   * @param array Hash array with save data
+   * @return boolean True on success, False on error
    */
   function update($id, $save_cols)
   {
@@ -363,6 +387,7 @@ class rcube_ldap
    * Mark one or more contact records as deleted
    *
    * @param array  Record identifiers
+   * @return boolean True on success, False on error
    */
   function delete($ids)
   {
@@ -374,7 +399,7 @@ class rcube_ldap
   /**
    * Execute the LDAP search based on the stored credentials
    *
-   * @private
+   * @access private
    */
   function _exec_search()
   {
@@ -390,7 +415,7 @@ class rcube_ldap
   
   
   /**
-   * @private
+   * @access private
    */
   function _ldap2result($rec)
   {
@@ -410,7 +435,7 @@ class rcube_ldap
   
   
   /**
-   * @private
+   * @access private
    */
   function _map_field($field)
   {
@@ -429,4 +454,4 @@ class rcube_ldap
 
 }
 
-?>
\ No newline at end of file
+?>
old mode 100755 (executable)
new mode 100644 (file)
index 5f81aea..02206c6
@@ -5,7 +5,7 @@
  | program/include/rcube_mdb2.inc                                        |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -16,7 +16,7 @@
  | Author: Lukas Kahwe Smith <smith@pooteeweet.org>                      |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_mdb2.inc 420 2006-12-20 14:07:46Z thomasb $
+ $Id: rcube_mdb2.inc 850 2007-10-03 00:13:32Z ihug $
 
 */
 
@@ -32,14 +32,14 @@ require_once('MDB2.php');
  *
  * This is a wrapper for the PEAR::MDB2 class
  *
- * @package    RoundCube Webmail
+ * @package    Database
  * @author     David Saez Padros <david@ols.es>
  * @author     Thomas Bruederli <roundcube@gmail.com>
  * @author     Lukas Kahwe Smith <smith@pooteeweet.org>
  * @version    1.16
  * @link       http://pear.php.net/package/MDB2
  */
-class rcube_db
+class rcube_mdb2
   {
   var $db_dsnw;               // DSN for write operations
   var $db_dsnr;               // DSN for read operations
@@ -76,7 +76,7 @@ class rcube_db
   /**
    * PHP 4 object constructor
    *
-   * @see  rcube_MDB2::__construct
+   * @see  rcube_mdb2::__construct
    */
   function rcube_db($db_dsnw,$db_dsnr='')
     {
@@ -567,4 +567,4 @@ class rcube_db
 
   }  // end class rcube_db
 
-?>
\ No newline at end of file
+?>
index 737ebaf98fdb3e3c08284c66a3bbd00f67b0e0ed..fa871765d6ba1e58fdbaa8da894ca39210ef2943 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_shared.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: rcube_shared.inc 839 2007-09-29 18:15:05Z thomasb $
 
 */
 
 
-// ********* round cube schared classes *********
-
-class rcube_html_page
-  {
-  var $css;
-  
-  var $scripts_path = '';
-  var $script_files = array();
-  var $external_scripts = array();
-  var $scripts = array();
-  var $charset = 'ISO-8859-1';
-  
-  var $script_tag_file = "<script type=\"text/javascript\" src=\"%s%s\"></script>\n";
-  var $script_tag      = "<script type=\"text/javascript\">\n<!--\n%s\n\n//-->\n</script>\n";
-  var $default_template = "<html>\n<head><title></title></head>\n<body></body>\n</html>";
-  var $tag_format_external_script = "<script type=\"text/javascript\" src=\"%s\"></script>\n";
-
-  var $title = '';
-  var $header = '';
-  var $footer = '';
-  var $body = '';
-  var $body_attrib = array();
-  var $meta_tags = array();
-
-
-  // PHP 5 constructor
-  function __construct()
-    {
-    $this->css = new rcube_css();
-    }
-
-  // PHP 4 compatibility
-  function rcube_html_page()
-    {
-    $this->__construct();
-    }
-
-
-  function include_script($file, $position='head')
-    {
-    static $sa_files = array();
-    
-    if (in_array($file, $sa_files))
-      return;
-      
-    if (!is_array($this->script_files[$position]))
-      $this->script_files[$position] = array();
-      
-    $this->script_files[$position][] = $file;
-    }
-    
-  function include_external_script($script_location, $position='head')
-  {
-     if (!is_array($this->external_scripts[$position]))
-     {
-        $this->external_scripts[$position] = array();
-     }
-     
-     $this->external_scripts[$position][] = $script_location;
-  }
-
-  function add_script($script, $position='head')
-    {
-    if (!isset($this->scripts[$position]))
-      $this->scripts[$position] = "\n".rtrim($script);
-    else
-      $this->scripts[$position] .= "\n".rtrim($script);
-    }
-
-  function add_header($str)
-    {
-    $this->header .= "\n".$str;
-    }
-
-  function add_footer($str)
-    {
-    $this->footer .= "\n".$str;
-    }
-
-  function set_title($t)
-    {
-    $this->title = $t;
-    }
-
-
-  function set_charset($charset)
-    {
-    global $MBSTRING;
-    
-    $this->charset = $charset;
-    
-    if ($MBSTRING && function_exists("mb_internal_encoding"))
-      {
-      if(!@mb_internal_encoding($charset))
-        $MBSTRING = FALSE;
-      }
-    }
-
-  function get_charset()
-    {
-    return $this->charset;
-    }
-
-
-  function reset()
-    {
-    $this->css = new rcube_css();
-    $this->script_files = array();
-    $this->scripts = array();
-    $this->title = '';
-    $this->header = '';
-    $this->footer = '';
-    }
-
-
-  function write($templ='', $base_path='')
-    {
-    $output = empty($templ) ? $this->default_template : trim($templ);
-    
-    // set default page title
-    if (empty($this->title))
-      $this->title = 'RoundCube Mail';
-  
-    // replace specialchars in content
-    $__page_title = Q($this->title, 'show', FALSE);
-    $__page_header = $__page_body = $__page_footer = '';
-    
-    
-    // include meta tag with charset
-    if (!empty($this->charset))
-      {
-      header('Content-Type: text/html; charset='.$this->charset);
-      $__page_header = '<meta http-equiv="content-type" content="text/html; charset='.$this->charset.'" />'."\n";
-      }
-  
-  
-    // definition of the code to be placed in the document header and footer
-    if (is_array($this->script_files['head']))
-      foreach ($this->script_files['head'] as $file)
-        $__page_header .= sprintf($this->script_tag_file, $this->scripts_path, $file);
-
-    if (is_array($this->external_scripts['head']))
-      foreach ($this->external_scripts['head'] as $xscript)
-        $__page_header .= sprintf($this->tag_format_external_script, $xscript);
-
-    $head_script = $this->scripts['head_top'] . $this->scripts['head'];
-    if (!empty($head_script))
-      $__page_header .= sprintf($this->script_tag, $head_script);
-
-    if (!empty($this->header))
-      $__page_header .= $this->header;
-
-    if (is_array($this->script_files['foot']))
-      foreach ($this->script_files['foot'] as $file)
-        $__page_footer .= sprintf($this->script_tag_file, $this->scripts_path, $file);
-
-    if (!empty($this->scripts['foot']))
-      $__page_footer .= sprintf($this->script_tag, $this->scripts['foot']);
-      
-    if (!empty($this->footer))
-      $__page_footer .= $this->footer;
-
-    $__page_header .= $this->css->show();
-  
-    // find page header
-    if($hpos = strpos(strtolower($output), '</head>'))
-      $__page_header .= "\n";
-    else 
-      {
-      if (!is_numeric($hpos))
-        $hpos = strpos(strtolower($output), '<body');
-      if (!is_numeric($hpos) && ($hpos = strpos(strtolower($output), '<html')))
-        {
-        while($output[$hpos]!='>')
-        $hpos++;
-        $hpos++;
-        }
-  
-      $__page_header = "<head>\n<title>$__page_title</title>\n$__page_header\n</head>\n";
-      }
-  
-    // add page hader
-    if($hpos)
-      $output = substr($output,0,$hpos) . $__page_header . substr($output,$hpos,strlen($output));
-    else
-      $output = $__page_header . $output;
-  
-  
-    // find page body
-    if($bpos = strpos(strtolower($output), '<body'))
-      {
-      while($output[$bpos]!='>') $bpos++;
-      $bpos++;
-      }
-    else
-      $bpos = strpos(strtolower($output), '</head>')+7;
-  
-    // add page body
-    if($bpos && $__page_body)
-      $output = substr($output,0,$bpos) . "\n$__page_body\n" . substr($output,$bpos,strlen($output));
-  
-  
-    // find and add page footer
-    $output_lc = strtolower($output);
-    if(($fpos = strrstr($output_lc, '</body>')) ||
-       ($fpos = strrstr($output_lc, '</html>')))
-      $output = substr($output, 0, $fpos) . "$__page_footer\n" . substr($output, $fpos);
-    else
-      $output .= "\n$__page_footer";
-  
-  
-    // reset those global vars
-    $__page_header = $__page_footer = '';
-  
-  
-    // correct absolute paths in images and other tags
-    $output = preg_replace('/(src|href|background)=(["\']?)(\/[a-z0-9_\-]+)/Ui', "\\1=\\2$base_path\\3", $output);
-    $output = str_replace('$__skin_path', $base_path, $output);
-  
-    print rcube_charset_convert($output, 'UTF-8', $this->charset);
-    }
-    
-    
-  function _parse($templ)
-    {
-    
-    }
-  }
-
-
-
-
-class rcube_css
-  {
-  var $css_data = array();
-
-  var $css_groups = array();
-
-  var $include_files = array();
-
-  var $grouped_output = TRUE;
-
-  var $content_type = 'text/css';
-
-  var $base_path = '';
-
-  var $indent_chars = "\t";
-
-
-  // add or overwrite a css definition
-  // either pass porperty and value as separate arguments
-  // or provide an associative array as second argument
-  function set_style($selector, $property, $value='')
-    {
-    $a_elements = $this->_parse_selectors($selector);
-    foreach ($a_elements as $element)
-      {
-      if (!is_array($property))
-        $property = array($property => $value);
-
-      foreach ($property as $name => $value)
-        $this->css_data[$element][strtolower($name)] = $value;
-      }
-
-    // clear goups array
-    $this->css_groups = array();
-    }
-
-
-  // unset a style property
-  function remove_style($selector, $property)
-    {
-    if (!is_array($property))
-      $property = array($property);
-
-    foreach ($property as $key)
-      unset($this->css_data[$selector][strtolower($key)]);
-
-    // clear goups array
-    $this->css_groups = array();
-    }
-
-
-  // define base path for external css files
-  function set_basepath($path)
-    {
-    $this->base_path = preg_replace('/\/$/', '', $path);
-    }
-
-
-  // enable/disable grouped output
-  function set_grouped_output($grouped)
-    {
-    $this->grouped_output = $grouped;
-    }
-
-
-  // add a css file as external source
-  function include_file($filename, $media='')
-    {
-    // include multiple files
-    if (is_array($filename))
-      {
-      foreach ($filename as $file)
-        $this->include_file($file, $media);
-      }
-    // add single file
-    else if (!in_array($filename, $this->include_files))
-      $this->include_files[] = array('file' => $filename,
-                                     'media' => $media);
-    }
-
-
-  // parse css code
-  function import_string($str)
-    {
-    $ret = FALSE;
-    if (strlen($str))
-      $ret = $this->_parse($str);
-
-    return $ret;
-    }
-
-
-  // open and parse a css file
-  function import_file($file)
-    {
-    $ret = FALSE;
-
-    if (!is_file($file))
-      return $ret;
-
-    // for php version >= 4.3.0
-    if (function_exists('file_get_contents'))
-      $ret = $this->_parse(file_get_contents($file));
-
-    // for order php versions
-    else if ($fp = fopen($file, 'r'))
-      {
-      $ret = $this->_parse(fread($fp, filesize($file)));
-      fclose($fp);
-      }
-
-    return $ret;
-    }
-
-
-  // copy all properties inherited from superior styles to a specific selector
-  function copy_inherited_styles($selector)
-    {
-    // get inherited props from body and tag/class selectors
-    $css_props = $this->_get_inherited_styles($selector);
-
-    // write modified props back and clear goups array
-    if (sizeof($css_props))
-      {
-      $this->css_data[$selector] = $css_props;
-      $this->css_groups = array();
-      }
-    }
-
-
-  // return css definition for embedding in HTML
-  function show()
-    {
-    $out = '';
-
-    // include external css files
-    if (sizeof($this->include_files))
-      foreach ($this->include_files as $file_arr)
-      $out .= sprintf('<link rel="stylesheet" type="%s" href="%s"%s>'."\n",
-                        $this->content_type,
-                        $this->_get_file_path($file_arr['file']),
-                        $file_arr['media'] ? ' media="'.$file_arr['media'].'"' : '');
-
-
-    // compose css string
-    if (sizeof($this->css_data))
-      $out .= sprintf("<style type=\"%s\">\n<!--\n\n%s-->\n</style>",
-                      $this->content_type,
-                      $this->to_string());
-
-
-    return $out;
-    }
-
-
-  // return valid css code of the current styles grid
-  function to_string($selector=NULL)
-    {
-    // return code for a single selector
-    if ($selector)
-      {
-      $indent_str = $this->indent_chars;
-      $this->indent_chars = '';
-
-      $prop_arr = $this->to_array($selector);
-      $out = $this->_style2string($prop_arr, TRUE);
-
-      $this->indent_chars = $indent_str;
-      }
-
-    // compose css code for complete data grid
-    else
-      {
-      $out = '';
-      $css_data = $this->to_array();
-
-      foreach ($css_data as $key => $prop_arr)
-        $out .= sprintf("%s {\n%s}\n\n",
-                        $key,
-                        $this->_style2string($prop_arr, TRUE));
-      }
-
-    return $out;
-    }
-
-
-  // return a single-line string of a css definition
-  function to_inline($selector)
-    {
-    if ($this->css_data[$selector])
-      return str_replace('"', '\\"', $this->_style2string($this->css_data[$selector], FALSE));
-    }
-
-
-  // return an associative array with selector(s) as key and styles array as value
-  function to_array($selector=NULL)
-    {
-    if (!$selector && $this->grouped_output)
-      {
-      // build groups if desired
-      if (!sizeof($this->css_groups))
-        $this->_build_groups();
-
-      // modify group array to get an array(selector => properties)
-      $out_arr = array();
-      foreach ($this->css_groups as $group_arr)
-        {
-        $key = join(', ', $group_arr['selectors']);
-        $out_arr[$key] = $group_arr['properties'];
-        }
-      }
-    else
-      $out_arr = $this->css_data;
-
-    return $selector ? $out_arr[$selector] : $out_arr;
-    }
-
-
-  // create a css file
-  function to_file($filepath)
-    {
-    if ($fp = fopen($filepath, 'w'))
-      {
-      fwrite($fp, $this->to_string());
-      fclose($fp);
-      return TRUE;
-      }
-
-    return FALSE;
-    }
-
-
-  // alias method for import_string() [DEPRECATED]
-  function add($str)
-    {
-    $this->import_string($str);
-    }
-
-  // alias method for to_string() [DEPRECATED]
-  function get()
-    {
-    return $this->to_string();
-    }
-
-
-
-  // ******** private methods ********
-
-
-  // parse a string and add styles to internal data grid
-  function _parse($str)
-    {
-    // remove comments
-    $str = preg_replace("/\/\*(.*)?\*\//Usi", '', $str);
-
-    // parse style definitions
-    if (!preg_match_all ('/([a-z0-9\.#*:_][a-z0-9\.\-_#:*,\[\]\(\)\s\"\'\+\|>~=]+)\s*\{([^\}]*)\}/ims', $str, $matches, PREG_SET_ORDER))
-      return FALSE;
-
-
-    foreach ($matches as $match_arr)
-      {
-      // split selectors into array
-      $a_keys = $this->_parse_selectors(trim($match_arr[1]));
-
-      // parse each property of an element
-      $codes = explode(";", trim($match_arr[2]));
-      foreach ($codes as $code)
-        {
-        if (strlen(trim($code))>0)
-          {
-          // find the property and the value
-          if (!($sep = strpos($code, ':')))
-            continue;
-
-          $property = strtolower(trim(substr($code, 0, $sep)));
-          $value    = trim(substr($code, $sep+1));
-
-          // add the property to the object array
-          foreach ($a_keys as $key)
-            $this->css_data[$key][$property] = $value;
-          }
-        }
-      }
-
-    // clear goups array
-    if (sizeof($matches))
-      {
-      $this->css_groups = array();
-      return TRUE;
-      }
-
-    return FALSE;
-    }
-
-
-  // split selector group
-  function _parse_selectors($selector)
-    {
-    // trim selector and remove multiple spaces
-    $selector = preg_replace('/\s+/', ' ', trim($selector));
-
-    if (strpos($selector, ','))
-      return preg_split('/[\t\s\n\r]*,[\t\s\n\r]*/mi', $selector);
-    else
-      return array($selector);
-    }
-
-
-  // compare identical styles and make groups
-  function _build_groups()
-    {
-    // clear group array
-    $this->css_groups = array();
-    $string_group_map = array();
-
-    // bulild css string for each selector and check if the same is already defines
-    foreach ($this->css_data as $selector => $prop_arr)
-      {
-      // make shure to compare props in the same order
-      ksort($prop_arr);
-      $compare_str = preg_replace('/[\s\t]+/', '', $this->_style2string($prop_arr, FALSE));
-
-      // add selector to extisting group
-      if (isset($string_group_map[$compare_str]))
-        {
-        $group_index = $string_group_map[$compare_str];
-        $this->css_groups[$group_index]['selectors'][] = $selector;
-        }
-
-      // create new group
-      else
-        {
-        $i = sizeof($this->css_groups);
-        $string_group_map[$compare_str] = $i;
-        $this->css_groups[$i] = array('selectors' => array($selector),
-                                      'properties' => $this->css_data[$selector]);
-        }
-      }
-    }
-
-
-  // convert the prop array into a valid css definition
-  function _style2string($prop_arr, $multiline=TRUE)
-    {
-    $out = '';
-    $delm   = $multiline ? "\n" : '';
-    $spacer = $multiline ? ' ' : '';
-    $indent = $multiline ? $this->indent_chars : '';
-
-    if (is_array($prop_arr))
-      foreach ($prop_arr as $prop => $value)
-        if (strlen($value))
-          $out .= sprintf('%s%s:%s%s;%s',
-                          $indent,
-                          $prop,
-                          $spacer,
-                          $value,
-                          $delm);
-
-    return $out;
-    }
-
-
-  // copy all properties inherited from superior styles to a specific selector
-  function _get_inherited_styles($selector, $loop=FALSE)
-    {
-    $css_props = $this->css_data[$selector] ? $this->css_data[$selector] : array();
-
-    // get styles from tag selector
-    if (preg_match('/(([a-z0-9]*)(\.[^\s]+)?)$/i', $selector, $regs))
-      {
-      $sel = $regs[1];
-      $tagname = $regs[2];
-      $class = $regs[3];
-
-      if ($sel && is_array($this->css_data[$sel]))
-        $css_props = $this->_merge_styles($this->css_data[$sel], $css_props);
-
-      if ($class && is_array($this->css_data[$class]))
-        $css_props = $this->_merge_styles($this->css_data[$class], $css_props);
-
-      if ($tagname && is_array($this->css_data[$tagname]))
-        $css_props = $this->_merge_styles($this->css_data[$tagname], $css_props);
-      }
-
-    // analyse inheritance
-    if (strpos($selector, ' '))
-      {
-      $a_hier = split(' ', $selector);
-      if (sizeof($a_hier)>1)
-        {
-        array_pop($a_hier);
-        $base_selector = join(' ', $a_hier);
-
-        // call this method recursively
-        $new_props = $this->_get_inherited_styles($base_selector, TRUE);
-        $css_props = $this->_merge_styles($new_props, $css_props);
-        }
-      }
-
-    // get body style
-    if (!$loop && is_array($this->css_data['body']))
-      $css_props = $this->_merge_styles($this->css_data['body'], $css_props);
-
-    return $css_props;
-    }
-
-
-  // merge two arrays with style properties together like a browser would do
-  function _merge_styles($one, $two)
-    {
-    // these properties are additive
-    foreach (array('text-decoration') as $prop)
-      if ($one[$prop] && $two[$prop])
-        {
-        // if value contains 'none' it's ignored
-        if (strstr($one[$prop], 'none'))
-          continue;
-        else if (strstr($two[$prop], 'none'))
-          unset($two[$prop]);
-
-        $a_values_one = split(' ', $one[$prop]);
-        $a_values_two = split(' ', $two[$prop]);
-        $two[$prop] = join(' ', array_unique(array_merge($a_values_one, $a_values_two)));
-        }
-
-    return array_merge($one, $two);
-    }
-
-
-  // resolve file path
-  function _get_file_path($file)
-    {
-    if (!$this->base_path && $GLOBALS['CSS_PATH'])
-      $this->set_basepath($GLOBALS['CSS_PATH']);
-
-    $base = ($file{0}=='/' || $file{0}=='.' || substr($file, 0, 7)=='http://') ? '' :
-            ($this->base_path ? $this->base_path.'/' : '');
-    return $base.$file;
-    }
-
-  }
-
-
-
-class base_form_element
-  {
-  var $uppertags = FALSE;
-  var $upperattribs = FALSE;
-  var $upperprops = FALSE;
-  var $newline = FALSE;
-  
-  var $attrib = array();
-
-
-  // create string with attributes
-  function create_attrib_string($tagname='')
-    {
-    if (!sizeof($this->attrib))
-      return '';
-
-    if ($this->name!='')
-      $this->attrib['name'] = $this->name;
-
-    $attrib_arr = array();
-    foreach ($this->attrib as $key => $value)
-      {
-      // don't output some internally used attributes
-      if (in_array($key, array('form', 'quicksearch')))
-        continue;
-
-      // skip if size if not numeric
-      if (($key=='size' && !is_numeric($value)))
-        continue;
-        
-      // skip empty eventhandlers
-      if ((strpos($key,'on')===0 && $value==''))
-        continue;
-
-      // encode textarea content
-      if ($key=='value')
-        $value = Q($value, 'strict', FALSE);
-
-      // attributes with no value
-      if (in_array($key, array('checked', 'multiple', 'disabled', 'selected')))
-        {
-        if ($value)
-          $attrib_arr[] = $key;
-        }
-      // don't convert size of value attribute
-      else if ($key=='value')
-        $attrib_arr[] = sprintf('%s="%s"', $this->_conv_case($key, 'attrib'), $value, 'value');
-        
-      // regular tag attributes
-      else
-        $attrib_arr[] = sprintf('%s="%s"', $this->_conv_case($key, 'attrib'), $this->_conv_case($value, 'value'));
-      }
-
-    return sizeof($attrib_arr) ? ' '.implode(' ', $attrib_arr) : '';
-    }
-    
-    
-  // convert tags and attributes to upper-/lowercase
-  // $type can either be "tag" or "attrib"
-  function _conv_case($str, $type='attrib')
-    {
-    if ($type == 'tag')
-      return $this->uppertags ? strtoupper($str) : strtolower($str);
-    else if ($type == 'attrib')
-      return $this->upperattribs ? strtoupper($str) : strtolower($str);
-    else if ($type == 'value')
-      return $this->upperprops ? strtoupper($str) : strtolower($str);
-    }    
-  }
-
-
-class input_field extends base_form_element
-  {
-  var $type = 'text';
-  
-  // PHP 5 constructor
-  function __construct($attrib=NULL)
-    {
-    if (is_array($attrib))
-      $this->attrib = $attrib;
-
-    if ($attrib['type'])
-      $this->type = $attrib['type'];    
-
-    if ($attrib['newline'])
-      $this->newline = TRUE;    
-    }
-
-  // PHP 4 compatibility
-  function input_field($attrib=array())
-    {
-    $this->__construct($attrib);
-    }  
-
-  // compose input tag
-  function show($value=NULL, $attrib=NULL)
-    {
-    // overwrite object attributes
-    if (is_array($attrib))
-      $this->attrib = array_merge($this->attrib, $attrib);
-
-    // set value attribute
-    if ($value!==NULL)
-      $this->attrib['value'] = $value;
-
-    $this->attrib['type'] = $this->type;
-
-    // return final tag
-    return sprintf('<%s%s />%s',
-                   $this->_conv_case('input', 'tag'),
-                   $this->create_attrib_string(),
-                   ($this->newline ? "\n" : ""));    
-    }  
-  }
-
-
-class textfield extends input_field
-  {
-  var $type = 'text';
-  }
-
-class passwordfield extends input_field
-  {
-  var $type = 'password';
-  }
-
-class radiobutton extends input_field
-  {
-  var $type = 'radio';
-  }
-
-class checkbox extends input_field
-  {
-  var $type = 'checkbox';
-
-
-  function show($value='', $attrib=NULL)
-    {
-    // overwrite object attributes
-    if (is_array($attrib))
-      $this->attrib = array_merge($this->attrib, $attrib);    
-
-    $this->attrib['type'] = $this->type;
-
-    if ($value && (string)$value==(string)$this->attrib['value'])
-      $this->attrib['checked'] = TRUE;
-    else
-      $this->attrib['checked'] = FALSE;
-
-    // return final tag
-    return sprintf('<%s%s />%s',
-                   $this->_conv_case('input', 'tag'),
-                   $this->create_attrib_string(),
-                   ($this->newline ? "\n" : ""));    
-    }
-  }
-
-
-class textarea extends base_form_element
-  {
-  // PHP 5 constructor
-  function __construct($attrib=array())
-    {
-    $this->attrib = $attrib;
-
-    if ($attrib['newline'])
-      $this->newline = TRUE;    
-    }
-
-  // PHP 4 compatibility
-  function textarea($attrib=array())
-    {
-    $this->__construct($attrib);
-    }
-    
-  function show($value='', $attrib=NULL)
-    {
-    // overwrite object attributes
-    if (is_array($attrib))
-      $this->attrib = array_merge($this->attrib, $attrib);
-    
-    // take value attribute as content
-    if ($value=='')
-      $value = $this->attrib['value'];
-    
-    // make shure we don't print the value attribute
-    if (isset($this->attrib['value']))
-      unset($this->attrib['value']);
-
-    if (!empty($value) && !isset($this->attrib['mce_editable']))
-      $value = Q($value, 'strict', FALSE);
-
-    // return final tag
-    return sprintf('<%s%s>%s</%s>%s',
-                   $this->_conv_case('textarea', 'tag'),
-                   $this->create_attrib_string(),
-                   $value,
-                   $this->_conv_case('textarea', 'tag'),
-                   ($this->newline ? "\n" : ""));       
-    }
-  }
-
-
-class hiddenfield extends base_form_element
-  {
-  var $fields_arr = array();
-  var $newline = TRUE;
-
-  // PHP 5 constructor
-  function __construct($attrib=NULL)
-    {
-    if (is_array($attrib))
-      $this->add($attrib);
-    }
-
-  // PHP 4 compatibility
-  function hiddenfield($attrib=NULL)
-    {
-    $this->__construct($attrib);
-    }
-
-  // add a hidden field to this instance
-  function add($attrib)
-    {
-    $this->fields_arr[] = $attrib;
-    }
-
-
-  function show()
-    {
-    $out = '';
-    foreach ($this->fields_arr as $attrib)
-      {
-      $this->attrib = $attrib;
-      $this->attrib['type'] = 'hidden';
-      
-      $out .= sprintf('<%s%s />%s',
-                   $this->_conv_case('input', 'tag'),
-                   $this->create_attrib_string(),
-                   ($this->newline ? "\n" : ""));   
-      }
-
-    return $out;
-    }
-  }
-
-
-class select extends base_form_element
-  {
-  var $options = array();
-
-  /*
-  syntax:
-  -------
-  // create instance. arguments are used to set attributes of select-tag
-  $select = new select(array('name' => 'fieldname'));
-
-  // add one option
-  $select->add('Switzerland', 'CH');
-
-  // add multiple options
-  $select->add(array('Switzerland', 'Germany'),
-               array('CH', 'DE'));
-
-  // add 10 blank options with 50 chars
-  // used to fill with javascript (necessary for 4.x browsers)
-  $select->add_blank(10, 50);
-
-  // generate pulldown with selection 'Switzerland'  and return html-code
-  // as second argument the same attributes available to instanciate can be used
-  print $select->show('CH');
-  */
-
-  // PHP 5 constructor
-  function __construct($attrib=NULL)
-    {
-    if (is_array($attrib))
-      $this->attrib = $attrib;
-
-    if ($attrib['newline'])
-      $this->newline = TRUE;
-    }
-
-  // PHP 4 compatibility
-  function select($attrib=NULL)
-    {
-    $this->__construct($attrib);
-    }
-
-
-  function add($names, $values=NULL)
-    {
-    if (is_array($names))
-      {
-      foreach ($names as $i => $text)
-        $this->options[] = array('text' => $text, 'value' => (string)$values[$i]);
-      }
-    else
-      {
-      $this->options[] = array('text' => $names, 'value' => (string)$values);
-      }
-    }
-
-    
-  function add_blank($nr, $width=0)
-    {
-    $text = $width ? str_repeat('&nbsp;', $width) : '';
-    
-    for ($i=0; $i < $nr; $i++)
-      $this->options[] = array('text' => $text);
-    }
-
-  
-  function show($select=array(), $attrib=NULL)
-    {
-    $options_str = "\n";
-    $value_str = $this->_conv_case(' value="%s"', 'attrib');
-    
-    if (!is_array($select))
-      $select = array((string)$select);
-
-    foreach ($this->options as $option)
-      {
-      $selected = ((isset($option['value']) &&
-                    in_array($option['value'], $select, TRUE)) ||
-                   (in_array($option['text'], $select, TRUE))) ?
-        $this->_conv_case(' selected', 'attrib') : '';
-                   
-      $options_str .= sprintf("<%s%s%s>%s</%s>\n",
-                             $this->_conv_case('option', 'tag'),
-                             !empty($option['value']) ? sprintf($value_str, Q($option['value'])) : '',
-                             $selected, 
-                             Q($option['text'], 'strict', FALSE),
-                             $this->_conv_case('option', 'tag'));
-      }
-
-    // return final tag
-    return sprintf('<%s%s>%s</%s>%s',
-                   $this->_conv_case('select', 'tag'),
-                   $this->create_attrib_string(),
-                   $options_str,
-                   $this->_conv_case('select', 'tag'),
-                   ($this->newline ? "\n" : ""));    
-    }
-  }
-
-
-
-
-// ********* rcube schared functions *********
+/**
+ * RoundCube shared functions
+ * 
+ * @package Core
+ */
 
 
-// provide details about the client's browser
+/**
+ * Provide details about the client's browser
+ *
+ * @return array Key-value pairs of browser properties
+ */
 function rcube_browser()
-  {
+{
   $HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
 
   $bw['ver'] = 0;
@@ -1069,25 +50,25 @@ function rcube_browser()
   $bw['safari'] = stristr($HTTP_USER_AGENT, 'safari');
 
   if($bw['ns'])
-    {
+  {
     $test = eregi("mozilla\/([0-9\.]+)", $HTTP_USER_AGENT, $regs);
     $bw['ver'] = $test ? (float)$regs[1] : 0;
-    }
+  }
   if($bw['mz'])
-    {
+  {
     $test = ereg("rv:([0-9\.]+)", $HTTP_USER_AGENT, $regs);
     $bw['ver'] = $test ? (float)$regs[1] : 0;
-    }
+  }
   if($bw['ie'])
-    {
+  {
     $test = eregi("msie ([0-9\.]+)", $HTTP_USER_AGENT, $regs);
     $bw['ver'] = $test ? (float)$regs[1] : 0;
-    }
+  }
   if($bw['opera'])
-    {
+  {
     $test = eregi("opera ([0-9\.]+)", $HTTP_USER_AGENT, $regs);
     $bw['ver'] = $test ? (float)$regs[1] : 0;
-    }
+  }
 
   if(eregi(" ([a-z]{2})-([a-z]{2})", $HTTP_USER_AGENT, $regs))
     $bw['lang'] =  $regs[1];
@@ -1099,12 +80,17 @@ function rcube_browser()
                     ($bw['ie'] && $bw['ver']>=5 && $bw['mac']) || ($bw['opera'] && $bw['ver']>=7) ? TRUE : FALSE;
 
   return $bw;
-  }
+}
 
 
-// get text in the desired language from the language file
+/**
+ * Get localized text in the desired language
+ *
+ * @param mixed Named parameters array or label name
+ * @return string Localized text
+ */
 function rcube_label($attrib)
-  {
+{
   global $sess_user_lang, $INSTALL_PATH, $OUTPUT;
   static $sa_text_data, $s_language, $utf8_decode;
 
@@ -1135,7 +121,7 @@ function rcube_label($attrib)
     
     // include user language files
     if ($sess_user_lang!='en' && is_dir($INSTALL_PATH.'program/localization/'.$sess_user_lang))
-      {
+    {
       include_once($INSTALL_PATH.'program/localization/'.$sess_user_lang.'/labels.inc');
       include_once($INSTALL_PATH.'program/localization/'.$sess_user_lang.'/messages.inc');
 
@@ -1143,23 +129,24 @@ function rcube_label($attrib)
         $sa_text_data = array_merge($sa_text_data, $labels);
       if (is_array($messages))
         $sa_text_data = array_merge($sa_text_data, $messages);
-      }
+    }
       
     $s_language = $sess_user_lang;
-    }
+  }
 
   // text does not exist
   if (!($text_item = $sa_text_data[$alias]))
-    {
+  {
     /*
-    raise_error(array('code' => 500,
-                      'type' => 'php',
-                      'line' => __LINE__,
-                      'file' => __FILE__,
-                      'message' => "Missing localized text for '$alias' in '$sess_user_lang'"), TRUE, FALSE);
+    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]";
-    }
+  }
 
   // make text item array 
   $a_text_item = is_array($text_item) ? $text_item : array('single' => $text_item);
@@ -1170,14 +157,14 @@ function rcube_label($attrib)
   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=='')
@@ -1185,10 +172,10 @@ function rcube_label($attrib)
 
   // replace vars in text
   if (is_array($attrib['vars']))
-    {
+  {
     foreach ($attrib['vars'] as $var_key=>$var_value)
       $a_replace_vars[substr($var_key, 0, 1)=='$' ? substr($var_key, 1) : $var_key] = $var_value;
-    }
+  }
 
   if ($a_replace_vars)
     $text = preg_replace('/\${?([_a-z]{1}[_a-z0-9]*)}?/ei', '$a_replace_vars["\1"]', $text);
@@ -1208,12 +195,14 @@ EOF;
     return strtolower($text);
 
   return $text;
-  }
+}
 
 
-// send HTTP header for no-cacheing steps
+/**
+ * Send HTTP headers to prevent caching this page
+ */
 function send_nocacheing_headers()
-  {
+{
   if (headers_sent())
     return;
 
@@ -1221,22 +210,32 @@ function send_nocacheing_headers()
   header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
   header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
   header("Pragma: no-cache");
-  }
+}
 
 
-// send header with expire date 30 days in future
+/**
+ * Send header with expire date 30 days in future
+ *
+ * @param int Expiration time in seconds
+ */
 function send_future_expire_header($offset=2600000)
-  {
+{
   if (headers_sent())
     return;
 
   header("Expires: ".gmdate("D, d M Y H:i:s", mktime()+$offset)." GMT");
   header("Cache-Control: max-age=$offset");
   header("Pragma: ");
-  }
+}
 
 
-// check request for If-Modified-Since and send an according response
+/**
+ * Check request for If-Modified-Since and send an according response.
+ * This will terminate the current script if headers match the given values
+ *
+ * @param int Modified date as unix timestamp
+ * @param string Etag value for caching
+ */
 function send_modified_header($mdate, $etag=null)
 {
   if (headers_sent())
@@ -1268,260 +267,339 @@ function send_modified_header($mdate, $etag=null)
 
 
 /**
- * Convert a variable into a javascript notation string
+ * 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_object($var))
+    $var = get_object_vars($var);
 
-    if (is_array($var))
+  if (is_array($var))
+  {
+    // empty array
+    if (!sizeof($var))
+      return '[]';
+    else
     {
-      // 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();
+      $keys_arr = array_keys($var);
+      $is_assoc = $have_numeric = 0;
 
-        foreach ($var as $key => $value)
-        {
-          // enclose key with quotes if it is not variable-name conform
-          if (!ereg("^[_a-zA-Z]{1}[_a-zA-Z0-9]*$", $key) /* || is_js_reserved_word($key) */)
-            $key = "'$key'";
+      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();
 
-          $pairs[] = sprintf("%s%s", $is_assoc ? "$key:" : '', json_serialize($value));
-        }
+      foreach ($var as $key => $value)
+      {
+        // enclose key with quotes if it is not variable-name conform
+        if (!ereg("^[_a-zA-Z]{1}[_a-zA-Z0-9]*$", $key) /* || is_js_reserved_word($key) */)
+          $key = "'$key'";
 
-        return $brackets{0} . implode(',', $pairs) . $brackets{1};
+        $pairs[] = sprintf("%s%s", $is_assoc ? "$key:" : '', json_serialize($value));
       }
+
+      return $brackets{0} . implode(',', $pairs) . $brackets{1};
     }
-    else if (is_numeric($var) && strval(intval($var)) === strval($var))
-      return $var;
-    else if (is_bool($var))
-      return $var ? '1' : '0';
-    else
-      return "'".JQ($var)."'";
-  
   }
+  else if (is_numeric($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
+ * 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
+ *
+ * @param mixed Needle value
+ * @param array Array to search in
+ * @return boolean True if found, False if not
  */
 function in_array_nocase($needle, $haystack)
-  {
+{
   foreach ($haystack as $value)
-    {
     if (strtolower($needle)===strtolower($value))
-      return TRUE;
-    }
-    
-  return FALSE;
-  }
+      return true;
+  
+  return false;
+}
 
 
 /**
  * Find out if the string content means TRUE or FALSE
+ *
+ * @param string Input value
+ * @return boolean Imagine what!
  */
 function get_boolean($str)
-  {
+{
   $str = strtolower($str);
   if(in_array($str, array('false', '0', 'no', 'nein', ''), TRUE))
     return FALSE;
   else
     return TRUE;
-  }
+}
 
 
-// parse a human readable string for a number of bytes
+/**
+ * Parse a human readable string for a number of bytes
+ *
+ * @param string Input string
+ * @return int Number of bytes
+ */
 function parse_bytes($str)
-  {
+{
   if (is_numeric($str))
     return intval($str);
     
   if (preg_match('/([0-9]+)([a-z])/i', $str, $regs))
+  {
+    $bytes = floatval($regs[1]);
+    switch (strtolower($regs[2]))
     {
-      $bytes = floatval($regs[1]);
-      switch (strtolower($regs[2]))
-      {
-        case 'g':
-          $bytes *= 1073741824;
-          break;
-        case 'm':
-          $bytes *= 1048576;
-          break;
-        case 'k':
-          $bytes *= 1024;
-          break;
-      }
+      case 'g':
+        $bytes *= 1073741824;
+        break;
+      case 'm':
+        $bytes *= 1048576;
+        break;
+      case 'k':
+        $bytes *= 1024;
+        break;
     }
+  }
 
   return intval($bytes);
-  }
+}
     
-// create a human readable string for a number of bytes
+/**
+ * Create a human readable string for a number of bytes
+ *
+ * @param int Number of bytes
+ * @return string Byte string
+ */
 function show_bytes($bytes)
-  {
+{
   if ($bytes > 1073741824)
-    {
+  {
     $gb = $bytes/1073741824;
     $str = sprintf($gb>=10 ? "%d GB" : "%.1f GB", $gb);
-    }
+  }
   else if ($bytes > 1048576)
-    {
+  {
     $mb = $bytes/1048576;
     $str = sprintf($mb>=10 ? "%d MB" : "%.1f MB", $mb);
-    }
+  }
   else if ($bytes > 1024)
     $str = sprintf("%d KB",  round($bytes/1024));
   else
     $str = sprintf('%d B', $bytes);
 
   return $str;
-  }
+}
 
 
-// convert paths like ../xxx to an absolute path using a base url
+/**
+ * Convert paths like ../xxx to an absolute path using a base url
+ *
+ * @param string Relative path
+ * @param string Base URL
+ * @return string Absolute URL
+ */
 function make_absolute_url($path, $base_url)
-    {
-    $host_url = $base_url;
-    $abs_path = $path;
+{
+  $host_url = $base_url;
+  $abs_path = $path;
+  
+  // check if path is an absolute URL
+  if (preg_match('/^[fhtps]+:\/\//', $path))
+    return $path;
 
-    // cut base_url to the last directory
-    if (strpos($base_url, '/')>7)
-      {
-      $host_url = substr($base_url, 0, strpos($base_url, '/'));
-      $base_url = substr($base_url, 0, strrpos($base_url, '/'));
-      }
+  // cut base_url to the last directory
+  if (strpos($base_url, '/')>7)
+  {
+    $host_url = substr($base_url, 0, strpos($base_url, '/'));
+    $base_url = substr($base_url, 0, strrpos($base_url, '/'));
+  }
 
-    // $path is absolute
-    if ($path{0}=='/')
-      $abs_path = $host_url.$path;
-    else
+  // $path is absolute
+  if ($path{0}=='/')
+    $abs_path = $host_url.$path;
+  else
+  {
+    // strip './' because its the same as ''
+    $path = preg_replace('/^\.\//', '', $path);
+
+    if (preg_match_all('/\.\.\//', $path, $matches, PREG_SET_ORDER))
+      foreach ($matches as $a_match)
       {
-      // strip './' because its the same as ''
-      $path = preg_replace('/^\.\//', '', $path);
-
-      if(preg_match_all('/\.\.\//', $path, $matches, PREG_SET_ORDER))
-        foreach($matches as $a_match)
-          {
-          if (strrpos($base_url, '/'))
-            $base_url = substr($base_url, 0, strrpos($base_url, '/'));
-          
-          $path = substr($path, 3);
-          }
-
-      $abs_path = $base_url.'/'.$path;
+        if (strrpos($base_url, '/'))
+          $base_url = substr($base_url, 0, strrpos($base_url, '/'));
+        
+        $path = substr($path, 3);
       }
-      
-    return $abs_path;
-    }
+
+    $abs_path = $base_url.'/'.$path;
+  }
+    
+  return $abs_path;
+}
 
 
-// wrapper function for strlen
+/**
+ * Wrapper function for strlen
+ */
 function rc_strlen($str)
-  {
-    if (function_exists('mb_strlen'))
-      return mb_strlen($str);
-    else
-      return strlen($str);
-  }
+{
+  if (function_exists('mb_strlen'))
+    return mb_strlen($str);
+  else
+    return strlen($str);
+}
   
-// wrapper function for strtolower
+/**
+ * Wrapper function for strtolower
+ */
 function rc_strtolower($str)
-  {
-    if (function_exists('mb_strtolower'))
-      return mb_strtolower($str);
-    else
-      return strtolower($str);
-  }
+{
+  if (function_exists('mb_strtolower'))
+    return mb_strtolower($str);
+  else
+    return strtolower($str);
+}
 
-// wrapper function for substr
+/**
+ * Wrapper function for substr
+ */
 function rc_substr($str, $start, $len=null)
-  {
+{
   if (function_exists('mb_substr'))
     return mb_substr($str, $start, $len);
   else
     return substr($str, $start, $len);
-  }
+}
 
-// wrapper function for strpos
+/**
+ * Wrapper function for strpos
+ */
 function rc_strpos($haystack, $needle, $offset=0)
-  {
+{
   if (function_exists('mb_strpos'))
     return mb_strpos($haystack, $needle, $offset);
   else
     return strpos($haystack, $needle, $offset);
-  }
+}
 
-// wrapper function for strrpos
+/**
+ * Wrapper function for strrpos
+ */
 function rc_strrpos($haystack, $needle, $offset=0)
-  {
+{
   if (function_exists('mb_strrpos'))
     return mb_strrpos($haystack, $needle, $offset);
   else
     return strrpos($haystack, $needle, $offset);
+}
+
+
+/**
+ * Read a specific HTTP request header
+ *
+ * @access static
+ * @param  string $name Header name
+ * @return mixed  Header value or null if not available
+ */
+function rc_request_header($name)
+{
+  if (function_exists('getallheaders'))
+  {
+    $hdrs = array_change_key_case(getallheaders(), CASE_UPPER);
+    $key  = strtoupper($name);
+  }
+  else
+  {
+    $key  = 'HTTP_' . strtoupper(strtr($name, '-', '_'));
+    $hdrs = array_change_key_case($_SERVER, CASE_UPPER);
+  }
+
+  return $hdrs[$key];
   }
 
 
-// replace the middle part of a string with ...
-// if it is longer than the allowed length
+/**
+ * Replace the middle part of a string with ...
+ * if it is longer than the allowed length
+ *
+ * @param string Input string
+ * @param int    Max. length
+ * @param string Replace removed chars with this
+ * @return string Abbrevated string
+ */
 function abbrevate_string($str, $maxlength, $place_holder='...')
-  {
+{
   $length = rc_strlen($str);
   $first_part_length = floor($maxlength/2) - rc_strlen($place_holder);
   
   if ($length > $maxlength)
-    {
+  {
     $second_starting_location = $length - $maxlength + $first_part_length + 1;
     $str = rc_substr($str, 0, $first_part_length) . $place_holder . rc_substr($str, $second_starting_location, $length);
-    }
+  }
 
   return $str;
-  }
+}
 
 
-// make sure the string ends with a slash
+/**
+ * Make sure the string ends with a slash
+ */
 function slashify($str)
-  {
+{
   return unslashify($str).'/';
-  }
+}
 
 
-// remove slash at the end of the string
+/**
+ * Remove slash at the end of the string
+ */
 function unslashify($str)
-  {
+{
   return preg_replace('/\/$/', '', $str);
-  }
+}
   
 
-// delete all files within a folder
+/**
+ * Delete all files within a folder
+ *
+ * @param string Path to directory
+ * @return boolean True on success, False if directory was not found
+ */
 function clear_directory($dir_path)
-  {
+{
   $dir = @opendir($dir_path);
   if(!$dir) return FALSE;
 
@@ -1531,26 +609,32 @@ function clear_directory($dir_path)
 
   closedir($dir);
   return TRUE;
-  }
+}
 
 
-// create a unix timestamp with a specified offset from now
+/**
+ * Create a unix timestamp with a specified offset from now
+ *
+ * @param string String representation of the offset (e.g. 20min, 5h, 2days)
+ * @param int Factor to multiply with the offset
+ * @return int Unix timestamp
+ */
 function get_offset_time($offset_str, $factor=1)
   {
   if (preg_match('/^([0-9]+)\s*([smhdw])/i', $offset_str, $regs))
-    {
+  {
     $amount = (int)$regs[1];
     $unit = strtolower($regs[2]);
-    }
+  }
   else
-    {
+  {
     $amount = (int)$offset_str;
     $unit = 's';
-    }
+  }
     
   $ts = mktime();
   switch ($unit)
-    {
+  {
     case 'w':
       $amount *= 7;
     case 'd':
@@ -1561,37 +645,34 @@ function get_offset_time($offset_str, $factor=1)
       $amount *= 60;
     case 's':
       $ts += $amount * $factor;
-    }
+  }
 
   return $ts;
-  }
+}
 
 
 /**
- * strrstr
+ * Return the last occurence of a string in another string
  *
- * return the last occurence of a string in another string
  * @param haystack string string in which to search
  * @param needle string string for which to search
  * @return index of needle within haystack, or false if not found
  */
 function strrstr($haystack, $needle)
+{
+  $pver = phpversion();
+  if ($pver[0] >= 5)
+      return strrpos($haystack, $needle);
+  else
   {
-    $pver = phpversion();
-    if ($pver[0] >= 5)
-      {
-        return strrpos($haystack, $needle);
-      }
-    else
-      {
-        $index = strpos(strrev($haystack), strrev($needle));
-        if($index === false) {
-            return false;
-        }
-        $index = strlen($haystack) - strlen($needle) - $index;
-        return $index;
-      }
+    $index = strpos(strrev($haystack), strrev($needle));
+    if($index === false)
+        return false;
+    
+    $index = strlen($haystack) - strlen($needle) - $index;
+    return $index;
   }
+}
 
 
 ?>
index 5d137cc7b35af2cd38ef7d4abcfb20bf5386f0f9..55ac8f5a370350780152135e25f474e86436ea5b 100644 (file)
@@ -5,7 +5,7 @@
  | program/include/rcube_smtp.inc                                        |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_smtp.inc 587 2007-05-28 19:21:36Z thomasb $
+ $Id: rcube_smtp.inc 805 2007-09-20 13:36:57Z robin $
 
 */
 
+/**
+ * SMTP delivery functions
+ *
+ * @package Mail
+ */
 
 // include required PEAR classes
 require_once('Net/SMTP.php');
@@ -47,7 +52,6 @@ $SMTP_CONN = null;
  * @param string The full text of the message body, including any Mime parts, etc.
  *
  * @return bool  Returns TRUE on success, or FALSE on error
- * @access public
  */
 function smtp_mail($from, $recipients, &$headers, &$body, &$response)
   {
@@ -72,7 +76,7 @@ function smtp_mail($from, $recipients, &$headers, &$body, &$response)
   // create Net_SMTP object and connect to server
   if (!is_object($smtp_conn))
     {
-    $helo_host = !empty($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost';
+    $helo_host = empty($CONFIG['smtp_helo_host']) ? (empty($_SERVER['SERVER_NAME']) ? 'localhost' : $_SERVER['SERVER_NAME']) : $CONFIG['smtp_helo_host'];
     $SMTP_CONN = new Net_SMTP($smtp_host, $smtp_port, $helo_host);
 
     // set debugging
@@ -342,6 +346,9 @@ function smtp_parse_rfc822($recipients)
   }
 
 
+/**
+ * @access private
+ */
 function smtp_explode_quoted_str($delimiter, $string)
   {
   $quotes=explode("\"", $string);
index 44e4b8169ac37c41ca81802c634b191f88768832..a8f18cb137a276baf99093b5bf55c2bde415e481 100644 (file)
@@ -5,7 +5,7 @@
  | program/include/rcube_sqlite.inc                                      |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_sqlite.inc 88 2005-12-03 16:54:12Z roundcube $
+ $Id: rcube_sqlite.inc 850 2007-10-03 00:13:32Z ihug $
 
 */
 
+/**
+ * Callback functions for sqlite database interface
+ *
+ * @package Database
+ */
+
 
 function rcube_sqlite_from_unixtime($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;
+  $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;
   }
 
 
 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;
+  $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);
   }
-       
-?>
\ No newline at end of file
+  
+?>
index 81752d7f78ea8818828baa8821ec4521c583ef0d..e76da0cf09de6161da60ba31132eb1bc3e3a9efd 100644 (file)
@@ -5,7 +5,7 @@
  | program/include/session.inc                                           |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev, - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: session.inc 521 2007-03-27 09:34:30Z thomasb $
+ $Id: session.inc 850 2007-10-03 00:13:32Z ihug $
 
 */
 
index 57d473aef914b5fad97e1047ad9a311f1cee7080..fba54e5acc13e79425bdc728c81950c2a33feb85 100644 (file)
@@ -13,7 +13,7 @@
  | Requires: common.js, list.js                                          |
  +-----------------------------------------------------------------------+
 
-  $Id: app.js 615 2007-06-13 05:57:44Z thomasb $
+  $Id: app.js 888 2007-10-19 14:04:43Z robin $
 */
 
 
@@ -35,7 +35,7 @@ function rcube_webmail()
  
   // webmail client settings
   this.dblclick_time = 500;
-  this.message_time = 5000;
+  this.message_time = 3000;
   
   this.identifier_expr = new RegExp('[^0-9a-z\-_]', 'gi');
   
@@ -164,6 +164,9 @@ function rcube_webmail()
             this.enable_command('firstmessage', 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)
@@ -200,8 +203,11 @@ function rcube_webmail()
 
         this.set_page_buttons();
 
-        // focus this window
-        window.focus();
+        // focus main window
+        if (this.env.framed && window.parent)
+          window.parent.focus();
+        else
+          window.focus();
 
         // init message compose form
         if (this.env.action=='compose')
@@ -283,6 +289,9 @@ function rcube_webmail()
             this.identity_list.highlight_row(this.env.iid);
           }
 
+        if (this.gui_objects.subscriptionlist)
+          this.init_subscription_list();
+
         break;
 
       case 'login':
@@ -463,7 +472,7 @@ function rcube_webmail()
         break;
 
       case 'logout':
-        this.goto_url('logout');
+        this.goto_url('logout', true);
         break;      
 
       // commands to switch task
@@ -482,6 +491,9 @@ function rcube_webmail()
             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')
           {
@@ -694,7 +706,7 @@ function rcube_webmail()
             }
           }
 
-        this.goto_url('get', qstring+'&_download=1');
+        this.goto_url('get', qstring+'&_download=1', false);
         break;
         
       case 'select-all':
@@ -798,6 +810,7 @@ function rcube_webmail()
         this.set_busy(true, 'savingmessage');
         var form = this.gui_objects.messageform;
         form.target = "savetarget";
+        form._draft.value = '1';
         form.submit();
         break;
 
@@ -928,8 +941,7 @@ function rcube_webmail()
         break;
 
       case 'delete-folder':
-        if (confirm(this.get_label('deletefolderconfirm')))
-          this.delete_folder(props);
+        this.delete_folder(props);
         break;
 
       }
@@ -1063,7 +1075,9 @@ function rcube_webmail()
       this.unfocus_folder(id);
       this.command('moveto', id);
       }
-  
+
+    // Hide message command buttons until a message is selected 
+    this.enable_command('reply', 'reply-all', 'forward', 'delete', 'print', false); 
     return false;
     };
 
@@ -1088,15 +1102,18 @@ function rcube_webmail()
       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', selected);
-      this.enable_command('delete', 'moveto', list.selection.length>0 ? true : false);
+      this.enable_command('delete', 'moveto', (list.selection.length > 0 ? true : false));
       }
     else
       {
       this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', selected);
-      this.enable_command('delete', 'moveto', list.selection.length>0 ? true : false);
+      this.enable_command('delete', 'moveto', (list.selection.length > 0 ? true : false));
       }
 
     // start timer for message preview (wait for double click)
@@ -1145,6 +1162,8 @@ function rcube_webmail()
       return (id != this.env.mailbox);
     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);
   };
 
 
@@ -1423,10 +1442,8 @@ function rcube_webmail()
         {
         id = selection[n];
         a_uids[a_uids.length] = id;
-        this.message_list.remove_row(id);
+        this.message_list.remove_row(id, (n == selection.length-1));
         }
-
-      this.message_list.select_next();
       }
       
     // also send search request to get the right messages 
@@ -1680,13 +1697,10 @@ function rcube_webmail()
       }
 
     // check for empty body
-    if (input_message.value=='')
+    if ((input_message.value == '' && (!window.tinyMCE || tinyMCE.getContent() == '')) && !confirm(this.get_label('nobodywarning')))
       {
-      if (!confirm(this.get_label('nobodywarning')))
-        {
-        input_message.focus();
-        return false;
-        }
+      input_message.focus();
+      return false;
       }
 
     return true;
@@ -1711,6 +1725,9 @@ function rcube_webmail()
     {
     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;
     };
 
 
@@ -1842,8 +1859,11 @@ function rcube_webmail()
       }
       
     // clear upload form
-    if (!a && this.gui_objects.attachmentform && this.gui_objects.attachmentform!=this.gui_objects.messageform)
-      this.gui_objects.attachmentform.reset();
+       try {
+      if (!a && this.gui_objects.attachmentform != this.gui_objects.messageform)
+       this.gui_objects.attachmentform.reset();
+       }
+       catch(e){}  // ignore errors
     
     return true;  
     };
@@ -2250,6 +2270,7 @@ function rcube_webmail()
       {
       page = 1;
       this.env.current_page = page;
+      this.reset_qsearch();
       }
 
     this.select_folder(src, this.env.source);
@@ -2286,7 +2307,7 @@ function rcube_webmail()
     this.enable_command('delete', 'compose', false);
 
     // send request to server
-    var url = (src ? '&_source='+urlencode(src) : '') + (page ? '&_page='+page : '');
+    var url = (src ? '_source='+urlencode(src) : '') + (page ? (src?'&':'') + '_page='+page : '');
     this.env.source = src;
     
     // also send search request to get the right messages 
@@ -2349,7 +2370,7 @@ function rcube_webmail()
         {
         id = selection[n];
         a_cids[a_cids.length] = id;
-        this.contact_list.remove_row(id);
+        this.contact_list.remove_row(id, (n == selection.length-1));
         }
 
       // hide content frame if we delete the currently displayed contact
@@ -2384,6 +2405,26 @@ function rcube_webmail()
   /*********        user settings methods          *********/
   /*********************************************************/
 
+  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 anchors = row.obj.getElementsByTagName('A');
+      if (anchors[0])
+        anchors[0].onclick = function() { p.rename_folder(row.id); };
+      if (anchors[1])
+        anchors[1].onclick = function() { p.delete_folder(row.id); };
+      row.obj.onmouseover = function() { p.focus_subscription(row.id); };
+      row.obj.onmouseout = function() { p.unfocus_subscription(row.id); };
+      }
+    this.subscription_list.init();
+    }
+
   this.identity_select = function(list)
     {
     var id;
@@ -2431,6 +2472,72 @@ function rcube_webmail()
     };
 
 
+  this.focus_subscription = function(id)
+    {
+    var row, folder;
+    var reg = RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$');
+
+    if (this.drag_active && (row = document.getElementById(id)))
+      if (this.env.subscriptionrows[id] &&
+          (folder = this.env.subscriptionrows[id][0]))
+        {
+        if (this.check_droptarget(folder) &&
+            (folder != this.env.folder.replace(reg, '')) &&
+            (!folder.match(new RegExp('^'+RegExp.escape(this.env.folder+this.env.delimiter)))))
+          {
+          this.set_env('dstfolder', folder);
+          this.set_classname(row, 'droptarget', true);
+          }
+        }
+      else if (this.env.folder.match(new RegExp(RegExp.escape(this.env.delimiter))))
+        {
+        this.set_env('dstfolder', this.env.delimiter);
+        this.set_classname(this.subscription_list.frame, 'droptarget', true);
+        }
+    }
+
+
+  this.unfocus_subscription = function(id)
+    {
+      var row;
+      this.set_env('dstfolder', null);
+      if (this.env.subscriptionrows[id] &&
+          (row = document.getElementById(id)))
+        this.set_classname(row, 'droptarget', false);
+      else
+        this.set_classname(this.subscription_list.frame, 'droptarget', false);
+    }
+
+
+  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]) &&
+        (find_in_array(this.env.defaultfolders, folder)!=0))
+      this.set_env('folder', folder);
+    else
+      this.set_env('folder', null);
+    };
+
+
+  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.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.folder)+'&_folder_newname='+urlencode(newname));
+      }
+    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)
     {
@@ -2440,6 +2547,8 @@ function rcube_webmail()
     var form;
     if ((form = this.gui_objects.editform) && form.elements['_folder_name'])
       name = form.elements['_folder_name'].value;
+    if (this.env.folder)
+      name = this.env.folder+this.env.delimiter+name;
 
     if (name)
       this.http_post('create-folder', '_name='+urlencode(name), true);
@@ -2448,33 +2557,12 @@ function rcube_webmail()
     };
 
 
-  // entry point for folder renaming
-  this.rename_folder = function(props)
-    {
-    var form, oldname, newname;
-    
-    // rename a specific mailbox
-    if (props)
-      this.edit_foldername(props);
-
-    // use a dropdown and input field (old behavior)
-    else if ((form = this.gui_objects.editform) && form.elements['_folder_oldname'] && form.elements['_folder_newname'])
-      {
-      oldname = form.elements['_folder_oldname'].value;
-      newname = form.elements['_folder_newname'].value;
-      }
-
-    if (oldname && newname)
-      this.http_post('rename-folder', '_folder_oldname='+urlencode(oldname)+'&_folder_newname='+urlencode(newname));
-    };
-
-
-  // start editing the mailbox name.
+  // start renaming the mailbox name.
   // this will replace the name string with an input field
-  this.edit_foldername = function(folder)
+  this.rename_folder = function(id)
     {
     var temp, row, form;
-    var id = this.get_folder_row_id(folder);
+    var folder = this.env.subscriptionrows[id][0];
 
     // reset current renaming
   if (temp = this.edit_folder)
@@ -2486,9 +2574,12 @@ function rcube_webmail()
 
     if (id && (row = document.getElementById(id)))
       {
+      var reg = new RegExp('.*['+RegExp.escape(this.env.delimiter)+']');
       this.name_input = document.createElement('INPUT');
-      this.name_input.value = this.env.subscriptionrows[id][1];
+      this.name_input.value = folder.replace(reg, '');
       this.name_input.style.width = '100%';
+      reg = new RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$');
+      this.name_input.setAttribute('parent', folder.replace(reg, ''));
       this.name_input.onkeypress = function(e){ rcmail.name_input_keypress(e); };
       
       row.cells[0].replaceChild(this.name_input, row.cells[0].firstChild);
@@ -2506,7 +2597,10 @@ function rcube_webmail()
     {
     var cell = this.name_input ? this.name_input.parentNode : null;
     if (cell && this.edit_folder && this.env.subscriptionrows[this.edit_folder])
-      cell.innerHTML = this.env.subscriptionrows[this.edit_folder][1];
+      {
+      var reg = new RegExp('[^'+RegExp.escape(this.env.delimiter)+']*['+RegExp.escape(this.env.delimiter)+']', 'g');
+      cell.innerHTML = this.env.subscriptionrows[this.edit_folder][1].replace(reg, '&nbsp;&nbsp;&nbsp;&nbsp;');
+      }
       
     this.edit_folder = null;
     };
@@ -2522,7 +2616,11 @@ function rcube_webmail()
       {
       var newname = this.name_input ? this.name_input.value : null;
       if (this.edit_folder && newname)
-        this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.subscriptionrows[this.edit_folder][0])+'&_folder_newname='+urlencode(newname));
+        {
+        if (this.name_input.getAttribute('parent') && this.name_input.getAttribute('parent')!='')
+          newname = this.name_input.getAttribute('parent')+this.env.delimiter+newname;
+          this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.subscriptionrows[this.edit_folder][0])+'&_folder_newname='+urlencode(newname));
+        }
       }
     // escape
     else if (key==27)
@@ -2531,13 +2629,18 @@ function rcube_webmail()
 
 
   // delete a specific mailbox with all its messages
-  this.delete_folder = function(folder)
+  this.delete_folder = function(id)
     {
-  if (this.edit_folder)
-    this.reset_folder_rename();
-    
-    if (folder)
+    var folder = this.env.subscriptionrows[id][0];
+
+    if (this.edit_folder)
+      this.reset_folder_rename();
+
+    if (folder && confirm(this.get_label('deletefolderconfirm')))
+      {
       this.http_post('delete-folder', '_mboxes='+urlencode(folder));
+      this.set_env('folder', null);
+      }
     };
 
 
@@ -2554,7 +2657,8 @@ function rcube_webmail()
 
     var refrow, form;
     var tbody = this.gui_objects.subscriptionlist.tBodies[0];
-    var id = replace && replace.id ? replace.id : tbody.childNodes.length+1;
+    var id = replace && replace.id ? replace.id : 'rcmrow'+(tbody.childNodes.length+1);
+    var selection = this.subscription_list.get_single_selection();
 
     if (!id || !(refrow = document.getElementById(refid)))
       {
@@ -2565,7 +2669,7 @@ function rcube_webmail()
       {
       // clone a table row if there are existing rows
       var row = this.clone_table_row(refrow);
-      row.id = 'rcmrow'+id;
+      row.id = id;
       if (replace)
         tbody.replaceChild(row, replace);
       else
@@ -2583,11 +2687,6 @@ function rcube_webmail()
       row.cells[1].firstChild.checked = true;
       }
        
-    if (row.cells[2] && row.cells[2].firstChild.tagName=='A')
-      row.cells[2].firstChild.onclick = new Function(this.ref+".command('rename-folder','"+name.replace('\'','\\\'')+"')");
-    if (row.cells[3] && row.cells[3].firstChild.tagName=='A')
-      row.cells[3].firstChild.onclick = new Function(this.ref+".command('delete-folder','"+name.replace('\'','\\\'')+"')");
-
     // add new folder to rename-folder list and clear input field
     if (!replace && (form = this.gui_objects.editform))
       {
@@ -2598,6 +2697,12 @@ function rcube_webmail()
       }
 
     this.sort_subscription_list();
+    this.init_subscription_list();
+    if (selection && document.getElementById('rcmrow'+selection))
+      this.subscription_list.select_row(selection);
+
+    if (document.getElementById(id).scrollIntoView)
+      document.getElementById(id).scrollIntoView();
     };
 
 
@@ -2609,7 +2714,6 @@ function rcube_webmail()
     
     // replace an existing table row (if found)
     this.add_folder_row(newfolder, display_name, row);
-    this.env.subscriptionrows[id] = null;
     
     // rename folder in rename-folder dropdown
     var form, elm;
@@ -2752,19 +2856,19 @@ function rcube_webmail()
     var index = new Array();
     var tbody = this.gui_objects.subscriptionlist.tBodies[0];
     var swapped = false;
-    for (var i = 0; i<(tbody.childNodes.length-1); i++)
+    for (var i = 0; i<tbody.childNodes.length; i++)
       if (this.env.subscriptionrows[tbody.childNodes[i].id]!=null)
         index.push(i);
     for (i = 0; i<(index.length-1); i++)
       {
-      if (this.env.subscriptionrows[tbody.childNodes[index[i]].id][0]>
-          this.env.subscriptionrows[tbody.childNodes[index[i+1]].id][0])
+      var one = tbody.childNodes[index[i]];
+      var two = tbody.childNodes[index[i+1]];
+      if (this.env.subscriptionrows[one.id][0].toLowerCase()>
+          this.env.subscriptionrows[two.id][0].toLowerCase())
         {
-        var swap = tbody.replaceChild(tbody.childNodes[index[i]], tbody.childNodes[index[i+1]]);
-        if (typeof(tbody.childNodes[index[i]]) != 'undefined')
-          tbody.insertBefore(swap, tbody.childNodes[index[i]])
-        else
-          tbody.appendChild(swap);
+        var swap = one.cloneNode(true);
+        tbody.replaceChild(swap, two);
+        tbody.replaceChild(two, one);
         swapped = true;
         }
       }
@@ -2803,8 +2907,12 @@ function rcube_webmail()
       obj = document.getElementById(button.id);
 
       // get default/passive setting of the button
-      if (obj && button.type=='image' && !button.status)
+      if (obj && button.type=='image' && !button.status) {
         button.pas = obj._original_src ? obj._original_src : obj.src;
+        // respect PNG fix on IE browsers
+        if (obj.runtimeStyle && obj.runtimeStyle.filter && obj.runtimeStyle.filter.match(/src=['"]([^'"]+)['"]/))
+          button.pas = RegExp.$1;
+      }
       else if (obj && !button.status)
         button.pas = String(obj.className);
 
@@ -2829,6 +2937,28 @@ function rcube_webmail()
       }
     };
 
+  // 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 == '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)
@@ -2905,27 +3035,27 @@ function rcube_webmail()
     };
 
 
-  // display a specific alttext
-  this.alttext = function(text)
-    {
-    
-    };
+  // write to the document/window title
+  this.set_pagetitle = function(title)
+  {
+    if (title && document.title)
+      document.title = title;
+  }
 
 
   // display a system message
   this.display_message = function(msg, type, hold)
     {
-    // pass command to parent window
-    if (this.env.framed && parent.rcmail )
-      return parent.rcmail.display_message(msg, type, hold);
-
-    this.set_busy(false);
     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;
 
@@ -2936,12 +3066,12 @@ function rcube_webmail()
     if (type)
       cont = '<div class="'+type+'">'+cont+'</div>';
 
-    this.gui_objects.message._rcube = this;
+    var _rcube = this;
     this.gui_objects.message.innerHTML = cont;
     this.gui_objects.message.style.display = 'block';
+    
     if (type!='loading')
-      this.gui_objects.message.onmousedown = function(){ this._rcube.hide_message(); return true; };
+      this.gui_objects.message.onmousedown = function(){ _rcube.hide_message(); return true; };
     
     if (!hold)
       this.message_timer = setTimeout(function(){ ref.hide_message(); }, this.message_time);
@@ -3099,9 +3229,6 @@ function rcube_webmail()
     if (!this.gui_objects.mailboxlist)
       return false;
 
-    if (mbox==this.env.mailbox)
-      set_title = true;
-
     var reg, text_obj;
     var item = this.get_folder_li(mbox);
     mbox = String(mbox).toLowerCase().replace(this.identifier_expr, '');
@@ -3128,13 +3255,16 @@ function rcube_webmail()
     if (set_title && document.title)
       {
       var doc_title = String(document.title);
+      var new_title = "";
 
       if (count && doc_title.match(reg))
-        document.title = doc_title.replace(reg, '('+count+') ');
+        new_title = doc_title.replace(reg, '('+count+') ');
       else if (count)
-        document.title = '('+count+') '+doc_title;
+        new_title = '('+count+') '+doc_title;
       else
-        document.title = doc_title.replace(reg, '');
+        new_title = doc_title.replace(reg, '');
+        
+      this.set_pagetitle(new_title);
       }
     };
 
@@ -3188,9 +3318,11 @@ function rcube_webmail()
   /*********        remote request methods        *********/
   /********************************************************/
 
-  this.redirect = function(url)
+  this.redirect = function(url, lock)
     {
-    this.set_busy(true);
+    if (lock || lock === null)
+      this.set_busy(true);
+
     if (this.env.framed && window.parent)
       parent.location.href = url;
     else  
@@ -3199,11 +3331,8 @@ function rcube_webmail()
 
   this.goto_url = function(action, query, lock)
     {
-    if (lock)
-    this.set_busy(true);
-
     var querystring = query ? '&'+query : '';
-    this.redirect(this.env.comm_path+'&_action='+action+querystring);
+    this.redirect(this.env.comm_path+'&_action='+action+querystring, lock);
     };
 
 
@@ -3289,7 +3418,8 @@ function rcube_webmail()
       ctype = ctype_array[0];
     }
 
-    this.set_busy(false);
+    if (request_obj.__lock)
+        this.set_busy(false);
 
     console.log(request_obj.get_text());
 
@@ -3311,6 +3441,7 @@ function rcube_webmail()
       case 'list':
         if (this.env.messagecount)
           this.enable_command('purge', (this.env.mailbox==this.env.trash_mailbox || this.env.mailbox==this.env.junk_mailbox));
+        this.msglist_select(this.message_list);
 
       case 'expunge':
         this.enable_command('select-all', 'select-none', 'expunge', this.env.messagecount ? true : false);
@@ -3352,8 +3483,7 @@ function rcube_webmail()
       }
 
     this.set_busy(true, 'checkingmail');
-    var d = new Date();
-    this.http_request('check-recent', '_t='+d.getTime());
+    this.http_request('check-recent', '_t='+(new Date().getTime()), true);
     };
 
 
@@ -3494,12 +3624,13 @@ function rcube_http_request()
       return false;
       }
 
-    var ref = this;
+    var _ref = this;
     this.url = url;
     this.busy = true;
 
-    this.xmlhttp.onreadystatechange = function(){ ref.xmlhttp_onreadystatechange(); };
+    this.xmlhttp.onreadystatechange = function(){ _ref.xmlhttp_onreadystatechange(); };
     this.xmlhttp.open('GET', url);
+    this.xmlhttp.setRequestHeader('X-RoundCube-Referer', bw.get_cookie('roundcube_sessid'));
     this.xmlhttp.send(null);
     };
 
@@ -3533,6 +3664,7 @@ function rcube_http_request()
     this.xmlhttp.onreadystatechange = function() { ref.xmlhttp_onreadystatechange(); };
     this.xmlhttp.open('POST', url, true);
     this.xmlhttp.setRequestHeader('Content-Type', contentType);
+    this.xmlhttp.setRequestHeader('X-RoundCube-Referer', bw.get_cookie('roundcube_sessid'));
     this.xmlhttp.send(req_body);
     };
 
index 1e89be2dce5430e08ea449908e878fcdc397e815..f6ddadb8c78e606e484e416f6f8cc7548a6c4110 100644 (file)
@@ -10,7 +10,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
  
- $Id: common.js 543 2007-04-28 18:07:12Z thomasb $
+ $Id: common.js 811 2007-09-25 07:33:37Z robin $
 */
 
 // Constants
@@ -624,3 +624,11 @@ var bw = new roundcube_browser();
 
 if (!window.console)
   console = new rcube_console();
+
+
+// Add escape() method to RegExp object
+// http://dev.rubyonrails.org/changeset/7271
+RegExp.escape = function(str)
+  {
+  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+  }
diff --git a/program/js/editor.js b/program/js/editor.js
new file mode 100644 (file)
index 0000000..df68cdd
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ +-----------------------------------------------------------------------+
+ | RoundCube editor js library                                           |
+ |                                                                       |
+ | This file is part of the RoundCube web development suite              |
+ | Copyright (C) 2006, RoundCube Dev, - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Eric Stadtherr <estadtherr@gmail.com>                         |
+ +-----------------------------------------------------------------------+
+
+ $Id: editor.js 000 2006-05-18 19:12:28Z roundcube $
+*/
+
+// Initialize the message editor
+
+function rcmail_editor_init(skin_path)
+  {
+  tinyMCE.init({ mode : 'specific_textareas',
+                 accessibility_focus : false,
+                 apply_source_formatting : true,
+                 theme : 'advanced',
+                 plugins : 'emotions,media,nonbreaking,table,searchreplace,spellchecker,visualchars',
+                 theme_advanced_buttons1 : 'bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,bullist,numlist,outdent,indent,separator,link,unlink,emotions,forecolor,backcolor,formatselect,fontselect,fontsizeselect',
+                 theme_advanced_buttons2 : 'undo,redo,image,media,hr,charmap,code,nonbreaking,visualchars,separator,search,replace,spellchecker,separator,tablecontrols',
+                 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',
+                 popups_css : skin_path + '/editor_popup.css',
+                 editor_css : skin_path + '/editor_ui.css'
+               });
+  }
+
+// Set the state of the HTML/Plain toggles based on the _is_html field value
+function rcmail_set_editor_toggle_states()
+  {
+  // set the editor toggle based on the state of the editor
+
+  var htmlFlag = document.getElementsByName('_is_html')[0];
+  var toggles = document.getElementsByName('_editorSelect');
+  for(var t=0; t<toggles.length; t++)
+    {
+       if (toggles[t].value == 'html')
+         {
+         toggles[t].checked = (htmlFlag.value == "1");
+         }
+       else
+         {
+         toggles[t].checked = (htmlFlag.value == "0");
+         }
+       }
+  }
+
+// Toggle between the HTML and Plain Text editors
+
+function rcmail_toggle_editor(toggler)
+  {
+  var selectedEditor = toggler.value;
+
+  // determine the currently displayed editor
+
+  var htmlFlag = document.getElementsByName('_is_html')[0];
+  var currentEditor = htmlFlag.value;
+
+  if (selectedEditor == currentEditor)
+    {
+    return;
+    }
+
+  // do the appropriate conversion
+
+  var composeElement = document.getElementById('compose-body');
+
+  if (selectedEditor == 'html')
+    {
+    var existingPlainText = composeElement.value;
+    var htmlText = "<pre>" + existingPlainText + "</pre>";
+    composeElement.value = htmlText;
+    tinyMCE.execCommand('mceAddControl', true, '_message');
+    htmlFlag.value = "1";
+    }
+  else
+    {
+    rcmail.set_busy(true, 'converting');
+    var thisMCE = tinyMCE.getInstanceById('_message');
+    var existingHtml = tinyMCE.getContent();
+    rcmail_html2plain(existingHtml);
+    tinyMCE.execCommand('mceRemoveControl', true, '_message');
+    htmlFlag.value = "0";
+    }
+  }
+
+function rcmail_html2plain(htmlText)
+  {
+  var http_request = new rcube_http_request();
+
+  http_request.onerror = function(o) { rcmail_handle_toggle_error(o); };
+  http_request.oncomplete = function(o) { rcmail_set_text_value(o); };
+  var url = rcmail.env.bin_path+'html2text.php';
+  console.log('HTTP request: ' + url);
+  http_request.POST(url, htmlText, 'application/octet-stream');
+  }
+
+function rcmail_set_text_value(httpRequest)
+  {
+  rcmail.set_busy(false);
+  var composeElement = document.getElementById('compose-body');
+  composeElement.value = httpRequest.get_text();
+  }
+
+function rcmail_handle_toggle_error(httpRequest)
+  {
+  alert('html2text request returned with error ' + httpRequest.xmlhttp.status);
+  }
old mode 100755 (executable)
new mode 100644 (file)
index aa72931..8b9d1cc
@@ -1258,7 +1258,7 @@ GoogieSpell.prototype.setLanguages = function(lang_dict) {
 
 GoogieSpell.prototype.decorateTextarea = function(id, /*optional*/spell_container_id, force_width) {
   var me = this;
-  
+
   if(typeof(id) == "string")
     this.text_area = AJS.getElement(id);
   else
index 23a9c349ccd9c48d8c0e40665b02d27309690e15..de4d7c84a9234a018770f4adbfa315c6a6b7747d 100644 (file)
@@ -37,10 +37,12 @@ function rcube_list_widget(list, p)
   this.multiselect = 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;
@@ -131,11 +133,14 @@ clear: function(sel)
 /**
  * 'remove' message row from list (just hide it)
  */
-remove_row: function(uid)
+remove_row: function(uid, sel_next)
 {
   if (this.rows[uid].obj)
     this.rows[uid].obj.style.display = 'none';
 
+  if (sel_next)
+    this.select_next();
+
   this.rows[uid] = null;
 },
 
@@ -218,7 +223,7 @@ drag_row: function(e, id)
   if (this.draggable && this.selection.length)
   {
     this.drag_start = true;
-       this.drag_mouse_start = rcube_event.get_mouse_pos(e);
+    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'});
   }
@@ -301,6 +306,9 @@ 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)
   {
@@ -312,13 +320,12 @@ select_row: function(id, mod_key, with_mouse)
     switch (mod_key)
     {
       case SHIFT_KEY:
-        this.shift_select(id, false); 
+        this.shift_select(id, false);
         break;
 
       case CONTROL_KEY:
-        this.shift_start = id;
         if (!with_mouse)
-          this.highlight_row(id, true); 
+          this.highlight_row(id, true);
         break; 
 
       case CONTROL_SHIFT_KEY:
@@ -326,7 +333,7 @@ select_row: function(id, mod_key, with_mouse)
         break;
 
       default:
-        this.highlight_row(id, false); 
+        this.highlight_row(id, false);
         break;
     }
   }
@@ -338,8 +345,19 @@ select_row: function(id, mod_key, with_mouse)
   if (this.last_selected != 0 && this.rows[this.last_selected])
     this.set_classname(this.rows[this.last_selected].obj, 'focused', false);
 
+  // unselect if toggleselect is active and the same row was clicked again
+  if (this.toggleselect && this.last_selected == id)
+  {
+    this.clear_selection();
+    id = null;
+  }
+  else
+    this.set_classname(this.rows[id].obj, 'focused', true);
+
+  if (!this.selection.length)
+    this.shift_start = null;
+
   this.last_selected = id;
-  this.set_classname(this.rows[id].obj, 'focused', true);        
 },
 
 
@@ -416,7 +434,8 @@ select_all: function(filter)
   if (!this.rows || !this.rows.length)
     return false;
 
-  // reset selection first
+  // reset but remember selection first
+  var select_before = this.selection.join(',');
   this.clear_selection();
 
   for (var n in this.rows)
@@ -428,7 +447,11 @@ select_all: function(filter)
     }
   }
 
-  return true;  
+  // trigger event if selection changed
+  if (this.selection.join(',') != select_before)
+    this.trigger_event('select');
+
+  return true;
 },
 
 
@@ -437,14 +460,18 @@ select_all: function(filter)
  */
 clear_selection: function()
 {
-  for(var n=0; n<this.selection.length; n++)
+  var num_select = this.selection.length;
+  for (var n=0; n<this.selection.length; n++)
     if (this.rows[this.selection[n]])
     {
       this.set_classname(this.rows[this.selection[n]].obj, 'selected', false);
       this.set_classname(this.rows[this.selection[n]].obj, 'unfocused', false);
     }
 
-  this.selection = new Array();    
+  this.selection = new Array();
+  
+  if (num_select)
+    this.trigger_event('select');
 },
 
 
diff --git a/program/js/tiny_mce/blank.htm b/program/js/tiny_mce/blank.htm
new file mode 100644 (file)
index 0000000..5a4a5a5
--- /dev/null
@@ -0,0 +1,9 @@
+<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
+</head>\r
+<body class="mceContentBody">\r
+\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/langs/en.js b/program/js/tiny_mce/langs/en.js
new file mode 100644 (file)
index 0000000..c093eaf
--- /dev/null
@@ -0,0 +1,41 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\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
+focus_alert : 'A editor instance must be focused before using this command.',\r
+edit_confirm : 'Do you want to use the WYSIWYG mode for this textarea?',\r
+insert_link_title : 'Insert/edit link',\r
+insert : 'Insert',\r
+update : 'Update',\r
+cancel : 'Cancel',\r
+insert_link_url : 'Link URL',\r
+insert_link_target : 'Target',\r
+insert_link_target_same : 'Open link in the same window',\r
+insert_link_target_blank : 'Open link in a new window',\r
+insert_image_title : 'Insert/edit image',\r
+insert_image_src : 'Image URL',\r
+insert_image_alt : 'Image description',\r
+help_desc : 'Help',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\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
+});\r
diff --git a/program/js/tiny_mce/langs/readme.txt b/program/js/tiny_mce/langs/readme.txt
new file mode 100644 (file)
index 0000000..9c3a9d9
--- /dev/null
@@ -0,0 +1,9 @@
+Beginning with version 2.0.5 the language packs are no\r
+longer included with the core distribution.\r
+Language packs can be downloaded from the TinyMCE website:\r
+http://tinymce.moxiecode.com/download.php\r
+\r
+The language pack codes are based on ISO-639-1:\r
+http://www.loc.gov/standards/iso639-2/englangn.html\r
+\r
+Plrease try using entities if possible. Like &aring; etc for non a-z characters.\r
diff --git a/program/js/tiny_mce/license.txt b/program/js/tiny_mce/license.txt
new file mode 100644 (file)
index 0000000..60d6d4c
--- /dev/null
@@ -0,0 +1,504 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE\r
+                      Version 2.1, February 1999\r
+\r
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.\r
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
+ Everyone is permitted to copy and distribute verbatim copies\r
+ of this license document, but changing it is not allowed.\r
+\r
+[This is the first released version of the Lesser GPL.  It also counts\r
+ as the successor of the GNU Library Public License, version 2, hence\r
+ the version number 2.1.]\r
+\r
+                           Preamble\r
+\r
+  The licenses for most software are designed to take away your\r
+freedom to share and change it.  By contrast, the GNU General Public\r
+Licenses are intended to guarantee your freedom to share and change\r
+free software--to make sure the software is free for all its users.\r
+\r
+  This license, the Lesser General Public License, applies to some\r
+specially designated software packages--typically libraries--of the\r
+Free Software Foundation and other authors who decide to use it.  You\r
+can use it too, but we suggest you first think carefully about whether\r
+this license or the ordinary General Public License is the better\r
+strategy to use in any particular case, based on the explanations below.\r
+\r
+  When we speak of free software, we are referring to freedom of use,\r
+not price.  Our General Public Licenses are designed to make sure that\r
+you have the freedom to distribute copies of free software (and charge\r
+for this service if you wish); that you receive source code or can get\r
+it if you want it; that you can change the software and use pieces of\r
+it in new free programs; and that you are informed that you can do\r
+these things.\r
+\r
+  To protect your rights, we need to make restrictions that forbid\r
+distributors to deny you these rights or to ask you to surrender these\r
+rights.  These restrictions translate to certain responsibilities for\r
+you if you distribute copies of the library or if you modify it.\r
+\r
+  For example, if you distribute copies of the library, whether gratis\r
+or for a fee, you must give the recipients all the rights that we gave\r
+you.  You must make sure that they, too, receive or can get the source\r
+code.  If you link other code with the library, you must provide\r
+complete object files to the recipients, so that they can relink them\r
+with the library after making changes to the library and recompiling\r
+it.  And you must show them these terms so they know their rights.\r
+\r
+  We protect your rights with a two-step method: (1) we copyright the\r
+library, and (2) we offer you this license, which gives you legal\r
+permission to copy, distribute and/or modify the library.\r
+\r
+  To protect each distributor, we want to make it very clear that\r
+there is no warranty for the free library.  Also, if the library is\r
+modified by someone else and passed on, the recipients should know\r
+that what they have is not the original version, so that the original\r
+author's reputation will not be affected by problems that might be\r
+introduced by others.\r
+\r
+  Finally, software patents pose a constant threat to the existence of\r
+any free program.  We wish to make sure that a company cannot\r
+effectively restrict the users of a free program by obtaining a\r
+restrictive license from a patent holder.  Therefore, we insist that\r
+any patent license obtained for a version of the library must be\r
+consistent with the full freedom of use specified in this license.\r
+\r
+  Most GNU software, including some libraries, is covered by the\r
+ordinary GNU General Public License.  This license, the GNU Lesser\r
+General Public License, applies to certain designated libraries, and\r
+is quite different from the ordinary General Public License.  We use\r
+this license for certain libraries in order to permit linking those\r
+libraries into non-free programs.\r
+\r
+  When a program is linked with a library, whether statically or using\r
+a shared library, the combination of the two is legally speaking a\r
+combined work, a derivative of the original library.  The ordinary\r
+General Public License therefore permits such linking only if the\r
+entire combination fits its criteria of freedom.  The Lesser General\r
+Public License permits more lax criteria for linking other code with\r
+the library.\r
+\r
+  We call this license the "Lesser" General Public License because it\r
+does Less to protect the user's freedom than the ordinary General\r
+Public License.  It also provides other free software developers Less\r
+of an advantage over competing non-free programs.  These disadvantages\r
+are the reason we use the ordinary General Public License for many\r
+libraries.  However, the Lesser license provides advantages in certain\r
+special circumstances.\r
+\r
+  For example, on rare occasions, there may be a special need to\r
+encourage the widest possible use of a certain library, so that it becomes\r
+a de-facto standard.  To achieve this, non-free programs must be\r
+allowed to use the library.  A more frequent case is that a free\r
+library does the same job as widely used non-free libraries.  In this\r
+case, there is little to gain by limiting the free library to free\r
+software only, so we use the Lesser General Public License.\r
+\r
+  In other cases, permission to use a particular library in non-free\r
+programs enables a greater number of people to use a large body of\r
+free software.  For example, permission to use the GNU C Library in\r
+non-free programs enables many more people to use the whole GNU\r
+operating system, as well as its variant, the GNU/Linux operating\r
+system.\r
+\r
+  Although the Lesser General Public License is Less protective of the\r
+users' freedom, it does ensure that the user of a program that is\r
+linked with the Library has the freedom and the wherewithal to run\r
+that program using a modified version of the Library.\r
+\r
+  The precise terms and conditions for copying, distribution and\r
+modification follow.  Pay close attention to the difference between a\r
+"work based on the library" and a "work that uses the library".  The\r
+former contains code derived from the library, whereas the latter must\r
+be combined with the library in order to run.\r
+\r
+                 GNU LESSER GENERAL PUBLIC LICENSE\r
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r
+\r
+  0. This License Agreement applies to any software library or other\r
+program which contains a notice placed by the copyright holder or\r
+other authorized party saying it may be distributed under the terms of\r
+this Lesser General Public License (also called "this License").\r
+Each licensee is addressed as "you".\r
+\r
+  A "library" means a collection of software functions and/or data\r
+prepared so as to be conveniently linked with application programs\r
+(which use some of those functions and data) to form executables.\r
+\r
+  The "Library", below, refers to any such software library or work\r
+which has been distributed under these terms.  A "work based on the\r
+Library" means either the Library or any derivative work under\r
+copyright law: that is to say, a work containing the Library or a\r
+portion of it, either verbatim or with modifications and/or translated\r
+straightforwardly into another language.  (Hereinafter, translation is\r
+included without limitation in the term "modification".)\r
+\r
+  "Source code" for a work means the preferred form of the work for\r
+making modifications to it.  For a library, complete source code means\r
+all the source code for all modules it contains, plus any associated\r
+interface definition files, plus the scripts used to control compilation\r
+and installation of the library.\r
+\r
+  Activities other than copying, distribution and modification are not\r
+covered by this License; they are outside its scope.  The act of\r
+running a program using the Library is not restricted, and output from\r
+such a program is covered only if its contents constitute a work based\r
+on the Library (independent of the use of the Library in a tool for\r
+writing it).  Whether that is true depends on what the Library does\r
+and what the program that uses the Library does.\r
+  \r
+  1. You may copy and distribute verbatim copies of the Library's\r
+complete source code as you receive it, in any medium, provided that\r
+you conspicuously and appropriately publish on each copy an\r
+appropriate copyright notice and disclaimer of warranty; keep intact\r
+all the notices that refer to this License and to the absence of any\r
+warranty; and distribute a copy of this License along with the\r
+Library.\r
+\r
+  You may charge a fee for the physical act of transferring a copy,\r
+and you may at your option offer warranty protection in exchange for a\r
+fee.\r
+\r
+  2. You may modify your copy or copies of the Library or any portion\r
+of it, thus forming a work based on the Library, and copy and\r
+distribute such modifications or work under the terms of Section 1\r
+above, provided that you also meet all of these conditions:\r
+\r
+    a) The modified work must itself be a software library.\r
+\r
+    b) You must cause the files modified to carry prominent notices\r
+    stating that you changed the files and the date of any change.\r
+\r
+    c) You must cause the whole of the work to be licensed at no\r
+    charge to all third parties under the terms of this License.\r
+\r
+    d) If a facility in the modified Library refers to a function or a\r
+    table of data to be supplied by an application program that uses\r
+    the facility, other than as an argument passed when the facility\r
+    is invoked, then you must make a good faith effort to ensure that,\r
+    in the event an application does not supply such function or\r
+    table, the facility still operates, and performs whatever part of\r
+    its purpose remains meaningful.\r
+\r
+    (For example, a function in a library to compute square roots has\r
+    a purpose that is entirely well-defined independent of the\r
+    application.  Therefore, Subsection 2d requires that any\r
+    application-supplied function or table used by this function must\r
+    be optional: if the application does not supply it, the square\r
+    root function must still compute square roots.)\r
+\r
+These requirements apply to the modified work as a whole.  If\r
+identifiable sections of that work are not derived from the Library,\r
+and can be reasonably considered independent and separate works in\r
+themselves, then this License, and its terms, do not apply to those\r
+sections when you distribute them as separate works.  But when you\r
+distribute the same sections as part of a whole which is a work based\r
+on the Library, the distribution of the whole must be on the terms of\r
+this License, whose permissions for other licensees extend to the\r
+entire whole, and thus to each and every part regardless of who wrote\r
+it.\r
+\r
+Thus, it is not the intent of this section to claim rights or contest\r
+your rights to work written entirely by you; rather, the intent is to\r
+exercise the right to control the distribution of derivative or\r
+collective works based on the Library.\r
+\r
+In addition, mere aggregation of another work not based on the Library\r
+with the Library (or with a work based on the Library) on a volume of\r
+a storage or distribution medium does not bring the other work under\r
+the scope of this License.\r
+\r
+  3. You may opt to apply the terms of the ordinary GNU General Public\r
+License instead of this License to a given copy of the Library.  To do\r
+this, you must alter all the notices that refer to this License, so\r
+that they refer to the ordinary GNU General Public License, version 2,\r
+instead of to this License.  (If a newer version than version 2 of the\r
+ordinary GNU General Public License has appeared, then you can specify\r
+that version instead if you wish.)  Do not make any other change in\r
+these notices.\r
+\r
+  Once this change is made in a given copy, it is irreversible for\r
+that copy, so the ordinary GNU General Public License applies to all\r
+subsequent copies and derivative works made from that copy.\r
+\r
+  This option is useful when you wish to copy part of the code of\r
+the Library into a program that is not a library.\r
+\r
+  4. You may copy and distribute the Library (or a portion or\r
+derivative of it, under Section 2) in object code or executable form\r
+under the terms of Sections 1 and 2 above provided that you accompany\r
+it with the complete corresponding machine-readable source code, which\r
+must be distributed under the terms of Sections 1 and 2 above on a\r
+medium customarily used for software interchange.\r
+\r
+  If distribution of object code is made by offering access to copy\r
+from a designated place, then offering equivalent access to copy the\r
+source code from the same place satisfies the requirement to\r
+distribute the source code, even though third parties are not\r
+compelled to copy the source along with the object code.\r
+\r
+  5. A program that contains no derivative of any portion of the\r
+Library, but is designed to work with the Library by being compiled or\r
+linked with it, is called a "work that uses the Library".  Such a\r
+work, in isolation, is not a derivative work of the Library, and\r
+therefore falls outside the scope of this License.\r
+\r
+  However, linking a "work that uses the Library" with the Library\r
+creates an executable that is a derivative of the Library (because it\r
+contains portions of the Library), rather than a "work that uses the\r
+library".  The executable is therefore covered by this License.\r
+Section 6 states terms for distribution of such executables.\r
+\r
+  When a "work that uses the Library" uses material from a header file\r
+that is part of the Library, the object code for the work may be a\r
+derivative work of the Library even though the source code is not.\r
+Whether this is true is especially significant if the work can be\r
+linked without the Library, or if the work is itself a library.  The\r
+threshold for this to be true is not precisely defined by law.\r
+\r
+  If such an object file uses only numerical parameters, data\r
+structure layouts and accessors, and small macros and small inline\r
+functions (ten lines or less in length), then the use of the object\r
+file is unrestricted, regardless of whether it is legally a derivative\r
+work.  (Executables containing this object code plus portions of the\r
+Library will still fall under Section 6.)\r
+\r
+  Otherwise, if the work is a derivative of the Library, you may\r
+distribute the object code for the work under the terms of Section 6.\r
+Any executables containing that work also fall under Section 6,\r
+whether or not they are linked directly with the Library itself.\r
+\r
+  6. As an exception to the Sections above, you may also combine or\r
+link a "work that uses the Library" with the Library to produce a\r
+work containing portions of the Library, and distribute that work\r
+under terms of your choice, provided that the terms permit\r
+modification of the work for the customer's own use and reverse\r
+engineering for debugging such modifications.\r
+\r
+  You must give prominent notice with each copy of the work that the\r
+Library is used in it and that the Library and its use are covered by\r
+this License.  You must supply a copy of this License.  If the work\r
+during execution displays copyright notices, you must include the\r
+copyright notice for the Library among them, as well as a reference\r
+directing the user to the copy of this License.  Also, you must do one\r
+of these things:\r
+\r
+    a) Accompany the work with the complete corresponding\r
+    machine-readable source code for the Library including whatever\r
+    changes were used in the work (which must be distributed under\r
+    Sections 1 and 2 above); and, if the work is an executable linked\r
+    with the Library, with the complete machine-readable "work that\r
+    uses the Library", as object code and/or source code, so that the\r
+    user can modify the Library and then relink to produce a modified\r
+    executable containing the modified Library.  (It is understood\r
+    that the user who changes the contents of definitions files in the\r
+    Library will not necessarily be able to recompile the application\r
+    to use the modified definitions.)\r
+\r
+    b) Use a suitable shared library mechanism for linking with the\r
+    Library.  A suitable mechanism is one that (1) uses at run time a\r
+    copy of the library already present on the user's computer system,\r
+    rather than copying library functions into the executable, and (2)\r
+    will operate properly with a modified version of the library, if\r
+    the user installs one, as long as the modified version is\r
+    interface-compatible with the version that the work was made with.\r
+\r
+    c) Accompany the work with a written offer, valid for at\r
+    least three years, to give the same user the materials\r
+    specified in Subsection 6a, above, for a charge no more\r
+    than the cost of performing this distribution.\r
+\r
+    d) If distribution of the work is made by offering access to copy\r
+    from a designated place, offer equivalent access to copy the above\r
+    specified materials from the same place.\r
+\r
+    e) Verify that the user has already received a copy of these\r
+    materials or that you have already sent this user a copy.\r
+\r
+  For an executable, the required form of the "work that uses the\r
+Library" must include any data and utility programs needed for\r
+reproducing the executable from it.  However, as a special exception,\r
+the materials to be distributed need not include anything that is\r
+normally distributed (in either source or binary form) with the major\r
+components (compiler, kernel, and so on) of the operating system on\r
+which the executable runs, unless that component itself accompanies\r
+the executable.\r
+\r
+  It may happen that this requirement contradicts the license\r
+restrictions of other proprietary libraries that do not normally\r
+accompany the operating system.  Such a contradiction means you cannot\r
+use both them and the Library together in an executable that you\r
+distribute.\r
+\r
+  7. You may place library facilities that are a work based on the\r
+Library side-by-side in a single library together with other library\r
+facilities not covered by this License, and distribute such a combined\r
+library, provided that the separate distribution of the work based on\r
+the Library and of the other library facilities is otherwise\r
+permitted, and provided that you do these two things:\r
+\r
+    a) Accompany the combined library with a copy of the same work\r
+    based on the Library, uncombined with any other library\r
+    facilities.  This must be distributed under the terms of the\r
+    Sections above.\r
+\r
+    b) Give prominent notice with the combined library of the fact\r
+    that part of it is a work based on the Library, and explaining\r
+    where to find the accompanying uncombined form of the same work.\r
+\r
+  8. You may not copy, modify, sublicense, link with, or distribute\r
+the Library except as expressly provided under this License.  Any\r
+attempt otherwise to copy, modify, sublicense, link with, or\r
+distribute the Library is void, and will automatically terminate your\r
+rights under this License.  However, parties who have received copies,\r
+or rights, from you under this License will not have their licenses\r
+terminated so long as such parties remain in full compliance.\r
+\r
+  9. You are not required to accept this License, since you have not\r
+signed it.  However, nothing else grants you permission to modify or\r
+distribute the Library or its derivative works.  These actions are\r
+prohibited by law if you do not accept this License.  Therefore, by\r
+modifying or distributing the Library (or any work based on the\r
+Library), you indicate your acceptance of this License to do so, and\r
+all its terms and conditions for copying, distributing or modifying\r
+the Library or works based on it.\r
+\r
+  10. Each time you redistribute the Library (or any work based on the\r
+Library), the recipient automatically receives a license from the\r
+original licensor to copy, distribute, link with or modify the Library\r
+subject to these terms and conditions.  You may not impose any further\r
+restrictions on the recipients' exercise of the rights granted herein.\r
+You are not responsible for enforcing compliance by third parties with\r
+this License.\r
+\r
+  11. If, as a consequence of a court judgment or allegation of patent\r
+infringement or for any other reason (not limited to patent issues),\r
+conditions are imposed on you (whether by court order, agreement or\r
+otherwise) that contradict the conditions of this License, they do not\r
+excuse you from the conditions of this License.  If you cannot\r
+distribute so as to satisfy simultaneously your obligations under this\r
+License and any other pertinent obligations, then as a consequence you\r
+may not distribute the Library at all.  For example, if a patent\r
+license would not permit royalty-free redistribution of the Library by\r
+all those who receive copies directly or indirectly through you, then\r
+the only way you could satisfy both it and this License would be to\r
+refrain entirely from distribution of the Library.\r
+\r
+If any portion of this section is held invalid or unenforceable under any\r
+particular circumstance, the balance of the section is intended to apply,\r
+and the section as a whole is intended to apply in other circumstances.\r
+\r
+It is not the purpose of this section to induce you to infringe any\r
+patents or other property right claims or to contest validity of any\r
+such claims; this section has the sole purpose of protecting the\r
+integrity of the free software distribution system which is\r
+implemented by public license practices.  Many people have made\r
+generous contributions to the wide range of software distributed\r
+through that system in reliance on consistent application of that\r
+system; it is up to the author/donor to decide if he or she is willing\r
+to distribute software through any other system and a licensee cannot\r
+impose that choice.\r
+\r
+This section is intended to make thoroughly clear what is believed to\r
+be a consequence of the rest of this License.\r
+\r
+  12. If the distribution and/or use of the Library is restricted in\r
+certain countries either by patents or by copyrighted interfaces, the\r
+original copyright holder who places the Library under this License may add\r
+an explicit geographical distribution limitation excluding those countries,\r
+so that distribution is permitted only in or among countries not thus\r
+excluded.  In such case, this License incorporates the limitation as if\r
+written in the body of this License.\r
+\r
+  13. The Free Software Foundation may publish revised and/or new\r
+versions of the Lesser General Public License from time to time.\r
+Such new versions will be similar in spirit to the present version,\r
+but may differ in detail to address new problems or concerns.\r
+\r
+Each version is given a distinguishing version number.  If the Library\r
+specifies a version number of this License which applies to it and\r
+"any later version", you have the option of following the terms and\r
+conditions either of that version or of any later version published by\r
+the Free Software Foundation.  If the Library does not specify a\r
+license version number, you may choose any version ever published by\r
+the Free Software Foundation.\r
+\r
+  14. If you wish to incorporate parts of the Library into other free\r
+programs whose distribution conditions are incompatible with these,\r
+write to the author to ask for permission.  For software which is\r
+copyrighted by the Free Software Foundation, write to the Free\r
+Software Foundation; we sometimes make exceptions for this.  Our\r
+decision will be guided by the two goals of preserving the free status\r
+of all derivatives of our free software and of promoting the sharing\r
+and reuse of software generally.\r
+\r
+                           NO WARRANTY\r
+\r
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\r
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\r
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\r
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY\r
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\r
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\r
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\r
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r
+\r
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\r
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\r
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\r
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\r
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\r
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\r
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\r
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\r
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\r
+DAMAGES.\r
+\r
+                    END OF TERMS AND CONDITIONS\r
+\r
+           How to Apply These Terms to Your New Libraries\r
+\r
+  If you develop a new library, and you want it to be of the greatest\r
+possible use to the public, we recommend making it free software that\r
+everyone can redistribute and change.  You can do so by permitting\r
+redistribution under these terms (or, alternatively, under the terms of the\r
+ordinary General Public License).\r
+\r
+  To apply these terms, attach the following notices to the library.  It is\r
+safest to attach them to the start of each source file to most effectively\r
+convey the exclusion of warranty; and each file should have at least the\r
+"copyright" line and a pointer to where the full notice is found.\r
+\r
+    <one line to give the library's name and a brief idea of what it does.>\r
+    Copyright (C) <year>  <name of author>\r
+\r
+    This library is free software; you can redistribute it and/or\r
+    modify it under the terms of the GNU Lesser General Public\r
+    License as published by the Free Software Foundation; either\r
+    version 2.1 of the License, or (at your option) any later version.\r
+\r
+    This library is distributed in the hope that it will be useful,\r
+    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+    Lesser General Public License for more details.\r
+\r
+    You should have received a copy of the GNU Lesser General Public\r
+    License along with this library; if not, write to the Free Software\r
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
+\r
+Also add information on how to contact you by electronic and paper mail.\r
+\r
+You should also get your employer (if you work as a programmer) or your\r
+school, if any, to sign a "copyright disclaimer" for the library, if\r
+necessary.  Here is a sample; alter the names:\r
+\r
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the\r
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\r
+\r
+  <signature of Ty Coon>, 1 April 1990\r
+  Ty Coon, President of Vice\r
+\r
+That's all there is to it!\r
+\r
+\r
diff --git a/program/js/tiny_mce/plugins/cleanup/editor_plugin.js b/program/js/tiny_mce/plugins/cleanup/editor_plugin.js
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/program/js/tiny_mce/plugins/cleanup/editor_plugin_src.js b/program/js/tiny_mce/plugins/cleanup/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..8e1312f
--- /dev/null
@@ -0,0 +1,10 @@
+/**\r
+ * $Id: editor_plugin_src.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * Experimental plugin for new Cleanup routine, this logic will be moved into the core ones it's stable enougth.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Dummy file since cleanup is now moved to core */\r
diff --git a/program/js/tiny_mce/plugins/cleanup/readme.txt b/program/js/tiny_mce/plugins/cleanup/readme.txt
new file mode 100644 (file)
index 0000000..d1a6466
--- /dev/null
@@ -0,0 +1 @@
+Dummy plugin since cleanup is now moved into core.\r
diff --git a/program/js/tiny_mce/plugins/emotions/editor_plugin.js b/program/js/tiny_mce/plugins/emotions/editor_plugin.js
new file mode 100644 (file)
index 0000000..4d81e5a
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('emotions');var TinyMCE_EmotionsPlugin={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}},getControlHTML:function(cn){switch(cn){case"emotions":return tinyMCE.getButtonHTML(cn,'lang_emotions_desc','{$pluginurl}/images/emotions.gif','mceEmotion')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceEmotion":var template=new Array();template['file']='../../plugins/emotions/emotions.htm';template['width']=250;template['height']=160;template['width']+=tinyMCE.getLang('lang_emotions_delta_width',0);template['height']+=tinyMCE.getLang('lang_emotions_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true}return false}};tinyMCE.addPlugin('emotions',TinyMCE_EmotionsPlugin);
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/editor_plugin_src.js b/program/js/tiny_mce/plugins/emotions/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..c7d60cf
--- /dev/null
@@ -0,0 +1,63 @@
+/**\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
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('emotions');\r
+\r
+// Plucin static class\r
+var TinyMCE_EmotionsPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Emotions',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       /**\r
+        * Returns the HTML contents of the emotions control.\r
+        */\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "emotions":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_emotions_desc', '{$pluginurl}/images/emotions.gif', 'mceEmotion');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       /**\r
+        * Executes the mceEmotion command.\r
+        */\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceEmotion":\r
+                               var template = new Array();\r
+\r
+                               template['file'] = '../../plugins/emotions/emotions.htm'; // Relative to theme\r
+                               template['width'] = 250;\r
+                               template['height'] = 160;\r
+\r
+                               // Language specific width and height addons\r
+                               template['width'] += tinyMCE.getLang('lang_emotions_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_emotions_delta_height', 0);\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
+\r
+                               return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       }\r
+};\r
+\r
+// Register plugin\r
+tinyMCE.addPlugin('emotions', TinyMCE_EmotionsPlugin);\r
diff --git a/program/js/tiny_mce/plugins/emotions/emotions.htm b/program/js/tiny_mce/plugins/emotions/emotions.htm
new file mode 100644 (file)
index 0000000..fca8ffa
--- /dev/null
@@ -0,0 +1,40 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_emotions_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/functions.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+       <div align="center">\r
+               <div class="title">{$lang_emotions_title}:<br /><br /></div>\r
+\r
+               <table border="0" cellspacing="0" cellpadding="4">\r
+                 <tr>\r
+                       <td><a href="javascript:insertEmotion('smiley-cool.gif','lang_emotions_cool');"><img src="images/smiley-cool.gif" width="18" height="18" border="0" alt="{$lang_emotions_cool}" title="{$lang_emotions_cool}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-cry.gif','lang_emotions_cry');"><img src="images/smiley-cry.gif" width="18" height="18" border="0" alt="{$lang_emotions_cry}" title="{$lang_emotions_cry}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-embarassed.gif','lang_emotions_embarassed');"><img src="images/smiley-embarassed.gif" width="18" height="18" border="0" alt="{$lang_emotions_embarassed}" title="{$lang_emotions_embarassed}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-foot-in-mouth.gif','lang_emotions_foot_in_mouth');"><img src="images/smiley-foot-in-mouth.gif" width="18" height="18" border="0" alt="{$lang_emotions_foot_in_mouth}" title="{$lang_emotions_foot_in_mouth}" /></a></td>\r
+                 </tr>\r
+                 <tr>\r
+                       <td><a href="javascript:insertEmotion('smiley-frown.gif','lang_emotions_frown');"><img src="images/smiley-frown.gif" width="18" height="18" border="0" alt="{$lang_emotions_frown}" title="{$lang_emotions_frown}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-innocent.gif','lang_emotions_innocent');"><img src="images/smiley-innocent.gif" width="18" height="18" border="0" alt="{$lang_emotions_innocent}" title="{$lang_emotions_innocent}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-kiss.gif','lang_emotions_kiss');"><img src="images/smiley-kiss.gif" width="18" height="18" border="0" alt="{$lang_emotions_kiss}" title="{$lang_emotions_kiss}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-laughing.gif','lang_emotions_laughing');"><img src="images/smiley-laughing.gif" width="18" height="18" border="0" alt="{$lang_emotions_laughing}" title="{$lang_emotions_laughing}" /></a></td>\r
+                 </tr>\r
+                 <tr>\r
+                       <td><a href="javascript:insertEmotion('smiley-money-mouth.gif','lang_emotions_money_mouth');"><img src="images/smiley-money-mouth.gif" width="18" height="18" border="0" alt="{$lang_emotions_money_mouth}" title="{$lang_emotions_money_mouth}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-sealed.gif','lang_emotions_sealed');"><img src="images/smiley-sealed.gif" width="18" height="18" border="0" alt="{$lang_emotions_sealed}" title="{$lang_emotions_sealed}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-smile.gif','lang_emotions_smile');"><img src="images/smiley-smile.gif" width="18" height="18" border="0" alt="{$lang_emotions_smile}" title="{$lang_emotions_smile}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-surprised.gif','lang_emotions_surprised');"><img src="images/smiley-surprised.gif" width="18" height="18" border="0" alt="{$lang_emotions_surprised}" title="{$lang_emotions_surprised}" /></a></td>\r
+                 </tr>\r
+                 <tr>\r
+                       <td><a href="javascript:insertEmotion('smiley-tongue-out.gif','lang_emotions_tongue_out');"><img src="images/smiley-tongue-out.gif" width="18" height="18" border="0" alt="{$lang_emotions_tongue-out}" title="{$lang_emotions_tongue_out}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-undecided.gif','lang_emotions_undecided');"><img src="images/smiley-undecided.gif" width="18" height="18" border="0" alt="{$lang_emotions_undecided}" title="{$lang_emotions_undecided}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-wink.gif','lang_emotions_wink');"><img src="images/smiley-wink.gif" width="18" height="18" border="0" alt="{$lang_emotions_wink}" title="{$lang_emotions_wink}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-yell.gif','lang_emotions_yell');"><img src="images/smiley-yell.gif" width="18" height="18" border="0" alt="{$lang_emotions_yell}" title="{$lang_emotions_yell}" /></a></td>\r
+                 </tr>\r
+               </table>\r
+       </div>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/emotions/images/emotions.gif b/program/js/tiny_mce/plugins/emotions/images/emotions.gif
new file mode 100644 (file)
index 0000000..a39ed8e
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/emotions.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/readme.txt b/program/js/tiny_mce/plugins/emotions/images/readme.txt
new file mode 100644 (file)
index 0000000..a3cea1b
--- /dev/null
@@ -0,0 +1,2 @@
+These emotions where taken from Mozilla Thunderbird.\r
+I hope they don't get angry if I use them here after all this is a open source project aswell.\r
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-cool.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-cool.gif
new file mode 100644 (file)
index 0000000..ba90cc3
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-cool.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-cry.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-cry.gif
new file mode 100644 (file)
index 0000000..74d897a
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-cry.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-embarassed.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-embarassed.gif
new file mode 100644 (file)
index 0000000..963a96b
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-embarassed.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif
new file mode 100644 (file)
index 0000000..16f68cc
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-frown.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-frown.gif
new file mode 100644 (file)
index 0000000..716f55e
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-frown.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-innocent.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-innocent.gif
new file mode 100644 (file)
index 0000000..334d49e
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-innocent.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-kiss.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-kiss.gif
new file mode 100644 (file)
index 0000000..4efd549
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-kiss.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-laughing.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-laughing.gif
new file mode 100644 (file)
index 0000000..1606c11
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-laughing.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif
new file mode 100644 (file)
index 0000000..ca2451e
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-sealed.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-sealed.gif
new file mode 100644 (file)
index 0000000..b33d3cc
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-sealed.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-smile.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-smile.gif
new file mode 100644 (file)
index 0000000..e6a9e60
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-smile.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-surprised.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-surprised.gif
new file mode 100644 (file)
index 0000000..cb99cdd
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-surprised.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif
new file mode 100644 (file)
index 0000000..2075dc1
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-undecided.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-undecided.gif
new file mode 100644 (file)
index 0000000..bef7e25
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-undecided.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-wink.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-wink.gif
new file mode 100644 (file)
index 0000000..9faf1af
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-wink.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-yell.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-yell.gif
new file mode 100644 (file)
index 0000000..648e6e8
Binary files /dev/null and b/program/js/tiny_mce/plugins/emotions/images/smiley-yell.gif differ
diff --git a/program/js/tiny_mce/plugins/emotions/jscripts/functions.js b/program/js/tiny_mce/plugins/emotions/jscripts/functions.js
new file mode 100644 (file)
index 0000000..95a9eaf
--- /dev/null
@@ -0,0 +1,21 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+}\r
+\r
+function insertEmotion(file_name, title) {\r
+       title = tinyMCE.getLang(title);\r
+\r
+       if (title == null)\r
+               title = "";\r
+\r
+       // XML encode\r
+       title = title.replace(/&/g, '&amp;');\r
+       title = title.replace(/\"/g, '&quot;');\r
+       title = title.replace(/</g, '&lt;');\r
+       title = title.replace(/>/g, '&gt;');\r
+\r
+       var html = '<img src="' + tinyMCE.baseURL + "/plugins/emotions/images/" + file_name + '" mce_src="' + tinyMCE.baseURL + "/plugins/emotions/images/" + file_name + '" border="0" alt="' + title + '" title="' + title + '" />';\r
+\r
+       tinyMCE.execCommand('mceInsertContent', false, html);\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/program/js/tiny_mce/plugins/emotions/langs/en.js b/program/js/tiny_mce/plugins/emotions/langs/en.js
new file mode 100644 (file)
index 0000000..3cdd675
--- /dev/null
@@ -0,0 +1,22 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('emotions',{\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
+});\r
diff --git a/program/js/tiny_mce/plugins/emotions/readme.txt b/program/js/tiny_mce/plugins/emotions/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/program/js/tiny_mce/plugins/media/css/content.css b/program/js/tiny_mce/plugins/media/css/content.css
new file mode 100644 (file)
index 0000000..1f667e6
--- /dev/null
@@ -0,0 +1,26 @@
+.mceItemFlash, .mceItemShockWave, .mceItemQuickTime, .mceItemWindowsMedia, .mceItemRealMedia {\r
+       border: 1px dotted #cc0000;\r
+       background-position: center;\r
+       background-repeat: no-repeat;\r
+       background-color: #ffffcc;\r
+}\r
+\r
+.mceItemShockWave {\r
+       background-image: url('../images/shockwave.gif');\r
+}\r
+\r
+.mceItemFlash {\r
+       background-image: url('../images/flash.gif');\r
+}\r
+\r
+.mceItemQuickTime {\r
+       background-image: url('../images/quicktime.gif');\r
+}\r
+\r
+.mceItemWindowsMedia {\r
+       background-image: url('../images/windowsmedia.gif');\r
+}\r
+\r
+.mceItemRealMedia {\r
+       background-image: url('../images/realmedia.gif');\r
+}\r
diff --git a/program/js/tiny_mce/plugins/media/css/media.css b/program/js/tiny_mce/plugins/media/css/media.css
new file mode 100644 (file)
index 0000000..89c6bd5
--- /dev/null
@@ -0,0 +1,68 @@
+#id, #name, #hspace, #vspace, #class_name, #align {\r
+       width: 100px;\r
+}\r
+\r
+#hspace, #vspace {\r
+       width: 50px;\r
+}\r
+\r
+#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode {\r
+       width: 100px;\r
+}\r
+\r
+#flash_base, #flash_flashvars {\r
+       width: 240px;\r
+}\r
+\r
+#width, #height {\r
+       width: 40px;\r
+}\r
+\r
+#src, #media_type {\r
+       width: 250px;\r
+}\r
+\r
+#class {\r
+       width: 120px;\r
+}\r
+\r
+#prev {\r
+       margin: 0;\r
+       border: 1px solid black;\r
+       width: 99%;\r
+       height: 230px;\r
+       overflow: auto;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       height: 390px;\r
+       overflow: auto;\r
+}\r
+\r
+#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options {\r
+       display: none;\r
+}\r
+\r
+.mceAddSelectValue {\r
+       background-color: #DDDDDD;\r
+}\r
+\r
+#qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume {\r
+       width: 70px;\r
+}\r
+\r
+#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume {\r
+       width: 70px;\r
+}\r
+\r
+#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks {\r
+       width: 70px;\r
+}\r
+\r
+#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle {\r
+       width: 90px;\r
+}\r
+\r
+#qt_qtsrc {\r
+       width: 200px;\r
+}\r
diff --git a/program/js/tiny_mce/plugins/media/editor_plugin.js b/program/js/tiny_mce/plugins/media/editor_plugin.js
new file mode 100644 (file)
index 0000000..d431986
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('media');var TinyMCE_MediaPlugin={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}},initInstance:function(inst){if(inst.hasPlugin('flash')&&!tinyMCE.flashWarn){alert('Flash plugin is deprecated and should not be used together with the media plugin.');tinyMCE.flashWarn=true}if(!tinyMCE.settings['media_skip_plugin_css'])tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/media/css/content.css")},getControlHTML:function(cn){switch(cn){case"media":return tinyMCE.getButtonHTML(cn,'lang_media_desc','{$pluginurl}/images/media.gif','mceMedia')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceMedia":tinyMCE.openWindow({file:'../../plugins/media/media.htm',width:430+tinyMCE.getLang('lang_media_delta_width',0),height:470+tinyMCE.getLang('lang_media_delta_height',0)},{editor_id:editor_id,inline:"yes"});return true}return false},cleanup:function(type,content,inst){var nl,img,i,ne,d,s,ci;switch(type){case"insert_to_editor":img=tinyMCE.getParam("theme_href")+'/images/spacer.gif';content=content.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi,'<img class="mceItem$1" title="$2" src="'+img+'" />');content=content.replace(/<object([^>]*)>/gi,'<div class="mceItemObject" $1>');content=content.replace(/<embed([^>]*)>/gi,'<div class="mceItemObjectEmbed" $1>');content=content.replace(/<\/(object|embed)([^>]*)>/gi,'</div>');content=content.replace(/<param([^>]*)>/gi,'<div $1 class="mceItemParam"></div>');content=content.replace(new RegExp('\\/ class="mceItemParam"><\\/div>','gi'),'class="mceItemParam"></div>');break;case"insert_to_editor_dom":d=inst.getDoc();nl=content.getElementsByTagName("img");for(i=0;i<nl.length;i++){if(/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(nl[i].className)){nl[i].width=nl[i].title.replace(/.*width:[^0-9]?([0-9]+)%?.*/g,'$1');nl[i].height=nl[i].title.replace(/.*height:[^0-9]?([0-9]+)%?.*/g,'$1');}}nl=tinyMCE.selectElements(content,'DIV',function(n){return tinyMCE.hasCSSClass(n,'mceItemObject')});for(i=0;i<nl.length;i++){ci=tinyMCE.getAttrib(nl[i],"classid").toLowerCase().replace(/\s+/g,'');switch(ci){case'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemFlash',d,nl[i]),nl[i]);break;case'clsid:166b1bca-3f9c-11cf-8075-444553540000':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemShockWave',d,nl[i]),nl[i]);break;case'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':case'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':case'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemWindowsMedia',d,nl[i]),nl[i]);break;case'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemQuickTime',d,nl[i]),nl[i]);break;case'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemRealMedia',d,nl[i]),nl[i]);break}}nl=tinyMCE.selectNodes(content,function(n){return n.className=='mceItemObjectEmbed'});for(i=0;i<nl.length;i++){switch(tinyMCE.getAttrib(nl[i],'type')){case'application/x-shockwave-flash':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemFlash');break;case'application/x-director':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemShockWave');break;case'application/x-mplayer2':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemWindowsMedia');break;case'video/quicktime':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemQuickTime');break;case'audio/x-pn-realaudio-plugin':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemRealMedia');break}}break;case"get_from_editor":var startPos=-1,endPos,attribs,chunkBefore,chunkAfter,embedHTML,at,pl,cb,mt,ex;while((startPos=content.indexOf('<img',startPos+1))!=-1){endPos=content.indexOf('/>',startPos);attribs=TinyMCE_MediaPlugin._parseAttributes(content.substring(startPos+4,endPos));if(!/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(attribs['class']))continue;endPos+=2;at=attribs['title'];if(at){at=at.replace(/&(#39|apos);/g,"'");at=at.replace(/&#quot;/g,'"');try{pl=eval('x={'+at+'};')}catch(ex){pl={}}}if(!tinyMCE.getParam('media_use_script',false)){switch(attribs['class']){case'mceItemFlash':ci='d27cdb6e-ae6d-11cf-96b8-444553540000';cb='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';mt='application/x-shockwave-flash';break;case'mceItemShockWave':ci='166B1BCA-3F9C-11CF-8075-444553540000';cb='http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';mt='application/x-director';break;case'mceItemWindowsMedia':ci=tinyMCE.getParam('media_wmp6_compatible')?'05589FA1-C356-11CE-BF01-00AA0055595A':'6BF52A52-394A-11D3-B153-00C04F79FAA6';cb='http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';mt='application/x-mplayer2';break;case'mceItemQuickTime':ci='02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';cb='http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';mt='video/quicktime';break;case'mceItemRealMedia':ci='CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';cb='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';mt='audio/x-pn-realaudio-plugin';break}if(!tinyMCE.getParam("relative_urls"))pl.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],pl.src);embedHTML=TinyMCE_MediaPlugin._getEmbed(ci,cb,mt,pl,attribs)}else{switch(attribs['class']){case'mceItemFlash':s='writeFlash';break;case'mceItemShockWave':s='writeShockWave';break;case'mceItemWindowsMedia':s='writeWindowsMedia';break;case'mceItemQuickTime':s='writeQuickTime';break;case'mceItemRealMedia':s='writeRealMedia';break}if(attribs.width)at=at.replace(/width:[^0-9]?[0-9]+%?[^0-9]?/g,"width:'"+attribs.width+"'");if(attribs.height)at=at.replace(/height:[^0-9]?[0-9]+%?[^0-9]?/g,"height:'"+attribs.height+"'");if(!tinyMCE.getParam("relative_urls")){pl.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],pl.src);at=at.replace(new RegExp("src:'[^']*'","g"),"src:'"+pl.src+"'")}embedHTML='<script type="text/javascript">'+s+'({'+at+'});</script>'}chunkBefore=content.substring(0,startPos);chunkAfter=content.substring(endPos);content=chunkBefore+embedHTML+chunkAfter}break}return content},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){if(node==null)return;do{if(node.nodeName=="IMG"&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(node,'class'))){tinyMCE.switchClass(editor_id+'_media','mceButtonSelected');return true}}while((node=node.parentNode));tinyMCE.switchClass(editor_id+'_media','mceButtonNormal');return true},_createImgFromEmbed:function(n,d,cl){var ne,at,i,ti='',an;ne=d.createElement('img');ne.src=tinyMCE.getParam("theme_href")+'/images/spacer.gif';ne.width=tinyMCE.getAttrib(n,'width');ne.height=tinyMCE.getAttrib(n,'height');ne.className=cl;at=n.attributes;for(i=0;i<at.length;i++){if(at[i].specified&&at[i].nodeValue){an=at[i].nodeName.toLowerCase();if(an=='src')continue;if(an=='mce_src')an='src';if(an.indexOf('mce_')==-1&&!new RegExp('^(class|type)$').test(an))ti+=an.toLowerCase()+':\''+at[i].nodeValue+"',"}}ti=ti.length>0?ti.substring(0,ti.length-1):ti;ne.title=ti;n.parentNode.replaceChild(ne,n)},_createImg:function(cl,d,n){var i,nl,ti="",an,av,al=new Array();ne=d.createElement('img');ne.src=tinyMCE.getParam("theme_href")+'/images/spacer.gif';ne.width=tinyMCE.getAttrib(n,'width');ne.height=tinyMCE.getAttrib(n,'height');ne.className=cl;al.id=tinyMCE.getAttrib(n,'id');al.name=tinyMCE.getAttrib(n,'name');al.width=tinyMCE.getAttrib(n,'width');al.height=tinyMCE.getAttrib(n,'height');al.bgcolor=tinyMCE.getAttrib(n,'bgcolor');al.align=tinyMCE.getAttrib(n,'align');al.class_name=tinyMCE.getAttrib(n,'mce_class');nl=n.getElementsByTagName('div');for(i=0;i<nl.length;i++){av=tinyMCE.getAttrib(nl[i],'value');av=av.replace(new RegExp('\\\\','g'),'\\\\');av=av.replace(new RegExp('"','g'),'\\"');av=av.replace(new RegExp("'",'g'),"\\'");an=tinyMCE.getAttrib(nl[i],'name');al[an]=av}if(al.movie){al.src=al.movie;al.movie=null}for(an in al){if(al[an]!=null&&typeof(al[an])!="function"&&al[an]!='')ti+=an.toLowerCase()+':\''+al[an]+"',"}ti=ti.length>0?ti.substring(0,ti.length-1):ti;ne.title=ti;return ne},_getEmbed:function(cls,cb,mt,p,at){var h='',n;p.width=at.width?at.width:p.width;p.height=at.height?at.height:p.height;h+='<object classid="clsid:'+cls+'" codebase="'+cb+'"';h+=typeof(p.id)!="undefined"?' id="'+p.id+'"':'';h+=typeof(p.name)!="undefined"?' name="'+p.name+'"':'';h+=typeof(p.width)!="undefined"?' width="'+p.width+'"':'';h+=typeof(p.height)!="undefined"?' height="'+p.height+'"':'';h+=typeof(p.align)!="undefined"?' align="'+p.align+'"':'';h+='>';for(n in p){if(typeof(p[n])!="undefined"&&typeof(p[n])!="function"){h+='<param name="'+n+'" value="'+p[n]+'" />';if(n=='src'&&p[n].indexOf('://')!=-1&&mt=='application/x-mplayer2')h+='<param name="url" value="'+p[n]+'" />'}}h+='<embed type="'+mt+'"';for(n in p){if(typeof(p[n])=="function")continue;if(!(n=='url'&&mt=='application/x-mplayer2'))h+=' '+n+'="'+p[n]+'"'}h+='></embed></object>';return h},_parseAttributes:function(attribute_string){var attributeName="",endChr='"';var attributeValue="";var withInName;var withInValue;var attributes=new Array();var whiteSpaceRegExp=new RegExp('^[ \n\r\t]+','g');if(attribute_string==null||attribute_string.length<2)return null;withInName=withInValue=false;for(var i=0;i<attribute_string.length;i++){var chr=attribute_string.charAt(i);if((chr=='"'||chr=="'")&&!withInValue){withInValue=true;endChr=chr}else if(chr==endChr&&withInValue){withInValue=false;var pos=attributeName.lastIndexOf(' ');if(pos!=-1)attributeName=attributeName.substring(pos+1);attributes[attributeName.toLowerCase()]=attributeValue.substring(1);attributeName="";attributeValue=""}else if(!whiteSpaceRegExp.test(chr)&&!withInName&&!withInValue)withInName=true;if(chr=='='&&withInName)withInName=false;if(withInName)attributeName+=chr;if(withInValue)attributeValue+=chr}return attributes}};tinyMCE.addPlugin("media",TinyMCE_MediaPlugin);
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/editor_plugin_src.js b/program/js/tiny_mce/plugins/media/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..4478ebb
--- /dev/null
@@ -0,0 +1,435 @@
+/**\r
+ * $Id: editor_plugin_src.js 275 2007-05-01 15:35:08Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('media');\r
+\r
+var TinyMCE_MediaPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Media',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               // Warn if user has flash plugin and media plugin at the same time\r
+               if (inst.hasPlugin('flash') && !tinyMCE.flashWarn) {\r
+                       alert('Flash plugin is deprecated and should not be used together with the media plugin.');\r
+                       tinyMCE.flashWarn = true;\r
+               }\r
+\r
+               if (!tinyMCE.settings['media_skip_plugin_css'])\r
+                       tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/media/css/content.css");\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "media":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_media_desc', '{$pluginurl}/images/media.gif', 'mceMedia');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceMedia":\r
+                               tinyMCE.openWindow({\r
+                                               file : '../../plugins/media/media.htm',\r
+                                               width : 430 + tinyMCE.getLang('lang_media_delta_width', 0),\r
+                                               height : 470 + tinyMCE.getLang('lang_media_delta_height', 0)\r
+                                       }, {\r
+                                               editor_id : editor_id,\r
+                                               inline : "yes"\r
+                               });\r
+\r
+                               return true;\r
+          }\r
+\r
+          // Pass to next handler in chain\r
+          return false;\r
+       },\r
+\r
+       cleanup : function(type, content, inst) {\r
+               var nl, img, i, ne, d, s, ci;\r
+\r
+               switch (type) {\r
+                       case "insert_to_editor":\r
+                               img = tinyMCE.getParam("theme_href") + '/images/spacer.gif';\r
+                               content = content.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, '<img class="mceItem$1" title="$2" src="' + img + '" />');\r
+                               content = content.replace(/<object([^>]*)>/gi, '<div class="mceItemObject" $1>');\r
+                               content = content.replace(/<embed([^>]*)>/gi, '<div class="mceItemObjectEmbed" $1>');\r
+                               content = content.replace(/<\/(object|embed)([^>]*)>/gi, '</div>');\r
+                               content = content.replace(/<param([^>]*)>/gi, '<div $1 class="mceItemParam"></div>');\r
+                               content = content.replace(new RegExp('\\/ class="mceItemParam"><\\/div>', 'gi'), 'class="mceItemParam"></div>');\r
+                               break;\r
+\r
+                       case "insert_to_editor_dom":\r
+                               d = inst.getDoc();\r
+                               nl = content.getElementsByTagName("img");\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(nl[i].className)) {\r
+                                               nl[i].width = nl[i].title.replace(/.*width:[^0-9]?([0-9]+)%?.*/g, '$1');\r
+                                               nl[i].height = nl[i].title.replace(/.*height:[^0-9]?([0-9]+)%?.*/g, '$1');\r
+                                               //nl[i].align = nl[i].title.replace(/.*align:([a-z]+).*/gi, '$1');\r
+                                       }\r
+                               }\r
+\r
+                               nl = tinyMCE.selectElements(content, 'DIV', function (n) {return tinyMCE.hasCSSClass(n, 'mceItemObject');});\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       ci = tinyMCE.getAttrib(nl[i], "classid").toLowerCase().replace(/\s+/g, '');\r
+\r
+                                       switch (ci) {\r
+                                               case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':\r
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemFlash', d, nl[i]), nl[i]);\r
+                                                       break;\r
+\r
+                                               case 'clsid:166b1bca-3f9c-11cf-8075-444553540000':\r
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemShockWave', d, nl[i]), nl[i]);\r
+                                                       break;\r
+\r
+                                               case 'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':\r
+                                               case 'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':\r
+                                               case 'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':\r
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemWindowsMedia', d, nl[i]), nl[i]);\r
+                                                       break;\r
+\r
+                                               case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':\r
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemQuickTime', d, nl[i]), nl[i]);\r
+                                                       break;\r
+\r
+                                               case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':\r
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemRealMedia', d, nl[i]), nl[i]);\r
+                                                       break;\r
+                                       }\r
+                               }\r
+\r
+                               // Handle embed (if any)\r
+                               nl = tinyMCE.selectNodes(content, function (n) {return n.className == 'mceItemObjectEmbed';});\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       switch (tinyMCE.getAttrib(nl[i], 'type')) {\r
+                                               case 'application/x-shockwave-flash':\r
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemFlash');\r
+                                                       break;\r
+\r
+                                               case 'application/x-director':\r
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemShockWave');\r
+                                                       break;\r
+\r
+                                               case 'application/x-mplayer2':\r
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemWindowsMedia');\r
+                                                       break;\r
+\r
+                                               case 'video/quicktime':\r
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemQuickTime');\r
+                                                       break;\r
+\r
+                                               case 'audio/x-pn-realaudio-plugin':\r
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemRealMedia');\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                               break;\r
+\r
+                       case "get_from_editor":\r
+                               var startPos = -1, endPos, attribs, chunkBefore, chunkAfter, embedHTML, at, pl, cb, mt, ex;\r
+\r
+                               while ((startPos = content.indexOf('<img', startPos+1)) != -1) {\r
+                                       endPos = content.indexOf('/>', startPos);\r
+                                       attribs = TinyMCE_MediaPlugin._parseAttributes(content.substring(startPos + 4, endPos));\r
+\r
+                                       // Is not flash, skip it\r
+                                       if (!/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(attribs['class']))\r
+                                               continue;\r
+\r
+                                       endPos += 2;\r
+\r
+                                       // Parse attributes\r
+                                       at = attribs['title'];\r
+                                       if (at) {\r
+                                               at = at.replace(/&(#39|apos);/g, "'");\r
+                                               at = at.replace(/&#quot;/g, '"');\r
+\r
+                                               try {\r
+                                                       pl = eval('x={' + at + '};');\r
+                                               } catch (ex) {\r
+                                                       pl = {};\r
+                                               }\r
+                                       }\r
+\r
+                                       // Use object/embed\r
+                                       if (!tinyMCE.getParam('media_use_script', false)) {\r
+                                               switch (attribs['class']) {\r
+                                                       case 'mceItemFlash':\r
+                                                               ci = 'd27cdb6e-ae6d-11cf-96b8-444553540000';\r
+                                                               cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';\r
+                                                               mt = 'application/x-shockwave-flash';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemShockWave':\r
+                                                               ci = '166B1BCA-3F9C-11CF-8075-444553540000';\r
+                                                               cb = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';\r
+                                                               mt = 'application/x-director';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemWindowsMedia':\r
+                                                               ci = tinyMCE.getParam('media_wmp6_compatible') ? '05589FA1-C356-11CE-BF01-00AA0055595A' : '6BF52A52-394A-11D3-B153-00C04F79FAA6';\r
+                                                               cb = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';\r
+                                                               mt = 'application/x-mplayer2';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemQuickTime':\r
+                                                               ci = '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';\r
+                                                               cb = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';\r
+                                                               mt = 'video/quicktime';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemRealMedia':\r
+                                                               ci = 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';\r
+                                                               cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';\r
+                                                               mt = 'audio/x-pn-realaudio-plugin';\r
+                                                               break;\r
+                                               }\r
+\r
+                                               // Force absolute URL\r
+                                               if (!tinyMCE.getParam("relative_urls"))\r
+                                                       pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src);\r
+\r
+                                               embedHTML = TinyMCE_MediaPlugin._getEmbed(ci, cb, mt, pl, attribs);\r
+                                       } else {\r
+                                               // Use script version\r
+                                               switch (attribs['class']) {\r
+                                                       case 'mceItemFlash':\r
+                                                               s = 'writeFlash';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemShockWave':\r
+                                                               s = 'writeShockWave';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemWindowsMedia':\r
+                                                               s = 'writeWindowsMedia';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemQuickTime':\r
+                                                               s = 'writeQuickTime';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemRealMedia':\r
+                                                               s = 'writeRealMedia';\r
+                                                               break;\r
+                                               }\r
+\r
+                                               if (attribs.width)\r
+                                                       at = at.replace(/width:[^0-9]?[0-9]+%?[^0-9]?/g, "width:'" + attribs.width + "'");\r
+\r
+                                               if (attribs.height)\r
+                                                       at = at.replace(/height:[^0-9]?[0-9]+%?[^0-9]?/g, "height:'" + attribs.height + "'");\r
+\r
+                                               // Force absolute URL\r
+                                               if (!tinyMCE.getParam("relative_urls")) {\r
+                                                       pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src);\r
+                                                       at = at.replace(new RegExp("src:'[^']*'", "g"), "src:'" + pl.src + "'");\r
+                                               }\r
+\r
+                                               embedHTML = '<script type="text/javascript">' + s + '({' + at + '});</script>';\r
+                                       }\r
+\r
+                                       // Insert embed/object chunk\r
+                                       chunkBefore = content.substring(0, startPos);\r
+                                       chunkAfter = content.substring(endPos);\r
+                                       content = chunkBefore + embedHTML + chunkAfter;\r
+                               }\r
+                               break;\r
+               }\r
+\r
+               return content;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               if (node == null)\r
+                       return;\r
+\r
+               do {\r
+                       if (node.nodeName == "IMG" && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(node, 'class'))) {\r
+                               tinyMCE.switchClass(editor_id + '_media', 'mceButtonSelected');\r
+                               return true;\r
+                       }\r
+               } while ((node = node.parentNode));\r
+\r
+               tinyMCE.switchClass(editor_id + '_media', 'mceButtonNormal');\r
+\r
+               return true;\r
+       },\r
+\r
+       _createImgFromEmbed : function(n, d, cl) {\r
+               var ne, at, i, ti = '', an;\r
+\r
+               ne = d.createElement('img');\r
+               ne.src = tinyMCE.getParam("theme_href") + '/images/spacer.gif';\r
+               ne.width = tinyMCE.getAttrib(n, 'width');\r
+               ne.height = tinyMCE.getAttrib(n, 'height');\r
+               ne.className = cl;\r
+\r
+               at = n.attributes;\r
+               for (i=0; i<at.length; i++) {\r
+                       if (at[i].specified && at[i].nodeValue) {\r
+                               an = at[i].nodeName.toLowerCase();\r
+\r
+                               if (an == 'src')\r
+                                       continue;\r
+\r
+                               if (an == 'mce_src')\r
+                                       an = 'src';\r
+\r
+                               if (an.indexOf('mce_') == -1 && !new RegExp('^(class|type)$').test(an))\r
+                                       ti += an.toLowerCase() + ':\'' + at[i].nodeValue + "',";\r
+                       }\r
+               }\r
+\r
+               ti = ti.length > 0 ? ti.substring(0, ti.length - 1) : ti;\r
+               ne.title = ti;\r
+\r
+               n.parentNode.replaceChild(ne, n);\r
+       },\r
+\r
+       _createImg : function(cl, d, n) {\r
+               var i, nl, ti = "", an, av, al = new Array();\r
+\r
+               ne = d.createElement('img');\r
+               ne.src = tinyMCE.getParam("theme_href") + '/images/spacer.gif';\r
+               ne.width = tinyMCE.getAttrib(n, 'width');\r
+               ne.height = tinyMCE.getAttrib(n, 'height');\r
+               ne.className = cl;\r
+\r
+               al.id = tinyMCE.getAttrib(n, 'id');\r
+               al.name = tinyMCE.getAttrib(n, 'name');\r
+               al.width = tinyMCE.getAttrib(n, 'width');\r
+               al.height = tinyMCE.getAttrib(n, 'height');\r
+               al.bgcolor = tinyMCE.getAttrib(n, 'bgcolor');\r
+               al.align = tinyMCE.getAttrib(n, 'align');\r
+               al.class_name = tinyMCE.getAttrib(n, 'mce_class');\r
+\r
+               nl = n.getElementsByTagName('div');\r
+               for (i=0; i<nl.length; i++) {\r
+                       av = tinyMCE.getAttrib(nl[i], 'value');\r
+                       av = av.replace(new RegExp('\\\\', 'g'), '\\\\');\r
+                       av = av.replace(new RegExp('"', 'g'), '\\"');\r
+                       av = av.replace(new RegExp("'", 'g'), "\\'");\r
+                       an = tinyMCE.getAttrib(nl[i], 'name');\r
+                       al[an] = av;\r
+               }\r
+\r
+               if (al.movie) {\r
+                       al.src = al.movie;\r
+                       al.movie = null;\r
+               }\r
+\r
+               for (an in al) {\r
+                       if (al[an] != null && typeof(al[an]) != "function" && al[an] != '')\r
+                               ti += an.toLowerCase() + ':\'' + al[an] + "',";\r
+               }\r
+\r
+               ti = ti.length > 0 ? ti.substring(0, ti.length - 1) : ti;\r
+               ne.title = ti;\r
+\r
+               return ne;\r
+       },\r
+\r
+       _getEmbed : function(cls, cb, mt, p, at) {\r
+               var h = '', n;\r
+\r
+               p.width = at.width ? at.width : p.width;\r
+               p.height = at.height ? at.height : p.height;\r
+\r
+               h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';\r
+               h += typeof(p.id) != "undefined" ? ' id="' + p.id + '"' : '';\r
+               h += typeof(p.name) != "undefined" ? ' name="' + p.name + '"' : '';\r
+               h += typeof(p.width) != "undefined" ? ' width="' + p.width + '"' : '';\r
+               h += typeof(p.height) != "undefined" ? ' height="' + p.height + '"' : '';\r
+               h += typeof(p.align) != "undefined" ? ' align="' + p.align + '"' : '';\r
+               h += '>';\r
+\r
+               for (n in p) {\r
+                       if (typeof(p[n]) != "undefined" && typeof(p[n]) != "function") {\r
+                               h += '<param name="' + n + '" value="' + p[n] + '" />';\r
+\r
+                               // Add extra url parameter if it's an absolute URL on WMP\r
+                               if (n == 'src' && p[n].indexOf('://') != -1 && mt == 'application/x-mplayer2')\r
+                                       h += '<param name="url" value="' + p[n] + '" />';\r
+                       }\r
+               }\r
+\r
+               h += '<embed type="' + mt + '"';\r
+\r
+               for (n in p) {\r
+                       if (typeof(p[n]) == "function")\r
+                               continue;\r
+\r
+                       // Skip url parameter for embed tag on WMP\r
+                       if (!(n == 'url' && mt == 'application/x-mplayer2'))\r
+                               h += ' ' + n + '="' + p[n] + '"';\r
+               }\r
+\r
+               h += '></embed></object>';\r
+\r
+               return h;\r
+       },\r
+\r
+       _parseAttributes : function(attribute_string) {\r
+               var attributeName = "", endChr = '"';\r
+               var attributeValue = "";\r
+               var withInName;\r
+               var withInValue;\r
+               var attributes = new Array();\r
+               var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g');\r
+\r
+               if (attribute_string == null || attribute_string.length < 2)\r
+                       return null;\r
+\r
+               withInName = withInValue = false;\r
+\r
+               for (var i=0; i<attribute_string.length; i++) {\r
+                       var chr = attribute_string.charAt(i);\r
+\r
+                       if ((chr == '"' || chr == "'") && !withInValue) {\r
+                               withInValue = true;\r
+                               endChr = chr;\r
+                       } else if (chr == endChr && withInValue) {\r
+                               withInValue = false;\r
+\r
+                               var pos = attributeName.lastIndexOf(' ');\r
+                               if (pos != -1)\r
+                                       attributeName = attributeName.substring(pos+1);\r
+\r
+                               attributes[attributeName.toLowerCase()] = attributeValue.substring(1);\r
+\r
+                               attributeName = "";\r
+                               attributeValue = "";\r
+                       } else if (!whiteSpaceRegExp.test(chr) && !withInName && !withInValue)\r
+                               withInName = true;\r
+\r
+                       if (chr == '=' && withInName)\r
+                               withInName = false;\r
+\r
+                       if (withInName)\r
+                               attributeName += chr;\r
+\r
+                       if (withInValue)\r
+                               attributeValue += chr;\r
+               }\r
+\r
+               return attributes;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("media", TinyMCE_MediaPlugin);\r
diff --git a/program/js/tiny_mce/plugins/media/images/flash.gif b/program/js/tiny_mce/plugins/media/images/flash.gif
new file mode 100644 (file)
index 0000000..cb192e6
Binary files /dev/null and b/program/js/tiny_mce/plugins/media/images/flash.gif differ
diff --git a/program/js/tiny_mce/plugins/media/images/media.gif b/program/js/tiny_mce/plugins/media/images/media.gif
new file mode 100644 (file)
index 0000000..856df52
Binary files /dev/null and b/program/js/tiny_mce/plugins/media/images/media.gif differ
diff --git a/program/js/tiny_mce/plugins/media/images/quicktime.gif b/program/js/tiny_mce/plugins/media/images/quicktime.gif
new file mode 100644 (file)
index 0000000..3b04991
Binary files /dev/null and b/program/js/tiny_mce/plugins/media/images/quicktime.gif differ
diff --git a/program/js/tiny_mce/plugins/media/images/realmedia.gif b/program/js/tiny_mce/plugins/media/images/realmedia.gif
new file mode 100644 (file)
index 0000000..fdfe0b9
Binary files /dev/null and b/program/js/tiny_mce/plugins/media/images/realmedia.gif differ
diff --git a/program/js/tiny_mce/plugins/media/images/shockwave.gif b/program/js/tiny_mce/plugins/media/images/shockwave.gif
new file mode 100644 (file)
index 0000000..5f235df
Binary files /dev/null and b/program/js/tiny_mce/plugins/media/images/shockwave.gif differ
diff --git a/program/js/tiny_mce/plugins/media/images/windowsmedia.gif b/program/js/tiny_mce/plugins/media/images/windowsmedia.gif
new file mode 100644 (file)
index 0000000..ab50f2d
Binary files /dev/null and b/program/js/tiny_mce/plugins/media/images/windowsmedia.gif differ
diff --git a/program/js/tiny_mce/plugins/media/jscripts/embed.js b/program/js/tiny_mce/plugins/media/jscripts/embed.js
new file mode 100644 (file)
index 0000000..f8dc810
--- /dev/null
@@ -0,0 +1,73 @@
+/**\r
+ * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose.\r
+ */\r
+\r
+function writeFlash(p) {\r
+       writeEmbed(\r
+               'D27CDB6E-AE6D-11cf-96B8-444553540000',\r
+               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',\r
+               'application/x-shockwave-flash',\r
+               p\r
+       );\r
+}\r
+\r
+function writeShockWave(p) {\r
+       writeEmbed(\r
+       '166B1BCA-3F9C-11CF-8075-444553540000',\r
+       'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0',\r
+       'application/x-director',\r
+               p\r
+       );\r
+}\r
+\r
+function writeQuickTime(p) {\r
+       writeEmbed(\r
+               '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',\r
+               'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',\r
+               'video/quicktime',\r
+               p\r
+       );\r
+}\r
+\r
+function writeRealMedia(p) {\r
+       writeEmbed(\r
+               'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA',\r
+               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',\r
+               'audio/x-pn-realaudio-plugin',\r
+               p\r
+       );\r
+}\r
+\r
+function writeWindowsMedia(p) {\r
+       p.url = p.src;\r
+       writeEmbed(\r
+               '6BF52A52-394A-11D3-B153-00C04F79FAA6',\r
+               'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701',\r
+               'application/x-mplayer2',\r
+               p\r
+       );\r
+}\r
+\r
+function writeEmbed(cls, cb, mt, p) {\r
+       var h = '', n;\r
+\r
+       h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';\r
+       h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : '';\r
+       h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : '';\r
+       h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : '';\r
+       h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : '';\r
+       h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : '';\r
+       h += '>';\r
+\r
+       for (n in p)\r
+               h += '<param name="' + n + '" value="' + p[n] + '">';\r
+\r
+       h += '<embed type="' + mt + '"';\r
+\r
+       for (n in p)\r
+               h += n + '="' + p[n] + '" ';\r
+\r
+       h += '></embed></object>';\r
+\r
+       document.write(h);\r
+}\r
diff --git a/program/js/tiny_mce/plugins/media/jscripts/media.js b/program/js/tiny_mce/plugins/media/jscripts/media.js
new file mode 100644 (file)
index 0000000..691a8bd
--- /dev/null
@@ -0,0 +1,590 @@
+var oldWidth, oldHeight;\r
+var url = tinyMCE.getParam("media_external_list_url");\r
+if (url != null) {\r
+       // Fix relative\r
+       if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+               url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+}\r
+\r
+function init() {\r
+       var pl = "", f, val;\r
+       var type = "flash", fe, i;\r
+\r
+       tinyMCEPopup.resizeToInnerSize();\r
+       f = document.forms[0]\r
+\r
+       fe = tinyMCE.selectedInstance.getFocusElement();\r
+       if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) {\r
+               pl = "x={" + fe.title + "};";\r
+\r
+               switch (tinyMCE.getAttrib(fe, 'class')) {\r
+                       case 'mceItemFlash':\r
+                               type = 'flash';\r
+                               break;\r
+\r
+                       case 'mceItemShockWave':\r
+                               type = 'shockwave';\r
+                               break;\r
+\r
+                       case 'mceItemWindowsMedia':\r
+                               type = 'wmp';\r
+                               break;\r
+\r
+                       case 'mceItemQuickTime':\r
+                               type = 'qt';\r
+                               break;\r
+\r
+                       case 'mceItemRealMedia':\r
+                               type = 'rmp';\r
+                               break;\r
+               }\r
+\r
+               document.forms[0].insert.value = tinyMCE.getLang('lang_update', 'Insert', true); \r
+       }\r
+\r
+       document.getElementById('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media');\r
+       document.getElementById('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','qt_qtsrc','media','media');\r
+       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');\r
+\r
+       var html = getMediaListHTML('filebrowser','src','media','media');\r
+       if (html == "")\r
+               document.getElementById("linklistrow").style.display = 'none';\r
+       else\r
+               document.getElementById("linklistcontainer").innerHTML = html;\r
+\r
+       // Resize some elements\r
+       if (isVisible('filebrowsercontainer'))\r
+               document.getElementById('src').style.width = '230px';\r
+\r
+       // Setup form\r
+       if (pl != "") {\r
+               pl = eval(pl);\r
+\r
+               switch (type) {\r
+                       case "flash":\r
+                               setBool(pl, 'flash', 'play');\r
+                               setBool(pl, 'flash', 'loop');\r
+                               setBool(pl, 'flash', 'menu');\r
+                               setBool(pl, 'flash', 'swliveconnect');\r
+                               setStr(pl, 'flash', 'quality');\r
+                               setStr(pl, 'flash', 'scale');\r
+                               setStr(pl, 'flash', 'salign');\r
+                               setStr(pl, 'flash', 'wmode');\r
+                               setStr(pl, 'flash', 'base');\r
+                               setStr(pl, 'flash', 'flashvars');\r
+                       break;\r
+\r
+                       case "qt":\r
+                               setBool(pl, 'qt', 'loop');\r
+                               setBool(pl, 'qt', 'autoplay');\r
+                               setBool(pl, 'qt', 'cache');\r
+                               setBool(pl, 'qt', 'controller');\r
+                               setBool(pl, 'qt', 'correction');\r
+                               setBool(pl, 'qt', 'enablejavascript');\r
+                               setBool(pl, 'qt', 'kioskmode');\r
+                               setBool(pl, 'qt', 'autohref');\r
+                               setBool(pl, 'qt', 'playeveryframe');\r
+                               setBool(pl, 'qt', 'tarsetcache');\r
+                               setStr(pl, 'qt', 'scale');\r
+                               setStr(pl, 'qt', 'starttime');\r
+                               setStr(pl, 'qt', 'endtime');\r
+                               setStr(pl, 'qt', 'tarset');\r
+                               setStr(pl, 'qt', 'qtsrcchokespeed');\r
+                               setStr(pl, 'qt', 'volume');\r
+                               setStr(pl, 'qt', 'qtsrc');\r
+                       break;\r
+\r
+                       case "shockwave":\r
+                               setBool(pl, 'shockwave', 'sound');\r
+                               setBool(pl, 'shockwave', 'progress');\r
+                               setBool(pl, 'shockwave', 'autostart');\r
+                               setBool(pl, 'shockwave', 'swliveconnect');\r
+                               setStr(pl, 'shockwave', 'swvolume');\r
+                               setStr(pl, 'shockwave', 'swstretchstyle');\r
+                               setStr(pl, 'shockwave', 'swstretchhalign');\r
+                               setStr(pl, 'shockwave', 'swstretchvalign');\r
+                       break;\r
+\r
+                       case "wmp":\r
+                               setBool(pl, 'wmp', 'autostart');\r
+                               setBool(pl, 'wmp', 'enabled');\r
+                               setBool(pl, 'wmp', 'enablecontextmenu');\r
+                               setBool(pl, 'wmp', 'fullscreen');\r
+                               setBool(pl, 'wmp', 'invokeurls');\r
+                               setBool(pl, 'wmp', 'mute');\r
+                               setBool(pl, 'wmp', 'stretchtofit');\r
+                               setBool(pl, 'wmp', 'windowlessvideo');\r
+                               setStr(pl, 'wmp', 'balance');\r
+                               setStr(pl, 'wmp', 'baseurl');\r
+                               setStr(pl, 'wmp', 'captioningid');\r
+                               setStr(pl, 'wmp', 'currentmarker');\r
+                               setStr(pl, 'wmp', 'currentposition');\r
+                               setStr(pl, 'wmp', 'defaultframe');\r
+                               setStr(pl, 'wmp', 'playcount');\r
+                               setStr(pl, 'wmp', 'rate');\r
+                               setStr(pl, 'wmp', 'uimode');\r
+                               setStr(pl, 'wmp', 'volume');\r
+                       break;\r
+\r
+                       case "rmp":\r
+                               setBool(pl, 'rmp', 'autostart');\r
+                               setBool(pl, 'rmp', 'loop');\r
+                               setBool(pl, 'rmp', 'autogotourl');\r
+                               setBool(pl, 'rmp', 'center');\r
+                               setBool(pl, 'rmp', 'imagestatus');\r
+                               setBool(pl, 'rmp', 'maintainaspect');\r
+                               setBool(pl, 'rmp', 'nojava');\r
+                               setBool(pl, 'rmp', 'prefetch');\r
+                               setBool(pl, 'rmp', 'shuffle');\r
+                               setStr(pl, 'rmp', 'console');\r
+                               setStr(pl, 'rmp', 'controls');\r
+                               setStr(pl, 'rmp', 'numloop');\r
+                               setStr(pl, 'rmp', 'scriptcallbacks');\r
+                       break;\r
+               }\r
+\r
+               setStr(pl, null, 'src');\r
+               setStr(pl, null, 'id');\r
+               setStr(pl, null, 'name');\r
+               setStr(pl, null, 'vspace');\r
+               setStr(pl, null, 'hspace');\r
+               setStr(pl, null, 'bgcolor');\r
+               setStr(pl, null, 'align');\r
+               setStr(pl, null, 'width');\r
+               setStr(pl, null, 'height');\r
+\r
+               if ((val = tinyMCE.getAttrib(fe, "width")) != "")\r
+                       pl.width = f.width.value = val;\r
+\r
+               if ((val = tinyMCE.getAttrib(fe, "height")) != "")\r
+                       pl.height = f.height.value = val;\r
+\r
+               oldWidth = pl.width ? parseInt(pl.width) : 0;\r
+               oldHeight = pl.height ? parseInt(pl.height) : 0;\r
+       } else\r
+               oldWidth = oldHeight = 0;\r
+\r
+       selectByValue(f, 'media_type', type);\r
+       changedType(type);\r
+       updateColor('bgcolor_pick', 'bgcolor');\r
+\r
+       TinyMCE_EditableSelects.init();\r
+       generatePreview();\r
+}\r
+\r
+function insertMedia() {\r
+       var fe, f = document.forms[0], h;\r
+\r
+       if (!AutoValidator.validate(f)) {\r
+               alert(tinyMCE.getLang('lang_invalid_data'));\r
+               return false;\r
+       }\r
+\r
+       f.width.value = f.width.value == "" ? 100 : f.width.value;\r
+       f.height.value = f.height.value == "" ? 100 : f.height.value;\r
+\r
+       fe = tinyMCE.selectedInstance.getFocusElement();\r
+       if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) {\r
+               switch (f.media_type.options[f.media_type.selectedIndex].value) {\r
+                       case "flash":\r
+                               fe.className = "mceItemFlash";\r
+                               break;\r
+\r
+                       case "shockwave":\r
+                               fe.className = "mceItemShockWave";\r
+                               break;\r
+\r
+                       case "qt":\r
+                               fe.className = "mceItemQuickTime";\r
+                               break;\r
+\r
+                       case "wmp":\r
+                               fe.className = "mceItemWindowsMedia";\r
+                               break;\r
+\r
+                       case "rmp":\r
+                               fe.className = "mceItemRealMedia";\r
+                               break;\r
+               }\r
+\r
+               if (fe.width != f.width.value || fe.height != f.height.height)\r
+                       tinyMCE.selectedInstance.repaint();\r
+\r
+               fe.title = serializeParameters();\r
+               fe.width = f.width.value;\r
+               fe.height = f.height.value;\r
+               fe.style.width = f.width.value + (f.width.value.indexOf('%') == -1 ? 'px' : '');\r
+               fe.style.height = f.height.value + (f.height.value.indexOf('%') == -1 ? 'px' : '');\r
+               fe.align = f.align.options[f.align.selectedIndex].value;\r
+       } else {\r
+               h = '<img src="' + tinyMCE.getParam("theme_href") + '/images/spacer.gif"' ;\r
+\r
+               switch (f.media_type.options[f.media_type.selectedIndex].value) {\r
+                       case "flash":\r
+                               h += ' class="mceItemFlash"';\r
+                               break;\r
+\r
+                       case "shockwave":\r
+                               h += ' class="mceItemShockWave"';\r
+                               break;\r
+\r
+                       case "qt":\r
+                               h += ' class="mceItemQuickTime"';\r
+                               break;\r
+\r
+                       case "wmp":\r
+                               h += ' class="mceItemWindowsMedia"';\r
+                               break;\r
+\r
+                       case "rmp":\r
+                               h += ' class="mceItemRealMedia"';\r
+                               break;\r
+               }\r
+\r
+               h += ' title="' + serializeParameters() + '"';\r
+               h += ' width="' + f.width.value + '"';\r
+               h += ' height="' + f.height.value + '"';\r
+               h += ' align="' + f.align.options[f.align.selectedIndex].value + '"';\r
+\r
+               h += ' />';\r
+\r
+               tinyMCE.selectedInstance.execCommand('mceInsertContent', false, h);\r
+       }\r
+\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function getMediaListHTML() {\r
+       if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) {\r
+               var html = "";\r
+\r
+               html += '<select id="linklist" name="linklist" style="width: 250px" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.src.value=this.options[this.selectedIndex].value;">';\r
+               html += '<option value="">---</option>';\r
+\r
+               for (var i=0; i<tinyMCEMediaList.length; i++)\r
+                       html += '<option value="' + tinyMCEMediaList[i][1] + '">' + tinyMCEMediaList[i][0] + '</option>';\r
+\r
+               html += '</select>';\r
+\r
+               return html;\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+function getType(v) {\r
+       var fo, i, c, el, x, f = document.forms[0];\r
+\r
+       fo = tinyMCE.getParam("media_types", "flash=swf;shockwave=dcr;qt=mov,qt,mpg,mp3,mp4,mpeg;shockwave=dcr;wmp=avi,wmv,wm,asf,asx,wmx,wvx;rmp=rm,ra,ram").split(';');\r
+\r
+       // YouTube\r
+       if (v.indexOf('http://www.youtube.com/watch?v=') == 0) {\r
+               f.width.value = '425';\r
+               f.height.value = '350';\r
+               f.src.value = 'http://www.youtube.com/v/' + v.substring('http://www.youtube.com/watch?v='.length);\r
+               return 'flash';\r
+       }\r
+\r
+       // Google video\r
+       if (v.indexOf('http://video.google.com/videoplay?docid=') == 0) {\r
+               f.width.value = '425';\r
+               f.height.value = '326';\r
+               f.src.value = 'http://video.google.com/googleplayer.swf?docId=' + v.substring('http://video.google.com/videoplay?docid='.length) + '&hl=en';\r
+               return 'flash';\r
+       }\r
+\r
+       for (i=0; i<fo.length; i++) {\r
+               c = fo[i].split('=');\r
+\r
+               el = c[1].split(',');\r
+               for (x=0; x<el.length; x++)\r
+               if (v.indexOf('.' + el[x]) != -1)\r
+                       return c[0];\r
+       }\r
+\r
+       return null;\r
+}\r
+\r
+function switchType(v) {\r
+       var t = getType(v), d = document, f = d.forms[0];\r
+\r
+       if (!t)\r
+               return;\r
+\r
+       selectByValue(d.forms[0], 'media_type', t);\r
+       changedType(t);\r
+\r
+       // Update qtsrc also\r
+       if (t == 'qt' && f.src.value.toLowerCase().indexOf('rtsp://') != -1) {\r
+               alert(tinyMCE.getLang("lang_media_qt_stream_warn"));\r
+\r
+               if (f.qt_qtsrc.value == '')\r
+                       f.qt_qtsrc.value = f.src.value;\r
+       }\r
+}\r
+\r
+function changedType(t) {\r
+       var d = document;\r
+\r
+       d.getElementById('flash_options').style.display = 'none';\r
+       d.getElementById('qt_options').style.display = 'none';\r
+       d.getElementById('shockwave_options').style.display = 'none';\r
+       d.getElementById('wmp_options').style.display = 'none';\r
+       d.getElementById('rmp_options').style.display = 'none';\r
+       d.getElementById(t + '_options').style.display = 'block';\r
+}\r
+\r
+function serializeParameters() {\r
+       var d = document, f = d.forms[0], s = '';\r
+\r
+       switch (f.media_type.options[f.media_type.selectedIndex].value) {\r
+               case "flash":\r
+                       s += getBool('flash', 'play', true);\r
+                       s += getBool('flash', 'loop', true);\r
+                       s += getBool('flash', 'menu', true);\r
+                       s += getBool('flash', 'swliveconnect', false);\r
+                       s += getStr('flash', 'quality');\r
+                       s += getStr('flash', 'scale');\r
+                       s += getStr('flash', 'salign');\r
+                       s += getStr('flash', 'wmode');\r
+                       s += getStr('flash', 'base');\r
+                       s += getStr('flash', 'flashvars');\r
+               break;\r
+\r
+               case "qt":\r
+                       s += getBool('qt', 'loop', false);\r
+                       s += getBool('qt', 'autoplay', true);\r
+                       s += getBool('qt', 'cache', false);\r
+                       s += getBool('qt', 'controller', true);\r
+                       s += getBool('qt', 'correction', false, 'none', 'full');\r
+                       s += getBool('qt', 'enablejavascript', false);\r
+                       s += getBool('qt', 'kioskmode', false);\r
+                       s += getBool('qt', 'autohref', false);\r
+                       s += getBool('qt', 'playeveryframe', false);\r
+                       s += getBool('qt', 'targetcache', false);\r
+                       s += getStr('qt', 'scale');\r
+                       s += getStr('qt', 'starttime');\r
+                       s += getStr('qt', 'endtime');\r
+                       s += getStr('qt', 'target');\r
+                       s += getStr('qt', 'qtsrcchokespeed');\r
+                       s += getStr('qt', 'volume');\r
+                       s += getStr('qt', 'qtsrc');\r
+               break;\r
+\r
+               case "shockwave":\r
+                       s += getBool('shockwave', 'sound');\r
+                       s += getBool('shockwave', 'progress');\r
+                       s += getBool('shockwave', 'autostart');\r
+                       s += getBool('shockwave', 'swliveconnect');\r
+                       s += getStr('shockwave', 'swvolume');\r
+                       s += getStr('shockwave', 'swstretchstyle');\r
+                       s += getStr('shockwave', 'swstretchhalign');\r
+                       s += getStr('shockwave', 'swstretchvalign');\r
+               break;\r
+\r
+               case "wmp":\r
+                       s += getBool('wmp', 'autostart', true);\r
+                       s += getBool('wmp', 'enabled', false);\r
+                       s += getBool('wmp', 'enablecontextmenu', true);\r
+                       s += getBool('wmp', 'fullscreen', false);\r
+                       s += getBool('wmp', 'invokeurls', true);\r
+                       s += getBool('wmp', 'mute', false);\r
+                       s += getBool('wmp', 'stretchtofit', false);\r
+                       s += getBool('wmp', 'windowlessvideo', false);\r
+                       s += getStr('wmp', 'balance');\r
+                       s += getStr('wmp', 'baseurl');\r
+                       s += getStr('wmp', 'captioningid');\r
+                       s += getStr('wmp', 'currentmarker');\r
+                       s += getStr('wmp', 'currentposition');\r
+                       s += getStr('wmp', 'defaultframe');\r
+                       s += getStr('wmp', 'playcount');\r
+                       s += getStr('wmp', 'rate');\r
+                       s += getStr('wmp', 'uimode');\r
+                       s += getStr('wmp', 'volume');\r
+               break;\r
+\r
+               case "rmp":\r
+                       s += getBool('rmp', 'autostart', false);\r
+                       s += getBool('rmp', 'loop', false);\r
+                       s += getBool('rmp', 'autogotourl', true);\r
+                       s += getBool('rmp', 'center', false);\r
+                       s += getBool('rmp', 'imagestatus', true);\r
+                       s += getBool('rmp', 'maintainaspect', false);\r
+                       s += getBool('rmp', 'nojava', false);\r
+                       s += getBool('rmp', 'prefetch', false);\r
+                       s += getBool('rmp', 'shuffle', false);\r
+                       s += getStr('rmp', 'console');\r
+                       s += getStr('rmp', 'controls');\r
+                       s += getStr('rmp', 'numloop');\r
+                       s += getStr('rmp', 'scriptcallbacks');\r
+               break;\r
+       }\r
+\r
+       s += getStr(null, 'id');\r
+       s += getStr(null, 'name');\r
+       s += getStr(null, 'src');\r
+       s += getStr(null, 'align');\r
+       s += getStr(null, 'bgcolor');\r
+       s += getInt(null, 'vspace');\r
+       s += getInt(null, 'hspace');\r
+       s += getStr(null, 'width');\r
+       s += getStr(null, 'height');\r
+\r
+       s = s.length > 0 ? s.substring(0, s.length - 1) : s;\r
+\r
+       return s;\r
+}\r
+\r
+function setBool(pl, p, n) {\r
+       if (typeof(pl[n]) == "undefined")\r
+               return;\r
+\r
+       document.forms[0].elements[p + "_" + n].checked = pl[n];\r
+}\r
+\r
+function setStr(pl, p, n) {\r
+       var f = document.forms[0], e = f.elements[(p != null ? p + "_" : '') + n];\r
+\r
+       if (typeof(pl[n]) == "undefined")\r
+               return;\r
+\r
+       if (e.type == "text")\r
+               e.value = pl[n];\r
+       else\r
+               selectByValue(f, (p != null ? p + "_" : '') + n, pl[n]);\r
+}\r
+\r
+function getBool(p, n, d, tv, fv) {\r
+       var v = document.forms[0].elements[p + "_" + n].checked;\r
+\r
+       tv = typeof(tv) == 'undefined' ? 'true' : "'" + jsEncode(tv) + "'";\r
+       fv = typeof(fv) == 'undefined' ? 'false' : "'" + jsEncode(fv) + "'";\r
+\r
+       return (v == d) ? '' : n + (v ? ':' + tv + ',' : ':' + fv + ',');\r
+}\r
+\r
+function getStr(p, n, d) {\r
+       var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];\r
+       var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;\r
+\r
+       return ((n == d || v == '') ? '' : n + ":'" + jsEncode(v) + "',");\r
+}\r
+\r
+function getInt(p, n, d) {\r
+       var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];\r
+       var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;\r
+\r
+       return ((n == d || v == '') ? '' : n + ":" + v.replace(/[^0-9]+/g, '') + ",");\r
+}\r
+\r
+function jsEncode(s) {\r
+       s = s.replace(new RegExp('\\\\', 'g'), '\\\\');\r
+       s = s.replace(new RegExp('"', 'g'), '\\"');\r
+       s = s.replace(new RegExp("'", 'g'), "\\'");\r
+\r
+       return s;\r
+}\r
+\r
+function generatePreview(c) {\r
+       var f = document.forms[0], p = document.getElementById('prev'), h = '', cls, pl, n, type, codebase, wp, hp, nw, nh;\r
+\r
+       p.innerHTML = '<!-- x --->';\r
+\r
+       nw = parseInt(f.width.value);\r
+       nh = parseInt(f.height.value);\r
+\r
+       if (f.width.value != "" && f.height.value != "") {\r
+               if (f.constrain.checked) {\r
+                       if (c == 'width' && oldWidth != 0) {\r
+                               wp = nw / oldWidth;\r
+                               nh = Math.round(wp * nh);\r
+                               f.height.value = nh;\r
+                       } else if (c == 'height' && oldHeight != 0) {\r
+                               hp = nh / oldHeight;\r
+                               nw = Math.round(hp * nw);\r
+                               f.width.value = nw;\r
+                       }\r
+               }\r
+       }\r
+\r
+       if (f.width.value != "")\r
+               oldWidth = nw;\r
+\r
+       if (f.height.value != "")\r
+               oldHeight = nh;\r
+\r
+       // After constrain\r
+       pl = serializeParameters();\r
+\r
+       switch (f.media_type.options[f.media_type.selectedIndex].value) {\r
+               case "flash":\r
+                       cls = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';\r
+                       codebase = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';\r
+                       type = 'application/x-shockwave-flash';\r
+                       break;\r
+\r
+               case "shockwave":\r
+                       cls = 'clsid:166B1BCA-3F9C-11CF-8075-444553540000';\r
+                       codebase = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';\r
+                       type = 'application/x-director';\r
+                       break;\r
+\r
+               case "qt":\r
+                       cls = 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';\r
+                       codebase = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';\r
+                       type = 'video/quicktime';\r
+                       break;\r
+\r
+               case "wmp":\r
+                       cls = tinyMCE.getParam('media_wmp6_compatible') ? 'clsid:05589FA1-C356-11CE-BF01-00AA0055595A' : 'clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6';\r
+                       codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';\r
+                       type = 'application/x-mplayer2';\r
+                       break;\r
+\r
+               case "rmp":\r
+                       cls = 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';\r
+                       codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';\r
+                       type = 'audio/x-pn-realaudio-plugin';\r
+                       break;\r
+       }\r
+\r
+       if (pl == '') {\r
+               p.innerHTML = '';\r
+               return;\r
+       }\r
+\r
+       pl = eval('x={' + pl + '};');\r
+\r
+       if (!pl.src) {\r
+               p.innerHTML = '';\r
+               return;\r
+       }\r
+\r
+       pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src);\r
+       pl.width = !pl.width ? 100 : pl.width;\r
+       pl.height = !pl.height ? 100 : pl.height;\r
+       pl.id = !pl.id ? 'obj' : pl.id;\r
+       pl.name = !pl.name ? 'eobj' : pl.name;\r
+       pl.align = !pl.align ? '' : pl.align;\r
+\r
+       h += '<object classid="clsid:' + cls + '" codebase="' + codebase + '" width="' + pl.width + '" height="' + pl.height + '" id="' + pl.id + '" name="' + pl.name + '" align="' + pl.align + '">';\r
+\r
+       for (n in pl) {\r
+               h += '<param name="' + n + '" value="' + pl[n] + '">';\r
+\r
+               // Add extra url parameter if it's an absolute URL\r
+               if (n == 'src' && pl[n].indexOf('://') != -1)\r
+                       h += '<param name="url" value="' + pl[n] + '" />';\r
+       }\r
+\r
+       h += '<embed type="' + type + '" ';\r
+\r
+       for (n in pl)\r
+               h += n + '="' + pl[n] + '" ';\r
+\r
+       h += '></embed></object>';\r
+\r
+       p.innerHTML = "<!-- x --->" + h;\r
+}\r
diff --git a/program/js/tiny_mce/plugins/media/langs/en.js b/program/js/tiny_mce/plugins/media/langs/en.js
new file mode 100644 (file)
index 0000000..ced1967
--- /dev/null
@@ -0,0 +1,94 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('media',{\r
+title : 'Insert / edit embedded media',\r
+desc : '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
+});
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/media/media.htm b/program/js/tiny_mce/plugins/media/media.htm
new file mode 100644 (file)
index 0000000..97b7cdc
--- /dev/null
@@ -0,0 +1,723 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_media_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/media.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <link href="css/media.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+    <form onsubmit="insertMedia();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');generatePreview();" onmousedown="return false;">{$lang_media_general}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_media_advanced}</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>{$lang_media_general}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                                       <tr>\r
+                                                               <td><label for="media_type">{$lang_media_type}</label></td>\r
+                                                               <td>\r
+                                                                       <select id="media_type" name="media_type" onchange="changedType(this.value);generatePreview();">\r
+                                                                               <option value="flash">Flash</option>\r
+                                                                               <option value="qt">Quicktime</option>\r
+                                                                               <option value="shockwave">Shockware</option>\r
+                                                                               <option value="wmp">Windows Media</option>\r
+                                                                               <option value="rmp">Real Media</option>\r
+                                                                       </select>\r
+                                                               </td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                       <td><label for="src">{$lang_media_file}</label></td>\r
+                                                         <td>\r
+                                                                       <table border="0" cellspacing="0" cellpadding="0">\r
+                                                                         <tr>\r
+                                                                               <td><input id="src" name="src" type="text" value="" onchange="switchType(this.value);generatePreview();" /></td>\r
+                                                                               <td id="filebrowsercontainer">&nbsp;</td>\r
+                                                                         </tr>\r
+                                                                       </table>\r
+                                                               </td>\r
+                                                       </tr>\r
+                                                       <tr id="linklistrow">\r
+                                                               <td><label for="linklist">{$lang_media_list}</label></td>\r
+                                                               <td id="linklistcontainer">&nbsp;</td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><label for="width">{$lang_media_size}</label></td>\r
+                                                               <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="text" id="width" name="width" value="" class="size" onchange="generatePreview('width');" /> x <input type="text" id="height" name="height" value="" class="size"  onchange="generatePreview('height');" /></td>\r
+                                                                               <td>&nbsp;&nbsp;<input id="constrain" type="checkbox" name="constrain" class="checkbox" /></td>\r
+                                                                               <td><label id="constrainlabel" for="constrain">{$lang_media_constrain_proportions}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{$lang_media_preview}</legend>\r
+                                       <div id="prev"></div>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_media_advanced}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0" width="100%">\r
+                                               <tr>\r
+                                                       <td><label for="id">{$lang_media_id}</label></td>\r
+                                                       <td><input type="text" id="id" name="id" onchange="generatePreview();" /></td>\r
+                                                       <td><label for="name">{$lang_media_name}</label></td>\r
+                                                       <td><input type="text" id="name" name="name" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="align">{$lang_media_align}</label></td>\r
+                                                       <td>\r
+                                                               <select id="align" name="align" onchange="generatePreview();">\r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="top">{$lang_media_align_top}</option>\r
+                                                                       <option value="right">{$lang_media_align_right}</option>\r
+                                                                       <option value="bottom">{$lang_media_align_bottom}</option>\r
+                                                                       <option value="left">{$lang_media_align_left}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="bgcolor">{$lang_media_bgcolor}</label></td>\r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');generatePreview();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="vspace">{$lang_media_vspace}</label></td>\r
+                                                       <td><input type="text" id="vspace" name="vspace" class="number" onchange="generatePreview();" /></td>\r
+                                                       <td><label for="hspace">{$lang_media_hspace}</label></td>\r
+                                                       <td><input type="text" id="hspace" name="hspace" class="number" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="flash_options">\r
+                                       <legend>{$lang_media_flash_options}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="flash_quality">{$lang_media_quality}</label></td>\r
+                                                       <td>\r
+                                                               <select id="flash_quality" name="flash_quality" onchange="generatePreview();">\r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="high">high</option>\r
+                                                                       <option value="low">low</option>\r
+                                                                       <option value="autolow">autolow</option>\r
+                                                                       <option value="autohigh">autohigh</option>\r
+                                                                       <option value="best">best</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="flash_scale">{$lang_media_scale}</label></td>\r
+                                                       <td>\r
+                                                               <select id="flash_scale" name="flash_scale" onchange="generatePreview();">\r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="showall">showall</option>\r
+                                                                       <option value="noborder">noborder</option>\r
+                                                                       <option value="exactfit">exactfit</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="flash_wmode">{$lang_media_wmode}</label></td>\r
+                                                       <td>\r
+                                                               <select id="flash_wmode" name="flash_wmode" onchange="generatePreview();">\r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="window">window</option>\r
+                                                                       <option value="opaque">opaque</option>\r
+                                                                       <option value="transparent">transparent</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="flash_salign">{$lang_media_salign}</label></td>\r
+                                                       <td>\r
+                                                               <select id="flash_salign" name="flash_salign" onchange="generatePreview();">\r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="l">{$lang_media_align_left}</option>\r
+                                                                       <option value="t">{$lang_media_align_top}</option>\r
+                                                                       <option value="r">{$lang_media_align_right}</option>\r
+                                                                       <option value="b">{$lang_media_align_bottom}</option>\r
+                                                                       <option value="tl">{$lang_media_align_top_left}</option>\r
+                                                                       <option value="tr">{$lang_media_align_top_right}</option>\r
+                                                                       <option value="bl">{$lang_media_align_bottom_left}</option>\r
+                                                                       <option value="br">{$lang_media_align_bottom_right}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="flash_play" name="flash_play" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flash_play">{$lang_media_play}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="flash_loop" name="flash_loop" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flash_loop">{$lang_media_loop}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="flash_menu" name="flash_menu" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flash_menu">{$lang_media_menu}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="flash_swliveconnect" name="flash_swliveconnect" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flash_swliveconnect">{$lang_media_liveconnect}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <table>\r
+                                               <tr>\r
+                                                       <td><label for="flash_base">{$lang_media_base}</label></td>\r
+                                                       <td><input type="text" id="flash_base" name="flash_base" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="flash_flashvars">{$lang_media_flashvars}</label></td>\r
+                                                       <td><input type="text" id="flash_flashvars" name="flash_flashvars" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="qt_options">\r
+                                       <legend>{$lang_media_qt_options}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_loop" name="qt_loop" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_loop">{$lang_media_loop}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_autoplay" name="qt_autoplay" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_autoplay">{$lang_media_play}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_cache" name="qt_cache" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_cache">{$lang_media_cache}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_controller" name="qt_controller" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_controller">{$lang_media_controller}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_correction" name="qt_correction" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_correction">{$lang_media_correction}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_enablejavascript" name="qt_enablejavascript" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_enablejavascript">{$lang_media_enablejavascript}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_kioskmode" name="qt_kioskmode" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_kioskmode">{$lang_media_kioskmode}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_autohref" name="qt_autohref" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_autohref">{$lang_media_autohref}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_playeveryframe" name="qt_playeveryframe" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_playeveryframe">{$lang_media_playeveryframe}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_targetcache" name="qt_targetcache" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_targetcache">{$lang_media_targetcache}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="qt_scale">{$lang_media_scale}</label></td>\r
+                                                       <td><select id="qt_scale" name="qt_scale" class="mceEditableSelect" onchange="generatePreview();">\r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="tofit">tofit</option>\r
+                                                                       <option value="aspect">aspect</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">&nbsp;</td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="qt_starttime">{$lang_media_starttime}</label></td>\r
+                                                       <td><input type="text" id="qt_starttime" name="qt_starttime" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="qt_endtime">{$lang_media_endtime}</label></td>\r
+                                                       <td><input type="text" id="qt_endtime" name="qt_endtime" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="qt_target">{$lang_media_target}</label></td>\r
+                                                       <td><input type="text" id="qt_target" name="qt_target" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="qt_href">{$lang_media_href}</label></td>\r
+                                                       <td><input type="text" id="qt_href" name="qt_href" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="qt_qtsrcchokespeed">{$lang_media_qtsrcchokespeed}</label></td>\r
+                                                       <td><input type="text" id="qt_qtsrcchokespeed" name="qt_qtsrcchokespeed" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="qt_volume">{$lang_media_volume}</label></td>\r
+                                                       <td><input type="text" id="qt_volume" name="qt_volume" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="qt_qtsrc">{$lang_media_qtsrc}</label></td>\r
+                                                       <td colspan="4">\r
+                                                       <table border="0" cellspacing="0" cellpadding="0">\r
+                                                                 <tr>\r
+                                                                       <td><input type="text" id="qt_qtsrc" name="qt_qtsrc" onchange="generatePreview();" /></td>\r
+                                                                       <td id="qtsrcfilebrowsercontainer">&nbsp;</td>\r
+                                                                 </tr>\r
+                                                       </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="wmp_options">\r
+                                       <legend>{$lang_media_wmp_options}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_autostart" name="wmp_autostart" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_autostart">{$lang_media_autostart}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_enabled" name="wmp_enabled" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_enabled">{$lang_media_enabled}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_enablecontextmenu" name="wmp_enablecontextmenu" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_enablecontextmenu">{$lang_media_menu}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_fullscreen" name="wmp_fullscreen" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_fullscreen">{$lang_media_fullscreen}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_invokeurls" name="wmp_invokeurls" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_invokeurls">{$lang_media_invokeurls}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_mute" name="wmp_mute" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_mute">{$lang_media_mute}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_stretchtofit" name="wmp_stretchtofit" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_stretchtofit">{$lang_media_stretchtofit}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_windowlessvideo" name="wmp_windowlessvideo" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_windowlessvideo">{$lang_media_windowlessvideo}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="wmp_balance">{$lang_media_balance}</label></td>\r
+                                                       <td><input type="text" id="wmp_balance" name="wmp_balance" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="wmp_baseurl">{$lang_media_baseurl}</label></td>\r
+                                                       <td><input type="text" id="wmp_baseurl" name="wmp_baseurl" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="wmp_captioningid">{$lang_media_captioningid}</label></td>\r
+                                                       <td><input type="text" id="wmp_captioningid" name="wmp_captioningid" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="wmp_currentmarker">{$lang_media_currentmarker}</label></td>\r
+                                                       <td><input type="text" id="wmp_currentmarker" name="wmp_currentmarker" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="wmp_currentposition">{$lang_media_currentposition}</label></td>\r
+                                                       <td><input type="text" id="wmp_currentposition" name="wmp_currentposition" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="wmp_defaultframe">{$lang_media_defaultframe}</label></td>\r
+                                                       <td><input type="text" id="wmp_defaultframe" name="wmp_defaultframe" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="wmp_playcount">{$lang_media_playcount}</label></td>\r
+                                                       <td><input type="text" id="wmp_playcount" name="wmp_playcount" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="wmp_rate">{$lang_media_rate}</label></td>\r
+                                                       <td><input type="text" id="wmp_rate" name="wmp_rate" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="wmp_uimode">{$lang_media_uimode}</label></td>\r
+                                                       <td><input type="text" id="wmp_uimode" name="wmp_uimode" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="wmp_volume">{$lang_media_volume}</label></td>\r
+                                                       <td><input type="text" id="wmp_volume" name="wmp_volume" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="rmp_options">\r
+                                       <legend>{$lang_media_rmp_options}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_autostart" name="rmp_autostart" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_autostart">{$lang_media_autostart}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_loop" name="rmp_loop" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_loop">{$lang_media_loop}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_autogotourl" name="rmp_autogotourl" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_autogotourl">{$lang_media_autogotourl}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_center" name="rmp_center" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_center">{$lang_media_center}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_imagestatus" name="rmp_imagestatus" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_imagestatus">{$lang_media_imagestatus}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_maintainaspect" name="rmp_maintainaspect" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_maintainaspect">{$lang_media_maintainaspect}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_nojava" name="rmp_nojava" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_nojava">{$lang_media_nojava}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_prefetch" name="rmp_prefetch" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_prefetch">{$lang_media_prefetch}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_shuffle" name="rmp_shuffle" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_shuffle">{$lang_media_shuffle}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               &nbsp;\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="rmp_console">{$lang_media_console}</label></td>\r
+                                                       <td><input type="text" id="rmp_console" name="rmp_console" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="rmp_controls">{$lang_media_controls}</label></td>\r
+                                                       <td><input type="text" id="rmp_controls" name="rmp_controls" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="rmp_numloop">{$lang_media_numloop}</label></td>\r
+                                                       <td><input type="text" id="rmp_numloop" name="rmp_numloop" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="rmp_scriptcallbacks">{$lang_media_scriptcallbacks}</label></td>\r
+                                                       <td><input type="text" id="rmp_scriptcallbacks" name="rmp_scriptcallbacks" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="shockwave_options">\r
+                                       <legend>{$lang_media_shockwave_options}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="shockwave_swstretchstyle">{$lang_media_swstretchstyle}</label></td>\r
+                                                       <td>\r
+                                                               <select id="shockwave_swstretchstyle" name="shockwave_swstretchstyle" onchange="generatePreview();">\r
+                                                                       <option value="none">{$lang_not_set}</option>\r
+                                                                       <option value="meet">Meet</option>\r
+                                                                       <option value="fill">Fill</option>\r
+                                                                       <option value="stage">Stage</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="shockwave_swvolume">{$lang_media_volume}</label></td>\r
+                                                       <td><input type="text" id="shockwave_swvolume" name="shockwave_swvolume" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="shockwave_swstretchhalign">{$lang_media_swstretchhalign}</label></td>\r
+                                                       <td>\r
+                                                               <select id="shockwave_swstretchhalign" name="shockwave_swstretchhalign" onchange="generatePreview();">\r
+                                                                       <option value="none">{$lang_not_set}</option>\r
+                                                                       <option value="left">{$lang_media_align_left}</option>\r
+                                                                       <option value="center">{$lang_media_align_center}</option>\r
+                                                                       <option value="right">{$lang_media_align_right}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="shockwave_swstretchvalign">{$lang_media_swstretchvalign}</label></td>\r
+                                                       <td>\r
+                                                               <select id="shockwave_swstretchvalign" name="shockwave_swstretchvalign" onchange="generatePreview();">\r
+                                                                       <option value="none">{$lang_not_set}</option>\r
+                                                                       <option value="meet">Meet</option>\r
+                                                                       <option value="fill">Fill</option>\r
+                                                                       <option value="stage">Stage</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="shockwave_autostart" name="shockwave_autostart" onchange="generatePreview();" checked="checked" /></td>\r
+                                                                               <td><label for="shockwave_autostart">{$lang_media_autostart}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="shockwave_sound" name="shockwave_sound" onchange="generatePreview();" checked="checked" /></td>\r
+                                                                               <td><label for="shockwave_sound">{$lang_media_sound}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="shockwave_swliveconnect" name="shockwave_swliveconnect" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="shockwave_swliveconnect">{$lang_media_liveconnect}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="shockwave_progress" name="shockwave_progress" onchange="generatePreview();" checked="checked" /></td>\r
+                                                                               <td><label for="shockwave_progress">{$lang_media_progress}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertMedia();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/nonbreaking/editor_plugin.js b/program/js/tiny_mce/plugins/nonbreaking/editor_plugin.js
new file mode 100644 (file)
index 0000000..5b12797
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('nonbreaking');var TinyMCE_NonBreakingPlugin={getInfo:function(){return{longname:'Nonbreaking space',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(cn){switch(cn){case"nonbreaking":return tinyMCE.getButtonHTML(cn,'lang_nonbreaking_desc','{$pluginurl}/images/nonbreaking.gif','mceNonBreaking',false)}return""},execCommand:function(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id),h;switch(command){case"mceNonBreaking":h=(inst.visualChars&&inst.visualChars.state)?'<span class="mceItemHiddenVisualChar">&middot;</span>':'&nbsp;';tinyMCE.execInstanceCommand(editor_id,'mceInsertContent',false,h);return true}return false},handleEvent:function(e){var inst,h;if(!tinyMCE.isOpera&&e.type=='keydown'&&e.keyCode==9&&tinyMCE.getParam('nonbreaking_force_tab',false)){inst=tinyMCE.selectedInstance;h=(inst.visualChars&&inst.visualChars.state)?'<span class="mceItemHiddenVisualChar">&middot;&middot;&middot;</span>':'&nbsp;&nbsp;&nbsp;';tinyMCE.execInstanceCommand(inst.editorId,'mceInsertContent',false,h);tinyMCE.cancelEvent(e);return false}return true}};tinyMCE.addPlugin("nonbreaking",TinyMCE_NonBreakingPlugin);
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/nonbreaking/editor_plugin_src.js b/program/js/tiny_mce/plugins/nonbreaking/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..73d5478
--- /dev/null
@@ -0,0 +1,62 @@
+/**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('nonbreaking');\r
+\r
+var TinyMCE_NonBreakingPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Nonbreaking space',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "nonbreaking":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_nonbreaking_desc', '{$pluginurl}/images/nonbreaking.gif', 'mceNonBreaking', false);\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               var inst = tinyMCE.getInstanceById(editor_id), h;\r
+\r
+               switch (command) {\r
+                       case "mceNonBreaking":\r
+                               h = (inst.visualChars && inst.visualChars.state) ? '<span class="mceItemHiddenVisualChar">&middot;</span>' : '&nbsp;';\r
+                               tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, h);\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       handleEvent : function(e) {\r
+               var inst, h;\r
+\r
+               if (!tinyMCE.isOpera && e.type == 'keydown' && e.keyCode == 9 && tinyMCE.getParam('nonbreaking_force_tab', false)) {\r
+                       inst = tinyMCE.selectedInstance;\r
+\r
+                       h = (inst.visualChars && inst.visualChars.state) ? '<span class="mceItemHiddenVisualChar">&middot;&middot;&middot;</span>' : '&nbsp;&nbsp;&nbsp;';\r
+                       tinyMCE.execInstanceCommand(inst.editorId, 'mceInsertContent', false, h);\r
+\r
+                       tinyMCE.cancelEvent(e);\r
+                       return false;\r
+               }\r
+\r
+               return true;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("nonbreaking", TinyMCE_NonBreakingPlugin);\r
diff --git a/program/js/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif b/program/js/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif
new file mode 100644 (file)
index 0000000..a731fc9
Binary files /dev/null and b/program/js/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif differ
diff --git a/program/js/tiny_mce/plugins/nonbreaking/langs/en.js b/program/js/tiny_mce/plugins/nonbreaking/langs/en.js
new file mode 100644 (file)
index 0000000..fd49a64
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('nonbreaking',{\r
+desc : 'Insert non-breaking space character'\r
+});\r
diff --git a/program/js/tiny_mce/plugins/readme.txt b/program/js/tiny_mce/plugins/readme.txt
new file mode 100644 (file)
index 0000000..b694fdb
--- /dev/null
@@ -0,0 +1 @@
+This is the location you place TinyMCE plugins.\r
diff --git a/program/js/tiny_mce/plugins/searchreplace/css/searchreplace.css b/program/js/tiny_mce/plugins/searchreplace/css/searchreplace.css
new file mode 100644 (file)
index 0000000..4c7bd13
--- /dev/null
@@ -0,0 +1,20 @@
+/* stylesheet for advsearchreplace plugin*/\r
+\r
+.panel_wrapper { height: 85px; }\r
+.panel_wrapper div.current { height: 85px; }\r
+\r
+/* MS IE only styles */\r
+* html .panel_wrapper { height: 100px; }\r
+* html .panel_wrapper div.current { height: 100px; }\r
+\r
+#replaceBtn, #replaceAllBtn {\r
+       padding-bottom: 2px;\r
+       font-weight: bold;\r
+       width: 90px;\r
+       height: 21px;\r
+       border: 0;\r
+       cursor: pointer;\r
+}\r
+\r
+#replaceBtn { background: url(../images/replace_button_bg.gif); }\r
+#replaceAllBtn { background: url(../images/replace_all_button_bg.gif); }\r
diff --git a/program/js/tiny_mce/plugins/searchreplace/editor_plugin.js b/program/js/tiny_mce/plugins/searchreplace/editor_plugin.js
new file mode 100644 (file)
index 0000000..959e9cc
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('searchreplace');var TinyMCE_SearchReplacePlugin={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}},initInstance:function(inst){inst.addShortcut('ctrl','f','lang_searchreplace_search_desc','mceSearch',true);},getControlHTML:function(cn){switch(cn){case"search":return tinyMCE.getButtonHTML(cn,'lang_searchreplace_search_desc','{$pluginurl}/images/search.gif','mceSearch',true);case"replace":return tinyMCE.getButtonHTML(cn,'lang_searchreplace_replace_desc','{$pluginurl}/images/replace.gif','mceSearchReplace',true)}return""},execCommand:function(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id),selectedText=inst.selection.getSelectedText(),rng;function defValue(key,default_value){value[key]=typeof(value[key])=="undefined"?default_value:value[key]}function replaceSel(search_str,str,back){if(!inst.selection.isCollapsed()){if(tinyMCE.isRealIE)inst.selection.getRng().duplicate().pasteHTML(str);else inst.execCommand('mceInsertContent',false,str)}}if(!value)value=[];defValue("editor_id",editor_id);defValue("searchstring",selectedText);defValue("replacestring",null);defValue("replacemode","none");defValue("casesensitive",false);defValue("backwards",false);defValue("wrap",false);defValue("wholeword",false);defValue("inline","yes");defValue("resizable","no");switch(command){case"mceSearch":if(user_interface){var template=new Array();template['file']='../../plugins/searchreplace/searchreplace.htm';template['width']=380;template['height']=155+(tinyMCE.isNS7?20:0)+(tinyMCE.isMSIE?15:0);template['width']+=tinyMCE.getLang('lang_searchreplace_delta_width',0);template['height']+=tinyMCE.getLang('lang_searchreplace_delta_height',0);inst.selection.collapse(true);tinyMCE.openWindow(template,value)}else{var win=tinyMCE.getInstanceById(editor_id).contentWindow;var doc=tinyMCE.getInstanceById(editor_id).contentWindow.document;var body=tinyMCE.getInstanceById(editor_id).contentWindow.document.body;var awin=value.win,found;if(body.innerHTML==""){awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));return true}if(value['replacemode']=="current"){replaceSel(value['string'],value['replacestring'],value['backwards']);value['replacemode']="none";}inst.selection.collapse(value['backwards']);if(tinyMCE.isMSIE){var rng=inst.selection.getRng();var flags=0;if(value['wholeword'])flags=flags|2;if(value['casesensitive'])flags=flags|4;if(!rng.findText){awin.alert('This operation is currently not supported by this browser.');return true}if(value['replacemode']=="all"){found=false;while(rng.findText(value['string'],value['backwards']?-1:1,flags)){found=true;rng.scrollIntoView();rng.select();replaceSel(value['string'],value['replacestring'],value['backwards'])}if(found)awin.alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));else awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));return true}if(rng.findText(value['string'],value['backwards']?-1:1,flags)){rng.scrollIntoView();rng.select()}else awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'))}else{if(value['replacemode']=="all"){found=false;while(win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false)){found=true;replaceSel(value['string'],value['replacestring'],value['backwards'])}if(found)awin.alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));else awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));return true}if(!win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false))awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'))}}return true;case"mceSearchReplace":value['replacestring']="";tinyMCE.execInstanceCommand(editor_id,'mceSearch',user_interface,value,false);return true}return false}};tinyMCE.addPlugin("searchreplace",TinyMCE_SearchReplacePlugin);
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js b/program/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..cd2f3a8
--- /dev/null
@@ -0,0 +1,173 @@
+/**\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
+tinyMCE.importPluginLanguagePack('searchreplace');\r
+\r
+var TinyMCE_SearchReplacePlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Search/Replace',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function (inst) {\r
+               inst.addShortcut('ctrl', 'f', 'lang_searchreplace_search_desc', 'mceSearch', true);\r
+               // No CTRL+R for "replace" because browsers will reload page instead of executing plugin\r
+       },\r
+\r
+       getControlHTML : function (cn) {\r
+               switch (cn) {\r
+                       case "search" :\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_searchreplace_search_desc', '{$pluginurl}/images/search.gif','mceSearch', true);\r
+\r
+                       case "replace" :\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_searchreplace_replace_desc', '{$pluginurl}/images/replace.gif', 'mceSearchReplace', true);\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function (editor_id, element, command, user_interface, value) {\r
+               var inst = tinyMCE.getInstanceById(editor_id), selectedText = inst.selection.getSelectedText(), rng;\r
+\r
+               function defValue(key, default_value) {\r
+                       value[key] = typeof(value[key]) == "undefined" ? default_value : value[key];\r
+               }\r
+\r
+               function replaceSel(search_str, str, back) {\r
+                       if (!inst.selection.isCollapsed()) {\r
+                               if (tinyMCE.isRealIE)\r
+                                       inst.selection.getRng().duplicate().pasteHTML(str); // Needs to be duplicated due to selection bug in IE\r
+                               else\r
+                                       inst.execCommand('mceInsertContent', false, str);\r
+                       }\r
+               }\r
+\r
+               if (!value)\r
+                       value = [];\r
+\r
+               defValue("editor_id", editor_id);\r
+               defValue("searchstring", selectedText);\r
+               defValue("replacestring", null);\r
+               defValue("replacemode", "none");\r
+               defValue("casesensitive", false);\r
+               defValue("backwards", false);\r
+               defValue("wrap", false);\r
+               defValue("wholeword", false);\r
+               defValue("inline", "yes");\r
+               defValue("resizable", "no");\r
+\r
+               switch (command) {\r
+                       case "mceSearch" :\r
+                               if (user_interface) {\r
+                                       var template = new Array();\r
+\r
+                                       template['file'] = '../../plugins/searchreplace/searchreplace.htm';\r
+                                       template['width'] = 380;\r
+                                       template['height'] = 155 + (tinyMCE.isNS7 ? 20 : 0) + (tinyMCE.isMSIE ? 15 : 0);\r
+                                       template['width'] += tinyMCE.getLang('lang_searchreplace_delta_width', 0);\r
+                                       template['height'] += tinyMCE.getLang('lang_searchreplace_delta_height', 0);\r
+\r
+                                       inst.selection.collapse(true);\r
+\r
+                                       tinyMCE.openWindow(template, value);\r
+                               } else {\r
+                                       var win = tinyMCE.getInstanceById(editor_id).contentWindow;\r
+                                       var doc = tinyMCE.getInstanceById(editor_id).contentWindow.document;\r
+                                       var body = tinyMCE.getInstanceById(editor_id).contentWindow.document.body;\r
+                                       var awin = value.win, found;\r
+\r
+                                       if (body.innerHTML == "") {\r
+                                               awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));\r
+                                               return true;\r
+                                       }\r
+\r
+                                       if (value['replacemode'] == "current") {\r
+                                               replaceSel(value['string'], value['replacestring'], value['backwards']);\r
+                                               value['replacemode'] = "none";\r
+                                               //tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value);\r
+                                               //return true;\r
+                                       }\r
+\r
+                                       inst.selection.collapse(value['backwards']);\r
+\r
+                                       if (tinyMCE.isMSIE) {\r
+                                               var rng = inst.selection.getRng();\r
+                                               var flags = 0;\r
+                                               if (value['wholeword'])\r
+                                                       flags = flags | 2;\r
+\r
+                                               if (value['casesensitive'])\r
+                                                       flags = flags | 4;\r
+\r
+                                               if (!rng.findText) {\r
+                                                       awin.alert('This operation is currently not supported by this browser.');\r
+                                                       return true;\r
+                                               }\r
+\r
+                                               if (value['replacemode'] == "all") {\r
+                                                       found = false;\r
+\r
+                                                       while (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) {\r
+                                                               found = true;\r
+                                                               rng.scrollIntoView();\r
+                                                               rng.select();\r
+                                                               replaceSel(value['string'], value['replacestring'], value['backwards']);\r
+                                                       }\r
+\r
+                                                       if (found)\r
+                                                               awin.alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));\r
+                                                       else\r
+                                                               awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));\r
+\r
+                                                       return true;\r
+                                               }\r
+\r
+                                               if (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) {\r
+                                                       rng.scrollIntoView();\r
+                                                       rng.select();\r
+                                               } else\r
+                                                       awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));\r
+                                       } else {\r
+                                               if (value['replacemode'] == "all") {\r
+                                                       found = false;\r
+\r
+                                                       while (win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false)) {\r
+                                                               found = true;\r
+                                                               replaceSel(value['string'], value['replacestring'], value['backwards']);\r
+                                                       }\r
+\r
+                                                       if (found)\r
+                                                               awin.alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));\r
+                                                       else\r
+                                                               awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));\r
+\r
+                                                       return true;\r
+                                               }\r
+\r
+                                               if (!win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false))\r
+                                                       awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));\r
+                                       }\r
+                               }\r
+\r
+                               return true;\r
+\r
+                       case "mceSearchReplace" :\r
+                               value['replacestring'] = "";\r
+                               tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value, false);\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("searchreplace", TinyMCE_SearchReplacePlugin);
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/images/replace.gif b/program/js/tiny_mce/plugins/searchreplace/images/replace.gif
new file mode 100644 (file)
index 0000000..784c73e
Binary files /dev/null and b/program/js/tiny_mce/plugins/searchreplace/images/replace.gif differ
diff --git a/program/js/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif b/program/js/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif
new file mode 100644 (file)
index 0000000..123fa5b
Binary files /dev/null and b/program/js/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif differ
diff --git a/program/js/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif b/program/js/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif
new file mode 100644 (file)
index 0000000..cc2c56e
Binary files /dev/null and b/program/js/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif differ
diff --git a/program/js/tiny_mce/plugins/searchreplace/images/search.gif b/program/js/tiny_mce/plugins/searchreplace/images/search.gif
new file mode 100644 (file)
index 0000000..cfe76b5
Binary files /dev/null and b/program/js/tiny_mce/plugins/searchreplace/images/search.gif differ
diff --git a/program/js/tiny_mce/plugins/searchreplace/jscripts/searchreplace.js b/program/js/tiny_mce/plugins/searchreplace/jscripts/searchreplace.js
new file mode 100644 (file)
index 0000000..ac6cdf6
--- /dev/null
@@ -0,0 +1,86 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       // start with appropiate tab\r
+       var task = (tinyMCE.getWindowArg("replacestring") != null) ? "replace" : "search";\r
+       mcTabs.displayTab(task + '_tab', task +'_panel');\r
+       manageReplaceButtons();\r
+       \r
+       var formObj = document.forms[0];\r
+\r
+       formObj[task + "_panel_searchstring"].value = tinyMCE.getWindowArg("searchstring");\r
+       formObj["replace_panel_replacestring"].value = (tinyMCE.getWindowArg("replacestring") != null) ? tinyMCE.getWindowArg("replacestring") : "";\r
+       formObj[task + "_panel_casesensitivebox"].checked = tinyMCE.getWindowArg("casesensitive");\r
+       formObj[task + "_panel_backwardsu"].checked = tinyMCE.getWindowArg("backwards");\r
+       formObj[task + "_panel_backwardsd"].checked = !tinyMCE.getWindowArg("backwards");\r
+}\r
+\r
+function searchNext(replacemode) {\r
+       // "search" or "replace" mode of operation?\r
+       var task = (document.getElementById("search_tab").className == "current") ? "search" : "replace";\r
+\r
+       var formObj = document.forms[0];\r
+\r
+       if (task == "replace") {\r
+               // Whats the point?\r
+               if (formObj[task + "_panel_searchstring"].value == "" || formObj[task + "_panel_searchstring"].value == formObj[task + "_panel_replacestring"].value)\r
+                       return false;\r
+       }\r
+\r
+       // Do search\r
+       tinyMCEPopup.execCommand('mceSearch', false, { \r
+               string : formObj[task + "_panel_searchstring"].value,\r
+               replacestring : formObj["replace_panel_replacestring"].value,\r
+               replacemode : replacemode,\r
+               casesensitive : formObj[task + "_panel_casesensitivebox"].checked,\r
+               backwards : formObj[task + "_panel_backwardsu"].checked,\r
+               win : window\r
+               }, false);\r
+\r
+       window.focus();\r
+\r
+       return false;\r
+}\r
+\r
+function cancelAction() {\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function manageReplaceButtons() {\r
+       // "search" or "replace" mode of operation?\r
+       var task = (document.getElementById("search_tab").className == "current") ? "search" : "replace";\r
+       document.getElementById("replace_buttons").style.visibility = (task == "replace") ? "visible" : "hidden";\r
+}\r
+\r
+function copyValues(link) {\r
+       // check if tab is already active\r
+       var tab = link;\r
+       while (tab.tagName && tab.tagName.toLowerCase() != "li") tab = tab.parentNode;\r
+       if (tab.className) return false; // tab is already active -> no need to copy any values!\r
+\r
+       // copy values from one panel to the other (if they exist there)\r
+       var from_panel_name = tab.id.match(/^search/i) ? "replace_panel" : "search_panel";\r
+       var to_panel_name = (from_panel_name == "search_panel") ? "replace_panel" : "search_panel";\r
+\r
+       // find all elements with IDs to copy their values\r
+       var elms = document.getElementById(from_panel_name).getElementsByTagName("*");\r
+       for (var i = 0; i < elms.length; i++) {\r
+               if (elms[i].id && elms[i].id != "") {\r
+                       var checked = "undefined";\r
+                       if (elms[i].type.toLowerCase() == "checkbox" || elms[i].type.toLowerCase() == "radio")\r
+                               checked = elms[i].checked;\r
+\r
+                       // copy values if element exists in other panel\r
+                       var to_elm_name = to_panel_name + elms[i].id.substring(from_panel_name.length, elms[i].id.length);\r
+                       var to_elm = document.getElementById(to_elm_name);\r
+                       if (to_elm) {\r
+                               if (checked != "undefined")\r
+                                       to_elm.checked = checked;\r
+                               else\r
+                                       to_elm.value = elms[i].value;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return false;\r
+}
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/en.js b/program/js/tiny_mce/plugins/searchreplace/langs/en.js
new file mode 100644 (file)
index 0000000..32af828
--- /dev/null
@@ -0,0 +1,21 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Find',\r
+searchreplace_searchnext_desc : 'Find again',\r
+searchreplace_replace_desc : 'Find/Replace',\r
+searchreplace_notfound : 'The search has been completed. The search string could not be found.',\r
+searchreplace_search_title : 'Find',\r
+searchreplace_replace_title : 'Find/Replace',\r
+searchreplace_allreplaced : 'All occurrences of the search string were replaced.',\r
+searchreplace_findwhat : 'Find what',\r
+searchreplace_replacewith : 'Replace with',\r
+searchreplace_direction : 'Direction',\r
+searchreplace_up : 'Up',\r
+searchreplace_down : 'Down',\r
+searchreplace_case : 'Match case',\r
+searchreplace_findnext : 'Find&nbsp;next',\r
+searchreplace_replace : 'Replace',\r
+searchreplace_replaceall : 'Replace&nbsp;all',\r
+searchreplace_cancel : 'Cancel'\r
+});\r
diff --git a/program/js/tiny_mce/plugins/searchreplace/readme.txt b/program/js/tiny_mce/plugins/searchreplace/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/program/js/tiny_mce/plugins/searchreplace/searchreplace.htm b/program/js/tiny_mce/plugins/searchreplace/searchreplace.htm
new file mode 100644 (file)
index 0000000..192e0cb
--- /dev/null
@@ -0,0 +1,107 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_searchreplace_replace_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/searchreplace.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/searchreplace.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none; margin: 4px;">\r
+<form onsubmit="return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="search_tab"><span><a href="javascript:mcTabs.displayTab('search_tab','search_panel');manageReplaceButtons();" onmousedown="return copyValues(this);">{$lang_searchreplace_search_desc}</a></span></li>\r
+                       <li id="replace_tab"><span><a href="javascript:mcTabs.displayTab('replace_tab','replace_panel');manageReplaceButtons();" onmousedown="return copyValues(this);">{$lang_searchreplace_replace}</a></span></li>\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+\r
+               <div id="search_panel" class="panel">\r
+                       <table border="0" cellspacing="0" cellpadding="2">\r
+                               <tr>\r
+                                       <td><label for="search_panel_searchstring">{$lang_searchreplace_findwhat}</label></td>\r
+                                       <td><input type="text" id="search_panel_searchstring" name="search_panel_searchstring" style="width: 200px" /></td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td colspan="2">\r
+                                               <table border="0" cellspacing="0" cellpadding="0" class="direction">\r
+                                                       <tr>\r
+                                                               <td><label>{$lang_searchreplace_direction}</label></td>\r
+                                                               <td><input id="search_panel_backwardsu" name="search_panel_backwards" class="radio" type="radio" /></td>\r
+                                                               <td><label for="search_panel_backwardsu">{$lang_searchreplace_up}</label></td>\r
+                                                               <td><input id="search_panel_backwardsd" name="search_panel_backwards" class="radio" type="radio" /></td>\r
+                                                               <td><label for="search_panel_backwardsd">{$lang_searchreplace_down}</label></td>\r
+                                                       </tr>\r
+                                               </table>\r
+                                       </td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td colspan="2">\r
+                                               <table border="0" cellspacing="0" cellpadding="0">\r
+                                                       <tr>\r
+                                                               <td><input id="search_panel_casesensitivebox" name="search_panel_casesensitivebox" class="checkbox" type="checkbox" /></td>\r
+                                                               <td><label for="search_panel_casesensitivebox">{$lang_searchreplace_case}</label></td>\r
+                                                       </tr>\r
+                                               </table>\r
+                                       </td>\r
+                               </tr>\r
+                       </table>\r
+               </div>\r
+\r
+               <div id="replace_panel" class="panel">\r
+                       <table border="0" cellspacing="0" cellpadding="2">\r
+                               <tr>\r
+                                       <td><label for="replace_panel_searchstring">{$lang_searchreplace_findwhat}</label></td>\r
+                                       <td><input type="text" id="replace_panel_searchstring" name="replace_panel_searchstring" style="width: 200px" /></td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td><label for="replace_panel_replacestring">{$lang_searchreplace_replacewith}</label></td>\r
+                                       <td><input type="text" id="replace_panel_replacestring" name="replace_panel_replacestring" style="width: 200px" /></td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td colspan="2">\r
+                                               <table border="0" cellspacing="0" cellpadding="0" class="direction">\r
+                                                       <tr>\r
+                                                               <td><label>{$lang_searchreplace_direction}</label></td>\r
+                                                               <td><input id="replace_panel_backwardsu" name="replace_panel_backwards" class="radio" type="radio" /></td>\r
+                                                               <td><label for="replace_panel_backwardsu">{$lang_searchreplace_up}</label></td>\r
+                                                               <td><input id="replace_panel_backwardsd" name="replace_panel_backwards" class="radio" type="radio" /></td>\r
+                                                               <td><label for="replace_panel_backwardsd">{$lang_searchreplace_down}</label></td>\r
+                                                       </tr>\r
+                                               </table>\r
+                                       </td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td colspan="2">\r
+                                               <table border="0" cellspacing="0" cellpadding="0">\r
+                                                       <tr>\r
+                                                               <td><input id="replace_panel_casesensitivebox" name="replace_panel_casesensitivebox" class="checkbox" type="checkbox" /></td>\r
+                                                               <td><label for="replace_panel_casesensitivebox">{$lang_searchreplace_case}</label></td>\r
+                                                       </tr>\r
+                                               </table>\r
+                                       </td>\r
+                               </tr>\r
+                       </table>\r
+               </div>\r
+\r
+       </div>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_searchreplace_findnext}" onclick="searchNext('none');" />\r
+                       <span id="replace_buttons">\r
+                               <input type="button" id="replaceBtn" name="replaceBtn" value="{$lang_searchreplace_replace}" onclick="searchNext('current');" />\r
+                               <input type="button" id="replaceAllBtn" name="replaceAllBtn" value="{$lang_searchreplace_replaceall}" onclick="searchNext('all');;" />\r
+                       </span>\r
+               </div>\r
+\r
+               <div style="float: right">      \r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_searchreplace_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/changelog b/program/js/tiny_mce/plugins/spellchecker/changelog
new file mode 100644 (file)
index 0000000..608fcd5
--- /dev/null
@@ -0,0 +1,11 @@
+Version 1.0.2 (2006-08-02)\r
+       Added new spellchecker_report_mispellings option, contributed by Jeremy B.\r
+       Fixed various regexp bugs and issues. Some where contributed by Jeremy B.\r
+       Fixed the Google speller class so it uses curl, patch contributed by Yuriy Kramar.\r
+       Fixed encoding issues with language specific characters, patch contributed by codepit.\r
+       Fixed bug where the spellchecker wasn't working in MSIE if the editor was placed in a P tag.\r
+Version 1.0.1 (2006-05-05)\r
+       Since sourceforge has a serious bug when it comes to replacing files with the same name this release was necessary.\r
+       Goggle spellchecker class was added.\r
+Version 1.0 (2006-05-03)\r
+       Official first release.\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/TinyGoogleSpell.class.php b/program/js/tiny_mce/plugins/spellchecker/classes/TinyGoogleSpell.class.php
new file mode 100644 (file)
index 0000000..7be9297
--- /dev/null
@@ -0,0 +1,107 @@
+<?php\r
+\r
+/* *\r
+ * Tiny Spelling Interface for TinyMCE Spell Checking.\r
+ *\r
+ * Copyright © 2006 Moxiecode Systems AB\r
+ */\r
+\r
+class TinyGoogleSpell {\r
+       var $lang;\r
+       var $spellurl;\r
+\r
+       function TinyGoogleSpell(& $config, $lang, $mode, $spelling, $jargon, $encoding) {\r
+               $this->lang = $lang;\r
+               $this->spellurl = $config['googlespell.url'];\r
+       }\r
+\r
+       // Returns array with bad words or false if failed.\r
+       function checkWords($word_array) {\r
+               $words = array ();\r
+               $wordstr = implode(' ', $word_array);\r
+\r
+               $matches = $this->_getMatches($wordstr);\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
+       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
+       // Returns array with suggestions or false if failed.\r
+       function getSuggestion($word) {\r
+               $sug = array ();\r
+\r
+               $matches = $this->_getMatches($word);\r
+\r
+               if (count($matches) > 0)\r
+                       $sug = explode("\t", utf8_encode($this->unhtmlentities($matches[0][4])));\r
+\r
+               return $sug;\r
+       }\r
+\r
+       function _xmlChars($string) {\r
+               $trans = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES);\r
+\r
+               foreach ($trans as $k => $v)\r
+                       $trans[$k] = "&#" . ord($k) . ";";\r
+\r
+               return strtr($string, $trans);\r
+       }\r
+\r
+       function _getMatches($word_list) {\r
+               $url = $this->spellurl . "&" . $this->lang;\r
+\r
+               $path = preg_replace("/^https?:\/\//i", "", $url);\r
+\r
+               // Setup XML request\r
+           $xml = '<?xml version="1.0" encoding="utf-8" ?><spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1"><text>' . $word_list . '</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
+               //$this->_debugData($xml);\r
+\r
+               $ch = curl_init();\r
+               curl_setopt($ch, CURLOPT_URL, $url);\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
+\r
+               //$this->_debugData($xml);\r
+\r
+               // Grab and parse content\r
+               preg_match_all('/<c o="([^"]*)" l="([^"]*)" s="([^"]*)">([^<]*)<\/c>/', $xml, $matches, PREG_SET_ORDER);\r
+\r
+               return $matches;\r
+       }\r
+\r
+       function _debugData($data) {\r
+               $fh = @ fopen("debug.log", 'a+');\r
+               @ fwrite($fh, $data);\r
+               @ fclose($fh);\r
+       }\r
+}\r
+\r
+// Setup classname, should be the same as the name of the spellchecker class\r
+$spellCheckerConfig['class'] = "TinyGoogleSpell";\r
+?>\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/TinyPspell.class.php b/program/js/tiny_mce/plugins/spellchecker/classes/TinyPspell.class.php
new file mode 100644 (file)
index 0000000..21fb194
--- /dev/null
@@ -0,0 +1,64 @@
+<?php\r
+/* * \r
+ * Tiny Spelling Interface for TinyMCE Spell Checking.\r
+ *\r
+ * Copyright © 2006 Moxiecode Systems AB\r
+ *\r
+ */\r
+\r
+class TinyPSpell {\r
+       var $lang;\r
+       var $mode;\r
+       var $string;\r
+       var $plink;\r
+       var $errorMsg;\r
+\r
+       var $jargon;\r
+       var $spelling;\r
+       var $encoding;\r
+\r
+       function TinyPSpell(&$config, $lang, $mode, $spelling, $jargon, $encoding) {\r
+               $this->lang = $lang;\r
+               $this->mode = $mode;\r
+               $this->plink = false;\r
+               $this->errorMsg = array();\r
+\r
+               if (!function_exists("pspell_new")) {\r
+                       $this->errorMsg[] = "PSpell not found.";\r
+                       return;\r
+               }\r
+\r
+               $this->plink = pspell_new($this->lang, $this->spelling, $this->jargon, $this->encoding, $this->mode);\r
+       }\r
+\r
+       // Returns array with bad words or false if failed.\r
+       function checkWords($wordArray) {\r
+               if (!$this->plink) {\r
+                       $this->errorMsg[] = "No PSpell link found for checkWords.";\r
+                       return array();\r
+               }\r
+\r
+               $wordError = array();\r
+               foreach($wordArray as $word) {\r
+                       if(!pspell_check($this->plink, trim($word)))\r
+                               $wordError[] = $word;\r
+               }\r
+\r
+               return $wordError;\r
+       }\r
+\r
+       // Returns array with suggestions or false if failed.\r
+       function getSuggestion($word) {\r
+               if (!$this->plink) {\r
+                       $this->errorMsg[] = "No PSpell link found for getSuggestion.";\r
+                       return array();\r
+               }\r
+\r
+               return pspell_suggest($this->plink, $word);\r
+       }\r
+}\r
+\r
+// Setup classname, should be the same as the name of the spellchecker class\r
+$spellCheckerConfig['class'] = "TinyPspell";\r
+\r
+?>
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/TinyPspellShell.class.php b/program/js/tiny_mce/plugins/spellchecker/classes/TinyPspellShell.class.php
new file mode 100644 (file)
index 0000000..348cac3
--- /dev/null
@@ -0,0 +1,121 @@
+<?php\r
+/* * \r
+ * Tiny Spelling Interface for TinyMCE Spell Checking.\r
+ *\r
+ * Copyright © 2006 Moxiecode Systems AB\r
+ *\r
+ */\r
+\r
+\r
+class TinyPspellShell {\r
+       var $lang;\r
+       var $mode;\r
+       var $string;\r
+       var $error;\r
+       var $errorMsg;\r
+\r
+       var $cmd;\r
+       var $tmpfile;\r
+\r
+       var $jargon;\r
+       var $spelling;\r
+       var $encoding;\r
+\r
+       function TinyPspellShell(&$config, $lang, $mode, $spelling, $jargon, $encoding) {\r
+               $this->lang = $lang;\r
+               $this->mode = $mode;\r
+               $this->error = false;\r
+               $this->errorMsg = array();\r
+\r
+               $this->tmpfile = tempnam($config['tinypspellshell.tmp'], "tinyspell");\r
+\r
+               if(preg_match("#win#i",php_uname()))\r
+            $this->cmd = $config['tinypspellshell.aspell'] . " -a --lang=". $this->lang." --encoding=utf-8 -H < $this->tmpfile 2>&1";\r
+        else\r
+            $this->cmd = "cat ". $this->tmpfile ." | " . $config['tinypspellshell.aspell'] . " -a --encoding=utf-8 -H --lang=". $this->lang;\r
+       }\r
+\r
+       // Returns array with bad words or false if failed.\r
+       function checkWords($wordArray) {\r
+               if ($fh = fopen($this->tmpfile, "w")) {\r
+                       fwrite($fh, "!\n");\r
+                       foreach($wordArray as $key => $value)\r
+                               fwrite($fh, "^" . $value . "\n");\r
+                       fclose($fh);\r
+               } else {\r
+                       $this->errorMsg[] = "PSpell not found.";\r
+                       return array();\r
+               }\r
+\r
+               $data = shell_exec($this->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
+                               $returnData[] = $matches[1];\r
+               }\r
+\r
+               return $returnData;\r
+       }\r
+\r
+       // Returns array with suggestions or false if failed.\r
+       function getSuggestion($word) {\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
+                       die("Error opening tmp file.");\r
+\r
+               $data = shell_exec($this->cmd);\r
+\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
+                               // For some reason, the exec version seems to add commas?\r
+                               $returnData[] = str_replace(",", "", $matches[1]);\r
+                       }\r
+               }\r
+               return $returnData;\r
+       }\r
+\r
+       function _debugData($data) {\r
+               $fh = @fopen("debug.log", 'a+');\r
+               @fwrite($fh, $data);\r
+               @fclose($fh);\r
+       }\r
+\r
+}\r
+\r
+// Setup classname, should be the same as the name of the spellchecker class\r
+$spellCheckerConfig['class'] = "TinyPspellShell";\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
new file mode 100644 (file)
index 0000000..6622248
--- /dev/null
@@ -0,0 +1,26 @@
+<?php\r
+       $spellCheckerConfig = array();\r
+\r
+       // Spellchecker class use\r
+       // require_once("classes/TinyPspellShell.class.php"); // Command line pspell\r
+       require_once("classes/TinyGoogleSpell.class.php"); // Google web service\r
+       // require_once("classes/TinyPspell.class.php"); // Internal PHP version\r
+\r
+       // General settings\r
+       $spellCheckerConfig['enabled'] = true;\r
+\r
+       // Default settings\r
+       $spellCheckerConfig['default.language'] = 'en';\r
+       $spellCheckerConfig['default.mode'] = PSPELL_FAST;\r
+\r
+       // Normaly not required to configure\r
+       $spellCheckerConfig['default.spelling'] = "";\r
+       $spellCheckerConfig['default.jargon'] = "";\r
+       $spellCheckerConfig['default.encoding'] = "";\r
+\r
+       // Pspell shell specific settings\r
+       $spellCheckerConfig['tinypspellshell.aspell'] = '/usr/bin/aspell';\r
+       $spellCheckerConfig['tinypspellshell.tmp'] = '/tmp';\r
+       \r
+       $spellCheckerConfig['googlespell.url'] = 'https://www.google.com/tbproxy/spell?hl=en'\r
+?>
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/spellchecker/css/content.css b/program/js/tiny_mce/plugins/spellchecker/css/content.css
new file mode 100644 (file)
index 0000000..fb82733
--- /dev/null
@@ -0,0 +1,5 @@
+.mceItemHiddenSpellWord {\r
+       background: url('../images/wline.gif') repeat-x bottom left;\r
+       bo2rder-bottom: 1px dashed red;\r
+       cursor: default;\r
+}\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/css/spellchecker.css b/program/js/tiny_mce/plugins/spellchecker/css/spellchecker.css
new file mode 100644 (file)
index 0000000..aa4a8ea
--- /dev/null
@@ -0,0 +1,34 @@
+.mceMsgBox {\r
+       border: 1px solid gray;\r
+       padding: 8px;\r
+}\r
+\r
+.mceMsgBox span {\r
+       vertical-align: top;\r
+       color: #555555;\r
+}\r
+\r
+/* Misc */\r
+\r
+.mceBlockBox {\r
+       display: none;\r
+       position: absolute;\r
+       left: 0;\r
+       top: 0;\r
+       z-index: 100;\r
+       filter:progid:DXImageTransform.Microsoft.Alpha(style=0, opacity=60);\r
+       -moz-opacity:0.6;\r
+       opacity: 0.6;\r
+       background-color: white;\r
+}\r
+\r
+.mceMsgBox {\r
+       display: none;\r
+       z-index: 101;\r
+       position: absolute;\r
+       left: 0;\r
+       top: 0;\r
+       font-family: Arial, Verdana, Tahoma, Helvetica;\r
+       font-weight: bold;\r
+       font-size: 11px;\r
+}\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/editor_plugin.js b/program/js/tiny_mce/plugins/spellchecker/editor_plugin.js
new file mode 100644 (file)
index 0000000..dbcda6a
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('spellchecker','en,fr,sv,nn,nb');var TinyMCE_SpellCheckerPlugin={_contextMenu:new TinyMCE_Menu(),_menu:new TinyMCE_Menu(),_counter:0,_ajaxPage:'/tinyspell.php',getInfo:function(){return{longname:'Spellchecker',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_spellchecker.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};},handleEvent:function(e){var elm=tinyMCE.isMSIE?e.srcElement:e.target;var inst=tinyMCE.selectedInstance,args='';var self=TinyMCE_SpellCheckerPlugin;var cm=self._contextMenu;var p,p2,x,y,sx,sy,h,elm;if((e.type=="click"||e.type=="contextmenu")&&elm){do{if(tinyMCE.getAttrib(elm,'class')=="mceItemHiddenSpellWord"){inst.spellCheckerElm=elm;args+='id='+inst.editorId+"|"+(++self._counter);args+='&cmd=suggest&check='+encodeURIComponent(elm.innerHTML);args+='&lang='+escape(inst.spellCheckerLang);elm=inst.spellCheckerElm;p=tinyMCE.getAbsPosition(inst.iframeElement);p2=tinyMCE.getAbsPosition(elm);h=parseInt(elm.offsetHeight);sx=inst.getBody().scrollLeft;sy=inst.getBody().scrollTop;x=p.absLeft+p2.absLeft-sx;y=p.absTop+p2.absTop-sy+h;cm.clear();cm.addTitle(tinyMCE.getLang('lang_spellchecker_wait','',true));cm.show();cm.moveTo(x,y);inst.selection.selectNode(elm,false,false);self._sendAjax(self.baseURL+self._ajaxPage,self._ajaxResponse,'post',args);tinyMCE.cancelEvent(e);return false;}}while((elm=elm.parentNode));}return true;},initInstance:function(inst){var self=TinyMCE_SpellCheckerPlugin,m=self._menu,cm=self._contextMenu,e;tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/spellchecker/css/content.css");if(!tinyMCE.hasMenu('spellcheckercontextmenu')){tinyMCE.importCSS(document,tinyMCE.baseURL+"/plugins/spellchecker/css/spellchecker.css");cm.init({drop_menu:false});tinyMCE.addMenu('spellcheckercontextmenu',cm);}if(!tinyMCE.hasMenu('spellcheckermenu')){m.init({});tinyMCE.addMenu('spellcheckermenu',m);}inst.spellCheckerLang='en';self._buildSettingsMenu(inst,null);e=self._getBlockBoxLayer(inst).create('div','mceBlockBox',document.getElementById(inst.editorId+'_parent'));self._getMsgBoxLayer(inst).create('div','mceMsgBox',document.getElementById(inst.editorId+'_parent'));},_getMsgBoxLayer:function(inst){if(!inst.spellCheckerMsgBoxL)inst.spellCheckerMsgBoxL=new TinyMCE_Layer(inst.editorId+'_spellcheckerMsgBox',false);return inst.spellCheckerMsgBoxL;},_getBlockBoxLayer:function(inst){if(!inst.spellCheckerBoxL)inst.spellCheckerBoxL=new TinyMCE_Layer(inst.editorId+'_spellcheckerBlockBox',false);return inst.spellCheckerBoxL;},_buildSettingsMenu:function(inst,lang){var i,ar=tinyMCE.getParam('spellchecker_languages','+English=en').split(','),p;var self=TinyMCE_SpellCheckerPlugin,m=self._menu,c;m.clear();m.addTitle(tinyMCE.getLang('lang_spellchecker_langs','',true));for(i=0;i<ar.length;i++){if(ar[i]!=''){p=ar[i].split('=');c='mceMenuCheckItem';if(p[0].charAt(0)=='+'){p[0]=p[0].substring(1);if(lang==null){c='mceMenuSelectedItem';inst.spellCheckerLang=p[1];}}if(lang==p[1])c='mceMenuSelectedItem';m.add({text:p[0],js:"tinyMCE.execInstanceCommand('"+inst.editorId+"','mceSpellCheckerSetLang',false,'"+p[1]+"');",class_name:c});}}},setupContent:function(editor_id,body,doc){TinyMCE_SpellCheckerPlugin._removeWords(doc);},getControlHTML:function(cn){switch(cn){case"spellchecker":return TinyMCE_SpellCheckerPlugin._getMenuButtonHTML(cn,'lang_spellchecker_desc','{$pluginurl}/images/spellchecker.gif','lang_spellchecker_desc','mceSpellCheckerMenu','mceSpellCheck');}return"";},_getMenuButtonHTML:function(id,lang,img,mlang,mid,cmd,ui,val){var h='',m,x;cmd='tinyMCE.hideMenus();tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+cmd+'\'';if(typeof(ui)!="undefined"&&ui!=null)cmd+=','+ui;if(typeof(val)!="undefined"&&val!=null)cmd+=",'"+val+"'";cmd+=');';if(tinyMCE.getParam('button_tile_map')&&(!tinyMCE.isMSIE||tinyMCE.isOpera)&&(m=tinyMCE.buttonMap[id])!=null&&(tinyMCE.getParam("language")=="en"||img.indexOf('$lang')==-1)){x=0-(m*20)==0?'0':0-(m*20);h+='<a id="{$editor_id}_'+id+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" class="mceTiledButton mceButtonNormal" target="_self">';h+='<img src="{$themeurl}/images/spacer.gif" style="background-position: '+x+'px 0" title="{$'+lang+'}" />';h+='<img src="{$themeurl}/images/button_menu.gif" title="{$'+lang+'}" class="mceMenuButton" onclick="'+mcmd+'return false;" />';h+='</a>';}else{if(tinyMCE.isMSIE&&!tinyMCE.isOpera)h+='<span id="{$editor_id}_'+id+'" class="mceMenuButton" onmouseover="tinyMCE.plugins.spellchecker._menuButtonEvent(\'over\',this);" onmouseout="tinyMCE.plugins.spellchecker._menuButtonEvent(\'out\',this);">';else h+='<span id="{$editor_id}_'+id+'" class="mceMenuButton">';h+='<a href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" class="mceMenuButtonNormal" target="_self">';h+='<img src="'+img+'" title="{$'+lang+'}" /></a>';h+='<a href="#" onclick="tinyMCE.plugins.spellchecker._toggleMenu(\'{$editor_id}\',\''+mid+'\');return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$'+lang+'}" class="mceMenuButton" />';h+='</a></span>';}return h;},_menuButtonEvent:function(e,o){if(o.className=='mceMenuButtonFocus')return;if(e=='over')o.className=o.className+' mceMenuHover';else o.className=o.className.replace(/\s.*$/,'');},_toggleMenu:function(editor_id,id){var self=TinyMCE_SpellCheckerPlugin;var e=document.getElementById(editor_id+'_spellchecker');var inst=tinyMCE.getInstanceById(editor_id);if(self._menu.isVisible()){tinyMCE.hideMenus();return;}tinyMCE.lastMenuBtnClass=e.className.replace(/\s.*$/,'');tinyMCE.switchClass(editor_id+'_spellchecker','mceMenuButtonFocus');self._menu.moveRelativeTo(e,'bl');self._menu.moveBy(tinyMCE.isMSIE&&!tinyMCE.isOpera?0:1,-1);if(tinyMCE.isOpera)self._menu.moveBy(0,-2);self._onMenuEvent(inst,self._menu,'show');self._menu.show();tinyMCE.lastSelectedMenuBtn=editor_id+'_spellchecker';},_onMenuEvent:function(inst,m,n){TinyMCE_SpellCheckerPlugin._buildSettingsMenu(inst,inst.spellCheckerLang);},execCommand:function(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id),self=TinyMCE_SpellCheckerPlugin,args='',co,bb,mb,nl,i,e;switch(command){case"mceSpellCheck":if(!inst.spellcheckerOn){inst.spellCheckerBookmark=inst.selection.getBookmark();args+='id='+inst.editorId+"|"+(++self._counter);args+='&cmd=spell&check='+encodeURIComponent(self._getWordList(inst.getBody())).replace(/\'/g,'%27');args+='&lang='+escape(inst.spellCheckerLang);co=document.getElementById(inst.editorId+'_parent').firstChild;bb=self._getBlockBoxLayer(inst);bb.moveRelativeTo(co,'tl');bb.resizeTo(co.offsetWidth,co.offsetHeight);bb.show();mb=self._getMsgBoxLayer(inst);e=mb.getElement();e.innerHTML='<span>'+tinyMCE.getLang('lang_spellchecker_swait','',true)+'</span>';mb.show();mb.moveRelativeTo(co,'cc');if(tinyMCE.isMSIE&&!tinyMCE.isOpera){nl=co.getElementsByTagName('select');for(i=0;i<nl.length;i++)nl[i].disabled=true;}inst.spellcheckerOn=true;tinyMCE.switchClass(editor_id+'_spellchecker','mceMenuButtonSelected');self._sendAjax(self.baseURL+self._ajaxPage,self._ajaxResponse,'post',args);}else{self._removeWords(inst.getDoc());inst.spellcheckerOn=false;tinyMCE.switchClass(editor_id+'_spellchecker','mceMenuButton');}return true;case"mceSpellCheckReplace":if(inst.spellCheckerElm)tinyMCE.setOuterHTML(inst.spellCheckerElm,value);self._checkDone(inst);self._contextMenu.hide();self._menu.hide();return true;case"mceSpellCheckIgnore":if(inst.spellCheckerElm)self._removeWord(inst.spellCheckerElm);self._checkDone(inst);self._contextMenu.hide();self._menu.hide();return true;case"mceSpellCheckIgnoreAll":if(inst.spellCheckerElm)self._removeWords(inst.getDoc(),inst.spellCheckerElm.innerHTML);self._checkDone(inst);self._contextMenu.hide();self._menu.hide();return true;case"mceSpellCheckerSetLang":tinyMCE.hideMenus();inst.spellCheckerLang=value;self._removeWords(inst.getDoc());inst.spellcheckerOn=false;tinyMCE.switchClass(editor_id+'_spellchecker','mceMenuButton');return true;}return false;},cleanup:function(type,content,inst){switch(type){case"get_from_editor_dom":TinyMCE_SpellCheckerPlugin._removeWords(content);inst.spellcheckerOn=false;break;}return content;},_displayUI:function(inst){var self=TinyMCE_SpellCheckerPlugin;var bb=self._getBlockBoxLayer(inst);var mb=self._getMsgBoxLayer(inst);var nl,i;var co=document.getElementById(inst.editorId+'_parent').firstChild;if(tinyMCE.isMSIE&&!tinyMCE.isOpera){nl=co.getElementsByTagName('select');for(i=0;i<nl.length;i++)nl[i].disabled=false;}bb.hide();mb.hide();},_ajaxResponse:function(xml){var el=xml?xml.documentElement:null;var inst=tinyMCE.selectedInstance,self=TinyMCE_SpellCheckerPlugin;var cmd=el?el.getAttribute("cmd"):null,err,id=el?el.getAttribute("id"):null;if(id)inst=tinyMCE.getInstanceById(id.substring(0,id.indexOf('|')));self._displayUI(inst);if(cmd=="suggest"&&id!=inst.editorId+"|"+self._counter)return;if(!el){inst.spellcheckerOn=false;tinyMCE.switchClass(inst.editorId+'_spellchecker','mceMenuButton');alert("Could not execute AJAX call, server didn't return valid a XML.");return;}err=el.getAttribute("error");if(err=="true"){inst.spellcheckerOn=false;tinyMCE.switchClass(inst.editorId+'_spellchecker','mceMenuButton');alert(el.getAttribute("msg"));return;}switch(cmd){case"spell":if(xml.documentElement.firstChild){self._markWords(inst.getDoc(),inst.getBody(),decodeURIComponent(el.firstChild.nodeValue).split('+'));inst.selection.moveToBookmark(inst.spellCheckerBookmark);if(tinyMCE.getParam('spellchecker_report_mispellings',false))alert(tinyMCE.getLang('lang_spellchecker_mpell_found','',true,{words:self._countWords(inst)}));}else alert(tinyMCE.getLang('lang_spellchecker_no_mpell','',true));self._checkDone(inst);break;case"suggest":self._buildMenu(el.firstChild?decodeURIComponent(el.firstChild.nodeValue).split('+'):null,10);self._contextMenu.show();break;}},_getWordSeparators:function(){var i,re='',ch=tinyMCE.getParam('spellchecker_word_separator_chars','\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}\u201d\u201c');for(i=0;i<ch.length;i++)re+='\\'+ch.charAt(i);return re;},_getWordList:function(n){var i,x,s,nv='',nl=tinyMCE.getNodeTree(n,new Array(),3),wl=new Array();var re=TinyMCE_SpellCheckerPlugin._getWordSeparators();for(i=0;i<nl.length;i++){if(!new RegExp('/SCRIPT|STYLE/').test(nl[i].parentNode.nodeName))nv+=nl[i].nodeValue+" ";}nv=nv.replace(new RegExp('([0-9]|['+re+'])','g'),' ');nv=tinyMCE.trim(nv.replace(/(\s+)/g,' '));nl=nv.split(/\s+/);for(i=0;i<nl.length;i++){s=false;for(x=0;x<wl.length;x++){if(wl[x]==nl[i]){s=true;break;}}if(!s&&nl[i].length>0)wl[wl.length]=nl[i];}return wl.join(' ');},_removeWords:function(doc,word){var i,c,nl=doc.getElementsByTagName("span");var self=TinyMCE_SpellCheckerPlugin;var inst=tinyMCE.selectedInstance,b=inst?inst.selection.getBookmark():null;word=typeof(word)=='undefined'?null:word;for(i=nl.length-1;i>=0;i--){c=tinyMCE.getAttrib(nl[i],'class');if((c=='mceItemHiddenSpellWord'||c=='mceItemHidden')&&(word==null||nl[i].innerHTML==word))self._removeWord(nl[i]);}if(b)inst.selection.moveToBookmark(b);},_checkDone:function(inst){var self=TinyMCE_SpellCheckerPlugin;var w=self._countWords(inst);if(w==0){self._removeWords(inst.getDoc());inst.spellcheckerOn=false;tinyMCE.switchClass(inst.editorId+'_spellchecker','mceMenuButton');}},_countWords:function(inst){var i,w=0,nl=inst.getDoc().getElementsByTagName("span"),c;var self=TinyMCE_SpellCheckerPlugin;for(i=nl.length-1;i>=0;i--){c=tinyMCE.getAttrib(nl[i],'class');if(c=='mceItemHiddenSpellWord')w++;}return w;},_removeWord:function(e){if(e!=null)tinyMCE.setOuterHTML(e,e.innerHTML);},_markWords:function(doc,n,wl){var i,nv,nn,nl=tinyMCE.getNodeTree(n,new Array(),3);var r1,r2,r3,r4,r5,w='';var re=TinyMCE_SpellCheckerPlugin._getWordSeparators();for(i=0;i<wl.length;i++){if(wl[i].length>0)w+=wl[i]+((i==wl.length-1)?'':'|');}for(i=0;i<nl.length;i++){nv=nl[i].nodeValue;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');if(r1.test(nv)||r2.test(nv)||r3.test(nv)||r4.test(nv)){nv=tinyMCE.xmlEncode(nv);nv=nv.replace(r5,'<span class="mceItemHiddenSpellWord">$1</span>$2');nv=nv.replace(r3,'<span class="mceItemHiddenSpellWord">$1</span>$2');nn=doc.createElement('span');nn.className="mceItemHidden";nn.innerHTML=nv;nl[i].parentNode.replaceChild(nn,nl[i]);}}},_buildMenu:function(sg,max){var i,self=TinyMCE_SpellCheckerPlugin,cm=self._contextMenu;cm.clear();if(sg!=null){cm.addTitle(tinyMCE.getLang('lang_spellchecker_sug','',true));for(i=0;i<sg.length&&i<max;i++)cm.addItem(sg[i],'tinyMCE.execCommand("mceSpellCheckReplace",false,"'+sg[i]+'");');cm.addSeparator();}else cm.addTitle(tinyMCE.getLang('lang_spellchecker_no_sug','',true));cm.addItem(tinyMCE.getLang('lang_spellchecker_ignore_word','',true),'tinyMCE.execCommand(\'mceSpellCheckIgnore\');');cm.addItem(tinyMCE.getLang('lang_spellchecker_ignore_words','',true),'tinyMCE.execCommand(\'mceSpellCheckIgnoreAll\');');cm.update();},_getAjaxHTTP:function(){try{return new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{return new ActiveXObject('Microsoft.XMLHTTP')}catch(e){return new XMLHttpRequest();}}},_sendAjax:function(u,f,m,a){var x=TinyMCE_SpellCheckerPlugin._getAjaxHTTP();x.open(m,u,true);x.onreadystatechange=function(){if(x.readyState==4)f(x.responseXML);};if(m=='post')x.setRequestHeader('Content-type','application/x-www-form-urlencoded');x.send(a);}};tinyMCE.addPlugin('spellchecker',TinyMCE_SpellCheckerPlugin);
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/spellchecker/editor_plugin_src.js b/program/js/tiny_mce/plugins/spellchecker/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..196d246
--- /dev/null
@@ -0,0 +1,588 @@
+/**\r
+ * $Id: editor_plugin_src.js 28 2006-08-01 16:02:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+tinyMCE.importPluginLanguagePack('spellchecker', 'en,fr,sv,nn,nb');\r
+\r
+// Plucin static class\r
+var TinyMCE_SpellCheckerPlugin = {\r
+       _contextMenu : new TinyMCE_Menu(),\r
+       _menu : new TinyMCE_Menu(),\r
+       _counter : 0,\r
+       _ajaxPage : '/tinyspell.php',\r
+\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Spellchecker',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_spellchecker.html',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       handleEvent : function(e) {\r
+               var elm = tinyMCE.isMSIE ? e.srcElement : e.target;\r
+               var inst = tinyMCE.selectedInstance, args = '';\r
+               var self = TinyMCE_SpellCheckerPlugin;\r
+               var cm = self._contextMenu;\r
+               var p, p2, x, y, sx, sy, h, elm;\r
+\r
+               // Handle click on word\r
+               if ((e.type == "click" || e.type == "contextmenu") && elm) {\r
+                       do {\r
+                               if (tinyMCE.getAttrib(elm, 'class') == "mceItemHiddenSpellWord") {\r
+                                       inst.spellCheckerElm = elm;\r
+\r
+                                       // Setup arguments\r
+                                       args += 'id=' + inst.editorId + "|" + (++self._counter);\r
+                                       args += '&cmd=suggest&check=' + encodeURIComponent(elm.innerHTML);\r
+                                       args += '&lang=' + escape(inst.spellCheckerLang);\r
+\r
+                                       elm = inst.spellCheckerElm;\r
+                                       p = tinyMCE.getAbsPosition(inst.iframeElement);\r
+                                       p2 = tinyMCE.getAbsPosition(elm);\r
+                                       h = parseInt(elm.offsetHeight);\r
+                                       sx = inst.getBody().scrollLeft;\r
+                                       sy = inst.getBody().scrollTop;\r
+                                       x = p.absLeft + p2.absLeft - sx;\r
+                                       y = p.absTop + p2.absTop - sy + h;\r
+\r
+                                       cm.clear();\r
+                                       cm.addTitle(tinyMCE.getLang('lang_spellchecker_wait', '', true));\r
+                                       cm.show();\r
+                                       cm.moveTo(x, y);\r
+\r
+                                       inst.selection.selectNode(elm, false, false);\r
+\r
+                                       self._sendAjax(self.baseURL + self._ajaxPage, self._ajaxResponse, 'post', args);\r
+\r
+                                       tinyMCE.cancelEvent(e);\r
+                                       return false;\r
+                               }\r
+                       } while ((elm = elm.parentNode));\r
+               }\r
+\r
+               return true;\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               var self = TinyMCE_SpellCheckerPlugin, m = self._menu, cm = self._contextMenu, e;\r
+\r
+               tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/spellchecker/css/content.css");\r
+\r
+               if (!tinyMCE.hasMenu('spellcheckercontextmenu')) {\r
+                       tinyMCE.importCSS(document, tinyMCE.baseURL + "/plugins/spellchecker/css/spellchecker.css");\r
+\r
+                       cm.init({drop_menu : false});\r
+                       tinyMCE.addMenu('spellcheckercontextmenu', cm);\r
+               }\r
+\r
+               if (!tinyMCE.hasMenu('spellcheckermenu')) {\r
+                       m.init({});\r
+                       tinyMCE.addMenu('spellcheckermenu', m);\r
+               }\r
+\r
+        inst.spellCheckerLang = 'en';\r
+               self._buildSettingsMenu(inst, null);\r
+\r
+               e = self._getBlockBoxLayer(inst).create('div', 'mceBlockBox', document.getElementById(inst.editorId + '_parent'));\r
+               self._getMsgBoxLayer(inst).create('div', 'mceMsgBox', document.getElementById(inst.editorId + '_parent'));\r
+       },\r
+\r
+       _getMsgBoxLayer : function(inst) {\r
+               if (!inst.spellCheckerMsgBoxL)\r
+                       inst.spellCheckerMsgBoxL = new TinyMCE_Layer(inst.editorId + '_spellcheckerMsgBox', false);\r
+\r
+               return inst.spellCheckerMsgBoxL;\r
+       },\r
+\r
+       _getBlockBoxLayer : function(inst) {\r
+               if (!inst.spellCheckerBoxL)\r
+                       inst.spellCheckerBoxL = new TinyMCE_Layer(inst.editorId + '_spellcheckerBlockBox', false);\r
+\r
+               return inst.spellCheckerBoxL;\r
+       },\r
+\r
+       _buildSettingsMenu : function(inst, lang) {\r
+               var i, ar = tinyMCE.getParam('spellchecker_languages', '+English=en').split(','), p;\r
+               var self = TinyMCE_SpellCheckerPlugin, m = self._menu, c;\r
+\r
+               m.clear();\r
+               m.addTitle(tinyMCE.getLang('lang_spellchecker_langs', '', true));\r
+\r
+               for (i=0; i<ar.length; i++) {\r
+                       if (ar[i] != '') {\r
+                               p = ar[i].split('=');\r
+                               c = 'mceMenuCheckItem';\r
+\r
+                               if (p[0].charAt(0) == '+') {\r
+                                       p[0] = p[0].substring(1);\r
+\r
+                                       if (lang == null) {\r
+                                               c = 'mceMenuSelectedItem';\r
+                                               inst.spellCheckerLang = p[1];\r
+                                       }\r
+                               }\r
+\r
+                               if (lang == p[1])\r
+                                       c = 'mceMenuSelectedItem';\r
+\r
+                               m.add({text : p[0], js : "tinyMCE.execInstanceCommand('" + inst.editorId + "','mceSpellCheckerSetLang',false,'" + p[1] + "');", class_name : c});\r
+                       }\r
+               }\r
+       },\r
+\r
+       setupContent : function(editor_id, body, doc) {\r
+               TinyMCE_SpellCheckerPlugin._removeWords(doc);\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "spellchecker":\r
+                               return TinyMCE_SpellCheckerPlugin._getMenuButtonHTML(cn, 'lang_spellchecker_desc', '{$pluginurl}/images/spellchecker.gif', 'lang_spellchecker_desc', 'mceSpellCheckerMenu', 'mceSpellCheck');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       /**\r
+        * Returns the HTML code for a normal button control.\r
+        *\r
+        * @param {string} id Button control id, this will be the suffix for the element id, the prefix is the editor id.\r
+        * @param {string} lang Language variable key name to insert as the title/alt of the button image.\r
+        * @param {string} img Image URL to insert, {$themeurl} and {$pluginurl} will be replaced.\r
+        * @param {string} mlang Language variable key name to insert as the title/alt of the menu button image.\r
+        * @param {string} mid Menu by id to display when the menu button is pressed.\r
+        * @param {string} cmd Command to execute when the user clicks the button.\r
+        * @param {string} ui Optional user interface boolean for command.\r
+        * @param {string} val Optional value for command.\r
+        * @return HTML code for a normal button based in input information.\r
+        * @type string\r
+        */\r
+       _getMenuButtonHTML : function(id, lang, img, mlang, mid, cmd, ui, val) {\r
+               var h = '', m, x;\r
+\r
+               cmd = 'tinyMCE.hideMenus();tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\'';\r
+\r
+               if (typeof(ui) != "undefined" && ui != null)\r
+                       cmd += ',' + ui;\r
+\r
+               if (typeof(val) != "undefined" && val != null)\r
+                       cmd += ",'" + val + "'";\r
+\r
+               cmd += ');';\r
+\r
+               // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled\r
+               if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isMSIE || tinyMCE.isOpera) && (m = tinyMCE.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) {\r
+                       // Tiled button\r
+                       x = 0 - (m * 20) == 0 ? '0' : 0 - (m * 20);\r
+                       h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceTiledButton mceButtonNormal" target="_self">';\r
+                       h += '<img src="{$themeurl}/images/spacer.gif" style="background-position: ' + x + 'px 0" title="{$' + lang + '}" />';\r
+                       h += '<img src="{$themeurl}/images/button_menu.gif" title="{$' + lang + '}" class="mceMenuButton" onclick="' + mcmd + 'return false;" />';\r
+                       h += '</a>';\r
+               } else {\r
+                       if (tinyMCE.isMSIE && !tinyMCE.isOpera)\r
+                               h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton" onmouseover="tinyMCE.plugins.spellchecker._menuButtonEvent(\'over\',this);" onmouseout="tinyMCE.plugins.spellchecker._menuButtonEvent(\'out\',this);">';\r
+                       else\r
+                               h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton">';\r
+\r
+                       h += '<a href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceMenuButtonNormal" target="_self">';\r
+                       h += '<img src="' + img + '" title="{$' + lang + '}" /></a>';\r
+                       h += '<a href="#" onclick="tinyMCE.plugins.spellchecker._toggleMenu(\'{$editor_id}\',\'' + mid + '\');return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$' + lang + '}" class="mceMenuButton" />';\r
+                       h += '</a></span>';\r
+               }\r
+\r
+               return h;\r
+       },\r
+\r
+       _menuButtonEvent : function(e, o) {\r
+               if (o.className == 'mceMenuButtonFocus')\r
+                       return;\r
+\r
+               if (e == 'over')\r
+                       o.className = o.className + ' mceMenuHover';\r
+               else\r
+                       o.className = o.className.replace(/\s.*$/, '');\r
+       },\r
+\r
+       _toggleMenu : function(editor_id, id) {\r
+               var self = TinyMCE_SpellCheckerPlugin;\r
+               var e = document.getElementById(editor_id + '_spellchecker');\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+               if (self._menu.isVisible()) {\r
+                       tinyMCE.hideMenus();\r
+                       return;\r
+               }\r
+\r
+               tinyMCE.lastMenuBtnClass = e.className.replace(/\s.*$/, '');\r
+               tinyMCE.switchClass(editor_id + '_spellchecker', 'mceMenuButtonFocus');\r
+\r
+               self._menu.moveRelativeTo(e, 'bl');\r
+               self._menu.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? 0 : 1, -1);\r
+\r
+               if (tinyMCE.isOpera)\r
+                       self._menu.moveBy(0, -2);\r
+\r
+        self._onMenuEvent(inst, self._menu, 'show');\r
+\r
+               self._menu.show();\r
+\r
+               tinyMCE.lastSelectedMenuBtn = editor_id + '_spellchecker';\r
+       },\r
+\r
+       _onMenuEvent : function(inst, m, n) {\r
+               TinyMCE_SpellCheckerPlugin._buildSettingsMenu(inst, inst.spellCheckerLang);\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               var inst = tinyMCE.getInstanceById(editor_id), self = TinyMCE_SpellCheckerPlugin, args = '', co, bb, mb, nl, i, e;\r
+\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceSpellCheck":\r
+                               if (!inst.spellcheckerOn) {\r
+                                       inst.spellCheckerBookmark = inst.selection.getBookmark();\r
+\r
+                                       // Setup arguments\r
+                                       args += 'id=' + inst.editorId + "|" + (++self._counter);\r
+                                       args += '&cmd=spell&check=' + encodeURIComponent(self._getWordList(inst.getBody())).replace( /\'/g, '%27' );\r
+                                       args += '&lang=' + escape(inst.spellCheckerLang);\r
+\r
+                                       co = document.getElementById(inst.editorId + '_parent').firstChild;\r
+                                       bb = self._getBlockBoxLayer(inst);\r
+                                       bb.moveRelativeTo(co, 'tl');\r
+                                       bb.resizeTo(co.offsetWidth, co.offsetHeight);\r
+                                       bb.show();\r
+\r
+                                       // Setup message box\r
+                                       mb = self._getMsgBoxLayer(inst);\r
+                                       e = mb.getElement();\r
+                                       e.innerHTML = '<span>' + tinyMCE.getLang('lang_spellchecker_swait', '', true) + '</span>';\r
+                                       mb.show();\r
+                                       mb.moveRelativeTo(co, 'cc');\r
+\r
+                                       if (tinyMCE.isMSIE && !tinyMCE.isOpera) {\r
+                                               nl = co.getElementsByTagName('select');\r
+                                               for (i=0; i<nl.length; i++)\r
+                                                       nl[i].disabled = true;\r
+                                       }\r
+\r
+                                       inst.spellcheckerOn = true;\r
+                                       tinyMCE.switchClass(editor_id + '_spellchecker', 'mceMenuButtonSelected');\r
+\r
+                                       self._sendAjax(self.baseURL + self._ajaxPage, self._ajaxResponse, 'post', args);\r
+                               } else {\r
+                                       self._removeWords(inst.getDoc());\r
+                                       inst.spellcheckerOn = false;\r
+                                       tinyMCE.switchClass(editor_id + '_spellchecker', 'mceMenuButton');\r
+                               }\r
+\r
+                               return true;\r
+\r
+                       case "mceSpellCheckReplace":\r
+                               if (inst.spellCheckerElm)\r
+                                       tinyMCE.setOuterHTML(inst.spellCheckerElm, value);\r
+\r
+                               self._checkDone(inst);\r
+                               self._contextMenu.hide();\r
+                               self._menu.hide();\r
+\r
+                               return true;\r
+\r
+                       case "mceSpellCheckIgnore":\r
+                               if (inst.spellCheckerElm)\r
+                                       self._removeWord(inst.spellCheckerElm);\r
+\r
+                               self._checkDone(inst);\r
+                               self._contextMenu.hide();\r
+                               self._menu.hide();\r
+                               return true;\r
+\r
+                       case "mceSpellCheckIgnoreAll":\r
+                               if (inst.spellCheckerElm)\r
+                                       self._removeWords(inst.getDoc(), inst.spellCheckerElm.innerHTML);\r
+\r
+                               self._checkDone(inst);\r
+                               self._contextMenu.hide();\r
+                               self._menu.hide();\r
+                               return true;\r
+\r
+                       case "mceSpellCheckerSetLang":\r
+                               tinyMCE.hideMenus();\r
+                               inst.spellCheckerLang = value;\r
+                               self._removeWords(inst.getDoc());\r
+                               inst.spellcheckerOn = false;\r
+                               tinyMCE.switchClass(editor_id + '_spellchecker', 'mceMenuButton');\r
+                               return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       },\r
+\r
+       cleanup : function(type, content, inst) {\r
+               switch (type) {\r
+                       case "get_from_editor_dom":\r
+                               TinyMCE_SpellCheckerPlugin._removeWords(content);\r
+                               inst.spellcheckerOn = false;\r
+                               break;\r
+               }\r
+\r
+               return content;\r
+       },\r
+\r
+       // Private plugin specific methods\r
+\r
+       _displayUI : function(inst) {\r
+               var self = TinyMCE_SpellCheckerPlugin;\r
+               var bb = self._getBlockBoxLayer(inst);\r
+               var mb = self._getMsgBoxLayer(inst);\r
+               var nl, i;\r
+               var co = document.getElementById(inst.editorId + '_parent').firstChild;\r
+\r
+               if (tinyMCE.isMSIE && !tinyMCE.isOpera) {\r
+                       nl = co.getElementsByTagName('select');\r
+                       for (i=0; i<nl.length; i++)\r
+                               nl[i].disabled = false;\r
+               }\r
+\r
+               bb.hide();\r
+               mb.hide();\r
+       },\r
+\r
+       _ajaxResponse : function(xml) {\r
+               var el = xml ? xml.documentElement : null;\r
+               var inst = tinyMCE.selectedInstance, self = TinyMCE_SpellCheckerPlugin;\r
+               var cmd = el ? el.getAttribute("cmd") : null, err, id = el ? el.getAttribute("id") : null;\r
+\r
+               if (id)\r
+                       inst = tinyMCE.getInstanceById(id.substring(0, id.indexOf('|')));\r
+\r
+               self._displayUI(inst);\r
+\r
+               // Ignore suggestions for other ajax responses\r
+               if (cmd == "suggest" && id != inst.editorId + "|" + self._counter)\r
+                       return;\r
+\r
+               if (!el) {\r
+                       inst.spellcheckerOn = false;\r
+                       tinyMCE.switchClass(inst.editorId + '_spellchecker', 'mceMenuButton');\r
+                       alert("Could not execute AJAX call, server didn't return valid a XML.");\r
+                       return;\r
+               }\r
+\r
+               err = el.getAttribute("error");\r
+\r
+               if (err == "true") {\r
+                       inst.spellcheckerOn = false;\r
+                       tinyMCE.switchClass(inst.editorId + '_spellchecker', 'mceMenuButton');\r
+                       alert(el.getAttribute("msg"));\r
+                       return;\r
+               }\r
+\r
+               switch (cmd) {\r
+                       case "spell":\r
+                               if (xml.documentElement.firstChild) {\r
+                                       self._markWords(inst.getDoc(), inst.getBody(), decodeURIComponent(el.firstChild.nodeValue).split('+'));\r
+                                       inst.selection.moveToBookmark(inst.spellCheckerBookmark);\r
+\r
+                                       if(tinyMCE.getParam('spellchecker_report_mispellings', false))\r
+                                               alert(tinyMCE.getLang('lang_spellchecker_mpell_found', '', true, {words : self._countWords(inst)}));\r
+                               } else\r
+                                       alert(tinyMCE.getLang('lang_spellchecker_no_mpell', '', true));\r
+\r
+                               self._checkDone(inst);\r
+\r
+                               break;\r
+\r
+                       case "suggest":\r
+                               self._buildMenu(el.firstChild ? decodeURIComponent(el.firstChild.nodeValue).split('+') : null, 10);\r
+                               self._contextMenu.show();\r
+                               break;\r
+               }\r
+       },\r
+\r
+       _getWordSeparators : function() {\r
+               var i, re = '', ch = tinyMCE.getParam('spellchecker_word_separator_chars', '\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c');\r
+\r
+               for (i=0; i<ch.length; i++)\r
+                       re += '\\' + ch.charAt(i);\r
+\r
+               return re;\r
+       },\r
+\r
+       _getWordList : function(n) {\r
+               var i, x, s, nv = '', nl = tinyMCE.getNodeTree(n, new Array(), 3), wl = new Array();\r
+               var re = TinyMCE_SpellCheckerPlugin._getWordSeparators();\r
+\r
+               for (i=0; i<nl.length; i++) {\r
+                       if (!new RegExp('/SCRIPT|STYLE/').test(nl[i].parentNode.nodeName))\r
+                               nv += nl[i].nodeValue + " ";\r
+               }\r
+\r
+               nv = nv.replace(new RegExp('([0-9]|[' + re + '])', 'g'), ' ');\r
+               nv = tinyMCE.trim(nv.replace(/(\s+)/g, ' '));\r
+\r
+               nl = nv.split(/\s+/);\r
+               for (i=0; i<nl.length; i++) {\r
+                       s = false;\r
+                       for (x=0; x<wl.length; x++) {\r
+                               if (wl[x] == nl[i]) {\r
+                                       s = true;\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       if (!s && nl[i].length > 0)\r
+                               wl[wl.length] = nl[i];\r
+               }\r
+\r
+               return wl.join(' ');\r
+       },\r
+\r
+       _removeWords : function(doc, word) {\r
+               var i, c, nl = doc.getElementsByTagName("span");\r
+               var self = TinyMCE_SpellCheckerPlugin;\r
+               var inst = tinyMCE.selectedInstance, b = inst ? inst.selection.getBookmark() : null;\r
+\r
+               word = typeof(word) == 'undefined' ? null : word;\r
+\r
+               for (i=nl.length-1; i>=0; i--) {\r
+                       c = tinyMCE.getAttrib(nl[i], 'class');\r
+\r
+                       if ((c == 'mceItemHiddenSpellWord' || c == 'mceItemHidden') && (word == null || nl[i].innerHTML == word))\r
+                               self._removeWord(nl[i]);\r
+               }\r
+\r
+               if (b)\r
+                       inst.selection.moveToBookmark(b);\r
+       },\r
+\r
+       _checkDone : function(inst) {\r
+               var self = TinyMCE_SpellCheckerPlugin;\r
+               var w = self._countWords(inst);\r
+\r
+               if (w == 0) {\r
+                       self._removeWords(inst.getDoc());\r
+                       inst.spellcheckerOn = false;\r
+                       tinyMCE.switchClass(inst.editorId + '_spellchecker', 'mceMenuButton');\r
+               }\r
+       },\r
+\r
+       _countWords : function(inst) {\r
+               var i, w = 0, nl = inst.getDoc().getElementsByTagName("span"), c;\r
+               var self = TinyMCE_SpellCheckerPlugin;\r
+\r
+               for (i=nl.length-1; i>=0; i--) {\r
+                       c = tinyMCE.getAttrib(nl[i], 'class');\r
+\r
+                       if (c == 'mceItemHiddenSpellWord')\r
+                               w++;\r
+               }\r
+\r
+               return w;\r
+       },\r
+\r
+       _removeWord : function(e) {\r
+               if (e != null)\r
+                       tinyMCE.setOuterHTML(e, e.innerHTML);\r
+       },\r
+\r
+       _markWords : function(doc, n, wl) {\r
+               var i, nv, nn, nl = tinyMCE.getNodeTree(n, new Array(), 3);\r
+               var r1, r2, r3, r4, r5, w = '';\r
+               var re = TinyMCE_SpellCheckerPlugin._getWordSeparators();\r
+\r
+               for (i=0; i<wl.length; i++) {\r
+                       if (wl[i].length > 0)\r
+                               w += wl[i] + ((i == wl.length-1) ? '' : '|');\r
+               }\r
+\r
+               for (i=0; i<nl.length; i++) {\r
+                       nv = nl[i].nodeValue;\r
+                       r1 = new RegExp('([' + re + '])(' + w + ')([' + re + '])', 'g');\r
+                       r2 = new RegExp('^(' + w + ')', 'g');\r
+                       r3 = new RegExp('(' + w + ')([' + re + ']?)$', 'g');\r
+                       r4 = new RegExp('^(' + w + ')([' + re + ']?)$', 'g');\r
+                       r5 = new RegExp('(' + w + ')([' + re + '])', 'g');\r
+\r
+                       if (r1.test(nv) || r2.test(nv) || r3.test(nv) || r4.test(nv)) {\r
+                               nv = tinyMCE.xmlEncode(nv);\r
+                               nv = nv.replace(r5, '<span class="mceItemHiddenSpellWord">$1</span>$2');\r
+                               nv = nv.replace(r3, '<span class="mceItemHiddenSpellWord">$1</span>$2');\r
+\r
+                               nn = doc.createElement('span');\r
+                               nn.className = "mceItemHidden";\r
+                               nn.innerHTML = nv;\r
+\r
+                               // Remove old text node\r
+                               nl[i].parentNode.replaceChild(nn, nl[i]);\r
+                       }\r
+               }\r
+       },\r
+\r
+       _buildMenu : function(sg, max) {\r
+               var i, self = TinyMCE_SpellCheckerPlugin, cm = self._contextMenu;\r
+\r
+               cm.clear();\r
+\r
+               if (sg != null) {\r
+                       cm.addTitle(tinyMCE.getLang('lang_spellchecker_sug', '', true));\r
+\r
+                       for (i=0; i<sg.length && i<max; i++)\r
+                               cm.addItem(sg[i], 'tinyMCE.execCommand("mceSpellCheckReplace",false,"' + sg[i] + '");');\r
+\r
+                       cm.addSeparator();\r
+               } else\r
+                       cm.addTitle(tinyMCE.getLang('lang_spellchecker_no_sug', '', true));\r
+\r
+               cm.addItem(tinyMCE.getLang('lang_spellchecker_ignore_word', '', true), 'tinyMCE.execCommand(\'mceSpellCheckIgnore\');');\r
+               cm.addItem(tinyMCE.getLang('lang_spellchecker_ignore_words', '', true), 'tinyMCE.execCommand(\'mceSpellCheckIgnoreAll\');');\r
+\r
+               cm.update();\r
+       },\r
+\r
+       _getAjaxHTTP : function() {\r
+               try {\r
+                       return new ActiveXObject('Msxml2.XMLHTTP')\r
+               } catch (e) {\r
+                       try {\r
+                               return new ActiveXObject('Microsoft.XMLHTTP')\r
+                       } catch (e) {\r
+                               return new XMLHttpRequest();\r
+                       }\r
+               }\r
+       },\r
+\r
+       /**\r
+        * Perform AJAX call.\r
+        *\r
+        * @param {string} u URL of AJAX service.\r
+        * @param {function} f Function to call when response arrives.\r
+        * @param {string} m Request method post or get.\r
+        * @param {Array} a Array with arguments to send.\r
+        */\r
+       _sendAjax : function(u, f, m, a) {\r
+               var x = TinyMCE_SpellCheckerPlugin._getAjaxHTTP();\r
+\r
+               x.open(m, u, true);\r
+\r
+               x.onreadystatechange = function() {\r
+                       if (x.readyState == 4)\r
+                               f(x.responseXML);\r
+               };\r
+\r
+               if (m == 'post')\r
+                       x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\r
+\r
+               x.send(a);\r
+       }\r
+};\r
+\r
+// Register plugin\r
+tinyMCE.addPlugin('spellchecker', TinyMCE_SpellCheckerPlugin);\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/images/spellchecker.gif b/program/js/tiny_mce/plugins/spellchecker/images/spellchecker.gif
new file mode 100644 (file)
index 0000000..294a9d2
Binary files /dev/null and b/program/js/tiny_mce/plugins/spellchecker/images/spellchecker.gif differ
diff --git a/program/js/tiny_mce/plugins/spellchecker/images/wline.gif b/program/js/tiny_mce/plugins/spellchecker/images/wline.gif
new file mode 100644 (file)
index 0000000..7d0a4db
Binary files /dev/null and b/program/js/tiny_mce/plugins/spellchecker/images/wline.gif differ
diff --git a/program/js/tiny_mce/plugins/spellchecker/langs/en.js b/program/js/tiny_mce/plugins/spellchecker/langs/en.js
new file mode 100644 (file)
index 0000000..02fdac5
--- /dev/null
@@ -0,0 +1,15 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('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
+       swait : 'Spellchecking, please wait...',\r
+       sug : 'Suggestions',\r
+       no_sug : 'No suggestions',\r
+       no_mpell : 'No misspellings found.',\r
+       mpell_found : 'Found {$words} misspellings.'\r
+});\r
diff --git a/program/js/tiny_mce/plugins/spellchecker/tinyspell.php b/program/js/tiny_mce/plugins/spellchecker/tinyspell.php
new file mode 100644 (file)
index 0000000..18345e6
--- /dev/null
@@ -0,0 +1,142 @@
+<?php\r
+/**\r
+ * $RCSfile: tinyspell.php,v $\r
+ * $Revision: 1.1 $\r
+ * $Date: 2006/03/14 17:33:47 $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+       // Ignore the Notice errors for now.\r
+       error_reporting(E_ALL ^ E_NOTICE);\r
+\r
+       require_once("config.php");\r
+\r
+       $id = sanitize($_POST['id'], "loose");\r
+\r
+       if (!$spellCheckerConfig['enabled']) {\r
+               header('Content-type: text/xml; charset=utf-8');\r
+               echo '<?xml version="1.0" encoding="utf-8" ?><res id="' . $id . '" error="true" msg="You must enable the spellchecker by modifying the config.php file." />';\r
+               die;\r
+       }\r
+\r
+       // Basic config\r
+       $defaultLanguage = $spellCheckerConfig['default.language'];\r
+       $defaultMode = $spellCheckerConfig['default.mode'];\r
+\r
+       // Normaly not required to configure\r
+       $defaultSpelling = $spellCheckerConfig['default.spelling'];\r
+       $defaultJargon = $spellCheckerConfig['default.jargon'];\r
+       $defaultEncoding = $spellCheckerConfig['default.encoding'];\r
+       $outputType = "xml"; // Do not change\r
+\r
+       // Get input parameters.\r
+\r
+       $check = urldecode($_REQUEST['check']);\r
+       $cmd = sanitize($_REQUEST['cmd']);\r
+       $lang = sanitize($_REQUEST['lang'], "strict");\r
+       $mode = sanitize($_REQUEST['mode'], "strict");\r
+       $spelling = sanitize($_REQUEST['spelling'], "strict");\r
+       $jargon = sanitize($_REQUEST['jargon'], "strict");\r
+       $encoding = sanitize($_REQUEST['encoding'], "strict");\r
+       $sg = sanitize($_REQUEST['sg'], "bool");\r
+       $words = array();\r
+\r
+       $validRequest = true;\r
+\r
+       if (empty($check))\r
+               $validRequest = false;\r
+\r
+       if (empty($lang))\r
+               $lang = $defaultLanguage;\r
+\r
+       if (empty($mode))\r
+               $mode = $defaultMode;\r
+\r
+       if (empty($spelling))\r
+               $spelling = $defaultSpelling;\r
+\r
+       if (empty($jargon))\r
+               $jargon = $defaultJargon;\r
+\r
+       if (empty($encoding))\r
+               $encoding = $defaultEncoding;\r
+\r
+       function sanitize($str, $type="strict") {\r
+               switch ($type) {\r
+                       case "strict":\r
+                               $str = preg_replace("/[^a-zA-Z0-9_\-]/i", "", $str);\r
+                       break;\r
+                       case "loose":\r
+                               $str = preg_replace("/</i", "&gt;", $str);\r
+                               $str = preg_replace("/>/i", "&lt;", $str);\r
+                       break;\r
+                       case "bool":\r
+                               if ($str == "true" || $str == true)\r
+                                       $str = true;\r
+                               else\r
+                                       $str = false;\r
+                       break;\r
+               }\r
+\r
+               return $str;\r
+       }\r
+\r
+       $result = array();\r
+       $tinyspell = new $spellCheckerConfig['class']($spellCheckerConfig, $lang, $mode, $spelling, $jargon, $encoding);\r
+\r
+       if (count($tinyspell->errorMsg) == 0) {\r
+               switch($cmd) {\r
+                       case "spell":\r
+                               // Space for non-exec version and \n for the exec version.\r
+                               $words = preg_split("/ |\n/", $check, -1, PREG_SPLIT_NO_EMPTY);\r
+                               $result = $tinyspell->checkWords($words);\r
+                       break;\r
+       \r
+                       case "suggest":\r
+                               $result = $tinyspell->getSuggestion($check);\r
+                       break;\r
+\r
+                       default:\r
+                               // Just use this for now.\r
+                               $tinyspell->errorMsg[] = "No command.";\r
+                               $outputType = $outputType . "error";\r
+                       break;\r
+               }\r
+       } else\r
+               $outputType = $outputType . "error";\r
+\r
+       if (!$result)\r
+               $result = array();\r
+\r
+       // Output data\r
+       switch($outputType) {\r
+               case "xml":\r
+                       header('Content-type: text/xml; charset=utf-8');\r
+                       $body  = '<?xml version="1.0" encoding="utf-8" ?>';\r
+                       $body .= "\n";\r
+                       \r
+                       if (count($result) == 0)\r
+                               $body .= '<res id="' . $id . '" cmd="'. $cmd .'" />';\r
+                       else\r
+                               $body .= '<res id="' . $id . '" cmd="'. $cmd .'">'. urlencode(implode(" ", $result)) .'</res>';\r
+\r
+                       echo $body;\r
+               break;\r
+               case "xmlerror";\r
+                       header('Content-type: text/xml; charset=utf-8');\r
+                       $body  = '<?xml version="1.0" encoding="utf-8" ?>';\r
+                       $body .= "\n";\r
+                       $body .= '<res id="' . $id . '" cmd="'. $cmd .'" error="true" msg="'. implode(" ", $tinyspell->errorMsg) .'" />';\r
+                       echo $body;\r
+               break;\r
+               case "html":\r
+                       var_dump($result);\r
+               break;\r
+               case "htmlerror":\r
+                       echo "Error";\r
+               break;\r
+       }\r
+\r
+?>\r
diff --git a/program/js/tiny_mce/plugins/table/cell.htm b/program/js/tiny_mce/plugins/table/cell.htm
new file mode 100644 (file)
index 0000000..7171d4f
--- /dev/null
@@ -0,0 +1,182 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_table_cell_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/cell.js"></script>\r
+       <link href="css/cell.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="tablecell" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+       <form onsubmit="updateAction();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;">{$lang_table_general_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_table_advanced_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>{$lang_table_general_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="align">{$lang_table_align}</label></td>\r
+                                                       <td>\r
+                                                               <select id="align" name="align">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="center">{$lang_table_align_middle}</option>\r
+                                                                       <option value="left">{$lang_table_align_left}</option>\r
+                                                                       <option value="right">{$lang_table_align_right}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+               \r
+                                                       <td><label for="celltype">{$lang_table_cell_type}</label></td>\r
+                                                       <td>\r
+                                                               <select id="celltype" name="celltype">\r
+                                                                       <option value="td">{$lang_table_td}</option>\r
+                                                                       <option value="th">{$lang_table_th}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="valign">{$lang_table_valign}</label></td>\r
+                                                       <td>\r
+                                                               <select id="valign" name="valign">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="top">{$lang_table_align_top}</option>\r
+                                                                       <option value="middle">{$lang_table_align_middle}</option>\r
+                                                                       <option value="bottom">{$lang_table_align_bottom}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="scope">{$lang_table_scope}</label></td>\r
+                                                       <td>\r
+                                                               <select id="scope" name="scope">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="col">{$lang_table_col}</option>\r
+                                                                       <option value="row">{$lang_table_row}</option>\r
+                                                                       <option value="rowgroup">{$lang_table_rowgroup}</option>\r
+                                                                       <option value="colgroup">{$lang_table_colgroup}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="width">{$lang_table_width}</label></td>\r
+                                                       <td><input id="width" name="width" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td>\r
+\r
+                                                       <td><label for="height">{$lang_table_height}</label></td>\r
+                                                       <td><input id="height" name="height" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr id="styleSelectRow">\r
+                                                       <td><label for="class">{$lang_class_name}</label></td>\r
+                                                       <td colspan="3">\r
+                                                               <select id="class" name="class">\r
+                                                                       <option value="" selected="selected">{$lang_not_set}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_advanced_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="id">{$lang_table_id}</label></td> \r
+                                                       <td><input id="id" name="id" type="text" value="" style="width: 200px" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="style">{$lang_table_style}</label></td>\r
+                                                       <td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="dir">{$lang_table_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" style="width: 200px"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_table_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_table_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="lang">{$lang_table_langcode}</label></td> \r
+                                                       <td>\r
+                                                               <input id="lang" name="lang" type="text" value="" style="width: 200px" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="backgroundimage">{$lang_table_bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td>\r
+                                                                               <td id="backgroundimagebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bordercolor">{$lang_table_bordercolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td>\r
+                                                                               <td id="bordercolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div>\r
+                               <select id="action" name="action">\r
+                                       <option value="cell">{$lang_table_cell_cell}</option>\r
+                                       <option value="row">{$lang_table_cell_row}</option>\r
+                                       <option value="all">{$lang_table_cell_all}</option>\r
+                               </select>\r
+                       </div>\r
+\r
+                       <div style="float: left">\r
+                               <div><input type="button" id="insert" name="insert" value="{$lang_update}" onclick="updateAction();" /></div>\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/table/css/cell.css b/program/js/tiny_mce/plugins/table/css/cell.css
new file mode 100644 (file)
index 0000000..a067ecd
--- /dev/null
@@ -0,0 +1,17 @@
+/* CSS file for cell dialog in the table plugin */\r
+\r
+.panel_wrapper div.current {\r
+       height: 200px;\r
+}\r
+\r
+.advfield {\r
+       width: 200px;\r
+}\r
+\r
+#action {\r
+       margin-bottom: 3px;\r
+}\r
+\r
+#class {\r
+       width: 150px;\r
+}
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/css/row.css b/program/js/tiny_mce/plugins/table/css/row.css
new file mode 100644 (file)
index 0000000..1f7755d
--- /dev/null
@@ -0,0 +1,25 @@
+/* CSS file for row dialog in the table plugin */\r
+\r
+.panel_wrapper div.current {\r
+       height: 200px;\r
+}\r
+\r
+.advfield {\r
+       width: 200px;\r
+}\r
+\r
+#action {\r
+       margin-bottom: 3px;\r
+}\r
+\r
+#rowtype,#align,#valign,#class,#height {\r
+       width: 150px;\r
+}\r
+\r
+#height {\r
+       width: 50px;    \r
+}\r
+\r
+.col2 {\r
+       padding-left: 20px;\r
+}\r
diff --git a/program/js/tiny_mce/plugins/table/css/table.css b/program/js/tiny_mce/plugins/table/css/table.css
new file mode 100644 (file)
index 0000000..804f766
--- /dev/null
@@ -0,0 +1,13 @@
+/* CSS file for table dialog in the table plugin */\r
+\r
+.panel_wrapper div.current {\r
+       height: 220px;\r
+}\r
+\r
+.advfield {\r
+       width: 200px;\r
+}\r
+\r
+#class {\r
+       width: 150px;\r
+}\r
diff --git a/program/js/tiny_mce/plugins/table/editor_plugin.js b/program/js/tiny_mce/plugins/table/editor_plugin.js
new file mode 100644 (file)
index 0000000..2f308f8
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('table');var TinyMCE_TablePlugin={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}},initInstance:function(inst){if(tinyMCE.isGecko){var doc=inst.getDoc();tinyMCE.addEvent(doc,"mouseup",TinyMCE_TablePlugin._mouseDownHandler)}inst.tableRowClipboard=null},getControlHTML:function(control_name){var controls=new Array(['table','table.gif','lang_table_desc','mceInsertTable',true],['delete_table','table_delete.gif','lang_table_del','mceTableDelete'],['delete_col','table_delete_col.gif','lang_table_delete_col_desc','mceTableDeleteCol'],['delete_row','table_delete_row.gif','lang_table_delete_row_desc','mceTableDeleteRow'],['col_after','table_insert_col_after.gif','lang_table_col_after_desc','mceTableInsertColAfter'],['col_before','table_insert_col_before.gif','lang_table_col_before_desc','mceTableInsertColBefore'],['row_after','table_insert_row_after.gif','lang_table_row_after_desc','mceTableInsertRowAfter'],['row_before','table_insert_row_before.gif','lang_table_row_before_desc','mceTableInsertRowBefore'],['row_props','table_row_props.gif','lang_table_row_desc','mceTableRowProps',true],['cell_props','table_cell_props.gif','lang_table_cell_desc','mceTableCellProps',true],['split_cells','table_split_cells.gif','lang_table_split_cells_desc','mceTableSplitCells',true],['merge_cells','table_merge_cells.gif','lang_table_merge_cells_desc','mceTableMergeCells',true]);for(var i=0;i<controls.length;i++){var but=controls[i];var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+but[3]+'\', '+(but.length>4?but[4]:false)+(but.length>5?', \''+but[5]+'\'':'')+');return false;';if(but[0]==control_name)return tinyMCE.getButtonHTML(control_name,but[2],'{$pluginurl}/images/'+but[1],but[3],(but.length>4?but[4]:false))}if(control_name=="tablecontrols"){var html="";html+=tinyMCE.getControlHTML("table");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("row_props");html+=tinyMCE.getControlHTML("cell_props");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("row_before");html+=tinyMCE.getControlHTML("row_after");html+=tinyMCE.getControlHTML("delete_row");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("col_before");html+=tinyMCE.getControlHTML("col_after");html+=tinyMCE.getControlHTML("delete_col");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("split_cells");html+=tinyMCE.getControlHTML("merge_cells");return html}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){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":var inst=tinyMCE.getInstanceById(editor_id);inst.execCommand('mceBeginUndoLevel');TinyMCE_TablePlugin._doExecCommand(editor_id,element,command,user_interface,value);inst.execCommand('mceEndUndoLevel');return true}return false},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){var colspan="1",rowspan="1",tdElm;var inst=tinyMCE.getInstanceById(editor_id);tinyMCE.switchClass(editor_id+'_table','mceButtonNormal');tinyMCE.switchClass(editor_id+'_delete_table','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_row_props','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_cell_props','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_row_before','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_row_after','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_delete_row','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_col_before','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_col_after','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_delete_col','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_split_cells','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_merge_cells','mceButtonDisabled');if(tdElm=tinyMCE.getParentElement(node,"td,th")){tinyMCE.switchClass(editor_id+'_cell_props','mceButtonSelected');tinyMCE.switchClass(editor_id+'_delete_table','mceButtonNormal');tinyMCE.switchClass(editor_id+'_row_before','mceButtonNormal');tinyMCE.switchClass(editor_id+'_row_after','mceButtonNormal');tinyMCE.switchClass(editor_id+'_delete_row','mceButtonNormal');tinyMCE.switchClass(editor_id+'_col_before','mceButtonNormal');tinyMCE.switchClass(editor_id+'_col_after','mceButtonNormal');tinyMCE.switchClass(editor_id+'_delete_col','mceButtonNormal');colspan=tinyMCE.getAttrib(tdElm,"colspan");rowspan=tinyMCE.getAttrib(tdElm,"rowspan");colspan=colspan==""?"1":colspan;rowspan=rowspan==""?"1":rowspan;if(colspan!="1"||rowspan!="1")tinyMCE.switchClass(editor_id+'_split_cells','mceButtonNormal')}if(tinyMCE.getParentElement(node,"tr"))tinyMCE.switchClass(editor_id+'_row_props','mceButtonSelected');if(tinyMCE.getParentElement(node,"table")){tinyMCE.switchClass(editor_id+'_table','mceButtonSelected');tinyMCE.switchClass(editor_id+'_merge_cells','mceButtonNormal')}},_mouseDownHandler:function(e){var elm=tinyMCE.isMSIE?event.srcElement:e.target;var focusElm=tinyMCE.selectedInstance.getFocusElement();if(elm.nodeName=="BODY"&&(focusElm.nodeName=="TD"||focusElm.nodeName=="TH"||(focusElm.parentNode&&focusElm.parentNode.nodeName=="TD")||(focusElm.parentNode&&focusElm.parentNode.nodeName=="TH"))){window.setTimeout(function(){var tableElm=tinyMCE.getParentElement(focusElm,"table");tinyMCE.handleVisualAid(tableElm,true,tinyMCE.settings['visual'],tinyMCE.selectedInstance)},10)}},_doExecCommand:function(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id);var focusElm=inst.getFocusElement();var trElm=tinyMCE.getParentElement(focusElm,"tr");var tdElm=tinyMCE.getParentElement(focusElm,"td,th");var tableElm=tinyMCE.getParentElement(focusElm,"table");var doc=inst.contentWindow.document;var tableBorder=tableElm?tableElm.getAttribute("border"):"";if(trElm&&tdElm==null)tdElm=trElm.cells[0];function inArray(ar,v){for(var i=0;i<ar.length;i++){if(ar[i].length>0&&inArray(ar[i],v))return true;if(ar[i]==v)return true}return false}function makeTD(){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;"}function getColRowSpan(td){var colspan=tinyMCE.getAttrib(td,"colspan");var rowspan=tinyMCE.getAttrib(td,"rowspan");colspan=colspan==""?1:parseInt(colspan);rowspan=rowspan==""?1:parseInt(rowspan);return{colspan:colspan,rowspan:rowspan}}function getCellPos(grid,td){var x,y;for(y=0;y<grid.length;y++){for(x=0;x<grid[y].length;x++){if(grid[y][x]==td)return{cellindex:x,rowindex:y}}}return null}function getCell(grid,row,col){if(grid[row]&&grid[row][col])return grid[row][col];return null}function getTableGrid(table){var grid=new Array(),rows=table.rows,x,y,td,sd,xstart,x2,y2;for(y=0;y<rows.length;y++){for(x=0;x<rows[y].cells.length;x++){td=rows[y].cells[x];sd=getColRowSpan(td);for(xstart=x;grid[y]&&grid[y][xstart];xstart++);for(y2=y;y2<y+sd['rowspan'];y2++){if(!grid[y2])grid[y2]=new Array();for(x2=xstart;x2<xstart+sd['colspan'];x2++)grid[y2][x2]=td}}}return grid}function trimRow(table,tr,td,new_tr){var grid=getTableGrid(table),cpos=getCellPos(grid,td);var cells,lastElm;if(new_tr.cells.length!=tr.childNodes.length){cells=tr.childNodes;lastElm=null;for(var x=0;td=getCell(grid,cpos.rowindex,x);x++){var remove=true;var sd=getColRowSpan(td);if(inArray(cells,td)){new_tr.childNodes[x]._delete=true}else if((lastElm==null||td!=lastElm)&&sd.colspan>1){for(var i=x;i<x+td.colSpan;i++)new_tr.childNodes[i]._delete=true}if((lastElm==null||td!=lastElm)&&sd.rowspan>1)td.rowSpan=sd.rowspan+1;lastElm=td}deleteMarked(tableElm)}}function prevElm(node,name){while((node=node.previousSibling)!=null){if(node.nodeName==name)return node}return null}function nextElm(node,names){var namesAr=names.split(',');while((node=node.nextSibling)!=null){for(var i=0;i<namesAr.length;i++){if(node.nodeName.toLowerCase()==namesAr[i].toLowerCase())return node}}return null}function deleteMarked(tbl){if(tbl.rows==0)return;var tr=tbl.rows[0];do{var next=nextElm(tr,"TR");if(tr._delete){tr.parentNode.removeChild(tr);continue}var td=tr.cells[0];if(td.cells>1){do{var nexttd=nextElm(td,"TD,TH");if(td._delete)td.parentNode.removeChild(td)}while((td=nexttd)!=null)}}while((tr=next)!=null)}function addRows(td_elm,tr_elm,rowspan){td_elm.rowSpan=1;var trNext=nextElm(tr_elm,"TR");for(var i=1;i<rowspan&&trNext;i++){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";if(tinyMCE.isMSIE)trNext.insertBefore(newTD,trNext.cells(td_elm.cellIndex));else trNext.insertBefore(newTD,trNext.cells[td_elm.cellIndex]);trNext=nextElm(trNext,"TR")}}function copyRow(doc,table,tr){var grid=getTableGrid(table);var newTR=tr.cloneNode(false);var cpos=getCellPos(grid,tr.cells[0]);var lastCell=null;var tableBorder=tinyMCE.getAttrib(table,"border");var tdElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){var newTD=null;if(lastCell!=tdElm){for(var i=0;i<tr.cells.length;i++){if(tdElm==tr.cells[i]){newTD=tdElm.cloneNode(true);break}}}if(newTD==null){newTD=doc.createElement("td");newTD.innerHTML="&nbsp;"}newTD.colSpan=1;newTD.rowSpan=1;newTR.appendChild(newTD);lastCell=tdElm}return newTR}switch(command){case"mceTableRowProps":if(trElm==null)return true;if(user_interface){var template=new Array();template['file']='../../plugins/table/row.htm';template['width']=380;template['height']=295;template['width']+=tinyMCE.getLang('lang_table_rowprops_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_rowprops_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes"})}return true;case"mceTableCellProps":if(tdElm==null)return true;if(user_interface){var template=new Array();template['file']='../../plugins/table/cell.htm';template['width']=380;template['height']=295;template['width']+=tinyMCE.getLang('lang_table_cellprops_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_cellprops_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes"})}return true;case"mceInsertTable":if(user_interface){var template=new Array();template['file']='../../plugins/table/table.htm';template['width']=380;template['height']=295;template['width']+=tinyMCE.getLang('lang_table_table_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_table_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes",action:value})}return true;case"mceTableDelete":var table=tinyMCE.getParentElement(inst.getFocusElement(),"table");if(table){table.parentNode.removeChild(table);inst.repaint()}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(!tableElm)return true;if(trElm&&tableElm!=trElm.parentNode)tableElm=trElm.parentNode;if(tableElm&&trElm){switch(command){case"mceTableCutRow":if(!trElm||!tdElm)return true;inst.tableRowClipboard=copyRow(doc,tableElm,trElm);inst.execCommand("mceTableDeleteRow");break;case"mceTableCopyRow":if(!trElm||!tdElm)return true;inst.tableRowClipboard=copyRow(doc,tableElm,trElm);break;case"mceTablePasteRowBefore":if(!trElm||!tdElm)return true;var newTR=inst.tableRowClipboard.cloneNode(true);var prevTR=prevElm(trElm,"TR");if(prevTR!=null)trimRow(tableElm,prevTR,prevTR.cells[0],newTR);trElm.parentNode.insertBefore(newTR,trElm);break;case"mceTablePasteRowAfter":if(!trElm||!tdElm)return true;var nextTR=nextElm(trElm,"TR");var newTR=inst.tableRowClipboard.cloneNode(true);trimRow(tableElm,trElm,tdElm,newTR);if(nextTR==null)trElm.parentNode.appendChild(newTR);else nextTR.parentNode.insertBefore(newTR,nextTR);break;case"mceTableInsertRowBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var newTR=doc.createElement("tr");var lastTDElm=null;cpos.rowindex--;if(cpos.rowindex<0)cpos.rowindex=0;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['rowspan']==1){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";newTD.colSpan=tdElm.colSpan;newTR.appendChild(newTD)}else tdElm.rowSpan=sd['rowspan']+1;lastTDElm=tdElm}}trElm.parentNode.insertBefore(newTR,trElm);grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex+1,cpos.cellindex),tinyMCE.isGecko,true);break;case"mceTableInsertRowAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var newTR=doc.createElement("tr");var lastTDElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['rowspan']==1){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";newTD.colSpan=tdElm.colSpan;newTR.appendChild(newTD)}else tdElm.rowSpan=sd['rowspan']+1;lastTDElm=tdElm}}if(newTR.hasChildNodes()){var nextTR=nextElm(trElm,"TR");if(nextTR)nextTR.parentNode.insertBefore(newTR,nextTR);else tableElm.appendChild(newTR)}grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,cpos.cellindex),tinyMCE.isGecko,true);break;case"mceTableDeleteRow":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);if(grid.length==1){tableElm=tinyMCE.getParentElement(tableElm,"table");tableElm.parentNode.removeChild(tableElm);return true}var cells=trElm.cells;var nextTR=nextElm(trElm,"TR");for(var x=0;x<cells.length;x++){if(cells[x].rowSpan>1){var newTD=cells[x].cloneNode(true);var sd=getColRowSpan(cells[x]);newTD.rowSpan=sd.rowspan-1;var nextTD=nextTR.cells[x];if(nextTD==null)nextTR.appendChild(newTD);else nextTR.insertBefore(newTD,nextTD)}}var lastTDElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd.rowspan>1){tdElm.rowSpan=sd.rowspan-1}else{trElm=tdElm.parentNode;if(trElm.parentNode)trElm._delete=true}lastTDElm=tdElm}}deleteMarked(tableElm);cpos.rowindex--;if(cpos.rowindex<0)cpos.rowindex=0;grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,0),tinyMCE.isGecko,true);break;case"mceTableInsertColBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);newTD.innerHTML="&nbsp;";newTD.rowSpan=tdElm.rowSpan;tdElm.parentNode.insertBefore(newTD,tdElm)}else tdElm.colSpan++;lastTDElm=tdElm}}grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,cpos.cellindex+1),tinyMCE.isGecko,true);break;case"mceTableInsertColAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);newTD.innerHTML="&nbsp;";newTD.rowSpan=tdElm.rowSpan;var nextTD=nextElm(tdElm,"TD,TH");if(nextTD==null)tdElm.parentNode.appendChild(newTD);else nextTD.parentNode.insertBefore(newTD,nextTD)}else tdElm.colSpan++;lastTDElm=tdElm}}grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,cpos.cellindex),tinyMCE.isGecko,true);break;case"mceTableDeleteCol":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;if(grid.length>1&&grid[0].length<=1){tableElm=tinyMCE.getParentElement(tableElm,"table");tableElm.parentNode.removeChild(tableElm);return true}for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']>1)tdElm.colSpan=sd['colspan']-1;else{if(tdElm.parentNode)tdElm.parentNode.removeChild(tdElm)}lastTDElm=tdElm}}cpos.cellindex--;if(cpos.cellindex<0)cpos.cellindex=0;grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,0),tinyMCE.isGecko,true);break;case"mceTableSplitCells":if(!trElm||!tdElm)return true;var spandata=getColRowSpan(tdElm);var colspan=spandata["colspan"];var rowspan=spandata["rowspan"];if(colspan>1||rowspan>1){tdElm.colSpan=1;for(var i=1;i<colspan;i++){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";trElm.insertBefore(newTD,nextElm(tdElm,"TD,TH"));if(rowspan>1)addRows(newTD,trElm,rowspan)}addRows(tdElm,trElm,rowspan)}tableElm=tinyMCE.getParentElement(inst.getFocusElement(),"table");break;case"mceTableMergeCells":var rows=new Array();var sel=inst.getSel();var grid=getTableGrid(tableElm);if(tinyMCE.isMSIE||sel.rangeCount==1){if(user_interface){var template=new Array();var sp=getColRowSpan(tdElm);template['file']='../../plugins/table/merge_cells.htm';template['width']=250;template['height']=105+(tinyMCE.isNS7?25:0);template['width']+=tinyMCE.getLang('lang_table_merge_cells_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_merge_cells_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes",action:"update",numcols:sp.colspan,numrows:sp.rowspan});return true}else{var numRows=parseInt(value['numrows']);var numCols=parseInt(value['numcols']);var cpos=getCellPos(grid,tdElm);if((""+numRows)=="NaN")numRows=1;if((""+numCols)=="NaN")numCols=1;var tRows=tableElm.rows;for(var y=cpos.rowindex;y<grid.length;y++){var rowCells=new Array();for(var x=cpos.cellindex;x<grid[y].length;x++){var td=getCell(grid,y,x);if(td&&!inArray(rows,td)&&!inArray(rowCells,td)){var cp=getCellPos(grid,td);if(cp.cellindex<cpos.cellindex+numCols&&cp.rowindex<cpos.rowindex+numRows)rowCells[rowCells.length]=td}}if(rowCells.length>0)rows[rows.length]=rowCells}}}else{var cells=new Array();var sel=inst.getSel();var lastTR=null;var curRow=null;var x1=-1,y1=-1,x2,y2;if(sel.rangeCount<2)return true;for(var i=0;i<sel.rangeCount;i++){var rng=sel.getRangeAt(i);var tdElm=rng.startContainer.childNodes[rng.startOffset];if(!tdElm)break;if(tdElm.nodeName=="TD")cells[cells.length]=tdElm}var tRows=tableElm.rows;for(var y=0;y<tRows.length;y++){var rowCells=new Array();for(var x=0;x<tRows[y].cells.length;x++){var td=tRows[y].cells[x];for(var i=0;i<cells.length;i++){if(td==cells[i]){rowCells[rowCells.length]=td}}}if(rowCells.length>0)rows[rows.length]=rowCells}var curRow=new Array();var lastTR=null;for(var y=0;y<grid.length;y++){for(var x=0;x<grid[y].length;x++){grid[y][x]._selected=false;for(var i=0;i<cells.length;i++){if(grid[y][x]==cells[i]){if(x1==-1){x1=x;y1=y}x2=x;y2=y;grid[y][x]._selected=true}}}}for(var y=y1;y<=y2;y++){for(var x=x1;x<=x2;x++){if(!grid[y][x]._selected){alert("Invalid selection for merge.");return true}}}}var rowSpan=1,colSpan=1;var lastRowSpan=-1;for(var y=0;y<rows.length;y++){var rowColSpan=0;for(var x=0;x<rows[y].length;x++){var sd=getColRowSpan(rows[y][x]);rowColSpan+=sd['colspan'];if(lastRowSpan!=-1&&sd['rowspan']!=lastRowSpan){alert("Invalid selection for merge.");return true}lastRowSpan=sd['rowspan']}if(rowColSpan>colSpan)colSpan=rowColSpan;lastRowSpan=-1}var lastColSpan=-1;for(var x=0;x<rows[0].length;x++){var colRowSpan=0;for(var y=0;y<rows.length;y++){var sd=getColRowSpan(rows[y][x]);colRowSpan+=sd['rowspan'];if(lastColSpan!=-1&&sd['colspan']!=lastColSpan){alert("Invalid selection for merge.");return true}lastColSpan=sd['colspan']}if(colRowSpan>rowSpan)rowSpan=colRowSpan;lastColSpan=-1}tdElm=rows[0][0];tdElm.rowSpan=rowSpan;tdElm.colSpan=colSpan;for(var y=0;y<rows.length;y++){for(var x=0;x<rows[y].length;x++){var html=rows[y][x].innerHTML;var chk=tinyMCE.regexpReplace(html,"[ \t\r\n]","");if(chk!="<br/>"&&chk!="<br>"&&chk!="&nbsp;"&&(x+y>0))tdElm.innerHTML+=html;if(rows[y][x]!=tdElm&&!rows[y][x]._deleted){var cpos=getCellPos(grid,rows[y][x]);var tr=rows[y][x].parentNode;tr.removeChild(rows[y][x]);rows[y][x]._deleted=true;if(!tr.hasChildNodes()){tr.parentNode.removeChild(tr);var lastCell=null;for(var x=0;cellElm=getCell(grid,cpos.rowindex,x);x++){if(cellElm!=lastCell&&cellElm.rowSpan>1)cellElm.rowSpan--;lastCell=cellElm}if(tdElm.rowSpan>1)tdElm.rowSpan--}}}}break}tableElm=tinyMCE.getParentElement(inst.getFocusElement(),"table");tinyMCE.handleVisualAid(tableElm,true,tinyMCE.settings['visual'],tinyMCE.selectedInstance);tinyMCE.triggerNodeChange();inst.repaint()}return true}return false}};tinyMCE.addPlugin("table",TinyMCE_TablePlugin);
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/editor_plugin_src.js b/program/js/tiny_mce/plugins/table/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..75aaa4d
--- /dev/null
@@ -0,0 +1,1073 @@
+/**\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
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('table');\r
+\r
+var TinyMCE_TablePlugin = {\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
+       initInstance : function(inst) {\r
+               if (tinyMCE.isGecko) {\r
+                       var doc = inst.getDoc();\r
+                       tinyMCE.addEvent(doc, "mouseup", TinyMCE_TablePlugin._mouseDownHandler);\r
+               }\r
+\r
+               inst.tableRowClipboard = null;\r
+       },\r
+\r
+       /**\r
+        * Returns the HTML contents of the table control.\r
+        */\r
+       getControlHTML : function(control_name) {\r
+               var controls = new Array(\r
+                       ['table', 'table.gif', 'lang_table_desc', 'mceInsertTable', true],\r
+                       ['delete_table', 'table_delete.gif', 'lang_table_del', 'mceTableDelete'],\r
+                       ['delete_col', 'table_delete_col.gif', 'lang_table_delete_col_desc', 'mceTableDeleteCol'],\r
+                       ['delete_row', 'table_delete_row.gif', 'lang_table_delete_row_desc', 'mceTableDeleteRow'],\r
+                       ['col_after', 'table_insert_col_after.gif', 'lang_table_col_after_desc', 'mceTableInsertColAfter'],\r
+                       ['col_before', 'table_insert_col_before.gif', 'lang_table_col_before_desc', 'mceTableInsertColBefore'],\r
+                       ['row_after', 'table_insert_row_after.gif', 'lang_table_row_after_desc', 'mceTableInsertRowAfter'],\r
+                       ['row_before', 'table_insert_row_before.gif', 'lang_table_row_before_desc', 'mceTableInsertRowBefore'],\r
+                       ['row_props', 'table_row_props.gif', 'lang_table_row_desc', 'mceTableRowProps', true],\r
+                       ['cell_props', 'table_cell_props.gif', 'lang_table_cell_desc', 'mceTableCellProps', true],\r
+                       ['split_cells', 'table_split_cells.gif', 'lang_table_split_cells_desc', 'mceTableSplitCells', true],\r
+                       ['merge_cells', 'table_merge_cells.gif', 'lang_table_merge_cells_desc', 'mceTableMergeCells', true]);\r
+\r
+               // Render table control\r
+               for (var i=0; i<controls.length; i++) {\r
+                       var but = controls[i];\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + but[3] + '\', ' + (but.length > 4 ? but[4] : false) + (but.length > 5 ? ', \'' + but[5] + '\'' : '') + ');return false;';\r
+\r
+                       if (but[0] == control_name)\r
+                               return tinyMCE.getButtonHTML(control_name, but[2], '{$pluginurl}/images/'+ but[1], but[3], (but.length > 4 ? but[4] : false));\r
+               }\r
+\r
+               // Special tablecontrols\r
+               if (control_name == "tablecontrols") {\r
+                       var html = "";\r
+\r
+                       html += tinyMCE.getControlHTML("table");\r
+                       html += tinyMCE.getControlHTML("separator");\r
+                       html += tinyMCE.getControlHTML("row_props");\r
+                       html += tinyMCE.getControlHTML("cell_props");\r
+                       html += tinyMCE.getControlHTML("separator");\r
+                       html += tinyMCE.getControlHTML("row_before");\r
+                       html += tinyMCE.getControlHTML("row_after");\r
+                       html += tinyMCE.getControlHTML("delete_row");\r
+                       html += tinyMCE.getControlHTML("separator");\r
+                       html += tinyMCE.getControlHTML("col_before");\r
+                       html += tinyMCE.getControlHTML("col_after");\r
+                       html += tinyMCE.getControlHTML("delete_col");\r
+                       html += tinyMCE.getControlHTML("separator");\r
+                       html += tinyMCE.getControlHTML("split_cells");\r
+                       html += tinyMCE.getControlHTML("merge_cells");\r
+\r
+                       return html;\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       /**\r
+        * Executes the table commands.\r
+        */\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Is table command\r
+               switch (command) {\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
+                               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+                               inst.execCommand('mceBeginUndoLevel');\r
+                               TinyMCE_TablePlugin._doExecCommand(editor_id, element, command, user_interface, value);\r
+                               inst.execCommand('mceEndUndoLevel');\r
+\r
+                               return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               var colspan = "1", rowspan = "1", tdElm;\r
+\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+               // Reset table controls\r
+               tinyMCE.switchClass(editor_id + '_table', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_delete_table', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_row_props', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_cell_props', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_row_before', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_row_after', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_delete_row', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_col_before', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_col_after', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_delete_col', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_split_cells', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_merge_cells', 'mceButtonDisabled');\r
+\r
+               // Within a td element\r
+               if (tdElm = tinyMCE.getParentElement(node, "td,th")) {\r
+                       tinyMCE.switchClass(editor_id + '_cell_props', 'mceButtonSelected');\r
+                       tinyMCE.switchClass(editor_id + '_delete_table', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_row_before', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_row_after', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_delete_row', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_col_before', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_col_after', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_delete_col', 'mceButtonNormal');\r
+\r
+                       colspan = tinyMCE.getAttrib(tdElm, "colspan");\r
+                       rowspan = tinyMCE.getAttrib(tdElm, "rowspan");\r
+\r
+                       colspan = colspan == "" ? "1" : colspan;\r
+                       rowspan = rowspan == "" ? "1" : rowspan;\r
+\r
+                       if (colspan != "1" || rowspan != "1")\r
+                               tinyMCE.switchClass(editor_id + '_split_cells', 'mceButtonNormal');\r
+               }\r
+\r
+               // Within a tr element\r
+               if (tinyMCE.getParentElement(node, "tr"))\r
+                       tinyMCE.switchClass(editor_id + '_row_props', 'mceButtonSelected');\r
+\r
+               // Within table\r
+               if (tinyMCE.getParentElement(node, "table")) {\r
+                       tinyMCE.switchClass(editor_id + '_table', 'mceButtonSelected');\r
+                       tinyMCE.switchClass(editor_id + '_merge_cells', 'mceButtonNormal');\r
+               }\r
+       },\r
+\r
+       // Private plugin internal methods\r
+\r
+       _mouseDownHandler : function(e) {\r
+               var elm = tinyMCE.isMSIE ? event.srcElement : e.target;\r
+               var focusElm = tinyMCE.selectedInstance.getFocusElement();\r
+\r
+               // If press on special Mozilla create TD/TR thingie\r
+               if (elm.nodeName == "BODY" && (focusElm.nodeName == "TD" || focusElm.nodeName == "TH" || (focusElm.parentNode && focusElm.parentNode.nodeName == "TD") ||(focusElm.parentNode && focusElm.parentNode.nodeName == "TH") )) {\r
+                       window.setTimeout(function() {\r
+                               var tableElm = tinyMCE.getParentElement(focusElm, "table");\r
+                               tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance);\r
+                       }, 10);\r
+               }\r
+       },\r
+\r
+       /**\r
+        * Executes the table commands.\r
+        */\r
+       _doExecCommand : function(editor_id, element, command, user_interface, value) {\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+               var focusElm = inst.getFocusElement();\r
+               var trElm = tinyMCE.getParentElement(focusElm, "tr");\r
+               var tdElm = tinyMCE.getParentElement(focusElm, "td,th");\r
+               var tableElm = tinyMCE.getParentElement(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
+               // ------- Inner functions ---------\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
+\r
+                       return false;\r
+               }\r
+\r
+               function makeTD() {\r
+                       var newTD = doc.createElement("td");\r
+                       newTD.innerHTML = "&nbsp;";\r
+               }\r
+\r
+               function getColRowSpan(td) {\r
+                       var colspan = tinyMCE.getAttrib(td, "colspan");\r
+                       var rowspan = tinyMCE.getAttrib(td, "rowspan");\r
+\r
+                       colspan = colspan == "" ? 1 : parseInt(colspan);\r
+                       rowspan = rowspan == "" ? 1 : parseInt(rowspan);\r
+\r
+                       return {colspan : colspan, rowspan : rowspan};\r
+               }\r
+\r
+               function getCellPos(grid, td) {\r
+                       var x, y;\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
+\r
+                       return null;\r
+               }\r
+\r
+               function getCell(grid, row, col) {\r
+                       if (grid[row] && grid[row][col])\r
+                               return grid[row][col];\r
+\r
+                       return null;\r
+               }\r
+\r
+               function getTableGrid(table) {\r
+                       var grid = new Array(), rows = table.rows, x, y, td, sd, xstart, x2, y2;\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
+\r
+                                       // All ready filled\r
+                                       for (xstart = x; grid[y] && grid[y][xstart]; xstart++) ;\r
+\r
+                                       // Fill box\r
+                                       for (y2=y; y2<y+sd['rowspan']; y2++) {\r
+                                               if (!grid[y2])\r
+                                                       grid[y2] = new Array();\r
+\r
+                                               for (x2=xstart; x2<xstart+sd['colspan']; x2++)\r
+                                                       grid[y2][x2] = td;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       return grid;\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
+\r
+                                       if ((lastElm == null || td != lastElm) && sd.rowspan > 1)\r
+                                               td.rowSpan = sd.rowspan + 1;\r
+\r
+                                       lastElm = td;\r
+                               }\r
+\r
+                               deleteMarked(tableElm);\r
+                       }\r
+               }\r
+\r
+               function prevElm(node, name) {\r
+                       while ((node = node.previousSibling) != null) {\r
+                               if (node.nodeName == name)\r
+                                       return node;\r
+                       }\r
+\r
+                       return null;\r
+               }\r
+\r
+               function nextElm(node, names) {\r
+                       var namesAr = names.split(',');\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
+                               }\r
+                       }\r
+\r
+                       return null;\r
+               }\r
+\r
+               function deleteMarked(tbl) {\r
+                       if (tbl.rows == 0)\r
+                               return;\r
+\r
+                       var tr = tbl.rows[0];\r
+                       do {\r
+                               var next = nextElm(tr, "TR");\r
+\r
+                               // Delete row\r
+                               if (tr._delete) {\r
+                                       tr.parentNode.removeChild(tr);\r
+                                       continue;\r
+                               }\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
+\r
+                                               if (td._delete)\r
+                                                       td.parentNode.removeChild(td);\r
+                                       } while ((td = nexttd) != null);\r
+                               }\r
+                       } while ((tr = next) != null);\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
+                               newTD.innerHTML = "&nbsp;";\r
+\r
+                               if (tinyMCE.isMSIE)\r
+                                       trNext.insertBefore(newTD, trNext.cells(td_elm.cellIndex));\r
+                               else\r
+                                       trNext.insertBefore(newTD, trNext.cells[td_elm.cellIndex]);\r
+\r
+                               trNext = nextElm(trNext, "TR");\r
+                       }\r
+               }\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 = tinyMCE.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
+                               }\r
+\r
+                               if (newTD == null) {\r
+                                       newTD = doc.createElement("td");\r
+                                       newTD.innerHTML = "&nbsp;";\r
+                               }\r
+\r
+                               // Reset col/row span\r
+                               newTD.colSpan = 1;\r
+                               newTD.rowSpan = 1;\r
+\r
+                               newTR.appendChild(newTD);\r
+\r
+                               lastCell = tdElm;\r
+                       }\r
+\r
+                       return newTR;\r
+               }\r
+\r
+               // ---- Commands -----\r
+\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceTableRowProps":\r
+                               if (trElm == null)\r
+                                       return true;\r
+\r
+                               if (user_interface) {\r
+                                       // Setup template\r
+                                       var template = new Array();\r
+\r
+                                       template['file'] = '../../plugins/table/row.htm';\r
+                                       template['width'] = 380;\r
+                                       template['height'] = 295;\r
+\r
+                                       // Language specific width and height addons\r
+                                       template['width'] += tinyMCE.getLang('lang_table_rowprops_delta_width', 0);\r
+                                       template['height'] += tinyMCE.getLang('lang_table_rowprops_delta_height', 0);\r
+\r
+                                       // Open window\r
+                                       tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes"});\r
+                               }\r
+\r
+                               return true;\r
+\r
+                       case "mceTableCellProps":\r
+                               if (tdElm == null)\r
+                                       return true;\r
+\r
+                               if (user_interface) {\r
+                                       // Setup template\r
+                                       var template = new Array();\r
+\r
+                                       template['file'] = '../../plugins/table/cell.htm';\r
+                                       template['width'] = 380;\r
+                                       template['height'] = 295;\r
+\r
+                                       // Language specific width and height addons\r
+                                       template['width'] += tinyMCE.getLang('lang_table_cellprops_delta_width', 0);\r
+                                       template['height'] += tinyMCE.getLang('lang_table_cellprops_delta_height', 0);\r
+\r
+                                       // Open window\r
+                                       tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes"});\r
+                               }\r
+\r
+                               return true;\r
+\r
+                       case "mceInsertTable":\r
+                               if (user_interface) {\r
+                                       // Setup template\r
+                                       var template = new Array();\r
+\r
+                                       template['file'] = '../../plugins/table/table.htm';\r
+                                       template['width'] = 380;\r
+                                       template['height'] = 295;\r
+\r
+                                       // Language specific width and height addons\r
+                                       template['width'] += tinyMCE.getLang('lang_table_table_delta_width', 0);\r
+                                       template['height'] += tinyMCE.getLang('lang_table_table_delta_height', 0);\r
+\r
+                                       // Open window\r
+                                       tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes", action : value});\r
+                               }\r
+\r
+                               return true;\r
+\r
+                       case "mceTableDelete":\r
+                               var table = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+                               if (table) {\r
+                                       table.parentNode.removeChild(table);\r
+                                       inst.repaint();\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
+                                                                               newTD.innerHTML = "&nbsp;";\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
+\r
+                                                       trElm.parentNode.insertBefore(newTR, trElm);\r
+\r
+                                                       grid = getTableGrid(tableElm);\r
+                                                       inst.selection.selectNode(getCell(grid, cpos.rowindex + 1, cpos.cellindex), tinyMCE.isGecko, true); // Only collape on gecko\r
+                                               break;\r
+\r
+                                               case "mceTableInsertRowAfter":\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
+                                                       // 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
+                                                                               newTD.innerHTML = "&nbsp;";\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
+\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
+\r
+                                                       grid = getTableGrid(tableElm);\r
+                                                       inst.selection.selectNode(getCell(grid, cpos.rowindex, cpos.cellindex), tinyMCE.isGecko, true); // Only collape on gecko\r
+                                               break;\r
+\r
+                                               case "mceTableDeleteRow":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+\r
+                                                       var grid = getTableGrid(tableElm);\r
+                                                       var cpos = getCellPos(grid, tdElm);\r
+\r
+                                                       // Only one row, remove whole table\r
+                                                       if (grid.length == 1) {\r
+                                                               tableElm = tinyMCE.getParentElement(tableElm, "table"); // Look for table instead of tbody\r
+                                                               tableElm.parentNode.removeChild(tableElm);\r
+                                                               return true;\r
+                                                       }\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
+\r
+                                                                       newTD.rowSpan = sd.rowspan - 1;\r
+\r
+                                                                       var nextTD = nextTR.cells[x];\r
+\r
+                                                                       if (nextTD == null)\r
+                                                                               nextTR.appendChild(newTD);\r
+                                                                       else\r
+                                                                               nextTR.insertBefore(newTD, nextTD);\r
+                                                               }\r
+                                                       }\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
+\r
+                                                                       if (sd.rowspan > 1) {\r
+                                                                               tdElm.rowSpan = sd.rowspan - 1;\r
+                                                                       } else {\r
+                                                                               trElm = tdElm.parentNode;\r
+\r
+                                                                               if (trElm.parentNode)\r
+                                                                                       trElm._delete = true;\r
+                                                                       }\r
+\r
+                                                                       lastTDElm = tdElm;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       deleteMarked(tableElm);\r
+\r
+                                                       cpos.rowindex--;\r
+                                                       if (cpos.rowindex < 0)\r
+                                                               cpos.rowindex = 0;\r
+\r
+                                                       // Recalculate grid and select\r
+                                                       grid = getTableGrid(tableElm);\r
+                                                       inst.selection.selectNode(getCell(grid, cpos.rowindex, 0), tinyMCE.isGecko, true); // Only collape on gecko\r
+                                               break;\r
+\r
+                                               case "mceTableInsertColBefore":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+\r
+                                                       var grid = getTableGrid(tableElm);\r
+                                                       var cpos = getCellPos(grid, tdElm);\r
+                                                       var lastTDElm = null;\r
+\r
+                                                       for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
+                                                               if (tdElm != lastTDElm) {\r
+                                                                       var sd = getColRowSpan(tdElm);\r
+\r
+                                                                       if (sd['colspan'] == 1) {\r
+                                                                               var newTD = doc.createElement(tdElm.nodeName);\r
+\r
+                                                                               newTD.innerHTML = "&nbsp;";\r
+                                                                               newTD.rowSpan = tdElm.rowSpan;\r
+\r
+                                                                               tdElm.parentNode.insertBefore(newTD, tdElm);\r
+                                                                       } else\r
+                                                                               tdElm.colSpan++;\r
+\r
+                                                                       lastTDElm = tdElm;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       grid = getTableGrid(tableElm);\r
+                                                       inst.selection.selectNode(getCell(grid, cpos.rowindex, cpos.cellindex + 1), tinyMCE.isGecko, true); // Only collape on gecko\r
+                                               break;\r
+\r
+                                               case "mceTableInsertColAfter":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+\r
+                                                       var grid = getTableGrid(tableElm);\r
+                                                       var cpos = getCellPos(grid, tdElm);\r
+                                                       var lastTDElm = null;\r
+\r
+                                                       for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
+                                                               if (tdElm != lastTDElm) {\r
+                                                                       var sd = getColRowSpan(tdElm);\r
+\r
+                                                                       if (sd['colspan'] == 1) {\r
+                                                                               var newTD = doc.createElement(tdElm.nodeName);\r
+\r
+                                                                               newTD.innerHTML = "&nbsp;";\r
+                                                                               newTD.rowSpan = tdElm.rowSpan;\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
+\r
+                                                                       lastTDElm = tdElm;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       grid = getTableGrid(tableElm);\r
+                                                       inst.selection.selectNode(getCell(grid, cpos.rowindex, cpos.cellindex), tinyMCE.isGecko, true); // Only collape on gecko\r
+                                               break;\r
+\r
+                                               case "mceTableDeleteCol":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+\r
+                                                       var grid = getTableGrid(tableElm);\r
+                                                       var cpos = getCellPos(grid, tdElm);\r
+                                                       var lastTDElm = null;\r
+\r
+                                                       // Only one col, remove whole table\r
+                                                       if (grid.length > 1 && grid[0].length <= 1) {\r
+                                                               tableElm = tinyMCE.getParentElement(tableElm, "table"); // Look for table instead of tbody\r
+                                                               tableElm.parentNode.removeChild(tableElm);\r
+                                                               return true;\r
+                                                       }\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
+\r
+                                                                       if (sd['colspan'] > 1)\r
+                                                                               tdElm.colSpan = sd['colspan'] - 1;\r
+                                                                       else {\r
+                                                                               if (tdElm.parentNode)\r
+                                                                                       tdElm.parentNode.removeChild(tdElm);\r
+                                                                       }\r
+\r
+                                                                       lastTDElm = tdElm;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       cpos.cellindex--;\r
+                                                       if (cpos.cellindex < 0)\r
+                                                               cpos.cellindex = 0;\r
+\r
+                                                       // Recalculate grid and select\r
+                                                       grid = getTableGrid(tableElm);\r
+                                                       inst.selection.selectNode(getCell(grid, cpos.rowindex, 0), tinyMCE.isGecko, true); // Only collape on gecko\r
+                                               break;\r
+\r
+                                       case "mceTableSplitCells":\r
+                                               if (!trElm || !tdElm)\r
+                                                       return true;\r
+\r
+                                               var spandata = getColRowSpan(tdElm);\r
+\r
+                                               var colspan = spandata["colspan"];\r
+                                               var rowspan = spandata["rowspan"];\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
+\r
+                                                               newTD.innerHTML = "&nbsp;";\r
+\r
+                                                               trElm.insertBefore(newTD, nextElm(tdElm, "TD,TH"));\r
+\r
+                                                               if (rowspan > 1)\r
+                                                                       addRows(newTD, trElm, rowspan);\r
+                                                       }\r
+\r
+                                                       addRows(tdElm, trElm, rowspan);\r
+                                               }\r
+\r
+                                               // Apply visual aids\r
+                                               tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+                                               break;\r
+\r
+                                       case "mceTableMergeCells":\r
+                                               var rows = new Array();\r
+                                               var sel = inst.getSel();\r
+                                               var grid = getTableGrid(tableElm);\r
+\r
+                                               if (tinyMCE.isMSIE || sel.rangeCount == 1) {\r
+                                                       if (user_interface) {\r
+                                                               // Setup template\r
+                                                               var template = new Array();\r
+                                                               var sp = getColRowSpan(tdElm);\r
+\r
+                                                               template['file'] = '../../plugins/table/merge_cells.htm';\r
+                                                               template['width'] = 250;\r
+                                                               template['height'] = 105 + (tinyMCE.isNS7 ? 25 : 0);\r
+\r
+                                                               // Language specific width and height addons\r
+                                                               template['width'] += tinyMCE.getLang('lang_table_merge_cells_delta_width', 0);\r
+                                                               template['height'] += tinyMCE.getLang('lang_table_merge_cells_delta_height', 0);\r
+\r
+                                                               // Open window\r
+                                                               tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes", action : "update", numcols : sp.colspan, numrows : sp.rowspan});\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 = new Array();\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
+\r
+                                                               //return true;\r
+                                                       }\r
+                                               } else {\r
+                                                       var cells = new Array();\r
+                                                       var sel = inst.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
+                                                                       break;\r
+\r
+                                                               if (tdElm.nodeName == "TD")\r
+                                                                       cells[cells.length] = tdElm;\r
+                                                       }\r
+\r
+                                                       // Get rows and cells\r
+                                                       var tRows = tableElm.rows;\r
+                                                       for (var y=0; y<tRows.length; y++) {\r
+                                                               var rowCells = new Array();\r
+\r
+                                                               for (var x=0; x<tRows[y].cells.length; x++) {\r
+                                                                       var td = tRows[y].cells[x];\r
+\r
+                                                                       for (var i=0; i<cells.length; i++) {\r
+                                                                               if (td == cells[i]) {\r
+                                                                                       rowCells[rowCells.length] = td;\r
+                                                                               }\r
+                                                                       }\r
+                                                               }\r
+\r
+                                                               if (rowCells.length > 0)\r
+                                                                       rows[rows.length] = rowCells;\r
+                                                       }\r
+\r
+                                                       // Find selected cells in grid and box\r
+                                                       var curRow = new Array();\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
+\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
+                                               }\r
+\r
+                                               // Validate selection and get total rowspan and colspan\r
+                                               var rowSpan = 1, colSpan = 1;\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
+\r
+                                                       for (var x=0; x<rows[y].length; x++) {\r
+                                                               var sd = getColRowSpan(rows[y][x]);\r
+\r
+                                                               rowColSpan += sd['colspan'];\r
+\r
+                                                               if (lastRowSpan != -1 && sd['rowspan'] != lastRowSpan) {\r
+                                                                       alert("Invalid selection for merge.");\r
+                                                                       return true;\r
+                                                               }\r
+\r
+                                                               lastRowSpan = sd['rowspan'];\r
+                                                       }\r
+\r
+                                                       if (rowColSpan > colSpan)\r
+                                                               colSpan = rowColSpan;\r
+\r
+                                                       lastRowSpan = -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
+\r
+                                                       for (var y=0; y<rows.length; y++) {\r
+                                                               var sd = getColRowSpan(rows[y][x]);\r
+\r
+                                                               colRowSpan += sd['rowspan'];\r
+\r
+                                                               if (lastColSpan != -1 && sd['colspan'] != lastColSpan) {\r
+                                                                       alert("Invalid selection for merge.");\r
+                                                                       return true;\r
+                                                               }\r
+\r
+                                                               lastColSpan = sd['colspan'];\r
+                                                       }\r
+\r
+                                                       if (colRowSpan > rowSpan)\r
+                                                               rowSpan = colRowSpan;\r
+\r
+                                                       lastColSpan = -1;\r
+                                               }\r
+\r
+                                               // Setup td\r
+                                               tdElm = rows[0][0];\r
+                                               tdElm.rowSpan = rowSpan;\r
+                                               tdElm.colSpan = colSpan;\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 = tinyMCE.regexpReplace(html, "[ \t\r\n]", "");\r
+\r
+                                                               if (chk != "<br/>" && chk != "<br>" && chk != "&nbsp;" && (x+y > 0))\r
+                                                                       tdElm.innerHTML += html;\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
+\r
+                                                                       tr.removeChild(rows[y][x]);\r
+                                                                       rows[y][x]._deleted = true;\r
+\r
+                                                                       // Empty TR, remove it\r
+                                                                       if (!tr.hasChildNodes()) {\r
+                                                                               tr.parentNode.removeChild(tr);\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
+\r
+                                                                                       lastCell = cellElm;\r
+                                                                               }\r
+\r
+                                                                               if (tdElm.rowSpan > 1)\r
+                                                                                       tdElm.rowSpan--;\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               break;\r
+                                       }\r
+\r
+                                       tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+                                       tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance);\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       inst.repaint();\r
+                               }\r
+\r
+                       return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("table", TinyMCE_TablePlugin);\r
diff --git a/program/js/tiny_mce/plugins/table/images/buttons.gif b/program/js/tiny_mce/plugins/table/images/buttons.gif
new file mode 100644 (file)
index 0000000..56a7396
Binary files /dev/null and b/program/js/tiny_mce/plugins/table/images/buttons.gif differ
diff --git a/program/js/tiny_mce/plugins/table/images/table.gif b/program/js/tiny_mce/plugins/table/images/table.gif
new file mode 100644 (file)
index 0000000..2911830
Binary files /dev/null and b/program/js/tiny_mce/plugins/table/images/table.gif differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_cell_props.gif b/program/js/tiny_mce/plugins/table/images/table_cell_props.gif
new file mode 100644 (file)
index 0000000..bee7ed6
Binary files /dev/null and b/program/js/tiny_mce/plugins/table/images/table_cell_props.gif differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_delete.gif b/program/js/tiny_mce/plugins/table/images/table_delete.gif
new file mode 100644 (file)
index 0000000..2a00e6a
Binary files /dev/null and b/program/js/tiny_mce/plugins/table/images/table_delete.gif differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_delete_col.gif b/program/js/tiny_mce/plugins/table/images/table_delete_col.gif
new file mode 100644 (file)
index 0000000..260aa04
Binary files /dev/null and b/program/js/tiny_mce/plugins/table/images/table_delete_col.gif differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_delete_row.gif b/program/js/tiny_mce/plugins/table/images/table_delete_row.gif
new file mode 100644 (file)
index 0000000..2fb5f2b
Binary files /dev/null and b/program/js/tiny_mce/plugins/table/images/table_delete_row.gif differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_insert_col_after.gif b/program/js/tiny_mce/plugins/table/images/table_insert_col_after.gif
new file mode 100644 (file)
index 0000000..8505808
Binary files /dev/null and b/program/js/tiny_mce/plugins/table/images/table_insert_col_after.gif differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_insert_col_before.gif b/program/js/tiny_mce/plugins/table/images/table_insert_col_before.gif
new file mode 100644 (file)
index 0000000..b669d4f
Binary files /dev/null and b/program/js/tiny_mce/plugins/table/images/table_insert_col_before.gif differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_insert_row_after.gif b/program/js/tiny_mce/plugins/table/images/table_insert_row_after.gif
new file mode 100644 (file)
index 0000000..b9c1446
Binary files /dev/null and b/program/js/tiny_mce/plugins/table/images/table_insert_row_after.gif differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_insert_row_before.gif b/program/js/tiny_mce/plugins/table/images/table_insert_row_before.gif
new file mode 100644 (file)
index 0000000..157d373
Binary files /dev/null and b/program/js/tiny_mce/plugins/table/images/table_insert_row_before.gif differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_merge_cells.gif b/program/js/tiny_mce/plugins/table/images/table_merge_cells.gif
new file mode 100644 (file)
index 0000000..6834e61
Binary files /dev/null and b/program/js/tiny_mce/plugins/table/images/table_merge_cells.gif differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_row_props.gif b/program/js/tiny_mce/plugins/table/images/table_row_props.gif
new file mode 100644 (file)
index 0000000..e5c7cc3
Binary files /dev/null and b/program/js/tiny_mce/plugins/table/images/table_row_props.gif differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_split_cells.gif b/program/js/tiny_mce/plugins/table/images/table_split_cells.gif
new file mode 100644 (file)
index 0000000..8ccb1b5
Binary files /dev/null and b/program/js/tiny_mce/plugins/table/images/table_split_cells.gif differ
diff --git a/program/js/tiny_mce/plugins/table/jscripts/cell.js b/program/js/tiny_mce/plugins/table/jscripts/cell.js
new file mode 100644 (file)
index 0000000..436eaad
--- /dev/null
@@ -0,0 +1,249 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');\r
+       document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');\r
+       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor')\r
+\r
+       var inst = tinyMCE.selectedInstance;\r
+       var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th");\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(tinyMCE.getAttrib(tdElm, "style"));\r
+\r
+       // Get table cell data\r
+       var celltype = tdElm.nodeName.toLowerCase();\r
+       var align = tinyMCE.getAttrib(tdElm, 'align');\r
+       var valign = tinyMCE.getAttrib(tdElm, 'valign');\r
+       var width = trimSize(getStyle(tdElm, 'width', 'width'));\r
+       var height = trimSize(getStyle(tdElm, 'height', 'height'));\r
+       var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor'));\r
+       var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor'));\r
+       var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tdElm, 'class'), false);\r
+       var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;\r
+       var id = tinyMCE.getAttrib(tdElm, 'id');\r
+       var lang = tinyMCE.getAttrib(tdElm, 'lang');\r
+       var dir = tinyMCE.getAttrib(tdElm, 'dir');\r
+       var scope = tinyMCE.getAttrib(tdElm, 'scope');\r
+\r
+       // Setup form\r
+       addClassesToList('class', 'table_cell_styles');\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 = tinyMCE.serializeStyle(st);\r
+       selectByValue(formObj, 'align', align);\r
+       selectByValue(formObj, 'valign', valign);\r
+       selectByValue(formObj, 'class', className);\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
+}\r
+\r
+function updateAction() {\r
+       tinyMCEPopup.restoreSelection();\r
+\r
+       var inst = tinyMCE.selectedInstance;\r
+       var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th");\r
+       var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");\r
+       var tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+       var formObj = document.forms[0];\r
+\r
+       inst.execCommand('mceBeginUndoLevel');\r
+\r
+       switch (getSelectValue(formObj, 'action')) {\r
+               case "cell":\r
+                       var celltype = getSelectValue(formObj, 'celltype');\r
+                       var scope = getSelectValue(formObj, 'scope');\r
+\r
+                       if (tinyMCE.getParam("accessibility_warnings")) {\r
+                               if (celltype == "th" && scope == "")\r
+                                       var answer = confirm(tinyMCE.getLang('lang_table_missing_scope', '', true));\r
+                               else\r
+                                       var answer = true;\r
+\r
+                               if (!answer)\r
+                                       return;\r
+                       }\r
+\r
+                       updateCell(tdElm);\r
+                       break;\r
+\r
+               case "row":\r
+                       var cell = trElm.firstChild;\r
+\r
+                       if (cell.nodeName != "TD" && cell.nodeName != "TH")\r
+                               cell = nextCell(cell);\r
+\r
+                       do {\r
+                               cell = updateCell(cell, true);\r
+                       } while ((cell = nextCell(cell)) != null);\r
+\r
+                       break;\r
+\r
+               case "all":\r
+                       var rows = tableElm.getElementsByTagName("tr");\r
+\r
+                       for (var i=0; i<rows.length; i++) {\r
+                               var cell = rows[i].firstChild;\r
+\r
+                               if (cell.nodeName != "TD" && cell.nodeName != "TH")\r
+                                       cell = nextCell(cell);\r
+\r
+                               do {\r
+                                       cell = updateCell(cell, true);\r
+                               } while ((cell = nextCell(cell)) != null);\r
+                       }\r
+\r
+                       break;\r
+       }\r
+\r
+       tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+       tinyMCE.triggerNodeChange();\r
+       inst.execCommand('mceEndUndoLevel');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function nextCell(elm) {\r
+       while ((elm = elm.nextSibling) != null) {\r
+               if (elm.nodeName == "TD" || elm.nodeName == "TH")\r
+                       return elm;\r
+       }\r
+\r
+       return null;\r
+}\r
+\r
+function updateCell(td, skip_id) {\r
+       var inst = tinyMCE.selectedInstance;\r
+       var formObj = document.forms[0];\r
+       var curCellType = td.nodeName.toLowerCase();\r
+       var celltype = getSelectValue(formObj, 'celltype');\r
+       var doc = inst.getDoc();\r
+\r
+       if (!skip_id)\r
+               td.setAttribute('id', formObj.id.value);\r
+\r
+       td.setAttribute('align', formObj.align.value);\r
+       td.setAttribute('vAlign', formObj.valign.value);\r
+       td.setAttribute('lang', formObj.lang.value);\r
+       td.setAttribute('dir', getSelectValue(formObj, 'dir'));\r
+       td.setAttribute('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(formObj.style.value)));\r
+       td.setAttribute('scope', formObj.scope.value);\r
+       tinyMCE.setAttrib(td, 'class', getSelectValue(formObj, 'class'));\r
+\r
+       // Clear deprecated attributes\r
+       tinyMCE.setAttrib(td, 'width', '');\r
+       tinyMCE.setAttrib(td, 'height', '');\r
+       tinyMCE.setAttrib(td, 'bgColor', '');\r
+       tinyMCE.setAttrib(td, 'borderColor', '');\r
+       tinyMCE.setAttrib(td, 'background', '');\r
+\r
+       // Set styles\r
+       td.style.width = getCSSSize(formObj.width.value);\r
+       td.style.height = getCSSSize(formObj.height.value);\r
+       if (formObj.bordercolor.value != "") {\r
+               td.style.borderColor = formObj.bordercolor.value;\r
+               td.style.borderStyle = td.style.borderStyle == "" ? "solid" : td.style.borderStyle;\r
+               td.style.borderWidth = td.style.borderWidth == "" ? "1px" : td.style.borderWidth;\r
+       } else\r
+               td.style.borderColor = '';\r
+\r
+       td.style.backgroundColor = formObj.bgcolor.value;\r
+\r
+       if (formObj.backgroundimage.value != "")\r
+               td.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')";\r
+       else\r
+               td.style.backgroundImage = '';\r
+\r
+       if (curCellType != celltype) {\r
+               // changing to a different node type\r
+               var newCell = doc.createElement(celltype);\r
+\r
+               for (var c=0; c<td.childNodes.length; c++)\r
+                       newCell.appendChild(td.childNodes[c].cloneNode(1));\r
+\r
+               for (var a=0; a<td.attributes.length; a++) {\r
+                       var attr = td.attributes[a];\r
+                       newCell.setAttribute(attr.name, attr.value);\r
+               }\r
+\r
+               td.parentNode.replaceChild(newCell, td);\r
+               td = newCell;\r
+       }\r
+\r
+       return td;\r
+}\r
+\r
+function changedBackgroundImage() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-image'] = "url('" + formObj.backgroundimage.value + "')";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedSize() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       var width = formObj.width.value;\r
+       if (width != "")\r
+               st['width'] = getCSSSize(width);\r
+       else\r
+               st['width'] = "";\r
+\r
+       var height = formObj.height.value;\r
+       if (height != "")\r
+               st['height'] = getCSSSize(height);\r
+       else\r
+               st['height'] = "";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedColor() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-color'] = formObj.bgcolor.value;\r
+       st['border-color'] = formObj.bordercolor.value;\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedStyle() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       if (st['background-image'])\r
+               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       else\r
+               formObj.backgroundimage.value = '';\r
+\r
+       if (st['width'])\r
+               formObj.width.value = trimSize(st['width']);\r
+\r
+       if (st['height'])\r
+               formObj.height.value = trimSize(st['height']);\r
+\r
+       if (st['background-color']) {\r
+               formObj.bgcolor.value = st['background-color'];\r
+               updateColor('bgcolor_pick','bgcolor');\r
+       }\r
+\r
+       if (st['border-color']) {\r
+               formObj.bordercolor.value = st['border-color'];\r
+               updateColor('bordercolor_pick','bordercolor');\r
+       }\r
+}\r
diff --git a/program/js/tiny_mce/plugins/table/jscripts/merge_cells.js b/program/js/tiny_mce/plugins/table/jscripts/merge_cells.js
new file mode 100644 (file)
index 0000000..06cbb27
--- /dev/null
@@ -0,0 +1,24 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var formObj = document.forms[0];\r
+\r
+       formObj.numcols.value = tinyMCE.getWindowArg('numcols', 1);\r
+       formObj.numrows.value = tinyMCE.getWindowArg('numrows', 1);\r
+}\r
+\r
+function mergeCells() {\r
+       var args = new Array();\r
+       var formObj = document.forms[0];\r
+\r
+       if (!AutoValidator.validate(formObj)) {\r
+               alert(tinyMCE.getLang('lang_invalid_data'));\r
+               return false;\r
+       }\r
+\r
+       args["numcols"] = formObj.numcols.value;\r
+       args["numrows"] = formObj.numrows.value;\r
+\r
+       tinyMCEPopup.execCommand("mceTableMergeCells", false, args);\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/program/js/tiny_mce/plugins/table/jscripts/row.js b/program/js/tiny_mce/plugins/table/jscripts/row.js
new file mode 100644 (file)
index 0000000..395ddf0
--- /dev/null
@@ -0,0 +1,200 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');\r
+       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');\r
+\r
+       var inst = tinyMCE.selectedInstance;\r
+       var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(tinyMCE.getAttrib(trElm, "style"));\r
+\r
+       // Get table row data\r
+       var rowtype = trElm.parentNode.nodeName.toLowerCase();\r
+       var align = tinyMCE.getAttrib(trElm, 'align');\r
+       var valign = tinyMCE.getAttrib(trElm, 'valign');\r
+       var height = trimSize(getStyle(trElm, 'height', 'height'));\r
+       var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(trElm, 'class'), false);\r
+       var bgcolor = convertRGBToHex(getStyle(trElm, 'bgcolor', 'backgroundColor'));\r
+       var backgroundimage = getStyle(trElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;\r
+       var id = tinyMCE.getAttrib(trElm, 'id');\r
+       var lang = tinyMCE.getAttrib(trElm, 'lang');\r
+       var dir = tinyMCE.getAttrib(trElm, 'dir');\r
+\r
+       // Setup form\r
+       addClassesToList('class', 'table_row_styles');\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 = tinyMCE.serializeStyle(st);\r
+       selectByValue(formObj, 'align', align);\r
+       selectByValue(formObj, 'valign', valign);\r
+       selectByValue(formObj, 'class', className);\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
+}\r
+\r
+function updateAction() {\r
+       tinyMCEPopup.restoreSelection();\r
+\r
+       var inst = tinyMCE.selectedInstance;\r
+       var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");\r
+       var tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+       var formObj = document.forms[0];\r
+       var action = getSelectValue(formObj, 'action');\r
+\r
+       inst.execCommand('mceBeginUndoLevel');\r
+\r
+       switch (action) {\r
+               case "row":\r
+                       updateRow(trElm);\r
+                       break;\r
+\r
+               case "all":\r
+                       var rows = tableElm.getElementsByTagName("tr");\r
+\r
+                       for (var i=0; i<rows.length; i++)\r
+                               updateRow(rows[i], true);\r
+\r
+                       break;\r
+\r
+               case "odd":\r
+               case "even":\r
+                       var rows = tableElm.getElementsByTagName("tr");\r
+\r
+                       for (var i=0; i<rows.length; i++) {\r
+                               if ((i % 2 == 0 && action == "odd") || (i % 2 != 0 && action == "even"))\r
+                                       updateRow(rows[i], true, true);\r
+                       }\r
+\r
+                       break;\r
+       }\r
+\r
+       tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+       tinyMCE.triggerNodeChange();\r
+       inst.execCommand('mceEndUndoLevel');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function updateRow(tr_elm, skip_id, skip_parent) {\r
+       var inst = tinyMCE.selectedInstance;\r
+       var formObj = document.forms[0];\r
+       var curRowType = tr_elm.parentNode.nodeName.toLowerCase();\r
+       var rowtype = getSelectValue(formObj, 'rowtype');\r
+       var doc = inst.getDoc();\r
+\r
+       // Update row element\r
+       if (!skip_id)\r
+               tr_elm.setAttribute('id', formObj.id.value);\r
+\r
+       tr_elm.setAttribute('align', getSelectValue(formObj, 'align'));\r
+       tr_elm.setAttribute('vAlign', getSelectValue(formObj, 'valign'));\r
+       tr_elm.setAttribute('lang', formObj.lang.value);\r
+       tr_elm.setAttribute('dir', getSelectValue(formObj, 'dir'));\r
+       tr_elm.setAttribute('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(formObj.style.value)));\r
+       tinyMCE.setAttrib(tr_elm, 'class', getSelectValue(formObj, 'class'));\r
+\r
+       // Clear deprecated attributes\r
+       tr_elm.setAttribute('background', '');\r
+       tr_elm.setAttribute('bgColor', '');\r
+       tr_elm.setAttribute('height', '');\r
+\r
+       // Set styles\r
+       tr_elm.style.height = getCSSSize(formObj.height.value);\r
+       tr_elm.style.backgroundColor = formObj.bgcolor.value;\r
+\r
+       if (formObj.backgroundimage.value != "")\r
+               tr_elm.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')";\r
+       else\r
+               tr_elm.style.backgroundImage = '';\r
+\r
+       // Setup new rowtype\r
+       if (curRowType != rowtype && !skip_parent) {\r
+               // first, clone the node we are working on\r
+               var newRow = tr_elm.cloneNode(1);\r
+\r
+               // next, find the parent of its new destination (creating it if necessary)\r
+               var theTable = tinyMCE.getParentElement(tr_elm, "table");\r
+               var dest = rowtype;\r
+               var newParent = null;\r
+               for (var i = 0; i < theTable.childNodes.length; i++) {\r
+                       if (theTable.childNodes[i].nodeName.toLowerCase() == dest)\r
+                               newParent = theTable.childNodes[i];\r
+               }\r
+\r
+               if (newParent == null) {\r
+                       newParent = doc.createElement(dest);\r
+\r
+                       if (dest == "thead")\r
+                               theTable.insertBefore(newParent, theTable.firstChild);\r
+                       else\r
+                               theTable.appendChild(newParent);\r
+               }\r
+\r
+               // append the row to the new parent\r
+               newParent.appendChild(newRow);\r
+\r
+               // remove the original\r
+               tr_elm.parentNode.removeChild(tr_elm);\r
+\r
+               // set tr_elm to the new node\r
+               tr_elm = newRow;\r
+       }\r
+}\r
+\r
+function changedBackgroundImage() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-image'] = "url('" + formObj.backgroundimage.value + "')";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedStyle() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       if (st['background-image'])\r
+               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       else\r
+               formObj.backgroundimage.value = '';\r
+\r
+       if (st['height'])\r
+               formObj.height.value = trimSize(st['height']);\r
+\r
+       if (st['background-color']) {\r
+               formObj.bgcolor.value = st['background-color'];\r
+               updateColor('bgcolor_pick','bgcolor');\r
+       }\r
+}\r
+\r
+function changedSize() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       var height = formObj.height.value;\r
+       if (height != "")\r
+               st['height'] = getCSSSize(height);\r
+       else\r
+               st['height'] = "";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedColor() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-color'] = formObj.bgcolor.value;\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
diff --git a/program/js/tiny_mce/plugins/table/jscripts/table.js b/program/js/tiny_mce/plugins/table/jscripts/table.js
new file mode 100644 (file)
index 0000000..4a0ee3b
--- /dev/null
@@ -0,0 +1,364 @@
+var action, orgTableWidth, orgTableHeight;\r
+\r
+function insertTable() {\r
+       var formObj = document.forms[0];\r
+       var inst = tinyMCE.selectedInstance;\r
+       var cols = 2, rows = 2, border = 0, cellpadding = -1, cellspacing = -1, align, width, height, className, caption;\r
+       var html = '', capEl;\r
+       var elm = tinyMCE.tableElm;\r
+       var cellLimit, rowLimit, colLimit;\r
+\r
+       if (!AutoValidator.validate(formObj)) {\r
+               alert(tinyMCE.getLang('lang_invalid_data'));\r
+               return false;\r
+       }\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+\r
+       // Get form data\r
+       cols = formObj.elements['cols'].value;\r
+       rows = formObj.elements['rows'].value;\r
+       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
+       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
+       id = formObj.elements['id'].value;\r
+       summary = formObj.elements['summary'].value;\r
+       style = formObj.elements['style'].value;\r
+       dir = formObj.elements['dir'].value;\r
+       lang = formObj.elements['lang'].value;\r
+       background = formObj.elements['backgroundimage'].value;\r
+       caption = formObj.elements['caption'].checked;\r
+\r
+       cellLimit = tinyMCE.getParam('table_cell_limit', false);\r
+       rowLimit = tinyMCE.getParam('table_row_limit', false);\r
+       colLimit = tinyMCE.getParam('table_col_limit', false);\r
+\r
+       // Validate table size\r
+       if (colLimit && cols > colLimit) {\r
+               alert(tinyMCE.getLang('lang_table_col_limit', '', true, {cols : colLimit}));\r
+               return false;\r
+       } else if (rowLimit && rows > rowLimit) {\r
+               alert(tinyMCE.getLang('lang_table_row_limit', '', true, {rows : rowLimit}));\r
+               return false;\r
+       } else if (cellLimit && cols * rows > cellLimit) {\r
+               alert(tinyMCE.getLang('lang_table_cell_limit', '', true, {cells : cellLimit}));\r
+               return false;\r
+       }\r
+\r
+       // Update table\r
+       if (action == "update") {\r
+               inst.execCommand('mceBeginUndoLevel');\r
+\r
+               tinyMCE.setAttrib(elm, 'cellPadding', cellpadding, true);\r
+               tinyMCE.setAttrib(elm, 'cellSpacing', cellspacing, true);\r
+               tinyMCE.setAttrib(elm, 'border', border, true);\r
+               tinyMCE.setAttrib(elm, 'align', align);\r
+               tinyMCE.setAttrib(elm, 'class', className);\r
+               tinyMCE.setAttrib(elm, 'style', style);\r
+               tinyMCE.setAttrib(elm, 'id', id);\r
+               tinyMCE.setAttrib(elm, 'summary', summary);\r
+               tinyMCE.setAttrib(elm, 'dir', dir);\r
+               tinyMCE.setAttrib(elm, 'lang', lang);\r
+\r
+               capEl = elm.getElementsByTagName('caption')[0];\r
+\r
+               if (capEl && !caption)\r
+                       capEl.parentNode.removeChild(capEl);\r
+\r
+               if (!capEl && caption) {\r
+                       capEl = elm.ownerDocument.createElement('caption');\r
+                       capEl.innerHTML = '&nbsp;';\r
+                       elm.insertBefore(capEl, elm.firstChild);\r
+               }\r
+\r
+               // Not inline styles\r
+               if (!tinyMCE.getParam("inline_styles"))\r
+                       tinyMCE.setAttrib(elm, 'width', width, true);\r
+\r
+               // Remove these since they are not valid XHTML\r
+               tinyMCE.setAttrib(elm, 'borderColor', '');\r
+               tinyMCE.setAttrib(elm, 'bgColor', '');\r
+               tinyMCE.setAttrib(elm, 'background', '');\r
+               tinyMCE.setAttrib(elm, 'height', '');\r
+\r
+               if (background != '')\r
+                       elm.style.backgroundImage = "url('" + background + "')";\r
+               else\r
+                       elm.style.backgroundImage = '';\r
+\r
+               if (tinyMCE.getParam("inline_styles"))\r
+                       elm.style.borderWidth = border + "px";\r
+\r
+               if (tinyMCE.getParam("inline_styles")) {\r
+                       if (width != '')\r
+                               elm.style.width = getCSSSize(width);\r
+               }\r
+\r
+               if (bordercolor != "") {\r
+                       elm.style.borderColor = bordercolor;\r
+                       elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle;\r
+                       elm.style.borderWidth = border == "" ? "1px" : border;\r
+               } else\r
+                       elm.style.borderColor = '';\r
+\r
+               elm.style.backgroundColor = bgcolor;\r
+               elm.style.height = getCSSSize(height);\r
+\r
+               tinyMCE.handleVisualAid(tinyMCE.tableElm, false, inst.visualAid, inst);\r
+\r
+               // Fix for stange MSIE align bug\r
+               tinyMCE.tableElm.outerHTML = tinyMCE.tableElm.outerHTML;\r
+\r
+               tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+               tinyMCE.triggerNodeChange();\r
+               inst.execCommand('mceEndUndoLevel');\r
+\r
+               // Repaint if dimensions changed\r
+               if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight)\r
+                       inst.repaint();\r
+\r
+               tinyMCEPopup.close();\r
+               return true;\r
+       }\r
+\r
+       // Create new table\r
+       html += '<table';\r
+\r
+       html += makeAttrib('id', id);\r
+       html += makeAttrib('border', border);\r
+       html += makeAttrib('cellpadding', cellpadding);\r
+       html += makeAttrib('cellspacing', cellspacing);\r
+       html += makeAttrib('width', width);\r
+       //html += makeAttrib('height', height);\r
+       //html += makeAttrib('bordercolor', bordercolor);\r
+       //html += makeAttrib('bgcolor', bgcolor);\r
+       html += makeAttrib('align', align);\r
+       html += makeAttrib('class', tinyMCE.getVisualAidClass(className, border == 0));\r
+       html += makeAttrib('style', style);\r
+       html += makeAttrib('summary', summary);\r
+       html += makeAttrib('dir', dir);\r
+       html += makeAttrib('lang', lang);\r
+       html += '>';\r
+\r
+       if (caption)\r
+               html += '<caption>&nbsp;</caption>';\r
+\r
+       for (var y=0; y<rows; y++) {\r
+               html += "<tr>";\r
+\r
+               for (var x=0; x<cols; x++)\r
+                       html += '<td>&nbsp;</td>';\r
+\r
+               html += "</tr>";\r
+       }\r
+\r
+       html += "</table>";\r
+\r
+       inst.execCommand('mceBeginUndoLevel');\r
+       inst.execCommand('mceInsertContent', false, html);\r
+       tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual']);\r
+       inst.execCommand('mceEndUndoLevel');\r
+\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function makeAttrib(attrib, value) {\r
+       var formObj = document.forms[0];\r
+       var valueElm = formObj.elements[attrib];\r
+\r
+       if (typeof(value) == "undefined" || value == null) {\r
+               value = "";\r
+\r
+               if (valueElm)\r
+                       value = valueElm.value;\r
+       }\r
+\r
+       if (value == "")\r
+               return "";\r
+\r
+       // XML encode it\r
+       value = value.replace(/&/g, '&amp;');\r
+       value = value.replace(/\"/g, '&quot;');\r
+       value = value.replace(/</g, '&lt;');\r
+       value = value.replace(/>/g, '&gt;');\r
+\r
+       return ' ' + attrib + '="' + value + '"';\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');\r
+       document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');\r
+       document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');\r
+       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');\r
+\r
+       var cols = 2, rows = 2, border = tinyMCE.getParam('table_default_border', '0'), cellpadding = tinyMCE.getParam('table_default_cellpadding', ''), cellspacing = tinyMCE.getParam('table_default_cellspacing', '');\r
+       var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = "";\r
+       var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "";\r
+       var inst = tinyMCE.selectedInstance;\r
+       var formObj = document.forms[0];\r
+       var elm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+\r
+       tinyMCE.tableElm = elm;\r
+       action = tinyMCE.getWindowArg('action');\r
+       if (action == null)\r
+               action = tinyMCE.tableElm ? "update" : "insert";\r
+\r
+       if (tinyMCE.tableElm && action != "insert") {\r
+               var rowsAr = tinyMCE.tableElm.rows;\r
+               var cols = 0;\r
+               for (var i=0; i<rowsAr.length; i++)\r
+                       if (rowsAr[i].cells.length > cols)\r
+                               cols = rowsAr[i].cells.length;\r
+\r
+               cols = cols;\r
+               rows = rowsAr.length;\r
+\r
+               st = tinyMCE.parseStyle(tinyMCE.getAttrib(tinyMCE.tableElm, "style"));\r
+               border = trimSize(getStyle(elm, 'border', 'borderWidth'));\r
+               cellpadding = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellpadding', "");\r
+               cellspacing = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellspacing', "");\r
+               width = trimSize(getStyle(elm, 'width', 'width'));\r
+               height = trimSize(getStyle(elm, 'height', 'height'));\r
+               bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor'));\r
+               bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor'));\r
+               align = tinyMCE.getAttrib(tinyMCE.tableElm, 'align', align);\r
+               className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tinyMCE.tableElm, 'class'), false);\r
+               id = tinyMCE.getAttrib(tinyMCE.tableElm, 'id');\r
+               summary = tinyMCE.getAttrib(tinyMCE.tableElm, 'summary');\r
+               style = tinyMCE.serializeStyle(st);\r
+               dir = tinyMCE.getAttrib(tinyMCE.tableElm, 'dir');\r
+               lang = tinyMCE.getAttrib(tinyMCE.tableElm, 'lang');\r
+               background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+               formObj.caption.checked = tinyMCE.tableElm.getElementsByTagName('caption').length > 0;\r
+\r
+               orgTableWidth = width;\r
+               orgTableHeight = height;\r
+\r
+               action = "update";\r
+       }\r
+\r
+       addClassesToList('class', "table_styles");\r
+\r
+       // Update form\r
+       selectByValue(formObj, 'align', align);\r
+       selectByValue(formObj, 'class', className);\r
+       formObj.cols.value = cols;\r
+       formObj.rows.value = rows;\r
+       formObj.border.value = border;\r
+       formObj.cellpadding.value = cellpadding;\r
+       formObj.cellspacing.value = cellspacing;\r
+       formObj.width.value = width;\r
+       formObj.height.value = height;\r
+       formObj.bordercolor.value = bordercolor;\r
+       formObj.bgcolor.value = bgcolor;\r
+       formObj.id.value = id;\r
+       formObj.summary.value = summary;\r
+       formObj.style.value = style;\r
+       formObj.dir.value = dir;\r
+       formObj.lang.value = lang;\r
+       formObj.backgroundimage.value = background;\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); \r
+\r
+       updateColor('bordercolor_pick', 'bordercolor');\r
+       updateColor('bgcolor_pick', 'bgcolor');\r
+\r
+       // Resize some elements\r
+       if (isVisible('backgroundimagebrowser'))\r
+               document.getElementById('backgroundimage').style.width = '180px';\r
+\r
+       // Disable some fields in update mode\r
+       if (action == "update") {\r
+               formObj.cols.disabled = true;\r
+               formObj.rows.disabled = true;\r
+       }\r
+}\r
+\r
+function changedSize() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       var width = formObj.width.value;\r
+       if (width != "")\r
+               st['width'] = tinyMCE.getParam("inline_styles") ? getCSSSize(width) : "";\r
+       else\r
+               st['width'] = "";\r
+\r
+       var height = formObj.height.value;\r
+       if (height != "")\r
+               st['height'] = getCSSSize(height);\r
+       else\r
+               st['height'] = "";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedBackgroundImage() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-image'] = "url('" + formObj.backgroundimage.value + "')";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedBorder() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       // Update border width if the element has a color\r
+       if (formObj.border.value != "" && formObj.bordercolor.value != "")\r
+               st['border-width'] = formObj.border.value + "px";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedColor() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-color'] = formObj.bgcolor.value;\r
+\r
+       if (formObj.bordercolor.value != "") {\r
+               st['border-color'] = formObj.bordercolor.value;\r
+\r
+               // Add border-width if it's missing\r
+               if (!st['border-width'])\r
+                       st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px";\r
+       }\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedStyle() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       if (st['background-image'])\r
+               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       else\r
+               formObj.backgroundimage.value = '';\r
+\r
+       if (st['width'])\r
+               formObj.width.value = trimSize(st['width']);\r
+\r
+       if (st['height'])\r
+               formObj.height.value = trimSize(st['height']);\r
+\r
+       if (st['background-color']) {\r
+               formObj.bgcolor.value = st['background-color'];\r
+               updateColor('bgcolor_pick','bgcolor');\r
+       }\r
+\r
+       if (st['border-color']) {\r
+               formObj.bordercolor.value = st['border-color'];\r
+               updateColor('bordercolor_pick','bordercolor');\r
+       }\r
+}\r
diff --git a/program/js/tiny_mce/plugins/table/langs/en.js b/program/js/tiny_mce/plugins/table/langs/en.js
new file mode 100644 (file)
index 0000000..e2fbba2
--- /dev/null
@@ -0,0 +1,79 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'General',\r
+advanced_tab : 'Advanced',\r
+general_props : 'General properties',\r
+advanced_props : 'Advanced properties',\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
+rowtype : 'Row in table part',\r
+title : 'Insert/Modify table',\r
+width : 'Width',\r
+height : 'Height',\r
+cols : 'Columns',\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
+row_desc : 'Table row properties',\r
+cell_desc : 'Table cell properties',\r
+valign : 'Vertical alignment',\r
+align_top : 'Top',\r
+align_bottom : 'Bottom',\r
+props_desc : 'Table properties',\r
+bordercolor : 'Border color',\r
+bgcolor : 'Background color',\r
+merge_cells_title : 'Merge table cells',\r
+split_cells_desc : 'Split merged table cells',\r
+merge_cells_desc : 'Merge table cells',\r
+cut_row_desc : 'Cut table row',\r
+copy_row_desc : 'Copy table row',\r
+paste_row_before_desc : 'Paste table row before',\r
+paste_row_after_desc : 'Paste table row after',\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
+del : 'Delete table',\r
+scope : 'Scope',\r
+row : 'Row',\r
+col : 'Col',\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
+});\r
diff --git a/program/js/tiny_mce/plugins/table/merge_cells.htm b/program/js/tiny_mce/plugins/table/merge_cells.htm
new file mode 100644 (file)
index 0000000..10896bf
--- /dev/null
@@ -0,0 +1,38 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_table_merge_cells_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/merge_cells.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="margin: 8px" style="display: none">\r
+<form onsubmit="insertTable();return false;" action="#">\r
+       <fieldset>\r
+               <legend>{$lang_table_merge_cells_title}</legend>\r
+                 <table border="0" cellpadding="0" cellspacing="3" width="100%">\r
+                         <tr>\r
+                               <td>{$lang_table_cols}:</td>\r
+                               <td align="right"><input type="text" name="numcols" value="" class="number min1" style="width: 30px" /></td>\r
+                               <td>\r
+                         </tr>\r
+                         <tr>\r
+                               <td>{$lang_table_rows}:</td>\r
+                               <td align="right"><input type="text" name="numrows" value="" class="number min1" style="width: 30px" /></td>\r
+                         </tr>\r
+                 </table>\r
+       </fieldset>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_update}" onclick="mergeCells();" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/table/readme.txt b/program/js/tiny_mce/plugins/table/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/program/js/tiny_mce/plugins/table/row.htm b/program/js/tiny_mce/plugins/table/row.htm
new file mode 100644 (file)
index 0000000..64f2afc
--- /dev/null
@@ -0,0 +1,159 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_table_row_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/row.js"></script>\r
+       <link href="css/row.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="tablerow" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+       <form onsubmit="updateAction();return false;">\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;">{$lang_table_general_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_table_advanced_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>{$lang_table_general_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="rowtype">{$lang_table_rowtype}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="rowtype" name="rowtype">\r
+                                                                       <option value="thead">{$lang_table_thead}</option>\r
+                                                                       <option value="tbody">{$lang_table_tbody}</option>\r
+                                                                       <option value="tfoot">{$lang_table_tfoot}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="align">{$lang_table_align}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="align" name="align">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="center">{$lang_table_align_middle}</option>\r
+                                                                       <option value="left">{$lang_table_align_left}</option>\r
+                                                                       <option value="right">{$lang_table_align_right}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="valign">{$lang_table_valign}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="valign" name="valign">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="top">{$lang_table_align_top}</option>\r
+                                                                       <option value="middle">{$lang_table_align_middle}</option>\r
+                                                                       <option value="bottom">{$lang_table_align_bottom}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr id="styleSelectRow">\r
+                                                       <td><label for="class">{$lang_class_name}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="class" name="class">\r
+                                                                       <option value="" selected="selected">{$lang_not_set}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="height">{$lang_table_height}</label></td>\r
+                                                       <td class="col2"><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_advanced_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="id">{$lang_table_id}</label></td> \r
+                                                       <td><input id="id" name="id" type="text" value="" style="width: 200px" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="style">{$lang_table_style}</label></td>\r
+                                                       <td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="dir">{$lang_table_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" style="width: 200px"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_table_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_table_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="lang">{$lang_table_langcode}</label></td> \r
+                                                       <td>\r
+                                                               <input id="lang" name="lang" type="text" value="" style="width: 200px" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="backgroundimage">{$lang_table_bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td>\r
+                                                                               <td id="backgroundimagebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div>\r
+                               <select id="action" name="action">\r
+                                       <option value="row">{$lang_table_row_row}</option>\r
+                                       <option value="odd">{$lang_table_row_odd}</option>\r
+                                       <option value="even">{$lang_table_row_even}</option>\r
+                                       <option value="all">{$lang_table_row_all}</option>\r
+                               </select>\r
+                       </div>\r
+\r
+                       <div style="float: left">\r
+                               <div><input type="button" id="insert" name="insert" value="{$lang_update}" onclick="updateAction();" /></div>\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/table/table.htm b/program/js/tiny_mce/plugins/table/table.htm
new file mode 100644 (file)
index 0000000..6c722db
--- /dev/null
@@ -0,0 +1,160 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_table_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/table.js"></script>\r
+       <link href="css/table.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="table" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+       <form onsubmit="insertTable();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;">{$lang_table_general_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_table_advanced_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>{$lang_table_general_props}</legend>\r
+\r
+                                         <table border="0" cellpadding="4" cellspacing="0" width="100%">\r
+                                                         <tr>\r
+                                                               <td><label id="colslabel" for="cols">{$lang_table_cols}</label></td>\r
+                                                               <td><input id="cols" name="cols" type="text" value="" size="3" maxlength="3" class="required number min1" /></td>\r
+                                                               <td><label id="rowslabel" for="rows">{$lang_table_rows}</label></td>\r
+                                                               <td><input id="rows" name="rows" type="text" value="" size="3" maxlength="3" class="required number min1" /></td>\r
+                                                         </tr>\r
+                                                         <tr>\r
+                                                               <td><label id="cellpaddinglabel" for="cellpadding">{$lang_table_cellpadding}</label></td>\r
+                                                               <td><input id="cellpadding" name="cellpadding" type="text" value="" size="3" maxlength="3" class="number" /></td>\r
+                                                               <td><label id="cellspacinglabel" for="cellspacing">{$lang_table_cellspacing}</label></td>\r
+                                                               <td><input id="cellspacing" name="cellspacing" type="text" value="" size="3" maxlength="3" class="number" /></td>\r
+                                                         </tr>\r
+                                                         <tr>\r
+                                                               <td><label id="alignlabel" for="align">{$lang_table_align}</label></td>\r
+                                                               <td><select id="align" name="align">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="center">{$lang_table_align_middle}</option>\r
+                                                                       <option value="left">{$lang_table_align_left}</option>\r
+                                                                       <option value="right">{$lang_table_align_right}</option>\r
+                                                                 </select></td>\r
+                                                               <td><label id="borderlabel" for="border">{$lang_table_border}</label></td>\r
+                                                               <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="changedBorder();" class="number" /></td>\r
+                                                         </tr>\r
+                                                         <tr id="width_row">\r
+                                                               <td><label id="widthlabel" for="width">{$lang_table_width}</label></td>\r
+                                                               <td><input name="width" type="text" id="width" value="" size="4" maxlength="4" onchange="changedSize();" class="size" /></td>\r
+                                                               <td><label id="heightlabel" for="height">{$lang_table_height}</label></td>\r
+                                                               <td><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" class="size" /></td>\r
+                                                         </tr>\r
+                                                         <tr id="styleSelectRow">\r
+                                                               <td><label id="classlabel" for="class">{$lang_class_name}</label></td>\r
+                                                               <td colspan="3">\r
+                                                                <select id="class" name="class">\r
+                                                                       <option value="" selected>{$lang_not_set}</option>\r
+                                                                </select></td>\r
+                                                         </tr>\r
+                                                         <tr>\r
+                                                               <td class="column1"><label for="caption">{$lang_table_caption}</label></td> \r
+                                                               <td><input id="caption" name="caption" type="checkbox" value="true" /></td> \r
+                                                         </tr>\r
+                                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_advanced_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="id">{$lang_table_id}</label></td> \r
+                                                       <td><input id="id" name="id" type="text" value="" class="advfield" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="summary">{$lang_table_summary}</label></td> \r
+                                                       <td><input id="summary" name="summary" type="text" value="" class="advfield" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="style">{$lang_table_style}</label></td>\r
+                                                       <td><input type="text" id="style" name="style" value="" class="advfield" onchange="changedStyle();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="dir">{$lang_table_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" class="advfield"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_table_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_table_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="langlabel" for="lang">{$lang_table_langcode}</label></td> \r
+                                                       <td>\r
+                                                               <input id="lang" name="lang" type="text" value="" class="advfield" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="backgroundimage">{$lang_table_bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="backgroundimage" name="backgroundimage" type="text" value="" class="advfield" onchange="changedBackgroundImage();" /></td>\r
+                                                                               <td id="backgroundimagebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bordercolor">{$lang_table_bordercolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td>\r
+                                                                               <td id="bordercolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertTable();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/plugins/visualchars/editor_plugin.js b/program/js/tiny_mce/plugins/visualchars/editor_plugin.js
new file mode 100644 (file)
index 0000000..a358754
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('visualchars');var TinyMCE_VisualCharsPlugin={getInfo:function(){return{longname:'Visual characters',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){inst.visualChars={state:false}},getControlHTML:function(cn){switch(cn){case"visualchars":return tinyMCE.getButtonHTML(cn,'lang_visualchars_desc','{$pluginurl}/images/visualchars.gif','mceVisualChars',false)}return""},execCommand:function(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id);switch(command){case"mceVisualChars":this._toggleVisualChars(editor_id,inst);return true}return false},cleanup:function(type,content,inst){if(type=="insert_to_editor_dom"||type=="get_from_editor_dom"){inst.visualChars.state=true;this._toggleVisualChars(inst.editorId,inst)}return content},_toggleVisualChars:function(editor_id,inst){var nl,i,h,d=inst.getDoc(),b=inst.getBody(),nv,s=inst.selection,bo;inst.visualChars.state=!inst.visualChars.state;bo=s.getBookmark(true);tinyMCE.switchClass(editor_id+'_visualchars',inst.visualChars.state?'mceButtonSelected':'mceButtonNormal');if(inst.visualChars.state){nl=tinyMCE.selectNodes(b,function(n){return n.nodeType==3&&n.nodeValue&&n.nodeValue.indexOf('\u00a0')!=-1});for(i=0;i<nl.length;i++){nv=nl[i].nodeValue;nv=nv.replace(/(\u00a0+)/g,'<span class="mceItemHiddenVisualChar">$1</span>');nv=nv.replace(/\u00a0/g,'\u00b7');tinyMCE.setOuterHTML(nl[i],nv,d)}}else{nl=tinyMCE.selectNodes(b,function(n){return n.nodeType==1&&n.nodeName=='SPAN'&&n.className=='mceItemHiddenVisualChar'});for(i=0;i<nl.length;i++)tinyMCE.setOuterHTML(nl[i],nl[i].innerHTML.replace(/(&middot;|\u00b7)/g,'&nbsp;'),d)}}};tinyMCE.addPlugin("visualchars",TinyMCE_VisualCharsPlugin);
\ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/visualchars/editor_plugin_src.js b/program/js/tiny_mce/plugins/visualchars/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..fb7236d
--- /dev/null
@@ -0,0 +1,89 @@
+/**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('visualchars');\r
+\r
+var TinyMCE_VisualCharsPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Visual characters',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               inst.visualChars = {\r
+                       state : false\r
+               };\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "visualchars":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_visualchars_desc', '{$pluginurl}/images/visualchars.gif', 'mceVisualChars', false);\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+               switch (command) {\r
+                       case "mceVisualChars":\r
+                               this._toggleVisualChars(editor_id, inst);\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       cleanup : function(type, content, inst) {\r
+               if (type == "insert_to_editor_dom" || type == "get_from_editor_dom") {\r
+                       inst.visualChars.state = true;\r
+                       this._toggleVisualChars(inst.editorId, inst);\r
+               }\r
+\r
+               return content;\r
+       },\r
+\r
+       // Private plugin internal methods\r
+\r
+       _toggleVisualChars : function(editor_id, inst) {\r
+               var nl, i, h, d = inst.getDoc(), b = inst.getBody(), nv, s = inst.selection, bo;\r
+\r
+               inst.visualChars.state = !inst.visualChars.state;\r
+\r
+               bo = s.getBookmark(true);\r
+\r
+               tinyMCE.switchClass(editor_id + '_visualchars', inst.visualChars.state ? 'mceButtonSelected' : 'mceButtonNormal');\r
+\r
+               if (inst.visualChars.state) {\r
+                       nl = tinyMCE.selectNodes(b, function(n) {return n.nodeType == 3 && n.nodeValue && n.nodeValue.indexOf('\u00a0') != -1;});\r
+\r
+                       for (i=0; i<nl.length; i++) {\r
+                               nv = nl[i].nodeValue;\r
+                               nv = nv.replace(/(\u00a0+)/g, '<span class="mceItemHiddenVisualChar">$1</span>');\r
+                               nv = nv.replace(/\u00a0/g, '\u00b7');\r
+                               tinyMCE.setOuterHTML(nl[i], nv, d);\r
+                       }\r
+               } else {\r
+                       nl = tinyMCE.selectNodes(b, function(n) {return n.nodeType == 1 && n.nodeName == 'SPAN' && n.className == 'mceItemHiddenVisualChar';});\r
+\r
+                       for (i=0; i<nl.length; i++)\r
+                               tinyMCE.setOuterHTML(nl[i], nl[i].innerHTML.replace(/(&middot;|\u00b7)/g, '&nbsp;'), d);\r
+               }\r
+\r
+               //s.moveToBookmark(bo);\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("visualchars", TinyMCE_VisualCharsPlugin);\r
diff --git a/program/js/tiny_mce/plugins/visualchars/images/visualchars.gif b/program/js/tiny_mce/plugins/visualchars/images/visualchars.gif
new file mode 100644 (file)
index 0000000..3b4293e
Binary files /dev/null and b/program/js/tiny_mce/plugins/visualchars/images/visualchars.gif differ
diff --git a/program/js/tiny_mce/plugins/visualchars/langs/en.js b/program/js/tiny_mce/plugins/visualchars/langs/en.js
new file mode 100644 (file)
index 0000000..a82a4ee
--- /dev/null
@@ -0,0 +1,5 @@
+// EN lang variables\r
+\r
+tinyMCE.addToLang('visualchars',{\r
+desc : 'Visual control characters on/off.'\r
+});\r
diff --git a/program/js/tiny_mce/themes/advanced/about.htm b/program/js/tiny_mce/themes/advanced/about.htm
new file mode 100644 (file)
index 0000000..6918488
--- /dev/null
@@ -0,0 +1,52 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_about_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/about.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body id="about" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\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;">{$lang_about}</a></span></li>\r
+                               <li id="help_tab"><span><a href="javascript:mcTabs.displayTab('help_tab','help_panel');" onmousedown="return false;">{$lang_help}</a></span></li>\r
+                               <li id="plugins_tab"><span><a href="javascript:mcTabs.displayTab('plugins_tab','plugins_panel');" onmousedown="return false;">{$lang_plugins}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <h3>{$lang_about_title}</h3>\r
+                               <p>Version: {$tinymce_version} ({$tinymce_releasedate})</p>\r
+                               <p>TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under <a href="../../license.txt" target="_blank">LGPL</a>\r
+                               by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.</p>\r
+                               <p>Copyright &copy; 2003-2007, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.</p>\r
+                               <p>For more information about this software visit the <a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE website</a>.</p>\r
+\r
+                               <div id="buttoncontainer"></div>\r
+                       </div>\r
+\r
+                       <div id="plugins_panel" class="panel">\r
+                               <div id="pluginscontainer">\r
+                                       <h3>{$lang_loaded_plugins}</h3>\r
+\r
+                                       <div id="plugintablecontainer">\r
+                                       </div>\r
+\r
+                                       <p>&nbsp;</p>\r
+                               </div>\r
+                       </div>\r
+\r
+                       <div id="help_panel" class="panel noscroll" style="overflow: visible;">\r
+                               <div id="iframecontainer"></div>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_close}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/themes/advanced/anchor.htm b/program/js/tiny_mce/themes/advanced/anchor.htm
new file mode 100644 (file)
index 0000000..53d7969
--- /dev/null
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_anchor_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/anchor.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertAnchor();return false;" action="#">\r
+\r
+       <table border="0" cellpadding="4" cellspacing="0">\r
+               <tr>\r
+                       <td colspan="2" class="title">{$lang_insert_anchor_title}</td>\r
+               </tr>\r
+               <tr>\r
+                       <td nowrap="nowrap">{$lang_insert_anchor_name}:</td>\r
+                       <td><input name="anchorName" type="text" id="anchorName" value="" style="width: 200px" /></td>\r
+               </tr>\r
+       </table>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_update}" onclick="insertAnchor();" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/themes/advanced/charmap.htm b/program/js/tiny_mce/themes/advanced/charmap.htm
new file mode 100644 (file)
index 0000000..9aed1d4
--- /dev/null
@@ -0,0 +1,53 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_theme_charmap_title}</title>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/charmap.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<table align="center" border="0" cellspacing="0" cellpadding="2">\r
+    <tr>\r
+        <td colspan="2" class="title">{$lang_theme_charmap_title}</td>\r
+    </tr>\r
+    <tr>\r
+        <td rowspan="2" align="left" valign="top">\r
+            <script language="javascript" type="text/javascript">renderCharMapHTML();</script>\r
+        </td>\r
+        <td width="100" align="center" valign="top">\r
+            <table border="0" cellpadding="0" cellspacing="0" width="100" style="height: 100px">\r
+                <tr>\r
+                    <td class="charmapOver" style="font-size: 40px; height:80px;" id="codeV">&nbsp;</td>\r
+                </tr>\r
+                <tr>\r
+                    <td style="font-size: 10px; font-family: Arial, Helvetica, sans-serif; text-align:center;" id="codeN">&nbsp;</td>\r
+                </tr>\r
+            </table>\r
+        </td>\r
+    </tr>\r
+    <tr>\r
+        <td valign="bottom" style="padding-bottom: 3px;">\r
+            <table width="100" align="center" border="0" cellpadding="2" cellspacing="0">\r
+                <tr>\r
+                    <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">HTML-Code</td>\r
+                </tr>\r
+                <tr>\r
+                    <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeA" align="center">&nbsp;</td>\r
+                </tr>\r
+                <tr>\r
+                    <td style="font-size: 1px;">&nbsp;</td>\r
+                </tr>\r
+                <tr>\r
+                    <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">NUM-Code</td>\r
+                </tr>\r
+                <tr>\r
+                    <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeB" align="center">&nbsp;</td>\r
+                </tr>\r
+            </table>\r
+        </td>\r
+    </tr>\r
+</table>\r
+\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/themes/advanced/color_picker.htm b/program/js/tiny_mce/themes/advanced/color_picker.htm
new file mode 100644 (file)
index 0000000..668d744
--- /dev/null
@@ -0,0 +1,74 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_theme_colorpicker_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/color_picker.js"></script>\r
+       <link href="css/colorpicker.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="picker_tab" class="current"><span><a href="javascript:mcTabs.displayTab('picker_tab','picker_panel');" onmousedown="return false;">{$lang_color_picker_tab}</a></span></li>\r
+                       <li id="rgb_tab"><span><a href="#" onclick="generateWebColors();mcTabs.displayTab('rgb_tab','rgb_panel');" onmousedown="return false;">{$lang_web_colors_tab}</a></span></li>\r
+                       <li id="named_tab"><span><a  href="#" onclick="generateNamedColors();javascript:mcTabs.displayTab('named_tab','named_panel');" onmousedown="return false;">{$lang_named_colors_tab}</a></span></li>\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="picker_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{$lang_color_picker}</legend>\r
+                               <div id="picker">\r
+                                       <img id="colorpicker" src="images/colors.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;" />\r
+\r
+                                       <div id="light">\r
+                                               <!-- Will be filled with divs -->\r
+                                       </div>\r
+\r
+                                       <br style="clear: both" />\r
+                               </div>\r
+                       </fieldset>\r
+               </div>\r
+\r
+               <div id="rgb_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{$lang_web_colors}</legend>\r
+                               <div id="webcolors">\r
+                                       <!-- Gets filled with web safe colors-->\r
+                               </div>\r
+\r
+                               <br style="clear: both" />\r
+                       </fieldset>\r
+               </div>\r
+\r
+               <div id="named_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{$lang_named_colors}</legend>\r
+                               <div id="namedcolors">\r
+                                       <!-- Gets filled with named colors-->\r
+                               </div>\r
+\r
+                               <br style="clear: both" />\r
+\r
+                               <div id="colornamecontainer">\r
+                                       {$lang_color_name} <span id="colorname"></span>\r
+                               </div>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_theme_colorpicker_apply}" onclick="insertAction();" />\r
+               </div>\r
+\r
+               <div id="preview"></div>\r
+\r
+               <div id="previewblock">\r
+                       <label for="color">{$lang_color}</label> <input id="color" type="text" size="8" maxlength="8" class="text" />\r
+               </div>\r
+       </div>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/about.htm b/program/js/tiny_mce/themes/advanced/docs/en/about.htm
new file mode 100644 (file)
index 0000000..a6957a6
--- /dev/null
@@ -0,0 +1,31 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>About TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">About TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE is a small WYSIWYG editor control for web browsers such as MSIE or Mozilla \r
+that enables you to edit HTML contents in a more user friendly way. It has common \r
+features that are found in most word processors and should not be difficult to \r
+use.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/common_buttons.htm b/program/js/tiny_mce/themes/advanced/docs/en/common_buttons.htm
new file mode 100644 (file)
index 0000000..518b285
--- /dev/null
@@ -0,0 +1,162 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Common buttons</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Common buttons</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Below is a short description about each button.\r
+<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold.gif" width="20" height="20" alt="Bold text icon" /></td>\r
+    <td>Bold text style (Ctrl+B).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic.gif" width="20" height="20" alt="Italic text icon" /></td>\r
+    <td>Italic text style (Ctrl+I).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20" alt="Underline text icon." /></td>\r
+    <td>Underline text style (Ctrl+U).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20" alt="Strikethrough text icon." /></td>\r
+    <td>Strikethrough text style.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20" alt="Align left icon." /></td>\r
+    <td>Align left.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20" alt="Align center icon." /></td>\r
+    <td>Align center.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20" alt="Align right icon." /></td>\r
+    <td>Align right.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20" alt="Align full icon." /></td>\r
+    <td>Align full.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20" alt="Unordered list/bullet list icon." /></td>\r
+    <td>Unordered list/bullet list.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20" alt="Ordered list/numbered list icon." /></td>\r
+    <td>Ordered list/numbered list</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20" alt="Outdent/decrease indentation icon." /></td>\r
+    <td>Outdent/decrease indentation.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20" alt="Indent/increase indentation icon." /></td>\r
+    <td>Indent/increase indentation.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20" alt="Undo the last operation." /></td>\r
+    <td>Undo the last operation (Ctrl+Z).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20" alt="Redo the last operation icon." /></td>\r
+    <td>Redo the last operation (Ctrl+Y).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20" alt="Insert a new link icon." /></td>\r
+    <td>Insert a new link, read more about this function in the <a href="insert_link_button.htm">Insert \r
+      link section</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20" alt="Unlinks the current selection icon." /></td>\r
+    <td>Unlinks the current selection/removes all selected links.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/anchor.gif" width="20" height="20" alt="Insert a new anchor icon." /></td>\r
+    <td>Insert a new anchor, read more about this function in the <a href="insert_anchor_button.htm">Insert anchor section.</a></td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20" alt="Insert a new image icon." /></td>\r
+    <td>Insert a new image, read more about this function in the <a href="insert_image_button.htm">Insert \r
+      image section</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20" alt="Cleanup code icon." /></td>\r
+    <td>Cleanup code/Removes unwanted formating. This function is useful when \r
+      you copy contents from for example a office product.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20" alt="Show help icon." /></td>\r
+    <td>Shows this help window.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20" alt="Source code editor icon." /></td>\r
+    <td>Opens HTML source code editor. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table.gif" width="20" height="20" alt="Insert table icon." /></td>\r
+    <td>Inserts a new table at the current location. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table_insert_row_before.gif" width="20" height="20" alt="Adds a row above icon." /></td>\r
+    <td>Adds a row above the current one. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table_insert_row_after.gif" width="20" height="20" alt="Adds a row under icon." /></td>\r
+    <td>Adds a row under the current one. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table_delete_row.gif" width="20" height="20" alt="Remove row icon." /></td>\r
+    <td>Removes the row. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table_insert_col_before.gif" width="20" height="20" alt="Add column before icon." /></td>\r
+    <td>Adds a column before the current one.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table_insert_col_after.gif" width="20" height="20" alt="Add column after icon." /></td>\r
+    <td>Adds a column after the current one.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table_delete_col.gif" width="20" height="20" alt="Remove column icon." /></td>\r
+    <td>Removes the current column.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20" alt="Insert horizontal ruler icon." /></td>\r
+    <td>Inserts a new horizontal ruler </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20" alt="Remove formatting icon." /></td>\r
+    <td>Removes formatting from the selection. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20" alt="Subscript icon." /></td>\r
+    <td>Makes the selection to be subscript. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20" alt="Superscript icon." /></td>\r
+    <td>Makes the selection to be superscripted. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade="noshade" />\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm b/program/js/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm
new file mode 100644 (file)
index 0000000..f4070a3
--- /dev/null
@@ -0,0 +1,45 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert table button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Create accessible content</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<p>TinyMCE can create HTML content that will be accessible to all users, including those with disabilities using assistive technologies, as well as those using text-based browsers, or those browsing the Web with images turned off. </p>\r
+\r
+<p><strong>Things you can do to make your content accessible:</strong></p>\r
+<ol>\r
+<li><strong>Include an Image Description:</strong> Blind users, or others who are unable to view images, will rely on the Image Description (or Alt text) to take the place of the image. If an image contains no meaning, such as a decoration or a spacer image, leave the Image Description empty. TinyMCE will then insert an empty Alt text attribute that will force assistive technologies to ignore the image. <br /><br /></li>\r
+\r
+<li> <strong>Add Scope to data table header cells:</strong> In the table cell editor dialog window, choose a Scope when creating Header cells so the column or row label in that cell becomes explicitely associated with its data cells. Table cell headers will then be announced with each data cell, making it easier for blind users using a screen reader to understand what the content of each cell represents. <br /><br /></li>\r
+\r
+<li><strong> Structure content with properly nested headings:</strong> In the format selection menu choose Heading 1 to Heading 6 to represent headings in your content,  rather than using other font formating options. Blind users using a screen reader can then extract the headings from the page to generate a summary of the content it contains, and use those headings to navigate quickly to subsections within the page.<br /><br /></li>\r
+\r
+<li><strong> Include alternate content:</strong> Create an alternate page for non-HTML content such as Flash, Java applets, or  embedded movies. This might be a static image, with a description of the image, and a description of the content that would have appeared in its place. An alternate HTML page could also be created, and a link to it included next to the non-HTML object. This will ensure that the content will be accessible to users of assistive technologies that can not view or play the content, and ensure the content will be available to those who do not have the appropriate plugin or helper application installed.<br /><br /></li>\r
+\r
+<li><strong> Check accessbility: </strong> When the AChecker plugin is installed with TinyMCE, click on the Check Accessibility button to generate a report of potential accessibility problems.<br /><br /></li>\r
+\r
+</ol>\r
+\r
+<p>See the <a href="http://checker.atrc.utoronto.ca" target="_new">AChecker Web Site</a> for further details about creating content that will be accessible to all users.<br />\r
+</p>\r
+\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif
new file mode 100644 (file)
index 0000000..5b5f528
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..cdc617e
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..7bad758
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..6a032c5
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/index.htm b/program/js/tiny_mce/themes/advanced/docs/en/index.htm
new file mode 100644 (file)
index 0000000..9810a93
--- /dev/null
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Help Index</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Table of contents</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Click the links below to go to the different help sections. \r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">About TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Common buttons</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Insert image button</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Insert link button</a></li>\r
+  <li class="toc_li"><a href="insert_anchor_button.htm">Insert anchor button</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Insert table button</a></li>\r
+ <li class="toc_li"><a href="create_accessible_content.htm">Create accessible content</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm b/program/js/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm
new file mode 100644 (file)
index 0000000..332cbc6
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert anchor button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insert anchor button</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+This button opens a new window with the insert/edit anchor function.<br>\r
+<br>\r
+<img src="images/insert_anchor_window.gif" width="330" height="139" alt="Anchor dialog/window" /><br>\r
+<br>\r
+There are one field in this window, this is where you enter the name of you anchor point. Remember the anchor name needs to be unique. <br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/insert_image_button.htm b/program/js/tiny_mce/themes/advanced/docs/en/insert_image_button.htm
new file mode 100644 (file)
index 0000000..1529648
--- /dev/null
@@ -0,0 +1,65 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert image button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insert image button</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+The insert image button opens the window shown below.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif" alt="Insert image dialog/window" /><br>\r
+<br>\r
+You simply enter a URL to the image you want to link to and enter a image description, \r
+this is then displayed as an alternative text descripton of the image on the page.<br>\r
+<br>\r
+<strong>Field descriptions:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Image URL </strong></td>\r
+    <td>URL/path to the image.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Image description </strong></td>\r
+    <td>Alternative description of image contents.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Dimentions</strong></td>\r
+    <td>Image width/height. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Alignment</strong></td>\r
+    <td>Image alignment, useful when wrapping text around images.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Border</strong></td>\r
+    <td>Border thickness. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>VSpace</strong></td>\r
+    <td>Vertical space, useful when wrapping text around images.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>HSpace</strong></td>\r
+    <td>Horizontal space, useful when wrapping text around images.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/insert_link_button.htm b/program/js/tiny_mce/themes/advanced/docs/en/insert_link_button.htm
new file mode 100644 (file)
index 0000000..4f64450
--- /dev/null
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert link button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insert link button</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+This button opens a new window with the insert/edit link function.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" width="330" height="159" alt="Insert link dialog/window" /><br>\r
+<br>\r
+There are two fields in this window the first one &quot;Link URL&quot; is the \r
+URL of the link. The target enables you to select how the link is to be opened.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/insert_table_button.htm b/program/js/tiny_mce/themes/advanced/docs/en/insert_table_button.htm
new file mode 100644 (file)
index 0000000..f352a05
--- /dev/null
@@ -0,0 +1,71 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert table button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insert table button</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+The insert table button opens the window shown below. This action enables you to create tables. <br>\r
+<br>\r
+<img src="images/insert_table_window.gif" width="340" height="229" alt="Image of table window" /><br>\r
+<br>\r
+<strong>Field descriptions:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Columns</strong></td>\r
+    <td>Number of columns in the  table. </td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Rows</strong></td>\r
+    <td>Number of rows in the new table.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellpadding</strong></td>\r
+    <td>Cellpadding of the table . </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellspacing</strong></td>\r
+    <td>Cellspacing of the table .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Alignment</strong></td>\r
+    <td>Table alignment . </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Border</strong></td>\r
+    <td>Border thinkness of table.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Width</strong></td>\r
+    <td>Width in pixels of table .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Height</strong></td>\r
+    <td>Height in pixels of table.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Class</strong></td>\r
+    <td>Style or CSS class of table.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/style.css b/program/js/tiny_mce/themes/advanced/docs/en/style.css
new file mode 100644 (file)
index 0000000..ebc0538
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/program/js/tiny_mce/themes/advanced/editor_template.js b/program/js/tiny_mce/themes/advanced/editor_template.js
new file mode 100644 (file)
index 0000000..6e781d7
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importThemeLanguagePack('advanced');var TinyMCE_AdvancedTheme={_defColors:"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",_autoImportCSSClasses:true,_resizer:{},_buttons:[['bold','{$lang_bold_img}','lang_bold_desc','Bold'],['italic','{$lang_italic_img}','lang_italic_desc','Italic'],['underline','{$lang_underline_img}','lang_underline_desc','Underline'],['strikethrough','strikethrough.gif','lang_striketrough_desc','Strikethrough'],['justifyleft','justifyleft.gif','lang_justifyleft_desc','JustifyLeft'],['justifycenter','justifycenter.gif','lang_justifycenter_desc','JustifyCenter'],['justifyright','justifyright.gif','lang_justifyright_desc','JustifyRight'],['justifyfull','justifyfull.gif','lang_justifyfull_desc','JustifyFull'],['bullist','bullist.gif','lang_bullist_desc','InsertUnorderedList'],['numlist','numlist.gif','lang_numlist_desc','InsertOrderedList'],['outdent','outdent.gif','lang_outdent_desc','Outdent'],['indent','indent.gif','lang_indent_desc','Indent'],['cut','cut.gif','lang_cut_desc','Cut'],['copy','copy.gif','lang_copy_desc','Copy'],['paste','paste.gif','lang_paste_desc','Paste'],['undo','undo.gif','lang_undo_desc','Undo'],['redo','redo.gif','lang_redo_desc','Redo'],['link','link.gif','lang_link_desc','mceLink',true],['unlink','unlink.gif','lang_unlink_desc','unlink'],['image','image.gif','lang_image_desc','mceImage',true],['cleanup','cleanup.gif','lang_cleanup_desc','mceCleanup'],['help','help.gif','lang_help_desc','mceHelp'],['code','code.gif','lang_theme_code_desc','mceCodeEditor'],['hr','hr.gif','lang_theme_hr_desc','inserthorizontalrule'],['removeformat','removeformat.gif','lang_theme_removeformat_desc','removeformat'],['sub','sub.gif','lang_theme_sub_desc','subscript'],['sup','sup.gif','lang_theme_sup_desc','superscript'],['forecolor','forecolor.gif','lang_theme_forecolor_desc','forecolor',true],['forecolorpicker','forecolor.gif','lang_theme_forecolor_desc','forecolorpicker',true],['backcolor','backcolor.gif','lang_theme_backcolor_desc','HiliteColor',true],['backcolorpicker','backcolor.gif','lang_theme_backcolor_desc','backcolorpicker',true],['charmap','charmap.gif','lang_theme_charmap_desc','mceCharMap'],['visualaid','visualaid.gif','lang_theme_visualaid_desc','mceToggleVisualAid'],['anchor','anchor.gif','lang_theme_anchor_desc','mceInsertAnchor'],['newdocument','newdocument.gif','lang_newdocument_desc','mceNewDocument']],_buttonMap:'anchor,backcolor,bold,bullist,charmap,cleanup,code,copy,cut,forecolor,help,hr,image,indent,italic,justifycenter,justifyfull,justifyleft,justifyright,link,newdocument,numlist,outdent,paste,redo,removeformat,strikethrough,sub,sup,underline,undo,unlink,visualaid,advhr,ltr,rtl,emotions,flash,fullpage,fullscreen,iespell,insertdate,inserttime,pastetext,pasteword,selectall,preview,print,save,replace,search,table,cell_props,delete_col,delete_row,col_after,col_before,row_after,row_before,merge_cells,row_props,split_cells,delete_table',getControlHTML:function(button_name){var i,x,but;for(i=0;i<TinyMCE_AdvancedTheme._buttons.length;i++){but=TinyMCE_AdvancedTheme._buttons[i];if(but[0]==button_name&&(button_name=="forecolor"||button_name=="backcolor"))return tinyMCE.getMenuButtonHTML(but[0],but[2],'{$themeurl}/images/'+but[1],but[3]+"Menu",but[3],(but.length>4?but[4]:false),(but.length>5?but[5]:null));if(but[0]==button_name)return tinyMCE.getButtonHTML(but[0],but[2],'{$themeurl}/images/'+but[1],but[3],(but.length>4?but[4]:false),(but.length>5?but[5]:null))}switch(button_name){case"formatselect":var html='<select id="{$editor_id}_formatSelect" name="{$editor_id}_formatSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FormatBlock\',false,this.options[this.selectedIndex].value);" class="mceSelectList">';var formats=tinyMCE.getParam("theme_advanced_blockformats","p,address,pre,h1,h2,h3,h4,h5,h6",true).split(',');var lookup=[['p','{$lang_theme_paragraph}'],['address','{$lang_theme_address}'],['pre','{$lang_theme_pre}'],['h1','{$lang_theme_h1}'],['h2','{$lang_theme_h2}'],['h3','{$lang_theme_h3}'],['h4','{$lang_theme_h4}'],['h5','{$lang_theme_h5}'],['h6','{$lang_theme_h6}'],['div','{$lang_theme_div}'],['blockquote','{$lang_theme_blockquote}'],['code','{$lang_theme_code}'],['dt','{$lang_theme_dt}'],['dd','{$lang_theme_dd}'],['samp','{$lang_theme_samp}']];html+='<option value="">{$lang_theme_block}</option>';for(var i=0;i<formats.length;i++){for(var x=0;x<lookup.length;x++){if(formats[i]==lookup[x][0])html+='<option value="&lt;'+lookup[x][0]+'&gt;">'+lookup[x][1]+'</option>'}}html+='</select>';return html;case"styleselect":return'<select id="{$editor_id}_styleSelect" onmousedown="tinyMCE.themes.advanced._setupCSSClasses(\'{$editor_id}\');" name="{$editor_id}_styleSelect" onfocus="tinyMCE.addSelectAccessibility(event,this,window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSetCSSClass\',false,this.options[this.selectedIndex].value);" class="mceSelectList">{$style_select_options}</select>';case"fontselect":var fontHTML='<select id="{$editor_id}_fontNameSelect" name="{$editor_id}_fontNameSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontName\',false,this.options[this.selectedIndex].value);" class="mceSelectList"><option value="">{$lang_theme_fontdefault}</option>';var iFonts='Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';var nFonts='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,sand;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';var fonts=tinyMCE.getParam("theme_advanced_fonts",nFonts).split(';');for(i=0;i<fonts.length;i++){if(fonts[i]!=''){var parts=fonts[i].split('=');fontHTML+='<option value="'+parts[1]+'">'+parts[0]+'</option>'}}fontHTML+='</select>';return fontHTML;case"fontsizeselect":return'<select id="{$editor_id}_fontSizeSelect" name="{$editor_id}_fontSizeSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontSize\',false,this.options[this.selectedIndex].value);" class="mceSelectList">'+'<option value="0">{$lang_theme_font_size}</option>'+'<option value="1">1 (8 pt)</option>'+'<option value="2">2 (10 pt)</option>'+'<option value="3">3 (12 pt)</option>'+'<option value="4">4 (14 pt)</option>'+'<option value="5">5 (18 pt)</option>'+'<option value="6">6 (24 pt)</option>'+'<option value="7">7 (36 pt)</option>'+'</select>';case"|":case"separator":return'<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" alt="" />';case"spacer":return'<img src="{$themeurl}/images/separator.gif" width="2" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" alt="" />';case"rowseparator":return'<br />'}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case'mceHelp':tinyMCE.openWindow({file:'about.htm',width:480,height:380},{tinymce_version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion,tinymce_releasedate:tinyMCE.releaseDate,inline:"yes"});return true;case"mceLink":var inst=tinyMCE.getInstanceById(editor_id);var doc=inst.getDoc();var selectedText="";if(tinyMCE.isMSIE){var rng=doc.selection.createRange();selectedText=rng.text}else selectedText=inst.getSel().toString();if(!tinyMCE.linkElement){if((tinyMCE.selectedElement.nodeName.toLowerCase()!="img")&&(selectedText.length<=0))return true}var href="",target="",title="",onclick="",action="insert",style_class="";if(tinyMCE.selectedElement.nodeName.toLowerCase()=="a")tinyMCE.linkElement=tinyMCE.selectedElement;if(tinyMCE.linkElement!=null&&tinyMCE.getAttrib(tinyMCE.linkElement,'href')=="")tinyMCE.linkElement=null;if(tinyMCE.linkElement){href=tinyMCE.getAttrib(tinyMCE.linkElement,'href');target=tinyMCE.getAttrib(tinyMCE.linkElement,'target');title=tinyMCE.getAttrib(tinyMCE.linkElement,'title');onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');style_class=tinyMCE.getAttrib(tinyMCE.linkElement,'class');if(onclick=="")onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');onclick=tinyMCE.cleanupEventStr(onclick);href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);");mceRealHref=tinyMCE.getAttrib(tinyMCE.linkElement,'mce_href');if(mceRealHref!=""){href=mceRealHref;if(tinyMCE.getParam('convert_urls'))href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);")}action="update"}var template=new Array();template['file']='link.htm';template['width']=310;template['height']=200;template['width']+=tinyMCE.getLang('lang_insert_link_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_link_delta_height',0);if(inst.settings['insertlink_callback']){var returnVal=eval(inst.settings['insertlink_callback']+"(href, target, title, onclick, action, style_class);");if(returnVal&&returnVal['href'])TinyMCE_AdvancedTheme._insertLink(returnVal['href'],returnVal['target'],returnVal['title'],returnVal['onclick'],returnVal['style_class'])}else{tinyMCE.openWindow(template,{href:href,target:target,title:title,onclick:onclick,action:action,className:style_class,inline:"yes"})}return true;case"mceImage":var src="",alt="",border="",hspace="",vspace="",width="",height="",align="";var title="",onmouseover="",onmouseout="",action="insert";var img=tinyMCE.imgElement;var inst=tinyMCE.getInstanceById(editor_id);if(tinyMCE.selectedElement!=null&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img"){img=tinyMCE.selectedElement;tinyMCE.imgElement=img}if(img){if(tinyMCE.getAttrib(img,'name').indexOf('mce_')==0)return true;src=tinyMCE.getAttrib(img,'src');alt=tinyMCE.getAttrib(img,'alt');if(alt=="")alt=tinyMCE.getAttrib(img,'title');if(tinyMCE.isGecko){var w=img.style.width;if(w!=null&&w!="")img.setAttribute("width",w);var h=img.style.height;if(h!=null&&h!="")img.setAttribute("height",h)}border=tinyMCE.getAttrib(img,'border');hspace=tinyMCE.getAttrib(img,'hspace');vspace=tinyMCE.getAttrib(img,'vspace');width=tinyMCE.getAttrib(img,'width');height=tinyMCE.getAttrib(img,'height');align=tinyMCE.getAttrib(img,'align');onmouseover=tinyMCE.getAttrib(img,'onmouseover');onmouseout=tinyMCE.getAttrib(img,'onmouseout');title=tinyMCE.getAttrib(img,'title');if(tinyMCE.isMSIE){width=img.attributes['width'].specified?width:"";height=img.attributes['height'].specified?height:""}src=eval(tinyMCE.settings['urlconverter_callback']+"(src, img, true);");mceRealSrc=tinyMCE.getAttrib(img,'mce_src');if(mceRealSrc!=""){src=mceRealSrc;if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, img, true);")}action="update"}var template=new Array();template['file']='image.htm?src={$src}';template['width']=355;template['height']=265+(tinyMCE.isMSIE?25:0);template['width']+=tinyMCE.getLang('lang_insert_image_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_image_delta_height',0);if(inst.settings['insertimage_callback']){var returnVal=eval(inst.settings['insertimage_callback']+"(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");if(returnVal&&returnVal['src'])TinyMCE_AdvancedTheme._insertImage(returnVal['src'],returnVal['alt'],returnVal['border'],returnVal['hspace'],returnVal['vspace'],returnVal['width'],returnVal['height'],returnVal['align'],returnVal['title'],returnVal['onmouseover'],returnVal['onmouseout'])}else tinyMCE.openWindow(template,{src:src,alt:alt,border:border,hspace:hspace,vspace:vspace,width:width,height:height,align:align,title:title,onmouseover:onmouseover,onmouseout:onmouseout,action:action,inline:"yes"});return true;case"forecolor":var fcp=new TinyMCE_Layer(editor_id+'_fcPreview',false),p,img,elm;TinyMCE_AdvancedTheme._hideMenus(editor_id);if(!fcp.exists()){fcp.create('div','mceColorPreview',document.getElementById(editor_id+'_toolbar'));elm=fcp.getElement();elm._editor_id=editor_id;elm._command="forecolor";elm._switchId=editor_id+"_forecolor";tinyMCE.addEvent(elm,'click',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseover',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseout',TinyMCE_AdvancedTheme._handleMenuEvent)}img=tinyMCE.selectNodes(document.getElementById(editor_id+"_forecolor"),function(n){return n.nodeName=="IMG"})[0];p=tinyMCE.getAbsPosition(img,document.getElementById(editor_id+'_toolbar'));fcp.moveTo(p.absLeft,p.absTop);fcp.getElement().style.backgroundColor=value!=null?value:tinyMCE.getInstanceById(editor_id).foreColor;fcp.show();return false;case"forecolorpicker":this._pickColor(editor_id,'forecolor');return true;case"forecolorMenu":TinyMCE_AdvancedTheme._hideMenus(editor_id);var ml=new TinyMCE_Layer(editor_id+'_fcMenu');if(!ml.exists())ml.create('div','mceMenu',document.body,TinyMCE_AdvancedTheme._getColorHTML(editor_id,'theme_advanced_text_colors','forecolor'));tinyMCE.switchClass(editor_id+'_forecolor','mceMenuButtonFocus');ml.moveRelativeTo(document.getElementById(editor_id+"_forecolor"),'bl');ml.moveBy(tinyMCE.isMSIE&&!tinyMCE.isOpera?-1:1,-1);if(tinyMCE.isOpera)ml.moveBy(0,-2);ml.show();return true;case"HiliteColor":var bcp=new TinyMCE_Layer(editor_id+'_bcPreview',false),p,img;TinyMCE_AdvancedTheme._hideMenus(editor_id);if(!bcp.exists()){bcp.create('div','mceColorPreview',document.getElementById(editor_id+'_toolbar'));elm=bcp.getElement();elm._editor_id=editor_id;elm._command="HiliteColor";elm._switchId=editor_id+"_backcolor";tinyMCE.addEvent(elm,'click',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseover',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseout',TinyMCE_AdvancedTheme._handleMenuEvent)}img=tinyMCE.selectNodes(document.getElementById(editor_id+"_backcolor"),function(n){return n.nodeName=="IMG"})[0];p=tinyMCE.getAbsPosition(img,document.getElementById(editor_id+'_toolbar'));bcp.moveTo(p.absLeft,p.absTop);bcp.getElement().style.backgroundColor=value!=null?value:tinyMCE.getInstanceById(editor_id).backColor;bcp.show();return false;case"HiliteColorMenu":TinyMCE_AdvancedTheme._hideMenus(editor_id);var ml=new TinyMCE_Layer(editor_id+'_bcMenu');if(!ml.exists())ml.create('div','mceMenu',document.body,TinyMCE_AdvancedTheme._getColorHTML(editor_id,'theme_advanced_background_colors','HiliteColor'));tinyMCE.switchClass(editor_id+'_backcolor','mceMenuButtonFocus');ml.moveRelativeTo(document.getElementById(editor_id+"_backcolor"),'bl');ml.moveBy(tinyMCE.isMSIE&&!tinyMCE.isOpera?-1:1,-1);if(tinyMCE.isOpera)ml.moveBy(0,-2);ml.show();return true;case"backcolorpicker":this._pickColor(editor_id,'HiliteColor');return true;case"mceColorPicker":if(user_interface){var template=[];if(!value['callback']&&!value['color'])value['color']=value['document'].getElementById(value['element_id']).value;template['file']='color_picker.htm';template['width']=380;template['height']=250;template['close_previous']="no";template['width']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height',0);if(typeof(value['store_selection'])=="undefined")value['store_selection']=true;tinyMCE.lastColorPickerValue=value;tinyMCE.openWindow(template,{editor_id:editor_id,mce_store_selection:value['store_selection'],inline:"yes",command:"mceColorPicker",input_color:value['color']})}else{var savedVal=tinyMCE.lastColorPickerValue,elm;if(savedVal['callback']){savedVal['callback'](value);return true}elm=savedVal['document'].getElementById(savedVal['element_id']);elm.value=value;if(elm.onchange!=null&&elm.onchange!='')eval('elm.onchange();')}return true;case"mceCodeEditor":var template=new Array();template['file']='source_editor.htm';template['width']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_width",720));template['height']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_height",580));tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"no",inline:"yes"});return true;case"mceCharMap":var template=new Array();template['file']='charmap.htm';template['width']=550+(tinyMCE.isOpera?40:0);template['height']=250;template['width']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case"mceInsertAnchor":var template=new Array();template['file']='anchor.htm';template['width']=320;template['height']=90+(tinyMCE.isNS7?30:0);template['width']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case"mceNewDocument":if(confirm(tinyMCE.getLang('lang_newdocument')))tinyMCE.execInstanceCommand(editor_id,'mceSetContent',false,' ');return true}return false},getEditorTemplate:function(settings,editorId){function removeFromArray(in_array,remove_array){var outArray=new Array(),skip;for(var i=0;i<in_array.length;i++){skip=false;for(var j=0;j<remove_array.length;j++){if(in_array[i]==remove_array[j]){skip=true}}if(!skip){outArray[outArray.length]=in_array[i]}}return outArray}function addToArray(in_array,add_array){for(var i=0;i<add_array.length;i++){in_array[in_array.length]=add_array[i]}return in_array}var template=new Array();var deltaHeight=0;var resizing=tinyMCE.getParam("theme_advanced_resizing",false);var path=tinyMCE.getParam("theme_advanced_path",true);var statusbarHTML='<div id="{$editor_id}_path" class="mceStatusbarPathText" style="display: '+(path?"block":"none")+'">&#160;</div><div id="{$editor_id}_resize" class="mceStatusbarResize" style="display: '+(resizing?"block":"none")+'" onmousedown="tinyMCE.themes.advanced._setResizing(event,\'{$editor_id}\',true);"></div><br style="clear: both" />';var layoutManager=tinyMCE.getParam("theme_advanced_layout_manager","SimpleLayout");var styleSelectHTML='<option value="">{$lang_theme_style_select}</option>';if(settings['theme_advanced_styles']){var stylesAr=settings['theme_advanced_styles'].split(';');for(var i=0;i<stylesAr.length;i++){var key,value;key=stylesAr[i].split('=')[0];value=stylesAr[i].split('=')[1];styleSelectHTML+='<option value="'+value+'">'+key+'</option>'}TinyMCE_AdvancedTheme._autoImportCSSClasses=false}switch(layoutManager){case"SimpleLayout":var toolbarHTML="";var toolbarLocation=tinyMCE.getParam("theme_advanced_toolbar_location","bottom");var toolbarAlign=tinyMCE.getParam("theme_advanced_toolbar_align","center");var pathLocation=tinyMCE.getParam("theme_advanced_path_location","none");var statusbarLocation=tinyMCE.getParam("theme_advanced_statusbar_location",pathLocation);var defVals={theme_advanced_buttons1:"bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,separator,sub,sup,separator,charmap"};toolbarHTML+='<a href="#" accesskey="q" title="'+tinyMCE.getLang("lang_toolbar_focus")+'"';if(!tinyMCE.getParam("accessibility_focus"))toolbarHTML+=' onfocus="tinyMCE.getInstanceById(\''+editorId+'\').getWin().focus();"';toolbarHTML+='></a>';for(var i=1;i<100;i++){var def=defVals["theme_advanced_buttons"+i];var buttons=tinyMCE.getParam("theme_advanced_buttons"+i,def==null?'':def,true,',');if(buttons.length==0)break;buttons=removeFromArray(buttons,tinyMCE.getParam("theme_advanced_disable","",true,','));buttons=addToArray(buttons,tinyMCE.getParam("theme_advanced_buttons"+i+"_add","",true,','));buttons=addToArray(tinyMCE.getParam("theme_advanced_buttons"+i+"_add_before","",true,','),buttons);for(var b=0;b<buttons.length;b++)toolbarHTML+=tinyMCE.getControlHTML(buttons[b]);if(buttons.length>0){toolbarHTML+="<br />";deltaHeight-=23}}toolbarHTML+='<a href="#" accesskey="z" onfocus="tinyMCE.getInstanceById(\''+editorId+'\').getWin().focus();"></a>';template['html']='<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width_style};height:{$height_style}"><tbody>';if(toolbarLocation=="top")template['html']+='<tr><td dir="ltr" class="mceToolbarTop" align="'+toolbarAlign+'" height="1" nowrap="nowrap"><span id="'+editorId+'_toolbar" class="mceToolbarContainer">'+toolbarHTML+'</span></td></tr>';if(statusbarLocation=="top"){template['html']+='<tr><td class="mceStatusbarTop" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=23}template['html']+='<tr><td align="center"><span id="{$editor_id}"></span></td></tr>';if(toolbarLocation=="bottom")template['html']+='<tr><td dir="ltr" class="mceToolbarBottom" align="'+toolbarAlign+'" height="1"><span id="'+editorId+'_toolbar" class="mceToolbarContainer">'+toolbarHTML+'</span></td></tr>';if(toolbarLocation=="external"){var bod=document.body;var elm=document.createElement("div");toolbarHTML=tinyMCE.replaceVar(toolbarHTML,'style_select_options',styleSelectHTML);toolbarHTML=tinyMCE.applyTemplate(toolbarHTML,{editor_id:editorId});elm.className="mceToolbarExternal";elm.id=editorId+"_toolbar";elm.innerHTML='<table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table>';bod.appendChild(elm);deltaHeight=0;tinyMCE.getInstanceById(editorId).toolbarElement=elm;}else{tinyMCE.getInstanceById(editorId).toolbarElement=null}if(statusbarLocation=="bottom"){template['html']+='<tr><td class="mceStatusbarBottom" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=23}template['html']+='</tbody></table>';break;case"RowLayout":template['html']='<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';var containers=tinyMCE.getParam("theme_advanced_containers","",true,",");var defaultContainerCSS=tinyMCE.getParam("theme_advanced_containers_default_class","container");var defaultContainerAlign=tinyMCE.getParam("theme_advanced_containers_default_align","center");for(var i=0;i<containers.length;i++){if(containers[i]=="mceEditor")template['html']+='<tr><td align="center" class="mceEditor_border"><span id="{$editor_id}"></span></td></tr>';else if(containers[i]=="mceElementpath"||containers[i]=="mceStatusbar"){var pathClass="mceStatusbar";if(i==containers.length-1){pathClass="mceStatusbarBottom"}else if(i==0){pathClass="mceStatusbar"}else{deltaHeight-=2}template['html']+='<tr><td class="'+pathClass+'" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=22}else{var curContainer=tinyMCE.getParam("theme_advanced_container_"+containers[i],"",true,',');var curContainerHTML="";var curAlign=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align",defaultContainerAlign);var curCSS=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class",defaultContainerCSS);curContainer=removeFromArray(curContainer,tinyMCE.getParam("theme_advanced_disable","",true,','));for(var j=0;j<curContainer.length;j++)curContainerHTML+=tinyMCE.getControlHTML(curContainer[j]);if(curContainer.length>0){curContainerHTML+="<br />";deltaHeight-=23}template['html']+='<tr><td class="'+curCSS+'" align="'+curAlign+'" height="1">'+curContainerHTML+'</td></tr>'}}template['html']+='</tbody></table>';break;case"CustomLayout":var customLayout=tinyMCE.getParam("theme_advanced_custom_layout","");if(customLayout!=""&&eval("typeof("+customLayout+")")!="undefined"){template=eval(customLayout+"(template);")}break}if(resizing)template['html']+='<span id="{$editor_id}_resize_box" class="mceResizeBox"></span>';template['html']=tinyMCE.replaceVar(template['html'],'style_select_options',styleSelectHTML);if(!template['delta_width'])template['delta_width']=0;if(!template['delta_height'])template['delta_height']=deltaHeight;return template},initInstance:function(inst){if(tinyMCE.getParam("theme_advanced_resizing",false)){if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var w=TinyMCE_AdvancedTheme._getCookie("TinyMCE_"+inst.editorId+"_width");var h=TinyMCE_AdvancedTheme._getCookie("TinyMCE_"+inst.editorId+"_height");TinyMCE_AdvancedTheme._resizeTo(inst,w,h,tinyMCE.getParam("theme_advanced_resize_horizontal",true))}}inst.addShortcut('ctrl','k','lang_link_desc','mceLink')},removeInstance:function(inst){new TinyMCE_Layer(inst.editorId+'_fcMenu').remove();new TinyMCE_Layer(inst.editorId+'_bcMenu').remove()},hideInstance:function(inst){TinyMCE_AdvancedTheme._hideMenus(inst.editorId)},_handleMenuEvent:function(e){var te=tinyMCE.isMSIE?window.event.srcElement:e.target;tinyMCE._menuButtonEvent(e.type=="mouseover"?"over":"out",document.getElementById(te._switchId));if(e.type=="click")tinyMCE.execInstanceCommand(te._editor_id,te._command)},_hideMenus:function(id){var fcml=new TinyMCE_Layer(id+'_fcMenu'),bcml=new TinyMCE_Layer(id+'_bcMenu');if(fcml.exists()&&fcml.isVisible()){tinyMCE.switchClass(id+'_forecolor','mceMenuButton');fcml.hide()}if(bcml.exists()&&bcml.isVisible()){tinyMCE.switchClass(id+'_backcolor','mceMenuButton');bcml.hide()}},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection,setup_content){var alignNode,breakOut,classNode;function selectByValue(select_elm,value,first_index){first_index=typeof(first_index)=="undefined"?false:true;if(select_elm){for(var i=0;i<select_elm.options.length;i++){var ov=""+select_elm.options[i].value;if(first_index&&ov.toLowerCase().indexOf(value.toLowerCase())==0){select_elm.selectedIndex=i;return true}if(ov==value){select_elm.selectedIndex=i;return true}}}return false};if(node==null)return;var pathElm=document.getElementById(editor_id+"_path");var inst=tinyMCE.getInstanceById(editor_id);var doc=inst.getDoc();TinyMCE_AdvancedTheme._hideMenus(editor_id);if(pathElm){var parentNode=node;var path=new Array();while(parentNode!=null){if(parentNode.nodeName.toUpperCase()=="BODY"){break}if(parentNode.nodeType==1&&tinyMCE.getAttrib(parentNode,"class").indexOf('mceItemHidden')==-1){path[path.length]=parentNode}parentNode=parentNode.parentNode}var html="";for(var i=path.length-1;i>=0;i--){var nodeName=path[i].nodeName.toLowerCase();var nodeData="";if(nodeName.indexOf("html:")==0)nodeName=nodeName.substring(5);if(nodeName=="b"){nodeName="strong"}if(nodeName=="i"){nodeName="em"}if(nodeName=="span"){var cn=tinyMCE.getAttrib(path[i],"class");if(cn!=""&&cn.indexOf('mceItem')==-1)nodeData+="class: "+cn+" ";var st=tinyMCE.getAttrib(path[i],"style");if(st!=""){st=tinyMCE.serializeStyle(tinyMCE.parseStyle(st));nodeData+="style: "+tinyMCE.xmlEncode(st)+" "}}if(nodeName=="font"){if(tinyMCE.getParam("convert_fonts_to_spans"))nodeName="span";var face=tinyMCE.getAttrib(path[i],"face");if(face!="")nodeData+="font: "+tinyMCE.xmlEncode(face)+" ";var size=tinyMCE.getAttrib(path[i],"size");if(size!="")nodeData+="size: "+tinyMCE.xmlEncode(size)+" ";var color=tinyMCE.getAttrib(path[i],"color");if(color!="")nodeData+="color: "+tinyMCE.xmlEncode(color)+" "}if(tinyMCE.getAttrib(path[i],'id')!=""){nodeData+="id: "+path[i].getAttribute('id')+" "}var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1)nodeData+="class: "+className+" ";if(tinyMCE.getAttrib(path[i],'src')!=""){var src=tinyMCE.getAttrib(path[i],"mce_src");if(src=="")src=tinyMCE.getAttrib(path[i],"src");nodeData+="src: "+tinyMCE.xmlEncode(src)+" "}if(path[i].nodeName=='A'&&tinyMCE.getAttrib(path[i],'href')!=""){var href=tinyMCE.getAttrib(path[i],"mce_href");if(href=="")href=tinyMCE.getAttrib(path[i],"href");nodeData+="href: "+tinyMCE.xmlEncode(href)+" "}className=tinyMCE.getAttrib(path[i],"class");if((nodeName=="img"||nodeName=="span")&&className.indexOf('mceItem')!=-1){nodeName=className.replace(/mceItem([a-z]+)/gi,'$1').toLowerCase();nodeData=path[i].getAttribute('title')}if(nodeName=="a"&&(anchor=tinyMCE.getAttrib(path[i],"name"))!=""){nodeName="a";nodeName+="#"+tinyMCE.xmlEncode(anchor);nodeData=""}if(tinyMCE.getAttrib(path[i],'name').indexOf("mce_")!=0){var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1){nodeName+="."+className}}var cmd='tinyMCE.execInstanceCommand(\''+editor_id+'\',\'mceSelectNodeDepth\',false,\''+i+'\');';html+='<a title="'+nodeData+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" target="_self" class="mcePathItem">'+nodeName+'</a>';if(i>0){html+=" &raquo; "}}pathElm.innerHTML='<a href="#" accesskey="x"></a>'+tinyMCE.getLang('lang_theme_path')+": "+html+'&#160;'}tinyMCE.switchClass(editor_id+'_justifyleft','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifyright','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifycenter','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifyfull','mceButtonNormal');tinyMCE.switchClass(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClass(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClass(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClass(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClass(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClass(editor_id+'_numlist','mceButtonNormal');tinyMCE.switchClass(editor_id+'_sub','mceButtonNormal');tinyMCE.switchClass(editor_id+'_sup','mceButtonNormal');tinyMCE.switchClass(editor_id+'_anchor','mceButtonNormal');tinyMCE.switchClass(editor_id+'_link','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_unlink','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_outdent','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_image','mceButtonNormal');tinyMCE.switchClass(editor_id+'_hr','mceButtonNormal');if(node.nodeName=="A"&&tinyMCE.getAttrib(node,"class").indexOf('mceItemAnchor')!=-1)tinyMCE.switchClass(editor_id+'_anchor','mceButtonSelected');var anchorLink=tinyMCE.getParentElement(node,"a","href");if(anchorLink||any_selection){tinyMCE.switchClass(editor_id+'_link',anchorLink?'mceButtonSelected':'mceButtonNormal');tinyMCE.switchClass(editor_id+'_unlink',anchorLink?'mceButtonSelected':'mceButtonNormal')}tinyMCE.switchClass(editor_id+'_visualaid',visual_aid?'mceButtonSelected':'mceButtonNormal');if(undo_levels!=-1){tinyMCE.switchClass(editor_id+'_undo','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_redo','mceButtonDisabled')}if(tinyMCE.getParentElement(node,"li,blockquote"))tinyMCE.switchClass(editor_id+'_outdent','mceButtonNormal');if(undo_index!=-1&&(undo_index<undo_levels-1&&undo_levels>0))tinyMCE.switchClass(editor_id+'_redo','mceButtonNormal');if(undo_index!=-1&&(undo_index>0&&undo_levels>0))tinyMCE.switchClass(editor_id+'_undo','mceButtonNormal');var selectElm=document.getElementById(editor_id+"_styleSelect");if(selectElm){TinyMCE_AdvancedTheme._setupCSSClasses(editor_id);classNode=node;breakOut=false;var index=0;do{if(classNode&&classNode.className){for(var i=0;i<selectElm.options.length;i++){if(selectElm.options[i].value==classNode.className){index=i;breakOut=true;break}}}}while(!breakOut&&classNode!=null&&(classNode=classNode.parentNode)!=null);selectElm.selectedIndex=index}var selectElm=document.getElementById(editor_id+"_formatSelect");if(selectElm){var elm=tinyMCE.getParentElement(node,"p,div,h1,h2,h3,h4,h5,h6,pre,address");if(elm)selectByValue(selectElm,"<"+elm.nodeName.toLowerCase()+">");else selectByValue(selectElm,"")}var selectElm=document.getElementById(editor_id+"_fontNameSelect");if(selectElm){if(!tinyMCE.isSafari&&!(tinyMCE.isMSIE&&!tinyMCE.isOpera)){var face=inst.queryCommandValue('FontName');face=face==null||face==""?"":face;selectByValue(selectElm,face,face!="")}else{var elm=tinyMCE.getParentElement(node,"font","face");if(elm){var family=tinyMCE.getAttrib(elm,"face");if(family=='')family=''+elm.style.fontFamily;if(!selectByValue(selectElm,family,family!=""))selectByValue(selectElm,"")}else selectByValue(selectElm,"")}}var selectElm=document.getElementById(editor_id+"_fontSizeSelect");if(selectElm){if(!tinyMCE.isSafari&&!tinyMCE.isOpera){var size=inst.queryCommandValue('FontSize');selectByValue(selectElm,size==null||size==""?"0":size)}else{var elm=tinyMCE.getParentElement(node,"font","size");if(elm){var size=tinyMCE.getAttrib(elm,"size");if(size==''){var sizes=new Array('','8px','10px','12px','14px','18px','24px','36px');size=''+elm.style.fontSize;for(var i=0;i<sizes.length;i++){if((''+sizes[i])==size){size=i;break}}}if(!selectByValue(selectElm,size))selectByValue(selectElm,"")}else selectByValue(selectElm,"0")}}alignNode=node;breakOut=false;do{if(!alignNode.getAttribute||!alignNode.getAttribute('align'))continue;switch(alignNode.getAttribute('align').toLowerCase()){case"left":tinyMCE.switchClass(editor_id+'_justifyleft','mceButtonSelected');breakOut=true;break;case"right":tinyMCE.switchClass(editor_id+'_justifyright','mceButtonSelected');breakOut=true;break;case"middle":case"center":tinyMCE.switchClass(editor_id+'_justifycenter','mceButtonSelected');breakOut=true;break;case"justify":tinyMCE.switchClass(editor_id+'_justifyfull','mceButtonSelected');breakOut=true;break}}while(!breakOut&&(alignNode=alignNode.parentNode)!=null);var div=tinyMCE.getParentElement(node,"div");if(div&&div.style.textAlign=="center")tinyMCE.switchClass(editor_id+'_justifycenter','mceButtonSelected');if(!setup_content){var ar=new Array("Bold","_bold","Italic","_italic","Strikethrough","_strikethrough","superscript","_sup","subscript","_sub");for(var i=0;i<ar.length;i+=2){if(inst.queryCommandState(ar[i]))tinyMCE.switchClass(editor_id+ar[i+1],'mceButtonSelected')}if(inst.queryCommandState("Underline")&&(node.parentNode==null||node.parentNode.nodeName!="A"))tinyMCE.switchClass(editor_id+'_underline','mceButtonSelected')}do{switch(node.nodeName){case"UL":tinyMCE.switchClass(editor_id+'_bullist','mceButtonSelected');break;case"OL":tinyMCE.switchClass(editor_id+'_numlist','mceButtonSelected');break;case"HR":tinyMCE.switchClass(editor_id+'_hr','mceButtonSelected');break;case"IMG":if(tinyMCE.getAttrib(node,'name').indexOf('mce_')!=0&&tinyMCE.getAttrib(node,'class').indexOf('mceItem')==-1){tinyMCE.switchClass(editor_id+'_image','mceButtonSelected')}break}}while((node=node.parentNode)!=null)},_setupCSSClasses:function(editor_id){var i,selectElm;if(!TinyMCE_AdvancedTheme._autoImportCSSClasses)return;selectElm=document.getElementById(editor_id+'_styleSelect');if(selectElm&&selectElm.getAttribute('cssImported')!='true'){var csses=tinyMCE.getCSSClasses(editor_id);if(csses&&selectElm){for(i=0;i<csses.length;i++)selectElm.options[selectElm.options.length]=new Option(csses[i],csses[i])}if(csses!=null&&csses.length>0)selectElm.setAttribute('cssImported','true')}},_setCookie:function(name,value,expires,path,domain,secure){var curCookie=name+"="+escape(value)+((expires)?"; expires="+expires.toGMTString():"")+((path)?"; path="+escape(path):"")+((domain)?"; domain="+domain:"")+((secure)?"; secure":"");document.cookie=curCookie},_getCookie:function(name){var dc=document.cookie;var prefix=name+"=";var begin=dc.indexOf("; "+prefix);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))},_resizeTo:function(inst,w,h,set_w){var editorContainer=document.getElementById(inst.editorId+'_parent');var tableElm=editorContainer.firstChild;var iframe=inst.iframeElement;if(w==null||w=="null"){set_w=false;w=0}if(h==null||h=="null")return;w=parseInt(w);h=parseInt(h);if(tinyMCE.isGecko){w+=2;h+=2}var dx=w-tableElm.clientWidth;var dy=h-tableElm.clientHeight;w=w<1?30:w;h=h<1?30:h;if(set_w)tableElm.style.width=w+"px";tableElm.style.height=h+"px";iw=iframe.clientWidth+dx;ih=iframe.clientHeight+dy;iw=iw<1?30:iw;ih=ih<1?30:ih;if(tinyMCE.isGecko){iw-=2;ih-=2}if(set_w)iframe.style.width=iw+"px";iframe.style.height=ih+"px";if(set_w){var tableBodyElm=tableElm.firstChild;var minIframeWidth=tableBodyElm.scrollWidth;if(inst.iframeElement.clientWidth<minIframeWidth){dx=minIframeWidth-inst.iframeElement.clientWidth;inst.iframeElement.style.width=(iw+dx)+"px"}}inst.useCSS=false},_resizeEventHandler:function(e){var resizer=TinyMCE_AdvancedTheme._resizer;if(!resizer.resizing)return;e=typeof(e)=="undefined"?window.event:e;var dx=e.screenX-resizer.downX;var dy=e.screenY-resizer.downY;var resizeBox=resizer.resizeBox;var editorId=resizer.editorId;switch(e.type){case"mousemove":var w,h;w=resizer.width+dx;h=resizer.height+dy;w=w<1?1:w;h=h<1?1:h;if(resizer.horizontal)resizeBox.style.width=w+"px";resizeBox.style.height=h+"px";break;case"mouseup":TinyMCE_AdvancedTheme._setResizing(e,editorId,false);TinyMCE_AdvancedTheme._resizeTo(tinyMCE.getInstanceById(editorId),resizer.width+dx,resizer.height+dy,resizer.horizontal);if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var expires=new Date();expires.setTime(expires.getTime()+3600000*24*30);TinyMCE_AdvancedTheme._setCookie("TinyMCE_"+editorId+"_width",""+(resizer.horizontal?resizer.width+dx:""),expires);TinyMCE_AdvancedTheme._setCookie("TinyMCE_"+editorId+"_height",""+(resizer.height+dy),expires)}break}},_setResizing:function(e,editor_id,state){e=typeof(e)=="undefined"?window.event:e;var resizer=TinyMCE_AdvancedTheme._resizer;var editorContainer=document.getElementById(editor_id+'_parent');var editorArea=document.getElementById(editor_id+'_parent').firstChild;var resizeBox=document.getElementById(editor_id+'_resize_box');var inst=tinyMCE.getInstanceById(editor_id);if(state){var width=editorArea.clientWidth;var height=editorArea.clientHeight;resizeBox.style.width=width+"px";resizeBox.style.height=height+"px";resizer.iframeWidth=inst.iframeElement.clientWidth;resizer.iframeHeight=inst.iframeElement.clientHeight;editorArea.style.display="none";resizeBox.style.display="block";if(!resizer.eventHandlers){if(tinyMCE.isMSIE)tinyMCE.addEvent(document,"mousemove",TinyMCE_AdvancedTheme._resizeEventHandler);else tinyMCE.addEvent(window,"mousemove",TinyMCE_AdvancedTheme._resizeEventHandler);tinyMCE.addEvent(document,"mouseup",TinyMCE_AdvancedTheme._resizeEventHandler);resizer.eventHandlers=true}resizer.resizing=true;resizer.downX=e.screenX;resizer.downY=e.screenY;resizer.width=parseInt(resizeBox.style.width);resizer.height=parseInt(resizeBox.style.height);resizer.editorId=editor_id;resizer.resizeBox=resizeBox;resizer.horizontal=tinyMCE.getParam("theme_advanced_resize_horizontal",true)}else{resizer.resizing=false;resizeBox.style.display="none";editorArea.style.display=tinyMCE.isMSIE&&!tinyMCE.isOpera?"block":"table";tinyMCE.execCommand('mceResetDesignMode')}},_getColorHTML:function(id,n,cm){var i,h,cl;h='<span class="mceMenuLine"></span>';cl=tinyMCE.getParam(n,TinyMCE_AdvancedTheme._defColors).split(',');h+='<table class="mceColors"><tr>';for(i=0;i<cl.length;i++){c='tinyMCE.execInstanceCommand(\''+id+'\', \''+cm+'\', false, \'#'+cl[i]+'\');';h+='<td><a href="javascript:'+c+'" style="background-color: #'+cl[i]+'" onclick="'+c+';return false;"></a></td>';if((i+1)%8==0)h+='</tr><tr>'}h+='</tr></table>';if(tinyMCE.getParam("theme_advanced_more_colors",true))h+='<a href="javascript:void(0);" onclick="TinyMCE_AdvancedTheme._pickColor(\''+id+'\',\''+cm+'\');" class="mceMoreColors">'+tinyMCE.getLang('lang_more_colors')+'</a>';return h},_pickColor:function(id,cm){var inputColor,inst=tinyMCE.selectedInstance;if(cm=='forecolor'&&inst)inputColor=inst.foreColor;if((cm=='backcolor'||cm=='HiliteColor')&&inst)inputColor=inst.backColor;tinyMCE.execCommand('mceColorPicker',true,{color:inputColor,callback:function(c){tinyMCE.execInstanceCommand(id,cm,false,c)}})},_insertImage:function(src,alt,border,hspace,vspace,width,height,align,title,onmouseover,onmouseout){tinyMCE.execCommand("mceInsertContent",false,tinyMCE.createTagHTML('img',{src:tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],src),mce_src:src,alt:alt,border:border,hspace:hspace,vspace:vspace,width:width,height:height,align:align,title:title,onmouseover:onmouseover,onmouseout:onmouseout}))},_insertLink:function(href,target,title,onclick,style_class){tinyMCE.execCommand('mceBeginUndoLevel');if(tinyMCE.selectedInstance&&tinyMCE.selectedElement&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img"){var doc=tinyMCE.selectedInstance.getDoc();var linkElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"a");var newLink=false;if(!linkElement){linkElement=doc.createElement("a");newLink=true}var mhref=href;var thref=eval(tinyMCE.settings['urlconverter_callback']+"(href, linkElement);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(linkElement,'href',thref);tinyMCE.setAttrib(linkElement,'mce_href',mhref);tinyMCE.setAttrib(linkElement,'target',target);tinyMCE.setAttrib(linkElement,'title',title);tinyMCE.setAttrib(linkElement,'onclick',onclick);tinyMCE.setAttrib(linkElement,'class',style_class);if(newLink){linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true));tinyMCE.selectedElement.parentNode.replaceChild(linkElement,tinyMCE.selectedElement)}return}if(!tinyMCE.linkElement&&tinyMCE.selectedInstance){if(tinyMCE.isSafari){tinyMCE.execCommand("mceInsertContent",false,'<a href="'+tinyMCE.uniqueURL+'">'+tinyMCE.selectedInstance.selection.getSelectedHTML()+'</a>')}else tinyMCE.selectedInstance.contentDocument.execCommand("createlink",false,tinyMCE.uniqueURL);tinyMCE.linkElement=tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);var elementArray=tinyMCE.getElementsByAttributeValue(tinyMCE.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);for(var i=0;i<elementArray.length;i++){var mhref=href;var thref=eval(tinyMCE.settings['urlconverter_callback']+"(href, elementArray[i]);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(elementArray[i],'href',thref);tinyMCE.setAttrib(elementArray[i],'mce_href',mhref);tinyMCE.setAttrib(elementArray[i],'target',target);tinyMCE.setAttrib(elementArray[i],'title',title);tinyMCE.setAttrib(elementArray[i],'onclick',onclick);tinyMCE.setAttrib(elementArray[i],'class',style_class)}tinyMCE.linkElement=elementArray[0]}if(tinyMCE.linkElement){var mhref=href;href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(tinyMCE.linkElement,'href',href);tinyMCE.setAttrib(tinyMCE.linkElement,'mce_href',mhref);tinyMCE.setAttrib(tinyMCE.linkElement,'target',target);tinyMCE.setAttrib(tinyMCE.linkElement,'title',title);tinyMCE.setAttrib(tinyMCE.linkElement,'onclick',onclick);tinyMCE.setAttrib(tinyMCE.linkElement,'class',style_class)}tinyMCE.execCommand('mceEndUndoLevel')}};tinyMCE.addTheme("advanced",TinyMCE_AdvancedTheme);tinyMCE.addButtonMap(TinyMCE_AdvancedTheme._buttonMap);
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/editor_template_src.js b/program/js/tiny_mce/themes/advanced/editor_template_src.js
new file mode 100644 (file)
index 0000000..a0217d1
--- /dev/null
@@ -0,0 +1,1516 @@
+/**\r
+ * $Id: editor_template_src.js 256 2007-04-24 09:03:20Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import theme specific language pack */\r
+tinyMCE.importThemeLanguagePack('advanced');\r
+\r
+var TinyMCE_AdvancedTheme = {\r
+       // Private theme fields\r
+       _defColors : "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",\r
+       _autoImportCSSClasses : true,\r
+       _resizer : {},\r
+       _buttons : [\r
+               // Control id, button img, button title, command, user_interface, value\r
+               ['bold', '{$lang_bold_img}', 'lang_bold_desc', 'Bold'],\r
+               ['italic', '{$lang_italic_img}', 'lang_italic_desc', 'Italic'],\r
+               ['underline', '{$lang_underline_img}', 'lang_underline_desc', 'Underline'],\r
+               ['strikethrough', 'strikethrough.gif', 'lang_striketrough_desc', 'Strikethrough'],\r
+               ['justifyleft', 'justifyleft.gif', 'lang_justifyleft_desc', 'JustifyLeft'],\r
+               ['justifycenter', 'justifycenter.gif', 'lang_justifycenter_desc', 'JustifyCenter'],\r
+               ['justifyright', 'justifyright.gif', 'lang_justifyright_desc', 'JustifyRight'],\r
+               ['justifyfull', 'justifyfull.gif', 'lang_justifyfull_desc', 'JustifyFull'],\r
+               ['bullist', 'bullist.gif', 'lang_bullist_desc', 'InsertUnorderedList'],\r
+               ['numlist', 'numlist.gif', 'lang_numlist_desc', 'InsertOrderedList'],\r
+               ['outdent', 'outdent.gif', 'lang_outdent_desc', 'Outdent'],\r
+               ['indent', 'indent.gif', 'lang_indent_desc', 'Indent'],\r
+               ['cut', 'cut.gif', 'lang_cut_desc', 'Cut'],\r
+               ['copy', 'copy.gif', 'lang_copy_desc', 'Copy'],\r
+               ['paste', 'paste.gif', 'lang_paste_desc', 'Paste'],\r
+               ['undo', 'undo.gif', 'lang_undo_desc', 'Undo'],\r
+               ['redo', 'redo.gif', 'lang_redo_desc', 'Redo'],\r
+               ['link', 'link.gif', 'lang_link_desc', 'mceLink', true],\r
+               ['unlink', 'unlink.gif', 'lang_unlink_desc', 'unlink'],\r
+               ['image', 'image.gif', 'lang_image_desc', 'mceImage', true],\r
+               ['cleanup', 'cleanup.gif', 'lang_cleanup_desc', 'mceCleanup'],\r
+               ['help', 'help.gif', 'lang_help_desc', 'mceHelp'],\r
+               ['code', 'code.gif', 'lang_theme_code_desc', 'mceCodeEditor'],\r
+               ['hr', 'hr.gif', 'lang_theme_hr_desc', 'inserthorizontalrule'],\r
+               ['removeformat', 'removeformat.gif', 'lang_theme_removeformat_desc', 'removeformat'],\r
+               ['sub', 'sub.gif', 'lang_theme_sub_desc', 'subscript'],\r
+               ['sup', 'sup.gif', 'lang_theme_sup_desc', 'superscript'],\r
+               ['forecolor', 'forecolor.gif', 'lang_theme_forecolor_desc', 'forecolor', true],\r
+               ['forecolorpicker', 'forecolor.gif', 'lang_theme_forecolor_desc', 'forecolorpicker', true],\r
+               ['backcolor', 'backcolor.gif', 'lang_theme_backcolor_desc', 'HiliteColor', true],\r
+               ['backcolorpicker', 'backcolor.gif', 'lang_theme_backcolor_desc', 'backcolorpicker', true],\r
+               ['charmap', 'charmap.gif', 'lang_theme_charmap_desc', 'mceCharMap'],\r
+               ['visualaid', 'visualaid.gif', 'lang_theme_visualaid_desc', 'mceToggleVisualAid'],\r
+               ['anchor', 'anchor.gif', 'lang_theme_anchor_desc', 'mceInsertAnchor'],\r
+               ['newdocument', 'newdocument.gif', 'lang_newdocument_desc', 'mceNewDocument']\r
+       ],\r
+\r
+       _buttonMap : 'anchor,backcolor,bold,bullist,charmap,cleanup,code,copy,cut,forecolor,help,hr,image,indent,italic,justifycenter,justifyfull,justifyleft,justifyright,link,newdocument,numlist,outdent,paste,redo,removeformat,strikethrough,sub,sup,underline,undo,unlink,visualaid,advhr,ltr,rtl,emotions,flash,fullpage,fullscreen,iespell,insertdate,inserttime,pastetext,pasteword,selectall,preview,print,save,replace,search,table,cell_props,delete_col,delete_row,col_after,col_before,row_after,row_before,merge_cells,row_props,split_cells,delete_table',\r
+\r
+       /**\r
+        * Returns HTML code for the specificed control.\r
+        */\r
+       getControlHTML : function(button_name) {\r
+               var i, x, but;\r
+\r
+               // Lookup button in button list\r
+               for (i=0; i<TinyMCE_AdvancedTheme._buttons.length; i++) {\r
+                       but = TinyMCE_AdvancedTheme._buttons[i];\r
+\r
+                       if (but[0] == button_name && (button_name == "forecolor" || button_name == "backcolor"))\r
+                               return tinyMCE.getMenuButtonHTML(but[0], but[2], '{$themeurl}/images/' + but[1], but[3] + "Menu", but[3], (but.length > 4 ? but[4] : false), (but.length > 5 ? but[5] : null));\r
+\r
+                       if (but[0] == button_name)\r
+                               return tinyMCE.getButtonHTML(but[0], but[2], '{$themeurl}/images/' + but[1], but[3], (but.length > 4 ? but[4] : false), (but.length > 5 ? but[5] : null));\r
+               }\r
+\r
+               // Custom controlls other than buttons\r
+               switch (button_name) {\r
+                       case "formatselect":\r
+                               var html = '<select id="{$editor_id}_formatSelect" name="{$editor_id}_formatSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FormatBlock\',false,this.options[this.selectedIndex].value);" class="mceSelectList">';\r
+                               var formats = tinyMCE.getParam("theme_advanced_blockformats", "p,address,pre,h1,h2,h3,h4,h5,h6", true).split(',');\r
+                               var lookup = [\r
+                                       ['p', '{$lang_theme_paragraph}'],\r
+                                       ['address', '{$lang_theme_address}'],\r
+                                       ['pre', '{$lang_theme_pre}'],\r
+                                       ['h1', '{$lang_theme_h1}'],\r
+                                       ['h2', '{$lang_theme_h2}'],\r
+                                       ['h3', '{$lang_theme_h3}'],\r
+                                       ['h4', '{$lang_theme_h4}'],\r
+                                       ['h5', '{$lang_theme_h5}'],\r
+                                       ['h6', '{$lang_theme_h6}'],\r
+                                       ['div', '{$lang_theme_div}'],\r
+                                       ['blockquote', '{$lang_theme_blockquote}'],\r
+                                       ['code', '{$lang_theme_code}'],\r
+                                       ['dt', '{$lang_theme_dt}'],\r
+                                       ['dd', '{$lang_theme_dd}'],\r
+                                       ['samp', '{$lang_theme_samp}']\r
+                               ];\r
+\r
+                               html += '<option value="">{$lang_theme_block}</option>';\r
+\r
+                               // Build format select\r
+                               for (var i=0; i<formats.length; i++) {\r
+                                       for (var x=0; x<lookup.length; x++) {\r
+                                               if (formats[i] == lookup[x][0])\r
+                                                       html += '<option value="&lt;' + lookup[x][0] + '&gt;">' + lookup[x][1] + '</option>';\r
+                                       }\r
+                               }\r
+\r
+                               html += '</select>';\r
+\r
+                               return html;\r
+\r
+                       case "styleselect":\r
+                               return '<select id="{$editor_id}_styleSelect" onmousedown="tinyMCE.themes.advanced._setupCSSClasses(\'{$editor_id}\');" name="{$editor_id}_styleSelect" onfocus="tinyMCE.addSelectAccessibility(event,this,window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSetCSSClass\',false,this.options[this.selectedIndex].value);" class="mceSelectList">{$style_select_options}</select>';\r
+\r
+                       case "fontselect":\r
+                               var fontHTML = '<select id="{$editor_id}_fontNameSelect" name="{$editor_id}_fontNameSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontName\',false,this.options[this.selectedIndex].value);" class="mceSelectList"><option value="">{$lang_theme_fontdefault}</option>';\r
+                               var iFonts = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';\r
+                               var nFonts = '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,sand;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';\r
+                               var fonts = tinyMCE.getParam("theme_advanced_fonts", nFonts).split(';');\r
+                               for (i=0; i<fonts.length; i++) {\r
+                                       if (fonts[i] != '') {\r
+                                               var parts = fonts[i].split('=');\r
+                                               fontHTML += '<option value="' + parts[1] + '">' + parts[0] + '</option>';\r
+                                       }\r
+                               }\r
+\r
+                               fontHTML += '</select>';\r
+                               return fontHTML;\r
+\r
+                       case "fontsizeselect":\r
+                               return '<select id="{$editor_id}_fontSizeSelect" name="{$editor_id}_fontSizeSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontSize\',false,this.options[this.selectedIndex].value);" class="mceSelectList">'+\r
+                                               '<option value="0">{$lang_theme_font_size}</option>'+\r
+                                               '<option value="1">1 (8 pt)</option>'+\r
+                                               '<option value="2">2 (10 pt)</option>'+\r
+                                               '<option value="3">3 (12 pt)</option>'+\r
+                                               '<option value="4">4 (14 pt)</option>'+\r
+                                               '<option value="5">5 (18 pt)</option>'+\r
+                                               '<option value="6">6 (24 pt)</option>'+\r
+                                               '<option value="7">7 (36 pt)</option>'+\r
+                                               '</select>';\r
+\r
+                       case "|":\r
+                       case "separator":\r
+                               return '<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" alt="" />';\r
+\r
+                       case "spacer":\r
+                               return '<img src="{$themeurl}/images/separator.gif" width="2" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" alt="" />';\r
+\r
+                       case "rowseparator":\r
+                               return '<br />';\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       /**\r
+        * Theme specific execcommand handling.\r
+        */\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               switch (command) {\r
+                       case 'mceHelp':\r
+                               tinyMCE.openWindow({\r
+                                       file : 'about.htm',\r
+                                       width : 480,\r
+                                       height : 380\r
+                               }, {\r
+                                       tinymce_version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion,\r
+                                       tinymce_releasedate : tinyMCE.releaseDate,\r
+                                       inline : "yes"\r
+                               });\r
+                       return true;\r
+\r
+                       case "mceLink":\r
+                               var inst = tinyMCE.getInstanceById(editor_id);\r
+                               var doc = inst.getDoc();\r
+                               var selectedText = "";\r
+\r
+                               if (tinyMCE.isMSIE) {\r
+                                       var rng = doc.selection.createRange();\r
+                                       selectedText = rng.text;\r
+                               } else\r
+                                       selectedText = inst.getSel().toString();\r
+\r
+                               if (!tinyMCE.linkElement) {\r
+                                       if ((tinyMCE.selectedElement.nodeName.toLowerCase() != "img") && (selectedText.length <= 0))\r
+                                               return true;\r
+                               }\r
+\r
+                               var href = "", target = "", title = "", onclick = "", action = "insert", style_class = "";\r
+\r
+                               if (tinyMCE.selectedElement.nodeName.toLowerCase() == "a")\r
+                                       tinyMCE.linkElement = tinyMCE.selectedElement;\r
+\r
+                               // Is anchor not a link\r
+                               if (tinyMCE.linkElement != null && tinyMCE.getAttrib(tinyMCE.linkElement, 'href') == "")\r
+                                       tinyMCE.linkElement = null;\r
+\r
+                               if (tinyMCE.linkElement) {\r
+                                       href = tinyMCE.getAttrib(tinyMCE.linkElement, 'href');\r
+                                       target = tinyMCE.getAttrib(tinyMCE.linkElement, 'target');\r
+                                       title = tinyMCE.getAttrib(tinyMCE.linkElement, 'title');\r
+                                       onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');\r
+                                       style_class = tinyMCE.getAttrib(tinyMCE.linkElement, 'class');\r
+\r
+                                       // Try old onclick to if copy/pasted content\r
+                                       if (onclick == "")\r
+                                               onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');\r
+\r
+                                       onclick = tinyMCE.cleanupEventStr(onclick);\r
+\r
+                                       href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");\r
+\r
+                                       // Use mce_href if defined\r
+                                       mceRealHref = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_href');\r
+                                       if (mceRealHref != "") {\r
+                                               href = mceRealHref;\r
+\r
+                                               if (tinyMCE.getParam('convert_urls'))\r
+                                                       href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");\r
+                                       }\r
+\r
+                                       action = "update";\r
+                               }\r
+\r
+                               var template = new Array();\r
+\r
+                               template['file'] = 'link.htm';\r
+                               template['width'] = 310;\r
+                               template['height'] = 200;\r
+\r
+                               // Language specific width and height addons\r
+                               template['width'] += tinyMCE.getLang('lang_insert_link_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_insert_link_delta_height', 0);\r
+\r
+                               if (inst.settings['insertlink_callback']) {\r
+                                       var returnVal = eval(inst.settings['insertlink_callback'] + "(href, target, title, onclick, action, style_class);");\r
+                                       if (returnVal && returnVal['href'])\r
+                                               TinyMCE_AdvancedTheme._insertLink(returnVal['href'], returnVal['target'], returnVal['title'], returnVal['onclick'], returnVal['style_class']);\r
+                               } else {\r
+                                       tinyMCE.openWindow(template, {href : href, target : target, title : title, onclick : onclick, action : action, className : style_class, inline : "yes"});\r
+                               }\r
+\r
+                               return true;\r
+\r
+                       case "mceImage":\r
+                               var src = "", alt = "", border = "", hspace = "", vspace = "", width = "", height = "", align = "";\r
+                               var title = "", onmouseover = "", onmouseout = "", action = "insert";\r
+                               var img = tinyMCE.imgElement;\r
+                               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+                               if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {\r
+                                       img = tinyMCE.selectedElement;\r
+                                       tinyMCE.imgElement = img;\r
+                               }\r
+\r
+                               if (img) {\r
+                                       // Is it a internal MCE visual aid image, then skip this one.\r
+                                       if (tinyMCE.getAttrib(img, 'name').indexOf('mce_') == 0)\r
+                                               return true;\r
+\r
+                                       src = tinyMCE.getAttrib(img, 'src');\r
+                                       alt = tinyMCE.getAttrib(img, 'alt');\r
+\r
+                                       // Try polling out the title\r
+                                       if (alt == "")\r
+                                               alt = tinyMCE.getAttrib(img, 'title');\r
+\r
+                                       // Fix width/height attributes if the styles is specified\r
+                                       if (tinyMCE.isGecko) {\r
+                                               var w = img.style.width;\r
+                                               if (w != null && w != "")\r
+                                                       img.setAttribute("width", w);\r
+\r
+                                               var h = img.style.height;\r
+                                               if (h != null && h != "")\r
+                                                       img.setAttribute("height", h);\r
+                                       }\r
+\r
+                                       border = tinyMCE.getAttrib(img, 'border');\r
+                                       hspace = tinyMCE.getAttrib(img, 'hspace');\r
+                                       vspace = tinyMCE.getAttrib(img, 'vspace');\r
+                                       width = tinyMCE.getAttrib(img, 'width');\r
+                                       height = tinyMCE.getAttrib(img, 'height');\r
+                                       align = tinyMCE.getAttrib(img, 'align');\r
+                                       onmouseover = tinyMCE.getAttrib(img, 'onmouseover');\r
+                                       onmouseout = tinyMCE.getAttrib(img, 'onmouseout');\r
+                                       title = tinyMCE.getAttrib(img, 'title');\r
+\r
+                                       // Is realy specified?\r
+                                       if (tinyMCE.isMSIE) {\r
+                                               width = img.attributes['width'].specified ? width : "";\r
+                                               height = img.attributes['height'].specified ? height : "";\r
+                                       }\r
+\r
+                                       //onmouseover = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover));\r
+                                       //onmouseout = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout));\r
+\r
+                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");\r
+\r
+                                       // Use mce_src if defined\r
+                                       mceRealSrc = tinyMCE.getAttrib(img, 'mce_src');\r
+                                       if (mceRealSrc != "") {\r
+                                               src = mceRealSrc;\r
+\r
+                                               if (tinyMCE.getParam('convert_urls'))\r
+                                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");\r
+                                       }\r
+\r
+                                       //if (onmouseover != "")\r
+                                       //      onmouseover = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, img, true);");\r
+\r
+                                       //if (onmouseout != "")\r
+                                       //      onmouseout = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, img, true);");\r
+\r
+                                       action = "update";\r
+                               }\r
+\r
+                               var template = new Array();\r
+\r
+                               template['file'] = 'image.htm?src={$src}';\r
+                               template['width'] = 355;\r
+                               template['height'] = 265 + (tinyMCE.isMSIE ? 25 : 0);\r
+\r
+                               // Language specific width and height addons\r
+                               template['width'] += tinyMCE.getLang('lang_insert_image_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_insert_image_delta_height', 0);\r
+\r
+                               if (inst.settings['insertimage_callback']) {\r
+                                       var returnVal = eval(inst.settings['insertimage_callback'] + "(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");\r
+                                       if (returnVal && returnVal['src'])\r
+                                               TinyMCE_AdvancedTheme._insertImage(returnVal['src'], returnVal['alt'], returnVal['border'], returnVal['hspace'], returnVal['vspace'], returnVal['width'], returnVal['height'], returnVal['align'], returnVal['title'], returnVal['onmouseover'], returnVal['onmouseout']);\r
+                               } else\r
+                                       tinyMCE.openWindow(template, {src : src, alt : alt, border : border, hspace : hspace, vspace : vspace, width : width, height : height, align : align, title : title, onmouseover : onmouseover, onmouseout : onmouseout, action : action, inline : "yes"});\r
+\r
+                               return true;\r
+\r
+                       case "forecolor":\r
+                               var fcp = new TinyMCE_Layer(editor_id + '_fcPreview', false), p, img, elm;\r
+\r
+                               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
+\r
+                               if (!fcp.exists()) {\r
+                                       fcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar'));\r
+                                       elm = fcp.getElement();\r
+                                       elm._editor_id = editor_id;\r
+                                       elm._command = "forecolor";\r
+                                       elm._switchId = editor_id + "_forecolor";\r
+                                       tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent);\r
+                                       tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent);\r
+                                       tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent);\r
+                               }\r
+\r
+                               img = tinyMCE.selectNodes(document.getElementById(editor_id + "_forecolor"), function(n) {return n.nodeName == "IMG";})[0];\r
+                               p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar'));\r
+\r
+                               fcp.moveTo(p.absLeft, p.absTop);\r
+                               fcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).foreColor;\r
+                               fcp.show();\r
+\r
+                               return false;\r
+\r
+                       case "forecolorpicker":\r
+                               this._pickColor(editor_id, 'forecolor');\r
+                               return true;\r
+\r
+                       case "forecolorMenu":\r
+                               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
+\r
+                               // Create color layer\r
+                               var ml = new TinyMCE_Layer(editor_id + '_fcMenu');\r
+\r
+                               if (!ml.exists())\r
+                                       ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_text_colors', 'forecolor'));\r
+\r
+                               tinyMCE.switchClass(editor_id + '_forecolor', 'mceMenuButtonFocus');\r
+                               ml.moveRelativeTo(document.getElementById(editor_id + "_forecolor"), 'bl');\r
+\r
+                               ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1);\r
+\r
+                               if (tinyMCE.isOpera)\r
+                                       ml.moveBy(0, -2);\r
+\r
+                               ml.show();\r
+                       return true;\r
+\r
+                       case "HiliteColor":\r
+                               var bcp = new TinyMCE_Layer(editor_id + '_bcPreview', false), p, img;\r
+\r
+                               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
+\r
+                               if (!bcp.exists()) {\r
+                                       bcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar'));\r
+                                       elm = bcp.getElement();\r
+                                       elm._editor_id = editor_id;\r
+                                       elm._command = "HiliteColor";\r
+                                       elm._switchId = editor_id + "_backcolor";\r
+                                       tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent);\r
+                                       tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent);\r
+                                       tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent);\r
+                               }\r
+\r
+                               img = tinyMCE.selectNodes(document.getElementById(editor_id + "_backcolor"), function(n) {return n.nodeName == "IMG";})[0];\r
+                               p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar'));\r
+\r
+                               bcp.moveTo(p.absLeft, p.absTop);\r
+                               bcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).backColor;\r
+                               bcp.show();\r
+\r
+                               return false;\r
+\r
+                       case "HiliteColorMenu":\r
+                               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
+\r
+                               // Create color layer\r
+                               var ml = new TinyMCE_Layer(editor_id + '_bcMenu');\r
+\r
+                               if (!ml.exists())\r
+                                       ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_background_colors', 'HiliteColor'));\r
+\r
+                               tinyMCE.switchClass(editor_id + '_backcolor', 'mceMenuButtonFocus');\r
+                               ml.moveRelativeTo(document.getElementById(editor_id + "_backcolor"), 'bl');\r
+\r
+                               ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1);\r
+\r
+                               if (tinyMCE.isOpera)\r
+                                       ml.moveBy(0, -2);\r
+\r
+                               ml.show();\r
+                       return true;\r
+       \r
+                       case "backcolorpicker":\r
+                               this._pickColor(editor_id, 'HiliteColor');\r
+                               return true;\r
+\r
+                       case "mceColorPicker":\r
+                               if (user_interface) {\r
+                                       var template = [];\r
+       \r
+                                       if (!value['callback'] && !value['color'])\r
+                                               value['color'] = value['document'].getElementById(value['element_id']).value;\r
+\r
+                                       template['file'] = 'color_picker.htm';\r
+                                       template['width'] = 380;\r
+                                       template['height'] = 250;\r
+                                       template['close_previous'] = "no";\r
+\r
+                                       template['width'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width', 0);\r
+                                       template['height'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height', 0);\r
+\r
+                                       if (typeof(value['store_selection']) == "undefined")\r
+                                               value['store_selection'] = true;\r
+\r
+                                       tinyMCE.lastColorPickerValue = value;\r
+                                       tinyMCE.openWindow(template, {editor_id : editor_id, mce_store_selection : value['store_selection'], inline : "yes", command : "mceColorPicker", input_color : value['color']});\r
+                               } else {\r
+                                       var savedVal = tinyMCE.lastColorPickerValue, elm;\r
+\r
+                                       if (savedVal['callback']) {\r
+                                               savedVal['callback'](value);\r
+                                               return true;\r
+                                       }\r
+\r
+                                       elm = savedVal['document'].getElementById(savedVal['element_id']);\r
+                                       elm.value = value;\r
+\r
+                                       if (elm.onchange != null && elm.onchange != '')\r
+                                               eval('elm.onchange();');\r
+                               }\r
+                       return true;\r
+\r
+                       case "mceCodeEditor":\r
+                               var template = new Array();\r
+\r
+                               template['file'] = 'source_editor.htm';\r
+                               template['width'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_width", 720));\r
+                               template['height'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_height", 580));\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "no", inline : "yes"});\r
+                               return true;\r
+\r
+                       case "mceCharMap":\r
+                               var template = new Array();\r
+\r
+                               template['file'] = 'charmap.htm';\r
+                               template['width'] = 550 + (tinyMCE.isOpera ? 40 : 0);\r
+                               template['height'] = 250;\r
+\r
+                               template['width'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_height', 0);\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
+                               return true;\r
+\r
+                       case "mceInsertAnchor":\r
+                               var template = new Array();\r
+\r
+                               template['file'] = 'anchor.htm';\r
+                               template['width'] = 320;\r
+                               template['height'] = 90 + (tinyMCE.isNS7 ? 30 : 0);\r
+\r
+                               template['width'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_height', 0);\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
+                               return true;\r
+\r
+                       case "mceNewDocument":\r
+                               if (confirm(tinyMCE.getLang('lang_newdocument')))\r
+                                       tinyMCE.execInstanceCommand(editor_id, 'mceSetContent', false, ' ');\r
+\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       /**\r
+        * Editor instance template function.\r
+        */\r
+       getEditorTemplate : function(settings, editorId) {\r
+               function removeFromArray(in_array, remove_array) {\r
+                       var outArray = new Array(), skip;\r
+                       \r
+                       for (var i=0; i<in_array.length; i++) {\r
+                               skip = false;\r
+\r
+                               for (var j=0; j<remove_array.length; j++) {\r
+                                       if (in_array[i] == remove_array[j]) {\r
+                                               skip = true;\r
+                                       }\r
+                               }\r
+\r
+                               if (!skip) {\r
+                                       outArray[outArray.length] = in_array[i];\r
+                               }\r
+                       }\r
+\r
+                       return outArray;\r
+               }\r
+\r
+               function addToArray(in_array, add_array) {\r
+                       for (var i=0; i<add_array.length; i++) {\r
+                               in_array[in_array.length] = add_array[i];\r
+                       }\r
+\r
+                       return in_array;\r
+               }\r
+\r
+               var template = new Array();\r
+               var deltaHeight = 0;\r
+               var resizing = tinyMCE.getParam("theme_advanced_resizing", false);\r
+               var path = tinyMCE.getParam("theme_advanced_path", true);\r
+               var statusbarHTML = '<div id="{$editor_id}_path" class="mceStatusbarPathText" style="display: ' + (path ? "block" : "none") + '">&#160;</div><div id="{$editor_id}_resize" class="mceStatusbarResize" style="display: ' + (resizing ? "block" : "none") + '" onmousedown="tinyMCE.themes.advanced._setResizing(event,\'{$editor_id}\',true);"></div><br style="clear: both" />';\r
+               var layoutManager = tinyMCE.getParam("theme_advanced_layout_manager", "SimpleLayout");\r
+\r
+               // Setup style select options -- MOVED UP FOR EXTERNAL TOOLBAR COMPATABILITY!\r
+               var styleSelectHTML = '<option value="">{$lang_theme_style_select}</option>';\r
+               if (settings['theme_advanced_styles']) {\r
+                       var stylesAr = settings['theme_advanced_styles'].split(';');\r
+                       \r
+                       for (var i=0; i<stylesAr.length; i++) {\r
+                               var key, value;\r
+\r
+                               key = stylesAr[i].split('=')[0];\r
+                               value = stylesAr[i].split('=')[1];\r
+\r
+                               styleSelectHTML += '<option value="' + value + '">' + key + '</option>';\r
+                       }\r
+\r
+                       TinyMCE_AdvancedTheme._autoImportCSSClasses = false;\r
+               }\r
+\r
+               switch(layoutManager) {\r
+                       case "SimpleLayout" : //the default TinyMCE Layout (for backwards compatibility)...\r
+                               var toolbarHTML = "";\r
+                               var toolbarLocation = tinyMCE.getParam("theme_advanced_toolbar_location", "bottom");\r
+                               var toolbarAlign = tinyMCE.getParam("theme_advanced_toolbar_align", "center");\r
+                               var pathLocation = tinyMCE.getParam("theme_advanced_path_location", "none"); // Compatiblity\r
+                               var statusbarLocation = tinyMCE.getParam("theme_advanced_statusbar_location", pathLocation);\r
+                               var defVals = {\r
+                                       theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",\r
+                                       theme_advanced_buttons2 : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",\r
+                                       theme_advanced_buttons3 : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap"\r
+                               };\r
+\r
+                               // Add accessibility control\r
+                               toolbarHTML += '<a href="#" accesskey="q" title="' + tinyMCE.getLang("lang_toolbar_focus") + '"';\r
+\r
+                               if (!tinyMCE.getParam("accessibility_focus"))\r
+                                       toolbarHTML += ' onfocus="tinyMCE.getInstanceById(\'' + editorId + '\').getWin().focus();"';\r
+\r
+                               toolbarHTML += '></a>';\r
+\r
+                               // Render rows\r
+                               for (var i=1; i<100; i++) {\r
+                                       var def = defVals["theme_advanced_buttons" + i];\r
+\r
+                                       var buttons = tinyMCE.getParam("theme_advanced_buttons" + i, def == null ? '' : def, true, ',');\r
+                                       if (buttons.length == 0)\r
+                                               break;\r
+\r
+                                       buttons = removeFromArray(buttons, tinyMCE.getParam("theme_advanced_disable", "", true, ','));\r
+                                       buttons = addToArray(buttons, tinyMCE.getParam("theme_advanced_buttons" + i + "_add", "", true, ','));\r
+                                       buttons = addToArray(tinyMCE.getParam("theme_advanced_buttons" + i + "_add_before", "", true, ','), buttons);\r
+\r
+                                       for (var b=0; b<buttons.length; b++)\r
+                                               toolbarHTML += tinyMCE.getControlHTML(buttons[b]);\r
+\r
+                                       if (buttons.length > 0) {\r
+                                               toolbarHTML += "<br />";\r
+                                               deltaHeight -= 23;\r
+                                       }\r
+                               }\r
+\r
+                               // Add accessibility control\r
+                               toolbarHTML += '<a href="#" accesskey="z" onfocus="tinyMCE.getInstanceById(\'' + editorId + '\').getWin().focus();"></a>';\r
+\r
+                               // Setup template html\r
+                               template['html'] = '<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width_style};height:{$height_style}"><tbody>';\r
+\r
+                               if (toolbarLocation == "top")\r
+                                       template['html'] += '<tr><td dir="ltr" class="mceToolbarTop" align="' + toolbarAlign + '" height="1" nowrap="nowrap"><span id="' + editorId + '_toolbar" class="mceToolbarContainer">' + toolbarHTML + '</span></td></tr>';\r
+\r
+                               if (statusbarLocation == "top") {\r
+                                       template['html'] += '<tr><td class="mceStatusbarTop" height="1">' + statusbarHTML + '</td></tr>';\r
+                                       deltaHeight -= 23;\r
+                               }\r
+\r
+                               template['html'] += '<tr><td align="center"><span id="{$editor_id}"></span></td></tr>';\r
+\r
+                               if (toolbarLocation == "bottom")\r
+                                       template['html'] += '<tr><td dir="ltr" class="mceToolbarBottom" align="' + toolbarAlign + '" height="1"><span id="' + editorId + '_toolbar" class="mceToolbarContainer">' + toolbarHTML + '</span></td></tr>';\r
+\r
+                               // External toolbar changes\r
+                               if (toolbarLocation == "external") {\r
+                                       var bod = document.body;\r
+                                       var elm = document.createElement ("div");\r
+\r
+                                       toolbarHTML = tinyMCE.replaceVar(toolbarHTML, 'style_select_options', styleSelectHTML);\r
+                                       toolbarHTML = tinyMCE.applyTemplate(toolbarHTML, {editor_id : editorId});\r
+\r
+                                       elm.className = "mceToolbarExternal";\r
+                                       elm.id = editorId+"_toolbar";\r
+                                       elm.innerHTML = '<table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table>';\r
+                                       bod.appendChild (elm);\r
+                                       // bod.style.marginTop = elm.offsetHeight + "px";\r
+\r
+                                       deltaHeight = 0;\r
+                                       tinyMCE.getInstanceById(editorId).toolbarElement = elm;\r
+\r
+                                       //template['html'] = '<div id="mceExternalToolbar" align="center" class="mceToolbarExternal"><table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table></div>' + template["html"];\r
+                               } else {\r
+                                       tinyMCE.getInstanceById(editorId).toolbarElement = null;\r
+                               }\r
+\r
+                               if (statusbarLocation == "bottom") {\r
+                                       template['html'] += '<tr><td class="mceStatusbarBottom" height="1">' + statusbarHTML + '</td></tr>';\r
+                                       deltaHeight -= 23;\r
+                               }\r
+\r
+                               template['html'] += '</tbody></table>';\r
+                               //"SimpleLayout"\r
+                       break;\r
+\r
+                       case "RowLayout" : //Container Layout - containers defined in "theme_advanced_containers" are rendered from top to bottom.\r
+                               template['html'] = '<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';\r
+\r
+                               var containers = tinyMCE.getParam("theme_advanced_containers", "", true, ",");\r
+                               var defaultContainerCSS = tinyMCE.getParam("theme_advanced_containers_default_class", "container");\r
+                               var defaultContainerAlign = tinyMCE.getParam("theme_advanced_containers_default_align", "center");\r
+\r
+                               //Render Containers:\r
+                               for (var i = 0; i < containers.length; i++)\r
+                               {\r
+                                       if (containers[i] == "mceEditor") //Exceptions for mceEditor and ...\r
+                                               template['html'] += '<tr><td align="center" class="mceEditor_border"><span id="{$editor_id}"></span></td></tr>';\r
+                                       else if (containers[i] == "mceElementpath" || containers[i] == "mceStatusbar") // ... mceElementpath:\r
+                                       {\r
+                                               var pathClass = "mceStatusbar";\r
+\r
+                                               if (i == containers.length-1)\r
+                                               {\r
+                                                       pathClass = "mceStatusbarBottom";\r
+                                               }\r
+                                               else if (i == 0)\r
+                                               {\r
+                                                       pathClass = "mceStatusbar";\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       deltaHeight-=2;\r
+                                               }\r
+\r
+                                               template['html'] += '<tr><td class="' + pathClass + '" height="1">' + statusbarHTML + '</td></tr>';\r
+                                               deltaHeight -= 22;\r
+                                       } else { // Render normal Container\r
+                                               var curContainer = tinyMCE.getParam("theme_advanced_container_"+containers[i], "", true, ',');\r
+                                               var curContainerHTML = "";\r
+                                               var curAlign = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align", defaultContainerAlign);\r
+                                               var curCSS = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class", defaultContainerCSS);\r
+\r
+                                               curContainer = removeFromArray(curContainer, tinyMCE.getParam("theme_advanced_disable", "", true, ','));\r
+\r
+                                               for (var j=0; j<curContainer.length; j++)\r
+                                                       curContainerHTML += tinyMCE.getControlHTML(curContainer[j]);\r
+\r
+                                               if (curContainer.length > 0) {\r
+                                                       curContainerHTML += "<br />";\r
+                                                       deltaHeight -= 23;\r
+                                               }\r
+\r
+                                               template['html'] += '<tr><td class="' + curCSS + '" align="' + curAlign + '" height="1">' + curContainerHTML + '</td></tr>';\r
+                                       }\r
+                               }\r
+\r
+                               template['html'] += '</tbody></table>';\r
+                               //RowLayout\r
+                       break;\r
+\r
+                       case "CustomLayout" : //User defined layout callback...\r
+                               var customLayout = tinyMCE.getParam("theme_advanced_custom_layout","");\r
+\r
+                               if (customLayout != "" && eval("typeof(" + customLayout + ")") != "undefined") {\r
+                                       template = eval(customLayout + "(template);");\r
+                               }\r
+                       break;\r
+               }\r
+\r
+               if (resizing)\r
+                       template['html'] += '<span id="{$editor_id}_resize_box" class="mceResizeBox"></span>';\r
+\r
+               template['html'] = tinyMCE.replaceVar(template['html'], 'style_select_options', styleSelectHTML);\r
+\r
+               // Set to default values\r
+               if (!template['delta_width'])\r
+                       template['delta_width'] = 0;\r
+\r
+               if (!template['delta_height'])\r
+                       template['delta_height'] = deltaHeight;\r
+\r
+               return template;\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               if (tinyMCE.getParam("theme_advanced_resizing", false)) {\r
+                       if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {\r
+                               var w = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_width");\r
+                               var h = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_height");\r
+\r
+                               TinyMCE_AdvancedTheme._resizeTo(inst, w, h, tinyMCE.getParam("theme_advanced_resize_horizontal", true));\r
+                       }\r
+               }\r
+\r
+               inst.addShortcut('ctrl', 'k', 'lang_link_desc', 'mceLink');\r
+       },\r
+\r
+       removeInstance : function(inst) {\r
+               new TinyMCE_Layer(inst.editorId + '_fcMenu').remove();\r
+               new TinyMCE_Layer(inst.editorId + '_bcMenu').remove();\r
+       },\r
+\r
+       hideInstance : function(inst) {\r
+               TinyMCE_AdvancedTheme._hideMenus(inst.editorId);\r
+       },\r
+\r
+       _handleMenuEvent : function(e) {\r
+               var te = tinyMCE.isMSIE ? window.event.srcElement : e.target;\r
+               tinyMCE._menuButtonEvent(e.type == "mouseover" ? "over" : "out", document.getElementById(te._switchId));\r
+\r
+               if (e.type == "click")\r
+                       tinyMCE.execInstanceCommand(te._editor_id, te._command);\r
+       },\r
+\r
+       _hideMenus : function(id) {\r
+               var fcml = new TinyMCE_Layer(id + '_fcMenu'), bcml = new TinyMCE_Layer(id + '_bcMenu');\r
+\r
+               if (fcml.exists() && fcml.isVisible()) {\r
+                       tinyMCE.switchClass(id + '_forecolor', 'mceMenuButton');\r
+                       fcml.hide();\r
+               }\r
+\r
+               if (bcml.exists() && bcml.isVisible()) {\r
+                       tinyMCE.switchClass(id + '_backcolor', 'mceMenuButton');\r
+                       bcml.hide();\r
+               }\r
+       },\r
+\r
+       /**\r
+        * Node change handler.\r
+        */\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection, setup_content) {\r
+               var alignNode, breakOut, classNode;\r
+\r
+               function selectByValue(select_elm, value, first_index) {\r
+                       first_index = typeof(first_index) == "undefined" ? false : true;\r
+\r
+                       if (select_elm) {\r
+                               for (var i=0; i<select_elm.options.length; i++) {\r
+                                       var ov = "" + select_elm.options[i].value;\r
+\r
+                                       if (first_index && ov.toLowerCase().indexOf(value.toLowerCase()) == 0) {\r
+                                               select_elm.selectedIndex = i;\r
+                                               return true;\r
+                                       }\r
+\r
+                                       if (ov == value) {\r
+                                               select_elm.selectedIndex = i;\r
+                                               return true;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       return false;\r
+               };\r
+\r
+               // No node provided\r
+               if (node == null)\r
+                       return;\r
+\r
+               // Update path\r
+               var pathElm = document.getElementById(editor_id + "_path");\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+               var doc = inst.getDoc();\r
+               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
+\r
+               if (pathElm) {\r
+                       // Get node path\r
+                       var parentNode = node;\r
+                       var path = new Array();\r
+                       \r
+                       while (parentNode != null) {\r
+                               if (parentNode.nodeName.toUpperCase() == "BODY") {\r
+                                       break;\r
+                               }\r
+\r
+                               // Only append element nodes to path\r
+                               if (parentNode.nodeType == 1 && tinyMCE.getAttrib(parentNode, "class").indexOf('mceItemHidden') == -1) {\r
+                                       path[path.length] = parentNode;\r
+                               }\r
+\r
+                               parentNode = parentNode.parentNode;\r
+                       }\r
+\r
+                       // Setup HTML\r
+                       var html = "";\r
+                       for (var i=path.length-1; i>=0; i--) {\r
+                               var nodeName = path[i].nodeName.toLowerCase();\r
+                               var nodeData = "";\r
+\r
+                               if (nodeName.indexOf("html:") == 0)\r
+                                       nodeName = nodeName.substring(5);\r
+\r
+                               if (nodeName == "b") {\r
+                                       nodeName = "strong";\r
+                               }\r
+\r
+                               if (nodeName == "i") {\r
+                                       nodeName = "em";\r
+                               }\r
+\r
+                               if (nodeName == "span") {\r
+                                       var cn = tinyMCE.getAttrib(path[i], "class");\r
+                                       if (cn != "" && cn.indexOf('mceItem') == -1)\r
+                                               nodeData += "class: " + cn + " ";\r
+\r
+                                       var st = tinyMCE.getAttrib(path[i], "style");\r
+                                       if (st != "") {\r
+                                               st = tinyMCE.serializeStyle(tinyMCE.parseStyle(st));\r
+                                               nodeData += "style: " + tinyMCE.xmlEncode(st) + " ";\r
+                                       }\r
+                               }\r
+\r
+                               if (nodeName == "font") {\r
+                                       if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                                               nodeName = "span";\r
+\r
+                                       var face = tinyMCE.getAttrib(path[i], "face");\r
+                                       if (face != "")\r
+                                               nodeData += "font: " + tinyMCE.xmlEncode(face) + " ";\r
+\r
+                                       var size = tinyMCE.getAttrib(path[i], "size");\r
+                                       if (size != "")\r
+                                               nodeData += "size: " + tinyMCE.xmlEncode(size) + " ";\r
+\r
+                                       var color = tinyMCE.getAttrib(path[i], "color");\r
+                                       if (color != "")\r
+                                               nodeData += "color: " + tinyMCE.xmlEncode(color) + " ";\r
+                               }\r
+\r
+                               if (tinyMCE.getAttrib(path[i], 'id') != "") {\r
+                                       nodeData += "id: " + path[i].getAttribute('id') + " ";\r
+                               }\r
+\r
+                               var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);\r
+                               if (className != "" && className.indexOf('mceItem') == -1)\r
+                                       nodeData += "class: " + className + " ";\r
+\r
+                               if (tinyMCE.getAttrib(path[i], 'src') != "") {\r
+                                       var src = tinyMCE.getAttrib(path[i], "mce_src");\r
+\r
+                                       if (src == "")\r
+                                                src = tinyMCE.getAttrib(path[i], "src");\r
+\r
+                                       nodeData += "src: " + tinyMCE.xmlEncode(src) + " ";\r
+                               }\r
+\r
+                               if (path[i].nodeName == 'A' && tinyMCE.getAttrib(path[i], 'href') != "") {\r
+                                       var href = tinyMCE.getAttrib(path[i], "mce_href");\r
+\r
+                                       if (href == "")\r
+                                                href = tinyMCE.getAttrib(path[i], "href");\r
+\r
+                                       nodeData += "href: " + tinyMCE.xmlEncode(href) + " ";\r
+                               }\r
+\r
+                               className = tinyMCE.getAttrib(path[i], "class");\r
+                               if ((nodeName == "img" || nodeName == "span") && className.indexOf('mceItem') != -1) {\r
+                                       nodeName = className.replace(/mceItem([a-z]+)/gi, '$1').toLowerCase();\r
+                                       nodeData = path[i].getAttribute('title');\r
+                               }\r
+\r
+                               if (nodeName == "a" && (anchor = tinyMCE.getAttrib(path[i], "name")) != "") {\r
+                                       nodeName = "a";\r
+                                       nodeName += "#" + tinyMCE.xmlEncode(anchor);\r
+                                       nodeData = "";\r
+                               }\r
+\r
+                               if (tinyMCE.getAttrib(path[i], 'name').indexOf("mce_") != 0) {\r
+                                       var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);\r
+                                       if (className != "" && className.indexOf('mceItem') == -1) {\r
+                                               nodeName += "." + className;\r
+                                       }\r
+                               }\r
+\r
+                               var cmd = 'tinyMCE.execInstanceCommand(\'' + editor_id + '\',\'mceSelectNodeDepth\',false,\'' + i + '\');';\r
+                               html += '<a title="' + nodeData + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" target="_self" class="mcePathItem">' + nodeName + '</a>';\r
+\r
+                               if (i > 0) {\r
+                                       html += " &raquo; ";\r
+                               }\r
+                       }\r
+\r
+                       pathElm.innerHTML = '<a href="#" accesskey="x"></a>' + tinyMCE.getLang('lang_theme_path') + ": " + html + '&#160;';\r
+               }\r
+\r
+               // Reset old states\r
+               tinyMCE.switchClass(editor_id + '_justifyleft', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_justifyright', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_justifyfull', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_bold', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_italic', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_underline', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_strikethrough', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_sub', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_sup', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_link', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_unlink', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_image', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_hr', 'mceButtonNormal');\r
+\r
+               if (node.nodeName == "A" && tinyMCE.getAttrib(node, "class").indexOf('mceItemAnchor') != -1)\r
+                       tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonSelected');\r
+\r
+               // Get link\r
+               var anchorLink = tinyMCE.getParentElement(node, "a", "href");\r
+\r
+               if (anchorLink || any_selection) {\r
+                       tinyMCE.switchClass(editor_id + '_link', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_unlink', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal');\r
+               }\r
+\r
+               // Handle visual aid\r
+               tinyMCE.switchClass(editor_id + '_visualaid', visual_aid ? 'mceButtonSelected' : 'mceButtonNormal');\r
+\r
+               if (undo_levels != -1) {\r
+                       tinyMCE.switchClass(editor_id + '_undo', 'mceButtonDisabled');\r
+                       tinyMCE.switchClass(editor_id + '_redo', 'mceButtonDisabled');\r
+               }\r
+\r
+               // Within li, blockquote\r
+               if (tinyMCE.getParentElement(node, "li,blockquote"))\r
+                       tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonNormal');\r
+\r
+               // Has redo levels\r
+               if (undo_index != -1 && (undo_index < undo_levels-1 && undo_levels > 0))\r
+                       tinyMCE.switchClass(editor_id + '_redo', 'mceButtonNormal');\r
+\r
+               // Has undo levels\r
+               if (undo_index != -1 && (undo_index > 0 && undo_levels > 0))\r
+                       tinyMCE.switchClass(editor_id + '_undo', 'mceButtonNormal');\r
+\r
+               // Select class in select box\r
+               var selectElm = document.getElementById(editor_id + "_styleSelect");\r
+               \r
+               if (selectElm) {\r
+                       TinyMCE_AdvancedTheme._setupCSSClasses(editor_id);\r
+\r
+                       classNode = node;\r
+                       breakOut = false;\r
+                       var index = 0;\r
+\r
+                       do {\r
+                               if (classNode && classNode.className) {\r
+                                       for (var i=0; i<selectElm.options.length; i++) {\r
+                                               if (selectElm.options[i].value == classNode.className) {\r
+                                                       index = i;\r
+                                                       breakOut = true;\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       } while (!breakOut && classNode != null && (classNode = classNode.parentNode) != null);\r
+\r
+                       selectElm.selectedIndex = index;\r
+               }\r
+\r
+               // Select formatblock\r
+               var selectElm = document.getElementById(editor_id + "_formatSelect");\r
+               if (selectElm) {\r
+                       var elm = tinyMCE.getParentElement(node, "p,div,h1,h2,h3,h4,h5,h6,pre,address");\r
+\r
+                       if (elm)\r
+                               selectByValue(selectElm, "<" + elm.nodeName.toLowerCase() + ">");\r
+                       else\r
+                               selectByValue(selectElm, "");\r
+               }\r
+\r
+               // Select fontselect\r
+               var selectElm = document.getElementById(editor_id + "_fontNameSelect");\r
+               if (selectElm) {\r
+                       if (!tinyMCE.isSafari && !(tinyMCE.isMSIE && !tinyMCE.isOpera)) {\r
+                               var face = inst.queryCommandValue('FontName');\r
+\r
+                               face = face == null || face == "" ? "" : face;\r
+\r
+                               selectByValue(selectElm, face, face != "");\r
+                       } else {\r
+                               var elm = tinyMCE.getParentElement(node, "font", "face");\r
+\r
+                               if (elm) {\r
+                                       var family = tinyMCE.getAttrib(elm, "face");\r
+\r
+                                       if (family == '')\r
+                                               family = '' + elm.style.fontFamily;\r
+\r
+                                       if (!selectByValue(selectElm, family, family != ""))\r
+                                               selectByValue(selectElm, "");\r
+                               } else\r
+                                       selectByValue(selectElm, "");\r
+                       }\r
+               }\r
+\r
+               // Select fontsize\r
+               var selectElm = document.getElementById(editor_id + "_fontSizeSelect");\r
+               if (selectElm) {\r
+                       if (!tinyMCE.isSafari && !tinyMCE.isOpera) {\r
+                               var size = inst.queryCommandValue('FontSize');\r
+                               selectByValue(selectElm, size == null || size == "" ? "0" : size);\r
+                       } else {\r
+                               var elm = tinyMCE.getParentElement(node, "font", "size");\r
+                               if (elm) {\r
+                                       var size = tinyMCE.getAttrib(elm, "size");\r
+\r
+                                       if (size == '') {\r
+                                               var sizes = new Array('', '8px', '10px', '12px', '14px', '18px', '24px', '36px');\r
+\r
+                                               size = '' + elm.style.fontSize;\r
+\r
+                                               for (var i=0; i<sizes.length; i++) {\r
+                                                       if (('' + sizes[i]) == size) {\r
+                                                               size = i;\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       if (!selectByValue(selectElm, size))\r
+                                               selectByValue(selectElm, "");\r
+                               } else\r
+                                       selectByValue(selectElm, "0");\r
+                       }\r
+               }\r
+\r
+               // Handle align attributes\r
+               alignNode = node;\r
+               breakOut = false;\r
+               do {\r
+                       if (!alignNode.getAttribute || !alignNode.getAttribute('align'))\r
+                               continue;\r
+\r
+                       switch (alignNode.getAttribute('align').toLowerCase()) {\r
+                               case "left":\r
+                                       tinyMCE.switchClass(editor_id + '_justifyleft', 'mceButtonSelected');\r
+                                       breakOut = true;\r
+                               break;\r
+\r
+                               case "right":\r
+                                       tinyMCE.switchClass(editor_id + '_justifyright', 'mceButtonSelected');\r
+                                       breakOut = true;\r
+                               break;\r
+\r
+                               case "middle":\r
+                               case "center":\r
+                                       tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonSelected');\r
+                                       breakOut = true;\r
+                               break;\r
+\r
+                               case "justify":\r
+                                       tinyMCE.switchClass(editor_id + '_justifyfull', 'mceButtonSelected');\r
+                                       breakOut = true;\r
+                               break;\r
+                       }\r
+               } while (!breakOut && (alignNode = alignNode.parentNode) != null);\r
+\r
+               // Div justification\r
+               var div = tinyMCE.getParentElement(node, "div");\r
+               if (div && div.style.textAlign == "center")\r
+                       tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonSelected');\r
+\r
+               // Do special text\r
+               if (!setup_content) {\r
+                       // , "JustifyLeft", "_justifyleft", "JustifyCenter", "justifycenter", "JustifyRight", "justifyright", "JustifyFull", "justifyfull", "InsertUnorderedList", "bullist", "InsertOrderedList", "numlist", "InsertUnorderedList", "bullist", "Outdent", "outdent", "Indent", "indent", "subscript", "sub"\r
+                       var ar = new Array("Bold", "_bold", "Italic", "_italic", "Strikethrough", "_strikethrough", "superscript", "_sup", "subscript", "_sub");\r
+                       for (var i=0; i<ar.length; i+=2) {\r
+                               if (inst.queryCommandState(ar[i]))\r
+                                       tinyMCE.switchClass(editor_id + ar[i+1], 'mceButtonSelected');\r
+                       }\r
+\r
+                       if (inst.queryCommandState("Underline") && (node.parentNode == null || node.parentNode.nodeName != "A"))\r
+                               tinyMCE.switchClass(editor_id + '_underline', 'mceButtonSelected');\r
+               }\r
+\r
+               // Handle elements\r
+               do {\r
+                       switch (node.nodeName) {\r
+                               case "UL":\r
+                                       tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonSelected');\r
+                               break;\r
+\r
+                               case "OL":\r
+                                       tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonSelected');\r
+                               break;\r
+\r
+                               case "HR":\r
+                                        tinyMCE.switchClass(editor_id + '_hr', 'mceButtonSelected');\r
+                               break;\r
+\r
+                               case "IMG":\r
+                               if (tinyMCE.getAttrib(node, 'name').indexOf('mce_') != 0 && tinyMCE.getAttrib(node, 'class').indexOf('mceItem') == -1) {\r
+                                       tinyMCE.switchClass(editor_id + '_image', 'mceButtonSelected');\r
+                               }\r
+                               break;\r
+                       }\r
+               } while ((node = node.parentNode) != null);\r
+       },\r
+\r
+       // Private theme internal functions\r
+\r
+       // This function auto imports CSS classes into the class selection droplist\r
+       _setupCSSClasses : function(editor_id) {\r
+               var i, selectElm;\r
+\r
+               if (!TinyMCE_AdvancedTheme._autoImportCSSClasses)\r
+                       return;\r
+\r
+               selectElm = document.getElementById(editor_id + '_styleSelect');\r
+\r
+               if (selectElm && selectElm.getAttribute('cssImported') != 'true') {\r
+                       var csses = tinyMCE.getCSSClasses(editor_id);\r
+                       if (csses && selectElm) {\r
+                               for (i=0; i<csses.length; i++)\r
+                                       selectElm.options[selectElm.options.length] = new Option(csses[i], csses[i]);\r
+                       }\r
+\r
+                       // Only do this once\r
+                       if (csses != null && csses.length > 0)\r
+                               selectElm.setAttribute('cssImported', 'true');\r
+               }\r
+       },\r
+\r
+       _setCookie : function(name, value, expires, path, domain, secure) {\r
+               var curCookie = name + "=" + escape(value) +\r
+                       ((expires) ? "; expires=" + expires.toGMTString() : "") +\r
+                       ((path) ? "; path=" + escape(path) : "") +\r
+                       ((domain) ? "; domain=" + domain : "") +\r
+                       ((secure) ? "; secure" : "");\r
+\r
+               document.cookie = curCookie;\r
+       },\r
+\r
+       _getCookie : function(name) {\r
+               var dc = document.cookie;\r
+               var prefix = name + "=";\r
+               var begin = dc.indexOf("; " + prefix);\r
+\r
+               if (begin == -1) {\r
+                       begin = dc.indexOf(prefix);\r
+\r
+                       if (begin != 0)\r
+                               return null;\r
+               } else\r
+                       begin += 2;\r
+\r
+               var end = document.cookie.indexOf(";", begin);\r
+\r
+               if (end == -1)\r
+                       end = dc.length;\r
+\r
+               return unescape(dc.substring(begin + prefix.length, end));\r
+       },\r
+\r
+       _resizeTo : function(inst, w, h, set_w) {\r
+               var editorContainer = document.getElementById(inst.editorId + '_parent');\r
+               var tableElm = editorContainer.firstChild;\r
+               var iframe = inst.iframeElement;\r
+\r
+               if (w == null || w == "null") {\r
+                       set_w = false;\r
+                       w = 0;\r
+               }\r
+\r
+               if (h == null || h == "null")\r
+                       return;\r
+\r
+               w = parseInt(w);\r
+               h = parseInt(h);\r
+\r
+               if (tinyMCE.isGecko) {\r
+                       w += 2;\r
+                       h += 2;\r
+               }\r
+\r
+               var dx = w - tableElm.clientWidth;\r
+               var dy = h - tableElm.clientHeight;\r
+\r
+               w = w < 1 ? 30 : w;\r
+               h = h < 1 ? 30 : h;\r
+\r
+               if (set_w)\r
+                       tableElm.style.width = w + "px";\r
+\r
+               tableElm.style.height = h + "px";\r
+\r
+               iw = iframe.clientWidth + dx;\r
+               ih = iframe.clientHeight + dy;\r
+\r
+               iw = iw < 1 ? 30 : iw;\r
+               ih = ih < 1 ? 30 : ih;\r
+\r
+               if (tinyMCE.isGecko) {\r
+                       iw -= 2;\r
+                       ih -= 2;\r
+               }\r
+\r
+               if (set_w)\r
+                       iframe.style.width = iw + "px";\r
+\r
+               iframe.style.height = ih + "px";\r
+\r
+               // Is it to small, make it bigger again\r
+               if (set_w) {\r
+                       var tableBodyElm = tableElm.firstChild;\r
+                       var minIframeWidth = tableBodyElm.scrollWidth;\r
+                       if (inst.iframeElement.clientWidth < minIframeWidth) {\r
+                               dx = minIframeWidth - inst.iframeElement.clientWidth;\r
+\r
+                               inst.iframeElement.style.width = (iw + dx) + "px";\r
+                       }\r
+               }\r
+\r
+               // Remove pesky table controls\r
+               inst.useCSS = false;\r
+       },\r
+\r
+       /**\r
+        * Handles resizing events.\r
+        */\r
+       _resizeEventHandler : function(e) {\r
+               var resizer = TinyMCE_AdvancedTheme._resizer;\r
+\r
+               // Do nothing\r
+               if (!resizer.resizing)\r
+                       return;\r
+\r
+               e = typeof(e) == "undefined" ? window.event : e;\r
+\r
+               var dx = e.screenX - resizer.downX;\r
+               var dy = e.screenY - resizer.downY;\r
+               var resizeBox = resizer.resizeBox;\r
+               var editorId = resizer.editorId;\r
+\r
+               switch (e.type) {\r
+                       case "mousemove":\r
+                               var w, h;\r
+\r
+                               w = resizer.width + dx;\r
+                               h = resizer.height + dy;\r
+\r
+                               w = w < 1 ? 1 : w;\r
+                               h = h < 1 ? 1 : h;\r
+\r
+                               if (resizer.horizontal)\r
+                                       resizeBox.style.width = w + "px";\r
+\r
+                               resizeBox.style.height = h + "px";\r
+                               break;\r
+\r
+                       case "mouseup":\r
+                               TinyMCE_AdvancedTheme._setResizing(e, editorId, false);\r
+                               TinyMCE_AdvancedTheme._resizeTo(tinyMCE.getInstanceById(editorId), resizer.width + dx, resizer.height + dy, resizer.horizontal);\r
+\r
+                               // Expire in a month\r
+                               if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {\r
+                                       var expires = new Date();\r
+                                       expires.setTime(expires.getTime() + 3600000 * 24 * 30);\r
+\r
+                                       // Set the cookies\r
+                                       TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_width", "" + (resizer.horizontal ? resizer.width + dx : ""), expires);\r
+                                       TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_height", "" + (resizer.height + dy), expires);\r
+                               }\r
+                               break;\r
+               }\r
+       },\r
+\r
+       /**\r
+        * Starts/stops the editor resizing.\r
+        */\r
+       _setResizing : function(e, editor_id, state) {\r
+               e = typeof(e) == "undefined" ? window.event : e;\r
+\r
+               var resizer = TinyMCE_AdvancedTheme._resizer;\r
+               var editorContainer = document.getElementById(editor_id + '_parent');\r
+               var editorArea = document.getElementById(editor_id + '_parent').firstChild;\r
+               var resizeBox = document.getElementById(editor_id + '_resize_box');\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+               if (state) {\r
+                       // Place box over editor area\r
+                       var width = editorArea.clientWidth;\r
+                       var height = editorArea.clientHeight;\r
+\r
+                       resizeBox.style.width = width + "px";\r
+                       resizeBox.style.height = height + "px";\r
+\r
+                       resizer.iframeWidth = inst.iframeElement.clientWidth;\r
+                       resizer.iframeHeight = inst.iframeElement.clientHeight;\r
+\r
+                       // Hide editor and show resize box\r
+                       editorArea.style.display = "none";\r
+                       resizeBox.style.display = "block";\r
+\r
+                       // Add event handlers, only once\r
+                       if (!resizer.eventHandlers) {\r
+                               if (tinyMCE.isMSIE)\r
+                                       tinyMCE.addEvent(document, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler);\r
+                               else\r
+                                       tinyMCE.addEvent(window, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler);\r
+\r
+                               tinyMCE.addEvent(document, "mouseup", TinyMCE_AdvancedTheme._resizeEventHandler);\r
+\r
+                               resizer.eventHandlers = true;\r
+                       }\r
+\r
+                       resizer.resizing = true;\r
+                       resizer.downX = e.screenX;\r
+                       resizer.downY = e.screenY;\r
+                       resizer.width = parseInt(resizeBox.style.width);\r
+                       resizer.height = parseInt(resizeBox.style.height);\r
+                       resizer.editorId = editor_id;\r
+                       resizer.resizeBox = resizeBox;\r
+                       resizer.horizontal = tinyMCE.getParam("theme_advanced_resize_horizontal", true);\r
+               } else {\r
+                       resizer.resizing = false;\r
+                       resizeBox.style.display = "none";\r
+                       editorArea.style.display = tinyMCE.isMSIE && !tinyMCE.isOpera ? "block" : "table";\r
+                       tinyMCE.execCommand('mceResetDesignMode');\r
+               }\r
+       },\r
+\r
+       _getColorHTML : function(id, n, cm) {\r
+               var i, h, cl;\r
+\r
+               h = '<span class="mceMenuLine"></span>';\r
+               cl = tinyMCE.getParam(n, TinyMCE_AdvancedTheme._defColors).split(',');\r
+\r
+               h += '<table class="mceColors"><tr>';\r
+               for (i=0; i<cl.length; i++) {\r
+                       c = 'tinyMCE.execInstanceCommand(\'' + id + '\', \'' + cm + '\', false, \'#' + cl[i] + '\');';\r
+                       h += '<td><a href="javascript:' + c + '" style="background-color: #' + cl[i] + '" onclick="' + c + ';return false;"></a></td>';\r
+\r
+                       if ((i+1) % 8 == 0)\r
+                               h += '</tr><tr>';\r
+               }\r
+\r
+               h += '</tr></table>';\r
+\r
+               if (tinyMCE.getParam("theme_advanced_more_colors", true))\r
+                       h += '<a href="javascript:void(0);" onclick="TinyMCE_AdvancedTheme._pickColor(\'' + id + '\',\'' + cm + '\');" class="mceMoreColors">' + tinyMCE.getLang('lang_more_colors') + '</a>';\r
+\r
+               return h;\r
+       },\r
+\r
+       _pickColor : function(id, cm) {\r
+               var inputColor, inst = tinyMCE.selectedInstance;\r
+\r
+               if (cm == 'forecolor' && inst)\r
+                       inputColor = inst.foreColor;\r
+\r
+               if ((cm == 'backcolor' || cm == 'HiliteColor') && inst)\r
+                       inputColor = inst.backColor;\r
+\r
+               tinyMCE.execCommand('mceColorPicker', true, {color : inputColor, callback : function(c) {\r
+                       tinyMCE.execInstanceCommand(id, cm, false, c);\r
+               }});\r
+       },\r
+\r
+       _insertImage : function(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout) {\r
+               tinyMCE.execCommand("mceInsertContent", false, tinyMCE.createTagHTML('img', {\r
+                       src : tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], src), // Force absolute\r
+                       mce_src : src,\r
+                       alt : alt,\r
+                       border : border,\r
+                       hspace : hspace,\r
+                       vspace : vspace,\r
+                       width : width,\r
+                       height : height,\r
+                       align : align,\r
+                       title : title,\r
+                       onmouseover : onmouseover,\r
+                       onmouseout : onmouseout\r
+               }));\r
+       },\r
+\r
+       _insertLink : function(href, target, title, onclick, style_class) {\r
+               tinyMCE.execCommand('mceBeginUndoLevel');\r
+\r
+               if (tinyMCE.selectedInstance && tinyMCE.selectedElement && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {\r
+                       var doc = tinyMCE.selectedInstance.getDoc();\r
+                       var linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");\r
+                       var newLink = false;\r
+\r
+                       if (!linkElement) {\r
+                               linkElement = doc.createElement("a");\r
+                               newLink = true;\r
+                       }\r
+\r
+                       var mhref = href;\r
+                       var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, linkElement);");\r
+                       mhref = tinyMCE.getParam('convert_urls') ? href : mhref;\r
+\r
+                       tinyMCE.setAttrib(linkElement, 'href', thref);\r
+                       tinyMCE.setAttrib(linkElement, 'mce_href', mhref);\r
+                       tinyMCE.setAttrib(linkElement, 'target', target);\r
+                       tinyMCE.setAttrib(linkElement, 'title', title);\r
+                       tinyMCE.setAttrib(linkElement, 'onclick', onclick);\r
+                       tinyMCE.setAttrib(linkElement, 'class', style_class);\r
+\r
+                       if (newLink) {\r
+                               linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true));\r
+                               tinyMCE.selectedElement.parentNode.replaceChild(linkElement, tinyMCE.selectedElement);\r
+                       }\r
+\r
+                       return;\r
+               }\r
+\r
+               if (!tinyMCE.linkElement && tinyMCE.selectedInstance) {\r
+                       if (tinyMCE.isSafari) {\r
+                               tinyMCE.execCommand("mceInsertContent", false, '<a href="' + tinyMCE.uniqueURL + '">' + tinyMCE.selectedInstance.selection.getSelectedHTML() + '</a>');\r
+                       } else\r
+                               tinyMCE.selectedInstance.contentDocument.execCommand("createlink", false, tinyMCE.uniqueURL);\r
+\r
+                       tinyMCE.linkElement = tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);\r
+\r
+                       var elementArray = tinyMCE.getElementsByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);\r
+\r
+                       for (var i=0; i<elementArray.length; i++) {\r
+                               var mhref = href;\r
+                               var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, elementArray[i]);");\r
+                               mhref = tinyMCE.getParam('convert_urls') ? href : mhref;\r
+\r
+                               tinyMCE.setAttrib(elementArray[i], 'href', thref);\r
+                               tinyMCE.setAttrib(elementArray[i], 'mce_href', mhref);\r
+                               tinyMCE.setAttrib(elementArray[i], 'target', target);\r
+                               tinyMCE.setAttrib(elementArray[i], 'title', title);\r
+                               tinyMCE.setAttrib(elementArray[i], 'onclick', onclick);\r
+                               tinyMCE.setAttrib(elementArray[i], 'class', style_class);\r
+                       }\r
+\r
+                       tinyMCE.linkElement = elementArray[0];\r
+               }\r
+\r
+               if (tinyMCE.linkElement) {\r
+                       var mhref = href;\r
+                       href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement);");\r
+                       mhref = tinyMCE.getParam('convert_urls') ? href : mhref;\r
+\r
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'href', href);\r
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'mce_href', mhref);\r
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'target', target);\r
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'title', title);\r
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'onclick', onclick);\r
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'class', style_class);\r
+               }\r
+\r
+               tinyMCE.execCommand('mceEndUndoLevel');\r
+       }\r
+};\r
+\r
+tinyMCE.addTheme("advanced", TinyMCE_AdvancedTheme);\r
+\r
+// Add default buttons maps for advanced theme and all internal plugins\r
+tinyMCE.addButtonMap(TinyMCE_AdvancedTheme._buttonMap);\r
diff --git a/program/js/tiny_mce/themes/advanced/image.htm b/program/js/tiny_mce/themes/advanced/image.htm
new file mode 100644 (file)
index 0000000..96a9a75
--- /dev/null
@@ -0,0 +1,100 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_image_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/image.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body id="image" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertImage();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;">{$lang_insert_image_title}</a></span></li>\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+     <table border="0" cellpadding="4" cellspacing="0">\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="src">{$lang_insert_image_src}</label></td>\r
+            <td><table border="0" cellspacing="0" cellpadding="0">\r
+                <tr>\r
+                  <td><input id="src" name="src" type="text" value="" style="width: 200px" onchange="getImageData();" /></td>\r
+                  <td id="srcbrowsercontainer">&nbsp;</td>\r
+                </tr>\r
+              </table></td>\r
+          </tr>\r
+                 <!-- Image list -->\r
+                 <script language="javascript">\r
+                       if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {\r
+                               var html = "";\r
+\r
+                               html += '<tr><td><label for="image_list">{$lang_image_list}</label></td>';\r
+                               html += '<td><select id="image_list" name="image_list" style="width: 200px" onchange="this.form.src.value=this.options[this.selectedIndex].value;resetImageData();getImageData();">';\r
+                               html += '<option value="">---</option>';\r
+\r
+                               for (var i=0; i<tinyMCEImageList.length; i++)\r
+                                       html += '<option value="' + tinyMCEImageList[i][1] + '">' + tinyMCEImageList[i][0] + '</option>';\r
+\r
+                               html += '</select></td></tr>';\r
+\r
+                               document.write(html);\r
+                       }\r
+                 </script>\r
+                 <!-- /Image list -->\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="alt">{$lang_insert_image_alt}</label></td>\r
+            <td><input id="alt" name="alt" type="text" value="" style="width: 200px" /></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="align">{$lang_insert_image_align}</label></td>\r
+            <td><select id="align" name="align">\r
+                <option value="">{$lang_insert_image_align_default}</option>\r
+                <option value="baseline">{$lang_insert_image_align_baseline}</option>\r
+                <option value="top">{$lang_insert_image_align_top}</option>\r
+                <option value="middle">{$lang_insert_image_align_middle}</option>\r
+                <option value="bottom">{$lang_insert_image_align_bottom}</option>\r
+                <option value="texttop">{$lang_insert_image_align_texttop}</option>\r
+                <option value="absmiddle">{$lang_insert_image_align_absmiddle}</option>\r
+                <option value="absbottom">{$lang_insert_image_align_absbottom}</option>\r
+                <option value="left">{$lang_insert_image_align_left}</option>\r
+                <option value="right">{$lang_insert_image_align_right}</option>\r
+              </select></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="width">{$lang_insert_image_dimensions}</label></td>\r
+            <td><input id="width" name="width" type="text" value="" size="3" maxlength="5" />\r
+              x\r
+              <input id="height" name="height" type="text" value="" size="3" maxlength="5" /></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="border">{$lang_insert_image_border}</label></td>\r
+            <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" /></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="vspace">{$lang_insert_image_vspace}</label></td>\r
+            <td><input id="vspace" name="vspace" type="text" value="" size="3" maxlength="3" /></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="hspace">{$lang_insert_image_hspace}</label></td>\r
+            <td><input id="hspace" name="hspace" type="text" value="" size="3" maxlength="3" /></td>\r
+          </tr>\r
+        </table>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertImage();" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/themes/advanced/images/anchor.gif b/program/js/tiny_mce/themes/advanced/images/anchor.gif
new file mode 100644 (file)
index 0000000..34ab715
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/anchor.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/anchor_symbol.gif b/program/js/tiny_mce/themes/advanced/images/anchor_symbol.gif
new file mode 100644 (file)
index 0000000..2eafd79
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/anchor_symbol.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/backcolor.gif b/program/js/tiny_mce/themes/advanced/images/backcolor.gif
new file mode 100644 (file)
index 0000000..d03e206
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/backcolor.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bold.gif b/program/js/tiny_mce/themes/advanced/images/bold.gif
new file mode 100644 (file)
index 0000000..d6a9cc2
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/bold.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bold_de_se.gif b/program/js/tiny_mce/themes/advanced/images/bold_de_se.gif
new file mode 100644 (file)
index 0000000..9b129de
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/bold_de_se.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bold_es.gif b/program/js/tiny_mce/themes/advanced/images/bold_es.gif
new file mode 100644 (file)
index 0000000..ea341e6
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/bold_es.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bold_fr.gif b/program/js/tiny_mce/themes/advanced/images/bold_fr.gif
new file mode 100644 (file)
index 0000000..2816454
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/bold_fr.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bold_ru.gif b/program/js/tiny_mce/themes/advanced/images/bold_ru.gif
new file mode 100644 (file)
index 0000000..e000d46
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/bold_ru.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bold_tw.gif b/program/js/tiny_mce/themes/advanced/images/bold_tw.gif
new file mode 100644 (file)
index 0000000..8208543
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/bold_tw.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/browse.gif b/program/js/tiny_mce/themes/advanced/images/browse.gif
new file mode 100644 (file)
index 0000000..c786d0b
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/browse.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bullist.gif b/program/js/tiny_mce/themes/advanced/images/bullist.gif
new file mode 100644 (file)
index 0000000..6e19467
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/bullist.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/button_menu.gif b/program/js/tiny_mce/themes/advanced/images/button_menu.gif
new file mode 100644 (file)
index 0000000..c3d8fa2
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/button_menu.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/buttons.gif b/program/js/tiny_mce/themes/advanced/images/buttons.gif
new file mode 100644 (file)
index 0000000..5ad99a7
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/buttons.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/cancel_button_bg.gif b/program/js/tiny_mce/themes/advanced/images/cancel_button_bg.gif
new file mode 100644 (file)
index 0000000..4b4aeef
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/cancel_button_bg.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/charmap.gif b/program/js/tiny_mce/themes/advanced/images/charmap.gif
new file mode 100644 (file)
index 0000000..3cdc4ac
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/charmap.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/cleanup.gif b/program/js/tiny_mce/themes/advanced/images/cleanup.gif
new file mode 100644 (file)
index 0000000..16491f6
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/cleanup.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/close.gif b/program/js/tiny_mce/themes/advanced/images/close.gif
new file mode 100644 (file)
index 0000000..679ca2a
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/close.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/code.gif b/program/js/tiny_mce/themes/advanced/images/code.gif
new file mode 100644 (file)
index 0000000..c5d5a67
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/code.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/color.gif b/program/js/tiny_mce/themes/advanced/images/color.gif
new file mode 100644 (file)
index 0000000..1ecd574
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/color.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/colors.jpg b/program/js/tiny_mce/themes/advanced/images/colors.jpg
new file mode 100644 (file)
index 0000000..b4c542d
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/colors.jpg differ
diff --git a/program/js/tiny_mce/themes/advanced/images/copy.gif b/program/js/tiny_mce/themes/advanced/images/copy.gif
new file mode 100644 (file)
index 0000000..dc14686
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/copy.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/custom_1.gif b/program/js/tiny_mce/themes/advanced/images/custom_1.gif
new file mode 100644 (file)
index 0000000..4cbccda
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/custom_1.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/cut.gif b/program/js/tiny_mce/themes/advanced/images/cut.gif
new file mode 100644 (file)
index 0000000..4e9a70b
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/cut.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/forecolor.gif b/program/js/tiny_mce/themes/advanced/images/forecolor.gif
new file mode 100644 (file)
index 0000000..8b70361
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/forecolor.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/help.gif b/program/js/tiny_mce/themes/advanced/images/help.gif
new file mode 100644 (file)
index 0000000..51a1ee4
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/help.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/hr.gif b/program/js/tiny_mce/themes/advanced/images/hr.gif
new file mode 100644 (file)
index 0000000..1a1ba2a
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/hr.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/image.gif b/program/js/tiny_mce/themes/advanced/images/image.gif
new file mode 100644 (file)
index 0000000..4b88edd
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/image.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/indent.gif b/program/js/tiny_mce/themes/advanced/images/indent.gif
new file mode 100644 (file)
index 0000000..acd315b
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/indent.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/insert_button_bg.gif b/program/js/tiny_mce/themes/advanced/images/insert_button_bg.gif
new file mode 100644 (file)
index 0000000..69c131c
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/insert_button_bg.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/italic.gif b/program/js/tiny_mce/themes/advanced/images/italic.gif
new file mode 100644 (file)
index 0000000..8bb330b
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/italic.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/italic_de_se.gif b/program/js/tiny_mce/themes/advanced/images/italic_de_se.gif
new file mode 100644 (file)
index 0000000..feb0309
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/italic_de_se.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/italic_es.gif b/program/js/tiny_mce/themes/advanced/images/italic_es.gif
new file mode 100644 (file)
index 0000000..4572cdb
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/italic_es.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/italic_ru.gif b/program/js/tiny_mce/themes/advanced/images/italic_ru.gif
new file mode 100644 (file)
index 0000000..a2bb69a
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/italic_ru.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/italic_tw.gif b/program/js/tiny_mce/themes/advanced/images/italic_tw.gif
new file mode 100644 (file)
index 0000000..4f6eeaa
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/italic_tw.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/justifycenter.gif b/program/js/tiny_mce/themes/advanced/images/justifycenter.gif
new file mode 100644 (file)
index 0000000..42d609a
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/justifycenter.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/justifyfull.gif b/program/js/tiny_mce/themes/advanced/images/justifyfull.gif
new file mode 100644 (file)
index 0000000..c8504f6
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/justifyfull.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/justifyleft.gif b/program/js/tiny_mce/themes/advanced/images/justifyleft.gif
new file mode 100644 (file)
index 0000000..e8f7e42
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/justifyleft.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/justifyright.gif b/program/js/tiny_mce/themes/advanced/images/justifyright.gif
new file mode 100644 (file)
index 0000000..e4cea97
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/justifyright.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/link.gif b/program/js/tiny_mce/themes/advanced/images/link.gif
new file mode 100644 (file)
index 0000000..1accf42
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/link.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/menu_check.gif b/program/js/tiny_mce/themes/advanced/images/menu_check.gif
new file mode 100644 (file)
index 0000000..50d6afd
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/menu_check.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/newdocument.gif b/program/js/tiny_mce/themes/advanced/images/newdocument.gif
new file mode 100644 (file)
index 0000000..a9d2938
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/newdocument.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/numlist.gif b/program/js/tiny_mce/themes/advanced/images/numlist.gif
new file mode 100644 (file)
index 0000000..a268352
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/numlist.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/opacity.png b/program/js/tiny_mce/themes/advanced/images/opacity.png
new file mode 100644 (file)
index 0000000..b4217cb
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/opacity.png differ
diff --git a/program/js/tiny_mce/themes/advanced/images/outdent.gif b/program/js/tiny_mce/themes/advanced/images/outdent.gif
new file mode 100644 (file)
index 0000000..23f6aa4
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/outdent.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/paste.gif b/program/js/tiny_mce/themes/advanced/images/paste.gif
new file mode 100644 (file)
index 0000000..1b45000
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/paste.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/redo.gif b/program/js/tiny_mce/themes/advanced/images/redo.gif
new file mode 100644 (file)
index 0000000..3af9069
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/redo.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/removeformat.gif b/program/js/tiny_mce/themes/advanced/images/removeformat.gif
new file mode 100644 (file)
index 0000000..0fa3cb7
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/removeformat.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/separator.gif b/program/js/tiny_mce/themes/advanced/images/separator.gif
new file mode 100644 (file)
index 0000000..4f39b80
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/separator.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/spacer.gif b/program/js/tiny_mce/themes/advanced/images/spacer.gif
new file mode 100644 (file)
index 0000000..3884865
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/spacer.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/statusbar_resize.gif b/program/js/tiny_mce/themes/advanced/images/statusbar_resize.gif
new file mode 100644 (file)
index 0000000..af89d80
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/statusbar_resize.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/strikethrough.gif b/program/js/tiny_mce/themes/advanced/images/strikethrough.gif
new file mode 100644 (file)
index 0000000..3264635
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/strikethrough.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/sub.gif b/program/js/tiny_mce/themes/advanced/images/sub.gif
new file mode 100644 (file)
index 0000000..4d7ce30
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/sub.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/sup.gif b/program/js/tiny_mce/themes/advanced/images/sup.gif
new file mode 100644 (file)
index 0000000..a7145e0
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/sup.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/underline.gif b/program/js/tiny_mce/themes/advanced/images/underline.gif
new file mode 100644 (file)
index 0000000..1dfeb5f
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/underline.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/underline_es.gif b/program/js/tiny_mce/themes/advanced/images/underline_es.gif
new file mode 100644 (file)
index 0000000..551d914
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/underline_es.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/underline_fr.gif b/program/js/tiny_mce/themes/advanced/images/underline_fr.gif
new file mode 100644 (file)
index 0000000..551d914
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/underline_fr.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/underline_ru.gif b/program/js/tiny_mce/themes/advanced/images/underline_ru.gif
new file mode 100644 (file)
index 0000000..b78e2a4
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/underline_ru.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/underline_tw.gif b/program/js/tiny_mce/themes/advanced/images/underline_tw.gif
new file mode 100644 (file)
index 0000000..b715390
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/underline_tw.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/undo.gif b/program/js/tiny_mce/themes/advanced/images/undo.gif
new file mode 100644 (file)
index 0000000..520796d
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/undo.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/unlink.gif b/program/js/tiny_mce/themes/advanced/images/unlink.gif
new file mode 100644 (file)
index 0000000..5c8a33d
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/unlink.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/visualaid.gif b/program/js/tiny_mce/themes/advanced/images/visualaid.gif
new file mode 100644 (file)
index 0000000..63caf18
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/visualaid.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/xp/tab_bg.gif b/program/js/tiny_mce/themes/advanced/images/xp/tab_bg.gif
new file mode 100644 (file)
index 0000000..897a01f
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/xp/tab_bg.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/xp/tab_end.gif b/program/js/tiny_mce/themes/advanced/images/xp/tab_end.gif
new file mode 100644 (file)
index 0000000..aee442b
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/xp/tab_end.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif b/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif
new file mode 100644 (file)
index 0000000..9dc8abe
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif b/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif
new file mode 100644 (file)
index 0000000..616a889
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/images/xp/tabs_bg.gif b/program/js/tiny_mce/themes/advanced/images/xp/tabs_bg.gif
new file mode 100644 (file)
index 0000000..c303f66
Binary files /dev/null and b/program/js/tiny_mce/themes/advanced/images/xp/tabs_bg.gif differ
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/about.js b/program/js/tiny_mce/themes/advanced/jscripts/about.js
new file mode 100644 (file)
index 0000000..4e53c28
--- /dev/null
@@ -0,0 +1,75 @@
+function init() {\r
+       var inst;\r
+\r
+       tinyMCEPopup.resizeToInnerSize();\r
+       inst = tinyMCE.selectedInstance;\r
+\r
+       // Give FF some time\r
+       window.setTimeout('insertHelpIFrame();', 10);\r
+\r
+       var tcont = document.getElementById('plugintablecontainer');\r
+       var plugins = tinyMCE.getParam('plugins', '', true, ',');\r
+       if (plugins.length == 0)\r
+               document.getElementById('plugins_tab').style.display = 'none';\r
+\r
+       var html = "";\r
+       html += '<table id="plugintable">';\r
+       html += '<thead>';\r
+       html += '<tr>';\r
+       html += '<td>' + tinyMCE.getLang('lang_plugin') + '</td>';\r
+       html += '<td>' + tinyMCE.getLang('lang_author') + '</td>';\r
+       html += '<td>' + tinyMCE.getLang('lang_version') + '</td>';\r
+       html += '</tr>';\r
+       html += '</thead>';\r
+       html += '<tbody>';\r
+\r
+       for (var i=0; i<inst.plugins.length; i++) {\r
+               var info = getPluginInfo(inst.plugins[i]);\r
+\r
+               html += '<tr>';\r
+\r
+               if (info.infourl != null && info.infourl != '')\r
+                       html += '<td width="50%" title="' + plugins[i] + '"><a href="' + info.infourl + '" target="mceplugin">' + info.longname + '</a></td>';\r
+               else\r
+                       html += '<td width="50%" title="' + plugins[i] + '">' + info.longname + '</td>';\r
+\r
+               if (info.authorurl != null && info.authorurl != '')\r
+                       html += '<td width="35%"><a href="' + info.authorurl + '" target="mceplugin">' + info.author + '</a></td>';\r
+               else\r
+                       html += '<td width="35%">' + info.author + '</td>';\r
+\r
+               html += '<td width="15%">' + info.version + '</td>';\r
+               html += '</tr>';\r
+       }\r
+\r
+       html += '</tbody>';\r
+       html += '</table>';\r
+\r
+       tcont.innerHTML = html;\r
+}\r
+\r
+function getPluginInfo(name) {\r
+       if (tinyMCE.plugins[name].getInfo)\r
+               return tinyMCE.plugins[name].getInfo();\r
+\r
+       return {\r
+               longname : name,\r
+               authorurl : '',\r
+               infourl : '',\r
+               author : '--',\r
+               version : '--'\r
+       };\r
+}\r
+\r
+function insertHelpIFrame() {\r
+       var html = '<iframe width="100%" height="300" src="' + tinyMCE.themeURL + "/docs/" + tinyMCE.settings['docs_language'] + "/index.htm" + '"></iframe>';\r
+\r
+       document.getElementById('iframecontainer').innerHTML = html;\r
+\r
+       html = '';\r
+       html += '<a href="http://www.moxiecode.com" target="_blank"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="Got Moxie?" border="0" /></a> ';\r
+       html += '<a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="http://sourceforge.net/sflogo.php?group_id=103281" alt="Hosted By Sourceforge" border="0" /></a> ';\r
+       html += '<a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="http://tinymce.moxiecode.com/images/fm.gif" alt="Also on freshmeat" border="0" /></a> ';\r
+\r
+       document.getElementById('buttoncontainer').innerHTML = html;\r
+}\r
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/anchor.js b/program/js/tiny_mce/themes/advanced/jscripts/anchor.js
new file mode 100644 (file)
index 0000000..e7c1c62
--- /dev/null
@@ -0,0 +1,74 @@
+var action, element;\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var anchor = tinyMCE.getParentElement(inst.getFocusElement(), "a", "name");\r
+       var img = inst.getFocusElement();\r
+       action = 'insert';\r
+\r
+       if (anchor != null) {\r
+               element = anchor;\r
+               action = "update";\r
+       }\r
+\r
+       if (tinyMCE.getAttrib(img, "class") == "mceItemAnchor") {\r
+               element = img;\r
+               action = "update";\r
+       }\r
+\r
+       if (action == "update")\r
+               document.forms[0].anchorName.value = element.nodeName == "IMG" ? element.getAttribute("title") : element.getAttribute("name");\r
+\r
+       document.forms[0].insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true);\r
+}\r
+\r
+function insertAnchor() {\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var name = document.forms[0].anchorName.value, e;\r
+\r
+       tinyMCEPopup.execCommand("mceBeginUndoLevel");\r
+\r
+       if (action == "update") {\r
+               if (element.nodeName == "IMG")\r
+                       element.setAttribute("title", name);\r
+               else\r
+                       element.setAttribute("name", name);\r
+       } else {\r
+               var rng = inst.getRng();\r
+\r
+               if (rng.collapse)\r
+                       rng.collapse(false);\r
+\r
+               name = name.replace(/&/g, '&amp;');\r
+               name = name.replace(/\"/g, '&quot;');\r
+               name = name.replace(/</g, '&lt;');\r
+               name = name.replace(/>/g, '&gt;');\r
+\r
+               // Fix for bug #1447335\r
+               if (tinyMCE.isGecko)\r
+                       html = '<a id="mceNewAnchor" name="' + name + '"></a>';\r
+               else\r
+                       html = '<a name="' + name + '"></a>';\r
+\r
+               tinyMCEPopup.execCommand("mceInsertContent", false, html);\r
+\r
+               // Fix for bug #1447335 force cursor after the anchor element\r
+               if (tinyMCE.isGecko) {\r
+                       e = inst.getDoc().getElementById('mceNewAnchor');\r
+\r
+                       if (e) {\r
+                               inst.selection.selectNode(e, true, false, false);\r
+                               e.removeAttribute('id');\r
+                       }\r
+               }\r
+\r
+               tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+       }\r
+\r
+       tinyMCEPopup.execCommand("mceEndUndoLevel");\r
+\r
+       tinyMCE.triggerNodeChange();\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/charmap.js b/program/js/tiny_mce/themes/advanced/jscripts/charmap.js
new file mode 100644 (file)
index 0000000..eaa6a94
--- /dev/null
@@ -0,0 +1,326 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+}\r
+\r
+var charmap = new Array();\r
+\r
+// for mor details please see w3c.org\r
+// now here is the complete list ;)\r
+\r
+charmap = [\r
+       ['&nbsp;',    '&#160;',  true, 'no-break space'],\r
+       ['&amp;',     '&#38;',   true, 'ampersand'],\r
+       ['&quot;',    '&#34;',   true, 'quotation mark'],\r
+// finance\r
+       ['&cent;',    '&#162;',  true, 'cent sign'],\r
+       ['&euro;',    '&#8364;', true, 'euro sign'],\r
+       ['&pound;',   '&#163;',  true, 'pound sign'],\r
+       ['&yen;',     '&#165;',  true, 'yen sign'],\r
+// signs\r
+       ['&copy;',    '&#169;',  true, 'copyright sign'],\r
+       ['&reg;',     '&#174;',  true, 'registered sign'],\r
+       ['&trade;',   '&#8482;', true, 'trade mark sign'],\r
+       ['&permil;',  '&#8240;', true, 'per mille sign'],\r
+       ['&micro;',   '&#181;',  true, 'micro sign'],\r
+       ['&middot;',  '&#183;',  true, 'middle dot'],\r
+       ['&bull;',    '&#8226;', true, 'bullet'],\r
+       ['&hellip;',  '&#8230;', true, 'three dot leader'],\r
+       ['&prime;',   '&#8242;', true, 'minutes / feet'],\r
+       ['&Prime;',   '&#8243;', true, 'seconds / inches'],\r
+       ['&sect;',    '&#167;',  true, 'section sign'],\r
+       ['&para;',    '&#182;',  true, 'paragraph sign'],\r
+       ['&szlig;',   '&#223;',  true, 'sharp s / ess-zed'],\r
+// quotations\r
+       ['&lsaquo;',  '&#8249;', true, 'single left-pointing angle quotation mark'],\r
+       ['&rsaquo;',  '&#8250;', true, 'single right-pointing angle quotation mark'],\r
+       ['&laquo;',   '&#171;',  true, 'left pointing guillemet'],\r
+       ['&raquo;',   '&#187;',  true, 'right pointing guillemet'],\r
+       ['&lsquo;',   '&#8216;', true, 'left single quotation mark'],\r
+       ['&rsquo;',   '&#8217;', true, 'right single quotation mark'],\r
+       ['&ldquo;',   '&#8220;', true, 'left double quotation mark'],\r
+       ['&rdquo;',   '&#8221;', true, 'right double quotation mark'],\r
+       ['&sbquo;',   '&#8218;', true, 'single low-9 quotation mark'],\r
+       ['&bdquo;',   '&#8222;', true, 'double low-9 quotation mark'],\r
+       ['&lt;',      '&#60;',   true, 'less-than sign'],\r
+       ['&gt;',      '&#62;',   true, 'greater-than sign'],\r
+       ['&le;',      '&#8804;', true, 'less-than or equal to'],\r
+       ['&ge;',      '&#8805;', true, 'greater-than or equal to'],\r
+       ['&ndash;',   '&#8211;', true, 'en dash'],\r
+       ['&mdash;',   '&#8212;', true, 'em dash'],\r
+       ['&macr;',    '&#175;',  true, 'macron'],\r
+       ['&oline;',   '&#8254;', true, 'overline'],\r
+       ['&curren;',  '&#164;',  true, 'currency sign'],\r
+       ['&brvbar;',  '&#166;',  true, 'broken bar'],\r
+       ['&uml;',     '&#168;',  true, 'diaeresis'],\r
+       ['&iexcl;',   '&#161;',  true, 'inverted exclamation mark'],\r
+       ['&iquest;',  '&#191;',  true, 'turned question mark'],\r
+       ['&circ;',    '&#710;',  true, 'circumflex accent'],\r
+       ['&tilde;',   '&#732;',  true, 'small tilde'],\r
+       ['&deg;',     '&#176;',  true, 'degree sign'],\r
+       ['&minus;',   '&#8722;', true, 'minus sign'],\r
+       ['&plusmn;',  '&#177;',  true, 'plus-minus sign'],\r
+       ['&divide;',  '&#247;',  true, 'division sign'],\r
+       ['&frasl;',   '&#8260;', true, 'fraction slash'],\r
+       ['&times;',   '&#215;',  true, 'multiplication sign'],\r
+       ['&sup1;',    '&#185;',  true, 'superscript one'],\r
+       ['&sup2;',    '&#178;',  true, 'superscript two'],\r
+       ['&sup3;',    '&#179;',  true, 'superscript three'],\r
+       ['&frac14;',  '&#188;',  true, 'fraction one quarter'],\r
+       ['&frac12;',  '&#189;',  true, 'fraction one half'],\r
+       ['&frac34;',  '&#190;',  true, 'fraction three quarters'],\r
+// math / logical\r
+       ['&fnof;',    '&#402;',  true, 'function / florin'],\r
+       ['&int;',     '&#8747;', true, 'integral'],\r
+       ['&sum;',     '&#8721;', true, 'n-ary sumation'],\r
+       ['&infin;',   '&#8734;', true, 'infinity'],\r
+       ['&radic;',   '&#8730;', true, 'square root'],\r
+       ['&sim;',     '&#8764;', false,'similar to'],\r
+       ['&cong;',    '&#8773;', false,'approximately equal to'],\r
+       ['&asymp;',   '&#8776;', true, 'almost equal to'],\r
+       ['&ne;',      '&#8800;', true, 'not equal to'],\r
+       ['&equiv;',   '&#8801;', true, 'identical to'],\r
+       ['&isin;',    '&#8712;', false,'element of'],\r
+       ['&notin;',   '&#8713;', false,'not an element of'],\r
+       ['&ni;',      '&#8715;', false,'contains as member'],\r
+       ['&prod;',    '&#8719;', true, 'n-ary product'],\r
+       ['&and;',     '&#8743;', false,'logical and'],\r
+       ['&or;',      '&#8744;', false,'logical or'],\r
+       ['&not;',     '&#172;',  true, 'not sign'],\r
+       ['&cap;',     '&#8745;', true, 'intersection'],\r
+       ['&cup;',     '&#8746;', false,'union'],\r
+       ['&part;',    '&#8706;', true, 'partial differential'],\r
+       ['&forall;',  '&#8704;', false,'for all'],\r
+       ['&exist;',   '&#8707;', false,'there exists'],\r
+       ['&empty;',   '&#8709;', false,'diameter'],\r
+       ['&nabla;',   '&#8711;', false,'backward difference'],\r
+       ['&lowast;',  '&#8727;', false,'asterisk operator'],\r
+       ['&prop;',    '&#8733;', false,'proportional to'],\r
+       ['&ang;',     '&#8736;', false,'angle'],\r
+// undefined\r
+       ['&acute;',   '&#180;',  true, 'acute accent'],\r
+       ['&cedil;',   '&#184;',  true, 'cedilla'],\r
+       ['&ordf;',    '&#170;',  true, 'feminine ordinal indicator'],\r
+       ['&ordm;',    '&#186;',  true, 'masculine ordinal indicator'],\r
+       ['&dagger;',  '&#8224;', true, 'dagger'],\r
+       ['&Dagger;',  '&#8225;', true, 'double dagger'],\r
+// alphabetical special chars\r
+       ['&Agrave;',  '&#192;',  true, 'A - grave'],\r
+       ['&Aacute;',  '&#193;',  true, 'A - acute'],\r
+       ['&Acirc;',   '&#194;',  true, 'A - circumflex'],\r
+       ['&Atilde;',  '&#195;',  true, 'A - tilde'],\r
+       ['&Auml;',    '&#196;',  true, 'A - diaeresis'],\r
+       ['&Aring;',   '&#197;',  true, 'A - ring above'],\r
+       ['&AElig;',   '&#198;',  true, 'ligature AE'],\r
+       ['&Ccedil;',  '&#199;',  true, 'C - cedilla'],\r
+       ['&Egrave;',  '&#200;',  true, 'E - grave'],\r
+       ['&Eacute;',  '&#201;',  true, 'E - acute'],\r
+       ['&Ecirc;',   '&#202;',  true, 'E - circumflex'],\r
+       ['&Euml;',    '&#203;',  true, 'E - diaeresis'],\r
+       ['&Igrave;',  '&#204;',  true, 'I - grave'],\r
+       ['&Iacute;',  '&#205;',  true, 'I - acute'],\r
+       ['&Icirc;',   '&#206;',  true, 'I - circumflex'],\r
+       ['&Iuml;',    '&#207;',  true, 'I - diaeresis'],\r
+       ['&ETH;',     '&#208;',  true, 'ETH'],\r
+       ['&Ntilde;',  '&#209;',  true, 'N - tilde'],\r
+       ['&Ograve;',  '&#210;',  true, 'O - grave'],\r
+       ['&Oacute;',  '&#211;',  true, 'O - acute'],\r
+       ['&Ocirc;',   '&#212;',  true, 'O - circumflex'],\r
+       ['&Otilde;',  '&#213;',  true, 'O - tilde'],\r
+       ['&Ouml;',    '&#214;',  true, 'O - diaeresis'],\r
+       ['&Oslash;',  '&#216;',  true, 'O - slash'],\r
+       ['&OElig;',   '&#338;',  true, 'ligature OE'],\r
+       ['&Scaron;',  '&#352;',  true, 'S - caron'],\r
+       ['&Ugrave;',  '&#217;',  true, 'U - grave'],\r
+       ['&Uacute;',  '&#218;',  true, 'U - acute'],\r
+       ['&Ucirc;',   '&#219;',  true, 'U - circumflex'],\r
+       ['&Uuml;',    '&#220;',  true, 'U - diaeresis'],\r
+       ['&Yacute;',  '&#221;',  true, 'Y - acute'],\r
+       ['&Yuml;',    '&#376;',  true, 'Y - diaeresis'],\r
+       ['&THORN;',   '&#222;',  true, 'THORN'],\r
+       ['&agrave;',  '&#224;',  true, 'a - grave'],\r
+       ['&aacute;',  '&#225;',  true, 'a - acute'],\r
+       ['&acirc;',   '&#226;',  true, 'a - circumflex'],\r
+       ['&atilde;',  '&#227;',  true, 'a - tilde'],\r
+       ['&auml;',    '&#228;',  true, 'a - diaeresis'],\r
+       ['&aring;',   '&#229;',  true, 'a - ring above'],\r
+       ['&aelig;',   '&#230;',  true, 'ligature ae'],\r
+       ['&ccedil;',  '&#231;',  true, 'c - cedilla'],\r
+       ['&egrave;',  '&#232;',  true, 'e - grave'],\r
+       ['&eacute;',  '&#233;',  true, 'e - acute'],\r
+       ['&ecirc;',   '&#234;',  true, 'e - circumflex'],\r
+       ['&euml;',    '&#235;',  true, 'e - diaeresis'],\r
+       ['&igrave;',  '&#236;',  true, 'i - grave'],\r
+       ['&iacute;',  '&#237;',  true, 'i - acute'],\r
+       ['&icirc;',   '&#238;',  true, 'i - circumflex'],\r
+       ['&iuml;',    '&#239;',  true, 'i - diaeresis'],\r
+       ['&eth;',     '&#240;',  true, 'eth'],\r
+       ['&ntilde;',  '&#241;',  true, 'n - tilde'],\r
+       ['&ograve;',  '&#242;',  true, 'o - grave'],\r
+       ['&oacute;',  '&#243;',  true, 'o - acute'],\r
+       ['&ocirc;',   '&#244;',  true, 'o - circumflex'],\r
+       ['&otilde;',  '&#245;',  true, 'o - tilde'],\r
+       ['&ouml;',    '&#246;',  true, 'o - diaeresis'],\r
+       ['&oslash;',  '&#248;',  true, 'o slash'],\r
+       ['&oelig;',   '&#339;',  true, 'ligature oe'],\r
+       ['&scaron;',  '&#353;',  true, 's - caron'],\r
+       ['&ugrave;',  '&#249;',  true, 'u - grave'],\r
+       ['&uacute;',  '&#250;',  true, 'u - acute'],\r
+       ['&ucirc;',   '&#251;',  true, 'u - circumflex'],\r
+       ['&uuml;',    '&#252;',  true, 'u - diaeresis'],\r
+       ['&yacute;',  '&#253;',  true, 'y - acute'],\r
+       ['&thorn;',   '&#254;',  true, 'thorn'],\r
+       ['&yuml;',    '&#255;',  true, 'y - diaeresis'],\r
+    ['&Alpha;',   '&#913;',  true, 'Alpha'],\r
+       ['&Beta;',    '&#914;',  true, 'Beta'],\r
+       ['&Gamma;',   '&#915;',  true, 'Gamma'],\r
+       ['&Delta;',   '&#916;',  true, 'Delta'],\r
+       ['&Epsilon;', '&#917;',  true, 'Epsilon'],\r
+       ['&Zeta;',    '&#918;',  true, 'Zeta'],\r
+       ['&Eta;',     '&#919;',  true, 'Eta'],\r
+       ['&Theta;',   '&#920;',  true, 'Theta'],\r
+       ['&Iota;',    '&#921;',  true, 'Iota'],\r
+       ['&Kappa;',   '&#922;',  true, 'Kappa'],\r
+       ['&Lambda;',  '&#923;',  true, 'Lambda'],\r
+       ['&Mu;',      '&#924;',  true, 'Mu'],\r
+       ['&Nu;',      '&#925;',  true, 'Nu'],\r
+       ['&Xi;',      '&#926;',  true, 'Xi'],\r
+       ['&Omicron;', '&#927;',  true, 'Omicron'],\r
+       ['&Pi;',      '&#928;',  true, 'Pi'],\r
+       ['&Rho;',     '&#929;',  true, 'Rho'],\r
+       ['&Sigma;',   '&#931;',  true, 'Sigma'],\r
+       ['&Tau;',     '&#932;',  true, 'Tau'],\r
+       ['&Upsilon;', '&#933;',  true, 'Upsilon'],\r
+       ['&Phi;',     '&#934;',  true, 'Phi'],\r
+       ['&Chi;',     '&#935;',  true, 'Chi'],\r
+       ['&Psi;',     '&#936;',  true, 'Psi'],\r
+       ['&Omega;',   '&#937;',  true, 'Omega'],\r
+       ['&alpha;',   '&#945;',  true, 'alpha'],\r
+       ['&beta;',    '&#946;',  true, 'beta'],\r
+       ['&gamma;',   '&#947;',  true, 'gamma'],\r
+       ['&delta;',   '&#948;',  true, 'delta'],\r
+       ['&epsilon;', '&#949;',  true, 'epsilon'],\r
+       ['&zeta;',    '&#950;',  true, 'zeta'],\r
+       ['&eta;',     '&#951;',  true, 'eta'],\r
+       ['&theta;',   '&#952;',  true, 'theta'],\r
+       ['&iota;',    '&#953;',  true, 'iota'],\r
+       ['&kappa;',   '&#954;',  true, 'kappa'],\r
+       ['&lambda;',  '&#955;',  true, 'lambda'],\r
+       ['&mu;',      '&#956;',  true, 'mu'],\r
+       ['&nu;',      '&#957;',  true, 'nu'],\r
+       ['&xi;',      '&#958;',  true, 'xi'],\r
+       ['&omicron;', '&#959;',  true, 'omicron'],\r
+       ['&pi;',      '&#960;',  true, 'pi'],\r
+       ['&rho;',     '&#961;',  true, 'rho'],\r
+       ['&sigmaf;',  '&#962;',  true, 'final sigma'],\r
+       ['&sigma;',   '&#963;',  true, 'sigma'],\r
+       ['&tau;',     '&#964;',  true, 'tau'],\r
+       ['&upsilon;', '&#965;',  true, 'upsilon'],\r
+       ['&phi;',     '&#966;',  true, 'phi'],\r
+       ['&chi;',     '&#967;',  true, 'chi'],\r
+       ['&psi;',     '&#968;',  true, 'psi'],\r
+       ['&omega;',   '&#969;',  true, 'omega'],\r
+// symbols\r
+       ['&alefsym;', '&#8501;', false,'alef symbol'],\r
+       ['&piv;',     '&#982;',  false,'pi symbol'],\r
+       ['&real;',    '&#8476;', false,'real part symbol'],\r
+       ['&thetasym;','&#977;',  false,'theta symbol'],\r
+       ['&upsih;',   '&#978;',  false,'upsilon - hook symbol'],\r
+       ['&weierp;',  '&#8472;', false,'Weierstrass p'],\r
+       ['&image;',   '&#8465;', false,'imaginary part'],\r
+// arrows\r
+       ['&larr;',    '&#8592;', true, 'leftwards arrow'],\r
+       ['&uarr;',    '&#8593;', true, 'upwards arrow'],\r
+       ['&rarr;',    '&#8594;', true, 'rightwards arrow'],\r
+       ['&darr;',    '&#8595;', true, 'downwards arrow'],\r
+       ['&harr;',    '&#8596;', true, 'left right arrow'],\r
+       ['&crarr;',   '&#8629;', false,'carriage return'],\r
+       ['&lArr;',    '&#8656;', false,'leftwards double arrow'],\r
+       ['&uArr;',    '&#8657;', false,'upwards double arrow'],\r
+       ['&rArr;',    '&#8658;', false,'rightwards double arrow'],\r
+       ['&dArr;',    '&#8659;', false,'downwards double arrow'],\r
+       ['&hArr;',    '&#8660;', false,'left right double arrow'],\r
+       ['&there4;',  '&#8756;', false,'therefore'],\r
+       ['&sub;',     '&#8834;', false,'subset of'],\r
+       ['&sup;',     '&#8835;', false,'superset of'],\r
+       ['&nsub;',    '&#8836;', false,'not a subset of'],\r
+       ['&sube;',    '&#8838;', false,'subset of or equal to'],\r
+       ['&supe;',    '&#8839;', false,'superset of or equal to'],\r
+       ['&oplus;',   '&#8853;', false,'circled plus'],\r
+       ['&otimes;',  '&#8855;', false,'circled times'],\r
+       ['&perp;',    '&#8869;', false,'perpendicular'],\r
+       ['&sdot;',    '&#8901;', false,'dot operator'],\r
+       ['&lceil;',   '&#8968;', false,'left ceiling'],\r
+       ['&rceil;',   '&#8969;', false,'right ceiling'],\r
+       ['&lfloor;',  '&#8970;', false,'left floor'],\r
+       ['&rfloor;',  '&#8971;', false,'right floor'],\r
+       ['&lang;',    '&#9001;', false,'left-pointing angle bracket'],\r
+       ['&rang;',    '&#9002;', false,'right-pointing angle bracket'],\r
+       ['&loz;',     '&#9674;', true,'lozenge'],\r
+       ['&spades;',  '&#9824;', false,'black spade suit'],\r
+       ['&clubs;',   '&#9827;', true, 'black club suit'],\r
+       ['&hearts;',  '&#9829;', true, 'black heart suit'],\r
+       ['&diams;',   '&#9830;', true, 'black diamond suit'],\r
+       ['&ensp;',    '&#8194;', false,'en space'],\r
+       ['&emsp;',    '&#8195;', false,'em space'],\r
+       ['&thinsp;',  '&#8201;', false,'thin space'],\r
+       ['&zwnj;',    '&#8204;', false,'zero width non-joiner'],\r
+       ['&zwj;',     '&#8205;', false,'zero width joiner'],\r
+       ['&lrm;',     '&#8206;', false,'left-to-right mark'],\r
+       ['&rlm;',     '&#8207;', false,'right-to-left mark'],\r
+       ['&shy;',     '&#173;',  false,'soft hyphen']\r
+];\r
+\r
+function renderCharMapHTML() {\r
+       var charsPerRow = 20, tdWidth=20, tdHeight=20;\r
+       var html = '<table border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + '"><tr height="' + tdHeight + '">';\r
+       var cols=-1;\r
+       for (var i=0; i<charmap.length; i++) {\r
+               if (charmap[i][2]==true) {\r
+                       cols++;\r
+                       html += ''\r
+                               + '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap"'\r
+                               + ' onmouseover="this.className=\'charmapOver\';'\r
+                               + 'previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');"'\r
+                               + ' onmouseout="this.className=\'charmap\';"'\r
+                               + ' nowrap="nowrap" onclick="insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');"><a style="text-decoration: none;" onfocus="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" href="javascript:insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');" onclick="return false;" onmousedown="return false;" title="' + charmap[i][3] + '">'\r
+                               + charmap[i][1]\r
+                               + '</a></td>';\r
+                       if ((cols+1) % charsPerRow == 0)\r
+                               html += '</tr><tr height="' + tdHeight + '">';\r
+               }\r
+        }\r
+       if (cols % charsPerRow > 0) {\r
+               var padd = charsPerRow - (cols % charsPerRow);\r
+               for (var i=0; i<padd-1; i++)\r
+                       html += '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap">&nbsp;</td>';\r
+       }\r
+       html += '</tr></table>';\r
+       document.write(html);\r
+}\r
+\r
+function insertChar(chr) {\r
+       tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';');\r
+\r
+       // Refocus in window\r
+       if (tinyMCEPopup.isWindow)\r
+               window.focus();\r
+\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function previewChar(codeA, codeB, codeN) {\r
+       var elmA = document.getElementById('codeA');\r
+       var elmB = document.getElementById('codeB');\r
+       var elmV = document.getElementById('codeV');\r
+       var elmN = document.getElementById('codeN');\r
+\r
+       if (codeA=='#160;') {\r
+               elmV.innerHTML = '__';\r
+       } else {\r
+               elmV.innerHTML = '&' + codeA;\r
+       }\r
+\r
+       elmB.innerHTML = '&amp;' + codeA;\r
+       elmA.innerHTML = '&amp;' + codeB;\r
+       elmN.innerHTML = codeN;\r
+}\r
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/color_picker.js b/program/js/tiny_mce/themes/advanced/jscripts/color_picker.js
new file mode 100644 (file)
index 0000000..00fc823
--- /dev/null
@@ -0,0 +1,240 @@
+var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false;\r
+\r
+var colors = new Array(\r
+       "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033",\r
+       "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099",\r
+       "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff",\r
+       "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033",\r
+       "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399",\r
+       "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff",\r
+       "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333",\r
+       "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399",\r
+       "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff",\r
+       "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633",\r
+       "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699",\r
+       "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff",\r
+       "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633",\r
+       "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999",\r
+       "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff",\r
+       "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933",\r
+       "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999",\r
+       "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff",\r
+       "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33",\r
+       "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99",\r
+       "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff",\r
+       "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33",\r
+       "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99",\r
+       "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff",\r
+       "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33",\r
+       "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99",\r
+       "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff"\r
+);\r
+\r
+var named = {\r
+       '#F0F8FF':'AliceBlue','#FAEBD7':'AntiqueWhite','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige',\r
+       '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'BlanchedAlmond','#0000FF':'Blue','#8A2BE2':'BlueViolet','#A52A2A':'Brown',\r
+       '#DEB887':'BurlyWood','#5F9EA0':'CadetBlue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'CornflowerBlue',\r
+       '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'DarkBlue','#008B8B':'DarkCyan','#B8860B':'DarkGoldenRod',\r
+       '#A9A9A9':'DarkGray','#A9A9A9':'DarkGrey','#006400':'DarkGreen','#BDB76B':'DarkKhaki','#8B008B':'DarkMagenta','#556B2F':'DarkOliveGreen',\r
+       '#FF8C00':'Darkorange','#9932CC':'DarkOrchid','#8B0000':'DarkRed','#E9967A':'DarkSalmon','#8FBC8F':'DarkSeaGreen','#483D8B':'DarkSlateBlue',\r
+       '#2F4F4F':'DarkSlateGray','#2F4F4F':'DarkSlateGrey','#00CED1':'DarkTurquoise','#9400D3':'DarkViolet','#FF1493':'DeepPink','#00BFFF':'DeepSkyBlue',\r
+       '#696969':'DimGray','#696969':'DimGrey','#1E90FF':'DodgerBlue','#B22222':'FireBrick','#FFFAF0':'FloralWhite','#228B22':'ForestGreen',\r
+       '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'GhostWhite','#FFD700':'Gold','#DAA520':'GoldenRod','#808080':'Gray','#808080':'Grey',\r
+       '#008000':'Green','#ADFF2F':'GreenYellow','#F0FFF0':'HoneyDew','#FF69B4':'HotPink','#CD5C5C':'IndianRed','#4B0082':'Indigo','#FFFFF0':'Ivory',\r
+       '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'LavenderBlush','#7CFC00':'LawnGreen','#FFFACD':'LemonChiffon','#ADD8E6':'LightBlue',\r
+       '#F08080':'LightCoral','#E0FFFF':'LightCyan','#FAFAD2':'LightGoldenRodYellow','#D3D3D3':'LightGray','#D3D3D3':'LightGrey','#90EE90':'LightGreen',\r
+       '#FFB6C1':'LightPink','#FFA07A':'LightSalmon','#20B2AA':'LightSeaGreen','#87CEFA':'LightSkyBlue','#778899':'LightSlateGray','#778899':'LightSlateGrey',\r
+       '#B0C4DE':'LightSteelBlue','#FFFFE0':'LightYellow','#00FF00':'Lime','#32CD32':'LimeGreen','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon',\r
+       '#66CDAA':'MediumAquaMarine','#0000CD':'MediumBlue','#BA55D3':'MediumOrchid','#9370D8':'MediumPurple','#3CB371':'MediumSeaGreen','#7B68EE':'MediumSlateBlue',\r
+       '#00FA9A':'MediumSpringGreen','#48D1CC':'MediumTurquoise','#C71585':'MediumVioletRed','#191970':'MidnightBlue','#F5FFFA':'MintCream','#FFE4E1':'MistyRose','#FFE4B5':'Moccasin',\r
+       '#FFDEAD':'NavajoWhite','#000080':'Navy','#FDF5E6':'OldLace','#808000':'Olive','#6B8E23':'OliveDrab','#FFA500':'Orange','#FF4500':'OrangeRed','#DA70D6':'Orchid',\r
+       '#EEE8AA':'PaleGoldenRod','#98FB98':'PaleGreen','#AFEEEE':'PaleTurquoise','#D87093':'PaleVioletRed','#FFEFD5':'PapayaWhip','#FFDAB9':'PeachPuff',\r
+       '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'PowderBlue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'RosyBrown','#4169E1':'RoyalBlue',\r
+       '#8B4513':'SaddleBrown','#FA8072':'Salmon','#F4A460':'SandyBrown','#2E8B57':'SeaGreen','#FFF5EE':'SeaShell','#A0522D':'Sienna','#C0C0C0':'Silver',\r
+       '#87CEEB':'SkyBlue','#6A5ACD':'SlateBlue','#708090':'SlateGray','#708090':'SlateGrey','#FFFAFA':'Snow','#00FF7F':'SpringGreen',\r
+       '#4682B4':'SteelBlue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet',\r
+       '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'WhiteSmoke','#FFFF00':'Yellow','#9ACD32':'YellowGreen'\r
+};\r
+\r
+function init() {\r
+       var inputColor = convertRGBToHex(tinyMCE.getWindowArg('input_color'));\r
+\r
+       if (tinyMCE.isMSIE)\r
+               tinyMCEPopup.resizeToInnerSize();\r
+\r
+       generatePicker();\r
+\r
+       if (inputColor) {\r
+               changeFinalColor(inputColor);\r
+\r
+               col = convertHexToRGB(inputColor);\r
+\r
+               if (col)\r
+                       updateLight(col.r, col.g, col.b);\r
+       }\r
+}\r
+\r
+function insertAction() {\r
+       var color = document.getElementById("color").value;\r
+\r
+       tinyMCEPopup.execCommand(tinyMCE.getWindowArg('command'), false, color);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function showColor(color, name) {\r
+       if (name)\r
+               document.getElementById("colorname").innerHTML = name;\r
+\r
+       document.getElementById("preview").style.backgroundColor = color;\r
+       document.getElementById("color").value = color;\r
+}\r
+\r
+function convertRGBToHex(col) {\r
+       var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");\r
+\r
+       if (!col)\r
+               return col;\r
+\r
+       var rgb = col.replace(re, "$1,$2,$3").split(',');\r
+       if (rgb.length == 3) {\r
+               r = parseInt(rgb[0]).toString(16);\r
+               g = parseInt(rgb[1]).toString(16);\r
+               b = parseInt(rgb[2]).toString(16);\r
+\r
+               r = r.length == 1 ? '0' + r : r;\r
+               g = g.length == 1 ? '0' + g : g;\r
+               b = b.length == 1 ? '0' + b : b;\r
+\r
+               return "#" + r + g + b;\r
+       }\r
+\r
+       return col;\r
+}\r
+\r
+function convertHexToRGB(col) {\r
+       if (col.indexOf('#') != -1) {\r
+               col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');\r
+\r
+               r = parseInt(col.substring(0, 2), 16);\r
+               g = parseInt(col.substring(2, 4), 16);\r
+               b = parseInt(col.substring(4, 6), 16);\r
+\r
+               return {r : r, g : g, b : b};\r
+       }\r
+\r
+       return null;\r
+}\r
+\r
+function generatePicker() {\r
+       var el = document.getElementById('light'), h = '', i;\r
+\r
+       for (i = 0; i < detail; i++){\r
+               h += '<div id="gs'+i+'" style="background-color:#000000; width:15px; height:3px; border-style:none; border-width:0px;"'\r
+               + ' onclick="changeFinalColor(this.style.backgroundColor)"'\r
+               + ' onmousedown="isMouseDown = true; return false;"'\r
+               + ' onmouseup="isMouseDown = false;"'\r
+               + ' onmousemove="if (isMouseDown && isMouseOver) changeFinalColor(this.style.backgroundColor); return false;"'\r
+               + ' onmouseover="isMouseOver = true;"'\r
+               + ' onmouseout="isMouseOver = false;"'\r
+               + '></div>';\r
+       }\r
+\r
+       el.innerHTML = h;\r
+}\r
+\r
+function generateWebColors() {\r
+       var el = document.getElementById('webcolors'), h = '', i;\r
+\r
+       if (el.className == 'generated')\r
+               return;\r
+\r
+       h += '<table border="0" cellspacing="1" cellpadding="0">'\r
+               + '<tr>';\r
+\r
+       for (i=0; i<colors.length; i++) {\r
+               h += '<td bgcolor="' + colors[i] + '">'\r
+                       + '<a href="javascript:insertAction();" onfocus="showColor(\'' + colors[i] +  '\');" onmouseover="showColor(\'' + colors[i] +  '\');">'\r
+                       + '<img border="0" src="images/spacer.gif" width="10" height="10" title="' + colors[i] +  '" alt="' + colors[i] +  '" /></a></td>';\r
+               if ((i+1) % 18 == 0)\r
+                       h += '</tr><tr>';\r
+       }\r
+\r
+       h += '</table>';\r
+\r
+       el.innerHTML = h;\r
+       el.className = 'generated';\r
+}\r
+\r
+function generateNamedColors() {\r
+       var el = document.getElementById('namedcolors'), h = '', n, v, i = 0;\r
+\r
+       if (el.className == 'generated')\r
+               return;\r
+\r
+       for (n in named) {\r
+               v = named[n];\r
+               h += '<a href="javascript:insertAction();" onmouseover="showColor(\'' + n +  '\',\'' + v + '\');" style="background-color: ' + n + '"><!-- IE --></a>'\r
+       }\r
+\r
+       el.innerHTML = h;\r
+       el.className = 'generated';\r
+}\r
+\r
+function dechex(n) {\r
+       return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16);\r
+}\r
+\r
+function computeColor(e) {\r
+       var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB;\r
+\r
+       x = e.offsetX ? e.offsetX : (e.target ? e.clientX - e.target.x : 0);\r
+       y = e.offsetY ? e.offsetY : (e.target ? e.clientY - e.target.y : 0);\r
+\r
+       partWidth = document.getElementById('colorpicker').width / 6;\r
+       partDetail = detail / 2;\r
+       imHeight = document.getElementById('colorpicker').height;\r
+\r
+       r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255;\r
+       g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255     + (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth);\r
+       b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth);\r
+\r
+       coef = (imHeight - y) / imHeight;\r
+       r = 128 + (r - 128) * coef;\r
+       g = 128 + (g - 128) * coef;\r
+       b = 128 + (b - 128) * coef;\r
+\r
+       changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b));\r
+       updateLight(r, g, b);\r
+}\r
+\r
+function updateLight(r, g, b) {\r
+       var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color;\r
+\r
+       for (i=0; i<detail; i++) {\r
+               if ((i>=0) && (i<partDetail)) {\r
+                       finalCoef = i / partDetail;\r
+                       finalR = dechex(255 - (255 - r) * finalCoef);\r
+                       finalG = dechex(255 - (255 - g) * finalCoef);\r
+                       finalB = dechex(255 - (255 - b) * finalCoef);\r
+               } else {\r
+                       finalCoef = 2 - i / partDetail;\r
+                       finalR = dechex(r * finalCoef);\r
+                       finalG = dechex(g * finalCoef);\r
+                       finalB = dechex(b * finalCoef);\r
+               }\r
+\r
+               color = finalR + finalG + finalB;\r
+\r
+               document.getElementById('gs' + i).style.backgroundColor = '#'+color;\r
+       }\r
+}\r
+\r
+function changeFinalColor(color) {\r
+       if (color.indexOf('#') == -1)\r
+               color = convertRGBToHex(color);\r
+\r
+       document.getElementById('preview').style.backgroundColor = color;\r
+       document.getElementById('color').value = color;\r
+}\r
+\r
+window.focus();
\ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/image.js b/program/js/tiny_mce/themes/advanced/jscripts/image.js
new file mode 100644 (file)
index 0000000..a52bfad
--- /dev/null
@@ -0,0 +1,81 @@
+var url = tinyMCE.getParam("external_image_list_url");\r
+if (url != null) {\r
+       // Fix relative\r
+       if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+               url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+}\r
+\r
+function insertImage() {\r
+       var src = document.forms[0].src.value;\r
+       var alt = document.forms[0].alt.value;\r
+       var border = document.forms[0].border.value;\r
+       var vspace = document.forms[0].vspace.value;\r
+       var hspace = document.forms[0].hspace.value;\r
+       var width = document.forms[0].width.value;\r
+       var height = document.forms[0].height.value;\r
+       var align = document.forms[0].align.options[document.forms[0].align.selectedIndex].value;\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+       tinyMCE.themes['advanced']._insertImage(src, alt, border, hspace, vspace, width, height, align);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');\r
+\r
+       var formObj = document.forms[0];\r
+\r
+       for (var i=0; i<document.forms[0].align.options.length; i++) {\r
+               if (document.forms[0].align.options[i].value == tinyMCE.getWindowArg('align'))\r
+                       document.forms[0].align.options.selectedIndex = i;\r
+       }\r
+\r
+       formObj.src.value = tinyMCE.getWindowArg('src');\r
+       formObj.alt.value = tinyMCE.getWindowArg('alt');\r
+       formObj.border.value = tinyMCE.getWindowArg('border');\r
+       formObj.vspace.value = tinyMCE.getWindowArg('vspace');\r
+       formObj.hspace.value = tinyMCE.getWindowArg('hspace');\r
+       formObj.width.value = tinyMCE.getWindowArg('width');\r
+       formObj.height.value = tinyMCE.getWindowArg('height');\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); \r
+\r
+       // Handle file browser\r
+       if (isVisible('srcbrowser'))\r
+               document.getElementById('src').style.width = '180px';\r
+\r
+       // Auto select image in list\r
+       if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {\r
+               for (var i=0; i<formObj.image_list.length; i++) {\r
+                       if (formObj.image_list.options[i].value == tinyMCE.getWindowArg('src'))\r
+                               formObj.image_list.options[i].selected = true;\r
+               }\r
+       }\r
+}\r
+\r
+var preloadImg = new Image();\r
+\r
+function resetImageData() {\r
+       var formObj = document.forms[0];\r
+       formObj.width.value = formObj.height.value = "";        \r
+}\r
+\r
+function updateImageData() {\r
+       var formObj = document.forms[0];\r
+\r
+       if (formObj.width.value == "")\r
+               formObj.width.value = preloadImg.width;\r
+\r
+       if (formObj.height.value == "")\r
+               formObj.height.value = preloadImg.height;\r
+}\r
+\r
+function getImageData() {\r
+       preloadImg = new Image();\r
+       tinyMCE.addEvent(preloadImg, "load", updateImageData);\r
+       tinyMCE.addEvent(preloadImg, "error", function () {var formObj = document.forms[0];formObj.width.value = formObj.height.value = "";});\r
+       preloadImg.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], document.forms[0].src.value);\r
+}\r
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/link.js b/program/js/tiny_mce/themes/advanced/jscripts/link.js
new file mode 100644 (file)
index 0000000..e195497
--- /dev/null
@@ -0,0 +1,74 @@
+var url = tinyMCE.getParam("external_link_list_url");\r
+if (url != null) {\r
+       // Fix relative\r
+       if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+               url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','theme_advanced_link');\r
+\r
+       // Handle file browser\r
+       if (isVisible('hrefbrowser'))\r
+               document.getElementById('href').style.width = '180px';\r
+\r
+       var formObj = document.forms[0];\r
+\r
+       for (var i=0; i<document.forms[0].target.options.length; i++) {\r
+               var option = document.forms[0].target.options[i];\r
+\r
+               if (option.value == tinyMCE.getWindowArg('target'))\r
+                       option.selected = true;\r
+       }\r
+\r
+       document.forms[0].href.value = tinyMCE.getWindowArg('href');\r
+       document.forms[0].linktitle.value = tinyMCE.getWindowArg('title');\r
+       document.forms[0].insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); \r
+\r
+       addClassesToList('styleSelect', 'theme_advanced_link_styles');\r
+       selectByValue(formObj, 'styleSelect', tinyMCE.getWindowArg('className'), true);\r
+\r
+       // Hide css select row if no CSS classes\r
+       if (formObj.styleSelect && formObj.styleSelect.options.length <= 1) {\r
+               var sr = document.getElementById('styleSelectRow');\r
+               sr.style.display = 'none';\r
+               sr.parentNode.removeChild(sr);\r
+       }\r
+\r
+       // Auto select link in list\r
+       if (typeof(tinyMCELinkList) != "undefined" && tinyMCELinkList.length > 0) {\r
+               var formObj = document.forms[0];\r
+\r
+               for (var i=0; i<formObj.link_list.length; i++) {\r
+                       if (formObj.link_list.options[i].value == tinyMCE.getWindowArg('href'))\r
+                               formObj.link_list.options[i].selected = true;\r
+               }\r
+       }\r
+}\r
+\r
+function checkPrefix(n) {\r
+       if (Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCE.getLang('lang_is_email')))\r
+               n.value = 'mailto:' + n.value;\r
+\r
+       if (/^\s*www./i.test(n.value) && confirm(tinyMCE.getLang('lang_is_external')))\r
+               n.value = 'http://' + n.value;\r
+}\r
+\r
+function insertLink() {\r
+       var href = document.forms[0].href.value;\r
+       var target = document.forms[0].target.options[document.forms[0].target.selectedIndex].value;\r
+       var title = document.forms[0].linktitle.value;\r
+       var style_class = document.forms[0].styleSelect ? document.forms[0].styleSelect.value : "";\r
+       var dummy;\r
+\r
+       if (target == '_self')\r
+               target = '';\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+       tinyMCE.themes['advanced']._insertLink(href, target, title, dummy, style_class);\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/source_editor.js b/program/js/tiny_mce/themes/advanced/jscripts/source_editor.js
new file mode 100644 (file)
index 0000000..d0d517d
--- /dev/null
@@ -0,0 +1,59 @@
+function saveContent() {\r
+       tinyMCE.setContent(document.getElementById('htmlSource').value);\r
+       tinyMCE.closeWindow(window);\r
+}\r
+\r
+function onLoadInit() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       // Remove Gecko spellchecking\r
+       if (tinyMCE.isGecko)\r
+               document.body.spellcheck = tinyMCE.getParam("gecko_spellcheck");\r
+\r
+       document.getElementById('htmlSource').value = tinyMCE.getContent(tinyMCE.getWindowArg('editor_id'));\r
+\r
+       resizeInputs();\r
+\r
+       if (tinyMCE.getParam("theme_advanced_source_editor_wrap", true)) {\r
+               setWrap('soft');\r
+               document.getElementById('wraped').checked = true;\r
+       }\r
+}\r
+\r
+function setWrap(val) {\r
+       var s = document.getElementById('htmlSource');\r
+\r
+       s.wrap = val;\r
+\r
+       if (tinyMCE.isGecko || tinyMCE.isOpera) {\r
+               var v = s.value;\r
+               var n = s.cloneNode(false);\r
+               n.setAttribute("wrap", val);\r
+               s.parentNode.replaceChild(n, s);\r
+               n.value = v;\r
+       }\r
+}\r
+\r
+function toggleWordWrap(elm) {\r
+       if (elm.checked)\r
+               setWrap('soft');\r
+       else\r
+               setWrap('off');\r
+}\r
+\r
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;\r
+\r
+function resizeInputs() {\r
+       var el = document.getElementById('htmlSource');\r
+\r
+       if (!tinyMCE.isMSIE) {\r
+                wHeight = self.innerHeight - 60;\r
+                wWidth = self.innerWidth - 16;\r
+       } else {\r
+                wHeight = document.body.clientHeight - 60;\r
+                wWidth = document.body.clientWidth - 16;\r
+       }\r
+\r
+       el.style.height = Math.abs(wHeight) + 'px';\r
+       el.style.width  = Math.abs(wWidth) + 'px';\r
+}\r
diff --git a/program/js/tiny_mce/themes/advanced/langs/en.js b/program/js/tiny_mce/themes/advanced/langs/en.js
new file mode 100644 (file)
index 0000000..8409e58
--- /dev/null
@@ -0,0 +1,93 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Styles --',\r
+theme_code_desc : 'Edit HTML Source',\r
+theme_code_title : 'HTML Source Editor',\r
+theme_code_wordwrap : 'Word wrap',\r
+theme_sub_desc : 'Subscript',\r
+theme_sup_desc : 'Superscript',\r
+theme_hr_desc : 'Insert horizontal ruler',\r
+theme_removeformat_desc : 'Remove formatting',\r
+theme_custom1_desc : 'Your custom description here',\r
+insert_image_border : 'Border',\r
+insert_image_dimensions : 'Dimensions',\r
+insert_image_vspace : 'Vertical space',\r
+insert_image_hspace : 'Horizontal space',\r
+insert_image_align : 'Alignment',\r
+insert_image_align_default : '-- Not set --',\r
+insert_image_align_baseline : 'Baseline',\r
+insert_image_align_top : 'Top',\r
+insert_image_align_middle : 'Middle',\r
+insert_image_align_bottom : 'Bottom',\r
+insert_image_align_texttop : 'TextTop',\r
+insert_image_align_absmiddle : 'Absolute Middle',\r
+insert_image_align_absbottom : 'Absolute Bottom',\r
+insert_image_align_left : 'Left',\r
+insert_image_align_right : 'Right',\r
+theme_font_size : '-- Font size --',\r
+theme_fontdefault : '-- Font family --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : 'Paragraph',\r
+theme_div : 'Div',\r
+theme_address : 'Address',\r
+theme_pre : 'Preformatted',\r
+theme_h1 : 'Heading 1',\r
+theme_h2 : 'Heading 2',\r
+theme_h3 : 'Heading 3',\r
+theme_h4 : 'Heading 4',\r
+theme_h5 : 'Heading 5',\r
+theme_h6 : 'Heading 6',\r
+theme_blockquote : 'Blockquote',\r
+theme_code : 'Code',\r
+theme_samp : 'Code sample',\r
+theme_dt : 'Definition term ',\r
+theme_dd : 'Definition description',\r
+theme_colorpicker_title : 'Select a color',\r
+theme_colorpicker_apply : 'Apply',\r
+theme_forecolor_desc : 'Select text color',\r
+theme_backcolor_desc : 'Select background color',\r
+theme_charmap_title : 'Select custom character',\r
+theme_charmap_desc : 'Insert custom character',\r
+theme_visualaid_desc : 'Toggle guidelines/invisible elements',\r
+insert_anchor_title : 'Insert/edit anchor',\r
+insert_anchor_name : 'Anchor name',\r
+theme_anchor_desc : 'Insert/edit anchor',\r
+theme_insert_link_titlefield : 'Title',\r
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+theme_path : 'Path',\r
+cut_desc : 'Cut',\r
+copy_desc : 'Copy',\r
+paste_desc : 'Paste',\r
+link_list : 'Link list',\r
+image_list : 'Image list',\r
+browse : 'Browse',\r
+image_props_desc : 'Image properties',\r
+newdocument_desc : 'New document',\r
+class_name : 'Class',\r
+newdocument : 'Are you sure you want clear all contents?',\r
+about_title : 'About TinyMCE',\r
+about : 'About',\r
+license : 'License',\r
+plugins : 'Plugins',\r
+plugin : 'Plugin',\r
+author : 'Author',\r
+version : 'Version',\r
+loaded_plugins : 'Loaded plugins',\r
+help : 'Help',\r
+not_set : '-- Not set --',\r
+close : 'Close',\r
+toolbar_focus : 'Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X',\r
+invalid_data : 'Error: Invalid values entered, these are marked in red.',\r
+more_colors : 'More colors',\r
+color_picker_tab : 'Picker',\r
+color_picker : 'Color picker',\r
+web_colors_tab : 'Palette',\r
+web_colors : 'Palette colors',\r
+named_colors_tab : 'Named',\r
+named_colors : 'Named colors',\r
+color : 'Color:',\r
+color_name : 'Name:',\r
+is_email : 'The URL you entered seems to be an email address, do you want to add the required mailto: prefix?',\r
+is_external : 'The URL you entered seems to external link, do you want to add the required http:// prefix?'\r
+});\r
diff --git a/program/js/tiny_mce/themes/advanced/link.htm b/program/js/tiny_mce/themes/advanced/link.htm
new file mode 100644 (file)
index 0000000..b27af9b
--- /dev/null
@@ -0,0 +1,101 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_link_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/link.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body id="link" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertLink();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;">{$lang_insert_link_title}</a></span></li>\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+\r
+               <table border="0" cellpadding="4" cellspacing="0">\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="href">{$lang_insert_link_url}</label></td>\r
+            <td><table border="0" cellspacing="0" cellpadding="0"> \r
+                                 <tr> \r
+                                       <td><input id="href" name="href" type="text" value="" style="width: 200px" onchange="checkPrefix(this);" /></td> \r
+                                       <td id="hrefbrowsercontainer">&nbsp;</td>\r
+                                 </tr> \r
+                               </table></td>\r
+          </tr>\r
+                 <!-- Link list -->\r
+                 <script language="javascript">\r
+                       if (typeof(tinyMCELinkList) != "undefined" && tinyMCELinkList.length > 0) {\r
+                               var html = "";\r
+\r
+                               html += '<tr><td><label for="link_list">{$lang_link_list}</label></td>';\r
+                               html += '<td><select id="link_list" name="link_list" style="width: 200px" onchange="this.form.href.value=this.options[this.selectedIndex].value;">';\r
+                               html += '<option value="">---</option>';\r
+\r
+                               for (var i=0; i<tinyMCELinkList.length; i++)\r
+                                       html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>';\r
+\r
+                               html += '</select></td></tr>';\r
+\r
+                               document.write(html);\r
+                       }\r
+                 </script>\r
+                 <!-- /Link list -->\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="target">{$lang_insert_link_target}</label></td>\r
+            <td><select id="target" name="target" style="width: 200px">\r
+                <option value="_self">{$lang_insert_link_target_same}</option>\r
+                <option value="_blank">{$lang_insert_link_target_blank}</option>\r
+                               <script language="javascript">\r
+                                       var html = "";\r
+                                       var targets = tinyMCE.getParam('theme_advanced_link_targets', '').split(';');\r
+\r
+                                       for (var i=0; i<targets.length; i++) {\r
+                                               var key, value;\r
+\r
+                                               if (targets[i] == "")\r
+                                                       continue;\r
+\r
+                                               key = targets[i].split('=')[0];\r
+                                               value = targets[i].split('=')[1];\r
+\r
+                                               html += '<option value="' + value + '">' + key + '</option>';\r
+                                       }\r
+\r
+                                       document.write(html);\r
+                               </script>\r
+            </select></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="linktitle">{$lang_theme_insert_link_titlefield}</label></td>\r
+            <td><input id="linktitle" name="linktitle" type="text" value="" style="width: 200px"></td>\r
+          </tr>\r
+          <tr id="styleSelectRow">\r
+            <td><label for="styleSelect">{$lang_class_name}</label></td>\r
+            <td>\r
+                        <select id="styleSelect" name="styleSelect">\r
+                <option value="" selected>{$lang_theme_style_select}</option>\r
+             </select></td>\r
+          </tr>\r
+        </table>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertLink();" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/themes/advanced/source_editor.htm b/program/js/tiny_mce/themes/advanced/source_editor.htm
new file mode 100644 (file)
index 0000000..c3f80c4
--- /dev/null
@@ -0,0 +1,32 @@
+<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>{$lang_theme_code_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/source_editor.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('onLoadInit();');" onresize="resizeInputs();" style="display: none">\r
+       <form name="source" onsubmit="saveContent();" action="#">\r
+               <div style="float: left" class="title">{$lang_theme_code_title}</div>\r
+\r
+               <div id="wrapline" style="float: right">\r
+                       <input type="checkbox" name="wraped" id="wraped" onclick="toggleWordWrap(this);" class="wordWrapCode" /><label for="wraped">{$lang_theme_code_wordwrap}</label>\r
+               </div>\r
+\r
+               <br style="clear: both" />\r
+\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"></textarea>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" name="insert" value="{$lang_update}" onclick="saveContent();" id="insert" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/program/js/tiny_mce/tiny_mce.js b/program/js/tiny_mce/tiny_mce.js
new file mode 100644 (file)
index 0000000..ef60480
--- /dev/null
@@ -0,0 +1 @@
+function TinyMCE_Engine(){var ua;this.majorVersion="2";this.minorVersion="1.1.1";this.releaseDate="2007-05-14";this.instances=[];this.switchClassCache=[];this.windowArgs=[];this.loadedFiles=[];this.pendingFiles=[];this.loadingIndex=0;this.configs=[];this.currentConfig=0;this.eventHandlers=[];this.log=[];this.undoLevels=[];this.undoIndex=0;this.typingUndoIndex=-1;this.settings=[];ua=navigator.userAgent;this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.isMSIE5=this.isMSIE&&(ua.indexOf('MSIE 5')!=-1);this.isMSIE5_0=this.isMSIE&&(ua.indexOf('MSIE 5.0')!=-1);this.isMSIE7=this.isMSIE&&(ua.indexOf('MSIE 7')!=-1);this.isGecko=ua.indexOf('Gecko')!=-1;this.isSafari=ua.indexOf('Safari')!=-1;this.isOpera=window['opera']&&opera.buildNumber?true:false;this.isMac=ua.indexOf('Mac')!=-1;this.isNS7=ua.indexOf('Netscape/7')!=-1;this.isNS71=ua.indexOf('Netscape/7.1')!=-1;this.dialogCounter=0;this.plugins=[];this.themes=[];this.menus=[];this.loadedPlugins=[];this.buttonMap=[];this.isLoaded=false;if(this.isOpera){this.isMSIE=true;this.isGecko=false;this.isSafari=false}this.isIE=this.isMSIE;this.isRealIE=this.isMSIE&&!this.isOpera;this.idCounter=0};TinyMCE_Engine.prototype={init:function(settings){var theme,nl,baseHREF="",i,cssPath,entities,h,p,src,elements=[],head;if(this.isMSIE5_0)return;this.settings=settings;if(typeof(document.execCommand)=='undefined')return;if(!tinyMCE.baseURL){head=document.getElementsByTagName('head')[0];if(head){for(i=0,nl=head.getElementsByTagName('script');i<nl.length;i++)elements.push(nl[i])}for(i=0,nl=document.getElementsByTagName('script');i<nl.length;i++)elements.push(nl[i]);nl=document.getElementsByTagName('base');for(i=0;i<nl.length;i++){if(nl[i].href)baseHREF=nl[i].href}for(i=0;i<elements.length;i++){if(elements[i].src&&(elements[i].src.indexOf("tiny_mce.js")!=-1||elements[i].src.indexOf("tiny_mce_dev.js")!=-1||elements[i].src.indexOf("tiny_mce_src.js")!=-1||elements[i].src.indexOf("tiny_mce_gzip")!=-1)){src=elements[i].src;tinyMCE.srcMode=(src.indexOf('_src')!=-1||src.indexOf('_dev')!=-1)?'_src':'';tinyMCE.gzipMode=src.indexOf('_gzip')!=-1;src=src.substring(0,src.lastIndexOf('/'));if(settings.exec_mode=="src"||settings.exec_mode=="normal")tinyMCE.srcMode=settings.exec_mode=="src"?'_src':'';if(baseHREF!==''&&src.indexOf('://')==-1)tinyMCE.baseURL=baseHREF+src;else tinyMCE.baseURL=src;break}}}this.documentBasePath=document.location.href;if(this.documentBasePath.indexOf('?')!=-1)this.documentBasePath=this.documentBasePath.substring(0,this.documentBasePath.indexOf('?'));this.documentURL=this.documentBasePath;this.documentBasePath=this.documentBasePath.substring(0,this.documentBasePath.lastIndexOf('/'));if(tinyMCE.baseURL.indexOf('://')==-1&&tinyMCE.baseURL.charAt(0)!='/'){tinyMCE.baseURL=this.documentBasePath+"/"+tinyMCE.baseURL}this._def("mode","none");this._def("theme","advanced");this._def("plugins","",true);this._def("language","en");this._def("docs_language",this.settings.language);this._def("elements","");this._def("textarea_trigger","mce_editable");this._def("editor_selector","");this._def("editor_deselector","mceNoEditor");this._def("valid_elements","+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],cite[title|id|class|style|dir|lang],abbr[title|id|class|style|dir|lang],acronym[title|id|class|style|dir|lang],del[title|id|class|style|dir|lang|datetime|cite],ins[title|id|class|style|dir|lang|datetime|cite]");this._def("extended_valid_elements","");this._def("invalid_elements","");this._def("encoding","");this._def("urlconverter_callback",tinyMCE.getParam("urlconvertor_callback","TinyMCE_Engine.prototype.convertURL"));this._def("save_callback","");this._def("force_br_newlines",false);this._def("force_p_newlines",true);this._def("add_form_submit_trigger",true);this._def("relative_urls",true);this._def("remove_script_host",true);this._def("focus_alert",true);this._def("document_base_url",this.documentURL);this._def("visual",true);this._def("visual_table_class","mceVisualAid");this._def("setupcontent_callback","");this._def("fix_content_duplication",true);this._def("custom_undo_redo",true);this._def("custom_undo_redo_levels",-1);this._def("custom_undo_redo_keyboard_shortcuts",true);this._def("custom_undo_redo_restore_selection",true);this._def("custom_undo_redo_global",false);this._def("verify_html",true);this._def("apply_source_formatting",false);this._def("directionality","ltr");this._def("cleanup_on_startup",false);this._def("inline_styles",false);this._def("convert_newlines_to_brs",false);this._def("auto_reset_designmode",true);this._def("entities","39,#39,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,34,quot,38,amp,60,lt,62,gt,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",true);this._def("entity_encoding","named");this._def("cleanup_callback","");this._def("add_unload_trigger",true);this._def("ask",false);this._def("nowrap",false);this._def("auto_resize",false);this._def("auto_focus",false);this._def("cleanup",true);this._def("remove_linebreaks",true);this._def("button_tile_map",false);this._def("submit_patch",true);this._def("browsers","msie,safari,gecko,opera",true);this._def("dialog_type","window");this._def("accessibility_warnings",true);this._def("accessibility_focus",true);this._def("merge_styles_invalid_parents","");this._def("force_hex_style_colors",true);this._def("trim_span_elements",true);this._def("convert_fonts_to_spans",false);this._def("doctype",'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">');this._def("font_size_classes",'');this._def("font_size_style_values",'xx-small,x-small,small,medium,large,x-large,xx-large',true);this._def("event_elements",'a,img',true);this._def("convert_urls",true);this._def("table_inline_editing",false);this._def("object_resizing",true);this._def("custom_shortcuts",true);this._def("convert_on_click",false);this._def("content_css",'');this._def("fix_list_elements",true);this._def("fix_table_elements",false);this._def("strict_loading_mode",document.contentType=='application/xhtml+xml');this._def("hidden_tab_class",'');this._def("display_tab_class",'');this._def("gecko_spellcheck",false);this._def("hide_selects_on_submit",true);this._def("forced_root_block",false);this._def("remove_trailing_nbsp",false);if(this.isMSIE&&!this.isOpera)this.settings.strict_loading_mode=false;if(this.isMSIE&&this.settings.browsers.indexOf('msie')==-1)return;if(this.isGecko&&this.settings.browsers.indexOf('gecko')==-1)return;if(this.isSafari&&this.settings.browsers.indexOf('safari')==-1)return;if(this.isOpera&&this.settings.browsers.indexOf('opera')==-1)return;baseHREF=tinyMCE.settings.document_base_url;h=document.location.href;p=h.indexOf('://');if(p>0&&document.location.protocol!="file:"){p=h.indexOf('/',p+3);h=h.substring(0,p);if(baseHREF.indexOf('://')==-1)baseHREF=h+baseHREF;tinyMCE.settings.document_base_url=baseHREF;tinyMCE.settings.document_base_prefix=h}if(baseHREF.indexOf('?')!=-1)baseHREF=baseHREF.substring(0,baseHREF.indexOf('?'));this.settings.base_href=baseHREF.substring(0,baseHREF.lastIndexOf('/'))+"/";theme=this.settings.theme;this.inlineStrict='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';this.inlineTransitional='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';this.blockElms='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';this.blockRegExp=new RegExp("^("+this.blockElms+")$","i");this.posKeyCodes=[13,45,36,35,33,34,37,38,39,40];this.uniqueURL='javascript:void(091039730);';this.uniqueTag='<div id="mceTMPElement" style="display: none">TMP</div>';this.callbacks=['onInit','getInfo','getEditorTemplate','setupContent','onChange','onPageLoad','handleNodeChange','initInstance','execCommand','getControlHTML','handleEvent','cleanup','removeInstance'];this.settings.theme_href=tinyMCE.baseURL+"/themes/"+theme;if(!tinyMCE.isIE||tinyMCE.isOpera)this.settings.force_br_newlines=false;if(tinyMCE.getParam("popups_css",false)){cssPath=tinyMCE.getParam("popups_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings.popups_css=this.documentBasePath+"/"+cssPath;else this.settings.popups_css=cssPath}else this.settings.popups_css=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_popup.css";if(tinyMCE.getParam("editor_css",false)){cssPath=tinyMCE.getParam("editor_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings.editor_css=this.documentBasePath+"/"+cssPath;else this.settings.editor_css=cssPath}else{if(this.settings.editor_css!=='')this.settings.editor_css=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_ui.css"}if(this.configs.length==0){if(typeof(TinyMCECompressed)=="undefined"){tinyMCE.addEvent(window,"DOMContentLoaded",TinyMCE_Engine.prototype.onLoad);if(tinyMCE.isRealIE){if(document.body)tinyMCE.addEvent(document.body,"readystatechange",TinyMCE_Engine.prototype.onLoad);else tinyMCE.addEvent(document,"readystatechange",TinyMCE_Engine.prototype.onLoad)}tinyMCE.addEvent(window,"load",TinyMCE_Engine.prototype.onLoad);tinyMCE._addUnloadEvents()}}this.loadScript(tinyMCE.baseURL+'/themes/'+this.settings.theme+'/editor_template'+tinyMCE.srcMode+'.js');this.loadScript(tinyMCE.baseURL+'/langs/'+this.settings.language+'.js');this.loadCSS(this.settings.editor_css);p=tinyMCE.getParam('plugins','',true,',');if(p.length>0){for(i=0;i<p.length;i++){if(p[i].charAt(0)!='-')this.loadScript(tinyMCE.baseURL+'/plugins/'+p[i]+'/editor_plugin'+tinyMCE.srcMode+'.js')}}if(tinyMCE.getParam('entity_encoding')=='named'){settings.cleanup_entities=[];entities=tinyMCE.getParam('entities','',true,',');for(i=0;i<entities.length;i+=2)settings.cleanup_entities['c'+entities[i]]=entities[i+1]}settings.index=this.configs.length;this.configs[this.configs.length]=settings;this.loadNextScript();if(this.isIE&&!this.isOpera){try{document.execCommand('BackgroundImageCache',false,true)}catch(e){}}this.xmlEncodeRe=new RegExp('[<>&"]','g')},_addUnloadEvents:function(){var st=tinyMCE.settings.add_unload_trigger;if(tinyMCE.isIE){if(st){tinyMCE.addEvent(window,"unload",TinyMCE_Engine.prototype.unloadHandler);tinyMCE.addEvent(window.document,"beforeunload",TinyMCE_Engine.prototype.unloadHandler)}}else{if(st)tinyMCE.addEvent(window,"unload",function(){tinyMCE.triggerSave(true,true)})}},_def:function(key,def_val,t){var v=tinyMCE.getParam(key,def_val);v=t?v.replace(/\s+/g,""):v;this.settings[key]=v},hasPlugin:function(n){return typeof(this.plugins[n])!="undefined"&&this.plugins[n]!=null},addPlugin:function(n,p){var op=this.plugins[n];p.baseURL=op?op.baseURL:tinyMCE.baseURL+"/plugins/"+n;this.plugins[n]=p;this.loadNextScript()},setPluginBaseURL:function(n,u){var op=this.plugins[n];if(op)op.baseURL=u;else this.plugins[n]={baseURL:u}},loadPlugin:function(n,u){u=u.indexOf('.js')!=-1?u.substring(0,u.lastIndexOf('/')):u;u=u.charAt(u.length-1)=='/'?u.substring(0,u.length-1):u;this.plugins[n]={baseURL:u};this.loadScript(u+"/editor_plugin"+(tinyMCE.srcMode?'_src':'')+".js")},hasTheme:function(n){return typeof(this.themes[n])!="undefined"&&this.themes[n]!=null},addTheme:function(n,t){this.themes[n]=t;this.loadNextScript()},addMenu:function(n,m){this.menus[n]=m},hasMenu:function(n){return typeof(this.plugins[n])!="undefined"&&this.plugins[n]!=null},loadScript:function(url){var i;for(i=0;i<this.loadedFiles.length;i++){if(this.loadedFiles[i]==url)return}if(tinyMCE.settings.strict_loading_mode)this.pendingFiles[this.pendingFiles.length]=url;else document.write('<sc'+'ript language="javascript" type="text/javascript" src="'+url+'"></script>');this.loadedFiles[this.loadedFiles.length]=url},loadNextScript:function(){var d=document,se;if(!tinyMCE.settings.strict_loading_mode)return;if(this.loadingIndex<this.pendingFiles.length){se=d.createElementNS('http://www.w3.org/1999/xhtml','script');se.setAttribute('language','javascript');se.setAttribute('type','text/javascript');se.setAttribute('src',this.pendingFiles[this.loadingIndex++]);d.getElementsByTagName("head")[0].appendChild(se)}else this.loadingIndex=-1;},loadCSS:function(url){var ar=url.replace(/\s+/,'').split(',');var lflen=0,csslen=0,skip=false;var x=0,i=0,nl,le;for(x=0,csslen=ar.length;x<csslen;x++){if(ar[x]!=null&&ar[x]!='null'&&ar[x].length>0){for(i=0,lflen=this.loadedFiles.length;i<lflen;i++){if(this.loadedFiles[i]==ar[x]){skip=true;break}}if(!skip){if(tinyMCE.settings.strict_loading_mode){nl=document.getElementsByTagName("head");le=document.createElement('link');le.setAttribute('href',ar[x]);le.setAttribute('rel','stylesheet');le.setAttribute('type','text/css');nl[0].appendChild(le)}else document.write('<link href="'+ar[x]+'" rel="stylesheet" type="text/css" />');this.loadedFiles[this.loadedFiles.length]=ar[x]}}}},importCSS:function(doc,css){var css_ary=css.replace(/\s+/,'').split(',');var csslen,elm,headArr,x,css_file;for(x=0,csslen=css_ary.length;x<csslen;x++){css_file=css_ary[x];if(css_file!=null&&css_file!='null'&&css_file.length>0){if(css_file.indexOf('://')==-1&&css_file.charAt(0)!='/')css_file=this.documentBasePath+"/"+css_file;if(typeof(doc.createStyleSheet)=="undefined"){elm=doc.createElement("link");elm.rel="stylesheet";elm.href=css_file;if((headArr=doc.getElementsByTagName("head"))!=null&&headArr.length>0)headArr[0].appendChild(elm)}else doc.createStyleSheet(css_file)}}},confirmAdd:function(e,settings){var elm=tinyMCE.isIE?event.srcElement:e.target;var elementId=elm.name?elm.name:elm.id;tinyMCE.settings=settings;if(tinyMCE.settings.convert_on_click||(!elm.getAttribute('mce_noask')&&confirm(tinyMCELang.lang_edit_confirm)))tinyMCE.addMCEControl(elm,elementId);elm.setAttribute('mce_noask','true')},updateContent:function(form_element_name){var formElement,n,inst,doc;formElement=document.getElementById(form_element_name);for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();if(inst.formElement==formElement){doc=inst.getDoc();tinyMCE._setHTML(doc,inst.formElement.value);if(!tinyMCE.isIE)doc.body.innerHTML=tinyMCE._cleanupHTML(inst,doc,this.settings,doc.body,inst.visualAid)}}},addMCEControl:function(replace_element,form_element_name,target_document){var id="mce_editor_"+tinyMCE.idCounter++;var inst=new TinyMCE_Control(tinyMCE.settings);inst.editorId=id;this.instances[id]=inst;inst._onAdd(replace_element,form_element_name,target_document)},removeInstance:function(ti){var t=[],n,i;for(n in tinyMCE.instances){i=tinyMCE.instances[n];if(tinyMCE.isInstance(i)&&ti!=i)t[n]=i}tinyMCE.instances=t;n=[];t=tinyMCE.undoLevels;for(i=0;i<t.length;i++){if(t[i]!=ti)n.push(t[i])}tinyMCE.undoLevels=n;tinyMCE.undoIndex=n.length;tinyMCE.dispatchCallback(ti,'remove_instance_callback','removeInstance',ti);return ti},removeMCEControl:function(editor_id){var inst=tinyMCE.getInstanceById(editor_id),h,re,ot,tn;if(inst){inst.switchSettings();editor_id=inst.editorId;h=tinyMCE.getContent(editor_id);this.removeInstance(inst);tinyMCE.selectedElement=null;tinyMCE.selectedInstance=null;re=document.getElementById(editor_id+"_parent");ot=inst.oldTargetElement;tn=ot.nodeName.toLowerCase();if(tn=="textarea"||tn=="input"){re.parentNode.removeChild(re);ot.style.display="inline";ot.value=h}else{ot.innerHTML=h;ot.style.display='block';re.parentNode.insertBefore(ot,re);re.parentNode.removeChild(re)}}},triggerSave:function(skip_cleanup,skip_callback){var inst,n;if(typeof(skip_cleanup)=="undefined")skip_cleanup=false;if(typeof(skip_callback)=="undefined")skip_callback=false;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.triggerSave(skip_cleanup,skip_callback)}},resetForm:function(form_index){var i,inst,n,formObj=document.forms[form_index];for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();for(i=0;i<formObj.elements.length;i++){if(inst.formTargetElementId==formObj.elements[i].name)inst.getBody().innerHTML=inst.startContent}}},execInstanceCommand:function(editor_id,command,user_interface,value,focus){var inst=tinyMCE.getInstanceById(editor_id),r;if(inst){r=inst.selection.getRng();if(typeof(focus)=="undefined")focus=true;if(focus&&(!r||!r.item))inst.contentWindow.focus();inst.autoResetDesignMode();this.selectedElement=inst.getFocusElement();inst.select();tinyMCE.execCommand(command,user_interface,value);if(tinyMCE.isIE&&window.event!=null)tinyMCE.cancelEvent(window.event)}},execCommand:function(command,user_interface,value){var inst=tinyMCE.selectedInstance,n,pe,te;user_interface=user_interface?user_interface:false;value=value?value:null;if(inst)inst.switchSettings();switch(command){case"Undo":if(this.getParam('custom_undo_redo_global')){if(this.undoIndex>0){tinyMCE.nextUndoRedoAction='Undo';inst=this.undoLevels[--this.undoIndex];inst.select();if(!tinyMCE.nextUndoRedoInstanceId)inst.execCommand('Undo')}}else inst.execCommand('Undo');return true;case"Redo":if(this.getParam('custom_undo_redo_global')){if(this.undoIndex<=this.undoLevels.length-1){tinyMCE.nextUndoRedoAction='Redo';inst=this.undoLevels[this.undoIndex++];inst.select();if(!tinyMCE.nextUndoRedoInstanceId)inst.execCommand('Redo')}}else inst.execCommand('Redo');return true;case'mceFocus':inst=tinyMCE.getInstanceById(value);if(inst)inst.getWin().focus();return;case"mceAddControl":case"mceAddEditor":tinyMCE.addMCEControl(tinyMCE._getElementById(value),value);return;case"mceAddFrameControl":tinyMCE.addMCEControl(tinyMCE._getElementById(value.element,value.document),value.element,value.document);return;case"mceRemoveControl":case"mceRemoveEditor":tinyMCE.removeMCEControl(value);return;case"mceToggleEditor":inst=tinyMCE.getInstanceById(value);if(inst){pe=document.getElementById(inst.editorId+'_parent');te=inst.oldTargetElement;if(typeof(inst.enabled)=='undefined')inst.enabled=true;inst.enabled=!inst.enabled;if(!inst.enabled){pe.style.display='none';if(te.nodeName=='TEXTAREA'||te.nodeName=='INPUT')te.value=inst.getHTML();else te.innerHTML=inst.getHTML();te.style.display=inst.oldTargetDisplay;tinyMCE.dispatchCallback(inst,'hide_instance_callback','hideInstance',inst)}else{pe.style.display='block';te.style.display='none';if(te.nodeName=='TEXTAREA'||te.nodeName=='INPUT')inst.setHTML(te.value);else inst.setHTML(te.innerHTML);inst.useCSS=false;tinyMCE.dispatchCallback(inst,'show_instance_callback','showInstance',inst)}}else tinyMCE.addMCEControl(tinyMCE._getElementById(value),value);return;case"mceResetDesignMode":if(tinyMCE.isGecko){for(n in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[n]))continue;try{tinyMCE.instances[n].getDoc().designMode="off";tinyMCE.instances[n].getDoc().designMode="on";tinyMCE.instances[n].useCSS=false}catch(e){}}}return}if(inst){inst.execCommand(command,user_interface,value)}else if(tinyMCE.settings.focus_alert)alert(tinyMCELang.lang_focus_alert)},_createIFrame:function(replace_element,doc,win){var iframe,id=replace_element.getAttribute("id");var aw,ah;if(typeof(doc)=="undefined")doc=document;if(typeof(win)=="undefined")win=window;iframe=doc.createElement("iframe");aw=""+tinyMCE.settings.area_width;ah=""+tinyMCE.settings.area_height;if(aw.indexOf('%')==-1){aw=parseInt(aw);aw=(isNaN(aw)||aw<0)?300:aw;aw=aw+"px"}if(ah.indexOf('%')==-1){ah=parseInt(ah);ah=(isNaN(ah)||ah<0)?240:ah;ah=ah+"px"}iframe.setAttribute("id",id);iframe.setAttribute("name",id);iframe.setAttribute("class","mceEditorIframe");iframe.setAttribute("border","0");iframe.setAttribute("frameBorder","0");iframe.setAttribute("marginWidth","0");iframe.setAttribute("marginHeight","0");iframe.setAttribute("leftMargin","0");iframe.setAttribute("topMargin","0");iframe.setAttribute("width",aw);iframe.setAttribute("height",ah);iframe.setAttribute("allowtransparency","true");iframe.className='mceEditorIframe';if(tinyMCE.settings.auto_resize)iframe.setAttribute("scrolling","no");if(tinyMCE.isRealIE)iframe.setAttribute("src",this.settings.default_document);iframe.style.width=aw;iframe.style.height=ah;if(tinyMCE.settings.strict_loading_mode)iframe.style.marginBottom='-5px';if(tinyMCE.isRealIE)replace_element.outerHTML=iframe.outerHTML;else replace_element.parentNode.replaceChild(iframe,replace_element);if(tinyMCE.isRealIE)return win.frames[id];else return iframe},setupContent:function(editor_id){var inst=tinyMCE.instances[editor_id],i,doc=inst.getDoc(),head=doc.getElementsByTagName('head').item(0);var content=inst.startContent,contentElement,body;if(tinyMCE.settings.strict_loading_mode){content=content.replace(/&lt;/g,'<');content=content.replace(/&gt;/g,'>');content=content.replace(/&quot;/g,'"');content=content.replace(/&amp;/g,'&')}tinyMCE.selectedInstance=inst;inst.switchSettings();if(!tinyMCE.isIE&&tinyMCE.getParam("setupcontent_reload",false)&&doc.title!="blank_page"){try{doc.location.href=tinyMCE.baseURL+"/blank.htm"}catch(ex){}window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",1000);return}if(!head||!doc.body){window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",10);return}tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/themes/"+inst.settings.theme+"/css/editor_content.css");tinyMCE.importCSS(inst.getDoc(),inst.settings.content_css);tinyMCE.dispatchCallback(inst,'init_instance_callback','initInstance',inst);if(tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')){inst.addShortcut('ctrl','z','lang_undo_desc','Undo');inst.addShortcut('ctrl','y','lang_redo_desc','Redo')}for(i=1;i<=6;i++)inst.addShortcut('ctrl',''+i,'','FormatBlock',false,'<h'+i+'>');inst.addShortcut('ctrl','7','','FormatBlock',false,'<p>');inst.addShortcut('ctrl','8','','FormatBlock',false,'<div>');inst.addShortcut('ctrl','9','','FormatBlock',false,'<address>');if(tinyMCE.isGecko){inst.addShortcut('ctrl','b','lang_bold_desc','Bold');inst.addShortcut('ctrl','i','lang_italic_desc','Italic');inst.addShortcut('ctrl','u','lang_underline_desc','Underline')}if(tinyMCE.getParam("convert_fonts_to_spans"))inst.getBody().setAttribute('id','mceSpanFonts');if(tinyMCE.settings.nowrap)doc.body.style.whiteSpace="nowrap";doc.body.dir=this.settings.directionality;doc.editorId=editor_id;if(!tinyMCE.isIE)doc.documentElement.editorId=editor_id;inst.setBaseHREF(tinyMCE.settings.base_href);if(tinyMCE.settings.convert_newlines_to_brs){content=tinyMCE.regexpReplace(content,"\r\n","<br />","gi");content=tinyMCE.regexpReplace(content,"\r","<br />","gi");content=tinyMCE.regexpReplace(content,"\n","<br />","gi")}content=tinyMCE.storeAwayURLs(content);content=tinyMCE._customCleanup(inst,"insert_to_editor",content);if(tinyMCE.isIE){window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["'+editor_id+'"].getDoc(), "'+editor_id+'");}catch(e){}',500);if(tinyMCE.settings.force_br_newlines)doc.styleSheets[0].addRule("p","margin: 0;");body=inst.getBody();body.editorId=editor_id}content=tinyMCE.cleanupHTMLCode(content);if(!tinyMCE.isIE){contentElement=inst.getDoc().createElement("body");doc=inst.getDoc();contentElement.innerHTML=content;if(tinyMCE.settings.cleanup_on_startup)tinyMCE.setInnerHTML(inst.getBody(),tinyMCE._cleanupHTML(inst,doc,this.settings,contentElement));else tinyMCE.setInnerHTML(inst.getBody(),content);tinyMCE.convertAllRelativeURLs(inst.getBody())}else{if(tinyMCE.settings.cleanup_on_startup){tinyMCE._setHTML(inst.getDoc(),content);try{tinyMCE.setInnerHTML(inst.getBody(),tinyMCE._cleanupHTML(inst,inst.contentDocument,this.settings,inst.getBody()))}catch(e){}}else tinyMCE._setHTML(inst.getDoc(),content)}tinyMCE.handleVisualAid(inst.getBody(),true,tinyMCE.settings.visual,inst);tinyMCE.dispatchCallback(inst,'setupcontent_callback','setupContent',editor_id,inst.getBody(),inst.getDoc());if(!tinyMCE.isIE)tinyMCE.addEventHandlers(inst);if(tinyMCE.isIE){tinyMCE.addEvent(inst.getBody(),"blur",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(inst.getBody(),"beforedeactivate",TinyMCE_Engine.prototype._eventPatch);if(!tinyMCE.isOpera){tinyMCE.addEvent(doc.body,"mousemove",TinyMCE_Engine.prototype.onMouseMove);tinyMCE.addEvent(doc.body,"beforepaste",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(doc.body,"drop",TinyMCE_Engine.prototype._eventPatch)}}inst.select();tinyMCE.selectedElement=inst.contentWindow.document.body;tinyMCE._customCleanup(inst,"insert_to_editor_dom",inst.getBody());tinyMCE._customCleanup(inst,"setup_content_dom",inst.getBody());tinyMCE._setEventsEnabled(inst.getBody(),false);tinyMCE.cleanupAnchors(inst.getDoc());if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(inst.getDoc());inst.startContent=tinyMCE.trim(inst.getBody().innerHTML);inst.undoRedo.add({content:inst.startContent});if(tinyMCE.isGecko){tinyMCE.selectNodes(inst.getBody(),function(n){if(n.nodeType==3||n.nodeType==8)n.nodeValue=n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"','gi'),"");return false})}if(tinyMCE.isGecko)inst.getBody().spellcheck=tinyMCE.getParam("gecko_spellcheck");tinyMCE._removeInternal(inst.getBody());inst.select();tinyMCE.triggerNodeChange(false,true)},storeAwayURLs:function(s){if(!s.match(/(mce_src|mce_href)/gi,s)){s=s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"','gi'),'src="$1" mce_src="$1"');s=s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"','gi'),'href="$1" mce_href="$1"')}return s},_removeInternal:function(n){if(tinyMCE.isGecko){tinyMCE.selectNodes(n,function(n){if(n.nodeType==3||n.nodeType==8)n.nodeValue=n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"','gi'),"");return false})}},removeTinyMCEFormElements:function(form_obj){var i,elementId;if(!tinyMCE.getParam('hide_selects_on_submit'))return;if(typeof(form_obj)=="undefined"||form_obj==null)return;if(form_obj.nodeName!="FORM"){if(form_obj.form)form_obj=form_obj.form;else form_obj=tinyMCE.getParentElement(form_obj,"form")}if(form_obj==null)return;for(i=0;i<form_obj.elements.length;i++){elementId=form_obj.elements[i].name?form_obj.elements[i].name:form_obj.elements[i].id;if(elementId.indexOf('mce_editor_')==0)form_obj.elements[i].disabled=true}},handleEvent:function(e){var inst=tinyMCE.selectedInstance,i,elm,keys;if(typeof(tinyMCE)=="undefined")return true;if(tinyMCE.executeCallback(tinyMCE.selectedInstance,'handle_event_callback','handleEvent',e))return false;switch(e.type){case"beforedeactivate":case"blur":if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.execCommand('mceEndTyping');tinyMCE.hideMenus();return;case"drop":case"beforepaste":if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.setBaseHREF(null);if(tinyMCE.isRealIE){var ife=tinyMCE.selectedInstance.iframeElement;if(ife.style.height.indexOf('%')!=-1){ife._oldHeight=ife.style.height;ife.style.height=ife.clientHeight}}window.setTimeout("tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings.base_href);tinyMCE._resetIframeHeight();",1);return;case"submit":tinyMCE.formSubmit(tinyMCE.isMSIE?window.event.srcElement:e.target);return;case"reset":var formObj=tinyMCE.isIE?window.event.srcElement:e.target;for(i=0;i<document.forms.length;i++){if(document.forms[i]==formObj)window.setTimeout('tinyMCE.resetForm('+i+');',10)}return;case"keypress":if(inst&&inst.handleShortcut(e))return false;if(e.target.editorId){tinyMCE.instances[e.target.editorId].select()}else{if(e.target.ownerDocument.editorId)tinyMCE.instances[e.target.ownerDocument.editorId].select()}if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();if((tinyMCE.isGecko||tinyMCE.isOpera||tinyMCE.isSafari)&&tinyMCE.settings.force_p_newlines&&e.keyCode==13&&!e.shiftKey){if(TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance,e)){tinyMCE.execCommand("mceAddUndoLevel");return tinyMCE.cancelEvent(e)}}if((tinyMCE.isGecko&&!tinyMCE.isSafari)&&tinyMCE.settings.force_p_newlines&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance,e.type)){tinyMCE.execCommand("mceAddUndoLevel");return tinyMCE.cancelEvent(e)}}if(tinyMCE.isIE&&tinyMCE.settings.force_br_newlines&&e.keyCode==13){if(e.target.editorId)tinyMCE.instances[e.target.editorId].select();if(tinyMCE.selectedInstance){var sel=tinyMCE.selectedInstance.getDoc().selection;var rng=sel.createRange();if(tinyMCE.getParentElement(rng.parentElement(),"li")!=null)return false;e.returnValue=false;e.cancelBubble=true;rng.pasteHTML("<br />");rng.collapse(false);rng.select();tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.triggerNodeChange(false);return false}}if(e.keyCode==8||e.keyCode==46){tinyMCE.selectedElement=e.target;tinyMCE.linkElement=tinyMCE.getParentElement(e.target,"a");tinyMCE.imgElement=tinyMCE.getParentElement(e.target,"img");tinyMCE.triggerNodeChange(false)}return false;case"keyup":case"keydown":tinyMCE.hideMenus();tinyMCE.hasMouseMoved=false;if(inst&&inst.handleShortcut(e))return false;inst._fixRootBlocks();if(inst.settings.remove_trailing_nbsp)inst._fixTrailingNbsp();if(e.target.editorId)tinyMCE.instances[e.target.editorId].select();if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();inst=tinyMCE.selectedInstance;if(tinyMCE.isGecko&&tinyMCE.settings.force_p_newlines&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance,e.type)){tinyMCE.execCommand("mceAddUndoLevel");e.preventDefault();return false}}tinyMCE.selectedElement=null;tinyMCE.selectedNode=null;elm=tinyMCE.selectedInstance.getFocusElement();tinyMCE.linkElement=tinyMCE.getParentElement(elm,"a");tinyMCE.imgElement=tinyMCE.getParentElement(elm,"img");tinyMCE.selectedElement=elm;if(tinyMCE.isGecko&&e.type=="keyup"&&e.keyCode==9)tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(),true,tinyMCE.settings.visual,tinyMCE.selectedInstance);if(tinyMCE.isIE&&e.type=="keydown"&&e.keyCode==13)tinyMCE.enterKeyElement=tinyMCE.selectedInstance.getFocusElement();if(tinyMCE.isIE&&e.type=="keyup"&&e.keyCode==13){elm=tinyMCE.enterKeyElement;if(elm){var re=new RegExp('^HR|IMG|BR$','g');var dre=new RegExp('^H[1-6]$','g');if(!elm.hasChildNodes()&&!re.test(elm.nodeName)){if(dre.test(elm.nodeName))elm.innerHTML="&nbsp;&nbsp;";else elm.innerHTML="&nbsp;"}}}keys=tinyMCE.posKeyCodes;var posKey=false;for(i=0;i<keys.length;i++){if(keys[i]==e.keyCode){posKey=true;break}}if(tinyMCE.isIE&&tinyMCE.settings.custom_undo_redo){keys=[8,46];for(i=0;i<keys.length;i++){if(keys[i]==e.keyCode){if(e.type=="keyup")tinyMCE.triggerNodeChange(false)}}}if(e.keyCode==17)return true;if(tinyMCE.isGecko){if(!posKey&&e.type=="keyup"&&!e.ctrlKey||(e.ctrlKey&&(e.keyCode==86||e.keyCode==88)))tinyMCE.execCommand("mceStartTyping")}else{if(!posKey&&e.type=="keyup")tinyMCE.execCommand("mceStartTyping")}if(e.type=="keydown"&&(posKey||e.ctrlKey)&&inst)inst.undoBookmark=inst.selection.getBookmark();if(e.type=="keyup"&&(posKey||e.ctrlKey))tinyMCE.execCommand("mceEndTyping");if(posKey&&e.type=="keyup")tinyMCE.triggerNodeChange(false);if(tinyMCE.isIE&&e.ctrlKey)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);break;case"mousedown":case"mouseup":case"click":case"dblclick":case"focus":tinyMCE.hideMenus();if(tinyMCE.selectedInstance){tinyMCE.selectedInstance.switchSettings();tinyMCE.selectedInstance.isFocused=true}var targetBody=tinyMCE.getParentElement(e.target,"html");for(var instanceName in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[instanceName]))continue;inst=tinyMCE.instances[instanceName];inst.autoResetDesignMode();if(inst.getBody().parentNode==targetBody){inst.select();tinyMCE.selectedElement=e.target;tinyMCE.linkElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"a");tinyMCE.imgElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"img");break}}if(!tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark&&(e.type=="mouseup"||e.type=="dblclick"))tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark=tinyMCE.selectedInstance.selection.getBookmark();if(e.type!="focus")tinyMCE.selectedNode=null;tinyMCE.triggerNodeChange(false);tinyMCE.execCommand("mceEndTyping");if(e.type=="mouseup")tinyMCE.execCommand("mceAddUndoLevel");if(!tinyMCE.selectedInstance&&e.target.editorId)tinyMCE.instances[e.target.editorId].select();return false}},getButtonHTML:function(id,lang,img,cmd,ui,val){var h='',m,x,io='';cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+cmd+'\'';if(typeof(ui)!="undefined"&&ui!=null)cmd+=','+ui;if(typeof(val)!="undefined"&&val!=null)cmd+=",'"+val+"'";cmd+=');';if(tinyMCE.isRealIE)io='onmouseover="tinyMCE.lastHover = this;"';if(tinyMCE.getParam('button_tile_map')&&(!tinyMCE.isIE||tinyMCE.isOpera)&&(m=this.buttonMap[id])!=null&&(tinyMCE.getParam("language")=="en"||img.indexOf('$lang')==-1)){x=0-(m*20)==0?'0':0-(m*20);h+='<a id="{$editor_id}_'+id+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" '+io+' class="mceTiledButton mceButtonNormal" target="_self">';h+='<img src="{$themeurl}/images/spacer.gif" style="background-position: '+x+'px 0" alt="{$'+lang+'}" title="{$'+lang+'}" />';h+='</a>'}else{h+='<a id="{$editor_id}_'+id+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" '+io+' class="mceButtonNormal" target="_self">';h+='<img src="'+img+'" alt="{$'+lang+'}" title="{$'+lang+'}" />';h+='</a>'}return h},getMenuButtonHTML:function(id,lang,img,mcmd,cmd,ui,val){var h='',m,x;mcmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+mcmd+'\');';cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+cmd+'\'';if(typeof(ui)!="undefined"&&ui!=null)cmd+=','+ui;if(typeof(val)!="undefined"&&val!=null)cmd+=",'"+val+"'";cmd+=');';if(tinyMCE.getParam('button_tile_map')&&(!tinyMCE.isIE||tinyMCE.isOpera)&&(m=tinyMCE.buttonMap[id])!=null&&(tinyMCE.getParam("language")=="en"||img.indexOf('$lang')==-1)){x=0-(m*20)==0?'0':0-(m*20);if(tinyMCE.isRealIE)h+='<span id="{$editor_id}_'+id+'" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';else h+='<span id="{$editor_id}_'+id+'" class="mceMenuButton">';h+='<a href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" class="mceTiledButton mceMenuButtonNormal" target="_self">';h+='<img src="{$themeurl}/images/spacer.gif" style="width: 20px; height: 20px; background-position: '+x+'px 0" title="{$'+lang+'}" /></a>';h+='<a href="javascript:'+mcmd+'" onclick="'+mcmd+'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$'+lang+'}" class="mceMenuButton" />';h+='</a></span>'}else{if(tinyMCE.isRealIE)h+='<span id="{$editor_id}_'+id+'" dir="ltr" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';else h+='<span id="{$editor_id}_'+id+'" dir="ltr" class="mceMenuButton">';h+='<a href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" class="mceMenuButtonNormal" target="_self">';h+='<img src="'+img+'" title="{$'+lang+'}" /></a>';h+='<a href="javascript:'+mcmd+'" onclick="'+mcmd+'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$'+lang+'}" class="mceMenuButton" />';h+='</a></span>'}return h},_menuButtonEvent:function(e,o){if(o.className=='mceMenuButtonFocus')return;if(e=='over')o.className=o.className+' mceMenuHover';else o.className=o.className.replace(/\s.*$/,'')},addButtonMap:function(m){var i,a=m.replace(/\s+/,'').split(',');for(i=0;i<a.length;i++)this.buttonMap[a[i]]=i},formSubmit:function(f,p){var n,inst,found=false;if(f.form)f=f.form;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(inst.formElement){if(f==inst.formElement.form){found=true;inst.isNotDirty=true}}}if(found){tinyMCE.removeTinyMCEFormElements(f);tinyMCE.triggerSave()}if(f.mceOldSubmit&&p)f.mceOldSubmit()},submitPatch:function(){tinyMCE.formSubmit(this,true)},onLoad:function(){var r,i,c,mode,trigger,elements,element,settings,elementId,elm;var selector,deselector,elementRefAr,form;if(tinyMCE.settings.strict_loading_mode&&this.loadingIndex!=-1){window.setTimeout('tinyMCE.onLoad();',1);return}if(tinyMCE.isRealIE&&window.event.type=="readystatechange"&&document.readyState!="complete")return true;if(tinyMCE.isLoaded)return true;tinyMCE.isLoaded=true;if(tinyMCE.isRealIE&&document.body&&window.location.href!=window.top.location.href){r=document.body.createTextRange();r.collapse(true);r.select()}tinyMCE.dispatchCallback(null,'onpageload','onPageLoad');for(c=0;c<tinyMCE.configs.length;c++){tinyMCE.settings=tinyMCE.configs[c];selector=tinyMCE.getParam("editor_selector");deselector=tinyMCE.getParam("editor_deselector");elementRefAr=[];if(document.forms&&tinyMCE.settings.add_form_submit_trigger&&!tinyMCE.submitTriggers){for(i=0;i<document.forms.length;i++){form=document.forms[i];tinyMCE.addEvent(form,"submit",TinyMCE_Engine.prototype.handleEvent);tinyMCE.addEvent(form,"reset",TinyMCE_Engine.prototype.handleEvent);tinyMCE.submitTriggers=true;if(tinyMCE.settings.submit_patch){try{form.mceOldSubmit=form.submit;form.submit=TinyMCE_Engine.prototype.submitPatch}catch(e){}}}}mode=tinyMCE.settings.mode;switch(mode){case"exact":elements=tinyMCE.getParam('elements','',true,',');for(i=0;i<elements.length;i++){element=tinyMCE._getElementById(elements[i]);trigger=element?element.getAttribute(tinyMCE.settings.textarea_trigger):"";if(new RegExp('\\b'+deselector+'\\b').test(tinyMCE.getAttrib(element,"class")))continue;if(trigger=="false")continue;if((tinyMCE.settings.ask||tinyMCE.settings.convert_on_click)&&element){elementRefAr[elementRefAr.length]=element;continue}if(element)tinyMCE.addMCEControl(element,elements[i])}break;case"specific_textareas":case"textareas":elements=document.getElementsByTagName("textarea");for(i=0;i<elements.length;i++){elm=elements.item(i);trigger=elm.getAttribute(tinyMCE.settings.textarea_trigger);if(selector!==''&&!new RegExp('\\b'+selector+'\\b').test(tinyMCE.getAttrib(elm,"class")))continue;if(selector!=='')trigger=selector!==''?"true":"";if(new RegExp('\\b'+deselector+'\\b').test(tinyMCE.getAttrib(elm,"class")))continue;if((mode=="specific_textareas"&&trigger=="true")||(mode=="textareas"&&trigger!="false"))elementRefAr[elementRefAr.length]=elm}break}for(i=0;i<elementRefAr.length;i++){element=elementRefAr[i];elementId=element.name?element.name:element.id;if(tinyMCE.settings.ask||tinyMCE.settings.convert_on_click){if(tinyMCE.isGecko){settings=tinyMCE.settings;tinyMCE.addEvent(element,"focus",function(e){window.setTimeout(function(){TinyMCE_Engine.prototype.confirmAdd(e,settings)},10)});if(element.nodeName!="TEXTAREA"&&element.nodeName!="INPUT")tinyMCE.addEvent(element,"click",function(e){window.setTimeout(function(){TinyMCE_Engine.prototype.confirmAdd(e,settings)},10)});}else{settings=tinyMCE.settings;tinyMCE.addEvent(element,"focus",function(){TinyMCE_Engine.prototype.confirmAdd(null,settings)});tinyMCE.addEvent(element,"click",function(){TinyMCE_Engine.prototype.confirmAdd(null,settings)});}}else tinyMCE.addMCEControl(element,elementId)}if(tinyMCE.settings.auto_focus){window.setTimeout(function(){var inst=tinyMCE.getInstanceById(tinyMCE.settings.auto_focus);inst.selection.selectNode(inst.getBody(),true,true);inst.contentWindow.focus()},100)}tinyMCE.dispatchCallback(null,'oninit','onInit')}},isInstance:function(o){return o!=null&&typeof(o)=="object"&&o.isTinyMCE_Control},getParam:function(name,default_value,strip_whitespace,split_chr){var i,outArray,value=(typeof(this.settings[name])=="undefined")?default_value:this.settings[name];if(value=="true"||value=="false")return(value=="true");if(strip_whitespace)value=tinyMCE.regexpReplace(value,"[ \t\r\n]","");if(typeof(split_chr)!="undefined"&&split_chr!=null){value=value.split(split_chr);outArray=[];for(i=0;i<value.length;i++){if(value[i]&&value[i]!=='')outArray[outArray.length]=value[i]}value=outArray}return value},getLang:function(name,default_value,parse_entities,va){var v=(typeof(tinyMCELang[name])=="undefined")?default_value:tinyMCELang[name],n;if(parse_entities)v=tinyMCE.entityDecode(v);if(va){for(n in va)v=this.replaceVar(v,n,va[n])}return v},entityDecode:function(s){var e=document.createElement("div");e.innerHTML=s;return!e.firstChild?s:e.firstChild.nodeValue},addToLang:function(prefix,ar){var k;for(k in ar){if(typeof(ar[k])=='function')continue;tinyMCELang[(k.indexOf('lang_')==-1?'lang_':'')+(prefix!==''?(prefix+"_"):'')+k]=ar[k]}this.loadNextScript()},triggerNodeChange:function(focus,setup_content){var elm,inst,editorId,undoIndex=-1,undoLevels=-1,doc,anySelection=false,st;if(tinyMCE.selectedInstance){inst=tinyMCE.selectedInstance;elm=(typeof(setup_content)!="undefined"&&setup_content)?tinyMCE.selectedElement:inst.getFocusElement();editorId=inst.editorId;st=inst.selection.getSelectedText();if(tinyMCE.settings.auto_resize)inst.resizeToContent();if(setup_content&&tinyMCE.isGecko&&inst.isHidden())elm=inst.getBody();inst.switchSettings();if(tinyMCE.selectedElement)anySelection=(tinyMCE.selectedElement.nodeName.toLowerCase()=="img")||(st&&st.length>0);if(tinyMCE.settings.custom_undo_redo){undoIndex=inst.undoRedo.undoIndex;undoLevels=inst.undoRedo.undoLevels.length}tinyMCE.dispatchCallback(inst,'handle_node_change_callback','handleNodeChange',editorId,elm,undoIndex,undoLevels,inst.visualAid,anySelection,setup_content)}if(this.selectedInstance&&(typeof(focus)=="undefined"||focus))this.selectedInstance.contentWindow.focus()},_customCleanup:function(inst,type,content){var pl,po,i,customCleanup;customCleanup=tinyMCE.settings.cleanup_callback;if(customCleanup!='')content=tinyMCE.resolveDots(tinyMCE.settings.cleanup_callback,window)(type,content,inst);po=tinyMCE.themes[tinyMCE.settings.theme];if(po&&po.cleanup)content=po.cleanup(type,content,inst);pl=inst.plugins;for(i=0;i<pl.length;i++){po=tinyMCE.plugins[pl[i]];if(po&&po.cleanup)content=po.cleanup(type,content,inst)}return content},setContent:function(h){if(tinyMCE.selectedInstance){tinyMCE.selectedInstance.execCommand('mceSetContent',false,h);tinyMCE.selectedInstance.repaint()}},importThemeLanguagePack:function(name){if(typeof(name)=="undefined")name=tinyMCE.settings.theme;tinyMCE.loadScript(tinyMCE.baseURL+'/themes/'+name+'/langs/'+tinyMCE.settings.language+'.js')},importPluginLanguagePack:function(name){var b=tinyMCE.baseURL+'/plugins/'+name;if(this.plugins[name])b=this.plugins[name].baseURL;tinyMCE.loadScript(b+'/langs/'+tinyMCE.settings.language+'.js')},applyTemplate:function(h,ag){return h.replace(new RegExp('\\{\\$([a-z0-9_]+)\\}','gi'),function(m,s){if(s.indexOf('lang_')==0&&tinyMCELang[s])return tinyMCELang[s];if(ag&&ag[s])return ag[s];if(tinyMCE.settings[s])return tinyMCE.settings[s];if(m=='themeurl')return tinyMCE.themeURL;return m})},replaceVar:function(h,r,v){return h.replace(new RegExp('{\\\$'+r+'}','g'),v)},openWindow:function(template,args){var html,width,height,x,y,resizable,scrollbars,url,name,win,modal,features;args=!args?{}:args;args.mce_template_file=template.file;args.mce_width=template.width;args.mce_height=template.height;tinyMCE.windowArgs=args;html=template.html;if(!(width=parseInt(template.width)))width=320;if(!(height=parseInt(template.height)))height=200;if(tinyMCE.isIE)height+=40;else height+=20;x=parseInt(screen.width/ 2.0) - (width /2.0);y=parseInt(screen.height/ 2.0) - (height /2.0);resizable=(args&&args.resizable)?args.resizable:"no";scrollbars=(args&&args.scrollbars)?args.scrollbars:"no";if(template.file.charAt(0)!='/'&&template.file.indexOf('://')==-1)url=tinyMCE.baseURL+"/themes/"+tinyMCE.getParam("theme")+"/"+template.file;else url=template.file;for(name in args){if(typeof(args[name])=='function')continue;url=tinyMCE.replaceVar(url,name,escape(args[name]))}if(html){html=tinyMCE.replaceVar(html,"css",this.settings.popups_css);html=tinyMCE.applyTemplate(html,args);win=window.open("","mcePopup"+new Date().getTime(),"top="+y+",left="+x+",scrollbars="+scrollbars+",dialog=yes,minimizable="+resizable+",modal=yes,width="+width+",height="+height+",resizable="+resizable);if(win==null){alert(tinyMCELang.lang_popup_blocked);return}win.document.write(html);win.document.close();win.resizeTo(width,height);win.focus()}else{if((tinyMCE.isRealIE)&&resizable!='yes'&&tinyMCE.settings.dialog_type=="modal"){height+=10;features="resizable:"+resizable+";scroll:"+scrollbars+";status:yes;center:yes;help:no;dialogWidth:"+width+"px;dialogHeight:"+height+"px;";window.showModalDialog(url,window,features)}else{modal=(resizable=="yes")?"no":"yes";if(tinyMCE.isGecko&&tinyMCE.isMac)modal="no";if(template.close_previous!="no")try{tinyMCE.lastWindow.close()}catch(ex){}win=window.open(url,"mcePopup"+new Date().getTime(),"top="+y+",left="+x+",scrollbars="+scrollbars+",dialog="+modal+",minimizable="+resizable+",modal="+modal+",width="+width+",height="+height+",resizable="+resizable);if(win==null){alert(tinyMCELang.lang_popup_blocked);return}if(template.close_previous!="no")tinyMCE.lastWindow=win;try{win.resizeTo(width,height)}catch(e){}if(tinyMCE.isGecko){if(win.document.defaultView.statusbar.visible)win.resizeBy(0,tinyMCE.isMac?10:24)}win.focus()}}},closeWindow:function(win){win.close()},getVisualAidClass:function(class_name,state){var i,classNames,ar,className,aidClass=tinyMCE.settings.visual_table_class;if(typeof(state)=="undefined")state=tinyMCE.settings.visual;classNames=[];ar=class_name.split(' ');for(i=0;i<ar.length;i++){if(ar[i]==aidClass)ar[i]="";if(ar[i]!=='')classNames[classNames.length]=ar[i]}if(state)classNames[classNames.length]=aidClass;className="";for(i=0;i<classNames.length;i++){if(i>0)className+=" ";className+=classNames[i]}return className},handleVisualAid:function(el,deep,state,inst,skip_dispatch){var i,x,y,tableElement,anchorName,oldW,oldH,bo,cn;if(!el)return;if(!skip_dispatch)tinyMCE.dispatchCallback(inst,'handle_visual_aid_callback','handleVisualAid',el,deep,state,inst);tableElement=null;switch(el.nodeName){case"TABLE":oldW=el.style.width;oldH=el.style.height;bo=tinyMCE.getAttrib(el,"border");bo=bo==''||bo=="0"?true:false;tinyMCE.setAttrib(el,"class",tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el,"class"),state&&bo));el.style.width=oldW;el.style.height=oldH;for(y=0;y<el.rows.length;y++){for(x=0;x<el.rows[y].cells.length;x++){cn=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x],"class"),state&&bo);tinyMCE.setAttrib(el.rows[y].cells[x],"class",cn)}}break;case"A":anchorName=tinyMCE.getAttrib(el,"name");if(anchorName!==''&&state){el.title=anchorName;tinyMCE.addCSSClass(el,'mceItemAnchor')}else if(anchorName!==''&&!state)el.className='';break}if(deep&&el.hasChildNodes()){for(i=0;i<el.childNodes.length;i++)tinyMCE.handleVisualAid(el.childNodes[i],deep,state,inst,true)}},fixGeckoBaseHREFBug:function(m,e,h){var xsrc,xhref;if(tinyMCE.isGecko){if(m==1){h=h.replace(/\ssrc=/gi," mce_tsrc=");h=h.replace(/\shref=/gi," mce_thref=");return h}else{if(!new RegExp('(src|href)=','g').test(h))return h;tinyMCE.selectElements(e,'A,IMG,SELECT,AREA,IFRAME,BASE,INPUT,SCRIPT,EMBED,OBJECT,LINK',function(n){xsrc=tinyMCE.getAttrib(n,"mce_tsrc");xhref=tinyMCE.getAttrib(n,"mce_thref");if(xsrc!==''){try{n.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,xsrc)}catch(e){}n.removeAttribute("mce_tsrc")}if(xhref!==''){try{n.href=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,xhref)}catch(e){}n.removeAttribute("mce_thref")}return false});tinyMCE.selectNodes(e,function(n){if(n.nodeType==3||n.nodeType==8){n.nodeValue=n.nodeValue.replace(/\smce_tsrc=/gi," src=");n.nodeValue=n.nodeValue.replace(/\smce_thref=/gi," href=")}return false})}}return h},_setHTML:function(doc,html_content){var i,html,paras,node;html_content=tinyMCE.cleanupHTMLCode(html_content);try{tinyMCE.setInnerHTML(doc.body,html_content)}catch(e){if(this.isMSIE)doc.body.createTextRange().pasteHTML(html_content)}if(tinyMCE.isIE&&tinyMCE.settings.fix_content_duplication){paras=doc.getElementsByTagName("P");for(i=0;i<paras.length;i++){node=paras[i];while((node=node.parentNode)!=null){if(node.nodeName=="P")node.outerHTML=node.innerHTML}}html=doc.body.innerHTML;tinyMCE.setInnerHTML(doc.body,html)}tinyMCE.cleanupAnchors(doc);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc)},getEditorId:function(form_element){var inst=this.getInstanceById(form_element);if(!inst)return null;return inst.editorId},getInstanceById:function(editor_id){var inst=this.instances[editor_id],n;if(!inst){for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(inst.formTargetElementId==editor_id)return inst}}else return inst;return null},queryInstanceCommandValue:function(editor_id,command){var inst=tinyMCE.getInstanceById(editor_id);if(inst)return inst.queryCommandValue(command);return false},queryInstanceCommandState:function(editor_id,command){var inst=tinyMCE.getInstanceById(editor_id);if(inst)return inst.queryCommandState(command);return null},setWindowArg:function(n,v){this.windowArgs[n]=v},getWindowArg:function(n,d){return(typeof(this.windowArgs[n])=="undefined")?d:this.windowArgs[n]},getCSSClasses:function(editor_id,doc){var i,c,x,rule,styles,rules,csses,selectorText,inst=tinyMCE.getInstanceById(editor_id);var cssClass,addClass,p;if(!inst)inst=tinyMCE.selectedInstance;if(!inst)return[];if(!doc)doc=inst.getDoc();if(inst&&inst.cssClasses.length>0)return inst.cssClasses;if(!doc)return;styles=doc.styleSheets;if(styles&&styles.length>0){for(x=0;x<styles.length;x++){csses=null;try{csses=tinyMCE.isIE?doc.styleSheets(x).rules:styles[x].cssRules}catch(e){}if(!csses)return[];for(i=0;i<csses.length;i++){selectorText=csses[i].selectorText;if(selectorText){rules=selectorText.split(',');for(c=0;c<rules.length;c++){rule=rules[c];while(rule.indexOf(' ')==0)rule=rule.substring(1);if(rule.indexOf(' ')!=-1||rule.indexOf(':')!=-1||rule.indexOf('mceItem')!=-1)continue;if(rule.indexOf(tinyMCE.settings.visual_table_class)!=-1||rule.indexOf('mceEditable')!=-1||rule.indexOf('mceNonEditable')!=-1)continue;if(rule.indexOf('.')!=-1){cssClass=rule.substring(rule.indexOf('.')+1);addClass=true;for(p=0;p<inst.cssClasses.length&&addClass;p++){if(inst.cssClasses[p]==cssClass)addClass=false}if(addClass)inst.cssClasses[inst.cssClasses.length]=cssClass}}}}}}return inst.cssClasses},regexpReplace:function(in_str,reg_exp,replace_str,opts){var re;if(in_str==null)return in_str;if(typeof(opts)=="undefined")opts='g';re=new RegExp(reg_exp,opts);return in_str.replace(re,replace_str)},trim:function(s){return s.replace(/^\s*|\s*$/g,"")},cleanupEventStr:function(s){s=""+s;s=s.replace('function anonymous()\n{\n','');s=s.replace('\n}','');s=s.replace(/^return true;/gi,'');return s},getControlHTML:function(c){var i,l,n,o,v,rtl=tinyMCE.getLang('lang_dir')=='rtl';l=tinyMCE.plugins;for(n in l){o=l[n];if(o.getControlHTML&&(v=o.getControlHTML(c))!==''){if(rtl)return'<span dir="rtl">'+tinyMCE.replaceVar(v,"pluginurl",o.baseURL)+'</span>';return tinyMCE.replaceVar(v,"pluginurl",o.baseURL)}}o=tinyMCE.themes[tinyMCE.settings.theme];if(o.getControlHTML&&(v=o.getControlHTML(c))!==''){if(rtl)return'<span dir="rtl">'+v+'</span>';return v}return''},evalFunc:function(f,idx,a,o){o=!o?window:o;f=typeof(f)=='function'?f:o[f];return f.apply(o,Array.prototype.slice.call(a,idx))},dispatchCallback:function(i,p,n){return this.callFunc(i,p,n,0,this.dispatchCallback.arguments)},executeCallback:function(i,p,n){return this.callFunc(i,p,n,1,this.executeCallback.arguments)},execCommandCallback:function(i,p,n){return this.callFunc(i,p,n,2,this.execCommandCallback.arguments)},callFunc:function(ins,p,n,m,a){var l,i,on,o,s,v;s=m==2;l=tinyMCE.getParam(p,'');if(l!==''&&(v=tinyMCE.evalFunc(l,3,a))==s&&m>0)return true;if(ins!=null){for(i=0,l=ins.plugins;i<l.length;i++){o=tinyMCE.plugins[l[i]];if(o[n]&&(v=tinyMCE.evalFunc(n,3,a,o))==s&&m>0)return true}}l=tinyMCE.themes;for(on in l){o=l[on];if(o[n]&&(v=tinyMCE.evalFunc(n,3,a,o))==s&&m>0)return true}return false},resolveDots:function(s,o){var i;if(typeof(s)=='string'){for(i=0,s=s.split('.');i<s.length;i++)o=o[s[i]]}else o=s;return o},xmlEncode:function(s){return s?(''+s).replace(this.xmlEncodeRe,function(c,b){switch(c){case'&':return'&amp;';case'"':return'&quot;';case'<':return'&lt;';case'>':return'&gt;'}return c}):s},add:function(c,m){var n;for(n in m)c.prototype[n]=m[n]},extend:function(p,np){var o={},n;o.parent=p;for(n in p)o[n]=p[n];for(n in np)o[n]=np[n];return o},hideMenus:function(){var e=tinyMCE.lastSelectedMenuBtn;if(tinyMCE.lastMenu){tinyMCE.lastMenu.hide();tinyMCE.lastMenu=null}if(e){tinyMCE.switchClass(e,tinyMCE.lastMenuBtnClass);tinyMCE.lastSelectedMenuBtn=null}}};var TinyMCE=TinyMCE_Engine;var tinyMCE=new TinyMCE_Engine();var tinyMCELang={};function TinyMCE_Control(settings){var t,i,tos,fu,p,x,fn,fu,pn,s=settings;this.undoRedoLevel=true;this.isTinyMCE_Control=true;this.enabled=true;this.settings=s;this.settings.theme=tinyMCE.getParam("theme","default");this.settings.width=tinyMCE.getParam("width",-1);this.settings.height=tinyMCE.getParam("height",-1);this.selection=new TinyMCE_Selection(this);this.undoRedo=new TinyMCE_UndoRedo(this);this.cleanup=new TinyMCE_Cleanup();this.shortcuts=[];this.hasMouseMoved=false;this.foreColor=this.backColor="#999999";this.data={};this.cssClasses=[];this.cleanup.init({valid_elements:s.valid_elements,extended_valid_elements:s.extended_valid_elements,valid_child_elements:s.valid_child_elements,entities:s.entities,entity_encoding:s.entity_encoding,debug:s.cleanup_debug,indent:s.apply_source_formatting,invalid_elements:s.invalid_elements,verify_html:s.verify_html,fix_content_duplication:s.fix_content_duplication,convert_fonts_to_spans:s.convert_fonts_to_spans});t=this.settings.theme;if(!tinyMCE.hasTheme(t)){fn=tinyMCE.callbacks;tos={};for(i=0;i<fn.length;i++){if((fu=window['TinyMCE_'+t+"_"+fn[i]]))tos[fn[i]]=fu}tinyMCE.addTheme(t,tos)}this.plugins=[];p=tinyMCE.getParam('plugins','',true,',');if(p.length>0){for(i=0;i<p.length;i++){pn=p[i];if(pn.charAt(0)=='-')pn=pn.substring(1);if(!tinyMCE.hasPlugin(pn)){fn=tinyMCE.callbacks;tos={};for(x=0;x<fn.length;x++){if((fu=window['TinyMCE_'+pn+"_"+fn[x]]))tos[fn[x]]=fu}tinyMCE.addPlugin(pn,tos)}this.plugins[this.plugins.length]=pn}}};TinyMCE_Control.prototype={selection:null,settings:null,cleanup:null,getData:function(na){var o=this.data[na];if(!o)o=this.data[na]={};return o},hasPlugin:function(n){var i;for(i=0;i<this.plugins.length;i++){if(this.plugins[i]==n)return true}return false},addPlugin:function(n,p){if(!this.hasPlugin(n)){tinyMCE.addPlugin(n,p);this.plugins[this.plugins.length]=n}},repaint:function(){var s,b,ex;if(tinyMCE.isRealIE)return;try{s=this.selection;b=s.getBookmark(true);this.getBody().style.display='none';this.getDoc().execCommand('selectall',false,null);this.getSel().collapseToStart();this.getBody().style.display='block';s.moveToBookmark(b)}catch(ex){}},switchSettings:function(){if(tinyMCE.configs.length>1&&tinyMCE.currentConfig!=this.settings.index){tinyMCE.settings=this.settings;tinyMCE.currentConfig=this.settings.index}},select:function(){var oldInst=tinyMCE.selectedInstance;if(oldInst!=this){if(oldInst)oldInst.execCommand('mceEndTyping');tinyMCE.dispatchCallback(this,'select_instance_callback','selectInstance',this,oldInst);tinyMCE.selectedInstance=this}},getBody:function(){return this.contentBody?this.contentBody:this.getDoc().body},getDoc:function(){return this.contentWindow.document},getWin:function(){return this.contentWindow},getContainerWin:function(){return this.containerWindow?this.containerWindow:window},getViewPort:function(){return tinyMCE.getViewPort(this.getWin())},getParentNode:function(n,f){return tinyMCE.getParentNode(n,f,this.getBody())},getParentElement:function(n,na,f){return tinyMCE.getParentElement(n,na,f,this.getBody())},getParentBlockElement:function(n){return tinyMCE.getParentBlockElement(n,this.getBody())},resizeToContent:function(){var d=this.getDoc(),b=d.body,de=d.documentElement;this.iframeElement.style.height=(tinyMCE.isRealIE)?b.scrollHeight:de.offsetHeight+'px'},addShortcut:function(m,k,d,cmd,ui,va){var n=typeof(k)=="number",ie=tinyMCE.isIE,c,sc,i,scl=this.shortcuts;if(!tinyMCE.getParam('custom_shortcuts'))return false;m=m.toLowerCase();k=ie&&!n?k.toUpperCase():k;c=n?null:k.charCodeAt(0);d=d&&d.indexOf('lang_')==0?tinyMCE.getLang(d):d;sc={alt:m.indexOf('alt')!=-1,ctrl:m.indexOf('ctrl')!=-1,shift:m.indexOf('shift')!=-1,charCode:c,keyCode:n?k:(ie?c:null),desc:d,cmd:cmd,ui:ui,val:va};for(i=0;i<scl.length;i++){if(sc.alt==scl[i].alt&&sc.ctrl==scl[i].ctrl&&sc.shift==scl[i].shift&&sc.charCode==scl[i].charCode&&sc.keyCode==scl[i].keyCode){return false}}scl[scl.length]=sc;return true},handleShortcut:function(e){var i,s,o;if(!e.altKey&&!e.ctrlKey)return false;s=this.shortcuts;for(i=0;i<s.length;i++){o=s[i];if(o.alt==e.altKey&&o.ctrl==e.ctrlKey&&(o.keyCode==e.keyCode||o.charCode==e.charCode)){if(o.cmd&&(e.type=="keydown"||(e.type=="keypress"&&!tinyMCE.isOpera)))tinyMCE.execCommand(o.cmd,o.ui,o.val);tinyMCE.cancelEvent(e);return true}}return false},autoResetDesignMode:function(){if(!tinyMCE.isIE&&this.isHidden()&&tinyMCE.getParam('auto_reset_designmode'))eval('try { this.getDoc().designMode = "On"; this.useCSS = false; } catch(e) {}')},isHidden:function(){var s;if(tinyMCE.isIE)return false;s=this.getSel();return(!s||!s.rangeCount||s.rangeCount==0)},isDirty:function(){return tinyMCE.trim(this.startContent)!=tinyMCE.trim(this.getBody().innerHTML)&&!this.isNotDirty},_mergeElements:function(scmd,pa,ch,override){var st,stc,className,n;if(scmd=="removeformat"){pa.className="";pa.style.cssText="";ch.className="";ch.style.cssText="";return}st=tinyMCE.parseStyle(tinyMCE.getAttrib(pa,"style"));stc=tinyMCE.parseStyle(tinyMCE.getAttrib(ch,"style"));className=tinyMCE.getAttrib(pa,"class");className=tinyMCE.getAttrib(ch,"class");if(override){for(n in st){if(typeof(st[n])=='function')continue;stc[n]=st[n]}}else{for(n in stc){if(typeof(stc[n])=='function')continue;st[n]=stc[n]}}tinyMCE.setAttrib(pa,"style",tinyMCE.serializeStyle(st));tinyMCE.setAttrib(pa,"class",tinyMCE.trim(className));ch.className="";ch.style.cssText="";ch.removeAttribute("class");ch.removeAttribute("style")},_fixRootBlocks:function(){var rb,b,ne,be,nx,bm;rb=tinyMCE.getParam('forced_root_block');if(!rb)return;b=this.getBody();ne=b.firstChild;while(ne){nx=ne.nextSibling;if(ne.nodeType==3||!tinyMCE.blockRegExp.test(ne.nodeName)){if(!bm)bm=this.selection.getBookmark();if(!be){be=this.getDoc().createElement(rb);be.appendChild(ne.cloneNode(true));b.replaceChild(be,ne)}else{be.appendChild(ne.cloneNode(true));b.removeChild(ne)}}else be=null;ne=nx}if(bm)this.selection.moveToBookmark(bm)},_fixTrailingNbsp:function(){var s=this.selection,e=s.getFocusElement(),bm,v;if(e&&tinyMCE.blockRegExp.test(e.nodeName)&&e.firstChild){v=e.firstChild.nodeValue;if(v&&v.length>1&&/(^\u00a0|\u00a0$)/.test(v)){e.firstChild.nodeValue=v.replace(/(^\u00a0|\u00a0$)/,'');s.selectNode(e.firstChild,true,false,false);}}},_setUseCSS:function(b){var d=this.getDoc();try{d.execCommand("useCSS",false,!b)}catch(ex){}try{d.execCommand("styleWithCSS",false,b)}catch(ex){}if(!tinyMCE.getParam("table_inline_editing"))try{d.execCommand('enableInlineTableEditing',false,"false")}catch(ex){}if(!tinyMCE.getParam("object_resizing"))try{d.execCommand('enableObjectResizing',false,"false")}catch(ex){}},execCommand:function(command,user_interface,value){var i,x,z,align,img,div,doc=this.getDoc(),win=this.getWin(),focusElm=this.getFocusElement();if(!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel','gi').test(command))this.undoBookmark=null;if(!tinyMCE.isIE&&!this.useCSS){this._setUseCSS(false);this.useCSS=true}this.contentDocument=doc;if(!/mceStartTyping|mceEndTyping/.test(command)){if(tinyMCE.execCommandCallback(this,'execcommand_callback','execCommand',this.editorId,this.getBody(),command,user_interface,value))return}if(focusElm&&focusElm.nodeName=="IMG"){align=focusElm.getAttribute('align');img=command=="JustifyCenter"?focusElm.cloneNode(false):focusElm;switch(command){case"JustifyLeft":if(align=='left')img.removeAttribute('align');else img.setAttribute('align','left');div=focusElm.parentNode;if(div&&div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);this.selection.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;case"JustifyCenter":img.removeAttribute('align');div=tinyMCE.getParentElement(focusElm,"div");if(div&&div.style.textAlign=="center"){if(div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div)}else{div=this.getDoc().createElement("div");div.style.textAlign='center';div.appendChild(img);focusElm.parentNode.replaceChild(div,focusElm)}this.selection.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;case"JustifyRight":if(align=='right')img.removeAttribute('align');else img.setAttribute('align','right');div=focusElm.parentNode;if(div&&div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);this.selection.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return}}if(tinyMCE.settings.force_br_newlines){var alignValue="";if(doc.selection.type!="Control"){switch(command){case"JustifyLeft":alignValue="left";break;case"JustifyCenter":alignValue="center";break;case"JustifyFull":alignValue="justify";break;case"JustifyRight":alignValue="right";break}if(alignValue!==''){var rng=doc.selection.createRange();if((divElm=tinyMCE.getParentElement(rng.parentElement(),"div"))!=null)divElm.setAttribute("align",alignValue);else if(rng.pasteHTML&&rng.htmlText.length>0)rng.pasteHTML('<div align="'+alignValue+'">'+rng.htmlText+"</div>");tinyMCE.triggerNodeChange();return}}}switch(command){case"mceRepaint":this.repaint();return true;case"unlink":if(tinyMCE.isGecko&&this.getSel().isCollapsed){focusElm=tinyMCE.getParentElement(focusElm,'A');if(focusElm)this.selection.selectNode(focusElm,false)}this.getDoc().execCommand(command,user_interface,value);tinyMCE.isGecko&&this.getSel().collapseToEnd();tinyMCE.triggerNodeChange();return true;case"InsertUnorderedList":case"InsertOrderedList":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"Strikethrough":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"mceSelectNode":this.selection.selectNode(value);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=value;break;case"FormatBlock":if(value==null||value==''){var elm=tinyMCE.getParentElement(this.getFocusElement(),"p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp");if(elm)this.execCommand("mceRemoveNode",false,elm)}else{if(!this.cleanup.isValid(value))return true;if(tinyMCE.isGecko&&new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>','gi').test(value))value=value.replace(/[^a-z]/gi,'');if(tinyMCE.isIE&&new RegExp('blockquote|code|samp','gi').test(value)){var b=this.selection.getBookmark();this.getDoc().execCommand("FormatBlock",false,'<p>');tinyMCE.renameElement(tinyMCE.getParentBlockElement(this.getFocusElement()),value);this.selection.moveToBookmark(b)}else this.getDoc().execCommand("FormatBlock",false,value)}tinyMCE.triggerNodeChange();break;case"mceRemoveNode":if(!value)value=tinyMCE.getParentElement(this.getFocusElement());if(tinyMCE.isIE){value.outerHTML=value.innerHTML}else{var rng=value.ownerDocument.createRange();rng.setStartBefore(value);rng.setEndAfter(value);rng.deleteContents();rng.insertNode(rng.createContextualFragment(value.innerHTML))}tinyMCE.triggerNodeChange();break;case"mceSelectNodeDepth":var parentNode=this.getFocusElement();for(i=0;parentNode;i++){if(parentNode.nodeName.toLowerCase()=="body")break;if(parentNode.nodeName.toLowerCase()=="#text"){i--;parentNode=parentNode.parentNode;continue}if(i==value){this.selection.selectNode(parentNode,false);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=parentNode;return}parentNode=parentNode.parentNode}break;case"mceSetStyleInfo":case"SetStyleInfo":var rng=this.getRng();var sel=this.getSel();var scmd=value.command;var sname=value.name;var svalue=value.value==null?'':value.value;var wrapper=value.wrapper?value.wrapper:"span";var parentElm=null;var invalidRe=new RegExp("^BODY|HTML$","g");var invalidParentsRe=tinyMCE.settings.merge_styles_invalid_parents!==''?new RegExp(tinyMCE.settings.merge_styles_invalid_parents,"gi"):null;if(tinyMCE.isIE){if(rng.item)parentElm=rng.item(0);else{var pelm=rng.parentElement();var prng=doc.selection.createRange();prng.moveToElementText(pelm);if(rng.htmlText==prng.htmlText||rng.boundingWidth==0){if(invalidParentsRe==null||!invalidParentsRe.test(pelm.nodeName))parentElm=pelm}}}else{var felm=this.getFocusElement();if(sel.isCollapsed||(new RegExp('td|tr|tbody|table|img','gi').test(felm.nodeName)&&sel.anchorNode==felm.parentNode))parentElm=felm}if(parentElm&&!invalidRe.test(parentElm.nodeName)){if(scmd=="setstyle")tinyMCE.setStyleAttrib(parentElm,sname,svalue);if(scmd=="setattrib")tinyMCE.setAttrib(parentElm,sname,svalue);if(scmd=="removeformat"){parentElm.style.cssText='';tinyMCE.setAttrib(parentElm,'class','')}var ch=tinyMCE.getNodeTree(parentElm,[],1);for(z=0;z<ch.length;z++){if(ch[z]==parentElm)continue;if(scmd=="setstyle")tinyMCE.setStyleAttrib(ch[z],sname,'');if(scmd=="setattrib")tinyMCE.setAttrib(ch[z],sname,'');if(scmd=="removeformat"){ch[z].style.cssText='';tinyMCE.setAttrib(ch[z],'class','')}}}else{this._setUseCSS(false);doc.execCommand("FontName",false,"#mce_temp_font#");var elementArray=tinyMCE.getElementsByAttributeValue(this.getBody(),"font","face","#mce_temp_font#");for(x=0;x<elementArray.length;x++){elm=elementArray[x];if(elm){var spanElm=doc.createElement(wrapper);if(scmd=="setstyle")tinyMCE.setStyleAttrib(spanElm,sname,svalue);if(scmd=="setattrib")tinyMCE.setAttrib(spanElm,sname,svalue);if(scmd=="removeformat"){spanElm.style.cssText='';tinyMCE.setAttrib(spanElm,'class','')}if(elm.hasChildNodes()){for(i=0;i<elm.childNodes.length;i++)spanElm.appendChild(elm.childNodes[i].cloneNode(true))}spanElm.setAttribute("mce_new","true");elm.parentNode.replaceChild(spanElm,elm);var ch=tinyMCE.getNodeTree(spanElm,[],1);for(z=0;z<ch.length;z++){if(ch[z]==spanElm)continue;if(scmd=="setstyle")tinyMCE.setStyleAttrib(ch[z],sname,'');if(scmd=="setattrib")tinyMCE.setAttrib(ch[z],sname,'');if(scmd=="removeformat"){ch[z].style.cssText='';tinyMCE.setAttrib(ch[z],'class','')}}}}}var nodes=doc.getElementsByTagName(wrapper);for(i=nodes.length-1;i>=0;i--){var elm=nodes[i];var isNew=tinyMCE.getAttrib(elm,"mce_new")=="true";elm.removeAttribute("mce_new");if(elm.childNodes&&elm.childNodes.length==1&&elm.childNodes[0].nodeType==1){this._mergeElements(scmd,elm,elm.childNodes[0],isNew);continue}if(elm.parentNode.childNodes.length==1&&!invalidRe.test(elm.nodeName)&&!invalidRe.test(elm.parentNode.nodeName)){if(invalidParentsRe==null||!invalidParentsRe.test(elm.parentNode.nodeName))this._mergeElements(scmd,elm.parentNode,elm,false)}}var nodes=doc.getElementsByTagName(wrapper);for(i=nodes.length-1;i>=0;i--){var elm=nodes[i],isEmpty=true;var tmp=doc.createElement("body");tmp.appendChild(elm.cloneNode(false));tmp.innerHTML=tmp.innerHTML.replace(new RegExp('style=""|class=""','gi'),'');if(new RegExp('<span>','gi').test(tmp.innerHTML)){for(x=0;x<elm.childNodes.length;x++){if(elm.parentNode!=null)elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true),elm)}elm.parentNode.removeChild(elm)}}if(scmd=="removeformat")tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE.triggerNodeChange();break;case"FontName":if(value==null){var s=this.getSel();if(tinyMCE.isGecko&&s.isCollapsed){var f=tinyMCE.getParentElement(this.getFocusElement(),"font");if(f!=null)this.selection.selectNode(f,false)}this.getDoc().execCommand("RemoveFormat",false,null);if(f!=null&&tinyMCE.isGecko){var r=this.getRng().cloneRange();r.collapse(true);s.removeAllRanges();s.addRange(r)}}else this.getDoc().execCommand('FontName',false,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);return;case"FontSize":this.getDoc().execCommand('FontSize',false,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);return;case"forecolor":value=value==null?this.foreColor:value;value=tinyMCE.trim(value);value=value.charAt(0)!='#'?(isNaN('0x'+value)?value:'#'+value):value;this.foreColor=value;this.getDoc().execCommand('forecolor',false,value);break;case"HiliteColor":value=value==null?this.backColor:value;value=tinyMCE.trim(value);value=value.charAt(0)!='#'?(isNaN('0x'+value)?value:'#'+value):value;this.backColor=value;if(tinyMCE.isGecko){this._setUseCSS(true);this.getDoc().execCommand('hilitecolor',false,value);this._setUseCSS(false)}else this.getDoc().execCommand('BackColor',false,value);break;case"Cut":case"Copy":case"Paste":var cmdFailed=false;eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}');if(tinyMCE.isOpera&&cmdFailed)alert('Currently not supported by your browser, use keyboard shortcuts instead.');if(tinyMCE.isGecko&&cmdFailed){if(confirm(tinyMCE.entityDecode(tinyMCE.getLang('lang_clipboard_msg'))))window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html','mceExternal');return}else tinyMCE.triggerNodeChange();break;case"mceSetContent":if(!value)value="";value=tinyMCE.storeAwayURLs(value);value=tinyMCE._customCleanup(this,"insert_to_editor",value);if(this.getBody().nodeName=='BODY')tinyMCE._setHTML(doc,value);else this.getBody().innerHTML=value;tinyMCE.setInnerHTML(this.getBody(),tinyMCE._cleanupHTML(this,doc,this.settings,this.getBody(),false,false,false,true));tinyMCE.convertAllRelativeURLs(this.getBody());tinyMCE._removeInternal(this.getBody());if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc);tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE._setEventsEnabled(this.getBody(),false);this._addBogusBR();return true;case"mceCleanup":var b=this.selection.getBookmark();tinyMCE._setHTML(this.contentDocument,this.getBody().innerHTML);tinyMCE.setInnerHTML(this.getBody(),tinyMCE._cleanupHTML(this,this.contentDocument,this.settings,this.getBody(),this.visualAid));tinyMCE.convertAllRelativeURLs(doc.body);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc);tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE._setEventsEnabled(this.getBody(),false);this._addBogusBR();this.repaint();this.selection.moveToBookmark(b);tinyMCE.triggerNodeChange();break;case"mceReplaceContent":if(!value)value='';this.getWin().focus();var selectedText="";if(tinyMCE.isIE){var rng=doc.selection.createRange();selectedText=rng.text}else selectedText=this.getSel().toString();if(selectedText.length>0){value=tinyMCE.replaceVar(value,"selection",selectedText);tinyMCE.execCommand('mceInsertContent',false,value)}this._addBogusBR();tinyMCE.triggerNodeChange();break;case"mceSetAttribute":if(typeof(value)=='object'){var targetElms=(typeof(value.targets)=="undefined")?"p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address":value.targets;var targetNode=tinyMCE.getParentElement(this.getFocusElement(),targetElms);if(targetNode){targetNode.setAttribute(value.name,value.value);tinyMCE.triggerNodeChange()}}break;case"mceSetCSSClass":this.execCommand("mceSetStyleInfo",false,{command:"setattrib",name:"class",value:value});break;case"mceInsertRawHTML":var key='tiny_mce_marker';this.execCommand('mceBeginUndoLevel');this.execCommand('mceInsertContent',false,key);var scrollX=this.getBody().scrollLeft+this.getDoc().documentElement.scrollLeft;var scrollY=this.getBody().scrollTop+this.getDoc().documentElement.scrollTop;var html=this.getBody().innerHTML;if((pos=html.indexOf(key))!=-1)tinyMCE.setInnerHTML(this.getBody(),html.substring(0,pos)+value+html.substring(pos+key.length));this.contentWindow.scrollTo(scrollX,scrollY);this.execCommand('mceEndUndoLevel');break;case"mceInsertContent":if(!value)value='';var insertHTMLFailed=false;if(tinyMCE.isGecko||tinyMCE.isOpera){try{if(value.indexOf('<')==-1&&!value.match(/(&#38;|&#160;|&#60;|&#62;)/g)){var r=this.getRng();var n=this.getDoc().createTextNode(tinyMCE.entityDecode(value));var s=this.getSel();var r2=r.cloneRange();s.removeAllRanges();r.deleteContents();r.insertNode(n);r2.selectNode(n);r2.collapse(false);s.removeAllRanges();s.addRange(r2)}else{value=tinyMCE.fixGeckoBaseHREFBug(1,this.getDoc(),value);this.getDoc().execCommand('inserthtml',false,value);tinyMCE.fixGeckoBaseHREFBug(2,this.getDoc(),value)}}catch(ex){insertHTMLFailed=true}if(!insertHTMLFailed){tinyMCE.triggerNodeChange();return}}if(!tinyMCE.isIE){var isHTML=value.indexOf('<')!=-1;var sel=this.getSel();var rng=this.getRng();if(isHTML){if(tinyMCE.isSafari){var tmpRng=this.getDoc().createRange();tmpRng.setStart(this.getBody(),0);tmpRng.setEnd(this.getBody(),0);value=tmpRng.createContextualFragment(value)}else value=rng.createContextualFragment(value)}else{value=doc.createTextNode(tinyMCE.entityDecode(value))}if(tinyMCE.isSafari&&!isHTML){this.execCommand('InsertText',false,value.nodeValue);tinyMCE.triggerNodeChange();return true}else if(tinyMCE.isSafari&&isHTML){rng.deleteContents();rng.insertNode(value);tinyMCE.triggerNodeChange();return true}rng.deleteContents();if(rng.startContainer.nodeType==3){var node=rng.startContainer.splitText(rng.startOffset);node.parentNode.insertBefore(value,node)}else rng.insertNode(value);if(!isHTML){sel.selectAllChildren(doc.body);sel.removeAllRanges();var rng=doc.createRange();rng.selectNode(value);rng.collapse(false);sel.addRange(rng)}else rng.collapse(false);tinyMCE.fixGeckoBaseHREFBug(2,this.getDoc(),value)}else{var rng=doc.selection.createRange(),tmpRng=null;var c=value.indexOf('<!--')!=-1;if(c)value=tinyMCE.uniqueTag+value;if(rng.item)rng.item(0).outerHTML=value;else rng.pasteHTML(value);if(c){var e=this.getDoc().getElementById('mceTMPElement');e.parentNode.removeChild(e)}}tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.triggerNodeChange();break;case"mceStartTyping":if(tinyMCE.settings.custom_undo_redo&&this.undoRedo.typingUndoIndex==-1){this.undoRedo.typingUndoIndex=this.undoRedo.undoIndex;tinyMCE.typingUndoIndex=tinyMCE.undoIndex;this.execCommand('mceAddUndoLevel')}break;case"mceEndTyping":if(tinyMCE.settings.custom_undo_redo&&this.undoRedo.typingUndoIndex!=-1){this.execCommand('mceAddUndoLevel');this.undoRedo.typingUndoIndex=-1}tinyMCE.typingUndoIndex=-1;break;case"mceBeginUndoLevel":this.undoRedoLevel=false;break;case"mceEndUndoLevel":this.undoRedoLevel=true;this.execCommand('mceAddUndoLevel');break;case"mceAddUndoLevel":if(tinyMCE.settings.custom_undo_redo&&this.undoRedoLevel){if(this.undoRedo.add())tinyMCE.triggerNodeChange(false)}break;case"Undo":if(tinyMCE.settings.custom_undo_redo){tinyMCE.execCommand("mceEndTyping");this.undoRedo.undo();tinyMCE.triggerNodeChange()}else this.getDoc().execCommand(command,user_interface,value);break;case"Redo":if(tinyMCE.settings.custom_undo_redo){tinyMCE.execCommand("mceEndTyping");this.undoRedo.redo();tinyMCE.triggerNodeChange()}else this.getDoc().execCommand(command,user_interface,value);break;case"mceToggleVisualAid":this.visualAid=!this.visualAid;tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE.triggerNodeChange();break;case"Indent":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();if(tinyMCE.isIE){var n=tinyMCE.getParentElement(this.getFocusElement(),"blockquote");do{if(n&&n.nodeName=="BLOCKQUOTE"){n.removeAttribute("dir");n.removeAttribute("style")}}while(n!=null&&(n=n.parentNode)!=null)}break;case"RemoveFormat":case"removeformat":var text=this.selection.getSelectedText();if(tinyMCE.isOpera){this.getDoc().execCommand("RemoveFormat",false,null);return}if(tinyMCE.isIE){try{var rng=doc.selection.createRange();rng.execCommand("RemoveFormat",false,null)}catch(e){}this.execCommand("mceSetStyleInfo",false,{command:"removeformat"})}else{this.getDoc().execCommand(command,user_interface,value);this.execCommand("mceSetStyleInfo",false,{command:"removeformat"})}if(text.length==0)this.execCommand("mceSetCSSClass",false,"");tinyMCE.triggerNodeChange();break;default:this.getDoc().execCommand(command,user_interface,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);else tinyMCE.triggerNodeChange()}if(command!="mceAddUndoLevel"&&command!="Undo"&&command!="Redo"&&command!="mceStartTyping"&&command!="mceEndTyping")tinyMCE.execCommand("mceAddUndoLevel")},queryCommandValue:function(c){try{return this.getDoc().queryCommandValue(c)}catch(e){return null}},queryCommandState:function(c){return this.getDoc().queryCommandState(c)},_addBogusBR:function(){var b=this.getBody();if(tinyMCE.isGecko&&!b.hasChildNodes())b.innerHTML='<br _moz_editor_bogus_node="TRUE" />'},_onAdd:function(replace_element,form_element_name,target_document){var hc,th,tos,editorTemplate,targetDoc,deltaWidth,deltaHeight,html,rng,fragment;var dynamicIFrame,tElm,doc,parentElm;th=this.settings.theme;tos=tinyMCE.themes[th];targetDoc=target_document?target_document:document;this.targetDoc=targetDoc;tinyMCE.themeURL=tinyMCE.baseURL+"/themes/"+this.settings.theme;this.settings.themeurl=tinyMCE.themeURL;if(!replace_element){alert("Error: Could not find the target element.");return false}if(tos.getEditorTemplate)editorTemplate=tos.getEditorTemplate(this.settings,this.editorId);deltaWidth=editorTemplate.delta_width?editorTemplate.delta_width:0;deltaHeight=editorTemplate.delta_height?editorTemplate.delta_height:0;html='<span id="'+this.editorId+'_parent" class="mceEditorContainer">'+editorTemplate.html;html=tinyMCE.replaceVar(html,"editor_id",this.editorId);if(!this.settings.default_document)this.settings.default_document=tinyMCE.baseURL+"/blank.htm";this.settings.old_width=this.settings.width;this.settings.old_height=this.settings.height;if(this.settings.width==-1)this.settings.width=replace_element.offsetWidth;if(this.settings.height==-1)this.settings.height=replace_element.offsetHeight;if(this.settings.width==0)this.settings.width=replace_element.style.width;if(this.settings.height==0)this.settings.height=replace_element.style.height;if(this.settings.width==0)this.settings.width=320;if(this.settings.height==0)this.settings.height=240;this.settings.area_width=parseInt(this.settings.width);this.settings.area_height=parseInt(this.settings.height);this.settings.area_width+=deltaWidth;this.settings.area_height+=deltaHeight;this.settings.width_style=""+this.settings.width;this.settings.height_style=""+this.settings.height;if((""+this.settings.width).indexOf('%')!=-1)this.settings.area_width="100%";else this.settings.width_style+='px';if((""+this.settings.height).indexOf('%')!=-1)this.settings.area_height="100%";else this.settings.height_style+='px';if((""+replace_element.style.width).indexOf('%')!=-1){this.settings.width=replace_element.style.width;this.settings.area_width="100%";this.settings.width_style="100%"}if((""+replace_element.style.height).indexOf('%')!=-1){this.settings.height=replace_element.style.height;this.settings.area_height="100%";this.settings.height_style="100%"}html=tinyMCE.applyTemplate(html);this.settings.width=this.settings.old_width;this.settings.height=this.settings.old_height;this.visualAid=this.settings.visual;this.formTargetElementId=form_element_name;if(replace_element.nodeName=="TEXTAREA"||replace_element.nodeName=="INPUT")this.startContent=replace_element.value;else this.startContent=replace_element.innerHTML;if(replace_element.nodeName!="TEXTAREA"&&replace_element.nodeName!="INPUT"){this.oldTargetElement=replace_element;hc='<input type="hidden" id="'+form_element_name+'" name="'+form_element_name+'" />';this.oldTargetDisplay=tinyMCE.getStyle(this.oldTargetElement,'display','inline');this.oldTargetElement.style.display="none";html+='</span>';if(tinyMCE.isGecko)html=hc+html;else html+=hc;if(tinyMCE.isGecko){rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);fragment=rng.createContextualFragment(html);tinyMCE.insertAfter(fragment,replace_element)}else replace_element.insertAdjacentHTML("beforeBegin",html)}else{html+='</span>';this.oldTargetElement=replace_element;this.oldTargetDisplay=tinyMCE.getStyle(this.oldTargetElement,'display','inline');this.oldTargetElement.style.display="none";if(tinyMCE.isGecko){rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);fragment=rng.createContextualFragment(html);tinyMCE.insertAfter(fragment,replace_element)}else replace_element.insertAdjacentHTML("beforeBegin",html)}dynamicIFrame=false;tElm=targetDoc.getElementById(this.editorId);if(!tinyMCE.isIE){if(tElm&&(tElm.nodeName=="SPAN"||tElm.nodeName=="span")){tElm=tinyMCE._createIFrame(tElm,targetDoc);dynamicIFrame=true}this.targetElement=tElm;this.iframeElement=tElm;this.contentDocument=tElm.contentDocument;this.contentWindow=tElm.contentWindow;}else{if(tElm&&tElm.nodeName=="SPAN")tElm=tinyMCE._createIFrame(tElm,targetDoc,targetDoc.parentWindow);else tElm=targetDoc.frames[this.editorId];this.targetElement=tElm;this.iframeElement=targetDoc.getElementById(this.editorId);if(tinyMCE.isOpera){this.contentDocument=this.iframeElement.contentDocument;this.contentWindow=this.iframeElement.contentWindow;dynamicIFrame=true}else{this.contentDocument=tElm.window.document;this.contentWindow=tElm.window}this.getDoc().designMode="on"}doc=this.contentDocument;if(dynamicIFrame){html=tinyMCE.getParam('doctype')+'<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="'+tinyMCE.settings.base_href+'" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>';try{if(!this.isHidden())this.getDoc().designMode="on";doc.open();doc.write(html);doc.close()}catch(e){this.getDoc().location.href=tinyMCE.baseURL+"/blank.htm"}}if(tinyMCE.isIE)window.setTimeout("tinyMCE.addEventHandlers(tinyMCE.instances[\""+this.editorId+"\"]);",1);parentElm=this.targetDoc.getElementById(this.editorId+'_parent');this.formElement=tinyMCE.isGecko?parentElm.previousSibling:parentElm.nextSibling;tinyMCE.setupContent(this.editorId,true);return true},setBaseHREF:function(u){var h,b,d,nl;d=this.getDoc();nl=d.getElementsByTagName("base");b=nl.length>0?nl[0]:null;if(!b){nl=d.getElementsByTagName("head");h=nl.length>0?nl[0]:null;b=d.createElement("base");b.setAttribute('href',u);h.appendChild(b)}else{if(u==''||u==null)b.parentNode.removeChild(b);else b.setAttribute('href',u)}},getHTML:function(r){var h,d=this.getDoc(),b=this.getBody();if(r)return b.innerHTML;h=tinyMCE._cleanupHTML(this,d,this.settings,b,false,true,false,true);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(d);return h},setHTML:function(h){this.execCommand('mceSetContent',false,h);this.repaint()},getFocusElement:function(){return this.selection.getFocusElement()},getSel:function(){return this.selection.getSel()},getRng:function(){return this.selection.getRng()},triggerSave:function(skip_cleanup,skip_callback){var e,nl=[],i,s,content,htm;if(!this.enabled)return;this.switchSettings();s=tinyMCE.settings;if(tinyMCE.isRealIE){e=this.iframeElement;do{if(e.style&&e.style.display=='none'){e.style.display='block';nl[nl.length]={elm:e,type:'style'}}if(e.style&&s.hidden_tab_class.length>0&&e.className.indexOf(s.hidden_tab_class)!=-1){e.className=s.display_tab_class;nl[nl.length]={elm:e,type:'class'}}}while((e=e.parentNode)!=null)}tinyMCE.settings.preformatted=false;if(typeof(skip_cleanup)=="undefined")skip_cleanup=false;if(typeof(skip_callback)=="undefined")skip_callback=false;tinyMCE._setHTML(this.getDoc(),this.getBody().innerHTML);if(this.settings.cleanup==false){tinyMCE.handleVisualAid(this.getBody(),true,false,this);tinyMCE._setEventsEnabled(this.getBody(),true)}tinyMCE._customCleanup(this,"submit_content_dom",this.contentWindow.document.body);htm=skip_cleanup?this.getBody().innerHTML:tinyMCE._cleanupHTML(this,this.getDoc(),this.settings,this.getBody(),tinyMCE.visualAid,true,true);htm=tinyMCE._customCleanup(this,"submit_content",htm);if(!skip_callback&&tinyMCE.settings.save_callback!=='')content=tinyMCE.resolveDots(tinyMCE.settings.save_callback,window)(this.formTargetElementId,htm,this.getBody());if((typeof(content)!="undefined")&&content!=null)htm=content;htm=tinyMCE.regexpReplace(htm,"&#40;","(","gi");htm=tinyMCE.regexpReplace(htm,"&#41;",")","gi");htm=tinyMCE.regexpReplace(htm,"&#59;",";","gi");htm=tinyMCE.regexpReplace(htm,"&#34;","&quot;","gi");htm=tinyMCE.regexpReplace(htm,"&#94;","^","gi");if(this.formElement)this.formElement.value=htm;if(tinyMCE.isSafari&&this.formElement)this.formElement.innerText=htm;for(i=0;i<nl.length;i++){if(nl[i].type=='style')nl[i].elm.style.display='none';else nl[i].elm.className=s.hidden_tab_class}}};tinyMCE.add(TinyMCE_Engine,{cleanupHTMLCode:function(s){s=s.replace(new RegExp('<p \\/>','gi'),'<p>&nbsp;</p>');s=s.replace(new RegExp('<p>\\s*<\\/p>','gi'),'<p>&nbsp;</p>');s=s.replace(new RegExp('<br>\\s*<\\/br>','gi'),'<br />');s=s.replace(new RegExp('<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|font|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\\\|>]*)\\/>','gi'),'<$1$2$3></$1$2>');s=s.replace(new RegExp('\\s+></','gi'),'></');s=s.replace(new RegExp('<(img|br|hr)([^>]*)><\\/(img|br|hr)>','gi'),'<$1$2 />');if(tinyMCE.isIE)s=s.replace(new RegExp('<p><hr \\/><\\/p>','gi'),"<hr>");if(tinyMCE.isIE)s=s.replace(/<!(\s*)\/>/g,'');return s},parseStyle:function(str){var ar=[],st,i,re,pa;if(str==null)return ar;st=str.split(';');tinyMCE.clearArray(ar);for(i=0;i<st.length;i++){if(st[i]=='')continue;re=new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');pa=st[i].replace(re,'$1||$2').split('||');if(pa.length==2)ar[pa[0].toLowerCase()]=pa[1]}return ar},compressStyle:function(ar,pr,sf,res){var box=[],i,a;box[0]=ar[pr+'-top'+sf];box[1]=ar[pr+'-left'+sf];box[2]=ar[pr+'-right'+sf];box[3]=ar[pr+'-bottom'+sf];for(i=0;i<box.length;i++){if(box[i]==null)return;for(a=0;a<box.length;a++){if(box[a]!=box[i])return}}ar[res]=box[0];ar[pr+'-top'+sf]=null;ar[pr+'-left'+sf]=null;ar[pr+'-right'+sf]=null;ar[pr+'-bottom'+sf]=null},serializeStyle:function(ar){var str="",key,val,m;tinyMCE.compressStyle(ar,"border","","border");tinyMCE.compressStyle(ar,"border","-width","border-width");tinyMCE.compressStyle(ar,"border","-color","border-color");tinyMCE.compressStyle(ar,"border","-style","border-style");tinyMCE.compressStyle(ar,"padding","","padding");tinyMCE.compressStyle(ar,"margin","","margin");for(key in ar){val=ar[key];if(typeof(val)=='function')continue;if(key.indexOf('mso-')==0)continue;if(val!=null&&val!==''){val=''+val;val=val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)",'gi'),"url('$1')");if(val.indexOf('url(')!=-1&&tinyMCE.getParam('convert_urls')){m=new RegExp("url\\('(.*?)'\\)").exec(val);if(m.length>1)val="url('"+eval(tinyMCE.getParam('urlconverter_callback')+"(m[1], null, true);")+"')"}if(tinyMCE.getParam("force_hex_style_colors"))val=tinyMCE.convertRGBToHex(val,true);val=val.replace(/\"/g,'\'');if(val!="url('')")str+=key.toLowerCase()+": "+val+"; "}}if(new RegExp('; $').test(str))str=str.substring(0,str.length-2);return str},convertRGBToHex:function(s,k){var re,rgb;if(s.toLowerCase().indexOf('rgb')!=-1){re=new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)","gi");rgb=s.replace(re,"$1,$2,$3,$4,$5").split(',');if(rgb.length==5){r=parseInt(rgb[1]).toString(16);g=parseInt(rgb[2]).toString(16);b=parseInt(rgb[3]).toString(16);r=r.length==1?'0'+r:r;g=g.length==1?'0'+g:g;b=b.length==1?'0'+b:b;s="#"+r+g+b;if(k)s=rgb[0]+s+rgb[4]}}return s},convertHexToRGB:function(s){if(s.indexOf('#')!=-1){s=s.replace(new RegExp('[^0-9A-F]','gi'),'');return"rgb("+parseInt(s.substring(0,2),16)+","+parseInt(s.substring(2,4),16)+","+parseInt(s.substring(4,6),16)+")"}return s},convertSpansToFonts:function(doc){var s,i,size,fSize,x,fFace,fColor,sizes=tinyMCE.getParam('font_size_style_values').replace(/\s+/,'').split(',');s=tinyMCE.selectElements(doc,'span,font');for(i=0;i<s.length;i++){size=tinyMCE.trim(s[i].style.fontSize).toLowerCase();fSize=0;for(x=0;x<sizes.length;x++){if(sizes[x]==size){fSize=x+1;break}}if(fSize>0){tinyMCE.setAttrib(s[i],'size',fSize);s[i].style.fontSize=''}fFace=s[i].style.fontFamily;if(fFace!=null&&fFace!==''){tinyMCE.setAttrib(s[i],'face',fFace);s[i].style.fontFamily=''}fColor=s[i].style.color;if(fColor!=null&&fColor!==''){tinyMCE.setAttrib(s[i],'color',tinyMCE.convertRGBToHex(fColor));s[i].style.color=''}}},convertFontsToSpans:function(doc){var fsClasses,s,i,fSize,fFace,fColor,sizes=tinyMCE.getParam('font_size_style_values').replace(/\s+/,'').split(',');fsClasses=tinyMCE.getParam('font_size_classes');if(fsClasses!=='')fsClasses=fsClasses.replace(/\s+/,'').split(',');else fsClasses=null;s=tinyMCE.selectElements(doc,'span,font');for(i=0;i<s.length;i++){fSize=tinyMCE.getAttrib(s[i],'size');fFace=tinyMCE.getAttrib(s[i],'face');fColor=tinyMCE.getAttrib(s[i],'color');if(fSize!==''){fSize=parseInt(fSize);if(fSize>0&&fSize<8){if(fsClasses!=null)tinyMCE.setAttrib(s[i],'class',fsClasses[fSize-1]);else s[i].style.fontSize=sizes[fSize-1]}s[i].removeAttribute('size')}if(fFace!==''){s[i].style.fontFamily=fFace;s[i].removeAttribute('face')}if(fColor!==''){s[i].style.color=fColor;s[i].removeAttribute('color')}}},cleanupAnchors:function(doc){var i,cn,x,an=doc.getElementsByTagName("a");for(i=an.length-1;i>=0;i--){if(tinyMCE.getAttrib(an[i],"name")!==''&&tinyMCE.getAttrib(an[i],"href")==''){cn=an[i].childNodes;for(x=cn.length-1;x>=0;x--)tinyMCE.insertAfter(cn[x],an[i])}}},getContent:function(editor_id){if(typeof(editor_id)!="undefined")tinyMCE.getInstanceById(editor_id).select();if(tinyMCE.selectedInstance)return tinyMCE.selectedInstance.getHTML();return null},_fixListElements:function(d){var nl,x,a=['ol','ul'],i,n,p,r=new RegExp('^(OL|UL)$'),np;for(x=0;x<a.length;x++){nl=d.getElementsByTagName(a[x]);for(i=0;i<nl.length;i++){n=nl[i];p=n.parentNode;if(r.test(p.nodeName)){np=tinyMCE.prevNode(n,'LI');if(!np){np=d.createElement('li');np.innerHTML='&nbsp;';np.appendChild(n);p.insertBefore(np,p.firstChild)}else np.appendChild(n)}}}},_fixTables:function(d){var nl,i,n,p,np,x,t;nl=d.getElementsByTagName('table');for(i=0;i<nl.length;i++){n=nl[i];if((p=tinyMCE.getParentElement(n,'p,h1,h2,h3,h4,h5,h6'))!=null){np=p.cloneNode(false);np.removeAttribute('id');t=n;while((n=n.nextSibling))np.appendChild(n);tinyMCE.insertAfter(np,p);tinyMCE.insertAfter(t,p)}}},_cleanupHTML:function(inst,doc,config,elm,visual,on_save,on_submit,inn){var h,d,t1,t2,t3,t4,t5,c,s,nb;if(!tinyMCE.getParam('cleanup'))return elm.innerHTML;on_save=typeof(on_save)=='undefined'?false:on_save;c=inst.cleanup;s=inst.settings;d=c.settings.debug;if(d)t1=new Date().getTime();inst._fixRootBlocks();if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertFontsToSpans(doc);if(tinyMCE.getParam("fix_list_elements"))tinyMCE._fixListElements(doc);if(tinyMCE.getParam("fix_table_elements"))tinyMCE._fixTables(doc);tinyMCE._customCleanup(inst,on_save?"get_from_editor_dom":"insert_to_editor_dom",doc.body);if(d)t2=new Date().getTime();c.settings.on_save=on_save;c.idCount=0;c.serializationId=new Date().getTime().toString(32);c.serializedNodes=[];c.sourceIndex=-1;if(s.cleanup_serializer=="xml")h=c.serializeNodeAsXML(elm,inn);else h=c.serializeNodeAsHTML(elm,inn);if(d)t3=new Date().getTime();nb=tinyMCE.getParam('entity_encoding')=='numeric'?'&#160;':'&nbsp;';h=h.replace(/<\/?(body|head|html)[^>]*>/gi,'');h=h.replace(new RegExp(' (rowspan="1"|colspan="1")','g'),'');h=h.replace(/<p><hr \/><\/p>/g,'<hr />');h=h.replace(/<p>(&nbsp;|&#160;)<\/p><hr \/><p>(&nbsp;|&#160;)<\/p>/g,'<hr />');h=h.replace(/<td>\s*<br \/>\s*<\/td>/g,'<td>'+nb+'</td>');h=h.replace(/<p>\s*<br \/>\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(/<br \/>$/,'');h=h.replace(/<br \/><\/p>/g,'</p>');h=h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*(&nbsp;|&#160;)\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(/<p>\s*<br \/>\s*&nbsp;\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(new RegExp('<a>(.*?)<\\/a>','g'),'$1');h=h.replace(/<p([^>]*)>\s*<\/p>/g,'<p$1>'+nb+'</p>');if(/^\s*(<br \/>|<p>&nbsp;<\/p>|<p>&#160;<\/p>|<p><\/p>)\s*$/.test(h))h='';if(s.preformatted){h=h.replace(/^<pre>/,'');h=h.replace(/<\/pre>$/,'');h='<pre>'+h+'</pre>'}if(tinyMCE.isGecko){h=h.replace(/<br \/>\s*<\/li>/g,'</li>');h=h.replace(/&nbsp;\s*<\/(dd|dt)>/g,'</$1>');h=h.replace(/<o:p _moz-userdefined="" \/>/g,'');h=h.replace(/<td([^>]*)>\s*<br \/>\s*<\/td>/g,'<td$1>'+nb+'</td>')}if(s.force_br_newlines)h=h.replace(/<p>(&nbsp;|&#160;)<\/p>/g,'<br />');h=tinyMCE._customCleanup(inst,on_save?"get_from_editor":"insert_to_editor",h);if(on_save){h=h.replace(new RegExp(' ?(mceItem[a-zA-Z0-9]*|'+s.visual_table_class+')','g'),'');h=h.replace(new RegExp(' ?class=""','g'),'')}if(s.remove_linebreaks&&!c.settings.indent)h=h.replace(/\n|\r/g,' ');if(d)t4=new Date().getTime();if(on_save&&c.settings.indent)h=c.formatHTML(h);if(on_submit&&(s.encoding=="xml"||s.encoding=="html"))h=c.xmlEncode(h);if(d)t5=new Date().getTime();if(c.settings.debug)tinyMCE.debug("Cleanup in ms: Pre="+(t2-t1)+", Serialize: "+(t3-t2)+", Post: "+(t4-t3)+", Format: "+(t5-t4)+", Sum: "+(t5-t1)+".");return h}});function TinyMCE_Cleanup(){this.isIE=(navigator.appName=="Microsoft Internet Explorer");this.rules=tinyMCE.clearArray([]);this.settings={indent_elements:'head,table,tbody,thead,tfoot,form,tr,ul,ol,blockquote,object',newline_before_elements:'h1,h2,h3,h4,h5,h6,pre,address,div,ul,ol,li,meta,option,area,title,link,base,script,td',newline_after_elements:'br,hr,p,pre,address,div,ul,ol,meta,option,area,link,base,script',newline_before_after_elements:'html,head,body,table,thead,tbody,tfoot,tr,form,ul,ol,blockquote,p,object,param,hr,div',indent_char:'\t',indent_levels:1,entity_encoding:'raw',valid_elements:'*[*]',entities:'',url_converter:'',invalid_elements:'',verify_html:false};this.vElements=tinyMCE.clearArray([]);this.vElementsRe='';this.closeElementsRe=/^(IMG|BR|HR|LINK|META|BASE|INPUT|AREA)$/;this.codeElementsRe=/^(SCRIPT|STYLE)$/;this.serializationId=0;this.mceAttribs={href:'mce_href',src:'mce_src',type:'mce_type'}}TinyMCE_Cleanup.prototype={init:function(s){var n,a,i,ir,or,st;for(n in s)this.settings[n]=s[n];s=this.settings;this.inRe=this._arrayToRe(s.indent_elements.split(','),'','^<(',')[^>]*');this.ouRe=this._arrayToRe(s.indent_elements.split(','),'','^<\\/(',')[^>]*');this.nlBeforeRe=this._arrayToRe(s.newline_before_elements.split(','),'gi','<(',')([^>]*)>');this.nlAfterRe=this._arrayToRe(s.newline_after_elements.split(','),'gi','<(',')([^>]*)>');this.nlBeforeAfterRe=this._arrayToRe(s.newline_before_after_elements.split(','),'gi','<(\\/?)(',')([^>]*)>');this.serializedNodes=[];if(s.invalid_elements!=='')this.iveRe=this._arrayToRe(s.invalid_elements.toUpperCase().split(','),'g','^(',')$');else this.iveRe=null;st='';for(i=0;i<s.indent_levels;i++)st+=s.indent_char;this.inStr=st;if(!s.verify_html){s.valid_elements='*[*]';s.extended_valid_elements=''}this.fillStr=s.entity_encoding=="named"?"&nbsp;":"&#160;";this.idCount=0;this.xmlEncodeRe=new RegExp('[\u007F-\uFFFF<>&"]','g')},addRuleStr:function(s){var r=this.parseRuleStr(s),n;for(n in r){if(r[n])this.rules[n]=r[n]}this.vElements=tinyMCE.clearArray([]);for(n in this.rules){if(this.rules[n])this.vElements[this.vElements.length]=this.rules[n].tag}this.vElementsRe=this._arrayToRe(this.vElements,'')},isValid:function(n){if(!this.rulesDone)this._setupRules();if(!n)return true;n=n.replace(/[^a-z0-9]+/gi,'').toUpperCase();return!tinyMCE.getParam('cleanup')||this.vElementsRe.test(n)},addChildRemoveRuleStr:function(s){var x,y,p,i,t,tn,ta,cl,r;if(!s)return;ta=s.split(',');for(x=0;x<ta.length;x++){s=ta[x];p=this.split(/\[|\]/,s);if(p==null||p.length<1)t=s.toUpperCase();else t=p[0].toUpperCase();tn=this.split('/',t);for(y=0;y<tn.length;y++){r="^(";cl=this.split(/\|/,p[1]);for(i=0;i<cl.length;i++){if(cl[i]=='%istrict')r+=tinyMCE.inlineStrict;else if(cl[i]=='%itrans')r+=tinyMCE.inlineTransitional;else if(cl[i]=='%istrict_na')r+=tinyMCE.inlineStrict.substring(2);else if(cl[i]=='%itrans_na')r+=tinyMCE.inlineTransitional.substring(2);else if(cl[i]=='%btrans')r+=tinyMCE.blockElms;else if(cl[i]=='%strict')r+=tinyMCE.blockStrict;else r+=(cl[i].charAt(0)!='#'?cl[i].toUpperCase():cl[i]);r+=(i!=cl.length-1?'|':'')}r+=')$';if(this.childRules==null)this.childRules=tinyMCE.clearArray([]);this.childRules[tn[y]]=new RegExp(r);if(p.length>1)this.childRules[tn[y]].wrapTag=p[2]}}},parseRuleStr:function(s){var ta,p,r,a,i,x,px,t,tn,y,av,or=tinyMCE.clearArray([]),dv;if(s==null||s.length==0)return or;ta=s.split(',');for(x=0;x<ta.length;x++){s=ta[x];if(s.length==0)continue;p=this.split(/\[|\]/,s);if(p==null||p.length<1)t=s.toUpperCase();else t=p[0].toUpperCase();tn=this.split('/',t);for(y=0;y<tn.length;y++){r={};r.tag=tn[y];r.forceAttribs=null;r.defaultAttribs=null;r.validAttribValues=null;px=r.tag.charAt(0);r.forceOpen=px=='+';r.removeEmpty=px=='-';r.fill=px=='#';r.tag=r.tag.replace(/\+|-|#/g,'');r.oTagName=tn[0].replace(/\+|-|#/g,'').toLowerCase();r.isWild=new RegExp('\\*|\\?|\\+','g').test(r.tag);r.validRe=new RegExp(this._wildcardToRe('^'+r.tag+'$'));if(p.length>1){r.vAttribsRe='^(';a=this.split(/\|/,p[1]);for(i=0;i<a.length;i++){t=a[i];if(t.charAt(0)=='!'){a[i]=t=t.substring(1);if(!r.reqAttribsRe)r.reqAttribsRe='\\s+('+t;else r.reqAttribsRe+='|'+t}av=new RegExp('(=|:|<)(.*?)$').exec(t);t=t.replace(new RegExp('(=|:|<).*?$'),'');if(av&&av.length>0){if(av[0].charAt(0)==':'){if(!r.forceAttribs)r.forceAttribs=tinyMCE.clearArray([]);r.forceAttribs[t.toLowerCase()]=av[0].substring(1)}else if(av[0].charAt(0)=='='){if(!r.defaultAttribs)r.defaultAttribs=tinyMCE.clearArray([]);dv=av[0].substring(1);r.defaultAttribs[t.toLowerCase()]=dv==''?"mce_empty":dv}else if(av[0].charAt(0)=='<'){if(!r.validAttribValues)r.validAttribValues=tinyMCE.clearArray([]);r.validAttribValues[t.toLowerCase()]=this._arrayToRe(this.split('?',av[0].substring(1)),'i')}}r.vAttribsRe+=''+t.toLowerCase()+(i!=a.length-1?'|':'');a[i]=t.toLowerCase()}if(r.reqAttribsRe)r.reqAttribsRe=new RegExp(r.reqAttribsRe+')=\"','g');r.vAttribsRe+=')$';r.vAttribsRe=this._wildcardToRe(r.vAttribsRe);r.vAttribsReIsWild=new RegExp('\\*|\\?|\\+','g').test(r.vAttribsRe);r.vAttribsRe=new RegExp(r.vAttribsRe);r.vAttribs=a.reverse();}else{r.vAttribsRe='';r.vAttribs=tinyMCE.clearArray([]);r.vAttribsReIsWild=false}or[r.tag]=r}}return or},serializeNodeAsXML:function(n){var s,b;if(!this.xmlDoc){if(this.isIE){try{this.xmlDoc=new ActiveXObject('MSXML2.DOMDocument')}catch(e){}if(!this.xmlDoc)try{this.xmlDoc=new ActiveXObject('Microsoft.XmlDom')}catch(e){}}else this.xmlDoc=document.implementation.createDocument('','',null);if(!this.xmlDoc)alert("Error XML Parser could not be found.")}if(this.xmlDoc.firstChild)this.xmlDoc.removeChild(this.xmlDoc.firstChild);b=this.xmlDoc.createElement("html");b=this.xmlDoc.appendChild(b);this._convertToXML(n,b);if(this.isIE)return this.xmlDoc.xml;else return new XMLSerializer().serializeToString(this.xmlDoc)},_convertToXML:function(n,xn){var xd,el,i,l,cn,at,no,hc=false;if(tinyMCE.isRealIE&&this._isDuplicate(n))return;xd=this.xmlDoc;switch(n.nodeType){case 1:hc=n.hasChildNodes();el=xd.createElement(n.nodeName.toLowerCase());at=n.attributes;for(i=at.length-1;i>-1;i--){no=at[i];if(no.specified&&no.nodeValue)el.setAttribute(no.nodeName.toLowerCase(),no.nodeValue)}if(!hc&&!this.closeElementsRe.test(n.nodeName))el.appendChild(xd.createTextNode(""));xn=xn.appendChild(el);break;case 3:xn.appendChild(xd.createTextNode(n.nodeValue));return;case 8:xn.appendChild(xd.createComment(n.nodeValue));return}if(hc){cn=n.childNodes;for(i=0,l=cn.length;i<l;i++)this._convertToXML(cn[i],xn)}},serializeNodeAsHTML:function(n,inn){var en,no,h='',i,l,t,st,r,cn,va=false,f=false,at,hc,cr,nn;if(!this.rulesDone)this._setupRules();if(tinyMCE.isRealIE&&this._isDuplicate(n))return'';if(n.parentNode&&this.childRules!=null){cr=this.childRules[n.parentNode.nodeName];if(typeof(cr)!="undefined"&&!cr.test(n.nodeName)){st=true;t=null}}switch(n.nodeType){case 1:hc=n.hasChildNodes();if(st)break;nn=n.nodeName;if(tinyMCE.isRealIE){if(n.nodeName.indexOf('/')!=-1)break;if(n.scopeName&&n.scopeName!='HTML')nn=n.scopeName.toUpperCase()+':'+nn.toUpperCase()}else if(tinyMCE.isOpera&&nn.indexOf(':')>0)nn=nn.toUpperCase();if(this.settings.convert_fonts_to_spans){if(this.settings.on_save&&nn=='FONT')nn='SPAN';if(!this.settings.on_save&&nn=='SPAN')nn='FONT'}if(this.vElementsRe.test(nn)&&(!this.iveRe||!this.iveRe.test(nn))&&!inn){va=true;r=this.rules[nn];if(!r){at=this.rules;for(no in at){if(at[no]&&at[no].validRe.test(nn)){r=at[no];break}}}en=r.isWild?nn.toLowerCase():r.oTagName;f=r.fill;if(r.removeEmpty&&!hc)return"";t='<'+en;if(r.vAttribsReIsWild){at=n.attributes;for(i=at.length-1;i>-1;i--){no=at[i];if(no.specified&&r.vAttribsRe.test(no.nodeName))t+=this._serializeAttribute(n,r,no.nodeName)}}else{for(i=r.vAttribs.length-1;i>-1;i--)t+=this._serializeAttribute(n,r,r.vAttribs[i])}if(!this.settings.on_save){at=this.mceAttribs;for(no in at){if(at[no])t+=this._serializeAttribute(n,r,at[no])}}if(r.reqAttribsRe&&!t.match(r.reqAttribsRe))t=null;if(t!=null&&this.closeElementsRe.test(nn))return t+' />';if(t!=null)h+=t+'>';if(this.isIE&&this.codeElementsRe.test(nn))h+=n.innerHTML}break;case 3:if(st)break;if(n.parentNode&&this.codeElementsRe.test(n.parentNode.nodeName))return this.isIE?'':n.nodeValue;return this.xmlEncode(n.nodeValue);case 8:if(st)break;return"<!--"+this._trimComment(n.nodeValue)+"-->"}if(hc){cn=n.childNodes;for(i=0,l=cn.length;i<l;i++)h+=this.serializeNodeAsHTML(cn[i])}if(f&&!hc)h+=this.fillStr;if(t!=null&&va)h+='</'+en+'>';return h},_serializeAttribute:function(n,r,an){var av='',t,os=this.settings.on_save;if(os&&(an.indexOf('mce_')==0||an.indexOf('_moz')==0))return'';if(os&&this.mceAttribs[an])av=this._getAttrib(n,this.mceAttribs[an]);if(av.length==0)av=this._getAttrib(n,an);if(av.length==0&&r.defaultAttribs&&(t=r.defaultAttribs[an])){av=t;if(av=="mce_empty")return" "+an+'=""'}if(r.forceAttribs&&(t=r.forceAttribs[an]))av=t;if(os&&av.length!=0&&/^(src|href|longdesc)$/.test(an))av=this._urlConverter(this,n,av);if(av.length!=0&&r.validAttribValues&&r.validAttribValues[an]&&!r.validAttribValues[an].test(av))return"";if(av.length!=0&&av=="{$uid}")av="uid_"+(this.idCount++);if(av.length!=0){if(an.indexOf('on')!=0)av=this.xmlEncode(av,1);return" "+an+"="+'"'+av+'"'}return""},formatHTML:function(h){var s=this.settings,p='',i=0,li=0,o='',l;h=h.replace(/<pre([^>]*)>(.*?)<\/pre>/gi,function(a,b,c){c=c.replace(/<br\s*\/>/gi,'\n');return'<pre'+b+'>'+c+'</pre>'});h=h.replace(/\r/g,'');h='\n'+h;h=h.replace(new RegExp('\\n\\s+','gi'),'\n');h=h.replace(this.nlBeforeRe,'\n<$1$2>');h=h.replace(this.nlAfterRe,'<$1$2>\n');h=h.replace(this.nlBeforeAfterRe,'\n<$1$2$3>\n');h+='\n';while((i=h.indexOf('\n',i+1))!=-1){if((l=h.substring(li+1,i)).length!=0){if(this.ouRe.test(l)&&p.length>=s.indent_levels)p=p.substring(s.indent_levels);o+=p+l+'\n';if(this.inRe.test(l))p+=this.inStr}li=i}return o},xmlEncode:function(s){var cl=this,re=this.xmlEncodeRe;if(!this.entitiesDone)this._setupEntities();switch(this.settings.entity_encoding){case"raw":return tinyMCE.xmlEncode(s);case"named":return s.replace(re,function(c){var b=cl.entities[c.charCodeAt(0)];return b?'&'+b+';':c});case"numeric":return s.replace(re,function(c){return'&#'+c.charCodeAt(0)+';'})}return s},split:function(re,s){var i,l,o=[],c=s.split(re);for(i=0,l=c.length;i<l;i++){if(c[i]!=='')o[i]=c[i]}return o},_trimComment:function(s){s=s.replace(new RegExp('\\smce_src=\"[^\"]*\"','gi'),"");s=s.replace(new RegExp('\\smce_href=\"[^\"]*\"','gi'),"");return s},_getAttrib:function(e,n,d){var v,ex,nn;if(typeof(d)=="undefined")d="";if(!e||e.nodeType!=1)return d;try{v=e.getAttribute(n,0)}catch(ex){v=e.getAttribute(n,2)}if(n=="class"&&!v)v=e.className;if(this.isIE){if(n=="http-equiv")v=e.httpEquiv;nn=e.nodeName;if(nn=="FORM"&&n=="enctype"&&v=="application/x-www-form-urlencoded")v="";if(nn=="INPUT"&&n=="size"&&v=="20")v="";if(nn=="INPUT"&&n=="maxlength"&&v=="2147483647")v="";if(n=="width"||n=="height")v=e.getAttribute(n,2)}if(n=='style'&&v){if(!tinyMCE.isOpera)v=e.style.cssText;v=tinyMCE.serializeStyle(tinyMCE.parseStyle(v))}if(this.settings.on_save&&n.indexOf('on')!=-1&&this.settings.on_save&&v&&v!=='')v=tinyMCE.cleanupEventStr(v);return(v&&v!=='')?''+v:d},_urlConverter:function(c,n,v){if(!c.settings.on_save)return tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,v);else if(tinyMCE.getParam('convert_urls')){if(!this.urlConverter)this.urlConverter=eval(tinyMCE.settings.urlconverter_callback);return this.urlConverter(v,n,true)}return v},_arrayToRe:function(a,op,be,af){var i,r;op=typeof(op)=="undefined"?"gi":op;be=typeof(be)=="undefined"?"^(":be;af=typeof(af)=="undefined"?")$":af;r=be;for(i=0;i<a.length;i++)r+=this._wildcardToRe(a[i])+(i!=a.length-1?"|":"");r+=af;return new RegExp(r,op)},_wildcardToRe:function(s){s=s.replace(/\?/g,'(\\S?)');s=s.replace(/\+/g,'(\\S+)');s=s.replace(/\*/g,'(\\S*)');return s},_setupEntities:function(){var n,a,i,s=this.settings;if(s.entity_encoding=="named"){n=tinyMCE.clearArray([]);a=this.split(',',s.entities);for(i=0;i<a.length;i+=2)n[a[i]]=a[i+1];this.entities=n}this.entitiesDone=true},_setupRules:function(){var s=this.settings;this.addRuleStr(s.valid_elements);this.addRuleStr(s.extended_valid_elements);this.addChildRemoveRuleStr(s.valid_child_elements);this.rulesDone=true},_isDuplicate:function(n){var i,l,sn;if(!this.settings.fix_content_duplication)return false;if(tinyMCE.isRealIE&&n.nodeType==1){if(n.mce_serialized==this.serializationId)return true;n.setAttribute('mce_serialized',this.serializationId)}else{sn=this.serializedNodes;for(i=0,l=sn.length;i<l;i++){if(sn[i]==n)return true}sn.push(n)}return false}};tinyMCE.add(TinyMCE_Engine,{createTagHTML:function(tn,a,h){var o='',f=tinyMCE.xmlEncode,n;o='<'+tn;if(a){for(n in a){if(typeof(a[n])!='function'&&a[n]!=null)o+=' '+f(n)+'="'+f(''+a[n])+'"'}}o+=!h?' />':'>'+h+'</'+tn+'>';return o},createTag:function(d,tn,a,h){var o=d.createElement(tn),n;if(a){for(n in a){if(typeof(a[n])!='function'&&a[n]!=null)tinyMCE.setAttrib(o,n,a[n])}}if(h)o.innerHTML=h;return o},getElementByAttributeValue:function(n,e,a,v){return(n=this.getElementsByAttributeValue(n,e,a,v)).length==0?null:n[0]},getElementsByAttributeValue:function(n,e,a,v){var i,nl=n.getElementsByTagName(e),o=[];for(i=0;i<nl.length;i++){if(tinyMCE.getAttrib(nl[i],a).indexOf(v)!=-1)o[o.length]=nl[i]}return o},isBlockElement:function(n){return n!=null&&n.nodeType==1&&this.blockRegExp.test(n.nodeName)},getParentBlockElement:function(n,r){return this.getParentNode(n,function(n){return tinyMCE.isBlockElement(n)},r);return null},insertAfter:function(n,r){if(r.nextSibling)r.parentNode.insertBefore(n,r.nextSibling);else r.parentNode.appendChild(n)},setInnerHTML:function(e,h){var i,nl,n;if(tinyMCE.isGecko){h=h.replace(/<embed([^>]*)>/gi,'<tmpembed$1>');h=h.replace(/<em([^>]*)>/gi,'<i$1>');h=h.replace(/<tmpembed([^>]*)>/gi,'<embed$1>');h=h.replace(/<strong([^>]*)>/gi,'<b$1>');h=h.replace(/<\/strong>/gi,'</b>');h=h.replace(/<\/em>/gi,'</i>')}if(tinyMCE.isRealIE){h=h.replace(/\s\/>/g,'>');h=h.replace(/<p([^>]*)>\u00A0?<\/p>/gi,'<p$1 mce_keep="true">&nbsp;</p>');h=h.replace(/<p([^>]*)>\s*&nbsp;\s*<\/p>/gi,'<p$1 mce_keep="true">&nbsp;</p>');h=h.replace(/<p([^>]*)>\s+<\/p>/gi,'<p$1 mce_keep="true">&nbsp;</p>');e.innerHTML=tinyMCE.uniqueTag+h;e.firstChild.removeNode(true);nl=e.getElementsByTagName("p");for(i=nl.length-1;i>=0;i--){n=nl[i];if(n.nodeName=='P'&&!n.hasChildNodes()&&!n.mce_keep)n.parentNode.removeChild(n)}}else{h=this.fixGeckoBaseHREFBug(1,e,h);e.innerHTML=h;this.fixGeckoBaseHREFBug(2,e,h)}},getOuterHTML:function(e){var d;if(tinyMCE.isIE)return e.outerHTML;d=e.ownerDocument.createElement("body");d.appendChild(e.cloneNode(true));return d.innerHTML},setOuterHTML:function(e,h,d){var d=typeof(d)=="undefined"?e.ownerDocument:d,i,nl,t;if(tinyMCE.isIE&&e.nodeType==1)e.outerHTML=h;else{t=d.createElement("body");t.innerHTML=h;for(i=0,nl=t.childNodes;i<nl.length;i++)e.parentNode.insertBefore(nl[i].cloneNode(true),e);e.parentNode.removeChild(e)}},_getElementById:function(id,d){var e,i,j,f;if(typeof(d)=="undefined")d=document;e=d.getElementById(id);if(!e){f=d.forms;for(i=0;i<f.length;i++){for(j=0;j<f[i].elements.length;j++){if(f[i].elements[j].name==id){e=f[i].elements[j];break}}}}return e},getNodeTree:function(n,na,t,nn){return this.selectNodes(n,function(n){return(!t||n.nodeType==t)&&(!nn||n.nodeName==nn)},na?na:[])},getParentElement:function(n,na,f,r){var re=na?new RegExp('^('+na.toUpperCase().replace(/,/g,'|')+')$'):0,v;if(f&&typeof(f)=='string')return this.getParentElement(n,na,function(no){return tinyMCE.getAttrib(no,f)!==''});return this.getParentNode(n,function(n){return((n.nodeType==1&&!re)||(re&&re.test(n.nodeName)))&&(!f||f(n))},r)},getParentNode:function(n,f,r){while(n){if(n==r)return null;if(f(n))return n;n=n.parentNode}return null},getAttrib:function(elm,name,dv){var v;if(typeof(dv)=="undefined")dv="";if(!elm||elm.nodeType!=1)return dv;try{v=elm.getAttribute(name,0)}catch(ex){v=elm.getAttribute(name,2)}if(name=="class"&&!v)v=elm.className;if(tinyMCE.isGecko){if(name=="src"&&elm.src!=null&&elm.src!=='')v=elm.src;if(name=="href"&&elm.href!=null&&elm.href!=='')v=elm.href}else if(tinyMCE.isIE){switch(name){case"http-equiv":v=elm.httpEquiv;break;case"width":case"height":v=elm.getAttribute(name,2);break}}if(name=="style"&&!tinyMCE.isOpera)v=elm.style.cssText;return(v&&v!=='')?v:dv},setAttrib:function(el,name,va,fix){if(typeof(va)=="number"&&va!=null)va=""+va;if(fix){if(va==null)va="";va=va.replace(/[^0-9%]/g,'')}if(name=="style")el.style.cssText=va;if(name=="class")el.className=va;if(va!=null&&va!==''&&va!=-1)el.setAttribute(name,va);else el.removeAttribute(name)},setStyleAttrib:function(e,n,v){e.style[n]=v;if(tinyMCE.isIE&&v==null||v==''){v=tinyMCE.serializeStyle(tinyMCE.parseStyle(e.style.cssText));e.style.cssText=v;e.setAttribute("style",v)}},switchClass:function(ei,c){var e;if(tinyMCE.switchClassCache[ei])e=tinyMCE.switchClassCache[ei];else e=tinyMCE.switchClassCache[ei]=document.getElementById(ei);if(e){if(tinyMCE.settings.button_tile_map&&e.className&&e.className.indexOf('mceTiledButton')==0)c='mceTiledButton '+c;e.className=c}},getAbsPosition:function(n,cn){var l=0,t=0;while(n&&n!=cn){l+=n.offsetLeft;t+=n.offsetTop;n=n.offsetParent}return{absLeft:l,absTop:t}},prevNode:function(e,n){var a=n.split(','),i;while((e=e.previousSibling)!=null){for(i=0;i<a.length;i++){if(e.nodeName==a[i])return e}}return null},nextNode:function(e,n){var a=n.split(','),i;while((e=e.nextSibling)!=null){for(i=0;i<a.length;i++){if(e.nodeName==a[i])return e}}return null},selectElements:function(n,na,f){var i,a=[],nl,x;for(x=0,na=na.split(',');x<na.length;x++)for(i=0,nl=n.getElementsByTagName(na[x]);i<nl.length;i++)(!f||f(nl[i]))&&a.push(nl[i]);return a},selectNodes:function(n,f,a){var i;if(!a)a=[];if(f(n))a[a.length]=n;if(n.hasChildNodes()){for(i=0;i<n.childNodes.length;i++)tinyMCE.selectNodes(n.childNodes[i],f,a)}return a},addCSSClass:function(e,c,b){var o=this.removeCSSClass(e,c);return e.className=b?c+(o!==''?(' '+o):''):(o!==''?(o+' '):'')+c},removeCSSClass:function(e,c){c=e.className.replace(new RegExp("(^|\\s+)"+c+"(\\s+|$)"),' ');return e.className=c!=' '?c:''},hasCSSClass:function(n,c){return new RegExp('\\b'+c+'\\b','g').test(n.className)},renameElement:function(e,n,d){var ne,i,ar;d=typeof(d)=="undefined"?tinyMCE.selectedInstance.getDoc():d;if(e){ne=d.createElement(n);ar=e.attributes;for(i=ar.length-1;i>-1;i--){if(ar[i].specified&&ar[i].nodeValue)ne.setAttribute(ar[i].nodeName.toLowerCase(),ar[i].nodeValue)}ar=e.childNodes;for(i=0;i<ar.length;i++)ne.appendChild(ar[i].cloneNode(true));e.parentNode.replaceChild(ne,e)}},getViewPort:function(w){var d=w.document,m=d.compatMode=='CSS1Compat',b=d.body,de=d.documentElement;return{left:w.pageXOffset||(m?de.scrollLeft:b.scrollLeft),top:w.pageYOffset||(m?de.scrollTop:b.scrollTop),width:w.innerWidth||(m?de.clientWidth:b.clientWidth),height:w.innerHeight||(m?de.clientHeight:b.clientHeight)}},getStyle:function(n,na,d){if(!n)return false;if(tinyMCE.isGecko&&n.ownerDocument.defaultView){try{return n.ownerDocument.defaultView.getComputedStyle(n,null).getPropertyValue(na)}catch(n){return null}}na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase()});if(n.currentStyle)return n.currentStyle[na];return false}});tinyMCE.add(TinyMCE_Engine,{parseURL:function(url_str){var urlParts=[],i,pos,lastPos,chr;if(url_str){pos=url_str.indexOf('://');if(pos!=-1){urlParts.protocol=url_str.substring(0,pos);lastPos=pos+3}for(i=lastPos;i<url_str.length;i++){chr=url_str.charAt(i);if(chr==':')break;if(chr=='/')break}pos=i;urlParts.host=url_str.substring(lastPos,pos);urlParts.port="";lastPos=pos;if(url_str.charAt(pos)==':'){pos=url_str.indexOf('/',lastPos);urlParts.port=url_str.substring(lastPos+1,pos)}lastPos=pos;pos=url_str.indexOf('?',lastPos);if(pos==-1)pos=url_str.indexOf('#',lastPos);if(pos==-1)pos=url_str.length;urlParts.path=url_str.substring(lastPos,pos);lastPos=pos;if(url_str.charAt(pos)=='?'){pos=url_str.indexOf('#');pos=(pos==-1)?url_str.length:pos;urlParts.query=url_str.substring(lastPos+1,pos)}lastPos=pos;if(url_str.charAt(pos)=='#'){pos=url_str.length;urlParts.anchor=url_str.substring(lastPos+1,pos)}}return urlParts},serializeURL:function(up){var o="";if(up.protocol)o+=up.protocol+"://";if(up.host)o+=up.host;if(up.port)o+=":"+up.port;if(up.path)o+=up.path;if(up.query)o+="?"+up.query;if(up.anchor)o+="#"+up.anchor;return o},convertAbsoluteURLToRelativeURL:function(base_url,url_to_relative){var baseURL=this.parseURL(base_url),targetURL=this.parseURL(url_to_relative);var i,strTok1,strTok2,breakPoint=0,outPath="",forceSlash=false;var fileName,pos;if(targetURL.path=='')targetURL.path="/";else forceSlash=true;base_url=baseURL.path.substring(0,baseURL.path.lastIndexOf('/'));strTok1=base_url.split('/');strTok2=targetURL.path.split('/');if(strTok1.length>=strTok2.length){for(i=0;i<strTok1.length;i++){if(i>=strTok2.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break}}}if(strTok1.length<strTok2.length){for(i=0;i<strTok2.length;i++){if(i>=strTok1.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break}}}if(breakPoint==1)return targetURL.path;for(i=0;i<(strTok1.length-(breakPoint-1));i++)outPath+="../";for(i=breakPoint-1;i<strTok2.length;i++){if(i!=(breakPoint-1))outPath+="/"+strTok2[i];else outPath+=strTok2[i]}targetURL.protocol=null;targetURL.host=null;targetURL.port=null;targetURL.path=outPath==''&&forceSlash?"/":outPath;fileName=baseURL.path;if((pos=fileName.lastIndexOf('/'))!=-1)fileName=fileName.substring(pos+1);if(fileName==targetURL.path&&targetURL.anchor!=='')targetURL.path="";if(targetURL.path==''&&!targetURL.anchor)targetURL.path=fileName!==''?fileName:"/";return this.serializeURL(targetURL)},convertRelativeToAbsoluteURL:function(base_url,relative_url){var baseURL=this.parseURL(base_url),baseURLParts,relURLParts,newRelURLParts,numBack,relURL=this.parseURL(relative_url),i;var len,absPath,start,end,newBaseURLParts;if(relative_url==''||relative_url.indexOf('://')!=-1||/^(mailto:|javascript:|#|\/)/.test(relative_url))return relative_url;baseURLParts=baseURL.path.split('/');relURLParts=relURL.path.split('/');newBaseURLParts=[];for(i=baseURLParts.length-1;i>=0;i--){if(baseURLParts[i].length==0)continue;newBaseURLParts[newBaseURLParts.length]=baseURLParts[i]}baseURLParts=newBaseURLParts.reverse();newRelURLParts=[];numBack=0;for(i=relURLParts.length-1;i>=0;i--){if(relURLParts[i].length==0||relURLParts[i]==".")continue;if(relURLParts[i]=='..'){numBack++;continue}if(numBack>0){numBack--;continue}newRelURLParts[newRelURLParts.length]=relURLParts[i]}relURLParts=newRelURLParts.reverse();len=baseURLParts.length-numBack;absPath=(len<=0?"":"/")+baseURLParts.slice(0,len).join('/')+"/"+relURLParts.join('/');start="";end="";relURL.protocol=baseURL.protocol;relURL.host=baseURL.host;relURL.port=baseURL.port;if(relURL.path.charAt(relURL.path.length-1)=="/")absPath+="/";relURL.path=absPath;return this.serializeURL(relURL)},convertURL:function(url,node,on_save){var dl=document.location,start,portPart,urlParts,baseUrlParts,tmpUrlParts,curl;var prot=dl.protocol,host=dl.hostname,port=dl.port;if(prot=="file:")return url;url=tinyMCE.regexpReplace(url,'(http|https):///','/');if(url.indexOf('mailto:')!=-1||url.indexOf('javascript:')!=-1||/^[ \t\r\n\+]*[#\?]/.test(url))return url;if(!tinyMCE.isIE&&!on_save&&url.indexOf("://")==-1&&url.charAt(0)!='/')return tinyMCE.settings.base_href+url;if(on_save&&tinyMCE.getParam('relative_urls')){curl=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,url);if(curl.charAt(0)=='/')curl=tinyMCE.settings.document_base_prefix+curl;urlParts=tinyMCE.parseURL(curl);tmpUrlParts=tinyMCE.parseURL(tinyMCE.settings.document_base_url);if(urlParts.host==tmpUrlParts.host&&(urlParts.port==tmpUrlParts.port))return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings.document_base_url,curl)}if(!tinyMCE.getParam('relative_urls')){urlParts=tinyMCE.parseURL(url);baseUrlParts=tinyMCE.parseURL(tinyMCE.settings.base_href);url=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,url);if(urlParts.anchor&&urlParts.path==baseUrlParts.path)return"#"+urlParts.anchor}if(tinyMCE.getParam('remove_script_host')){start="";portPart="";if(port!=='')portPart=":"+port;start=prot+"//"+host+portPart+"/";if(url.indexOf(start)==0)url=url.substring(start.length-1)}return url},convertAllRelativeURLs:function(body){var i,elms,src,href,mhref,msrc;elms=body.getElementsByTagName("img");for(i=0;i<elms.length;i++){src=tinyMCE.getAttrib(elms[i],'src');msrc=tinyMCE.getAttrib(elms[i],'mce_src');if(msrc!=='')src=msrc;if(src!==''){src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,src);elms[i].setAttribute("src",src)}}elms=body.getElementsByTagName("a");for(i=0;i<elms.length;i++){href=tinyMCE.getAttrib(elms[i],'href');mhref=tinyMCE.getAttrib(elms[i],'mce_href');if(mhref!=='')href=mhref;if(href&&href!==''){href=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,href);elms[i].setAttribute("href",href)}}}});tinyMCE.add(TinyMCE_Engine,{clearArray:function(a){var n;for(n in a)a[n]=null;return a},explode:function(d,s){var ar=s.split(d),oar=[],i;for(i=0;i<ar.length;i++){if(ar[i]!=='')oar[oar.length]=ar[i]}return oar}});tinyMCE.add(TinyMCE_Engine,{_setEventsEnabled:function(node,state){var evs,x,y,elms,i,event;var events=['onfocus','onblur','onclick','ondblclick','onmousedown','onmouseup','onmouseover','onmousemove','onmouseout','onkeypress','onkeydown','onkeydown','onkeyup'];evs=tinyMCE.settings.event_elements.split(',');for(y=0;y<evs.length;y++){elms=node.getElementsByTagName(evs[y]);for(i=0;i<elms.length;i++){event="";for(x=0;x<events.length;x++){if((event=tinyMCE.getAttrib(elms[i],events[x]))!==''){event=tinyMCE.cleanupEventStr(""+event);if(!state)event="return true;"+event;else event=event.replace(/^return true;/gi,'');elms[i].removeAttribute(events[x]);elms[i].setAttribute(events[x],event)}}}}},_eventPatch:function(editor_id){var n,inst,win,e;if(typeof(tinyMCE)=="undefined")return true;try{if(tinyMCE.selectedInstance){win=tinyMCE.selectedInstance.getWin();if(win&&win.event){e=win.event;if(!e.target)e.target=e.srcElement;TinyMCE_Engine.prototype.handleEvent(e);return}}for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.select();win=inst.getWin();if(win&&win.event){e=win.event;if(!e.target)e.target=e.srcElement;TinyMCE_Engine.prototype.handleEvent(e);return}}}catch(ex){}},findEvent:function(e){var n,inst;if(e)return e;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(tinyMCE.isInstance(inst)&&inst.getWin().event)return inst.getWin().event}return null},unloadHandler:function(){tinyMCE.triggerSave(true,true)},addEventHandlers:function(inst){this.setEventHandlers(inst,1)},setEventHandlers:function(inst,s){var doc=inst.getDoc(),ie,ot,i,f=s?tinyMCE.addEvent:tinyMCE.removeEvent;ie=['keypress','keyup','keydown','click','mouseup','mousedown','controlselect','dblclick'];ot=['keypress','keyup','keydown','click','mouseup','mousedown','focus','blur','dragdrop'];inst.switchSettings();if(tinyMCE.isIE){for(i=0;i<ie.length;i++)f(doc,ie[i],TinyMCE_Engine.prototype._eventPatch)}else{for(i=0;i<ot.length;i++)f(doc,ot[i],tinyMCE.handleEvent);try{doc.designMode="On"}catch(e){}}},onMouseMove:function(){var inst,lh;if(tinyMCE.lastHover){lh=tinyMCE.lastHover;if(lh.className.indexOf('mceMenu')!=-1)tinyMCE._menuButtonEvent('out',lh);else lh.className=lh.className;tinyMCE.lastHover=null}if(!tinyMCE.hasMouseMoved){inst=tinyMCE.selectedInstance;if(inst.isFocused){inst.undoBookmark=inst.selection.getBookmark();tinyMCE.hasMouseMoved=true}}},cancelEvent:function(e){if(!e)return false;if(tinyMCE.isIE){e.returnValue=false;e.cancelBubble=true}else{e.preventDefault();e.stopPropagation&&e.stopPropagation()}return false},addEvent:function(o,n,h){if(n!='unload'){function clean(){var ex;try{tinyMCE.removeEvent(o,n,h);tinyMCE.removeEvent(window,'unload',clean);o=n=h=null}catch(ex){}}tinyMCE.addEvent(window,'unload',clean)}if(o.attachEvent)o.attachEvent("on"+n,h);else o.addEventListener(n,h,false)},removeEvent:function(o,n,h){if(o.detachEvent)o.detachEvent("on"+n,h);else o.removeEventListener(n,h,false)},addSelectAccessibility:function(e,s,w){if(!s._isAccessible){s.onkeydown=tinyMCE.accessibleEventHandler;s.onblur=tinyMCE.accessibleEventHandler;s._isAccessible=true;s._win=w}return false},accessibleEventHandler:function(e){var elm,win=this._win;e=tinyMCE.isIE?win.event:e;elm=tinyMCE.isIE?e.srcElement:e.target;if(e.type=="blur"){if(elm.oldonchange){elm.onchange=elm.oldonchange;elm.oldonchange=null}return true}if(elm.nodeName=="SELECT"&&!elm.oldonchange){elm.oldonchange=elm.onchange;elm.onchange=null}if(e.keyCode==13||e.keyCode==32){elm.onchange=elm.oldonchange;elm.onchange();elm.oldonchange=null;tinyMCE.cancelEvent(e);return false}return true},_resetIframeHeight:function(){var ife;if(tinyMCE.isRealIE){ife=tinyMCE.selectedInstance.iframeElement;if(ife._oldHeight){ife.style.height=ife._oldHeight;ife.height=ife._oldHeight}}}});function TinyMCE_Selection(inst){this.instance=inst};TinyMCE_Selection.prototype={getSelectedHTML:function(){var inst=this.instance,e,r=this.getRng(),h;if(!r)return null;e=document.createElement("body");if(r.cloneContents)e.appendChild(r.cloneContents());else if(typeof(r.item)!='undefined'||typeof(r.htmlText)!='undefined')e.innerHTML=r.item?r.item(0).outerHTML:r.htmlText;else e.innerHTML=r.toString();h=tinyMCE._cleanupHTML(inst,inst.contentDocument,inst.settings,e,e,false,true,false);return h},getSelectedText:function(){var inst=this.instance,d,r,s,t;if(tinyMCE.isIE){d=inst.getDoc();if(d.selection.type=="Text"){r=d.selection.createRange();t=r.text}else t=''}else{s=this.getSel();if(s&&s.toString)t=s.toString();else t=''}return t},getBookmark:function(simple){var inst=this.instance,rng=this.getRng(),doc=inst.getDoc(),b=inst.getBody();var trng,sx,sy,xx=-999999999,vp=inst.getViewPort();var sp,le,s,e,nl,i,si,ei,w;sx=vp.left;sy=vp.top;if(simple)return{rng:rng,scrollX:sx,scrollY:sy};if(tinyMCE.isRealIE){if(rng.item){e=rng.item(0);nl=b.getElementsByTagName(e.nodeName);for(i=0;i<nl.length;i++){if(e==nl[i]){sp=i;break}}return{tag:e.nodeName,index:sp,scrollX:sx,scrollY:sy}}else{trng=doc.body.createTextRange();trng.moveToElementText(inst.getBody());trng.collapse(true);bp=Math.abs(trng.move('character',xx));trng=rng.duplicate();trng.collapse(true);sp=Math.abs(trng.move('character',xx));trng=rng.duplicate();trng.collapse(false);le=Math.abs(trng.move('character',xx))-sp;return{start:sp-bp,length:le,scrollX:sx,scrollY:sy}}}else{s=this.getSel();e=this.getFocusElement();if(!s)return null;if(e&&e.nodeName=='IMG'){return{start:-1,end:-1,index:sp,scrollX:sx,scrollY:sy}}if(s.anchorNode==s.focusNode&&s.anchorOffset==s.focusOffset){e=this._getPosText(b,s.anchorNode,s.focusNode);if(!e)return{scrollX:sx,scrollY:sy};return{start:e.start+s.anchorOffset,end:e.end+s.focusOffset,scrollX:sx,scrollY:sy}}else{e=this._getPosText(b,rng.startContainer,rng.endContainer);if(!e)return{scrollX:sx,scrollY:sy};return{start:e.start+rng.startOffset,end:e.end+rng.endOffset,scrollX:sx,scrollY:sy}}}return null},moveToBookmark:function(bookmark){var inst=this.instance,rng,nl,i,ex,b=inst.getBody(),sd;var doc=inst.getDoc(),win=inst.getWin(),sel=this.getSel();if(!bookmark)return false;if(tinyMCE.isSafari&&bookmark.rng){sel.setBaseAndExtent(bookmark.rng.startContainer,bookmark.rng.startOffset,bookmark.rng.endContainer,bookmark.rng.endOffset);return true}if(tinyMCE.isRealIE){if(bookmark.rng){try{bookmark.rng.select()}catch(ex){}return true}win.focus();if(bookmark.tag){rng=b.createControlRange();nl=b.getElementsByTagName(bookmark.tag);if(nl.length>bookmark.index){try{rng.addElement(nl[bookmark.index])}catch(ex){}}}else{try{if(bookmark.start<0)return true;rng=inst.getSel().createRange();rng.moveToElementText(inst.getBody());rng.collapse(true);rng.moveStart('character',bookmark.start);rng.moveEnd('character',bookmark.length)}catch(ex){return true}}rng.select();win.scrollTo(bookmark.scrollX,bookmark.scrollY);return true}if(tinyMCE.isGecko||tinyMCE.isOpera){if(!sel)return false;if(bookmark.rng){sel.removeAllRanges();sel.addRange(bookmark.rng)}if(bookmark.start!=-1&&bookmark.end!=-1){try{sd=this._getTextPos(b,bookmark.start,bookmark.end);rng=doc.createRange();rng.setStart(sd.startNode,sd.startOffset);rng.setEnd(sd.endNode,sd.endOffset);sel.removeAllRanges();sel.addRange(rng);if(!tinyMCE.isOpera)win.focus()}catch(ex){}}win.scrollTo(bookmark.scrollX,bookmark.scrollY);return true}return false},_getPosText:function(r,sn,en){var w=document.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={};while((n=w.nextNode())!=null){if(n==sn)d.start=p;if(n==en){d.end=p;return d}p+=n.nodeValue?n.nodeValue.length:0}return null},_getTextPos:function(r,sp,ep){var w=document.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={};while((n=w.nextNode())!=null){p+=n.nodeValue?n.nodeValue.length:0;if(p>=sp&&!d.startNode){d.startNode=n;d.startOffset=sp-(p-n.nodeValue.length)}if(p>=ep){d.endNode=n;d.endOffset=ep-(p-n.nodeValue.length);return d}}return null},selectNode:function(node,collapse,select_text_node,to_start){var inst=this.instance,sel,rng,nodes;if(!node)return;if(typeof(collapse)=="undefined")collapse=true;if(typeof(select_text_node)=="undefined")select_text_node=false;if(typeof(to_start)=="undefined")to_start=true;if(inst.settings.auto_resize)inst.resizeToContent();if(tinyMCE.isRealIE){rng=inst.getDoc().body.createTextRange();try{rng.moveToElementText(node);if(collapse)rng.collapse(to_start);rng.select()}catch(e){}}else{sel=this.getSel();if(!sel)return;if(tinyMCE.isSafari){sel.setBaseAndExtent(node,0,node,node.innerText.length);if(collapse){if(to_start)sel.collapseToStart();else sel.collapseToEnd()}this.scrollToNode(node);return}rng=inst.getDoc().createRange();if(select_text_node){nodes=tinyMCE.getNodeTree(node,[],3);if(nodes.length>0)rng.selectNodeContents(nodes[0]);else rng.selectNodeContents(node)}else rng.selectNode(node);if(collapse){if(!to_start&&node.nodeType==3){rng.setStart(node,node.nodeValue.length);rng.setEnd(node,node.nodeValue.length)}else rng.collapse(to_start)}sel.removeAllRanges();sel.addRange(rng)}this.scrollToNode(node);tinyMCE.selectedElement=null;if(node.nodeType==1)tinyMCE.selectedElement=node},scrollToNode:function(node){var inst=this.instance,w=inst.getWin(),vp=inst.getViewPort(),pos=tinyMCE.getAbsPosition(node),cvp,p,cwin;if(pos.absLeft<vp.left||pos.absLeft>vp.left+vp.width||pos.absTop<vp.top||pos.absTop>vp.top+(vp.height-25))w.scrollTo(pos.absLeft,pos.absTop-vp.height+25);if(inst.settings.auto_resize){cwin=inst.getContainerWin();cvp=tinyMCE.getViewPort(cwin);p=this.getAbsPosition(node);if(p.absLeft<cvp.left||p.absLeft>cvp.left+cvp.width||p.absTop<cvp.top||p.absTop>cvp.top+cvp.height)cwin.scrollTo(p.absLeft,p.absTop-cvp.height+25)}},getAbsPosition:function(n){var pos=tinyMCE.getAbsPosition(n),ipos=tinyMCE.getAbsPosition(this.instance.iframeElement);return{absLeft:ipos.absLeft+pos.absLeft,absTop:ipos.absTop+pos.absTop}},getSel:function(){var inst=this.instance;if(tinyMCE.isRealIE)return inst.getDoc().selection;return inst.contentWindow.getSelection()},getRng:function(){var s=this.getSel();if(s==null)return null;if(tinyMCE.isRealIE)return s.createRange();if(tinyMCE.isSafari&&!s.getRangeAt)return''+window.getSelection();if(s.rangeCount>0)return s.getRangeAt(0);return null},isCollapsed:function(){var r=this.getRng();if(r.item)return false;return r.boundingWidth==0||this.getSel().isCollapsed},collapse:function(b){var r=this.getRng(),s=this.getSel();if(r.select){r.collapse(b);r.select()}else{if(b)s.collapseToStart();else s.collapseToEnd()}},getFocusElement:function(){var inst=this.instance,doc,rng,sel,elm;if(tinyMCE.isRealIE){doc=inst.getDoc();rng=doc.selection.createRange();elm=rng.item?rng.item(0):rng.parentElement()}else{if(!tinyMCE.isSafari&&inst.isHidden())return inst.getBody();sel=this.getSel();rng=this.getRng();if(!sel||!rng)return null;elm=rng.commonAncestorContainer;if(!rng.collapsed){if(rng.startContainer==rng.endContainer){if(rng.startOffset-rng.endOffset<2){if(rng.startContainer.hasChildNodes())elm=rng.startContainer.childNodes[rng.startOffset]}}}elm=tinyMCE.getParentElement(elm);}return elm}};function TinyMCE_UndoRedo(inst){this.instance=inst;this.undoLevels=[];this.undoIndex=0;this.typingUndoIndex=-1;this.undoRedo=true};TinyMCE_UndoRedo.prototype={add:function(l){var b,customUndoLevels,newHTML,inst=this.instance,i,ul,ur;if(l){this.undoLevels[this.undoLevels.length]=l;return true}if(this.typingUndoIndex!=-1){this.undoIndex=this.typingUndoIndex;if(tinyMCE.typingUndoIndex!=-1)tinyMCE.undoIndex=tinyMCE.typingUndoIndex}newHTML=tinyMCE.trim(inst.getBody().innerHTML);if(this.undoLevels[this.undoIndex]&&newHTML!=this.undoLevels[this.undoIndex].content){inst.isNotDirty=false;tinyMCE.dispatchCallback(inst,'onchange_callback','onChange',inst);customUndoLevels=tinyMCE.settings.custom_undo_redo_levels;if(customUndoLevels!=-1&&this.undoLevels.length>customUndoLevels){for(i=0;i<this.undoLevels.length-1;i++)this.undoLevels[i]=this.undoLevels[i+1];this.undoLevels.length--;this.undoIndex--;}b=inst.undoBookmark;if(!b)b=inst.selection.getBookmark();this.undoIndex++;this.undoLevels[this.undoIndex]={content:newHTML,bookmark:b};ul=tinyMCE.undoLevels;for(i=tinyMCE.undoIndex+1;i<ul.length;i++){ur=ul[i].undoRedo;if(ur.undoIndex==ur.undoLevels.length-1)ur.undoIndex--;ur.undoLevels.length--}tinyMCE.undoLevels[tinyMCE.undoIndex++]=inst;tinyMCE.undoLevels.length=tinyMCE.undoIndex;this.undoLevels.length=this.undoIndex+1;return true}return false},undo:function(){var inst=this.instance;if(this.undoIndex>0){this.undoIndex--;tinyMCE.setInnerHTML(inst.getBody(),this.undoLevels[this.undoIndex].content);inst.repaint();if(inst.settings.custom_undo_redo_restore_selection)inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark)}},redo:function(){var inst=this.instance;tinyMCE.execCommand("mceEndTyping");if(this.undoIndex<(this.undoLevels.length-1)){this.undoIndex++;tinyMCE.setInnerHTML(inst.getBody(),this.undoLevels[this.undoIndex].content);inst.repaint();if(inst.settings.custom_undo_redo_restore_selection)inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark)}tinyMCE.triggerNodeChange()}};var TinyMCE_ForceParagraphs={_insertPara:function(inst,e){var doc=inst.getDoc(),sel=inst.getSel(),body=inst.getBody(),win=inst.contentWindow,rng=sel.getRangeAt(0);var rootElm=doc.documentElement,blockName="P",startNode,endNode,startBlock,endBlock;var rngBefore,rngAfter,direct,startNode,startOffset,endNode,endOffset,b=tinyMCE.isOpera?inst.selection.getBookmark():null;var paraBefore,paraAfter,startChop,endChop,contents,i;function isEmpty(para){var nodes;function isEmptyHTML(html){return html.replace(new RegExp('[ \t\r\n]+','g'),'').toLowerCase()==''}if(para.getElementsByTagName("img").length>0)return false;if(para.getElementsByTagName("table").length>0)return false;if(para.getElementsByTagName("hr").length>0)return false;nodes=tinyMCE.getNodeTree(para,[],3);for(i=0;i<nodes.length;i++){if(!isEmptyHTML(nodes[i].nodeValue))return false}return true}rngBefore=doc.createRange();rngBefore.setStart(sel.anchorNode,sel.anchorOffset);rngBefore.collapse(true);rngAfter=doc.createRange();rngAfter.setStart(sel.focusNode,sel.focusOffset);rngAfter.collapse(true);direct=rngBefore.compareBoundaryPoints(rngBefore.START_TO_END,rngAfter)<0;startNode=direct?sel.anchorNode:sel.focusNode;startOffset=direct?sel.anchorOffset:sel.focusOffset;endNode=direct?sel.focusNode:sel.anchorNode;endOffset=direct?sel.focusOffset:sel.anchorOffset;startNode=startNode.nodeName=="BODY"?startNode.firstChild:startNode;endNode=endNode.nodeName=="BODY"?endNode.firstChild:endNode;startBlock=inst.getParentBlockElement(startNode);endBlock=inst.getParentBlockElement(endNode);if(startBlock&&(startBlock.nodeName=='CAPTION'||/absolute|relative|static/gi.test(startBlock.style.position)))startBlock=null;if(endBlock&&(endBlock.nodeName=='CAPTION'||/absolute|relative|static/gi.test(endBlock.style.position)))endBlock=null;if(startBlock!=null){blockName=startBlock.nodeName;if(/(TD|TABLE|TH|CAPTION)/.test(blockName)||(blockName=="DIV"&&/left|right/gi.test(startBlock.style.cssFloat)))blockName="P"}if(tinyMCE.getParentElement(startBlock,"OL,UL",null,body)!=null)return false;if((startBlock!=null&&startBlock.nodeName=="TABLE")||(endBlock!=null&&endBlock.nodeName=="TABLE"))startBlock=endBlock=null;paraBefore=(startBlock!=null&&startBlock.nodeName==blockName)?startBlock.cloneNode(false):doc.createElement(blockName);paraAfter=(endBlock!=null&&endBlock.nodeName==blockName)?endBlock.cloneNode(false):doc.createElement(blockName);if(/^(H[1-6])$/.test(blockName))paraAfter=doc.createElement("p");startChop=startNode;endChop=endNode;node=startChop;do{if(node==body||node.nodeType==9||tinyMCE.isBlockElement(node))break;startChop=node}while((node=node.previousSibling?node.previousSibling:node.parentNode));node=endChop;do{if(node==body||node.nodeType==9||tinyMCE.isBlockElement(node))break;endChop=node}while((node=node.nextSibling?node.nextSibling:node.parentNode));if(startChop.nodeName=="TD")startChop=startChop.firstChild;if(endChop.nodeName=="TD")endChop=endChop.lastChild;if(startBlock==null){rng.deleteContents();if(!tinyMCE.isSafari)sel.removeAllRanges();if(startChop!=rootElm&&endChop!=rootElm){rngBefore=rng.cloneRange();if(startChop==body)rngBefore.setStart(startChop,0);else rngBefore.setStartBefore(startChop);paraBefore.appendChild(rngBefore.cloneContents());if(endChop.parentNode.nodeName==blockName)endChop=endChop.parentNode;rng.setEndAfter(endChop);if(endChop.nodeName!="#text"&&endChop.nodeName!="BODY")rngBefore.setEndAfter(endChop);contents=rng.cloneContents();if(contents.firstChild&&(contents.firstChild.nodeName==blockName||contents.firstChild.nodeName=="BODY"))paraAfter.innerHTML=contents.firstChild.innerHTML;else paraAfter.appendChild(contents);if(isEmpty(paraBefore))paraBefore.innerHTML="&nbsp;";if(isEmpty(paraAfter))paraAfter.innerHTML="&nbsp;";rng.deleteContents();rngAfter.deleteContents();rngBefore.deleteContents();if(tinyMCE.isOpera){paraBefore.normalize();rngBefore.insertNode(paraBefore);paraAfter.normalize();rngBefore.insertNode(paraAfter)}else{paraAfter.normalize();rngBefore.insertNode(paraAfter);paraBefore.normalize();rngBefore.insertNode(paraBefore)}}else{body.innerHTML="<"+blockName+">&nbsp;</"+blockName+"><"+blockName+">&nbsp;</"+blockName+">";paraAfter=body.childNodes[1]}inst.selection.moveToBookmark(b);inst.selection.selectNode(paraAfter,true,true);return true}if(startChop.nodeName==blockName)rngBefore.setStart(startChop,0);else rngBefore.setStartBefore(startChop);rngBefore.setEnd(startNode,startOffset);paraBefore.appendChild(rngBefore.cloneContents());rngAfter.setEndAfter(endChop);rngAfter.setStart(endNode,endOffset);contents=rngAfter.cloneContents();if(contents.firstChild&&contents.firstChild.nodeName==blockName){paraAfter.innerHTML=contents.firstChild.innerHTML}else paraAfter.appendChild(contents);if(isEmpty(paraBefore))paraBefore.innerHTML="&nbsp;";if(isEmpty(paraAfter))paraAfter.innerHTML="&nbsp;";rng=doc.createRange();if(!startChop.previousSibling&&startChop.parentNode.nodeName.toUpperCase()==blockName){rng.setStartBefore(startChop.parentNode)}else{if(rngBefore.startContainer.nodeName.toUpperCase()==blockName&&rngBefore.startOffset==0)rng.setStartBefore(rngBefore.startContainer);else rng.setStart(rngBefore.startContainer,rngBefore.startOffset)}if(!endChop.nextSibling&&endChop.parentNode.nodeName.toUpperCase()==blockName)rng.setEndAfter(endChop.parentNode);else rng.setEnd(rngAfter.endContainer,rngAfter.endOffset);rng.deleteContents();if(tinyMCE.isOpera){rng.insertNode(paraBefore);rng.insertNode(paraAfter)}else{rng.insertNode(paraAfter);rng.insertNode(paraBefore)}paraAfter.normalize();paraBefore.normalize();inst.selection.moveToBookmark(b);inst.selection.selectNode(paraAfter,true,true);return true},_handleBackSpace:function(inst){var r=inst.getRng(),sn=r.startContainer,nv,s=false;if(sn&&sn.nextSibling&&sn.nextSibling.nodeName=="BR"&&sn.parentNode.nodeName!="BODY"){nv=sn.nodeValue;if(nv!=null&&r.startOffset==nv.length)sn.nextSibling.parentNode.removeChild(sn.nextSibling)}if(inst.settings.auto_resize)inst.resizeToContent();return s}};function TinyMCE_Layer(id,bm){this.id=id;this.blockerElement=null;this.events=false;this.element=null;this.blockMode=typeof(bm)!='undefined'?bm:true;this.doc=document};TinyMCE_Layer.prototype={moveRelativeTo:function(re,p){var rep=this.getAbsPosition(re),e=this.getElement(),x,y;var w=parseInt(re.offsetWidth),h=parseInt(re.offsetHeight);var ew=parseInt(e.offsetWidth),eh=parseInt(e.offsetHeight);switch(p){case"tl":x=rep.absLeft;y=rep.absTop;break;case"tr":x=rep.absLeft+w;y=rep.absTop;break;case"bl":x=rep.absLeft;y=rep.absTop+h;break;case"br":x=rep.absLeft+w;y=rep.absTop+h;break;case"cc":x=rep.absLeft+(w/ 2) - (ew /2);y=rep.absTop+(h/ 2) - (eh /2);break}this.moveTo(x,y)},moveBy:function(x,y){var e=this.getElement();this.moveTo(parseInt(e.style.left)+x,parseInt(e.style.top)+y)},moveTo:function(x,y){var e=this.getElement();e.style.left=x+"px";e.style.top=y+"px";this.updateBlocker()},resizeBy:function(w,h){var e=this.getElement();this.resizeTo(parseInt(e.style.width)+w,parseInt(e.style.height)+h)},resizeTo:function(w,h){var e=this.getElement();if(w!=null)e.style.width=w+"px";if(h!=null)e.style.height=h+"px";this.updateBlocker()},show:function(){var el=this.getElement();if(el){el.style.display='block';this.updateBlocker()}},hide:function(){var el=this.getElement();if(el){el.style.display='none';this.updateBlocker()}},isVisible:function(){return this.getElement().style.display=='block'},getElement:function(){if(!this.element)this.element=this.doc.getElementById(this.id);return this.element},setBlockMode:function(s){this.blockMode=s},updateBlocker:function(){var e,b,x,y,w,h;b=this.getBlocker();if(b){if(this.blockMode){e=this.getElement();x=this.parseInt(e.style.left);y=this.parseInt(e.style.top);w=this.parseInt(e.offsetWidth);h=this.parseInt(e.offsetHeight);b.style.left=x+'px';b.style.top=y+'px';b.style.width=w+'px';b.style.height=h+'px';b.style.display=e.style.display}else b.style.display='none'}},getBlocker:function(){var d,b;if(!this.blockerElement&&this.blockMode){d=this.doc;b=d.getElementById(this.id+"_blocker");if(!b){b=d.createElement("iframe");b.setAttribute('id',this.id+"_blocker");b.style.cssText='display: none; position: absolute; left: 0; top: 0';b.src='javascript:false;';b.frameBorder='0';b.scrolling='no';d.body.appendChild(b)}this.blockerElement=b}return this.blockerElement},getAbsPosition:function(n){var p={absLeft:0,absTop:0};while(n){p.absLeft+=n.offsetLeft;p.absTop+=n.offsetTop;n=n.offsetParent}return p},create:function(n,c,p,h){var d=this.doc,e=d.createElement(n);e.setAttribute('id',this.id);if(c)e.className=c;if(!p)p=d.body;if(h)e.innerHTML=h;p.appendChild(e);return this.element=e},exists:function(){return this.doc.getElementById(this.id)!=null},parseInt:function(s){if(s==null||s=='')return 0;return parseInt(s)},remove:function(){var e=this.getElement(),b=this.getBlocker();if(e)e.parentNode.removeChild(e);if(b)b.parentNode.removeChild(b)}};function TinyMCE_Menu(){var id;if(typeof(tinyMCE.menuCounter)=="undefined")tinyMCE.menuCounter=0;id="mc_menu_"+tinyMCE.menuCounter++;TinyMCE_Layer.call(this,id,true);this.id=id;this.items=[];this.needsUpdate=true};TinyMCE_Menu.prototype=tinyMCE.extend(TinyMCE_Layer.prototype,{init:function(s){var n;this.settings={separator_class:'mceMenuSeparator',title_class:'mceMenuTitle',disabled_class:'mceMenuDisabled',menu_class:'mceMenu',drop_menu:true};for(n in s)this.settings[n]=s[n];this.create('div',this.settings.menu_class)},clear:function(){this.items=[]},addTitle:function(t){this.add({type:'title',text:t})},addDisabled:function(t){this.add({type:'disabled',text:t})},addSeparator:function(){this.add({type:'separator'})},addItem:function(t,js){this.add({text:t,js:js})},add:function(mi){this.items[this.items.length]=mi;this.needsUpdate=true},update:function(){var e=this.getElement(),h='',i,t,m=this.items,s=this.settings;if(this.settings.drop_menu)h+='<span class="mceMenuLine"></span>';h+='<table border="0" cellpadding="0" cellspacing="0">';for(i=0;i<m.length;i++){t=tinyMCE.xmlEncode(m[i].text);c=m[i].class_name?' class="'+m[i].class_name+'"':'';switch(m[i].type){case'separator':h+='<tr class="'+s.separator_class+'"><td>';break;case'title':h+='<tr class="'+s.title_class+'"><td><span'+c+'>'+t+'</span>';break;case'disabled':h+='<tr class="'+s.disabled_class+'"><td><span'+c+'>'+t+'</span>';break;default:h+='<tr><td><a href="'+tinyMCE.xmlEncode(m[i].js)+'" onmousedown="'+tinyMCE.xmlEncode(m[i].js)+';return tinyMCE.cancelEvent(event);" onclick="return tinyMCE.cancelEvent(event);" onmouseup="return tinyMCE.cancelEvent(event);"><span'+c+'>'+t+'</span></a>'}h+='</td></tr>'}h+='</table>';e.innerHTML=h;this.needsUpdate=false;this.updateBlocker()},show:function(){var nl,i;if(tinyMCE.lastMenu==this)return;if(this.needsUpdate)this.update();if(tinyMCE.lastMenu&&tinyMCE.lastMenu!=this)tinyMCE.lastMenu.hide();TinyMCE_Layer.prototype.show.call(this);if(!tinyMCE.isOpera){}tinyMCE.lastMenu=this}});tinyMCE.add(TinyMCE_Engine,{debug:function(){var m="",a,i,l=tinyMCE.log.length;for(i=0,a=this.debug.arguments;i<a.length;i++){m+=a[i];if(i<a.length-1)m+=', '}if(l<1000)tinyMCE.log[l]="[debug] "+m}});
\ No newline at end of file
diff --git a/program/js/tiny_mce/tiny_mce_popup.js b/program/js/tiny_mce/tiny_mce_popup.js
new file mode 100644 (file)
index 0000000..eecad28
--- /dev/null
@@ -0,0 +1,294 @@
+// Some global instances, this will be filled later\r
+var tinyMCE = null, tinyMCELang = null;\r
+\r
+function TinyMCE_Popup() {\r
+};\r
+\r
+TinyMCE_Popup.prototype = {\r
+       findWin : function(w) {\r
+               var c;\r
+\r
+               // Check parents\r
+               c = w;\r
+               while (c && (c = c.parent) != null) {\r
+                       if (typeof(c.tinyMCE) != "undefined")\r
+                               return c;\r
+               }\r
+\r
+               // Check openers\r
+               c = w;\r
+               while (c && (c = c.opener) != null) {\r
+                       if (typeof(c.tinyMCE) != "undefined")\r
+                               return c;\r
+               }\r
+\r
+               // Try top\r
+               if (typeof(top.tinyMCE) != "undefined")\r
+                       return top;\r
+\r
+               return null;\r
+       },\r
+\r
+       init : function() {\r
+               var win = window.opener ? window.opener : window.dialogArguments, c;\r
+               var inst, re, title, divElm;\r
+\r
+               if (!win)\r
+                       win = this.findWin(window);\r
+\r
+               if (!win) {\r
+                       alert("tinyMCE object reference not found from popup.");\r
+                       return;\r
+               }\r
+\r
+               window.opener = win;\r
+               this.windowOpener = win;\r
+               this.onLoadEval = "";\r
+\r
+               // Setup parent references\r
+               tinyMCE = win.tinyMCE;\r
+               tinyMCELang = win.tinyMCELang;\r
+\r
+               inst = tinyMCE.selectedInstance;\r
+               this.isWindow = tinyMCE.getWindowArg('mce_inside_iframe', false) == false;\r
+               this.storeSelection = (tinyMCE.isRealIE) && !this.isWindow && tinyMCE.getWindowArg('mce_store_selection', true);\r
+\r
+               if (this.isWindow)\r
+                       window.focus();\r
+\r
+               // Store selection\r
+               if (this.storeSelection)\r
+                       inst.selectionBookmark = inst.selection.getBookmark(true);\r
+\r
+               // Setup dir\r
+               if (tinyMCELang.lang_dir)\r
+                       document.dir = tinyMCELang.lang_dir;\r
+\r
+               // Setup title\r
+               re = new RegExp('{|\\\$|}', 'g');\r
+               title = document.title.replace(re, "");\r
+               if (typeof(tinyMCELang[title]) != "undefined") {\r
+                       divElm = document.createElement("div");\r
+                       divElm.innerHTML = tinyMCELang[title];\r
+                       document.title = divElm.innerHTML;\r
+\r
+                       if (typeof(tinyMCE.setWindowTitle) != 'undefined')\r
+                               tinyMCE.setWindowTitle(window, divElm.innerHTML);\r
+               }\r
+\r
+               // Output Popup CSS class\r
+               document.write('<link href="' + tinyMCE.getParam("popups_css") + '" rel="stylesheet" type="text/css">');\r
+\r
+               if (tinyMCE.getParam("popups_css_add")) {\r
+                       c = tinyMCE.getParam("popups_css_add");\r
+\r
+                       // Is relative\r
+                       if (c.indexOf('://') == -1 && c.charAt(0) != '/')\r
+                               c = tinyMCE.documentBasePath + "/" + c;\r
+\r
+                       document.write('<link href="' + c + '" rel="stylesheet" type="text/css">');\r
+               }\r
+\r
+               tinyMCE.addEvent(window, "load", this.onLoad);\r
+       },\r
+\r
+       onLoad : function() {\r
+               var dir, i, elms, body = document.body;\r
+\r
+               if (tinyMCE.getWindowArg('mce_replacevariables', true))\r
+                       body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs);\r
+\r
+               dir = tinyMCE.selectedInstance.settings.directionality;\r
+               if (dir == "rtl" && document.forms && document.forms.length > 0) {\r
+                       elms = document.forms[0].elements;\r
+                       for (i=0; i<elms.length; i++) {\r
+                               if ((elms[i].type == "text" || elms[i].type == "textarea") && elms[i].getAttribute("dir") != "ltr")\r
+                                       elms[i].dir = dir;\r
+                       }\r
+               }\r
+\r
+               if (body.style.display == 'none')\r
+                       body.style.display = 'block';\r
+\r
+               // Execute real onload (Opera fix)\r
+               if (tinyMCEPopup.onLoadEval !== '')\r
+                       eval(tinyMCEPopup.onLoadEval);\r
+       },\r
+\r
+       executeOnLoad : function(str) {\r
+               if (tinyMCE.isOpera)\r
+                       this.onLoadEval = str;\r
+               else\r
+                       eval(str);\r
+       },\r
+\r
+       resizeToInnerSize : function() {\r
+               var i, doc, body, oldMargin, wrapper, iframe, nodes, dx, dy;\r
+\r
+               // Netscape 7.1 workaround\r
+               if (this.isWindow && tinyMCE.isNS71) {\r
+                       window.resizeBy(0, 10);\r
+                       return;\r
+               }\r
+\r
+               if (this.isWindow) {\r
+                       doc = document;\r
+                       body = doc.body;\r
+\r
+                       if (body.style.display == 'none')\r
+                               body.style.display = 'block';\r
+\r
+                       // Remove margin\r
+                       oldMargin = body.style.margin;\r
+                       body.style.margin = '0';\r
+\r
+                       // Create wrapper\r
+                       wrapper = doc.createElement("div");\r
+                       wrapper.id = 'mcBodyWrapper';\r
+                       wrapper.style.display = 'none';\r
+                       wrapper.style.margin = '0';\r
+\r
+                       // Wrap body elements\r
+                       nodes = doc.body.childNodes;\r
+                       for (i=nodes.length-1; i>=0; i--) {\r
+                               if (wrapper.hasChildNodes())\r
+                                       wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild);\r
+                               else\r
+                                       wrapper.appendChild(nodes[i].cloneNode(true));\r
+\r
+                               nodes[i].parentNode.removeChild(nodes[i]);\r
+                       }\r
+\r
+                       // Add wrapper\r
+                       doc.body.appendChild(wrapper);\r
+\r
+                       // Create iframe\r
+                       iframe = document.createElement("iframe");\r
+                       iframe.id = "mcWinIframe";\r
+                       iframe.src = document.location.href.toLowerCase().indexOf('https') == -1 ? "about:blank" : tinyMCE.settings.default_document;\r
+                       iframe.width = "100%";\r
+                       iframe.height = "100%";\r
+                       iframe.style.margin = '0';\r
+\r
+                       // Add iframe\r
+                       doc.body.appendChild(iframe);\r
+\r
+                       // Measure iframe\r
+                       iframe = document.getElementById('mcWinIframe');\r
+                       dx = tinyMCE.getWindowArg('mce_width') - iframe.clientWidth;\r
+                       dy = tinyMCE.getWindowArg('mce_height') - iframe.clientHeight;\r
+\r
+                       // Resize window\r
+                       // tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy);\r
+                       window.resizeBy(dx, dy);\r
+\r
+                       // Hide iframe and show wrapper\r
+                       body.style.margin = oldMargin;\r
+                       iframe.style.display = 'none';\r
+                       wrapper.style.display = 'block';\r
+               }\r
+       },\r
+\r
+       resizeToContent : function() {\r
+               var isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
+               var isOpera = (navigator.userAgent.indexOf("Opera") != -1);\r
+               var elm, width, height, x, y, dx, dy;\r
+\r
+               if (isOpera)\r
+                       return;\r
+\r
+               if (isMSIE) {\r
+                       try { window.resizeTo(10, 10); } catch (e) {}\r
+\r
+                       elm = document.body;\r
+                       width = elm.offsetWidth;\r
+                       height = elm.offsetHeight;\r
+                       dx = (elm.scrollWidth - width) + 4;\r
+                       dy = elm.scrollHeight - height;\r
+\r
+                       try { window.resizeBy(dx, dy); } catch (e) {}\r
+               } else {\r
+                       window.scrollBy(1000, 1000);\r
+                       if (window.scrollX > 0 || window.scrollY > 0) {\r
+                               window.resizeBy(window.innerWidth * 2, window.innerHeight * 2);\r
+                               window.sizeToContent();\r
+                               window.scrollTo(0, 0);\r
+                               x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0);\r
+                               y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0);\r
+                               window.moveTo(x, y);\r
+                       }\r
+               }\r
+       },\r
+\r
+       getWindowArg : function(name, default_value) {\r
+               return tinyMCE.getWindowArg(name, default_value);\r
+       },\r
+\r
+       restoreSelection : function() {\r
+               var inst;\r
+\r
+               if (this.storeSelection) {\r
+                       inst = tinyMCE.selectedInstance;\r
+\r
+                       inst.getWin().focus();\r
+\r
+                       if (inst.selectionBookmark)\r
+                               inst.selection.moveToBookmark(inst.selectionBookmark);\r
+               }\r
+       },\r
+\r
+       execCommand : function(command, user_interface, value) {\r
+               var inst = tinyMCE.selectedInstance;\r
+\r
+               this.restoreSelection();\r
+               inst.execCommand(command, user_interface, value);\r
+\r
+               // Store selection\r
+               if (this.storeSelection)\r
+                       inst.selectionBookmark = inst.selection.getBookmark(true);\r
+       },\r
+\r
+       close : function() {\r
+               tinyMCE.closeWindow(window);\r
+       },\r
+\r
+       pickColor : function(e, element_id) {\r
+               tinyMCE.selectedInstance.execCommand('mceColorPicker', true, {\r
+                       element_id : element_id,\r
+                       document : document,\r
+                       window : window,\r
+                       store_selection : false\r
+               });\r
+       },\r
+\r
+       openBrowser : function(element_id, type, option) {\r
+               var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));\r
+               var url = document.getElementById(element_id).value;\r
+\r
+               tinyMCE.setWindowArg("window", window);\r
+               tinyMCE.setWindowArg("document", document);\r
+\r
+               // Call to external callback\r
+               if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined")\r
+                       alert("Callback function: " + cb + " could not be found.");\r
+               else\r
+                       eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);");\r
+       },\r
+\r
+       importClass : function(c) {\r
+               var n;\r
+\r
+               window[c] = function() {};\r
+\r
+               for (n in window.opener[c].prototype)\r
+                       window[c].prototype[n] = window.opener[c].prototype[n];\r
+\r
+               window[c].constructor = window.opener[c].constructor;\r
+       }\r
+\r
+       };\r
+\r
+// Setup global instance\r
+var tinyMCEPopup = new TinyMCE_Popup();\r
+\r
+tinyMCEPopup.init();\r
diff --git a/program/js/tiny_mce/tiny_mce_src.js b/program/js/tiny_mce/tiny_mce_src.js
new file mode 100644 (file)
index 0000000..ba713a8
--- /dev/null
@@ -0,0 +1,7571 @@
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Engine.class.js */\r
+\r
+function TinyMCE_Engine() {\r
+       var ua;\r
+\r
+       this.majorVersion = "2";\r
+       this.minorVersion = "1.1.1";\r
+       this.releaseDate = "2007-05-14";\r
+\r
+       this.instances = [];\r
+       this.switchClassCache = [];\r
+       this.windowArgs = [];\r
+       this.loadedFiles = [];\r
+       this.pendingFiles = [];\r
+       this.loadingIndex = 0;\r
+       this.configs = [];\r
+       this.currentConfig = 0;\r
+       this.eventHandlers = [];\r
+       this.log = [];\r
+       this.undoLevels = [];\r
+       this.undoIndex = 0;\r
+       this.typingUndoIndex = -1;\r
+       this.settings = [];\r
+\r
+       // Browser check\r
+       ua = navigator.userAgent;\r
+       this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
+       this.isMSIE5 = this.isMSIE && (ua.indexOf('MSIE 5') != -1);\r
+       this.isMSIE5_0 = this.isMSIE && (ua.indexOf('MSIE 5.0') != -1);\r
+       this.isMSIE7 = this.isMSIE && (ua.indexOf('MSIE 7') != -1);\r
+       this.isGecko = ua.indexOf('Gecko') != -1; // Will also be true on Safari\r
+       this.isSafari = ua.indexOf('Safari') != -1;\r
+       this.isOpera = window['opera'] && opera.buildNumber ? true : false;\r
+       this.isMac = ua.indexOf('Mac') != -1;\r
+       this.isNS7 = ua.indexOf('Netscape/7') != -1;\r
+       this.isNS71 = ua.indexOf('Netscape/7.1') != -1;\r
+       this.dialogCounter = 0;\r
+       this.plugins = [];\r
+       this.themes = [];\r
+       this.menus = [];\r
+       this.loadedPlugins = [];\r
+       this.buttonMap = [];\r
+       this.isLoaded = false;\r
+\r
+       // Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those\r
+       if (this.isOpera) {\r
+               this.isMSIE = true;\r
+               this.isGecko = false;\r
+               this.isSafari =  false;\r
+       }\r
+\r
+       this.isIE = this.isMSIE;\r
+       this.isRealIE = this.isMSIE && !this.isOpera;\r
+\r
+       // TinyMCE editor id instance counter\r
+       this.idCounter = 0;\r
+};\r
+\r
+TinyMCE_Engine.prototype = {\r
+       init : function(settings) {\r
+               var theme, nl, baseHREF = "", i, cssPath, entities, h, p, src, elements = [], head;\r
+\r
+               // IE 5.0x is no longer supported since 5.5, 6.0 and 7.0 now exists. We can't support old browsers forever, sorry.\r
+               if (this.isMSIE5_0)\r
+                       return;\r
+\r
+               this.settings = settings;\r
+\r
+               // Check if valid browser has execcommand support\r
+               if (typeof(document.execCommand) == 'undefined')\r
+                       return;\r
+\r
+               // Get script base path\r
+               if (!tinyMCE.baseURL) {\r
+                       // Search through head\r
+                       head = document.getElementsByTagName('head')[0];\r
+\r
+                       if (head) {\r
+                               for (i=0, nl = head.getElementsByTagName('script'); i<nl.length; i++)\r
+                                       elements.push(nl[i]);\r
+                       }\r
+\r
+                       // Search through rest of document\r
+                       for (i=0, nl = document.getElementsByTagName('script'); i<nl.length; i++)\r
+                               elements.push(nl[i]);\r
+\r
+                       // If base element found, add that infront of baseURL\r
+                       nl = document.getElementsByTagName('base');\r
+                       for (i=0; i<nl.length; i++) {\r
+                               if (nl[i].href)\r
+                                       baseHREF = nl[i].href;\r
+                       }\r
+\r
+                       for (i=0; i<elements.length; i++) {\r
+                               if (elements[i].src && (elements[i].src.indexOf("tiny_mce.js") != -1 || elements[i].src.indexOf("tiny_mce_dev.js") != -1 || elements[i].src.indexOf("tiny_mce_src.js") != -1 || elements[i].src.indexOf("tiny_mce_gzip") != -1)) {\r
+                                       src = elements[i].src;\r
+\r
+                                       tinyMCE.srcMode = (src.indexOf('_src') != -1 || src.indexOf('_dev') != -1) ? '_src' : '';\r
+                                       tinyMCE.gzipMode = src.indexOf('_gzip') != -1;\r
+                                       src = src.substring(0, src.lastIndexOf('/'));\r
+\r
+                                       if (settings.exec_mode == "src" || settings.exec_mode == "normal")\r
+                                               tinyMCE.srcMode = settings.exec_mode == "src" ? '_src' : '';\r
+\r
+                                       // Force it absolute if page has a base href\r
+                                       if (baseHREF !== '' && src.indexOf('://') == -1)\r
+                                               tinyMCE.baseURL = baseHREF + src;\r
+                                       else\r
+                                               tinyMCE.baseURL = src;\r
+\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // Get document base path\r
+               this.documentBasePath = document.location.href;\r
+               if (this.documentBasePath.indexOf('?') != -1)\r
+                       this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.indexOf('?'));\r
+               this.documentURL = this.documentBasePath;\r
+               this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.lastIndexOf('/'));\r
+\r
+               // If not HTTP absolute\r
+               if (tinyMCE.baseURL.indexOf('://') == -1 && tinyMCE.baseURL.charAt(0) != '/') {\r
+                       // If site absolute\r
+                       tinyMCE.baseURL = this.documentBasePath + "/" + tinyMCE.baseURL;\r
+               }\r
+\r
+               // Set default values on settings\r
+               this._def("mode", "none");\r
+               this._def("theme", "advanced");\r
+               this._def("plugins", "", true);\r
+               this._def("language", "en");\r
+               this._def("docs_language", this.settings.language);\r
+               this._def("elements", "");\r
+               this._def("textarea_trigger", "mce_editable");\r
+               this._def("editor_selector", "");\r
+               this._def("editor_deselector", "mceNoEditor");\r
+               this._def("valid_elements", "+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],cite[title|id|class|style|dir|lang],abbr[title|id|class|style|dir|lang],acronym[title|id|class|style|dir|lang],del[title|id|class|style|dir|lang|datetime|cite],ins[title|id|class|style|dir|lang|datetime|cite]");\r
+               this._def("extended_valid_elements", "");\r
+               this._def("invalid_elements", "");\r
+               this._def("encoding", "");\r
+               this._def("urlconverter_callback", tinyMCE.getParam("urlconvertor_callback", "TinyMCE_Engine.prototype.convertURL"));\r
+               this._def("save_callback", "");\r
+               this._def("force_br_newlines", false);\r
+               this._def("force_p_newlines", true);\r
+               this._def("add_form_submit_trigger", true);\r
+               this._def("relative_urls", true);\r
+               this._def("remove_script_host", true);\r
+               this._def("focus_alert", true);\r
+               this._def("document_base_url", this.documentURL);\r
+               this._def("visual", true);\r
+               this._def("visual_table_class", "mceVisualAid");\r
+               this._def("setupcontent_callback", "");\r
+               this._def("fix_content_duplication", true);\r
+               this._def("custom_undo_redo", true);\r
+               this._def("custom_undo_redo_levels", -1);\r
+               this._def("custom_undo_redo_keyboard_shortcuts", true);\r
+               this._def("custom_undo_redo_restore_selection", true);\r
+               this._def("custom_undo_redo_global", false);\r
+               this._def("verify_html", true);\r
+               this._def("apply_source_formatting", false);\r
+               this._def("directionality", "ltr");\r
+               this._def("cleanup_on_startup", false);\r
+               this._def("inline_styles", false);\r
+               this._def("convert_newlines_to_brs", false);\r
+               this._def("auto_reset_designmode", true);\r
+               this._def("entities", "39,#39,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,34,quot,38,amp,60,lt,62,gt,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", true);\r
+               this._def("entity_encoding", "named");\r
+               this._def("cleanup_callback", "");\r
+               this._def("add_unload_trigger", true);\r
+               this._def("ask", false);\r
+               this._def("nowrap", false);\r
+               this._def("auto_resize", false);\r
+               this._def("auto_focus", false);\r
+               this._def("cleanup", true);\r
+               this._def("remove_linebreaks", true);\r
+               this._def("button_tile_map", false);\r
+               this._def("submit_patch", true);\r
+               this._def("browsers", "msie,safari,gecko,opera", true);\r
+               this._def("dialog_type", "window");\r
+               this._def("accessibility_warnings", true);\r
+               this._def("accessibility_focus", true);\r
+               this._def("merge_styles_invalid_parents", "");\r
+               this._def("force_hex_style_colors", true);\r
+               this._def("trim_span_elements", true);\r
+               this._def("convert_fonts_to_spans", false);\r
+               this._def("doctype", '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">');\r
+               this._def("font_size_classes", '');\r
+               this._def("font_size_style_values", 'xx-small,x-small,small,medium,large,x-large,xx-large', true);\r
+               this._def("event_elements", 'a,img', true);\r
+               this._def("convert_urls", true);\r
+               this._def("table_inline_editing", false);\r
+               this._def("object_resizing", true);\r
+               this._def("custom_shortcuts", true);\r
+               this._def("convert_on_click", false);\r
+               this._def("content_css", '');\r
+               this._def("fix_list_elements", true);\r
+               this._def("fix_table_elements", false);\r
+               this._def("strict_loading_mode", document.contentType == 'application/xhtml+xml');\r
+               this._def("hidden_tab_class", '');\r
+               this._def("display_tab_class", '');\r
+               this._def("gecko_spellcheck", false);\r
+               this._def("hide_selects_on_submit", true);\r
+               this._def("forced_root_block", false);\r
+               this._def("remove_trailing_nbsp", false);\r
+\r
+               // Force strict loading mode to false on non Gecko browsers\r
+               if (this.isMSIE && !this.isOpera)\r
+                       this.settings.strict_loading_mode = false;\r
+\r
+               // Browser check IE\r
+               if (this.isMSIE && this.settings.browsers.indexOf('msie') == -1)\r
+                       return;\r
+\r
+               // Browser check Gecko\r
+               if (this.isGecko && this.settings.browsers.indexOf('gecko') == -1)\r
+                       return;\r
+\r
+               // Browser check Safari\r
+               if (this.isSafari && this.settings.browsers.indexOf('safari') == -1)\r
+                       return;\r
+\r
+               // Browser check Opera\r
+               if (this.isOpera && this.settings.browsers.indexOf('opera') == -1)\r
+                       return;\r
+\r
+               // If not super absolute make it so\r
+               baseHREF = tinyMCE.settings.document_base_url;\r
+               h = document.location.href;\r
+               p = h.indexOf('://');\r
+               if (p > 0 && document.location.protocol != "file:") {\r
+                       p = h.indexOf('/', p + 3);\r
+                       h = h.substring(0, p);\r
+\r
+                       if (baseHREF.indexOf('://') == -1)\r
+                               baseHREF = h + baseHREF;\r
+\r
+                       tinyMCE.settings.document_base_url = baseHREF;\r
+                       tinyMCE.settings.document_base_prefix = h;\r
+               }\r
+\r
+               // Trim away query part\r
+               if (baseHREF.indexOf('?') != -1)\r
+                       baseHREF = baseHREF.substring(0, baseHREF.indexOf('?'));\r
+\r
+               this.settings.base_href = baseHREF.substring(0, baseHREF.lastIndexOf('/')) + "/";\r
+\r
+               theme = this.settings.theme;\r
+               this.inlineStrict = '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
+               this.inlineTransitional = '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
+               this.blockElms = '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
+               this.blockRegExp = new RegExp("^(" + this.blockElms + ")$", "i");\r
+               this.posKeyCodes = [13,45,36,35,33,34,37,38,39,40];\r
+               this.uniqueURL = 'javascript:void(091039730);'; // Make unique URL non real URL\r
+               this.uniqueTag = '<div id="mceTMPElement" style="display: none">TMP</div>';\r
+               this.callbacks = ['onInit', 'getInfo', 'getEditorTemplate', 'setupContent', 'onChange', 'onPageLoad', 'handleNodeChange', 'initInstance', 'execCommand', 'getControlHTML', 'handleEvent', 'cleanup', 'removeInstance'];\r
+\r
+               // Theme url\r
+               this.settings.theme_href = tinyMCE.baseURL + "/themes/" + theme;\r
+\r
+               if (!tinyMCE.isIE || tinyMCE.isOpera)\r
+                       this.settings.force_br_newlines = false;\r
+\r
+               if (tinyMCE.getParam("popups_css", false)) {\r
+                       cssPath = tinyMCE.getParam("popups_css", "");\r
+\r
+                       // Is relative\r
+                       if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')\r
+                               this.settings.popups_css = this.documentBasePath + "/" + cssPath;\r
+                       else\r
+                               this.settings.popups_css = cssPath;\r
+               } else\r
+                       this.settings.popups_css = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_popup.css";\r
+\r
+               if (tinyMCE.getParam("editor_css", false)) {\r
+                       cssPath = tinyMCE.getParam("editor_css", "");\r
+\r
+                       // Is relative\r
+                       if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')\r
+                               this.settings.editor_css = this.documentBasePath + "/" + cssPath;\r
+                       else\r
+                               this.settings.editor_css = cssPath;\r
+               } else {\r
+                       if (this.settings.editor_css !== '')\r
+                               this.settings.editor_css = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_ui.css";\r
+               }\r
+\r
+               // Only do this once\r
+               if (this.configs.length == 0) {\r
+                       if (typeof(TinyMCECompressed) == "undefined") {\r
+                               tinyMCE.addEvent(window, "DOMContentLoaded", TinyMCE_Engine.prototype.onLoad);\r
+\r
+                               if (tinyMCE.isRealIE) {\r
+                                       if (document.body)\r
+                                               tinyMCE.addEvent(document.body, "readystatechange", TinyMCE_Engine.prototype.onLoad);\r
+                                       else\r
+                                               tinyMCE.addEvent(document, "readystatechange", TinyMCE_Engine.prototype.onLoad);\r
+                               }\r
+\r
+                               tinyMCE.addEvent(window, "load", TinyMCE_Engine.prototype.onLoad);\r
+                               tinyMCE._addUnloadEvents();\r
+                       }\r
+               }\r
+\r
+               this.loadScript(tinyMCE.baseURL + '/themes/' + this.settings.theme + '/editor_template' + tinyMCE.srcMode + '.js');\r
+               this.loadScript(tinyMCE.baseURL + '/langs/' + this.settings.language +  '.js');\r
+               this.loadCSS(this.settings.editor_css);\r
+\r
+               // Add plugins\r
+               p = tinyMCE.getParam('plugins', '', true, ',');\r
+               if (p.length > 0) {\r
+                       for (i=0; i<p.length; i++) {\r
+                               if (p[i].charAt(0) != '-')\r
+                                       this.loadScript(tinyMCE.baseURL + '/plugins/' + p[i] + '/editor_plugin' + tinyMCE.srcMode + '.js');\r
+                       }\r
+               }\r
+\r
+               // Setup entities\r
+               if (tinyMCE.getParam('entity_encoding') == 'named') {\r
+                       settings.cleanup_entities = [];\r
+                       entities = tinyMCE.getParam('entities', '', true, ',');\r
+                       for (i=0; i<entities.length; i+=2)\r
+                               settings.cleanup_entities['c' + entities[i]] = entities[i+1];\r
+               }\r
+\r
+               // Save away this config\r
+               settings.index = this.configs.length;\r
+               this.configs[this.configs.length] = settings;\r
+\r
+               // Start loading first one in chain\r
+               this.loadNextScript();\r
+\r
+               // Force flicker free CSS backgrounds in IE\r
+               if (this.isIE && !this.isOpera) {\r
+                       try {\r
+                               document.execCommand('BackgroundImageCache', false, true);\r
+                       } catch (e) {\r
+                               // Ignore\r
+                       }\r
+               }\r
+\r
+               // Setup XML encoding regexps\r
+               this.xmlEncodeRe = new RegExp('[<>&"]', 'g');\r
+       },\r
+\r
+       _addUnloadEvents : function() {\r
+               var st = tinyMCE.settings.add_unload_trigger;\r
+\r
+               if (tinyMCE.isIE) {\r
+                       if (st) {\r
+                               tinyMCE.addEvent(window, "unload", TinyMCE_Engine.prototype.unloadHandler);\r
+                               tinyMCE.addEvent(window.document, "beforeunload", TinyMCE_Engine.prototype.unloadHandler);\r
+                       }\r
+               } else {\r
+                       if (st)\r
+                               tinyMCE.addEvent(window, "unload", function () {tinyMCE.triggerSave(true, true);});\r
+               }\r
+       },\r
+\r
+       _def : function(key, def_val, t) {\r
+               var v = tinyMCE.getParam(key, def_val);\r
+\r
+               v = t ? v.replace(/\s+/g, "") : v;\r
+\r
+               this.settings[key] = v;\r
+       },\r
+\r
+       hasPlugin : function(n) {\r
+               return typeof(this.plugins[n]) != "undefined" && this.plugins[n] != null;\r
+       },\r
+\r
+       addPlugin : function(n, p) {\r
+               var op = this.plugins[n];\r
+\r
+               // Use the previous plugin object base URL used when loading external plugins\r
+               p.baseURL = op ? op.baseURL : tinyMCE.baseURL + "/plugins/" + n;\r
+               this.plugins[n] = p;\r
+\r
+               this.loadNextScript();\r
+       },\r
+\r
+       setPluginBaseURL : function(n, u) {\r
+               var op = this.plugins[n];\r
+\r
+               if (op)\r
+                       op.baseURL = u;\r
+               else\r
+                       this.plugins[n] = {baseURL : u};\r
+       },\r
+\r
+       loadPlugin : function(n, u) {\r
+               u = u.indexOf('.js') != -1 ? u.substring(0, u.lastIndexOf('/')) : u;\r
+               u = u.charAt(u.length-1) == '/' ? u.substring(0, u.length-1) : u;\r
+               this.plugins[n] = {baseURL : u};\r
+               this.loadScript(u + "/editor_plugin" + (tinyMCE.srcMode ? '_src' : '') + ".js");\r
+       },\r
+\r
+       hasTheme : function(n) {\r
+               return typeof(this.themes[n]) != "undefined" && this.themes[n] != null;\r
+       },\r
+\r
+       addTheme : function(n, t) {\r
+               this.themes[n] = t;\r
+\r
+               this.loadNextScript();\r
+       },\r
+\r
+       addMenu : function(n, m) {\r
+               this.menus[n] = m;\r
+       },\r
+\r
+       hasMenu : function(n) {\r
+               return typeof(this.plugins[n]) != "undefined" && this.plugins[n] != null;\r
+       },\r
+\r
+       loadScript : function(url) {\r
+               var i;\r
+\r
+               for (i=0; i<this.loadedFiles.length; i++) {\r
+                       if (this.loadedFiles[i] == url)\r
+                               return;\r
+               }\r
+\r
+               if (tinyMCE.settings.strict_loading_mode)\r
+                       this.pendingFiles[this.pendingFiles.length] = url;\r
+               else\r
+                       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></script>');\r
+\r
+               this.loadedFiles[this.loadedFiles.length] = url;\r
+       },\r
+\r
+       loadNextScript : function() {\r
+               var d = document, se;\r
+\r
+               if (!tinyMCE.settings.strict_loading_mode)\r
+                       return;\r
+\r
+               if (this.loadingIndex < this.pendingFiles.length) {\r
+                       se = d.createElementNS('http://www.w3.org/1999/xhtml', 'script');\r
+                       se.setAttribute('language', 'javascript');\r
+                       se.setAttribute('type', 'text/javascript');\r
+                       se.setAttribute('src', this.pendingFiles[this.loadingIndex++]);\r
+\r
+                       d.getElementsByTagName("head")[0].appendChild(se);\r
+               } else\r
+                       this.loadingIndex = -1; // Done with loading\r
+       },\r
+\r
+       loadCSS : function(url) {\r
+               var ar = url.replace(/\s+/, '').split(',');\r
+               var lflen = 0, csslen = 0, skip = false;\r
+               var x = 0, i = 0, nl, le;\r
+\r
+               for (x = 0,csslen = ar.length; x<csslen; x++) {\r
+                       if (ar[x] != null && ar[x] != 'null' && ar[x].length > 0) {\r
+                               /* Make sure it doesn't exist. */\r
+                               for (i=0, lflen=this.loadedFiles.length; i<lflen; i++) {\r
+                                       if (this.loadedFiles[i] == ar[x]) {\r
+                                               skip = true;\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               if (!skip) {\r
+                                       if (tinyMCE.settings.strict_loading_mode) {\r
+                                               nl = document.getElementsByTagName("head");\r
+\r
+                                               le = document.createElement('link');\r
+                                               le.setAttribute('href', ar[x]);\r
+                                               le.setAttribute('rel', 'stylesheet');\r
+                                               le.setAttribute('type', 'text/css');\r
+\r
+                                               nl[0].appendChild(le);                  \r
+                                       } else\r
+                                               document.write('<link href="' + ar[x] + '" rel="stylesheet" type="text/css" />');\r
+\r
+                                       this.loadedFiles[this.loadedFiles.length] = ar[x];\r
+                               }\r
+                       }\r
+               }\r
+       },\r
+\r
+       importCSS : function(doc, css) {\r
+               var css_ary = css.replace(/\s+/, '').split(',');\r
+               var csslen, elm, headArr, x, css_file;\r
+\r
+               for (x = 0, csslen = css_ary.length; x<csslen; x++) {\r
+                       css_file = css_ary[x];\r
+\r
+                       if (css_file != null && css_file != 'null' && css_file.length > 0) {\r
+                               // Is relative, make absolute\r
+                               if (css_file.indexOf('://') == -1 && css_file.charAt(0) != '/')\r
+                                       css_file = this.documentBasePath + "/" + css_file;\r
+\r
+                               if (typeof(doc.createStyleSheet) == "undefined") {\r
+                                       elm = doc.createElement("link");\r
+\r
+                                       elm.rel = "stylesheet";\r
+                                       elm.href = css_file;\r
+\r
+                                       if ((headArr = doc.getElementsByTagName("head")) != null && headArr.length > 0)\r
+                                               headArr[0].appendChild(elm);\r
+                               } else\r
+                                       doc.createStyleSheet(css_file);\r
+                       }\r
+               }\r
+       },\r
+\r
+       confirmAdd : function(e, settings) {\r
+               var elm = tinyMCE.isIE ? event.srcElement : e.target;\r
+               var elementId = elm.name ? elm.name : elm.id;\r
+\r
+               tinyMCE.settings = settings;\r
+\r
+               if (tinyMCE.settings.convert_on_click || (!elm.getAttribute('mce_noask') && confirm(tinyMCELang.lang_edit_confirm)))\r
+                       tinyMCE.addMCEControl(elm, elementId);\r
+\r
+               elm.setAttribute('mce_noask', 'true');\r
+       },\r
+\r
+       updateContent : function(form_element_name) {\r
+               var formElement, n, inst, doc;\r
+\r
+               // Find MCE instance linked to given form element and copy it's value\r
+               formElement = document.getElementById(form_element_name);\r
+               for (n in tinyMCE.instances) {\r
+                       inst = tinyMCE.instances[n];\r
+\r
+                       if (!tinyMCE.isInstance(inst))\r
+                               continue;\r
+\r
+                       inst.switchSettings();\r
+\r
+                       if (inst.formElement == formElement) {\r
+                               doc = inst.getDoc();\r
+\r
+                               tinyMCE._setHTML(doc, inst.formElement.value);\r
+\r
+                               if (!tinyMCE.isIE)\r
+                                       doc.body.innerHTML = tinyMCE._cleanupHTML(inst, doc, this.settings, doc.body, inst.visualAid);\r
+                       }\r
+               }\r
+       },\r
+\r
+       addMCEControl : function(replace_element, form_element_name, target_document) {\r
+               var id = "mce_editor_" + tinyMCE.idCounter++;\r
+               var inst = new TinyMCE_Control(tinyMCE.settings);\r
+\r
+               inst.editorId = id;\r
+               this.instances[id] = inst;\r
+\r
+               inst._onAdd(replace_element, form_element_name, target_document);\r
+       },\r
+\r
+       removeInstance : function(ti) {\r
+               var t = [], n, i;\r
+\r
+               // Remove from instances\r
+               for (n in tinyMCE.instances) {\r
+                       i = tinyMCE.instances[n];\r
+\r
+                       if (tinyMCE.isInstance(i) && ti != i)\r
+                                       t[n] = i;\r
+               }\r
+\r
+               tinyMCE.instances = t;\r
+\r
+               // Remove from global undo/redo\r
+               n = [];\r
+               t = tinyMCE.undoLevels;\r
+\r
+               for (i=0; i<t.length; i++) {\r
+                       if (t[i] != ti)\r
+                               n.push(t[i]);\r
+               }\r
+\r
+               tinyMCE.undoLevels = n;\r
+               tinyMCE.undoIndex = n.length;\r
+\r
+               // Dispatch remove instance call\r
+               tinyMCE.dispatchCallback(ti, 'remove_instance_callback', 'removeInstance', ti);\r
+\r
+               return ti;\r
+       },\r
+\r
+       removeMCEControl : function(editor_id) {\r
+               var inst = tinyMCE.getInstanceById(editor_id), h, re, ot, tn;\r
+\r
+               if (inst) {\r
+                       inst.switchSettings();\r
+\r
+                       editor_id = inst.editorId;\r
+                       h = tinyMCE.getContent(editor_id);\r
+\r
+                       this.removeInstance(inst);\r
+\r
+                       tinyMCE.selectedElement = null;\r
+                       tinyMCE.selectedInstance = null;\r
+\r
+                       // Remove element\r
+                       re = document.getElementById(editor_id + "_parent");\r
+                       ot = inst.oldTargetElement;\r
+                       tn = ot.nodeName.toLowerCase();\r
+\r
+                       if (tn == "textarea" || tn == "input") {\r
+                               re.parentNode.removeChild(re);\r
+                               ot.style.display = "inline";\r
+                               ot.value = h;\r
+                       } else {\r
+                               ot.innerHTML = h;\r
+                               ot.style.display = 'block';\r
+                               re.parentNode.insertBefore(ot, re);\r
+                               re.parentNode.removeChild(re);\r
+                       }\r
+               }\r
+       },\r
+\r
+       triggerSave : function(skip_cleanup, skip_callback) {\r
+               var inst, n;\r
+\r
+               // Default to false\r
+               if (typeof(skip_cleanup) == "undefined")\r
+                       skip_cleanup = false;\r
+\r
+               // Default to false\r
+               if (typeof(skip_callback) == "undefined")\r
+                       skip_callback = false;\r
+\r
+               // Cleanup and set all form fields\r
+               for (n in tinyMCE.instances) {\r
+                       inst = tinyMCE.instances[n];\r
+\r
+                       if (!tinyMCE.isInstance(inst))\r
+                               continue;\r
+\r
+                       inst.triggerSave(skip_cleanup, skip_callback);\r
+               }\r
+       },\r
+\r
+       resetForm : function(form_index) {\r
+               var i, inst, n, formObj = document.forms[form_index];\r
+\r
+               for (n in tinyMCE.instances) {\r
+                       inst = tinyMCE.instances[n];\r
+\r
+                       if (!tinyMCE.isInstance(inst))\r
+                               continue;\r
+\r
+                       inst.switchSettings();\r
+\r
+                       for (i=0; i<formObj.elements.length; i++) {\r
+                               if (inst.formTargetElementId == formObj.elements[i].name)\r
+                                       inst.getBody().innerHTML = inst.startContent;\r
+                       }\r
+               }\r
+       },\r
+\r
+       execInstanceCommand : function(editor_id, command, user_interface, value, focus) {\r
+               var inst = tinyMCE.getInstanceById(editor_id), r;\r
+\r
+               if (inst) {\r
+                       r = inst.selection.getRng();\r
+\r
+                       if (typeof(focus) == "undefined")\r
+                               focus = true;\r
+\r
+                       // IE bug lost focus on images in absolute divs Bug #1534575\r
+                       if (focus && (!r || !r.item))\r
+                               inst.contentWindow.focus();\r
+\r
+                       // Reset design mode if lost\r
+                       inst.autoResetDesignMode();\r
+\r
+                       this.selectedElement = inst.getFocusElement();\r
+                       inst.select();\r
+                       tinyMCE.execCommand(command, user_interface, value);\r
+\r
+                       // Cancel event so it doesn't call onbeforeonunlaod\r
+                       if (tinyMCE.isIE && window.event != null)\r
+                               tinyMCE.cancelEvent(window.event);\r
+               }\r
+       },\r
+\r
+       execCommand : function(command, user_interface, value) {\r
+               var inst = tinyMCE.selectedInstance, n, pe, te;\r
+\r
+               // Default input\r
+               user_interface = user_interface ? user_interface : false;\r
+               value = value ? value : null;\r
+\r
+               if (inst)\r
+                       inst.switchSettings();\r
+\r
+               switch (command) {\r
+                       case "Undo":\r
+                               if (this.getParam('custom_undo_redo_global')) {\r
+                                       if (this.undoIndex > 0) {\r
+                                               tinyMCE.nextUndoRedoAction = 'Undo';\r
+                                               inst = this.undoLevels[--this.undoIndex];\r
+                                               inst.select();\r
+\r
+                                               if (!tinyMCE.nextUndoRedoInstanceId)\r
+                                                       inst.execCommand('Undo');\r
+                                       }\r
+                               } else\r
+                                       inst.execCommand('Undo');\r
+                               return true;\r
+\r
+                       case "Redo":\r
+                               if (this.getParam('custom_undo_redo_global')) {\r
+                                       if (this.undoIndex <= this.undoLevels.length - 1) {\r
+                                               tinyMCE.nextUndoRedoAction = 'Redo';\r
+                                               inst = this.undoLevels[this.undoIndex++];\r
+                                               inst.select();\r
+\r
+                                               if (!tinyMCE.nextUndoRedoInstanceId)\r
+                                                       inst.execCommand('Redo');\r
+                                       }\r
+                               } else\r
+                                       inst.execCommand('Redo');\r
+\r
+                               return true;\r
+\r
+                       case 'mceFocus':\r
+                               inst = tinyMCE.getInstanceById(value);\r
+\r
+                               if (inst)\r
+                                       inst.getWin().focus();\r
+                       return;\r
+\r
+                       case "mceAddControl":\r
+                       case "mceAddEditor":\r
+                               tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);\r
+                               return;\r
+\r
+                       case "mceAddFrameControl":\r
+                               tinyMCE.addMCEControl(tinyMCE._getElementById(value.element, value.document), value.element, value.document);\r
+                               return;\r
+\r
+                       case "mceRemoveControl":\r
+                       case "mceRemoveEditor":\r
+                               tinyMCE.removeMCEControl(value);\r
+                               return;\r
+\r
+                       case "mceToggleEditor":\r
+                               inst = tinyMCE.getInstanceById(value);\r
+\r
+                               if (inst) {\r
+                                       pe = document.getElementById(inst.editorId + '_parent');\r
+                                       te = inst.oldTargetElement;\r
+\r
+                                       if (typeof(inst.enabled) == 'undefined')\r
+                                               inst.enabled = true;\r
+\r
+                                       inst.enabled = !inst.enabled;\r
+\r
+                                       if (!inst.enabled) {\r
+                                               pe.style.display = 'none';\r
+\r
+                                               if (te.nodeName == 'TEXTAREA' || te.nodeName == 'INPUT')\r
+                                                       te.value = inst.getHTML();\r
+                                               else\r
+                                                       te.innerHTML = inst.getHTML();\r
+\r
+                                               te.style.display = inst.oldTargetDisplay;\r
+                                               tinyMCE.dispatchCallback(inst, 'hide_instance_callback', 'hideInstance', inst);\r
+                                       } else {\r
+                                               pe.style.display = 'block';\r
+                                               te.style.display = 'none';\r
+\r
+                                               if (te.nodeName == 'TEXTAREA' || te.nodeName == 'INPUT')\r
+                                                       inst.setHTML(te.value);\r
+                                               else\r
+                                                       inst.setHTML(te.innerHTML);\r
+\r
+                                               inst.useCSS = false;\r
+                                               tinyMCE.dispatchCallback(inst, 'show_instance_callback', 'showInstance', inst);\r
+                                       }\r
+                               } else\r
+                                       tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);\r
+\r
+                               return;\r
+\r
+                       case "mceResetDesignMode":\r
+                               // Resets the designmode state of the editors in Gecko\r
+                               if (tinyMCE.isGecko) {\r
+                                       for (n in tinyMCE.instances) {\r
+                                               if (!tinyMCE.isInstance(tinyMCE.instances[n]))\r
+                                                       continue;\r
+\r
+                                               try {\r
+                                                       tinyMCE.instances[n].getDoc().designMode = "off";\r
+                                                       tinyMCE.instances[n].getDoc().designMode = "on";\r
+                                                       tinyMCE.instances[n].useCSS = false;\r
+                                               } catch (e) {\r
+                                                       // Ignore any errors\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               return;\r
+               }\r
+\r
+               if (inst) {\r
+                       inst.execCommand(command, user_interface, value);\r
+               } else if (tinyMCE.settings.focus_alert)\r
+                       alert(tinyMCELang.lang_focus_alert);\r
+       },\r
+\r
+       _createIFrame : function(replace_element, doc, win) {\r
+               var iframe, id = replace_element.getAttribute("id");\r
+               var aw, ah;\r
+\r
+               if (typeof(doc) == "undefined")\r
+                       doc = document;\r
+\r
+               if (typeof(win) == "undefined")\r
+                       win = window;\r
+\r
+               iframe = doc.createElement("iframe");\r
+\r
+               aw = "" + tinyMCE.settings.area_width;\r
+               ah = "" + tinyMCE.settings.area_height;\r
+\r
+               if (aw.indexOf('%') == -1) {\r
+                       aw = parseInt(aw);\r
+                       aw = (isNaN(aw) || aw < 0) ? 300 : aw;\r
+                       aw = aw + "px";\r
+               }\r
+\r
+               if (ah.indexOf('%') == -1) {\r
+                       ah = parseInt(ah);\r
+                       ah = (isNaN(ah) || ah < 0) ? 240 : ah;\r
+                       ah = ah + "px";\r
+               }\r
+\r
+               iframe.setAttribute("id", id);\r
+               iframe.setAttribute("name", id);\r
+               iframe.setAttribute("class", "mceEditorIframe");\r
+               iframe.setAttribute("border", "0");\r
+               iframe.setAttribute("frameBorder", "0");\r
+               iframe.setAttribute("marginWidth", "0");\r
+               iframe.setAttribute("marginHeight", "0");\r
+               iframe.setAttribute("leftMargin", "0");\r
+               iframe.setAttribute("topMargin", "0");\r
+               iframe.setAttribute("width", aw);\r
+               iframe.setAttribute("height", ah);\r
+               iframe.setAttribute("allowtransparency", "true");\r
+               iframe.className = 'mceEditorIframe';\r
+\r
+               if (tinyMCE.settings.auto_resize)\r
+                       iframe.setAttribute("scrolling", "no");\r
+\r
+               // Must have a src element in MSIE HTTPs breaks aswell as absoute URLs\r
+               if (tinyMCE.isRealIE)\r
+                       iframe.setAttribute("src", this.settings.default_document);\r
+\r
+               iframe.style.width = aw;\r
+               iframe.style.height = ah;\r
+\r
+               // Ugly hack for Gecko problem in strict mode\r
+               if (tinyMCE.settings.strict_loading_mode)\r
+                       iframe.style.marginBottom = '-5px';\r
+\r
+               // MSIE 5.0 issue\r
+               if (tinyMCE.isRealIE)\r
+                       replace_element.outerHTML = iframe.outerHTML;\r
+               else\r
+                       replace_element.parentNode.replaceChild(iframe, replace_element);\r
+\r
+               if (tinyMCE.isRealIE)\r
+                       return win.frames[id];\r
+               else\r
+                       return iframe;\r
+       },\r
+\r
+       setupContent : function(editor_id) {\r
+               var inst = tinyMCE.instances[editor_id], i, doc = inst.getDoc(), head = doc.getElementsByTagName('head').item(0);\r
+               var content = inst.startContent, contentElement, body;\r
+\r
+               // HTML values get XML encoded in strict mode\r
+               if (tinyMCE.settings.strict_loading_mode) {\r
+                       content = content.replace(/&lt;/g, '<');\r
+                       content = content.replace(/&gt;/g, '>');\r
+                       content = content.replace(/&quot;/g, '"');\r
+                       content = content.replace(/&amp;/g, '&');\r
+               }\r
+\r
+               tinyMCE.selectedInstance = inst;\r
+               inst.switchSettings();\r
+\r
+               // Not loaded correctly hit it again, Mozilla bug #997860\r
+               if (!tinyMCE.isIE && tinyMCE.getParam("setupcontent_reload", false) && doc.title != "blank_page") {\r
+                       // This part will remove the designMode status\r
+                       // Failes first time in Firefox 1.5b2 on Mac\r
+                       try {doc.location.href = tinyMCE.baseURL + "/blank.htm";} catch (ex) {}\r
+                       window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 1000);\r
+                       return;\r
+               }\r
+\r
+               // Wait for it to load\r
+               if (!head || !doc.body) {\r
+                       window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 10);\r
+                       return;\r
+               }\r
+\r
+               // Import theme specific content CSS the user specific\r
+               tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/themes/" + inst.settings.theme + "/css/editor_content.css");\r
+               tinyMCE.importCSS(inst.getDoc(), inst.settings.content_css);\r
+               tinyMCE.dispatchCallback(inst, 'init_instance_callback', 'initInstance', inst);\r
+\r
+               // Setup keyboard shortcuts\r
+               if (tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')) {\r
+                       inst.addShortcut('ctrl', 'z', 'lang_undo_desc', 'Undo');\r
+                       inst.addShortcut('ctrl', 'y', 'lang_redo_desc', 'Redo');\r
+               }\r
+\r
+               // BlockFormat shortcuts keys\r
+               for (i=1; i<=6; i++)\r
+                       inst.addShortcut('ctrl', '' + i, '', 'FormatBlock', false, '<h' + i + '>');\r
+\r
+               inst.addShortcut('ctrl', '7', '', 'FormatBlock', false, '<p>');\r
+               inst.addShortcut('ctrl', '8', '', 'FormatBlock', false, '<div>');\r
+               inst.addShortcut('ctrl', '9', '', 'FormatBlock', false, '<address>');\r
+\r
+               // Add default shortcuts for gecko\r
+               if (tinyMCE.isGecko) {\r
+                       inst.addShortcut('ctrl', 'b', 'lang_bold_desc', 'Bold');\r
+                       inst.addShortcut('ctrl', 'i', 'lang_italic_desc', 'Italic');\r
+                       inst.addShortcut('ctrl', 'u', 'lang_underline_desc', 'Underline');\r
+               }\r
+\r
+               // Setup span styles\r
+               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                       inst.getBody().setAttribute('id', 'mceSpanFonts');\r
+\r
+               if (tinyMCE.settings.nowrap)\r
+                       doc.body.style.whiteSpace = "nowrap";\r
+\r
+               doc.body.dir = this.settings.directionality;\r
+               doc.editorId = editor_id;\r
+\r
+               // Add on document element in Mozilla\r
+               if (!tinyMCE.isIE)\r
+                       doc.documentElement.editorId = editor_id;\r
+\r
+               inst.setBaseHREF(tinyMCE.settings.base_href);\r
+\r
+               // Replace new line characters to BRs\r
+               if (tinyMCE.settings.convert_newlines_to_brs) {\r
+                       content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi");\r
+                       content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi");\r
+                       content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi");\r
+               }\r
+\r
+               // Open closed anchors\r
+       //      content = content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');\r
+\r
+               // Call custom cleanup code\r
+               content = tinyMCE.storeAwayURLs(content);\r
+               content = tinyMCE._customCleanup(inst, "insert_to_editor", content);\r
+\r
+               if (tinyMCE.isIE) {\r
+                       // Ugly!!!\r
+                       window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["' + editor_id + '"].getDoc(), "' + editor_id + '");}catch(e){}', 500);\r
+\r
+                       if (tinyMCE.settings.force_br_newlines)\r
+                               doc.styleSheets[0].addRule("p", "margin: 0;");\r
+\r
+                       body = inst.getBody();\r
+                       body.editorId = editor_id;\r
+               }\r
+\r
+               content = tinyMCE.cleanupHTMLCode(content);\r
+\r
+               // Fix for bug #958637\r
+               if (!tinyMCE.isIE) {\r
+                       contentElement = inst.getDoc().createElement("body");\r
+                       doc = inst.getDoc();\r
+\r
+                       contentElement.innerHTML = content;\r
+\r
+                       if (tinyMCE.settings.cleanup_on_startup)\r
+                               tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, doc, this.settings, contentElement));\r
+                       else\r
+                               tinyMCE.setInnerHTML(inst.getBody(), content);\r
+\r
+                       tinyMCE.convertAllRelativeURLs(inst.getBody());\r
+               } else {\r
+                       if (tinyMCE.settings.cleanup_on_startup) {\r
+                               tinyMCE._setHTML(inst.getDoc(), content);\r
+\r
+                               // Produces permission denied error in MSIE 5.5\r
+                               try {\r
+                                       tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));\r
+                               } catch(e) {\r
+                                       // Ignore\r
+                               }\r
+                       } else\r
+                               tinyMCE._setHTML(inst.getDoc(), content);\r
+               }\r
+\r
+               // Fix for bug #957681\r
+               //inst.getDoc().designMode = inst.getDoc().designMode;\r
+\r
+               tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings.visual, inst);\r
+               tinyMCE.dispatchCallback(inst, 'setupcontent_callback', 'setupContent', editor_id, inst.getBody(), inst.getDoc());\r
+\r
+               // Re-add design mode on mozilla\r
+               if (!tinyMCE.isIE)\r
+                       tinyMCE.addEventHandlers(inst);\r
+\r
+               // Add blur handler\r
+               if (tinyMCE.isIE) {\r
+                       tinyMCE.addEvent(inst.getBody(), "blur", TinyMCE_Engine.prototype._eventPatch);\r
+                       tinyMCE.addEvent(inst.getBody(), "beforedeactivate", TinyMCE_Engine.prototype._eventPatch); // Bug #1439953\r
+\r
+                       // Workaround for drag drop/copy paste base href bug\r
+                       if (!tinyMCE.isOpera) {\r
+                               tinyMCE.addEvent(doc.body, "mousemove", TinyMCE_Engine.prototype.onMouseMove);\r
+                               tinyMCE.addEvent(doc.body, "beforepaste", TinyMCE_Engine.prototype._eventPatch);\r
+                               tinyMCE.addEvent(doc.body, "drop", TinyMCE_Engine.prototype._eventPatch);\r
+                       }\r
+               }\r
+\r
+               // Trigger node change, this call locks buttons for tables and so forth\r
+               inst.select();\r
+               tinyMCE.selectedElement = inst.contentWindow.document.body;\r
+\r
+               // Call custom DOM cleanup\r
+               tinyMCE._customCleanup(inst, "insert_to_editor_dom", inst.getBody());\r
+               tinyMCE._customCleanup(inst, "setup_content_dom", inst.getBody());\r
+               tinyMCE._setEventsEnabled(inst.getBody(), false);\r
+               tinyMCE.cleanupAnchors(inst.getDoc());\r
+\r
+               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                       tinyMCE.convertSpansToFonts(inst.getDoc());\r
+\r
+               inst.startContent = tinyMCE.trim(inst.getBody().innerHTML);\r
+               inst.undoRedo.add({ content : inst.startContent });\r
+\r
+               // Cleanup any mess left from storyAwayURLs\r
+               if (tinyMCE.isGecko) {\r
+                       // Remove mce_src from textnodes and comments\r
+                       tinyMCE.selectNodes(inst.getBody(), function(n) {\r
+                               if (n.nodeType == 3 || n.nodeType == 8)\r
+                                       n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), "");\r
+\r
+                               return false;\r
+                       });\r
+               }\r
+\r
+               // Remove Gecko spellchecking\r
+               if (tinyMCE.isGecko)\r
+                       inst.getBody().spellcheck = tinyMCE.getParam("gecko_spellcheck");\r
+\r
+               // Cleanup any mess left from storyAwayURLs\r
+               tinyMCE._removeInternal(inst.getBody());\r
+\r
+               inst.select();\r
+               tinyMCE.triggerNodeChange(false, true);\r
+       },\r
+\r
+       storeAwayURLs : function(s) {\r
+               // Remove all mce_src, mce_href and replace them with new ones\r
+               // s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');\r
+               // s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');\r
+\r
+               if (!s.match(/(mce_src|mce_href)/gi, s)) {\r
+                       s = s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'src="$1" mce_src="$1"');\r
+                       s = s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'href="$1" mce_href="$1"');\r
+               }\r
+\r
+               return s;\r
+       },\r
+\r
+       _removeInternal : function(n) {\r
+               if (tinyMCE.isGecko) {\r
+                       // Remove mce_src from textnodes and comments\r
+                       tinyMCE.selectNodes(n, function(n) {\r
+                               if (n.nodeType == 3 || n.nodeType == 8)\r
+                                       n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), "");\r
+\r
+                               return false;\r
+                       });\r
+               }\r
+       },\r
+\r
+       removeTinyMCEFormElements : function(form_obj) {\r
+               var i, elementId;\r
+\r
+               // Skip form element removal\r
+               if (!tinyMCE.getParam('hide_selects_on_submit'))\r
+                       return;\r
+\r
+               // Check if form is valid\r
+               if (typeof(form_obj) == "undefined" || form_obj == null)\r
+                       return;\r
+\r
+               // If not a form, find the form\r
+               if (form_obj.nodeName != "FORM") {\r
+                       if (form_obj.form)\r
+                               form_obj = form_obj.form;\r
+                       else\r
+                               form_obj = tinyMCE.getParentElement(form_obj, "form");\r
+               }\r
+\r
+               // Still nothing\r
+               if (form_obj == null)\r
+                       return;\r
+\r
+               // Disable all UI form elements that TinyMCE created\r
+               for (i=0; i<form_obj.elements.length; i++) {\r
+                       elementId = form_obj.elements[i].name ? form_obj.elements[i].name : form_obj.elements[i].id;\r
+\r
+                       if (elementId.indexOf('mce_editor_') == 0)\r
+                               form_obj.elements[i].disabled = true;\r
+               }\r
+       },\r
+\r
+       handleEvent : function(e) {\r
+               var inst = tinyMCE.selectedInstance, i, elm, keys;\r
+\r
+               // Remove odd, error\r
+               if (typeof(tinyMCE) == "undefined")\r
+                       return true;\r
+\r
+               //tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : ""));\r
+\r
+               if (tinyMCE.executeCallback(tinyMCE.selectedInstance, 'handle_event_callback', 'handleEvent', e))\r
+                       return false;\r
+\r
+               switch (e.type) {\r
+                       case "beforedeactivate": // Was added due to bug #1439953\r
+                       case "blur":\r
+                               if (tinyMCE.selectedInstance)\r
+                                       tinyMCE.selectedInstance.execCommand('mceEndTyping');\r
+\r
+                               tinyMCE.hideMenus();\r
+\r
+                               return;\r
+\r
+                       // Workaround for drag drop/copy paste base href bug\r
+                       case "drop":\r
+                       case "beforepaste":\r
+                               if (tinyMCE.selectedInstance)\r
+                                       tinyMCE.selectedInstance.setBaseHREF(null);\r
+\r
+                               // Fixes odd MSIE bug where drag/droping elements in a iframe with height 100% breaks\r
+                               // This logic forces the width/height to be in pixels while the user is drag/dropping\r
+                               if (tinyMCE.isRealIE) {\r
+                                       var ife = tinyMCE.selectedInstance.iframeElement;\r
+\r
+                                       /*if (ife.style.width.indexOf('%') != -1) {\r
+                                               ife._oldWidth = ife.width.height;\r
+                                               ife.style.width = ife.clientWidth;\r
+                                       }*/\r
+\r
+                                       if (ife.style.height.indexOf('%') != -1) {\r
+                                               ife._oldHeight = ife.style.height;\r
+                                               ife.style.height = ife.clientHeight;\r
+                                       }\r
+                               }\r
+\r
+                               window.setTimeout("tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings.base_href);tinyMCE._resetIframeHeight();", 1);\r
+                               return;\r
+\r
+                       case "submit":\r
+                               tinyMCE.formSubmit(tinyMCE.isMSIE ? window.event.srcElement : e.target);\r
+                               return;\r
+\r
+                       case "reset":\r
+                               var formObj = tinyMCE.isIE ? window.event.srcElement : e.target;\r
+\r
+                               for (i=0; i<document.forms.length; i++) {\r
+                                       if (document.forms[i] == formObj)\r
+                                               window.setTimeout('tinyMCE.resetForm(' + i + ');', 10);\r
+                               }\r
+\r
+                               return;\r
+\r
+                       case "keypress":\r
+                               if (inst && inst.handleShortcut(e))\r
+                                       return false;\r
+\r
+                               if (e.target.editorId) {\r
+                                       tinyMCE.instances[e.target.editorId].select();\r
+                               } else {\r
+                                       if (e.target.ownerDocument.editorId)\r
+                                               tinyMCE.instances[e.target.ownerDocument.editorId].select();\r
+                               }\r
+\r
+                               if (tinyMCE.selectedInstance)\r
+                                       tinyMCE.selectedInstance.switchSettings();\r
+\r
+                               // Insert P element\r
+                               if ((tinyMCE.isGecko || tinyMCE.isOpera || tinyMCE.isSafari) && tinyMCE.settings.force_p_newlines && e.keyCode == 13 && !e.shiftKey) {\r
+                                       // Insert P element instead of BR\r
+                                       if (TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance, e)) {\r
+                                               // Cancel event\r
+                                               tinyMCE.execCommand("mceAddUndoLevel");\r
+                                               return tinyMCE.cancelEvent(e);\r
+                                       }\r
+                               }\r
+\r
+                               // Handle backspace\r
+                               if ((tinyMCE.isGecko && !tinyMCE.isSafari) && tinyMCE.settings.force_p_newlines && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {\r
+                                       // Insert P element instead of BR\r
+                                       if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {\r
+                                               // Cancel event\r
+                                               tinyMCE.execCommand("mceAddUndoLevel");\r
+                                               return tinyMCE.cancelEvent(e);\r
+                                       }\r
+                               }\r
+\r
+                               // Return key pressed\r
+                               if (tinyMCE.isIE && tinyMCE.settings.force_br_newlines && e.keyCode == 13) {\r
+                                       if (e.target.editorId)\r
+                                               tinyMCE.instances[e.target.editorId].select();\r
+\r
+                                       if (tinyMCE.selectedInstance) {\r
+                                               var sel = tinyMCE.selectedInstance.getDoc().selection;\r
+                                               var rng = sel.createRange();\r
+\r
+                                               if (tinyMCE.getParentElement(rng.parentElement(), "li") != null)\r
+                                                       return false;\r
+\r
+                                               // Cancel event\r
+                                               e.returnValue = false;\r
+                                               e.cancelBubble = true;\r
+\r
+                                               // Insert BR element\r
+                                               rng.pasteHTML("<br />");\r
+                                               rng.collapse(false);\r
+                                               rng.select();\r
+\r
+                                               tinyMCE.execCommand("mceAddUndoLevel");\r
+                                               tinyMCE.triggerNodeChange(false);\r
+                                               return false;\r
+                                       }\r
+                               }\r
+\r
+                               // Backspace or delete\r
+                               if (e.keyCode == 8 || e.keyCode == 46) {\r
+                                       tinyMCE.selectedElement = e.target;\r
+                                       tinyMCE.linkElement = tinyMCE.getParentElement(e.target, "a");\r
+                                       tinyMCE.imgElement = tinyMCE.getParentElement(e.target, "img");\r
+                                       tinyMCE.triggerNodeChange(false);\r
+                               }\r
+\r
+                               return false;\r
+\r
+                       case "keyup":\r
+                       case "keydown":\r
+                               tinyMCE.hideMenus();\r
+                               tinyMCE.hasMouseMoved = false;\r
+\r
+                               if (inst && inst.handleShortcut(e))\r
+                                       return false;\r
+\r
+                               inst._fixRootBlocks();\r
+\r
+                               if (inst.settings.remove_trailing_nbsp)\r
+                                       inst._fixTrailingNbsp();\r
+\r
+                               if (e.target.editorId)\r
+                                       tinyMCE.instances[e.target.editorId].select();\r
+\r
+                               if (tinyMCE.selectedInstance)\r
+                                       tinyMCE.selectedInstance.switchSettings();\r
+\r
+                               inst = tinyMCE.selectedInstance;\r
+\r
+                               // Handle backspace\r
+                               if (tinyMCE.isGecko && tinyMCE.settings.force_p_newlines && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {\r
+                                       // Insert P element instead of BR\r
+                                       if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {\r
+                                               // Cancel event\r
+                                               tinyMCE.execCommand("mceAddUndoLevel");\r
+                                               e.preventDefault();\r
+                                               return false;\r
+                                       }\r
+                               }\r
+\r
+                               tinyMCE.selectedElement = null;\r
+                               tinyMCE.selectedNode = null;\r
+                               elm = tinyMCE.selectedInstance.getFocusElement();\r
+                               tinyMCE.linkElement = tinyMCE.getParentElement(elm, "a");\r
+                               tinyMCE.imgElement = tinyMCE.getParentElement(elm, "img");\r
+                               tinyMCE.selectedElement = elm;\r
+\r
+                               // Update visualaids on tabs\r
+                               if (tinyMCE.isGecko && e.type == "keyup" && e.keyCode == 9)\r
+                                       tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings.visual, tinyMCE.selectedInstance);\r
+\r
+                               // Fix empty elements on return/enter, check where enter occured\r
+                               if (tinyMCE.isIE && e.type == "keydown" && e.keyCode == 13)\r
+                                       tinyMCE.enterKeyElement = tinyMCE.selectedInstance.getFocusElement();\r
+\r
+                               // Fix empty elements on return/enter\r
+                               if (tinyMCE.isIE && e.type == "keyup" && e.keyCode == 13) {\r
+                                       elm = tinyMCE.enterKeyElement;\r
+                                       if (elm) {\r
+                                               var re = new RegExp('^HR|IMG|BR$','g'); // Skip these\r
+                                               var dre = new RegExp('^H[1-6]$','g'); // Add double on these\r
+\r
+                                               if (!elm.hasChildNodes() && !re.test(elm.nodeName)) {\r
+                                                       if (dre.test(elm.nodeName))\r
+                                                               elm.innerHTML = "&nbsp;&nbsp;";\r
+                                                       else\r
+                                                               elm.innerHTML = "&nbsp;";\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // Check if it's a position key\r
+                               keys = tinyMCE.posKeyCodes;\r
+                               var posKey = false;\r
+                               for (i=0; i<keys.length; i++) {\r
+                                       if (keys[i] == e.keyCode) {\r
+                                               posKey = true;\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               // MSIE custom key handling\r
+                               if (tinyMCE.isIE && tinyMCE.settings.custom_undo_redo) {\r
+                                       keys = [8, 46]; // Backspace,Delete\r
+\r
+                                       for (i=0; i<keys.length; i++) {\r
+                                               if (keys[i] == e.keyCode) {\r
+                                                       if (e.type == "keyup")\r
+                                                               tinyMCE.triggerNodeChange(false);\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // If Ctrl key\r
+                               if (e.keyCode == 17)\r
+                                       return true;\r
+\r
+                               // Handle Undo/Redo when typing content\r
+\r
+                               if (tinyMCE.isGecko) {\r
+                                       // Start typing (not a position key or ctrl key, but ctrl+x and ctrl+p is ok)\r
+                                       if (!posKey && e.type == "keyup" && !e.ctrlKey || (e.ctrlKey && (e.keyCode == 86 || e.keyCode == 88)))\r
+                                               tinyMCE.execCommand("mceStartTyping");\r
+                               } else {\r
+                                       // IE seems to be working better with this setting\r
+                                       if (!posKey && e.type == "keyup")\r
+                                               tinyMCE.execCommand("mceStartTyping");\r
+                               }\r
+\r
+                               // Store undo bookmark\r
+                               if (e.type == "keydown" && (posKey || e.ctrlKey) && inst)\r
+                                       inst.undoBookmark = inst.selection.getBookmark();\r
+\r
+                               // End typing (position key) or some Ctrl event\r
+                               if (e.type == "keyup" && (posKey || e.ctrlKey))\r
+                                       tinyMCE.execCommand("mceEndTyping");\r
+\r
+                               if (posKey && e.type == "keyup")\r
+                                       tinyMCE.triggerNodeChange(false);\r
+\r
+                               if (tinyMCE.isIE && e.ctrlKey)\r
+                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
+                       break;\r
+\r
+                       case "mousedown":\r
+                       case "mouseup":\r
+                       case "click":\r
+                       case "dblclick":\r
+                       case "focus":\r
+                               tinyMCE.hideMenus();\r
+\r
+                               if (tinyMCE.selectedInstance) {\r
+                                       tinyMCE.selectedInstance.switchSettings();\r
+                                       tinyMCE.selectedInstance.isFocused = true;\r
+                               }\r
+\r
+                               // Check instance event trigged on\r
+                               var targetBody = tinyMCE.getParentElement(e.target, "html");\r
+                               for (var instanceName in tinyMCE.instances) {\r
+                                       if (!tinyMCE.isInstance(tinyMCE.instances[instanceName]))\r
+                                               continue;\r
+\r
+                                       inst = tinyMCE.instances[instanceName];\r
+\r
+                                       // Reset design mode if lost (on everything just in case)\r
+                                       inst.autoResetDesignMode();\r
+\r
+                                       // Use HTML element since users might click outside of body element\r
+                                       if (inst.getBody().parentNode == targetBody) {\r
+                                               inst.select();\r
+                                               tinyMCE.selectedElement = e.target;\r
+                                               tinyMCE.linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");\r
+                                               tinyMCE.imgElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "img");\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               // Add first bookmark location\r
+                               if (!tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark && (e.type == "mouseup" || e.type == "dblclick"))\r
+                                       tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark = tinyMCE.selectedInstance.selection.getBookmark();\r
+\r
+                               // Reset selected node\r
+                               if (e.type != "focus")\r
+                                       tinyMCE.selectedNode = null;\r
+\r
+                               tinyMCE.triggerNodeChange(false);\r
+                               tinyMCE.execCommand("mceEndTyping");\r
+\r
+                               if (e.type == "mouseup")\r
+                                       tinyMCE.execCommand("mceAddUndoLevel");\r
+\r
+                               // Just in case\r
+                               if (!tinyMCE.selectedInstance && e.target.editorId)\r
+                                       tinyMCE.instances[e.target.editorId].select();\r
+\r
+                               return false;\r
+               }\r
+       },\r
+\r
+       getButtonHTML : function(id, lang, img, cmd, ui, val) {\r
+               var h = '', m, x, io = '';\r
+\r
+               cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\'';\r
+\r
+               if (typeof(ui) != "undefined" && ui != null)\r
+                       cmd += ',' + ui;\r
+\r
+               if (typeof(val) != "undefined" && val != null)\r
+                       cmd += ",'" + val + "'";\r
+\r
+               cmd += ');';\r
+\r
+               // Patch for IE7 bug with hover out not restoring correctly\r
+               if (tinyMCE.isRealIE)\r
+                       io = 'onmouseover="tinyMCE.lastHover = this;"';\r
+\r
+               // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled\r
+               if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isIE || tinyMCE.isOpera) && (m = this.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) {\r
+                       // Tiled button\r
+                       x = 0 - (m * 20) == 0 ? '0' : 0 - (m * 20);\r
+                       h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" ' + io + ' class="mceTiledButton mceButtonNormal" target="_self">';\r
+                       h += '<img src="{$themeurl}/images/spacer.gif" style="background-position: ' + x + 'px 0" alt="{$'+lang+'}" title="{$' + lang + '}" />';\r
+                       h += '</a>';\r
+               } else {\r
+                       // Normal button\r
+                       h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" ' + io + ' class="mceButtonNormal" target="_self">';\r
+                       h += '<img src="' + img + '" alt="{$'+lang+'}" title="{$' + lang + '}" />';\r
+                       h += '</a>';\r
+               }\r
+\r
+               return h;\r
+       },\r
+\r
+       getMenuButtonHTML : function(id, lang, img, mcmd, cmd, ui, val) {\r
+               var h = '', m, x;\r
+\r
+               mcmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + mcmd + '\');';\r
+               cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\'';\r
+\r
+               if (typeof(ui) != "undefined" && ui != null)\r
+                       cmd += ',' + ui;\r
+\r
+               if (typeof(val) != "undefined" && val != null)\r
+                       cmd += ",'" + val + "'";\r
+\r
+               cmd += ');';\r
+\r
+               // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled\r
+               if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isIE || tinyMCE.isOpera) && (m = tinyMCE.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) {\r
+                       x = 0 - (m * 20) == 0 ? '0' : 0 - (m * 20);\r
+\r
+                       if (tinyMCE.isRealIE)\r
+                               h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';\r
+                       else\r
+                               h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton">';\r
+\r
+                       h += '<a href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceTiledButton mceMenuButtonNormal" target="_self">';\r
+                       h += '<img src="{$themeurl}/images/spacer.gif" style="width: 20px; height: 20px; background-position: ' + x + 'px 0" title="{$' + lang + '}" /></a>';\r
+                       h += '<a href="javascript:' + mcmd + '" onclick="' + mcmd + 'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$' + lang + '}" class="mceMenuButton" />';\r
+                       h += '</a></span>';\r
+               } else {\r
+                       if (tinyMCE.isRealIE)\r
+                               h += '<span id="{$editor_id}_' + id + '" dir="ltr" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';\r
+                       else\r
+                               h += '<span id="{$editor_id}_' + id + '" dir="ltr" class="mceMenuButton">';\r
+\r
+                       h += '<a href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceMenuButtonNormal" target="_self">';\r
+                       h += '<img src="' + img + '" title="{$' + lang + '}" /></a>';\r
+                       h += '<a href="javascript:' + mcmd + '" onclick="' + mcmd + 'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$' + lang + '}" class="mceMenuButton" />';\r
+                       h += '</a></span>';\r
+               }\r
+\r
+               return h;\r
+       },\r
+\r
+       _menuButtonEvent : function(e, o) {\r
+               if (o.className == 'mceMenuButtonFocus')\r
+                       return;\r
+\r
+               if (e == 'over')\r
+                       o.className = o.className + ' mceMenuHover';\r
+               else\r
+                       o.className = o.className.replace(/\s.*$/, '');\r
+       },\r
+\r
+       addButtonMap : function(m) {\r
+               var i, a = m.replace(/\s+/, '').split(',');\r
+\r
+               for (i=0; i<a.length; i++)\r
+                       this.buttonMap[a[i]] = i;\r
+       },\r
+\r
+       formSubmit : function(f, p) {\r
+               var n, inst, found = false;\r
+\r
+               if (f.form)\r
+                       f = f.form;\r
+\r
+               // Is it a form that has a TinyMCE instance\r
+               for (n in tinyMCE.instances) {\r
+                       inst = tinyMCE.instances[n];\r
+\r
+                       if (!tinyMCE.isInstance(inst))\r
+                               continue;\r
+\r
+                       if (inst.formElement) {\r
+                               if (f == inst.formElement.form) {\r
+                                       found = true;\r
+                                       inst.isNotDirty = true;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // Is valid\r
+               if (found) {\r
+                       tinyMCE.removeTinyMCEFormElements(f);\r
+                       tinyMCE.triggerSave();\r
+               }\r
+\r
+               // Is it patched\r
+               if (f.mceOldSubmit && p)\r
+                       f.mceOldSubmit();\r
+       },\r
+\r
+       submitPatch : function() {\r
+               tinyMCE.formSubmit(this, true);\r
+       },\r
+\r
+       onLoad : function() {\r
+               var r, i, c, mode, trigger, elements, element, settings, elementId, elm;\r
+               var selector, deselector, elementRefAr, form;\r
+\r
+               // Wait for everything to be loaded first\r
+               if (tinyMCE.settings.strict_loading_mode && this.loadingIndex != -1) {\r
+                       window.setTimeout('tinyMCE.onLoad();', 1);\r
+                       return;\r
+               }\r
+\r
+               if (tinyMCE.isRealIE && window.event.type == "readystatechange" && document.readyState != "complete")\r
+                       return true;\r
+\r
+               if (tinyMCE.isLoaded)\r
+                       return true;\r
+\r
+               tinyMCE.isLoaded = true;\r
+\r
+               // IE produces JS error if TinyMCE is placed in a frame\r
+               // It seems to have something to do with the selection not beeing\r
+               // correctly initialized in IE so this hack solves the problem\r
+               if (tinyMCE.isRealIE && document.body && window.location.href != window.top.location.href) {\r
+                       r = document.body.createTextRange();\r
+                       r.collapse(true);\r
+                       r.select();\r
+               }\r
+\r
+               tinyMCE.dispatchCallback(null, 'onpageload', 'onPageLoad');\r
+\r
+               for (c=0; c<tinyMCE.configs.length; c++) {\r
+                       tinyMCE.settings = tinyMCE.configs[c];\r
+\r
+                       selector = tinyMCE.getParam("editor_selector");\r
+                       deselector = tinyMCE.getParam("editor_deselector");\r
+                       elementRefAr = [];\r
+\r
+                       // Add submit triggers\r
+                       if (document.forms && tinyMCE.settings.add_form_submit_trigger && !tinyMCE.submitTriggers) {\r
+                               for (i=0; i<document.forms.length; i++) {\r
+                                       form = document.forms[i];\r
+\r
+                                       tinyMCE.addEvent(form, "submit", TinyMCE_Engine.prototype.handleEvent);\r
+                                       tinyMCE.addEvent(form, "reset", TinyMCE_Engine.prototype.handleEvent);\r
+                                       tinyMCE.submitTriggers = true; // Do it only once\r
+\r
+                                       // Patch the form.submit function\r
+                                       if (tinyMCE.settings.submit_patch) {\r
+                                               try {\r
+                                                       form.mceOldSubmit = form.submit;\r
+                                                       form.submit = TinyMCE_Engine.prototype.submitPatch;\r
+                                               } catch (e) {\r
+                                                       // Do nothing\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Add editor instances based on mode\r
+                       mode = tinyMCE.settings.mode;\r
+                       switch (mode) {\r
+                               case "exact":\r
+                                       elements = tinyMCE.getParam('elements', '', true, ',');\r
+\r
+                                       for (i=0; i<elements.length; i++) {\r
+                                               element = tinyMCE._getElementById(elements[i]);\r
+                                               trigger = element ? element.getAttribute(tinyMCE.settings.textarea_trigger) : "";\r
+\r
+                                               if (new RegExp('\\b' + deselector + '\\b').test(tinyMCE.getAttrib(element, "class")))\r
+                                                       continue;\r
+\r
+                                               if (trigger == "false")\r
+                                                       continue;\r
+\r
+                                               if ((tinyMCE.settings.ask || tinyMCE.settings.convert_on_click) && element) {\r
+                                                       elementRefAr[elementRefAr.length] = element;\r
+                                                       continue;\r
+                                               }\r
+\r
+                                               if (element)\r
+                                                       tinyMCE.addMCEControl(element, elements[i]);\r
+                                       }\r
+                               break;\r
+\r
+                               case "specific_textareas":\r
+                               case "textareas":\r
+                                       elements = document.getElementsByTagName("textarea");\r
+\r
+                                       for (i=0; i<elements.length; i++) {\r
+                                               elm = elements.item(i);\r
+                                               trigger = elm.getAttribute(tinyMCE.settings.textarea_trigger);\r
+\r
+                                               if (selector !== '' && !new RegExp('\\b' + selector + '\\b').test(tinyMCE.getAttrib(elm, "class")))\r
+                                                       continue;\r
+\r
+                                               if (selector !== '')\r
+                                                       trigger = selector !== '' ? "true" : "";\r
+\r
+                                               if (new RegExp('\\b' + deselector + '\\b').test(tinyMCE.getAttrib(elm, "class")))\r
+                                                       continue;\r
+\r
+                                               if ((mode == "specific_textareas" && trigger == "true") || (mode == "textareas" && trigger != "false"))\r
+                                                       elementRefAr[elementRefAr.length] = elm;\r
+                                       }\r
+                               break;\r
+                       }\r
+\r
+                       for (i=0; i<elementRefAr.length; i++) {\r
+                               element = elementRefAr[i];\r
+                               elementId = element.name ? element.name : element.id;\r
+\r
+                               if (tinyMCE.settings.ask || tinyMCE.settings.convert_on_click) {\r
+                                       // Focus breaks in Mozilla\r
+                                       if (tinyMCE.isGecko) {\r
+                                               settings = tinyMCE.settings;\r
+\r
+                                               tinyMCE.addEvent(element, "focus", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});\r
+\r
+                                               if (element.nodeName != "TEXTAREA" && element.nodeName != "INPUT")\r
+                                                       tinyMCE.addEvent(element, "click", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});\r
+                                               // tinyMCE.addEvent(element, "mouseover", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});\r
+                                       } else {\r
+                                               settings = tinyMCE.settings;\r
+\r
+                                               tinyMCE.addEvent(element, "focus", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });\r
+                                               tinyMCE.addEvent(element, "click", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });\r
+                                               // tinyMCE.addEvent(element, "mouseenter", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });\r
+                                       }\r
+                               } else\r
+                                       tinyMCE.addMCEControl(element, elementId);\r
+                       }\r
+\r
+                       // Handle auto focus\r
+                       if (tinyMCE.settings.auto_focus) {\r
+                               window.setTimeout(function () {\r
+                                       var inst = tinyMCE.getInstanceById(tinyMCE.settings.auto_focus);\r
+                                       inst.selection.selectNode(inst.getBody(), true, true);\r
+                                       inst.contentWindow.focus();\r
+                               }, 100);\r
+                       }\r
+\r
+                       tinyMCE.dispatchCallback(null, 'oninit', 'onInit');\r
+               }\r
+       },\r
+\r
+       isInstance : function(o) {\r
+               return o != null && typeof(o) == "object" && o.isTinyMCE_Control;\r
+       },\r
+\r
+       getParam : function(name, default_value, strip_whitespace, split_chr) {\r
+               var i, outArray, value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];\r
+\r
+               // Fix bool values\r
+               if (value == "true" || value == "false")\r
+                       return (value == "true");\r
+\r
+               if (strip_whitespace)\r
+                       value = tinyMCE.regexpReplace(value, "[ \t\r\n]", "");\r
+\r
+               if (typeof(split_chr) != "undefined" && split_chr != null) {\r
+                       value = value.split(split_chr);\r
+                       outArray = [];\r
+\r
+                       for (i=0; i<value.length; i++) {\r
+                               if (value[i] && value[i] !== '')\r
+                                       outArray[outArray.length] = value[i];\r
+                       }\r
+\r
+                       value = outArray;\r
+               }\r
+\r
+               return value;\r
+       },\r
+\r
+       getLang : function(name, default_value, parse_entities, va) {\r
+               var v = (typeof(tinyMCELang[name]) == "undefined") ? default_value : tinyMCELang[name], n;\r
+\r
+               if (parse_entities)\r
+                       v = tinyMCE.entityDecode(v);\r
+\r
+               if (va) {\r
+                       for (n in va)\r
+                               v = this.replaceVar(v, n, va[n]);\r
+               }\r
+\r
+               return v;\r
+       },\r
+\r
+       entityDecode : function(s) {\r
+               var e = document.createElement("div");\r
+\r
+               e.innerHTML = s;\r
+\r
+               return !e.firstChild ? s : e.firstChild.nodeValue;\r
+       },\r
+\r
+       addToLang : function(prefix, ar) {\r
+               var k;\r
+\r
+               for (k in ar) {\r
+                       if (typeof(ar[k]) == 'function')\r
+                               continue;\r
+\r
+                       tinyMCELang[(k.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix !== '' ? (prefix + "_") : '') + k] = ar[k];\r
+               }\r
+\r
+               this.loadNextScript();\r
+       },\r
+\r
+       triggerNodeChange : function(focus, setup_content) {\r
+               var elm, inst, editorId, undoIndex = -1, undoLevels = -1, doc, anySelection = false, st;\r
+\r
+               if (tinyMCE.selectedInstance) {\r
+                       inst = tinyMCE.selectedInstance;\r
+                       elm = (typeof(setup_content) != "undefined" && setup_content) ? tinyMCE.selectedElement : inst.getFocusElement();\r
+\r
+/*                     if (elm == inst.lastTriggerEl)\r
+                               return;\r
+\r
+                       inst.lastTriggerEl = elm;*/\r
+\r
+                       editorId = inst.editorId;\r
+                       st = inst.selection.getSelectedText();\r
+\r
+                       if (tinyMCE.settings.auto_resize)\r
+                               inst.resizeToContent();\r
+\r
+                       if (setup_content && tinyMCE.isGecko && inst.isHidden())\r
+                               elm = inst.getBody();\r
+\r
+                       inst.switchSettings();\r
+\r
+                       if (tinyMCE.selectedElement)\r
+                               anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == "img") || (st && st.length > 0);\r
+\r
+                       if (tinyMCE.settings.custom_undo_redo) {\r
+                               undoIndex = inst.undoRedo.undoIndex;\r
+                               undoLevels = inst.undoRedo.undoLevels.length;\r
+                       }\r
+\r
+                       tinyMCE.dispatchCallback(inst, 'handle_node_change_callback', 'handleNodeChange', editorId, elm, undoIndex, undoLevels, inst.visualAid, anySelection, setup_content);\r
+               }\r
+\r
+               if (this.selectedInstance && (typeof(focus) == "undefined" || focus))\r
+                       this.selectedInstance.contentWindow.focus();\r
+       },\r
+\r
+       _customCleanup : function(inst, type, content) {\r
+               var pl, po, i, customCleanup;\r
+\r
+               // Call custom cleanup\r
+               customCleanup = tinyMCE.settings.cleanup_callback;\r
+               if (customCleanup != '')\r
+                       content = tinyMCE.resolveDots(tinyMCE.settings.cleanup_callback, window)(type, content, inst);\r
+\r
+               // Trigger theme cleanup\r
+               po = tinyMCE.themes[tinyMCE.settings.theme];\r
+               if (po && po.cleanup)\r
+                       content = po.cleanup(type, content, inst);\r
+\r
+               // Trigger plugin cleanups\r
+               pl = inst.plugins;\r
+               for (i=0; i<pl.length; i++) {\r
+                       po = tinyMCE.plugins[pl[i]];\r
+\r
+                       if (po && po.cleanup)\r
+                               content = po.cleanup(type, content, inst);\r
+               }\r
+\r
+               return content;\r
+       },\r
+\r
+       setContent : function(h) {\r
+               if (tinyMCE.selectedInstance) {\r
+                       tinyMCE.selectedInstance.execCommand('mceSetContent', false, h);\r
+                       tinyMCE.selectedInstance.repaint();\r
+               }\r
+       },\r
+\r
+       importThemeLanguagePack : function(name) {\r
+               if (typeof(name) == "undefined")\r
+                       name = tinyMCE.settings.theme;\r
+\r
+               tinyMCE.loadScript(tinyMCE.baseURL + '/themes/' + name + '/langs/' + tinyMCE.settings.language + '.js');\r
+       },\r
+\r
+       importPluginLanguagePack : function(name) {\r
+               var b = tinyMCE.baseURL + '/plugins/' + name;\r
+\r
+               if (this.plugins[name])\r
+                       b = this.plugins[name].baseURL;\r
+\r
+               tinyMCE.loadScript(b + '/langs/' + tinyMCE.settings.language +  '.js');\r
+       },\r
+\r
+       applyTemplate : function(h, ag) {\r
+               return h.replace(new RegExp('\\{\\$([a-z0-9_]+)\\}', 'gi'), function(m, s) {\r
+                       if (s.indexOf('lang_') == 0 && tinyMCELang[s])\r
+                               return tinyMCELang[s];\r
+\r
+                       if (ag && ag[s])\r
+                               return ag[s];\r
+\r
+                       if (tinyMCE.settings[s])\r
+                               return tinyMCE.settings[s];\r
+\r
+                       if (m == 'themeurl')\r
+                               return tinyMCE.themeURL;\r
+\r
+                       return m;\r
+               });\r
+       },\r
+\r
+       replaceVar : function(h, r, v) {\r
+               return h.replace(new RegExp('{\\\$' + r + '}', 'g'), v);\r
+       },\r
+\r
+       openWindow : function(template, args) {\r
+               var html, width, height, x, y, resizable, scrollbars, url, name, win, modal, features;\r
+\r
+               args = !args ? {} : args;\r
+\r
+               args.mce_template_file = template.file;\r
+               args.mce_width = template.width;\r
+               args.mce_height = template.height;\r
+               tinyMCE.windowArgs = args;\r
+\r
+               html = template.html;\r
+               if (!(width = parseInt(template.width)))\r
+                       width = 320;\r
+\r
+               if (!(height = parseInt(template.height)))\r
+                       height = 200;\r
+\r
+               // Add to height in M$ due to SP2 WHY DON'T YOU GUYS IMPLEMENT innerWidth of windows!!\r
+               if (tinyMCE.isIE)\r
+                       height += 40;\r
+               else\r
+                       height += 20;\r
+\r
+               x = parseInt(screen.width / 2.0) - (width / 2.0);\r
+               y = parseInt(screen.height / 2.0) - (height / 2.0);\r
+\r
+               resizable = (args && args.resizable) ? args.resizable : "no";\r
+               scrollbars = (args && args.scrollbars) ? args.scrollbars : "no";\r
+\r
+               if (template.file.charAt(0) != '/' && template.file.indexOf('://') == -1)\r
+                       url = tinyMCE.baseURL + "/themes/" + tinyMCE.getParam("theme") + "/" + template.file;\r
+               else\r
+                       url = template.file;\r
+\r
+               // Replace all args as variables in URL\r
+               for (name in args) {\r
+                       if (typeof(args[name]) == 'function')\r
+                               continue;\r
+\r
+                       url = tinyMCE.replaceVar(url, name, escape(args[name]));\r
+               }\r
+\r
+               if (html) {\r
+                       html = tinyMCE.replaceVar(html, "css", this.settings.popups_css);\r
+                       html = tinyMCE.applyTemplate(html, args);\r
+\r
+                       win = window.open("", "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=yes,minimizable=" + resizable + ",modal=yes,width=" + width + ",height=" + height + ",resizable=" + resizable);\r
+                       if (win == null) {\r
+                               alert(tinyMCELang.lang_popup_blocked);\r
+                               return;\r
+                       }\r
+\r
+                       win.document.write(html);\r
+                       win.document.close();\r
+                       win.resizeTo(width, height);\r
+                       win.focus();\r
+               } else {\r
+                       if ((tinyMCE.isRealIE) && resizable != 'yes' && tinyMCE.settings.dialog_type == "modal") {\r
+                               height += 10;\r
+\r
+                               features = "resizable:" + resizable + ";scroll:" + scrollbars + ";status:yes;center:yes;help:no;dialogWidth:" + width + "px;dialogHeight:" + height + "px;";\r
+\r
+                               window.showModalDialog(url, window, features);\r
+                       } else {\r
+                               modal = (resizable == "yes") ? "no" : "yes";\r
+\r
+                               if (tinyMCE.isGecko && tinyMCE.isMac)\r
+                                       modal = "no";\r
+\r
+                               if (template.close_previous != "no")\r
+                                       try {tinyMCE.lastWindow.close();} catch (ex) {}\r
+\r
+                               win = window.open(url, "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=" + modal + ",minimizable=" + resizable + ",modal=" + modal + ",width=" + width + ",height=" + height + ",resizable=" + resizable);\r
+                               if (win == null) {\r
+                                       alert(tinyMCELang.lang_popup_blocked);\r
+                                       return;\r
+                               }\r
+\r
+                               if (template.close_previous != "no")\r
+                                       tinyMCE.lastWindow = win;\r
+\r
+                               try {\r
+                                       win.resizeTo(width, height);\r
+                               } catch(e) {\r
+                                       // Ignore\r
+                               }\r
+\r
+                               // Make it bigger if statusbar is forced\r
+                               if (tinyMCE.isGecko) {\r
+                                       if (win.document.defaultView.statusbar.visible)\r
+                                               win.resizeBy(0, tinyMCE.isMac ? 10 : 24);\r
+                               }\r
+\r
+                               win.focus();\r
+                       }\r
+               }\r
+       },\r
+\r
+       closeWindow : function(win) {\r
+               win.close();\r
+       },\r
+\r
+       getVisualAidClass : function(class_name, state) {\r
+               var i, classNames, ar, className, aidClass = tinyMCE.settings.visual_table_class;\r
+\r
+               if (typeof(state) == "undefined")\r
+                       state = tinyMCE.settings.visual;\r
+\r
+               // Split\r
+               classNames = [];\r
+               ar = class_name.split(' ');\r
+               for (i=0; i<ar.length; i++) {\r
+                       if (ar[i] == aidClass)\r
+                               ar[i] = "";\r
+\r
+                       if (ar[i] !== '')\r
+                               classNames[classNames.length] = ar[i];\r
+               }\r
+\r
+               if (state)\r
+                       classNames[classNames.length] = aidClass;\r
+\r
+               // Glue\r
+               className = "";\r
+               for (i=0; i<classNames.length; i++) {\r
+                       if (i > 0)\r
+                               className += " ";\r
+\r
+                       className += classNames[i];\r
+               }\r
+\r
+               return className;\r
+       },\r
+\r
+       handleVisualAid : function(el, deep, state, inst, skip_dispatch) {\r
+               var i, x, y, tableElement, anchorName, oldW, oldH, bo, cn;\r
+\r
+               if (!el)\r
+                       return;\r
+\r
+               if (!skip_dispatch)\r
+                       tinyMCE.dispatchCallback(inst, 'handle_visual_aid_callback', 'handleVisualAid', el, deep, state, inst);\r
+\r
+               tableElement = null;\r
+\r
+               switch (el.nodeName) {\r
+                       case "TABLE":\r
+                               oldW = el.style.width;\r
+                               oldH = el.style.height;\r
+                               bo = tinyMCE.getAttrib(el, "border");\r
+\r
+                               bo = bo == '' || bo == "0" ? true : false;\r
+\r
+                               tinyMCE.setAttrib(el, "class", tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el, "class"), state && bo));\r
+\r
+                               el.style.width = oldW;\r
+                               el.style.height = oldH;\r
+\r
+                               for (y=0; y<el.rows.length; y++) {\r
+                                       for (x=0; x<el.rows[y].cells.length; x++) {\r
+                                               cn = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x], "class"), state && bo);\r
+                                               tinyMCE.setAttrib(el.rows[y].cells[x], "class", cn);\r
+                                       }\r
+                               }\r
+\r
+                               break;\r
+\r
+                       case "A":\r
+                               anchorName = tinyMCE.getAttrib(el, "name");\r
+\r
+                               if (anchorName !== '' && state) {\r
+                                       el.title = anchorName;\r
+                                       tinyMCE.addCSSClass(el, 'mceItemAnchor');\r
+                               } else if (anchorName !== '' && !state)\r
+                                       el.className = '';\r
+\r
+                               break;\r
+               }\r
+\r
+               if (deep && el.hasChildNodes()) {\r
+                       for (i=0; i<el.childNodes.length; i++)\r
+                               tinyMCE.handleVisualAid(el.childNodes[i], deep, state, inst, true);\r
+               }\r
+       },\r
+\r
+       fixGeckoBaseHREFBug : function(m, e, h) {\r
+               var xsrc, xhref;\r
+\r
+               if (tinyMCE.isGecko) {\r
+                       if (m == 1) {\r
+                               h = h.replace(/\ssrc=/gi, " mce_tsrc=");\r
+                               h = h.replace(/\shref=/gi, " mce_thref=");\r
+\r
+                               return h;\r
+                       } else {\r
+                               // Why bother if there is no src or href broken\r
+                               if (!new RegExp('(src|href)=', 'g').test(h))\r
+                                       return h;\r
+\r
+                               // Restore src and href that gets messed up by Gecko\r
+                               tinyMCE.selectElements(e, 'A,IMG,SELECT,AREA,IFRAME,BASE,INPUT,SCRIPT,EMBED,OBJECT,LINK', function (n) {\r
+                                       xsrc = tinyMCE.getAttrib(n, "mce_tsrc");\r
+                                       xhref = tinyMCE.getAttrib(n, "mce_thref");\r
+\r
+                                       if (xsrc !== '') {\r
+                                               try {\r
+                                                       n.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, xsrc);\r
+                                               } catch (e) {\r
+                                                       // Ignore, Firefox cast exception if local file wasn't found\r
+                                               }\r
+\r
+                                               n.removeAttribute("mce_tsrc");\r
+                                       }\r
+\r
+                                       if (xhref !== '') {\r
+                                               try {\r
+                                                       n.href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, xhref);\r
+                                               } catch (e) {\r
+                                                       // Ignore, Firefox cast exception if local file wasn't found\r
+                                               }\r
+\r
+                                               n.removeAttribute("mce_thref");\r
+                                       }\r
+\r
+                                       return false;\r
+                               });\r
+\r
+                               // Restore text/comment nodes\r
+                               tinyMCE.selectNodes(e, function(n) {\r
+                                       if (n.nodeType == 3 || n.nodeType == 8) {\r
+                                               n.nodeValue = n.nodeValue.replace(/\smce_tsrc=/gi, " src=");\r
+                                               n.nodeValue = n.nodeValue.replace(/\smce_thref=/gi, " href=");\r
+                                       }\r
+\r
+                                       return false;\r
+                               });\r
+                       }\r
+               }\r
+\r
+               return h;\r
+       },\r
+\r
+       _setHTML : function(doc, html_content) {\r
+               var i, html, paras, node;\r
+\r
+               // Force closed anchors open\r
+               //html_content = html_content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');\r
+\r
+               html_content = tinyMCE.cleanupHTMLCode(html_content);\r
+\r
+               // Try innerHTML if it fails use pasteHTML in MSIE\r
+               try {\r
+                       tinyMCE.setInnerHTML(doc.body, html_content);\r
+               } catch (e) {\r
+                       if (this.isMSIE)\r
+                               doc.body.createTextRange().pasteHTML(html_content);\r
+               }\r
+\r
+               // Content duplication bug fix\r
+               if (tinyMCE.isIE && tinyMCE.settings.fix_content_duplication) {\r
+                       // Remove P elements in P elements\r
+                       paras = doc.getElementsByTagName("P");\r
+                       for (i=0; i<paras.length; i++) {\r
+                               node = paras[i];\r
+\r
+                               while ((node = node.parentNode) != null) {\r
+                                       if (node.nodeName == "P")\r
+                                               node.outerHTML = node.innerHTML;\r
+                               }\r
+                       }\r
+\r
+                       // Content duplication bug fix (Seems to be word crap)\r
+                       html = doc.body.innerHTML;\r
+\r
+                       // Always set the htmlText output\r
+                       tinyMCE.setInnerHTML(doc.body, html);\r
+               }\r
+\r
+               tinyMCE.cleanupAnchors(doc);\r
+\r
+               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                       tinyMCE.convertSpansToFonts(doc);\r
+       },\r
+\r
+       getEditorId : function(form_element) {\r
+               var inst = this.getInstanceById(form_element);\r
+\r
+               if (!inst)\r
+                       return null;\r
+\r
+               return inst.editorId;\r
+       },\r
+\r
+       getInstanceById : function(editor_id) {\r
+               var inst = this.instances[editor_id], n;\r
+\r
+               if (!inst) {\r
+                       for (n in tinyMCE.instances) {\r
+                               inst = tinyMCE.instances[n];\r
+\r
+                               if (!tinyMCE.isInstance(inst))\r
+                                       continue;\r
+\r
+                               if (inst.formTargetElementId == editor_id)\r
+                                       return inst;\r
+                       }\r
+               } else\r
+                       return inst;\r
+\r
+               return null;\r
+       },\r
+\r
+       queryInstanceCommandValue : function(editor_id, command) {\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+               if (inst)\r
+                       return inst.queryCommandValue(command);\r
+\r
+               return false;\r
+       },\r
+\r
+       queryInstanceCommandState : function(editor_id, command) {\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+               if (inst)\r
+                       return inst.queryCommandState(command);\r
+\r
+               return null;\r
+       },\r
+\r
+       setWindowArg : function(n, v) {\r
+               this.windowArgs[n] = v;\r
+       },\r
+\r
+       getWindowArg : function(n, d) {\r
+               return (typeof(this.windowArgs[n]) == "undefined") ? d : this.windowArgs[n];\r
+       },\r
+\r
+       getCSSClasses : function(editor_id, doc) {\r
+               var i, c, x, rule, styles, rules, csses, selectorText, inst = tinyMCE.getInstanceById(editor_id);\r
+               var cssClass, addClass, p;\r
+\r
+               if (!inst)\r
+                       inst = tinyMCE.selectedInstance;\r
+\r
+               if (!inst)\r
+                       return [];\r
+\r
+               if (!doc)\r
+                       doc = inst.getDoc();\r
+\r
+               // Is cached, use that\r
+               if (inst && inst.cssClasses.length > 0)\r
+                       return inst.cssClasses;\r
+\r
+               if (!doc)\r
+                       return;\r
+\r
+               styles = doc.styleSheets;\r
+\r
+               if (styles && styles.length > 0) {\r
+                       for (x=0; x<styles.length; x++) {\r
+                               csses = null;\r
+\r
+                               try {\r
+                                       csses = tinyMCE.isIE ? doc.styleSheets(x).rules : styles[x].cssRules;\r
+                               } catch(e) {\r
+                                       // Just ignore any errors I know this is ugly!!\r
+                               }\r
+       \r
+                               if (!csses)\r
+                                       return [];\r
+\r
+                               for (i=0; i<csses.length; i++) {\r
+                                       selectorText = csses[i].selectorText;\r
+\r
+                                       // Can be multiple rules per selector\r
+                                       if (selectorText) {\r
+                                               rules = selectorText.split(',');\r
+                                               for (c=0; c<rules.length; c++) {\r
+                                                       rule = rules[c];\r
+\r
+                                                       // Strip spaces between selectors\r
+                                                       while (rule.indexOf(' ') == 0)\r
+                                                               rule = rule.substring(1);\r
+\r
+                                                       // Invalid rule\r
+                                                       if (rule.indexOf(' ') != -1 || rule.indexOf(':') != -1 || rule.indexOf('mceItem') != -1)\r
+                                                               continue;\r
+\r
+                                                       if (rule.indexOf(tinyMCE.settings.visual_table_class) != -1 || rule.indexOf('mceEditable') != -1 || rule.indexOf('mceNonEditable') != -1)\r
+                                                               continue;\r
+\r
+                                                       // Is class rule\r
+                                                       if (rule.indexOf('.') != -1) {\r
+                                                               cssClass = rule.substring(rule.indexOf('.') + 1);\r
+                                                               addClass = true;\r
+\r
+                                                               for (p=0; p<inst.cssClasses.length && addClass; p++) {\r
+                                                                       if (inst.cssClasses[p] == cssClass)\r
+                                                                               addClass = false;\r
+                                                               }\r
+\r
+                                                               if (addClass)\r
+                                                                       inst.cssClasses[inst.cssClasses.length] = cssClass;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return inst.cssClasses;\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 s.replace(/^\s*|\s*$/g, "");\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
+       getControlHTML : function(c) {\r
+               var i, l, n, o, v, rtl = tinyMCE.getLang('lang_dir') == 'rtl';\r
+\r
+               l = tinyMCE.plugins;\r
+               for (n in l) {\r
+                       o = l[n];\r
+\r
+                       if (o.getControlHTML && (v = o.getControlHTML(c)) !== '') {\r
+                               if (rtl)\r
+                                       return '<span dir="rtl">' + tinyMCE.replaceVar(v, "pluginurl", o.baseURL) + '</span>';\r
+\r
+                               return tinyMCE.replaceVar(v, "pluginurl", o.baseURL);\r
+                       }\r
+               }\r
+\r
+               o = tinyMCE.themes[tinyMCE.settings.theme];\r
+               if (o.getControlHTML && (v = o.getControlHTML(c)) !== '') {\r
+                       if (rtl)\r
+                               return '<span dir="rtl">' + v + '</span>';\r
+\r
+                       return v;\r
+               }\r
+\r
+               return '';\r
+       },\r
+\r
+       evalFunc : function(f, idx, a, o) {\r
+               o = !o ? window : o;\r
+               f = typeof(f) == 'function' ? f : o[f];\r
+\r
+               return f.apply(o, Array.prototype.slice.call(a, idx));\r
+       },\r
+\r
+       dispatchCallback : function(i, p, n) {\r
+               return this.callFunc(i, p, n, 0, this.dispatchCallback.arguments);\r
+       },\r
+\r
+       executeCallback : function(i, p, n) {\r
+               return this.callFunc(i, p, n, 1, this.executeCallback.arguments);\r
+       },\r
+\r
+       execCommandCallback : function(i, p, n) {\r
+               return this.callFunc(i, p, n, 2, this.execCommandCallback.arguments);\r
+       },\r
+\r
+       callFunc : function(ins, p, n, m, a) {\r
+               var l, i, on, o, s, v;\r
+\r
+               s = m == 2;\r
+\r
+               l = tinyMCE.getParam(p, '');\r
+\r
+               if (l !== '' && (v = tinyMCE.evalFunc(l, 3, a)) == s && m > 0)\r
+                       return true;\r
+\r
+               if (ins != null) {\r
+                       for (i=0, l = ins.plugins; i<l.length; i++) {\r
+                               o = tinyMCE.plugins[l[i]];\r
+\r
+                               if (o[n] && (v = tinyMCE.evalFunc(n, 3, a, o)) == s && m > 0)\r
+                                       return true;\r
+                       }\r
+               }\r
+\r
+               l = tinyMCE.themes;\r
+               for (on in l) {\r
+                       o = l[on];\r
+\r
+                       if (o[n] && (v = tinyMCE.evalFunc(n, 3, a, o)) == s && m > 0)\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       resolveDots : function(s, o) {\r
+               var i;\r
+\r
+               if (typeof(s) == 'string') {\r
+                       for (i=0, s=s.split('.'); i<s.length; i++)\r
+                               o = o[s[i]];\r
+               } else\r
+                       o = s;\r
+\r
+               return o;\r
+       },\r
+\r
+       xmlEncode : function(s) {\r
+               return s ? ('' + s).replace(this.xmlEncodeRe, 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
+       },\r
+\r
+       add : function(c, m) {\r
+               var n;\r
+\r
+               for (n in m)\r
+                       c.prototype[n] = m[n];\r
+       },\r
+\r
+       extend : function(p, np) {\r
+               var o = {}, n;\r
+\r
+               o.parent = p;\r
+\r
+               for (n in p)\r
+                       o[n] = p[n];\r
+\r
+               for (n in np)\r
+                       o[n] = np[n];\r
+\r
+               return o;\r
+       },\r
+\r
+       hideMenus : function() {\r
+               var e = tinyMCE.lastSelectedMenuBtn;\r
+\r
+               if (tinyMCE.lastMenu) {\r
+                       tinyMCE.lastMenu.hide();\r
+                       tinyMCE.lastMenu = null;\r
+               }\r
+\r
+               if (e) {\r
+                       tinyMCE.switchClass(e, tinyMCE.lastMenuBtnClass);\r
+                       tinyMCE.lastSelectedMenuBtn = null;\r
+               }\r
+       }\r
+\r
+       };\r
+\r
+// Global instances\r
+var TinyMCE = TinyMCE_Engine; // Compatiblity with gzip compressors\r
+var tinyMCE = new TinyMCE_Engine();\r
+var tinyMCELang = {};\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Control.class.js */\r
+\r
+function TinyMCE_Control(settings) {\r
+       var t, i, tos, fu, p, x, fn, fu, pn, s = settings;\r
+\r
+       this.undoRedoLevel = true;\r
+       this.isTinyMCE_Control = true;\r
+\r
+       // Default settings\r
+       this.enabled = true;\r
+       this.settings = s;\r
+       this.settings.theme = tinyMCE.getParam("theme", "default");\r
+       this.settings.width = tinyMCE.getParam("width", -1);\r
+       this.settings.height = tinyMCE.getParam("height", -1);\r
+       this.selection = new TinyMCE_Selection(this);\r
+       this.undoRedo = new TinyMCE_UndoRedo(this);\r
+       this.cleanup = new TinyMCE_Cleanup();\r
+       this.shortcuts = [];\r
+       this.hasMouseMoved = false;\r
+       this.foreColor = this.backColor = "#999999";\r
+       this.data = {};\r
+       this.cssClasses = [];\r
+\r
+       this.cleanup.init({\r
+               valid_elements : s.valid_elements,\r
+               extended_valid_elements : s.extended_valid_elements,\r
+               valid_child_elements : s.valid_child_elements,\r
+               entities : s.entities,\r
+               entity_encoding : s.entity_encoding,\r
+               debug : s.cleanup_debug,\r
+               indent : s.apply_source_formatting,\r
+               invalid_elements : s.invalid_elements,\r
+               verify_html : s.verify_html,\r
+               fix_content_duplication : s.fix_content_duplication,\r
+               convert_fonts_to_spans : s.convert_fonts_to_spans\r
+       });\r
+\r
+       // Wrap old theme\r
+       t = this.settings.theme;\r
+       if (!tinyMCE.hasTheme(t)) {\r
+               fn = tinyMCE.callbacks;\r
+               tos = {};\r
+\r
+               for (i=0; i<fn.length; i++) {\r
+                       if ((fu = window['TinyMCE_' + t + "_" + fn[i]]))\r
+                               tos[fn[i]] = fu;\r
+               }\r
+\r
+               tinyMCE.addTheme(t, tos);\r
+       }\r
+\r
+       // Wrap old plugins\r
+       this.plugins = [];\r
+       p = tinyMCE.getParam('plugins', '', true, ',');\r
+       if (p.length > 0) {\r
+               for (i=0; i<p.length; i++) {\r
+                       pn = p[i];\r
+\r
+                       if (pn.charAt(0) == '-')\r
+                               pn = pn.substring(1);\r
+\r
+                       if (!tinyMCE.hasPlugin(pn)) {\r
+                               fn = tinyMCE.callbacks;\r
+                               tos = {};\r
+\r
+                               for (x=0; x<fn.length; x++) {\r
+                                       if ((fu = window['TinyMCE_' + pn + "_" + fn[x]]))\r
+                                               tos[fn[x]] = fu;\r
+                               }\r
+\r
+                               tinyMCE.addPlugin(pn, tos);\r
+                       }\r
+\r
+                       this.plugins[this.plugins.length] = pn; \r
+               }\r
+       }\r
+};\r
+\r
+TinyMCE_Control.prototype = {\r
+       selection : null,\r
+\r
+       settings : null,\r
+\r
+       cleanup : null,\r
+\r
+       getData : function(na) {\r
+               var o = this.data[na];\r
+\r
+               if (!o)\r
+                       o = this.data[na] = {};\r
+\r
+               return o;\r
+       },\r
+\r
+       hasPlugin : function(n) {\r
+               var i;\r
+\r
+               for (i=0; i<this.plugins.length; i++) {\r
+                       if (this.plugins[i] == n)\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       addPlugin : function(n, p) {\r
+               if (!this.hasPlugin(n)) {\r
+                       tinyMCE.addPlugin(n, p);\r
+                       this.plugins[this.plugins.length] = n;\r
+               }\r
+       },\r
+\r
+       repaint : function() {\r
+               var s, b, ex;\r
+\r
+               if (tinyMCE.isRealIE)\r
+                       return;\r
+\r
+               try {\r
+                       s = this.selection;\r
+                       b = s.getBookmark(true);\r
+                       this.getBody().style.display = 'none';\r
+                       this.getDoc().execCommand('selectall', false, null);\r
+                       this.getSel().collapseToStart();\r
+                       this.getBody().style.display = 'block';\r
+                       s.moveToBookmark(b);\r
+               } catch (ex) {\r
+                       // Ignore\r
+               }\r
+       },\r
+\r
+       switchSettings : function() {\r
+               if (tinyMCE.configs.length > 1 && tinyMCE.currentConfig != this.settings.index) {\r
+                       tinyMCE.settings = this.settings;\r
+                       tinyMCE.currentConfig = this.settings.index;\r
+               }\r
+       },\r
+\r
+       select : function() {\r
+               var oldInst = tinyMCE.selectedInstance;\r
+\r
+               if (oldInst != this) {\r
+                       if (oldInst)\r
+                               oldInst.execCommand('mceEndTyping');\r
+\r
+                       tinyMCE.dispatchCallback(this, 'select_instance_callback', 'selectInstance', this, oldInst);\r
+                       tinyMCE.selectedInstance = this;\r
+               }\r
+       },\r
+\r
+       getBody : function() {\r
+               return this.contentBody ? this.contentBody : this.getDoc().body;\r
+       },\r
+\r
+       getDoc : function() {\r
+//             return this.contentDocument ? this.contentDocument : this.contentWindow.document; // Removed due to IE 5.5 ?\r
+               return this.contentWindow.document;\r
+       },\r
+\r
+       getWin : function() {\r
+               return this.contentWindow;\r
+       },\r
+\r
+       getContainerWin : function() {\r
+               return this.containerWindow ? this.containerWindow : window;\r
+       },\r
+\r
+       getViewPort : function() {\r
+               return tinyMCE.getViewPort(this.getWin());\r
+       },\r
+\r
+       getParentNode : function(n, f) {\r
+               return tinyMCE.getParentNode(n, f, this.getBody());\r
+       },\r
+\r
+       getParentElement : function(n, na, f) {\r
+               return tinyMCE.getParentElement(n, na, f, this.getBody());\r
+       },\r
+\r
+       getParentBlockElement : function(n) {\r
+               return tinyMCE.getParentBlockElement(n, this.getBody());\r
+       },\r
+\r
+       resizeToContent : function() {\r
+               var d = this.getDoc(), b = d.body, de = d.documentElement;\r
+\r
+               this.iframeElement.style.height = (tinyMCE.isRealIE) ? b.scrollHeight : de.offsetHeight + 'px';\r
+       },\r
+\r
+       addShortcut : function(m, k, d, cmd, ui, va) {\r
+               var n = typeof(k) == "number", ie = tinyMCE.isIE, c, sc, i, scl = this.shortcuts;\r
+\r
+               if (!tinyMCE.getParam('custom_shortcuts'))\r
+                       return false;\r
+\r
+               m = m.toLowerCase();\r
+               k = ie && !n ? k.toUpperCase() : k;\r
+               c = n ? null : k.charCodeAt(0);\r
+               d = d && d.indexOf('lang_') == 0 ? tinyMCE.getLang(d) : d;\r
+\r
+               sc = {\r
+                       alt : m.indexOf('alt') != -1,\r
+                       ctrl : m.indexOf('ctrl') != -1,\r
+                       shift : m.indexOf('shift') != -1,\r
+                       charCode : c,\r
+                       keyCode : n ? k : (ie ? c : null),\r
+                       desc : d,\r
+                       cmd : cmd,\r
+                       ui : ui,\r
+                       val : va\r
+               };\r
+\r
+               for (i=0; i<scl.length; i++) {\r
+                       if (sc.alt == scl[i].alt && sc.ctrl == scl[i].ctrl && sc.shift == scl[i].shift\r
+                               && sc.charCode == scl[i].charCode && sc.keyCode == scl[i].keyCode) {\r
+                               return false;\r
+                       }\r
+               }\r
+\r
+               scl[scl.length] = sc;\r
+\r
+               return true;\r
+       },\r
+\r
+       handleShortcut : function(e) {\r
+               var i, s, o;\r
+\r
+               // Normal key press, then ignore it\r
+               if (!e.altKey && !e.ctrlKey)\r
+                       return false;\r
+\r
+               s = this.shortcuts;\r
+\r
+               for (i=0; i<s.length; i++) {\r
+                       o = s[i];\r
+\r
+                       if (o.alt == e.altKey && o.ctrl == e.ctrlKey && (o.keyCode == e.keyCode || o.charCode == e.charCode)) {\r
+                               if (o.cmd && (e.type == "keydown" || (e.type == "keypress" && !tinyMCE.isOpera)))\r
+                                       tinyMCE.execCommand(o.cmd, o.ui, o.val);\r
+\r
+                               tinyMCE.cancelEvent(e);\r
+                               return true;\r
+                       }\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       autoResetDesignMode : function() {\r
+               // Add fix for tab/style.display none/block problems in Gecko\r
+               if (!tinyMCE.isIE && this.isHidden() && tinyMCE.getParam('auto_reset_designmode'))\r
+                       eval('try { this.getDoc().designMode = "On"; this.useCSS = false; } catch(e) {}');\r
+       },\r
+\r
+       isHidden : function() {\r
+               var s;\r
+\r
+               if (tinyMCE.isIE)\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
+       isDirty : function() {\r
+               // Is content modified and not in a submit procedure\r
+               return tinyMCE.trim(this.startContent) != tinyMCE.trim(this.getBody().innerHTML) && !this.isNotDirty;\r
+       },\r
+\r
+       _mergeElements : function(scmd, pa, ch, override) {\r
+               var st, stc, className, n;\r
+\r
+               if (scmd == "removeformat") {\r
+                       pa.className = "";\r
+                       pa.style.cssText = "";\r
+                       ch.className = "";\r
+                       ch.style.cssText = "";\r
+                       return;\r
+               }\r
+\r
+               st = tinyMCE.parseStyle(tinyMCE.getAttrib(pa, "style"));\r
+               stc = tinyMCE.parseStyle(tinyMCE.getAttrib(ch, "style"));\r
+               className = tinyMCE.getAttrib(pa, "class");\r
+\r
+               // Removed class adding due to bug #1478272\r
+               className = tinyMCE.getAttrib(ch, "class");\r
+\r
+               if (override) {\r
+                       for (n in st) {\r
+                               if (typeof(st[n]) == 'function')\r
+                                       continue;\r
+\r
+                               stc[n] = st[n];\r
+                       }\r
+               } else {\r
+                       for (n in stc) {\r
+                               if (typeof(stc[n]) == 'function')\r
+                                       continue;\r
+\r
+                               st[n] = stc[n];\r
+                       }\r
+               }\r
+\r
+               tinyMCE.setAttrib(pa, "style", tinyMCE.serializeStyle(st));\r
+               tinyMCE.setAttrib(pa, "class", tinyMCE.trim(className));\r
+               ch.className = "";\r
+               ch.style.cssText = "";\r
+               ch.removeAttribute("class");\r
+               ch.removeAttribute("style");\r
+       },\r
+\r
+       _fixRootBlocks : function() {\r
+               var rb, b, ne, be, nx, bm;\r
+\r
+               rb = tinyMCE.getParam('forced_root_block');\r
+               if (!rb)\r
+                       return;\r
+\r
+               b = this.getBody();\r
+               ne = b.firstChild;\r
+\r
+               while (ne) {\r
+                       nx = ne.nextSibling;\r
+\r
+                       // If text node or inline element wrap it in a block element\r
+                       if (ne.nodeType == 3 || !tinyMCE.blockRegExp.test(ne.nodeName)) {\r
+                               if (!bm)\r
+                                       bm = this.selection.getBookmark();\r
+\r
+                               if (!be) {\r
+                                       be = this.getDoc().createElement(rb);\r
+                                       be.appendChild(ne.cloneNode(true));\r
+                                       b.replaceChild(be, ne);\r
+                               } else {\r
+                                       be.appendChild(ne.cloneNode(true));\r
+                                       b.removeChild(ne);\r
+                               }\r
+                       } else\r
+                               be = null;\r
+\r
+                       ne = nx;\r
+               }\r
+\r
+               if (bm)\r
+                       this.selection.moveToBookmark(bm);\r
+       },\r
+\r
+       _fixTrailingNbsp : function() {\r
+               var s = this.selection, e = s.getFocusElement(), bm, v;\r
+\r
+               if (e && tinyMCE.blockRegExp.test(e.nodeName) && e.firstChild) {\r
+                       v = e.firstChild.nodeValue;\r
+\r
+                       if (v && v.length > 1 && /(^\u00a0|\u00a0$)/.test(v)) {\r
+                               e.firstChild.nodeValue = v.replace(/(^\u00a0|\u00a0$)/, '');\r
+                               s.selectNode(e.firstChild, true, false, false); // Select and collapse\r
+                       }\r
+               }\r
+       },\r
+\r
+       _setUseCSS : function(b) {\r
+               var d = this.getDoc();\r
+\r
+               try {d.execCommand("useCSS", false, !b);} catch (ex) {}\r
+               try {d.execCommand("styleWithCSS", false, b);} catch (ex) {}\r
+\r
+               if (!tinyMCE.getParam("table_inline_editing"))\r
+                       try {d.execCommand('enableInlineTableEditing', false, "false");} catch (ex) {}\r
+\r
+               if (!tinyMCE.getParam("object_resizing"))\r
+                       try {d.execCommand('enableObjectResizing', false, "false");} catch (ex) {}\r
+       },\r
+\r
+       execCommand : function(command, user_interface, value) {\r
+               var i, x, z, align, img, div, doc = this.getDoc(), win = this.getWin(), focusElm = this.getFocusElement();\r
+\r
+               // Is not a undo specific command\r
+               if (!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel', 'gi').test(command))\r
+                       this.undoBookmark = null;\r
+\r
+               // Mozilla issue\r
+               if (!tinyMCE.isIE && !this.useCSS) {\r
+                       this._setUseCSS(false);\r
+                       this.useCSS = true;\r
+               }\r
+\r
+               //debug("command: " + command + ", user_interface: " + user_interface + ", value: " + value);\r
+               this.contentDocument = doc; // <-- Strange, unless this is applied Mozilla 1.3 breaks\r
+\r
+               // Don't dispatch key commands\r
+               if (!/mceStartTyping|mceEndTyping/.test(command)) {\r
+                       if (tinyMCE.execCommandCallback(this, 'execcommand_callback', 'execCommand', this.editorId, this.getBody(), command, user_interface, value))\r
+                               return;\r
+               }\r
+\r
+               // Fix align on images\r
+               if (focusElm && focusElm.nodeName == "IMG") {\r
+                       align = focusElm.getAttribute('align');\r
+                       img = command == "JustifyCenter" ? focusElm.cloneNode(false) : focusElm;\r
+\r
+                       switch (command) {\r
+                               case "JustifyLeft":\r
+                                       if (align == 'left')\r
+                                               img.removeAttribute('align');\r
+                                       else\r
+                                               img.setAttribute('align', 'left');\r
+\r
+                                       // Remove the div\r
+                                       div = focusElm.parentNode;\r
+                                       if (div && div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)\r
+                                               div.parentNode.replaceChild(img, div);\r
+\r
+                                       this.selection.selectNode(img);\r
+                                       this.repaint();\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       return;\r
+\r
+                               case "JustifyCenter":\r
+                                       img.removeAttribute('align');\r
+\r
+                                       // Is centered\r
+                                       div = tinyMCE.getParentElement(focusElm, "div");\r
+                                       if (div && div.style.textAlign == "center") {\r
+                                               // Remove div\r
+                                               if (div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)\r
+                                                       div.parentNode.replaceChild(img, div);\r
+                                       } else {\r
+                                               // Add div\r
+                                               div = this.getDoc().createElement("div");\r
+                                               div.style.textAlign = 'center';\r
+                                               div.appendChild(img);\r
+                                               focusElm.parentNode.replaceChild(div, focusElm);\r
+                                       }\r
+\r
+                                       this.selection.selectNode(img);\r
+                                       this.repaint();\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       return;\r
+\r
+                               case "JustifyRight":\r
+                                       if (align == 'right')\r
+                                               img.removeAttribute('align');\r
+                                       else\r
+                                               img.setAttribute('align', 'right');\r
+\r
+                                       // Remove the div\r
+                                       div = focusElm.parentNode;\r
+                                       if (div && div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)\r
+                                               div.parentNode.replaceChild(img, div);\r
+\r
+                                       this.selection.selectNode(img);\r
+                                       this.repaint();\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       return;\r
+                       }\r
+               }\r
+\r
+               if (tinyMCE.settings.force_br_newlines) {\r
+                       var alignValue = "";\r
+\r
+                       if (doc.selection.type != "Control") {\r
+                               switch (command) {\r
+                                               case "JustifyLeft":\r
+                                                       alignValue = "left";\r
+                                                       break;\r
+\r
+                                               case "JustifyCenter":\r
+                                                       alignValue = "center";\r
+                                                       break;\r
+\r
+                                               case "JustifyFull":\r
+                                                       alignValue = "justify";\r
+                                                       break;\r
+\r
+                                               case "JustifyRight":\r
+                                                       alignValue = "right";\r
+                                                       break;\r
+                               }\r
+\r
+                               if (alignValue !== '') {\r
+                                       var rng = doc.selection.createRange();\r
+\r
+                                       if ((divElm = tinyMCE.getParentElement(rng.parentElement(), "div")) != null)\r
+                                               divElm.setAttribute("align", alignValue);\r
+                                       else if (rng.pasteHTML && rng.htmlText.length > 0)\r
+                                               rng.pasteHTML('<div align="' + alignValue + '">' + rng.htmlText + "</div>");\r
+\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       return;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               switch (command) {\r
+                       case "mceRepaint":\r
+                               this.repaint();\r
+                               return true;\r
+\r
+                       case "unlink":\r
+                               // Unlink if caret is inside link\r
+                               if (tinyMCE.isGecko && this.getSel().isCollapsed) {\r
+                                       focusElm = tinyMCE.getParentElement(focusElm, 'A');\r
+\r
+                                       if (focusElm)\r
+                                               this.selection.selectNode(focusElm, false);\r
+                               }\r
+\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+\r
+                               tinyMCE.isGecko && this.getSel().collapseToEnd();\r
+\r
+                               tinyMCE.triggerNodeChange();\r
+\r
+                               return true;\r
+\r
+                       case "InsertUnorderedList":\r
+                       case "InsertOrderedList":\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+                               tinyMCE.triggerNodeChange();\r
+                               break;\r
+\r
+                       case "Strikethrough":\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+                               tinyMCE.triggerNodeChange();\r
+                               break;\r
+\r
+                       case "mceSelectNode":\r
+                               this.selection.selectNode(value);\r
+                               tinyMCE.triggerNodeChange();\r
+                               tinyMCE.selectedNode = value;\r
+                               break;\r
+\r
+                       case "FormatBlock":\r
+                               if (value == null || value == '') {\r
+                                       var elm = tinyMCE.getParentElement(this.getFocusElement(), "p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp");\r
+\r
+                                       if (elm)\r
+                                               this.execCommand("mceRemoveNode", false, elm);\r
+                               } else {\r
+                                       if (!this.cleanup.isValid(value))\r
+                                               return true;\r
+\r
+                                       if (tinyMCE.isGecko && new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>', 'gi').test(value))\r
+                                               value = value.replace(/[^a-z]/gi, '');\r
+\r
+                                       if (tinyMCE.isIE && new RegExp('blockquote|code|samp', 'gi').test(value)) {\r
+                                               var b = this.selection.getBookmark();\r
+                                               this.getDoc().execCommand("FormatBlock", false, '<p>');\r
+                                               tinyMCE.renameElement(tinyMCE.getParentBlockElement(this.getFocusElement()), value);\r
+                                               this.selection.moveToBookmark(b);\r
+                                       } else\r
+                                               this.getDoc().execCommand("FormatBlock", false, value);\r
+                               }\r
+\r
+                               tinyMCE.triggerNodeChange();\r
+\r
+                               break;\r
+\r
+                       case "mceRemoveNode":\r
+                               if (!value)\r
+                                       value = tinyMCE.getParentElement(this.getFocusElement());\r
+\r
+                               if (tinyMCE.isIE) {\r
+                                       value.outerHTML = value.innerHTML;\r
+                               } else {\r
+                                       var rng = value.ownerDocument.createRange();\r
+                                       rng.setStartBefore(value);\r
+                                       rng.setEndAfter(value);\r
+                                       rng.deleteContents();\r
+                                       rng.insertNode(rng.createContextualFragment(value.innerHTML));\r
+                               }\r
+\r
+                               tinyMCE.triggerNodeChange();\r
+\r
+                               break;\r
+\r
+                       case "mceSelectNodeDepth":\r
+                               var parentNode = this.getFocusElement();\r
+                               for (i=0; parentNode; i++) {\r
+                                       if (parentNode.nodeName.toLowerCase() == "body")\r
+                                               break;\r
+\r
+                                       if (parentNode.nodeName.toLowerCase() == "#text") {\r
+                                               i--;\r
+                                               parentNode = parentNode.parentNode;\r
+                                               continue;\r
+                                       }\r
+\r
+                                       if (i == value) {\r
+                                               this.selection.selectNode(parentNode, false);\r
+                                               tinyMCE.triggerNodeChange();\r
+                                               tinyMCE.selectedNode = parentNode;\r
+                                               return;\r
+                                       }\r
+\r
+                                       parentNode = parentNode.parentNode;\r
+                               }\r
+\r
+                               break;\r
+\r
+                       case "mceSetStyleInfo":\r
+                       case "SetStyleInfo":\r
+                               var rng = this.getRng();\r
+                               var sel = this.getSel();\r
+                               var scmd = value.command;\r
+                               var sname = value.name;\r
+                               var svalue = value.value == null ? '' : value.value;\r
+                               //var svalue = value['value'] == null ? '' : value['value'];\r
+                               var wrapper = value.wrapper ? value.wrapper : "span";\r
+                               var parentElm = null;\r
+                               var invalidRe = new RegExp("^BODY|HTML$", "g");\r
+                               var invalidParentsRe = tinyMCE.settings.merge_styles_invalid_parents !== '' ? new RegExp(tinyMCE.settings.merge_styles_invalid_parents, "gi") : null;\r
+\r
+                               // Whole element selected check\r
+                               if (tinyMCE.isIE) {\r
+                                       // Control range\r
+                                       if (rng.item)\r
+                                               parentElm = rng.item(0);\r
+                                       else {\r
+                                               var pelm = rng.parentElement();\r
+                                               var prng = doc.selection.createRange();\r
+                                               prng.moveToElementText(pelm);\r
+\r
+                                               if (rng.htmlText == prng.htmlText || rng.boundingWidth == 0) {\r
+                                                       if (invalidParentsRe == null || !invalidParentsRe.test(pelm.nodeName))\r
+                                                               parentElm = pelm;\r
+                                               }\r
+                                       }\r
+                               } else {\r
+                                       var felm = this.getFocusElement();\r
+                                       if (sel.isCollapsed || (new RegExp('td|tr|tbody|table|img', 'gi').test(felm.nodeName) && sel.anchorNode == felm.parentNode))\r
+                                               parentElm = felm;\r
+                               }\r
+\r
+                               // Whole element selected\r
+                               if (parentElm && !invalidRe.test(parentElm.nodeName)) {\r
+                                       if (scmd == "setstyle")\r
+                                               tinyMCE.setStyleAttrib(parentElm, sname, svalue);\r
+\r
+                                       if (scmd == "setattrib")\r
+                                               tinyMCE.setAttrib(parentElm, sname, svalue);\r
+\r
+                                       if (scmd == "removeformat") {\r
+                                               parentElm.style.cssText = '';\r
+                                               tinyMCE.setAttrib(parentElm, 'class', '');\r
+                                       }\r
+\r
+                                       // Remove style/attribs from all children\r
+                                       var ch = tinyMCE.getNodeTree(parentElm, [], 1);\r
+                                       for (z=0; z<ch.length; z++) {\r
+                                               if (ch[z] == parentElm)\r
+                                                       continue;\r
+\r
+                                               if (scmd == "setstyle")\r
+                                                       tinyMCE.setStyleAttrib(ch[z], sname, '');\r
+\r
+                                               if (scmd == "setattrib")\r
+                                                       tinyMCE.setAttrib(ch[z], sname, '');\r
+\r
+                                               if (scmd == "removeformat") {\r
+                                                       ch[z].style.cssText = '';\r
+                                                       tinyMCE.setAttrib(ch[z], 'class', '');\r
+                                               }\r
+                                       }\r
+                               } else {\r
+                                       this._setUseCSS(false); // Bug in FF when running in fullscreen\r
+                                       doc.execCommand("FontName", false, "#mce_temp_font#");\r
+                                       var elementArray = tinyMCE.getElementsByAttributeValue(this.getBody(), "font", "face", "#mce_temp_font#");\r
+\r
+                                       // Change them all\r
+                                       for (x=0; x<elementArray.length; x++) {\r
+                                               elm = elementArray[x];\r
+                                               if (elm) {\r
+                                                       var spanElm = doc.createElement(wrapper);\r
+\r
+                                                       if (scmd == "setstyle")\r
+                                                               tinyMCE.setStyleAttrib(spanElm, sname, svalue);\r
+\r
+                                                       if (scmd == "setattrib")\r
+                                                               tinyMCE.setAttrib(spanElm, sname, svalue);\r
+\r
+                                                       if (scmd == "removeformat") {\r
+                                                               spanElm.style.cssText = '';\r
+                                                               tinyMCE.setAttrib(spanElm, 'class', '');\r
+                                                       }\r
+\r
+                                                       if (elm.hasChildNodes()) {\r
+                                                               for (i=0; i<elm.childNodes.length; i++)\r
+                                                                       spanElm.appendChild(elm.childNodes[i].cloneNode(true));\r
+                                                       }\r
+\r
+                                                       spanElm.setAttribute("mce_new", "true");\r
+                                                       elm.parentNode.replaceChild(spanElm, elm);\r
+\r
+                                                       // Remove style/attribs from all children\r
+                                                       var ch = tinyMCE.getNodeTree(spanElm, [], 1);\r
+                                                       for (z=0; z<ch.length; z++) {\r
+                                                               if (ch[z] == spanElm)\r
+                                                                       continue;\r
+\r
+                                                               if (scmd == "setstyle")\r
+                                                                       tinyMCE.setStyleAttrib(ch[z], sname, '');\r
+\r
+                                                               if (scmd == "setattrib")\r
+                                                                       tinyMCE.setAttrib(ch[z], sname, '');\r
+\r
+                                                               if (scmd == "removeformat") {\r
+                                                                       ch[z].style.cssText = '';\r
+                                                                       tinyMCE.setAttrib(ch[z], 'class', '');\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // Cleaup wrappers\r
+                               var nodes = doc.getElementsByTagName(wrapper);\r
+                               for (i=nodes.length-1; i>=0; i--) {\r
+                                       var elm = nodes[i];\r
+                                       var isNew = tinyMCE.getAttrib(elm, "mce_new") == "true";\r
+\r
+                                       elm.removeAttribute("mce_new");\r
+\r
+                                       // Is only child a element\r
+                                       if (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) {\r
+                                               //tinyMCE.debug("merge1" + isNew);\r
+                                               this._mergeElements(scmd, elm, elm.childNodes[0], isNew);\r
+                                               continue;\r
+                                       }\r
+\r
+                                       // Is I the only child\r
+                                       if (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) {\r
+                                               //tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName);\r
+                                               if (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName))\r
+                                                       this._mergeElements(scmd, elm.parentNode, elm, false);\r
+                                       }\r
+                               }\r
+\r
+                               // Remove empty wrappers\r
+                               var nodes = doc.getElementsByTagName(wrapper);\r
+                               for (i=nodes.length-1; i>=0; i--) {\r
+                                       var elm = nodes[i], isEmpty = true;\r
+\r
+                                       // Check if it has any attribs\r
+                                       var tmp = doc.createElement("body");\r
+                                       tmp.appendChild(elm.cloneNode(false));\r
+\r
+                                       // Is empty span, remove it\r
+                                       tmp.innerHTML = tmp.innerHTML.replace(new RegExp('style=""|class=""', 'gi'), '');\r
+                                       //tinyMCE.debug(tmp.innerHTML);\r
+                                       if (new RegExp('<span>', 'gi').test(tmp.innerHTML)) {\r
+                                               for (x=0; x<elm.childNodes.length; x++) {\r
+                                                       if (elm.parentNode != null)\r
+                                                               elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true), elm);\r
+                                               }\r
+\r
+                                               elm.parentNode.removeChild(elm);\r
+                                       }\r
+                               }\r
+\r
+                               // Re add the visual aids\r
+                               if (scmd == "removeformat")\r
+                                       tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
+\r
+                               tinyMCE.triggerNodeChange();\r
+\r
+                               break;\r
+\r
+                       case "FontName":\r
+                               if (value == null) {\r
+                                       var s = this.getSel();\r
+\r
+                                       // Find font and select it\r
+                                       if (tinyMCE.isGecko && s.isCollapsed) {\r
+                                               var f = tinyMCE.getParentElement(this.getFocusElement(), "font");\r
+\r
+                                               if (f != null)\r
+                                                       this.selection.selectNode(f, false);\r
+                                       }\r
+\r
+                                       // Remove format\r
+                                       this.getDoc().execCommand("RemoveFormat", false, null);\r
+\r
+                                       // Collapse range if font was found\r
+                                       if (f != null && tinyMCE.isGecko) {\r
+                                               var r = this.getRng().cloneRange();\r
+                                               r.collapse(true);\r
+                                               s.removeAllRanges();\r
+                                               s.addRange(r);\r
+                                       }\r
+                               } else\r
+                                       this.getDoc().execCommand('FontName', false, value);\r
+\r
+                               if (tinyMCE.isGecko)\r
+                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
+\r
+                               return;\r
+\r
+                       case "FontSize":\r
+                               this.getDoc().execCommand('FontSize', false, value);\r
+\r
+                               if (tinyMCE.isGecko)\r
+                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
+\r
+                               return;\r
+\r
+                       case "forecolor":\r
+                               value = value == null ? this.foreColor : value;\r
+                               value = tinyMCE.trim(value);\r
+                               value = value.charAt(0) != '#' ? (isNaN('0x' + value) ? value : '#' + value) : value;\r
+\r
+                               this.foreColor = value;\r
+                               this.getDoc().execCommand('forecolor', false, value);\r
+                               break;\r
+\r
+                       case "HiliteColor":\r
+                               value = value == null ? this.backColor : value;\r
+                               value = tinyMCE.trim(value);\r
+                               value = value.charAt(0) != '#' ? (isNaN('0x' + value) ? value : '#' + value) : value;\r
+                               this.backColor = value;\r
+\r
+                               if (tinyMCE.isGecko) {\r
+                                       this._setUseCSS(true);\r
+                                       this.getDoc().execCommand('hilitecolor', false, value);\r
+                                       this._setUseCSS(false);\r
+                               } else\r
+                                       this.getDoc().execCommand('BackColor', false, value);\r
+                               break;\r
+\r
+                       case "Cut":\r
+                       case "Copy":\r
+                       case "Paste":\r
+                               var cmdFailed = false;\r
+\r
+                               // Try executing command\r
+                               eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}');\r
+\r
+                               if (tinyMCE.isOpera && cmdFailed)\r
+                                       alert('Currently not supported by your browser, use keyboard shortcuts instead.');\r
+\r
+                               // Alert error in gecko if command failed\r
+                               if (tinyMCE.isGecko && cmdFailed) {\r
+                                       // Confirm more info\r
+                                       if (confirm(tinyMCE.entityDecode(tinyMCE.getLang('lang_clipboard_msg'))))\r
+                                               window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', 'mceExternal');\r
+\r
+                                       return;\r
+                               } else\r
+                                       tinyMCE.triggerNodeChange();\r
+                       break;\r
+\r
+                       case "mceSetContent":\r
+                               if (!value)\r
+                                       value = "";\r
+\r
+                               // Call custom cleanup code\r
+                               value = tinyMCE.storeAwayURLs(value);\r
+                               value = tinyMCE._customCleanup(this, "insert_to_editor", value);\r
+\r
+                               if (this.getBody().nodeName == 'BODY')\r
+                                       tinyMCE._setHTML(doc, value);\r
+                               else\r
+                                       this.getBody().innerHTML = value;\r
+\r
+                               tinyMCE.setInnerHTML(this.getBody(), tinyMCE._cleanupHTML(this, doc, this.settings, this.getBody(), false, false, false, true));\r
+                               tinyMCE.convertAllRelativeURLs(this.getBody());\r
+\r
+                               // Cleanup any mess left from storyAwayURLs\r
+                               tinyMCE._removeInternal(this.getBody());\r
+\r
+                               // When editing always use fonts internaly\r
+                               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                                       tinyMCE.convertSpansToFonts(doc);\r
+\r
+                               tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
+                               tinyMCE._setEventsEnabled(this.getBody(), false);\r
+                               this._addBogusBR();\r
+\r
+                               return true;\r
+\r
+                       case "mceCleanup":\r
+                               var b = this.selection.getBookmark();\r
+                               tinyMCE._setHTML(this.contentDocument, this.getBody().innerHTML);\r
+                               tinyMCE.setInnerHTML(this.getBody(), tinyMCE._cleanupHTML(this, this.contentDocument, this.settings, this.getBody(), this.visualAid));\r
+                               tinyMCE.convertAllRelativeURLs(doc.body);\r
+\r
+                               // When editing always use fonts internaly\r
+                               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                                       tinyMCE.convertSpansToFonts(doc);\r
+\r
+                               tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
+                               tinyMCE._setEventsEnabled(this.getBody(), false);\r
+                               this._addBogusBR();\r
+                               this.repaint();\r
+                               this.selection.moveToBookmark(b);\r
+                               tinyMCE.triggerNodeChange();\r
+                       break;\r
+\r
+                       case "mceReplaceContent":\r
+                               // Force empty string\r
+                               if (!value)\r
+                                       value = '';\r
+\r
+                               this.getWin().focus();\r
+\r
+                               var selectedText = "";\r
+\r
+                               if (tinyMCE.isIE) {\r
+                                       var rng = doc.selection.createRange();\r
+                                       selectedText = rng.text;\r
+                               } else\r
+                                       selectedText = this.getSel().toString();\r
+\r
+                               if (selectedText.length > 0) {\r
+                                       value = tinyMCE.replaceVar(value, "selection", selectedText);\r
+                                       tinyMCE.execCommand('mceInsertContent', false, value);\r
+                               }\r
+\r
+                               this._addBogusBR();\r
+                               tinyMCE.triggerNodeChange();\r
+                       break;\r
+\r
+                       case "mceSetAttribute":\r
+                               if (typeof(value) == 'object') {\r
+                                       var targetElms = (typeof(value.targets) == "undefined") ? "p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address" : value.targets;\r
+                                       var targetNode = tinyMCE.getParentElement(this.getFocusElement(), targetElms);\r
+\r
+                                       if (targetNode) {\r
+                                               targetNode.setAttribute(value.name, value.value);\r
+                                               tinyMCE.triggerNodeChange();\r
+                                       }\r
+                               }\r
+                       break;\r
+\r
+                       case "mceSetCSSClass":\r
+                               this.execCommand("mceSetStyleInfo", false, {command : "setattrib", name : "class", value : value});\r
+                       break;\r
+\r
+                       case "mceInsertRawHTML":\r
+                               var key = 'tiny_mce_marker';\r
+\r
+                               this.execCommand('mceBeginUndoLevel');\r
+\r
+                               // Insert marker key\r
+                               this.execCommand('mceInsertContent', false, key);\r
+\r
+                               // Store away scroll pos\r
+                               var scrollX = this.getBody().scrollLeft + this.getDoc().documentElement.scrollLeft;\r
+                               var scrollY = this.getBody().scrollTop + this.getDoc().documentElement.scrollTop;\r
+\r
+                               // Find marker and replace with RAW HTML\r
+                               var html = this.getBody().innerHTML;\r
+                               if ((pos = html.indexOf(key)) != -1)\r
+                                       tinyMCE.setInnerHTML(this.getBody(), html.substring(0, pos) + value + html.substring(pos + key.length));\r
+\r
+                               // Restore scoll pos\r
+                               this.contentWindow.scrollTo(scrollX, scrollY);\r
+\r
+                               this.execCommand('mceEndUndoLevel');\r
+\r
+                               break;\r
+\r
+                       case "mceInsertContent":\r
+                               // Force empty string\r
+                               if (!value)\r
+                                       value = '';\r
+\r
+                               var insertHTMLFailed = false;\r
+\r
+                               // Removed since it produced problems in IE\r
+                               // this.getWin().focus();\r
+\r
+                               if (tinyMCE.isGecko || tinyMCE.isOpera) {\r
+                                       try {\r
+                                               // Is plain text or HTML, &amp;, &nbsp; etc will be encoded wrong in FF\r
+                                               if (value.indexOf('<') == -1 && !value.match(/(&#38;|&#160;|&#60;|&#62;)/g)) {\r
+                                                       var r = this.getRng();\r
+                                                       var n = this.getDoc().createTextNode(tinyMCE.entityDecode(value));\r
+                                                       var s = this.getSel();\r
+                                                       var r2 = r.cloneRange();\r
+\r
+                                                       // Insert text at cursor position\r
+                                                       s.removeAllRanges();\r
+                                                       r.deleteContents();\r
+                                                       r.insertNode(n);\r
+\r
+                                                       // Move the cursor to the end of text\r
+                                                       r2.selectNode(n);\r
+                                                       r2.collapse(false);\r
+                                                       s.removeAllRanges();\r
+                                                       s.addRange(r2);\r
+                                               } else {\r
+                                                       value = tinyMCE.fixGeckoBaseHREFBug(1, this.getDoc(), value);\r
+                                                       this.getDoc().execCommand('inserthtml', false, value);\r
+                                                       tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);\r
+                                               }\r
+                                       } catch (ex) {\r
+                                               insertHTMLFailed = true;\r
+                                       }\r
+\r
+                                       if (!insertHTMLFailed) {\r
+                                               tinyMCE.triggerNodeChange();\r
+                                               return;\r
+                                       }\r
+                               }\r
+\r
+                               if (!tinyMCE.isIE) {\r
+                                       var isHTML = value.indexOf('<') != -1;\r
+                                       var sel = this.getSel();\r
+                                       var rng = this.getRng();\r
+\r
+                                       if (isHTML) {\r
+                                               if (tinyMCE.isSafari) {\r
+                                                       var tmpRng = this.getDoc().createRange();\r
+\r
+                                                       tmpRng.setStart(this.getBody(), 0);\r
+                                                       tmpRng.setEnd(this.getBody(), 0);\r
+\r
+                                                       value = tmpRng.createContextualFragment(value);\r
+                                               } else\r
+                                                       value = rng.createContextualFragment(value);\r
+                                       } else {\r
+                                               // Setup text node\r
+                                               value = doc.createTextNode(tinyMCE.entityDecode(value));\r
+                                       }\r
+\r
+                                       // Insert plain text in Safari\r
+                                       if (tinyMCE.isSafari && !isHTML) {\r
+                                               this.execCommand('InsertText', false, value.nodeValue);\r
+                                               tinyMCE.triggerNodeChange();\r
+                                               return true;\r
+                                       } else if (tinyMCE.isSafari && isHTML) {\r
+                                               rng.deleteContents();\r
+                                               rng.insertNode(value);\r
+                                               tinyMCE.triggerNodeChange();\r
+                                               return true;\r
+                                       }\r
+\r
+                                       rng.deleteContents();\r
+\r
+                                       // If target node is text do special treatment, (Mozilla 1.3 fix)\r
+                                       if (rng.startContainer.nodeType == 3) {\r
+                                               var node = rng.startContainer.splitText(rng.startOffset);\r
+                                               node.parentNode.insertBefore(value, node); \r
+                                       } else\r
+                                               rng.insertNode(value);\r
+\r
+                                       if (!isHTML) {\r
+                                               // Removes weird selection trails\r
+                                               sel.selectAllChildren(doc.body);\r
+                                               sel.removeAllRanges();\r
+\r
+                                               // Move cursor to end of content\r
+                                               var rng = doc.createRange();\r
+\r
+                                               rng.selectNode(value);\r
+                                               rng.collapse(false);\r
+\r
+                                               sel.addRange(rng);\r
+                                       } else\r
+                                               rng.collapse(false);\r
+\r
+                                       tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);\r
+                               } else {\r
+                                       var rng = doc.selection.createRange(), tmpRng = null;\r
+                                       var c = value.indexOf('<!--') != -1;\r
+\r
+                                       // Fix comment bug, add tag before comments\r
+                                       if (c)\r
+                                               value = tinyMCE.uniqueTag + value;\r
+\r
+                                       //      tmpRng = rng.duplicate(); // Store away range (Fixes Undo bookmark bug in IE)\r
+\r
+                                       if (rng.item)\r
+                                               rng.item(0).outerHTML = value;\r
+                                       else\r
+                                               rng.pasteHTML(value);\r
+\r
+                                       //if (tmpRng)\r
+                                       //      tmpRng.select(); // Restore range  (Fixes Undo bookmark bug in IE)\r
+\r
+                                       // Remove unique tag\r
+                                       if (c) {\r
+                                               var e = this.getDoc().getElementById('mceTMPElement');\r
+                                               e.parentNode.removeChild(e);\r
+                                       }\r
+                               }\r
+\r
+                               tinyMCE.execCommand("mceAddUndoLevel");\r
+                               tinyMCE.triggerNodeChange();\r
+                       break;\r
+\r
+                       case "mceStartTyping":\r
+                               if (tinyMCE.settings.custom_undo_redo && this.undoRedo.typingUndoIndex == -1) {\r
+                                       this.undoRedo.typingUndoIndex = this.undoRedo.undoIndex;\r
+                                       tinyMCE.typingUndoIndex = tinyMCE.undoIndex;\r
+                                       this.execCommand('mceAddUndoLevel');\r
+                               }\r
+                               break;\r
+\r
+                       case "mceEndTyping":\r
+                               if (tinyMCE.settings.custom_undo_redo && this.undoRedo.typingUndoIndex != -1) {\r
+                                       this.execCommand('mceAddUndoLevel');\r
+                                       this.undoRedo.typingUndoIndex = -1;\r
+                               }\r
+\r
+                               tinyMCE.typingUndoIndex = -1;\r
+                               break;\r
+\r
+                       case "mceBeginUndoLevel":\r
+                               this.undoRedoLevel = false;\r
+                               break;\r
+\r
+                       case "mceEndUndoLevel":\r
+                               this.undoRedoLevel = true;\r
+                               this.execCommand('mceAddUndoLevel');\r
+                               break;\r
+\r
+                       case "mceAddUndoLevel":\r
+                               if (tinyMCE.settings.custom_undo_redo && this.undoRedoLevel) {\r
+                                       if (this.undoRedo.add())\r
+                                               tinyMCE.triggerNodeChange(false);\r
+                               }\r
+                               break;\r
+\r
+                       case "Undo":\r
+                               if (tinyMCE.settings.custom_undo_redo) {\r
+                                       tinyMCE.execCommand("mceEndTyping");\r
+                                       this.undoRedo.undo();\r
+                                       tinyMCE.triggerNodeChange();\r
+                               } else\r
+                                       this.getDoc().execCommand(command, user_interface, value);\r
+                               break;\r
+\r
+                       case "Redo":\r
+                               if (tinyMCE.settings.custom_undo_redo) {\r
+                                       tinyMCE.execCommand("mceEndTyping");\r
+                                       this.undoRedo.redo();\r
+                                       tinyMCE.triggerNodeChange();\r
+                               } else\r
+                                       this.getDoc().execCommand(command, user_interface, value);\r
+                               break;\r
+\r
+                       case "mceToggleVisualAid":\r
+                               this.visualAid = !this.visualAid;\r
+                               tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
+                               tinyMCE.triggerNodeChange();\r
+                               break;\r
+\r
+                       case "Indent":\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+                               tinyMCE.triggerNodeChange();\r
+\r
+                               if (tinyMCE.isIE) {\r
+                                       var n = tinyMCE.getParentElement(this.getFocusElement(), "blockquote");\r
+                                       do {\r
+                                               if (n && n.nodeName == "BLOCKQUOTE") {\r
+                                                       n.removeAttribute("dir");\r
+                                                       n.removeAttribute("style");\r
+                                               }\r
+                                       } while (n != null && (n = n.parentNode) != null);\r
+                               }\r
+                               break;\r
+\r
+                       case "RemoveFormat":\r
+                       case "removeformat":\r
+                               var text = this.selection.getSelectedText();\r
+\r
+                               if (tinyMCE.isOpera) {\r
+                                       this.getDoc().execCommand("RemoveFormat", false, null);\r
+                                       return;\r
+                               }\r
+\r
+                               if (tinyMCE.isIE) {\r
+                                       try {\r
+                                               var rng = doc.selection.createRange();\r
+                                               rng.execCommand("RemoveFormat", false, null);\r
+                                       } catch (e) {\r
+                                               // Do nothing\r
+                                       }\r
+\r
+                                       this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});\r
+                               } else {\r
+                                       this.getDoc().execCommand(command, user_interface, value);\r
+\r
+                                       this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});\r
+                               }\r
+\r
+                               // Remove class\r
+                               if (text.length == 0)\r
+                                       this.execCommand("mceSetCSSClass", false, "");\r
+\r
+                               tinyMCE.triggerNodeChange();\r
+                               break;\r
+\r
+                       default:\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+\r
+                               if (tinyMCE.isGecko)\r
+                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
+                               else\r
+                                       tinyMCE.triggerNodeChange();\r
+               }\r
+\r
+               // Add undo level after modification\r
+               if (command != "mceAddUndoLevel" && command != "Undo" && command != "Redo" && command != "mceStartTyping" && command != "mceEndTyping")\r
+                       tinyMCE.execCommand("mceAddUndoLevel");\r
+       },\r
+\r
+       queryCommandValue : function(c) {\r
+               try {\r
+                       return this.getDoc().queryCommandValue(c);\r
+               } catch (e) {\r
+                       return null;\r
+               }\r
+       },\r
+\r
+       queryCommandState : function(c) {\r
+               return this.getDoc().queryCommandState(c);\r
+       },\r
+\r
+       _addBogusBR : function() {\r
+               var b = this.getBody();\r
+\r
+               if (tinyMCE.isGecko && !b.hasChildNodes())\r
+                       b.innerHTML = '<br _moz_editor_bogus_node="TRUE" />';\r
+       },\r
+\r
+       _onAdd : function(replace_element, form_element_name, target_document) {\r
+               var hc, th, tos, editorTemplate, targetDoc, deltaWidth, deltaHeight, html, rng, fragment;\r
+               var dynamicIFrame, tElm, doc, parentElm;\r
+\r
+               th = this.settings.theme;\r
+               tos = tinyMCE.themes[th];\r
+\r
+               targetDoc = target_document ? target_document : document;\r
+\r
+               this.targetDoc = targetDoc;\r
+\r
+               tinyMCE.themeURL = tinyMCE.baseURL + "/themes/" + this.settings.theme;\r
+               this.settings.themeurl = tinyMCE.themeURL;\r
+\r
+               if (!replace_element) {\r
+                       alert("Error: Could not find the target element.");\r
+                       return false;\r
+               }\r
+\r
+               if (tos.getEditorTemplate)\r
+                       editorTemplate = tos.getEditorTemplate(this.settings, this.editorId);\r
+\r
+               deltaWidth = editorTemplate.delta_width ? editorTemplate.delta_width : 0;\r
+               deltaHeight = editorTemplate.delta_height ? editorTemplate.delta_height : 0;\r
+               html = '<span id="' + this.editorId + '_parent" class="mceEditorContainer">' + editorTemplate.html;\r
+\r
+               html = tinyMCE.replaceVar(html, "editor_id", this.editorId);\r
+\r
+               if (!this.settings.default_document)\r
+                       this.settings.default_document = tinyMCE.baseURL + "/blank.htm";\r
+\r
+               this.settings.old_width = this.settings.width;\r
+               this.settings.old_height = this.settings.height;\r
+\r
+               // Set default width, height\r
+               if (this.settings.width == -1)\r
+                       this.settings.width = replace_element.offsetWidth;\r
+\r
+               if (this.settings.height == -1)\r
+                       this.settings.height = replace_element.offsetHeight;\r
+\r
+               // Try the style width\r
+               if (this.settings.width == 0)\r
+                       this.settings.width = replace_element.style.width;\r
+\r
+               // Try the style height\r
+               if (this.settings.height == 0)\r
+                       this.settings.height = replace_element.style.height; \r
+\r
+               // If no width/height then default to 320x240, better than nothing\r
+               if (this.settings.width == 0)\r
+                       this.settings.width = 320;\r
+\r
+               if (this.settings.height == 0)\r
+                       this.settings.height = 240;\r
+\r
+               this.settings.area_width = parseInt(this.settings.width);\r
+               this.settings.area_height = parseInt(this.settings.height);\r
+               this.settings.area_width += deltaWidth;\r
+               this.settings.area_height += deltaHeight;\r
+               this.settings.width_style = "" + this.settings.width;\r
+               this.settings.height_style = "" + this.settings.height;\r
+\r
+               // Special % handling\r
+               if (("" + this.settings.width).indexOf('%') != -1)\r
+                       this.settings.area_width = "100%";\r
+               else\r
+                       this.settings.width_style += 'px';\r
+\r
+               if (("" + this.settings.height).indexOf('%') != -1)\r
+                       this.settings.area_height = "100%";\r
+               else\r
+                       this.settings.height_style += 'px';\r
+\r
+               if (("" + replace_element.style.width).indexOf('%') != -1) {\r
+                       this.settings.width = replace_element.style.width;\r
+                       this.settings.area_width = "100%";\r
+                       this.settings.width_style = "100%";\r
+               }\r
+\r
+               if (("" + replace_element.style.height).indexOf('%') != -1) {\r
+                       this.settings.height = replace_element.style.height;\r
+                       this.settings.area_height = "100%";\r
+                       this.settings.height_style = "100%";\r
+               }\r
+\r
+               html = tinyMCE.applyTemplate(html);\r
+\r
+               this.settings.width = this.settings.old_width;\r
+               this.settings.height = this.settings.old_height;\r
+\r
+               this.visualAid = this.settings.visual;\r
+               this.formTargetElementId = form_element_name;\r
+\r
+               // Get replace_element contents\r
+               if (replace_element.nodeName == "TEXTAREA" || replace_element.nodeName == "INPUT")\r
+                       this.startContent = replace_element.value;\r
+               else\r
+                       this.startContent = replace_element.innerHTML;\r
+\r
+               // If not text area or input\r
+               if (replace_element.nodeName != "TEXTAREA" && replace_element.nodeName != "INPUT") {\r
+                       this.oldTargetElement = replace_element;\r
+\r
+                       // Debug mode\r
+                       hc = '<input type="hidden" id="' + form_element_name + '" name="' + form_element_name + '" />';\r
+                       this.oldTargetDisplay = tinyMCE.getStyle(this.oldTargetElement, 'display', 'inline');\r
+                       this.oldTargetElement.style.display = "none";\r
+\r
+                       html += '</span>';\r
+\r
+                       if (tinyMCE.isGecko)\r
+                               html = hc + html;\r
+                       else\r
+                               html += hc;\r
+\r
+                       // Output HTML and set editable\r
+                       if (tinyMCE.isGecko) {\r
+                               rng = replace_element.ownerDocument.createRange();\r
+                               rng.setStartBefore(replace_element);\r
+\r
+                               fragment = rng.createContextualFragment(html);\r
+                               tinyMCE.insertAfter(fragment, replace_element);\r
+                       } else\r
+                               replace_element.insertAdjacentHTML("beforeBegin", html);\r
+               } else {\r
+                       html += '</span>';\r
+\r
+                       // Just hide the textarea element\r
+                       this.oldTargetElement = replace_element;\r
+\r
+                       this.oldTargetDisplay = tinyMCE.getStyle(this.oldTargetElement, 'display', 'inline');\r
+                       this.oldTargetElement.style.display = "none";\r
+\r
+                       // Output HTML and set editable\r
+                       if (tinyMCE.isGecko) {\r
+                               rng = replace_element.ownerDocument.createRange();\r
+                               rng.setStartBefore(replace_element);\r
+\r
+                               fragment = rng.createContextualFragment(html);\r
+                               tinyMCE.insertAfter(fragment, replace_element);\r
+                       } else\r
+                               replace_element.insertAdjacentHTML("beforeBegin", html);\r
+               }\r
+\r
+               // Setup iframe\r
+               dynamicIFrame = false;\r
+               tElm = targetDoc.getElementById(this.editorId);\r
+\r
+               if (!tinyMCE.isIE) {\r
+                       // Node case is preserved in XML strict mode\r
+                       if (tElm && (tElm.nodeName == "SPAN" || tElm.nodeName == "span")) {\r
+                               tElm = tinyMCE._createIFrame(tElm, targetDoc);\r
+                               dynamicIFrame = true;\r
+                       }\r
+\r
+                       this.targetElement = tElm;\r
+                       this.iframeElement = tElm;\r
+                       this.contentDocument = tElm.contentDocument;\r
+                       this.contentWindow = tElm.contentWindow;\r
+\r
+                       //this.getDoc().designMode = "on";\r
+               } else {\r
+                       if (tElm && tElm.nodeName == "SPAN")\r
+                               tElm = tinyMCE._createIFrame(tElm, targetDoc, targetDoc.parentWindow);\r
+                       else\r
+                               tElm = targetDoc.frames[this.editorId];\r
+\r
+                       this.targetElement = tElm;\r
+                       this.iframeElement = targetDoc.getElementById(this.editorId);\r
+\r
+                       if (tinyMCE.isOpera) {\r
+                               this.contentDocument = this.iframeElement.contentDocument;\r
+                               this.contentWindow = this.iframeElement.contentWindow;\r
+                               dynamicIFrame = true;\r
+                       } else {\r
+                               this.contentDocument = tElm.window.document;\r
+                               this.contentWindow = tElm.window;\r
+                       }\r
+\r
+                       this.getDoc().designMode = "on";\r
+               }\r
+\r
+               // Setup base HTML\r
+               doc = this.contentDocument;\r
+               if (dynamicIFrame) {\r
+                       html = tinyMCE.getParam('doctype') + '<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="' + tinyMCE.settings.base_href + '" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>';\r
+\r
+                       try {\r
+                               if (!this.isHidden())\r
+                                       this.getDoc().designMode = "on";\r
+\r
+                               doc.open();\r
+                               doc.write(html);\r
+                               doc.close();\r
+                       } catch (e) {\r
+                               // Failed Mozilla 1.3\r
+                               this.getDoc().location.href = tinyMCE.baseURL + "/blank.htm";\r
+                       }\r
+               }\r
+\r
+               // This timeout is needed in MSIE 5.5 for some odd reason\r
+               // it seems that the document.frames isn't initialized yet?\r
+               if (tinyMCE.isIE)\r
+                       window.setTimeout("tinyMCE.addEventHandlers(tinyMCE.instances[\"" + this.editorId + "\"]);", 1);\r
+\r
+               // Setup element references\r
+               parentElm = this.targetDoc.getElementById(this.editorId + '_parent');\r
+               this.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling;\r
+\r
+               tinyMCE.setupContent(this.editorId, true);\r
+\r
+               return true;\r
+       },\r
+\r
+       setBaseHREF : function(u) {\r
+               var h, b, d, nl;\r
+\r
+               d = this.getDoc();\r
+               nl = d.getElementsByTagName("base");\r
+               b = nl.length > 0 ? nl[0] : null;\r
+\r
+               if (!b) {\r
+                       nl = d.getElementsByTagName("head");\r
+                       h = nl.length > 0 ? nl[0] : null;\r
+\r
+                       b = d.createElement("base");\r
+                       b.setAttribute('href', u);\r
+                       h.appendChild(b);\r
+               } else {\r
+                       if (u == '' || u == null)\r
+                               b.parentNode.removeChild(b);\r
+                       else\r
+                               b.setAttribute('href', u);\r
+               }\r
+       },\r
+\r
+       getHTML : function(r) {\r
+               var h, d = this.getDoc(), b = this.getBody();\r
+\r
+               if (r)\r
+                       return b.innerHTML;\r
+\r
+               h = tinyMCE._cleanupHTML(this, d, this.settings, b, false, true, false, true);\r
+\r
+               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                       tinyMCE.convertSpansToFonts(d);\r
+\r
+               return h;\r
+       },\r
+\r
+       setHTML : function(h) {\r
+               this.execCommand('mceSetContent', false, h);\r
+               this.repaint();\r
+       },\r
+\r
+       getFocusElement : function() {\r
+               return this.selection.getFocusElement();\r
+       },\r
+\r
+       getSel : function() {\r
+               return this.selection.getSel();\r
+       },\r
+\r
+       getRng : function() {\r
+               return this.selection.getRng();\r
+       },\r
+\r
+       triggerSave : function(skip_cleanup, skip_callback) {\r
+               var e, nl = [], i, s, content, htm;\r
+\r
+               if (!this.enabled)\r
+                       return;\r
+\r
+               this.switchSettings();\r
+               s = tinyMCE.settings;\r
+\r
+               // Force hidden tabs visible while serializing\r
+               if (tinyMCE.isRealIE) {\r
+                       e = this.iframeElement;\r
+\r
+                       do {\r
+                               if (e.style && e.style.display == 'none') {\r
+                                       e.style.display = 'block';\r
+                                       nl[nl.length] = {elm : e, type : 'style'};\r
+                               }\r
+\r
+                               if (e.style && s.hidden_tab_class.length > 0 && e.className.indexOf(s.hidden_tab_class) != -1) {\r
+                                       e.className = s.display_tab_class;\r
+                                       nl[nl.length] = {elm : e, type : 'class'};\r
+                               }\r
+                       } while ((e = e.parentNode) != null)\r
+               }\r
+\r
+               tinyMCE.settings.preformatted = false;\r
+\r
+               // Default to false\r
+               if (typeof(skip_cleanup) == "undefined")\r
+                       skip_cleanup = false;\r
+\r
+               // Default to false\r
+               if (typeof(skip_callback) == "undefined")\r
+                       skip_callback = false;\r
+\r
+               tinyMCE._setHTML(this.getDoc(), this.getBody().innerHTML);\r
+\r
+               // Remove visual aids when cleanup is disabled\r
+               if (this.settings.cleanup == false) {\r
+                       tinyMCE.handleVisualAid(this.getBody(), true, false, this);\r
+                       tinyMCE._setEventsEnabled(this.getBody(), true);\r
+               }\r
+\r
+               tinyMCE._customCleanup(this, "submit_content_dom", this.contentWindow.document.body);\r
+               htm = skip_cleanup ? this.getBody().innerHTML : tinyMCE._cleanupHTML(this, this.getDoc(), this.settings, this.getBody(), tinyMCE.visualAid, true, true);\r
+               htm = tinyMCE._customCleanup(this, "submit_content", htm);\r
+\r
+               if (!skip_callback && tinyMCE.settings.save_callback !== '')\r
+                       content = tinyMCE.resolveDots(tinyMCE.settings.save_callback, window)(this.formTargetElementId,htm,this.getBody());\r
+\r
+               // Use callback content if available\r
+               if ((typeof(content) != "undefined") && content != null)\r
+                       htm = content;\r
+\r
+               // Replace some weird entities (Bug: #1056343)\r
+               htm = tinyMCE.regexpReplace(htm, "&#40;", "(", "gi");\r
+               htm = tinyMCE.regexpReplace(htm, "&#41;", ")", "gi");\r
+               htm = tinyMCE.regexpReplace(htm, "&#59;", ";", "gi");\r
+               htm = tinyMCE.regexpReplace(htm, "&#34;", "&quot;", "gi");\r
+               htm = tinyMCE.regexpReplace(htm, "&#94;", "^", "gi");\r
+\r
+               if (this.formElement)\r
+                       this.formElement.value = htm;\r
+\r
+               if (tinyMCE.isSafari && this.formElement)\r
+                       this.formElement.innerText = htm;\r
+\r
+               // Hide them again (tabs in MSIE)\r
+               for (i=0; i<nl.length; i++) {\r
+                       if (nl[i].type == 'style')\r
+                               nl[i].elm.style.display = 'none';\r
+                       else\r
+                               nl[i].elm.className = s.hidden_tab_class;\r
+               }\r
+       }\r
+\r
+       };\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Cleanup.class.js */\r
+\r
+tinyMCE.add(TinyMCE_Engine, {\r
+       cleanupHTMLCode : function(s) {\r
+               s = s.replace(new RegExp('<p \\/>', 'gi'), '<p>&nbsp;</p>');\r
+               s = s.replace(new RegExp('<p>\\s*<\\/p>', 'gi'), '<p>&nbsp;</p>');\r
+\r
+               // Fix close BR elements\r
+               s = s.replace(new RegExp('<br>\\s*<\\/br>', 'gi'), '<br />');\r
+\r
+               // Open closed tags like <b/> to <b></b>\r
+               s = s.replace(new RegExp('<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|font|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\\\|>]*)\\/>', 'gi'), '<$1$2$3></$1$2>');\r
+\r
+               // Remove trailing space <b > to <b>\r
+               s = s.replace(new RegExp('\\s+></', 'gi'), '></');\r
+\r
+               // Close tags <img></img> to <img/>\r
+               s = s.replace(new RegExp('<(img|br|hr)([^>]*)><\\/(img|br|hr)>', 'gi'), '<$1$2 />');\r
+\r
+               // Weird MSIE bug, <p><hr /></p> breaks runtime?\r
+               if (tinyMCE.isIE)\r
+                       s = s.replace(new RegExp('<p><hr \\/><\\/p>', 'gi'), "<hr>");\r
+\r
+               // Weird tags will make IE error #bug: 1538495\r
+               if (tinyMCE.isIE)\r
+                       s = s.replace(/<!(\s*)\/>/g, '');\r
+\r
+               // Convert relative anchors to absolute URLs ex: #something to file.htm#something\r
+               // Removed: Since local document anchors should never be forced absolute example edit.php?id=something\r
+               //if (tinyMCE.getParam('convert_urls'))\r
+               //      s = s.replace(new RegExp('(href=\"{0,1})(\\s*#)', 'gi'), '$1' + tinyMCE.settings.document_base_url + "#");\r
+\r
+               return s;\r
+       },\r
+\r
+       parseStyle : function(str) {\r
+               var ar = [], st, i, re, pa;\r
+\r
+               if (str == null)\r
+                       return ar;\r
+\r
+               st = str.split(';');\r
+\r
+               tinyMCE.clearArray(ar);\r
+\r
+               for (i=0; i<st.length; i++) {\r
+                       if (st[i] == '')\r
+                               continue;\r
+\r
+                       re = new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');\r
+                       pa = st[i].replace(re, '$1||$2').split('||');\r
+       //tinyMCE.debug(str, pa[0] + "=" + pa[1], st[i].replace(re, '$1||$2'));\r
+                       if (pa.length == 2)\r
+                               ar[pa[0].toLowerCase()] = pa[1];\r
+               }\r
+\r
+               return ar;\r
+       },\r
+\r
+       compressStyle : function(ar, pr, sf, res) {\r
+               var box = [], i, a;\r
+\r
+               box[0] = ar[pr + '-top' + sf];\r
+               box[1] = ar[pr + '-left' + sf];\r
+               box[2] = ar[pr + '-right' + sf];\r
+               box[3] = ar[pr + '-bottom' + sf];\r
+\r
+               for (i=0; i<box.length; i++) {\r
+                       if (box[i] == null)\r
+                               return;\r
+\r
+                       for (a=0; a<box.length; a++) {\r
+                               if (box[a] != box[i])\r
+                                       return;\r
+                       }\r
+               }\r
+\r
+               // They are all the same\r
+               ar[res] = box[0];\r
+               ar[pr + '-top' + sf] = null;\r
+               ar[pr + '-left' + sf] = null;\r
+               ar[pr + '-right' + sf] = null;\r
+               ar[pr + '-bottom' + sf] = null;\r
+       },\r
+\r
+       serializeStyle : function(ar) {\r
+               var str = "", key, val, m;\r
+\r
+               // Compress box\r
+               tinyMCE.compressStyle(ar, "border", "", "border");\r
+               tinyMCE.compressStyle(ar, "border", "-width", "border-width");\r
+               tinyMCE.compressStyle(ar, "border", "-color", "border-color");\r
+               tinyMCE.compressStyle(ar, "border", "-style", "border-style");\r
+               tinyMCE.compressStyle(ar, "padding", "", "padding");\r
+               tinyMCE.compressStyle(ar, "margin", "", "margin");\r
+\r
+               for (key in ar) {\r
+                       val = ar[key];\r
+\r
+                       if (typeof(val) == 'function')\r
+                               continue;\r
+\r
+                       if (key.indexOf('mso-') == 0)\r
+                               continue;\r
+\r
+                       if (val != null && val !== '') {\r
+                               val = '' + val; // Force string\r
+\r
+                               // Fix style URL\r
+                               val = val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)", 'gi'), "url('$1')");\r
+\r
+                               // Convert URL\r
+                               if (val.indexOf('url(') != -1 && tinyMCE.getParam('convert_urls')) {\r
+                                       m = new RegExp("url\\('(.*?)'\\)").exec(val);\r
+\r
+                                       if (m.length > 1)\r
+                                               val = "url('" + eval(tinyMCE.getParam('urlconverter_callback') + "(m[1], null, true);") + "')";\r
+                               }\r
+\r
+                               // Force HEX colors\r
+                               if (tinyMCE.getParam("force_hex_style_colors"))\r
+                                       val = tinyMCE.convertRGBToHex(val, true);\r
+\r
+                               val = val.replace(/\"/g, '\'');\r
+\r
+                               if (val != "url('')")\r
+                                       str += key.toLowerCase() + ": " + val + "; ";\r
+                       }\r
+               }\r
+\r
+               if (new RegExp('; $').test(str))\r
+                       str = str.substring(0, str.length - 2);\r
+\r
+               return str;\r
+       },\r
+\r
+       convertRGBToHex : function(s, k) {\r
+               var re, rgb;\r
+\r
+               if (s.toLowerCase().indexOf('rgb') != -1) {\r
+                       re = new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)", "gi");\r
+                       rgb = s.replace(re, "$1,$2,$3,$4,$5").split(',');\r
+\r
+                       if (rgb.length == 5) {\r
+                               r = parseInt(rgb[1]).toString(16);\r
+                               g = parseInt(rgb[2]).toString(16);\r
+                               b = parseInt(rgb[3]).toString(16);\r
+\r
+                               r = r.length == 1 ? '0' + r : r;\r
+                               g = g.length == 1 ? '0' + g : g;\r
+                               b = b.length == 1 ? '0' + b : b;\r
+\r
+                               s = "#" + r + g + b;\r
+\r
+                               if (k)\r
+                                       s = rgb[0] + s + rgb[4];\r
+                       }\r
+               }\r
+\r
+               return s;\r
+       },\r
+\r
+       convertHexToRGB : function(s) {\r
+               if (s.indexOf('#') != -1) {\r
+                       s = s.replace(new RegExp('[^0-9A-F]', 'gi'), '');\r
+                       return "rgb(" + parseInt(s.substring(0, 2), 16) + "," + parseInt(s.substring(2, 4), 16) + "," + parseInt(s.substring(4, 6), 16) + ")";\r
+               }\r
+\r
+               return s;\r
+       },\r
+\r
+       convertSpansToFonts : function(doc) {\r
+               var s, i, size, fSize, x, fFace, fColor, sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');\r
+\r
+               s = tinyMCE.selectElements(doc, 'span,font');\r
+               for (i=0; i<s.length; i++) {\r
+                       size = tinyMCE.trim(s[i].style.fontSize).toLowerCase();\r
+                       fSize = 0;\r
+\r
+                       for (x=0; x<sizes.length; x++) {\r
+                               if (sizes[x] == size) {\r
+                                       fSize = x + 1;\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       if (fSize > 0) {\r
+                               tinyMCE.setAttrib(s[i], 'size', fSize);\r
+                               s[i].style.fontSize = '';\r
+                       }\r
+\r
+                       fFace = s[i].style.fontFamily;\r
+                       if (fFace != null && fFace !== '') {\r
+                               tinyMCE.setAttrib(s[i], 'face', fFace);\r
+                               s[i].style.fontFamily = '';\r
+                       }\r
+\r
+                       fColor = s[i].style.color;\r
+                       if (fColor != null && fColor !== '') {\r
+                               tinyMCE.setAttrib(s[i], 'color', tinyMCE.convertRGBToHex(fColor));\r
+                               s[i].style.color = '';\r
+                       }\r
+               }\r
+       },\r
+\r
+       convertFontsToSpans : function(doc) {\r
+               var fsClasses, s, i, fSize, fFace, fColor, sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');\r
+\r
+               fsClasses = tinyMCE.getParam('font_size_classes');\r
+               if (fsClasses !== '')\r
+                       fsClasses = fsClasses.replace(/\s+/, '').split(',');\r
+               else\r
+                       fsClasses = null;\r
+\r
+               s = tinyMCE.selectElements(doc, 'span,font');\r
+               for (i=0; i<s.length; i++) {\r
+                       fSize = tinyMCE.getAttrib(s[i], 'size');\r
+                       fFace = tinyMCE.getAttrib(s[i], 'face');\r
+                       fColor = tinyMCE.getAttrib(s[i], 'color');\r
+\r
+                       if (fSize !== '') {\r
+                               fSize = parseInt(fSize);\r
+\r
+                               if (fSize > 0 && fSize < 8) {\r
+                                       if (fsClasses != null)\r
+                                               tinyMCE.setAttrib(s[i], 'class', fsClasses[fSize-1]);\r
+                                       else\r
+                                               s[i].style.fontSize = sizes[fSize-1];\r
+                               }\r
+\r
+                               s[i].removeAttribute('size');\r
+                       }\r
+\r
+                       if (fFace !== '') {\r
+                               s[i].style.fontFamily = fFace;\r
+                               s[i].removeAttribute('face');\r
+                       }\r
+\r
+                       if (fColor !== '') {\r
+                               s[i].style.color = fColor;\r
+                               s[i].removeAttribute('color');\r
+                       }\r
+               }\r
+       },\r
+\r
+       cleanupAnchors : function(doc) {\r
+               var i, cn, x, an = doc.getElementsByTagName("a");\r
+\r
+               // Loops backwards due to bug #1467987\r
+               for (i=an.length-1; i>=0; i--) {\r
+                       if (tinyMCE.getAttrib(an[i], "name") !== '' && tinyMCE.getAttrib(an[i], "href") == '') {\r
+                               cn = an[i].childNodes;\r
+\r
+                               for (x=cn.length-1; x>=0; x--)\r
+                                       tinyMCE.insertAfter(cn[x], an[i]);\r
+                       }\r
+               }\r
+       },\r
+\r
+       getContent : function(editor_id) {\r
+               if (typeof(editor_id) != "undefined")\r
+                        tinyMCE.getInstanceById(editor_id).select();\r
+\r
+               if (tinyMCE.selectedInstance)\r
+                       return tinyMCE.selectedInstance.getHTML();\r
+\r
+               return null;\r
+       },\r
+\r
+       _fixListElements : function(d) {\r
+               var nl, x, a = ['ol', 'ul'], i, n, p, r = new RegExp('^(OL|UL)$'), np;\r
+\r
+               for (x=0; x<a.length; x++) {\r
+                       nl = d.getElementsByTagName(a[x]);\r
+\r
+                       for (i=0; i<nl.length; i++) {\r
+                               n = nl[i];\r
+                               p = n.parentNode;\r
+\r
+                               if (r.test(p.nodeName)) {\r
+                                       np = tinyMCE.prevNode(n, 'LI');\r
+\r
+                                       if (!np) {\r
+                                               np = d.createElement('li');\r
+                                               np.innerHTML = '&nbsp;';\r
+                                               np.appendChild(n);\r
+                                               p.insertBefore(np, p.firstChild);\r
+                                       } else\r
+                                               np.appendChild(n);\r
+                               }\r
+                       }\r
+               }\r
+       },\r
+\r
+       _fixTables : function(d) {\r
+               var nl, i, n, p, np, x, t;\r
+\r
+               nl = d.getElementsByTagName('table');\r
+               for (i=0; i<nl.length; i++) {\r
+                       n = nl[i];\r
+\r
+                       if ((p = tinyMCE.getParentElement(n, 'p,h1,h2,h3,h4,h5,h6')) != null) {\r
+                               np = p.cloneNode(false);\r
+                               np.removeAttribute('id');\r
+\r
+                               t = n;\r
+\r
+                               while ((n = n.nextSibling))\r
+                                       np.appendChild(n);\r
+\r
+                               tinyMCE.insertAfter(np, p);\r
+                               tinyMCE.insertAfter(t, p);\r
+                       }\r
+               }\r
+       },\r
+\r
+       _cleanupHTML : function(inst, doc, config, elm, visual, on_save, on_submit, inn) {\r
+               var h, d, t1, t2, t3, t4, t5, c, s, nb;\r
+\r
+               if (!tinyMCE.getParam('cleanup'))\r
+                       return elm.innerHTML;\r
+\r
+               on_save = typeof(on_save) == 'undefined' ? false : on_save;\r
+\r
+               c = inst.cleanup;\r
+               s = inst.settings;\r
+               d = c.settings.debug;\r
+\r
+               if (d)\r
+                       t1 = new Date().getTime();\r
+\r
+               inst._fixRootBlocks();\r
+\r
+               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                       tinyMCE.convertFontsToSpans(doc);\r
+\r
+               if (tinyMCE.getParam("fix_list_elements"))\r
+                       tinyMCE._fixListElements(doc);\r
+\r
+               if (tinyMCE.getParam("fix_table_elements"))\r
+                       tinyMCE._fixTables(doc);\r
+\r
+               // Call custom cleanup code\r
+               tinyMCE._customCleanup(inst, on_save ? "get_from_editor_dom" : "insert_to_editor_dom", doc.body);\r
+\r
+               if (d)\r
+                       t2 = new Date().getTime();\r
+\r
+               c.settings.on_save = on_save;\r
+\r
+               c.idCount = 0;\r
+               c.serializationId = new Date().getTime().toString(32); // Unique ID needed for the content duplication bug\r
+               c.serializedNodes = [];\r
+               c.sourceIndex = -1;\r
+\r
+               if (s.cleanup_serializer == "xml")\r
+                       h = c.serializeNodeAsXML(elm, inn);\r
+               else\r
+                       h = c.serializeNodeAsHTML(elm, inn);\r
+\r
+               if (d)\r
+                       t3 = new Date().getTime();\r
+\r
+               // Post processing\r
+               nb = tinyMCE.getParam('entity_encoding') == 'numeric' ? '&#160;' : '&nbsp;';\r
+               h = h.replace(/<\/?(body|head|html)[^>]*>/gi, '');\r
+               h = h.replace(new RegExp(' (rowspan="1"|colspan="1")', 'g'), '');\r
+               h = h.replace(/<p><hr \/><\/p>/g, '<hr />');\r
+               h = h.replace(/<p>(&nbsp;|&#160;)<\/p><hr \/><p>(&nbsp;|&#160;)<\/p>/g, '<hr />');\r
+               h = h.replace(/<td>\s*<br \/>\s*<\/td>/g, '<td>' + nb + '</td>');\r
+               h = h.replace(/<p>\s*<br \/>\s*<\/p>/g, '<p>' + nb + '</p>');\r
+               h = h.replace(/<br \/>$/, ''); // Remove last BR for Gecko\r
+               h = h.replace(/<br \/><\/p>/g, '</p>'); // Remove last BR in P tags for Gecko\r
+               h = h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*(&nbsp;|&#160;)\s*<\/p>/g, '<p>' + nb + '</p>');\r
+               h = h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*<\/p>/g, '<p>' + nb + '</p>');\r
+               h = h.replace(/<p>\s*<br \/>\s*&nbsp;\s*<\/p>/g, '<p>' + nb + '</p>');\r
+               h = h.replace(new RegExp('<a>(.*?)<\\/a>', 'g'), '$1');\r
+               h = h.replace(/<p([^>]*)>\s*<\/p>/g, '<p$1>' + nb + '</p>');\r
+\r
+               // Clean body\r
+               if (/^\s*(<br \/>|<p>&nbsp;<\/p>|<p>&#160;<\/p>|<p><\/p>)\s*$/.test(h))\r
+                       h = '';\r
+\r
+               // If preformatted\r
+               if (s.preformatted) {\r
+                       h = h.replace(/^<pre>/, '');\r
+                       h = h.replace(/<\/pre>$/, '');\r
+                       h = '<pre>' + h + '</pre>';\r
+               }\r
+\r
+               // Gecko specific processing\r
+               if (tinyMCE.isGecko) {\r
+                       // Makes no sence but FF generates it!!\r
+                       h = h.replace(/<br \/>\s*<\/li>/g, '</li>');\r
+                       h = h.replace(/&nbsp;\s*<\/(dd|dt)>/g, '</$1>');\r
+                       h = h.replace(/<o:p _moz-userdefined="" \/>/g, '');\r
+                       h = h.replace(/<td([^>]*)>\s*<br \/>\s*<\/td>/g, '<td$1>' + nb + '</td>');\r
+               }\r
+\r
+               if (s.force_br_newlines)\r
+                       h = h.replace(/<p>(&nbsp;|&#160;)<\/p>/g, '<br />');\r
+\r
+               // Call custom cleanup code\r
+               h = tinyMCE._customCleanup(inst, on_save ? "get_from_editor" : "insert_to_editor", h);\r
+\r
+               // Remove internal classes\r
+               if (on_save) {\r
+                       h = h.replace(new RegExp(' ?(mceItem[a-zA-Z0-9]*|' + s.visual_table_class + ')', 'g'), '');\r
+                       h = h.replace(new RegExp(' ?class=""', 'g'), '');\r
+               }\r
+\r
+               if (s.remove_linebreaks && !c.settings.indent)\r
+                       h = h.replace(/\n|\r/g, ' ');\r
+\r
+               if (d)\r
+                       t4 = new Date().getTime();\r
+\r
+               if (on_save && c.settings.indent)\r
+                       h = c.formatHTML(h);\r
+\r
+               // If encoding (not recommended option)\r
+               if (on_submit && (s.encoding == "xml" || s.encoding == "html"))\r
+                       h = c.xmlEncode(h);\r
+\r
+               if (d)\r
+                       t5 = new Date().getTime();\r
+\r
+               if (c.settings.debug)\r
+                       tinyMCE.debug("Cleanup in ms: Pre=" + (t2-t1) + ", Serialize: " + (t3-t2) + ", Post: " + (t4-t3) + ", Format: " + (t5-t4) + ", Sum: " + (t5-t1) + ".");\r
+\r
+               return h;\r
+       }\r
+});\r
+\r
+function TinyMCE_Cleanup() {\r
+       this.isIE = (navigator.appName == "Microsoft Internet Explorer");\r
+       this.rules = tinyMCE.clearArray([]);\r
+\r
+       // Default config\r
+       this.settings = {\r
+               indent_elements : 'head,table,tbody,thead,tfoot,form,tr,ul,ol,blockquote,object',\r
+               newline_before_elements : 'h1,h2,h3,h4,h5,h6,pre,address,div,ul,ol,li,meta,option,area,title,link,base,script,td',\r
+               newline_after_elements : 'br,hr,p,pre,address,div,ul,ol,meta,option,area,link,base,script',\r
+               newline_before_after_elements : 'html,head,body,table,thead,tbody,tfoot,tr,form,ul,ol,blockquote,p,object,param,hr,div',\r
+               indent_char : '\t',\r
+               indent_levels : 1,\r
+               entity_encoding : 'raw',\r
+               valid_elements : '*[*]',\r
+               entities : '',\r
+               url_converter : '',\r
+               invalid_elements : '',\r
+               verify_html : false\r
+       };\r
+\r
+       this.vElements = tinyMCE.clearArray([]);\r
+       this.vElementsRe = '';\r
+       this.closeElementsRe = /^(IMG|BR|HR|LINK|META|BASE|INPUT|AREA)$/;\r
+       this.codeElementsRe = /^(SCRIPT|STYLE)$/;\r
+       this.serializationId = 0;\r
+       this.mceAttribs = {\r
+               href : 'mce_href',\r
+               src : 'mce_src',\r
+               type : 'mce_type'\r
+       };\r
+}\r
+\r
+TinyMCE_Cleanup.prototype = {\r
+       init : function(s) {\r
+               var n, a, i, ir, or, st;\r
+\r
+               for (n in s)\r
+                       this.settings[n] = s[n];\r
+\r
+               // Setup code formating\r
+               s = this.settings;\r
+\r
+               // Setup regexps\r
+               this.inRe = this._arrayToRe(s.indent_elements.split(','), '', '^<(', ')[^>]*');\r
+               this.ouRe = this._arrayToRe(s.indent_elements.split(','), '', '^<\\/(', ')[^>]*');\r
+               this.nlBeforeRe = this._arrayToRe(s.newline_before_elements.split(','), 'gi', '<(',  ')([^>]*)>');\r
+               this.nlAfterRe = this._arrayToRe(s.newline_after_elements.split(','), 'gi', '<(',  ')([^>]*)>');\r
+               this.nlBeforeAfterRe = this._arrayToRe(s.newline_before_after_elements.split(','), 'gi', '<(\\/?)(', ')([^>]*)>');\r
+               this.serializedNodes = [];\r
+\r
+               if (s.invalid_elements !== '')\r
+                       this.iveRe = this._arrayToRe(s.invalid_elements.toUpperCase().split(','), 'g', '^(', ')$');\r
+               else\r
+                       this.iveRe = null;\r
+\r
+               // Setup separator\r
+               st = '';\r
+               for (i=0; i<s.indent_levels; i++)\r
+                       st += s.indent_char;\r
+\r
+               this.inStr = st;\r
+\r
+               // If verify_html if false force *[*]\r
+               if (!s.verify_html) {\r
+                       s.valid_elements = '*[*]';\r
+                       s.extended_valid_elements = '';\r
+               }\r
+\r
+               this.fillStr = s.entity_encoding == "named" ? "&nbsp;" : "&#160;";\r
+               this.idCount = 0;\r
+               this.xmlEncodeRe = new RegExp('[\u007F-\uFFFF<>&"]', 'g');\r
+       },\r
+\r
+       addRuleStr : function(s) {\r
+               var r = this.parseRuleStr(s), n;\r
+\r
+               for (n in r) {\r
+                       if (r[n])\r
+                               this.rules[n] = r[n];\r
+               }\r
+\r
+               this.vElements = tinyMCE.clearArray([]);\r
+\r
+               for (n in this.rules) {\r
+                       if (this.rules[n])\r
+                               this.vElements[this.vElements.length] = this.rules[n].tag;\r
+               }\r
+\r
+               this.vElementsRe = this._arrayToRe(this.vElements, '');\r
+       },\r
+\r
+       isValid : function(n) {\r
+               if (!this.rulesDone)\r
+                       this._setupRules(); // Will initialize cleanup rules\r
+\r
+               // Empty is true since it removes formatting\r
+               if (!n)\r
+                       return true;\r
+\r
+               // Clean the name up a bit\r
+               n = n.replace(/[^a-z0-9]+/gi, '').toUpperCase();\r
+\r
+               return !tinyMCE.getParam('cleanup') || this.vElementsRe.test(n);\r
+       },\r
+\r
+       addChildRemoveRuleStr : function(s) {\r
+               var x, y, p, i, t, tn, ta, cl, r;\r
+\r
+               if (!s)\r
+                       return;\r
+\r
+               ta = s.split(',');\r
+               for (x=0; x<ta.length; x++) {\r
+                       s = ta[x];\r
+\r
+                       // Split tag/children\r
+                       p = this.split(/\[|\]/, s);\r
+                       if (p == null || p.length < 1)\r
+                               t = s.toUpperCase();\r
+                       else\r
+                               t = p[0].toUpperCase();\r
+\r
+                       // Handle all tag names\r
+                       tn = this.split('/', t);\r
+                       for (y=0; y<tn.length; y++) {\r
+                               r = "^(";\r
+\r
+                               // Build regex\r
+                               cl = this.split(/\|/, p[1]);\r
+                               for (i=0; i<cl.length; i++) {\r
+                                       if (cl[i] == '%istrict')\r
+                                               r += tinyMCE.inlineStrict;\r
+                                       else if (cl[i] == '%itrans')\r
+                                               r += tinyMCE.inlineTransitional;\r
+                                       else if (cl[i] == '%istrict_na')\r
+                                               r += tinyMCE.inlineStrict.substring(2);\r
+                                       else if (cl[i] == '%itrans_na')\r
+                                               r += tinyMCE.inlineTransitional.substring(2);\r
+                                       else if (cl[i] == '%btrans')\r
+                                               r += tinyMCE.blockElms;\r
+                                       else if (cl[i] == '%strict')\r
+                                               r += tinyMCE.blockStrict;\r
+                                       else\r
+                                               r += (cl[i].charAt(0) != '#' ? cl[i].toUpperCase() : cl[i]);\r
+\r
+                                       r += (i != cl.length - 1 ? '|' : '');\r
+                               }\r
+\r
+                               r += ')$';\r
+\r
+                               if (this.childRules == null)\r
+                                       this.childRules = tinyMCE.clearArray([]);\r
+\r
+                               this.childRules[tn[y]] = new RegExp(r);\r
+\r
+                               if (p.length > 1)\r
+                                       this.childRules[tn[y]].wrapTag = p[2];\r
+                       }\r
+               }\r
+       },\r
+\r
+       parseRuleStr : function(s) {\r
+               var ta, p, r, a, i, x, px, t, tn, y, av, or = tinyMCE.clearArray([]), dv;\r
+\r
+               if (s == null || s.length == 0)\r
+                       return or;\r
+\r
+               ta = s.split(',');\r
+               for (x=0; x<ta.length; x++) {\r
+                       s = ta[x];\r
+                       if (s.length == 0)\r
+                               continue;\r
+\r
+                       // Split tag/attrs\r
+                       p = this.split(/\[|\]/, s);\r
+                       if (p == null || p.length < 1)\r
+                               t = s.toUpperCase();\r
+                       else\r
+                               t = p[0].toUpperCase();\r
+\r
+                       // Handle all tag names\r
+                       tn = this.split('/', t);\r
+                       for (y=0; y<tn.length; y++) {\r
+                               r = {};\r
+\r
+                               r.tag = tn[y];\r
+                               r.forceAttribs = null;\r
+                               r.defaultAttribs = null;\r
+                               r.validAttribValues = null;\r
+\r
+                               // Handle prefixes\r
+                               px = r.tag.charAt(0);\r
+                               r.forceOpen = px == '+';\r
+                               r.removeEmpty = px == '-';\r
+                               r.fill = px == '#';\r
+                               r.tag = r.tag.replace(/\+|-|#/g, '');\r
+                               r.oTagName = tn[0].replace(/\+|-|#/g, '').toLowerCase();\r
+                               r.isWild = new RegExp('\\*|\\?|\\+', 'g').test(r.tag);\r
+                               r.validRe = new RegExp(this._wildcardToRe('^' + r.tag + '$'));\r
+\r
+                               // Setup valid attributes\r
+                               if (p.length > 1) {\r
+                                       r.vAttribsRe = '^(';\r
+                                       a = this.split(/\|/, p[1]);\r
+\r
+                                       for (i=0; i<a.length; i++) {\r
+                                               t = a[i];\r
+\r
+                                               if (t.charAt(0) == '!') {\r
+                                                       a[i] = t = t.substring(1);\r
+\r
+                                                       if (!r.reqAttribsRe)\r
+                                                               r.reqAttribsRe = '\\s+(' + t;\r
+                                                       else\r
+                                                               r.reqAttribsRe += '|' + t;\r
+                                               }\r
+\r
+                                               av = new RegExp('(=|:|<)(.*?)$').exec(t);\r
+                                               t = t.replace(new RegExp('(=|:|<).*?$'), '');\r
+                                               if (av && av.length > 0) {\r
+                                                       if (av[0].charAt(0) == ':') {\r
+                                                               if (!r.forceAttribs)\r
+                                                                       r.forceAttribs = tinyMCE.clearArray([]);\r
+\r
+                                                               r.forceAttribs[t.toLowerCase()] = av[0].substring(1);\r
+                                                       } else if (av[0].charAt(0) == '=') {\r
+                                                               if (!r.defaultAttribs)\r
+                                                                       r.defaultAttribs = tinyMCE.clearArray([]);\r
+\r
+                                                               dv = av[0].substring(1);\r
+\r
+                                                               r.defaultAttribs[t.toLowerCase()] = dv == '' ? "mce_empty" : dv;\r
+                                                       } else if (av[0].charAt(0) == '<') {\r
+                                                               if (!r.validAttribValues)\r
+                                                                       r.validAttribValues = tinyMCE.clearArray([]);\r
+\r
+                                                               r.validAttribValues[t.toLowerCase()] = this._arrayToRe(this.split('?', av[0].substring(1)), 'i');\r
+                                                       }\r
+                                               }\r
+\r
+                                               r.vAttribsRe += '' + t.toLowerCase() + (i != a.length - 1 ? '|' : '');\r
+\r
+                                               a[i] = t.toLowerCase();\r
+                                       }\r
+\r
+                                       if (r.reqAttribsRe)\r
+                                               r.reqAttribsRe = new RegExp(r.reqAttribsRe + ')=\"', 'g');\r
+\r
+                                       r.vAttribsRe += ')$';\r
+                                       r.vAttribsRe = this._wildcardToRe(r.vAttribsRe);\r
+                                       r.vAttribsReIsWild = new RegExp('\\*|\\?|\\+', 'g').test(r.vAttribsRe);\r
+                                       r.vAttribsRe = new RegExp(r.vAttribsRe);\r
+                                       r.vAttribs = a.reverse();\r
+\r
+                                       //tinyMCE.debug(r.tag, r.oTagName, r.vAttribsRe, r.vAttribsReWC);\r
+                               } else {\r
+                                       r.vAttribsRe = '';\r
+                                       r.vAttribs = tinyMCE.clearArray([]);\r
+                                       r.vAttribsReIsWild = false;\r
+                               }\r
+\r
+                               or[r.tag] = r;\r
+                       }\r
+               }\r
+\r
+               return or;\r
+       },\r
+\r
+       serializeNodeAsXML : function(n) {\r
+               var s, b;\r
+\r
+               if (!this.xmlDoc) {\r
+                       if (this.isIE) {\r
+                               try {this.xmlDoc = new ActiveXObject('MSXML2.DOMDocument');} catch (e) {}\r
+\r
+                               if (!this.xmlDoc)\r
+                                       try {this.xmlDoc = new ActiveXObject('Microsoft.XmlDom');} catch (e) {}\r
+                       } else\r
+                               this.xmlDoc = document.implementation.createDocument('', '', null);\r
+\r
+                       if (!this.xmlDoc)\r
+                               alert("Error XML Parser could not be found.");\r
+               }\r
+\r
+               if (this.xmlDoc.firstChild)\r
+                       this.xmlDoc.removeChild(this.xmlDoc.firstChild);\r
+\r
+               b = this.xmlDoc.createElement("html");\r
+               b = this.xmlDoc.appendChild(b);\r
+\r
+               this._convertToXML(n, b);\r
+\r
+               if (this.isIE)\r
+                       return this.xmlDoc.xml;\r
+               else\r
+                       return new XMLSerializer().serializeToString(this.xmlDoc);\r
+       },\r
+\r
+       _convertToXML : function(n, xn) {\r
+               var xd, el, i, l, cn, at, no, hc = false;\r
+\r
+               if (tinyMCE.isRealIE && this._isDuplicate(n))\r
+                       return;\r
+\r
+               xd = this.xmlDoc;\r
+\r
+               switch (n.nodeType) {\r
+                       case 1: // Element\r
+                               hc = n.hasChildNodes();\r
+\r
+                               el = xd.createElement(n.nodeName.toLowerCase());\r
+\r
+                               at = n.attributes;\r
+                               for (i=at.length-1; i>-1; i--) {\r
+                                       no = at[i];\r
+\r
+                                       if (no.specified && no.nodeValue)\r
+                                               el.setAttribute(no.nodeName.toLowerCase(), no.nodeValue);\r
+                               }\r
+\r
+                               if (!hc && !this.closeElementsRe.test(n.nodeName))\r
+                                       el.appendChild(xd.createTextNode(""));\r
+\r
+                               xn = xn.appendChild(el);\r
+                               break;\r
+\r
+                       case 3: // Text\r
+                               xn.appendChild(xd.createTextNode(n.nodeValue));\r
+                               return;\r
+\r
+                       case 8: // Comment\r
+                               xn.appendChild(xd.createComment(n.nodeValue));\r
+                               return;\r
+               }\r
+\r
+               if (hc) {\r
+                       cn = n.childNodes;\r
+\r
+                       for (i=0, l=cn.length; i<l; i++)\r
+                               this._convertToXML(cn[i], xn);\r
+               }\r
+       },\r
+\r
+       serializeNodeAsHTML : function(n, inn) {\r
+               var en, no, h = '', i, l, t, st, r, cn, va = false, f = false, at, hc, cr, nn;\r
+\r
+               if (!this.rulesDone)\r
+                       this._setupRules(); // Will initialize cleanup rules\r
+\r
+               if (tinyMCE.isRealIE && this._isDuplicate(n))\r
+                       return '';\r
+\r
+               // Skip non valid child elements\r
+               if (n.parentNode && this.childRules != null) {\r
+                       cr = this.childRules[n.parentNode.nodeName];\r
+\r
+                       if (typeof(cr) != "undefined" && !cr.test(n.nodeName)) {\r
+                               st = true;\r
+                               t = null;\r
+                       }\r
+               }\r
+\r
+               switch (n.nodeType) {\r
+                       case 1: // Element\r
+                               hc = n.hasChildNodes();\r
+\r
+                               if (st)\r
+                                       break;\r
+\r
+                               nn = n.nodeName;\r
+\r
+                               if (tinyMCE.isRealIE) {\r
+                                       // MSIE sometimes produces <//tag>\r
+                                       if (n.nodeName.indexOf('/') != -1)\r
+                                               break;\r
+\r
+                                       // MSIE has it's NS in a separate attrib\r
+                                       if (n.scopeName && n.scopeName != 'HTML')\r
+                                               nn = n.scopeName.toUpperCase() + ':' + nn.toUpperCase();\r
+                               } else if (tinyMCE.isOpera && nn.indexOf(':') > 0)\r
+                                       nn = nn.toUpperCase();\r
+\r
+                               // Convert fonts to spans\r
+                               if (this.settings.convert_fonts_to_spans) {\r
+                                       // On get content FONT -> SPAN\r
+                                       if (this.settings.on_save && nn == 'FONT')\r
+                                               nn = 'SPAN';\r
+\r
+                                       // On insert content SPAN -> FONT\r
+                                       if (!this.settings.on_save && nn == 'SPAN')\r
+                                               nn = 'FONT';\r
+                               }\r
+\r
+                               if (this.vElementsRe.test(nn) && (!this.iveRe || !this.iveRe.test(nn)) && !inn) {\r
+                                       va = true;\r
+\r
+                                       r = this.rules[nn];\r
+                                       if (!r) {\r
+                                               at = this.rules;\r
+                                               for (no in at) {\r
+                                                       if (at[no] && at[no].validRe.test(nn)) {\r
+                                                               r = at[no];\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       en = r.isWild ? nn.toLowerCase() : r.oTagName;\r
+                                       f = r.fill;\r
+\r
+                                       if (r.removeEmpty && !hc)\r
+                                               return "";\r
+\r
+                                       t = '<' + en;\r
+\r
+                                       if (r.vAttribsReIsWild) {\r
+                                               // Serialize wildcard attributes\r
+                                               at = n.attributes;\r
+                                               for (i=at.length-1; i>-1; i--) {\r
+                                                       no = at[i];\r
+                                                       if (no.specified && r.vAttribsRe.test(no.nodeName))\r
+                                                               t += this._serializeAttribute(n, r, no.nodeName);\r
+                                               }\r
+                                       } else {\r
+                                               // Serialize specific attributes\r
+                                               for (i=r.vAttribs.length-1; i>-1; i--)\r
+                                                       t += this._serializeAttribute(n, r, r.vAttribs[i]);\r
+                                       }\r
+\r
+                                       // Serialize mce_ atts\r
+                                       if (!this.settings.on_save) {\r
+                                               at = this.mceAttribs;\r
+\r
+                                               for (no in at) {\r
+                                                       if (at[no])\r
+                                                               t += this._serializeAttribute(n, r, at[no]);\r
+                                               }\r
+                                       }\r
+\r
+                                       // Check for required attribs\r
+                                       if (r.reqAttribsRe && !t.match(r.reqAttribsRe))\r
+                                               t = null;\r
+\r
+                                       // Close these\r
+                                       if (t != null && this.closeElementsRe.test(nn))\r
+                                               return t + ' />';\r
+\r
+                                       if (t != null)\r
+                                               h += t + '>';\r
+\r
+                                       if (this.isIE && this.codeElementsRe.test(nn))\r
+                                               h += n.innerHTML;\r
+                               }\r
+                       break;\r
+\r
+                       case 3: // Text\r
+                               if (st)\r
+                                       break;\r
+\r
+                               if (n.parentNode && this.codeElementsRe.test(n.parentNode.nodeName))\r
+                                       return this.isIE ? '' : n.nodeValue;\r
+\r
+                               return this.xmlEncode(n.nodeValue);\r
+\r
+                       case 8: // Comment\r
+                               if (st)\r
+                                       break;\r
+\r
+                               return "<!--" + this._trimComment(n.nodeValue) + "-->";\r
+               }\r
+\r
+               if (hc) {\r
+                       cn = n.childNodes;\r
+\r
+                       for (i=0, l=cn.length; i<l; i++)\r
+                               h += this.serializeNodeAsHTML(cn[i]);\r
+               }\r
+\r
+               // Fill empty nodes\r
+               if (f && !hc)\r
+                       h += this.fillStr;\r
+\r
+               // End element\r
+               if (t != null && va)\r
+                       h += '</' + en + '>';\r
+\r
+               return h;\r
+       },\r
+\r
+       _serializeAttribute : function(n, r, an) {\r
+               var av = '', t, os = this.settings.on_save;\r
+\r
+               if (os && (an.indexOf('mce_') == 0 || an.indexOf('_moz') == 0))\r
+                       return '';\r
+\r
+               if (os && this.mceAttribs[an])\r
+                       av = this._getAttrib(n, this.mceAttribs[an]);\r
+\r
+               if (av.length == 0)\r
+                       av = this._getAttrib(n, an);\r
+\r
+               if (av.length == 0 && r.defaultAttribs && (t = r.defaultAttribs[an])) {\r
+                       av = t;\r
+\r
+                       if (av == "mce_empty")\r
+                               return " " + an + '=""';\r
+               }\r
+\r
+               if (r.forceAttribs && (t = r.forceAttribs[an]))\r
+                       av = t;\r
+\r
+               if (os && av.length != 0 && /^(src|href|longdesc)$/.test(an))\r
+                       av = this._urlConverter(this, n, av);\r
+\r
+               if (av.length != 0 && r.validAttribValues && r.validAttribValues[an] && !r.validAttribValues[an].test(av))\r
+                       return "";\r
+\r
+               if (av.length != 0 && av == "{$uid}")\r
+                       av = "uid_" + (this.idCount++);\r
+\r
+               if (av.length != 0) {\r
+                       if (an.indexOf('on') != 0)\r
+                               av = this.xmlEncode(av, 1);\r
+\r
+                       return " " + an + "=" + '"' + av + '"';\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       formatHTML : function(h) {\r
+               var s = this.settings, p = '', i = 0, li = 0, o = '', l;\r
+\r
+               // Replace BR in pre elements to \n\r
+               h = h.replace(/<pre([^>]*)>(.*?)<\/pre>/gi, function (a, b, c) {\r
+                       c = c.replace(/<br\s*\/>/gi, '\n');\r
+                       return '<pre' + b + '>' + c + '</pre>';\r
+               });\r
+\r
+               h = h.replace(/\r/g, ''); // Windows sux, isn't carriage return a thing of the past :)\r
+               h = '\n' + h;\r
+               h = h.replace(new RegExp('\\n\\s+', 'gi'), '\n'); // Remove previous formatting\r
+               h = h.replace(this.nlBeforeRe, '\n<$1$2>');\r
+               h = h.replace(this.nlAfterRe, '<$1$2>\n');\r
+               h = h.replace(this.nlBeforeAfterRe, '\n<$1$2$3>\n');\r
+               h += '\n';\r
+\r
+               //tinyMCE.debug(h);\r
+\r
+               while ((i = h.indexOf('\n', i + 1)) != -1) {\r
+                       if ((l = h.substring(li + 1, i)).length != 0) {\r
+                               if (this.ouRe.test(l) && p.length >= s.indent_levels)\r
+                                       p = p.substring(s.indent_levels);\r
+\r
+                               o += p + l + '\n';\r
+       \r
+                               if (this.inRe.test(l))\r
+                                       p += this.inStr;\r
+                       }\r
+\r
+                       li = i;\r
+               }\r
+\r
+               //tinyMCE.debug(h);\r
+\r
+               return o;\r
+       },\r
+\r
+       xmlEncode : function(s) {\r
+               var cl = this, re = this.xmlEncodeRe;\r
+\r
+               if (!this.entitiesDone)\r
+                       this._setupEntities(); // Will intialize lookup table\r
+\r
+               switch (this.settings.entity_encoding) {\r
+                       case "raw":\r
+                               return tinyMCE.xmlEncode(s);\r
+\r
+                       case "named":\r
+                               return s.replace(re, function (c) {\r
+                                       var b = cl.entities[c.charCodeAt(0)];\r
+\r
+                                       return b ? '&' + b + ';' : c;\r
+                               });\r
+\r
+                       case "numeric":\r
+                               return s.replace(re, function (c) {\r
+                                       return '&#' + c.charCodeAt(0) + ';';\r
+                               });\r
+               }\r
+\r
+               return s;\r
+       },\r
+\r
+       split : function(re, s) {\r
+               var i, l, o = [], c = s.split(re);\r
+\r
+               for (i=0, l=c.length; i<l; i++) {\r
+                       if (c[i] !== '')\r
+                               o[i] = c[i];\r
+               }\r
+\r
+               return o;\r
+       },\r
+\r
+       _trimComment : function(s) {\r
+               // Remove mce_src, mce_href\r
+               s = s.replace(new RegExp('\\smce_src=\"[^\"]*\"', 'gi'), "");\r
+               s = s.replace(new RegExp('\\smce_href=\"[^\"]*\"', 'gi'), "");\r
+\r
+               return s;\r
+       },\r
+\r
+       _getAttrib : function(e, n, d) {\r
+               var v, ex, nn;\r
+\r
+               if (typeof(d) == "undefined")\r
+                       d = "";\r
+\r
+               if (!e || e.nodeType != 1)\r
+                       return d;\r
+\r
+               try {\r
+                       v = e.getAttribute(n, 0);\r
+               } catch (ex) {\r
+                       // IE 7 may cast exception on invalid attributes\r
+                       v = e.getAttribute(n, 2);\r
+               }\r
+\r
+               if (n == "class" && !v)\r
+                       v = e.className;\r
+\r
+               if (this.isIE) {\r
+                       if (n == "http-equiv")\r
+                               v = e.httpEquiv;\r
+\r
+                       nn = e.nodeName;\r
+\r
+                       // Skip the default values that IE returns\r
+                       if (nn == "FORM" && n == "enctype" && v == "application/x-www-form-urlencoded")\r
+                               v = "";\r
+\r
+                       if (nn == "INPUT" && n == "size" && v == "20")\r
+                               v = "";\r
+\r
+                       if (nn == "INPUT" && n == "maxlength" && v == "2147483647")\r
+                               v = "";\r
+\r
+                       // Images\r
+                       if (n == "width" || n == "height")\r
+                               v = e.getAttribute(n, 2);\r
+               }\r
+\r
+               if (n == 'style' && v) {\r
+                       if (!tinyMCE.isOpera)\r
+                               v = e.style.cssText;\r
+\r
+                       v = tinyMCE.serializeStyle(tinyMCE.parseStyle(v));\r
+               }\r
+\r
+               if (this.settings.on_save && n.indexOf('on') != -1 && this.settings.on_save && v && v !== '')\r
+                       v = tinyMCE.cleanupEventStr(v);\r
+\r
+               return (v && v !== '') ? '' + v : d;\r
+       },\r
+\r
+       _urlConverter : function(c, n, v) {\r
+               if (!c.settings.on_save)\r
+                       return tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, v);\r
+               else if (tinyMCE.getParam('convert_urls')) {\r
+                       if (!this.urlConverter)\r
+                               this.urlConverter = eval(tinyMCE.settings.urlconverter_callback);\r
+\r
+                       return this.urlConverter(v, n, true);\r
+               }\r
+\r
+               return v;\r
+       },\r
+\r
+       _arrayToRe : function(a, op, be, af) {\r
+               var i, r;\r
+\r
+               op = typeof(op) == "undefined" ? "gi" : op;\r
+               be = typeof(be) == "undefined" ? "^(" : be;\r
+               af = typeof(af) == "undefined" ? ")$" : af;\r
+\r
+               r = be;\r
+\r
+               for (i=0; i<a.length; i++)\r
+                       r += this._wildcardToRe(a[i]) + (i != a.length-1 ? "|" : "");\r
+\r
+               r += af;\r
+\r
+               return new RegExp(r, op);\r
+       },\r
+\r
+       _wildcardToRe : function(s) {\r
+               s = s.replace(/\?/g, '(\\S?)');\r
+               s = s.replace(/\+/g, '(\\S+)');\r
+               s = s.replace(/\*/g, '(\\S*)');\r
+\r
+               return s;\r
+       },\r
+\r
+       _setupEntities : function() {\r
+               var n, a, i, s = this.settings;\r
+\r
+               // Setup entities\r
+               if (s.entity_encoding == "named") {\r
+                       n = tinyMCE.clearArray([]);\r
+                       a = this.split(',', s.entities);\r
+                       for (i=0; i<a.length; i+=2)\r
+                               n[a[i]] = a[i+1];\r
+\r
+                       this.entities = n;\r
+               }\r
+\r
+               this.entitiesDone = true;\r
+       },\r
+\r
+       _setupRules : function() {\r
+               var s = this.settings;\r
+\r
+               // Setup default rule\r
+               this.addRuleStr(s.valid_elements);\r
+               this.addRuleStr(s.extended_valid_elements);\r
+               this.addChildRemoveRuleStr(s.valid_child_elements);\r
+\r
+               this.rulesDone = true;\r
+       },\r
+\r
+       _isDuplicate : function(n) {\r
+               var i, l, sn;\r
+\r
+               if (!this.settings.fix_content_duplication)\r
+                       return false;\r
+\r
+               if (tinyMCE.isRealIE && n.nodeType == 1) {\r
+                       // Mark elements\r
+                       if (n.mce_serialized == this.serializationId)\r
+                               return true;\r
+\r
+                       n.setAttribute('mce_serialized', this.serializationId);\r
+               } else {\r
+                       sn = this.serializedNodes;\r
+\r
+                       // Search lookup table for text nodes  and comments\r
+                       for (i=0, l = sn.length; i<l; i++) {\r
+                               if (sn[i] == n)\r
+                                       return true;\r
+                       }\r
+\r
+                       sn.push(n);\r
+               }\r
+\r
+               return false;\r
+       }\r
+\r
+       };\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_DOMUtils.class.js */\r
+\r
+tinyMCE.add(TinyMCE_Engine, {\r
+       createTagHTML : function(tn, a, h) {\r
+               var o = '', f = tinyMCE.xmlEncode, n;\r
+\r
+               o = '<' + tn;\r
+\r
+               if (a) {\r
+                       for (n in a) {\r
+                               if (typeof(a[n]) != 'function' && a[n] != null)\r
+                                       o += ' ' + f(n) + '="' + f('' + a[n]) + '"';\r
+                       }\r
+               }\r
+\r
+               o += !h ? ' />' : '>' + h + '</' + tn + '>';\r
+\r
+               return o;\r
+       },\r
+\r
+       createTag : function(d, tn, a, h) {\r
+               var o = d.createElement(tn), n;\r
+\r
+               if (a) {\r
+                       for (n in a) {\r
+                               if (typeof(a[n]) != 'function' && a[n] != null)\r
+                                       tinyMCE.setAttrib(o, n, a[n]);\r
+                       }\r
+               }\r
+\r
+               if (h)\r
+                       o.innerHTML = h;\r
+\r
+               return o;\r
+       },\r
+\r
+       getElementByAttributeValue : function(n, e, a, v) {\r
+               return (n = this.getElementsByAttributeValue(n, e, a, v)).length == 0 ? null : n[0];\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
+       isBlockElement : function(n) {\r
+               return n != null && n.nodeType == 1 && this.blockRegExp.test(n.nodeName);\r
+       },\r
+\r
+       getParentBlockElement : function(n, r) {\r
+               return this.getParentNode(n, function(n) {\r
+                       return tinyMCE.isBlockElement(n);\r
+               }, r);\r
+\r
+               return null;\r
+       },\r
+\r
+       insertAfter : function(n, r){\r
+               if (r.nextSibling)\r
+                       r.parentNode.insertBefore(n, r.nextSibling);\r
+               else\r
+                       r.parentNode.appendChild(n);\r
+       },\r
+\r
+       setInnerHTML : function(e, h) {\r
+               var i, nl, n;\r
+\r
+               // Convert all strong/em to b/i in Gecko\r
+               if (tinyMCE.isGecko) {\r
+                       h = h.replace(/<embed([^>]*)>/gi, '<tmpembed$1>');\r
+                       h = h.replace(/<em([^>]*)>/gi, '<i$1>');\r
+                       h = h.replace(/<tmpembed([^>]*)>/gi, '<embed$1>');\r
+                       h = h.replace(/<strong([^>]*)>/gi, '<b$1>');\r
+                       h = h.replace(/<\/strong>/gi, '</b>');\r
+                       h = h.replace(/<\/em>/gi, '</i>');\r
+               }\r
+\r
+               if (tinyMCE.isRealIE) {\r
+                       // Since MSIE handles invalid HTML better that valid XHTML we\r
+                       // need to make some things invalid. <hr /> gets converted to <hr>.\r
+                       h = h.replace(/\s\/>/g, '>');\r
+\r
+                       // Since MSIE auto generated emtpy P tags some times we must tell it to keep the real ones\r
+                       h = h.replace(/<p([^>]*)>\u00A0?<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs\r
+                       h = h.replace(/<p([^>]*)>\s*&nbsp;\s*<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs\r
+                       h = h.replace(/<p([^>]*)>\s+<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs\r
+\r
+                       // Remove first comment\r
+                       e.innerHTML = tinyMCE.uniqueTag + h;\r
+                       e.firstChild.removeNode(true);\r
+\r
+                       // Remove weird auto generated empty paragraphs unless it's supposed to be there\r
+                       nl = e.getElementsByTagName("p");\r
+                       for (i=nl.length-1; i>=0; i--) {\r
+                               n = nl[i];\r
+\r
+                               if (n.nodeName == 'P' && !n.hasChildNodes() && !n.mce_keep)\r
+                                       n.parentNode.removeChild(n);\r
+                       }\r
+               } else {\r
+                       h = this.fixGeckoBaseHREFBug(1, e, h);\r
+                       e.innerHTML = h;\r
+                       this.fixGeckoBaseHREFBug(2, e, h);\r
+               }\r
+       },\r
+\r
+       getOuterHTML : function(e) {\r
+               var d;\r
+\r
+               if (tinyMCE.isIE)\r
+                       return e.outerHTML;\r
+\r
+               d = e.ownerDocument.createElement("body");\r
+               d.appendChild(e.cloneNode(true));\r
+\r
+               return d.innerHTML;\r
+       },\r
+\r
+       setOuterHTML : function(e, h, d) {\r
+               var d = typeof(d) == "undefined" ? e.ownerDocument : d, i, nl, t;\r
+\r
+               if (tinyMCE.isIE && e.nodeType == 1)\r
+                       e.outerHTML = h;\r
+               else {\r
+                       t = d.createElement("body");\r
+                       t.innerHTML = h;\r
+\r
+                       for (i=0, nl=t.childNodes; i<nl.length; i++)\r
+                               e.parentNode.insertBefore(nl[i].cloneNode(true), e);\r
+\r
+                       e.parentNode.removeChild(e);\r
+               }\r
+       },\r
+\r
+       _getElementById : function(id, d) {\r
+               var e, i, j, f;\r
+\r
+               if (typeof(d) == "undefined")\r
+                       d = document;\r
+\r
+               e = d.getElementById(id);\r
+               if (!e) {\r
+                       f = d.forms;\r
+\r
+                       for (i=0; i<f.length; i++) {\r
+                               for (j=0; j<f[i].elements.length; j++) {\r
+                                       if (f[i].elements[j].name == id) {\r
+                                               e = f[i].elements[j];\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return e;\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
+       getParentElement : function(n, na, f, r) {\r
+               var re = na ? new RegExp('^(' + na.toUpperCase().replace(/,/g, '|') + ')$') : 0, v;\r
+\r
+               // Compatiblity with old scripts where f param was a attribute string\r
+               if (f && typeof(f) == 'string')\r
+                       return this.getParentElement(n, na, function(no) {return tinyMCE.getAttrib(no, f) !== '';});\r
+\r
+               return this.getParentNode(n, function(n) {\r
+                       return ((n.nodeType == 1 && !re) || (re && re.test(n.nodeName))) && (!f || f(n));\r
+               }, r);\r
+       },\r
+\r
+       getParentNode : function(n, f, r) {\r
+               while (n) {\r
+                       if (n == r)\r
+                               return null;\r
+\r
+                       if (f(n))\r
+                               return n;\r
+\r
+                       n = n.parentNode;\r
+               }\r
+\r
+               return null;\r
+       },\r
+\r
+       getAttrib : function(elm, name, dv) {\r
+               var v;\r
+\r
+               if (typeof(dv) == "undefined")\r
+                       dv = "";\r
+\r
+               // Not a element\r
+               if (!elm || elm.nodeType != 1)\r
+                       return dv;\r
+\r
+               try {\r
+                       v = elm.getAttribute(name, 0);\r
+               } catch (ex) {\r
+                       // IE 7 may cast exception on invalid attributes\r
+                       v = elm.getAttribute(name, 2);\r
+               }\r
+\r
+               // Try className for class attrib\r
+               if (name == "class" && !v)\r
+                       v = elm.className;\r
+\r
+               // Workaround for a issue with Firefox 1.5rc2+\r
+               if (tinyMCE.isGecko) {\r
+                       if (name == "src" && elm.src != null && elm.src !== '')\r
+                               v = elm.src;\r
+\r
+                       // Workaround for a issue with Firefox 1.5rc2+\r
+                       if (name == "href" && elm.href != null && elm.href !== '')\r
+                               v = elm.href;\r
+               } else if (tinyMCE.isIE) {\r
+                       switch (name) {\r
+                               case "http-equiv":\r
+                                       v = elm.httpEquiv;\r
+                                       break;\r
+\r
+                               case "width":\r
+                               case "height":\r
+                                       v = elm.getAttribute(name, 2);\r
+                                       break;\r
+                       }\r
+               }\r
+\r
+               if (name == "style" && !tinyMCE.isOpera)\r
+                       v = elm.style.cssText;\r
+\r
+               return (v && v !== '') ? v : dv;\r
+       },\r
+\r
+       setAttrib : function(el, name, va, fix) {\r
+               if (typeof(va) == "number" && va != null)\r
+                       va = "" + va;\r
+\r
+               if (fix) {\r
+                       if (va == null)\r
+                               va = "";\r
+\r
+                       va = va.replace(/[^0-9%]/g, '');\r
+               }\r
+\r
+               if (name == "style")\r
+                       el.style.cssText = va;\r
+\r
+               if (name == "class")\r
+                       el.className = va;\r
+\r
+               if (va != null && va !== '' && va != -1)\r
+                       el.setAttribute(name, va);\r
+               else\r
+                       el.removeAttribute(name);\r
+       },\r
+\r
+       setStyleAttrib : function(e, n, v) {\r
+               e.style[n] = v;\r
+\r
+               // Style attrib deleted in IE\r
+               if (tinyMCE.isIE && v == null || v == '') {\r
+                       v = tinyMCE.serializeStyle(tinyMCE.parseStyle(e.style.cssText));\r
+                       e.style.cssText = v;\r
+                       e.setAttribute("style", v);\r
+               }\r
+       },\r
+\r
+       switchClass : function(ei, c) {\r
+               var e;\r
+\r
+               if (tinyMCE.switchClassCache[ei])\r
+                       e = tinyMCE.switchClassCache[ei];\r
+               else\r
+                       e = tinyMCE.switchClassCache[ei] = document.getElementById(ei);\r
+\r
+               if (e) {\r
+                       // Keep tile mode\r
+                       if (tinyMCE.settings.button_tile_map && e.className && e.className.indexOf('mceTiledButton') == 0)\r
+                               c = 'mceTiledButton ' + c;\r
+\r
+                       e.className = c;\r
+               }\r
+       },\r
+\r
+       getAbsPosition : function(n, cn) {\r
+               var l = 0, t = 0;\r
+\r
+               while (n && n != cn) {\r
+                       l += n.offsetLeft;\r
+                       t += n.offsetTop;\r
+                       n = n.offsetParent;\r
+               }\r
+\r
+               return {absLeft : l, absTop : t};\r
+       },\r
+\r
+       prevNode : function(e, n) {\r
+               var a = n.split(','), i;\r
+\r
+               while ((e = e.previousSibling) != null) {\r
+                       for (i=0; i<a.length; i++) {\r
+                               if (e.nodeName == a[i])\r
+                                       return e;\r
+                       }\r
+               }\r
+\r
+               return null;\r
+       },\r
+\r
+       nextNode : function(e, n) {\r
+               var a = n.split(','), i;\r
+\r
+               while ((e = e.nextSibling) != null) {\r
+                       for (i=0; i<a.length; i++) {\r
+                               if (e.nodeName == a[i])\r
+                                       return e;\r
+                       }\r
+               }\r
+\r
+               return null;\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
+       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
+       addCSSClass : function(e, c, b) {\r
+               var o = this.removeCSSClass(e, c);\r
+               return e.className = b ? c + (o !== '' ? (' ' + o) : '') : (o !== '' ? (o + ' ') : '') + c;\r
+       },\r
+\r
+       removeCSSClass : function(e, c) {\r
+               c = e.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' ');\r
+               return e.className = c != ' ' ? c : '';\r
+       },\r
+\r
+       hasCSSClass : function(n, c) {\r
+               return new RegExp('\\b' + c + '\\b', 'g').test(n.className);\r
+       },\r
+\r
+       renameElement : function(e, n, d) {\r
+               var ne, i, ar;\r
+\r
+               d = typeof(d) == "undefined" ? tinyMCE.selectedInstance.getDoc() : d;\r
+\r
+               if (e) {\r
+                       ne = d.createElement(n);\r
+\r
+                       ar = e.attributes;\r
+                       for (i=ar.length-1; i>-1; i--) {\r
+                               if (ar[i].specified && ar[i].nodeValue)\r
+                                       ne.setAttribute(ar[i].nodeName.toLowerCase(), ar[i].nodeValue);\r
+                       }\r
+\r
+                       ar = e.childNodes;\r
+                       for (i=0; i<ar.length; i++)\r
+                               ne.appendChild(ar[i].cloneNode(true));\r
+\r
+                       e.parentNode.replaceChild(ne, e);\r
+               }\r
+       },\r
+\r
+       getViewPort : function(w) {\r
+               var d = w.document, m = d.compatMode == 'CSS1Compat', b = d.body, de = d.documentElement;\r
+\r
+               return {\r
+                       left : w.pageXOffset || (m ? de.scrollLeft : b.scrollLeft),\r
+                       top : w.pageYOffset || (m ? de.scrollTop : b.scrollTop),\r
+                       width : w.innerWidth || (m ? de.clientWidth : b.clientWidth),\r
+                       height : w.innerHeight || (m ? de.clientHeight : b.clientHeight)\r
+               };\r
+       },\r
+\r
+       getStyle : function(n, na, d) {\r
+               if (!n)\r
+                       return false;\r
+\r
+               // Gecko\r
+               if (tinyMCE.isGecko && n.ownerDocument.defaultView) {\r
+                       try {\r
+                               return n.ownerDocument.defaultView.getComputedStyle(n, null).getPropertyValue(na);\r
+                       } catch (n) {\r
+                               // Old safari might fail\r
+                               return null;\r
+                       }\r
+               }\r
+\r
+               // Camelcase it, if needed\r
+               na = na.replace(/-(\D)/g, function(a, b){\r
+                       return b.toUpperCase();\r
+               });\r
+\r
+               // IE & Opera\r
+               if (n.currentStyle)\r
+                       return n.currentStyle[na];\r
+\r
+               return false;\r
+       }\r
+\r
+       });\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_URL.class.js */\r
+\r
+tinyMCE.add(TinyMCE_Engine, {\r
+       parseURL : function(url_str) {\r
+               var urlParts = [], i, pos, lastPos, chr;\r
+\r
+               if (url_str) {\r
+                       // Parse protocol part\r
+                       pos = url_str.indexOf('://');\r
+                       if (pos != -1) {\r
+                               urlParts.protocol = url_str.substring(0, pos);\r
+                               lastPos = pos + 3;\r
+                       }\r
+\r
+                       // Find port or path start\r
+                       for (i=lastPos; i<url_str.length; i++) {\r
+                               chr = url_str.charAt(i);\r
+\r
+                               if (chr == ':')\r
+                                       break;\r
+\r
+                               if (chr == '/')\r
+                                       break;\r
+                       }\r
+                       pos = i;\r
+\r
+                       // Get host\r
+                       urlParts.host = url_str.substring(lastPos, pos);\r
+\r
+                       // Get port\r
+                       urlParts.port = "";\r
+                       lastPos = pos;\r
+                       if (url_str.charAt(pos) == ':') {\r
+                               pos = url_str.indexOf('/', lastPos);\r
+                               urlParts.port = url_str.substring(lastPos+1, pos);\r
+                       }\r
+\r
+                       // Get path\r
+                       lastPos = pos;\r
+                       pos = url_str.indexOf('?', lastPos);\r
+\r
+                       if (pos == -1)\r
+                               pos = url_str.indexOf('#', lastPos);\r
+\r
+                       if (pos == -1)\r
+                               pos = url_str.length;\r
+\r
+                       urlParts.path = url_str.substring(lastPos, pos);\r
+\r
+                       // Get query\r
+                       lastPos = pos;\r
+                       if (url_str.charAt(pos) == '?') {\r
+                               pos = url_str.indexOf('#');\r
+                               pos = (pos == -1) ? url_str.length : pos;\r
+                               urlParts.query = url_str.substring(lastPos+1, pos);\r
+                       }\r
+\r
+                       // Get anchor\r
+                       lastPos = pos;\r
+                       if (url_str.charAt(pos) == '#') {\r
+                               pos = url_str.length;\r
+                               urlParts.anchor = url_str.substring(lastPos+1, pos);\r
+                       }\r
+               }\r
+\r
+               return urlParts;\r
+       },\r
+\r
+       serializeURL : function(up) {\r
+               var o = "";\r
+\r
+               if (up.protocol)\r
+                       o += up.protocol + "://";\r
+\r
+               if (up.host)\r
+                       o += up.host;\r
+\r
+               if (up.port)\r
+                       o += ":" + up.port;\r
+\r
+               if (up.path)\r
+                       o += up.path;\r
+\r
+               if (up.query)\r
+                       o += "?" + up.query;\r
+\r
+               if (up.anchor)\r
+                       o += "#" + up.anchor;\r
+\r
+               return o;\r
+       },\r
+\r
+       convertAbsoluteURLToRelativeURL : function(base_url, url_to_relative) {\r
+               var baseURL = this.parseURL(base_url), targetURL = this.parseURL(url_to_relative);\r
+               var i, strTok1, strTok2, breakPoint = 0, outPath = "", forceSlash = false;\r
+               var fileName, pos;\r
+\r
+               if (targetURL.path == '')\r
+                       targetURL.path = "/";\r
+               else\r
+                       forceSlash = true;\r
+\r
+               // Crop away last path part\r
+               base_url = baseURL.path.substring(0, baseURL.path.lastIndexOf('/'));\r
+               strTok1 = base_url.split('/');\r
+               strTok2 = targetURL.path.split('/');\r
+\r
+               if (strTok1.length >= strTok2.length) {\r
+                       for (i=0; i<strTok1.length; i++) {\r
+                               if (i >= strTok2.length || strTok1[i] != strTok2[i]) {\r
+                                       breakPoint = i + 1;\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (strTok1.length < strTok2.length) {\r
+                       for (i=0; i<strTok2.length; i++) {\r
+                               if (i >= strTok1.length || strTok1[i] != strTok2[i]) {\r
+                                       breakPoint = i + 1;\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (breakPoint == 1)\r
+                       return targetURL.path;\r
+\r
+               for (i=0; i<(strTok1.length-(breakPoint-1)); i++)\r
+                       outPath += "../";\r
+\r
+               for (i=breakPoint-1; i<strTok2.length; i++) {\r
+                       if (i != (breakPoint-1))\r
+                               outPath += "/" + strTok2[i];\r
+                       else\r
+                               outPath += strTok2[i];\r
+               }\r
+\r
+               targetURL.protocol = null;\r
+               targetURL.host = null;\r
+               targetURL.port = null;\r
+               targetURL.path = outPath == '' && forceSlash ? "/" : outPath;\r
+\r
+               // Remove document prefix from local anchors\r
+               fileName = baseURL.path;\r
+\r
+               if ((pos = fileName.lastIndexOf('/')) != -1)\r
+                       fileName = fileName.substring(pos + 1);\r
+\r
+               // Is local anchor\r
+               if (fileName == targetURL.path && targetURL.anchor !== '')\r
+                       targetURL.path = "";\r
+\r
+               // If empty and not local anchor force filename or slash\r
+               if (targetURL.path == '' && !targetURL.anchor)\r
+                       targetURL.path = fileName !== '' ? fileName : "/";\r
+\r
+               return this.serializeURL(targetURL);\r
+       },\r
+\r
+       convertRelativeToAbsoluteURL : function(base_url, relative_url) {\r
+               var baseURL = this.parseURL(base_url), baseURLParts, relURLParts, newRelURLParts, numBack, relURL = this.parseURL(relative_url), i;\r
+               var len, absPath, start, end, newBaseURLParts;\r
+\r
+               if (relative_url == '' || relative_url.indexOf('://') != -1 || /^(mailto:|javascript:|#|\/)/.test(relative_url))\r
+                       return relative_url;\r
+\r
+               // Split parts\r
+               baseURLParts = baseURL.path.split('/');\r
+               relURLParts = relURL.path.split('/');\r
+\r
+               // Remove empty chunks\r
+               newBaseURLParts = [];\r
+               for (i=baseURLParts.length-1; i>=0; i--) {\r
+                       if (baseURLParts[i].length == 0)\r
+                               continue;\r
+\r
+                       newBaseURLParts[newBaseURLParts.length] = baseURLParts[i];\r
+               }\r
+               baseURLParts = newBaseURLParts.reverse();\r
+\r
+               // Merge relURLParts chunks\r
+               newRelURLParts = [];\r
+               numBack = 0;\r
+               for (i=relURLParts.length-1; i>=0; i--) {\r
+                       if (relURLParts[i].length == 0 || relURLParts[i] == ".")\r
+                               continue;\r
+\r
+                       if (relURLParts[i] == '..') {\r
+                               numBack++;\r
+                               continue;\r
+                       }\r
+\r
+                       if (numBack > 0) {\r
+                               numBack--;\r
+                               continue;\r
+                       }\r
+\r
+                       newRelURLParts[newRelURLParts.length] = relURLParts[i];\r
+               }\r
+\r
+               relURLParts = newRelURLParts.reverse();\r
+\r
+               // Remove end from absolute path\r
+               len = baseURLParts.length-numBack;\r
+               absPath = (len <= 0 ? "" : "/") + baseURLParts.slice(0, len).join('/') + "/" + relURLParts.join('/');\r
+               start = "";\r
+               end = "";\r
+\r
+               // Build output URL\r
+               relURL.protocol = baseURL.protocol;\r
+               relURL.host = baseURL.host;\r
+               relURL.port = baseURL.port;\r
+\r
+               // Re-add trailing slash if it's removed\r
+               if (relURL.path.charAt(relURL.path.length-1) == "/")\r
+                       absPath += "/";\r
+\r
+               relURL.path = absPath;\r
+\r
+               return this.serializeURL(relURL);\r
+       },\r
+\r
+       convertURL : function(url, node, on_save) {\r
+               var dl = document.location, start, portPart, urlParts, baseUrlParts, tmpUrlParts, curl;\r
+               var prot = dl.protocol, host = dl.hostname, port = dl.port;\r
+\r
+               // Pass through file protocol\r
+               if (prot == "file:")\r
+                       return url;\r
+\r
+               // Something is wrong, remove weirdness\r
+               url = tinyMCE.regexpReplace(url, '(http|https):///', '/');\r
+\r
+               // Mailto link or anchor (Pass through)\r
+               if (url.indexOf('mailto:') != -1 || url.indexOf('javascript:') != -1 || /^[ \t\r\n\+]*[#\?]/.test(url))\r
+                       return url;\r
+\r
+               // Fix relative/Mozilla\r
+               if (!tinyMCE.isIE && !on_save && url.indexOf("://") == -1 && url.charAt(0) != '/')\r
+                       return tinyMCE.settings.base_href + url;\r
+\r
+               // Handle relative URLs\r
+               if (on_save && tinyMCE.getParam('relative_urls')) {\r
+                       curl = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, url);\r
+                       if (curl.charAt(0) == '/')\r
+                               curl = tinyMCE.settings.document_base_prefix + curl;\r
+\r
+                       urlParts = tinyMCE.parseURL(curl);\r
+                       tmpUrlParts = tinyMCE.parseURL(tinyMCE.settings.document_base_url);\r
+\r
+                       // Force relative\r
+                       if (urlParts.host == tmpUrlParts.host && (urlParts.port == tmpUrlParts.port))\r
+                               return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings.document_base_url, curl);\r
+               }\r
+\r
+               // Handle absolute URLs\r
+               if (!tinyMCE.getParam('relative_urls')) {\r
+                       urlParts = tinyMCE.parseURL(url);\r
+                       baseUrlParts = tinyMCE.parseURL(tinyMCE.settings.base_href);\r
+\r
+                       // Force absolute URLs from relative URLs\r
+                       url = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, url);\r
+\r
+                       // If anchor and path is the same page\r
+                       if (urlParts.anchor && urlParts.path == baseUrlParts.path)\r
+                               return "#" + urlParts.anchor;\r
+               }\r
+\r
+               // Remove current domain\r
+               if (tinyMCE.getParam('remove_script_host')) {\r
+                       start = "";\r
+                       portPart = "";\r
+\r
+                       if (port !== '')\r
+                               portPart = ":" + port;\r
+\r
+                       start = prot + "//" + host + portPart + "/";\r
+\r
+                       if (url.indexOf(start) == 0)\r
+                               url = url.substring(start.length-1);\r
+               }\r
+\r
+               return url;\r
+       },\r
+\r
+       convertAllRelativeURLs : function(body) {\r
+               var i, elms, src, href, mhref, msrc;\r
+\r
+               // Convert all image URL:s to absolute URL\r
+               elms = body.getElementsByTagName("img");\r
+               for (i=0; i<elms.length; i++) {\r
+                       src = tinyMCE.getAttrib(elms[i], 'src');\r
+\r
+                       msrc = tinyMCE.getAttrib(elms[i], 'mce_src');\r
+                       if (msrc !== '')\r
+                               src = msrc;\r
+\r
+                       if (src !== '') {\r
+                               src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, src);\r
+                               elms[i].setAttribute("src", src);\r
+                       }\r
+               }\r
+\r
+               // Convert all link URL:s to absolute URL\r
+               elms = body.getElementsByTagName("a");\r
+               for (i=0; i<elms.length; i++) {\r
+                       href = tinyMCE.getAttrib(elms[i], 'href');\r
+\r
+                       mhref = tinyMCE.getAttrib(elms[i], 'mce_href');\r
+                       if (mhref !== '')\r
+                               href = mhref;\r
+\r
+                       if (href && href !== '') {\r
+                               href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, href);\r
+                               elms[i].setAttribute("href", href);\r
+                       }\r
+               }\r
+       }\r
+\r
+       });\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Array.class.js */\r
+\r
+tinyMCE.add(TinyMCE_Engine, {\r
+       clearArray : function(a) {\r
+               var n;\r
+\r
+               for (n in a)\r
+                       a[n] = null;\r
+\r
+               return a;\r
+       },\r
+\r
+       explode : function(d, s) {\r
+               var ar = s.split(d), oar = [], i;\r
+\r
+               for (i = 0; i<ar.length; i++) {\r
+                       if (ar[i] !== '')\r
+                               oar[oar.length] = ar[i];\r
+               }\r
+\r
+               return oar;\r
+       }\r
+});\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Event.class.js */\r
+\r
+tinyMCE.add(TinyMCE_Engine, {\r
+       _setEventsEnabled : function(node, state) {\r
+               var evs, x, y, elms, i, event;\r
+               var events = ['onfocus','onblur','onclick','ondblclick',\r
+                                       'onmousedown','onmouseup','onmouseover','onmousemove',\r
+                                       'onmouseout','onkeypress','onkeydown','onkeydown','onkeyup'];\r
+\r
+               evs = tinyMCE.settings.event_elements.split(',');\r
+               for (y=0; y<evs.length; y++){\r
+                       elms = node.getElementsByTagName(evs[y]);\r
+                       for (i=0; i<elms.length; i++) {\r
+                               event = "";\r
+\r
+                               for (x=0; x<events.length; x++) {\r
+                                       if ((event = tinyMCE.getAttrib(elms[i], events[x])) !== '') {\r
+                                               event = tinyMCE.cleanupEventStr("" + event);\r
+\r
+                                               if (!state)\r
+                                                       event = "return true;" + event;\r
+                                               else\r
+                                                       event = event.replace(/^return true;/gi, '');\r
+\r
+                                               elms[i].removeAttribute(events[x]);\r
+                                               elms[i].setAttribute(events[x], event);\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       },\r
+\r
+       _eventPatch : function(editor_id) {\r
+               var n, inst, win, e;\r
+\r
+               // Remove odd, error\r
+               if (typeof(tinyMCE) == "undefined")\r
+                       return true;\r
+\r
+               try {\r
+                       // Try selected instance first\r
+                       if (tinyMCE.selectedInstance) {\r
+                               win = tinyMCE.selectedInstance.getWin();\r
+\r
+                               if (win && win.event) {\r
+                                       e = win.event;\r
+\r
+                                       if (!e.target)\r
+                                               e.target = e.srcElement;\r
+\r
+                                       TinyMCE_Engine.prototype.handleEvent(e);\r
+                                       return;\r
+                               }\r
+                       }\r
+\r
+                       // Search for it\r
+                       for (n in tinyMCE.instances) {\r
+                               inst = tinyMCE.instances[n];\r
+\r
+                               if (!tinyMCE.isInstance(inst))\r
+                                       continue;\r
+\r
+                               inst.select();\r
+                               win = inst.getWin();\r
+\r
+                               if (win && win.event) {\r
+                                       e = win.event;\r
+\r
+                                       if (!e.target)\r
+                                               e.target = e.srcElement;\r
+\r
+                                       TinyMCE_Engine.prototype.handleEvent(e);\r
+                                       return;\r
+                               }\r
+                       }\r
+               } catch (ex) {\r
+                       // Ignore error if iframe is pointing to external URL\r
+               }\r
+       },\r
+\r
+       findEvent : function(e) {\r
+               var n, inst;\r
+\r
+               if (e)\r
+                       return e;\r
+\r
+               for (n in tinyMCE.instances) {\r
+                       inst = tinyMCE.instances[n];\r
+\r
+                       if (tinyMCE.isInstance(inst) && inst.getWin().event)\r
+                               return inst.getWin().event;\r
+               }\r
+\r
+               return null;\r
+       },\r
+\r
+       unloadHandler : function() {\r
+               tinyMCE.triggerSave(true, true);\r
+       },\r
+\r
+       addEventHandlers : function(inst) {\r
+               this.setEventHandlers(inst, 1);\r
+       },\r
+\r
+       setEventHandlers : function(inst, s) {\r
+               var doc = inst.getDoc(), ie, ot, i, f = s ? tinyMCE.addEvent : tinyMCE.removeEvent;\r
+\r
+               ie = ['keypress', 'keyup', 'keydown', 'click', 'mouseup', 'mousedown', 'controlselect', 'dblclick'];\r
+               ot = ['keypress', 'keyup', 'keydown', 'click', 'mouseup', 'mousedown', 'focus', 'blur', 'dragdrop'];\r
+\r
+               inst.switchSettings();\r
+\r
+               if (tinyMCE.isIE) {\r
+                       for (i=0; i<ie.length; i++)\r
+                               f(doc, ie[i], TinyMCE_Engine.prototype._eventPatch);\r
+               } else {\r
+                       for (i=0; i<ot.length; i++)\r
+                               f(doc, ot[i], tinyMCE.handleEvent);\r
+\r
+                       // Force designmode\r
+                       try {\r
+                               doc.designMode = "On";\r
+                       } catch (e) {\r
+                               // Ignore\r
+                       }\r
+               }\r
+       },\r
+\r
+       onMouseMove : function() {\r
+               var inst, lh;\r
+\r
+               // Fix for IE7 bug where it's not restoring hover on anchors correctly\r
+               if (tinyMCE.lastHover) {\r
+                       lh = tinyMCE.lastHover;\r
+\r
+                       // Call out on menus and refresh class on normal buttons\r
+                       if (lh.className.indexOf('mceMenu') != -1)\r
+                               tinyMCE._menuButtonEvent('out', lh);\r
+                       else\r
+                               lh.className = lh.className;\r
+\r
+                       tinyMCE.lastHover = null;\r
+               }\r
+\r
+               if (!tinyMCE.hasMouseMoved) {\r
+                       inst = tinyMCE.selectedInstance;\r
+\r
+                       // Workaround for bug #1437457 (Odd MSIE bug)\r
+                       if (inst.isFocused) {\r
+                               inst.undoBookmark = inst.selection.getBookmark();\r
+                               tinyMCE.hasMouseMoved = true;\r
+                       }\r
+               }\r
+\r
+       //      tinyMCE.cancelEvent(inst.getWin().event);\r
+       //      return false;\r
+       },\r
+\r
+       cancelEvent : function(e) {\r
+               if (!e)\r
+                       return false;\r
+\r
+               if (tinyMCE.isIE) {\r
+                       e.returnValue = false;\r
+                       e.cancelBubble = true;\r
+               } else {\r
+                       e.preventDefault();\r
+                       e.stopPropagation && e.stopPropagation();\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       addEvent : function(o, n, h) {\r
+               // Add cleanup for all non unload events\r
+               if (n != 'unload') {\r
+                       function clean() {\r
+                               var ex;\r
+\r
+                               try {\r
+                                       tinyMCE.removeEvent(o, n, h);\r
+                                       tinyMCE.removeEvent(window, 'unload', clean);\r
+                                       o = n = h = null;\r
+                               } catch (ex) {\r
+                                       // IE may produce access denied exception on unload\r
+                               }\r
+                       }\r
+\r
+                       // Add memory cleaner\r
+                       tinyMCE.addEvent(window, 'unload', clean);\r
+               }\r
+\r
+               if (o.attachEvent)\r
+                       o.attachEvent("on" + n, h);\r
+               else\r
+                       o.addEventListener(n, h, false);\r
+       },\r
+\r
+       removeEvent : function(o, n, h) {\r
+               if (o.detachEvent)\r
+                       o.detachEvent("on" + n, h);\r
+               else\r
+                       o.removeEventListener(n, h, false);\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
+       _resetIframeHeight : function() {\r
+               var ife;\r
+\r
+               if (tinyMCE.isRealIE) {\r
+                       ife = tinyMCE.selectedInstance.iframeElement;\r
+\r
+       /*              if (ife._oldWidth) {\r
+                               ife.style.width = ife._oldWidth;\r
+                               ife.width = ife._oldWidth;\r
+                       }*/\r
+\r
+                       if (ife._oldHeight) {\r
+                               ife.style.height = ife._oldHeight;\r
+                               ife.height = ife._oldHeight;\r
+                       }\r
+               }\r
+       }\r
+\r
+       });\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Selection.class.js */\r
+\r
+function TinyMCE_Selection(inst) {\r
+       this.instance = inst;\r
+};\r
+\r
+TinyMCE_Selection.prototype = {\r
+       getSelectedHTML : function() {\r
+               var inst = this.instance, e, r = this.getRng(), h;\r
+\r
+               if (!r)\r
+                       return null;\r
+\r
+               e = document.createElement("body");\r
+\r
+               if (r.cloneContents)\r
+                       e.appendChild(r.cloneContents());\r
+               else if (typeof(r.item) != 'undefined' || typeof(r.htmlText) != 'undefined')\r
+                       e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText;\r
+               else\r
+                       e.innerHTML = r.toString(); // Failed, use text for now\r
+\r
+               h = tinyMCE._cleanupHTML(inst, inst.contentDocument, inst.settings, e, e, false, true, false);\r
+\r
+               // When editing always use fonts internaly\r
+               //if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+               //      tinyMCE.convertSpansToFonts(inst.getDoc());\r
+\r
+               return h;\r
+       },\r
+\r
+       getSelectedText : function() {\r
+               var inst = this.instance, d, r, s, t;\r
+\r
+               if (tinyMCE.isIE) {\r
+                       d = inst.getDoc();\r
+\r
+                       if (d.selection.type == "Text") {\r
+                               r = d.selection.createRange();\r
+                               t = r.text;\r
+                       } else\r
+                               t = '';\r
+               } else {\r
+                       s = this.getSel();\r
+\r
+                       if (s && s.toString)\r
+                               t = s.toString();\r
+                       else\r
+                               t = '';\r
+               }\r
+\r
+               return t;\r
+       },\r
+\r
+       getBookmark : function(simple) {\r
+               var inst = this.instance, rng = this.getRng(), doc = inst.getDoc(), b = inst.getBody();\r
+               var trng, sx, sy, xx = -999999999, vp = inst.getViewPort();\r
+               var sp, le, s, e, nl, i, si, ei, w;\r
+\r
+               sx = vp.left;\r
+               sy = vp.top;\r
+\r
+               if (simple)\r
+                       return {rng : rng, scrollX : sx, scrollY : sy};\r
+\r
+               if (tinyMCE.isRealIE) {\r
+                       if (rng.item) {\r
+                               e = rng.item(0);\r
+\r
+                               nl = b.getElementsByTagName(e.nodeName);\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       if (e == nl[i]) {\r
+                                               sp = i;\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               return {\r
+                                       tag : e.nodeName,\r
+                                       index : sp,\r
+                                       scrollX : sx,\r
+                                       scrollY : sy\r
+                               };\r
+                       } else {\r
+                               trng = doc.body.createTextRange();\r
+                               trng.moveToElementText(inst.getBody());\r
+                               trng.collapse(true);\r
+                               bp = Math.abs(trng.move('character', xx));\r
+\r
+                               trng = rng.duplicate();\r
+                               trng.collapse(true);\r
+                               sp = Math.abs(trng.move('character', xx));\r
+\r
+                               trng = rng.duplicate();\r
+                               trng.collapse(false);\r
+                               le = Math.abs(trng.move('character', xx)) - sp;\r
+\r
+                               return {\r
+                                       start : sp - bp,\r
+                                       length : le,\r
+                                       scrollX : sx,\r
+                                       scrollY : sy\r
+                               };\r
+                       }\r
+               } else {\r
+                       s = this.getSel();\r
+                       e = this.getFocusElement();\r
+\r
+                       if (!s)\r
+                               return null;\r
+\r
+                       if (e && e.nodeName == 'IMG') {\r
+                               /*nl = b.getElementsByTagName('IMG');\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       if (e == nl[i]) {\r
+                                               sp = i;\r
+                                               break;\r
+                                       }\r
+                               }*/\r
+\r
+                               return {\r
+                                       start : -1,\r
+                                       end : -1,\r
+                                       index : sp,\r
+                                       scrollX : sx,\r
+                                       scrollY : sy\r
+                               };\r
+                       }\r
+\r
+                       // Caret or selection\r
+                       if (s.anchorNode == s.focusNode && s.anchorOffset == s.focusOffset) {\r
+                               e = this._getPosText(b, s.anchorNode, s.focusNode);\r
+\r
+                               if (!e)\r
+                                       return {scrollX : sx, scrollY : sy};\r
+\r
+                               return {\r
+                                       start : e.start + s.anchorOffset,\r
+                                       end : e.end + s.focusOffset,\r
+                                       scrollX : sx,\r
+                                       scrollY : sy\r
+                               };\r
+                       } else {\r
+                               e = this._getPosText(b, rng.startContainer, rng.endContainer);\r
+\r
+                               if (!e)\r
+                                       return {scrollX : sx, scrollY : sy};\r
+\r
+                               return {\r
+                                       start : e.start + rng.startOffset,\r
+                                       end : e.end + rng.endOffset,\r
+                                       scrollX : sx,\r
+                                       scrollY : sy\r
+                               };\r
+                       }\r
+               }\r
+\r
+               return null;\r
+       },\r
+\r
+       moveToBookmark : function(bookmark) {\r
+               var inst = this.instance, rng, nl, i, ex, b = inst.getBody(), sd;\r
+               var doc = inst.getDoc(), win = inst.getWin(), sel = this.getSel();\r
+\r
+               if (!bookmark)\r
+                       return false;\r
+\r
+               if (tinyMCE.isSafari && bookmark.rng) {\r
+                       sel.setBaseAndExtent(bookmark.rng.startContainer, bookmark.rng.startOffset, bookmark.rng.endContainer, bookmark.rng.endOffset);\r
+                       return true;\r
+               }\r
+\r
+               if (tinyMCE.isRealIE) {\r
+                       if (bookmark.rng) {\r
+                               try {\r
+                                       bookmark.rng.select();\r
+                               } catch (ex) {\r
+                                       // Ignore\r
+                               }\r
+\r
+                               return true;\r
+                       }\r
+\r
+                       win.focus();\r
+\r
+                       if (bookmark.tag) {\r
+                               rng = b.createControlRange();\r
+\r
+                               nl = b.getElementsByTagName(bookmark.tag);\r
+\r
+                               if (nl.length > bookmark.index) {\r
+                                       try {\r
+                                               rng.addElement(nl[bookmark.index]);\r
+                                       } catch (ex) {\r
+                                               // Might be thrown if the node no longer exists\r
+                                       }\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 (bookmark.start < 0)\r
+                                               return true;\r
+\r
+                                       rng = inst.getSel().createRange();\r
+                                       rng.moveToElementText(inst.getBody());\r
+                                       rng.collapse(true);\r
+                                       rng.moveStart('character', bookmark.start);\r
+                                       rng.moveEnd('character', bookmark.length);\r
+                               } catch (ex) {\r
+                                       return true;\r
+                               }\r
+                       }\r
+\r
+                       rng.select();\r
+\r
+                       win.scrollTo(bookmark.scrollX, bookmark.scrollY);\r
+                       return true;\r
+               }\r
+\r
+               if (tinyMCE.isGecko || tinyMCE.isOpera) {\r
+                       if (!sel)\r
+                               return false;\r
+\r
+                       if (bookmark.rng) {\r
+                               sel.removeAllRanges();\r
+                               sel.addRange(bookmark.rng);\r
+                       }\r
+\r
+                       if (bookmark.start != -1 && bookmark.end != -1) {\r
+                               try {\r
+                                       sd = this._getTextPos(b, bookmark.start, bookmark.end);\r
+                                       rng = doc.createRange();\r
+                                       rng.setStart(sd.startNode, sd.startOffset);\r
+                                       rng.setEnd(sd.endNode, sd.endOffset);\r
+                                       sel.removeAllRanges();\r
+                                       sel.addRange(rng);\r
+\r
+                                       if (!tinyMCE.isOpera)\r
+                                               win.focus();\r
+                               } catch (ex) {\r
+                                       // Ignore\r
+                               }\r
+                       }\r
+\r
+                       /*\r
+                       if (typeof(bookmark.index) != 'undefined') {\r
+                               tinyMCE.selectElements(b, 'IMG', function (n) {\r
+                                       if (bookmark.index-- == 0) {\r
+                                               // Select image in Gecko here\r
+                                       }\r
+\r
+                                       return false;\r
+                               });\r
+                       }\r
+                       */\r
+\r
+                       win.scrollTo(bookmark.scrollX, bookmark.scrollY);\r
+                       return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       _getPosText : function(r, sn, en) {\r
+               var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {};\r
+\r
+               while ((n = w.nextNode()) != null) {\r
+                       if (n == sn)\r
+                               d.start = p;\r
+\r
+                       if (n == en) {\r
+                               d.end = p;\r
+                               return d;\r
+                       }\r
+\r
+                       p += n.nodeValue ? n.nodeValue.length : 0;\r
+               }\r
+\r
+               return null;\r
+       },\r
+\r
+       _getTextPos : function(r, sp, ep) {\r
+               var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {};\r
+\r
+               while ((n = w.nextNode()) != null) {\r
+                       p += n.nodeValue ? n.nodeValue.length : 0;\r
+\r
+                       if (p >= sp && !d.startNode) {\r
+                               d.startNode = n;\r
+                               d.startOffset = sp - (p - n.nodeValue.length);\r
+                       }\r
+\r
+                       if (p >= ep) {\r
+                               d.endNode = n;\r
+                               d.endOffset = ep - (p - n.nodeValue.length);\r
+\r
+                               return d;\r
+                       }\r
+               }\r
+\r
+               return null;\r
+       },\r
+\r
+       selectNode : function(node, collapse, select_text_node, to_start) {\r
+               var inst = this.instance, sel, rng, nodes;\r
+\r
+               if (!node)\r
+                       return;\r
+\r
+               if (typeof(collapse) == "undefined")\r
+                       collapse = true;\r
+\r
+               if (typeof(select_text_node) == "undefined")\r
+                       select_text_node = false;\r
+\r
+               if (typeof(to_start) == "undefined")\r
+                       to_start = true;\r
+\r
+               if (inst.settings.auto_resize)\r
+                       inst.resizeToContent();\r
+\r
+               if (tinyMCE.isRealIE) {\r
+                       rng = inst.getDoc().body.createTextRange();\r
+\r
+                       try {\r
+                               rng.moveToElementText(node);\r
+\r
+                               if (collapse)\r
+                                       rng.collapse(to_start);\r
+\r
+                               rng.select();\r
+                       } catch (e) {\r
+                               // Throws illigal agrument in MSIE some times\r
+                       }\r
+               } else {\r
+                       sel = this.getSel();\r
+\r
+                       if (!sel)\r
+                               return;\r
+\r
+                       if (tinyMCE.isSafari) {\r
+                               sel.setBaseAndExtent(node, 0, node, node.innerText.length);\r
+\r
+                               if (collapse) {\r
+                                       if (to_start)\r
+                                               sel.collapseToStart();\r
+                                       else\r
+                                               sel.collapseToEnd();\r
+                               }\r
+\r
+                               this.scrollToNode(node);\r
+\r
+                               return;\r
+                       }\r
+\r
+                       rng = inst.getDoc().createRange();\r
+\r
+                       if (select_text_node) {\r
+                               // Find first textnode in tree\r
+                               nodes = tinyMCE.getNodeTree(node, [], 3);\r
+                               if (nodes.length > 0)\r
+                                       rng.selectNodeContents(nodes[0]);\r
+                               else\r
+                                       rng.selectNodeContents(node);\r
+                       } else\r
+                               rng.selectNode(node);\r
+\r
+                       if (collapse) {\r
+                               // Special treatment of textnode collapse\r
+                               if (!to_start && node.nodeType == 3) {\r
+                                       rng.setStart(node, node.nodeValue.length);\r
+                                       rng.setEnd(node, node.nodeValue.length);\r
+                               } else\r
+                                       rng.collapse(to_start);\r
+                       }\r
+\r
+                       sel.removeAllRanges();\r
+                       sel.addRange(rng);\r
+               }\r
+\r
+               this.scrollToNode(node);\r
+\r
+               // Set selected element\r
+               tinyMCE.selectedElement = null;\r
+               if (node.nodeType == 1)\r
+                       tinyMCE.selectedElement = node;\r
+       },\r
+\r
+       scrollToNode : function(node) {\r
+               var inst = this.instance, w = inst.getWin(), vp = inst.getViewPort(), pos = tinyMCE.getAbsPosition(node), cvp, p, cwin;\r
+\r
+               // Only scroll if out of visible area\r
+               if (pos.absLeft < vp.left || pos.absLeft > vp.left + vp.width || pos.absTop < vp.top || pos.absTop > vp.top + (vp.height-25))\r
+                       w.scrollTo(pos.absLeft, pos.absTop - vp.height + 25);\r
+\r
+               // Scroll container window\r
+               if (inst.settings.auto_resize) {\r
+                       cwin = inst.getContainerWin();\r
+                       cvp = tinyMCE.getViewPort(cwin);\r
+                       p = this.getAbsPosition(node);\r
+\r
+                       if (p.absLeft < cvp.left || p.absLeft > cvp.left + cvp.width || p.absTop < cvp.top || p.absTop > cvp.top + cvp.height)\r
+                               cwin.scrollTo(p.absLeft, p.absTop - cvp.height + 25);\r
+               }\r
+       },\r
+\r
+       getAbsPosition : function(n) {\r
+               var pos = tinyMCE.getAbsPosition(n), ipos = tinyMCE.getAbsPosition(this.instance.iframeElement);\r
+\r
+               return {\r
+                       absLeft : ipos.absLeft + pos.absLeft,\r
+                       absTop : ipos.absTop + pos.absTop\r
+               };\r
+       },\r
+\r
+       getSel : function() {\r
+               var inst = this.instance;\r
+\r
+               if (tinyMCE.isRealIE)\r
+                       return inst.getDoc().selection;\r
+\r
+               return inst.contentWindow.getSelection();\r
+       },\r
+\r
+       getRng : function() {\r
+               var s = this.getSel();\r
+\r
+               if (s == null)\r
+                       return null;\r
+\r
+               if (tinyMCE.isRealIE)\r
+                       return s.createRange();\r
+\r
+               if (tinyMCE.isSafari && !s.getRangeAt)\r
+                       return '' + window.getSelection();\r
+\r
+               if (s.rangeCount > 0)\r
+                       return s.getRangeAt(0);\r
+\r
+               return null;\r
+       },\r
+\r
+       isCollapsed : function() {\r
+               var r = this.getRng();\r
+\r
+               if (r.item)\r
+                       return false;\r
+\r
+               return r.boundingWidth == 0 || this.getSel().isCollapsed;\r
+       },\r
+\r
+       collapse : function(b) {\r
+               var r = this.getRng(), s = this.getSel();\r
+\r
+               if (r.select) {\r
+                       r.collapse(b);\r
+                       r.select();\r
+               } else {\r
+                       if (b)\r
+                               s.collapseToStart();\r
+                       else\r
+                               s.collapseToEnd();\r
+               }\r
+       },\r
+\r
+       getFocusElement : function() {\r
+               var inst = this.instance, doc, rng, sel, elm;\r
+\r
+               if (tinyMCE.isRealIE) {\r
+                       doc = inst.getDoc();\r
+                       rng = doc.selection.createRange();\r
+\r
+       //              if (rng.collapse)\r
+       //                      rng.collapse(true);\r
+\r
+                       elm = rng.item ? rng.item(0) : rng.parentElement();\r
+               } else {\r
+                       if (!tinyMCE.isSafari && inst.isHidden())\r
+                               return inst.getBody();\r
+\r
+                       sel = this.getSel();\r
+                       rng = this.getRng();\r
+\r
+                       if (!sel || !rng)\r
+                               return null;\r
+\r
+                       elm = rng.commonAncestorContainer;\r
+                       //elm = (sel && sel.anchorNode) ? sel.anchorNode : null;\r
+\r
+                       // Handle selection a image or other control like element such as anchors\r
+                       if (!rng.collapsed) {\r
+                               // Is selection small\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
+\r
+                       // Get the element parent of the node\r
+                       elm = tinyMCE.getParentElement(elm);\r
+\r
+                       //if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img")\r
+                       //      elm = tinyMCE.selectedElement;\r
+               }\r
+\r
+               return elm;\r
+       }\r
+\r
+       };\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_UndoRedo.class.js */\r
+\r
+function TinyMCE_UndoRedo(inst) {\r
+       this.instance = inst;\r
+       this.undoLevels = [];\r
+       this.undoIndex = 0;\r
+       this.typingUndoIndex = -1;\r
+       this.undoRedo = true;\r
+};\r
+\r
+TinyMCE_UndoRedo.prototype = {\r
+       add : function(l) {\r
+               var b, customUndoLevels, newHTML, inst = this.instance, i, ul, ur;\r
+\r
+               if (l) {\r
+                       this.undoLevels[this.undoLevels.length] = l;\r
+                       return true;\r
+               }\r
+\r
+               if (this.typingUndoIndex != -1) {\r
+                       this.undoIndex = this.typingUndoIndex;\r
+\r
+                       if (tinyMCE.typingUndoIndex != -1)\r
+                               tinyMCE.undoIndex = tinyMCE.typingUndoIndex;\r
+               }\r
+\r
+               newHTML = tinyMCE.trim(inst.getBody().innerHTML);\r
+               if (this.undoLevels[this.undoIndex] && newHTML != this.undoLevels[this.undoIndex].content) {\r
+                       //tinyMCE.debug(newHTML, this.undoLevels[this.undoIndex].content);\r
+\r
+                       // Is dirty again\r
+                       inst.isNotDirty = false;\r
+\r
+                       tinyMCE.dispatchCallback(inst, 'onchange_callback', 'onChange', inst);\r
+\r
+                       // Time to compress\r
+                       customUndoLevels = tinyMCE.settings.custom_undo_redo_levels;\r
+                       if (customUndoLevels != -1 && this.undoLevels.length > customUndoLevels) {\r
+                               for (i=0; i<this.undoLevels.length-1; i++)\r
+                                       this.undoLevels[i] = this.undoLevels[i+1];\r
+\r
+                               this.undoLevels.length--;\r
+                               this.undoIndex--;\r
+\r
+                               // Todo: Implement global undo/redo logic here\r
+                       }\r
+\r
+                       b = inst.undoBookmark;\r
+\r
+                       if (!b)\r
+                               b = inst.selection.getBookmark();\r
+\r
+                       this.undoIndex++;\r
+                       this.undoLevels[this.undoIndex] = {\r
+                               content : newHTML,\r
+                               bookmark : b\r
+                       };\r
+\r
+                       // Remove all above from global undo/redo\r
+                       ul = tinyMCE.undoLevels;\r
+                       for (i=tinyMCE.undoIndex + 1; i<ul.length; i++) {\r
+                               ur = ul[i].undoRedo;\r
+\r
+                               if (ur.undoIndex == ur.undoLevels.length -1)\r
+                                       ur.undoIndex--;\r
+\r
+                               ur.undoLevels.length--;\r
+                       }\r
+\r
+                       // Add global undo level\r
+                       tinyMCE.undoLevels[tinyMCE.undoIndex++] = inst;\r
+                       tinyMCE.undoLevels.length = tinyMCE.undoIndex;\r
+\r
+                       this.undoLevels.length = this.undoIndex + 1;\r
+\r
+                       return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       undo : function() {\r
+               var inst = this.instance;\r
+\r
+               // Do undo\r
+               if (this.undoIndex > 0) {\r
+                       this.undoIndex--;\r
+\r
+                       tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content);\r
+                       inst.repaint();\r
+\r
+                       if (inst.settings.custom_undo_redo_restore_selection)\r
+                               inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark);\r
+               }\r
+       },\r
+\r
+       redo : function() {\r
+               var inst = this.instance;\r
+\r
+               tinyMCE.execCommand("mceEndTyping");\r
+\r
+               if (this.undoIndex < (this.undoLevels.length-1)) {\r
+                       this.undoIndex++;\r
+\r
+                       tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content);\r
+                       inst.repaint();\r
+\r
+                       if (inst.settings.custom_undo_redo_restore_selection)\r
+                               inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark);\r
+               }\r
+\r
+               tinyMCE.triggerNodeChange();\r
+       }\r
+\r
+       };\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_ForceParagraphs.class.js */\r
+\r
+var TinyMCE_ForceParagraphs = {\r
+       _insertPara : function(inst, e) {\r
+               var doc = inst.getDoc(), sel = inst.getSel(), body = inst.getBody(), win = inst.contentWindow, rng = sel.getRangeAt(0);\r
+               var rootElm = doc.documentElement, blockName = "P", startNode, endNode, startBlock, endBlock;\r
+               var rngBefore, rngAfter, direct, startNode, startOffset, endNode, endOffset, b = tinyMCE.isOpera ? inst.selection.getBookmark() : null;\r
+               var paraBefore, paraAfter, startChop, endChop, contents, i;\r
+\r
+               function isEmpty(para) {\r
+                       var nodes;\r
+\r
+                       function isEmptyHTML(html) {\r
+                               return html.replace(new RegExp('[ \t\r\n]+', 'g'), '').toLowerCase() == '';\r
+                       }\r
+\r
+                       // Check for images\r
+                       if (para.getElementsByTagName("img").length > 0)\r
+                               return false;\r
+\r
+                       // Check for tables\r
+                       if (para.getElementsByTagName("table").length > 0)\r
+                               return false;\r
+\r
+                       // Check for HRs\r
+                       if (para.getElementsByTagName("hr").length > 0)\r
+                               return false;\r
+\r
+                       // Check all textnodes\r
+                       nodes = tinyMCE.getNodeTree(para, [], 3);\r
+                       for (i=0; i<nodes.length; i++) {\r
+                               if (!isEmptyHTML(nodes[i].nodeValue))\r
+                                       return false;\r
+                       }\r
+\r
+                       // No images, no tables, no hrs, no text content then it's empty\r
+                       return true;\r
+               }\r
+\r
+       //      tinyMCE.debug(body.innerHTML);\r
+\r
+       //      debug(e.target, sel.anchorNode.nodeName, sel.focusNode.nodeName, rng.startContainer, rng.endContainer, rng.commonAncestorContainer, sel.anchorOffset, sel.focusOffset, rng.toString());\r
+\r
+               // Setup before range\r
+               rngBefore = doc.createRange();\r
+               rngBefore.setStart(sel.anchorNode, sel.anchorOffset);\r
+               rngBefore.collapse(true);\r
+\r
+               // Setup after range\r
+               rngAfter = doc.createRange();\r
+               rngAfter.setStart(sel.focusNode, sel.focusOffset);\r
+               rngAfter.collapse(true);\r
+\r
+               // Setup start/end points\r
+               direct = rngBefore.compareBoundaryPoints(rngBefore.START_TO_END, rngAfter) < 0;\r
+               startNode = direct ? sel.anchorNode : sel.focusNode;\r
+               startOffset = direct ? sel.anchorOffset : sel.focusOffset;\r
+               endNode = direct ? sel.focusNode : sel.anchorNode;\r
+               endOffset = direct ? sel.focusOffset : sel.anchorOffset;\r
+\r
+               startNode = startNode.nodeName == "BODY" ? startNode.firstChild : startNode;\r
+               endNode = endNode.nodeName == "BODY" ? endNode.firstChild : endNode;\r
+\r
+               // Get block elements\r
+               startBlock = inst.getParentBlockElement(startNode);\r
+               endBlock = inst.getParentBlockElement(endNode);\r
+\r
+               // If absolute force paragraph generation within\r
+               if (startBlock && (startBlock.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(startBlock.style.position)))\r
+                       startBlock = null;\r
+\r
+               if (endBlock && (endBlock.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(endBlock.style.position)))\r
+                       endBlock = null;\r
+\r
+               // Use current block name\r
+               if (startBlock != null) {\r
+                       blockName = startBlock.nodeName;\r
+\r
+                       // Use P instead\r
+                       if (/(TD|TABLE|TH|CAPTION)/.test(blockName) || (blockName == "DIV" && /left|right/gi.test(startBlock.style.cssFloat)))\r
+                               blockName = "P";\r
+               }\r
+\r
+               // Within a list use normal behaviour\r
+               if (tinyMCE.getParentElement(startBlock, "OL,UL", null, body) != null)\r
+                       return false;\r
+\r
+               // Within a table create new paragraphs\r
+               if ((startBlock != null && startBlock.nodeName == "TABLE") || (endBlock != null && endBlock.nodeName == "TABLE"))\r
+                       startBlock = endBlock = null;\r
+\r
+               // Setup new paragraphs\r
+               paraBefore = (startBlock != null && startBlock.nodeName == blockName) ? startBlock.cloneNode(false) : doc.createElement(blockName);\r
+               paraAfter = (endBlock != null && endBlock.nodeName == blockName) ? endBlock.cloneNode(false) : doc.createElement(blockName);\r
+\r
+               // Is header, then force paragraph under\r
+               if (/^(H[1-6])$/.test(blockName))\r
+                       paraAfter = doc.createElement("p");\r
+\r
+               // Setup chop nodes\r
+               startChop = startNode;\r
+               endChop = endNode;\r
+\r
+               // Get startChop node\r
+               node = startChop;\r
+               do {\r
+                       if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))\r
+                               break;\r
+\r
+                       startChop = node;\r
+               } while ((node = node.previousSibling ? node.previousSibling : node.parentNode));\r
+\r
+               // Get endChop node\r
+               node = endChop;\r
+               do {\r
+                       if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))\r
+                               break;\r
+\r
+                       endChop = node;\r
+               } while ((node = node.nextSibling ? node.nextSibling : node.parentNode));\r
+\r
+               // Fix when only a image is within the TD\r
+               if (startChop.nodeName == "TD")\r
+                       startChop = startChop.firstChild;\r
+\r
+               if (endChop.nodeName == "TD")\r
+                       endChop = endChop.lastChild;\r
+\r
+               // If not in a block element\r
+               if (startBlock == null) {\r
+                       // Delete selection\r
+                       rng.deleteContents();\r
+\r
+                       if (!tinyMCE.isSafari)\r
+                               sel.removeAllRanges();\r
+\r
+                       if (startChop != rootElm && endChop != rootElm) {\r
+                               // Insert paragraph before\r
+                               rngBefore = rng.cloneRange();\r
+\r
+                               if (startChop == body)\r
+                                       rngBefore.setStart(startChop, 0);\r
+                               else\r
+                                       rngBefore.setStartBefore(startChop);\r
+\r
+                               paraBefore.appendChild(rngBefore.cloneContents());\r
+\r
+                               // Insert paragraph after\r
+                               if (endChop.parentNode.nodeName == blockName)\r
+                                       endChop = endChop.parentNode;\r
+\r
+                               // If not after image\r
+                               //if (rng.startContainer.nodeName != "BODY" && rng.endContainer.nodeName != "BODY")\r
+                                       rng.setEndAfter(endChop);\r
+\r
+                               if (endChop.nodeName != "#text" && endChop.nodeName != "BODY")\r
+                                       rngBefore.setEndAfter(endChop);\r
+\r
+                               contents = rng.cloneContents();\r
+                               if (contents.firstChild && (contents.firstChild.nodeName == blockName || contents.firstChild.nodeName == "BODY"))\r
+                                       paraAfter.innerHTML = contents.firstChild.innerHTML;\r
+                               else\r
+                                       paraAfter.appendChild(contents);\r
+\r
+                               // Check if it's a empty paragraph\r
+                               if (isEmpty(paraBefore))\r
+                                       paraBefore.innerHTML = "&nbsp;";\r
+\r
+                               // Check if it's a empty paragraph\r
+                               if (isEmpty(paraAfter))\r
+                                       paraAfter.innerHTML = "&nbsp;";\r
+\r
+                               // Delete old contents\r
+                               rng.deleteContents();\r
+                               rngAfter.deleteContents();\r
+                               rngBefore.deleteContents();\r
+\r
+                               // Insert new paragraphs\r
+                               if (tinyMCE.isOpera) {\r
+                                       paraBefore.normalize();\r
+                                       rngBefore.insertNode(paraBefore);\r
+                                       paraAfter.normalize();\r
+                                       rngBefore.insertNode(paraAfter);\r
+                               } else {\r
+                                       paraAfter.normalize();\r
+                                       rngBefore.insertNode(paraAfter);\r
+                                       paraBefore.normalize();\r
+                                       rngBefore.insertNode(paraBefore);\r
+                               }\r
+\r
+                               //tinyMCE.debug("1: ", paraBefore.innerHTML, paraAfter.innerHTML);\r
+                       } else {\r
+                               body.innerHTML = "<" + blockName + ">&nbsp;</" + blockName + "><" + blockName + ">&nbsp;</" + blockName + ">";\r
+                               paraAfter = body.childNodes[1];\r
+                       }\r
+\r
+                       inst.selection.moveToBookmark(b);\r
+                       inst.selection.selectNode(paraAfter, true, true);\r
+\r
+                       return true;\r
+               }\r
+\r
+               // Place first part within new paragraph\r
+               if (startChop.nodeName == blockName)\r
+                       rngBefore.setStart(startChop, 0);\r
+               else\r
+                       rngBefore.setStartBefore(startChop);\r
+\r
+               rngBefore.setEnd(startNode, startOffset);\r
+               paraBefore.appendChild(rngBefore.cloneContents());\r
+\r
+               // Place secound part within new paragraph\r
+               rngAfter.setEndAfter(endChop);\r
+               rngAfter.setStart(endNode, endOffset);\r
+               contents = rngAfter.cloneContents();\r
+\r
+               if (contents.firstChild && contents.firstChild.nodeName == blockName) {\r
+       /*              var nodes = contents.firstChild.childNodes;\r
+                       for (i=0; i<nodes.length; i++) {\r
+                               //tinyMCE.debug(nodes[i].nodeName);\r
+                               if (nodes[i].nodeName != "BODY")\r
+                                       paraAfter.appendChild(nodes[i]);\r
+                       }\r
+       */\r
+                       paraAfter.innerHTML = contents.firstChild.innerHTML;\r
+               } else\r
+                       paraAfter.appendChild(contents);\r
+\r
+               // Check if it's a empty paragraph\r
+               if (isEmpty(paraBefore))\r
+                       paraBefore.innerHTML = "&nbsp;";\r
+\r
+               // Check if it's a empty paragraph\r
+               if (isEmpty(paraAfter))\r
+                       paraAfter.innerHTML = "&nbsp;";\r
+\r
+               // Create a range around everything\r
+               rng = doc.createRange();\r
+\r
+               if (!startChop.previousSibling && startChop.parentNode.nodeName.toUpperCase() == blockName) {\r
+                       rng.setStartBefore(startChop.parentNode);\r
+               } else {\r
+                       if (rngBefore.startContainer.nodeName.toUpperCase() == blockName && rngBefore.startOffset == 0)\r
+                               rng.setStartBefore(rngBefore.startContainer);\r
+                       else\r
+                               rng.setStart(rngBefore.startContainer, rngBefore.startOffset);\r
+               }\r
+\r
+               if (!endChop.nextSibling && endChop.parentNode.nodeName.toUpperCase() == blockName)\r
+                       rng.setEndAfter(endChop.parentNode);\r
+               else\r
+                       rng.setEnd(rngAfter.endContainer, rngAfter.endOffset);\r
+\r
+               // Delete all contents and insert new paragraphs\r
+               rng.deleteContents();\r
+\r
+               if (tinyMCE.isOpera) {\r
+                       rng.insertNode(paraBefore);\r
+                       rng.insertNode(paraAfter);\r
+               } else {\r
+                       rng.insertNode(paraAfter);\r
+                       rng.insertNode(paraBefore);\r
+               }\r
+\r
+               //tinyMCE.debug("2", paraBefore.innerHTML, paraAfter.innerHTML);\r
+\r
+               // Normalize\r
+               paraAfter.normalize();\r
+               paraBefore.normalize();\r
+\r
+               inst.selection.moveToBookmark(b);\r
+               inst.selection.selectNode(paraAfter, true, true);\r
+\r
+               return true;\r
+       },\r
+\r
+       _handleBackSpace : function(inst) {\r
+               var r = inst.getRng(), sn = r.startContainer, nv, s = false;\r
+\r
+               // Added body check for bug #1527787\r
+               if (sn && sn.nextSibling && sn.nextSibling.nodeName == "BR" && sn.parentNode.nodeName != "BODY") {\r
+                       nv = sn.nodeValue;\r
+\r
+                       // Handle if a backspace is pressed after a space character #bug 1466054 removed since fix for #1527787\r
+                       /*if (nv != null && nv.length >= r.startOffset && nv.charAt(r.startOffset - 1) == ' ')\r
+                               s = true;*/\r
+\r
+                       // Only remove BRs if we are at the end of line #bug 1464152\r
+                       if (nv != null && r.startOffset == nv.length)\r
+                               sn.nextSibling.parentNode.removeChild(sn.nextSibling);\r
+               }\r
+\r
+               if (inst.settings.auto_resize)\r
+                       inst.resizeToContent();\r
+\r
+               return s;\r
+       }\r
+\r
+       };\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Layer.class.js */\r
+\r
+function TinyMCE_Layer(id, bm) {\r
+       this.id = id;\r
+       this.blockerElement = null;\r
+       this.events = false;\r
+       this.element = null;\r
+       this.blockMode = typeof(bm) != 'undefined' ? bm : true;\r
+       this.doc = document;\r
+};\r
+\r
+TinyMCE_Layer.prototype = {\r
+       moveRelativeTo : function(re, p) {\r
+               var rep = this.getAbsPosition(re), e = this.getElement(), x, y;\r
+               var w = parseInt(re.offsetWidth), h = parseInt(re.offsetHeight);\r
+               var ew = parseInt(e.offsetWidth), eh = parseInt(e.offsetHeight);\r
+\r
+               switch (p) {\r
+                       case "tl":\r
+                               x = rep.absLeft;\r
+                               y = rep.absTop;\r
+                               break;\r
+\r
+                       case "tr":\r
+                               x = rep.absLeft + w;\r
+                               y = rep.absTop;\r
+                               break;\r
+\r
+                       case "bl":\r
+                               x = rep.absLeft;\r
+                               y = rep.absTop + h;\r
+                               break;\r
+\r
+                       case "br":\r
+                               x = rep.absLeft + w;\r
+                               y = rep.absTop + h;\r
+                               break;\r
+\r
+                       case "cc":\r
+                               x = rep.absLeft + (w / 2) - (ew / 2);\r
+                               y = rep.absTop + (h / 2) - (eh / 2);\r
+                               break;\r
+               }\r
+\r
+               this.moveTo(x, y);\r
+       },\r
+\r
+       moveBy : function(x, y) {\r
+               var e = this.getElement();\r
+               this.moveTo(parseInt(e.style.left) + x, parseInt(e.style.top) + y);\r
+       },\r
+\r
+       moveTo : function(x, y) {\r
+               var e = this.getElement();\r
+\r
+               e.style.left = x + "px";\r
+               e.style.top = y + "px";\r
+\r
+               this.updateBlocker();\r
+       },\r
+\r
+       resizeBy : function(w, h) {\r
+               var e = this.getElement();\r
+               this.resizeTo(parseInt(e.style.width) + w, parseInt(e.style.height) + h);\r
+       },\r
+\r
+       resizeTo : function(w, h) {\r
+               var e = this.getElement();\r
+\r
+               if (w != null)\r
+                       e.style.width = w + "px";\r
+\r
+               if (h != null)\r
+                       e.style.height = h + "px";\r
+\r
+               this.updateBlocker();\r
+       },\r
+\r
+       show : function() {\r
+               var el = this.getElement();\r
+\r
+               if (el) {\r
+                       el.style.display = 'block';\r
+                       this.updateBlocker();\r
+               }\r
+       },\r
+\r
+       hide : function() {\r
+               var el = this.getElement();\r
+\r
+               if (el) {\r
+                       el.style.display = 'none';\r
+                       this.updateBlocker();\r
+               }\r
+       },\r
+\r
+       isVisible : function() {\r
+               return this.getElement().style.display == 'block';\r
+       },\r
+\r
+       getElement : function() {\r
+               if (!this.element)\r
+                       this.element = this.doc.getElementById(this.id);\r
+\r
+               return this.element;\r
+       },\r
+\r
+       setBlockMode : function(s) {\r
+               this.blockMode = s;\r
+       },\r
+\r
+       updateBlocker : function() {\r
+               var e, b, x, y, w, h;\r
+\r
+               b = this.getBlocker();\r
+               if (b) {\r
+                       if (this.blockMode) {\r
+                               e = this.getElement();\r
+                               x = this.parseInt(e.style.left);\r
+                               y = this.parseInt(e.style.top);\r
+                               w = this.parseInt(e.offsetWidth);\r
+                               h = this.parseInt(e.offsetHeight);\r
+\r
+                               b.style.left = x + 'px';\r
+                               b.style.top = y + 'px';\r
+                               b.style.width = w + 'px';\r
+                               b.style.height = h + 'px';\r
+                               b.style.display = e.style.display;\r
+                       } else\r
+                               b.style.display = 'none';\r
+               }\r
+       },\r
+\r
+       getBlocker : function() {\r
+               var d, b;\r
+\r
+               if (!this.blockerElement && this.blockMode) {\r
+                       d = this.doc;\r
+                       b = d.getElementById(this.id + "_blocker");\r
+\r
+                       if (!b) {\r
+                               b = d.createElement("iframe");\r
+\r
+                               b.setAttribute('id', this.id + "_blocker");\r
+                               b.style.cssText = 'display: none; position: absolute; left: 0; top: 0';\r
+                               b.src = 'javascript:false;';\r
+                               b.frameBorder = '0';\r
+                               b.scrolling = 'no';\r
+       \r
+                               d.body.appendChild(b);\r
+                       }\r
+\r
+                       this.blockerElement = b;\r
+               }\r
+\r
+               return this.blockerElement;\r
+       },\r
+\r
+       getAbsPosition : function(n) {\r
+               var p = {absLeft : 0, absTop : 0};\r
+\r
+               while (n) {\r
+                       p.absLeft += n.offsetLeft;\r
+                       p.absTop += n.offsetTop;\r
+                       n = n.offsetParent;\r
+               }\r
+\r
+               return p;\r
+       },\r
+\r
+       create : function(n, c, p, h) {\r
+               var d = this.doc, e = d.createElement(n);\r
+\r
+               e.setAttribute('id', this.id);\r
+\r
+               if (c)\r
+                       e.className = c;\r
+\r
+               if (!p)\r
+                       p = d.body;\r
+\r
+               if (h)\r
+                       e.innerHTML = h;\r
+\r
+               p.appendChild(e);\r
+\r
+               return this.element = e;\r
+       },\r
+\r
+       exists : function() {\r
+               return this.doc.getElementById(this.id) != null;\r
+       },\r
+\r
+       parseInt : function(s) {\r
+               if (s == null || s == '')\r
+                       return 0;\r
+\r
+               return parseInt(s);\r
+       },\r
+\r
+       remove : function() {\r
+               var e = this.getElement(), b = this.getBlocker();\r
+\r
+               if (e)\r
+                       e.parentNode.removeChild(e);\r
+\r
+               if (b)\r
+                       b.parentNode.removeChild(b);\r
+       }\r
+\r
+       };\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Menu.class.js */\r
+\r
+function TinyMCE_Menu() {\r
+       var id;\r
+\r
+       if (typeof(tinyMCE.menuCounter) == "undefined")\r
+               tinyMCE.menuCounter = 0;\r
+\r
+       id = "mc_menu_" + tinyMCE.menuCounter++;\r
+\r
+       TinyMCE_Layer.call(this, id, true);\r
+\r
+       this.id = id;\r
+       this.items = [];\r
+       this.needsUpdate = true;\r
+};\r
+\r
+TinyMCE_Menu.prototype = tinyMCE.extend(TinyMCE_Layer.prototype, {\r
+       init : function(s) {\r
+               var n;\r
+\r
+               // Default params\r
+               this.settings = {\r
+                       separator_class : 'mceMenuSeparator',\r
+                       title_class : 'mceMenuTitle',\r
+                       disabled_class : 'mceMenuDisabled',\r
+                       menu_class : 'mceMenu',\r
+                       drop_menu : true\r
+               };\r
+\r
+               for (n in s)\r
+                       this.settings[n] = s[n];\r
+\r
+               this.create('div', this.settings.menu_class);\r
+       },\r
+\r
+       clear : function() {\r
+               this.items = [];\r
+       },\r
+\r
+       addTitle : function(t) {\r
+               this.add({type : 'title', text : t});\r
+       },\r
+\r
+       addDisabled : function(t) {\r
+               this.add({type : 'disabled', text : t});\r
+       },\r
+\r
+       addSeparator : function() {\r
+               this.add({type : 'separator'});\r
+       },\r
+\r
+       addItem : function(t, js) {\r
+               this.add({text : t, js : js});\r
+       },\r
+\r
+       add : function(mi) {\r
+               this.items[this.items.length] = mi;\r
+               this.needsUpdate = true;\r
+       },\r
+\r
+       update : function() {\r
+               var e = this.getElement(), h = '', i, t, m = this.items, s = this.settings;\r
+\r
+               if (this.settings.drop_menu)\r
+                       h += '<span class="mceMenuLine"></span>';\r
+\r
+               h += '<table border="0" cellpadding="0" cellspacing="0">';\r
+\r
+               for (i=0; i<m.length; i++) {\r
+                       t = tinyMCE.xmlEncode(m[i].text);\r
+                       c = m[i].class_name ? ' class="' + m[i].class_name + '"' : '';\r
+\r
+                       switch (m[i].type) {\r
+                               case 'separator':\r
+                                       h += '<tr class="' + s.separator_class + '"><td>';\r
+                                       break;\r
+\r
+                               case 'title':\r
+                                       h += '<tr class="' + s.title_class + '"><td><span' + c +'>' + t + '</span>';\r
+                                       break;\r
+\r
+                               case 'disabled':\r
+                                       h += '<tr class="' + s.disabled_class + '"><td><span' + c +'>' + t + '</span>';\r
+                                       break;\r
+\r
+                               default:\r
+                                       h += '<tr><td><a href="' + tinyMCE.xmlEncode(m[i].js) + '" onmousedown="' + tinyMCE.xmlEncode(m[i].js) + ';return tinyMCE.cancelEvent(event);" onclick="return tinyMCE.cancelEvent(event);" onmouseup="return tinyMCE.cancelEvent(event);"><span' + c +'>' + t + '</span></a>';\r
+                       }\r
+\r
+                       h += '</td></tr>';\r
+               }\r
+\r
+               h += '</table>';\r
+\r
+               e.innerHTML = h;\r
+\r
+               this.needsUpdate = false;\r
+               this.updateBlocker();\r
+       },\r
+\r
+       show : function() {\r
+               var nl, i;\r
+\r
+               if (tinyMCE.lastMenu == this)\r
+                       return;\r
+\r
+               if (this.needsUpdate)\r
+                       this.update();\r
+\r
+               if (tinyMCE.lastMenu && tinyMCE.lastMenu != this)\r
+                       tinyMCE.lastMenu.hide();\r
+\r
+               TinyMCE_Layer.prototype.show.call(this);\r
+\r
+               if (!tinyMCE.isOpera) {\r
+                       // Accessibility stuff\r
+/*                     nl = this.getElement().getElementsByTagName("a");\r
+                       if (nl.length > 0)\r
+                               nl[0].focus();*/\r
+               }\r
+\r
+               tinyMCE.lastMenu = this;\r
+       }\r
+\r
+       });\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Debug.class.js */\r
+\r
+tinyMCE.add(TinyMCE_Engine, {\r
+       debug : function() {\r
+               var m = "", a, i, l = tinyMCE.log.length;\r
+\r
+               for (i=0, a = this.debug.arguments; i<a.length; i++) {\r
+                       m += a[i];\r
+\r
+                       if (i<a.length-1)\r
+                               m += ', ';\r
+               }\r
+\r
+               if (l < 1000)\r
+                       tinyMCE.log[l] = "[debug] " + m;\r
+       }\r
+\r
+       });\r
+\r
diff --git a/program/js/tiny_mce/utils/editable_selects.js b/program/js/tiny_mce/utils/editable_selects.js
new file mode 100644 (file)
index 0000000..e723365
--- /dev/null
@@ -0,0 +1,61 @@
+/**\r
+ * $Id: editable_selects.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * Makes select boxes editable.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+var TinyMCE_EditableSelects = {\r
+       editSelectElm : null,\r
+\r
+       init : function() {\r
+               var nl = document.getElementsByTagName("select"), i, d = document, o;\r
+\r
+               for (i=0; i<nl.length; i++) {\r
+                       if (nl[i].className.indexOf('mceEditableSelect') != -1) {\r
+                               o = new Option('(value)', '__mce_add_custom__');\r
+\r
+                               o.className = 'mceAddSelectValue';\r
+\r
+                               nl[i].options[nl[i].options.length] = o;\r
+                               nl[i].setAttribute('onchange', 'TinyMCE_EditableSelects.onChangeEditableSelect(this);');\r
+                       }\r
+               }\r
+       },\r
+\r
+       onChangeEditableSelect : function(se) {\r
+               var d = document, ne;\r
+\r
+               if (se.options[se.selectedIndex].value == '__mce_add_custom__') {\r
+                       ne = d.createElement("input");\r
+                       ne.id = se.id + "_custom";\r
+                       ne.name = se.name + "_custom";\r
+                       ne.type = "text";\r
+\r
+                       ne.style.width = se.clientWidth;\r
+                       se.parentNode.insertBefore(ne, se);\r
+                       se.style.display = 'none';\r
+                       ne.focus();\r
+                       ne.onblur = TinyMCE_EditableSelects.onBlurEditableSelectInput;\r
+                       TinyMCE_EditableSelects.editSelectElm = se;\r
+               }\r
+       },\r
+\r
+       onBlurEditableSelectInput : function() {\r
+               var se = TinyMCE_EditableSelects.editSelectElm;\r
+\r
+               if (se) {\r
+                       if (se.previousSibling.value != '') {\r
+                               addSelectValue(document.forms[0], se.id, se.previousSibling.value, se.previousSibling.value);\r
+                               selectByValue(document.forms[0], se.id, se.previousSibling.value);\r
+                       } else\r
+                               selectByValue(document.forms[0], se.id, '');\r
+\r
+                       se.style.display = 'inline';\r
+                       se.parentNode.removeChild(se.previousSibling);\r
+                       TinyMCE_EditableSelects.editSelectElm = null;\r
+               }\r
+       }\r
+};\r
diff --git a/program/js/tiny_mce/utils/form_utils.js b/program/js/tiny_mce/utils/form_utils.js
new file mode 100644 (file)
index 0000000..ec9dbb3
--- /dev/null
@@ -0,0 +1,210 @@
+/**\r
+ * $Id: form_utils.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * Various form utilitiy functions.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+var themeBaseURL = tinyMCE.baseURL + '/themes/' + tinyMCE.getParam("theme");\r
+\r
+function getColorPickerHTML(id, target_form_element) {\r
+       var h = "";\r
+\r
+       h += '<a id="' + id + '_link" href="javascript:void(0);" onkeydown="pickColor(event,\'' + target_form_element +'\');" onmousedown="pickColor(event,\'' + target_form_element +'\');return false;">';\r
+       h += '<img id="' + id + '" src="' + themeBaseURL + '/images/color.gif"';\r
+       h += ' onmouseover="this.className=\'mceButtonOver\'"';\r
+       h += ' onmouseout="this.className=\'mceButtonNormal\'"';\r
+       h += ' onmousedown="this.className=\'mceButtonDown\'"';\r
+       h += ' width="20" height="16" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';\r
+       h += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';\r
+\r
+       return h;\r
+}\r
+\r
+function pickColor(e, target_form_element) {\r
+       if ((e.keyCode == 32 || e.keyCode == 13) || e.type == "mousedown")\r
+               tinyMCEPopup.pickColor(e, target_form_element);\r
+}\r
+\r
+function updateColor(img_id, form_element_id) {\r
+       document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value;\r
+}\r
+\r
+function setBrowserDisabled(id, state) {\r
+       var img = document.getElementById(id);\r
+       var lnk = document.getElementById(id + "_link");\r
+\r
+       if (lnk) {\r
+               if (state) {\r
+                       lnk.setAttribute("realhref", lnk.getAttribute("href"));\r
+                       lnk.removeAttribute("href");\r
+                       tinyMCE.switchClass(img, 'mceButtonDisabled', true);\r
+               } else {\r
+                       lnk.setAttribute("href", lnk.getAttribute("realhref"));\r
+                       tinyMCE.switchClass(img, 'mceButtonNormal', false);\r
+               }\r
+       }\r
+}\r
+\r
+function getBrowserHTML(id, target_form_element, type, prefix) {\r
+       var option = prefix + "_" + type + "_browser_callback";\r
+       var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));\r
+       if (cb == null)\r
+               return "";\r
+\r
+       var html = "";\r
+\r
+       html += '<a id="' + id + '_link" href="javascript:openBrower(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;">';\r
+       html += '<img id="' + id + '" src="' + themeBaseURL + '/images/browse.gif"';\r
+       html += ' onmouseover="this.className=\'mceButtonOver\';"';\r
+       html += ' onmouseout="this.className=\'mceButtonNormal\';"';\r
+       html += ' onmousedown="this.className=\'mceButtonDown\';"';\r
+       html += ' width="20" height="18" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';\r
+       html += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';\r
+\r
+       return html;\r
+}\r
+\r
+function openBrower(img_id, target_form_element, type, option) {\r
+       var img = document.getElementById(img_id);\r
+\r
+       if (img.className != "mceButtonDisabled")\r
+               tinyMCEPopup.openBrowser(target_form_element, type, option);\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);\r
+               option.selected = true;\r
+               sel.options[sel.options.length] = option;\r
+               sel.selectedIndex = sel.options.length - 1;\r
+       }\r
+\r
+       return found;\r
+}\r
+\r
+function getSelectValue(form_obj, field_name) {\r
+       var elm = form_obj.elements[field_name];\r
+\r
+       if (elm == null || elm.options == null)\r
+               return "";\r
+\r
+       return elm.options[elm.selectedIndex].value;\r
+}\r
+\r
+function addSelectValue(form_obj, field_name, name, value) {\r
+       var s = form_obj.elements[field_name];\r
+       var o = new Option(name, value);\r
+       s.options[s.options.length] = o;\r
+}\r
+\r
+function addClassesToList(list_id, specific_option) {\r
+       // Setup class droplist\r
+       var styleSelectElm = document.getElementById(list_id);\r
+       var styles = tinyMCE.getParam('theme_advanced_styles', false);\r
+       styles = tinyMCE.getParam(specific_option, styles);\r
+\r
+       if (styles) {\r
+               var stylesAr = styles.split(';');\r
+\r
+               for (var i=0; i<stylesAr.length; i++) {\r
+                       if (stylesAr != "") {\r
+                               var key, value;\r
+\r
+                               key = stylesAr[i].split('=')[0];\r
+                               value = stylesAr[i].split('=')[1];\r
+\r
+                               styleSelectElm.options[styleSelectElm.length] = new Option(key, value);\r
+                       }\r
+               }\r
+       } else {\r
+               // Use auto impored classes\r
+               var csses = tinyMCE.getCSSClasses(tinyMCE.getWindowArg('editor_id'));\r
+               for (var i=0; i<csses.length; i++)\r
+                       styleSelectElm.options[styleSelectElm.length] = new Option(csses[i], csses[i]);\r
+       }\r
+}\r
+\r
+function isVisible(element_id) {\r
+       var elm = document.getElementById(element_id);\r
+\r
+       return elm && elm.style.display != "none";\r
+}\r
+\r
+function convertRGBToHex(col) {\r
+       var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");\r
+\r
+       var rgb = col.replace(re, "$1,$2,$3").split(',');\r
+       if (rgb.length == 3) {\r
+               r = parseInt(rgb[0]).toString(16);\r
+               g = parseInt(rgb[1]).toString(16);\r
+               b = parseInt(rgb[2]).toString(16);\r
+\r
+               r = r.length == 1 ? '0' + r : r;\r
+               g = g.length == 1 ? '0' + g : g;\r
+               b = b.length == 1 ? '0' + b : b;\r
+\r
+               return "#" + r + g + b;\r
+       }\r
+\r
+       return col;\r
+}\r
+\r
+function convertHexToRGB(col) {\r
+       if (col.indexOf('#') != -1) {\r
+               col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');\r
+\r
+               r = parseInt(col.substring(0, 2), 16);\r
+               g = parseInt(col.substring(2, 4), 16);\r
+               b = parseInt(col.substring(4, 6), 16);\r
+\r
+               return "rgb(" + r + "," + g + "," + b + ")";\r
+       }\r
+\r
+       return col;\r
+}\r
+\r
+function trimSize(size) {\r
+       return size.replace(new RegExp('[^0-9%]', 'gi'), '');\r
+}\r
+\r
+function getCSSSize(size) {\r
+       size = trimSize(size);\r
+\r
+       if (size == "")\r
+               return "";\r
+\r
+       return size.indexOf('%') != -1 ? size : size + "px";\r
+}\r
+\r
+function getStyle(elm, attrib, style) {\r
+       var val = tinyMCE.getAttrib(elm, attrib);\r
+\r
+       if (val != '')\r
+               return '' + val;\r
+\r
+       if (typeof(style) == 'undefined')\r
+               style = attrib;\r
+\r
+       val = eval('elm.style.' + style);\r
+\r
+       return val == null ? '' : '' + val;\r
+}\r
diff --git a/program/js/tiny_mce/utils/mclayer.js b/program/js/tiny_mce/utils/mclayer.js
new file mode 100644 (file)
index 0000000..1b347f7
--- /dev/null
@@ -0,0 +1,210 @@
+/**\r
+ * $Id: mclayer.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * Moxiecode floating layer script.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function MCLayer(id) {\r
+       this.id = id;\r
+       this.settings = new Array();\r
+       this.blockerElement = null;\r
+       this.isMSIE = navigator.appName == "Microsoft Internet Explorer";\r
+       this.events = false;\r
+       this.autoHideCallback = null;\r
+}\r
+\r
+MCLayer.prototype = {\r
+       moveRelativeTo : function(re, p, a) {\r
+               var rep = this.getAbsPosition(re);\r
+               var w = parseInt(re.offsetWidth);\r
+               var h = parseInt(re.offsetHeight);\r
+               var x, y;\r
+\r
+               switch (p) {\r
+                       case "tl":\r
+                               break;\r
+\r
+                       case "tr":\r
+                               x = rep.absLeft + w;\r
+                               y = rep.absTop;\r
+                               break;\r
+\r
+                       case "bl":\r
+                               break;\r
+\r
+                       case "br":\r
+                               break;\r
+               }\r
+\r
+               this.moveTo(x, y);\r
+       },\r
+\r
+       moveBy : function(dx, dy) {\r
+               var e = this.getElement();\r
+               var x = parseInt(e.style.left);\r
+               var y = parseInt(e.style.top);\r
+\r
+               e.style.left = (x + dx) + "px";\r
+               e.style.top = (y + dy) + "px";\r
+\r
+               this.updateBlocker();\r
+       },\r
+\r
+       moveTo : function(x, y) {\r
+               var e = this.getElement();\r
+\r
+               e.style.left = x + "px";\r
+               e.style.top = y + "px";\r
+\r
+               this.updateBlocker();\r
+       },\r
+\r
+       show : function() {\r
+               MCLayer.visibleLayer = this;\r
+\r
+               this.getElement().style.display = 'block';\r
+               this.updateBlocker();\r
+       },\r
+\r
+       hide : function() {\r
+               this.getElement().style.display = 'none';\r
+               this.updateBlocker();\r
+       },\r
+\r
+       setAutoHide : function(s, cb) {\r
+               this.autoHideCallback = cb;\r
+               this.registerEventHandlers();\r
+       },\r
+\r
+       getElement : function() {\r
+               return document.getElementById(this.id);\r
+       },\r
+\r
+       updateBlocker : function() {\r
+               if (!this.isMSIE)\r
+                       return;\r
+\r
+               var e = this.getElement();\r
+               var b = this.getBlocker();\r
+               var x = this.parseInt(e.style.left);\r
+               var y = this.parseInt(e.style.top);\r
+               var w = this.parseInt(e.offsetWidth);\r
+               var h = this.parseInt(e.offsetHeight);\r
+\r
+               b.style.left = x + 'px';\r
+               b.style.top = y + 'px';\r
+               b.style.width = w + 'px';\r
+               b.style.height = h + 'px';\r
+               b.style.display = e.style.display;\r
+       },\r
+\r
+       getBlocker : function() {\r
+               if (!this.blockerElement) {\r
+                       var d = document, b = d.createElement("iframe");\r
+\r
+                       b.style.cssText = 'display: none; left: 0px; position: absolute; top: 0';\r
+                       b.src = 'javascript:false;';\r
+                       b.frameBorder = '0';\r
+                       b.scrolling = 'no';\r
+\r
+                       d.body.appendChild(b);\r
+                       this.blockerElement = b;\r
+               }\r
+\r
+               return this.blockerElement;\r
+       },\r
+\r
+       getAbsPosition : function(n) {\r
+               var p = {absLeft : 0, absTop : 0};\r
+\r
+               while (n) {\r
+                       p.absLeft += n.offsetLeft;\r
+                       p.absTop += n.offsetTop;\r
+                       n = n.offsetParent;\r
+               }\r
+\r
+               return p;\r
+       },\r
+\r
+       registerEventHandlers : function() {\r
+               if (!this.events) {\r
+                       var d = document;\r
+\r
+                       this.addEvent(d, 'mousedown', MCLayer.prototype.onMouseDown);\r
+\r
+                       this.events = true;\r
+               }\r
+       },\r
+\r
+       addEvent : function(o, n, h) {\r
+               if (o.attachEvent)\r
+                       o.attachEvent("on" + n, h);\r
+               else\r
+                       o.addEventListener(n, h, false);\r
+       },\r
+\r
+       onMouseDown : function(e) {\r
+               e = typeof(e) == "undefined" ? window.event : e;\r
+               var b = document.body;\r
+               var l = MCLayer.visibleLayer;\r
+\r
+               if (l) {\r
+                       var mx = l.isMSIE ? e.clientX + b.scrollLeft : e.pageX;\r
+                       var my = l.isMSIE ? e.clientY + b.scrollTop : e.pageY;\r
+                       var el = l.getElement();\r
+                       var x = parseInt(el.style.left);\r
+                       var y = parseInt(el.style.top);\r
+                       var w = parseInt(el.offsetWidth);\r
+                       var h = parseInt(el.offsetHeight);\r
+\r
+                       if (!(mx > x && mx < x + w && my > y && my < y + h)) {\r
+                               MCLayer.visibleLayer = null;\r
+\r
+                               if (l.autoHideCallback && l.autoHideCallback(l, e, mx, my))\r
+                                       return true;\r
+\r
+                               l.hide();\r
+                       }\r
+               }\r
+       },\r
+\r
+       addCSSClass : function(e, c) {\r
+               this.removeCSSClass(e, c);\r
+               var a = this.explode(' ', e.className);\r
+               a[a.length] = c;\r
+               e.className = a.join(' ');\r
+       },\r
+\r
+       removeCSSClass : function(e, c) {\r
+               var a = this.explode(' ', e.className), i;\r
+\r
+               for (i=0; i<a.length; i++) {\r
+                       if (a[i] == c)\r
+                               a[i] = '';\r
+               }\r
+\r
+               e.className = a.join(' ');\r
+       },\r
+\r
+       explode : function(d, s) {\r
+               var ar = s.split(d);\r
+               var oar = new Array();\r
+\r
+               for (var i = 0; i<ar.length; i++) {\r
+                       if (ar[i] != "")\r
+                               oar[oar.length] = ar[i];\r
+               }\r
+\r
+               return oar;\r
+       },\r
+\r
+       parseInt : function(s) {\r
+               if (s == null || s == '')\r
+                       return 0;\r
+\r
+               return parseInt(s);\r
+       }\r
+}\r
diff --git a/program/js/tiny_mce/utils/mctabs.js b/program/js/tiny_mce/utils/mctabs.js
new file mode 100644 (file)
index 0000000..fae038d
--- /dev/null
@@ -0,0 +1,74 @@
+/**\r
+ * $Id: mctabs.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * Moxiecode DHTML Tabs script.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function MCTabs() {\r
+       this.settings = new Array();\r
+};\r
+\r
+MCTabs.prototype.init = function(settings) {\r
+       this.settings = settings;\r
+};\r
+\r
+MCTabs.prototype.getParam = function(name, default_value) {\r
+       var value = null;\r
+\r
+       value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];\r
+\r
+       // Fix bool values\r
+       if (value == "true" || value == "false")\r
+               return (value == "true");\r
+\r
+       return value;\r
+};\r
+\r
+MCTabs.prototype.displayTab = function(tab_id, panel_id) {\r
+       var panelElm = document.getElementById(panel_id);\r
+       var panelContainerElm = panelElm ? panelElm.parentNode : null;\r
+       var tabElm = document.getElementById(tab_id);\r
+       var tabContainerElm = tabElm ? tabElm.parentNode : null;\r
+       var selectionClass = this.getParam('selection_class', 'current');\r
+\r
+       if (tabElm && tabContainerElm) {\r
+               var nodes = tabContainerElm.childNodes;\r
+\r
+               // Hide all other tabs\r
+               for (var i=0; i<nodes.length; i++) {\r
+                       if (nodes[i].nodeName == "LI")\r
+                               nodes[i].className = '';\r
+               }\r
+\r
+               // Show selected tab\r
+               tabElm.className = 'current';\r
+       }\r
+\r
+       if (panelElm && panelContainerElm) {\r
+               var nodes = panelContainerElm.childNodes;\r
+\r
+               // Hide all other panels\r
+               for (var i=0; i<nodes.length; i++) {\r
+                       if (nodes[i].nodeName == "DIV")\r
+                               nodes[i].className = 'panel';\r
+               }\r
+\r
+               // Show selected panel\r
+               panelElm.className = 'current';\r
+       }\r
+};\r
+\r
+MCTabs.prototype.getAnchor = function() {\r
+       var pos, url = document.location.href;\r
+\r
+       if ((pos = url.lastIndexOf('#')) != -1)\r
+               return url.substring(pos + 1);\r
+\r
+       return "";\r
+};\r
+\r
+// Global instance\r
+var mcTabs = new MCTabs();\r
diff --git a/program/js/tiny_mce/utils/validate.js b/program/js/tiny_mce/utils/validate.js
new file mode 100644 (file)
index 0000000..b8931f4
--- /dev/null
@@ -0,0 +1,219 @@
+/**\r
+ * $Id: validate.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * Various form validation methods.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/**\r
+       // String validation:\r
+\r
+       if (!Validator.isEmail('myemail'))\r
+               alert('Invalid email.');\r
+\r
+       // Form validation:\r
+\r
+       var f = document.forms['myform'];\r
+\r
+       if (!Validator.isEmail(f.myemail))\r
+               alert('Invalid email.');\r
+*/\r
+\r
+var Validator = {\r
+       isEmail : function(s) {\r
+               return this.test(s, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$');\r
+       },\r
+\r
+       isAbsUrl : function(s) {\r
+               return this.test(s, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+\\/?.*$');\r
+       },\r
+\r
+       isSize : function(s) {\r
+               return this.test(s, '^[0-9]+(px|%)?$');\r
+       },\r
+\r
+       isId : function(s) {\r
+               return this.test(s, '^[A-Za-z_]([A-Za-z0-9_])*$');\r
+       },\r
+\r
+       isEmpty : function(s) {\r
+               var nl, i;\r
+\r
+               if (s.nodeName == 'SELECT' && s.selectedIndex < 1)\r
+                       return true;\r
+\r
+               if (s.type == 'checkbox' && !s.checked)\r
+                       return true;\r
+\r
+               if (s.type == 'radio') {\r
+                       for (i=0, nl = s.form.elements; i<nl.length; i++) {\r
+                               if (nl[i].type == "radio" && nl[i].name == s.name && nl[i].checked)\r
+                                       return false;\r
+                       }\r
+\r
+                       return true;\r
+               }\r
+\r
+               return new RegExp('^\\s*$').test(s.nodeType == 1 ? s.value : s);\r
+       },\r
+\r
+       isNumber : function(s, d) {\r
+               return !isNaN(s.nodeType == 1 ? s.value : s) && (!d || !this.test(s, '^-?[0-9]*\\.[0-9]*$'));\r
+       },\r
+\r
+       test : function(s, p) {\r
+               s = s.nodeType == 1 ? s.value : s;\r
+\r
+               return s == '' || new RegExp(p).test(s);\r
+       }\r
+};\r
+\r
+var AutoValidator = {\r
+       settings : {\r
+               id_cls : 'id',\r
+               int_cls : 'int',\r
+               url_cls : 'url',\r
+               number_cls : 'number',\r
+               email_cls : 'email',\r
+               size_cls : 'size',\r
+               required_cls : 'required',\r
+               invalid_cls : 'invalid',\r
+               min_cls : 'min',\r
+               max_cls : 'max'\r
+       },\r
+\r
+       init : function(s) {\r
+               var n;\r
+\r
+               for (n in s)\r
+                       this.settings[n] = s[n];\r
+       },\r
+\r
+       validate : function(f) {\r
+               var i, nl, s = this.settings, c = 0;\r
+\r
+               nl = this.tags(f, 'label');\r
+               for (i=0; i<nl.length; i++)\r
+                       this.removeClass(nl[i], s.invalid_cls);\r
+\r
+               c += this.validateElms(f, 'input');\r
+               c += this.validateElms(f, 'select');\r
+               c += this.validateElms(f, 'textarea');\r
+\r
+               return c == 3;\r
+       },\r
+\r
+       invalidate : function(n) {\r
+               this.mark(n.form, n);\r
+       },\r
+\r
+       reset : function(e) {\r
+               var t = new Array('label', 'input', 'select', 'textarea');\r
+               var i, j, nl, s = this.settings;\r
+\r
+               if (e == null)\r
+                       return;\r
+\r
+               for (i=0; i<t.length; i++) {\r
+                       nl = this.tags(e.form ? e.form : e, t[i]);\r
+                       for (j=0; j<nl.length; j++)\r
+                               this.removeClass(nl[j], s.invalid_cls);\r
+               }\r
+       },\r
+\r
+       validateElms : function(f, e) {\r
+               var nl, i, n, s = this.settings, st = true, va = Validator, v;\r
+\r
+               nl = this.tags(f, e);\r
+               for (i=0; i<nl.length; i++) {\r
+                       n = nl[i];\r
+\r
+                       this.removeClass(n, s.invalid_cls);\r
+\r
+                       if (this.hasClass(n, s.required_cls) && va.isEmpty(n))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.number_cls) && !va.isNumber(n))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.int_cls) && !va.isNumber(n, true))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.url_cls) && !va.isAbsUrl(n))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.email_cls) && !va.isEmail(n))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.size_cls) && !va.isSize(n))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.id_cls) && !va.isId(n))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.min_cls, true)) {\r
+                               v = this.getNum(n, s.min_cls);\r
+\r
+                               if (isNaN(v) || parseInt(n.value) < parseInt(v))\r
+                                       st = this.mark(f, n);\r
+                       }\r
+\r
+                       if (this.hasClass(n, s.max_cls, true)) {\r
+                               v = this.getNum(n, s.max_cls);\r
+\r
+                               if (isNaN(v) || parseInt(n.value) > parseInt(v))\r
+                                       st = this.mark(f, n);\r
+                       }\r
+               }\r
+\r
+               return st;\r
+       },\r
+\r
+       hasClass : function(n, c, d) {\r
+               return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className);\r
+       },\r
+\r
+       getNum : function(n, c) {\r
+               c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0];\r
+               c = c.replace(/[^0-9]/g, '');\r
+\r
+               return c;\r
+       },\r
+\r
+       addClass : function(n, c, b) {\r
+               var o = this.removeClass(n, c);\r
+               n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c;\r
+       },\r
+\r
+       removeClass : function(n, c) {\r
+               c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' ');\r
+               return n.className = c != ' ' ? c : '';\r
+       },\r
+\r
+       tags : function(f, s) {\r
+               return f.getElementsByTagName(s);\r
+       },\r
+\r
+       mark : function(f, n) {\r
+               var s = this.settings;\r
+\r
+               this.addClass(n, s.invalid_cls);\r
+               this.markLabels(f, n, s.invalid_cls);\r
+\r
+               return false;\r
+       },\r
+\r
+       markLabels : function(f, n, ic) {\r
+               var nl, i;\r
+\r
+               nl = this.tags(f, "label");\r
+               for (i=0; i<nl.length; i++) {\r
+                       if (nl[i].getAttribute("for") == n.id || nl[i].htmlFor == n.id)\r
+                               this.addClass(nl[i], ic);\r
+               }\r
+\r
+               return null;\r
+       }\r
+};\r
index 6bc47a198332a69da598f83afd8542688a169905..05b1c00e13030a1fbbdaf2df94ba8f2155804700 100644 (file)
@@ -48,6 +48,7 @@
                - 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)
                - Removed some debuggers (echo ...)
 
 ********************************************************/
@@ -130,6 +131,8 @@ function iil_ReadLine($fp, $size){
        if ($fp){
                do{
                        $buffer = fgets($fp, 2048);
+                       if ($buffer === false)
+                               break;
                        $line.=$buffer;
                }while($buffer[strlen($buffer)-1]!="\n");
        }
@@ -229,9 +232,11 @@ function iil_C_Login(&$conn, $user, $password){
     $password = strtr($password, array('"'=>'\\"', '\\' => '\\\\'));  
     fputs($conn->fp, "a001 LOGIN $user \"$password\"\r\n");
 
-       do{
-           $line = iil_ReadReply($conn->fp);
-       }while(!iil_StartsWith($line, "a001 "));
+  do{
+    $line = iil_ReadReply($conn->fp);
+    if ($line === false)
+      break;
+  }while(!iil_StartsWith($line, "a001 "));
     $a=explode(" ", $line);
     if (strcmp($a[1],"OK")==0){
         $result=$conn->fp;
index 75c2d40d9f1c77376ba53013a06bd67be4fb9667..a25658692902745c1807136b5241c4f72ab06663 100644 (file)
@@ -56,8 +56,10 @@ function iml_ParseBSString($str){
     for ($i=0; $i<$len; $i++){
         if ($str[$i] == "\"") $in_quote = ($in_quote + 1) % 2;
         else if (!$in_quote){
-            if ($str[$i] == " ") $id++; //space means new element
-            else if ($str[$i]=="("){ //new part
+            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;
old mode 100755 (executable)
new mode 100644 (file)
index b25a2cd..bad9b70
@@ -13,7 +13,7 @@
  | Author: Vahan Yerkanian <vahan@arminco.com>                           |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 552 2007-05-03 20:48:00Z yllar $
+ @version $Id: labels.inc 584 2007-05-24 03:49:19Z estadtherr $
 
 */
 
old mode 100755 (executable)
new mode 100644 (file)
index 70a9ce7..f257d87
@@ -13,7 +13,7 @@
  | Author: Vahan Yerkanian <vahan@arminco.com>                           |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 552 2007-05-03 20:48:00Z yllar $
+ @version $Id: messages.inc 584 2007-05-24 03:49:19Z estadtherr $
 
 */
 
diff --git a/program/localization/ar/labels.inc b/program/localization/ar/labels.inc
new file mode 100644 (file)
index 0000000..ca24f67
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ar/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Ossama Khayat <okhayat@yahoo.com>                             |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
+
+*/
+
+$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['messagenrof'] = 'الرسالة $nr من $count';
+$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['today'] = 'اليوم';
+$labels['checkmail'] = 'التحقق من وجود رسائل جديدة';
+$labels['writenewmessage'] = 'إنشاء رسالة جديدة';
+$labels['replytomessage'] = 'الرد على الرسالة';
+$labels['replytoallmessage'] = 'الرد على المرسل وجميع مستقبلي الرسالة';
+$labels['forwardmessage'] = 'تمرير الرسالة';
+$labels['deletemessage'] = 'حذف الرسالة إلى المهملات';
+$labels['printmessage'] = 'طباعة هذه الرسالة';
+$labels['previousmessage'] = 'عرض الرسالة السابقة';
+$labels['previousmessages'] = 'عرض المجموعة السابقة من الرسائل';
+$labels['firstmessage'] = 'عرض الرسالة الأولى';
+$labels['firstmessages'] = 'عرض مجموعة الرسائل الأولى';
+$labels['nextmessage'] = 'عرض الرسالة التالية';
+$labels['nextmessages'] = 'عرض المجموعة التالية من الرسائل';
+$labels['lastmessage'] = 'عرض الرسالة الأخيرة';
+$labels['lastmessages'] = 'عرض مجموعة الرسائل الأخيرة';
+$labels['backtolist'] = 'العودة إلى لائحة الرسائل';
+$labels['viewsource'] = 'إظهار المصدر';
+$labels['select'] = 'تحديد';
+$labels['all'] = 'الكل';
+$labels['none'] = 'لا شيء';
+$labels['unread'] = 'غير المقروءة';
+$labels['compact'] = 'ضغط';
+$labels['empty'] = 'تفريغ';
+$labels['purge'] = 'إزالة';
+$labels['quota'] = 'المساحة المستخدمة';
+$labels['unknown'] = 'مجهول';
+$labels['unlimited'] = 'غير محدود';
+$labels['quicksearch'] = 'البحث السريع';
+$labels['resetsearch'] = 'استعادة البحث للافتراضي';
+$labels['compose'] = 'إنشاء رسالة';
+$labels['sendmessage'] = 'إرسال الرسالة الآن';
+$labels['savemessage'] = 'حفظ هذه المسودة';
+$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['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'نص مجرد';
+$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['previouspage'] = 'عرض المجموعة السابقة';
+$labels['firstpage'] = 'عرض المجموعة الأولى';
+$labels['nextpage'] = 'عرض المجموعة التالية';
+$labels['lastpage'] = 'عرض المجموعة الأخيرة';
+$labels['groups'] = 'المجموعات';
+$labels['personaladrbook'] = 'العناوين الشخصية';
+$labels['settingsfor'] = 'إعدادات';
+$labels['preferences'] = 'التفضيلات';
+$labels['userpreferences'] = 'تفضيلات المستخدم';
+$labels['editpreferences'] = 'تحرير تفضيلات المستخدم';
+$labels['identities'] = 'الهويات';
+$labels['manageidentities'] = 'إدارة هويات هذا الحساب';
+$labels['newidentity'] = 'هوية جديدة';
+$labels['newitem'] = 'عنصر جديد';
+$labels['edititem'] = 'تحرير عنصر';
+$labels['setdefault'] = 'تعيين كإفتراضي';
+$labels['language'] = 'اللغة';
+$labels['timezone'] = 'المنطقة الزمنية';
+$labels['pagesize'] = 'أسطر في الصفحة';
+$labels['signature'] = 'التوقيع';
+$labels['dstactive'] = 'التوقيت الصيفي';
+$labels['htmleditor'] = 'إنشاء رسائل بنسق HTML';
+$labels['htmlsignature'] = 'توقيع HTML';
+$labels['previewpane'] = 'إظهار قسم المعاينة';
+$labels['autosavedraft'] = 'حفظ المسودة تلقائياً';
+$labels['everynminutes'] = 'كل $n دقيقة';
+$labels['never'] = 'أبداً';
+$labels['folder'] = 'مجلد';
+$labels['folders'] = 'مجلدات';
+$labels['foldername'] = 'اسم المجلد';
+$labels['subscribed'] = 'مشترك';
+$labels['create'] = 'إنشاء';
+$labels['createfolder'] = 'إنشاء مجلد جديد';
+$labels['rename'] = 'إعادة التسمية';
+$labels['renamefolder'] = 'إعادة تسمية المجلد';
+$labels['deletefolder'] = 'حذف المجلد';
+$labels['managefolders'] = 'إدارة المجلدات';
+$labels['sortby'] = 'ترتيب بحسب';
+$labels['sortasc'] = 'ترتيب تصاعدي';
+$labels['sortdesc'] = 'ترتيب تنازلي';
+
+?>
\ No newline at end of file
diff --git a/program/localization/ar/messages.inc b/program/localization/ar/messages.inc
new file mode 100644 (file)
index 0000000..f948896
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ar/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Ossama Khayat <okhayat@yahoo.com>                             |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'فشل تسجيل الدخول';
+$messages['cookiesdisabled'] = 'المتصفح الخاص بك لا يقبل الكوكيز';
+$messages['sessionerror'] = 'انتهت صلاحية الجلسة الحالية أو أنها غير صالحة';
+$messages['imaperror'] = 'فشل الاتصال بخادم IMAP';
+$messages['nomessagesfound'] = 'لم يعثر على أية رسائل في صندوق البريد هذا';
+$messages['loggedout'] = 'لقد قمت بإنهاء هذه الجلسة بنجاح. إلى اللقاء!';
+$messages['mailboxempty'] = 'صندوق البريد فارغ';
+$messages['loading'] = 'جاري العمل...';
+$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['errorsaving'] = 'حدث خطأ أثناء الحفظ';
+$messages['errormoving'] = 'تعذر نقل هذه الرسالة';
+$messages['errordeleting'] = 'تعذر حذف هذه الرسالة';
+$messages['deletecontactconfirm'] = 'هل تريد حقاً حذف المراسلـ(ين) المحدد(ين)؟';
+$messages['deletemessagesconfirm'] = 'هل تريد حذف الرسائل المحددة؟';
+$messages['deletefolderconfirm'] = 'هل تريد حقاً حذف هذا المجلد؟';
+$messages['purgefolderconfirm'] = 'هل تريد حقاً حذف جميع الرسائل في هذا المجلد؟';
+$messages['formincomplete'] = 'لم يتم تعبئة بيانات الاستمارة بالكامل';
+$messages['noemailwarning'] = 'الرجاء إدخال عنوان بريد إلكتروني صالح';
+$messages['nonamewarning'] = 'الرجاء إدخال اسم';
+$messages['nopagesizewarning'] = 'الرجاء إدخال حجم الصفحة';
+$messages['norecipientwarning'] = 'الرجاء إدخال اسم مستقبل واحد على الأقل';
+$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['deletedsuccessfully'] = 'تم الحذف بنجاح';
+$messages['converting'] = 'إزالة التنسيق من الرسالة...';
+$messages['messageopenerror'] = 'تعذرت قراءة الرسالة من الخادم';
+$messages['fileuploaderror'] = 'فشل رفع الملف';
+$messages['filesizeerror'] = 'حجم الملف الذي تحاول رفعه أكبر من الحجم الأقصى $size';
+$messages['copysuccess'] = 'تم نسخ $nr رسائل بنجاح';
+$messages['copyerror'] = 'لم يمكن نسخ أية عناوين';
+$messages['sourceisreadonly'] = 'لا يمكن تعديل مصدر العنوان هذا';
+$messages['errorsavingcontact'] = 'تعذر حفظ عنوان المراسل';
+
+?>
\ No newline at end of file
index 7046bdb44cd7d5d8cdaa798f276403fe849e4ab6..ffedb30ff6dda09c90366ca2ace8e534b90aefdb 100644 (file)
@@ -1,4 +1,4 @@
-<?php
+<?php
 
 /*
 
@@ -14,7 +14,7 @@
  |         Simo <sim6@graciasensefils.net>                               |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 560 2007-05-17 15:01:26Z thomasb $
+ @version $Id: labels.inc 872 2007-10-16 09:27:16Z yllar $
 
 */
 
@@ -75,7 +75,8 @@ $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'] = 'Moure missatge a la paperera';
+$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';
@@ -100,8 +101,8 @@ $labels['unlimited'] = 'il·limitat';
 $labels['quicksearch'] = 'Cerca ràpida';
 $labels['resetsearch'] = 'Neteja cerca';
 $labels['compose'] = 'Escriure un missatge';
-$labels['sendmessage'] = 'Enviar ara el missatge';
 $labels['savemessage'] = 'Desa aquest esborrany';
+$labels['sendmessage'] = 'Enviar ara el missatge';
 $labels['addattachment'] = 'Afegir un fitxer';
 $labels['charset'] = 'Codificació de caràcters';
 $labels['editortype'] = 'Tipus d\'editor';
@@ -121,6 +122,9 @@ $labels['nosubject'] = '(sense assumpte)';
 $labels['showimages'] = 'Mostra imatges';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Text pla';
+$labels['addcc'] = 'Afegir Cc';
+$labels['addbcc'] = 'Afegir Bcc';
+$labels['addreplyto'] = 'Afegir Reply-To';
 $labels['name'] = 'Nom a mostrar';
 $labels['firstname'] = 'Nom';
 $labels['surname'] = 'Cognom';
@@ -178,4 +182,4 @@ $labels['sortby'] = 'Ordena per';
 $labels['sortasc'] = 'Ordena ascendentment';
 $labels['sortdesc'] = 'Ordena descendentment';
 
-?>
+?>
\ No newline at end of file
index c5f8b17e6942fbf6a65aac437090f55a9a4902b6..143db699737887fea31d9da5439481bfeecfeb62 100644 (file)
@@ -1,4 +1,4 @@
-<?php
+<?php
 
 /*
 
@@ -14,7 +14,7 @@
  |         Simo <sim6@graciasensefils.net>                               |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 560 2007-05-17 15:01:26Z thomasb $
+ @version $Id: messages.inc 872 2007-10-16 09:27:16Z yllar $
 
 */
 
@@ -74,5 +74,6 @@ $messages['copysuccess'] = 'S\'ha 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['movingmessage'] = 'Movent el missatge...';
 
 ?>
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index a690e52..a8cb285
  |        joe <joe@humlak.cz>                                            |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 553 2007-05-13 16:31:19Z thomasb $
+ @version $Id: labels.inc 869 2007-10-15 13:27:08Z yllar $
 
 */
 
 $labels = array();
-
-// login page
-$labels['username']  = 'Uživatel';
-$labels['password']  = 'Heslo';
-$labels['server']    = 'Server';
-$labels['login']     = 'Přihlásit';
-
-// taskbar
-$labels['logout']   = 'Odhlásit';
-$labels['mail']     = 'E-mail';
+$labels['welcome'] = 'Vítejte v $product';
+$labels['username'] = 'Uživatel';
+$labels['password'] = 'Heslo';
+$labels['server'] = 'Server';
+$labels['login'] = 'Přihlásit';
+$labels['logout'] = 'Odhlásit';
+$labels['mail'] = 'E-mail';
 $labels['settings'] = 'Osobní nastavení';
 $labels['addressbook'] = 'Adresář';
-
-// mailbox names
-$labels['inbox']  = 'Příchozí pošta';
-$labels['sent']   = 'Odeslané';
-$labels['trash']  = 'Koš';
+$labels['inbox'] = 'Příchozí pošta';
 $labels['drafts'] = 'Rozepsané';
-$labels['junk']   = 'Nevyžádaná pošta';
-
-// message listing
+$labels['sent'] = 'Odeslané';
+$labels['trash'] = 'Koš';
+$labels['junk'] = 'Nevyžádaná pošta';
 $labels['subject'] = 'Předmět';
-$labels['from']    = 'Odesílatel';
-$labels['to']      = 'Adresát';
-$labels['cc']      = 'Kopie';
-$labels['bcc']     = 'Slepá';
+$labels['from'] = 'Odesílatel';
+$labels['to'] = 'Adresát';
+$labels['cc'] = 'Kopie';
+$labels['bcc'] = 'Slepá';
 $labels['replyto'] = 'Odpověď na';
-$labels['date']    = 'Datum';
-$labels['size']    = 'Velikost';
+$labels['date'] = 'Datum';
+$labels['size'] = 'Velikost';
 $labels['priority'] = 'Priorita';
 $labels['organization'] = 'Organizace';
-
-// aliases
-$labels['reply-to'] = $labels['replyto'];
-
+$labels['reply-to'] = 'Odpověď na';
 $labels['mailboxlist'] = 'Složky';
 $labels['messagesfromto'] = 'Zprávy $from až $to z celkem $count';
 $labels['messagenrof'] = 'Zpráva $nr z $count';
-
-$labels['moveto']   = 'přesunout do...';
+$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';
-
-// weekdays short
 $labels['sun'] = 'Ne';
 $labels['mon'] = 'Po';
 $labels['tue'] = 'Út';
@@ -78,167 +62,124 @@ $labels['wed'] = 'St';
 $labels['thu'] = 'Čt';
 $labels['fri'] = 'Pá';
 $labels['sat'] = 'So';
-
-// weekdays long
-$labels['sunday']    = 'Neděle';
-$labels['monday']    = 'Pondělí';
-$labels['tuesday']   = 'Úterý';
+$labels['sunday'] = 'Neděle';
+$labels['monday'] = 'Pondělí';
+$labels['tuesday'] = 'Úterý';
 $labels['wednesday'] = 'Středa';
-$labels['thursday']  = 'Čtvrtek';
-$labels['friday']    = 'Pátek';
-$labels['saturday']  = 'Sobota';
-
+$labels['thursday'] = 'Čtvrtek';
+$labels['friday'] = 'Pátek';
+$labels['saturday'] = 'Sobota';
 $labels['today'] = 'Dnes';
-
-// toolbar buttons
-$labels['writenewmessage']  = 'Vytvořit novou zprávu';
-$labels['replytomessage']   = 'Odpovědět odesílateli';
+$labels['checkmail'] = 'Zkontrolovat nové zprávy';
+$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['printmessage']     = 'Vytisknout zprávu';
+$labels['forwardmessage'] = 'Předat zprávu';
+$labels['deletemessage'] = 'Přesunout do koše';
+$labels['movemessagetotrash'] = 'Přesunout zprávu do koše';
+$labels['printmessage'] = 'Vytisknout zprávu';
+$labels['previousmessage'] = 'Zobrazit předchozí zprávu';
 $labels['previousmessages'] = 'Zobrazit předchozí zprávy';
-$labels['nextmessages']     = 'Zobrazit další zprávy';
-$labels['backtolist']       = 'Zpět do seznamu zpráv';
-$labels['viewsource']       = 'Zobrazit zdroj';
-
+$labels['firstmessage'] = 'Zobrazit první zprávu';
+$labels['firstmessages'] = 'Zobrazit první zprávy';
+$labels['nextmessage'] = 'Zobrazit další zprávu';
+$labels['nextmessages'] = 'Zobrazit další zprávy';
+$labels['lastmessage'] = 'Zobrazit poslední zprávu';
+$labels['lastmessages'] = 'Zobrazit poslední zprávy';
+$labels['backtolist'] = 'Zpět do seznamu zpráv';
+$labels['viewsource'] = 'Zobrazit zdroj';
 $labels['select'] = 'Vybrat';
 $labels['all'] = 'Vše';
 $labels['none'] = 'Nic';
 $labels['unread'] = 'Nepřečtené';
-
-// message compose
-$labels['compose']  = 'Napsat zprávu';
-$labels['sendmessage']  = 'Odeslat zprávu nyní';
-$labels['addattachment']  = 'Přidat přílohu';
-
-$labels['attachments'] = 'Přílohy';
-$labels['upload'] = 'Nahrát';
-$labels['close']  = 'Zavřít';
-
-$labels['low']     = 'Nízká';
-$labels['lowest']  = 'Nejnižší';
-$labels['normal']  = 'Normální';
-$labels['high']    = 'Vysoká';
-$labels['highest'] = 'Nejvyšší';
-
-$labels['showimages'] = 'Zobrazit obrázky';
-
-
-// address boook
-$labels['name']      = 'Zobrazit jméno';
-$labels['firstname'] = 'Jméno';
-$labels['surname']   = 'Příjmení';
-$labels['email']     = 'E-mail';
-
-$labels['addcontact'] = 'Přidat kontakt';
-$labels['editcontact'] = 'Upravit kontakt';
-
-$labels['edit']   = 'Upravit';
-$labels['cancel'] = 'Konec';
-$labels['save']   = 'Uložit';
-$labels['delete'] = 'Smazat';
-
-$labels['newcontact']     = 'Vytvořit nový kontakt';
-$labels['deletecontact']  = 'Smazat vybrané kontakty';
-$labels['composeto']      = 'Poslat e-mail';
-$labels['contactsfromto'] = 'Kontakty $from až $to z celkem $count';
-$labels['print']          = 'Tisk';
-$labels['export']         = 'Export';
-
-
-// settings
-$labels['settingsfor']  = 'Nastavení pro';
-
-$labels['preferences']  = 'Vlastnosti';
-$labels['userpreferences']  = 'Vlastnosti uživatele';
-$labels['editpreferences']  = 'Upravit vlastnosti uživatele';
-
-$labels['identities']  = 'Profily';
-$labels['manageidentities']  = 'Spravovat profily u tohoto účtu';
-$labels['newidentity']  = 'Nový profil';
-
-$labels['newitem']  = 'Nová položka';
-$labels['edititem']  = 'Upravit položku';
-
-$labels['setdefault']  = 'Nastavit výchozí';
-$labels['language']  = 'Jazyk';
-$labels['timezone']  = 'Časová zóna';
-$labels['pagesize']  = 'Řádků na stránku';
-
-$labels['folders']  = 'Složky';
-$labels['folder']  = 'Složka';
-$labels['foldername']  = 'Jméno složky';
-$labels['subscribed']  = 'Vybráno';
-$labels['create']  = 'Vytvořit';
-$labels['createfolder']  = 'Vytvořit novou složku';
-$labels['deletefolder']  = 'Smazat složku';
-$labels['managefolders']  = 'Spravovat složky';
-
 $labels['compact'] = 'Kompaktní';
 $labels['empty'] = 'Prázdný';
 $labels['purge'] = 'Vyprázdnit';
 $labels['quota'] = 'Využití schránky';
-
-$labels['sortby']   = 'Seřadit podle';
-$labels['sortdesc'] = 'Seřadit sestupně';
-$labels['sortasc']  = 'Seřadit vzestupně';
-
-$labels['nosubject']  = '(bez predmetu)';
-$labels['signature'] = 'Podpis';
-$labels['charset']  = 'Znaková sada';
-
-$labels['ldapsearch'] = 'Hledat v LDAP adresáři';
-$labels['ldappublicsearchname']    = 'Jméno kontaktu';
-$labels['ldappublicsearchtype'] = 'Doslovné znění?';
-$labels['ldappublicserverselect'] = 'Zvolit servery';
-$labels['ldappublicsearchfield'] = 'Hledat na';
-$labels['ldappublicsearchform'] = 'Hledat kontakt';
-$labels['ldappublicsearch'] = 'Hledat';
-
-$labels['welcome'] = 'Vítejte v $product';
-
 $labels['unknown'] = 'neznámý';
 $labels['unlimited'] = 'neomezený';
-$labels['dstactive'] = 'Letní čas';
-
-$labels['previouspage'] = 'Předchozí';
-$labels['nextpage']     = 'Další';
-
+$labels['quicksearch'] = 'Rychlé vyhledávání';
+$labels['resetsearch'] = 'Zrušit vyhledávání';
+$labels['compose'] = 'Napsat zprávu';
+$labels['savemessage'] = 'Uložit do rozepsaných';
+$labels['sendmessage'] = 'Odeslat zprávu nyní';
+$labels['addattachment'] = 'Přidat přílohu';
+$labels['charset'] = 'Znaková sada';
+$labels['editortype'] = 'Typ editoru zpráv';
 $labels['returnreceipt'] = 'Doručenka';
-
-$labels['checkmail'] = 'Zkontrolovat nové zprávy';
 $labels['checkspelling'] = 'Zkontrolovat pravopis';
 $labels['resumeediting'] = 'Pokračovat v úpravách';
 $labels['revertto'] = 'Přejít na';
-
-$labels['savemessage']  = 'Uložit do rozepsaných';
-$labels['rename'] = 'Přejmenovat';
-$labels['renamefolder'] = 'Přejmenovat složku';
-
-$labels['description'] = 'Popis';
-
-$labels['previousmessage']  = 'Zobrazit předchozí zprávu';
-$labels['firstmessage']     = 'Zobrazit první zprávu';
-$labels['firstmessages']    = 'Zobrazit první zprávy';
-$labels['nextmessage']      = 'Zobrazit další zprávu';
-$labels['lastmessage']      = 'Zobrazit poslední zprávu';
-$labels['lastmessages']     = 'Zobrazit poslední zprávy';
-$labels['quicksearch']  = 'Rychlé vyhledávání';
-$labels['resetsearch']  = 'Zrušit vyhledávání';
-$labels['editortype'] = 'Typ editoru zpráv';
+$labels['attachments'] = 'Přílohy';
+$labels['upload'] = 'Nahrát';
+$labels['close'] = 'Zavřít';
+$labels['low'] = 'Nízká';
+$labels['lowest'] = 'Nejnižší';
+$labels['normal'] = 'Normální';
+$labels['high'] = 'Vysoká';
+$labels['highest'] = 'Nejvyšší';
+$labels['nosubject'] = '(bez predmetu)';
+$labels['showimages'] = 'Zobrazit obrázky';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Prostý text';
-$labels['firstpage']  = 'Zobrazit první zprávy';
-$labels['lastpage']   = 'Zobrazit poslední zprávy';
+$labels['addcc'] = 'Přidat pole "Kopie"';
+$labels['addbcc'] = 'Přidat pole "Skrytá Kopie"';
+$labels['addreplyto'] = 'Přidat pole "Odpověď"';
+$labels['name'] = 'Zobrazit jméno';
+$labels['firstname'] = 'Jméno';
+$labels['surname'] = 'Příjmení';
+$labels['email'] = 'E-mail';
+$labels['addcontact'] = 'Přidat kontakt';
+$labels['editcontact'] = 'Upravit kontakt';
+$labels['edit'] = 'Upravit';
+$labels['cancel'] = 'Konec';
+$labels['save'] = 'Uložit';
+$labels['delete'] = 'Smazat';
+$labels['newcontact'] = 'Vytvořit nový kontakt';
+$labels['deletecontact'] = 'Smazat vybrané kontakty';
+$labels['composeto'] = 'Poslat e-mail';
+$labels['contactsfromto'] = 'Kontakty $from až $to z celkem $count';
+$labels['print'] = 'Tisk';
+$labels['export'] = 'Export';
+$labels['previouspage'] = 'Předchozí';
+$labels['firstpage'] = 'Zobrazit první zprávy';
+$labels['nextpage'] = 'Další';
+$labels['lastpage'] = 'Zobrazit poslední zprávy';
 $labels['groups'] = 'Skupiny';
 $labels['personaladrbook'] = 'Osobní kontakty';
+$labels['settingsfor'] = 'Nastavení pro';
+$labels['preferences'] = 'Vlastnosti';
+$labels['userpreferences'] = 'Vlastnosti uživatele';
+$labels['editpreferences'] = 'Upravit vlastnosti uživatele';
+$labels['identities'] = 'Profily';
+$labels['manageidentities'] = 'Spravovat profily u tohoto účtu';
+$labels['newidentity'] = 'Nový profil';
+$labels['newitem'] = 'Nová položka';
+$labels['edititem'] = 'Upravit položku';
+$labels['setdefault'] = 'Nastavit výchozí';
+$labels['language'] = 'Jazyk';
+$labels['timezone'] = 'Časová zóna';
+$labels['pagesize'] = 'Řádků na stránku';
+$labels['signature'] = 'Podpis';
+$labels['dstactive'] = 'Letní čas';
 $labels['htmleditor'] = 'Vytvářet HTML zprávy';
 $labels['htmlsignature'] = 'HTML podpis';
 $labels['previewpane'] = 'Zobrazit panel náhledu';
-$labels['autosavedraft']  = 'Automaticky uložit rozepsané zprávy';
-$labels['everynminutes']  = 'každých $n minut';
-$labels['never']  = 'nikdy';
-
+$labels['autosavedraft'] = 'Automaticky uložit rozepsané zprávy';
+$labels['everynminutes'] = 'každých $n minut';
+$labels['never'] = 'nikdy';
+$labels['folder'] = 'Složka';
+$labels['folders'] = 'Složky';
+$labels['foldername'] = 'Jméno složky';
+$labels['subscribed'] = 'Vybráno';
+$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['sortby'] = 'Seřadit podle';
+$labels['sortasc'] = 'Seřadit vzestupně';
+$labels['sortdesc'] = 'Seřadit sestupně';
 
-?>
+?>
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 106f3df..97c3042
  |        joe <joe@humlak.cz>                                            |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 553 2007-05-13 16:31:19Z thomasb $
+ @version $Id: messages.inc 869 2007-10-15 13:27:08Z yllar $
 
 */
 
 $messages = array();
-
-$messages['loginfailed']  = 'Přihlášení selhalo';
+$messages['loginfailed'] = 'Přihlášení selhalo';
 $messages['cookiesdisabled'] = 'Váš prohlížeč nepodporuje cookies, které jsou pro přihlášení nezbytné';
 $messages['sessionerror'] = 'Vaše přihlášení je neplatné nebo vypršelo';
 $messages['imaperror'] = 'Připojení na IMAP server selhalo';
 $messages['nomessagesfound'] = 'Ve schránce nebyla nalezena žádná zpráva';
 $messages['loggedout'] = 'Byli jste úspěšně odhlášeni. Nashledanou!';
 $messages['mailboxempty'] = 'Schránka je prázdná';
+$messages['loading'] = 'Načítám...';
 $messages['loadingdata'] = 'Načítám data...';
+$messages['checkingmail'] = 'Kontroluji nové zprávy...';
+$messages['sendingmessage'] = 'Odesílám zprávu...';
 $messages['messagesent'] = 'Zpráva byla odeslána';
+$messages['savingmessage'] = 'Ukládám zprávu...';
+$messages['messagesaved'] = 'Zpráva uložena do Rozepsané';
 $messages['successfullysaved'] = 'Uloženo';
 $messages['addedsuccessfully'] = 'Kontakt byl úspěšně přidán do adresáře';
 $messages['contactexists'] = 'Kontakt se zadanou e-mailovou adresou již existuje';
 $messages['blockedimages'] = 'Z bezpečnostních důvodů byly zablokovány obrázky ve zprávě.';
 $messages['encryptedmessage'] = 'Tato zpráva je zašifrovaná a nelze ji zobrazit.';
 $messages['nocontactsfound'] = 'Nemáte žádné kontakty';
+$messages['contactnotfound'] = 'Požadovaný kontakt nebyl nalezen.';
 $messages['sendingfailed'] = 'Odesílání zprávy selhalo';
 $messages['errorsaving'] = 'Vyskytla se chyba při ukládání';
 $messages['errormoving'] = 'Nemohu přesunout zprávu';
 $messages['errordeleting'] = 'Nemohu smazat zprávu';
-$messages['loading'] = 'Načítám...';
-$messages['sendingmessage'] = 'Odesílám zprávu...';
+$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['formincomplete'] = 'Formulář nebyl korektně vyplněn';
 $messages['noemailwarning'] = 'Zadejte, prosím, platnou adresu';
-$messages['nonamewarning']  = 'Zadejte, prosím, jméno';
+$messages['nonamewarning'] = 'Zadejte, prosím, jméno';
 $messages['nopagesizewarning'] = 'Zadejte, prosím, velikost stránky';
-$messages['formincomplete']    = 'Formulář nebyl korektně vyplněn';
 $messages['norecipientwarning'] = 'Zadejte, prosím, alespoň jednoho příjemce';
-$messages['nosubjectwarning']  = 'Předmět nebyl vyplňen. Přejete si jej zadat nyní?';
+$messages['nosubjectwarning'] = 'Předmět nebyl vyplňen. Přejete si jej zadat nyní?';
 $messages['nobodywarning'] = 'Opravdu chtete odeslat prázdnou zprávu?';
-$messages['deletefolderconfirm']  = 'Chcete opravdu smazat tento adresář?';
 $messages['notsentwarning'] = 'Zpráva nebyla odeslána. Přejete si zprávu zahodit?';
 $messages['noldapserver'] = 'Zvolte, prosím, LDAP server k hledání';
 $messages['nocontactsreturned'] = 'Nebyly nalezeny žádné kontakty';
 $messages['nosearchname'] = 'Zadejte, prosím, jméno nebo e-mail kontaktu';
-$messages['checking'] = 'Kontroluji...';
-$messages['nospellerrors'] = 'Nebyly nalezeny žádné chyby';
-$messages['checkingmail'] = 'Kontroluji nové zprávy...';
-$messages['savingmessage'] = 'Ukládám zprávu...';
-$messages['messagesaved'] = 'Zpráva uložena do Rozepsané';
-$messages['folderdeleted'] = 'Složka byla úspěšně vymazána';
-
-$messages['contactnotfound'] = 'Požadovaný kontakt nebyl nalezen.';
-$messages['deletecontactconfirm']  = 'Opravdu chcete smazat označené kontakty?';
-$messages['deletemessagesconfirm'] = 'Opravdu chcete smazat označené zprávy?';
-$messages['purgefolderconfirm']  = 'Opravdu chcete smazat všechny zprávy v této složce?';
 $messages['searchsuccessful'] = '$nr zpráv nalezeno';
 $messages['searchnomatch'] = 'Nenalezena žádná zpráva';
 $messages['searching'] = 'Vyhledávám...';
-$messages['deletedsuccessfully'] = "Úspěšně smazáno";
+$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['messageopenerror'] = 'Nemohu načíst zprávu ze serveru';
 $messages['fileuploaderror'] = 'Nahrávání souboru selhalo';
@@ -76,5 +74,6 @@ $messages['copysuccess'] = 'Úspěšně zkopírováno $nr adres';
 $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...';
 
-?>
+?>
\ No newline at end of file
index 923733b2a3560acff535ce4b074f2b743043b092..76b35d1894886f46e544a638c6aecbf0c7986bf8 100644 (file)
@@ -15,7 +15,7 @@
  |         Søren Aggeboe <soren@aggeboe.dk>                              |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 553 2007-05-13 16:31:19Z thomasb $
+ @version $Id: labels.inc 886 2007-10-19 07:24:53Z yllar $
 
 */
 
@@ -76,7 +76,8 @@ $labels['writenewmessage'] = 'Skriv en ny besked';
 $labels['replytomessage'] = 'Svar på denne besked';
 $labels['replytoallmessage'] = 'Svar til alle modtagere';
 $labels['forwardmessage'] = 'Videresend denne besked';
-$labels['deletemessage'] = 'Flyt beskeden til skrald';
+$labels['deletemessage'] = 'Slet besked';
+$labels['movemessagetotrash'] = 'Flyt besked til skrald';
 $labels['printmessage'] = 'Udskriv denne besked';
 $labels['previousmessage'] = 'Vis forrige besked';
 $labels['previousmessages'] = 'Vis forrige sæt beskeder';
@@ -101,8 +102,8 @@ $labels['unlimited'] = 'ubegrænset';
 $labels['quicksearch'] = 'Hurtigsøgning';
 $labels['resetsearch'] = 'Nulstil søgning';
 $labels['compose'] = 'Forfat en besked';
-$labels['sendmessage'] = 'Send beskeden nu';
 $labels['savemessage'] = 'Gem denne kladde';
+$labels['sendmessage'] = 'Send beskeden nu';
 $labels['addattachment'] = 'Vedhæft en fil';
 $labels['charset'] = 'Tegnsæt';
 $labels['editortype'] = 'Tekstbehandler';
@@ -122,6 +123,9 @@ $labels['nosubject'] = '(intet emne)';
 $labels['showimages'] = 'Vis billeder';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Almindelig tekst';
+$labels['addcc'] = 'Tilføj Cc';
+$labels['addbcc'] = 'Tilføj Bcc';
+$labels['addreplyto'] = 'Tilføj Svar-Til adresse';
 $labels['name'] = 'Vist navn';
 $labels['firstname'] = 'Fornavn';
 $labels['surname'] = 'Efternavn';
@@ -179,4 +183,4 @@ $labels['sortby'] = 'Sortér efter';
 $labels['sortasc'] = 'Ældste først';
 $labels['sortdesc'] = 'Nyeste først';
 
-?>
+?>
\ No newline at end of file
index 6d14f8e51dd8b740d90eb685b5187b8e7462ad0e..b0e6306596c2613ad46f1a58d8a44ada0145b349 100644 (file)
@@ -15,7 +15,7 @@
  |         Søren Aggeboe <soren@aggeboe.dk>                              |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 553 2007-05-13 16:31:19Z thomasb $
+ @version $Id: messages.inc 886 2007-10-19 07:24:53Z yllar $
 
 */
 
@@ -75,5 +75,6 @@ $messages['copysuccess'] = 'Det lykkedes at kopiere $nr adresser';
 $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...';
 
-?>
+?>
\ No newline at end of file
index 0456ff272731a6f5b3c9331177a3df06bd5c7ad8..425ac229aa4c88af05a645c6983a6e76d5c88a4f 100644 (file)
@@ -14,7 +14,7 @@
  | Corrections: Alexander Stiebing <ja.stiebing[NOSPAM]@web.de>          |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 549 2007-05-01 18:53:56Z thomasb $
+ @version $Id: labels.inc 816 2007-09-26 08:13:21Z thomasb $
 
 */
 
@@ -97,7 +97,8 @@ $labels['writenewmessage']  = 'Neue Nachricht schreiben';
 $labels['replytomessage']   = 'Antwort verfassen';
 $labels['replytoallmessage'] = 'Antwort an Absender und alle Empfänger';
 $labels['forwardmessage']   = 'Nachricht weiterleiten';
-$labels['deletemessage']    = 'In den Papierkorb verschieben';
+$labels['deletemessage']    = 'Nachricht löschen';
+$labels['movemessagetotrash'] = 'Nachricht in den Papierkorb verschieben';
 $labels['printmessage']     = 'Diese Nachricht drucken';
 $labels['previousmessage']  = 'Vorherige Nachricht anzeigen';
 $labels['previousmessages'] = 'Vorherige Nachrichten anzeigen';
@@ -156,6 +157,10 @@ $labels['showimages'] = 'Bilder anzeigen';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Klartext';
 
+$labels['addcc'] = 'Cc hinzufügen';
+$labels['addbcc'] = 'Bcc hinzufügen';
+$labels['addreplyto'] = 'Antwortadresse hinzufügen';
+
 
 // address book // Adressbuch
 $labels['name']      = 'Anzeigename';
index c29841f2b13c8169d6be00f7d2328d0f5db5b2fc..2f69c147d4b9c4b4b1d59a1c0fc914e7aa615285 100644 (file)
@@ -13,7 +13,7 @@
  | Author: Stephan Diehl <info@sd-edv.de>                                |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 549 2007-05-01 18:53:56Z thomasb $
+ @version $Id: labels.inc 858 2007-10-04 10:14:19Z Stiwi $
 
 */
 
@@ -74,7 +74,8 @@ $labels['writenewmessage'] = 'Neue Nachricht schreiben';
 $labels['replytomessage'] = 'Antwort verfassen';
 $labels['replytoallmessage'] = 'Antwort an Absender und alle Empfänger';
 $labels['forwardmessage'] = 'Nachricht weiterleiten';
-$labels['deletemessage'] = 'Nachricht in den Papierkorb verschieben';
+$labels['deletemessage'] = 'Nachricht löschen';
+$labels['movemessagetotrash'] = 'Nachricht in den Papierkorb verschieben';
 $labels['printmessage'] = 'Diese Nachricht drucken';
 $labels['previousmessage'] = 'Vorherige Nachricht anzeigen';
 $labels['previousmessages'] = 'Vorherige Nachrichten anzeigen';
@@ -99,8 +100,8 @@ $labels['unlimited'] = 'unbegrenzt';
 $labels['quicksearch'] = 'Schnellsuche';
 $labels['resetsearch'] = 'Suche zurücksetzen';
 $labels['compose'] = 'Neue Nachricht verfassen';
-$labels['sendmessage'] = 'Nachricht jetzt senden';
 $labels['savemessage'] = 'Nachricht speichern';
+$labels['sendmessage'] = 'Nachricht jetzt senden';
 $labels['addattachment'] = 'Datei anfügen';
 $labels['charset'] = 'Zeichensatz';
 $labels['editortype'] = 'Editor Typ';
@@ -120,6 +121,9 @@ $labels['nosubject'] = '(kein Betreff)';
 $labels['showimages'] = 'Bilder anzeigen';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Nur-Text';
+$labels['addcc'] = 'Cc hinzufügen';
+$labels['addbcc'] = 'Bcc hinzufügen';
+$labels['addreplyto'] = 'Antwortadresse hinzufügen';
 $labels['name'] = 'Anzeigename';
 $labels['firstname'] = 'Vorname';
 $labels['surname'] = 'Nachname';
@@ -177,4 +181,4 @@ $labels['sortby'] = 'Sortieren nach';
 $labels['sortasc'] = 'Aufsteigend sortieren';
 $labels['sortdesc'] = 'Absteigend sortieren';
 
-?>
\ No newline at end of file
+?>
index f742eaea382b788a3f8a77ded6c4561248e89a95..ea109a953ce28db92d64883c5655ea3daec80d44 100644 (file)
@@ -1,4 +1,4 @@
-<?php
+<?php
 
 /*
 
@@ -13,7 +13,7 @@
  | Author: Stephan Diehl <info@sd-edv.de>                                |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 557 2007-05-15 06:41:32Z yllar $
+ @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
@@ -73,5 +73,6 @@ $messages['copysuccess'] = '$nr Adressen erfolgreich kopiert';
 $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...';
 
 ?>
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index cdfee08..8ba5cf8
@@ -14,7 +14,7 @@
  |         John Economou <hsoc@irc.gr>                                   | 
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 619 2007-06-13 07:09:09Z thomasb $
+ @version $Id: labels.inc 612 2007-06-12 18:17:21Z thomasb $
 
 */
 
old mode 100755 (executable)
new mode 100644 (file)
index a5fb405..c490f58
@@ -14,7 +14,7 @@
  |         John Economou <hsoc@irc.gr>                                   | 
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 619 2007-06-13 07:09:09Z thomasb $
+ @version $Id: messages.inc 612 2007-06-12 18:17:21Z thomasb $
 
 */
 
index 83e204a58a83d5c30e9af9b9b4b48f1727e6301d..7d26459a3684d24d37977633414cd91129bb8999 100644 (file)
@@ -13,7 +13,7 @@
  | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 543 2007-04-28 18:07:12Z thomasb $
+ @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
@@ -37,7 +37,6 @@ $labels['inbox']  = 'Inbox';
 $labels['drafts'] = 'Drafts';
 $labels['sent']   = 'Sent';
 $labels['trash']  = 'Deleted Items';
-$labels['drafts'] = 'Drafts';
 $labels['junk']   = 'Junk';
 
 // message listing
@@ -65,7 +64,7 @@ $labels['download'] = 'download';
 $labels['filename'] = 'File name';
 $labels['filesize'] = 'File size';
 
-$labels['preferhtml'] = 'Prefer HTML';
+$labels['preferhtml'] = 'Display HTML';
 $labels['htmlmessage'] = 'HTML Message';
 $labels['prettydate'] = 'Pretty dates';
 
@@ -97,10 +96,17 @@ $labels['writenewmessage']  = 'Create a new message';
 $labels['replytomessage']   = 'Reply to the message';
 $labels['replytoallmessage'] = 'Reply to sender and all recipients';
 $labels['forwardmessage']   = 'Forward the message';
-$labels['deletemessage']    = 'Move message to trash';
+$labels['deletemessage']    = 'Delete message';
+$labels['movemessagetotrash'] = 'Move message to "Deleted Items"';
 $labels['printmessage']     = 'Print this message';
+$labels['previousmessage']  = 'Show the previous message';
 $labels['previousmessages'] = 'Show previous set of messages';
+$labels['firstmessage']     = 'Show the first message';
+$labels['firstmessages']    = 'Show first set of messages';
+$labels['nextmessage']      = 'Show the next message';
 $labels['nextmessages']     = 'Show next set of messages';
+$labels['lastmessage']      = 'Show the last message';
+$labels['lastmessages']     = 'Show last set of messages';
 $labels['backtolist']       = 'Back to message list';
 $labels['viewsource']       = 'Show source';
 
@@ -114,14 +120,25 @@ $labels['empty'] = 'Empty';
 $labels['purge'] = 'Purge';
 
 $labels['quota'] = 'Disk usage';
+$labels['unknown']  = 'unknown';
+$labels['unlimited']  = 'unlimited';
+
+$labels['quicksearch']  = 'Quick search';
+$labels['resetsearch']  = 'Reset search';
 
 
 // message compose
-$labels['compose']  = 'Compose a message';
-$labels['savemessage']  = 'Save this draft';
-$labels['sendmessage']  = 'Send the message now';
+$labels['compose']        = 'Compose a message';
+$labels['savemessage']    = 'Save this draft';
+$labels['sendmessage']    = 'Send the message now';
 $labels['addattachment']  = 'Attach a file';
-$labels['charset']  = 'Charset';
+$labels['charset']        = 'Charset';
+$labels['editortype']     = 'Editor type';
+$labels['returnreceipt']  = 'Return receipt';
+
+$labels['checkspelling'] = 'Check spelling';
+$labels['resumeediting'] = 'Resume editing';
+$labels['revertto']      = 'Revert to';
 
 $labels['attachments'] = 'Attachments';
 $labels['upload'] = 'Upload';
@@ -136,6 +153,9 @@ $labels['highest'] = 'Highest';
 $labels['nosubject']  = '(no subject)';
 $labels['showimages'] = 'Display images';
 
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Plain text';
+
 
 // address boook
 $labels['name']      = 'Display name';
@@ -158,6 +178,14 @@ $labels['contactsfromto'] = 'Contacts $from to $to of $count';
 $labels['print']          = 'Print';
 $labels['export']         = 'Export';
 
+$labels['previouspage']   = 'Show previous set';
+$labels['firstpage']      = 'Show first set';
+$labels['nextpage']       = 'Show next set';
+$labels['lastpage']       = 'Show last set';
+
+$labels['groups'] = 'Groups';
+$labels['personaladrbook'] = 'Personal Addresses';
+
 
 // settings
 $labels['settingsfor']  = 'Settings for';
@@ -178,6 +206,14 @@ $labels['language']  = 'Language';
 $labels['timezone']  = 'Time zone';
 $labels['pagesize']  = 'Rows per page';
 $labels['signature'] = 'Signature';
+$labels['dstactive']  = 'Daylight savings';
+$labels['htmleditor'] = 'Compose HTML messages';
+$labels['htmlsignature'] = 'HTML signature';
+$labels['previewpane'] = 'Show preview pane';
+
+$labels['autosavedraft']  = 'Automatically save draft';
+$labels['everynminutes']  = 'every $n minutes';
+$labels['never']  = 'never';
 
 $labels['folder']  = 'Folder';
 $labels['folders']  = 'Folders';
@@ -185,6 +221,8 @@ $labels['foldername']  = 'Folder name';
 $labels['subscribed']  = 'Subscribed';
 $labels['create']  = 'Create';
 $labels['createfolder']  = 'Create new folder';
+$labels['rename'] = 'Rename';
+$labels['renamefolder'] = 'Rename folder';
 $labels['deletefolder']  = 'Delete folder';
 $labels['managefolders']  = 'Manage folders';
 
index cc31bf28e64b7880af41d971b3967d9cabb21649..dce6e124f32f02c7125d2348dfae1a0500660d4b 100644 (file)
  | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 466 2007-02-06 09:17:01Z tomekp $
+ @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
 $messages = array();
 $messages['loginfailed']  = 'Login failed';
 $messages['cookiesdisabled'] = 'Your browser does not accept cookies';
-$messages['sessionerror'] = 'Your session is invalid or expired';
+$messages['sessionerror'] = 'Your session is invalid or has expired';
 $messages['imaperror'] = 'Connection to IMAP server failed';
 $messages['nomessagesfound'] = 'No messages found in this mailbox';
 $messages['loggedout'] = 'You have successfully terminated the session. Good bye!';
@@ -28,37 +28,51 @@ $messages['mailboxempty'] = 'Mailbox is empty';
 $messages['loading'] = 'Loading...';
 $messages['loadingdata'] = 'Loading data...';
 $messages['checkingmail'] = 'Checking for new messages...';
+$messages['sendingmessage'] = 'Sending message...';
 $messages['messagesent'] = 'Message sent successfully';
 $messages['savingmessage'] = 'Saving message...';
 $messages['messagesaved'] = 'Message saved to Drafts';
 $messages['successfullysaved'] = 'Successfully saved';
-$messages['addedsuccessfully'] = 'Contact added successfully to address book';
+$messages['addedsuccessfully'] = 'Contact successfully added to address book';
 $messages['contactexists'] = 'A contact with this e-mail address already exists';
 $messages['blockedimages'] = 'To protect your privacy, remote images are blocked in this message.';
 $messages['encryptedmessage'] = 'This is an encrypted message and can not be displayed. Sorry!';
 $messages['nocontactsfound'] = 'No contacts found';
+$messages['contactnotfound'] = 'The requested contact was not found';
 $messages['sendingfailed'] = 'Failed to send message';
 $messages['errorsaving'] = 'An error occured while saving';
 $messages['errormoving'] = 'Could not move the message';
 $messages['errordeleting'] = 'Could not delete the message';
 $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['formincomplete'] = 'The form was not completely filled out';
 $messages['noemailwarning'] = 'Please enter a valid email address';
 $messages['nonamewarning']  = 'Please enter a name';
 $messages['nopagesizewarning'] = 'Please enter a page size';
 $messages['norecipientwarning'] = 'Please enter at least one recipient';
 $messages['nosubjectwarning']  = 'The "Subject" field is empty. Would you like to enter one now?';
-$messages['nobodywarning'] = 'Send this message without text?';
-$messages['notsentwarning'] = 'Message has not been sent. Do you want to discard your message?';
-$messages['noldapserver'] = 'Please select an ldap server to search';
+$messages['nobodywarning'] = 'Send this message without any text?';
+$messages['notsentwarning'] = 'Your message has not been sent. Do you want to discard it?';
+$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['searchsuccessful'] = '$nr messages found';
-$messages['searchnomatch'] = 'Search returned no matches';
+$messages['searchnomatch'] = 'Search found no matches';
 $messages['searching'] = 'Searching...';
 $messages['checking'] = 'Checking...';
 $messages['nospellerrors'] = 'No spelling errors found';
 $messages['folderdeleted'] = 'Folder successfully deleted';
+$messages['deletedsuccessfully'] = "Successfully deleted";
+$messages['converting'] = 'Removing formatting from message...';
+$messages['messageopenerror'] = 'Could not load message from server';
+$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['errorsavingcontact'] = 'Could not save the contact address';
+$messages['movingmessage'] = 'Moving message...';
 
 ?>
\ No newline at end of file
index b24ac0e7c104b110bb85a12ed88642d12b2edc16..c893a63b7e181c13c6098feb7da164d77107e696 100644 (file)
@@ -13,7 +13,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 543 2007-04-28 18:07:12Z thomasb $
+ @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
@@ -96,7 +96,8 @@ $labels['writenewmessage']  = 'Create a new message';
 $labels['replytomessage']   = 'Reply to the message';
 $labels['replytoallmessage'] = 'Reply to sender and all recipients';
 $labels['forwardmessage']   = 'Forward the message';
-$labels['deletemessage']    = 'Move message to trash';
+$labels['deletemessage']    = 'Delete message';
+$labels['movemessagetotrash'] = 'Move message to trash';
 $labels['printmessage']     = 'Print this message';
 $labels['previousmessage']  = 'Show the previous message';
 $labels['previousmessages'] = 'Show previous set of messages';
@@ -128,8 +129,8 @@ $labels['resetsearch']  = 'Reset search';
 
 // message compose
 $labels['compose']        = 'Compose a message';
+$labels['savemessage']    = 'Save this draft';
 $labels['sendmessage']    = 'Send the message now';
-$labels['savemessage']  = 'Save this draft';
 $labels['addattachment']  = 'Attach a file';
 $labels['charset']        = 'Charset';
 $labels['editortype']     = 'Editor type';
@@ -155,6 +156,10 @@ $labels['showimages'] = 'Display images';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Plain text';
 
+$labels['addcc'] = 'Add Cc';
+$labels['addbcc'] = 'Add Bcc';
+$labels['addreplyto'] = 'Add Reply-To';
+
 
 // address boook
 $labels['name']      = 'Display name';
index 587c71a4fef4f117de7b51f8fe63bcfd63cfa900..8240eda1dc3bcc160c89b9886fe283b081042e95 100644 (file)
@@ -3,7 +3,7 @@
 /*
 
  +-----------------------------------------------------------------------+
- | language/en/messages.inc                                              |
+ | language/en_US/messages.inc                                           |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
  | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
@@ -13,7 +13,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 543 2007-04-28 18:07:12Z thomasb $
+ @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
@@ -39,7 +39,6 @@ $messages['blockedimages'] = 'To protect your privacy, remote images are blocked
 $messages['encryptedmessage'] = 'This is an encrypted message and can not be displayed. Sorry!';
 $messages['nocontactsfound'] = 'No contacts found';
 $messages['contactnotfound'] = 'The requested contact was not found';
-
 $messages['sendingfailed'] = 'Failed to send message';
 $messages['errorsaving'] = 'An error occured while saving';
 $messages['errormoving'] = 'Could not move the message';
@@ -70,10 +69,10 @@ $messages['converting'] = 'Removing formatting from message...';
 $messages['messageopenerror'] = 'Could not load message from server';
 $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['errorsavingcontact'] = 'Could not save the contact address';
+$messages['movingmessage'] = 'Moving message...';
 
-?>
+?>
\ No newline at end of file
diff --git a/program/localization/eo/labels.inc b/program/localization/eo/labels.inc
new file mode 100644 (file)
index 0000000..9ec4f7a
--- /dev/null
@@ -0,0 +1,233 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/eo/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Andreas van Cranenburgh <andreas@unstable.nl>                 |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 858 2007-10-04 10:14:19Z Stiwi $
+
+*/
+
+
+$labels = array();
+
+// login page
+$labels['welcome']   = 'Bonvenon al $product';
+$labels['username']  = 'Uzanta-nomo';
+$labels['password']  = 'Pasvorto';
+$labels['server']    = 'Servilo';
+$labels['login']     = 'Ensalutu';
+
+// taskbar
+$labels['logout']   = 'Elsalutu';
+$labels['mail']     = 'Retpoŝto';
+$labels['settings'] = 'Preferoj';
+$labels['addressbook'] = 'Adresaro';
+
+// mailbox names
+$labels['inbox']  = 'Ricevitujo';
+$labels['drafts'] = 'Malnetujo';
+$labels['sent']   = 'Senditujo';
+$labels['trash']  = 'Rubujo';
+$labels['junk']   = 'Spamujo'; #FIXME. eble fatrasujo.
+
+// message listing
+$labels['subject'] = 'Subjekto'; #temo?
+$labels['from']    = 'Sendanto';
+$labels['to']      = 'Ricevanto';
+$labels['cc']      = 'Kopio';
+$labels['bcc']     = 'Blindkopio';
+$labels['replyto'] = 'Respondu-Al';
+$labels['date']    = 'Dato';
+$labels['size']    = 'Grando';
+$labels['priority'] = 'Prioritato';
+$labels['organization'] = 'Organizo';
+
+// aliases
+$labels['reply-to'] = $labels['replyto'];
+
+$labels['mailboxlist'] = 'Dosierujoj';
+$labels['messagesfromto'] = 'Mesaĝoj ekde $from ĝis $to de $count';
+$labels['messagenrof'] = 'Mesaĝo $nr-a de $count';
+
+$labels['moveto']   = 'transloku al...';
+$labels['download'] = 'elŝutu';
+
+$labels['filename'] = 'Dosiernomo';
+$labels['filesize'] = 'Dosiergrando';
+
+$labels['preferhtml'] = 'Montru HTML';
+$labels['htmlmessage'] = 'HTML Mesaĝo';
+$labels['prettydate'] = 'Agrablaj Datoj';
+
+$labels['addtoaddressbook'] = 'Aldonu al adresaro';
+
+// weekdays short
+$labels['sun'] = 'Dim';
+$labels['mon'] = 'Lun';
+$labels['tue'] = 'Mar';
+$labels['wed'] = 'Mer';
+$labels['thu'] = 'Ĵaŭ';
+$labels['fri'] = 'Ven';
+$labels['sat'] = 'Sab';
+
+// weekdays long
+$labels['sunday']    = 'Dimanĉo';
+$labels['monday']    = 'Luno';
+$labels['tuesday']   = 'Mardo';
+$labels['wednesday'] = 'Merkredo';
+$labels['thursday']  = 'Ĵaŭdo';
+$labels['friday']    = 'Vendredo';
+$labels['saturday']  = 'Sabato';
+
+$labels['today'] = 'Hodiaŭ';
+
+// toolbar buttons
+$labels['checkmail']        = 'Kontrolu por novaj mesaĝoj';
+$labels['writenewmessage']  = 'Verku novan mesaĝon';
+$labels['replytomessage']   = 'Respondu al mesaĝo';
+$labels['replytoallmessage'] = 'Respondu al sendanto kaj ĉiu ricevanto';
+$labels['forwardmessage']   = 'Plusendu mesaĝon';
+$labels['deletemessage']    = 'Transloku mesaĝon al rubujo';
+$labels['printmessage']     = 'Printu ĉi tiun mesaĝon';
+$labels['previousmessage']  = 'Montru antaŭan mesaĝon';
+$labels['previousmessages'] = 'Montru antaŭan aron de mesaĝoj';
+$labels['firstmessage']     = 'Montru unuan mesaĝon';
+$labels['firstmessages']    = 'Montru unuan aron de mesaĝoj';
+$labels['nextmessage']      = 'Montru sekvan mesaĝon';
+$labels['nextmessages']     = 'Montru sekvan aron de mesaĝoj';
+$labels['lastmessage']      = 'Montru lastan mesaĝon';
+$labels['lastmessages']     = 'Montru lastan aron de mesaĝoj';
+$labels['backtolist']       = 'Reen al mesaĝo-listo';
+$labels['viewsource']       = 'Montru fonton';
+
+$labels['select'] = 'Elektu';
+$labels['all'] = 'Ĉion';
+$labels['none'] = 'Nenion';
+$labels['unread'] = 'Nelegatan';
+
+$labels['compact'] = 'Kompakta';
+$labels['empty'] = 'Malplena';
+$labels['purge'] = 'Senrubigu';
+
+$labels['quota'] = 'Diskuzo';
+$labels['unknown']  = 'nekonata';
+$labels['unlimited']  = 'senlimo';
+
+$labels['quicksearch']  = 'Rapida serĉo';
+$labels['resetsearch']  = 'Vakigu serĉon';
+
+
+// message compose
+$labels['compose']        = 'Verku mesaĝon';
+$labels['sendmessage']    = 'Sendu mesaĝon nun';
+$labels['savemessage']  = 'Savu ĉi tiun malneton';
+$labels['addattachment']  = 'Alfiksu dosieron';
+$labels['charset']        = 'Karakteraro';
+$labels['editortype']     = 'Speco de redaktilo'; #???
+$labels['returnreceipt']  = 'Return receipt';
+
+$labels['checkspelling'] = 'Kontrolu grafismon';
+$labels['resumeediting'] = 'Rekomencu redakti';
+$labels['revertto']      = 'Reiru al';
+
+$labels['attachments'] = 'Alfiksaĵoj';
+$labels['upload'] = 'Alŝutu';
+$labels['close']  = 'Fermu';
+
+$labels['low']     = 'Malalta';
+$labels['lowest']  = 'Plej malalta';
+$labels['normal']  = 'Normala';
+$labels['high']    = 'Alta';
+$labels['highest'] = 'Plej alta';
+
+$labels['nosubject']  = '(sensubjekto)';
+$labels['showimages'] = 'Montru bildojn';
+
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Plata teksto';
+
+
+// address boook
+$labels['name']      = 'Nomo';
+$labels['firstname'] = 'Antaŭa nomo';
+$labels['surname']   = 'Familia nomo';
+$labels['email']     = 'Retpoŝto';
+
+$labels['addcontact'] = 'Aldonu kontakton';
+$labels['editcontact'] = 'Redaktu kontakton';
+
+$labels['edit']   = 'Redaktu';
+$labels['cancel'] = 'Rezignu';
+$labels['save']   = 'Savu';
+$labels['delete'] = 'Forigu';
+
+$labels['newcontact']     = 'Kreu novan kontaktaĵon';
+$labels['deletecontact']  = 'Forigu elektatajn kontaktojn';
+$labels['composeto']      = 'Verku mesaĝon al';
+$labels['contactsfromto'] = 'Kontaktoj ekde $from ĝis $to de $count';
+$labels['print']          = 'Printu';
+$labels['export']         = 'Eksportu';
+
+$labels['previouspage']   = 'Montru auntaŭan aron';
+$labels['firstpage']      = 'Montru unuan aron';
+$labels['nextpage']       = 'Montru sekvan aron';
+$labels['lastpage']       = 'Montru lastan aron';
+
+$labels['groups'] = 'Grupoj';
+$labels['personaladrbook'] = 'Persona Adresoj';
+
+
+// settings
+$labels['settingsfor']  = 'Preferoj de';
+
+$labels['preferences']  = 'Preferoj';
+$labels['userpreferences']  = 'Uzant-preferoj';
+$labels['editpreferences']  = 'Redajtu uzant-preferojn';
+
+$labels['identities']  = 'Identoj';
+$labels['manageidentities']  = 'Administru identoj de ĉi tiu konto';
+$labels['newidentity']  = 'Nova idento';
+
+$labels['newitem']  = 'Nova ero';
+$labels['edititem']  = 'Redaktu eron';
+
+$labels['setdefault']  = 'Agordu kiel defaŭlta';
+$labels['language']  = 'Lingvo';
+$labels['timezone']  = 'Tempzono';
+$labels['pagesize']  = 'Mesaĝoj po paĝo';
+$labels['signature'] = 'Subskribo';
+$labels['dstactive']  = 'Taglumsavado';
+$labels['htmleditor'] = 'Verku HTML mesaĝojn';
+$labels['htmlsignature'] = 'HTML subskribo';
+$labels['previewpane'] = 'Montru antaŭrigardejon';
+
+$labels['autosavedraft']  = 'Aŭtomate savu malneton';
+$labels['everynminutes']  = 'ĉiu $n minutoj';
+$labels['never']  = 'neniam';
+
+$labels['folder']  = 'Dosierujo';
+$labels['folders']  = 'Dosierujoj';
+$labels['foldername']  = 'Dosierujo-nomo';
+$labels['subscribed']  = 'Abonata';
+$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';
+$labels['sortdesc'] = 'Ordigu malkreskante';
+
+?>
\ No newline at end of file
diff --git a/program/localization/eo/messages.inc b/program/localization/eo/messages.inc
new file mode 100644 (file)
index 0000000..9051d1d
--- /dev/null
@@ -0,0 +1,80 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/eo/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Andreas van Cranenburgh <andreas@unstable.nl                  |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
+
+*/
+
+$messages = array();
+$messages['loginfailed']  = 'Malsukcesis ensaluti';
+$messages['cookiesdisabled'] = 'Via foliumilo ne akceptas kuketojn';
+$messages['sessionerror'] = 'Via seanco estas nevalida aŭ finiĝita';
+$messages['imaperror'] = 'Konekto kun IMAP-servilo malsukcesis';
+$messages['nomessagesfound'] = 'Neniu mesaĝo en ĉi tiu dosierujo';
+$messages['loggedout'] = 'Vi sukcese finiĝis la seanco. Ĝis!';
+$messages['mailboxempty'] = 'Dosierujo estas malplena';
+$messages['loading'] = 'Ŝarĝante...';
+$messages['loadingdata'] = 'Ŝarĝante datumo...';
+$messages['checkingmail'] = 'Kontrolu por novaj mesaĝoj...';
+$messages['sendingmessage'] = 'Sedante mesaĝo...';
+$messages['messagesent'] = 'Mesaĝo estas sendita sukcese';
+$messages['savingmessage'] = 'Savante mesaĝo...';
+$messages['messagesaved'] = 'Mesaĝo savita en Malnetujo';
+$messages['successfullysaved'] = 'Sukcese savis';
+$messages['addedsuccessfully'] = 'Sukcese aldonis kontakton al adresaro';
+$messages['contactexists'] = 'Kontakto kun ĉi tiu adreso jam ekzistas';
+$messages['blockedimages'] = 'Por protekti vian privatecon, foraj bildoj ne estas montrata en ĉi tiu mesaĝo.';
+$messages['encryptedmessage'] = 'Ĉi tiu mesaĝo estas ĉifrata kaj ne eblas montri. Pardonu!'; #sorry -> pardonu?
+$messages['nocontactsfound'] = 'Trovis neniun kontakton';
+$messages['contactnotfound'] = 'La petitan kontakton ne trovis';
+
+$messages['sendingfailed'] = 'Nesukcesis sendi mesaĝon';
+$messages['errorsaving'] = 'Eraro dum savo de mesaĝo';
+$messages['errormoving'] = 'Ne povis transloki mesaĝon';
+$messages['errordeleting'] = 'Ne povis forigi mesaĝon';
+$messages['deletecontactconfirm']  = 'Ĉu vi vere volas forigi la elektata(j)n kontakto(j)n?';
+$messages['deletemessagesconfirm'] = 'Ĉu vi vere volas forigi la elektata(j)n mesaĝo(j)n?';
+$messages['deletefolderconfirm']  = 'Ĉu vi vere volas forigi la elektatan dosierujon?';
+$messages['purgefolderconfirm']  = 'Ĉu vi vere volas forigi ĉiun mesaĝon en ĉi tiu dosierujo?';
+$messages['formincomplete'] = 'La formularo ne estis kompletiĝita';
+$messages['noemailwarning'] = 'Bonvolu skribu validan retpoŝt-adreson';
+$messages['nonamewarning']  = 'Bonvulu skribu nomon';
+$messages['nopagesizewarning'] = 'Bonvolu skribu paĝ-grando';
+$messages['norecipientwarning'] = 'Bonvolu skribu minumume unu ricevonto';
+$messages['nosubjectwarning']  = 'La "Subjekto" kampo estas malplena. Ĉu vi volas skribi subjekton nun?';
+$messages['nobodywarning'] = 'Ĉu sendu ĉi tiun mesaĝon sen teksto?';
+$messages['notsentwarning'] = 'Mesaĝo ne estas sendita. Ĉu vi volas forigi vian mesaĝon?';
+$messages['noldapserver'] = 'Bonvolu elekti ldap-servilo por serĉi';
+$messages['nocontactsreturned'] = 'Trovis nenion kontakton';
+$messages['nosearchname'] = 'Bonvolu skribi kontakt-nomo aŭ retpoŝt-adreson.';
+$messages['searchsuccessful'] = 'trovis $nr mesaĝojn';
+$messages['searchnomatch'] = 'Serĉo donis nenion';
+$messages['searching'] = 'Serĉante...';
+$messages['checking'] = 'Kontrolante...';
+$messages['nospellerrors'] = 'Neniujn grafismaj erarojn trovis';
+$messages['folderdeleted'] = 'Forigis dosierujon sukcese';
+$messages['deletedsuccessfully'] = "Sukcese forigis";
+$messages['converting'] = 'Forigante formata de mesaĝo...';
+$messages['messageopenerror'] = 'Ne povis ŝarĝi mesaĝon de servilo';
+$messages['fileuploaderror'] = 'Malsukcesis alŝuti dosieron';
+$messages['filesizeerror'] = 'La dosiero superas la maksimuma grando de $size';
+
+$messages['copysuccess'] = 'Sukcese kopiis $nr adresojn';
+$messages['copyerror'] = 'Ne povis kopii ajn adresojn';
+$messages['sourceisreadonly'] = 'Ĉi tiu adres-fonto estas nurlegebla';
+$messages['errorsavingcontact'] = 'Ne povis savi la kontakt-adreson';
+
+
+?>
\ No newline at end of file
index 0c4cdb915a48ac5d36ec8273a912ba4487ab418d..ea20eba588832e1f9ecb0794aff1c286fe086243 100644 (file)
@@ -1,4 +1,4 @@
-<?php
+<?php
 
 /*
 
@@ -16,7 +16,7 @@
  |         http://david.grajal.net                                       |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 552 2007-05-03 20:48:00Z yllar $
+ @version $Id: labels.inc 873 2007-10-16 19:06:34Z yllar $
 
 */
 
@@ -40,12 +40,12 @@ $labels['from'] = 'Remitente';
 $labels['to'] = 'Destinatario';
 $labels['cc'] = 'Copia';
 $labels['bcc'] = 'Bcc';
-$labels['replyto'] = 'Responder';
+$labels['replyto'] = 'Respuesta a';
 $labels['date'] = 'Fecha';
 $labels['size'] = 'Tamaño';
 $labels['priority'] = 'Prioridad';
 $labels['organization'] = 'Organización';
-$labels['reply-to'] = 'Responder';
+$labels['reply-to'] = 'Respuesta a';
 $labels['mailboxlist'] = 'Bandejas';
 $labels['messagesfromto'] = 'Mensajes desde $from a $to de $count';
 $labels['messagenrof'] = 'Mensaje $nr de $count';
@@ -77,7 +77,8 @@ $labels['writenewmessage'] = 'Crear nuevo mensaje';
 $labels['replytomessage'] = 'Responder mensaje';
 $labels['replytoallmessage'] = 'Responder al emisor y a todos los destinatarios';
 $labels['forwardmessage'] = 'Reenviar mensaje';
-$labels['deletemessage'] = 'Mover mensaje a la papelera';
+$labels['deletemessage'] = 'Eliminar mensaje';
+$labels['movemessagetotrash'] = 'Mover mensaje a la papelera';
 $labels['printmessage'] = 'Imprimir este mensaje';
 $labels['previousmessage'] = 'Mostrar mensaje anterior';
 $labels['previousmessages'] = 'Mostrar grupo anterior de mensajes';
@@ -102,8 +103,8 @@ $labels['unlimited'] = 'sin límite';
 $labels['quicksearch'] = 'Búsqueda rápida';
 $labels['resetsearch'] = 'Reajustar la búsqueda';
 $labels['compose'] = 'Escribir un mensaje';
-$labels['sendmessage'] = 'Enviar ahora el mensaje';
 $labels['savemessage'] = 'Guardar como borrador';
+$labels['sendmessage'] = 'Enviar ahora el mensaje';
 $labels['addattachment'] = 'Añadir un archivo';
 $labels['charset'] = 'Codificación';
 $labels['editortype'] = 'Tipo de editor';
@@ -123,6 +124,9 @@ $labels['nosubject'] = '(sin asunto)';
 $labels['showimages'] = 'Mostrar imágenes';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Texto';
+$labels['addcc'] = 'Añadir Cc';
+$labels['addbcc'] = 'Añadir Bcc';
+$labels['addreplyto'] = 'Añadir Respuesta a';
 $labels['name'] = 'Nombre completo';
 $labels['firstname'] = 'Nombre';
 $labels['surname'] = 'Apellido';
@@ -169,7 +173,7 @@ $labels['never'] = 'nunca';
 $labels['folder'] = 'Bandeja';
 $labels['folders'] = 'Bandejas';
 $labels['foldername'] = 'Nombre de bandeja';
-$labels['subscribed'] = 'Suscribipta';
+$labels['subscribed'] = 'Suscrita';
 $labels['create'] = 'Crear';
 $labels['createfolder'] = 'Crear nueva bandeja';
 $labels['rename'] = 'Renombrar';
@@ -180,4 +184,4 @@ $labels['sortby'] = 'Ordenar por';
 $labels['sortasc'] = 'Orden ascendente';
 $labels['sortdesc'] = 'Orden descendente';
 
-?>
\ No newline at end of file
+?>
index c3370e43110f778b0ff470921b1be5a39a6b8c35..32a5a4427b955da3a876c314be47525e47de2609 100644 (file)
@@ -1,4 +1,4 @@
-<?php
+<?php
 
 /*
 
@@ -15,7 +15,7 @@
  |         Lito Jornero <jornero@gmail.com>                              |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 552 2007-05-03 20:48:00Z yllar $
+ @version $Id: messages.inc 873 2007-10-16 19:06:34Z yllar $
 
 */
 
@@ -69,11 +69,12 @@ $messages['folderdeleted'] = 'Carpeta eliminada exitosamente';
 $messages['deletedsuccessfully'] = 'Eliminado exitosamente';
 $messages['converting'] = 'Removiendo el formato del mensaje...';
 $messages['messageopenerror'] = 'No puedo descargar el mensaje del servidor';
-$messages['fileuploaderror'] = 'Fallo en la subida de ficheros';
-$messages['filesizeerror'] = 'El fichero excede el tamaño maximo ($size)';
+$messages['fileuploaderror'] = 'Fallo en la subida de archivos';
+$messages['filesizeerror'] = 'El archivo excede el tamaño maximo ($size)';
 $messages['copysuccess'] = '$nr direcciones copiadas con éxito';
 $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...';
 
-?>
\ No newline at end of file
+?>
index 0c21873752d907922f83c6bedc293c0431e7639e..52461214646c0df3dd51a3c2ba7f71e2d6863b27 100644 (file)
@@ -36,7 +36,7 @@ $labels['subject'] = 'Pealkiri';
 $labels['from'] = 'Saatja';
 $labels['to'] = 'Saaja';
 $labels['cc'] = 'Koopia';
-$labels['bcc'] = 'Bcc';
+$labels['bcc'] = 'Pimekoopia';
 $labels['replyto'] = 'Vastus aadressile';
 $labels['date'] = 'Kuupäev';
 $labels['size'] = 'Suurus';
@@ -74,7 +74,8 @@ $labels['writenewmessage'] = 'Kirjuta uus kiri';
 $labels['replytomessage'] = 'Vasta kirjale';
 $labels['replytoallmessage'] = 'Vasta saatjale ja teistele kirja saanutele';
 $labels['forwardmessage'] = 'Edasta see kiri';
-$labels['deletemessage'] = 'Liiguta kiri prügikasti';
+$labels['deletemessage'] = 'Kustuta kiri';
+$labels['movemessagetotrash'] = 'Liiguta kiri prügikasti';
 $labels['printmessage'] = 'Trüki kiri';
 $labels['previousmessage'] = 'Näita eelmist kirja';
 $labels['previousmessages'] = 'Näita eelmisi kirju';
@@ -120,6 +121,9 @@ $labels['nosubject'] = '(teema puudub)';
 $labels['showimages'] = 'Näita pilte';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Lihttekst';
+$labels['addcc'] = 'Lisa koopia';
+$labels['addbcc'] = 'Lisa pimekoopia';
+$labels['addreplyto'] = 'Lisa vastus aadressile';
 $labels['name'] = 'Näidatav nimi';
 $labels['firstname'] = 'Eesnimi';
 $labels['surname'] = 'Perekonnanimi';
@@ -177,4 +181,4 @@ $labels['sortby'] = 'Järjesta';
 $labels['sortasc'] = 'Järjesta kasvavalt';
 $labels['sortdesc'] = 'Järjesta kahanevalt';
 
-?>
+?>
\ No newline at end of file
index 6d216f8881ff8c886975cd6e1ce61272365b7b2f..7077d1dca587980f7286dda4390b8f7e6dd24785 100644 (file)
@@ -73,5 +73,6 @@ $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...';
 
-?>
+?>
\ No newline at end of file
index 35552caab3a364985e75c8a1f7e3e3bd3d31205c..f040729533aa2490ebefed84049b584de45e9465 100644 (file)
@@ -9,10 +9,10 @@
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: pi <pi@beobide.net>                                           |
+ | Author: Bicyus <bicyus@tenkanet.com>                                  |
  +-----------------------------------------------------------------------+
 
- $Id: labels.inc 549 2007-05-01 18:53:56Z thomasb $
+ $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
@@ -139,13 +139,8 @@ $labels['previouspage'] = 'Aurreko sorta ikusi';
 $labels['firstpage'] = 'Lehenengo sorta ikusi';
 $labels['nextpage'] = 'Hurrengo sorta ikusi';
 $labels['lastpage'] = 'Azken sorta ikusi';
-$labels['ldapsearch'] = 'LDAP direktorio bilaketa';
-$labels['ldappublicsearchname'] = 'Harremanetarako izena';
-$labels['ldappublicsearchtype'] = 'Parekatze zehatza?';
-$labels['ldappublicserverselect'] = 'Zerbitzariak hautatu';
-$labels['ldappublicsearchfield'] = 'Bilatu hemen';
-$labels['ldappublicsearchform'] = 'Kontaktu bat bilatu';
-$labels['ldappublicsearch'] = 'Bilatu';
+$labels['groups'] = 'Taldeak';
+$labels['personaladrbook'] = 'Helbide pertsonalak';
 $labels['settingsfor'] = 'Honen ezarpenak:';
 $labels['preferences'] = 'Hobespenak';
 $labels['userpreferences'] = 'Erabiltzaile hobespenak';
index 3705884acb1e371c47527eeda59e7ef35822b83e..4bb6e2e4df59bb1770b84728aceff7df98374a9e 100644 (file)
@@ -12,7 +12,7 @@
  | Author: pi <pi@beobide.net>                                           |
  +-----------------------------------------------------------------------+
 
- $Id: messages.inc 549 2007-05-01 18:53:56Z thomasb $
+ $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
@@ -68,4 +68,4 @@ $messages['messageopenerror'] = 'Ezin da zerbitzaritik mezua kargatu';
 $messages['fileuploaderror'] = 'Huts fitxategia eransterakoan';
 $messages['filesizeerror'] = 'Erantsi nahi duzun fitxategian $size tamaina muga gainditzen du';
 
-?>
+?>
\ No newline at end of file
diff --git a/program/localization/fa/labels.inc b/program/localization/fa/labels.inc
new file mode 100644 (file)
index 0000000..47ddfbb
--- /dev/null
@@ -0,0 +1,183 @@
+<?php\r
+\r
+/*\r
+ +-----------------------------------------------------------------------+\r
+ | language/fa/labels.inc                                                |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Translators:                                                          |
+ |     Anoosh <anoosher2003@yahoo.com>                                   |\r
+ |     Mohammad Ebrahim Mohammadi Panah <mebrahim@gmail.com>             |\r
+ +-----------------------------------------------------------------------+\r
+\r
+*/\r
+\r
+$labels = array();\r
+$labels['welcome'] = 'به $product خوش آمدید';\r
+$labels['username'] = 'نام کاربری';\r
+$labels['password'] = 'گذرواژه';\r
+$labels['server'] = 'خادم';\r
+$labels['login'] = 'ورود';\r
+$labels['logout'] = 'خروج';\r
+$labels['mail'] = 'رایانامه';\r
+$labels['settings'] = 'تنظیمات شخصی';\r
+$labels['addressbook'] = 'دفتر نشانی‌ها';\r
+$labels['inbox'] = 'صندوق';\r
+$labels['drafts'] = 'پیش‌نویس‌ها';\r
+$labels['sent'] = 'فرستاده‌شده‌ها';\r
+$labels['trash'] = 'زباله‌دان';\r
+$labels['junk'] = 'بنجل';\r
+$labels['subject'] = 'موضوع';\r
+$labels['from'] = 'فرستنده';\r
+$labels['to'] = 'گیرنده';\r
+$labels['cc'] = 'رونوشت';\r
+$labels['bcc'] = 'رونوشت مخفی';\r
+$labels['replyto'] = 'پاسخ-به';\r
+$labels['date'] = 'تاریخ';\r
+$labels['size'] = 'حجم';\r
+$labels['priority'] = 'اولویت';\r
+$labels['organization'] = 'سازمان‌دهی';\r
+$labels['reply-to'] = 'پاسخ-به';\r
+$labels['mailboxlist'] = 'پوشه‌ها';\r
+$labels['messagesfromto'] = 'پیغام‌های $from تا $to از $count تا';\r
+$labels['messagenrof'] = 'پیغام $nr از $count تا';\r
+$labels['moveto'] = '...انتقال به';\r
+$labels['download'] = 'پایین‌گذاری';\r
+$labels['filename'] = 'نام پرونده';\r
+$labels['filesize'] = 'اندازه‌ی پرونده';\r
+$labels['preferhtml'] = 'نمایش HTML';\r
+$labels['htmlmessage'] = 'پیغام HTML';\r
+$labels['prettydate'] = 'تاریخ‌های زیبا';\r
+$labels['addtoaddressbook'] = 'افزودن به دفتر نشانی‌ها';\r
+$labels['sun'] = 'یک‌شنبه';\r
+$labels['mon'] = 'دوشنبه';\r
+$labels['tue'] = 'سه‌شنبه';\r
+$labels['wed'] = 'چهارشنبه';\r
+$labels['thu'] = 'پنج‌شنبه';\r
+$labels['fri'] = 'جمعه';\r
+$labels['sat'] = 'شنبه';\r
+$labels['sunday'] = 'یک‌شنبه';\r
+$labels['monday'] = 'دوشنبه';\r
+$labels['tuesday'] = 'سه‌شنبه';\r
+$labels['wednesday'] = 'چهارشنبه';\r
+$labels['thursday'] = 'پنج‌شنبه';\r
+$labels['friday'] = 'جمعه';\r
+$labels['saturday'] = 'شنبه';\r
+$labels['today'] = 'امروز';\r
+$labels['checkmail'] = 'بررسی برای پیغام‌های جدید';\r
+$labels['writenewmessage'] = 'ایجاد پیغام جدید';\r
+$labels['replytomessage'] = 'پاسخ به پیغام';\r
+$labels['replytoallmessage'] = 'پاسخ به فرستنده وتمام گیرنده‌ها';\r
+$labels['forwardmessage'] = 'ارجاع پیغام';\r
+$labels['deletemessage'] = 'حذف پیغام';\r
+$labels['movemessagetotrash'] = 'انتقال پیغام به زباله‌دان';\r
+$labels['printmessage'] = 'چاپ این پیغام';\r
+$labels['previousmessage'] = 'نمایش پیغام قبلی';\r
+$labels['previousmessages'] = 'نمایش دسته‌ی قبلی  پیغام‌ها';\r
+$labels['firstmessage'] = 'نمایش اولین  پیغام';\r
+$labels['firstmessages'] = 'نمایش اولین دسته‌ی پیغام‌ها';\r
+$labels['nextmessage'] = 'نمایش پیغام بعدی';\r
+$labels['nextmessages'] = 'نمایش دسته‌ی بعدی  پیغام‌ها';\r
+$labels['lastmessage'] = 'نمایش آخرین پیغام';\r
+$labels['lastmessages'] = 'نمایش آخرین دسته‌ی  پیغام‌ها';\r
+$labels['backtolist'] = 'بازگشت به فهرست پیغام‌ها';\r
+$labels['viewsource'] = 'نمایش منبع';\r
+$labels['select'] = 'انتخاب';\r
+$labels['all'] = 'همه';\r
+$labels['none'] = 'هیچ';\r
+$labels['unread'] = 'ناخوانده';\r
+$labels['compact'] = 'فشرده';\r
+$labels['empty'] = 'خالی';\r
+$labels['purge'] = 'خرد کردن';\r
+$labels['quota'] = 'فضای استفاده شده';\r
+$labels['unknown'] = 'ناشناخته';\r
+$labels['unlimited'] = 'نامحدود';\r
+$labels['quicksearch'] = 'جستجوی سریع';\r
+$labels['resetsearch'] = 'شروع مجدد جستجو';\r
+$labels['compose'] = 'نوشتن پیغام';\r
+$labels['savemessage'] = 'ذخیره‌ی این پیش‌نویس';\r
+$labels['sendmessage'] = 'ارسال پیغام';\r
+$labels['addattachment'] = 'پیوست کردن یک پرونده';\r
+$labels['charset'] = 'مجموعه‌نمایه';\r
+$labels['editortype'] = 'نوع ویرایش‌گر';\r
+$labels['returnreceipt'] = 'گیرنده‌ی پیغام بازگشت';\r
+$labels['checkspelling'] = 'بررسی املایی';\r
+$labels['resumeediting'] = 'ادامه‌ی ویرایش';\r
+$labels['revertto'] = 'برگرداندن به';\r
+$labels['attachments'] = 'پیوست‌ها';\r
+$labels['upload'] = 'بالاگذاری';\r
+$labels['close'] = 'بستن';\r
+$labels['low'] = 'کم';\r
+$labels['lowest'] = 'کم‌ترین';\r
+$labels['normal'] = 'معمولی';\r
+$labels['high'] = 'زیاد';\r
+$labels['highest'] = 'بیش‌ترین';\r
+$labels['nosubject'] = '(بدون موضوع)';\r
+$labels['showimages'] = 'نمایش عکس‌ها';\r
+$labels['htmltoggle'] = 'HTML';\r
+$labels['plaintoggle'] = 'متن ساده';\r
+$labels['addcc'] = 'افزودن رونوشت';\r
+$labels['addbcc'] = 'افزودن رونوشت مخفی';\r
+$labels['addreplyto'] = 'افزودن پاسخ-به';\r
+$labels['name'] = 'نمایش نام';\r
+$labels['firstname'] = 'نام';\r
+$labels['surname'] = 'نام خانوادگی';\r
+$labels['email'] = 'رایانامه';\r
+$labels['addcontact'] = 'افزودن تماس جدید';\r
+$labels['editcontact'] = 'ویرایش تماس';\r
+$labels['edit'] = 'ویرایش';\r
+$labels['cancel'] = 'لغو';\r
+$labels['save'] = 'ذخیره';\r
+$labels['delete'] = 'حذف';\r
+$labels['newcontact'] = 'ایجاد کارت تماس جدید';\r
+$labels['deletecontact'] = 'حذف تماس‌های انتخاب شده';\r
+$labels['composeto'] = 'نوشتن نامه به';\r
+$labels['contactsfromto'] = 'تماس‌های $from تا $to از $count تا';\r
+$labels['print'] = 'چاپ';\r
+$labels['export'] = 'صدور';\r
+$labels['previouspage'] = 'نمایش دسته‌ی قبلی';\r
+$labels['firstpage'] = 'نمایش دسته‌ی اول';\r
+$labels['nextpage'] = 'نمایش دسته‌ی بعدی';\r
+$labels['lastpage'] = 'نمایش دسته‌ی آخر';\r
+$labels['groups'] = 'گروه‌ها';\r
+$labels['personaladrbook'] = 'نشانی‌های شخصی';\r
+$labels['settingsfor'] = 'تنظیمات';\r
+$labels['preferences'] = 'ترجیحات';\r
+$labels['userpreferences'] = 'ترجیحات کاربر';\r
+$labels['editpreferences'] = 'ویرایش ترجیحات کاربر';\r
+$labels['identities'] = 'شناسه‌ها';\r
+$labels['manageidentities'] = 'مدیریت شناسه‌ها برای این حساب';\r
+$labels['newidentity'] = 'شناسه جدید';\r
+$labels['newitem'] = 'مورد جدید';\r
+$labels['edititem'] = 'ویرایش مورد';\r
+$labels['setdefault'] = 'پیش‌فرض کن';\r
+$labels['language'] = 'زبان';\r
+$labels['timezone'] = 'محدوده‌ی زمانی';\r
+$labels['pagesize'] = 'سطر در صفحه';\r
+$labels['signature'] = 'امضا';\r
+$labels['dstactive'] = 'ساعت تابستانی';\r
+$labels['htmleditor'] = 'HTML ‌نوشتن پیغام‌های';\r
+$labels['htmlsignature'] = 'HTML امضای';\r
+$labels['previewpane'] = 'نمایش قاب پیش‌نمایش';\r
+$labels['autosavedraft'] = 'ذخیره‌ی خودکار پیش‌نویس';\r
+$labels['everynminutes'] = 'هر $n دقیقه';\r
+$labels['never'] = 'هرگز';\r
+$labels['folder'] = 'پوشه';\r
+$labels['folders'] = 'پوشه‌ها';\r
+$labels['foldername'] = 'نام پوشه';\r
+$labels['subscribed'] = 'مورد اشتراک';\r
+$labels['create'] = 'ایجاد';\r
+$labels['createfolder'] = 'ایجاد پوشه‌ی جدید';\r
+$labels['rename'] = 'تغییر نام';\r
+$labels['renamefolder'] = 'تغییر نام پوشه';\r
+$labels['deletefolder'] = 'حذف پوشه';\r
+$labels['managefolders'] = 'مدیریت پوشه‌ها';\r
+$labels['sortby'] = 'مرتب‌سازی بر اساس';\r
+$labels['sortasc'] = 'مرتب‌سازی صعودی';\r
+$labels['sortdesc'] = 'مرتب‌سازی نزولی';\r
+\r
+?>
diff --git a/program/localization/fa/messages.inc b/program/localization/fa/messages.inc
new file mode 100644 (file)
index 0000000..e885abb
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | language/fa/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2006, RoundQube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Translators:                                                          |
+ |     Anoosh <anoosher2003@yahoo.com>                                   |\r
+ |     Mohammad Ebrahim Mohammadi Panah <mebrahim@gmail.com>             |\r
+ +-----------------------------------------------------------------------+
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'ورود ناموفق بود';
+$messages['cookiesdisabled'] = 'مرورگر شما کلوچه قبول نمی کند';
+$messages['sessionerror'] = 'نشست شما یا معتبر نیست، یا منقضی شده است';
+$messages['imaperror'] = 'اتصال به خادم IMAP ناموفق بود';
+$messages['nomessagesfound'] = 'هیچ پیغامی در صندوق نامه پیدا نشد';
+$messages['loggedout'] = 'شما با موفقیت نشست را پایان دادید. خدا نکه‌دار!';
+$messages['mailboxempty'] = 'صندوق نامه خالی است';
+$messages['loading'] = 'در حال بارگذاری ...';
+$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['errorsaving'] = 'هنگام ذخیره‌سازی، اشکالی پیش آمد';
+$messages['errormoving'] = 'ناتوان از انتقال پیغام';
+$messages['errordeleting'] = 'ناتوان از حذف پیغام';
+$messages['deletecontactconfirm'] = 'آیا واقعاً می‌خواهید تماس (های) انتخاب شده را حذف کنید؟';
+$messages['deletemessagesconfirm'] = 'آیا واقعاً می‌خواهید پیغام (های) انتخاب شده را حذف کنید؟';
+$messages['deletefolderconfirm'] = 'آیا واقعاً می‌خواهید این پوشه را حذف کنید؟';
+$messages['purgefolderconfirm'] = 'آیا واقعاً می‌خواهید همه‌ی پیغام‌های داخل این پوشه را حذف کنید؟';
+$messages['formincomplete'] = 'فرم کاملاً پر نشده بود';
+$messages['noemailwarning'] = 'لطفاً یک نشانی رایانامه‌ی معتبر وارد کنید';
+$messages['nonamewarning'] = 'لطفاً یک نام وارد کنید';
+$messages['nopagesizewarning'] = 'لطفاً یک اندازه برای صفحه وارد کنید';
+$messages['norecipientwarning'] = 'لطفاً حداقل یک گیرنده وارد کنید';
+$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['deletedsuccessfully'] = 'حذف انجام شد';
+$messages['converting'] = 'در حال حذف قالب‌بندی‌ها از پیغام ...';
+$messages['messageopenerror'] = 'ناتوان از بارگذاری پیغام از روی خادم';
+$messages['fileuploaderror'] = 'بالاگذاری پرونده ناموفق بود';
+$messages['filesizeerror'] = 'اندازه‌ی پرونده‌ی بالاگذاری شده از بیشینه اندازه‌ی $size تجاوز می‌کند';
+$messages['copysuccess'] = '$nr نشانی با موفقیت رونوشت‌برداری شدند';
+$messages['copyerror'] = 'رونوشت‌برداری از نشانی‌ها ناموفق بود';
+$messages['sourceisreadonly'] = 'این منبع نشانی فقط‌خواندنی است';
+$messages['errorsavingcontact'] = 'ذخیره‌ی نشانی تماس ناموفق بود';
+$messages['movingmessage'] = 'در حال انتقال پیغام ...';
+
+?>
index 0e454372551a8c9c984ee20313889e50c17f6063..329c685598353bfdf7a01220bc5cdfd53984520d 100644 (file)
@@ -14,7 +14,7 @@
  |         Veljo Velling <veve@utu.fi>                                   |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 619 2007-06-13 07:09:09Z thomasb $
+ @version $Id: labels.inc 612 2007-06-12 18:17:21Z thomasb $
 
 */
 
index 7d2bbb2e2df6a2167acfe4a5a06b704269e87da2..b314248bbfab13b72b8afb2c0961de67ad5f236e 100644 (file)
@@ -14,7 +14,7 @@
  |         Veljo Velling <veve@utu.fi>                                   |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 619 2007-06-13 07:09:09Z thomasb $
+ @version $Id: messages.inc 612 2007-06-12 18:17:21Z thomasb $
 
 */
 
index d7b6df20fad315406a42f6440a8633329b370f75..2693ea9e49249ce759b6dcda2f3f24e594ab5d89 100644 (file)
@@ -12,6 +12,7 @@
  +-----------------------------------------------------------------------+
  | Author: aldweb <info@aldweb.com>                                      |
  |         Pierre HAEGELI <pierre@haegeli.net>                           |
+ |         Mickaël Wolff <rcw@lupusmic.org>                              |
  +-----------------------------------------------------------------------+
 
  @version $Id$
 */
 
 $labels = array();
-$labels['welcome'] = 'Bienvenue à $product';
-$labels['username'] = 'ID utilisateur';
+$labels['welcome'] = 'Bienvenue sur $product';
+$labels['username'] = 'Utilisateur';
 $labels['password'] = 'Mot de passe';
 $labels['server'] = 'Serveur';
-$labels['login'] = 'Connexion';
+$labels['login'] = 'Authentification';
 $labels['logout'] = 'Quitter';
-$labels['mail'] = 'e-Mail';
+$labels['mail'] = 'Courriel';
 $labels['settings'] = 'Préférences';
 $labels['addressbook'] = 'Carnet d\'adresses';
 $labels['inbox'] = 'Messages reçus';
@@ -35,7 +36,7 @@ $labels['trash'] = 'Corbeille';
 $labels['junk'] = 'Indésirables';
 $labels['subject'] = 'Objet';
 $labels['from'] = 'De';
-$labels['to'] = 'A';
+$labels['to'] = 'À';
 $labels['cc'] = 'Cc';
 $labels['bcc'] = 'Cci';
 $labels['replyto'] = 'Répondre à';
@@ -45,15 +46,15 @@ $labels['priority'] = 'Priorité';
 $labels['organization'] = 'Organisation';
 $labels['reply-to'] = 'Répondre à';
 $labels['mailboxlist'] = 'Dossiers';
-$labels['messagesfromto'] = 'Messages $from à $to sur $count';
+$labels['messagesfromto'] = 'Messages de $from à $to sur $count';
 $labels['messagenrof'] = 'Message $nr sur $count';
 $labels['moveto'] = 'Déplacer vers...';
 $labels['download'] = 'Télécharger';
 $labels['filename'] = 'Nom du fichier';
 $labels['filesize'] = 'Taille du fichier';
-$labels['preferhtml'] = 'Préférer HTML';
-$labels['htmlmessage'] = 'Message HTML';
-$labels['prettydate'] = 'Affichage réduit des dates';
+$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';
@@ -71,7 +72,7 @@ $labels['friday'] = 'Vendredi';
 $labels['saturday'] = 'Samedi';
 $labels['today'] = 'Aujourd\'hui';
 $labels['checkmail'] = 'Vérification des nouveaux messages';
-$labels['writenewmessage'] = 'Créer un nouveau message';
+$labels['writenewmessage'] = 'Écrire un nouveau message';
 $labels['replytomessage'] = 'Répondre au message';
 $labels['replytoallmessage'] = 'Répondre à tous';
 $labels['forwardmessage'] = 'Transmettre le message';
@@ -86,15 +87,15 @@ $labels['nextmessages'] = 'Voir les messages suivants';
 $labels['lastmessage'] = 'Voir le dernier message';
 $labels['lastmessages'] = 'Voir la dernière page de messages';
 $labels['backtolist'] = 'Retourner à la liste des messages';
-$labels['viewsource'] = 'Voir le code source';
+$labels['viewsource'] = 'Voir le source';
 $labels['select'] = 'Sélectionner';
 $labels['all'] = 'Tous';
 $labels['none'] = 'Aucun';
 $labels['unread'] = 'Non lus';
-$labels['compact'] = 'Compact';
+$labels['compact'] = 'Compacter';
 $labels['empty'] = 'Vider';
 $labels['purge'] = 'Purger';
-$labels['quota'] = 'Utilisation Disque';
+$labels['quota'] = 'Utilisation disque';
 $labels['unknown'] = 'inconnue';
 $labels['unlimited'] = 'illimitée';
 $labels['quicksearch'] = 'Recherche rapide';
@@ -115,26 +116,26 @@ $labels['close'] = 'Fermer';
 $labels['low'] = 'Basse';
 $labels['lowest'] = 'La plus basse';
 $labels['normal'] = 'Normale';
-$labels['high'] = 'Elevée';
+$labels['high'] = 'Élevée';
 $labels['highest'] = 'La plus élevée';
 $labels['nosubject'] = '(pas de sujet)';
-$labels['showimages'] = 'Montrer les images';
+$labels['showimages'] = 'Afficher les images';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'texte brut';
 $labels['name'] = 'Nom à afficher';
 $labels['firstname'] = 'Prénom';
 $labels['surname'] = 'Nom';
-$labels['email'] = 'e-Mail';
+$labels['email'] = 'Courriel';
 $labels['addcontact'] = 'Ajouter le contact sélectionné à votre Carnet d\'adresses';
-$labels['editcontact'] = 'Editer le contact';
-$labels['edit'] = 'Editer';
+$labels['editcontact'] = 'Modifier le contact';
+$labels['edit'] = 'Modifier';
 $labels['cancel'] = 'Annuler';
 $labels['save'] = 'Sauvegarder';
 $labels['delete'] = 'Supprimer';
 $labels['newcontact'] = 'Créer un nouveau contact';
 $labels['deletecontact'] = 'Supprimer les contacts sélectionnés';
-$labels['composeto'] = 'Ecrire un message à';
-$labels['contactsfromto'] = 'Contacts $from à $to sur $count';
+$labels['composeto'] = 'Écrire un message à';
+$labels['contactsfromto'] = 'Contacts de $from à $to sur $count';
 $labels['print'] = 'Imprimer';
 $labels['export'] = 'Exporter';
 $labels['previouspage'] = 'Montrer page précédente';
@@ -146,12 +147,12 @@ $labels['personaladrbook'] = 'Adresses personnelle';
 $labels['settingsfor'] = 'Paramètres pour';
 $labels['preferences'] = 'Préférences';
 $labels['userpreferences'] = 'Préférences utilisateur';
-$labels['editpreferences'] = 'Editer les préférences utilisateur';
+$labels['editpreferences'] = 'Modifier les préférences utilisateur';
 $labels['identities'] = 'Identités';
 $labels['manageidentities'] = 'Gérer les identités pour ce compte';
 $labels['newidentity'] = 'Nouvelle identité';
 $labels['newitem'] = 'Nouvel élément';
-$labels['edititem'] = 'Editer l\'élément';
+$labels['edititem'] = 'Modifier l\'élément';
 $labels['setdefault'] = 'Paramètres par défaut';
 $labels['language'] = 'Langue';
 $labels['timezone'] = 'Fuseau horaire';
@@ -173,7 +174,7 @@ $labels['createfolder'] = 'Créer un nouveau dossier';
 $labels['rename'] = 'Renommer';
 $labels['renamefolder'] = 'Renommer le dossier';
 $labels['deletefolder'] = 'Supprimer le dossier';
-$labels['managefolders'] = 'Gérer les dossiers';
+$labels['managefolders'] = 'Organiser les dossiers';
 $labels['sortby'] = 'Trier par';
 $labels['sortasc'] = 'Tri ascendant';
 $labels['sortdesc'] = 'Tri descendant';
index dfe2a0850b19c0daa0fc801320d5eebe4b305fea..4e3985bbfd545d9da6ba2aca2b83b457d45ffe99 100644 (file)
@@ -12,6 +12,7 @@
  +-----------------------------------------------------------------------+
  | Author: aldweb <info@aldweb.com>                                      |
  |         Pierre HAEGELI <pierre@haegeli.net>                           |
+ |         Mickaël Wolff <rcw@lupusmic.org>                              |
  +-----------------------------------------------------------------------+
 
  @version $Id$
 */
 
 $messages = array();
-$messages['loginfailed'] = 'Erreur de connexion';
+$messages['loginfailed'] = 'Erreur d\'authentification';
 $messages['cookiesdisabled'] = 'Votre navigateur n\'accepte pas les cookies';
-$messages['sessionerror'] = 'Votre session n\'est pas valide ou a expiré';
+$messages['sessionerror'] = 'Votre session est invalide ou a expiré';
 $messages['imaperror'] = 'Erreur de connexion au serveur IMAP';
 $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 en cours...';
-$messages['loadingdata'] = 'Chargement des données en cours...';
-$messages['checkingmail'] = 'Vérification des nouveaux messages ...';
+$messages['loading'] = 'Chargement...';
+$messages['loadingdata'] = 'Chargement des données...';
+$messages['checkingmail'] = 'Vérification des nouveaux messages...';
 $messages['sendingmessage'] = 'Message en cours d\'envoi...';
-$messages['messagesent'] = 'Message envoyé';
+$messages['messagesent'] = 'Message bien envoyé';
 $messages['savingmessage'] = 'Sauvegarde du message...';
 $messages['messagesaved'] = 'Message sauvegardé dans Brouillons';
 $messages['successfullysaved'] = 'Sauvegarde effectuée';
 $messages['addedsuccessfully'] = 'Contact ajouté dans le carnet d\'adresses';
-$messages['contactexists'] = 'Un contact avec cette adresse e-Mail existe déjà';
+$messages['contactexists'] = 'Un contact avec ce courriel existe déjà';
 $messages['blockedimages'] = 'Afin de préserver votre vie privée, les images distantes ont été bloquées dans ce message.';
 $messages['encryptedmessage'] = 'Ceci est un message crypté et il ne peut pas être affiché. Désolé !';
-$messages['nocontactsfound'] = 'Aucun contact trouvé';
+$messages['nocontactsfound'] = 'Aucun contact n\'a pu être trouvé';
 $messages['contactnotfound'] = 'Le contact demandé n\'a pas été trouvé';
-$messages['sendingfailed'] = 'Le message n\'a pas été envoyé';
-$messages['errorsaving'] = 'Une erreur est apparue pendant la sauvegarde';
+$messages['sendingfailed'] = 'L\'envoie du message a échoué';
+$messages['errorsaving'] = 'Une erreur a empêché la sauvegarde';
 $messages['errormoving'] = 'Impossible de déplacer le message';
 $messages['errordeleting'] = 'Impossible d\'effacer le message';
-$messages['deletecontactconfirm'] = 'Voulez-vous vraiment effacer les contacts sélectionnés ?';
+$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['deletefolderconfirm'] = 'Voulez-vous vraiment effacer ce dossier ?';
-$messages['purgefolderconfirm'] = 'Voulez-vous vraiment effacer tous les messages dans ce dossier ?';
+$messages['purgefolderconfirm'] = 'Voulez-vous vraiment effacer tous les messages de ce dossier ?';
 $messages['formincomplete'] = 'Le formulaire n\'a pas été entièrement rempli';
-$messages['noemailwarning'] = 'Entrez une adresse e-Mail valide SVP';
-$messages['nonamewarning'] = 'Entrez un nom SVP';
-$messages['nopagesizewarning'] = 'Entrez une taille de page SVP';
-$messages['norecipientwarning'] = 'Entrez au moins un destinataire SVP';
-$messages['nosubjectwarning'] = 'Le champ "Objet" est vide. Souhaitez-vous le compléter maintenant ?';
+$messages['noemailwarning'] = 'Veuillez spécifier un courriel valide';
+$messages['nonamewarning'] = 'Veuillez fournir un nom';
+$messages['nopagesizewarning'] = 'Veuillez indiquer une taille de page';
+$messages['norecipientwarning'] = 'Veuillez ajouter au moins un destinataire';
+$messages['nosubjectwarning'] = 'Le champ « Objet » est vide. Souhaitez-vous le renseigner maintenant ?';
 $messages['nobodywarning'] = 'Envoyer ce message sans texte ?';
 $messages['notsentwarning'] = 'Le message n\'a pas été envoyé. Voulez-vous abandonner ce message ?';
-$messages['noldapserver'] = 'Choisissez un serveur ldap pour la recherche';
+$messages['noldapserver'] = 'Choisissez un serveur LDAP pour la recherche';
 $messages['nocontactsreturned'] = 'Aucun contact trouvé';
-$messages['nosearchname'] = 'Entrez un nom ou une adresse e-Mail de contact';
+$messages['nosearchname'] = 'Entrez un nom de contact ou un courriel';
 $messages['searchsuccessful'] = '$nr messages trouvés';
-$messages['searchnomatch'] = 'Aucun résultat trouvé';
+$messages['searchnomatch'] = 'La recherche ne donne aucun résultat';
 $messages['searching'] = 'En cours de recherche...';
 $messages['checking'] = 'Vérification...';
 $messages['nospellerrors'] = 'Aucune faute trouvée';
 $messages['folderdeleted'] = 'Dossier effacé';
 $messages['deletedsuccessfully'] = 'Supprimé(s) avec succès';
-$messages['converting'] = 'Suppression du formattage ...';
-$messages['messageopenerror'] = 'Impossible de charger le message du serveur';
+$messages['converting'] = 'Suppression de la mise en forme...';
+$messages['messageopenerror'] = 'Impossible de charger le message depuis serveur';
 $messages['fileuploaderror'] = 'Transfert du fichier echoué';
-$messages['filesizeerror'] = 'Transfert du fichier a atteint la taille maximale de $size';
-$messages['copysuccess'] = 'Succés de la copie des $nr adresses';
+$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 adresse source est en lecture seule';
+$messages['sourceisreadonly'] = 'Cette source d\'adresse est en lecture seule';
 $messages['errorsavingcontact'] = 'Ne peut pas enregistrer l\'adresse du contact';
 
 ?>
\ No newline at end of file
diff --git a/program/localization/ga_IE/labels.inc b/program/localization/ga_IE/labels.inc
new file mode 100755 (executable)
index 0000000..96b0d94
--- /dev/null
@@ -0,0 +1,177 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | language/ga/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author:   Noel Bourke  (cros13)                                       |
+ +-----------------------------------------------------------------------+
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Fáilte go $product';
+$labels['username'] = 'Úsáideoir';
+$labels['password'] = 'Pasfhocal';
+$labels['server'] = 'Freastalaí';
+$labels['login'] = 'Logáil isteach';
+$labels['logout'] = 'Logáil amach';
+$labels['mail'] = 'Postas';
+$labels['settings'] = 'Socruithe Pearsanta';
+$labels['addressbook'] = 'Leabhair Seoltaí';
+$labels['inbox'] = 'Isteach';
+$labels['drafts'] = 'Dréachtaí';
+$labels['sent'] = 'Amach';
+$labels['trash'] = 'Bosca bruscair';
+$labels['junk'] = 'Dramhaíl';
+$labels['subject'] = 'Ábhair';
+$labels['from'] = 'Seolaí';
+$labels['to'] = 'Faighteoir';
+$labels['cc'] = 'Cóipeáil';
+$labels['bcc'] = 'Cóip cheilte';
+$labels['replyto'] = 'Freagair go';
+$labels['date'] = 'Dáta';
+$labels['size'] = 'Méid';
+$labels['priority'] = 'Tosaíocht';
+$labels['organization'] = 'Eagraíocht';
+$labels['reply-to'] = 'Freagair go';
+$labels['mailboxlist'] = 'Fillteán';
+$labels['messagesfromto'] = 'Teachtaireachta as $from go $to as $count';
+$labels['messagenrof'] = 'Teachtaireacht $nr as $count';
+$labels['moveto'] = 'bog go...';
+$labels['download'] = 'síos-luchtú';
+$labels['filename'] = 'Comhad';
+$labels['filesize'] = 'Toirt';
+$labels['preferhtml'] = 'Taispeáin an HTML';
+$labels['htmlmessage'] = 'Teachtaireacht HTML';
+$labels['prettydate'] = 'Dátaí Dheas';
+$labels['addtoaddressbook'] = 'Sábháil i mo leabhair seoltaí';
+$labels['sun'] = 'Do';
+$labels['mon'] = 'Lu';
+$labels['tue'] = 'Mh';
+$labels['wed'] = 'Ch';
+$labels['thu'] = 'Dé';
+$labels['fri'] = 'Ao';
+$labels['sat'] = 'Sa';
+$labels['sunday'] = 'Domhnach';
+$labels['monday'] = 'An Luan';
+$labels['tuesday'] = 'An Mháirt';
+$labels['wednesday'] = 'An Chéadaoin';
+$labels['thursday'] = 'An Déardaoin';
+$labels['friday'] = 'Aoine';
+$labels['saturday'] = 'An Satharn';
+$labels['today'] = 'Inniu';
+$labels['checkmail'] = 'Seiceáil chun teachtaireacht nua';
+$labels['writenewmessage'] = 'Scríobh teachtaireacht nua';
+$labels['replytomessage'] = 'Scríobh freagra chun an seolaí';
+$labels['replytoallmessage'] = 'Scríobh freagra chun an seolaí agus na faighteoir';
+$labels['forwardmessage'] = 'Seol ar aghaidh an teachtaireacht';
+$labels['deletemessage'] = 'Chuir an teachtaireacht i mo bosca bruscair';
+$labels['printmessage'] = 'Priontáil an teachtaireacht seo';
+$labels['previousmessage'] = 'Taispeáin an teachtaireacht roimhe seo';
+$labels['previousmessages'] = 'Taispeáin an foireann roimhe seo';
+$labels['firstmessage'] = 'Taispeáin an cead teachtaireacht';
+$labels['firstmessages'] = 'Taispeáin an cead foireann';
+$labels['nextmessage'] = 'Taispeáin an teachtaireacht ina dhiaidh sin';
+$labels['nextmessages'] = 'Taispeáin an foireann ina dhiaidh sin';
+$labels['lastmessage'] = 'Taispeáin an teachtaireacht deireanach';
+$labels['lastmessages'] = 'Taispeáin an foireann deireanach';
+$labels['backtolist'] = 'Téigh ar ais go dtí an liosta teachtaireachta';
+$labels['viewsource'] = 'Éiriú bunchód';
+$labels['select'] = 'Togh';
+$labels['all'] = 'An uile';
+$labels['none'] = 'Aon cheann';
+$labels['unread'] = 'Na rudaí nach bhuil corraithe';
+$labels['compact'] = 'Comhbhrúigh';
+$labels['empty'] = 'Folmhaigh';
+$labels['purge'] = 'Purgaigh';
+$labels['quota'] = 'Toilleadh diosca atá athláimhe';
+$labels['unknown'] = 'gan aithne';
+$labels['unlimited'] = 'gan teorainn';
+$labels['quicksearch'] = 'Mearcuardaigh';
+$labels['resetsearch'] = 'Athshocraigh an cuardach';
+$labels['compose'] = 'Scríobh teachtaireacht';
+$labels['sendmessage'] = 'Seol mo teachtaireacht láithreach bonn';
+$labels['savemessage'] = 'Sábháil an dréachta seo';
+$labels['addattachment'] = 'Suimigh Iatán';
+$labels['charset'] = 'Foireann carachtar';
+$labels['editortype'] = 'Sort eagarthóir';
+$labels['returnreceipt'] = 'Admháil léite';
+$labels['checkspelling'] = 'Fiosrú ar mo litriú';
+$labels['resumeediting'] = 'Athdhúisigh eagarthóireacht';
+$labels['revertto'] = 'Filleadh ar';
+$labels['attachments'] = 'Iatání';
+$labels['upload'] = 'Aistriú suas';
+$labels['close'] = 'Dún';
+$labels['low'] = 'Íseal';
+$labels['lowest'] = 'Is Ísle';
+$labels['normal'] = 'Gnách';
+$labels['high'] = 'Ard';
+$labels['highest'] = 'Is Airde';
+$labels['nosubject'] = '(Níl aon Ábhair)';
+$labels['showimages'] = 'Taispeáin na híomhánna';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Téacs amháin';
+$labels['name'] = 'Leasainm';
+$labels['firstname'] = 'Ainm baiste';
+$labels['surname'] = 'Sloinne';
+$labels['email'] = 'Ríomhphost';
+$labels['addcontact'] = 'Sábháil duine nua';
+$labels['editcontact'] = 'Chuir chara in eagar';
+$labels['edit'] = 'Athraigh';
+$labels['cancel'] = 'Cealaigh';
+$labels['save'] = 'Sábháil';
+$labels['delete'] = 'Scrios';
+$labels['newcontact'] = 'Scríobh carta teagmháil nua';
+$labels['deletecontact'] = 'Scrios na daoine seo';
+$labels['composeto'] = 'Scríobh teachtaireacht go';
+$labels['contactsfromto'] = 'Daoine as $from to $to as $count';
+$labels['print'] = 'Priontáil';
+$labels['export'] = 'Easportáil';
+$labels['previouspage'] = 'Taispeáin an foireann roimhe seo';
+$labels['firstpage'] = 'Taispeáin an céad foireann';
+$labels['nextpage'] = 'Taispeáin an foireann ina dhiaidh sin';
+$labels['lastpage'] = 'Taispeáin an foireann deireanach';
+$labels['groups'] = 'Grúpaí';
+$labels['personaladrbook'] = 'Seoltaí Pearsanta';
+$labels['settingsfor'] = 'Socruithe chun';
+$labels['preferences'] = 'Tosaíocht';
+$labels['userpreferences'] = 'Tosaíocht Pearsanta';
+$labels['editpreferences'] = 'Athraigh tosaíocht pearsanta';
+$labels['identities'] = 'Céannachtaí';
+$labels['manageidentities'] = 'Stiúir céannachtaí i cuntas seo';
+$labels['newidentity'] = 'Céannacht nua';
+$labels['newitem'] = 'Mír nua';
+$labels['edititem'] = 'Athraigh mhír';
+$labels['setdefault'] = 'Socraigh an réamhshocraithe';
+$labels['language'] = 'Teanga';
+$labels['timezone'] = 'Crios ama';
+$labels['pagesize'] = 'Rónna in aghaidh gach leathanach';
+$labels['signature'] = 'Mana clabhsúir';
+$labels['dstactive'] = 'Laethúil um shamhradh';
+$labels['htmleditor'] = 'Scríobh teachtaireachta HTML';
+$labels['htmlsignature'] = 'Mana clabhsúir HTML';
+$labels['previewpane'] = 'Taispeáin an pána réamhamharc';
+$labels['autosavedraft'] = 'Sábháil dréachta go huathoibríoch';
+$labels['everynminutes'] = ' i gceann gach $n nóiméad';
+$labels['never'] = 'riamh';
+$labels['folder'] = 'Fillteán';
+$labels['folders'] = 'Fillteán';
+$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';
+$labels['sortdesc'] = 'Sórtáil in ord neartaitheach';
+
+?>
\ No newline at end of file
diff --git a/program/localization/ga_IE/messages.inc b/program/localization/ga_IE/messages.inc
new file mode 100755 (executable)
index 0000000..cd118be
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | language/ga/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author:   Noel Bourke  (cros13)                                       |
+ +-----------------------------------------------------------------------+
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Theip an iarraidh chun logáil tú isteach';
+$messages['cookiesdisabled'] = 'Níor glac do sracléitheoir an fianán seisiúin';
+$messages['sessionerror'] = 'Tá an seisiúin neamhbhailí nó as feidhm';
+$messages['imaperror'] = 'Theip an iarraidh chun nasc go dtí an freastalaí Prótacal Rochtana Teachtaireachtaí Idirlín (IMAP)';
+$messages['nomessagesfound'] = 'Ní bhfuair mé aon teachtaireacht i bosca postas seo';
+$messages['loggedout'] = 'D\'éirigh tú logáil amach. Slán Leat!';
+$messages['mailboxempty'] = 'Tá an bosca postas folamh';
+$messages['loading'] = 'Fan nóiméad, ag lódáil...';
+$messages['loadingdata'] = 'Ag lódáil sonraí...';
+$messages['checkingmail'] = 'Ag seiceáil chun teachtaireacht nua...';
+$messages['sendingmessage'] = 'Ag seol mo teachtaireacht láithreach bonn...';
+$messages['messagesent'] = 'Sheol mé an teachtaireacht';
+$messages['savingmessage'] = 'Ag sábháil an teachtaireacht...';
+$messages['messagesaved'] = 'Sábháil mé an teachtaireacht i dréachtaí';
+$messages['successfullysaved'] = 'D\'éirigh mé agus sábháil mé';
+$messages['addedsuccessfully'] = 'D\'éirigh mé agus shábháil mé duine nua go dtí an Leabhair Seoltaí';
+$messages['contactexists'] = 'Tá duine i do Leabhair Seoltaí agus tá an seoladh ríomhphost seo aige';
+$messages['blockedimages'] = 'Chun do príobháide a cosain, choiscinn na híomhánna san teachtaireacht seo ';
+$messages['encryptedmessage'] = 'Tá an teachtaireacht seo i criptiúchán, Níl an cumas agam chun é a tionscail';
+$messages['nocontactsfound'] = 'Ní raibh aon buine san Leabhair Seoltaí seo';
+$messages['contactnotfound'] = 'Ní bhfuair mé an duine seo';
+$messages['sendingfailed'] = 'Theip an iarraidh chun an teachtaireacht a seol';
+$messages['errorsaving'] = 'Theip mé agus ní shábháil';
+$messages['errormoving'] = 'Theip mé agus ní bog an teachtaireacht';
+$messages['errordeleting'] = 'Theip mé agus níor scrios me an teachtaireacht';
+$messages['deletecontactconfirm'] = 'Ar mhaith leat scrios na daoine seo?';
+$messages['deletemessagesconfirm'] = 'Ar mhaith leat scrios na teachtaireacht seo?';
+$messages['deletefolderconfirm'] = 'Ar mhaith leat scrios an fillteán seo?';
+$messages['purgefolderconfirm'] = 'Ar mhaith leat scrios gach teachtaireacht san fillteán seo?';
+$messages['formincomplete'] = 'Níor chríochnaigh tú an foirm';
+$messages['noemailwarning'] = 'Abair liom seoladh ríomhphost nach bfhuil neamhbhaillí';
+$messages['nonamewarning'] = 'Abair liom do ainm';
+$messages['nopagesizewarning'] = 'Abair liom saghas leathanaigh';
+$messages['norecipientwarning'] = 'Abair liom faighteoir amhain ar a laghad';
+$messages['nosubjectwarning'] = 'Níl aon ábhair ar an teachtaireacht, ba mhaith tú déarfaidh mé ábair?';
+$messages['nobodywarning'] = 'Níl aon teacs san teachtaireacht, ba mhaith tú déarfaidh mé teachtaireacht ar bith?';
+$messages['notsentwarning'] = 'Theip an iarraidh chun an teachtaireacht a seo. ba mhaith tú scrios do teachtaireacht?';
+$messages['noldapserver'] = 'Abair liom eolaire LDAP chun é a cuardaigh';
+$messages['nocontactsreturned'] = 'Ní bhfuair mé aon duine as an ceist seo';
+$messages['nosearchname'] = 'Abair liom ainm duine nó seoladh ríomhphost';
+$messages['searchsuccessful'] = 'Fuair mé $n teachtaireacht';
+$messages['searchnomatch'] = 'Ní bhfuair mé aon rud as an ceist seo';
+$messages['searching'] = 'Ag tástáil...';
+$messages['checking'] = 'Bím ag dhéanamh na mhaoirseachtí...';
+$messages['nospellerrors'] = 'Ní bhfuair mé aon earráidí i teachtaireacht seo';
+$messages['folderdeleted'] = 'D\'éirigh mé, Scrios mé an fillteán';
+$messages['deletedsuccessfully'] = 'D\'éirigh mé, Scrios mé';
+$messages['converting'] = 'Scrios mé formáidithe as an teachtaireacht seo';
+$messages['messageopenerror'] = 'Theip orm chun an teachtaireacht seo a tarrtháil as an freastalaí';
+$messages['fileuploaderror'] = 'Theip an suas-luchtú';
+$messages['filesizeerror'] = 'Beigh an comhad ró-mhor. Is ea $size uas-saghas chun admháil léite';
+$messages['copysuccess'] = 'D\'éirigh mé agus chuir mé $nr seolagh i do Leabhair Seoltaí';
+$messages['copyerror'] = 'Theip mé agus níor dfhag mé aon seolagh';
+$messages['sourceisreadonly'] = 'Tá an foinse seolaigh seo inléite amháin';
+$messages['errorsavingcontact'] = 'Theip mé, Níl an cumas agam an seolagh seo a sábháil';
+
+?>
\ No newline at end of file
diff --git a/program/localization/gl/labels.inc b/program/localization/gl/labels.inc
new file mode 100644 (file)
index 0000000..33898ff
--- /dev/null
@@ -0,0 +1,181 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | language/gl/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2006, RoundQube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author:    David Garabana Barro <david_garabana-com>                  |
+ +-----------------------------------------------------------------------+
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Benvido a $product';
+$labels['username'] = 'Nome de usuario';
+$labels['password'] = 'Contrasinal';
+$labels['server'] = 'Servidor';
+$labels['login'] = 'Acceder';
+$labels['logout'] = 'Saír';
+$labels['mail'] = 'Correo Electrónico';
+$labels['settings'] = 'Axustes persoais';
+$labels['addressbook'] = 'Caderno de enderezos';
+$labels['inbox'] = 'Caixa de entrada';
+$labels['drafts'] = 'Borradores';
+$labels['sent'] = 'Enviado';
+$labels['trash'] = 'Cubo do Lixo';
+$labels['junk'] = 'Lixo';
+$labels['subject'] = 'Asunto';
+$labels['from'] = 'Remitente';
+$labels['to'] = 'Destinatario';
+$labels['cc'] = 'Copia';
+$labels['bcc'] = 'Copia Oculta';
+$labels['replyto'] = 'Respostar a';
+$labels['date'] = 'Data';
+$labels['size'] = 'Tamaño';
+$labels['priority'] = 'Prioridade';
+$labels['organization'] = 'Organización';
+$labels['reply-to'] = 'Respostar a';
+$labels['mailboxlist'] = 'Cartafoles';
+$labels['messagesfromto'] = 'Mensaxes do $from ao $to de $count';
+$labels['messagenrof'] = 'Mensaxe $nr de $count';
+$labels['moveto'] = 'Mover a...';
+$labels['download'] = 'Baixar';
+$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';
+$labels['tue'] = 'Mar';
+$labels['wed'] = 'Mér';
+$labels['thu'] = 'Xov';
+$labels['fri'] = 'Ven';
+$labels['sat'] = 'Sáb';
+$labels['sunday'] = 'Domingo';
+$labels['monday'] = 'Luns';
+$labels['tuesday'] = 'Martes';
+$labels['wednesday'] = 'Mércores';
+$labels['thursday'] = 'Xoves';
+$labels['friday'] = 'Venres';
+$labels['saturday'] = 'Sábado';
+$labels['today'] = 'Hoxe';
+$labels['checkmail'] = 'Buscar novas mensaxes';
+$labels['writenewmessage'] = 'Crear unha nova mensaxe';
+$labels['replytomessage'] = 'Respostar á mensaxe';
+$labels['replytoallmessage'] = 'Respostar a todos';
+$labels['forwardmessage'] = 'Reenviar a mensaxe';
+$labels['deletemessage'] = 'Borrar a mensaxe';
+$labels['movemessagetotrash'] = 'Mover a mensaxe ó cubo do lixo';
+$labels['printmessage'] = 'Imprimir esta mensaxe';
+$labels['previousmessage'] = 'Amosar a mensaxe anterior';
+$labels['previousmessages'] = 'Amosar o grupo anterior de mensaxes';
+$labels['firstmessage'] = 'Amosar a primeira mensaxe';
+$labels['firstmessages'] = 'Amosar o primeiro grupo de mensaxes';
+$labels['nextmessage'] = 'Amosar a seguinte mensaxe';
+$labels['nextmessages'] = 'Amosar o seguinte grupo de mensaxes';
+$labels['lastmessage'] = 'Amosar a última mensaxe';
+$labels['lastmessages'] = 'Amosar o último grupo de mensaxes';
+$labels['backtolist'] = 'Voltar á lista de mensaxes';
+$labels['viewsource'] = 'Ver fonte';
+$labels['select'] = 'Seleccionar';
+$labels['all'] = 'Todas';
+$labels['none'] = 'Ningunha';
+$labels['unread'] = 'Non lidas';
+$labels['compact'] = 'Compactar';
+$labels['empty'] = 'Baleiro';
+$labels['purge'] = 'Baleirar';
+$labels['quota'] = 'Uso de disco';
+$labels['unknown'] = 'desconocido';
+$labels['unlimited'] = 'ilimitado';
+$labels['quicksearch'] = 'Busca rápida';
+$labels['resetsearch'] = 'Restablecer a busca';
+$labels['compose'] = 'Redactar unha mensaxe';
+$labels['savemessage'] = 'Gardar a mensaxe coma borrador';
+$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['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['low'] = 'Baixa';
+$labels['lowest'] = 'A máis baixa';
+$labels['normal'] = 'Normal';
+$labels['high'] = 'Alta';
+$labels['highest'] = 'A máis alta';
+$labels['nosubject'] = '(Sen asunto)';
+$labels['showimages'] = 'Mostrar imaxes';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Texto claro';
+$labels['addcc'] = 'Engadir Copia (CC)';
+$labels['addbcc'] = 'Engadir Copia Oculta (BCC)';
+$labels['addreplyto'] = 'Engadir Respostar a (Reply-To)';
+$labels['name'] = 'Nome completo';
+$labels['firstname'] = 'Nome';
+$labels['surname'] = 'Apelidos';
+$labels['email'] = 'Correo Electrónico';
+$labels['addcontact'] = 'Engadir novo contacto';
+$labels['editcontact'] = 'Editar contacto';
+$labels['edit'] = 'Editar';
+$labels['cancel'] = 'Cancelar';
+$labels['save'] = 'Gardar';
+$labels['delete'] = 'Borrar';
+$labels['newcontact'] = 'Crear novo contacto';
+$labels['deletecontact'] = 'Borrar os contactos seleccionados';
+$labels['composeto'] = 'Redactar mensaxe a';
+$labels['contactsfromto'] = 'Contactos do $from ao $to de $count';
+$labels['print'] = 'Imprimir';
+$labels['export'] = 'Exportar';
+$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['groups'] = 'Grupos';
+$labels['personaladrbook'] = 'Enderezos persoais';
+$labels['settingsfor'] = 'Axustes de';
+$labels['preferences'] = 'Preferencias';
+$labels['userpreferences'] = 'Preferencias de usuario';
+$labels['editpreferences'] = 'Editar preferencias de usuario';
+$labels['identities'] = 'Identidades';
+$labels['manageidentities'] = 'Administrar identidades de esta conta';
+$labels['newidentity'] = 'Nova identidade';
+$labels['newitem'] = 'Novo';
+$labels['edititem'] = 'Editar';
+$labels['setdefault'] = 'Opción por defecto';
+$labels['language'] = 'Linguaxe';
+$labels['timezone'] = 'Zona horaria';
+$labels['pagesize'] = 'Filas por páxina';
+$labels['signature'] = 'Sinatura';
+$labels['dstactive'] = 'Cambio de hora';
+$labels['htmleditor'] = 'Redactar mensaxes HTML';
+$labels['htmlsignature'] = 'Sinatura HTML';
+$labels['previewpane'] = 'Amosar panel de previsualización';
+$labels['autosavedraft'] = 'Gardar borrador automáticamente';
+$labels['everynminutes'] = 'cada $n minutos';
+$labels['never'] = 'nunca';
+$labels['folder'] = 'Cartafol';
+$labels['folders'] = 'Cartafoles';
+$labels['foldername'] = 'Nome do cartafol';
+$labels['subscribed'] = 'Subscrito';
+$labels['create'] = 'Crear';
+$labels['createfolder'] = 'Crear novo cartafol';
+$labels['rename'] = 'Renomear';
+$labels['renamefolder'] = 'Renomear cartafol';
+$labels['deletefolder'] = 'Borrar cartafol';
+$labels['managefolders'] = 'Xestionar cartafoles';
+$labels['sortby'] = 'Ordenar por';
+$labels['sortasc'] = 'Orde ascendente';
+$labels['sortdesc'] = 'Orde descendente';
+
+?>
diff --git a/program/localization/gl/messages.inc b/program/localization/gl/messages.inc
new file mode 100644 (file)
index 0000000..05ff976
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | language/gl/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2006, RoundQube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author:    David Garabana Barro <david garabana com>                  |
+ +-----------------------------------------------------------------------+
+
+*/
+
+$messages = array();
+$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['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['loadingdata'] = 'Cargando datos...';
+$messages['checkingmail'] = 'Buscando novas mensaxes...';
+$messages['sendingmessage'] = 'Enviando mensaxe...';
+$messages['messagesent'] = 'A mensaxe enviouse correctamente';
+$messages['savingmessage'] = 'Gardando mensaxe...';
+$messages['messagesaved'] = 'A mensaxe gardouse en "Borradores"';
+$messages['successfullysaved'] = 'Gardada correctamente';
+$messages['addedsuccessfully'] = 'O contacto engadiuse correctamente ao caderno de enderezos';
+$messages['contactexists'] = 'Xa existe un contacto con este enderezo de correo electrónico';
+$messages['blockedimages'] = 'Estanse a bloquear as imaxes remotas para protexer a súa privacidade';
+$messages['encryptedmessage'] = '¡Síntoo!. Non se pode amosar a mensaxe porque está cifrada';
+$messages['nocontactsfound'] = 'Non se atoparon contactos';
+$messages['contactnotfound'] = 'Non se atopou o contacto solicitado';
+$messages['sendingfailed'] = 'Fallou o envío da mensaxe';
+$messages['errorsaving'] = 'Ocurriu un erro mentres se gardaba';
+$messages['errormoving'] = 'Non puiden mover a mensaxe';
+$messages['errordeleting'] = 'Non puiden borrar a mensaxe';
+$messages['deletecontactconfirm'] = '¿Quere borrar o(s) contacto(s) seleccionados?';
+$messages['deletemessagesconfirm'] = '¿Quere borrar a(s) mensaxe(s) seleccionadas?';
+$messages['deletefolderconfirm'] = '¿Quere borrar este cartafol?';
+$messages['purgefolderconfirm'] = '¿Quere borrar tódalas mensaxes neste cartafol?';
+$messages['formincomplete'] = 'Non se cumprimentou completamente o formulario';
+$messages['noemailwarning'] = 'Por favor, introduza un enderezo de correo electrónico válida';
+$messages['nonamewarning'] = 'Por favor, introduza un nome';
+$messages['nopagesizewarning'] = 'Por favor, introduza un tamaño de páxina';
+$messages['norecipientwarning'] = 'Por favor, introduza polo menos un destinatario';
+$messages['nosubjectwarning'] = 'O campo "tema" está baleiro. ¿Quere introducir un?';
+$messages['nobodywarning'] = '¿Quere enviar esta mensaxe sen texto?';
+$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['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'] = 'Borrouse o cartafol con éxito';
+$messages['deletedsuccessfully'] = 'Borrouse con éxito';
+$messages['converting'] = 'Eliminando o formato da mensaxe...';
+$messages['messageopenerror'] = 'Non puiden 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 puiden copiar ningún enderezo';
+$messages['sourceisreadonly'] = 'A orixe é de só lectura';
+$messages['errorsavingcontact'] = 'Non puiden gardar o contacto';
+$messages['movingmessage'] = 'Movendo mensaxe...';
+
+?>
\ No newline at end of file
diff --git a/program/localization/hr/labels.inc b/program/localization/hr/labels.inc
new file mode 100644 (file)
index 0000000..b376082
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/hr/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Edi Budimilic <edifreak@gmail.com>                            |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 627 2007-06-27 07:07:02Z tomekp $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Dobrodošli na $product';
+$labels['username'] = 'E-mail';
+$labels['password'] = 'Lozinka';
+$labels['server'] = 'Server';
+$labels['login'] = 'Prijava';
+$labels['logout'] = 'Odjava';
+$labels['mail'] = 'Sandučić';
+$labels['settings'] = 'Postavke';
+$labels['addressbook'] = 'Imenik';
+$labels['inbox'] = 'Inbox';
+$labels['drafts'] = 'Predlošci';
+$labels['sent'] = 'Poslano';
+$labels['trash'] = 'Smeće';
+$labels['junk'] = 'Spam';
+$labels['subject'] = 'Naslov';
+$labels['from'] = 'Od';
+$labels['to'] = 'Za';
+$labels['cc'] = 'Cc';
+$labels['bcc'] = 'Bcc';
+$labels['replyto'] = 'Reply-To';
+$labels['date'] = 'Datum';
+$labels['size'] = 'Veličina';
+$labels['priority'] = 'Prioritet';
+$labels['organization'] = 'Organizacija';
+$labels['reply-to'] = 'Reply-To';
+$labels['mailboxlist'] = 'Folderi';
+$labels['messagesfromto'] = 'Poruke od $from do $to od ukupno $count';
+$labels['messagenrof'] = 'Poruka broj $nr od $count';
+$labels['moveto'] = 'prebaci 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';
+$labels['tue'] = 'Uto';
+$labels['wed'] = 'Sri';
+$labels['thu'] = 'Čet';
+$labels['fri'] = 'Pet';
+$labels['sat'] = 'Sub';
+$labels['sunday'] = 'Nedjelja';
+$labels['monday'] = 'Ponedjeljak';
+$labels['tuesday'] = 'Utorak';
+$labels['wednesday'] = 'Srijeda';
+$labels['thursday'] = 'Četvrtak';
+$labels['friday'] = 'Petak';
+$labels['saturday'] = 'Subota';
+$labels['today'] = 'danas';
+$labels['checkmail'] = 'Provjera novih poruka';
+$labels['writenewmessage'] = 'Nova poruka';
+$labels['replytomessage'] = 'Odgovori na poruku';
+$labels['replytoallmessage'] = 'Odgovori pošiljaocu i svim primateljima';
+$labels['forwardmessage'] = 'Prosljedi poruku';
+$labels['deletemessage'] = 'Prebaci poruku u folder (Smeće)';
+$labels['printmessage'] = 'Isprintajte poruku';
+$labels['previousmessage'] = 'Prikaži prethodnu poruku';
+$labels['previousmessages'] = 'Prijašnje poruke';
+$labels['firstmessage'] = 'Prikaži prvu poruku';
+$labels['firstmessages'] = 'Prikaži početni skup poruka';
+$labels['nextmessage'] = 'Prikaži slijedeću poruku';
+$labels['nextmessages'] = 'Sljedeće poruke';
+$labels['lastmessage'] = 'Prikaži zadnju poruku';
+$labels['lastmessages'] = 'Prikaži zadnju skupinu poruka';
+$labels['backtolist'] = 'Povratak na listu poruka';
+$labels['viewsource'] = 'Prikaži poruku u izvornom obliku';
+$labels['select'] = 'Oznaći';
+$labels['all'] = 'Sve';
+$labels['none'] = 'Nijednu';
+$labels['unread'] = 'Nepročitane';
+$labels['compact'] = 'Kompresiranje';
+$labels['empty'] = 'Izprazni';
+$labels['purge'] = 'Očisti';
+$labels['quota'] = 'Kvota';
+$labels['unknown'] = 'nepoznato';
+$labels['unlimited'] = 'beskonačna';
+$labels['quicksearch'] = 'Brza pretraga';
+$labels['resetsearch'] = 'Prikaži sve poruke';
+$labels['compose'] = 'Nova poruka';
+$labels['sendmessage'] = 'Pošalji poruku';
+$labels['savemessage'] = 'Spremi u \'Predlošci\'';
+$labels['addattachment'] = 'Priloži datoteku';
+$labels['charset'] = 'Charset';
+$labels['editortype'] = 'Tip editora';
+$labels['returnreceipt'] = 'Potvrda o primitku poruke';
+$labels['checkspelling'] = 'Provjera pravopisa';
+$labels['resumeediting'] = 'Povratak u pisanje';
+$labels['revertto'] = 'Revert to';
+$labels['attachments'] = 'Privitci (Attachments)';
+$labels['upload'] = 'Dodaj';
+$labels['close'] = 'Zatvori';
+$labels['low'] = 'Nizak';
+$labels['lowest'] = 'Najniži';
+$labels['normal'] = 'Srednji';
+$labels['high'] = 'Visok';
+$labels['highest'] = 'Najviši';
+$labels['nosubject'] = '(bez naslova)';
+$labels['showimages'] = 'Prikaži slike';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Samo teks';
+$labels['name'] = 'Puno ime';
+$labels['firstname'] = 'Ime';
+$labels['surname'] = 'Prezime';
+$labels['email'] = 'E-Mail';
+$labels['addcontact'] = 'Dodaj novi kontakt';
+$labels['editcontact'] = 'Izmjeni kontakt';
+$labels['edit'] = 'Izmjeni';
+$labels['cancel'] = 'Odustani';
+$labels['save'] = 'Spremi';
+$labels['delete'] = 'Obriši';
+$labels['newcontact'] = 'Dodaj novi kontakt';
+$labels['deletecontact'] = 'Obriši odabrane kontakte';
+$labels['composeto'] = 'Napiši mail...';
+$labels['contactsfromto'] = 'Kontakti od $from do $to od ukupno $count';
+$labels['print'] = 'Print';
+$labels['export'] = 'Export';
+$labels['previouspage'] = 'Prethodna strana';
+$labels['firstpage'] = 'Prva strana';
+$labels['nextpage'] = 'Slijedeća strana';
+$labels['lastpage'] = 'Zadnja strana';
+$labels['groups'] = 'Grupe';
+$labels['personaladrbook'] = 'Privatna adresa';
+$labels['settingsfor'] = 'Postavke za';
+$labels['preferences'] = 'Postavke';
+$labels['userpreferences'] = 'Korisnićke postavke';
+$labels['editpreferences'] = 'Izmjena postavki';
+$labels['identities'] = 'Identiteti';
+$labels['manageidentities'] = 'Podesi identitete za ovaj nalog';
+$labels['newidentity'] = 'Dodaj identitet';
+$labels['newitem'] = 'New item';
+$labels['edititem'] = 'Edit item';
+$labels['setdefault'] = 'Set default';
+$labels['language'] = 'Jezik';
+$labels['timezone'] = 'Vremenska zona';
+$labels['pagesize'] = 'Redova po stranici';
+$labels['signature'] = 'Potpis';
+$labels['dstactive'] = 'Automatska promjena vremena';
+$labels['htmleditor'] = 'Sastavi HTML poruke';
+$labels['htmlsignature'] = 'HTML potpis';
+$labels['previewpane'] = 'Prikaži područje pregleda';
+$labels['autosavedraft'] = 'Automatski spremi draft';
+$labels['everynminutes'] = 'svakih $n minuta';
+$labels['never'] = 'Nikada';
+$labels['folder'] = 'Folder';
+$labels['folders'] = 'Folderi';
+$labels['foldername'] = 'Ime foldera';
+$labels['subscribed'] = 'Pretplata';
+$labels['create'] = 'Napravi';
+$labels['createfolder'] = 'Napravi novi folder';
+$labels['rename'] = 'Preimenuj';
+$labels['renamefolder'] = 'Preimenuj Folder';
+$labels['deletefolder'] = 'Obriši Folder';
+$labels['managefolders'] = 'Podesi Folder';
+$labels['sortby'] = 'Sortiraj po';
+$labels['sortasc'] = 'Sortiraj rastućim nizom';
+$labels['sortdesc'] = 'Sortiraj opadajućim nizom';
+
+?>
\ No newline at end of file
diff --git a/program/localization/hr/messages.inc b/program/localization/hr/messages.inc
new file mode 100644 (file)
index 0000000..4a4b95c
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/hr/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Edi Budimilic <edifreak@gmail.com>                            |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 627 2007-06-27 07:07:02Z tomekp $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Prijava neuspješna';
+$messages['cookiesdisabled'] = 'Vaš pretraživač ne podržava kolačiće (cookies)';
+$messages['sessionerror'] = 'Morate se ponovno ulogirati';
+$messages['imaperror'] = 'Neuspješna konekcija na IMAP server';
+$messages['nomessagesfound'] = 'Nema poruka u sandučiću';
+$messages['loggedout'] = 'Uspješno ste se odjavili.';
+$messages['mailboxempty'] = 'Sandučuć je prazan';
+$messages['loading'] = 'Učitavanje...';
+$messages['loadingdata'] = 'Učitavanje podataka...';
+$messages['checkingmail'] = 'Provjera novih poruka u tijeku...';
+$messages['sendingmessage'] = 'Poruka se šalje...';
+$messages['messagesent'] = 'Poruka je uspješno poslana';
+$messages['savingmessage'] = 'Poruka se snima...';
+$messages['messagesaved'] = 'Poruka uspješno spremljena u \'Predlošci\'';
+$messages['successfullysaved'] = 'Spremanje uspješno obavljeno';
+$messages['addedsuccessfully'] = 'Kontakt uspješno dodan u imenik';
+$messages['contactexists'] = 'Kontakt sa ovom e-mail adresom već postoji u imeniku';
+$messages['blockedimages'] = 'Zbog zaštite privatnosti, slike sa udaljenih servera su blokirane.';
+$messages['encryptedmessage'] = 'Ova poruka je zaštićena pa se ne može prikazati';
+$messages['nocontactsfound'] = 'Imenik je prazan';
+$messages['contactnotfound'] = 'Traženi kontak nije pronađen';
+$messages['sendingfailed'] = 'Greška pri slanju poruke';
+$messages['errorsaving'] = 'Greška pri spremanju';
+$messages['errormoving'] = 'Greška pri premještanju poruke';
+$messages['errordeleting'] = 'Greška pri brisanju poruke';
+$messages['deletecontactconfirm'] = 'Želite li obrisati izabrane kontakte?';
+$messages['deletemessagesconfirm'] = 'Sigurno želite obrisati odabrane poruke?';
+$messages['deletefolderconfirm'] = 'Želite li obrisati ovaj folder?';
+$messages['purgefolderconfirm'] = 'Želite li obrisati sve poruke u folderu?';
+$messages['formincomplete'] = 'Forma nije u cjelosti popunjena';
+$messages['noemailwarning'] = 'Unesite valjanu e-mail adresu';
+$messages['nonamewarning'] = 'Unesite ime';
+$messages['nopagesizewarning'] = 'Unesite veličinu stranice';
+$messages['norecipientwarning'] = 'Unesite primatelja (ZA)';
+$messages['nosubjectwarning'] = 'Polje \'Naslov\' je prazno. Želite li unijeti naslov?';
+$messages['nobodywarning'] = 'Želite li poslati poruku bez teksta?';
+$messages['notsentwarning'] = 'Poruka nije poslana. Želite li odbaciti ovu poruku?';
+$messages['noldapserver'] = 'Unesite LDAP server za pretragu';
+$messages['nocontactsreturned'] = 'Nije pronađen niti jedan kontakt';
+$messages['nosearchname'] = 'Unesite ime ili e-mail adresu';
+$messages['searchsuccessful'] = 'Broj pronađenih poruka: $nr';
+$messages['searchnomatch'] = 'Traženi termin nije pronađen ni u jednoj poruci';
+$messages['searching'] = 'Pretraga u tijeku...';
+$messages['checking'] = 'Provjera u tijeku...';
+$messages['nospellerrors'] = 'Nije pronađena niti jedna pravopisna greška';
+$messages['folderdeleted'] = 'Folder uspješno obrisan';
+$messages['deletedsuccessfully'] = 'Uspješno obrisano';
+$messages['converting'] = 'Mičem formatiranje poruke';
+$messages['messageopenerror'] = 'Nije moguće ';
+$messages['fileuploaderror'] = 'Prijenos datoteke nije uspio';
+$messages['filesizeerror'] = 'Datoteka je prevelika. Dopuštena maksimalna je $size';
+$messages['copysuccess'] = 'Uspješno kopirano $n adresa';
+$messages['copyerror'] = 'Nije uspjelo kopiranje adresa';
+$messages['sourceisreadonly'] = 'Ovaj resurs adresa je samo za čitanje';
+$messages['errorsavingcontact'] = 'Nije uspjelo spremanje adrese kontakta';
+
+?>
\ No newline at end of file
index b57b18b6c06a6e7de1917b2d39476aa97d0e9459..89a127d7b2688d237146fa60de588e42e9474740 100644 (file)
 /*
 
  +-----------------------------------------------------------------------+
- | language/hu/messages.inc                                              |
+ | language/hu/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
  | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Levente Farkas <lfarkas at lfarkas dot org>                    |
+ | Author: Levente Farkas <lfarkas at lfarkas dot org>                   |
  |         Ervin Hegedüs <airween@damson.hu>                             |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 619 2007-06-13 07:09:09Z thomasb $
+ @version $Id: labels.inc 890 2007-10-20 18:01:01Z thomasb $
 
 */
 
-$messages = array();
-$messages['loginfailed'] = 'Sikertelen belépés';
-$messages['cookiesdisabled'] = 'A böngésző nem támogatja a sütik használatát';
-$messages['sessionerror'] = 'Érvénytelen vagy lejárt munkamenet';
-$messages['imaperror'] = 'Nem sikerült a kapcsolódás az IMAP szerverhez';
-$messages['nomessagesfound'] = 'A fiók nem tartalmaz leveleket';
-$messages['loggedout'] = 'Sikeres kijelentkezés. Viszont látásra!';
-$messages['mailboxempty'] = 'A fiók üres';
-$messages['loading'] = 'Betöltés...';
-$messages['loadingdata'] = 'Az adatok betöltése...';
-$messages['checkingmail'] = 'Új üzenetek keresése...';
-$messages['sendingmessage'] = 'Az üzenet küldése...';
-$messages['messagesent'] = 'Az üzenet elküldve';
-$messages['savingmessage'] = 'Az üzenet mentése...';
-$messages['messagesaved'] = 'Az üzenet elmentve a Sablonokhoz';
-$messages['successfullysaved'] = 'A mentés sikerült';
-$messages['addedsuccessfully'] = 'A cím hozzáadása a címjegyzékhez megtörtént';
-$messages['contactexists'] = 'A kapcsolat már létezik ezzel az e-mail címmel';
-$messages['blockedimages'] = 'Biztonsági okokból a távoli képek letöltése tiltott.';
-$messages['encryptedmessage'] = 'Az üzenet titkosított, emiatt nem tudom megjeleníteni.';
-$messages['nocontactsfound'] = 'Nincs kapcsolat';
-$messages['contactnotfound'] = 'A kiválasztott kapcsolat nem található';
-$messages['sendingfailed'] = 'Az üzenet elküldése nem sikerült';
-$messages['errorsaving'] = 'A mentés során hiba lépett fel';
-$messages['errormoving'] = 'Az üzenetet nem sikerült áthelyezni';
-$messages['errordeleting'] = 'Az üzenetet nem sikerült törölni';
-$messages['deletecontactconfirm'] = 'Biztos, hogy törölni szeretnéd a kijelölt címe(ke)t?';
-$messages['deletemessagesconfirm'] = 'Biztos, hogy törölni szeretnéd a kijelölt üzenete(ke)t?';
-$messages['deletefolderconfirm'] = 'Biztos, hogy törölni szeretnéd ezt a mappát?';
-$messages['purgefolderconfirm'] = 'Biztos vagy benne, hogy az összes üzenet törölhető?';
-$messages['formincomplete'] = 'Az űrlap hiányosan lett kitöltve';
-$messages['noemailwarning'] = 'Adj meg egy valós e-mail címet';
-$messages['nonamewarning'] = 'Adj meg egy nevet';
-$messages['nopagesizewarning'] = 'Add meg a papír méretét';
-$messages['norecipientwarning'] = 'Legalább egy címzettet adj meg';
-$messages['nosubjectwarning'] = 'A "Tárgy" mező üres. Szeretnéd most kitölteni?';
-$messages['nobodywarning'] = 'Elküldöd az üzenetet tárgy nélkül?';
-$messages['notsentwarning'] = 'Az üzenet még nem küldtem el. Eldobod az üzenetet?';
-$messages['noldapserver'] = 'Adj meg egy LDAP szervert a kereséshez';
-$messages['nocontactsreturned'] = 'Nem találtam kapcsolatot';
-$messages['nosearchname'] = 'Add meg a kapcsolat nevét vagy e-mail címét';
-$messages['searchsuccessful'] = '$nr üzenetet találtam';
-$messages['searchnomatch'] = 'Nincs találat';
-$messages['searching'] = 'Keresés...';
-$messages['checking'] = 'Ellenőrzés...';
-$messages['nospellerrors'] = 'Nem találtam helyesírási hibát';
-$messages['folderdeleted'] = 'A mappa sikeresen törölve';
-$messages['deletedsuccessfully'] = 'Törölve';
-$messages['converting'] = 'Formázás eltávolítása az üzenetből...';
-$messages['messageopenerror'] = 'Nem tudom letölteni a leveleket a szerverről';
-$messages['fileuploaderror'] = 'Feltöltés sikertelen';
-$messages['filesizeerror'] = 'A feltöltött file mérete meghaladja a maximális méretet $size';
-$messages['copysuccess'] = 'Sikeresen másoltunk $nr címet';
-$messages['copyerror'] = 'Nem tudtunk másolni egyetlen címet sem';
-$messages['sourceisreadonly'] = 'Ez a címforrás csak olvasható';
-$messages['errorsavingcontact'] = 'Nem tudtuk menteni a kapcsolat címét';
+$labels = array();
+$labels['welcome'] = 'Üdvözli a $product';
+$labels['username'] = 'Felhasználónév';
+$labels['password'] = 'Jelszó';
+$labels['server'] = 'Szerver';
+$labels['login'] = 'Belépés';
+$labels['logout'] = 'Kijelentkezés';
+$labels['mail'] = 'E-mail';
+$labels['settings'] = 'Egyéni beállítások';
+$labels['addressbook'] = 'Címjegyzék';
+$labels['inbox'] = 'Érkezett levelek';
+$labels['drafts'] = 'Piszkozatok';
+$labels['sent'] = 'Küldött levelek';
+$labels['trash'] = 'Törölt elemek';
+$labels['junk'] = 'Szemetes';
+$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['date'] = 'Dátum';
+$labels['size'] = 'Méret';
+$labels['priority'] = 'Sürgősség';
+$labels['organization'] = 'Szervezet';
+$labels['reply-to'] = 'Válaszcím';
+$labels['mailboxlist'] = 'Mappák';
+$labels['messagesfromto'] = 'Üzenetek: $from - $to / $count';
+$labels['messagenrof'] = '$nr / $count üzenet';
+$labels['moveto'] = 'áthelyezés...';
+$labels['download'] = 'letöltés';
+$labels['filename'] = 'File neve';
+$labels['filesize'] = 'File 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';
+$labels['sun'] = 'Vas';
+$labels['mon'] = 'Hét';
+$labels['tue'] = 'Kedd';
+$labels['wed'] = 'Szer';
+$labels['thu'] = 'Csüt';
+$labels['fri'] = 'Pén';
+$labels['sat'] = 'Szom';
+$labels['sunday'] = 'Vasárnap';
+$labels['monday'] = 'Hétfő';
+$labels['tuesday'] = 'Kedd';
+$labels['wednesday'] = 'Szerda';
+$labels['thursday'] = 'Csütörtök';
+$labels['friday'] = 'Péntek';
+$labels['saturday'] = 'Szombat';
+$labels['today'] = 'Ma';
+$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['forwardmessage'] = 'Továbbítás';
+$labels['deletemessage'] = 'Törlés';
+$labels['printmessage'] = 'Nyomtatás';
+$labels['previousmessage'] = 'Előző levél mutatása';
+$labels['previousmessages'] = 'Előző rész mutatása';
+$labels['firstmessage'] = 'Első levél mutatása';
+$labels['firstmessages'] = 'Első rész mutatása';
+$labels['nextmessage'] = 'Következő levél mutatása';
+$labels['nextmessages'] = 'Következő rész mutatása';
+$labels['lastmessage'] = 'Utolsó levél mutatása';
+$labels['lastmessages'] = 'Utolsó rész mutatása';
+$labels['backtolist'] = 'Vissza az üzenetekhez';
+$labels['viewsource'] = 'Forrás megtekintése';
+$labels['select'] = 'Kijelölés';
+$labels['all'] = 'Összes';
+$labels['none'] = 'Nincs';
+$labels['unread'] = 'Olvasatlan';
+$labels['compact'] = 'Tömörítés';
+$labels['empty'] = 'Ü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['compose'] = 'Üzenet létrehozása';
+$labels['sendmessage'] = 'Üzenet azonnali küldése';
+$labels['savemessage'] = 'Vázlat mentése';
+$labels['addattachment'] = 'File csatolása';
+$labels['charset'] = 'Karakterkészlet';
+$labels['editortype'] = 'Szerkesztő típusa';
+$labels['returnreceipt'] = 'Értesítés';
+$labels['checkspelling'] = 'Helyesírás-ellenőrzés';
+$labels['resumeediting'] = 'Helyesírás kész';
+$labels['revertto'] = 'Vissza erre:';
+$labels['attachments'] = 'Csatolások';
+$labels['upload'] = 'Feltöltés';
+$labels['close'] = 'Bezárás';
+$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['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Egyszerű szöveg';
+$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['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['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['previouspage'] = 'Előző lap';
+$labels['firstpage'] = 'Első lap';
+$labels['nextpage'] = 'Következő lap';
+$labels['lastpage'] = 'Utolsó lap';
+$labels['groups'] = 'Csoportok';
+$labels['personaladrbook'] = 'Személyes címjegyzék';
+$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['setdefault'] = 'Beállítás alapértelmezettnek';
+$labels['language'] = 'Nyelv';
+$labels['timezone'] = 'Időzóna';
+$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['htmlsignature'] = 'HTML aláírás';
+$labels['previewpane'] = 'Előnézeti kép';
+$labels['autosavedraft'] = 'Automatikus piszkozat mentés';
+$labels['everynminutes'] = 'minden $n percben';
+$labels['never'] = 'soha';
+$labels['folder'] = 'Mappa';
+$labels['folders'] = 'Mappák';
+$labels['foldername'] = 'Mappa neve';
+$labels['subscribed'] = 'Feliratkozás';
+$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['sortby'] = 'Rendezés';
+$labels['sortasc'] = 'növekvő';
+$labels['sortdesc'] = 'csökkenő';
 
-?>
+?>
\ No newline at end of file
index 1b36afb5198373f8cbfe1eb57a79fd4b635c3359..413ee66745836c784db14b06ebaf0818fe03890e 100644 (file)
  |         Ervin Hegedüs <airween@damson.hu>                             |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 619 2007-06-13 07:09:09Z thomasb $
+ @version $Id: messages.inc 890 2007-10-20 18:01:01Z thomasb $
 
 */
 
-$labels = array();
-$labels['welcome'] = 'Üdvözli a $product';
-$labels['username'] = 'Felhasználónév';
-$labels['password'] = 'Jelszó';
-$labels['server'] = 'Szerver';
-$labels['login'] = 'Belépés';
-$labels['logout'] = 'Kijelentkezés';
-$labels['mail'] = 'E-mail';
-$labels['settings'] = 'Egyéni beállítások';
-$labels['addressbook'] = 'Címjegyzék';
-$labels['inbox'] = 'Érkezett levelek';
-$labels['drafts'] = 'Piszkozatok';
-$labels['sent'] = 'Küldött levelek';
-$labels['trash'] = 'Törölt elemek';
-$labels['junk'] = 'Szemetes';
-$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['date'] = 'Dátum';
-$labels['size'] = 'Méret';
-$labels['priority'] = 'Sürgősség';
-$labels['organization'] = 'Szervezet';
-$labels['reply-to'] = 'Válaszcím';
-$labels['mailboxlist'] = 'Mappák';
-$labels['messagesfromto'] = 'Üzenetek: $from - $to / $count';
-$labels['messagenrof'] = '$nr / $count üzenet';
-$labels['moveto'] = 'áthelyezés...';
-$labels['download'] = 'letöltés';
-$labels['filename'] = 'File neve';
-$labels['filesize'] = 'File 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';
-$labels['sun'] = 'Vas';
-$labels['mon'] = 'Hét';
-$labels['tue'] = 'Kedd';
-$labels['wed'] = 'Szer';
-$labels['thu'] = 'Csüt';
-$labels['fri'] = 'Pén';
-$labels['sat'] = 'Szom';
-$labels['sunday'] = 'Vasárnap';
-$labels['monday'] = 'Hétfő';
-$labels['tuesday'] = 'Kedd';
-$labels['wednesday'] = 'Szerda';
-$labels['thursday'] = 'Csütörtök';
-$labels['friday'] = 'Péntek';
-$labels['saturday'] = 'Szombat';
-$labels['today'] = 'Ma';
-$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['forwardmessage'] = 'Továbbítás';
-$labels['deletemessage'] = 'Törlés';
-$labels['printmessage'] = 'Nyomtatás';
-$labels['previousmessage'] = 'Előző levél mutatása';
-$labels['previousmessages'] = 'Előző rész mutatása';
-$labels['firstmessage'] = 'Első levél mutatása';
-$labels['firstmessages'] = 'Első rész mutatása';
-$labels['nextmessage'] = 'Következő levél mutatása';
-$labels['nextmessages'] = 'Következő rész mutatása';
-$labels['lastmessage'] = 'Utolsó levél mutatása';
-$labels['lastmessages'] = 'Utolsó rész mutatása';
-$labels['backtolist'] = 'Vissza az üzenetekhez';
-$labels['viewsource'] = 'Forrás megtekintése';
-$labels['select'] = 'Kijelölés';
-$labels['all'] = 'Összes';
-$labels['none'] = 'Nincs';
-$labels['unread'] = 'Olvasatlan';
-$labels['compact'] = 'Tömörítés';
-$labels['empty'] = 'Ü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['compose'] = 'Üzenet létrehozása';
-$labels['sendmessage'] = 'Üzenet azonnali küldése';
-$labels['savemessage'] = 'Vázlat mentése';
-$labels['addattachment'] = 'File csatolása';
-$labels['charset'] = 'Karakterkészlet';
-$labels['editortype'] = 'Szerkesztő típusa';
-$labels['returnreceipt'] = 'Értesítés';
-$labels['checkspelling'] = 'Helyesírás-ellenőrzés';
-$labels['resumeediting'] = 'Helyesírás kész';
-$labels['revertto'] = 'Vissza erre:';
-$labels['attachments'] = 'Csatolások';
-$labels['upload'] = 'Feltöltés';
-$labels['close'] = 'Bezárás';
-$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['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Egyszerű szöveg';
-$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['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['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['previouspage'] = 'Előző lap';
-$labels['firstpage'] = 'Első lap';
-$labels['nextpage'] = 'Következő lap';
-$labels['lastpage'] = 'Utolsó lap';
-$labels['groups'] = 'Csoportok';
-$labels['personaladrbook'] = 'Személyes címjegyzék';
-$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['setdefault'] = 'Beállítás alapértelmezettnek';
-$labels['language'] = 'Nyelv';
-$labels['timezone'] = 'Időzóna';
-$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['htmlsignature'] = 'HTML aláírás';
-$labels['previewpane'] = 'Előnézeti kép';
-$labels['autosavedraft'] = 'Automatikus piszkozat mentés';
-$labels['everynminutes'] = 'minden $n percben';
-$labels['never'] = 'soha';
-$labels['folder'] = 'Mappa';
-$labels['folders'] = 'Mappák';
-$labels['foldername'] = 'Mappa neve';
-$labels['subscribed'] = 'Feliratkozás';
-$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['sortby'] = 'Rendezés';
-$labels['sortasc'] = 'növekvő';
-$labels['sortdesc'] = 'csökkenő';
+$messages = array();
+$messages['loginfailed'] = 'Sikertelen belépés';
+$messages['cookiesdisabled'] = 'A böngésző nem támogatja a sütik használatát';
+$messages['sessionerror'] = 'Érvénytelen vagy lejárt munkamenet';
+$messages['imaperror'] = 'Nem sikerült a kapcsolódás az IMAP szerverhez';
+$messages['nomessagesfound'] = 'A fiók nem tartalmaz leveleket';
+$messages['loggedout'] = 'Sikeres kijelentkezés. Viszont látásra!';
+$messages['mailboxempty'] = 'A fiók üres';
+$messages['loading'] = 'Betöltés...';
+$messages['loadingdata'] = 'Az adatok betöltése...';
+$messages['checkingmail'] = 'Új üzenetek keresése...';
+$messages['sendingmessage'] = 'Az üzenet küldése...';
+$messages['messagesent'] = 'Az üzenet elküldve';
+$messages['savingmessage'] = 'Az üzenet mentése...';
+$messages['messagesaved'] = 'Az üzenet elmentve a Sablonokhoz';
+$messages['successfullysaved'] = 'A mentés sikerült';
+$messages['addedsuccessfully'] = 'A cím hozzáadása a címjegyzékhez megtörtént';
+$messages['contactexists'] = 'A kapcsolat már létezik ezzel az e-mail címmel';
+$messages['blockedimages'] = 'Biztonsági okokból a távoli képek letöltése tiltott.';
+$messages['encryptedmessage'] = 'Az üzenet titkosított, emiatt nem tudom megjeleníteni.';
+$messages['nocontactsfound'] = 'Nincs kapcsolat';
+$messages['contactnotfound'] = 'A kiválasztott kapcsolat nem található';
+$messages['sendingfailed'] = 'Az üzenet elküldése nem sikerült';
+$messages['errorsaving'] = 'A mentés során hiba lépett fel';
+$messages['errormoving'] = 'Az üzenetet nem sikerült áthelyezni';
+$messages['errordeleting'] = 'Az üzenetet nem sikerült törölni';
+$messages['deletecontactconfirm'] = 'Biztos, hogy törölni szeretnéd a kijelölt címe(ke)t?';
+$messages['deletemessagesconfirm'] = 'Biztos, hogy törölni szeretnéd a kijelölt üzenete(ke)t?';
+$messages['deletefolderconfirm'] = 'Biztos, hogy törölni szeretnéd ezt a mappát?';
+$messages['purgefolderconfirm'] = 'Biztos vagy benne, hogy az összes üzenet törölhető?';
+$messages['formincomplete'] = 'Az űrlap hiányosan lett kitöltve';
+$messages['noemailwarning'] = 'Adj meg egy valós e-mail címet';
+$messages['nonamewarning'] = 'Adj meg egy nevet';
+$messages['nopagesizewarning'] = 'Add meg a papír méretét';
+$messages['norecipientwarning'] = 'Legalább egy címzettet adj meg';
+$messages['nosubjectwarning'] = 'A "Tárgy" mező üres. Szeretnéd most kitölteni?';
+$messages['nobodywarning'] = 'Elküldöd az üzenetet tárgy nélkül?';
+$messages['notsentwarning'] = 'Az üzenet még nem küldtem el. Eldobod az üzenetet?';
+$messages['noldapserver'] = 'Adj meg egy LDAP szervert a kereséshez';
+$messages['nocontactsreturned'] = 'Nem találtam kapcsolatot';
+$messages['nosearchname'] = 'Add meg a kapcsolat nevét vagy e-mail címét';
+$messages['searchsuccessful'] = '$nr üzenetet találtam';
+$messages['searchnomatch'] = 'Nincs találat';
+$messages['searching'] = 'Keresés...';
+$messages['checking'] = 'Ellenőrzés...';
+$messages['nospellerrors'] = 'Nem találtam helyesírási hibát';
+$messages['folderdeleted'] = 'A mappa sikeresen törölve';
+$messages['deletedsuccessfully'] = 'Törölve';
+$messages['converting'] = 'Formázás eltávolítása az üzenetből...';
+$messages['messageopenerror'] = 'Nem tudom letölteni a leveleket a szerverről';
+$messages['fileuploaderror'] = 'Feltöltés sikertelen';
+$messages['filesizeerror'] = 'A feltöltött file mérete meghaladja a maximális méretet $size';
+$messages['copysuccess'] = 'Sikeresen másoltunk $nr címet';
+$messages['copyerror'] = 'Nem tudtunk másolni egyetlen címet sem';
+$messages['sourceisreadonly'] = 'Ez a címforrás csak olvasható';
+$messages['errorsavingcontact'] = 'Nem tudtuk menteni a kapcsolat címét';
 
-?>
+?>
\ No newline at end of file
index bab4810a74e36b4852aa27d7ceeea13297a9025f..cf6ee4e4a6d50e03a6a902d0d805e0750245055e 100644 (file)
@@ -5,7 +5,7 @@
  | program/localization/index.inc                                        |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev, - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -16,7 +16,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: index.inc 560 2007-05-17 15:01:26Z thomasb $
+ $Id: index.inc 886 2007-10-19 07:24:53Z yllar $
  
  */
  
        'am'    => 'Armenian',
        'bg'    => 'Bulgarian',
        'bs_BA' => 'Bosnian (Bosanski)',
-       'zh_TW' => 'Chinese (BIG5)',
-       'zh_CN' => 'Chinese (GB2312)',
+       'zh_TW' => 'Chinese (Traditional)',
+       'zh_CN' => 'Chinese (Simplified)',
        'ca'    => 'Català',
        'cz'    => 'Czech',
        'da'    => 'Dansk',
        'de_DE' => 'Deutsch (Deutsch)',
        'de_CH' => 'Deutsch (Schweiz)',
+       'eo'    => 'Esperanto',
        'es'    => 'Español',
        'et_EE' => 'Estonian',
        'eu'    => 'Euskara',
        'fr'    => 'Français', 
-       'ga'    => 'Galician',
+       'gl'    => 'Galego',
+       'ga_IE' => 'Irish',
        'el'    => 'Greek',
        'hi'    => 'Hindi',
        'hr'    => 'Hrvatski',
@@ -50,6 +52,8 @@
        'kur_KU' => 'Kurdish (Kurmancî)',
        'lv'    => 'Latvian',
        'lt'    => 'Lithuanian',
+       'mk'    => 'Macedonian (Slavic FYROM)',
+       'ms_MY' => 'Malay',
        'nl_NL' => 'Nederlands',
        'nl_BE' => 'Flemish',
        'nb_NO' => 'Norsk (bokmål)',
        'sr_latin' => 'Serbian Latin',
        'sr_cyrillic' => 'Serbian Cyrillic',
        'tr'    => 'Turkish',
-       'th'    => 'Thai',
+       'th_TH' => 'Thai',
+       'uk'    => 'Ukrainian',
        'vn'    => 'Vietnamese'
 );
 
 $rcube_language_aliases = array(
        'ee' => 'et_EE',
        'bs' => 'bs_BA',
-  'cn' => 'zh_CN',
+       'cn' => 'zh_CN',
        'de' => 'de_DE',
        'en' => 'en_US',
+       'ga' => 'ga_IE',
        'nl' => 'nl_NL',
        'no' => 'nn_NO',
        'pt' => 'pt_PT',
-  'tw' => 'zh_TW'
+       'th' => 'th_TH',
+       'tw' => 'zh_TW'
 );
 
 $rcube_charsets = array();
index 8324c1f859f3e92427f6308bfcf89814934ee893..bfd1016fe2c64880b9d2897c1669d69630fe9c1b 100644 (file)
@@ -14,7 +14,7 @@
  |         Yusef Maali <contact@yusefmaali.net>                          |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 552 2007-05-03 20:48:00Z yllar $
+ @version $Id: labels.inc 869 2007-10-15 13:27:08Z yllar $
 
 */
 
@@ -51,7 +51,7 @@ $labels['moveto'] = 'sposta...';
 $labels['download'] = 'download';
 $labels['filename'] = 'Nome file';
 $labels['filesize'] = 'Dimensione file';
-$labels['preferhtml'] = 'Preferisci HTML';
+$labels['preferhtml'] = 'Mostra HTML';
 $labels['htmlmessage'] = 'Messaggio HTML';
 $labels['prettydate'] = 'Date più leggibili';
 $labels['addtoaddressbook'] = 'Aggiungi alla rubrica';
@@ -75,7 +75,8 @@ $labels['writenewmessage'] = 'Scrivi un nuovo messaggio';
 $labels['replytomessage'] = 'Rispondi al messaggio';
 $labels['replytoallmessage'] = 'Rispondi a tutti';
 $labels['forwardmessage'] = 'Inoltra il messaggio';
-$labels['deletemessage'] = 'Sposta il messaggio nel cestino';
+$labels['deletemessage'] = 'Elimina il messaggio';
+$labels['movemessagetotrash'] = 'Sposta il messaggio nel cestino';
 $labels['printmessage'] = 'Stampa il messaggio';
 $labels['previousmessage'] = 'Visualizza il messaggio precedente';
 $labels['previousmessages'] = 'Visualizza messaggi precedenti';
@@ -94,14 +95,14 @@ $labels['unread'] = 'Non letti';
 $labels['compact'] = 'Compatta';
 $labels['empty'] = 'Svuota';
 $labels['purge'] = 'Pulisci';
-$labels['quota'] = 'Utilizzo spazio';
+$labels['quota'] = 'Spazio utilizzato';
 $labels['unknown'] = 'sconosciuto';
 $labels['unlimited'] = 'illimitato';
 $labels['quicksearch'] = 'Ricerca veloce';
 $labels['resetsearch'] = 'Annulla ricerca';
 $labels['compose'] = 'Scrivi un messaggio';
-$labels['sendmessage'] = 'Invia il messaggio adesso';
 $labels['savemessage'] = 'Salva come bozza';
+$labels['sendmessage'] = 'Invia il messaggio adesso';
 $labels['addattachment'] = 'Allega un file';
 $labels['charset'] = 'Set di caratteri';
 $labels['editortype'] = 'Tipo editor';
@@ -121,11 +122,14 @@ $labels['nosubject'] = '(nessun oggetto)';
 $labels['showimages'] = 'Visualizza immagini';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Testo semplice';
+$labels['addcc'] = 'Aggiungi Cc';
+$labels['addbcc'] = 'Aggiungi Bcc';
+$labels['addreplyto'] = 'Aggiungi Rispondi a';
 $labels['name'] = 'Nome visualizzato';
 $labels['firstname'] = 'Nome';
 $labels['surname'] = 'Cognome';
 $labels['email'] = 'E-Mail';
-$labels['addcontact'] = 'Aggiungi il contatto selezionato alla rubrica';
+$labels['addcontact'] = 'Aggiungi contatto alla rubrica';
 $labels['editcontact'] = 'Modifica contatto';
 $labels['edit'] = 'Modifica';
 $labels['cancel'] = 'Annulla';
@@ -142,7 +146,7 @@ $labels['firstpage'] = 'Prima pagina';
 $labels['nextpage'] = 'Pagina successiva';
 $labels['lastpage'] = 'Ultima pagina';
 $labels['groups'] = 'Gruppi';
-$labels['personaladrbook'] = 'Indirizzi Personali';
+$labels['personaladrbook'] = 'Rubrica Personale';
 $labels['settingsfor'] = 'Impostazioni per ';
 $labels['preferences'] = 'Preferenze';
 $labels['userpreferences'] = 'Preferenze utente';
@@ -169,10 +173,10 @@ $labels['folders'] = 'Cartelle';
 $labels['foldername'] = 'Nome cartella';
 $labels['subscribed'] = 'Sottoscritta';
 $labels['create'] = 'Crea';
-$labels['createfolder'] = 'Crea una nuova cartella';
+$labels['createfolder'] = 'Crea nuova cartella';
 $labels['rename'] = 'Rinomina';
 $labels['renamefolder'] = 'Rinomina cartella';
-$labels['deletefolder'] = 'Cancella la cartella';
+$labels['deletefolder'] = 'Cancella cartella';
 $labels['managefolders'] = 'Gestione cartelle';
 $labels['sortby'] = 'Ordina per';
 $labels['sortasc'] = 'Ordinamento crescente';
index b00cfaa3918d5d4126413138e0e89c04f4559766..07fc7f43280e839809b45873a60c17d4603a3efb 100644 (file)
@@ -14,7 +14,7 @@
  |         Yusef Maali <contact@yusefmaali.net>                          |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 552 2007-05-03 20:48:00Z yllar $
+ @version $Id: messages.inc 869 2007-10-15 13:27:08Z yllar $
 
 */
 
@@ -52,7 +52,7 @@ $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';
 $messages['nopagesizewarning'] = 'Per favore, immetti il numero di righe per pagina';
-$messages['norecipientwarning'] = 'Per favore, immetti almeno un contatto';
+$messages['norecipientwarning'] = 'Per favore, immetti almeno un destinatario';
 $messages['nosubjectwarning'] = 'L\'oggetto é vuoto. Vuoi inserirlo adesso?';
 $messages['nobodywarning'] = 'Inviare il messaggio senza testo?';
 $messages['notsentwarning'] = 'Il messaggio non é stato inviato. Vuoi veramente annullare questo messaggio?';
@@ -74,5 +74,6 @@ $messages['copysuccess'] = 'Copiati $nr indirizzi';
 $messages['copyerror'] = 'Impossibile copiare gli indirizzi';
 $messages['sourceisreadonly'] = 'La rubrica è in sola lettura';
 $messages['errorsavingcontact'] = 'Impossibile salvare il contatto';
+$messages['movingmessage'] = 'Sposto il messaggio...';
 
 ?>
\ No newline at end of file
index a13a1c658ceac28701dd682ec421fbb620aaaf28..15dc25edd65bcb5acbe0d424f0d08f6c63ce0d4a 100644 (file)
@@ -14,7 +14,7 @@
  |         Takashi Takamatsu <taka717@gmail.com>                         |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 619 2007-06-13 07:09:09Z thomasb $
+ @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
@@ -178,4 +178,4 @@ $labels['sortby'] = '整列の基準にする';
 $labels['sortasc'] = '昇順で整列';
 $labels['sortdesc'] = '降順で整列';
 
-?>
+?>
\ No newline at end of file
index c7ea077c6fefaec64b9ecc7152eddeb60295c7d8..eb19674a7f2d240cbde8ab8b7a10215814e4d4f3 100644 (file)
  |         Takashi Takamatsu <taka717@gmail.com>                         |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 619 2007-06-13 07:09:09Z thomasb $
+ @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
 $messages = array();
 $messages['loginfailed'] = 'ログインに失敗しました。';
-$messages['cookiesdisabled'] = 'ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81\8c Cookie ã\82\92å\8f\97ç\90\86ã\81\97ã\81¾ã\81\9bã\82\93。';
+$messages['cookiesdisabled'] = 'ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81§ Cookie ã\81\8cç\84¡å\8a¹ã\81«è¨­å®\9aã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99。';
 $messages['sessionerror'] = 'セッションが正しくないか期限切れです。';
 $messages['imaperror'] = 'IMAP サーバーへの接続に失敗しました。';
-$messages['nomessagesfound'] = 'ã\81\93ã\81®ã\83¡ã\83¼ã\83«ã\83\9cã\83\83ã\82¯ã\82¹ã\81§ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81¯è¦\8bã\81¤ã\81\8bりません。';
-$messages['loggedout'] = 'ã\82»ã\83\83ã\82·ã\83§ã\83³ã\81®å\88\87æ\96­ã\81«æ\88\90å\8a\9fã\81\97ã\81¾ã\81\97ã\81\9fã\80\82ã\81\95ã\82\88ã\81\86ã\81ªã\82\89!';
+$messages['nomessagesfound'] = 'ã\83¡ã\83¼ã\83«ã\81¯ã\81\82りません。';
+$messages['loggedout'] = 'ã\83­ã\82°ã\82¢ã\82¦ã\83\88ã\81\97ã\81¾ã\81\97ã\81\9fã\80\82';
 $messages['mailboxempty'] = 'メールボックスは空です。';
-$messages['loading'] = '読中...';
-$messages['loadingdata'] = 'データを読中です...';
-$messages['checkingmail'] = '新しいメッセージの確認中です...';
-$messages['sendingmessage'] = 'ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81®送信中です...';
-$messages['messagesent'] = 'ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81®é\80\81ä¿¡ã\81«æ\88\90å\8a\9fしました。';
-$messages['savingmessage'] = 'ã\83¡ã\83\83ã\82»ã\83¼ã\82¸を保存しています...';
-$messages['messagesaved'] = 'ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82\92è\8d\89稿に保存しました。';
-$messages['successfullysaved'] = 'ä¿\9då­\98ã\81«æ\88\90å\8a\9fã\81\97ã\81¾ã\81\97ã\81\9fã\80\82';
-$messages['addedsuccessfully'] = 'ã\82¢ã\83\89ã\83¬ã\82¹å¸³ã\81¸ã\81®é\80£çµ¡å\85\88ã\81®è¿½å\8a ã\81«æ\88\90å\8a\9fã\81\97ã\81¾ã\81\97ã\81\9fã\80\82';
+$messages['loading'] = '読み込み中...';
+$messages['loadingdata'] = 'データを読み込み中です...';
+$messages['checkingmail'] = 'メールの確認中です...';
+$messages['sendingmessage'] = 'ã\83¡ã\83¼ã\83«ã\82\92送信中です...';
+$messages['messagesent'] = 'ã\83¡ã\83¼ã\83«ã\82\92é\80\81ä¿¡しました。';
+$messages['savingmessage'] = 'ã\83¡ã\83¼ã\83«を保存しています...';
+$messages['messagesaved'] = 'ã\83¡ã\83¼ã\83«ã\82\92ä¸\8bæ\9b¸ã\81\8dに保存しました。';
+$messages['successfullysaved'] = '保存しました。';
+$messages['addedsuccessfully'] = 'アドレス帳への連絡先の追加しました。';
 $messages['contactexists'] = 'このメールアドレスは既にアドレス帳に存在します。';
-$messages['blockedimages'] = 'ã\83\97ã\83©ã\82¤ã\83\90ã\82·ã\83¼ã\82\92ä¿\9dè­·ã\81\99ã\82\8bã\81\9fã\82\81ã\80\81ã\81\93ã\81®ã\83¡ã\83\83ã\82»ã\83¼ã\82¸に含まれるリモート画像はブロックされました。';
-$messages['encryptedmessage'] = 'ã\81\93ã\81®ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81¯æ\9a\97å\8f·å\8c\96ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81表示ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82ã\81\94ã\82\81ã\82\93ã\81ªã\81\95ã\81\84!';
+$messages['blockedimages'] = 'ã\83\97ã\83©ã\82¤ã\83\90ã\82·ã\83¼ã\82\92ä¿\9dè­·ã\81\99ã\82\8bã\81\9fã\82\81ã\80\81ã\81\93ã\81®ã\83¡ã\83¼ã\83«に含まれるリモート画像はブロックされました。';
+$messages['encryptedmessage'] = 'ã\81\93ã\81®ã\83¡ã\83¼ã\83«ã\81¯æ\9a\97å\8f·å\8c\96ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81表示ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82';
 $messages['nocontactsfound'] = '連絡先が見つかりません。';
 $messages['contactnotfound'] = '要求された連絡先が見つかりません。';
-$messages['sendingfailed'] = 'ã\83¡ã\83\83ã\82»ã\83¼ã\82¸の送信に失敗しました。';
+$messages['sendingfailed'] = 'ã\83¡ã\83¼ã\83«の送信に失敗しました。';
 $messages['errorsaving'] = '保存中にエラーが発生しました。';
-$messages['errormoving'] = 'ã\83¡ã\83\83ã\82»ã\83¼ã\82¸を移動できません。';
-$messages['errordeleting'] = 'ã\83¡ã\83\83ã\82»ã\83¼ã\82¸を削除できません。';
-$messages['deletecontactconfirm'] = '選択した連絡先を本当に削除しますか?';
-$messages['deletemessagesconfirm'] = 'é\81¸æ\8a\9eã\81\97ã\81\9fã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82\92æ\9c¬å½\93ã\81«å\89\8aé\99¤ã\81\97ã\81¾ã\81\99ã\81\8b?';
-$messages['deletefolderconfirm'] = 'このフォルダーを本当に削除しますか?';
-$messages['purgefolderconfirm'] = 'ã\81\93ã\81®ã\83\95ã\82©ã\83«ã\83\80ã\81®å\85¨ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82\92æ\9c¬å½\93ã\81«å\89\8aé\99¤ã\81\97ã\81¾ã\81\99ã\81\8b?';
+$messages['errormoving'] = 'ã\83¡ã\83¼ã\83«を移動できません。';
+$messages['errordeleting'] = 'ã\83¡ã\83¼ã\83«を削除できません。';
+$messages['deletecontactconfirm'] = '選択した連絡先を本当に削除しますか';
+$messages['deletemessagesconfirm'] = 'é\81¸æ\8a\9eã\81\97ã\81\9fã\83¡ã\83¼ã\83«ã\82\92æ\9c¬å½\93ã\81«å\89\8aé\99¤ã\81\97ã\81¾ã\81\99ã\81\8bï¼\9f';
+$messages['deletefolderconfirm'] = 'このフォルダーを本当に削除しますか';
+$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['formincomplete'] = 'フォームの項目が完全に入力されていません。';
 $messages['noemailwarning'] = '有効なメールアドレスを入力して下さい。';
 $messages['nonamewarning'] = '名前を入力して下さい。';
 $messages['nopagesizewarning'] = 'ページのサイズを入力して下さい。';
 $messages['norecipientwarning'] = '受信者を最低 1 人は入力して下さい。';
-$messages['nosubjectwarning'] = '件名が空です。今すぐ入力しますか?';
-$messages['nobodywarning'] = 'æ\9c¬æ\96\87ã\81®ç\84¡ã\81\84ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82\92é\80\81ä¿¡ã\81\97ã\81¾ã\81\99ã\81\8b?';
-$messages['notsentwarning'] = 'ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81¯é\80\81ä¿¡ã\81\95ã\82\8cã\81¾ã\81\9bã\82\93ã\81§ã\81\97ã\81\9fã\80\82ç ´æ£\84ã\81\97ã\81¾ã\81\99ã\81\8b?';
+$messages['nosubjectwarning'] = '件名が空です。今すぐ入力しますか';
+$messages['nobodywarning'] = 'æ\9c¬æ\96\87ã\81\8cç\84¡ã\81\84ã\83¡ã\83¼ã\83«ã\82\92é\80\81ä¿¡ã\81\97ã\81¾ã\81\99ã\81\8bï¼\9f';
+$messages['notsentwarning'] = 'ã\83¡ã\83¼ã\83«ã\81¯é\80\81ä¿¡ã\81\95ã\82\8cã\81¾ã\81\9bã\82\93ã\81§ã\81\97ã\81\9fã\80\82ç ´æ£\84ã\81\97ã\81¾ã\81\99ã\81\8bï¼\9f';
 $messages['noldapserver'] = '検索する LDAP サーバーを選択して下さい。';
 $messages['nocontactsreturned'] = '連絡先が見つかりません。';
 $messages['nosearchname'] = '連絡先の名前かメールアドレスを入力して下さい。';
-$messages['searchsuccessful'] = ' $nr 個のメッセージが見つかりました。';
-$messages['searchnomatch'] = 'ä¸\80è\87´ã\81\99ã\82\8bã\82\82ã\81®ã\81\8cありません。';
+$messages['searchsuccessful'] = ' $nr 件のメールが見つかりました。';
+$messages['searchnomatch'] = 'ä¸\80è\87´ã\81\99ã\82\8bã\83¡ã\83¼ã\83«ã\81¯ありません。';
 $messages['searching'] = '検索中です...';
 $messages['checking'] = '確認中です...';
-$messages['nospellerrors'] = 'ã\82¹ã\83\9aã\83«ã\82¨ã\83©ã\83¼は見つかりませんでした。';
-$messages['folderdeleted'] = 'ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\81®å\89\8aé\99¤ã\81«æ\88\90å\8a\9fしました。';
-$messages['deletedsuccessfully'] = 'å\89\8aé\99¤ã\81«æ\88\90å\8a\9fã\81\97ã\81¾ã\81\97ã\81\9fã\80\82';
-$messages['converting'] = 'ã\83¡ã\83\83ã\82»ã\83¼ã\82¸から書式を削除中です...';
-$messages['messageopenerror'] = 'ã\82µã\83¼ã\83\90ã\81\8bã\82\89ã\83¡ã\83\83ã\82»ã\83¼ã\82¸を取得できません。';
+$messages['nospellerrors'] = 'ã\82¹ã\83\9aã\83«ã\83\9fã\82¹は見つかりませんでした。';
+$messages['folderdeleted'] = 'ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\82\92å\89\8aé\99¤しました。';
+$messages['deletedsuccessfully'] = '削除しました。';
+$messages['converting'] = 'ã\83¡ã\83¼ã\83«から書式を削除中です...';
+$messages['messageopenerror'] = 'ã\82µã\83¼ã\83\90ã\81\8bã\82\89ã\83¡ã\83¼ã\83«を取得できません。';
 $messages['fileuploaderror'] = 'ファイルのアップロードに失敗しました。';
 $messages['filesizeerror'] = 'アップロードしたファイルのサイズが上限 $size を超えました。';
 $messages['copysuccess'] = 'アドレス $nr 個のコピーに成功しました。';
 $messages['copyerror'] = 'アドレスをコピーできません。';
 $messages['sourceisreadonly'] = 'このアドレス情報は読み取り専用です。';
 $messages['errorsavingcontact'] = '連絡先のアドレスを保存できません。';
+$messages['movingmessage'] = '移動中です...';
 
-?>
+?>
\ No newline at end of file
index bb603ff24e4e13c6c00b3ee9125c147bceb90143..9b9c16aab7602c79e7d2253d8b6bea913b08e5b8 100644 (file)
@@ -13,7 +13,7 @@
  | Author: Martynas Bendorius <martynas@e-vaizdas.net>                   |
  +-----------------------------------------------------------------------+'
 
- @version $Id: labels.inc 557 2007-05-15 06:41:32Z yllar $
+ @version $Id: labels.inc 853 2007-10-03 19:47:40Z yllar $
 
 */
 
@@ -75,6 +75,7 @@ $labels['replytomessage'] = 'Atsakyti į lašką';
 $labels['replytoallmessage'] = 'Atsakyti visiems';
 $labels['forwardmessage'] = 'Persiųsti laišką';
 $labels['deletemessage'] = 'Ištrinti laišką';
+$labels['movemessagetotrash'] = 'Perkelti laišką į šiukšliadėžę';
 $labels['printmessage'] = 'Atspausdinti laišką';
 $labels['previousmessage'] = 'Rodyti ankstesnį laišką';
 $labels['previousmessages'] = 'Rodyti ankstesius laiškus';
@@ -99,8 +100,8 @@ $labels['unlimited'] = 'neribotas';
 $labels['quicksearch'] = 'Greita paieška';
 $labels['resetsearch'] = 'Atšaukti paiešką';
 $labels['compose'] = 'Rašyti nauja laiška';
-$labels['sendmessage'] = 'Išsiųsti laiską';
 $labels['savemessage'] = 'Išsaugoti šį juodraštį';
+$labels['sendmessage'] = 'Išsiųsti laiską';
 $labels['addattachment'] = 'Prisegti bylą';
 $labels['charset'] = 'Koduotė';
 $labels['editortype'] = 'Redagavimo tipas';
@@ -120,6 +121,9 @@ $labels['nosubject'] = '(nėra temos)';
 $labels['showimages'] = 'Rodyti paveikslėlius';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Paprastas tekstas';
+$labels['addcc'] = 'Pridėti Cc';
+$labels['addbcc'] = 'Pridėti Bcc';
+$labels['addreplyto'] = 'Pridėti Reply-To';
 $labels['name'] = 'Rodomas vardas';
 $labels['firstname'] = 'Vardas';
 $labels['surname'] = 'Pavardė';
@@ -177,4 +181,4 @@ $labels['sortby'] = 'Rikiuoti pagal';
 $labels['sortasc'] = 'Rikiuoti didėjančia tvarka';
 $labels['sortdesc'] = 'Rikiuoti mažėjančia tvarka';
 
-?>
+?>
\ No newline at end of file
index 13e886581aca6982bfb51a1b83728701c902217a..eb9041146d099b1acca5dfde080c387f083e8c9d 100644 (file)
@@ -13,7 +13,7 @@
  | Author: Martynas Bendorius <martynas@e-vaizdas.net>                   |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 557 2007-05-15 06:41:32Z yllar $
+ @version $Id: messages.inc 853 2007-10-03 19:47:40Z yllar $
 
 */
 
@@ -73,5 +73,6 @@ $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...';
 
-?>
+?> 
diff --git a/program/localization/mk/labels.inc b/program/localization/mk/labels.inc
new file mode 100755 (executable)
index 0000000..3a42fe4
--- /dev/null
@@ -0,0 +1,177 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | language/mk/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author:  Ivan Mishev - mishevivan@gmail.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'] = 'Bcc';
+$labels['replyto'] = 'Препрати на';
+$labels['date'] = 'Дата';
+$labels['size'] = 'Големина';
+$labels['priority'] = 'Приоритет';
+$labels['organization'] = 'Организација';
+$labels['reply-to'] = 'Препрати на';
+$labels['mailboxlist'] = 'Папки';
+$labels['messagesfromto'] = '$count пораки од $from';
+$labels['messagenrof'] = '$nr порака од $count';
+$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['today'] = 'Денес';
+$labels['checkmail'] = 'Провери пошта';
+$labels['writenewmessage'] = 'Нова порака';
+$labels['replytomessage'] = 'Одговори на пораката';
+$labels['replytoallmessage'] = 'Одговори на сите';
+$labels['forwardmessage'] = 'Препрати ја пораката';
+$labels['deletemessage'] = 'Премести ја пораката во Корпа';
+$labels['printmessage'] = 'За печатење';
+$labels['previousmessage'] = 'Прикажи ја претходната порака';
+$labels['previousmessages'] = 'Прикажи ги претходните пораки';
+$labels['firstmessage'] = 'Прикажи ја првата порака';
+$labels['firstmessages'] = 'Прикажи ги првите пораки';
+$labels['nextmessage'] = 'Прикажи ја наредната порака';
+$labels['nextmessages'] = 'Прикажи ги следните пораки';
+$labels['lastmessage'] = 'Прикажи ја последната порака';
+$labels['lastmessages'] = 'Прикажи ги последните пораки';
+$labels['backtolist'] = 'Врати се во поштенското сандаче';
+$labels['viewsource'] = 'Покажи го изворот на пракање';
+$labels['select'] = 'Одбележи';
+$labels['all'] = 'Сите';
+$labels['none'] = 'Никоја';
+$labels['unread'] = 'Непрочитани';
+$labels['compact'] = 'Уредно';
+$labels['empty'] = 'Испразни';
+$labels['purge'] = 'Чистење';
+$labels['quota'] = 'Искористен простор';
+$labels['unknown'] = 'непознато';
+$labels['unlimited'] = 'неограничено';
+$labels['quicksearch'] = 'Брзо претражување';
+$labels['resetsearch'] = 'Ново претражување';
+$labels['compose'] = 'Нова порака';
+$labels['sendmessage'] = 'Прати ја пораката';
+$labels['savemessage'] = 'Снимај ја пораката во Непратени';
+$labels['addattachment'] = 'Прикачи фајл';
+$labels['charset'] = '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['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Обичен текст';
+$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['previouspage'] = 'Прикажи претходна страна';
+$labels['firstpage'] = 'Прикажи ја првата страна';
+$labels['nextpage'] = 'Прикажи ја следната страна';
+$labels['lastpage'] = 'Прикажи ја последната страна';
+$labels['groups'] = 'Групи';
+$labels['personaladrbook'] = 'Адреси';
+$labels['settingsfor'] = 'Подесувања за';
+$labels['preferences'] = 'Подесувања';
+$labels['userpreferences'] = 'Кориснички подесувања';
+$labels['editpreferences'] = 'Промени ги корисничките подесувања';
+$labels['identities'] = 'Идентитети';
+$labels['manageidentities'] = 'Организирај ги идентитетите за овој корисник';
+$labels['newidentity'] = 'Нов идентитет';
+$labels['newitem'] = 'Нов објект';
+$labels['edititem'] = 'Промени објект';
+$labels['setdefault'] = 'Одбери за основно';
+$labels['language'] = 'Јазик';
+$labels['timezone'] = 'Временска зона';
+$labels['pagesize'] = 'Редови прикажани на страна';
+$labels['signature'] = 'Потпис';
+$labels['dstactive'] = 'Промени на времето';
+$labels['htmleditor'] = 'Создади HTML порака';
+$labels['htmlsignature'] = 'HTML потпис';
+$labels['previewpane'] = 'Прикажи го претходниот панел';
+$labels['autosavedraft'] = 'Авоматски снимај во Непратени';
+$labels['everynminutes'] = 'секои $n минути';
+$labels['never'] = 'никогаш';
+$labels['folder'] = 'Папка';
+$labels['folders'] = 'Папки';
+$labels['foldername'] = 'Име на папката';
+$labels['subscribed'] = 'Претплатен';
+$labels['create'] = 'Креирај';
+$labels['createfolder'] = 'Креирај нова папка';
+$labels['rename'] = 'Преименувај';
+$labels['renamefolder'] = 'Преименувај ја папката';
+$labels['deletefolder'] = 'Избриши ја папката';
+$labels['managefolders'] = 'Организирање на папки';
+$labels['sortby'] = 'Уреди по';
+$labels['sortasc'] = 'Уреди по азбучен ред';
+$labels['sortdesc'] = 'Уреди опаѓачки';
+
+?>
\ No newline at end of file
diff --git a/program/localization/mk/messages.inc b/program/localization/mk/messages.inc
new file mode 100755 (executable)
index 0000000..f20b7d9
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | language/mk/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author:  Ivan Mishev - mishevivan@gmail.com                           |
+ +-----------------------------------------------------------------------+
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Неуспешна најава';
+$messages['cookiesdisabled'] = 'Вашиот прелистувач не прифаќа cookies';
+$messages['sessionerror'] = 'Сесијата е невалидна или е истечена';
+$messages['imaperror'] = 'Конектирањето со IMAP е неуспешно';
+$messages['nomessagesfound'] = 'Немате пораки во вашата пошта';
+$messages['loggedout'] = 'Успешно се одлогиравте. Благодариме!';
+$messages['mailboxempty'] = 'Поштенското сандаче е празно.';
+$messages['loading'] = 'Вчитувам...';
+$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['errorsaving'] = 'Грешка при снимањето';
+$messages['errormoving'] = 'Пораката неможе да се премести';
+$messages['errordeleting'] = 'Пораката неможе да се избрише';
+$messages['deletecontactconfirm'] = 'Дали сте сигурни дека сакате да го избришете обележаниот(те) контакт(и)?';
+$messages['deletemessagesconfirm'] = 'Дали сте сигурни дека сакате да го избришете обележаниот(те) порака(и)?';
+$messages['deletefolderconfirm'] = 'Дали сте сигурни дека сакате да ја избришете оваа папка?';
+$messages['purgefolderconfirm'] = 'Дали сте сигурни дека сакате да ги избршете сите пораки во оваа папка?';
+$messages['formincomplete'] = 'Имате изоставено непополнети информации';
+$messages['noemailwarning'] = 'Внесете валидна емаил адреса';
+$messages['nonamewarning'] = 'Внесете име';
+$messages['nopagesizewarning'] = 'Внесете ја големината на страната';
+$messages['norecipientwarning'] = 'Внесете барем еден примач';
+$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['deletedsuccessfully'] = 'Успешно избришано';
+$messages['converting'] = 'Форматирањето на пораката е отстрането...';
+$messages['messageopenerror'] = 'Пораката неможе да се вчита од серверот';
+$messages['fileuploaderror'] = 'Прикачувањето е неуспешно';
+$messages['filesizeerror'] = 'Фајлот што се прикачува го изминува лимитот од $size';
+$messages['copysuccess'] = 'Успешно се копирани $nr имиња';
+$messages['copyerror'] = 'Неможе да се копираат адресите';
+$messages['sourceisreadonly'] = 'Изворот на оваа адреса неможе да се промени';
+$messages['errorsavingcontact'] = 'Името неможе да се сними';
+
+?>
\ No newline at end of file
diff --git a/program/localization/ms_MY/labels.inc b/program/localization/ms_MY/labels.inc
new file mode 100644 (file)
index 0000000..b511c75
--- /dev/null
@@ -0,0 +1,232 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ms_MY/labels.inc                                             |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 543 2007-04-28 18:07:12Z thomasb $
+
+*/
+
+$labels = array();
+
+// login page
+$labels['welcome']   = 'Selamat datang ke $product';
+$labels['username']  = 'Nama Pengguna';
+$labels['password']  = 'Kata Laluan';
+$labels['server']    = 'Pelayan';
+$labels['login']     = 'Log Masuk';
+
+// taskbar
+$labels['logout']   = 'Log Keluar';
+$labels['mail']     = 'E-Mel';
+$labels['settings'] = 'Tetapan Peribadi';
+$labels['addressbook'] = 'Buku Alamat';
+
+// mailbox names
+$labels['inbox']  = 'Masuk';
+$labels['drafts'] = 'Draf';
+$labels['sent']   = 'Keluar';
+$labels['trash']  = 'Sampah';
+$labels['junk']   = 'Remeh';
+
+// message listing
+$labels['subject'] = 'Subjek';
+$labels['from']    = 'Penghantar';
+$labels['to']      = 'Penerima';
+$labels['cc']      = 'Salinan';
+$labels['bcc']     = 'Bcc';
+$labels['replyto'] = 'Balas kepada';
+$labels['date']    = 'Tarikh';
+$labels['size']    = 'Saiz';
+$labels['priority'] = 'Keutamaan';
+$labels['organization'] = 'Organisasi';
+
+// aliases
+$labels['reply-to'] = $labels['replyto'];
+
+$labels['mailboxlist'] = 'Kabinet Fail';
+$labels['messagesfromto'] = 'Mesej $from ke $to dari $count';
+$labels['messagenrof'] = 'Mesej $nr dari $count';
+
+$labels['moveto']   = 'pindah ke...';
+$labels['download'] = 'muat turun';
+
+$labels['filename'] = 'Nama Fail';
+$labels['filesize'] = 'Saiz Fail';
+
+$labels['preferhtml'] = 'Papar HTML';
+$labels['htmlmessage'] = 'Mesej HTML';
+$labels['prettydate'] = 'Tarikh-tarikh cantik';
+
+$labels['addtoaddressbook'] = 'Tambah ke buku alamat';
+
+// weekdays short
+$labels['sun'] = 'Aha';
+$labels['mon'] = 'Isn';
+$labels['tue'] = 'Sel';
+$labels['wed'] = 'Rab';
+$labels['thu'] = 'Kha';
+$labels['fri'] = 'Jum';
+$labels['sat'] = 'Sab';
+
+// weekdays long
+$labels['sunday']    = 'Ahad';
+$labels['monday']    = 'Isnin';
+$labels['tuesday']   = 'Selasa';
+$labels['wednesday'] = 'Rabu';
+$labels['thursday']  = 'Khamis';
+$labels['friday']    = 'Jumaat';
+$labels['saturday']  = 'Sabtu';
+
+$labels['today'] = 'Hari Ini';
+
+// toolbar buttons
+$labels['checkmail']        = 'Semak mesej baru';
+$labels['writenewmessage']  = 'Cipta mesej baru';
+$labels['replytomessage']   = 'Balas mesej';
+$labels['replytoallmessage'] = 'Balas kepada penghantar dan semua penerima';
+$labels['forwardmessage']   = 'Marakan mesej';
+$labels['deletemessage']    = 'Pindah mesej ke sampah';
+$labels['printmessage']     = 'Cetak mesej ini';
+$labels['previousmessage']  = 'Papar mesej sebelumnya';
+$labels['previousmessages'] = 'Papar set mesej sebelumnya';
+$labels['firstmessage']     = 'Papar mesej pertama';
+$labels['firstmessages']    = 'Papar set mesej pertama';
+$labels['nextmessage']      = 'Papat mesej seterusnya';
+$labels['nextmessages']     = 'Papar set mesej seterusnya';
+$labels['lastmessage']      = 'Papat mesej terakhir';
+$labels['lastmessages']     = 'Papar set mesej terakhir';
+$labels['backtolist']       = 'Kembali ke senarai mesej';
+$labels['viewsource']       = 'Papar sumber';
+
+$labels['select'] = 'Pilih';
+$labels['all'] = 'Semua';
+$labels['none'] = 'Tiada';
+$labels['unread'] = 'Tidak dibaca';
+
+$labels['compact'] = 'Padat';
+$labels['empty'] = 'Kosong';
+$labels['purge'] = 'Singkir';
+
+$labels['quota'] = 'Penggunaan cakera';
+$labels['unknown']  = 'tidak dikenali';
+$labels['unlimited']  = 'tidak terhad';
+
+$labels['quicksearch']  = 'Carian pantas';
+$labels['resetsearch']  = 'Set semula carian';
+
+
+// message compose
+$labels['compose']        = 'Karang mesej';
+$labels['sendmessage']    = 'Hantar mesej sekarang';
+$labels['savemessage']  = 'Simpan draf ini';
+$labels['addattachment']  = 'Lampir fail';
+$labels['charset']        = 'Charset';
+$labels['editortype']     = 'Jenis Editor';
+$labels['returnreceipt']  = 'Resit kembali';
+
+$labels['checkspelling'] = 'Semak ejaan';
+$labels['resumeediting'] = 'Sambung pengeditan';
+$labels['revertto']      = 'Kembali kepada';
+
+$labels['attachments'] = 'Lampiran';
+$labels['upload'] = 'Muat naik';
+$labels['close']  = 'Tutup';
+
+$labels['low']     = 'Rendah';
+$labels['lowest']  = 'Paling Rendah';
+$labels['normal']  = 'Normal';
+$labels['high']    = 'Tinggi';
+$labels['highest'] = 'Paling Tinggi';
+
+$labels['nosubject']  = '(tiada subjek)';
+$labels['showimages'] = 'Papar imej';
+
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Teks kosong';
+
+
+// address boook
+$labels['name']      = 'Nama paparan';
+$labels['firstname'] = 'Nama pertama';
+$labels['surname']   = 'Nama akhir';
+$labels['email']     = 'E-Mel';
+
+$labels['addcontact'] = 'Tambah kontek baru';
+$labels['editcontact'] = 'Ubahsuai Kontek';
+
+$labels['edit']   = 'Ubahsuai';
+$labels['cancel'] = 'Batal';
+$labels['save']   = 'Simpan';
+$labels['delete'] = 'Hapus';
+
+$labels['newcontact']     = 'Cipta kad kontek baru';
+$labels['deletecontact']  = 'Hapus kontek yang dipilih';
+$labels['composeto']      = 'Karang mel kepada';
+$labels['contactsfromto'] = 'Kontek $from ke $to dari $count';
+$labels['print']          = 'Cetak';
+$labels['export']         = 'Eksport';
+
+$labels['previouspage']   = 'Papar set sebelumnya';
+$labels['firstpage']      = 'Papar set pertama';
+$labels['nextpage']       = 'Papar set seterusnya';
+$labels['lastpage']       = 'Papar set akhir';
+
+$labels['groups'] = 'Kumpulan';
+$labels['personaladrbook'] = 'Alamat-alamat Peribadi';
+
+
+// settings
+$labels['settingsfor']  = 'Tetapan bagi';
+
+$labels['preferences']  = 'Pilihan';
+$labels['userpreferences']  = 'Pilihan pengguna';
+$labels['editpreferences']  = 'Ubahsuai pilihan pengguna';
+
+$labels['identities']  = 'Identiti';
+$labels['manageidentities']  = 'Urus identiti bagi akaun ini';
+$labels['newidentity']  = 'Identiti baru';
+
+$labels['newitem']  = 'Butiran baru';
+$labels['edititem']  = 'Ubahsuai butiran';
+
+$labels['setdefault']  = 'Tetap asal';
+$labels['language']  = 'Bahasa';
+$labels['timezone']  = 'Zon Masa';
+$labels['pagesize']  = 'Baris setiap muka';
+$labels['signature'] = 'Tandatangan';
+$labels['dstactive']  = 'Simpanan siang hari';
+$labels['htmleditor'] = 'Karang mesej HTML';
+$labels['htmlsignature'] = 'Tandatangan HTML';
+$labels['previewpane'] = 'Pamer ruang previu';
+
+$labels['autosavedraft']  = 'Simpan draf dengan automatik';
+$labels['everynminutes']  = 'setiap $n minit';
+$labels['never']  = 'tidak pernah';
+
+$labels['folder']  = 'Kabinet Fail';
+$labels['folders']  = 'Kabinet Fail';
+$labels['foldername']  = 'Nama Kabinet Fail';
+$labels['subscribed']  = 'Dilanggan';
+$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';
+$labels['sortdesc'] = 'Susun menurun';
+
+?>
diff --git a/program/localization/ms_MY/messages.inc b/program/localization/ms_MY/messages.inc
new file mode 100644 (file)
index 0000000..6cbd92b
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ms_MY/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 543 2007-04-28 18:07:12Z thomasb $
+
+*/
+
+$messages = array();
+$messages['loginfailed']  = 'Log masuk gagal';
+$messages['cookiesdisabled'] = 'Pelayar anda tidak menerima cookies';
+$messages['sessionerror'] = 'Sesi anda tidak sah atau telah tamat';
+$messages['imaperror'] = 'Sambungan ke pelayan IMAP gagal';
+$messages['nomessagesfound'] = 'Tiada mesej dijumpai dalam kotak mel ini';
+$messages['loggedout'] = 'Sesi anda telah tamat. Selamat tinggal!';
+$messages['mailboxempty'] = 'Kotak mail kosong';
+$messages['loading'] = 'Memuat...';
+$messages['loadingdata'] = 'Memuat data...';
+$messages['checkingmail'] = 'Menyemak mesej baru...';
+$messages['sendingmessage'] = 'Menghantar mesej...';
+$messages['messagesent'] = 'Mesej berjaya dihantar';
+$messages['savingmessage'] = 'Menyimpan mesej...';
+$messages['messagesaved'] = 'Mesej disimpan dalam Draf';
+$messages['successfullysaved'] = 'Berjaya disimpan';
+$messages['addedsuccessfully'] = 'Kontek berjaya disimpan ke dalam buku alamat';
+$messages['contactexists'] = 'Kontek dengan alamat emel ini sudah wujud';
+$messages['blockedimages'] = 'Untuk melindungi kebesasan peribadi anda, imej jauh dihalang dalam mesej ini.';
+$messages['encryptedmessage'] = 'Ini adalah mesej yang di\'encrypted\' dan tidak boleh dipamerkan. Maaf!';
+$messages['nocontactsfound'] = 'Tiada kontek dijumpai';
+$messages['contactnotfound'] = 'Kontek yang diminta tidak dijumpai';
+
+$messages['sendingfailed'] = 'Gagal menghantar mesej';
+$messages['errorsaving'] = 'Terdapat ralat ketika menyimpan';
+$messages['errormoving'] = 'Tidak boleh pindah mesej';
+$messages['errordeleting'] = 'Tidak boleh hapus mesej';
+$messages['deletecontactconfirm']  = 'Adakah anda ingin hapuskan kontek yang dipilih?';
+$messages['deletemessagesconfirm'] = 'Adakah anda ingin hapuskan mesej yang dipilih?';
+$messages['deletefolderconfirm']  = 'Adakah anda ingin hapuskan kabinet fail ini?';
+$messages['purgefolderconfirm']  = 'Adakah anda ingin hapuskan semua mesej dalam kabinet fail ini?';
+$messages['formincomplete'] = 'Borang tidak diisi dengan lengkap';
+$messages['noemailwarning'] = 'Sila masukkan alamat emel yang sah';
+$messages['nonamewarning']  = 'Sila masukkan nama';
+$messages['nopagesizewarning'] = 'Sila masukkan saiz halaman';
+$messages['norecipientwarning'] = 'Sila masukkan sekurang-kurangnya satu penerima';
+$messages['nosubjectwarning']  = 'Ruang "Subjek" kosong. Adakah anda ingin masukkannya sekarang?';
+$messages['nobodywarning'] = 'Hantar mesej ini tanpa teks?';
+$messages['notsentwarning'] = 'Mesej tidak dihantar. Adakah anda ingin menyingkir mesej anda?';
+$messages['noldapserver'] = 'Sila pilih satu pelayan ldap untuk carian';
+$messages['nocontactsreturned'] = 'Tiada kontek dijumpai';
+$messages['nosearchname'] = 'Sila masukkan nama kontek atau alamat emel';
+$messages['searchsuccessful'] = '$nr mesej dijumpai';
+$messages['searchnomatch'] = 'Carian tiada padanan';
+$messages['searching'] = 'Mencari...';
+$messages['checking'] = 'Menyemak...';
+$messages['nospellerrors'] = 'Tiada kesalah ejaan dijumpai';
+$messages['folderdeleted'] = 'Kabinet fail berjaya dihapuskan';
+$messages['deletedsuccessfully'] = "Berjaya dihapuskan";
+$messages['converting'] = 'Singkir format dari mesej...';
+$messages['messageopenerror'] = 'Tidak boleh muat mesej dari server';
+$messages['fileuploaderror'] = 'Muatnaik fail gagal';
+$messages['filesizeerror'] = 'Fail yang dimuatnaik melampaui saiz maksima $size';
+
+$messages['copysuccess'] = 'Berjaya salin alamat-alamat $nr';
+$messages['copyerror'] = 'Tidak boleh salin apa-apa alamat';
+$messages['sourceisreadonly'] = 'Sumber alamat ini adalah untuk bacaan sahaja';
+$messages['errorsavingcontact'] = 'Tidak boleh simmpan alamat kontek';
+
+?>
index 6345429d9059d3c4802a1c6ee51a15b5513df00a..d0c413052e5fae521d65e07ed1e8099b6e4cb3a9 100644 (file)
  | Author: Mark Moses <mark@katmoda.com>                                 |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 558 2007-05-15 06:53:08Z robin $
+ @version $Id: labels.inc 844 2007-10-02 05:33:18Z tomekp $
 
 */
 
 $labels = array();
-
-// login page
-$labels['welcome']   = 'Welkom bij $product';
-$labels['username']  = 'Gebruikersnaam';
-$labels['password']  = 'Wachtwoord';
-$labels['server']    = 'Server';
-$labels['login']     = 'Login';
-
-// taskbar
-$labels['logout']   = 'Uitloggen';
-$labels['mail']     = 'E-Mail';
+$labels['welcome'] = 'Welkom bij $product';
+$labels['username'] = 'Gebruikersnaam';
+$labels['password'] = 'Wachtwoord';
+$labels['server'] = 'Server';
+$labels['login'] = 'Login';
+$labels['logout'] = 'Uitloggen';
+$labels['mail'] = 'E-Mail';
 $labels['settings'] = 'Persoonlijke Instellingen';
 $labels['addressbook'] = 'Adresboek';
-
-// mailbox names
-$labels['inbox']  = 'Postvak IN';
+$labels['inbox'] = 'Postvak IN';
 $labels['drafts'] = 'Concepten';
-$labels['sent']   = 'Verzonden';
-$labels['trash']  = 'Prullenbak';
-$labels['junk']   = 'SPAM';
-
-// message listing
+$labels['sent'] = 'Verzonden';
+$labels['trash'] = 'Prullenbak';
+$labels['junk'] = 'SPAM';
 $labels['subject'] = 'Onderwerp';
-$labels['from']    = 'Afzender';
-$labels['to']      = 'Ontvanger';
-$labels['cc']      = 'kopie';
-$labels['bcc']     = 'Bcc';
+$labels['from'] = 'Afzender';
+$labels['to'] = 'Ontvanger';
+$labels['cc'] = 'kopie';
+$labels['bcc'] = 'Bcc';
 $labels['replyto'] = 'Antwoord-aan';
-$labels['date']    = 'Datum';
-$labels['size']    = 'Grootte';
+$labels['date'] = 'Datum';
+$labels['size'] = 'Grootte';
 $labels['priority'] = 'Prioriteit';
 $labels['organization'] = 'Organisatie';
-
-// aliases
-$labels['reply-to'] = $labels['replyto'];
-
+$labels['reply-to'] = 'Antwoord-aan';
 $labels['mailboxlist'] = 'Mappen';
 $labels['messagesfromto'] = 'Bericht $from t/m $to van $count';
 $labels['messagenrof'] = 'Bericht $nr van $count';
-
-$labels['moveto']   = 'verplaats naar...';
+$labels['moveto'] = 'verplaats naar...';
 $labels['download'] = 'download';
-
 $labels['filename'] = 'Bestandsnaam';
 $labels['filesize'] = 'Bestandsgrootte';
-
 $labels['preferhtml'] = 'Prefereer HTML';
 $labels['htmlmessage'] = 'HTML Bericht';
 $labels['prettydate'] = 'Opgemaakte data';
-
 $labels['addtoaddressbook'] = 'Toevoegen aan adresboek';
-
-// weekdays short
 $labels['sun'] = 'Zo';
 $labels['mon'] = 'Ma';
 $labels['tue'] = 'Di';
@@ -78,163 +61,124 @@ $labels['wed'] = 'Wo';
 $labels['thu'] = 'Do';
 $labels['fri'] = 'Vr';
 $labels['sat'] = 'Za';
-
-// weekdays long
-$labels['sunday']    = 'Zondag';
-$labels['monday']    = 'Maandag';
-$labels['tuesday']   = 'Dinsdag';
+$labels['sunday'] = 'Zondag';
+$labels['monday'] = 'Maandag';
+$labels['tuesday'] = 'Dinsdag';
 $labels['wednesday'] = 'Woensdag';
-$labels['thursday']  = 'Donderdag';
-$labels['friday']    = 'Vrijdag';
-$labels['saturday']  = 'Zaterdag';
-
+$labels['thursday'] = 'Donderdag';
+$labels['friday'] = 'Vrijdag';
+$labels['saturday'] = 'Zaterdag';
 $labels['today'] = 'Vandaag';
-
-// toolbar buttons
-$labels['checkmail']        = 'Controleer op nieuwe berichten';
-$labels['writenewmessage']  = 'Nieuw bericht';
-$labels['replytomessage']   = 'Beantwoord het bericht';
+$labels['checkmail'] = 'Controleer op nieuwe berichten';
+$labels['writenewmessage'] = 'Nieuw bericht';
+$labels['replytomessage'] = 'Beantwoord het bericht';
 $labels['replytoallmessage'] = 'Beantwoord alle ontvangers';
-$labels['forwardmessage']   = 'Bericht doorsturen';
-$labels['deletemessage']    = 'Verplaats het bericht naar de prullenbak';
-$labels['printmessage']     = 'Dit bericht afdrukken';
-$labels['previousmessage']  = 'Toon het vorige bericht';
+$labels['forwardmessage'] = 'Bericht doorsturen';
+$labels['deletemessage'] = 'Verwijder het bericht';
+$labels['movemessagetotrash'] = 'Verplaats het bericht naar de prullenbak';
+$labels['printmessage'] = 'Dit bericht afdrukken';
+$labels['previousmessage'] = 'Toon het vorige bericht';
 $labels['previousmessages'] = 'Toon vorige lijst met berichten';
-$labels['firstmessage']     = 'Toon het eerste bericht';
-$labels['firstmessages']    = 'Toon eerste lijst met berichten';
-$labels['nextmessage']      = 'Toon het volgende bericht';
-$labels['nextmessages']     = 'Toon volgende lijst met berichten';
-$labels['lastmessage']      = 'Toon het laatste bericht';
-$labels['lastmessages']     = 'Toon laatste lijst met berichten';
-$labels['backtolist']       = 'Terug naar berichtenoverzicht';
-$labels['viewsource']       = 'Toon bron';
-
+$labels['firstmessage'] = 'Toon het eerste bericht';
+$labels['firstmessages'] = 'Toon eerste lijst met berichten';
+$labels['nextmessage'] = 'Toon het volgende bericht';
+$labels['nextmessages'] = 'Toon volgende lijst met berichten';
+$labels['lastmessage'] = 'Toon het laatste bericht';
+$labels['lastmessages'] = 'Toon laatste lijst met berichten';
+$labels['backtolist'] = 'Terug naar berichtenoverzicht';
+$labels['viewsource'] = 'Toon bron';
 $labels['select'] = 'Selecteer';
 $labels['all'] = 'Allemaal';
 $labels['none'] = 'Geen';
 $labels['unread'] = 'Ongelezen';
-
 $labels['compact'] = 'Compact';
 $labels['empty'] = 'Legen';
 $labels['purge'] = 'Purge';
-
 $labels['quota'] = 'Schijfruimte gebruik';
-$labels['unknown']  = 'onbekend';
-$labels['unlimited']  = 'onbeperkt';
-
-$labels['quicksearch']  = 'Snel zoeken';
-$labels['resetsearch']  = 'Reset zoekopdracht';
-
-// message compose
-$labels['compose']  = 'Maak een bericht';
-$labels['savemessage']  = 'Bewaar als concept';
-$labels['sendmessage']  = 'Verstuur het bericht nu';
-$labels['addattachment']  = 'Voeg een bijlage toe';
-$labels['charset']  = 'karakterset';
-$labels['editortype']     = 'Opmaak';
+$labels['unknown'] = 'onbekend';
+$labels['unlimited'] = 'onbeperkt';
+$labels['quicksearch'] = 'Snel zoeken';
+$labels['resetsearch'] = 'Reset zoekopdracht';
+$labels['compose'] = 'Maak een bericht';
+$labels['savemessage'] = 'Bewaar als concept';
+$labels['sendmessage'] = 'Verstuur het bericht nu';
+$labels['addattachment'] = 'Voeg een bijlage toe';
+$labels['charset'] = 'karakterset';
+$labels['editortype'] = 'Opmaak';
 $labels['returnreceipt'] = 'Ontvangstbevestiging';
-
-$labels['checkspelling'] = 'Check spelling';
+$labels['checkspelling'] = 'Controleer spelling';
 $labels['resumeediting'] = 'Doorgaan met opstellen';
 $labels['revertto'] = 'Wijzig terug in';
-
 $labels['attachments'] = 'Bijlages';
 $labels['upload'] = 'Toevoegen';
-$labels['close']  = 'Sluit';
-
-$labels['low']     = 'Laag';
-$labels['lowest']  = 'Laagste';
-$labels['normal']  = 'Normaal';
-$labels['high']    = 'Hoog';
+$labels['close'] = 'Sluit';
+$labels['low'] = 'Laag';
+$labels['lowest'] = 'Laagste';
+$labels['normal'] = 'Normaal';
+$labels['high'] = 'Hoog';
 $labels['highest'] = 'Hoogste';
-
-$labels['nosubject']  = '(geen onderwerp)';
+$labels['nosubject'] = '(geen onderwerp)';
 $labels['showimages'] = 'Toon afbeeldingen';
-
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Gewone tekst';
-
-// address boook
-$labels['name']      = 'Naam';
+$labels['addcc'] = 'Kopie toevoegen';
+$labels['addbcc'] = 'Bcc toevoegen';
+$labels['addreplyto'] = 'Antwoord-aan toevoegen';
+$labels['name'] = 'Naam';
 $labels['firstname'] = 'Voornaam';
-$labels['surname']   = 'Achternaam';
-$labels['email']     = 'E-Mail';
-
-$labels['addcontact'] = 'Nieuw contactpersoon toevoegen';
+$labels['surname'] = 'Achternaam';
+$labels['email'] = 'E-Mail';
+$labels['addcontact'] = 'Voeg geselecteerde contacten toe aan het adresboek';
 $labels['editcontact'] = 'Contactpersoon wijzigen';
-
-$labels['edit']   = 'Wijzig';
+$labels['edit'] = 'Wijzig';
 $labels['cancel'] = 'Annuleer';
-$labels['save']   = 'Opslaan';
+$labels['save'] = 'Opslaan';
 $labels['delete'] = 'Verwijder';
-
-$labels['newcontact']     = 'Voeg een nieuwe contactpersoon toe';
-$labels['addcontact']     = 'Voeg geselecteerde contacten toe aan het adresboek';
-$labels['deletecontact']  = 'Verwijder geselecteerde contacten';
-$labels['composeto']      = 'Stuur een bericht naar';
+$labels['newcontact'] = 'Voeg een nieuwe contactpersoon toe';
+$labels['deletecontact'] = 'Verwijder geselecteerde contacten';
+$labels['composeto'] = 'Stuur een bericht naar';
 $labels['contactsfromto'] = 'Contacten $from t/m $to van $count';
-$labels['print']          = 'Afdrukken';
-$labels['export']         = 'Exporteren';
-
-$labels['previouspage']   = 'Vorige pagina';
-$labels['firstpage']      = 'Eerste pagina';
-$labels['nextpage']       = 'Volgende pagina';
-$labels['lastpage']       = 'Laatste pagina';
-
-$labels['groups']          = 'Groepen';
+$labels['print'] = 'Afdrukken';
+$labels['export'] = 'Exporteren';
+$labels['previouspage'] = 'Vorige pagina';
+$labels['firstpage'] = 'Eerste pagina';
+$labels['nextpage'] = 'Volgende pagina';
+$labels['lastpage'] = 'Laatste pagina';
+$labels['groups'] = 'Groepen';
 $labels['personaladrbook'] = 'Persoonlijk Adresboek';
-
-// LDAP search
-$labels['ldapsearch'] = 'LDAP adresboek zoeken';
-
-$labels['ldappublicsearchname']    = 'Naam van contactpersoon';
-$labels['ldappublicsearchtype'] = 'Precies matchen?';
-$labels['ldappublicserverselect'] = 'Selecteer servers';
-$labels['ldappublicsearchfield'] = 'Zoek op';
-$labels['ldappublicsearchform'] = 'Zoek een contactpersoon';
-$labels['ldappublicsearch'] = 'Zoek';
-
-// settings
-$labels['settingsfor']  = 'Instellingen voor';
-
-$labels['preferences']  = 'Instellingen';
-$labels['userpreferences']  = 'Gebruikers instellingen';
-$labels['editpreferences']  = 'Wijzig gebruikers instellingen';
-
-$labels['identities']  = 'Identititeiten';
-$labels['manageidentities']  = 'Beheer identiteiten voor dit account';
-$labels['newidentity']  = 'Identiteit toevoegen';
-
-$labels['newitem']  = 'Nieuw item';
-$labels['edititem']  = 'Wijzig item';
-
-$labels['setdefault']  = 'Stel als standaard in';
-$labels['language']  = 'Taal';
-$labels['timezone']  = 'Tijdszone';
-$labels['pagesize']  = 'Rijen per pagina';
+$labels['settingsfor'] = 'Instellingen voor';
+$labels['preferences'] = 'Instellingen';
+$labels['userpreferences'] = 'Gebruikers instellingen';
+$labels['editpreferences'] = 'Wijzig gebruikers instellingen';
+$labels['identities'] = 'Identititeiten';
+$labels['manageidentities'] = 'Beheer identiteiten voor dit account';
+$labels['newidentity'] = 'Identiteit toevoegen';
+$labels['newitem'] = 'Nieuw item';
+$labels['edititem'] = 'Wijzig item';
+$labels['setdefault'] = 'Stel als standaard in';
+$labels['language'] = 'Taal';
+$labels['timezone'] = 'Tijdszone';
+$labels['pagesize'] = 'Rijen per pagina';
 $labels['signature'] = 'Onderschrift';
-$labels['dstactive']  = 'Zomertijd';
+$labels['dstactive'] = 'Zomertijd';
 $labels['htmleditor'] = 'Maak HTML berichten aan';
 $labels['htmlsignature'] = 'HTML onderschrift';
 $labels['previewpane'] = 'Toon voorbeeldvenster';
-
-$labels['autosavedraft']  = 'Concept automatisch opslaan';
-$labels['everynminutes']  = 'iedere $n minuten';
-$labels['never']  = 'nooit';
-
-$labels['folder']  = 'Map';
-$labels['folders']  = 'Mappen';
-$labels['foldername']  = 'Mapnaam';
-$labels['subscribed']  = 'Geabonneerd';
-$labels['create']  = 'Nieuw';
-$labels['createfolder']  = 'Maak nieuwe map';
+$labels['autosavedraft'] = 'Concept automatisch opslaan';
+$labels['everynminutes'] = 'iedere $n minuten';
+$labels['never'] = 'nooit';
+$labels['folder'] = 'Map';
+$labels['folders'] = 'Mappen';
+$labels['foldername'] = 'Mapnaam';
+$labels['subscribed'] = 'Geabonneerd';
+$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['deletefolder'] = 'Verwijder map';
+$labels['managefolders'] = 'Beheer mappen';
 $labels['sortby'] = 'Sorteer op';
-$labels['sortasc']  = 'Sorteer oplopend';
+$labels['sortasc'] = 'Sorteer oplopend';
 $labels['sortdesc'] = 'Sorteer aflopend';
 
-?>
+?>
\ No newline at end of file
index 3420c6d1dc7370561a2ba9325080b72547ce0c00..3a961ebe9b13d8e8e5fa5b1e1d0197261ef7fbbf 100644 (file)
  | Author: Mark Moses <mark@katmoda.com>                                 |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 558 2007-05-15 06:53:08Z robin $
+ @version $Id: messages.inc 844 2007-10-02 05:33:18Z tomekp $
 
 */
 
 $messages = array();
-$messages['loginfailed']  = 'Inloggen mislukt';
-$messages['cookiesdisabled'] = 'De browser accepteert geen cookies';
+$messages['loginfailed'] = 'Inloggen mislukt';
+$messages['cookiesdisabled'] = 'Uw browser accepteert geen cookies';
 $messages['sessionerror'] = 'De sessie is verlopen of ongeldig';
 $messages['imaperror'] = 'Connectie met IMAP server mislukt';
 $messages['nomessagesfound'] = 'Geen berichten gevonden in deze e-mailbox';
@@ -43,16 +43,16 @@ $messages['sendingfailed'] = 'Verzenden van bericht is mislukt';
 $messages['errorsaving'] = 'Er is een fout opgetreden tijdens het opslaan';
 $messages['errormoving'] = 'Kan het bericht niet verplaatsen';
 $messages['errordeleting'] = 'Kan het bericht niet verwijderen';
-$messages['deletecontactconfirm']  = 'Weet u zeker dat u de geselecteerde contactperso(o)n/en wilt verwijderen?';
+$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['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['formincomplete'] = 'Het formulier was niet volledig ingevuld';
 $messages['noemailwarning'] = 'Geef een geldig e-mailadres op';
-$messages['nonamewarning']  = 'Vul een naam in';
+$messages['nonamewarning'] = 'Vul een naam in';
 $messages['nopagesizewarning'] = 'Geef een paginagrootte op';
-$messages['norecipientwarning'] = 'Geef teminste een ontvanger op';
-$messages['nosubjectwarning']  = 'Het veld: \'onderwerp\' is leeg. Wilt u nu alsnog een onderwerp opgeven?';
+$messages['norecipientwarning'] = 'Geef tenminste één ontvanger op';
+$messages['nosubjectwarning'] = 'Het veld: \'onderwerp\' is leeg. Wilt u nu alsnog een onderwerp opgeven?';
 $messages['nobodywarning'] = 'Dit bericht zonder inhoud versturen?';
 $messages['notsentwarning'] = 'Bericht is niet verstuurd. Weet u zeker dat u het niet wilt bewaren?';
 $messages['noldapserver'] = 'Geef een LDAP adresboek server op om te doorzoeken';
@@ -68,10 +68,11 @@ $messages['deletedsuccessfully'] = 'Successvol verwijderd';
 $messages['converting'] = 'Opmaak van bericht verwijderen...';
 $messages['messageopenerror'] = 'Kan het bericht niet van de server laden';
 $messages['fileuploaderror'] = 'Bestand versturen mislukt';
-$messages['filesizeerror'] = 'Het bestand overschrijdt de maximum grootte van $size';
+$messages['filesizeerror'] = 'Het bestand overschrijdt de maximale grootte van $size';
 $messages['copysuccess'] = '$nr adressen succesvol gekopieerd';
-$messages['copyerror'] = 'Kan geen adressen kopieren';
+$messages['copyerror'] = 'Kan geen adressen kopiëren';
 $messages['sourceisreadonly'] = 'Het adres kan niet worden opgeslagen';
 $messages['errorsavingcontact'] = 'Kan het ontvanger-adres niet opslaan';
+$messages['movingmessage'] = 'Bericht verplaatsen...';
 
-?>
+?>
\ No newline at end of file
index cc5ef3f7c66a80739f344e626ecd19fbda6a045b..45093e45025b4ef9d6a962d25147c38137af2585 100644 (file)
  +-----------------------------------------------------------------------+
  | Author: Tomasz Pajor     <t.pajor@kei.pl>                             |
  |         Sławomir Cichoń  <slawek.cichon@gmail.com>                    |
+ |         Janusz Zamecki   <janusz@zamecki.eu>                          |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 619 2007-06-13 07:09:09Z thomasb $
+ @version $Id: labels.inc 819 2007-09-26 08:26:58Z tomekp $
 
 */
 
 $labels = array();
 $labels['welcome'] = 'Witamy w $product';
-$labels['username'] = 'Login';
+$labels['username'] = 'Nazwa';
 $labels['password'] = 'Hasło';
 $labels['server'] = 'Serwer';
 $labels['login'] = 'Zaloguj';
 $labels['logout'] = 'Wyloguj';
 $labels['mail'] = 'Skrzynka odbiorcza';
 $labels['settings'] = 'Ustawienia';
-$labels['addressbook'] = 'Książka Adresowa';
+$labels['addressbook'] = 'Książka adresowa';
 $labels['inbox'] = 'Odebrane';
 $labels['drafts'] = 'Kopie robocze';
 $labels['sent'] = 'Wysłane';
@@ -37,22 +38,22 @@ $labels['subject'] = 'Temat';
 $labels['from'] = 'Nadawca';
 $labels['to'] = 'Odbiorca';
 $labels['cc'] = 'Kopia';
-$labels['bcc'] = 'Bcc';
+$labels['bcc'] = 'Ukryta kopia';
 $labels['replyto'] = 'Odpowiedz do';
 $labels['date'] = 'Data';
-$labels['size'] = 'Rozmiar';
+$labels['size'] = 'Wielkość';
 $labels['priority'] = 'Priorytet';
 $labels['organization'] = 'Organizacja';
 $labels['reply-to'] = 'Odpowiedz do';
 $labels['mailboxlist'] = 'Foldery';
-$labels['messagesfromto'] = 'Wiadmość od $from do $to z $count';
-$labels['messagenrof'] = 'Wiadmość $nr z $count';
+$labels['messagesfromto'] = 'Wiadomości od $from do $to z $count';
+$labels['messagenrof'] = 'Wiadomość $nr z $count';
 $labels['moveto'] = 'Przenieś do...';
-$labels['download'] = 'pobierz';
+$labels['download'] = 'Pobierz';
 $labels['filename'] = 'Nazwa pliku';
-$labels['filesize'] = 'Rozmiar pliku';
+$labels['filesize'] = 'Wielkość pliku';
 $labels['preferhtml'] = 'Domyślny HTML';
-$labels['htmlmessage'] = 'Widomość HTML';
+$labels['htmlmessage'] = 'Wiadomość HTML';
 $labels['prettydate'] = 'Ładne daty';
 $labels['addtoaddressbook'] = 'Dodaj do książki adresowej ';
 $labels['sun'] = 'Nd';
@@ -71,11 +72,12 @@ $labels['friday'] = 'Piątek';
 $labels['saturday'] = 'Sobota';
 $labels['today'] = 'Dzisiaj';
 $labels['checkmail'] = 'Sprawdź skrzynkę';
-$labels['writenewmessage'] = 'Utwórz nową wiadmomość';
+$labels['writenewmessage'] = 'Utwórz nową wiadomość';
 $labels['replytomessage'] = 'Odpowiedz nadawcy';
 $labels['replytoallmessage'] = 'Odpowiedz wszystkim';
 $labels['forwardmessage'] = 'Prześlij dalej';
 $labels['deletemessage'] = 'Usuń';
+$labels['movemessagetotrash'] = 'Przenieś do Kosza';
 $labels['printmessage'] = 'Drukuj';
 $labels['previousmessage'] = 'Pokaż poprzednią';
 $labels['previousmessages'] = 'Pokaż poprzednie';
@@ -85,32 +87,32 @@ $labels['nextmessage'] = 'Pokaż następną';
 $labels['nextmessages'] = 'Pokaż następne';
 $labels['lastmessage'] = 'Pokaż ostatnią';
 $labels['lastmessages'] = 'Pokaż ostatnie';
-$labels['backtolist'] = 'Wróc do listy widomości';
+$labels['backtolist'] = 'Pokaż listę wiadomości';
 $labels['viewsource'] = 'Pokaż źródło';
 $labels['select'] = 'Wybierz';
 $labels['all'] = 'Zaznacz wszystkie';
-$labels['none'] = 'Odznacz';
+$labels['none'] = 'Anuluj zaznaczenie';
 $labels['unread'] = 'Zaznacz nieprzeczytane';
 $labels['compact'] = 'Kompaktuj';
-$labels['empty'] = 'Pusty';
+$labels['empty'] = 'Opróżnij';
 $labels['purge'] = 'Oczyść';
-$labels['quota'] = 'Użyta Przestrzeń';
+$labels['quota'] = 'Użyte miejsce';
 $labels['unknown'] = 'nieznane';
 $labels['unlimited'] = 'bez limitu';
-$labels['quicksearch'] = 'Szybkie szukanie';
+$labels['quicksearch'] = 'Szybkie wyszukiwanie';
 $labels['resetsearch'] = 'Wyczyść filtr';
 $labels['compose'] = 'Utwórz wiadomość';
+$labels['savemessage'] = 'Zapisz kopię roboczą';
 $labels['sendmessage'] = 'Wyślij teraz';
-$labels['savemessage'] = 'Zapisz kopie roboczą';
 $labels['addattachment'] = 'Dołącz plik';
 $labels['charset'] = 'Kodowanie znaków';
 $labels['editortype'] = 'Typ edytora';
 $labels['returnreceipt'] = 'Potwierdzenie odbioru';
-$labels['checkspelling'] = 'Sprawdź pisownie';
-$labels['resumeediting'] = 'Przywróć edytowanie';
+$labels['checkspelling'] = 'Sprawdź pisownię';
+$labels['resumeediting'] = 'Zakończ sprawdzanie pisowni';
 $labels['revertto'] = 'Powróć do';
 $labels['attachments'] = 'Załączniki';
-$labels['upload'] = 'Wgraj';
+$labels['upload'] = 'Wyślij';
 $labels['close'] = 'Zamknij';
 $labels['low'] = 'Bardzo niski';
 $labels['lowest'] = 'Niski';
@@ -121,11 +123,14 @@ $labels['nosubject'] = '(brak tematu)';
 $labels['showimages'] = 'Wyświetl obrazki';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Zwykły tekst';
+$labels['addcc'] = 'Dodaj Cc'; 
+$labels['addbcc'] = 'Dodaj Bcc'; 
+$labels['addreplyto'] = 'Dodaj Reply-To';
 $labels['name'] = 'Nazwa';
 $labels['firstname'] = 'Imię';
 $labels['surname'] = 'Nazwisko';
 $labels['email'] = 'E-Mail';
-$labels['addcontact'] = 'Dodaj znaznaczony kontakt do książki adresowej';
+$labels['addcontact'] = 'Dodaj nowy kontakt do książki adresowej';
 $labels['editcontact'] = 'Edytuj kontakt';
 $labels['edit'] = 'Edytuj';
 $labels['cancel'] = 'Anuluj';
@@ -133,8 +138,8 @@ $labels['save'] = 'Zapisz';
 $labels['delete'] = 'Kasuj';
 $labels['newcontact'] = 'Dodaj nowy kontakt';
 $labels['deletecontact'] = 'Usuń zaznaczone kontakty';
-$labels['composeto'] = 'Stwórz wiadomość dla';
-$labels['contactsfromto'] = 'Kontakt od $from do $to z $count';
+$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['previouspage'] = 'poprzednia strona';
@@ -144,20 +149,20 @@ $labels['lastpage'] = 'ostatnia strona';
 $labels['groups'] = 'Grupy';
 $labels['personaladrbook'] = 'Książka adresowa';
 $labels['settingsfor'] = 'Ustawienia dla';
-$labels['preferences'] = 'Ustawienia';
+$labels['preferences'] = 'Preferencje';
 $labels['userpreferences'] = 'Preferencje';
-$labels['editpreferences'] = 'Edytuj preferencję';
+$labels['editpreferences'] = 'Edytuj preferencje';
 $labels['identities'] = 'Tożsamości';
 $labels['manageidentities'] = 'Zarządzaj tożsamościami';
 $labels['newidentity'] = 'Nowa tożsamość';
 $labels['newitem'] = 'Nowy';
 $labels['edititem'] = 'Edytuj';
-$labels['setdefault'] = 'Ustaw domyślne';
+$labels['setdefault'] = 'Domyślna';
 $labels['language'] = 'Język';
-$labels['timezone'] = 'Strefy czasu';
-$labels['pagesize'] = 'wierszy na stronie';
+$labels['timezone'] = 'Strefa czasowa';
+$labels['pagesize'] = 'Wierszy na stronie';
 $labels['signature'] = 'Podpis';
-$labels['dstactive'] = 'czas letni';
+$labels['dstactive'] = 'Czas letni';
 $labels['htmleditor'] = 'Twórz wiadomości HTML';
 $labels['htmlsignature'] = 'Podpis w HTML';
 $labels['previewpane'] = 'Pokaż podgląd';
@@ -167,14 +172,14 @@ $labels['never'] = 'nigdy';
 $labels['folder'] = 'Folder';
 $labels['folders'] = 'Foldery';
 $labels['foldername'] = 'Nazwa folderu';
-$labels['subscribed'] = 'Zapisany';
+$labels['subscribed'] = 'Zasubskrybowany';
 $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['sortby'] = 'Sortuj wg.';
+$labels['sortby'] = 'Sortuj wg';
 $labels['sortasc'] = 'Rosnąco';
 $labels['sortdesc'] = 'Malejąco';
 
index 23c327b35b4e56ada52dacb914a4cdf9ef779791..eeb487c9b072704a7cdec31375d2d8dc373391b6 100644 (file)
  +-----------------------------------------------------------------------+
  | Author: Tomasz Pajor     <t.pajor@kei.pl>                             |
  | Author: Sławomir Cichoń  <slawek.cichon@gmail.com>                    |
+ |         Janusz Zamecki   <janusz@zamecki.eu>                          |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 619 2007-06-13 07:09:09Z thomasb $
+ @version $Id: messages.inc 815 2007-09-26 08:03:07Z tomekp $
 
 */
 
 $messages = array();
 $messages['loginfailed'] = 'Błąd logowania!';
 $messages['cookiesdisabled'] = 'Twoja przeglądarka nie obsługuje ciasteczek!';
-$messages['sessionerror'] = 'Błąd sesji, bądź sesja wygasła!';
+$messages['sessionerror'] = 'Błąd sesji bądź sesja wygasła!';
 $messages['imaperror'] = 'Błąd połączenia z serwerem!';
 $messages['nomessagesfound'] = 'Brak wiadomości w skrzynce.';
 $messages['loggedout'] = 'Użytkownik wylogował się poprawnie.';
 $messages['mailboxempty'] = 'Skrzynka jest pusta!';
 $messages['loading'] = 'Ładowanie...';
-$messages['loadingdata'] = 'Ładowanie...';
-$messages['checkingmail'] = 'Sprawdzam czy są nowe wiadomości...';
-$messages['sendingmessage'] = 'Wysyłam wiadomość...';
-$messages['messagesent'] = 'Wiadomość wysłana pomyślnie.';
+$messages['loadingdata'] = 'Ładowanie danych...';
+$messages['checkingmail'] = 'Sprawdzanie nowych wiadomości...';
+$messages['sendingmessage'] = 'Wysyłanie wiadomości...';
+$messages['messagesent'] = 'Wiadomość została wysłana.';
 $messages['savingmessage'] = 'Zapisywanie wiadomości...';
-$messages['messagesaved'] = 'Wiadomośc została zapisana w kopiach roboczych.';
+$messages['messagesaved'] = 'Wiadomość została zapisana w folderze Kopie robocze.';
 $messages['successfullysaved'] = 'Zapisano.';
 $messages['addedsuccessfully'] = 'Kontakt został dodany.';
-$messages['contactexists'] = 'Kontakt o podanym adresie e-mail istnieje!';
+$messages['contactexists'] = 'Kontakt o podanym adresie e-mail już istnieje!';
 $messages['blockedimages'] = 'Ze względów bezpieczeństwa zewnętrzne obrazki zostały zablokowane.';
-$messages['encryptedmessage'] = 'Przepraszamy, nie można wyświeltlić zaszyfrowanej wiadomości!';
+$messages['encryptedmessage'] = 'Przepraszamy, nie można wyświetlić zaszyfrowanej wiadomości!';
 $messages['nocontactsfound'] = 'Nie znaleziono kontaktu!';
 $messages['contactnotfound'] = 'Szukany kontakt nie został odnaleziony';
 $messages['sendingfailed'] = 'Nie udało się wysłać wiadomości!';
@@ -48,31 +49,32 @@ $messages['deletecontactconfirm'] = 'Czy na pewno chcesz usunąć wybrane kontak
 $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['formincomplete'] = 'Proszę uzupełnić formularz!';
+$messages['formincomplete'] = 'Uzupełnij formularz!';
 $messages['noemailwarning'] = 'Wpisz poprawny adres e-mail!';
 $messages['nonamewarning'] = 'Podaj imię!';
 $messages['nopagesizewarning'] = 'Podaj poprawną wartość!';
-$messages['norecipientwarning'] = 'Podaj conajmniej jednego odbiorcę!';
-$messages['nosubjectwarning'] = 'Nie podałeś tematu wiadomości. Czy chcesz go teraz uzupełnić?';
-$messages['nobodywarning'] = 'Ta wiadomość jest pusta, czy mimo to chesz ją wysłać?';
-$messages['notsentwarning'] = 'Wiadomość nie została wysłana. czy chesz usunąć tą wiadomość?';
-$messages['noldapserver'] = 'Proszę wybrać serwer LDAP!';
+$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ć?';
+$messages['notsentwarning'] = 'Wiadomość nie została wysłana. Czy chcesz usunąć tę wiadomość?';
+$messages['noldapserver'] = 'Wybierz serwer LDAP!';
 $messages['nocontactsreturned'] = 'Nie znaleziono kontaktów!';
-$messages['nosearchname'] = 'Proszę podać nazwę kontaktu lub jego adres email.';
-$messages['searchsuccessful'] = 'Znaleziono $nr wiadomości';
+$messages['nosearchname'] = 'Podaj nazwę kontaktu lub jego adres e-mail.';
+$messages['searchsuccessful'] = 'Liczba znalezionych wiadomości: $nr';
 $messages['searchnomatch'] = 'Nic nie znaleziono.';
-$messages['searching'] = 'Szukam...';
+$messages['searching'] = 'Wyszukiwanie...';
 $messages['checking'] = 'Sprawdzanie...';
 $messages['nospellerrors'] = 'Nie znaleziono błędów w pisowni.';
 $messages['folderdeleted'] = 'Folder został pomyślnie usunięty.';
 $messages['deletedsuccessfully'] = 'Usunięto';
-$messages['converting'] = 'Konwertuję wiadomość';
+$messages['converting'] = 'Konwertowanie wiadomości...';
 $messages['messageopenerror'] = 'Nie można załadować wiadomości z serwera';
 $messages['fileuploaderror'] = 'Załączanie pliku nie powiodło się';
 $messages['filesizeerror'] = 'Plik przekracza maksymalną wielkość $size';
-$messages['copysuccess'] = 'Pomyślnie skopiowano $nr adres(ów)';
+$messages['copysuccess'] = 'Pomyślnie skopiowano następującą liczbę adresów: $nr';
 $messages['copyerror'] = 'Nie można skopiować żadnego adresu';
-$messages['sourceisreadonly'] = 'Å»ródło adresu jest tylko do odczytu';
+$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...';
 
 ?>
\ No newline at end of file
index c8fe960530aaf6da36b5cc65b0ed9684be7ee2a9..1c3e433e26ede0a964da0ff29d53bddefaeb373f 100644 (file)
@@ -1,11 +1,12 @@
 <?php
 
 /*
+
  +-----------------------------------------------------------------------+
  | language/pt_BR/labels.inc                                             |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundQube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Updated by: Alessandro Lenzi <alessandro@mistymountain.com.br>        |
  +-----------------------------------------------------------------------+
 
- $Id: labels.inc 559 2007-05-17 14:33:01Z thomasb $
+ $Id: labels.inc 870 2007-10-16 06:50:49Z thomasb $
 
 */
 
 $labels = array();
-$labels['welcome'] = 'Bem Vindo ao $product';
-$labels['username'] = 'Usuário';
-$labels['password'] = 'Senha';
-$labels['server'] = 'Servidor';
-$labels['login'] = 'Entrar';
-$labels['logout'] = 'Sair';
-$labels['mail'] = 'E-mail';
+
+// login page
+$labels['welcome']      = 'Bem Vindo ao $product';
+$labels['username']  = 'Usuário';
+$labels['password']  = 'Senha';
+$labels['server']       = 'Servidor';
+$labels['login']        = 'Entrar';
+
+// taskbar
+$labels['logout']      = 'Sair';
+$labels['mail']        = 'E-mail';
 $labels['settings'] = 'Configurações pessoais';
 $labels['addressbook'] = 'Catálogo de endereços';
-$labels['inbox'] = 'Caixa de entrada';
+
+// mailbox names
+$labels['inbox']  = 'Entrada';
 $labels['drafts'] = 'Rascunhos';
-$labels['sent'] = 'Enviados';
-$labels['trash'] = 'Lixeira';
-$labels['junk'] = 'Junk';
+$labels['sent']   = 'Enviados';
+$labels['trash']  = 'Lixeira';
+$labels['junk']   = 'Junk';
+
+// message listing
 $labels['subject'] = 'Assunto';
-$labels['from'] = 'Remetente';
-$labels['to'] = 'Para';
-$labels['cc'] = 'Cópia';
-$labels['bcc'] = 'Bcc';
+$labels['from']    = 'Remetente';
+$labels['to']      = 'Para';
+$labels['cc']      = 'Cópia';
+$labels['bcc']     = 'Cópia Oculta';
 $labels['replyto'] = 'Responder para';
-$labels['date'] = 'Data';
-$labels['size'] = 'Tamanho';
+$labels['date']    = 'Data';
+$labels['size']    = 'Tamanho';
 $labels['priority'] = 'Prioridade';
 $labels['organization'] = 'Organização';
-$labels['reply-to'] = 'Responder para';
+
+// aliases
+$labels['reply-to'] = $labels['replyto'];
+
 $labels['mailboxlist'] = 'Pastas';
 $labels['messagesfromto'] = 'Mensagens $from - $to de $count';
 $labels['messagenrof'] = 'Mensagem $nr de $count';
-$labels['moveto'] = 'mover para...';
+
+$labels['moveto']      = 'mover para...';
 $labels['download'] = 'download';
+
 $labels['filename'] = 'Arquivo';
 $labels['filesize'] = 'Tamanho';
+
 $labels['preferhtml'] = 'Preferir HTML';
 $labels['htmlmessage'] = 'Mensagem HTML';
 $labels['prettydate'] = 'Formatar datas';
+
 $labels['addtoaddressbook'] = 'Incluir no catálogo de endereços';
+
+// weekdays short
 $labels['sun'] = 'Dom';
 $labels['mon'] = 'Seg';
 $labels['tue'] = 'Ter';
@@ -62,120 +80,160 @@ $labels['wed'] = 'Qua';
 $labels['thu'] = 'Qui';
 $labels['fri'] = 'Sex';
 $labels['sat'] = 'Sáb';
-$labels['sunday'] = 'Domingo';
-$labels['monday'] = 'Segunda-feira';
-$labels['tuesday'] = 'Terça-feira';
+
+// weekdays long
+$labels['sunday']       = 'Domingo';
+$labels['monday']       = 'Segunda-feira';
+$labels['tuesday']      = 'Terça-feira';
 $labels['wednesday'] = 'Quarta-feira';
-$labels['thursday'] = 'Quinta-feira';
-$labels['friday'] = 'Sexta-feira';
-$labels['saturday'] = 'Sábado';
+$labels['thursday']     = 'Quinta-feira';
+$labels['friday']       = 'Sexta-feira';
+$labels['saturday']     = 'Sábado';
+
 $labels['today'] = 'Hoje';
-$labels['checkmail'] = 'Verificar se há novas mensagens';
-$labels['writenewmessage'] = 'Criar nova mensagem';
-$labels['replytomessage'] = 'Responder';
+
+// toolbar buttons
+$labels['checkmail']           = 'Verificar se há novas mensagens.';
+$labels['writenewmessage']     = 'Criar nova mensagem';
+$labels['replytomessage']      = 'Responder';
 $labels['replytoallmessage'] = 'Responder para todos';
-$labels['forwardmessage'] = 'Encaminhar';
-$labels['deletemessage'] = 'Mover para lixeira';
-$labels['printmessage'] = 'Imprimir';
-$labels['previousmessage'] = 'Mensagem Anterior';
+$labels['forwardmessage']      = 'Encaminhar';
+$labels['deletemessage']       = 'Excluir';
+$labels['movemessagetotrash'] = 'Mover para Lixeira';
+$labels['printmessage']        = 'Imprimir';
+$labels['previousmessage']     = 'Mensagem Anterior';
 $labels['previousmessages'] = 'Página Anterior';
-$labels['firstmessage'] = 'Primeira Mensagem';
-$labels['firstmessages'] = 'Primeira Página';
-$labels['nextmessage'] = 'Próxima Mensagem';
-$labels['nextmessages'] = 'Próxima Página';
-$labels['lastmessage'] = 'Ultima Mensagem';
-$labels['lastmessages'] = 'Ultima Página';
-$labels['backtolist'] = 'Voltar';
-$labels['viewsource'] = 'Exibir código fonte';
+$labels['firstmessage']        = 'Primeira Mensagem';
+$labels['firstmessages']       = 'Primeira Página';
+$labels['nextmessage']                 = 'Próxima Mensagem';
+$labels['nextmessages']        = 'Próxima Página';
+$labels['lastmessage']                 = 'Ultima Mensagem';
+$labels['lastmessages']        = 'Ultima Página';
+$labels['backtolist']          = 'Voltar';
+$labels['viewsource']          = 'Exibir código fonte';
+
 $labels['select'] = 'Selecionar';
 $labels['all'] = 'Todas';
 $labels['none'] = 'Nenhuma';
 $labels['unread'] = 'Não lidas';
+
 $labels['compact'] = 'Compactar';
-$labels['empty'] = 'Vazio';
+$labels['empty'] = 'Esvaziar';
 $labels['purge'] = 'Apagar';
+
 $labels['quota'] = 'Utilização';
-$labels['unknown'] = 'desconhecido';
-$labels['unlimited'] = 'sem limitação';
+$labels['unknown']  = 'desconhecido';
+$labels['unlimited']  = 'Sem limitação';
+
 $labels['quicksearch'] = 'Pesquisa Rápida';
 $labels['resetsearch'] = 'Limpar';
-$labels['compose'] = 'Escrever mensagem';
-$labels['sendmessage'] = 'Enviar';
-$labels['savemessage'] = 'Salvar Rascunho';
-$labels['addattachment'] = 'Anexar';
-$labels['charset'] = 'Codificação';
-$labels['editortype'] = 'Tipo';
-$labels['returnreceipt'] = 'Receber Confirmação';
+
+
+// message compose
+$labels['compose']           = 'Escrever mensagem';
+$labels['sendmessage']   = 'Enviar';
+$labels['savemessage']    = 'Salvar Rascunho';
+$labels['addattachment']  = 'Anexar';
+$labels['charset']        = 'Codificação';
+$labels['editortype']     = 'Tipo';
+$labels['returnreceipt']  = 'Receber Confirmação';
+
 $labels['checkspelling'] = 'Verificar Ortografia';
 $labels['resumeediting'] = 'Continuar';
-$labels['revertto'] = 'Reverter para';
+$labels['revertto']             = 'Reverter para';
+
 $labels['attachments'] = 'Anexos';
 $labels['upload'] = 'Enviar';
-$labels['close'] = 'Fechar';
-$labels['low'] = 'Mais baixo';
-$labels['lowest'] = 'Baixo';
-$labels['normal'] = 'Normal';
-$labels['high'] = 'Alta';
+$labels['close']  = 'Fechar';
+
+$labels['low']            = 'Mais baixa';
+$labels['lowest']  = 'Baixa';
+$labels['normal']  = 'Normal';
+$labels['high']    = 'Alta';
 $labels['highest'] = 'Mais alta';
-$labels['nosubject'] = '(sem assunto)';
+
+$labels['nosubject']  = '(Sem assunto)';
 $labels['showimages'] = 'Exibir imagens';
+
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Texto Puro';
-$labels['name'] = 'Nome completo';
+
+$labels['addcc'] = 'Cópia';
+$labels['addbcc'] = 'Cópia Oculta';
+$labels['addreplyto'] = 'Responder para';
+
+
+// address boook
+$labels['name']         = 'Nome completo';
 $labels['firstname'] = 'Primeiro nome';
-$labels['surname'] = 'Sobrenome';
-$labels['email'] = 'E-Mail';
+$labels['surname']      = 'Sobrenome';
+$labels['email']        = 'E-Mail';
+
 $labels['addcontact'] = 'Incluir novo contato';
 $labels['editcontact'] = 'Editar contato';
-$labels['edit'] = 'Editar';
+
+$labels['edit']   = 'Editar';
 $labels['cancel'] = 'Cancelar';
-$labels['save'] = 'Salvar';
+$labels['save']   = 'Salvar';
 $labels['delete'] = 'Apagar';
-$labels['newcontact'] = 'Criar novo contato';
-$labels['deletecontact'] = 'Apagar contatos selecionados';
-$labels['composeto'] = 'Escrever mensagem para';
+
+$labels['newcontact']    = 'Criar novo contato';
+$labels['deletecontact']  = 'Apagar contatos selecionados';
+$labels['composeto']     = 'Escrever mensagem para';
 $labels['contactsfromto'] = 'Contatos de $from à $to de $count';
-$labels['print'] = 'Imprimir';
-$labels['export'] = 'Exportar';
-$labels['previouspage'] = 'Página Anterior';
-$labels['firstpage'] = 'Primeira Página ';
-$labels['nextpage'] = 'Próxima Página';
-$labels['lastpage'] = 'Última Página';
+$labels['print']                 = 'Imprimir';
+$labels['export']                = 'Exportar';
+
+$labels['previouspage']   = 'Página Anterior';
+$labels['firstpage']     = 'Primeira Página ';
+$labels['nextpage']      = 'Próxima Página';
+$labels['lastpage']              = 'Última Página';
+
 $labels['groups'] = 'Grupos';
 $labels['personaladrbook'] = 'Endereços Pessoais';
-$labels['settingsfor'] = 'Configurações para';
-$labels['preferences'] = 'Preferências';
-$labels['userpreferences'] = 'Preferências do usuário';
-$labels['editpreferences'] = 'Editar preferências do usuário';
-$labels['identities'] = 'Identidades';
-$labels['manageidentities'] = 'Gerenciar identidades para esta conta';
-$labels['newidentity'] = 'Nova identidade';
-$labels['newitem'] = 'Novo item';
-$labels['edititem'] = 'Editar item';
-$labels['setdefault'] = 'Padrão';
-$labels['language'] = 'Idioma';
-$labels['timezone'] = 'Fuso Horário';
-$labels['pagesize'] = 'Linhas por página';
+
+
+// settings
+$labels['settingsfor']  = 'Configurações para';
+
+$labels['preferences']  = 'Preferências';
+$labels['userpreferences']  = 'Preferências do usuário';
+$labels['editpreferences']  = 'Editar preferências do usuário';
+
+$labels['identities']  = 'Identidades';
+$labels['manageidentities']  = 'Gerenciar identidades para esta conta';
+$labels['newidentity']  = 'Nova identidade';
+
+$labels['newitem']  = 'Novo item';
+$labels['edititem']  = 'Editar item';
+
+$labels['setdefault']  = 'Padrão';
+$labels['language']  = 'Idioma';
+$labels['timezone']  = 'Fuso Horário';
+$labels['pagesize']  = 'Linhas por página';
 $labels['signature'] = 'Assinatura';
-$labels['dstactive'] = 'Horário de Verão';
+$labels['dstactive']  = 'Horário de Verão';
 $labels['htmleditor'] = 'Criar mensagens em HTML';
 $labels['htmlsignature'] = 'Assinatura em HTML';
-$labels['previewpane'] = 'Exibir Pré-Vizualização';
-$labels['autosavedraft'] = 'Salvar Rascunho automaticamente';
-$labels['everynminutes'] = 'a cada $n minutos';
-$labels['never'] = 'nunca';
-$labels['folder'] = 'Pasta';
-$labels['folders'] = 'Pastas';
-$labels['foldername'] = 'Nome da pasta';
-$labels['subscribed'] = 'Assinado';
-$labels['create'] = 'Criar';
-$labels['createfolder'] = 'Criar nova pasta';
+$labels['previewpane'] = 'Exibir Pré-Visualização';
+
+$labels['autosavedraft']  = 'Salvar Rascunho automaticamente';
+$labels['everynminutes']  = 'a cada $n minutos';
+$labels['never']  = 'nunca';
+
+$labels['folder']  = 'Pasta';
+$labels['folders']  = 'Pastas';
+$labels['foldername']  = 'Nome da pasta';
+$labels['subscribed']  = 'Assinado';
+$labels['create']  = 'Criar';
+$labels['createfolder']  = 'Criar nova pasta';
 $labels['rename'] = 'Renomear';
 $labels['renamefolder'] = 'Renomear Pasta';
-$labels['deletefolder'] = 'Apagar pasta';
-$labels['managefolders'] = 'Gerenciar pastas';
+$labels['deletefolder']  = 'Apagar pasta';
+$labels['managefolders']  = 'Gerenciar pastas';
+
 $labels['sortby'] = 'Ordenado por';
-$labels['sortasc'] = 'Ascendente';
+$labels['sortasc']  = 'Ascendente';
 $labels['sortdesc'] = 'Descendente';
 
 ?>
\ No newline at end of file
index 68b0d574001a076324857a28c0f021c323b367b8..989811833a83288fab55b260e37dcffdd06d8203 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 /*
+
  +-----------------------------------------------------------------------+
  | language/pt_BR/messages.inc                                           |
  |                                                                       |
  | Updated by: Alessandro Lenzi <alessandro@mistymountain.com.br>        |
  +-----------------------------------------------------------------------+
 
- $Id: messages.inc 559 2007-05-17 14:33:01Z thomasb $
+ $Id: messages.inc 830 2007-09-27 04:33:46Z tomekp $
 
 */
 
 $messages = array();
-$messages['loginfailed'] = 'Falha no login';
-$messages['cookiesdisabled'] = 'Seu navegador não suporta cookies';
-$messages['sessionerror'] = 'A sessão do seu navegador é inválida ou expirou';
-$messages['imaperror'] = 'A conexão com o servidor IMAP falhou';
-$messages['nomessagesfound'] = 'Nenhuma mensagem foi encontrada na caixa postal';
+$messages['loginfailed']  = 'Falha no login.';
+$messages['cookiesdisabled'] = 'Seu navegador não suporta cookies.';
+$messages['sessionerror'] = 'A sessão do seu navegador é inválida ou expirou.';
+$messages['imaperror'] = 'A conexão com o servidor IMAP falhou.';
+$messages['nomessagesfound'] = 'Não foi encontrada nenhuma mensagem.';
 $messages['loggedout'] = 'Sua sessão foi finalizada com sucesso. Até breve!';
-$messages['mailboxempty'] = 'A caixa postal está vazia';
+$messages['mailboxempty'] = 'A caixa de mensagens está vazia.';
 $messages['loading'] = 'Carregando...';
 $messages['loadingdata'] = 'Carregando informações...';
 $messages['checkingmail'] = 'Verificando se há novas mensagens...';
@@ -33,46 +34,49 @@ $messages['sendingmessage'] = 'Enviando...';
 $messages['messagesent'] = 'Mensagem enviada';
 $messages['savingmessage'] = 'Salvando Mensagem...';
 $messages['messagesaved'] = 'Rascunho Salvo';
-$messages['successfullysaved'] = 'Salvo com sucesso';
-$messages['addedsuccessfully'] = 'Contato incluído com sucesso';
+$messages['successfullysaved'] = 'Operação realizada com sucesso.';
+$messages['addedsuccessfully'] = 'Contato incluído com sucesso.';
 $messages['contactexists'] = 'Um contato com esse e-mail já existe';
 $messages['blockedimages'] = 'Para proteger sua privacidade, as imagens desta mensagem foram bloqueadas';
 $messages['encryptedmessage'] = 'Esta mensagem está criptografada e não pode ser exibida. Desculpe.';
-$messages['nocontactsfound'] = 'Nenhum contato encontrado';
+$messages['nocontactsfound'] = 'Nenhum contato foi encontrado';
 $messages['contactnotfound'] = 'O contato solicitado não foi encontrado';
+
 $messages['sendingfailed'] = 'Falha no envio da mensagem';
-$messages['errorsaving'] = 'Um erro ocorreu durante o salvamento';
+$messages['errorsaving'] = 'Ocorreu um erro ao Salvar';
 $messages['errormoving'] = 'Não foi possível mover a mensagem';
 $messages['errordeleting'] = 'Não foi possível apagar a mensagem';
-$messages['deletecontactconfirm'] = 'Deseja realmente excluir os contatos selecionados?';
-$messages['deletemessagesconfirm'] = 'Deseja realmente excluir a(s) mensagem(s) selecionadas?';
+$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['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';
-$messages['nopagesizewarning'] = 'Por favor, informe o tamanho da página';
-$messages['norecipientwarning'] = 'Por favor, informe pelo menos um destinatário';
-$messages['nosubjectwarning'] = 'O campo assunto não foi informado. Deseja incluí-lo agora?';
+$messages['purgefolderconfirm'] = 'Deseja realmente excluir todas mensagens desta 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.';
+$messages['nopagesizewarning'] = 'Por favor, informe o tamanho da página.';
+$messages['norecipientwarning'] = 'Por favor, informe pelo menos um destinatário.';
+$messages['nosubjectwarning']  = 'O campo assunto não foi informado. Deseja incluí-lo agora?';
 $messages['nobodywarning'] = 'Enviar a mensagem sem texto?';
 $messages['notsentwarning'] = 'A mensegem não foi enviada, deseja excluí-la?';
 $messages['noldapserver'] = 'Por favor, selecione um servidor LDAP para a pesquisa';
-$messages['nocontactsreturned'] = 'Nenhum contato foi encontrado';
+$messages['nocontactsreturned'] = 'Nenhum contato foi encontrado.';
 $messages['nosearchname'] = 'Por favor, informe o nome do contado ou seu endereço de e-mail';
 $messages['searchsuccessful'] = '$nr mensagens encontradas';
 $messages['searchnomatch'] = 'A pesquisa não encontrou resultados';
 $messages['searching'] = 'Pesquisando...';
 $messages['checking'] = 'Verificando...';
-$messages['nospellerrors'] = 'Nenhum erro ortográfico encontrado';
+$messages['nospellerrors'] = 'Nenhum erro ortográfico encontrado.';
 $messages['folderdeleted'] = 'Pasta excluída com sucesso';
 $messages['deletedsuccessfully'] = 'Excluído com sucesso';
 $messages['converting'] = 'Removendo formatação da Mensagem...';
 $messages['messageopenerror'] = 'Não foi possível carregar a mensagem do servidor';
 $messages['fileuploaderror'] = 'Falha ao enviar o arquivo';
 $messages['filesizeerror'] = 'O Arquivo enviado excede o tamanho máximo de $size';
+
 $messages['copysuccess'] = '$nr endereços copiados com sucesso';
 $messages['copyerror'] = 'Não foi possível copiar quaisquer endereços';
 $messages['sourceisreadonly'] = 'Esta fonte de endereços é somente leitura';
-$messages['errorsavingcontact'] = 'Não foi possível salvar o endereço de contato';
+$messages['errorsavingcontact'] = 'Não foi possível salvar o endereço de contato.';
+$messages['movingmessage'] = 'Movendo mensagem...';
 
 ?>
\ No newline at end of file
index f0978e4f6a76103e802ea5a1afdc0771c54d54f5..b346ee6cd96a719dfbe55fb71fe8c9ed97151ebd 100644 (file)
@@ -15,7 +15,7 @@
  |          Fernando Silva <fernando.silva@openquest.pt>                 |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 562 2007-05-17 15:22:33Z thomasb $
+ @version $Id: labels.inc 873 2007-10-16 19:06:34Z yllar $
 
 */
 
@@ -75,8 +75,9 @@ $labels['checkmail'] = 'Verificar novas mensagens';
 $labels['writenewmessage'] = 'Criar nova mensagem';
 $labels['replytomessage'] = 'Responder';
 $labels['replytoallmessage'] = 'Responder a todos';
-$labels['forwardmessage'] = 'Encaminhar';
-$labels['deletemessage'] = 'Mover para lixeira';
+$labels['forwardmessage'] = 'Reencaminhar';
+$labels['deletemessage'] = 'Apagar';
+$labels['movemessagetotrash'] = 'Mover para lixeira';
 $labels['printmessage'] = 'Imprimir';
 $labels['previousmessage'] = 'Mensagem anterior';
 $labels['previousmessages'] = 'Página anterior';
@@ -101,8 +102,8 @@ $labels['unlimited'] = 'ilimitado';
 $labels['quicksearch'] = 'Pesquisa rápida';
 $labels['resetsearch'] = 'Limpar pesquisa';
 $labels['compose'] = 'Escrever mensagem';
-$labels['sendmessage'] = 'Enviar';
 $labels['savemessage'] = 'Salvar rascunho';
+$labels['sendmessage'] = 'Enviar';
 $labels['addattachment'] = 'Anexar';
 $labels['charset'] = 'Charset';
 $labels['editortype'] = 'Tipo de editor';
@@ -122,6 +123,9 @@ $labels['nosubject'] = '(sem assunto)';
 $labels['showimages'] = 'Exibir imagens';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Texto simples';
+$labels['addcc'] = 'Adicionar Cc';
+$labels['addbcc'] = 'Adicionar Bcc';
+$labels['addreplyto'] = 'Adicionar "Responder para"';
 $labels['name'] = 'Nome completo';
 $labels['firstname'] = 'Primeiro nome';
 $labels['surname'] = 'Apelido';
index de14f366584c0178f7d21f9f35ca1e94fafcc3e3..ccb4fa1d5bc7bc0156fd5be7d0a3ea6c79c858ef 100644 (file)
@@ -14,7 +14,7 @@
  |          João Vale <jpvale@gmail.com>                                 |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 562 2007-05-17 15:22:33Z thomasb $
+ @version $Id: messages.inc 873 2007-10-16 19:06:34Z yllar $
 
 */
 
@@ -74,5 +74,6 @@ $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...';
 
 ?>
old mode 100755 (executable)
new mode 100644 (file)
index 3c36be9..6c13682
@@ -14,7 +14,7 @@
  |         Vladimir Kulev <me@lightoze.net>                              |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 560 2007-05-17 15:01:26Z thomasb $
+ @version $Id: labels.inc 584 2007-05-24 03:49:19Z estadtherr $
 
 */
 
old mode 100755 (executable)
new mode 100644 (file)
index 4e7e73c..2e57616
@@ -14,7 +14,7 @@
  |         Vladimir Kulev <me@lightoze.net>                              |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 560 2007-05-17 15:01:26Z thomasb $
+ @version $Id: messages.inc 584 2007-05-24 03:49:19Z estadtherr $
 
 */
 
index 4014c02a67bb3ccac3088ac3a232708ba73fc1e5..c1e19f599a613f0b3cc106a6957992cc80b43a85 100644 (file)
@@ -14,7 +14,7 @@
  |         Andreas Henriksson <andreas@fatal.se>                         |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 557 2007-05-15 06:41:32Z yllar $
+ @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
@@ -160,7 +160,7 @@ $labels['signature'] = 'Signatur';
 $labels['dstactive'] = 'Sommartid';
 $labels['htmleditor'] = 'Skriv HTML-meddelanden';
 $labels['htmlsignature'] = 'HTML-signatur';
-$labels['previewpane'] = 'Visa föregående panel';
+$labels['previewpane'] = 'Visa delad vy i inbox';
 $labels['autosavedraft'] = 'Spara utkast automatiskt';
 $labels['everynminutes'] = 'var $n minut';
 $labels['never'] = 'aldrig';
@@ -178,4 +178,4 @@ $labels['sortby'] = 'Sortera på';
 $labels['sortasc'] = 'Sortera stigande';
 $labels['sortdesc'] = 'Sortera fallande';
 
-?>
+?>
\ No newline at end of file
index 945c7f89a92cdd22bec13abc09b9e0267eca3dfa..a51cc5cfd4e1ae751b32f2f4119107281fb793e1 100644 (file)
@@ -14,7 +14,7 @@
  |         Andreas Henriksson <andreas@fatal.se>                         |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 557 2007-05-15 06:41:32Z yllar $
+ @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
@@ -75,4 +75,4 @@ $messages['copyerror'] = 'Kunde inte kopiera några adresser';
 $messages['sourceisreadonly'] = 'Denna adresskälla är skrivskyddad';
 $messages['errorsavingcontact'] = 'Kunde inte spara kontakt-adressen';
 
-?>
+?>
\ No newline at end of file
index 052392636c39a121f59a887b22b2228770287d03..3d5d92205d4eea7d1b8b30e33a4c7e3673006eb5 100644 (file)
@@ -1,4 +1,4 @@
-<?
+<?
 /*
  +-----------------------------------------------------------------------+
  | language/si/messages.inc                                              |
index 8906ac5165b4a2101dadb0d6fc7f03ea4257f5b8..624e5c36140b0de6690f5da31d77dec08794a3b4 100644 (file)
@@ -14,7 +14,7 @@
  |         Marek Kutnar marek19@zmail.sk>                                |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 569 2007-05-17 19:42:17Z thomasb $
+ @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
@@ -178,4 +178,4 @@ $labels['sortby'] = 'Triediť podľa';
 $labels['sortasc'] = 'Triediť vzostupne';
 $labels['sortdesc'] = 'Triediť zostupne';
 
-?>
+?>
\ No newline at end of file
index d9c58757b717312c14a495d8ccb6763048f85355..efad6baeb62e3ea6df731409e0dd08d8e1f76100 100644 (file)
@@ -14,7 +14,7 @@
  |         Marek Kutnar marek19@zmail.sk>                                |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 569 2007-05-17 19:42:17Z thomasb $
+ @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
@@ -75,4 +75,4 @@ $messages['copyerror'] = 'Nemôžem skopírovať žiadnu adresu';
 $messages['sourceisreadonly'] = 'Tento zdroj adries je len na čítanie';
 $messages['errorsavingcontact'] = 'Nemôžem uložit adresu kontaktu';
 
-?>
+?>
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index a7350b6..3239628
@@ -14,7 +14,7 @@
  |         Andrej Mocilnik <amocilnik@dotcom.ts.it>                                     |
  +--------------------------------------------------------------------------------------+
 
- @version $Id: labels.inc 557 2007-05-15 06:41:32Z yllar $
+ @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
@@ -177,4 +177,5 @@ $labels['managefolders'] = 'Urejaj mape';
 $labels['sortby'] = 'Uredi po';
 $labels['sortasc'] = 'Uredi naraščajoče';
 $labels['sortdesc'] = 'Uredi padajoče';
-?>
+
+?>
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index d8aded0..f19a403
@@ -14,7 +14,7 @@
  |         Andrej Mocilnik <amocilnik@dotcom.ts.it>                                     |
  +--------------------------------------------------------------------------------------+
 
- @version $Id: messages.inc 557 2007-05-15 06:41:32Z yllar $
+ @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
 
 */
 
@@ -74,4 +74,5 @@ $messages['copysuccess'] = 'Število prepisanih naslovov: $nr';
 $messages['copyerror'] = 'Ne morem prepisati nobenega naslova';
 $messages['sourceisreadonly'] = 'Izvirnik naslova je samo berljiv';
 $messages['errorsavingcontact'] = 'Ne morem shraniti vizitke';
-?>
+
+?>
\ No newline at end of file
index 088a62a98dd7ee5556f1d9b635b48ff0e7955601..b1fe6554a6539743cf00f96ff23f5fa4dca8171c 100644 (file)
@@ -13,7 +13,7 @@
  | Author: Hasan Cansız <hasancansiz@yahoo.com>                          |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 466 2007-02-06 09:17:01Z tomekp $
+ @version $Id: labels.inc 837 2007-09-27 13:31:57Z thomasb $
 
 */
 
@@ -46,7 +46,7 @@ $labels['reply-to'] = 'Yanıtların Gönderileceği Adres';
 $labels['mailboxlist'] = 'Klasörler';
 $labels['messagesfromto'] = '$count Mesajın $from - $to Arasındaki Mesajlar';
 $labels['messagenrof'] = '$count Mesajın $nr .';
-$labels['moveto'] = 'Å\9euraya taşı...';
+$labels['moveto'] = 'Å\9furaya taşı...';
 $labels['download'] = 'İndir';
 $labels['filename'] = 'Dosya Adı';
 $labels['filesize'] = 'Dosya Boyutu';
@@ -54,13 +54,13 @@ $labels['preferhtml'] = 'HTML görüntülemeyi destekle';
 $labels['htmlmessage'] = 'HTML Mesaj';
 $labels['prettydate'] = 'Tarihi kısaltarak göster';
 $labels['addtoaddressbook'] = 'Rehbere Ekle';
-$labels['sun'] = 'Pzr.';
-$labels['mon'] = 'Pts.';
-$labels['tue'] = 'Salı';
-$labels['wed'] = 'Çarş.';
-$labels['thu'] = 'Perş.';
-$labels['fri'] = 'Cuma';
-$labels['sat'] = 'C.tesi';
+$labels['sun'] = 'Pzr';
+$labels['mon'] = 'Pts';
+$labels['tue'] = 'Sal';
+$labels['wed'] = 'Çar';
+$labels['thu'] = 'Per';
+$labels['fri'] = 'Cum';
+$labels['sat'] = 'Cts';
 $labels['sunday'] = 'Pazar';
 $labels['monday'] = 'Pazartesi';
 $labels['tuesday'] = 'Salı';
@@ -76,8 +76,14 @@ $labels['replytoallmessage'] = 'Bu postanın gönderildiği herkesi yanıtla';
 $labels['forwardmessage'] = 'Postayı ilet';
 $labels['deletemessage'] = 'Çöp Kutusuna At';
 $labels['printmessage'] = 'Yazdır';
+$labels['previousmessage'] = 'Önceki mesajı göster';
 $labels['previousmessages'] = 'Önceki postaları göster';
+$labels['firstmessage'] = 'İlk mesajı göster';
+$labels['firstmessages'] = 'İlk mesajları göster';
+$labels['nextmessage'] = 'Sonraki mesajı göster';
 $labels['nextmessages'] = 'Sonraki postaları göster';
+$labels['lastmessage'] = 'Son mesajı göster';
+$labels['lastmessages'] = 'Son mesajları göster';
 $labels['backtolist'] = 'Posta kutusuna dön';
 $labels['viewsource'] = 'Kaynağı göster';
 $labels['select'] = 'Seç';
@@ -93,10 +99,11 @@ $labels['unlimited'] = 'sınırsız';
 $labels['quicksearch'] = 'Hızlı arama';
 $labels['resetsearch'] = 'Aramayı sıfırla';
 $labels['compose'] = 'Yeni posta oluştur';
-$labels['savemessage'] = 'Taslak olarak kaydet';
 $labels['sendmessage'] = 'Postayı gönder';
+$labels['savemessage'] = 'Taslak olarak kaydet';
 $labels['addattachment'] = 'Dosya ekle';
 $labels['charset'] = 'Karakter seti';
+$labels['editortype'] = 'Düzenleyici tipi';
 $labels['returnreceipt'] = 'Return receipt';
 $labels['checkspelling'] = 'Dilbilgisi kontrolu yap';
 $labels['resumeediting'] = 'Düzenlemeye devam et';
@@ -111,6 +118,8 @@ $labels['high'] = 'Yüksek';
 $labels['highest'] = 'Çok yüksek';
 $labels['nosubject'] = '(Konu Belirtilmemiş)';
 $labels['showimages'] = 'Grafikleri görüntüle';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Düz metin';
 $labels['name'] = 'İsmi görüntüle';
 $labels['firstname'] = 'İsim';
 $labels['surname'] = 'Soy isim';
@@ -128,14 +137,11 @@ $labels['contactsfromto'] = '$count Kişinin $from - $to arası ';
 $labels['print'] = 'Yazdır';
 $labels['export'] = 'Export';
 $labels['previouspage'] = 'Önceki seti göster';
+$labels['firstpage'] = 'İlk sayfa';
 $labels['nextpage'] = 'Sonraki seti göster';
-$labels['ldapsearch'] = 'LDAP directory araması';
-$labels['ldappublicsearchname'] = 'Kişi adı';
-$labels['ldappublicsearchtype'] = 'Tam olarak uysun?';
-$labels['ldappublicserverselect'] = 'Serverleri seç';
-$labels['ldappublicsearchfield'] = 'Arama açık';
-$labels['ldappublicsearchform'] = 'Kişi ara';
-$labels['ldappublicsearch'] = 'Ara';
+$labels['lastpage'] = 'Son sayfa';
+$labels['groups'] = 'Gruplar';
+$labels['personaladrbook'] = 'Adresler';
 $labels['settingsfor'] = 'Ayarlar';
 $labels['preferences'] = 'Tercihler';
 $labels['userpreferences'] = 'Kullanıcı tercihleri';
@@ -151,6 +157,12 @@ $labels['timezone'] = 'Saat dilimi';
 $labels['pagesize'] = 'Bir sayfada kaç posta gösterilsin';
 $labels['signature'] = 'İmza';
 $labels['dstactive'] = 'Yaz saati uygulaması';
+$labels['htmleditor'] = 'HTML türünde mesaj düzenle';
+$labels['htmlsignature'] = 'HTML türü imza';
+$labels['previewpane'] = 'İlk paneli göster';
+$labels['autosavedraft'] = 'Taslağı otomatik kaydet';
+$labels['everynminutes'] = 'her $n dakikada bir';
+$labels['never'] = 'hiçbir zaman';
 $labels['folder'] = 'Klasör';
 $labels['folders'] = 'Klasörler';
 $labels['foldername'] = 'Klasör ismi';
index 32c4ae7f29c8625980bd9ca600ee792cd4bf8122..151bff6c343e962072b2d05415fc0ee979097c08 100644 (file)
@@ -13,7 +13,7 @@
  | Author: Hasan Cansız <hasancansiz@yahoo.com>                          |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 466 2007-02-06 09:17:01Z tomekp $
+ @version $Id: messages.inc 837 2007-09-27 13:31:57Z thomasb $
 
 */
 
@@ -38,11 +38,13 @@ $messages['contactexists'] = 'Rehberde bu posta adresine sahip biri zaten var';
 $messages['blockedimages'] = 'Gizliliğinizi korumak amacıyla postadaki grafikler bloke edildi.';
 $messages['encryptedmessage'] = 'Bu şifrelenmiş bir posta ve bu nedenle gösterilemiyor. Özür dilerim!';
 $messages['nocontactsfound'] = 'Kişi bulunamadı';
+$messages['contactnotfound'] = 'İstenen bağlantı bulunamadı';
 $messages['sendingfailed'] = 'Posta gönderilemedi';
 $messages['errorsaving'] = 'Kaydederken bir problem oluştu';
 $messages['errormoving'] = 'Posta taşınamadı';
 $messages['errordeleting'] = 'Posta silinemedi';
 $messages['deletecontactconfirm'] = 'Seçili posta(lar)ı silmeyi gerçekten istiyor musunuz?';
+$messages['deletemessagesconfirm'] = 'Seçilen mesajları silmek istiyor musunuz?';
 $messages['deletefolderconfirm'] = 'Bu klasörü silmeyi gerçekten istiyor musunuz?';
 $messages['purgefolderconfirm'] = 'Bu klasördeki tüm postaları silmeyi gerçekten istiyor musnuz?';
 $messages['formincomplete'] = 'Form tam olarak doldurulmadı';
@@ -50,7 +52,7 @@ $messages['noemailwarning'] = 'Lütfen geçerli bir posta adresi girin';
 $messages['nonamewarning'] = 'Lütfen bir isim girin';
 $messages['nopagesizewarning'] = 'Lütfen bir sayfa boyutu girin';
 $messages['norecipientwarning'] = 'Lütfen en az bir alıcı belirtin';
-$messages['nosubjectwarning'] = '"Konu" kutusu boş bırakılmış. Å\9eimdi bir konu belirtmek ister misiniz?';
+$messages['nosubjectwarning'] = '"Konu" kutusu boş bırakılmış. Ã\9eimdi bir konu belirtmek ister misiniz?';
 $messages['nobodywarning'] = 'Postayı boş olarak gönder?';
 $messages['notsentwarning'] = 'Posta gönderilmedi. Postanızı iptal etmek istiyor musunuz?';
 $messages['noldapserver'] = 'Lütfen arama için bir Ldap sunucu seçin';
@@ -62,5 +64,14 @@ $messages['searching'] = 'Aranıyor...';
 $messages['checking'] = 'Kontrol ediliyor...';
 $messages['nospellerrors'] = 'Yazım hatası bulunmadı';
 $messages['folderdeleted'] = 'Klasör başarılı bir şekilde silindi';
+$messages['deletedsuccessfully'] = 'Silindi';
+$messages['converting'] = 'Mesajın biçimlendirmesi kaldırılıyor..';
+$messages['messageopenerror'] = 'Mesaj sunucudan yüklenemedi';
+$messages['fileuploaderror'] = 'Dosya yükleme başarısız';
+$messages['filesizeerror'] = 'Yüklenen dosya en büyük dosya boyu $size \'ı aşıyor';
+$messages['copysuccess'] = '$nr adres kopyalandı';
+$messages['copyerror'] = 'Hiçbir adres kopyalanamadı';
+$messages['sourceisreadonly'] = 'Adres kaynağı salt okunur durumda';
+$messages['errorsavingcontact'] = 'Bağlantı adresi kaydedilemedi';
 
 ?>
\ No newline at end of file
diff --git a/program/localization/uk/labels.inc b/program/localization/uk/labels.inc
new file mode 100644 (file)
index 0000000..2c5f192
--- /dev/null
@@ -0,0 +1,201 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/uk/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Natali Stasyuk <natali@onlineua.net>                          |
+ +-----------------------------------------------------------------------+
+
+*/
+
+$labels = array();
+
+// login page
+$labels['welcome'] = 'Ласкаво просимо в $product!';
+$labels['username'] = 'Ім`я користувача';
+$labels['password'] = 'Пароль';
+$labels['server'] = 'Сервер';
+$labels['login'] = 'Увійти';
+
+// taskbar
+$labels['logout'] = 'Вийти';
+$labels['mail'] = 'Пошта';
+$labels['settings'] = 'Налаштування';
+$labels['addressbook'] = 'Контакти';
+
+// mailbox names
+$labels['inbox'] = 'Вхідні';
+$labels['drafts'] = 'Чернетки';
+$labels['sent'] = 'Відправлені';
+$labels['trash'] = 'Смітник';
+$labels['spam'] = 'Спам';
+
+// message listing
+$labels['subject'] = 'Тема';
+$labels['from'] = 'Від';
+$labels['to'] = 'Кому';
+$labels['cc'] = 'Копія';
+$labels['bcc'] = 'Прихована';
+$labels['replyto'] = 'Зворотня адреса';
+$labels['date'] = 'Дата';
+$labels['size'] = 'Розмір';
+$labels['priority'] = 'Пріоритет';
+$labels['organization'] = 'Організація';
+
+// aliases
+$labels['reply-to'] = 'Зворотня адреса';
+$labels['mailboxlist'] = 'Теки';
+$labels['messagesfromto'] = 'Повідомлення з $from по $to із $count';
+$labels['messagenrof'] = 'Повідомлення $nr із $count';
+$labels['moveto'] = 'Перемістити у...';
+$labels['download'] = 'Завантажити';
+$labels['filename'] = 'Ім`я файлу';
+$labels['filesize'] = 'Розмір файлу';
+$labels['preferhtml'] = 'Переважно HTML';
+$labels['htmlmessage'] = 'Повідомлення HTML';
+$labels['prettydate'] = 'Красиві дати';
+$labels['addtoaddressbook'] = 'Додати до контактів';
+
+// weekdays short
+$labels['sun'] = 'Нд';
+$labels['mon'] = 'Пн';
+$labels['tue'] = 'Вт';
+$labels['wed'] = 'Ср';
+$labels['thu'] = 'Чт';
+$labels['fri'] = 'Пт';
+$labels['sat'] = 'Сб';
+
+// weekdays long
+$labels['sunday'] = 'Неділя';
+$labels['monday'] = 'Понеділок';
+$labels['tuesday'] = 'Вівторок';
+$labels['wednesday'] = 'Середа';
+$labels['thursday'] = 'Четвер';
+$labels['friday'] = 'П`ятниця';
+$labels['saturday'] = 'Субота';
+
+$labels['today'] = 'Сьогодні';
+
+// toolbar buttons
+$labels['checkmail'] = 'Перевірити пошту';
+$labels['writenewmessage'] = 'Нове повідомлення';
+$labels['replytomessage'] = 'Відповісти';
+$labels['replytoallmessage'] = 'Відповісти усім';
+$labels['forwardmessage'] = 'Переслати';
+$labels['deletemessage'] = 'У смітник';
+$labels['printmessage'] = 'Друкувати';
+$labels['previousmessage'] = 'Показати попереднє повідомлення';
+$labels['previousmessages'] = 'Попередня сторінка повідомлень';
+$labels['firstmessage'] = 'Показати перше повідомлення';
+$labels['firstmessages'] = 'Перша сторінка повідомлень';
+$labels['nextmessage'] = 'Показати наступне повідомлення';
+$labels['nextmessages'] = 'Наступна сторінка повідомлень';
+$labels['lastmessage'] = 'Показати останнє повідомлення';
+$labels['lastmessages'] = 'Остання сторінка повідомлень';
+$labels['backtolist'] = 'До переліку повідомлень';
+$labels['viewsource'] = 'Вихідний текст';
+$labels['select'] = 'Вибрати';
+$labels['all'] = 'Все';
+$labels['none'] = 'Нічого';
+$labels['unread'] = 'Непрочитані';
+$labels['compact'] = 'Стиснути';
+$labels['empty'] = 'Спустошити';
+$labels['purge'] = 'Очистити';
+$labels['quota'] = 'Квота';
+$labels['unknown'] = 'невідомо';
+$labels['unlimited'] = 'без обмеження';
+$labels['quicksearch'] = 'Швидкий пошук';
+$labels['resetsearch'] = 'Очистити пошук';
+
+// message compose
+$labels['compose'] = 'Написати повідомлення';
+$labels['sendmessage'] = 'Відіслати зараз';
+$labels['savemessage'] = 'Зберегти чернетку';
+$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['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Звичайний текст';
+
+// address boook
+$labels['name'] = 'Відображуване ім`я';
+$labels['firstname'] = 'Ім`я';
+$labels['surname'] = 'Прізвище';
+$labels['email'] = 'E-Mail';
+$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['previouspage'] = 'Показати попередній';
+$labels['firstpage'] = 'Показати перший';
+$labels['nextpage'] = 'Показати наступний';
+$labels['lastpage'] = 'Показати останній';
+$labels['groups'] = 'Групи';
+$labels['personaladrbook'] = 'Персональні адреси';
+
+// settings
+$labels['settingsfor'] = 'Налаштування для';
+$labels['preferences'] = 'Уподобання';
+$labels['userpreferences'] = 'Уподобання користувача';
+$labels['editpreferences'] = 'Редагувати уподобання користувача';
+$labels['identities'] = 'Профілі';
+$labels['manageidentities'] = 'Керування профілями';
+$labels['newidentity'] = 'Новий профіль';
+$labels['newitem'] = 'Новий';
+$labels['edititem'] = 'Правка';
+$labels['setdefault'] = 'Використовувати типово';
+$labels['language'] = 'Мова';
+$labels['timezone'] = 'Часовий пояс';
+$labels['pagesize'] = 'Рядків на сторінці';
+$labels['signature'] = 'Підпис';
+$labels['dstactive'] = 'Літній/зимовий час';
+$labels['htmleditor'] = 'Створювати повідомлення в HTML';
+$labels['htmlsignature'] = 'Підпис в HTML';
+$labels['previewpane'] = 'Показати панель перегляду';
+$labels['autosavedraft'] = 'Автозбереження чернетки';
+$labels['everynminutes'] = 'кожні $n хвилин';
+$labels['never'] = 'ніколи';
+$labels['folder'] = 'Тека';
+$labels['folders'] = 'Теки';
+$labels['foldername'] = 'Назва теки';
+$labels['subscribed'] = 'Підписані';
+$labels['create'] = 'Створити';
+$labels['createfolder'] = 'Створити нову теку';
+$labels['rename'] = 'Перейменувати';
+$labels['renamefolder'] = 'Перейменувати теку';
+$labels['deletefolder'] = 'Видалити теку';
+$labels['managefolders'] = 'Керування теками';
+$labels['sortby'] = 'Відсортувати за';
+$labels['sortasc'] = 'Сортувати за зростанням';
+$labels['sortdesc'] = 'Сортувати за спаданням';
+
+?>
\ No newline at end of file
diff --git a/program/localization/uk/messages.inc b/program/localization/uk/messages.inc
new file mode 100644 (file)
index 0000000..c1783f4
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/uk/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Natali Stasyuk <natali@onlineua.net>                          |
+ +-----------------------------------------------------------------------+
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Невдала спроба входу';
+$messages['cookiesdisabled'] = 'Ваш переглядач не приймає cookie';
+$messages['sessionerror'] = 'Ваша сесія застаріла';
+$messages['imaperror'] = 'Невдале з`єднання з IMAP сервером';
+$messages['nomessagesfound'] = 'Повідомлень не знайдено';
+$messages['loggedout'] = 'Ваша сесія завершена. Всього найкращого!';
+$messages['mailboxempty'] = 'Поштова скринька порожня';
+$messages['loading'] = 'Завантаження...';
+$messages['loadingdata'] = 'Завантаження даних...';
+$messages['checkingmail'] = 'Перевірка нових повідомлень...';
+$messages['sendingmessage'] = 'Відправка повідомлень...';
+$messages['messagesent'] = 'Повідомлення відправлено';
+$messages['savingmessage'] = 'Збереження повідомлення...';
+$messages['messagesaved'] = 'Збережено в Чернетках';
+$messages['successfullysaved'] = 'Збережено';
+$messages['addedsuccessfully'] = 'Контакт успішно доданий до списку контактів';
+$messages['contactexists'] = 'Контакт з цією адресою e-mail вже існує';
+$messages['blockedimages'] = 'З метою безпеки завантаження зображень заблоковано';
+$messages['encryptedmessage'] = 'Повідомлення зашифровано і не може бути показано. Зверніться до адміністратора серверу.';
+$messages['nocontactsfound'] = 'Контакти не знайдені';
+$messages['contactnotfound'] = 'Запитаний контакт не знайдений';
+$messages['sendingfailed'] = 'Не вдалося відправити повідомлення';
+$messages['errorsaving'] = 'У процесі збереження трапилася помилка';
+$messages['errormoving'] = 'Не вдалося перемістити повідомлення';
+$messages['errordeleting'] = 'Не вдалося видалити повідомлення';
+$messages['deletecontactconfirm'] = 'Ви дійстно бажаєте видалити вибрані контакти?';
+$messages['deletemessagesconfirm'] = 'Ви дійстно бажаєте видалити вибрані повідомлення?';
+$messages['deletefolderconfirm'] = 'Ви дійстно бажаєте видалити цю теку?';
+$messages['purgefolderconfirm'] = 'Ви дійстно бажаєте видалити всі повідомлення у цій теці?';
+$messages['formincomplete'] = 'Заповнені не усі поля';
+$messages['noemailwarning'] = 'Будь ласка, введіть коректну адресу електронної пошти';
+$messages['nonamewarning'] = 'Будь ласка, введіть ім`я';
+$messages['nopagesizewarning'] = 'Будь ласка, введіть розмір сторінки';
+$messages['norecipientwarning'] = 'Будь ласка, введіть ім`я отримувача';
+$messages['nosubjectwarning'] = 'Поле "Тема" не заповнено. Бажаєте заповнити його зараз?';
+$messages['nobodywarning'] = 'Відправити повідомлення без тексту?';
+$messages['notsentwarning'] = 'Повідомлення не було відправлено. Ви бажаєте відмовитись від відправки?';
+$messages['noldapserver'] = 'Будь ласка, виберіть LDAP сервер для пошука';
+$messages['nocontactsreturned'] = 'Контакти не знайдені';
+$messages['nosearchname'] = 'Будь ласка, введіть ім`я чи адресу E-Mail';
+$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'] = 'Неможливо зберегти адресу контакта';
+
+?>
\ No newline at end of file
diff --git a/program/localization/zh_CN/labels.inc b/program/localization/zh_CN/labels.inc
new file mode 100644 (file)
index 0000000..aa88a11
--- /dev/null
@@ -0,0 +1,181 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | localization/zh_CN/labels.inc                                         |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: kourge <kourge@gmail.com>                                     |
+ |         Xue zhong sheng <xue.zhongsheng@gmail.com>                    |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 672 2007-08-10 14:46:53Z thomasb $
+
+*/
+
+$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['messagenrof'] = '第 $nr 封邮件,共有 $count 封';
+$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['today'] = '今日';
+$labels['checkmail'] = '检查邮件';
+$labels['writenewmessage'] = '写新邮件';
+$labels['replytomessage'] = '回复';
+$labels['replytoallmessage'] = '全部回复';
+$labels['forwardmessage'] = '转发';
+$labels['deletemessage'] = '删除';
+$labels['printmessage'] = '打印';
+$labels['previousmessage'] = '上一封';
+$labels['previousmessages'] = '上一页';
+$labels['firstmessage'] = '第一封';
+$labels['firstmessages'] = '第一页';
+$labels['nextmessage'] = '下一封';
+$labels['nextmessages'] = '下一页';
+$labels['lastmessage'] = '最后一封';
+$labels['lastmessages'] = '最后一页';
+$labels['backtolist'] = '返回邮件列表';
+$labels['viewsource'] = '显示邮件原文';
+$labels['select'] = '选择';
+$labels['all'] = '全部';
+$labels['none'] = '无';
+$labels['unread'] = '未读';
+$labels['compact'] = '压缩';
+$labels['empty'] = '清空';
+$labels['purge'] = '清除';
+$labels['quota'] = '空间使用';
+$labels['unknown'] = '未知';
+$labels['unlimited'] = '无限制';
+$labels['quicksearch'] = '快速查找';
+$labels['resetsearch'] = '重新查找';
+$labels['compose'] = '写新邮件';
+$labels['sendmessage'] = '立即发送';
+$labels['savemessage'] = '暂存至草稿箱';
+$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['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = '纯文本';
+$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['previouspage'] = '上页';
+$labels['firstpage'] = '首页';
+$labels['nextpage'] = '下页';
+$labels['lastpage'] = '末页';
+$labels['groups'] = '分组';
+$labels['personaladrbook'] = '个人住址';
+$labels['settingsfor'] = '设置';
+$labels['preferences'] = '偏好';
+$labels['userpreferences'] = '个人偏好';
+$labels['editpreferences'] = '修改个人偏好';
+$labels['identities'] = '身份';
+$labels['manageidentities'] = '管理此账号的身份';
+$labels['newidentity'] = '添加身份';
+$labels['newitem'] = '添加条目';
+$labels['edititem'] = '修改条目';
+$labels['setdefault'] = '默认值';
+$labels['language'] = '语言';
+$labels['timezone'] = '时区';
+$labels['pagesize'] = '第页邮件数量';
+$labels['signature'] = '签名';
+$labels['dstactive'] = '夏令时';
+$labels['htmleditor'] = '使用HTML编辑器';
+$labels['htmlsignature'] = '使用HTML签名';
+$labels['previewpane'] = '显示预览窗口';
+$labels['autosavedraft'] = '自动保存到草稿箱';
+$labels['everynminutes'] = '第 $n 分钟';
+$labels['never'] = '从不';
+$labels['folder'] = '邮件夹';
+$labels['folders'] = '邮件夹';
+$labels['foldername'] = '邮件夹名称';
+$labels['subscribed'] = '已订阅';
+$labels['create'] = '建立';
+$labels['createfolder'] = '建立新邮件夹';
+$labels['rename'] = '重命名';
+$labels['renamefolder'] = '重命名邮件夹';
+$labels['deletefolder'] = '删除邮件夹';
+$labels['managefolders'] = '管理邮件夹';
+$labels['sortby'] = '排序';
+$labels['sortasc'] = '递增排序';
+$labels['sortdesc'] = '递减排序';
+
+?>
\ No newline at end of file
diff --git a/program/localization/zh_CN/messages.inc b/program/localization/zh_CN/messages.inc
new file mode 100644 (file)
index 0000000..65c46e9
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | localization/zh_CN/messages.inc                                       |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: kourge <kourge@gmail.com>                                     |
+ |         Xue zhong sheng <xue.zhongsheng@gmail.com>                    |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 672 2007-08-10 14:46:53Z thomasb $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = '登录失败';
+$messages['cookiesdisabled'] = '你的浏览器不接受 cookies';
+$messages['sessionerror'] = '会话已过期';
+$messages['imaperror'] = '连接到邮件服务器失败';
+$messages['nomessagesfound'] = '此邮件夹内无邮件';
+$messages['loggedout'] = '你已成功注销';
+$messages['mailboxempty'] = '邮件夹为空';
+$messages['loading'] = '加载中...';
+$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['errorsaving'] = '保存过程中发生错误';
+$messages['errormoving'] = '无法移动邮件';
+$messages['errordeleting'] = '无法删除邮件';
+$messages['deletecontactconfirm'] = '你是否确认要删除已选中的联系人?';
+$messages['deletemessagesconfirm'] = '你是否确认要删除已选中的邮件?';
+$messages['deletefolderconfirm'] = '你是否确认要删除已选中的邮件夹?';
+$messages['purgefolderconfirm'] = '你是否确认要删除当前邮件夹中的所有邮件?';
+$messages['formincomplete'] = '当前表单未填写完整,请完整填写';
+$messages['noemailwarning'] = '请输入一个有效的邮件地址';
+$messages['nonamewarning'] = '请输入名字';
+$messages['nopagesizewarning'] = '请输入每页显示的邮件数量';
+$messages['norecipientwarning'] = '至少需要一个收件人';
+$messages['nosubjectwarning'] = '主题为空。你要输入一个主题吗?';
+$messages['nobodywarning'] = '要发送无正文的邮件吗?';
+$messages['notsentwarning'] = '邮件未发送。你确定要离开并废弃当前邮件?';
+$messages['noldapserver'] = '请选择一个LDAP服务器进行查找';
+$messages['nocontactsreturned'] = '未找到联系人';
+$messages['nosearchname'] = '请输入一个联系人姓名或电子邮件地址';
+$messages['searchsuccessful'] = '共找到 $n 封邮件';
+$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'] = '无法保存联系人的地址';
+
+?>
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 62ecf82..9331789
@@ -14,7 +14,7 @@
  |         Ting-Hung Chiu <earrl@mmlab.cse.yzu.edu.tw>                   |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 560 2007-05-17 15:01:26Z thomasb $
+ @version $Id: labels.inc 584 2007-05-24 03:49:19Z estadtherr $
 
 */
 
old mode 100755 (executable)
new mode 100644 (file)
index d8bfbe5..6de331b
@@ -14,7 +14,7 @@
  |         Ting-Hung Chiu <earrl@mmlab.cse.yzu.edu.tw>                   |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 560 2007-05-17 15:01:26Z thomasb $
+ @version $Id: messages.inc 584 2007-05-24 03:49:19Z estadtherr $
 
 */
 
index e6d917e92bd651ea7f7b3895a83cdb74ba8b6300..af8b87c40218eee6741d73568a714ea1d9750e59 100644 (file)
@@ -36,8 +36,11 @@ 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' => count($success)));
+    
+  // close connection to second address directory
+  $TARGET->close();
 }
-  
+
 // send response
 $OUTPUT->send();
 
index 46c600f2ab7b0f346f9d00211089b30ef79e50f7..56a9d639dd8810bed62e542638e6b3c0704d729a 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: func.inc 578 2007-05-18 13:06:01Z thomasb $
+ $Id: func.inc 582 2007-05-18 14:38:11Z thomasb $
 
 */
 
index 27217e5c87af5be5e08ef9f558de4ebafca892b1..101b7c043d86ae1a0716ec63633d6a057f980503 100644 (file)
@@ -25,6 +25,8 @@ $mailto = array();
 
 if ($cid && preg_match('/^[a-z0-9\-_=]+(,[a-z0-9\-_=]+)*$/i', $cid) && $CONTACTS->ready)
 {
+  $CONTACTS->set_page(1);
+  $CONTACTS->set_pagesize(100);
   $recipients = $CONTACTS->search($CONTACTS->primary_key, $cid);
 
   while (is_object($recipients) && ($rec = $recipients->iterate()))
index 5a65d864b5e5bf298e02b024b343241c82dcb62c..f80f6ce442fae33c1c51ee182cbcdc4e654cce8a 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: save.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: save.inc 638 2007-07-03 17:25:05Z thomasb $
 
 */
 
@@ -83,7 +83,7 @@ if (!empty($cid))
 else
 {
   // check for existing contacts
-  $existing = $CONTACTS->search('email', $a_record['email'], false);
+  $existing = $CONTACTS->search('email', $a_record['email'], true, false);
   
   // show warning message
   if ($existing->count)
index 54e1d392ca5338b9ff8daf14b991f25612568767..a3060b4fd38f59d0ce7216c75a10a9ff86c02731 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/error.inc                                               |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: error.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: error.inc 850 2007-10-03 00:13:32Z ihug $
 
 */
 
@@ -124,4 +124,4 @@ $__page_content
 </html>
 EOF;
 
-?>
\ No newline at end of file
+?>
index e59dcbe2abf7ec31bba368ee79afa9d68d662c34..775a36b2b74fcdc4411ce5531dfa5c3c25edec40 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: addcontact.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: addcontact.inc 638 2007-07-03 17:25:05Z thomasb $
 
 */
 
@@ -40,7 +40,7 @@ if (!empty($_POST['_address']))
       $contact['name'] = ucfirst(preg_replace('/[\.\-]/', ' ', substr($contact['email'], 0, strpos($contact['email'], '@'))));
 
     // check for existing contacts
-    $existing = $CONTACTS->search('email', $contact['email'], false);
+    $existing = $CONTACTS->search('email', $contact['email'], true, false);
     if ($done = $existing->count)
       $OUTPUT->show_message('contactexists', 'warning');
     else if ($done = $CONTACTS->insert($contact))
index 119d481aba7edb9e66c8fc11bddcd8352e13bf73..a2100f1d24a5386262ab537dd3a6debf44208f79 100644 (file)
@@ -31,7 +31,7 @@ foreach ($a_mailboxes as $mbox_name)
       $unread_count = $IMAP->messagecount(NULL, 'UNSEEN', TRUE);
 
       $OUTPUT->set_env('messagecount', $count);
-      $OUTPUT->command('set_unread_count', $mbox_name, $unread_count);
+      $OUTPUT->command('set_unread_count', $mbox_name, $unread_count, true);
       $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text());
       $OUTPUT->command('set_quota', $IMAP->get_quota());
 
index 3464d55e6fd59e2ef81e9c100a80fb54f7433276..be3ef207032ae1f1bbf3696bdef5d774e3473f0b 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/compose.inc                                        |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: compose.inc 579 2007-05-18 13:11:22Z thomasb $
+ $Id: compose.inc 892 2007-10-20 21:47:11Z thomasb $
 
 */
 
@@ -42,8 +42,6 @@ if ($_action=='remove-attachment' && preg_match('/^rcmfile([0-9]+)$/', $_POST['_
     }
   }
 
-// this version does not support HTML mails
-$CONFIG['htmleditor'] = false;
 
 $MESSAGE_FORM = NULL;
 $MESSAGE = NULL;
@@ -65,6 +63,9 @@ rcube_add_label('nosubject', 'norecipientwarning', 'nosubjectwarning', 'nobodywa
 // add config parameter to client script
 $OUTPUT->set_env('draft_autosave', !empty($CONFIG['drafts_mbox']) ? $CONFIG['draft_autosave'] : 0);
 
+// no html editor if globally disabled
+if (!$CONFIG['enable_htmleditor'])
+  $CONFIG['htmleditor'] = false;
 
 // get reference message and set compose mode
 if ($msg_uid = get_input_value('_reply_uid', RCUBE_INPUT_GET))
@@ -147,7 +148,7 @@ function rcmail_compose_headers($attrib)
         $header = 'bcc';
         }
         
-      $allow_attrib = array('id', 'class', 'style', 'cols', 'rows', 'wrap', 'tabindex');
+      $allow_attrib = array('id', 'class', 'style', 'cols', 'rows', 'tabindex');
       $field_type = 'textarea';            
       break;
 
@@ -409,6 +410,13 @@ function rcmail_compose_body($attrib)
     $body = rcmail_create_draft_body($body, $isHtml);
     }
 
+  if ($CONFIG['enable_htmleditor'])
+    {
+    $OUTPUT->include_script('tiny_mce/tiny_mce.js');
+    $OUTPUT->include_script("editor.js");
+    $OUTPUT->add_script('rcmail_editor_init("$__skin_path");');
+    }
+
   $out = $form_start ? "$form_start\n" : '';
 
   $saveid = new hiddenfield(array('name' => '_draft_saveid', 'value' => $compose_mode==RCUBE_COMPOSE_DRAFT ? str_replace(array('<','>'), "", $MESSAGE['headers']->messageID) : ''));
@@ -779,6 +787,9 @@ function rcmail_receipt_checkbox($attrib)
 function rcmail_editor_selector($attrib)
 {
   global $CONFIG, $MESSAGE, $compose_mode;
+  
+  if (!$CONFIG['enable_htmleditor'])
+    return '';
 
   $choices = array(
     'html'  => 'htmltoggle',
@@ -860,6 +871,7 @@ $OUTPUT->add_handlers(array(
   'composeattachmentform' => 'rcmail_compose_attachment_form',
   'composeattachment' => 'rcmail_compose_attachment_field',
   'priorityselector' => 'rcmail_priority_selector',
+  'editorselector' => 'rcmail_editor_selector',
   'receiptcheckbox' => 'rcmail_receipt_checkbox',
 ));
 
index c7d9ebe972eedf1327b6d72a1eb680e7d07eacec..13184e7f91ab70cefe267ec3b909e2ff604860a6 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/folders.inc                                        |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: folders.inc 573 2007-05-18 11:29:25Z thomasb $
+ $Id: folders.inc 850 2007-10-03 00:13:32Z ihug $
 */
 
 $mbox_name = $IMAP->get_mailbox_name();
@@ -54,4 +54,4 @@ else if ($_action=='purge' && ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST
 }
 
 $OUTPUT->send($commands);
-?>
\ No newline at end of file
+?>
index c86da77035a4d128f1e00a286a0641ad42e50680..6d7c751da4b248e926c67462038f00390f3c48b7 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: func.inc 587 2007-05-28 19:21:36Z thomasb $
+ $Id: func.inc 875 2007-10-17 06:50:28Z thomasb $
 
 */
 
@@ -73,223 +73,12 @@ if ($CONFIG['junk_mbox'])
   $OUTPUT->set_env('junk_mailbox', $CONFIG['junk_mbox']);
 
 if (!$OUTPUT->ajax_call)
-  rcube_add_label('checkingmail');
+  rcube_add_label('checkingmail', 'deletemessage', 'movemessagetotrash');
 
+// set page title
+if (empty($_action) || $_action == 'list')
+  $OUTPUT->set_pagetitle(rcube_charset_convert($IMAP->get_mailbox_name(), 'UTF-7'));
 
-// return the mailboxlist in HTML
-function rcmail_mailbox_list($attrib)
-  {
-  global $IMAP, $CONFIG, $OUTPUT, $COMM_PATH;
-  static $s_added_script = FALSE;
-  static $a_mailboxes;
-
-  // add some labels to client
-  rcube_add_label('purgefolderconfirm');
-  rcube_add_label('deletemessagesconfirm');
-  
-// $mboxlist_start = rcube_timer();
-  
-  $type = $attrib['type'] ? $attrib['type'] : 'ul';
-  $add_attrib = $type=='select' ? array('style', 'class', 'id', 'name', 'onchange') :
-                                  array('style', 'class', 'id');
-                                  
-  if ($type=='ul' && !$attrib['id'])
-    $attrib['id'] = 'rcmboxlist';
-
-  // allow the following attributes to be added to the <ul> tag
-  $attrib_str = create_attrib_string($attrib, $add_attrib);
-  $out = '<' . $type . $attrib_str . ">\n";
-  
-  // add no-selection option
-  if ($type=='select' && $attrib['noselection'])
-    $out .= sprintf('<option value="0">%s</option>'."\n",
-                    rcube_label($attrib['noselection']));
-  
-  // get mailbox list
-  $mbox_name = $IMAP->get_mailbox_name();
-  
-  // for these mailboxes we have localized labels
-  $special_mailboxes = array('inbox', 'sent', 'drafts', 'trash', 'junk');
-
-
-  // build the folders tree
-  if (empty($a_mailboxes))
-    {
-    // get mailbox list
-    $a_folders = $IMAP->list_mailboxes();
-    $delimiter = $IMAP->get_hierarchy_delimiter();
-    $a_mailboxes = array();
-
-// rcube_print_time($mboxlist_start, 'list_mailboxes()');
-
-    foreach ($a_folders as $folder)
-      rcmail_build_folder_tree($a_mailboxes, $folder, $delimiter);
-    }
-
-// var_dump($a_mailboxes);
-
-  if ($type=='select')
-    $out .= rcmail_render_folder_tree_select($a_mailboxes, $special_mailboxes, $mbox_name, $attrib['maxlength']);
-   else
-    $out .= rcmail_render_folder_tree_html($a_mailboxes, $special_mailboxes, $mbox_name, $attrib['maxlength']);
-
-// rcube_print_time($mboxlist_start, 'render_folder_tree()');
-
-
-  if ($type=='ul')
-    $OUTPUT->add_gui_object('mailboxlist', $attrib['id']);
-
-  return $out . "</$type>";
-  }
-
-
-
-
-// create a hierarchical array of the mailbox list
-function rcmail_build_folder_tree(&$arrFolders, $folder, $delm='/', $path='')
-  {
-  $pos = strpos($folder, $delm);
-  if ($pos !== false)
-    {
-    $subFolders = substr($folder, $pos+1);
-    $currentFolder = substr($folder, 0, $pos);
-    }
-  else
-    {
-    $subFolders = false;
-    $currentFolder = $folder;
-    }
-
-  $path .= $currentFolder;
-
-  if (!isset($arrFolders[$currentFolder]))
-    {
-    $arrFolders[$currentFolder] = array('id' => $path,
-                                        'name' => rcube_charset_convert($currentFolder, 'UTF-7'),
-                                        'folders' => array());
-    }
-
-  if (!empty($subFolders))
-    rcmail_build_folder_tree($arrFolders[$currentFolder]['folders'], $subFolders, $delm, $path.$delm);
-  }
-  
-
-// return html for a structured list <ul> for the mailbox tree
-function rcmail_render_folder_tree_html(&$arrFolders, &$special, &$mbox_name, $maxlength, $nestLevel=0)
-  {
-  global $COMM_PATH, $IMAP, $CONFIG, $OUTPUT;
-
-  $idx = 0;
-  $out = '';
-  foreach ($arrFolders as $key => $folder)
-    {
-    $zebra_class = ($nestLevel*$idx)%2 ? 'even' : 'odd';
-    $title = '';
-
-    $folder_lc = strtolower($folder['id']);
-    if (in_array($folder_lc, $special))
-      $foldername = rcube_label($folder_lc);
-    else
-      {
-      $foldername = $folder['name'];
-
-      // shorten the folder name to a given length
-      if ($maxlength && $maxlength>1)
-        {
-        $fname = abbrevate_string($foldername, $maxlength);
-        if ($fname != $foldername)
-          $title = ' title="'.Q($foldername).'"';
-        $foldername = $fname;
-        }
-      }
-
-    // add unread message count display
-    if ($unread_count = $IMAP->messagecount($folder['id'], 'RECENT', ($folder['id']==$mbox_name)))
-      $foldername .= sprintf(' (%d)', $unread_count);
-
-    // make folder name safe for ids and class names
-    $folder_id = preg_replace('/[^A-Za-z0-9\-_]/', '', $folder['id']);
-    $class_name = preg_replace('/[^a-z0-9\-_]/', '', $folder_lc);
-
-    // set special class for Sent, Drafts, Trash and Junk
-    if ($folder['id']==$CONFIG['sent_mbox'])
-      $class_name = 'sent';
-    else if ($folder['id']==$CONFIG['drafts_mbox'])
-      $class_name = 'drafts';
-    else if ($folder['id']==$CONFIG['trash_mbox'])
-      $class_name = 'trash';
-    else if ($folder['id']==$CONFIG['junk_mbox'])
-      $class_name = 'junk';
-
-    $js_name = htmlspecialchars(JQ($folder['id']));
-    $out .= sprintf('<li id="rcmli%s" class="mailbox %s %s%s%s"><a href="%s"'.
-                    ' onclick="return %s.command(\'list\',\'%s\',this)"'.
-                    ' onmouseover="return %s.focus_folder(\'%s\')"' .
-                    ' onmouseout="return %s.unfocus_folder(\'%s\')"' .
-                    ' onmouseup="return %s.folder_mouse_up(\'%s\')"%s>%s</a>',
-                    $folder_id,
-                    $class_name,
-                    $zebra_class,
-                    $unread_count ? ' unread' : '',
-                    $folder['id']==$mbox_name ? ' selected' : '',
-                    Q(rcmail_url('', array('_mbox' => $folder['id']))),
-                    JS_OBJECT_NAME,
-                    $js_name,
-                    JS_OBJECT_NAME,
-                    $js_name,
-                    JS_OBJECT_NAME,
-                    $js_name,
-                    JS_OBJECT_NAME,
-                    $js_name,
-                    $title,
-                    Q($foldername));
-
-    if (!empty($folder['folders']))
-      $out .= "\n<ul>\n" . rcmail_render_folder_tree_html($folder['folders'], $special, $mbox_name, $maxlength, $nestLevel+1) . "</ul>\n";
-
-    $out .= "</li>\n";
-    $idx++;
-    }
-
-  return $out;
-  }
-
-
-// return html for a flat list <select> for the mailbox tree
-function rcmail_render_folder_tree_select(&$arrFolders, &$special, &$mbox_name, $maxlength, $nestLevel=0)
-  {
-  global $IMAP, $OUTPUT;
-
-  $idx = 0;
-  $out = '';
-  foreach ($arrFolders as $key=>$folder)
-    {
-    $folder_lc = strtolower($folder['id']);
-    if (in_array($folder_lc, $special))
-      $foldername = rcube_label($folder_lc);
-    else
-      {
-      $foldername = $folder['name'];
-      
-      // shorten the folder name to a given length
-      if ($maxlength && $maxlength>1)
-        $foldername = abbrevate_string($foldername, $maxlength);
-      }
-
-    $out .= sprintf('<option value="%s">%s%s</option>'."\n",
-                    htmlspecialchars($folder['id']),
-                    str_repeat('&nbsp;', $nestLevel*4),
-                    Q($foldername));
-
-    if (!empty($folder['folders']))
-      $out .= rcmail_render_folder_tree_select($folder['folders'], $special, $mbox_name, $maxlength, $nestLevel+1);
-
-    $idx++;
-    }
-
-  return $out;
-  }
 
 
 // return the message list as HTML table
@@ -404,11 +193,7 @@ function rcmail_message_list($attrib)
 
   // no messages in this mailbox
   if (!sizeof($a_headers))
-    {
-    $out .= sprintf('<tr><td colspan="%d">%s</td></tr>',
-                    sizeof($a_show_cols)+2,
-                    Q(rcube_label('nomessagesfound')));
-    }
+    $OUTPUT->show_message('nomessagesfound', 'notice');
 
 
   $a_js_message_arr = array();
@@ -529,11 +314,13 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE)
   $OUTPUT->command('set_message_coltypes', $a_show_cols);
 
   // loop through message headers
-  for ($n=0; $a_headers[$n]; $n++)
+  foreach ($a_headers as $n => $header)
     {
-    $header = $a_headers[$n];
     $a_msg_cols = array();
     $a_msg_flags = array();
+    
+    if (empty($header))
+      continue;
 
     // format each col; similar as in rcmail_message_list()
     foreach ($a_show_cols as $col)
@@ -861,6 +648,7 @@ function rcmail_parse_message(&$structure, $arg=array(), $recursive=FALSE)
     
     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);
 
@@ -871,19 +659,22 @@ function rcmail_parse_message(&$structure, $arg=array(), $recursive=FALSE)
         $html_part = $p;
       else if ($sub_ctype_primary=='text' && $sub_ctype_secondary=='enriched')
         $enriched_part = $p;
-      else if ($sub_ctype_primary=='multipart' && $sub_ctype_secondary=='related')
+      else if ($sub_ctype_primary=='multipart' && ($sub_ctype_secondary=='related' || $sub_ctype_secondary=='mixed'))
         $related_part = $p;
       }
-
+      
     // parse related part (alternative part could be in here)
-    if ($related_part!==NULL && $prefer_html)
-      {
-      list($parts, $attachmnts) = rcmail_parse_message($structure->parts[$related_part], $arg, TRUE);
-      $a_return_parts = array_merge($a_return_parts, $parts);
+    if ($related_part!==NULL)
+    {
+      list($rel_parts, $attachmnts) = rcmail_parse_message($structure->parts[$related_part], $arg, TRUE);
       $a_attachments = array_merge($a_attachments, $attachmnts);
-      }
+    }
+    
+    // merge related parts if any
+    if ($rel_parts && $prefer_html && !$html_part)
+      $a_return_parts = array_merge($a_return_parts, $rel_parts);
 
-    // print html/plain part
+    // choose html/plain part to print
     else if ($html_part!==NULL && $prefer_html)
       $print_part = &$structure->parts[$html_part];
     else if ($enriched_part!==NULL)
@@ -898,7 +689,7 @@ function rcmail_parse_message(&$structure, $arg=array(), $recursive=FALSE)
       $a_return_parts[] = $print_part;
       }
     // show plaintext warning
-    else if ($html_part!==NULL)
+    else if ($html_part!==NULL && empty($a_return_parts))
       {
       $c = new stdClass;
       $c->type = 'content';
@@ -1128,8 +919,8 @@ function rcmail_message_body($attrib)
   $ctype_secondary = strtolower($MESSAGE['structure']->ctype_secondary);
   
   // list images after mail body
-  if (get_boolean($attrib['showimages']) && $ctype_primary=='multipart' && $ctype_secondary=='mixed' &&
-      sizeof($MESSAGE['attachments']) && !strstr($message_body, '<html') && strlen($GET_URL))
+  if (get_boolean($attrib['showimages']) && $ctype_primary=='multipart' &&
+      !empty($MESSAGE['attachments']) && !strstr($message_body, '<html') && strlen($GET_URL))
     {
     foreach ($MESSAGE['attachments'] as $attach_prop)
       {
@@ -1157,16 +948,21 @@ function rcmail_sanitize_html($body, $container_id)
   // remove any null-byte characters before parsing
   $body = preg_replace('/\x00/', '', $body);
   
+  $base_url = "";
   $last_style_pos = 0;
   $body_lc = strtolower($body);
   
+  // check for <base href>
+  if (preg_match(($base_reg = '/(<base.*href=["\']?)([hftps]{3,5}:\/{2}[^"\'\s]+)([^<]*>)/i'), $body, $base_regs))
+    $base_url = $base_regs[2];
+  
   // 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), $container_id, $base_url);
 
     $body = substr($body, 0, $pos) . $styles . substr($body, $pos2);
     $body_lc = strtolower($body);
@@ -1194,17 +990,15 @@ function rcmail_sanitize_html($body, $container_id)
     }
 
   // resolve <base href>
-  $base_reg = '/(<base.*href=["\']?)([hftps]{3,5}:\/{2}[^"\'\s]+)([^<]*>)/i';
-  if (preg_match($base_reg, $body, $regs))
+  if ($base_url)
     {
-    $base_url = $regs[2];
     $body = preg_replace('/(src|background|href)=(["\']?)([\.\/]+[^"\'\s]+)(\2|\s|>)/Uie', "'\\1=\"'.make_absolute_url('\\3', '$base_url').'\"'", $body);
     $body = preg_replace('/(url\s*\()(["\']?)([\.\/]+[^"\'\)\s]+)(\2)\)/Uie', "'\\1\''.make_absolute_url('\\3', '$base_url').'\')'", $body);
     $body = preg_replace($base_reg, '', $body);
     }
     
   // modify HTML links to open a new window if clicked
-  $body = preg_replace('/<a\s+([^>]+)>/Uie', "rcmail_alter_html_link('\\1');", $body);
+  $body = preg_replace('/<(a|link)\s+([^>]+)>/Uie', "rcmail_alter_html_link('\\1','\\2', '$container_id');", $body);
 
   // add comments arround html and other tags
   $out = preg_replace(array(
@@ -1216,11 +1010,16 @@ function rcmail_sanitize_html($body, $container_id)
     '<!--\\1-->',
     $body);
 
-  $out = preg_replace(array('/<body([^>]*)>/i',
-                            '/<\/body>/i'),
-                      array('<div class="rcmBody"\\1>',
-                            '</div>'),
-                      $out);
+  $out = preg_replace(
+    array(
+      '/<body([^>]*)>/i',
+      '/<\/body>/i',
+    ),
+    array(
+      '<div class="rcmBody"\\1>',
+      '</div>',
+    ),
+    $out);
 
   // quote <? of php and xml files that are specified as text/html
   $out = preg_replace(array('/<\?/', '/\?>/'), array('&lt;?', '?&gt;'), $out);
@@ -1230,44 +1029,24 @@ function rcmail_sanitize_html($body, $container_id)
 
 
 // parse link attributes and set correct target
-function rcmail_alter_html_link($in)
+function rcmail_alter_html_link($tag, $attrs, $container_id)
   {
   $in = preg_replace('/=([^("|\'|\s)]+)(\s|$)/', '="\1"', $in);
-  $attrib = parse_attrib_string($in);
-
-  if (stristr((string)$attrib['href'], 'mailto:'))
-    $attrib['onclick'] = sprintf("return %s.command('compose','%s',this)",
-                                 JS_OBJECT_NAME,
-                                 JQ(substr($attrib['href'], 7)));
-  else if (!empty($attrib['href']) && $attrib['href']{0}!='#')
-    $attrib['target'] = '_blank';
+  $attrib = parse_attrib_string($attrs);
   
-  return '<a' . create_attrib_string($attrib, array('href', 'name', 'target', 'onclick', 'id', 'class', 'style', 'title')) . '>';
-  }
-
-
-// replace all css definitions with #container [def]
-function rcmail_mod_css_styles($source, $container_id)
-  {
-  $a_css_values = array();
-  $last_pos = 0;
+  if ($tag == 'link' && preg_match('/^https?:\/\//i', $attrib['href']))
+    $attrib['href'] = "./bin/modcss.php?u=" . urlencode($attrib['href']) . "&amp;c=" . urlencode($container_id);
+
+  else if (stristr((string)$attrib['href'], 'mailto:'))
+    $attrib['onclick'] = sprintf(
+      "return %s.command('compose','%s',this)",
+      JS_OBJECT_NAME,
+      JQ(substr($attrib['href'], 7)));
   
-  // cut out all contents between { and }
-  while (($pos = strpos($source, '{', $last_pos)) && ($pos2 = strpos($source, '}', $pos)))
-    {
-    $key = sizeof($a_css_values);
-    $a_css_values[$key] = substr($source, $pos+1, $pos2-($pos+1));
-    $source = substr($source, 0, $pos+1) . "<<str_replacement[$key]>>" . substr($source, $pos2, strlen($source)-$pos2);
-    $last_pos = $pos+2;
-    }
-
-  // remove html commends 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', '/<<str_replacement\[([0-9]+)\]>>/e', "/$container_id\s+body/i"),
-                         array('', "\\1#$container_id \\2", "\$a_css_values[\\1]", "$container_id div.rcmBody"),
-                         $source);
+  else if (!empty($attrib['href']) && $attrib['href']{0}!='#')
+    $attrib['target'] = '_blank';
 
-  return $styles;
+  return "<$tag" . create_attrib_string($attrib, array('href','name','target','onclick','id','class','style','title','rel','type','media')) . ' />';
   }
 
 
@@ -1454,7 +1233,7 @@ function rcmail_message_part_frame($attrib)
   $part = $MESSAGE['parts'][$_GET['_part']];
   $ctype_primary = strtolower($part->ctype_primary);
 
-  $attrib['src'] = './?'.str_replace('_frame=', ($ctype_primary=='text' ? '_show=' : '_preload='), $_SERVER['QUERY_STRING']);
+  $attrib['src'] = Q('./?'.str_replace('_frame=', ($ctype_primary=='text' ? '_show=' : '_preload='), $_SERVER['QUERY_STRING']));
 
   $attrib_str = create_attrib_string($attrib, array('id', 'class', 'style', 'src', 'width', 'height'));
   $out = '<iframe '. $attrib_str . "></iframe>";
@@ -1492,4 +1271,4 @@ $OUTPUT->add_handlers(array(
   'searchform' => 'rcmail_search_form'
 ));
 
-?>
\ No newline at end of file
+?>
index 42b52bfeb24af252d0f8a121fdd013cf33a49884..91c1a30a583fa3c46df7ff38686cbe7c7bf744ae 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/get.inc                                            |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: get.inc 511 2007-03-19 22:36:24Z thomasb $
+ $Id: get.inc 884 2007-10-18 09:10:35Z thomasb $
 
 */
 
@@ -29,7 +29,7 @@ if ($_GET['_preload'])
   $message = rcube_label('loadingdata');
 
   print "<html>\n<head>\n" .
-        '<meta http-equiv="refresh" content="0; url='.htmlspecialchars($url).'">' .
+        '<meta http-equiv="refresh" content="0; url='.Q($url).'">' .
         "\n</head>\n<body>" .
         $message .
         "\n</body>\n</html>";
@@ -55,7 +55,7 @@ if ($_GET['_frame'])
 
 else if ($pid = get_input_value('_part', RCUBE_INPUT_GET))
   {
-  if ($part = $MESSAGE['parts'][$pid]);
+  if ($part = $MESSAGE['parts'][$pid])
     {
     $ctype_primary = strtolower($part->ctype_primary);
     $ctype_secondary = strtolower($part->ctype_secondary);
@@ -107,7 +107,7 @@ else if ($pid = get_input_value('_part', RCUBE_INPUT_GET))
     else
       {
       header(sprintf('Content-Disposition: %s; filename="%s";',
-                     $part->disposition ? $part->disposition : 'attachment',
+                     $_GET['_download'] ? 'attachment' : 'inline',
                      $part->filename ? $part->filename : "roundcube.$ctype_secondary"));
 
       // turn off output buffering and print part content
@@ -148,4 +148,4 @@ else
 header('HTTP/1.1 404 Not Found');
 exit;
 
-?>
\ No newline at end of file
+?>
index 41d0a6d5b1d05d95fbf09224669ab466d959bdbb..0650ebe0303c7999529d99652d857761bad7db55 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/getunread.inc                                      |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: getunread.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: getunread.inc 850 2007-10-03 00:13:32Z ihug $
 
 */
 
index e93e9f9c275fa3935720c816501900aab5b70902..2937f78de3a1ceca3e44247b27aa622074497d9f 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/list.inc                                           |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | 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 575 2007-05-18 12:35:28Z thomasb $
+ $Id: list.inc 850 2007-10-03 00:13:32Z ihug $
 
 */
 
@@ -58,9 +58,10 @@ $OUTPUT->command('set_unread_count', $mbox_name, $unseen);
 // add message rows
 if (isset($a_headers) && count($a_headers))
   rcmail_js_message_list($a_headers);
-
+else
+  $OUTPUT->show_message('nomessagesfound', 'notice');
   
 // send response
 $OUTPUT->send();
 
-?>
\ No newline at end of file
+?>
index 82e6e761140569f4e13ddb8a41e10c721c4b0dc9..ffe96fdad502ce6e3ddb6c777048435e9dfaaa88 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: move_del.inc 573 2007-05-18 11:29:25Z thomasb $
+ $Id: move_del.inc 848 2007-10-02 08:42:18Z thomasb $
 
 */
 
+// count messages before changing anything
+$old_count = $IMAP->messagecount();
+$old_pages = ceil($old_count / $IMAP->page_size);
+
 // move messages
 if ($_action=='moveto' && !empty($_POST['_uid']) && !empty($_POST['_target_mbox']))
 {
@@ -61,10 +65,22 @@ if (($search_request = get_input_value('_search', RCUBE_INPUT_GPC)) && $IMAP->se
   $_SESSION['search'][$search_request] = $IMAP->refresh_search();
 
 
-// update message count display
 $msg_count = $IMAP->messagecount();
 $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)
+{
+  $IMAP->set_page($IMAP->list_page-1);
+  $_SESSION['page'] = $IMAP->list_page;
+  $jump_back = true;
+}
+
+// update message count display
 $OUTPUT->set_env('pagecount', $pages);
+$OUTPUT->set_env('current_page', $IMAP->list_page);
 $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($msg_count));
 
 
@@ -78,13 +94,14 @@ if ($_action=='moveto' && $target)
 $OUTPUT->command('set_quota', $IMAP->get_quota());
 
 // add new rows from next page (if any)
-if ($_POST['_from']!='show' && $pages>1 && $IMAP->list_page < $pages)
+if ($_POST['_from']!='show' && ($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);
-  $a_headers = array_slice($a_headers, -$count, $count);
+  if (!$jump_back)
+    $a_headers = array_slice($a_headers, -$count, $count);
 
   rcmail_js_message_list($a_headers);
 }
index 295cf033e0bf8e629e03e9856da853f540b076a2..62f214a0fc9f5c34cd6141882b5ec30cc5ded66b 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/quotadisplay.inc                                   |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Robin Elfrink <robin@15augustus.nl>                           |
  +-----------------------------------------------------------------------+
 
- $Id: quotadisplay.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: quotadisplay.inc 850 2007-10-03 00:13:32Z ihug $
 
 */
 
index cba733e5153e7bd967516dd7d322de196e821c84..b32bfa491d130fdc995c18227f242db5d06b0db8 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/rss.inc                                            |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Sjon Hortensius <sjon@hortensius.net>                         |
  +-----------------------------------------------------------------------+
 
- $Id: rss.inc 320 2006-08-18 12:48:33Z thomasb $
+ $Id: rss.inc 850 2007-10-03 00:13:32Z ihug $
 
 */
 
@@ -114,4 +114,4 @@ echo '</channel>
 </rss>';
 
 exit;
-?>
\ No newline at end of file
+?>
index bef821b4072c9f43c333e71d6c64dbfe23adeef1..a3f6dda66cdf5524f95a9dc7e8874f1f6ae008d3 100644 (file)
@@ -78,7 +78,7 @@ if (is_array($result) && $result[0] != '')
 {
   // Get the headers
   $result_h = $IMAP->list_header_set($mbox, $result, 1, $_SESSION['sort_col'], $_SESSION['sort_order']);
-  $count = count($result_h);
+  $count = $IMAP->messagecount();
 
   // save search results in session
   if (!is_array($_SESSION['search']))
index 88510107a1f23a05ef5b919e4586b8926c2826ff..8ea5f13318eccebc677bd971e3986c840a5f4663 100644 (file)
@@ -16,7 +16,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: sendmail.inc 556 2007-05-13 18:25:52Z thomasb $
+ $Id: sendmail.inc 816 2007-09-26 08:13:21Z thomasb $
 
 */
 
@@ -186,7 +186,9 @@ $headers['Subject'] = trim(get_input_value('_subject', RCUBE_INPUT_POST, FALSE,
 if (!empty($identity_arr['organization']))
   $headers['Organization'] = $identity_arr['organization'];
 
-if (!empty($identity_arr['reply-to']))
+if (!empty($_POST['_replyto']))
+  $headers['Reply-To'] = preg_replace($mailto_regexp, $mailto_replace, 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']))
@@ -220,16 +222,8 @@ if (!empty($CONFIG['useragent']))
 $message_body = get_input_value('_message', RCUBE_INPUT_POST, TRUE, $message_charset);
 
 // append generic footer to all messages
-if (!empty($CONFIG['generic_message_footer']))
-  {
-  $file = realpath($CONFIG['generic_message_footer']);
-  if($fp = fopen($file, 'r'))
-    {
-    $content = fread($fp, filesize($file));
-    fclose($fp);
-    $message_body .= "\r\n" . rcube_charset_convert($content, 'UTF-8', $message_charset);
-    }
-  }
+if (!$savedraft && !empty($CONFIG['generic_message_footer']) && ($footer = file_get_contents(realpath($CONFIG['generic_message_footer']))))
+  $message_body .= "\r\n" . rcube_charset_convert($footer, 'UTF-8', $message_charset);
 
 // try to autodetect operating system and use the correct line endings
 // use the configured delimiter for headers
@@ -333,7 +327,7 @@ if (!$savedraft) {
   
     // send message
     $smtp_response = array();
-    $sent = smtp_mail($from, $a_recipients, $MAIL_MIME->txtHeaders($send_headers), $msg_body, $smtp_response);
+    $sent = smtp_mail($from, $a_recipients, ($foo = $MAIL_MIME->txtHeaders($send_headers)), $msg_body, $smtp_response);
   
     // log error
     if (!$sent)
index e35ff205f9ca2d8e4b589fc386199ae37fd1a01d..3033ea37f8dfea1d846c9411a879e53f4a37f5ae 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: show.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: show.inc 668 2007-08-10 08:27:40Z thomasb $
 
 */
 
@@ -48,7 +48,7 @@ if ($_GET['_uid'])
   // allow caching, unless remote images are present
   if ((bool)get_input_value('_safe', RCUBE_INPUT_GET))
     send_nocacheing_headers();
-  else
+  else if (empty($CONFIG['devel_mode']))
     send_modified_header($_SESSION['login_time'], $etag);
 
   $MESSAGE['subject'] = rcube_imap::decode_mime_string($MESSAGE['headers']->subject, $MESSAGE['headers']->charset);
index 0c8021bb402aac07d7f542fc81c82356854b215d..d318c4a2ef0dcc0e03d01de71fb2fb7d5f9743ad 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/spell.inc                                          |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -18,7 +18,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: spell.inc 321 2006-08-20 14:06:30Z thomasb $
+ $Id: spell.inc 850 2007-10-03 00:13:32Z ihug $
 
 */
 
@@ -61,4 +61,4 @@ if ($fp = fsockopen($host, $port, $errno, $errstr, 30))
 print $store;  
 exit;
 
-?>
\ No newline at end of file
+?>
index 2e9aac37ab87c8e221578c8c11cabb8151ec4a3d..693e01c680cdd5fa712e8b1784597d5c78baa139 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/upload.inc                                         |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: upload.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: upload.inc 850 2007-10-03 00:13:32Z ihug $
 
 */
 
index adc2f5495e1e983ea0c6f1f8afef49607f45336d..5f10a569352b49a46944f9865f058ca1b18d8115 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/viewsource.inc                                     |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: viewsource.inc 320 2006-08-18 12:48:33Z thomasb $
+ $Id: viewsource.inc 850 2007-10-03 00:13:32Z ihug $
 
 */
 
@@ -37,4 +37,4 @@ else
   }
 
 exit;
-?>
\ No newline at end of file
+?>
index e72198e23f6be0b61c6cdfbaa6360fa583ae97d3..31e0ccc6aaeaa619b5f47a7d28b10878ae6896ba 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: edit_identity.inc 579 2007-05-18 13:11:22Z thomasb $
+ $Id: edit_identity.inc 543 2007-04-28 18:07:12Z thomasb $
 
 */
 
@@ -46,7 +46,6 @@ function rcube_identity_form($attrib)
   {
   global $IDENTITY_RECORD, $OUTPUT;
 
-/*
   $OUTPUT->include_script('tiny_mce/tiny_mce_src.js');
   $OUTPUT->add_script("tinyMCE.init({ mode : 'specific_textareas'," .
                                     "apply_source_formatting : true," .
@@ -59,7 +58,7 @@ function rcube_identity_form($attrib)
                                     "theme_advanced_buttons1 : 'bold,italic,underline,strikethrough,justifyleft,justifycenter,justifyright,justifyfull,separator,outdent,indent,charmap,hr'," .
                                     "theme_advanced_buttons2 : 'link,unlink,code,forecolor,fontselect,fontsizeselect'," .
                                     "theme_advanced_buttons3 : '' });");
-*/
+
   if (!$IDENTITY_RECORD && $GLOBALS['_action']!='add-identity')
     return rcube_label('notfound');
 
@@ -77,8 +76,8 @@ function rcube_identity_form($attrib)
                        'organization' => array('type' => 'text'),
                        'reply-to'     => array('type' => 'text', 'label' => 'replyto'),
                        'bcc'          => array('type' => 'text'),
-                       'signature'       => array('type' => 'textarea', 'size' => "40", 'rows' => "4"),
-                   //  'html_signature'=>array('type' => 'checkbox', 'label' => 'htmlsignature', 'onclick' => 'return rcmail.toggle_editor(this, \'_signature\');'),
+                       'signature'       => array('type' => 'textarea', 'size' => "40", 'rows' => "6"),
+                       'html_signature'=>array('type' => 'checkbox', 'label' => 'htmlsignature', 'onclick' => 'return rcmail.toggle_editor(this, \'_signature\');'),
                        'standard'     => array('type' => 'checkbox', 'label' => 'setdefault'));
 
 
index 72e018384b915b6545a62453ac3b61e65f6628e7..7bac1f7d27ac2f6bc733e1fc1b578cda2a0b3c73 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: func.inc 579 2007-05-18 13:11:22Z thomasb $
+ $Id: func.inc 892 2007-10-20 21:47:11Z thomasb $
 
 */
 
@@ -26,7 +26,10 @@ $sql_result = $DB->query("SELECT username, mail_host FROM ".get_table_name('user
                           $_SESSION['user_id']);
                                  
 if ($USER_DATA = $DB->fetch_assoc($sql_result))
-  $OUTPUT->set_pagetitle(sprintf('%s %s@%s', rcube_label('settingsfor'), $USER_DATA['username'], $USER_DATA['mail_host']));
+{
+  $username = $USER_DATA['username'] . (!strpos($USER_DATA['username'], '@') ? '@'.$USER_DATA['mail_host'] : '');
+  $OUTPUT->set_pagetitle(sprintf('%s %s', rcube_label('settingsfor'), $username));
+}
 
 
 
@@ -34,7 +37,7 @@ function rcmail_user_prefs_form($attrib)
   {
   global $DB, $CONFIG, $sess_user_lang;
 
-  $no_override = is_array($CONFIG['dont_override']) ? array_flip($CONFIG['dont_override']) : array();
+  $no_override = !empty($CONFIG['dont_override']) ? array_flip((array)$CONFIG['dont_override']) : array('preview_pane'=>true);
 
   // add some labels to client
   rcube_add_label('nopagesizewarning');
@@ -97,7 +100,7 @@ function rcmail_user_prefs_form($attrib)
     $select_timezone->add('(GMT +8:00) Beijing, Perth, Singapore, Taipei', '8');
     $select_timezone->add('(GMT +9:00) Tokyo, Seoul, Yakutsk', '9');
     $select_timezone->add('(GMT +9:30) Adelaide, Darwin', '9.5');
-    $select_timezone->add('(GMT +10:00) EAST/AEST: Guam, Vladivostok', '10');
+    $select_timezone->add('(GMT +10:00) EAST/AEST: Sydney, Guam, Vladivostok', '10');
     $select_timezone->add('(GMT +11:00) Magadan, Solomon Islands', '11');
     $select_timezone->add('(GMT +12:00) Auckland, Wellington, Kamchatka', '12');
     $select_timezone->add('(GMT +13:00) Tonga, Pheonix Islands', '13');
@@ -158,7 +161,7 @@ function rcmail_user_prefs_form($attrib)
     }
 
   // Show checkbox for HTML Editor
-  if (false && !isset($no_override['htmleditor']))
+  if (!isset($no_override['htmleditor']) && $CONFIG['enable_htmleditor'])
     {
     $field_id = 'rcmfd_htmleditor';
     $input_htmleditor = new checkbox(array('name' => '_htmleditor', 'id' => $field_id, 'value' => 1));
@@ -169,7 +172,7 @@ function rcmail_user_prefs_form($attrib)
     }
 
   // show config parameter for preview pane
-  if (false && !isset($no_override['preview_pane']))
+  if (!isset($no_override['preview_pane']))
     {
     $field_id = 'rcmfd_preview';
     $input_preview = new checkbox(array('name' => '_preview_pane', 'id' => $field_id, 'value' => 1));
@@ -272,4 +275,4 @@ $OUTPUT->add_handlers(array(
 ));
 
 
-?>
\ No newline at end of file
+?>
index a3330216aa59293fdd21df56f214f4492138a104..061fdf56d334e4e5bbc9795ee47c27f849e6f764 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: manage_folders.inc 573 2007-05-18 11:29:25Z thomasb $
+ $Id: manage_folders.inc 887 2007-10-19 12:24:04Z robin $
 
 */
 
 // init IMAP connection
 rcmail_imap_init(TRUE);
 
+$OUTPUT->include_script('list.js');
+
 
 // subscribe to one or more mailboxes
 if ($_action=='subscribe')
   {
   if ($mboxes = get_input_value('_mboxes', RCUBE_INPUT_POST))
-    $IMAP->subscribe(array($mboxes));
+    $IMAP->subscribe($mboxes);
 
   if ($OUTPUT->ajax_call)
     $OUTPUT->remote_response('// subscribed');
@@ -37,7 +39,7 @@ if ($_action=='subscribe')
 else if ($_action=='unsubscribe')
   {
   if ($mboxes = get_input_value('_mboxes', RCUBE_INPUT_POST))
-    $IMAP->unsubscribe(array($mboxes));
+    $IMAP->unsubscribe($mboxes);
 
   if ($OUTPUT->ajax_call)
     $OUTPUT->remote_response('// unsubscribed');
@@ -51,7 +53,10 @@ else if ($_action=='create-folder')
 
   if ($create && $OUTPUT->ajax_call)
     {
-    $OUTPUT->command('add_folder_row', $create, rcube_charset_convert($create, 'UTF-7'));
+    $delimiter = $IMAP->get_hierarchy_delimiter();
+    $foldersplit = explode($delimiter, $create);
+    $display_create = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', substr_count($create, $delimiter)) . rcube_charset_convert($foldersplit[count($foldersplit)-1], 'UTF-7');
+    $OUTPUT->command('add_folder_row', $create, $display_create);
     $OUTPUT->send();
     }
   else if (!$create && $OUTPUT->ajax_call)
@@ -66,12 +71,28 @@ else if ($_action=='create-folder')
 // rename a mailbox
 else if ($_action=='rename-folder')
   {
+  $a_mboxes = array_unique(array_merge($IMAP->list_mailboxes(), $IMAP->list_unsubscribed()));
+  $delimiter = $IMAP->get_hierarchy_delimiter();
+
   if (!empty($_POST['_folder_oldname']) && !empty($_POST['_folder_newname']))
     $rename = $IMAP->rename_mailbox(($oldname = get_input_value('_folder_oldname', RCUBE_INPUT_POST)), trim(get_input_value('_folder_newname', RCUBE_INPUT_POST, FALSE, 'UTF-7')));
     
   if ($rename && $OUTPUT->ajax_call)
     {
-    $OUTPUT->command('replace_folder_row', $oldname, $rename, rcube_charset_convert($rename, 'UTF-7'));
+    $delimiter = $IMAP->get_hierarchy_delimiter();
+    $foldersplit = explode($delimiter, $rename);
+    $level = count($foldersplit) - 1;
+    $display_rename = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) . rcube_charset_convert($foldersplit[$level], 'UTF-7');
+    $OUTPUT->command('replace_folder_row', $oldname, $rename, $display_rename);
+    foreach ($a_mboxes as $mbox)
+      if (preg_match('/^'.preg_quote($oldname.$delimiter).'/', $mbox))
+        {
+        $c_rename = preg_replace('/^'.preg_quote($oldname).'/', $rename, $mbox);
+        $foldersplit = explode($delimiter, $c_rename);
+        $level = count($foldersplit) - 1;
+        $display_rename = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) . rcube_charset_convert($foldersplit[$level], 'UTF-7');
+        $OUTPUT->command('replace_folder_row', $mbox, $c_rename, $display_rename);
+        }
     $OUTPUT->command('reset_folder_rename');
     $OUTPUT->send();
     }
@@ -88,12 +109,18 @@ else if ($_action=='rename-folder')
 // delete an existing IMAP mailbox
 else if ($_action=='delete-folder')
   {
+  $a_mboxes = array_merge($IMAP->list_mailboxes(), $IMAP->list_unsubscribed());
+  $delimiter = $IMAP->get_hierarchy_delimiter();
+
   if ($mboxes = get_input_value('_mboxes', RCUBE_INPUT_POST))
     $deleted = $IMAP->delete_mailbox(array($mboxes));
 
   if ($OUTPUT->ajax_call && $deleted)
     {
     $OUTPUT->command('remove_folder_row', get_input_value('_mboxes', RCUBE_INPUT_POST));
+    foreach ($a_mboxes as $mbox)
+      if (preg_match('/^'.preg_quote(get_input_value('_mboxes', RCUBE_INPUT_POST).$delimiter).'/', $mbox))
+        $OUTPUT->command('remove_folder_row', $mbox);
     $OUTPUT->show_message('folderdeleted', 'confirmation');
     $OUTPUT->send();
     }
@@ -138,6 +165,7 @@ function rcube_subscription_form($attrib)
 
   $a_unsubscribed = $IMAP->list_unsubscribed();
   $a_subscribed = $IMAP->list_mailboxes();
+  $delimiter = $IMAP->get_hierarchy_delimiter();
   $a_js_folders = array();
  
   $checkbox_subscribe = new checkbox(array('name' => '_subscribed[]', 'onclick' => JS_OBJECT_NAME.".command(this.checked?'subscribe':'unsubscribe',this.value)"));
@@ -159,7 +187,10 @@ function rcube_subscription_form($attrib)
     $protected = ($CONFIG['protect_default_folders'] == TRUE && in_array($folder,$CONFIG['default_imap_folders']));
     $zebra_class = $i%2 ? 'even' : 'odd';
     $folder_js = JQ($folder);
-    $folder_html = $CONFIG['protect_default_folders'] && in_array($folder, $CONFIG['default_imap_folders']) ? rcube_label(strtolower($folder)) : rcube_charset_convert($folder, 'UTF-7');
+    $foldersplit = explode($delimiter, $folder);
+    $level = count($foldersplit) - 1;
+    $display_folder = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) . rcube_charset_convert($foldersplit[$level], 'UTF-7');
+    $folder_html = $CONFIG['protect_default_folders'] && in_array($folder, $CONFIG['default_imap_folders']) ? rcube_label(strtolower($folder)) : $display_folder;
     
     if (!$protected)
       $a_js_folders['rcmrow'.($i+1)] = array($folder, rcube_charset_convert($folder, 'UTF-7'));
@@ -176,14 +207,10 @@ function rcube_subscription_form($attrib)
 
     // add rename and delete buttons
     if (!$protected)
-      $out .= sprintf('<td><a href="#rename" onclick="%s.command(\'rename-folder\',\'%s\')" title="%s">%s</a>'.
-                      '<td><a href="#delete" onclick="%s.command(\'delete-folder\',\'%s\')" title="%s">%s</a></td>',
-                      JS_OBJECT_NAME,
-                      $folder_js,
+      $out .= sprintf('<td><a href="#rename" title="%s">%s</a>'.
+                      '<td><a href="#delete" title="%s">%s</a></td>',
                       rcube_label('renamefolder'),
                       $edit_button,
-                      JS_OBJECT_NAME,
-                      $folder_js,
                       rcube_label('deletefolder'),
                       $del_button);
     else
@@ -197,6 +224,8 @@ function rcube_subscription_form($attrib)
 
   $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 $out;  
   }
index 0f073b334ca21b1cebc4a6c374bf1a4f7d22d601..9b65af02dac3a736b63fb606ae2cde58cd9562ab 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: save_prefs.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: save_prefs.inc 768 2007-09-01 14:55:10Z till $
 
 */
 
@@ -42,6 +42,16 @@ if (isset($_POST['_language']))
   rcmail_set_locale($sess_user_lang);
   }
 
+// force min size
+if ($a_user_prefs['pagesize'] < 1)
+  {
+  $a_user_prefs['pagesize'] = 10;
+  }
+if (isset($CONFIG['max_pagesize']) && ($a_user_prefs['pagesize'] > $CONFIG['max_pagesize']))
+  {
+  $a_user_prefs['pagesize'] = (int) $CONFIG['max_pagesize'];
+  }
+
 if (rcmail_save_user_prefs($a_user_prefs))
   $OUTPUT->show_message('successfullysaved', 'confirmation');
 
diff --git a/skins/default/colorpicker.css b/skins/default/colorpicker.css
new file mode 100644 (file)
index 0000000..4b0360b
--- /dev/null
@@ -0,0 +1,53 @@
+/* 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
old mode 100755 (executable)
new mode 100644 (file)
index 32105ef..c7743e8
@@ -378,8 +378,9 @@ html>body*#quicksearchbar[id$="quicksearchbar"]:not([class="none"]) #quicksearch
   padding-top: 3px;
   padding-bottom: 3px;
   font-size: 11px;
-  opacity: 0.6;
-  -moz-opacity: 0.6;
+  opacity: 0.7;
+  -moz-opacity: 0.7;
+  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=70);
 }
 
 a.rcmContactAddress
diff --git a/skins/default/editor_content.css b/skins/default/editor_content.css
new file mode 100644 (file)
index 0000000..182e791
--- /dev/null
@@ -0,0 +1,58 @@
+/* This file contains the CSS data for the editable area(iframe) of TinyMCE */\r
+/* You can extend this CSS by adding your own CSS file with the the content_css option */\r
+\r
+body, td, pre {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+}\r
+\r
+body {\r
+       background-color: #FFFFFF;\r
+}\r
+\r
+.mceVisualAid {\r
+       border: 1px dashed #BBBBBB !important;\r
+}\r
+\r
+div.mceVisualAid {\r
+       background-image:url('../images/spacer.gif');\r
+       visibility: visible !important;\r
+}\r
+\r
+.mceItemAnchor {\r
+       width: 12px;\r
+       line-height: 6px;\r
+       overflow: hidden;\r
+       padding-left: 12px;\r
+       background-image: url('../images/anchor_symbol.gif');\r
+       background-position: bottom;\r
+       background-repeat: no-repeat;\r
+}\r
+\r
+/* Important is needed in Gecko browsers inorder to style links */\r
+/*\r
+a {\r
+       color: green !important;\r
+}\r
+*/\r
+\r
+/* Style selection range colors in Gecko browsers */\r
+/*\r
+::-moz-selection {\r
+       background-color: red;\r
+       color: green;\r
+}\r
+*/\r
+\r
+/* MSIE specific */\r
+\r
+* html body {\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/skins/default/editor_popup.css b/skins/default/editor_popup.css
new file mode 100644 (file)
index 0000000..f8d3550
--- /dev/null
@@ -0,0 +1,331 @@
+/* This file contains the CSS data for all popups in TinyMCE */\r
+\r
+body {\r
+       background-color: #F0F0EE;\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 11px;\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
+       margin: 8px;\r
+}\r
+\r
+td {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 11px;\r
+}\r
+\r
+input {\r
+       background: #FFFFFF;\r
+       border: 1px solid #cccccc;\r
+}\r
+\r
+td, input, select, textarea {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+}\r
+\r
+input, select, textarea {\r
+       border: 1px solid #808080;\r
+}\r
+\r
+.input_noborder {\r
+       border: 0;\r
+}\r
+\r
+#insert, .updateButton {\r
+   font-weight: bold;\r
+   width: 90px;\r
+   height: 21px;\r
+   border: 0;\r
+   background-image: url('../images/insert_button_bg.gif');\r
+   cursor: pointer;\r
+}\r
+\r
+#cancel {\r
+   font-weight: bold;\r
+   width: 90px;\r
+   height: 21px;\r
+   border: 0;\r
+   background-image: url('../images/cancel_button_bg.gif');\r
+   cursor: pointer;\r
+}\r
+\r
+/* Mozilla only style */\r
+html>body #insert, html>body #cancel {\r
+       padding-bottom: 2px;\r
+}\r
+\r
+.title {\r
+       font-size: 12px;\r
+       font-weight: bold;\r
+       color: #2B6FB6;\r
+}\r
+\r
+table.charmap {\r
+       border-style: solid;\r
+       border-width: 1px;\r
+       border-color: #AAAAAA;\r
+}\r
+\r
+td.charmap, td.charmapOver {\r
+       color: #000000;\r
+       border-color: #AAAAAA;\r
+       border-style: solid;\r
+       border-width: 1px;\r
+       text-align: center;\r
+       font-size: 12px;\r
+}\r
+\r
+td.charmapOver {\r
+       background-color: #CCCCCC;\r
+       cursor: default;\r
+}\r
+\r
+a.charmap {\r
+       color: #000000;\r
+       text-decoration: none\r
+}\r
+\r
+.wordWrapCode {\r
+       vertical-align: middle;\r
+       border: 1px none #000000;\r
+       background-color: transparent;\r
+}\r
+\r
+input.radio {\r
+       border: 1px none #000000;\r
+       background-color: transparent;\r
+       vertical-align: middle;\r
+}\r
+\r
+input.checkbox {\r
+       border: 1px none #000000;\r
+       background-color: transparent;\r
+       vertical-align: middle;\r
+}\r
+\r
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {\r
+       margin-left: 1px;\r
+}\r
+\r
+.mceButtonNormal {\r
+       border-top: 1px solid;\r
+       border-left: 1px solid;\r
+       border-bottom: 1px solid;\r
+       border-right: 1px solid;\r
+       border-color: #F0F0EE;\r
+       cursor: default;\r
+}\r
+\r
+.mceButtonOver {\r
+       border: 1px solid #0A246A;\r
+       cursor: default;\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+.mceButtonDown {\r
+       cursor: default;\r
+       border: 1px solid #0A246A;\r
+       background-color: #8592B5;\r
+}\r
+\r
+.mceButtonDisabled {\r
+       filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);\r
+       -moz-opacity:0.3;\r
+       opacity: 0.3;\r
+       border-top: 1px solid;\r
+       border-left: 1px solid;\r
+       border-bottom: 1px solid;\r
+       border-right: 1px solid;\r
+       border-color: #F0F0EE;\r
+       cursor: default;\r
+}\r
+\r
+.mceActionPanel {\r
+       margin-top: 5px;\r
+}\r
+\r
+/* Tabs classes */\r
+\r
+.tabs {\r
+       float: left;\r
+       width: 100%;\r
+       line-height: normal;\r
+       background-image: url("../images/xp/tabs_bg.gif");\r
+}\r
+\r
+.tabs ul {\r
+       margin: 0;\r
+       padding: 0 0 0;\r
+       list-style: none;\r
+}\r
+\r
+.tabs li {\r
+       float: left;\r
+       background: url("../images/xp/tab_bg.gif") no-repeat left top;\r
+       margin: 0;\r
+       margin-left: 0;\r
+       margin-right: 2px;\r
+       padding: 0 0 0 10px;\r
+       line-height: 18px;\r
+}\r
+\r
+.tabs li.current {\r
+       background: url("../images/xp/tab_sel_bg.gif") no-repeat left top;\r
+       margin-right: 2px;\r
+}\r
+\r
+.tabs span {\r
+       float: left;\r
+       display: block;\r
+       background: url("../images/xp/tab_end.gif") no-repeat right top;\r
+       padding: 0px 10px 0 0;\r
+}\r
+\r
+.tabs .current span {\r
+       background: url("../images/xp/tab_sel_end.gif") no-repeat right top;\r
+}\r
+\r
+.tabs a {\r
+       text-decoration: none;\r
+       font-family: Verdana, Arial;\r
+       font-size: 10px;\r
+}\r
+\r
+.tabs a:link, .tabs a:visited, .tabs a:hover {\r
+       color: black;\r
+}\r
+\r
+.tabs a:hover {\r
+}\r
+\r
+.tabs .current {\r
+}\r
+\r
+.tabs .current a, .tabs .current a:link, .tabs .current a:visited {\r
+}\r
+\r
+.panel_wrapper div.panel {\r
+       display: none;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       display: block;\r
+       width: 100%;\r
+       height: 300px;\r
+       overflow: visible; /* Should be auto but that breaks Safari */\r
+}\r
+\r
+.panel_wrapper {\r
+       border: 1px solid #919B9C;\r
+       border-top: 0px;\r
+       padding: 10px;\r
+       padding-top: 5px;\r
+       clear: both;\r
+       background-color: white;\r
+}\r
+\r
+fieldset {\r
+       border: 1px solid #919B9C;\r
+       font-family: Verdana, Arial;\r
+       font-size: 10px;\r
+       padding: 0;\r
+       margin: 0;\r
+       padding: 4px;\r
+}\r
+\r
+legend {\r
+       color: #2B6FB6;\r
+       font-weight: bold;\r
+}\r
+\r
+.properties {\r
+       width: 100%;\r
+}\r
+\r
+.properties .column1 {\r
+}\r
+\r
+.properties .column2 {\r
+       text-align: left;\r
+}\r
+\r
+a:link, a:visited {\r
+       color: black;\r
+}\r
+\r
+a:hover {\r
+       color: #2B6FB6;\r
+}\r
+\r
+#plugintable thead {\r
+       font-weight: bold;\r
+       background-color: #DDDDDD;\r
+}\r
+\r
+#plugintable, #about #plugintable td {\r
+       border: 1px solid #919B9C;\r
+}\r
+\r
+#plugintable {\r
+       width: 99%;\r
+       margin-top: 10px;\r
+}\r
+\r
+#pluginscontainer {\r
+       height: 290px;\r
+       overflow: auto;\r
+}\r
+\r
+/* MSIE Specific styles */\r
+\r
+* html .panel_wrapper {\r
+       width: 100%;\r
+}\r
+\r
+.column {\r
+       float: left;\r
+}\r
+\r
+h1, h2, h3, h4 {\r
+       color: #2B6FB6;\r
+       margin: 0;\r
+       padding: 0;\r
+       padding-top: 5px;\r
+}\r
+\r
+h3 {\r
+       font-size: 14px;\r
+}\r
+\r
+#link .panel_wrapper, #link div.current {\r
+       height: 125px;\r
+}\r
+\r
+#image .panel_wrapper, #image div.current {\r
+       height: 190px;\r
+}\r
+\r
+label.msg { display: none; }\r
+label.invalid { color: #EE0000; display: inline; }\r
+input.invalid { border: 1px solid #EE0000; }\r
+\r
+/* Disables the advanced tab in the table plugin. */\r
+/*\r
+#table #advanced_tab {\r
+       display: none;\r
+}\r
+*/\r
+\r
+/* Disables the border input field and label in the table plugin. */\r
+/*\r
+#table #border, #table #borderlabel {\r
+       display: none;\r
+}\r
+*/\r
diff --git a/skins/default/editor_ui.css b/skins/default/editor_ui.css
new file mode 100644 (file)
index 0000000..851837d
--- /dev/null
@@ -0,0 +1,97 @@
+/* This file contains the CSS data for the editor UI of TinyMCE instances */\r
+\r
+.mceToolbarTop a, .mceToolbarTop a:visited, .mceToolbarTop a:hover, .mceToolbarBottom a, .mceToolbarBottom a:visited, .mceToolbarBottom a:hover {border: 0; margin: 0; padding: 0; background: transparent;}\r
+.mceSeparatorLine {border: 0; padding: 0; margin-left: 4px; margin-right: 2px;}\r
+.mceSelectList {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 7pt !important; font-weight: normal; margin-top: 3px; padding: 0; display: inline; vertical-align: top; background-color: #F0F0EE;}\r
+.mceLabel, .mceLabelDisabled {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt;}\r
+.mceLabel {color: #000000;}\r
+.mceLabelDisabled {cursor: text; color: #999999;}\r
+.mceEditor {background: #F0F0EE; border: 1px solid #cccccc; padding: 0; margin: 0;}\r
+.mceEditorArea { font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; background: #FFFFFF; padding: 0; margin: 0; }\r
+.mceToolbarTop, .mceToolbarBottom {background: #F0F0EE; line-height: 1px; font-size: 1px;}\r
+.mceToolbarTop {border-bottom: 1px solid #cccccc; padding-bottom: 1px;}\r
+.mceToolbarBottom {border-top: 1px solid #cccccc;}\r
+.mceToolbarContainer {display: block; position: relative; left: 0; top: 0; width: 100%;}\r
+.mceStatusbarTop, .mceStatusbarBottom, .mceStatusbar {height: 20px;}\r
+.mceStatusbarTop .mceStatusbarPathText, .mceStatusbarBottom .mceStatusbarPathText, .mceStatusbar .mceStatusbarPathText {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt; padding: 2px; line-height: 16px; overflow: visible;}\r
+.mceStatusbarTop {border-bottom: 1px solid #cccccc;}\r
+.mceStatusbarBottom {border-top: 1px solid #cccccc;}\r
+.mceStatusbar {border-bottom: 1px solid #cccccc;}\r
+.mcePathItem, .mcePathItem:link, .mcePathItem:visited, .mcePathItem:hover {text-decoration: none; font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt; color: #000000;}\r
+.mcePathItem:hover {text-decoration: underline;}\r
+.mceStatusbarPathText {float: left;}\r
+.mceStatusbarResize {float: right; background-image: url('../images/statusbar_resize.gif'); background-repeat: no-repeat; width: 11px; height: 20px; cursor: se-resize;}\r
+.mceResizeBox {width: 10px; height: 10px; display: none; border: 1px dotted gray; margin: 0; padding: 0;}\r
+.mceEditorIframe {border: 0;}\r
+\r
+/* Button CSS rules */\r
+\r
+a.mceButtonDisabled img, a.mceButtonNormal img, a.mceButtonSelected img {width: 20px; height: 20px; cursor: default; margin-top: 1px; margin-left: 1px;}\r
+a.mceButtonDisabled img {border: 0 !important;}\r
+a.mceButtonNormal img, a.mceButtonSelected img {border: 1px solid #F0F0EE !important;}\r
+a.mceButtonSelected img {border: 1px solid #6779AA !important; background-color: #D4D5D8;}\r
+a.mceButtonNormal img:hover, a.mceButtonSelected img:hover {border: 1px solid #0A246A !important; cursor: default; background-color: #B6BDD2;}\r
+a.mceButtonDisabled img {-moz-opacity:0.3; opacity: 0.3; border: 1px solid #F0F0EE !important; cursor: default;}\r
+a.mceTiledButton img {background-image: url('../images/buttons.gif'); background-repeat: no-repeat;}\r
+\r
+/* Menu button CSS rules */\r
+\r
+span.mceMenuButton img, span.mceMenuButtonSelected img {border: 1px solid #F0F0EE; margin-left: 1px;}\r
+span.mceMenuButtonSelected img {border: 1px solid #6779AA; background-color: #B6BDD2;}\r
+span.mceMenuButtonSelected img.mceMenuButton {border: 1px solid #F0F0EE; background-color: transparent;}\r
+span.mceMenuButton img.mceMenuButton, span.mceMenuButtonSelected img.mceMenuButton {border-left: 0; margin-left: 0;}\r
+span.mceMenuButton:hover img, span.mceMenuButtonSelected:hover img {border: 1px solid #0A246A; background-color: #B6BDD2;}\r
+span.mceMenuButton:hover img.mceMenuButton, span.mceMenuButtonSelected:hover img.mceMenuButton {border-left: 0;}\r
+span.mceMenuButtonFocus img {border: 1px solid gray; border-right: 0; margin-left: 1px; background-color: #F5F4F2;}\r
+span.mceMenuButtonFocus img.mceMenuButton {border: 1px solid gray; border-left: 1px solid #F5F4F2; margin-left: 0;}\r
+span.mceMenuHover img {border: 1px solid #0A246A; background-color: #B6BDD2;}\r
+span.mceMenuButtonSelected.mceMenuHover img.mceMenuButton {border: 1px solid #0A246A; background-color: #B6BDD2; border-left: 0;}\r
+\r
+/* Menu */\r
+\r
+.mceMenu {position: absolute; left: 0; top: 0; display: none; z-index: 1000; background-color: white; border: 1px solid gray; font-weight: normal;}\r
+.mceMenu a, .mceMenuTitle, .mceMenuDisabled {display: block; width: 100%; text-decoration: none; background-color: white; font-family: Tahoma, Verdana, Arial, Helvetica; font-size: 11px; line-height: 20px; color: black;}\r
+.mceMenu a:hover {background-color: #B6BDD2; color: black; text-decoration: none !important;}\r
+.mceMenu span {padding-left: 10px; padding-right: 10px; display: block; line-height: 20px;}\r
+.mceMenuSeparator {border-bottom: 1px solid gray; background-color: gray; height: 1px;}\r
+.mceMenuTitle span {padding-left: 5px;}\r
+.mceMenuTitle {background-color: #DDDDDD; font-weight: bold;}\r
+.mceMenuDisabled {color: gray;}\r
+span.mceMenuSelectedItem {background-image: url('../images/menu_check.gif'); background-repeat: no-repeat; background-position: 5px 8px; padding-left: 20px;}\r
+span.mceMenuCheckItem {padding-left: 20px;}\r
+span.mceMenuLine {display: block; position: absolute; left: 0; top: -1px; background-color: #F5F4F2; width: 30px; height: 1px; overflow: hidden; padding-left: 0; padding-right: 0;}\r
+.mceColors table, .mceColors td {margin: 0; padding: 2px;}\r
+a.mceMoreColors {width: auto; padding: 0; margin: 0 3px 3px 3px; text-align: center; border: 1px solid white; text-decoration: none !important;}\r
+.mceColorPreview {position: absolute; overflow:hidden; left: 0; top: 0; margin-left: 3px; margin-top: 15px; width: 16px; height: 4px; background-color: red;}\r
+a.mceMoreColors:hover {border: 1px solid #0A246A;}\r
+.mceColors td a {width: 9px; height: 9px; overflow: hidden; border: 1px solid #808080;}\r
+\r
+/* MSIE 6 specific rules */\r
+\r
+* html a.mceButtonNormal img, * html a.mceButtonSelected img, * html a.mceButtonDisabled img {border: 0 !important; margin-top: 2px; margin-bottom: 1px;}\r
+* html a.mceButtonDisabled img {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); border: 0 !important;}\r
+* html a.mceButtonDisabled {border: 1px solid #F0F0EE !important;}\r
+* html a.mceButtonNormal, * html a.mceButtonSelected {border: 1px solid #F0F0EE !important; cursor: default;}\r
+* html a.mceButtonSelected {border: 1px solid #6779AA !important; background-color: #D4D5D8;}\r
+* html a.mceButtonNormal:hover, * html a.mceButtonSelected:hover {border: 1px solid #0A246A !important; background-color: #B6BDD2; cursor: default;}\r
+* html .mceSelectList {margin-top: 2px;}\r
+* html span.mceMenuButton, * html span.mceMenuButtonFocus {position: relative; left: 0; top: 0;}\r
+* html span.mceMenuButton img, * html span.mceMenuButtonSelected img, * html span.mceMenuButtonFocus img {position: relative; top: 1px;}\r
+* html a.mceMoreColors {width: auto;}\r
+* html .mceColors td a {width: 10px; height: 10px;}\r
+* html .mceColorPreview {margin-left: 2px; margin-top: 14px;}\r
+\r
+/* MSIE 7 specific rules */\r
+\r
+*:first-child+html a.mceButtonNormal img, *:first-child+html a.mceButtonSelected img, *:first-child+html a.mceButtonDisabled img {border: 0 !important; margin-top: 2px; margin-bottom: 1px;}\r
+*:first-child+html a.mceButtonDisabled img {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); border: 0 !important;}\r
+*:first-child+html a.mceButtonDisabled {border: 1px solid #F0F0EE !important;}\r
+*:first-child+html a.mceButtonNormal, *:first-child+html a.mceButtonSelected {border: 1px solid #F0F0EE !important; cursor: default;}\r
+*:first-child+html a.mceButtonSelected {border: 1px solid #6779AA !important; background-color: #D4D5D8;}\r
+*:first-child+html a.mceButtonNormal:hover, *:first-child+html a.mceButtonSelected:hover {border: 1px solid #0A246A !important; background-color: #B6BDD2; cursor: default;}\r
+*:first-child+html .mceSelectList {margin-top: 2px;}\r
+*:first-child+html span.mceMenuButton, *:first-child+html span.mceMenuButtonFocus {position: relative; left: 0; top: 0;}\r
+*:first-child+html span.mceMenuButton img, *:first-child+html span.mceMenuButtonSelected img, *:first-child+html span.mceMenuButtonFocus img {position: relative; top: 1px;}\r
+*:first-child+html a.mceMoreColors {width: 137px;}\r
+*:first-child+html .mceColors td a {width: 10px; height: 10px;}\r
+*:first-child+html .mceColorPreview {margin: 0; padding-left: 4px; margin-top: 14px; width: 14px;}\r
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index a406e423a7c00e33895cb114d5612bfe80ac4116..fb130ce6c4af724c6e108bfe910d5c62da842e39 100644 (file)
@@ -6,7 +6,7 @@
   position: absolute;
   top: 45px;
   left: 200px;
-  right: 250px;
+  right: 200px;
   height: 35px;
   white-space: nowrap;
 /*  border: 1px solid #cccccc; */
@@ -56,7 +56,9 @@
 #listcontrols a:visited,
 #mailboxcontrols a,
 #mailboxcontrols a:active,
-#mailboxcontrols a:visited
+#mailboxcontrols a:visited,
+td.formlinks a,
+td.formlinks a:visited
 {
   color: #999999;
   font-size: 11px;
@@ -68,7 +70,9 @@
 #listcontrols a.active:visited,
 #mailboxcontrols a.active,
 #mailboxcontrols a.active:active,
-#mailboxcontrols a.active:visited
+#mailboxcontrols a.active:visited,
+td.formlinks a,
+td.formlinks a:visited
 {
   color: #CC0000;
 }
 
 #messagecontframe
 {
-  width: 100%;
-  height: 100%;
-  border: 0;
-}
-
-/*\*/
-html>body*#messagecontframe
-{
-  [height: 40%;
-  height: 40%;
-  ]height: 100%;
+  position: absolute;
+  top: 0px;
+  left: 0px;
+  right: 0px;
+  bottom: 0px;
+  /* css hack for IE */
+  width: expression((parseInt(document.documentElement.clientWidth)-230)+'px');
+  height: expression((parseInt(document.documentElement.clientHeight)-135-document.getElementById('mailcontframe').offsetHeight)+'px');
 }
-/**/
 
 #messagepartframe
 {
@@ -191,16 +191,12 @@ html>body*#messagecontframe
 
 #mailboxlist-header
 {
-  position: absolute;
-  top: 85px;
-  left: 20px;
-  width: 145px !important;
-/*  width: 162px; */
-  height: 13px;
-  padding: 3px 10px 2px 10px;
+  display: block;
+  height: 12px;
+  padding: 3px 10px 4px 10px;
   background-color: #EBEBEB;
   background-image: url(images/listheader_aqua.gif); 
-  border: 1px solid #CCCCCC;
+  border-bottom: 1px solid #999;
   color: #333333;
   font-size: 11px;
   font-weight: bold;  
@@ -209,15 +205,15 @@ html>body*#messagecontframe
 #mailboxlist-container
 {
   position: absolute;
-  top: 105px;
+  top: 85px;
   left: 20px;
-  width: 165px;
+  width: 160px;
   bottom: 40px;
-  border: 1px solid #CCCCCC;
+  border: 1px solid #999;
   background-color: #F9F9F9;
   overflow: auto;
   /* css hack for IE */
-  height: expression((parseInt(document.documentElement.clientHeight)-145)+'px');
+  height: expression((parseInt(document.documentElement.clientHeight)-125)+'px');
 }
 
 #mailboxlist
@@ -286,10 +282,10 @@ html>body*#messagecontframe
   font-weight: bold;
 }
 
-#mailboxlist li.selected
+#mailboxlist li.selected,
+#mailboxlist li.droptarget li.selected
 {
   background-color: #929292;
-  border-bottom: 1px solid #898989;
 }
 
 #mailboxlist li.selected a
@@ -316,7 +312,8 @@ html>body*#messagecontframe
   background-position: 25px 1px;
 }
 
-#mailboxlist li.selected li {
+#mailboxlist li.selected li,
+#mailboxlist li.droptarget li {
   background-color: #F9F9F9;
 }
 
@@ -338,7 +335,7 @@ html>body*#messagecontframe
 {
   position: absolute;
   left: 20px;
-  width: 160px;
+  width: 170px;
   bottom: 20px;
   height: 16px;
   overflow: hidden;
@@ -360,7 +357,7 @@ body.messagelist
   display: table;
   table-layout: fixed;
   /* css hack for IE */
-  width: expression(document.getElementById('mailcontframe').clientWidth);
+  width: expression(parseInt(document.getElementById('mailcontframe').clientWidth)+'px');
 }
 
 #messagelist thead tr td
@@ -421,6 +418,7 @@ body.messagelist
 {
   color: #000;
   text-decoration: none;
+  white-space: nowrap;
 }
 
 #messagelist col
@@ -444,7 +442,7 @@ body.messagelist
 
 #messagelist tr td.size
 {
-  width: 60px;
+  width: 70px;
   text-align: right;
   vertical-align: middle;
 }
@@ -538,12 +536,12 @@ body.messagelist
   left: 200px;
   right: 30px;
   bottom: 40px;
-  border: 1px solid #cccccc;
-  background-color: #FFFFFF;
+  border: 1px solid #999;
+  background-color: #FFF;
   overflow: auto;
   /* css hack for IE */
   /* margin-bottom: 10px; */
-  width: expression((parseInt(document.documentElement.clientWidth)-240)+'px');
+  width: expression((parseInt(document.documentElement.clientWidth)-230)+'px');
   height: expression((parseInt(document.documentElement.clientHeight)-125)+'px');
 }
 
@@ -655,6 +653,7 @@ div.message-part div.pre
 {
   margin: 0px;
   padding: 0px;
+  white-space: -moz-pre-wrap !important;
   white-space: pre;
   font-family: monospace;
 }
@@ -706,18 +705,10 @@ div.message-part blockquote blockquote blockquote
 
 /** message compose styles */
 
-#priority-selector
-{
-  position: absolute;
-  left: 280px;
-  top: 10px;
-}
-
+#priority-selector,
 #receipt-selector
 {
-  position: absolute;
-  left: 450px;
-  top: 10px;
+  padding-left: 30px;
 }
 
 #compose-container
@@ -730,7 +721,7 @@ div.message-part blockquote blockquote blockquote
   padding: 0px;
   margin: 0px;
   /* css hack for IE */
-  width: expression(document.documentElement.clientWidth-240);
+  width: expression((parseInt(document.documentElement.clientWidth)-240)+'px');
   height: expression((parseInt(document.documentElement.clientHeight)-130)+'px');
 }
 
@@ -782,29 +773,17 @@ div.message-part blockquote blockquote blockquote
   white-space: nowrap;
 }
 
-#compose-headers td.add-button
-{
-  width: 40px !important;
-  text-align: right;
-  vertical-align: bottom;
-}
-
-#compose-headers td.add-button a
-{
-  color: #666666;
-  font-size: 11px;
-  text-decoration: none;
-}
-
-#compose-headers td textarea
+#compose-body,
+#compose-headers td textarea,
+#compose-headers td input
 {
   width: 100%;
-  height: 40px;
+  width: expression('99%');
 }
 
-#compose-headers td input
+#compose-headers td textarea
 {
-  width: 100%;
+  height: 38px;
 }
 
 #compose-cc,
@@ -818,7 +797,6 @@ div.message-part blockquote blockquote blockquote
 {
   margin-top: 5px;
   margin-bottom: 10px;
-  width: 99%;
   height: 90%;
   min-height: 280px;
   font-size: 9pt;
index f19aad33e093ff5969704697d6cd44f68840e1b3..54ee968903e61001837cfcb184dd11a16f0f0d0b 100644 (file)
@@ -1,52 +1,74 @@
 <public:component>
 <public:attach event="onpropertychange" onevent="propertyChanged()" />
+<public:attach event="onbeforeprint" for="window" onevent="beforePrint()" />
+<public:attach event="onafterprint" for="window" onevent="afterPrint()" />
 <script>
 
-var supported = /MSIE (5\.5)|[6789]/.test(navigator.userAgent) && navigator.platform == "Win32";
-var realSrc = null;
-var blankSrc = "skins/default/images/blank.gif";
-
+/*
+ * PNG Behavior
+ *
+ * This script was created by Erik Arvidsson (erik(at)eae.net)
+ * for WebFX (http://webfx.eae.net)
+ * Copyright 2002
+ * 
+ * For usage see license at http://webfx.eae.net/license.html  
+ *
+ * Version: 1.01a
+ *
+ */
+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';
 if (supported) fixImage();
-
 function propertyChanged() {
-   if (!supported) return;
-
-   var pName = event.propertyName;
-   if (pName != "src") return;
-   // if not set to blank
-   if ( ! new RegExp(blankSrc).test(src))
+  if (supported && event.propertyName == 'src') {
+    var i = element.src.lastIndexOf(blankSrc);
+    if (i == -1 || i != element.src.length - blankSrc.length) {
       fixImage();
-};
-
+    }
+  }
+}
 function fixImage() {
-   // get src
-   var src = element.src;
-
-   // check for real change
-   if (src == realSrc) {
+  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;
-      return;
-   }
-
-   if ( ! new RegExp(blankSrc).test(src)) {
-      // backup old src
-      realSrc = src;
-      element._original_src = realSrc;
-   }
-
-   // test for png
-   if ( realSrc &&  /\.png$/.test( realSrc.toLowerCase() ) ) {
-      // set blank image
-      element.src = blankSrc;
-      // set filter
-      element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" +
-                                     src + "',sizingMethod='crop')";
-   }
-   else {
-      // remove filter
-      element.runtimeStyle.filter = "";
-   }
+      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 = '';
+      }
+    }
+  }
+}
+function beforePrint() {
+  if (realSrc) {
+    supported = false;
+    element.src = realSrc;
+    element.runtimeStyle.filter = '';
+    supported = true;
+  }
+}
+function afterPrint() {
+  if (realSrc) {
+    var rs = realSrc;
+    realSrc = null;
+    element.src = rs;
+  }
 }
-
 </script>
-</public:component>
\ No newline at end of file
+</public:component>
index ba5b65b312c0c055d6672af35db69ae822c6b219..53e948c7e7515e0ac757ae517de926b09ffb9d5d 100644 (file)
@@ -76,6 +76,12 @@ span.tablink-selected a
   height: expression((parseInt(document.documentElement.clientHeight)-215)+'px');
 }
 
+#folder-manager.droptarget
+{
+  border: 1px solid #CC3333;
+  background-color: #FFFFA6;
+}
+
 #identities-table
 {
   width: 600px;
@@ -161,6 +167,20 @@ div.settingspart
   white-space: nowrap;
   border-bottom: 1px solid #EBEBEB;
   background-color: #F9F9F9;
+  cursor: pointer;
+}
+
+#subscription-table tr.selected td,
+#subscription-table tr.selected td a
+{
+  color: #FFFFFF;
+  background-color: #CC3333;
+}
+
+#subscription-table tr.droptarget td,
+#subscription-table tr.droptarget td a
+{
+  background-color: #FFFFA6;
 }
 
 #subscription-table td.name
diff --git a/skins/default/splitter.js b/skins/default/splitter.js
new file mode 100644 (file)
index 0000000..97965a2
--- /dev/null
@@ -0,0 +1,209 @@
+
+/**
+ * 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';
+  this.orientation = attrib.orientation;
+  this.horizontal = (this.orientation == 'horizontal' || this.orientation == 'h');
+  this.offset_1 = bw.ie ? 0 : (bw.safari ? 2 : -1);
+  this.offset_2 = bw.ie ? -2 : (bw.safari ? -2 : 1);
+  this.pos = 0;
+
+  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 = rcube_get_object_pos(this.p1);
+    this.p2pos = rcube_get_object_pos(this.p2);
+    var top = this.p1pos.y + this.p1.offsetHeight;
+    var height = this.p2pos.y - this.p1pos.y - this.p1.offsetHeight;
+    var left = this.p1pos.x + this.p1.offsetWidth;
+    var width = this.p2pos.x - this.p1pos.x - this.p1.offsetWidth;
+    
+    if (this.horizontal)
+      this.layer = new rcube_layer(this.id, {x: this.p1pos.x, y: top, height: height, width: this.p1.offsetWidth, vis: 1});
+    else
+      this.layer = new rcube_layer(this.id, {x: left, y: this.p1pos.y, width: width, height: this.p1.offsetHeight, vis: 1});
+
+    this.elm = this.layer.elm;
+    this.elm.className = 'splitter '+(this.horizontal ? 'splitter-h' : 'splitter-v');
+
+    // add the mouse event listeners
+    rcube_event.add_listener({element: this.elm, event:'mousedown', object:this, method:'onDragStart'});
+    rcube_event.add_listener({element: window, event:'resize', object:this, method:'onResize'});
+
+    // read saved position form cookie
+    var cookie = bw.get_cookie(this.id);
+    if (cookie)
+      {
+      var param = cookie.split(':');
+      for (var i=0, p; i<param.length; i++)
+        {
+        p = param[i].split('=');
+        this[p[0]] = !isNaN(p[1]) ? parseFloat(p[1]) : p[1];
+        }
+
+      this.resize();
+      }
+    };
+
+  /**
+   * Set size and position of all DOM objects
+   * according to the saved splitter position
+   */
+  this.resize = function()
+    {
+     if (this.horizontal)
+      {
+      this.p1.style.height = Math.floor(this.pos - this.p1pos.y - this.layer.height / 2 + this.offset_1) + 'px';
+      this.p2.style.top = Math.ceil(this.pos + (this.layer.height / 2 + this.offset_2)) + 'px';
+      this.layer.move(this.layer.x, Math.round(this.pos - this.layer.height / 2 + 1));
+      }
+    else
+      {
+      this.p1.style.width = Math.floor(this.pos - this.p1pos.x - this.layer.width / 2 + this.offset_1) + 'px';
+      this.p2.style.left = Math.ceil(this.pos + this.layer.width / 2 + this.offset_2) + 'px';
+      this.layer.move(Math.round(this.pos - this.layer.width / 2 + 1), this.layer.y);
+      }
+    };
+
+  /**
+   * Handler for mousedown events
+   */
+  this.onDragStart = function(e)
+    {
+    this.p1pos = rcube_get_object_pos(this.p1);
+    this.p2pos = rcube_get_object_pos(this.p2);
+
+    // start listening to mousemove events
+    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._rc_pos_offset = rcube_get_object_pos(document.getElementById(id)); 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'});
+        }
+      }
+    }
+
+  /**
+   * Handler for mousemove events
+   */
+  this.onDrag = function(e)
+    {
+    var pos = rcube_event.get_mouse_pos(e);
+    if (e._rc_pos_offset)
+      {
+      pos.x += e._rc_pos_offset.x;
+      pos.y += e._rc_pos_offset.y;
+      }
+
+    if (this.horizontal)
+      {
+      if (((pos.y - this.layer.height * 1.5) > this.p1pos.y) && ((pos.y + this.layer.height * 1.5) < (this.p2pos.y + this.p2.offsetHeight)))
+        {
+        this.pos = pos.y;
+        this.resize();
+        }
+      }
+    else
+      {
+      if (((pos.x - this.layer.width * 1.5) > this.p1pos.x) && ((pos.x + this.layer.width * 1.5) < (this.p2pos.x + this.p2.offsetWidth)))
+        {
+        this.pos = pos.x;
+        this.resize();
+        }
+      }
+
+    this.p1pos = rcube_get_object_pos(this.p1);
+    this.p2pos = rcube_get_object_pos(this.p2);
+    return false;
+    };
+
+  /**
+   * Handler for mouseup events
+   */
+  this.onDragStop = function(e)
+    {
+    // cancel the listening for drag events
+    rcube_event.remove_listener({element:document, event:'mousemove', object:this, method:'onDrag'});
+    rcube_event.remove_listener({element:document, event:'mouseup', object:this, method:'onDragStop'});
+    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'});
+        }
+      }
+
+    // save state in cookie
+    var exp = new Date();
+    exp.setYear(exp.getFullYear() + 1);
+    bw.set_cookie(this.id, 'pos='+this.pos, exp);
+
+    return bw.safari ? true : rcube_event.cancel(e);
+    };
+
+  /**
+   * Handler for window resize events
+   */
+  this.onResize = function(e)
+    {
+    this.p1pos = rcube_get_object_pos(this.p1);
+    this.p2pos = rcube_get_object_pos(this.p2);
+    var height = this.horizontal ? this.p2pos.y - this.p1pos.y - this.p1.offsetHeight : this.p1.offsetHeight;
+    var width = this.horizontal ? this.p1.offsetWidth : this.p2pos.x - this.p1pos.x - this.p1.offsetWidth;
+    this.layer.resize(width, height);
+    };
+
+  }  // end class rcube_splitter
index d1d202f8560320436362c9d4e12f4a4a9a3e7ac1..a97f584de10cb905cc4861a5cb4591b09fb4d3cb 100644 (file)
@@ -4,6 +4,7 @@
 <title><roundcube:object name="pagetitle" /></title>
 <roundcube:include file="/includes/links.html" />
 <link rel="stylesheet" type="text/css" href="/addresses.css" />
+<script type="text/javascript" src="/splitter.js"></script>
 </head>
 <body>
 
@@ -14,6 +15,8 @@
 <roundcube:button command="add" imageSel="/images/buttons/add_contact_sel.png" imageAct="/images/buttons/add_contact_act.png" imagePas="/images/buttons/add_contact_pas.png" width="32" height="32" title="newcontact" />
 <roundcube:button command="delete" imageSel="/images/buttons/delete_sel.png" imageAct="/images/buttons/delete_act.png" imagePas="/images/buttons/delete_pas.png" width="32" height="32" title="deletecontact" />
 <roundcube:button command="compose" imageSel="/images/buttons/compose_sel.png" imageAct="/images/buttons/compose_act.png" imagePas="/images/buttons/compose_pas.png" width="32" height="32" title="composeto" />
+<roundcube:button command="print" imageSel="/images/buttons/print_sel.png" imageAct="/images/buttons/print_act.png" imagePas="/images/buttons/print_pas.png" width="32" height="32" title="print" />
+<roundcube:button command="export" imageSel="/images/buttons/download_sel.png" imageAct="/images/buttons/download_act.png" imagePas="/images/buttons/download_pas.png" width="32" height="32" title="export" />
 </div>
 
 <div id="quicksearchbar">
 <roundcube:object name="addresslist" id="contacts-table" class="records-table" cellspacing="0" summary="Contacts list" />
 </div>
 
+<script type="text/javascript">
+  var addrviewsplit = new rcube_splitter({id:'addressviewsplitter', p1: 'addresslist', p2: 'contacts-box', orientation: 'v'});
+  rcmail.add_onload('addrviewsplit.init()');
+</script>
+
 <div id="contacts-box">
 <roundcube:object name="addressframe" id="contact-frame" width="100%" height="100%" frameborder="0" src="/watermark.html" />
 </div>
index 1427371a72cdc59199e3f0b505d013a1748210cb..7e02ff54275518f8cf457a2045b462efa2716a8f 100644 (file)
@@ -8,17 +8,40 @@
 <script type="text/javascript">
 <!--
 
-function rcmail_toggle_display(id)
-  {
-  var row, disp;
+function rcmail_show_header_form(id, link)
+{
+  var row, ns, ps;
   if (row = document.getElementById(id))
-    {
-    disp = (!row.style.display || row.style.display=='none') ? ((document.all && !window.opera) ? 'block' : 'table-row') : 'none';
-    row.style.display = disp;
-    }
+    row.style.display = (document.all && !window.opera) ? 'block' : 'table-row';
+  
+  if (link)
+  {
+    if ((ns = rcmail_next_sibling(link)))
+      link.parentNode.removeChild(ns);
+    else if ((ps = rcmail_prev_sibling(link)))
+      link.parentNode.removeChild(ps);
     
-  return false;
+    link.parentNode.removeChild(link);
   }
+  
+  return false;
+}
+
+function rcmail_next_sibling(elm)
+{
+  var ns = elm.nextSibling;
+  while (ns && ns.nodeType == 3)
+    ns = ns.nextSibling;
+  return ns;
+}
+
+function rcmail_prev_sibling(elm)
+{
+  var ps = elm.previousSibling;
+  while (ps && ps.nodeType == 3)
+    ps = ps.previousSibling;
+  return ps;
+}
 
 //-->
 </script>
@@ -31,20 +54,21 @@ function rcmail_toggle_display(id)
 <form name="form" action="./" method="post">
 
 <div id="messagetoolbar">
-<!--<roundcube:button command="list" image="/images/buttons/back_act.png" imageSel="/images/buttons/back_sel.png" imageAct="/images/buttons/back_act.png" width="32" height="32" title="backtolist" />-->
-<roundcube:button command="send" imageSel="/images/buttons/send_sel.png" imageAct="/images/buttons/send_act.png" imagePas="/images/buttons/send_pas.png" width="32" height="32" title="sendmessage" />
-<roundcube:button command="spellcheck" imageSel="/images/buttons/spellcheck_sel.png" imageAct="/images/buttons/spellcheck_act.png" imagePas="/images/buttons/spellcheck_pas.png" width="32" height="32" title="checkspelling" />
-<roundcube:button command="add-attachment" imageSel="/images/buttons/attach_sel.png" imageAct="/images/buttons/attach_act.png" imagePas="/images/buttons/attach_pas.png" width="32" height="32" title="addattachment" />
-<roundcube:button command="savedraft" imageSel="/images/buttons/drafts_sel.png" imageAct="/images/buttons/drafts_act.png" imagePas="/images/buttons/drafts_pas.png" width="32" height="32" title="savemessage" />
-
-<div id="priority-selector">
-<label for="rcmcomposepriority"><roundcube:label name="priority" />:</label>&nbsp;<roundcube:object name="prioritySelector" form="form" id="rcmcomposepriority" />
-</div>
-
-<div id="receipt-selector">
-<roundcube:object name="receiptCheckBox" form="form" id="rcmcomposereceipt" />&nbsp;<label for="rcmcomposereceipt"><roundcube:label name="returnreceipt" /></label>
-</div>
-
+<table border="0" cellspacing="0" cellpadding="0"><tr>
+<td>
+  <roundcube:button command="list" image="/images/buttons/back_act.png" imageSel="/images/buttons/back_sel.png" imageAct="/images/buttons/back_act.png" width="32" height="32" title="backtolist" />
+  <roundcube:button command="send" imageSel="/images/buttons/send_sel.png" imageAct="/images/buttons/send_act.png" imagePas="/images/buttons/send_pas.png" width="32" height="32" title="sendmessage" />
+  <roundcube:button command="spellcheck" imageSel="/images/buttons/spellcheck_sel.png" imageAct="/images/buttons/spellcheck_act.png" imagePas="/images/buttons/spellcheck_pas.png" width="32" height="32" title="checkspelling" />
+  <roundcube:button command="add-attachment" imageSel="/images/buttons/attach_sel.png" imageAct="/images/buttons/attach_act.png" imagePas="/images/buttons/attach_pas.png" width="32" height="32" title="addattachment" />
+  <roundcube:button command="savedraft" imageSel="/images/buttons/drafts_sel.png" imageAct="/images/buttons/drafts_act.png" imagePas="/images/buttons/drafts_pas.png" width="32" height="32" title="savemessage" />
+</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>
 </div>
 
 <div id="compose-container">
@@ -63,8 +87,6 @@ function rcmail_toggle_display(id)
 
 <td class="title top"><label for="rcmcomposeto"><roundcube:label name="to" /></label></td>
 <td><roundcube:object name="composeHeaders" part="to" form="form" id="rcmcomposeto" cols="80" rows="2" tabindex="2" /></td>
-<td class="add-button"><a href="#" onclick="return rcmail_toggle_display('compose-cc')">[Cc]</a><br />
-<a href="#" onclick="return rcmail_toggle_display('compose-bcc')">[Bcc]</a><br /></td>
 
 </tr><tr id="compose-cc">
 
@@ -81,6 +103,17 @@ function rcmail_toggle_display(id)
 <td class="title top"><label for="rcmcomposereplyto"><roundcube:label name="replyto" /></label></td>
 <td><roundcube:object name="composeHeaders" part="replyto" form="form" id="rcmcomposereplyto" size="80" tabindex="5" /></td>
 
+</tr><tr>
+  
+<td></td>
+<td class="formlinks">
+  <a href="#cc" onclick="return rcmail_show_header_form('compose-cc', this);" id="addcclink"><roundcube:label name="addcc" /></a>
+  <span class="separator">|</span>
+  <a href="#bcc" onclick="return rcmail_show_header_form('compose-bcc', this);" id="addbcclink"><roundcube:label name="addbcc" /></a>
+  <span class="separator">|</span>
+  <a href="#reply-to" onclick="return rcmail_show_header_form('compose-replyto', this);" id="addreplytolink"><roundcube:label name="addreplyto" /></a>
+</td>
+
 </tr><tr>
 
 <td class="title"><label for="compose-subject"><roundcube:label name="subject" /></label></td>
@@ -95,12 +128,23 @@ function rcmail_toggle_display(id)
 </tr><tr>
 
 <td style="width:100%; height:90%; vertical-align:top;">
-<roundcube:object name="composeBody" id="compose-body" form="form" cols="80" rows="20" wrap="virtual" tabindex="7" />
+<roundcube:object name="composeBody" id="compose-body" form="form" cols="80" rows="20" tabindex="7" />
 
-<div>
+<table border="0" cellspacing="0" width="100%" summary=""><tbody>
+<tr>
+<td>
 <roundcube:button type="input" command="send" class="button" label="sendmessage" />
 <roundcube:button type="input" command="list" class="button" label="cancel" />
-</div>
+</td>
+<td align="right">
+  <roundcube:if condition="config:enable_htmleditor" />
+    <roundcube:label name="editortype" />:&nbsp;
+    <span class="radios-left"><roundcube:object name="editorSelector" tabindex="9" /></span>
+  <roundcube:endif />
+</td>
+</tr>
+</tbody></table>
+
 </td>
 
 </tr>
@@ -124,10 +168,10 @@ function rcmail_toggle_display(id)
 
 var cc_field = document.form._cc;
 if (cc_field && cc_field.value!='')
-  rcmail_toggle_display('compose-cc');
+  rcmail_show_header_form('compose-cc', document.getElementById('addcclink'));
 var bcc_field = document.form._bcc;
 if (bcc_field && bcc_field.value!='')
-  rcmail_toggle_display('compose-bcc');
+  rcmail_show_header_form('compose-bcc', document.getElementById('addbcclink'));
 
 //-->
 </script>
index 05c6ec7c6035c3fcc2d68128ed8985420b4a4750..a38c06aee4444ff9caff088f87744a6ab85b0065 100644 (file)
@@ -4,6 +4,7 @@
 <title><roundcube:object name="pagetitle" /></title>
 <roundcube:include file="/includes/links.html" />
 <link rel="stylesheet" type="text/css" href="/mail.css" />
+<script type="text/javascript" src="/splitter.js"></script>
 </head>
 <body>
 
 <roundcube:button command="lastpage" imageSel="/images/buttons/last_sel.png" imageAct="/images/buttons/last_act.png" imagePas="/images/buttons/last_pas.png" width="11" height="11" title="lastmessages" />
 </div>
 
+<div id="mailboxlist-container">
 <div id="mailboxlist-header"><roundcube:label name="mailboxlist" /></div>
-<div id="mailboxlist-container"><roundcube:object name="mailboxlist" id="mailboxlist" maxlength="16" /></div>
+<roundcube:object name="mailboxlist" id="mailboxlist" maxlength="16" />
+</div>
 
 <div id="mailboxcontrols">
 <roundcube:label name="folder" />:&nbsp;
   attachmentIcon="/images/icons/attachment.png" />
 </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'});
+  rcmail.add_onload('mailviewsplit.init()');
+</script>
+<div id="mailpreviewframe">
+<roundcube:object name="messagecontentframe" id="messagecontframe" width="100%" height="100%" frameborder="0" src="/watermark.html" />
+</div>
+
+<style type="text/css">
+#mailcontframe {
+  bottom: auto;
+  height: 208px;
+}
+</style>
+<roundcube:endif />
 
 <div id="listcontrols">
 <roundcube:label name="select" />:&nbsp;
index 9efed60bd9173b8eea2f98692af57242d33f1928..7824c7f8f1f2cb21ee5fb9f916fba2423db8edda 100644 (file)
 <roundcube:object name="mailboxlist" type="select" noSelection="moveto" maxlength="25" onchange="rcmail.command('moveto', this.options[this.selectedIndex].value)" class="mboxlist" />
 </div>
 
+<div id="mailboxlist-container">
 <div id="mailboxlist-header"><roundcube:label name="mailboxlist" /></div>
-<div id="mailboxlist-container"><roundcube:object name="mailboxlist" id="mailboxlist" maxlength="16" /></div>
+<roundcube:object name="mailboxlist" id="mailboxlist" maxlength="16" />
+</div>
 
 <div id="messageframe">
 <roundcube:object name="messageHeaders" class="headers-table" cellspacing="0" cellpadding="2" addicon="/images/icons/plus.gif" summary="Message headers" />